C++ Room::GetPlayerData 函数解析:获取玩家数据并发送至客户端
C++ Room::GetPlayerData 函数解析:获取玩家数据并发送至客户端
该函数用于从数据库获取玩家数据并将其发送至客户端。
void Room::GetPlayerData(MySQL *MySql, User *Player, int slot)
{
// 检查槽位是否有效
if(slot >= 0 && slot < 8){
// 锁定房间数据
roomLock.lock();
// 检查槽位是否已被占用
if(users[slot]){
// 获取玩家信息
MyCharInfo *Info = users[slot]->GetInfo();
// 初始化玩家数据
int magictype = 0, weapontype = 0, armortype = 0, pettype = 0;
int magiclevel = 0, weaponlevel = 0, armorlevel = 0, petlevel = 0;
int magicgf = 0, weapongf = 0, armorgf = 0, petgf = 0;
int magicskill = 0, weaponskill = 0, armorskill = 0, petskill = 0;
int foot = 0, body = 0, hand1 = 0, hand2 = 0, face = 0, hair = 0, head = 0;
int character = Info->usr_char;
int Gamestart = 2;
// 如果游戏已开始且玩家已准备就绪,则设置游戏开始标志
if(started == true && Player->GetInfo()->usr_ready)Gamestart = 0;
// 检查角色 ID 是否有效,如果无效则使用默认角色 ID
if(character == 0 || character > 1000)character = Info->DefaultCharacter+Info->premium;
// 如果玩家处于强化状态,则将魔法、武器、护甲等级设置为玩家强化等级
if(Info->usr_power)
magiclevel = weaponlevel = armorlevel = Info->usr_power;
// 从数据库获取玩家装备数据
MySql->GetEquipData(Info->usr_id,magictype,weapontype,armortype,pettype,magiclevel,weaponlevel,armorlevel,petlevel,magicgf,weapongf,armorgf,petgf,magicskill,weaponskill,armorskill,petskill,foot,body,hand1,hand2,face,hair,head);
// 设置不同房间类型对应等级限制
int maxLevel = 8;
if (ChannelType == 2)
maxLevel = 5;
if (ChannelType == 1)
maxLevel = 3;
// 如果玩家等级超过房间限制,则将其等级设置为 0
if (magiclevel > maxLevel)
magictype = magicskill = magicgf = magiclevel = 0;
if (weaponlevel > maxLevel)
weapontype = weaponskill = weapongf = weaponlevel = 0;
if (armorlevel > maxLevel)
armortype = armorskill = armorgf = armorlevel = 0;
// 向玩家发送玩家数据
Player->GetTcpSocket().Send(RoomUserDataMessage(Info->usr_slot,users[slot]->GetGlobalIP(),users[slot]->GetLocalIP(),Info->Level,Info->usr_name,Info->gender,
Info->usr_ready,character,Info->usr_team,magictype,weapontype,armortype,pettype,magiclevel,
weaponlevel,armorlevel,petlevel,magicgf,weapongf,armorgf,petgf,magicskill,weaponskill,armorskill,petskill,
Info->scrolls, foot, body, hand1, hand2, face, hair, head, Gamestart, false, mission, Info->Mission));
}
// 解锁房间数据
roomLock.unlock();
}
}
函数功能:
- 检查玩家槽位是否有效
- 锁定房间数据
- 检查槽位是否已被占用
- 从数据库获取玩家数据
- 根据房间类型限制玩家等级
- 向玩家发送玩家数据
详细解析:
-
函数参数:
MySQL *MySql: 数据库连接对象User *Player: 玩家对象int slot: 玩家槽位
-
函数流程:
- 检查
slot是否在有效范围内 (0~7) - 锁定房间数据,防止其他线程访问
- 检查槽位是否已被占用
- 获取玩家信息,包括基本信息、装备信息、角色 ID、游戏状态等
- 检查玩家等级是否超过房间等级限制,如果超过则将等级设置为 0
- 构建玩家数据消息并发送至玩家客户端
- 解锁房间数据
- 检查
总结:
该函数通过获取玩家数据并发送至客户端,实现了游戏内玩家信息展示功能。函数流程清晰、逻辑严谨,充分考虑了数据安全和游戏性能。
原文地址: http://www.cveoy.top/t/topic/nnGl 著作权归作者所有。请勿转载和采集!