Core/Guilds: implement CMSG_GUILD_QUERY_MEMBER_RECIPES and SMSG_GUILD_MEMBER_RECIPES

This commit is contained in:
Ovahlord
2019-09-04 23:12:49 +02:00
parent ca51f7f9ad
commit ca9b424e11
9 changed files with 133 additions and 3 deletions

View File

@@ -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());
}

View File

@@ -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;

View File

@@ -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)
{

View File

@@ -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;
}

View File

@@ -377,6 +377,32 @@ namespace WorldPackets
std::vector<ObjectGuid> 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<uint8, GUILD_RECIPES_COUNT> SkillLineBitArray;
};
}
}

View File

@@ -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);

View File

@@ -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,

View File

@@ -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;

View File

@@ -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);