diff options
Diffstat (limited to 'src/game/LFGHandler.cpp')
-rw-r--r-- | src/game/LFGHandler.cpp | 174 |
1 files changed, 135 insertions, 39 deletions
diff --git a/src/game/LFGHandler.cpp b/src/game/LFGHandler.cpp index 6df5fc77532..51735c01e02 100644 --- a/src/game/LFGHandler.cpp +++ b/src/game/LFGHandler.cpp @@ -186,6 +186,8 @@ void WorldSession::HandleLfgClearOpcode( WorldPacket & /*recv_data */ ) if( sWorld.getConfig(CONFIG_RESTRICTED_LFG_CHANNEL) && _player->GetSession()->GetSecurity() == SEC_PLAYER ) _player->LeaveLFGChannel(); + + SendLfgUpdate(0, 0, 0); } void WorldSession::HandleLfmClearOpcode( WorldPacket & /*recv_data */) @@ -198,16 +200,18 @@ void WorldSession::HandleLfmClearOpcode( WorldPacket & /*recv_data */) void WorldSession::HandleSetLfmOpcode( WorldPacket & recv_data ) { - CHECK_PACKET_SIZE(recv_data,4); + CHECK_PACKET_SIZE(recv_data, 4+1+1+1+1); sLog.outDebug("CMSG_SET_LOOKING_FOR_MORE"); //recv_data.hexlike(); uint32 temp, entry, type; + uint8 unk1; + uint8 unk2[3]; - recv_data >> temp; + recv_data >> temp >> unk1 >> unk2[0] >> unk2[1] >> unk2[2]; - entry = ( temp & 0xFFFF); - type = ( (temp >> 24) & 0xFFFF); + entry = ( temp & 0x00FFFFFF); + type = ( (temp >> 24) & 0x000000FF); _player->m_lookingForGroup.more.Set(entry,type); sLog.outDebug("LFM set: temp %u, zone %u, type %u", temp, entry, type); @@ -250,18 +254,53 @@ void WorldSession::HandleLookingForGroup(WorldPacket& recv_data) AttemptJoin(_player); SendLfgResult(type, entry, 0); + SendLfgUpdate(0, 1, 0); } void WorldSession::SendLfgResult(uint32 type, uint32 entry, uint8 lfg_type) { uint32 number = 0; - // start prepare packet; WorldPacket data(MSG_LOOKING_FOR_GROUP); data << uint32(type); // type data << uint32(entry); // entry from LFGDungeons.dbc - data << uint32(0); // count, placeholder - data << uint32(0); // count again, strange, placeholder + + data << uint8(0); + /*if(uint8) + { + uint32 count1; + for(count1) + { + uint64; // player guid + } + }*/ + + data << uint32(0); // count2 + data << uint32(0); + /*for(count2) + { + uint64 // not player guid + uint32 flags; + if(flags & 0x2) + { + string + } + if(flags & 0x10) + { + uint8 + } + if(flags & 0x20) + { + for(3) + { + uint8 + } + } + }*/ + + size_t count3_pos = data.wpos(); + data << uint32(0); // count3 + data << uint32(0); // unk //TODO: Guard Player map HashMapHolder<Player>::MapType const& players = ObjectAccessor::Instance().GetPlayers(); @@ -272,71 +311,128 @@ void WorldSession::SendLfgResult(uint32 type, uint32 entry, uint8 lfg_type) if(!plr || plr->GetTeam() != _player->GetTeam()) continue; - if(!plr->m_lookingForGroup.HaveInSlot(entry,type)) + if(!plr->m_lookingForGroup.HaveInSlot(entry, type)) continue; ++number; - data.append(plr->GetPackGUID()); // packed guid - data << plr->getLevel(); // level - data << plr->GetZoneId(); // current zone - data << lfg_type; // 0x00 - LFG, 0x01 - LFM + data << uint64(plr->GetGUID()); // guid + + uint32 flags = 0x1FF; + data << uint32(flags); // flags - for(uint8 j = 0; j < MAX_LOOKING_FOR_GROUP_SLOT; ++j) + if(flags & 0x1) { - data << uint32( plr->m_lookingForGroup.slots[j].entry | (plr->m_lookingForGroup.slots[j].type << 24) ); + data << uint8(plr->getLevel()); + data << uint8(plr->getClass()); + data << uint8(plr->getRace()); + + for(int i = 0; i < 3; ++i) + data << uint8(0); // spent talents count in specific tab + + data << uint32(0); // resistances1 + data << uint32(0); // spd/heal + data << uint32(0); // spd/heal + data << uint32(0); // combat_rating9 + data << uint32(0); // combat_rating10 + data << uint32(0); // combat_rating11 + data << float(0); // mp5 + data << float(0); // unk + data << uint32(0); // attack power + data << uint32(0); // stat1 + data << uint32(0); // maxhealth + data << uint32(0); // maxpower1 + data << uint32(0); // unk + data << float(0); // unk + data << uint32(0); // unk + data << uint32(0); // unk + data << uint32(0); // unk + data << uint32(0); // unk + data << uint32(0); // combat_rating20 + data << uint32(0); // unk } - data << plr->m_lookingForGroup.comment; - Group *group = plr->GetGroup(); - if(group) + if(flags & 0x2) + data << plr->m_lookingForGroup.comment; // comment + + if(flags & 0x4) + data << uint8(0); // unk + + if(flags & 0x8) + data << uint64(0); // guid from count2 block, not player guid + + if(flags & 0x10) + data << uint8(0); // unk + + if(flags & 0x20) + data << uint8(plr->m_lookingForGroup.roles); // roles + + if(flags & 0x40) + data << uint32(plr->GetZoneId()); // areaid + + if(flags & 0x100) + data << uint8(0); // LFG/LFM flag? + + if(flags & 0x80) { - data << group->GetMembersCount()-1; // count of group members without group leader - for(GroupReference *itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) + for(uint8 j = 0; j < MAX_LOOKING_FOR_GROUP_SLOT; ++j) { - Player *member = itr->getSource(); - if(member && member->GetGUID() != plr->GetGUID()) - { - data.append(member->GetPackGUID()); // packed guid - data << member->getLevel(); // player level - } + data << uint32(plr->m_lookingForGroup.slots[j].entry | (plr->m_lookingForGroup.slots[j].type << 24)); } } - else - { - data << uint32(0x00); - } } - // fill count placeholders - data.put<uint32>(4+4, number); - data.put<uint32>(4+4+4,number); + data.put<uint32>(count3_pos, number); // fill count placeholder SendPacket(&data); } void WorldSession::HandleSetLfgOpcode( WorldPacket & recv_data ) { - CHECK_PACKET_SIZE(recv_data,4+4); + CHECK_PACKET_SIZE(recv_data, 4+4+1+1); sLog.outDebug("CMSG_SET_LOOKING_FOR_GROUP"); - //recv_data.hexlike(); + recv_data.hexlike(); uint32 slot, temp, entry, type; + uint8 roles, unk1; - recv_data >> slot >> temp; + recv_data >> slot >> temp >> roles >> unk1; - entry = ( temp & 0xFFFF); - type = ( (temp >> 24) & 0xFFFF); + entry = ( temp & 0x00FFFFFF); + type = ( (temp >> 24) & 0x000000FF); if(slot >= MAX_LOOKING_FOR_GROUP_SLOT) return; - _player->m_lookingForGroup.slots[slot].Set(entry,type); + _player->m_lookingForGroup.slots[slot].Set(entry, type); + _player->m_lookingForGroup.roles = roles; sLog.outDebug("LFG set: looknumber %u, temp %X, type %u, entry %u", slot, temp, type, entry); if(LookingForGroup_auto_join) AttemptJoin(_player); - SendLfgResult(type, entry, 0); + //SendLfgResult(type, entry, 0); + SendLfgUpdate(0, 1, 0); +} + +void WorldSession::HandleLfgSetRoles(WorldPacket &recv_data) +{ + CHECK_PACKET_SIZE(recv_data, 1); + + sLog.outDebug("CMSG_LFG_SET_ROLES"); + + uint8 roles; + recv_data >> roles; + + _player->m_lookingForGroup.roles = roles; +} + +void WorldSession::SendLfgUpdate(uint8 unk1, uint8 unk2, uint8 unk3) +{ + WorldPacket data(SMSG_LFG_UPDATE, 3); + data << uint8(unk1); + data << uint8(unk2); + data << uint8(unk3); + SendPacket(&data); } |