From 24da4cc22e51a8a79a19f8148e829cf82a97218c Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Tue, 3 Nov 2020 21:50:57 +0100 Subject: [PATCH] Core/Packets: added structure for SMSG_LFG_SEARCH_RESULT --- src/server/game/Server/Packets/LFGPackets.cpp | 241 ++++++++++++++++++ src/server/game/Server/Packets/LFGPackets.h | 69 +++++ src/server/game/Server/Protocol/Opcodes.cpp | 2 +- src/server/game/Server/Protocol/Opcodes.h | 2 +- 4 files changed, 312 insertions(+), 2 deletions(-) diff --git a/src/server/game/Server/Packets/LFGPackets.cpp b/src/server/game/Server/Packets/LFGPackets.cpp index 182ed0d8e6..fe8a284d82 100644 --- a/src/server/game/Server/Packets/LFGPackets.cpp +++ b/src/server/game/Server/Packets/LFGPackets.cpp @@ -578,3 +578,244 @@ WorldPacket const* WorldPackets::LFG::LFGTeleportDenied::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::LFG::LFGSearchResults::Write() +{ + _worldPacket.WriteBit(Ticket.RequesterGuid[3]); + _worldPacket.WriteBits(Parties.size(), 21); + + for (ClientLFGSearchResultParty const& party : Parties) + { + _worldPacket.WriteBit(party.InstanceID[6]); + _worldPacket.WriteBit(party.Guid[3]); + _worldPacket.WriteBit(party.Guid[1]); + _worldPacket.WriteBits(party.Comment.length(), 9); + _worldPacket.WriteBit(party.InstanceID[0]); + _worldPacket.WriteBit(party.Guid[5]); + _worldPacket.WriteBit(party.Guid[2]); + _worldPacket.WriteBit(party.InstanceID[1]); + _worldPacket.WriteBit(party.InstanceID[4]); + _worldPacket.WriteBit(party.Guid[4]); + _worldPacket.WriteBit(party.InstanceID[7]); + _worldPacket.WriteBit(party.Guid[7]); + _worldPacket.WriteBit(party.Guid[0]); + _worldPacket.WriteBit(party.InstanceID[3]); + _worldPacket.WriteBit(party.Guid[6]); + _worldPacket.WriteBit(party.InstanceID[2]); + _worldPacket.WriteBit(party.InstanceID[5]); + } + + _worldPacket.WriteBit(Ticket.RequesterGuid[6]); + _worldPacket.WriteBit(Incremental); + _worldPacket.WriteBit(Ticket.RequesterGuid[7]); + _worldPacket.WriteBit(Ticket.RequesterGuid[5]); + _worldPacket.WriteBit(Ticket.RequesterGuid[2]); + _worldPacket.WriteBit(Ticket.RequesterGuid[4]); + _worldPacket.WriteBits(Players.size(), 18); + + for (ClientLFGSearchResultPlayer const& player : Players) + { + _worldPacket.WriteBits(player.Comment.length(), 9); + _worldPacket.WriteBit(player.PartyGuid[3]); + _worldPacket.WriteBit(player.Guid[7]); + _worldPacket.WriteBit(player.PartyGuid[1]); + _worldPacket.WriteBit(player.InstanceID[7]); + _worldPacket.WriteBit(player.InstanceID[4]); + _worldPacket.WriteBit(player.Guid[3]); + _worldPacket.WriteBit(player.Guid[1]); + _worldPacket.WriteBit(player.InstanceID[6]); + _worldPacket.WriteBit(player.PartyGuid[2]); + _worldPacket.WriteBit(player.IsLeader); + _worldPacket.WriteBit(player.InstanceID[0]); + _worldPacket.WriteBit(player.PartyGuid[0]); + _worldPacket.WriteBit(player.Guid[2]); + _worldPacket.WriteBit(player.PartyGuid[5]); + _worldPacket.WriteBit(player.InstanceID[3]); + _worldPacket.WriteBit(player.Guid[4]); + _worldPacket.WriteBit(player.Guid[6]); + _worldPacket.WriteBit(player.InstanceID[5]); + _worldPacket.WriteBit(player.Guid[0]); + _worldPacket.WriteBit(player.PartyGuid[7]); + _worldPacket.WriteBit(player.InstanceID[1]); + _worldPacket.WriteBit(player.PartyGuid[4]); + _worldPacket.WriteBit(player.PartyGuid[6]); + _worldPacket.WriteBit(player.InstanceID[2]); + _worldPacket.WriteBit(player.Guid[5]); + } + + _worldPacket.WriteBits(Removes.size(), 26); + + for (ObjectGuid const& remove : Removes) + { + _worldPacket.WriteBit(remove[7]); + _worldPacket.WriteBit(remove[3]); + _worldPacket.WriteBit(remove[6]); + _worldPacket.WriteBit(remove[2]); + _worldPacket.WriteBit(remove[1]); + _worldPacket.WriteBit(remove[4]); + _worldPacket.WriteBit(remove[0]); + _worldPacket.WriteBit(remove[5]); + } + + _worldPacket.WriteBit(Ticket.RequesterGuid[0]); + _worldPacket.WriteBit(Ticket.RequesterGuid[1]); + _worldPacket.FlushBits(); + + for (ObjectGuid const& remove : Removes) + { + _worldPacket.WriteByteSeq(remove[3]); + _worldPacket.WriteByteSeq(remove[6]); + _worldPacket.WriteByteSeq(remove[4]); + _worldPacket.WriteByteSeq(remove[2]); + _worldPacket.WriteByteSeq(remove[1]); + _worldPacket.WriteByteSeq(remove[0]); + _worldPacket.WriteByteSeq(remove[5]); + _worldPacket.WriteByteSeq(remove[7]); + } + + for (ClientLFGSearchResultPlayer const& player : Players) + { + _worldPacket << int32(player.CritRanged); + _worldPacket << int8(player.Talents[0]); + _worldPacket << float(player.GearRating); + + _worldPacket.WriteByteSeq(player.PartyGuid[4]); + _worldPacket.WriteByteSeq(player.InstanceID[5]); + + _worldPacket << int32(player.DefenseRating); + + _worldPacket.WriteByteSeq(player.InstanceID[7]); + _worldPacket.WriteString(player.Comment); + _worldPacket.WriteByteSeq(player.InstanceID[4]); + + _worldPacket << float(player.Mp5InCombat); + _worldPacket << int32(player.DodgeRating); + _worldPacket << int8(player.Level); + _worldPacket << int32(player.FreeTalentPoints); + + _worldPacket.WriteByteSeq(player.PartyGuid[6]); + + _worldPacket << int32(player.HasteRating); + _worldPacket << int32(player.Expertise); + _worldPacket << int32(player.ParryRating); + _worldPacket << int8(player.Race); + + _worldPacket.WriteByteSeq(player.PartyGuid[5]); + + _worldPacket << float(player.AvgItemLevel); + _worldPacket << int32(player.MaxHealth); + _worldPacket << int32(player.CritSpell); + + _worldPacket.WriteByteSeq(player.PartyGuid[0]); + _worldPacket.WriteByteSeq(player.Guid[4]); + _worldPacket.WriteByteSeq(player.PartyGuid[7]); + + _worldPacket << int32(player.Armor); + _worldPacket << int8(0); // unk? + + _worldPacket.WriteByteSeq(player.Guid[6]); + _worldPacket.WriteByteSeq(player.PartyGuid[2]); + + _worldPacket << int8(player.Talents[1]); + _worldPacket << int32(player.Agility); + + _worldPacket.WriteByteSeq(player.InstanceID[2]); + + _worldPacket << int8(player.Talents[2]); + + _worldPacket.WriteByteSeq(player.InstanceID[1]); + + _worldPacket << int8(player.ChrClass); + + _worldPacket.WriteByteSeq(player.Guid[0]); + _worldPacket.WriteByteSeq(player.PartyGuid[1]); + _worldPacket.WriteByteSeq(player.Guid[7]); + _worldPacket.WriteByteSeq(player.Guid[2]); + + _worldPacket << int32(player.BlockRating); + _worldPacket << float(player.Mp5); + + _worldPacket.WriteByteSeq(player.InstanceID[0]); + + _worldPacket << int8(0); // unk? + + _worldPacket << int32(player.CritMelee); + _worldPacket << int32(player.ChangeMask); + _worldPacket << int32(player.SpellDamage); + + _worldPacket.WriteByteSeq(player.InstanceID[6]); + + _worldPacket << int32(player.MaxMana); + + _worldPacket.WriteByteSeq(player.Guid[1]); + _worldPacket.WriteByteSeq(player.Guid[3]); + + _worldPacket << int32(player.InstanceCompletedMask); + _worldPacket << int32(player.PlusHealing); + + _worldPacket.WriteByteSeq(player.PartyGuid[3]); + _worldPacket.WriteByteSeq(player.Guid[5]); + _worldPacket.WriteByteSeq(player.InstanceID[3]); + + _worldPacket << int32(0); // Unk + _worldPacket << int32(0); // Unk + } + + _worldPacket << int32(SlotID); + + for (ClientLFGSearchResultParty const& party : Parties) + { + _worldPacket.WriteString(party.Comment); + _worldPacket << int32(party.ChangeMask); + + _worldPacket.WriteByteSeq(party.Guid[6]); + + _worldPacket << int32(party.InstanceCompletedMask); + + _worldPacket.WriteByteSeq(party.InstanceID[6]); + _worldPacket.WriteByteSeq(party.Guid[2]); + _worldPacket.WriteByteSeq(party.InstanceID[4]); + + _worldPacket << int8(party.Needs[0]); + _worldPacket << int8(party.Needs[1]); + _worldPacket << int8(party.Needs[2]); + + _worldPacket.WriteByteSeq(party.Guid[4]); + _worldPacket.WriteByteSeq(party.InstanceID[7]); + _worldPacket.WriteByteSeq(party.Guid[7]); + _worldPacket.WriteByteSeq(party.Guid[3]); + _worldPacket.WriteByteSeq(party.InstanceID[3]); + _worldPacket.WriteByteSeq(party.InstanceID[5]); + _worldPacket.WriteByteSeq(party.InstanceID[0]); + _worldPacket.WriteByteSeq(party.Guid[5]); + _worldPacket.WriteByteSeq(party.InstanceID[1]); + _worldPacket.WriteByteSeq(party.Guid[1]); + _worldPacket.WriteByteSeq(party.InstanceID[2]); + _worldPacket.WriteByteSeq(party.Guid[0]); + } + + _worldPacket.WriteByteSeq(Ticket.RequesterGuid[7]); + _worldPacket.WriteByteSeq(Ticket.RequesterGuid[1]); + + _worldPacket << int32(CountTotalParties); + _worldPacket << int32(Ticket.Type); + + _worldPacket.WriteByteSeq(Ticket.RequesterGuid[4]); + _worldPacket.WriteByteSeq(Ticket.RequesterGuid[2]); + + _worldPacket << int32(Ticket.Id); + + _worldPacket.WriteByteSeq(Ticket.RequesterGuid[6]); + _worldPacket.WriteByteSeq(Ticket.RequesterGuid[5]); + + _worldPacket << int32(CountTotalPlayers); + _worldPacket << int32(Ticket.Time); + + _worldPacket.WriteByteSeq(Ticket.RequesterGuid[0]); + + _worldPacket << int32(SlotType); + + _worldPacket.WriteByteSeq(Ticket.RequesterGuid[3]); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/LFGPackets.h b/src/server/game/Server/Packets/LFGPackets.h index 85d5d723fc..0cee1c7a60 100644 --- a/src/server/game/Server/Packets/LFGPackets.h +++ b/src/server/game/Server/Packets/LFGPackets.h @@ -413,6 +413,75 @@ namespace WorldPackets lfg::LfgTeleportResult Reason; }; + + struct ClientLFGSearchResultParty + { + ObjectGuid Guid; + uint32 ChangeMask = 0; + std::string Comment; + ObjectGuid InstanceID; + uint32 InstanceCompletedMask = 0; + uint8 Needs[3] = { }; + }; + + struct ClientLFGSearchResultPlayer + { + ObjectGuid Guid; + uint32 ChangeMask = 0; + uint8 Level = 0; + uint8 ChrClass = 0; + uint8 Race = 0; + uint32 Armor = 0; + uint32 SpellDamage = 0; + uint32 PlusHealing = 0; + uint32 CritMelee = 0; + uint32 CritRanged = 0; + uint32 CritSpell = 0; + float Mp5 = 0.0f; + float Mp5InCombat = 0.0f; + uint32 AttackPower = 0; + uint32 Agility = 0; + uint32 MaxHealth = 0; + uint32 MaxMana = 0; + uint32 BossKills = 0; + float GearRating = 0.0f; + float AvgItemLevel = 0.0f; + uint32 DefenseRating = 0; + uint32 DodgeRating = 0; + uint32 BlockRating = 0; + uint32 ParryRating = 0; + uint32 HasteRating = 0; + float Expertise = 0.0f; + uint32 SpecID = 0; + std::string Comment; + bool IsLeader = false; + ObjectGuid PartyGuid; + uint8 RolesDesired = 0; + uint32 Area = 0; + uint8 Status = 0; + ObjectGuid InstanceID; + uint32 InstanceCompletedMask = 0; + int32 FreeTalentPoints = 0; + std::array Talents = { }; + }; + + class LFGSearchResults final : public ServerPacket + { + public: + LFGSearchResults() : ServerPacket(SMSG_LFG_SEARCH_RESULT, 4) { } + + WorldPacket const* Write() override; + + bool Incremental = false; + std::vector Removes; + RideTicket Ticket; + uint32 SlotID = 0; + uint32 CountTotalParties = 0; + uint32 CountTotalPlayers = 0; + uint32 SlotType = 0; + std::vector Parties; + std::vector Players; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 445040336b..f2f70beda9 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -977,7 +977,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_ROLE_CHOSEN, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_SLOT_INVALID, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_TELEPORT_DENIED, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_UPDATE_SEARCH, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_SEARCH_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_UPDATE_STATUS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_UPDATE_STATUS_NONE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_APPLICANT_LIST_UPDATED, STATUS_NEVER, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 473a76dfa5..aebc933de3 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -925,7 +925,7 @@ enum OpcodeServer SMSG_LFG_SLOT_INVALID = 0x54B5, SMSG_LFG_TELEPORT_DENIED = 0x0E14, SMSG_LFG_UPDATE_LIST = 0x0000, - SMSG_LFG_UPDATE_SEARCH = 0x54A1, + SMSG_LFG_SEARCH_RESULT = 0x54A1, SMSG_LFG_UPDATE_STATUS = 0x31A4, SMSG_LFG_UPDATE_STATUS_NONE = 0x7CA1, SMSG_LF_GUILD_APPLICANT_LIST_UPDATED = 0x10A4,