diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index bae115bdf6b..c3ecde797f9 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -4221,3 +4221,23 @@ void Guild::SendMembersForRecipe(Player const* player, uint32 skillLineId, uint3 packet.SpellID = spellId; player->SendDirectMessage(packet.Write()); } + +void Guild::SendRecipesOfMember(Player const* player, uint32 skillLineId, ObjectGuid memberGuid) +{ + Member const* member = GetMember(memberGuid); + WorldPackets::Guild::GuildMemberRecipes packet; + for (uint8 i = 0; i < GUILD_PROFESSION_COUNT; i++) + { + GuildMemberProfessionData prof = member->GetProfessionData(i); + if (prof.SkillId = skillLineId) + { + packet.Member = memberGuid; + packet.SkillLineID = skillLineId; + packet.SkillRank = prof.Rank; + packet.SkillStep = prof.Step; + for (uint16 j = 0; j < prof.RecipeUniqueBits.max_size(); j++) + packet.SkillLineBitArray[j] = prof.RecipeUniqueBits[j]; + } + } + player->SendDirectMessage(packet.Write()); +} diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index df88674c48f..6e517516694 100644 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -896,6 +896,7 @@ public: void SendKnownRecipes(Player const* player); void SendMembersForRecipe(Player const* player, uint32 skillLineId, uint32 spellId, uint32 uniqueBit); + void SendRecipesOfMember(Player const* player, uint32 skillLineId, ObjectGuid memberGuid); protected: ObjectGuid::LowType m_id; diff --git a/src/server/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp index 3a0020b3d3a..4bd8e44c8a0 100644 --- a/src/server/game/Handlers/GuildHandler.cpp +++ b/src/server/game/Handlers/GuildHandler.cpp @@ -921,6 +921,13 @@ void WorldSession::HandleGuildQueryMembersForRecipe(WorldPackets::Guild::GuildQu guild->SendMembersForRecipe(_player, packet.SkillLineID, packet.SpellID, packet.UniqueBit); } +void WorldSession::HandleGuildQueryMemberRecipe(WorldPackets::Guild::GuildQueryMemberRecipes& packet) +{ + if (Guild* guild = sGuildMgr->GetGuildByGuid(packet.GuildGUID)) + if (guild->IsMember(_player->GetGUID()) && guild->IsMember(packet.GuildMember)) + guild->SendRecipesOfMember(_player, packet.SkillLineID, packet.GuildMember); +} + /* void WorldSession::HandleGuildChallengeRequest(WorldPacket& recvPacket) { diff --git a/src/server/game/Server/Packets/GuildPackets.cpp b/src/server/game/Server/Packets/GuildPackets.cpp index 10ab6dee8ba..27fb30f569f 100644 --- a/src/server/game/Server/Packets/GuildPackets.cpp +++ b/src/server/game/Server/Packets/GuildPackets.cpp @@ -421,3 +421,76 @@ WorldPacket const* WorldPackets::Guild::GuildMembersWithRecipe::Write() return &_worldPacket; } + +void WorldPackets::Guild::GuildQueryMemberRecipes::Read() +{ + _worldPacket >> SkillLineID; + + GuildMember[2] = _worldPacket.ReadBit(); + GuildGUID[1] = _worldPacket.ReadBit(); + GuildMember[1] = _worldPacket.ReadBit(); + GuildGUID[0] = _worldPacket.ReadBit(); + GuildGUID[6] = _worldPacket.ReadBit(); + GuildMember[7] = _worldPacket.ReadBit(); + GuildGUID[4] = _worldPacket.ReadBit(); + GuildGUID[3] = _worldPacket.ReadBit(); + GuildGUID[7] = _worldPacket.ReadBit(); + GuildMember[5] = _worldPacket.ReadBit(); + GuildMember[0] = _worldPacket.ReadBit(); + GuildGUID[5] = _worldPacket.ReadBit(); + GuildMember[3] = _worldPacket.ReadBit(); + GuildMember[6] = _worldPacket.ReadBit(); + GuildGUID[2] = _worldPacket.ReadBit(); + GuildMember[4] = _worldPacket.ReadBit(); + + _worldPacket.ReadByteSeq(GuildMember[2]); + _worldPacket.ReadByteSeq(GuildMember[6]); + _worldPacket.ReadByteSeq(GuildGUID[4]); + _worldPacket.ReadByteSeq(GuildGUID[2]); + _worldPacket.ReadByteSeq(GuildMember[1]); + _worldPacket.ReadByteSeq(GuildGUID[7]); + _worldPacket.ReadByteSeq(GuildGUID[3]); + _worldPacket.ReadByteSeq(GuildGUID[1]); + _worldPacket.ReadByteSeq(GuildMember[3]); + _worldPacket.ReadByteSeq(GuildMember[0]); + _worldPacket.ReadByteSeq(GuildGUID[0]); + _worldPacket.ReadByteSeq(GuildMember[7]); + _worldPacket.ReadByteSeq(GuildMember[4]); + _worldPacket.ReadByteSeq(GuildGUID[5]); + _worldPacket.ReadByteSeq(GuildGUID[6]); + _worldPacket.ReadByteSeq(GuildMember[5]); +} + +WorldPacket const* WorldPackets::Guild::GuildMemberRecipes::Write() +{ + _worldPacket.WriteBit(Member[0]); + _worldPacket.WriteBit(Member[3]); + _worldPacket.WriteBit(Member[7]); + _worldPacket.WriteBit(Member[4]); + _worldPacket.WriteBit(Member[6]); + _worldPacket.WriteBit(Member[2]); + _worldPacket.WriteBit(Member[1]); + _worldPacket.WriteBit(Member[5]); + + _worldPacket.FlushBits(); + + _worldPacket.WriteByteSeq(Member[0]); + _worldPacket.WriteByteSeq(Member[1]); + _worldPacket.WriteByteSeq(Member[7]); + _worldPacket.WriteByteSeq(Member[4]); + _worldPacket.WriteByteSeq(Member[5]); + + _worldPacket << int32(SkillRank); + + for (uint16 i = 0; i < SkillLineBitArray.max_size(); i++) + _worldPacket << SkillLineBitArray[i]; + + _worldPacket.WriteByteSeq(Member[3]); + _worldPacket.WriteByteSeq(Member[6]); + _worldPacket.WriteByteSeq(Member[2]); + + _worldPacket << int32(SkillLineID); + _worldPacket << int32(SkillStep); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/GuildPackets.h b/src/server/game/Server/Packets/GuildPackets.h index 1c79a94c95a..9ba49ad1180 100644 --- a/src/server/game/Server/Packets/GuildPackets.h +++ b/src/server/game/Server/Packets/GuildPackets.h @@ -377,6 +377,32 @@ namespace WorldPackets std::vector Members; int32 SkillLineID = 0; }; + + class GuildQueryMemberRecipes : public ClientPacket + { + public: + GuildQueryMemberRecipes(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_QUERY_MEMBER_RECIPES, std::move(packet)) { } + + void Read() override; + + ObjectGuid GuildMember; + ObjectGuid GuildGUID; + int32 SkillLineID = 0; + }; + + class GuildMemberRecipes final : public ServerPacket + { + public: + GuildMemberRecipes() : ServerPacket(SMSG_GUILD_MEMBER_RECIPES, 12) { } + + WorldPacket const* Write() override; + + ObjectGuid Member; + int32 SkillRank = 0; + int32 SkillLineID = 0; + int32 SkillStep = 0; + std::array SkillLineBitArray; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 4b30d0b4b4e..5906e0765a1 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -348,6 +348,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_GUILD_QUERY_NEWS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildQueryNewsOpcode ); DEFINE_HANDLER(CMSG_GUILD_QUERY_RANKS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildQueryRanksOpcode ); DEFINE_HANDLER(CMSG_GUILD_QUERY_RECIPES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildQueryRecipesOpcode ); + DEFINE_HANDLER(CMSG_GUILD_QUERY_MEMBER_RECIPES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildQueryMemberRecipe ); DEFINE_HANDLER(CMSG_GUILD_QUERY_MEMBERS_FOR_RECIPE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildQueryMembersForRecipe); DEFINE_HANDLER(CMSG_GUILD_REMOVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildRemoveOpcode ); DEFINE_HANDLER(CMSG_GUILD_REPLACE_GUILD_MASTER, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); @@ -493,7 +494,6 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_PUSHQUESTTOPARTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePushQuestToParty ); DEFINE_HANDLER(CMSG_PVP_LOG_DATA, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandlePVPLogDataOpcode ); DEFINE_HANDLER(CMSG_QUERY_BATTLEFIELD_STATE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleBattlegroundStateQuery ); - DEFINE_HANDLER(CMSG_QUERY_GUILD_MEMBER_RECIPES, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_HANDLER(CMSG_QUERY_GUILD_REWARDS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleGuildRewardsQueryOpcode ); DEFINE_HANDLER(CMSG_QUERY_INSPECT_ACHIEVEMENTS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQueryInspectAchievements ); DEFINE_HANDLER(CMSG_QUERY_QUESTS_COMPLETED, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQueryQuestsCompleted ); @@ -942,7 +942,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MAX_DAILY_XP, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBERS_WITH_RECIPE, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBER_DAILY_RESET, STATUS_NEVER); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBER_RECIPES, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBER_RECIPES, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBER_UPDATE_NOTE, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MOVE_COMPLETE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MOVE_STARTING, STATUS_UNHANDLED); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 40052c260ba..f46f5449829 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -265,6 +265,7 @@ enum Opcodes : uint16 CMSG_GUILD_QUERY_NEWS = 0x3020, CMSG_GUILD_QUERY_RANKS = 0x1026, CMSG_GUILD_QUERY_RECIPES = 0x3033, + CMSG_GUILD_QUERY_MEMBER_RECIPES = 0x1037, CMSG_GUILD_QUERY_MEMBERS_FOR_RECIPE = 0x1036, CMSG_GUILD_REMOVE = 0x1231, CMSG_GUILD_REPLACE_GUILD_MASTER = 0x1034, @@ -420,7 +421,6 @@ enum Opcodes : uint16 CMSG_PUSHQUESTTOPARTY = 0x4B14, CMSG_PVP_LOG_DATA = 0x7308, CMSG_QUERY_BATTLEFIELD_STATE = 0x7202, - CMSG_QUERY_GUILD_MEMBER_RECIPES = 0x1037, CMSG_QUERY_GUILD_REWARDS = 0x3012, CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0x4D27, CMSG_QUERY_QUESTS_COMPLETED = 0x2317, diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index fdcc8f9918a..3d0c3111adf 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -1455,6 +1455,7 @@ uint32 WorldSession::DosProtection::GetMaxPacketCounterAllowed(uint16 opcode) co case CMSG_WRAP_ITEM: // not profiled case CMSG_REPORT_PVP_AFK: // not profiled case CMSG_GUILD_QUERY_MEMBERS_FOR_RECIPE: // not profiled + case CMSG_GUILD_QUERY_MEMBER_RECIPES: // not profiled { maxPacketCounterAllowed = 10; break; diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 91a5e447b12..7eb81b4b6f0 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -116,6 +116,7 @@ namespace WorldPackets class GuildGetRoster; class GuildQueryRecipes; class GuildQueryMembersForRecipe; + class GuildQueryMemberRecipes; } } @@ -723,6 +724,7 @@ class TC_GAME_API WorldSession void HandleGuildQueryNewsOpcode(WorldPacket& recvPacket); void HandleGuildQueryRecipesOpcode(WorldPackets::Guild::GuildQueryRecipes& packet); void HandleGuildQueryMembersForRecipe(WorldPackets::Guild::GuildQueryMembersForRecipe& packet); + void HandleGuildQueryMemberRecipe(WorldPackets::Guild::GuildQueryMemberRecipes& packet); void HandleGuildSetRankPermissionsOpcode(WorldPacket& recvPacket); void HandleGuildAddRankOpcode(WorldPacket& recvPacket); void HandleGuildDelRankOpcode(WorldPacket& recvPacket);