Core/Packets: converted SMSG_GUILD_COMMAND_RESULT, SMSG_GUILD_BANK_TEXT_QUERY_RESULT, SMSG_GUILD_NAME_CHANGED, SMSG_QUERY_GUILD_INFO_RESPONSE and SMSG_GUILD_RANKS to packet class

This commit is contained in:
Ovahlord
2020-03-18 23:09:35 +01:00
parent f1f00c3ec3
commit 9dd475d2fc
7 changed files with 243 additions and 105 deletions

View File

@@ -115,14 +115,14 @@ void Guild::SendCommandResult(WorldSession* session, GuildCommandType type, Guil
// Note: SMSG_GUILD_COMMAND_RESULT and SMSG_GUILD_COMMAND_RESULT_2 do exactly the same in the client, they just have different structures.
// There's no particular reason why we use SMSG_GUILD_COMMAND_RESULT_2, this one is processed inmediately as it is read from the client.
// SMSG_GUILD_COMMAND_RESULT is a JAM opcode
WorldPacket data(SMSG_GUILD_COMMAND_RESULT_2, 8 + param.size() + 1);
data << uint32(type);
data << param;
data << uint32(errCode);
session->SendPacket(&data);
WorldPackets::Guild::GuildCommandResult result;
TC_LOG_DEBUG("guild", "SMSG_GUILD_COMMAND_RESULT [%s]: Type: %u, code: %u, param: %s"
, session->GetPlayerInfo().c_str(), type, errCode, param.c_str());
result.Command = type;
result.Name = param;
result.Result = errCode;
session->SendPacket(result.Write());
TC_LOG_DEBUG("guild", "SMSG_GUILD_COMMAND_RESULT [%s]: Type: %u, code: %u, param: %s", session->GetPlayerInfo().c_str(), type, errCode, param.c_str());
}
void Guild::SendSaveEmblemResult(WorldSession* session, GuildEmblemError errCode)
@@ -638,21 +638,20 @@ bool Guild::BankTab::SetItem(SQLTransaction& trans, uint8 slotId, Item* item)
void Guild::BankTab::SendText(Guild const* guild, WorldSession* session) const
{
WorldPacket data(SMSG_GUILD_BANK_QUERY_TEXT_RESULT, 1 + m_text.size() + 1);
data.WriteBits(m_text.length(), 14);
data << uint32(m_tabId);
data.WriteString(m_text);
WorldPackets::Guild::GuildBankTextQueryResult textQuery;
textQuery.Text = m_text;
textQuery.Tab = m_tabId;
if (session)
{
TC_LOG_DEBUG("guild", "SMSG_GUILD_BANK_QUERY_TEXT_RESULT [%s]: Tabid: %u, Text: %s"
, session->GetPlayerInfo().c_str(), m_tabId, m_text.c_str());
session->SendPacket(&data);
session->SendPacket(textQuery.Write());
}
else
{
TC_LOG_DEBUG("guild", "SMSG_GUILD_BANK_QUERY_TEXT_RESULT [Broadcast]: Tabid: %u, Text: %s", m_tabId, m_text.c_str());
guild->BroadcastPacket(&data);
guild->BroadcastPacket(textQuery.Write());
}
}
@@ -1035,15 +1034,6 @@ void EmblemInfo::LoadFromDB(Field* fields)
m_backgroundColor = fields[7].GetUInt8();
}
void EmblemInfo::WritePacket(WorldPacket& data) const
{
data << uint32(m_style);
data << uint32(m_color);
data << uint32(m_borderStyle);
data << uint32(m_borderColor);
data << uint32(m_backgroundColor);
}
void EmblemInfo::SaveToDB(ObjectGuid::LowType guildId) const
{
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_EMBLEM_INFO);
@@ -1616,29 +1606,10 @@ bool Guild::SetName(std::string const& name)
stmt->setUInt32(1, GetId());
CharacterDatabase.Execute(stmt);
ObjectGuid guid = GetGUID();
WorldPacket data(SMSG_GUILD_RENAMED, 24 + 8 + 1);
data.WriteBit(guid[5]);
data.WriteBits(name.length(), 8);
data.WriteBit(guid[4]);
data.WriteBit(guid[0]);
data.WriteBit(guid[6]);
data.WriteBit(guid[3]);
data.WriteBit(guid[1]);
data.WriteBit(guid[7]);
data.WriteBit(guid[2]);
data.WriteByteSeq(guid[3]);
data.WriteByteSeq(guid[2]);
data.WriteByteSeq(guid[7]);
data.WriteByteSeq(guid[1]);
data.WriteByteSeq(guid[0]);
data.WriteByteSeq(guid[6]);
data.WriteString(name);
data.WriteByteSeq(guid[4]);
data.WriteByteSeq(guid[5]);
BroadcastPacket(&data);
WorldPackets::Guild::GuildNameChanged guildNameChanged;
guildNameChanged.GuildGUID = GetGUID();
guildNameChanged.GuildName = name;
BroadcastPacket(guildNameChanged.Write());
return true;
}
@@ -1699,53 +1670,41 @@ void Guild::HandleRoster(WorldSession* session)
session->SendPacket(roster.Write());
}
void Guild::HandleQuery(WorldSession* session)
void Guild::SendQueryResponse(WorldSession* session)
{
WorldPacket data(SMSG_GUILD_QUERY_RESPONSE, 8 * 32 + 200); // Guess size
WorldPackets::Guild::QueryGuildInfoResponse response;
response.GuildGUID = GetGUID();
response.GuildName = m_name;
data << uint64(GetGUID());
data << m_name;
response.EmblemStyle = m_emblemInfo.GetStyle();
response.EmblemColor = m_emblemInfo.GetColor();
response.BorderStyle = m_emblemInfo.GetBorderStyle();
response.BorderColor = m_emblemInfo.GetBorderColor();
response.BackgroundColor = m_emblemInfo.GetBackgroundColor();
// Rank name
for (uint8 i = 0; i < GUILD_RANKS_MAX_COUNT; ++i) // Always show 10 ranks
{
if (i < _GetRanksSize())
data << m_ranks[i].GetName();
else
data << uint8(0); // Empty string
}
response.RanksSize = _GetRanksSize();
// Rank order of creation
for (uint8 i = 0; i < GUILD_RANKS_MAX_COUNT; ++i)
{
WorldPackets::Guild::GuildInfoRank info;
if (i < _GetRanksSize())
data << uint32(i);
else
data << uint32(0);
{
info.RankID = m_ranks[i].GetId();
info.RankOrder = i;
info.RankName = m_ranks[i].GetName();
}
response.Ranks[i] = info;
}
// Rank order of "importance" (sorting by rights)
for (uint8 i = 0; i < GUILD_RANKS_MAX_COUNT; ++i)
{
if (i < _GetRanksSize())
data << uint32(m_ranks[i].GetId());
else
data << uint32(0);
}
m_emblemInfo.WritePacket(data);
data << uint32(_GetRanksSize()); // Number of ranks used
session->SendPacket(&data);
TC_LOG_DEBUG("guild", "SMSG_GUILD_QUERY_RESPONSE [%s]", session->GetPlayerInfo().c_str());
session->SendPacket(response.Write());
TC_LOG_DEBUG("guild", "SMSG_QUERY_GUILD_INFO_RESPONSE [%s]", session->GetPlayerInfo().c_str());
}
void Guild::SendGuildRankInfo(WorldSession* session) const
{
ByteBuffer rankData(100);
WorldPacket data(SMSG_GUILD_RANK, 100);
WorldPackets::Guild::GuildRanks ranks;
data.WriteBits(_GetRanksSize(), 18);
ranks.Ranks.reserve(_GetRanksSize());
for (uint8 i = 0; i < _GetRanksSize(); i++)
{
@@ -1753,29 +1712,25 @@ void Guild::SendGuildRankInfo(WorldSession* session) const
if (!rankInfo)
continue;
data.WriteBits(rankInfo->GetName().length(), 7);
WorldPackets::Guild::GuildRankData rankData;
rankData << uint32(rankInfo->GetId());
rankData.RankID = rankInfo->GetId();
rankData.RankOrder = uint32(i);
rankData.Flags = rankInfo->GetRights();
rankData.WithdrawGoldLimit = (rankInfo->GetId() == GR_GUILDMASTER ? (-1) : int32(rankInfo->GetBankMoneyPerDay() / GOLD));
rankData.RankName = rankInfo->GetName();
for (uint8 j = 0; j < GUILD_BANK_MAX_TABS; ++j)
{
rankData << uint32(rankInfo->GetBankTabSlotsPerDay(j));
rankData << uint32(rankInfo->GetBankTabRights(j));
rankData.TabFlags[j] = uint32(rankInfo->GetBankTabRights(j));
rankData.TabWithdrawItemLimit[j] = uint32(rankInfo->GetBankTabSlotsPerDay(j));
}
rankData << uint32(rankInfo->GetBankMoneyPerDay());
rankData << uint32(rankInfo->GetRights());
if (rankInfo->GetName().length())
rankData.WriteString(rankInfo->GetName());
rankData << uint32(i);
ranks.Ranks.push_back(rankData);
}
data.FlushBits();
data.append(rankData);
session->SendPacket(&data);
TC_LOG_DEBUG("guild", "SMSG_GUILD_RANK [%s]", session->GetPlayerInfo().c_str());
session->SendPacket(ranks.Write());
TC_LOG_DEBUG("guild", "SMSG_GUILD_RANKS [%s]", session->GetPlayerInfo().c_str());
}
void Guild::HandleSetAchievementTracking(WorldSession* session, std::set<uint32> const& achievementIds)
@@ -1861,7 +1816,7 @@ void Guild::HandleSetEmblem(WorldSession* session, EmblemInfo const& emblemInfo)
SendSaveEmblemResult(session, ERR_GUILDEMBLEM_SUCCESS); // "Guild Emblem saved."
HandleQuery(session);
SendQueryResponse(session);
}
}

View File

@@ -292,7 +292,6 @@ public:
void LoadFromDB(Field* fields);
void SaveToDB(ObjectGuid::LowType guildId) const;
void ReadPacket(WorldPacket& recv);
void WritePacket(WorldPacket& data) const;
uint32 GetStyle() const { return m_style; }
uint32 GetColor() const { return m_color; }
@@ -785,7 +784,7 @@ public:
// Handle client commands
void HandleRoster(WorldSession* session);
void HandleQuery(WorldSession* session);
void SendQueryResponse(WorldSession* session);
void HandleSetAchievementTracking(WorldSession* session, std::set<uint32> const& achievementIds);
void HandleSetMOTD(WorldSession* session, std::string const& motd);
void HandleSetInfo(WorldSession* session, std::string const& info);

View File

@@ -41,7 +41,7 @@ void WorldSession::HandleGuildQueryOpcode(WorldPacket& recvPacket)
if (Guild* guild = sGuildMgr->GetGuildByGuid(guildGuid))
if (guild->IsMember(playerGuid))
guild->HandleQuery(this);
guild->SendQueryResponse(this);
}
void WorldSession::HandleGuildInviteOpcode(WorldPacket& recvPacket)

View File

@@ -555,3 +555,105 @@ WorldPacket const* WorldPackets::Guild::GuildChallengeCompleted::Write()
return &_worldPacket;
}
WorldPacket const* WorldPackets::Guild::GuildCommandResult::Write()
{
_worldPacket << uint32(Command);
_worldPacket << Name;
_worldPacket << uint32(Result);
return &_worldPacket;
}
WorldPacket const* WorldPackets::Guild::GuildBankTextQueryResult::Write()
{
_worldPacket.WriteBits(Text.length(), 14);
_worldPacket.FlushBits();
_worldPacket << uint32(Tab);
_worldPacket.WriteString(Text);
return &_worldPacket;
}
WorldPacket const* WorldPackets::Guild::GuildNameChanged::Write()
{
_worldPacket.WriteBit(GuildGUID[5]);
_worldPacket.WriteBits(GuildName.length(), 8);
_worldPacket.WriteBit(GuildGUID[4]);
_worldPacket.WriteBit(GuildGUID[0]);
_worldPacket.WriteBit(GuildGUID[6]);
_worldPacket.WriteBit(GuildGUID[3]);
_worldPacket.WriteBit(GuildGUID[1]);
_worldPacket.WriteBit(GuildGUID[7]);
_worldPacket.WriteBit(GuildGUID[2]);
_worldPacket.WriteByteSeq(GuildGUID[3]);
_worldPacket.WriteByteSeq(GuildGUID[2]);
_worldPacket.WriteByteSeq(GuildGUID[7]);
_worldPacket.WriteByteSeq(GuildGUID[1]);
_worldPacket.WriteByteSeq(GuildGUID[0]);
_worldPacket.WriteByteSeq(GuildGUID[6]);
_worldPacket.WriteString(GuildName);
_worldPacket.WriteByteSeq(GuildGUID[4]);
_worldPacket.WriteByteSeq(GuildGUID[5]);
return &_worldPacket;
}
WorldPacket const* WorldPackets::Guild::QueryGuildInfoResponse::Write()
{
_worldPacket << GuildGUID;
_worldPacket << GuildName;
for (uint8 i = 0; i < GUILD_RANKS_MAX_COUNT; ++i)
_worldPacket << Ranks[i].RankName;
for (uint8 i = 0; i < GUILD_RANKS_MAX_COUNT; ++i)
_worldPacket << uint32(Ranks[i].RankOrder);
for (uint8 i = 0; i < GUILD_RANKS_MAX_COUNT; ++i)
_worldPacket << uint32(Ranks[i].RankID);
_worldPacket << uint32(EmblemStyle);
_worldPacket << uint32(EmblemColor);
_worldPacket << uint32(BorderStyle);
_worldPacket << uint32(BorderColor);
_worldPacket << uint32(BackgroundColor);
_worldPacket << uint32(RanksSize);
return &_worldPacket;
}
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Guild::GuildRankData const& rankData)
{
data << int32(rankData.RankID);
for (uint8 i = 0; i < GUILD_BANK_MAX_TABS; i++)
{
data << int32(rankData.TabWithdrawItemLimit[i]);
data << int32(rankData.TabFlags[i]);
}
data << int32(rankData.WithdrawGoldLimit);
data << int32(rankData.Flags);
data.WriteString(rankData.RankName);
data << int32(rankData.RankOrder);
return data;
}
WorldPacket const* WorldPackets::Guild::GuildRanks::Write()
{
_worldPacket.WriteBits(Ranks.size(), 18);
for (GuildRankData const& rank : Ranks)
_worldPacket.WriteBits(rank.RankName.length(), 7);
_worldPacket.FlushBits();
for (GuildRankData const& rank : Ranks)
_worldPacket << rank;
return &_worldPacket;
}

View File

@@ -470,6 +470,88 @@ namespace WorldPackets
int32 XpAwarded = 0;
int32 CurrentCount = 0;
};
class GuildCommandResult final : public ServerPacket
{
public:
GuildCommandResult() : ServerPacket(SMSG_GUILD_COMMAND_RESULT, 9) { }
WorldPacket const* Write() override;
std::string Name;
int32 Result = 0;
int32 Command = 0;
};
class GuildBankTextQueryResult : public ServerPacket
{
public:
GuildBankTextQueryResult() : ServerPacket(SMSG_GUILD_BANK_TEXT_QUERY_RESULT, 4 + 2) { }
WorldPacket const* Write() override;
int32 Tab = 0;
std::string Text;
};
class GuildNameChanged final : ServerPacket
{
public:
GuildNameChanged() : ServerPacket(SMSG_GUILD_NAME_CHANGED, 33) { }
WorldPacket const* Write() override;
ObjectGuid GuildGUID;
std::string GuildName;
};
struct GuildInfoRank
{
uint32 RankID = 0;
uint32 RankOrder = 0;
std::string RankName;
};
class QueryGuildInfoResponse final : ServerPacket
{
public:
QueryGuildInfoResponse() : ServerPacket(SMSG_QUERY_GUILD_INFO_RESPONSE) { }
WorldPacket const* Write() override;
ObjectGuid GuildGUID;
std::string GuildName;
std::array<GuildInfoRank, GUILD_RANKS_MAX_COUNT> Ranks;
uint32 RanksSize = 0;
uint32 EmblemStyle = 0;
uint32 EmblemColor = 0;
uint32 BorderStyle = 0;
uint32 BorderColor = 0;
uint32 BackgroundColor = 0;
};
struct GuildRankData
{
uint8 RankID = 0;
int32 RankOrder = 0;
uint32 Flags = 0;
uint32 WithdrawGoldLimit = 0;
std::string RankName;
uint32 TabFlags[GUILD_BANK_MAX_TABS];
uint32 TabWithdrawItemLimit[GUILD_BANK_MAX_TABS];
};
class GuildRanks final : public ServerPacket
{
public:
GuildRanks() : ServerPacket(SMSG_GUILD_RANKS, 4) { }
WorldPacket const* Write() override;
std::vector<GuildRankData> Ranks;
};
}
}

View File

@@ -892,7 +892,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_QUERY_RESULTS, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_LOG_QUERY_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_MONEY_WITHDRAWN, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_QUERY_TEXT_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_TEXT_QUERY_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CHALLENGE_COMPLETED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CHALLENGE_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CHANGE_NAME_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -917,11 +917,11 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_NEWS_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_PARTY_STATE_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_PERMISSIONS_QUERY_RESULTS, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_QUERY_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RANK, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GUILD_INFO_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RANKS, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RANKS_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_KNOWN_RECIPES, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RENAMED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_NAME_CHANGED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_REPUTATION_REACTION_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_REPUTATION_WEEKLY_CAP, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RESET, STATUS_NEVER, CONNECTION_TYPE_REALM);

View File

@@ -830,7 +830,7 @@ enum OpcodeServer
SMSG_GUILD_BANK_QUERY_RESULTS = 0x78A5,
SMSG_GUILD_BANK_LOG_QUERY_RESULT = 0x30B2,
SMSG_GUILD_BANK_MONEY_WITHDRAWN = 0x5DB4,
SMSG_GUILD_BANK_QUERY_TEXT_RESULT = 0x75A3,
SMSG_GUILD_BANK_TEXT_QUERY_RESULT = 0x75A3,
SMSG_GUILD_CANCEL = 0x0000,
SMSG_GUILD_CHALLENGE_COMPLETED = 0x39A3,
SMSG_GUILD_CHALLENGE_UPDATE = 0x18B1,
@@ -857,10 +857,10 @@ enum OpcodeServer
SMSG_GUILD_NEWS_UPDATE = 0x35A7,
SMSG_GUILD_PARTY_STATE_RESPONSE = 0x50A6,
SMSG_GUILD_PERMISSIONS_QUERY_RESULTS = 0x34A3,
SMSG_GUILD_QUERY_RESPONSE = 0x0E06,
SMSG_GUILD_RANK = 0x30B4,
SMSG_QUERY_GUILD_INFO_RESPONSE = 0x0E06,
SMSG_GUILD_RANKS = 0x30B4,
SMSG_GUILD_RANKS_UPDATE = 0x5DA0,
SMSG_GUILD_RENAMED = 0x74A6,
SMSG_GUILD_NAME_CHANGED = 0x74A6,
SMSG_GUILD_REPUTATION_REACTION_CHANGED = 0x74B0,
SMSG_GUILD_REPUTATION_WEEKLY_CAP = 0x30B7,
SMSG_GUILD_RESET = 0x1CB5,