aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Guilds/Guild.cpp506
-rw-r--r--src/server/game/Guilds/Guild.h44
-rw-r--r--src/server/game/Handlers/GuildHandler.cpp420
-rw-r--r--src/server/game/Server/Packets/AllPackets.h1
-rw-r--r--src/server/game/Server/Packets/GuildPackets.cpp459
-rw-r--r--src/server/game/Server/Packets/GuildPackets.h627
-rw-r--r--src/server/game/Server/WorldSession.h106
7 files changed, 1536 insertions, 627 deletions
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp
index 2a48c73f59d..2030d8cb3f0 100644
--- a/src/server/game/Guilds/Guild.cpp
+++ b/src/server/game/Guilds/Guild.cpp
@@ -25,6 +25,7 @@
#include "DatabaseEnv.h"
#include "GameTime.h"
#include "GuildMgr.h"
+#include "GuildPackets.h"
#include "Language.h"
#include "Log.h"
#include "ObjectAccessor.h"
@@ -35,6 +36,7 @@
#include "SocialMgr.h"
#include "World.h"
#include "WorldSession.h"
+#include <boost/iterator/counting_iterator.hpp>
size_t const MAX_GUILD_BANK_TAB_TEXT_LEN = 500;
@@ -102,11 +104,11 @@ inline uint32 GetGuildBankTabPrice(uint8 tabId)
void Guild::SendCommandResult(WorldSession* session, GuildCommandType type, GuildCommandError errCode, std::string const& param)
{
- WorldPacket data(SMSG_GUILD_COMMAND_RESULT, 8 + param.size() + 1);
- data << uint32(type);
- data << param;
- data << uint32(errCode);
- session->SendPacket(&data);
+ WorldPackets::Guild::GuildCommandResult resultPacket;
+ resultPacket.Command = type;
+ resultPacket.Result = errCode;
+ resultPacket.Name = param;
+ session->SendPacket(resultPacket.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());
@@ -114,9 +116,9 @@ void Guild::SendCommandResult(WorldSession* session, GuildCommandType type, Guil
void Guild::SendSaveEmblemResult(WorldSession* session, GuildEmblemError errCode)
{
- WorldPacket data(MSG_SAVE_GUILD_EMBLEM, 4);
- data << uint32(errCode);
- session->SendPacket(&data);
+ WorldPackets::Guild::PlayerSaveGuildEmblem saveResponse;
+ saveResponse.Error = int32(errCode);
+ session->SendPacket(saveResponse.Write());
TC_LOG_DEBUG("guild", "MSG_SAVE_GUILD_EMBLEM [%s] Code: %u", session->GetPlayerInfo().c_str(), errCode);
}
@@ -154,14 +156,6 @@ inline void Guild::LogHolder::AddEvent(SQLTransaction& trans, LogEntry* entry)
entry->SaveToDB(trans);
}
-// Writes information about all events into packet.
-inline void Guild::LogHolder::WritePacket(WorldPacket& data) const
-{
- data << uint8(m_log.size());
- for (auto itr = m_log.begin(); itr != m_log.end(); ++itr)
- (*itr)->WritePacket(data);
-}
-
inline uint32 Guild::LogHolder::GetNextGUID()
{
// Next guid was not initialized. It means there are no records for this holder in DB yet.
@@ -195,20 +189,18 @@ void Guild::EventLogEntry::SaveToDB(SQLTransaction& trans) const
trans->Append(stmt);
}
-void Guild::EventLogEntry::WritePacket(WorldPacket& data) const
+void Guild::EventLogEntry::WritePacket(WorldPackets::Guild::GuildEventLogQueryResults& packet) const
{
- // Event type
- data << uint8(m_eventType);
- // Player 1
- data << ObjectGuid(HighGuid::Player, m_playerGuid1);
- // Player 2 not for left/join guild events
- if (m_eventType != GUILD_EVENT_LOG_JOIN_GUILD && m_eventType != GUILD_EVENT_LOG_LEAVE_GUILD)
- data << ObjectGuid(HighGuid::Player, m_playerGuid2);
- // New Rank - only for promote/demote guild events
- if (m_eventType == GUILD_EVENT_LOG_PROMOTE_PLAYER || m_eventType == GUILD_EVENT_LOG_DEMOTE_PLAYER)
- data << uint8(m_newRank);
- // Event timestamp
- data << uint32(GameTime::GetGameTime() - m_timestamp);
+ ObjectGuid playerGUID = ObjectGuid::Create<HighGuid::Player>(m_playerGuid1);
+ ObjectGuid otherGUID = ObjectGuid::Create<HighGuid::Player>(m_playerGuid2);
+
+ WorldPackets::Guild::GuildEventEntry eventEntry;
+ eventEntry.PlayerGUID = playerGUID;
+ eventEntry.OtherGUID = otherGUID;
+ eventEntry.TransactionType = uint8(m_eventType);
+ eventEntry.TransactionDate = uint32(GameTime::GetGameTime() - m_timestamp);
+ eventEntry.RankID = uint8(m_newRank);
+ packet.Entry.push_back(eventEntry);
}
// BankEventLogEntry
@@ -236,29 +228,32 @@ void Guild::BankEventLogEntry::SaveToDB(SQLTransaction& trans) const
trans->Append(stmt);
}
-void Guild::BankEventLogEntry::WritePacket(WorldPacket& data) const
+void Guild::BankEventLogEntry::WritePacket(WorldPackets::Guild::GuildBankLogQueryResults& packet) const
{
- data << uint8(m_eventType);
- data << ObjectGuid(HighGuid::Player, m_playerGuid);
+ WorldPackets::Guild::GuildBankLogEntry bankLogEntry;
+ bankLogEntry.PlayerGUID = ObjectGuid::Create<HighGuid::Player>(m_playerGuid);
+ bankLogEntry.TimeOffset = int32(GameTime::GetGameTime() - m_timestamp);
+ bankLogEntry.EntryType = int8(m_eventType);
switch (m_eventType)
{
case GUILD_BANK_LOG_DEPOSIT_ITEM:
case GUILD_BANK_LOG_WITHDRAW_ITEM:
- data << uint32(m_itemOrMoney);
- data << uint32(m_itemStackCount);
+ bankLogEntry.ItemID = int32(m_itemOrMoney);
+ bankLogEntry.Count = int32(m_itemStackCount);
break;
case GUILD_BANK_LOG_MOVE_ITEM:
case GUILD_BANK_LOG_MOVE_ITEM2:
- data << uint32(m_itemOrMoney);
- data << uint32(m_itemStackCount);
- data << uint8(m_destTabId);
+ bankLogEntry.ItemID = int32(m_itemOrMoney);
+ bankLogEntry.Count = int32(m_itemStackCount);
+ bankLogEntry.OtherTab = int8(m_destTabId);
break;
default:
- data << uint32(m_itemOrMoney);
+ bankLogEntry.Money = uint32(m_itemOrMoney);
+ break;
}
- data << uint32(GameTime::GetGameTime() - m_timestamp);
+ packet.Entry.push_back(bankLogEntry);
}
// RankInfo
@@ -308,20 +303,6 @@ void Guild::RankInfo::CreateMissingTabsIfNeeded(uint8 tabs, SQLTransaction& tran
}
}
-void Guild::RankInfo::WritePacket(WorldPacket& data) const
-{
- data << uint32(m_rights);
- if (m_bankMoneyPerDay == GUILD_WITHDRAW_MONEY_UNLIMITED)
- data << uint32(GUILD_WITHDRAW_MONEY_UNLIMITED);
- else
- data << uint32(m_bankMoneyPerDay);
- for (uint8 i = 0; i < GUILD_BANK_MAX_TABS; ++i)
- {
- data << uint32(m_bankTabRightsAndSlots[i].GetRights());
- data << uint32(m_bankTabRightsAndSlots[i].GetSlots());
- }
-}
-
void Guild::RankInfo::SetName(std::string const& name)
{
if (m_name == name)
@@ -457,72 +438,6 @@ void Guild::BankTab::Delete(SQLTransaction& trans, bool removeItemsFromDB)
}
}
-inline void Guild::BankTab::WritePacket(WorldPacket& data) const
-{
- uint8 count = 0;
-
- size_t pos = data.wpos();
- data << uint8(0);
-
- for (uint8 slotId = 0; slotId < GUILD_BANK_MAX_SLOTS; ++slotId)
- if (WriteSlotPacket(data, slotId))
- ++count;
-
- data.put<uint8>(pos, count);
-}
-
-// Writes information about contents of specified slot into packet.
-bool Guild::BankTab::WriteSlotPacket(WorldPacket& data, uint8 slotId, bool ignoreEmpty /* = true */) const
-{
- Item* pItem = GetItem(slotId);
- uint32 itemEntry = pItem ? pItem->GetEntry() : 0;
-
- if (!itemEntry && ignoreEmpty)
- return false;
-
- data << uint8(slotId);
- data << uint32(itemEntry);
- if (itemEntry)
- {
- data << uint32(0); // 3.3.0 (0x00018020, 0x00018000)
-
-
- if (uint32 random = pItem->GetItemRandomPropertyId())
- {
- data << uint32(random); // Random item property id
- data << uint32(pItem->GetItemSuffixFactor()); // SuffixFactor
- }
- else
- data << uint32(0);
-
- data << uint32(pItem->GetCount()); // ITEM_FIELD_STACK_COUNT
- data << uint32(pItem->GetEnchantmentId(PERM_ENCHANTMENT_SLOT)); // Permanent enchantment
- data << uint8(abs(pItem->GetSpellCharges())); // Spell charges
-
- uint8 enchCount = 0;
- size_t enchCountPos = data.wpos();
-
- data << uint8(enchCount); // Number of enchantments
- for (uint32 socketSlot = SOCK_ENCHANTMENT_SLOT; socketSlot < SOCK_ENCHANTMENT_SLOT + MAX_GEM_SOCKETS; ++socketSlot)
- {
- if (uint32 enchId = pItem->GetEnchantmentId(EnchantmentSlot(socketSlot)))
- {
- data << uint8(socketSlot - SOCK_ENCHANTMENT_SLOT);
- data << uint32(enchId);
- ++enchCount;
- }
- }
- data.put<uint8>(enchCountPos, enchCount);
- }
- return true;
-}
-
-void Guild::BankTab::WriteInfoPacket(WorldPacket& data) const
-{
- data << m_name;
- data << m_icon;
-}
-
void Guild::BankTab::SetInfo(std::string const& name, std::string const& icon)
{
if (m_name == name && m_icon == icon)
@@ -589,20 +504,20 @@ bool Guild::BankTab::SetItem(SQLTransaction& trans, uint8 slotId, Item* item)
void Guild::BankTab::SendText(Guild const* guild, WorldSession* session) const
{
- WorldPacket data(MSG_QUERY_GUILD_BANK_TEXT, 1 + m_text.size() + 1);
- data << uint8(m_tabId);
- data << m_text;
+ WorldPackets::Guild::GuildBankTextQueryResult textQuery;
+ textQuery.Tab = m_tabId;
+ textQuery.Text = m_text;
if (session)
{
TC_LOG_DEBUG("guild", "MSG_QUERY_GUILD_BANK_TEXT [%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", "MSG_QUERY_GUILD_BANK_TEXT [Broadcast]: Tabid: %u, Text: %s", m_tabId, m_text.c_str());
- guild->BroadcastPacket(&data);
+ guild->BroadcastPacket(textQuery.Write());
}
}
@@ -747,28 +662,6 @@ bool Guild::Member::CheckStats() const
return true;
}
-void Guild::Member::WritePacket(WorldPacket& data, bool sendOfficerNote) const
-{
- data << uint64(m_guid)
- << uint8(m_flags)
- << m_name
- << uint32(m_rankId)
- << uint8(m_level)
- << uint8(m_class)
- << uint8(m_gender)
- << uint32(m_zoneId);
-
- if (!m_flags)
- data << float(float(GameTime::GetGameTime() - m_logoutTime) / DAY);
-
- data << m_publicNote;
-
- if (sendOfficerNote)
- data << m_officerNote;
- else
- data << "";
-}
-
Player* Guild::Member::FindPlayer() const
{
return ObjectAccessor::FindPlayer(m_guid);
@@ -816,9 +709,13 @@ int32 Guild::Member::GetBankWithdrawValue(uint8 tabId) const
}
// EmblemInfo
-void EmblemInfo::ReadPacket(WorldPacket& recv)
+void EmblemInfo::ReadPacket(WorldPackets::Guild::SaveGuildEmblem& packet)
{
- recv >> m_style >> m_color >> m_borderStyle >> m_borderColor >> m_backgroundColor;
+ m_style = packet.EStyle;
+ m_color = packet.EColor;
+ m_borderStyle = packet.BStyle;
+ m_borderColor = packet.BColor;
+ m_backgroundColor = packet.Bg;
}
void EmblemInfo::LoadFromDB(Field* fields)
@@ -830,15 +727,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);
@@ -1373,42 +1261,70 @@ bool Guild::SetName(std::string const& name)
void Guild::HandleRoster(WorldSession* session)
{
- // Guess size
- WorldPacket data(SMSG_GUILD_ROSTER, (4 + m_motd.length() + 1 + m_info.length() + 1 + 4 + _GetRanksSize() * (4 + 4 + GUILD_BANK_MAX_TABS * (4 + 4)) + m_members.size() * 50));
- data << uint32(m_members.size());
- data << m_motd;
- data << m_info;
+ WorldPackets::Guild::GuildRoster roster;
- data << uint32(_GetRanksSize());
- for (auto ritr = m_ranks.begin(); ritr != m_ranks.end(); ++ritr)
- ritr->WritePacket(data);
+ for (RankInfo const& rank : m_ranks)
+ {
+ WorldPackets::Guild::GuildRankData& rankData = roster.RankData.emplace_back();
- for (auto itr = m_members.begin(); itr != m_members.end(); ++itr)
- itr->second->WritePacket(data, _HasRankRight(session->GetPlayer(), GR_RIGHT_VIEWOFFNOTE));
+ rankData.Flags = rank.GetRights();
+ rankData.WithdrawGoldLimit = rank.GetBankMoneyPerDay();
+ for (uint8 i = 0; i < GUILD_BANK_MAX_TABS; ++i)
+ {
+ rankData.TabFlags[i] = rank.GetBankTabRights(i);
+ rankData.TabWithdrawItemLimit[i] = rank.GetBankTabSlotsPerDay(i);
+ }
+ }
+
+ bool sendOfficerNote = _HasRankRight(session->GetPlayer(), GR_RIGHT_VIEWOFFNOTE);
+ for (std::pair<uint32 const, Member*> const& itr : m_members)
+ {
+ Member* member = itr.second;
+
+ WorldPackets::Guild::GuildRosterMemberData& memberData = roster.MemberData.emplace_back();
+
+ memberData.Guid = member->GetGUID();
+ memberData.RankID = int32(member->GetRankId());
+ memberData.AreaID = int32(member->GetZoneId());
+ memberData.LastSave = float(float(GameTime::GetGameTime() - member->GetLogoutTime()) / DAY);
+
+ memberData.Status = member->GetFlags();
+ memberData.Level = member->GetLevel();
+ memberData.ClassID = member->GetClass();
+ memberData.Gender = member->GetGender();
+
+ memberData.Name = member->GetName();
+ memberData.Note = member->GetPublicNote();
+ if (sendOfficerNote)
+ memberData.OfficerNote = member->GetOfficerNote();
+ }
+
+ roster.WelcomeText = m_motd;
+ roster.InfoText = m_info;
TC_LOG_DEBUG("guild", "SMSG_GUILD_ROSTER [%s]", session->GetPlayerInfo().c_str());
- session->SendPacket(&data);
+ session->SendPacket(roster.Write());
}
void Guild::HandleQuery(WorldSession* session)
{
- WorldPacket data(SMSG_GUILD_QUERY_RESPONSE, 8 * 32 + 200); // Guess size
- data << uint32(m_id);
- data << m_name;
+ WorldPackets::Guild::QueryGuildInfoResponse response;
+ response.GuildId = m_id;
- // 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.Info.EmblemStyle = m_emblemInfo.GetStyle();
+ response.Info.EmblemColor = m_emblemInfo.GetColor();
+ response.Info.BorderStyle = m_emblemInfo.GetBorderStyle();
+ response.Info.BorderColor = m_emblemInfo.GetBorderColor();
+ response.Info.BackgroundColor = m_emblemInfo.GetBackgroundColor();
- m_emblemInfo.WritePacket(data);
- data << uint32(_GetRanksSize()); // Number of ranks used
+ for (uint8 i = 0; i < _GetRanksSize(); ++i)
+ response.Info.Ranks[i] = m_ranks[i].GetName();
- session->SendPacket(&data);
+ response.Info.RankCount = _GetRanksSize();
+
+ response.Info.GuildName = m_name;
+
+ session->SendPacket(response.Write());
TC_LOG_DEBUG("guild", "SMSG_GUILD_QUERY_RESPONSE [%s]", session->GetPlayerInfo().c_str());
}
@@ -1541,7 +1457,7 @@ void Guild::HandleSetRankInfo(WorldSession* session, uint8 rankId, std::string c
for (auto itr = rightsAndSlots.begin(); itr != rightsAndSlots.end(); ++itr)
_SetRankBankTabRightsAndSlots(rankId, *itr);
- _BroadcastEvent(GE_RANK_UPDATED, ObjectGuid::Empty, std::to_string(rankId).c_str(), name.c_str());
+ _BroadcastEvent(GE_RANK_UPDATED, ObjectGuid::Empty, std::to_string(rankId).c_str(), name.c_str(), std::to_string(m_ranks.size()).c_str());
}
}
@@ -1620,10 +1536,12 @@ void Guild::HandleInviteMember(WorldSession* session, std::string const& name)
pInvitee->SetGuildIdInvited(m_id);
_LogEvent(GUILD_EVENT_LOG_INVITE_PLAYER, player->GetGUID().GetCounter(), pInvitee->GetGUID().GetCounter());
- WorldPacket data(SMSG_GUILD_INVITE, 8 + 10); // Guess size
- data << player->GetName();
- data << m_name;
- pInvitee->SendDirectMessage(&data);
+ WorldPackets::Guild::GuildInvite invite;
+
+ invite.InviterName = player->GetName();
+ invite.GuildName = GetName();
+
+ pInvitee->SendDirectMessage(invite.Write());
TC_LOG_DEBUG("guild", "SMSG_GUILD_INVITE [%s]", pInvitee->GetName().c_str());
}
@@ -1769,7 +1687,7 @@ void Guild::HandleAddNewRank(WorldSession* session, std::string const& name)
{
SQLTransaction trans(nullptr);
if (_CreateRank(trans, name, GR_RIGHT_GCHATLISTEN | GR_RIGHT_GCHATSPEAK))
- _BroadcastEvent(GE_RANK_UPDATED, ObjectGuid::Empty, std::to_string(size).c_str(), name.c_str());
+ _BroadcastEvent(GE_RANK_UPDATED, ObjectGuid::Empty, std::to_string(size).c_str(), name.c_str(), std::to_string(m_ranks.size()).c_str());
}
}
@@ -1795,9 +1713,10 @@ void Guild::HandleRemoveRank(WorldSession* session, uint8 rankId)
stmt->setUInt8(1, rankId);
CharacterDatabase.Execute(stmt);
- m_ranks.pop_back();
+ // match what the sql statement does
+ m_ranks.erase(m_ranks.begin() + rankId, m_ranks.end());
- _BroadcastEvent(GE_RANK_DELETED, ObjectGuid::Empty, std::to_string(rankId).c_str());
+ _BroadcastEvent(GE_RANK_DELETED, ObjectGuid::Empty, std::to_string(m_ranks.size()).c_str());
}
void Guild::HandleMemberDepositMoney(WorldSession* session, uint32 amount)
@@ -1903,21 +1822,33 @@ void Guild::HandleDisband(WorldSession* session)
// Send data to client
void Guild::SendInfo(WorldSession* session) const
{
- WorldPacket data(SMSG_GUILD_INFO, m_name.size() + 4 + 4 + 4);
- data << m_name;
- data.AppendPackedTime(m_createdDate); // 3.x (prev. year + month + day)
- data << uint32(m_members.size()); // Number of members
- data << m_accountsNumber; // Number of accounts
+ WorldPackets::Guild::GuildInfoResponse guildInfo;
+ guildInfo.GuildName = m_name;
+ guildInfo.CreateDate = m_createdDate;
+ guildInfo.NumMembers = int32(m_members.size());
+ guildInfo.NumAccounts = m_accountsNumber;
- session->SendPacket(&data);
+ session->SendPacket(guildInfo.Write());
TC_LOG_DEBUG("guild", "SMSG_GUILD_INFO [%s]", session->GetPlayerInfo().c_str());
}
void Guild::SendEventLog(WorldSession* session) const
{
- WorldPacket data(MSG_GUILD_EVENT_LOG_QUERY, 1 + m_eventLog->GetSize() * (1 + 8 + 4));
- m_eventLog->WritePacket(data);
- session->SendPacket(&data);
+ GuildLog* logs = m_eventLog->GetGuildLog();
+
+ if (!logs)
+ return;
+
+ WorldPackets::Guild::GuildEventLogQueryResults packet;
+ packet.Entry.reserve(m_eventLog->GetSize());
+
+ for (GuildLog::const_iterator itr = logs->begin(); itr != logs->end(); ++itr)
+ {
+ EventLogEntry* eventLog = static_cast<EventLogEntry*>(*itr);
+ eventLog->WritePacket(packet);
+ }
+
+ session->SendPacket(packet.Write());
TC_LOG_DEBUG("guild", "MSG_GUILD_EVENT_LOG_QUERY [%s]", session->GetPlayerInfo().c_str());
}
@@ -1926,19 +1857,31 @@ void Guild::SendBankLog(WorldSession* session, uint8 tabId) const
// GUILD_BANK_MAX_TABS send by client for money log
if (tabId < _GetPurchasedTabsSize() || tabId == GUILD_BANK_MAX_TABS)
{
- LogHolder const* pLog = m_bankEventLog[tabId];
- WorldPacket data(MSG_GUILD_BANK_LOG_QUERY, pLog->GetSize() * (4 * 4 + 1) + 1 + 1);
- data << uint8(tabId);
- pLog->WritePacket(data);
- session->SendPacket(&data);
+ GuildLog* logs = m_bankEventLog[tabId]->GetGuildLog();
+
+ if (!logs)
+ return;
+
+ WorldPackets::Guild::GuildBankLogQueryResults packet;
+ packet.Tab = tabId;
+
+ packet.Entry.reserve(m_bankEventLog[tabId]->GetSize());
+ for (GuildLog::const_iterator itr = logs->begin(); itr != logs->end(); ++itr)
+ {
+ BankEventLogEntry* bankEventLog = static_cast<BankEventLogEntry*>(*itr);
+ bankEventLog->WritePacket(packet);
+ }
+
+ session->SendPacket(packet.Write());
+
TC_LOG_DEBUG("guild", "MSG_GUILD_BANK_LOG_QUERY [%s]", session->GetPlayerInfo().c_str());
}
}
-void Guild::SendBankTabData(WorldSession* session, uint8 tabId) const
+void Guild::SendBankTabData(WorldSession* session, uint8 tabId, bool sendAllSlots) const
{
if (tabId < _GetPurchasedTabsSize())
- _SendBankContent(session, tabId);
+ _SendBankContent(session, tabId, sendAllSlots);
}
void Guild::SendBankTabsInfo(WorldSession* session, bool sendAllSlots /*= false*/) const
@@ -1960,18 +1903,19 @@ void Guild::SendPermissions(WorldSession* session) const
uint8 rankId = member->GetRankId();
- WorldPacket data(MSG_GUILD_PERMISSIONS, 4 * 15 + 1);
- data << uint32(rankId);
- data << uint32(_GetRankRights(rankId));
- data << uint32(_GetMemberRemainingMoney(member));
- data << uint8(_GetPurchasedTabsSize());
+ WorldPackets::Guild::GuildPermissionsQueryResults queryResult;
+ queryResult.RankID = rankId;
+ queryResult.WithdrawGoldLimit = _GetRankBankMoneyPerDay(rankId);
+ queryResult.Flags = _GetRankRights(rankId);
+ queryResult.NumTabs = _GetPurchasedTabsSize();
+
for (uint8 tabId = 0; tabId < GUILD_BANK_MAX_TABS; ++tabId)
{
- data << uint32(_GetRankBankTabRights(rankId, tabId));
- data << uint32(_GetMemberRemainingSlots(member, tabId));
+ queryResult.Tab[tabId].Flags = _GetRankBankTabRights(rankId, tabId);
+ queryResult.Tab[tabId].WithdrawItemLimit = _GetMemberRemainingSlots(member, tabId);
}
- session->SendPacket(&data);
+ session->SendPacket(queryResult.Write());
TC_LOG_DEBUG("guild", "MSG_GUILD_PERMISSIONS [%s] Rank: %u", session->GetPlayerInfo().c_str(), rankId);
}
@@ -1982,9 +1926,11 @@ void Guild::SendMoneyInfo(WorldSession* session) const
return;
int32 amount = _GetMemberRemainingMoney(member);
- WorldPacket data(MSG_GUILD_BANK_MONEY_WITHDRAWN, 4);
- data << int32(amount);
- session->SendPacket(&data);
+
+ WorldPackets::Guild::GuildBankRemainingWithdrawMoney packet;
+ packet.RemainingWithdrawMoney = amount;
+ session->SendPacket(packet.Write());
+
TC_LOG_DEBUG("guild", "MSG_GUILD_BANK_MONEY_WITHDRAWN [%s] Money: %u", session->GetPlayerInfo().c_str(), amount);
}
@@ -2237,7 +2183,7 @@ void Guild::BroadcastToGuild(WorldSession* session, bool officerOnly, std::strin
}
}
-void Guild::BroadcastPacketToRank(WorldPacket* packet, uint8 rankId) const
+void Guild::BroadcastPacketToRank(WorldPacket const* packet, uint8 rankId) const
{
for (auto itr = m_members.begin(); itr != m_members.end(); ++itr)
if (itr->second->IsRank(rankId))
@@ -2245,7 +2191,7 @@ void Guild::BroadcastPacketToRank(WorldPacket* packet, uint8 rankId) const
player->SendDirectMessage(packet);
}
-void Guild::BroadcastPacket(WorldPacket* packet) const
+void Guild::BroadcastPacket(WorldPacket const* packet) const
{
for (auto itr = m_members.begin(); itr != m_members.end(); ++itr)
if (Player* player = itr->second->FindPlayer())
@@ -2898,13 +2844,13 @@ bool Guild::_DoItemsMove(MoveItemData* pSrc, MoveItemData* pDest, bool sendError
return true;
}
-void Guild::_SendBankContent(WorldSession* session, uint8 tabId) const
+void Guild::_SendBankContent(WorldSession* session, uint8 tabId, bool sendAllSlots) const
{
ObjectGuid guid = session->GetPlayer()->GetGUID();
if (!_MemberHasTabRights(guid, tabId, GUILD_BANK_RIGHT_VIEW_TAB))
return;
- _SendBankList(session, tabId, true);
+ _SendBankList(session, tabId, sendAllSlots);
}
void Guild::_SendBankMoneyUpdate(WorldSession* session) const
@@ -2951,69 +2897,98 @@ void Guild::_SendBankContentUpdate(uint8 tabId, SlotIds slots) const
void Guild::_BroadcastEvent(GuildEvents guildEvent, ObjectGuid guid, char const* param1, char const* param2, char const* param3) const
{
- uint8 count = !param3 ? (!param2 ? (!param1 ? 0 : 1) : 2) : 3;
-
- WorldPacket data(SMSG_GUILD_EVENT, 1 + 1 + count + (8));
- data << uint8(guildEvent);
- data << uint8(count);
-
- if (param3)
- data << param1 << param2 << param3;
- else if (param2)
- data << param1 << param2;
- else if (param1)
- data << param1;
-
- if (guid)
- data << uint64(guid);
-
- BroadcastPacket(&data);
+ WorldPackets::Guild::GuildEvent event;
+ event.Type = guildEvent;
+ event.Params[0] = param1;
+ event.Params[1] = param2;
+ event.Params[2] = param3;
+ event.Guid = guid;
+ BroadcastPacket(event.Write());
TC_LOG_DEBUG("guild", "SMSG_GUILD_EVENT [Broadcast] Event: %s (%u)", GetGuildEventString(guildEvent), guildEvent);
}
void Guild::_SendBankList(WorldSession* session /* = nullptr*/, uint8 tabId /*= 0*/, bool sendAllSlots /*= false*/, SlotIds *slots /*= nullptr*/) const
{
- WorldPacket data(SMSG_GUILD_BANK_LIST, 500);
- data << uint64(m_bankMoney);
- data << uint8(tabId);
- size_t rempos = data.wpos();
- data << uint32(0);
- data << uint8(sendAllSlots);
+ WorldPackets::Guild::GuildBankQueryResults packet;
+
+ packet.Money = m_bankMoney;
+ packet.Tab = int32(tabId);
+ packet.FullUpdate = sendAllSlots;
if (sendAllSlots && !tabId)
{
- data << uint8(_GetPurchasedTabsSize()); // Number of tabs
+ packet.TabInfo.reserve(_GetPurchasedTabsSize());
for (uint8 i = 0; i < _GetPurchasedTabsSize(); ++i)
- m_bankTabs[i]->WriteInfoPacket(data);
+ {
+ WorldPackets::Guild::GuildBankTabInfo tabInfo;
+ tabInfo.Name = m_bankTabs[i]->GetName();
+ tabInfo.Icon = m_bankTabs[i]->GetIcon();
+ packet.TabInfo.push_back(tabInfo);
+ }
}
- BankTab const* tab = GetBankTab(tabId);
- if (!tab)
- data << uint8(0);
- else if (sendAllSlots)
- tab->WritePacket(data);
- else if (slots && !slots->empty())
+ if (BankTab const* tab = GetBankTab(tabId))
{
- data << uint8(slots->size());
- for (auto itr = slots->begin(); itr != slots->end(); ++itr)
- tab->WriteSlotPacket(data, *itr, false);
+ auto fillItems = [&](auto begin, auto end, bool skipEmpty)
+ {
+ for (auto itr = begin; itr != end; ++itr)
+ {
+ if (Item* tabItem = tab->GetItem(*itr))
+ {
+ WorldPackets::Guild::GuildBankItemInfo itemInfo;
+
+ itemInfo.Slot = *itr;
+ itemInfo.ItemID = tabItem->GetEntry();
+ itemInfo.Count = int32(tabItem->GetCount());
+ itemInfo.Charges = int32(abs(tabItem->GetSpellCharges()));
+ itemInfo.EnchantmentID = int32(tabItem->GetEnchantmentId(PERM_ENCHANTMENT_SLOT));
+ itemInfo.Flags = tabItem->GetInt32Value(ITEM_FIELD_FLAGS);
+
+ for (uint32 socketSlot = 0; socketSlot < MAX_GEM_SOCKETS; ++socketSlot)
+ {
+ if (uint32 enchId = tabItem->GetEnchantmentId(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT + socketSlot)))
+ {
+ WorldPackets::Guild::GuildBankSocketEnchant gem;
+ gem.SocketIndex = socketSlot;
+ gem.SocketEnchantID = int32(enchId);
+ itemInfo.SocketEnchant.push_back(gem);
+ }
+ }
+
+ packet.ItemInfo.push_back(itemInfo);
+ }
+ else if (!skipEmpty)
+ {
+ WorldPackets::Guild::GuildBankItemInfo itemInfo;
+
+ itemInfo.Slot = *itr;
+ itemInfo.ItemID = 0;
+
+ packet.ItemInfo.push_back(itemInfo);
+ }
+ }
+
+ };
+
+ if (sendAllSlots)
+ fillItems(boost::make_counting_iterator(uint8(0)), boost::make_counting_iterator(uint8(GUILD_BANK_MAX_SLOTS)), true);
+ else if (slots && !slots->empty())
+ fillItems(slots->begin(), slots->end(), false);
}
- else
- data << uint8(0);
if (session)
{
- int32 numSlots = 0;
if (Member const* member = GetMember(session->GetPlayer()->GetGUID()))
- numSlots = _GetMemberRemainingSlots(member, tabId);
- data.put<uint32>(rempos, numSlots);
- session->SendPacket(&data);
+ packet.WithdrawalsRemaining = _GetMemberRemainingSlots(member, tabId);
+
+ session->SendPacket(packet.Write());
TC_LOG_DEBUG("guild", "SMSG_GUILD_BANK_LIST [%s]: TabId: %u, FullSlots: %u, slots: %d",
- session->GetPlayerInfo().c_str(), tabId, sendAllSlots, numSlots);
+ session->GetPlayerInfo().c_str(), tabId, sendAllSlots, packet.WithdrawalsRemaining);
}
else /// @todo - Probably this is just sent to session + those that have sent CMSG_GUILD_BANKER_ACTIVATE
{
+ packet.Write();
for (auto itr = m_members.begin(); itr != m_members.end(); ++itr)
{
if (!_MemberHasTabRights(itr->second->GetGUID(), tabId, GUILD_BANK_RIGHT_VIEW_TAB))
@@ -3022,11 +2997,10 @@ void Guild::_SendBankList(WorldSession* session /* = nullptr*/, uint8 tabId /*=
if (!player)
continue;
- uint32 numSlots = _GetMemberRemainingSlots(itr->second, tabId);
- data.put<uint32>(rempos, numSlots);
- player->SendDirectMessage(&data);
+ packet.SetWithdrawalsRemaining(_GetMemberRemainingSlots(itr->second, tabId));
+ player->SendDirectMessage(packet.GetRawPacket());
TC_LOG_DEBUG("guild", "SMSG_GUILD_BANK_LIST [%s]: TabId: %u, FullSlots: %u, slots: %u"
- , player->GetName().c_str(), tabId, sendAllSlots, numSlots);
+ , player->GetName().c_str(), tabId, sendAllSlots, packet.WithdrawalsRemaining);
}
}
}
diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h
index 2b98241da99..65a055d1a96 100644
--- a/src/server/game/Guilds/Guild.h
+++ b/src/server/game/Guilds/Guild.h
@@ -31,6 +31,16 @@ struct ItemPosCount;
enum InventoryResult : uint8;
enum LocaleConstant : uint8;
+namespace WorldPackets
+{
+ namespace Guild
+ {
+ class GuildBankLogQueryResults;
+ class GuildEventLogQueryResults;
+ class SaveGuildEmblem;
+ }
+}
+
enum GuildMisc
{
GUILD_BANK_MAX_TABS = 6, // send by client for money log also
@@ -220,8 +230,7 @@ class TC_GAME_API EmblemInfo
void LoadFromDB(Field* fields);
void SaveToDB(ObjectGuid::LowType guildId) const;
- void ReadPacket(WorldPacket& recv);
- void WritePacket(WorldPacket& data) const;
+ void ReadPacket(WorldPackets::Guild::SaveGuildEmblem& packet);
uint32 GetStyle() const { return m_style; }
uint32 GetColor() const { return m_color; }
@@ -293,7 +302,6 @@ class TC_GAME_API Guild
bool LoadFromDB(Field* fields);
void SaveToDB(SQLTransaction& trans) const;
- void WritePacket(WorldPacket& data, bool sendOfficerNote) const;
ObjectGuid GetGUID() const { return m_guid; }
std::string const& GetName() const { return m_name; }
@@ -355,7 +363,6 @@ class TC_GAME_API Guild
uint64 GetTimestamp() const { return m_timestamp; }
virtual void SaveToDB(SQLTransaction& trans) const = 0;
- virtual void WritePacket(WorldPacket& data) const = 0;
protected:
ObjectGuid::LowType m_guildId;
@@ -376,7 +383,7 @@ class TC_GAME_API Guild
~EventLogEntry() { }
void SaveToDB(SQLTransaction& trans) const override;
- void WritePacket(WorldPacket& data) const override;
+ void WritePacket(WorldPackets::Guild::GuildEventLogQueryResults& packet) const;
private:
GuildEventLogTypes m_eventType;
@@ -397,6 +404,11 @@ class TC_GAME_API Guild
eventType == GUILD_BANK_LOG_REPAIR_MONEY;
}
+ bool IsMoneyEvent() const
+ {
+ return IsMoneyEvent(m_eventType);
+ }
+
BankEventLogEntry(ObjectGuid::LowType guildId, uint32 guid, GuildBankEventLogTypes eventType, uint8 tabId, ObjectGuid::LowType playerGuid, uint32 itemOrMoney, uint16 itemStackCount, uint8 destTabId) :
LogEntry(guildId, guid), m_eventType(eventType), m_bankTabId(tabId), m_playerGuid(playerGuid),
m_itemOrMoney(itemOrMoney), m_itemStackCount(itemStackCount), m_destTabId(destTabId) { }
@@ -408,7 +420,7 @@ class TC_GAME_API Guild
~BankEventLogEntry() { }
void SaveToDB(SQLTransaction& trans) const override;
- void WritePacket(WorldPacket& data) const override;
+ void WritePacket(WorldPackets::Guild::GuildBankLogQueryResults& packet) const;
private:
GuildBankEventLogTypes m_eventType;
@@ -435,9 +447,8 @@ class TC_GAME_API Guild
void LoadEvent(LogEntry* entry);
// Adds new event to collection and saves it to DB
void AddEvent(SQLTransaction& trans, LogEntry* entry);
- // Writes information about all events to packet
- void WritePacket(WorldPacket& data) const;
uint32 GetNextGUID();
+ GuildLog* GetGuildLog() { return &m_log; }
private:
GuildLog m_log;
@@ -457,7 +468,6 @@ class TC_GAME_API Guild
void LoadFromDB(Field* fields);
void SaveToDB(SQLTransaction& trans) const;
- void WritePacket(WorldPacket& data) const;
uint8 GetId() const { return m_rankId; }
@@ -503,14 +513,14 @@ class TC_GAME_API Guild
bool LoadItemFromDB(Field* fields);
void Delete(SQLTransaction& trans, bool removeItemsFromDB = false);
- void WritePacket(WorldPacket& data) const;
- bool WriteSlotPacket(WorldPacket& data, uint8 slotId, bool ignoreEmpty = true) const;
- void WriteInfoPacket(WorldPacket& data) const;
-
void SetInfo(std::string const& name, std::string const& icon);
void SetText(std::string const& text);
void SendText(Guild const* guild, WorldSession* session) const;
+ std::string const& GetName() const { return m_name; }
+ std::string const& GetIcon() const { return m_icon; }
+ std::string const& GetText() const { return m_text; }
+
inline Item* GetItem(uint8 slotId) const { return slotId < GUILD_BANK_MAX_SLOTS ? m_items[slotId] : nullptr; }
bool SetItem(SQLTransaction& trans, uint8 slotId, Item* pItem);
@@ -668,7 +678,7 @@ class TC_GAME_API Guild
void SendEventLog(WorldSession* session) const;
void SendBankLog(WorldSession* session, uint8 tabId) const;
void SendBankTabsInfo(WorldSession* session, bool showTabs = false) const;
- void SendBankTabData(WorldSession* session, uint8 tabId) const;
+ void SendBankTabData(WorldSession* session, uint8 tabId, bool sendAllSlots) const;
void SendBankTabText(WorldSession* session, uint8 tabId) const;
void SendPermissions(WorldSession* session) const;
void SendMoneyInfo(WorldSession* session) const;
@@ -687,8 +697,8 @@ class TC_GAME_API Guild
// Broadcasts
void BroadcastToGuild(WorldSession* session, bool officerOnly, std::string const& msg, uint32 language = LANG_UNIVERSAL) const;
- void BroadcastPacketToRank(WorldPacket* packet, uint8 rankId) const;
- void BroadcastPacket(WorldPacket* packet) const;
+ void BroadcastPacketToRank(WorldPacket const* packet, uint8 rankId) const;
+ void BroadcastPacket(WorldPacket const* packet) const;
void MassInviteToEvent(WorldSession* session, uint32 minLevel, uint32 maxLevel, uint32 minRank);
@@ -807,7 +817,7 @@ class TC_GAME_API Guild
void _MoveItems(MoveItemData* pSrc, MoveItemData* pDest, uint32 splitedAmount);
bool _DoItemsMove(MoveItemData* pSrc, MoveItemData* pDest, bool sendError, uint32 splitedAmount = 0);
- void _SendBankContent(WorldSession* session, uint8 tabId) const;
+ void _SendBankContent(WorldSession* session, uint8 tabId, bool sendAllSlots) const;
void _SendBankMoneyUpdate(WorldSession* session) const;
void _SendBankContentUpdate(MoveItemData* pSrc, MoveItemData* pDest) const;
void _SendBankContentUpdate(uint8 tabId, SlotIds slots) const;
diff --git a/src/server/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp
index e0e44202c09..fb0968d8cd2 100644
--- a/src/server/game/Handlers/GuildHandler.cpp
+++ b/src/server/game/Handlers/GuildHandler.cpp
@@ -19,56 +19,45 @@
#include "Common.h"
#include "Guild.h"
#include "GuildMgr.h"
+#include "GuildPackets.h"
#include "Log.h"
#include "ObjectMgr.h"
#include "Player.h"
#include "WorldPacket.h"
-void WorldSession::HandleGuildQueryOpcode(WorldPacket& recvPacket)
+void WorldSession::HandleGuildQueryOpcode(WorldPackets::Guild::QueryGuildInfo& query)
{
- uint32 guildId;
- recvPacket >> guildId;
-
- TC_LOG_DEBUG("guild", "CMSG_GUILD_QUERY [%s]: Guild: %u", GetPlayerInfo().c_str(), guildId);
- if (!guildId)
+ TC_LOG_DEBUG("guild", "CMSG_GUILD_QUERY [%s]: Guild: %u", GetPlayerInfo().c_str(), query.GuildId);
+ if (!query.GuildId)
return;
- if (Guild* guild = sGuildMgr->GetGuildById(guildId))
+ if (Guild* guild = sGuildMgr->GetGuildById(query.GuildId))
guild->HandleQuery(this);
}
-void WorldSession::HandleGuildCreateOpcode(WorldPacket& recvPacket)
+void WorldSession::HandleGuildCreateOpcode(WorldPackets::Guild::GuildCreate& packet)
{
- std::string name;
- recvPacket >> name;
-
- TC_LOG_ERROR("entities.player.cheat", "CMSG_GUILD_CREATE: Possible hacking-attempt: %s tried to create a guild [Name: %s] using cheats", GetPlayerInfo().c_str(), name.c_str());
+ TC_LOG_ERROR("entities.player.cheat", "CMSG_GUILD_CREATE: Possible hacking-attempt: %s tried to create a guild [Name: %s] using cheats", GetPlayerInfo().c_str(), packet.GuildName.c_str());
}
-void WorldSession::HandleGuildInviteOpcode(WorldPacket& recvPacket)
+void WorldSession::HandleGuildInviteOpcode(WorldPackets::Guild::GuildInviteByName& packet)
{
- std::string invitedName;
- recvPacket >> invitedName;
-
- TC_LOG_DEBUG("guild", "CMSG_GUILD_INVITE [%s]: Invited: %s", GetPlayerInfo().c_str(), invitedName.c_str());
- if (normalizePlayerName(invitedName))
+ TC_LOG_DEBUG("guild", "CMSG_GUILD_INVITE [%s]: Invited: %s", GetPlayerInfo().c_str(), packet.Name.c_str());
+ if (normalizePlayerName(packet.Name))
if (Guild* guild = GetPlayer()->GetGuild())
- guild->HandleInviteMember(this, invitedName);
+ guild->HandleInviteMember(this, packet.Name);
}
-void WorldSession::HandleGuildRemoveOpcode(WorldPacket& recvPacket)
+void WorldSession::HandleGuildRemoveOpcode(WorldPackets::Guild::GuildOfficerRemoveMember& packet)
{
- std::string playerName;
- recvPacket >> playerName;
+ TC_LOG_DEBUG("guild", "CMSG_GUILD_REMOVE [%s]: Target: %s", GetPlayerInfo().c_str(), packet.Removee.c_str());
- TC_LOG_DEBUG("guild", "CMSG_GUILD_REMOVE [%s]: Target: %s", GetPlayerInfo().c_str(), playerName.c_str());
-
- if (normalizePlayerName(playerName))
+ if (normalizePlayerName(packet.Removee))
if (Guild* guild = GetPlayer()->GetGuild())
- guild->HandleRemoveMember(this, playerName);
+ guild->HandleRemoveMember(this, packet.Removee);
}
-void WorldSession::HandleGuildAcceptOpcode(WorldPacket& /*recvPacket*/)
+void WorldSession::HandleGuildAcceptOpcode(WorldPackets::Guild::AcceptGuildInvite& /*invite*/)
{
TC_LOG_DEBUG("guild", "CMSG_GUILD_ACCEPT [%s]", GetPlayer()->GetName().c_str());
@@ -77,7 +66,7 @@ void WorldSession::HandleGuildAcceptOpcode(WorldPacket& /*recvPacket*/)
guild->HandleAcceptMember(this);
}
-void WorldSession::HandleGuildDeclineOpcode(WorldPacket& /*recvPacket*/)
+void WorldSession::HandleGuildDeclineOpcode(WorldPackets::Guild::GuildDeclineInvitation& /*decline*/)
{
TC_LOG_DEBUG("guild", "CMSG_GUILD_DECLINE [%s]", GetPlayerInfo().c_str());
@@ -85,7 +74,7 @@ void WorldSession::HandleGuildDeclineOpcode(WorldPacket& /*recvPacket*/)
GetPlayer()->SetInGuild(0);
}
-void WorldSession::HandleGuildInfoOpcode(WorldPacket& /*recvPacket*/)
+void WorldSession::HandleGuildInfoOpcode(WorldPackets::Guild::GuildGetInfo& /*packet*/)
{
TC_LOG_DEBUG("guild", "CMSG_GUILD_INFO [%s]", GetPlayerInfo().c_str());
@@ -93,7 +82,7 @@ void WorldSession::HandleGuildInfoOpcode(WorldPacket& /*recvPacket*/)
guild->SendInfo(this);
}
-void WorldSession::HandleGuildRosterOpcode(WorldPacket& /*recvPacket*/)
+void WorldSession::HandleGuildRosterOpcode(WorldPackets::Guild::GuildGetRoster& /*packet*/)
{
TC_LOG_DEBUG("guild", "CMSG_GUILD_ROSTER [%s]", GetPlayerInfo().c_str());
@@ -103,31 +92,25 @@ void WorldSession::HandleGuildRosterOpcode(WorldPacket& /*recvPacket*/)
Guild::SendCommandResult(this, GUILD_COMMAND_ROSTER, ERR_GUILD_PLAYER_NOT_IN_GUILD);
}
-void WorldSession::HandleGuildPromoteOpcode(WorldPacket& recvPacket)
+void WorldSession::HandleGuildPromoteOpcode(WorldPackets::Guild::GuildPromoteMember& promote)
{
- std::string playerName;
- recvPacket >> playerName;
-
- TC_LOG_DEBUG("guild", "CMSG_GUILD_PROMOTE [%s]: Target: %s", GetPlayerInfo().c_str(), playerName.c_str());
+ TC_LOG_DEBUG("guild", "CMSG_GUILD_PROMOTE [%s]: Target: %s", GetPlayerInfo().c_str(), promote.Promotee.c_str());
- if (normalizePlayerName(playerName))
+ if (normalizePlayerName(promote.Promotee))
if (Guild* guild = GetPlayer()->GetGuild())
- guild->HandleUpdateMemberRank(this, playerName, false);
+ guild->HandleUpdateMemberRank(this, promote.Promotee, false);
}
-void WorldSession::HandleGuildDemoteOpcode(WorldPacket& recvPacket)
+void WorldSession::HandleGuildDemoteOpcode(WorldPackets::Guild::GuildDemoteMember& demote)
{
- std::string playerName;
- recvPacket >> playerName;
-
- TC_LOG_DEBUG("guild", "CMSG_GUILD_DEMOTE [%s]: Target: %s", GetPlayerInfo().c_str(), playerName.c_str());
+ TC_LOG_DEBUG("guild", "CMSG_GUILD_DEMOTE [%s]: Target: %s", GetPlayerInfo().c_str(), demote.Demotee.c_str());
- if (normalizePlayerName(playerName))
+ if (normalizePlayerName(demote.Demotee))
if (Guild* guild = GetPlayer()->GetGuild())
- guild->HandleUpdateMemberRank(this, playerName, true);
+ guild->HandleUpdateMemberRank(this, demote.Demotee, true);
}
-void WorldSession::HandleGuildLeaveOpcode(WorldPacket& /*recvPacket*/)
+void WorldSession::HandleGuildLeaveOpcode(WorldPackets::Guild::GuildLeave& /*leave*/)
{
TC_LOG_DEBUG("guild", "CMSG_GUILD_LEAVE [%s]", GetPlayerInfo().c_str());
@@ -135,7 +118,7 @@ void WorldSession::HandleGuildLeaveOpcode(WorldPacket& /*recvPacket*/)
guild->HandleLeaveMember(this);
}
-void WorldSession::HandleGuildDisbandOpcode(WorldPacket& /*recvPacket*/)
+void WorldSession::HandleGuildDisbandOpcode(WorldPackets::Guild::GuildDelete& /*packet*/)
{
TC_LOG_DEBUG("guild", "CMSG_GUILD_DISBAND [%s]", GetPlayerInfo().c_str());
@@ -143,138 +126,67 @@ void WorldSession::HandleGuildDisbandOpcode(WorldPacket& /*recvPacket*/)
guild->HandleDisband(this);
}
-void WorldSession::HandleGuildLeaderOpcode(WorldPacket& recvPacket)
+void WorldSession::HandleGuildLeaderOpcode(WorldPackets::Guild::GuildSetGuildMaster& packet)
{
- std::string name;
- recvPacket >> name;
+ TC_LOG_DEBUG("guild", "CMSG_GUILD_LEADER [%s]: Target: %s", GetPlayerInfo().c_str(), packet.NewMasterName.c_str());
- TC_LOG_DEBUG("guild", "CMSG_GUILD_LEADER [%s]: Target: %s", GetPlayerInfo().c_str(), name.c_str());
-
- if (normalizePlayerName(name))
+ if (normalizePlayerName(packet.NewMasterName))
if (Guild* guild = GetPlayer()->GetGuild())
- guild->HandleSetLeader(this, name);
+ guild->HandleSetLeader(this, packet.NewMasterName);
}
-void WorldSession::HandleGuildMOTDOpcode(WorldPacket& recvPacket)
+void WorldSession::HandleGuildMOTDOpcode(WorldPackets::Guild::GuildUpdateMotdText& packet)
{
- std::string motd;
- recvPacket >> motd;
-
- TC_LOG_DEBUG("guild", "CMSG_GUILD_MOTD [%s]: MOTD: %s", GetPlayerInfo().c_str(), motd.c_str());
-
- if (!DisallowHyperlinksAndMaybeKick(motd))
- return;
-
- if (motd.size() > 128)
- return;
+ TC_LOG_DEBUG("guild", "CMSG_GUILD_MOTD [%s]: MOTD: %s", GetPlayerInfo().c_str(), packet.MotdText.c_str());
if (Guild* guild = GetPlayer()->GetGuild())
- guild->HandleSetMOTD(this, motd);
+ guild->HandleSetMOTD(this, packet.MotdText);
}
-void WorldSession::HandleGuildSetPublicNoteOpcode(WorldPacket& recvPacket)
+void WorldSession::HandleGuildSetPublicNoteOpcode(WorldPackets::Guild::GuildSetMemberNote& packet)
{
- std::string playerName;
- std::string note;
- recvPacket >> playerName >> note;
-
TC_LOG_DEBUG("guild", "CMSG_GUILD_SET_PUBLIC_NOTE [%s]: Target: %s, Note: %s",
- GetPlayerInfo().c_str(), playerName.c_str(), note.c_str());
-
- if (!DisallowHyperlinksAndMaybeKick(note))
- return;
+ GetPlayerInfo().c_str(), packet.NoteeName.c_str(), packet.Note.c_str());
- if (note.size() > 31)
- return;
-
- if (normalizePlayerName(playerName))
+ if (normalizePlayerName(packet.NoteeName))
if (Guild* guild = GetPlayer()->GetGuild())
- guild->HandleSetMemberNote(this, playerName, note, false);
+ guild->HandleSetMemberNote(this, packet.NoteeName, packet.Note, false);
}
-void WorldSession::HandleGuildSetOfficerNoteOpcode(WorldPacket& recvPacket)
+void WorldSession::HandleGuildSetOfficerNoteOpcode(WorldPackets::Guild::GuildSetMemberNote& packet)
{
- std::string playerName;
- std::string note;
- recvPacket >> playerName >> note;
-
TC_LOG_DEBUG("guild", "CMSG_GUILD_SET_OFFICER_NOTE [%s]: Target: %s, Note: %s",
- GetPlayerInfo().c_str(), playerName.c_str(), note.c_str());
+ GetPlayerInfo().c_str(), packet.NoteeName.c_str(), packet.Note.c_str());
- if (!DisallowHyperlinksAndMaybeKick(note))
- return;
-
- if (note.size() > 31)
- return;
-
- if (normalizePlayerName(playerName))
+ if (normalizePlayerName(packet.NoteeName))
if (Guild* guild = GetPlayer()->GetGuild())
- guild->HandleSetMemberNote(this, playerName, note, true);
+ guild->HandleSetMemberNote(this, packet.NoteeName, packet.Note, true);
}
-void WorldSession::HandleGuildRankOpcode(WorldPacket& recvPacket)
+void WorldSession::HandleGuildRankOpcode(WorldPackets::Guild::GuildSetRankPermissions& packet)
{
- uint32 rankId;
- recvPacket >> rankId;
-
- uint32 rights;
- recvPacket >> rights;
-
- std::string rankName;
- recvPacket >> rankName;
-
- uint32 money;
- recvPacket >> money;
-
- TC_LOG_DEBUG("guild", "CMSG_GUILD_RANK [%s]: Rank: %s (%u)", GetPlayerInfo().c_str(), rankName.c_str(), rankId);
-
- if (!DisallowHyperlinksAndMaybeKick(rankName))
- return;
-
- if (rankName.size() > 15)
- return;
-
Guild* guild = GetPlayer()->GetGuild();
if (!guild)
- {
- recvPacket.rpos(recvPacket.wpos());
return;
- }
GuildBankRightsAndSlotsVec rightsAndSlots(GUILD_BANK_MAX_TABS);
-
for (uint8 tabId = 0; tabId < GUILD_BANK_MAX_TABS; ++tabId)
- {
- uint32 bankRights;
- uint32 slots;
+ rightsAndSlots[tabId] = GuildBankRightsAndSlots(tabId, uint8(packet.TabFlags[tabId]), uint8(packet.TabWithdrawItemLimit[tabId]));
- recvPacket >> bankRights;
- recvPacket >> slots;
+ TC_LOG_DEBUG("guild", "CMSG_GUILD_RANK [%s]: Rank: %s (%u)", GetPlayerInfo().c_str(), packet.RankName.c_str(), packet.RankID);
- rightsAndSlots[tabId] = GuildBankRightsAndSlots(tabId, bankRights, slots);
- }
-
- guild->HandleSetRankInfo(this, rankId, rankName, rights, money, rightsAndSlots);
+ guild->HandleSetRankInfo(this, packet.RankID, packet.RankName, packet.Flags, packet.WithdrawGoldLimit, rightsAndSlots);
}
-void WorldSession::HandleGuildAddRankOpcode(WorldPacket& recvPacket)
+void WorldSession::HandleGuildAddRankOpcode(WorldPackets::Guild::GuildAddRank& packet)
{
- std::string rankName;
- recvPacket >> rankName;
-
- TC_LOG_DEBUG("guild", "CMSG_GUILD_ADD_RANK [%s]: Rank: %s", GetPlayerInfo().c_str(), rankName.c_str());
-
- if (!DisallowHyperlinksAndMaybeKick(rankName))
- return;
-
- if (rankName.size() > 15)
- return;
+ TC_LOG_DEBUG("guild", "CMSG_GUILD_ADD_RANK [%s]: Rank: %s", GetPlayerInfo().c_str(), packet.Name.c_str());
if (Guild* guild = GetPlayer()->GetGuild())
- guild->HandleAddNewRank(this, rankName);
+ guild->HandleAddNewRank(this, packet.Name);
}
-void WorldSession::HandleGuildDelRankOpcode(WorldPacket& /*recvPacket*/)
+void WorldSession::HandleGuildDelRankOpcode(WorldPackets::Guild::GuildDeleteRank& /*packet*/)
{
TC_LOG_DEBUG("guild", "CMSG_GUILD_DEL_RANK [%s]", GetPlayerInfo().c_str());
@@ -282,37 +194,25 @@ void WorldSession::HandleGuildDelRankOpcode(WorldPacket& /*recvPacket*/)
guild->HandleRemoveLowestRank(this);
}
-void WorldSession::HandleGuildChangeInfoTextOpcode(WorldPacket& recvPacket)
+void WorldSession::HandleGuildChangeInfoTextOpcode(WorldPackets::Guild::GuildUpdateInfoText& packet)
{
- std::string info;
- recvPacket >> info;
-
- TC_LOG_DEBUG("guild", "CMSG_GUILD_INFO_TEXT [%s]: %s", GetPlayerInfo().c_str(), info.c_str());
-
- if (!DisallowHyperlinksAndMaybeKick(info))
- return;
-
- if (info.size() > 500)
- return;
+ TC_LOG_DEBUG("guild", "CMSG_GUILD_INFO_TEXT [%s]: %s", GetPlayerInfo().c_str(), packet.InfoText.c_str());
if (Guild* guild = GetPlayer()->GetGuild())
- guild->HandleSetInfo(this, info);
+ guild->HandleSetInfo(this, packet.InfoText);
}
-void WorldSession::HandleSaveGuildEmblemOpcode(WorldPacket& recvPacket)
+void WorldSession::HandleSaveGuildEmblemOpcode(WorldPackets::Guild::SaveGuildEmblem& packet)
{
- ObjectGuid vendorGuid;
- recvPacket >> vendorGuid;
-
EmblemInfo emblemInfo;
- emblemInfo.ReadPacket(recvPacket);
+ emblemInfo.ReadPacket(packet);
TC_LOG_DEBUG("guild", "MSG_SAVE_GUILD_EMBLEM [%s]: Guid: [%s] Style: %d, Color: %d, BorderStyle: %d, BorderColor: %d, BackgroundColor: %d"
- , GetPlayerInfo().c_str(), vendorGuid.ToString().c_str(), emblemInfo.GetStyle()
+ , GetPlayerInfo().c_str(), packet.Vendor.ToString().c_str(), emblemInfo.GetStyle()
, emblemInfo.GetColor(), emblemInfo.GetBorderStyle()
, emblemInfo.GetBorderColor(), emblemInfo.GetBackgroundColor());
- if (GetPlayer()->GetNPCIfCanInteractWith(vendorGuid, UNIT_NPC_FLAG_TABARDDESIGNER))
+ if (GetPlayer()->GetNPCIfCanInteractWith(packet.Vendor, UNIT_NPC_FLAG_TABARDDESIGNER))
{
// Remove fake death
if (GetPlayer()->HasUnitState(UNIT_STATE_DIED))
@@ -327,7 +227,7 @@ void WorldSession::HandleSaveGuildEmblemOpcode(WorldPacket& recvPacket)
Guild::SendSaveEmblemResult(this, ERR_GUILDEMBLEM_INVALIDVENDOR); // "That's not an emblem vendor!"
}
-void WorldSession::HandleGuildEventLogQueryOpcode(WorldPacket& /* recvPacket */)
+void WorldSession::HandleGuildEventLogQueryOpcode(WorldPackets::Guild::GuildEventLogQuery& /*packet*/)
{
TC_LOG_DEBUG("guild", "MSG_GUILD_EVENT_LOG_QUERY [%s]", GetPlayerInfo().c_str());
@@ -335,31 +235,27 @@ void WorldSession::HandleGuildEventLogQueryOpcode(WorldPacket& /* recvPacket */)
guild->SendEventLog(this);
}
-void WorldSession::HandleGuildBankMoneyWithdrawn(WorldPacket & /* recvData */)
+void WorldSession::HandleGuildBankMoneyWithdrawn(WorldPackets::Guild::GuildBankRemainingWithdrawMoneyQuery& /*packet*/)
{
- TC_LOG_DEBUG("guild", "MSG_GUILD_BANK_MONEY_WITHDRAWN [%s]", GetPlayerInfo().c_str());
-
if (Guild* guild = GetPlayer()->GetGuild())
guild->SendMoneyInfo(this);
}
-void WorldSession::HandleGuildPermissions(WorldPacket& /* recvData */)
+void WorldSession::HandleGuildPermissions(WorldPackets::Guild::GuildPermissionsQuery& /* packet */)
{
- TC_LOG_DEBUG("guild", "MSG_GUILD_PERMISSIONS [%s]", GetPlayerInfo().c_str());
-
if (Guild* guild = GetPlayer()->GetGuild())
guild->SendPermissions(this);
}
// Called when clicking on Guild bank gameobject
-void WorldSession::HandleGuildBankerActivate(WorldPacket& recvData)
+void WorldSession::HandleGuildBankerActivate(WorldPackets::Guild::GuildBankActivate& packet)
{
- ObjectGuid guid;
- bool sendAllSlots;
- recvData >> guid >> sendAllSlots;
-
TC_LOG_DEBUG("guild", "CMSG_GUILD_BANKER_ACTIVATE [%s]: [%s] AllSlots: %u"
- , GetPlayerInfo().c_str(), guid.ToString().c_str(), sendAllSlots);
+ , GetPlayerInfo().c_str(), packet.Banker.ToString().c_str(), packet.FullUpdate);
+
+ GameObject const* const go = GetPlayer()->GetGameObjectIfCanInteractWith(packet.Banker, GAMEOBJECT_TYPE_GUILD_BANK);
+ if (!go)
+ return;
Guild* const guild = GetPlayer()->GetGuild();
if (!guild)
@@ -368,125 +264,65 @@ void WorldSession::HandleGuildBankerActivate(WorldPacket& recvData)
return;
}
- guild->SendBankTabsInfo(this, sendAllSlots);
+ guild->SendBankTabsInfo(this, packet.FullUpdate);
}
// Called when opening guild bank tab only (first one)
-void WorldSession::HandleGuildBankQueryTab(WorldPacket& recvData)
+void WorldSession::HandleGuildBankQueryTab(WorldPackets::Guild::GuildBankQueryTab& packet)
{
- ObjectGuid guid;
- uint8 tabId;
- bool full;
-
- recvData >> guid >> tabId >> full;
-
TC_LOG_DEBUG("guild", "CMSG_GUILD_BANK_QUERY_TAB [%s]: %s, TabId: %u, ShowTabs: %u"
- , GetPlayerInfo().c_str(), guid.ToString().c_str(), tabId, full);
+ , GetPlayerInfo().c_str(), packet.Banker.ToString().c_str(), packet.Tab, packet.FullUpdate);
- if (GetPlayer()->GetGameObjectIfCanInteractWith(guid, GAMEOBJECT_TYPE_GUILD_BANK))
+ if (GetPlayer()->GetGameObjectIfCanInteractWith(packet.Banker, GAMEOBJECT_TYPE_GUILD_BANK))
if (Guild* guild = GetPlayer()->GetGuild())
- guild->SendBankTabData(this, tabId);
+ guild->SendBankTabData(this, packet.Tab, packet.FullUpdate);
}
-void WorldSession::HandleGuildBankDepositMoney(WorldPacket& recvData)
+void WorldSession::HandleGuildBankDepositMoney(WorldPackets::Guild::GuildBankDepositMoney& packet)
{
- ObjectGuid guid;
- uint32 money;
- recvData >> guid >> money;
-
TC_LOG_DEBUG("guild", "CMSG_GUILD_BANK_DEPOSIT_MONEY [%s]: [%s], money: %u",
- GetPlayerInfo().c_str(), guid.ToString().c_str(), money);
+ GetPlayerInfo().c_str(), packet.Banker.ToString().c_str(), packet.Money);
- if (GetPlayer()->GetGameObjectIfCanInteractWith(guid, GAMEOBJECT_TYPE_GUILD_BANK))
- if (money && GetPlayer()->HasEnoughMoney(money))
+ if (GetPlayer()->GetGameObjectIfCanInteractWith(packet.Banker, GAMEOBJECT_TYPE_GUILD_BANK))
+ if (packet.Money && GetPlayer()->HasEnoughMoney(packet.Money))
if (Guild* guild = GetPlayer()->GetGuild())
- guild->HandleMemberDepositMoney(this, money);
+ guild->HandleMemberDepositMoney(this, packet.Money);
}
-void WorldSession::HandleGuildBankWithdrawMoney(WorldPacket& recvData)
+void WorldSession::HandleGuildBankWithdrawMoney(WorldPackets::Guild::GuildBankWithdrawMoney& packet)
{
- ObjectGuid guid;
- uint32 money;
- recvData >> guid >> money;
-
TC_LOG_DEBUG("guild", "CMSG_GUILD_BANK_WITHDRAW_MONEY [%s]: [%s], money: %u",
- GetPlayerInfo().c_str(), guid.ToString().c_str(), money);
+ GetPlayerInfo().c_str(), packet.Banker.ToString().c_str(), packet.Money);
- if (money && GetPlayer()->GetGameObjectIfCanInteractWith(guid, GAMEOBJECT_TYPE_GUILD_BANK))
+ if (packet.Money && GetPlayer()->GetGameObjectIfCanInteractWith(packet.Banker, GAMEOBJECT_TYPE_GUILD_BANK))
if (Guild* guild = GetPlayer()->GetGuild())
- guild->HandleMemberWithdrawMoney(this, money);
+ guild->HandleMemberWithdrawMoney(this, packet.Money);
}
-void WorldSession::HandleGuildBankSwapItems(WorldPacket& recvData)
+void WorldSession::HandleGuildBankSwapItems(WorldPackets::Guild::GuildBankSwapItems& packet)
{
- TC_LOG_DEBUG("guild", "CMSG_GUILD_BANK_SWAP_ITEMS [%s]", GetPlayerInfo().c_str());
-
- ObjectGuid GoGuid;
- recvData >> GoGuid;
-
- if (!GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid, GAMEOBJECT_TYPE_GUILD_BANK))
- {
- recvData.rfinish(); // Prevent additional spam at rejected packet
+ if (!GetPlayer()->GetGameObjectIfCanInteractWith(packet.Banker, GAMEOBJECT_TYPE_GUILD_BANK))
return;
- }
Guild* guild = GetPlayer()->GetGuild();
if (!guild)
- {
- recvData.rfinish(); // Prevent additional spam at rejected packet
return;
- }
-
- uint8 bankToBank;
- recvData >> bankToBank;
-
- uint8 tabId;
- uint8 slotId;
- uint32 itemEntry;
- uint32 splitedAmount = 0;
-
- if (bankToBank)
- {
- uint8 destTabId;
- recvData >> destTabId;
-
- uint8 destSlotId;
- recvData >> destSlotId;
- recvData.read_skip<uint32>(); // Always 0
-
- recvData >> tabId;
- recvData >> slotId;
- recvData >> itemEntry;
- recvData.read_skip<uint8>(); // Always 0
- recvData >> splitedAmount;
-
- guild->SwapItems(GetPlayer(), tabId, slotId, destTabId, destSlotId, splitedAmount);
- }
+ if (packet.BankOnly)
+ guild->SwapItems(GetPlayer(), packet.BankTab1, packet.BankSlot1, packet.BankTab, packet.BankSlot, packet.BankItemCount);
else
{
uint8 playerBag = NULL_BAG;
uint8 playerSlotId = NULL_SLOT;
uint8 toChar = 1;
+ uint32 splitedAmount = 0;
- recvData >> tabId;
- recvData >> slotId;
- recvData >> itemEntry;
-
- uint8 autoStore;
- recvData >> autoStore;
- if (autoStore)
- {
- recvData.read_skip<uint32>(); // autoStoreCount
- recvData.read_skip<uint8>(); // ToChar (?), always and expected to be 1 (autostore only triggered in Bank -> Char)
- recvData.read_skip<uint32>(); // Always 0
- }
- else
+ if (!packet.AutoStore)
{
- recvData >> playerBag;
- recvData >> playerSlotId;
- recvData >> toChar;
- recvData >> splitedAmount;
+ playerBag = packet.ContainerSlot;
+ playerSlotId = packet.ContainerItemSlot;
+ toChar = packet.ToSlot;
+ splitedAmount = packet.StackCount;
}
// Player <-> Bank
@@ -494,84 +330,50 @@ void WorldSession::HandleGuildBankSwapItems(WorldPacket& recvData)
if (!Player::IsInventoryPos(playerBag, playerSlotId) && !(playerBag == NULL_BAG && playerSlotId == NULL_SLOT))
GetPlayer()->SendEquipError(EQUIP_ERR_NONE, nullptr);
else
- guild->SwapItemsWithInventory(GetPlayer(), toChar != 0, tabId, slotId, playerBag, playerSlotId, splitedAmount);
+ guild->SwapItemsWithInventory(GetPlayer(), toChar != 0, packet.BankTab, packet.BankSlot, playerBag, playerSlotId, splitedAmount);
}
}
-void WorldSession::HandleGuildBankBuyTab(WorldPacket& recvData)
+void WorldSession::HandleGuildBankBuyTab(WorldPackets::Guild::GuildBankBuyTab& packet)
{
- ObjectGuid guid;
- uint8 tabId;
+ TC_LOG_DEBUG("guild", "CMSG_GUILD_BANK_BUY_TAB [%s]: [%s[, TabId: %u", GetPlayerInfo().c_str(), packet.Banker .ToString().c_str(), packet.BankTab);
- recvData >> guid >> tabId;
-
- TC_LOG_DEBUG("guild", "CMSG_GUILD_BANK_BUY_TAB [%s]: [%s[, TabId: %u", GetPlayerInfo().c_str(), guid.ToString().c_str(), tabId);
-
-
- if (GetPlayer()->GetGameObjectIfCanInteractWith(guid, GAMEOBJECT_TYPE_GUILD_BANK))
+ if (GetPlayer()->GetGameObjectIfCanInteractWith(packet.Banker, GAMEOBJECT_TYPE_GUILD_BANK))
if (Guild* guild = GetPlayer()->GetGuild())
- guild->HandleBuyBankTab(this, tabId);
+ guild->HandleBuyBankTab(this, packet.BankTab);
}
-void WorldSession::HandleGuildBankUpdateTab(WorldPacket& recvData)
+void WorldSession::HandleGuildBankUpdateTab(WorldPackets::Guild::GuildBankUpdateTab& packet)
{
- ObjectGuid guid;
- uint8 tabId;
- std::string name, icon;
-
- recvData >> guid >> tabId >> name >> icon;
-
- if (!DisallowHyperlinksAndMaybeKick(name))
- return;
-
- if ((name.size() > 16) || (icon.size() > 128))
- return;
-
TC_LOG_DEBUG("guild", "CMSG_GUILD_BANK_UPDATE_TAB [%s]: [%s], TabId: %u, Name: %s, Icon: %s"
- , GetPlayerInfo().c_str(), guid.ToString().c_str(), tabId, name.c_str(), icon.c_str());
+ , GetPlayerInfo().c_str(), packet.Banker.ToString().c_str(), packet.BankTab, packet.Name.c_str(), packet.Icon.c_str());
- if (!name.empty() && !icon.empty())
- if (GetPlayer()->GetGameObjectIfCanInteractWith(guid, GAMEOBJECT_TYPE_GUILD_BANK))
+ if (!packet.Name.empty() && !packet.Icon.empty())
+ if (GetPlayer()->GetGameObjectIfCanInteractWith(packet.Banker, GAMEOBJECT_TYPE_GUILD_BANK))
if (Guild* guild = GetPlayer()->GetGuild())
- guild->HandleSetBankTabInfo(this, tabId, name, icon);
+ guild->HandleSetBankTabInfo(this, packet.BankTab, packet.Name, packet.Icon);
}
-void WorldSession::HandleGuildBankLogQuery(WorldPacket& recvData)
+void WorldSession::HandleGuildBankLogQuery(WorldPackets::Guild::GuildBankLogQuery& packet)
{
- uint8 tabId;
- recvData >> tabId;
-
- TC_LOG_DEBUG("guild", "MSG_GUILD_BANK_LOG_QUERY [%s]: TabId: %u", GetPlayerInfo().c_str(), tabId);
+ TC_LOG_DEBUG("guild", "MSG_GUILD_BANK_LOG_QUERY [%s]: TabId: %u", GetPlayerInfo().c_str(), packet.Tab);
if (Guild* guild = GetPlayer()->GetGuild())
- guild->SendBankLog(this, tabId);
+ guild->SendBankLog(this, packet.Tab);
}
-void WorldSession::HandleQueryGuildBankTabText(WorldPacket &recvData)
+void WorldSession::HandleQueryGuildBankTabText(WorldPackets::Guild::GuildBankTextQuery& packet)
{
- uint8 tabId;
- recvData >> tabId;
-
- TC_LOG_DEBUG("guild", "MSG_QUERY_GUILD_BANK_TEXT [%s]: TabId: %u", GetPlayerInfo().c_str(), tabId);
+ TC_LOG_DEBUG("guild", "MSG_QUERY_GUILD_BANK_TEXT [%s]: TabId: %u", GetPlayerInfo().c_str(), packet.Tab);
if (Guild* guild = GetPlayer()->GetGuild())
- guild->SendBankTabText(this, tabId);
+ guild->SendBankTabText(this, packet.Tab);
}
-void WorldSession::HandleSetGuildBankTabText(WorldPacket &recvData)
+void WorldSession::HandleSetGuildBankTabText(WorldPackets::Guild::GuildBankSetTabText& packet)
{
- uint8 tabId;
- std::string text;
- recvData >> tabId >> text;
-
- if (!DisallowHyperlinksAndMaybeKick(text))
- return;
-
- if (text.size() > 500)
- return;
-
- TC_LOG_DEBUG("guild", "CMSG_SET_GUILD_BANK_TEXT [%s]: TabId: %u, Text: %s", GetPlayerInfo().c_str(), tabId, text.c_str());
+ TC_LOG_DEBUG("guild", "CMSG_SET_GUILD_BANK_TEXT [%s]: TabId: %u, Text: %s", GetPlayerInfo().c_str(), packet.Tab, packet.TabText.c_str());
if (Guild* guild = GetPlayer()->GetGuild())
- guild->SetBankTabText(tabId, text);
+ guild->SetBankTabText(packet.Tab, packet.TabText);
}
diff --git a/src/server/game/Server/Packets/AllPackets.h b/src/server/game/Server/Packets/AllPackets.h
index e377bb07215..93badb96545 100644
--- a/src/server/game/Server/Packets/AllPackets.h
+++ b/src/server/game/Server/Packets/AllPackets.h
@@ -20,6 +20,7 @@
#include "ChatPackets.h"
#include "CombatPackets.h"
+#include "GuildPackets.h"
#include "NPCPackets.h"
#include "MiscPackets.h"
#include "QueryPackets.h"
diff --git a/src/server/game/Server/Packets/GuildPackets.cpp b/src/server/game/Server/Packets/GuildPackets.cpp
new file mode 100644
index 00000000000..bea7a2966e1
--- /dev/null
+++ b/src/server/game/Server/Packets/GuildPackets.cpp
@@ -0,0 +1,459 @@
+/*
+ * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "GuildPackets.h"
+
+void WorldPackets::Guild::QueryGuildInfo::Read()
+{
+ _worldPacket >> GuildId;
+}
+
+WorldPackets::Guild::QueryGuildInfoResponse::QueryGuildInfoResponse()
+ : ServerPacket(SMSG_GUILD_QUERY_RESPONSE) { }
+
+WorldPacket const* WorldPackets::Guild::QueryGuildInfoResponse::Write()
+{
+ _worldPacket << GuildId;
+ _worldPacket << Info.GuildName;
+ for (std::string const& rankName : Info.Ranks)
+ _worldPacket << rankName;
+
+ _worldPacket << uint32(Info.EmblemStyle);
+ _worldPacket << uint32(Info.EmblemColor);
+ _worldPacket << uint32(Info.BorderStyle);
+ _worldPacket << uint32(Info.BorderColor);
+ _worldPacket << uint32(Info.BackgroundColor);
+ _worldPacket << uint32(Info.RankCount);
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Guild::GuildCreate::Read()
+{
+ _worldPacket >> GuildName;
+}
+
+WorldPacket const* WorldPackets::Guild::GuildInfoResponse::Write()
+{
+ _worldPacket << GuildName;
+ _worldPacket.AppendPackedTime(CreateDate);
+ _worldPacket << int32(NumMembers);
+ _worldPacket << int32(NumAccounts);
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Guild::GuildRoster::Write()
+{
+ _worldPacket << uint32(MemberData.size());
+ _worldPacket << WelcomeText;
+ _worldPacket << InfoText;
+ _worldPacket << uint32(RankData.size());
+
+ for (GuildRankData const& rank : RankData)
+ _worldPacket << rank;
+
+ for (GuildRosterMemberData const& member : MemberData)
+ _worldPacket << member;
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Guild::GuildUpdateMotdText::Read()
+{
+ _worldPacket >> MotdText;
+}
+
+WorldPacket const* WorldPackets::Guild::GuildCommandResult::Write()
+{
+ _worldPacket << int32(Command);
+ _worldPacket << Name;
+ _worldPacket << int32(Result);
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Guild::GuildInviteByName::Read()
+{
+ _worldPacket >> Name;
+}
+
+WorldPacket const* WorldPackets::Guild::GuildInvite::Write()
+{
+ _worldPacket << InviterName;
+ _worldPacket << GuildName;
+
+ return &_worldPacket;
+}
+
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Guild::GuildRosterMemberData const& rosterMemberData)
+{
+ data << rosterMemberData.Guid;
+ data << uint8(rosterMemberData.Status);
+ data << rosterMemberData.Name;
+ data << int32(rosterMemberData.RankID);
+ data << uint8(rosterMemberData.Level);
+ data << uint8(rosterMemberData.ClassID);
+ data << uint8(rosterMemberData.Gender);
+ data << int32(rosterMemberData.AreaID);
+ if (!rosterMemberData.Status)
+ data << float(rosterMemberData.LastSave);
+
+ data << rosterMemberData.Note;
+ data << rosterMemberData.OfficerNote;
+
+ return data;
+}
+
+WorldPacket const* WorldPackets::Guild::GuildEvent::Write()
+{
+ _worldPacket << uint8(Type);
+ uint8 paramCount = Params[2] ? 3 : (Params[1] ? 2 : (Params[0] ? 1 : 0));
+ _worldPacket << uint8(paramCount);
+ for (uint8 i = 0; i < paramCount; ++i)
+ _worldPacket << Params[i];
+
+ switch (Type)
+ {
+ case GE_JOINED:
+ case GE_LEFT:
+ case GE_SIGNED_ON:
+ case GE_SIGNED_OFF:
+ _worldPacket << Guid;
+ break;
+ default:
+ break;
+ }
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Guild::GuildEventLogQueryResults::Write()
+{
+ _worldPacket.reserve(4 + Entry.size() * 38);
+
+ _worldPacket << uint32(Entry.size());
+
+ for (GuildEventEntry const& entry : Entry)
+ {
+ _worldPacket << uint8(entry.TransactionType);
+ _worldPacket << entry.PlayerGUID;
+ if (entry.TransactionType != GUILD_EVENT_LOG_JOIN_GUILD && entry.TransactionType != GUILD_EVENT_LOG_LEAVE_GUILD)
+ _worldPacket << entry.OtherGUID;
+ if (entry.TransactionType == GUILD_EVENT_LOG_PROMOTE_PLAYER || entry.TransactionType == GUILD_EVENT_LOG_DEMOTE_PLAYER)
+ _worldPacket << uint8(entry.RankID);
+ _worldPacket << uint32(entry.TransactionDate);
+ }
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Guild::GuildPermissionsQueryResults::Write()
+{
+ _worldPacket << uint32(RankID);
+ _worldPacket << int32(Flags);
+ _worldPacket << int32(WithdrawGoldLimit);
+ _worldPacket << int8(NumTabs);
+
+ for (GuildRankTabPermissions const& tab : Tab)
+ {
+ _worldPacket << int32(tab.Flags);
+ _worldPacket << int32(tab.WithdrawItemLimit);
+ }
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Guild::GuildSetRankPermissions::Read()
+{
+ _worldPacket >> RankID;
+ _worldPacket >> Flags;
+ _worldPacket >> RankName;
+ _worldPacket >> WithdrawGoldLimit;
+
+ for (uint8 i = 0; i < GUILD_BANK_MAX_TABS; i++)
+ {
+ _worldPacket >> TabFlags[i];
+ _worldPacket >> TabWithdrawItemLimit[i];
+ }
+}
+
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Guild::GuildRankData const& rankData)
+{
+ data << uint32(rankData.Flags);
+ data << uint32(rankData.WithdrawGoldLimit);
+
+ for (uint8 i = 0; i < GUILD_BANK_MAX_TABS; i++)
+ {
+ data << uint32(rankData.TabFlags[i]);
+ data << uint32(rankData.TabWithdrawItemLimit[i]);
+ }
+
+ return data;
+}
+
+void WorldPackets::Guild::GuildAddRank::Read()
+{
+ _worldPacket >> Name;
+}
+
+void WorldPackets::Guild::GuildUpdateInfoText::Read()
+{
+ _worldPacket >> InfoText;
+}
+
+void WorldPackets::Guild::GuildSetMemberNote::Read()
+{
+ _worldPacket >> NoteeName;
+ _worldPacket >> Note;
+}
+
+void WorldPackets::Guild::GuildDemoteMember::Read()
+{
+ _worldPacket >> Demotee;
+}
+
+void WorldPackets::Guild::GuildPromoteMember::Read()
+{
+ _worldPacket >> Promotee;
+}
+
+void WorldPackets::Guild::GuildOfficerRemoveMember::Read()
+{
+ _worldPacket >> Removee;
+}
+
+void WorldPackets::Guild::GuildBankActivate::Read()
+{
+ _worldPacket >> Banker;
+ _worldPacket >> FullUpdate;
+}
+
+void WorldPackets::Guild::GuildBankBuyTab::Read()
+{
+ _worldPacket >> Banker;
+ _worldPacket >> BankTab;
+}
+
+void WorldPackets::Guild::GuildBankUpdateTab::Read()
+{
+ _worldPacket >> Banker;
+ _worldPacket >> BankTab;
+ _worldPacket >> Name;
+ _worldPacket >> Icon;
+}
+
+void WorldPackets::Guild::GuildBankDepositMoney::Read()
+{
+ _worldPacket >> Banker;
+ _worldPacket >> Money;
+}
+
+void WorldPackets::Guild::GuildBankQueryTab::Read()
+{
+ _worldPacket >> Banker;
+ _worldPacket >> Tab;
+ _worldPacket >> FullUpdate;
+}
+
+WorldPacket const* WorldPackets::Guild::GuildBankRemainingWithdrawMoney::Write()
+{
+ _worldPacket << RemainingWithdrawMoney;
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Guild::GuildBankWithdrawMoney::Read()
+{
+ _worldPacket >> Banker;
+ _worldPacket >> Money;
+}
+
+WorldPacket const* WorldPackets::Guild::GuildBankQueryResults::Write()
+{
+ _worldPacket << uint64(Money);
+ _worldPacket << uint8(Tab);
+ _withdrawalsRemainingPos = _worldPacket.wpos();
+ _worldPacket << int32(WithdrawalsRemaining);
+ _worldPacket << uint8(FullUpdate);
+
+ if (!Tab && FullUpdate)
+ {
+ _worldPacket << uint8(TabInfo.size());
+ for (GuildBankTabInfo const& tab : TabInfo)
+ {
+ _worldPacket << tab.Name;
+ _worldPacket << tab.Icon;
+ }
+ }
+
+ _worldPacket << uint8(ItemInfo.size());
+ for (GuildBankItemInfo const& item : ItemInfo)
+ {
+ _worldPacket << uint8(item.Slot);
+ _worldPacket << uint32(item.ItemID);
+ if (item.ItemID)
+ {
+ _worldPacket << int32(item.Flags);
+ _worldPacket << int32(item.RandomPropertiesID);
+ if (item.RandomPropertiesID)
+ _worldPacket << int32(item.RandomPropertiesSeed);
+
+ _worldPacket << int32(item.Count);
+ _worldPacket << int32(item.EnchantmentID);
+ _worldPacket << uint8(item.Charges);
+ _worldPacket << uint8(item.SocketEnchant.size());
+
+ for (GuildBankSocketEnchant const& socketEnchant : item.SocketEnchant)
+ {
+ _worldPacket << uint8(socketEnchant.SocketIndex);
+ _worldPacket << int32(socketEnchant.SocketEnchantID);
+ }
+ }
+ }
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Guild::GuildBankQueryResults::SetWithdrawalsRemaining(int32 withdrawalsRemaining)
+{
+ WithdrawalsRemaining = withdrawalsRemaining;
+ _worldPacket.put<int32>(_withdrawalsRemainingPos, withdrawalsRemaining);
+}
+
+void WorldPackets::Guild::GuildBankSwapItems::Read()
+{
+ _worldPacket >> Banker;
+ _worldPacket >> BankOnly;
+
+ if (BankOnly)
+ {
+ // dest
+ _worldPacket >> BankTab;
+ _worldPacket >> BankSlot;
+ _worldPacket >> ItemID;
+
+ // src
+ _worldPacket >> BankTab1;
+ _worldPacket >> BankSlot1;
+ _worldPacket >> ItemID1;
+
+ _worldPacket >> AutoStore;
+ _worldPacket >> BankItemCount;
+ }
+ else
+ {
+ _worldPacket >> BankTab;
+ _worldPacket >> BankSlot;
+ _worldPacket >> ItemID;
+
+ _worldPacket >> AutoStore;
+ if (AutoStore)
+ {
+ _worldPacket >> BankItemCount;
+ _worldPacket >> ToSlot;
+ _worldPacket >> StackCount;
+ }
+ else
+ {
+ _worldPacket >> ContainerSlot;
+ _worldPacket >> ContainerItemSlot;
+ _worldPacket >> ToSlot;
+ _worldPacket >> StackCount;
+ }
+ }
+}
+
+void WorldPackets::Guild::GuildBankLogQuery::Read()
+{
+ _worldPacket >> Tab;
+}
+
+WorldPacket const* WorldPackets::Guild::GuildBankLogQueryResults::Write()
+{
+ _worldPacket << uint8(Tab);
+ _worldPacket << uint8(Entry.size());
+
+ for (GuildBankLogEntry const& logEntry : Entry)
+ {
+ _worldPacket << int8(logEntry.EntryType);
+ _worldPacket << logEntry.PlayerGUID;
+
+ switch (logEntry.EntryType)
+ {
+ case GUILD_BANK_LOG_DEPOSIT_ITEM:
+ case GUILD_BANK_LOG_WITHDRAW_ITEM:
+ _worldPacket << uint32(logEntry.ItemID);
+ _worldPacket << uint32(logEntry.Count);
+ break;
+ case GUILD_BANK_LOG_MOVE_ITEM:
+ case GUILD_BANK_LOG_MOVE_ITEM2:
+ _worldPacket << uint32(logEntry.ItemID);
+ _worldPacket << uint32(logEntry.Count);
+ _worldPacket << uint8(logEntry.OtherTab);
+ break;
+ default:
+ _worldPacket << uint32(logEntry.Money);
+ break;
+ }
+
+ _worldPacket << uint32(logEntry.TimeOffset);
+ }
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Guild::GuildBankTextQuery::Read()
+{
+ _worldPacket >> Tab;
+}
+
+WorldPacket const* WorldPackets::Guild::GuildBankTextQueryResult::Write()
+{
+ _worldPacket << uint8(Tab);
+ _worldPacket << Text;
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Guild::GuildBankSetTabText::Read()
+{
+ _worldPacket >> Tab;
+ _worldPacket >> TabText;
+}
+
+void WorldPackets::Guild::GuildSetGuildMaster::Read()
+{
+ _worldPacket >> NewMasterName;
+}
+
+void WorldPackets::Guild::SaveGuildEmblem::Read()
+{
+ _worldPacket >> Vendor;
+ _worldPacket >> EStyle;
+ _worldPacket >> EColor;
+ _worldPacket >> BStyle;
+ _worldPacket >> BColor;
+ _worldPacket >> Bg;
+}
+
+WorldPacket const* WorldPackets::Guild::PlayerSaveGuildEmblem::Write()
+{
+ _worldPacket << int32(Error);
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/GuildPackets.h b/src/server/game/Server/Packets/GuildPackets.h
new file mode 100644
index 00000000000..753e1d42551
--- /dev/null
+++ b/src/server/game/Server/Packets/GuildPackets.h
@@ -0,0 +1,627 @@
+/*
+ * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GuildPackets_h__
+#define GuildPackets_h__
+
+#include "Packet.h"
+#include "Guild.h"
+#include "ObjectGuid.h"
+#include "PacketUtilities.h"
+
+namespace WorldPackets
+{
+ namespace Guild
+ {
+ class QueryGuildInfo final : public ClientPacket
+ {
+ public:
+ QueryGuildInfo(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_QUERY, std::move(packet)) { }
+
+ void Read() override;
+
+ uint32 GuildId;
+ };
+
+ struct GuildInfo
+ {
+ std::string GuildName;
+
+ std::array<std::string, GUILD_RANKS_MAX_COUNT> Ranks;
+ uint32 RankCount = 0;
+
+ uint32 EmblemStyle = 0;
+ uint32 EmblemColor = 0;
+ uint32 BorderStyle = 0;
+ uint32 BorderColor = 0;
+ uint32 BackgroundColor = 0;
+ };
+
+ class QueryGuildInfoResponse final : public ServerPacket
+ {
+ public:
+ QueryGuildInfoResponse();
+
+ WorldPacket const* Write() override;
+
+ uint32 GuildId;
+ GuildInfo Info;
+ };
+
+ class GuildCreate final : public ClientPacket
+ {
+ public:
+ GuildCreate(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_CREATE, std::move(packet)) { }
+
+ void Read() override;
+
+ std::string GuildName;
+ };
+
+ class GuildGetInfo final : ClientPacket
+ {
+ public:
+ GuildGetInfo(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_INFO, std::move(packet)) { }
+
+ void Read() override { }
+ };
+
+ class GuildInfoResponse final : ServerPacket
+ {
+ public:
+ GuildInfoResponse() : ServerPacket(SMSG_GUILD_INFO, 123) { }
+
+ WorldPacket const* Write() override;
+
+ std::string GuildName;
+ time_t CreateDate = time_t(0);
+ int32 NumMembers = 0;
+ int32 NumAccounts = 0;
+ };
+
+ class GuildGetRoster final : public ClientPacket
+ {
+ public:
+ GuildGetRoster(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_ROSTER, std::move(packet)) { }
+
+ void Read() override { }
+ };
+
+ struct GuildRosterMemberData
+ {
+ ObjectGuid Guid;
+ int64 WeeklyXP = 0;
+ int64 TotalXP = 0;
+ int32 RankID = 0;
+ int32 AreaID = 0;
+ float LastSave = 0.0f;
+ std::string Name;
+ std::string Note;
+ std::string OfficerNote;
+ uint8 Status = 0;
+ uint8 Level = 0;
+ uint8 ClassID = 0;
+ uint8 Gender = 0;
+ };
+
+ struct GuildRankData
+ {
+ uint32 Flags = 0;
+ uint32 WithdrawGoldLimit = 0;
+ uint32 TabFlags[GUILD_BANK_MAX_TABS];
+ uint32 TabWithdrawItemLimit[GUILD_BANK_MAX_TABS];
+ };
+
+ class GuildRoster final : public ServerPacket
+ {
+ public:
+ GuildRoster() : ServerPacket(SMSG_GUILD_ROSTER, 4 + 4 + 4 + 4) { }
+
+ WorldPacket const* Write() override;
+
+ std::vector<GuildRosterMemberData> MemberData;
+ std::vector<GuildRankData> RankData;
+ std::string WelcomeText;
+ std::string InfoText;
+ };
+
+ class GuildUpdateMotdText final : public ClientPacket
+ {
+ public:
+ GuildUpdateMotdText(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_MOTD, std::move(packet)) { }
+
+ void Read() override;
+
+ String<128, Strings::NoHyperlinks> MotdText;
+ };
+
+ 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 AcceptGuildInvite final : public ClientPacket
+ {
+ public:
+ AcceptGuildInvite(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_ACCEPT, std::move(packet)) { }
+
+ void Read() override { }
+ };
+
+ class GuildDeclineInvitation final : public ClientPacket
+ {
+ public:
+ GuildDeclineInvitation(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_DECLINE, std::move(packet)) { }
+
+ void Read() override { }
+ };
+
+ class GuildInviteByName final : public ClientPacket
+ {
+ public:
+ GuildInviteByName(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_INVITE, std::move(packet)) { }
+
+ void Read() override;
+
+ String<48> Name;
+ };
+
+ class GuildInvite final : public ServerPacket
+ {
+ public:
+ GuildInvite() : ServerPacket(SMSG_GUILD_INVITE, 144) { }
+
+ WorldPacket const* Write() override;
+
+ std::string InviterName;
+ std::string GuildName;
+ };
+
+ class GuildEvent final : public ServerPacket
+ {
+ public:
+ GuildEvent() : ServerPacket(SMSG_GUILD_EVENT) { }
+
+ WorldPacket const* Write() override;
+
+ uint8 Type = 0;
+ std::array<char const*, 3> Params = { };
+ ObjectGuid Guid;
+ };
+
+ struct GuildEventEntry
+ {
+ ObjectGuid PlayerGUID;
+ ObjectGuid OtherGUID;
+ uint8 TransactionType = 0;
+ uint8 RankID = 0;
+ uint32 TransactionDate = 0;
+ };
+
+ class GuildEventLogQuery final : public ClientPacket
+ {
+ public:
+ GuildEventLogQuery(WorldPacket&& packet) : ClientPacket(MSG_GUILD_EVENT_LOG_QUERY, std::move(packet)) { }
+
+ void Read() override { }
+ };
+
+ class GuildEventLogQueryResults final : public ServerPacket
+ {
+ public:
+ GuildEventLogQueryResults() : ServerPacket(MSG_GUILD_EVENT_LOG_QUERY, 4) { }
+
+ WorldPacket const* Write() override;
+
+ std::vector<GuildEventEntry> Entry;
+ };
+
+ class GuildPermissionsQuery final : public ClientPacket
+ {
+ public:
+ GuildPermissionsQuery(WorldPacket&& packet) : ClientPacket(MSG_GUILD_PERMISSIONS, std::move(packet)) { }
+
+ void Read() override { }
+ };
+
+ class GuildPermissionsQueryResults final : public ServerPacket
+ {
+ public:
+ struct GuildRankTabPermissions
+ {
+ int32 Flags = 0;
+ int32 WithdrawItemLimit = 0;
+ };
+
+ GuildPermissionsQueryResults() : ServerPacket(MSG_GUILD_PERMISSIONS, 20) { }
+
+ WorldPacket const* Write() override;
+
+ int8 NumTabs = 0;
+ int32 WithdrawGoldLimit = 0;
+ int32 Flags = 0;
+ uint32 RankID = 0;
+ std::array<GuildRankTabPermissions, GUILD_BANK_MAX_TABS> Tab;
+ };
+
+ class GuildSetRankPermissions final : public ClientPacket
+ {
+ public:
+ GuildSetRankPermissions(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_RANK, std::move(packet)) { }
+
+ void Read() override;
+
+ uint32 RankID = 0;
+ uint32 WithdrawGoldLimit = 0;
+ uint32 Flags = 0;
+ uint32 TabFlags[GUILD_BANK_MAX_TABS];
+ uint32 TabWithdrawItemLimit[GUILD_BANK_MAX_TABS];
+ String<15, Strings::NoHyperlinks> RankName;
+ };
+
+ class GuildAddRank final : public ClientPacket
+ {
+ public:
+ GuildAddRank(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_ADD_RANK, std::move(packet)) { }
+
+ void Read() override;
+
+ String<15, Strings::NoHyperlinks> Name;
+ };
+
+ class GuildDeleteRank final : public ClientPacket
+ {
+ public:
+ GuildDeleteRank(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_DEL_RANK, std::move(packet)) { }
+
+ void Read() override { }
+ };
+
+ class GuildUpdateInfoText final : public ClientPacket
+ {
+ public:
+ GuildUpdateInfoText(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_INFO_TEXT, std::move(packet)) { }
+
+ void Read() override;
+
+ String<500, Strings::NoHyperlinks> InfoText;
+ };
+
+ class GuildSetMemberNote final : public ClientPacket
+ {
+ public:
+ GuildSetMemberNote(WorldPacket&& packet) : ClientPacket(std::move(packet)) { }
+
+ void Read() override;
+
+ std::string NoteeName;
+ String<31, Strings::NoHyperlinks> Note;
+ };
+
+ class GuildDelete final : public ClientPacket
+ {
+ public:
+ GuildDelete(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_DISBAND, std::move(packet)) { }
+
+ void Read() override { }
+ };
+
+ class GuildDemoteMember final : public ClientPacket
+ {
+ public:
+ GuildDemoteMember(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_DEMOTE, std::move(packet)) { }
+
+ void Read() override;
+
+ std::string Demotee;
+ };
+
+ class GuildPromoteMember final : public ClientPacket
+ {
+ public:
+ GuildPromoteMember(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_PROMOTE, std::move(packet)) { }
+
+ void Read() override;
+
+ std::string Promotee;
+ };
+
+ class GuildOfficerRemoveMember : public ClientPacket
+ {
+ public:
+ GuildOfficerRemoveMember(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_REMOVE, std::move(packet)) { }
+
+ void Read() override;
+
+ std::string Removee;
+ };
+
+ class GuildLeave final : public ClientPacket
+ {
+ public:
+ GuildLeave(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_LEAVE, std::move(packet)) { }
+
+ void Read() override { }
+ };
+
+ class GuildBankActivate final : public ClientPacket
+ {
+ public:
+ GuildBankActivate(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_BANKER_ACTIVATE, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Banker;
+ bool FullUpdate = false;
+ };
+
+ class GuildBankBuyTab final : public ClientPacket
+ {
+ public:
+ GuildBankBuyTab(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_BANK_BUY_TAB, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Banker;
+ uint8 BankTab = 0;
+ };
+
+ class GuildBankUpdateTab final : public ClientPacket
+ {
+ public:
+ GuildBankUpdateTab(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_BANK_UPDATE_TAB, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Banker;
+ uint8 BankTab = 0;
+ String<16, Strings::NoHyperlinks> Name;
+ String<100> Icon;
+ };
+
+ class GuildBankDepositMoney final : public ClientPacket
+ {
+ public:
+ GuildBankDepositMoney(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_BANK_DEPOSIT_MONEY, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Banker;
+ uint32 Money = 0;
+ };
+
+ class GuildBankQueryTab final : public ClientPacket
+ {
+ public:
+ GuildBankQueryTab(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_BANK_QUERY_TAB, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Banker;
+ uint8 Tab = 0;
+ bool FullUpdate = false;
+ };
+
+ class GuildBankRemainingWithdrawMoneyQuery final : public ClientPacket
+ {
+ public:
+ GuildBankRemainingWithdrawMoneyQuery(WorldPacket&& packet) : ClientPacket(MSG_GUILD_BANK_MONEY_WITHDRAWN, std::move(packet)) { }
+
+ void Read() override { }
+ };
+
+ class GuildBankRemainingWithdrawMoney final : public ServerPacket
+ {
+ public:
+ GuildBankRemainingWithdrawMoney() : ServerPacket(MSG_GUILD_BANK_MONEY_WITHDRAWN, 8) { }
+
+ WorldPacket const* Write() override;
+
+ int32 RemainingWithdrawMoney = 0;
+ };
+
+ class GuildBankWithdrawMoney final : public ClientPacket
+ {
+ public:
+ GuildBankWithdrawMoney(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_BANK_WITHDRAW_MONEY, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Banker;
+ uint32 Money = 0;
+ };
+
+ struct GuildBankSocketEnchant
+ {
+ uint8 SocketIndex = 0;
+ int32 SocketEnchantID = 0;
+ };
+
+ struct GuildBankItemInfo
+ {
+ uint32 ItemID = 0;
+ int32 RandomPropertiesSeed = 0;
+ int32 RandomPropertiesID = 0;
+ uint8 Slot = 0;
+ int32 Count = 0;
+ int32 EnchantmentID = 0;
+ int32 Charges = 0;
+ int32 Flags = 0;
+ std::vector<GuildBankSocketEnchant> SocketEnchant;
+ };
+
+ struct GuildBankTabInfo
+ {
+ std::string Name;
+ std::string Icon;
+ };
+
+ class GuildBankQueryResults final : public ServerPacket
+ {
+ public:
+ GuildBankQueryResults() : ServerPacket(SMSG_GUILD_BANK_LIST, 25) { }
+
+ WorldPacket const* Write() override;
+
+ std::vector<GuildBankItemInfo> ItemInfo;
+ std::vector<GuildBankTabInfo> TabInfo;
+ int32 WithdrawalsRemaining = 0;
+ uint8 Tab = 0;
+ uint64 Money = 0;
+ bool FullUpdate = false;
+
+ void SetWithdrawalsRemaining(int32 withdrawalsRemaining);
+
+ private:
+ std::size_t _withdrawalsRemainingPos = 0;
+ };
+
+ class GuildBankSwapItems final : public ClientPacket
+ {
+ public:
+ GuildBankSwapItems(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_BANK_SWAP_ITEMS, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Banker;
+ int32 StackCount = 0;
+ int32 BankItemCount = 0;
+ uint32 ItemID = 0;
+ uint32 ItemID1 = 0;
+ uint8 ToSlot = 0;
+ uint8 BankSlot = 0;
+ uint8 BankSlot1 = 0;
+ uint8 BankTab = 0;
+ uint8 BankTab1 = 0;
+ uint8 ContainerSlot = 0;
+ uint8 ContainerItemSlot = 0;
+ bool AutoStore = false;
+ bool BankOnly = false;
+ };
+
+ class GuildBankLogQuery final : public ClientPacket
+ {
+ public:
+ GuildBankLogQuery(WorldPacket&& packet) : ClientPacket(MSG_GUILD_BANK_LOG_QUERY, std::move(packet)) { }
+
+ void Read() override;
+
+ uint8 Tab = 0;
+ };
+
+ struct GuildBankLogEntry
+ {
+ ObjectGuid PlayerGUID;
+ uint32 TimeOffset = 0;
+ int8 EntryType = 0;
+ uint32 Money = 0;
+ int32 ItemID = 0;
+ int32 Count = 0;
+ int8 OtherTab = 0;
+ };
+
+ class GuildBankLogQueryResults final : public ServerPacket
+ {
+ public:
+ GuildBankLogQueryResults() : ServerPacket(MSG_GUILD_BANK_LOG_QUERY, 25) { }
+
+ WorldPacket const* Write() override;
+
+ uint8 Tab = 0;
+ std::vector<GuildBankLogEntry> Entry;
+ };
+
+ class GuildBankTextQuery final : public ClientPacket
+ {
+ public:
+ GuildBankTextQuery(WorldPacket&& packet) : ClientPacket(MSG_QUERY_GUILD_BANK_TEXT, std::move(packet)) { }
+
+ void Read() override;
+
+ uint8 Tab = 0;
+ };
+
+ class GuildBankTextQueryResult : public ServerPacket
+ {
+ public:
+ GuildBankTextQueryResult() : ServerPacket(MSG_QUERY_GUILD_BANK_TEXT, 4 + 2) { }
+
+ WorldPacket const* Write() override;
+
+ uint8 Tab = 0;
+ std::string Text;
+ };
+
+ class GuildBankSetTabText final : public ClientPacket
+ {
+ public:
+ GuildBankSetTabText(WorldPacket&& packet) : ClientPacket(CMSG_SET_GUILD_BANK_TEXT, std::move(packet)) { }
+
+ void Read() override;
+
+ uint8 Tab = 0;
+ String<500, Strings::NoHyperlinks> TabText;
+ };
+
+ class GuildSetGuildMaster final : public ClientPacket
+ {
+ public:
+ GuildSetGuildMaster(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_LEADER, std::move(packet)) { }
+
+ void Read() override;
+
+ std::string NewMasterName;
+ };
+
+ class SaveGuildEmblem final : public ClientPacket
+ {
+ public:
+ SaveGuildEmblem(WorldPacket&& packet) : ClientPacket(MSG_SAVE_GUILD_EMBLEM, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Vendor;
+ int32 BStyle = 0;
+ int32 EStyle = 0;
+ int32 BColor = 0;
+ int32 EColor = 0;
+ int32 Bg = 0;
+ };
+
+ class PlayerSaveGuildEmblem final : public ServerPacket
+ {
+ public:
+ PlayerSaveGuildEmblem() : ServerPacket(MSG_SAVE_GUILD_EMBLEM, 4) { }
+
+ WorldPacket const* Write() override;
+
+ int32 Error = 0;
+ };
+ }
+}
+
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Guild::GuildRosterMemberData const& rosterMemberData);
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Guild::GuildRankData const& rankData);
+
+#endif // GuildPackets_h__
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 713d9172bbf..2cbf308a612 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -87,6 +87,42 @@ namespace WorldPackets
class AttackSwing;
class AttackStop;
}
+ namespace Guild
+ {
+ class QueryGuildInfo;
+ class GuildCreate;
+ class GuildInviteByName;
+ class AcceptGuildInvite;
+ class GuildDeclineInvitation;
+ class GuildGetInfo;
+ class GuildGetRoster;
+ class GuildPromoteMember;
+ class GuildDemoteMember;
+ class GuildOfficerRemoveMember;
+ class GuildLeave;
+ class GuildDelete;
+ class GuildUpdateMotdText;
+ class GuildAddRank;
+ class GuildDeleteRank;
+ class GuildUpdateInfoText;
+ class GuildSetMemberNote;
+ class GuildEventLogQuery;
+ class GuildBankRemainingWithdrawMoneyQuery;
+ class GuildPermissionsQuery;
+ class GuildSetRankPermissions;
+ class GuildBankActivate;
+ class GuildBankQueryTab;
+ class GuildBankDepositMoney;
+ class GuildBankWithdrawMoney;
+ class GuildBankSwapItems;
+ class GuildBankBuyTab;
+ class GuildBankUpdateTab;
+ class GuildBankLogQuery;
+ class GuildBankTextQuery;
+ class GuildBankSetTabText;
+ class GuildSetGuildMaster;
+ class SaveGuildEmblem;
+ }
namespace NPC
{
class Hello;
@@ -653,28 +689,28 @@ class TC_GAME_API WorldSession
void HandleOfferPetitionOpcode(WorldPacket& recvData);
void HandleTurnInPetitionOpcode(WorldPacket& recvData);
- void HandleGuildQueryOpcode(WorldPacket& recvPacket);
- void HandleGuildCreateOpcode(WorldPacket& recvPacket);
- void HandleGuildInviteOpcode(WorldPacket& recvPacket);
- void HandleGuildRemoveOpcode(WorldPacket& recvPacket);
- void HandleGuildAcceptOpcode(WorldPacket& recvPacket);
- void HandleGuildDeclineOpcode(WorldPacket& recvPacket);
- void HandleGuildInfoOpcode(WorldPacket& recvPacket);
- void HandleGuildEventLogQueryOpcode(WorldPacket& recvPacket);
- void HandleGuildRosterOpcode(WorldPacket& recvPacket);
- void HandleGuildPromoteOpcode(WorldPacket& recvPacket);
- void HandleGuildDemoteOpcode(WorldPacket& recvPacket);
- void HandleGuildLeaveOpcode(WorldPacket& recvPacket);
- void HandleGuildDisbandOpcode(WorldPacket& recvPacket);
- void HandleGuildLeaderOpcode(WorldPacket& recvPacket);
- void HandleGuildMOTDOpcode(WorldPacket& recvPacket);
- void HandleGuildSetPublicNoteOpcode(WorldPacket& recvPacket);
- void HandleGuildSetOfficerNoteOpcode(WorldPacket& recvPacket);
- void HandleGuildRankOpcode(WorldPacket& recvPacket);
- void HandleGuildAddRankOpcode(WorldPacket& recvPacket);
- void HandleGuildDelRankOpcode(WorldPacket& recvPacket);
- void HandleGuildChangeInfoTextOpcode(WorldPacket& recvPacket);
- void HandleSaveGuildEmblemOpcode(WorldPacket& recvPacket);
+ void HandleGuildQueryOpcode(WorldPackets::Guild::QueryGuildInfo& query);
+ void HandleGuildCreateOpcode(WorldPackets::Guild::GuildCreate& packet);
+ void HandleGuildInviteOpcode(WorldPackets::Guild::GuildInviteByName& packet);
+ void HandleGuildRemoveOpcode(WorldPackets::Guild::GuildOfficerRemoveMember& packet);
+ void HandleGuildAcceptOpcode(WorldPackets::Guild::AcceptGuildInvite& invite);
+ void HandleGuildDeclineOpcode(WorldPackets::Guild::GuildDeclineInvitation& decline);
+ void HandleGuildInfoOpcode(WorldPackets::Guild::GuildGetInfo& packet);
+ void HandleGuildEventLogQueryOpcode(WorldPackets::Guild::GuildEventLogQuery& packet);
+ void HandleGuildRosterOpcode(WorldPackets::Guild::GuildGetRoster& packet);
+ void HandleGuildPromoteOpcode(WorldPackets::Guild::GuildPromoteMember& promote);
+ void HandleGuildDemoteOpcode(WorldPackets::Guild::GuildDemoteMember& demote);
+ void HandleGuildLeaveOpcode(WorldPackets::Guild::GuildLeave& leave);
+ void HandleGuildDisbandOpcode(WorldPackets::Guild::GuildDelete& packet);
+ void HandleGuildLeaderOpcode(WorldPackets::Guild::GuildSetGuildMaster& packet);
+ void HandleGuildMOTDOpcode(WorldPackets::Guild::GuildUpdateMotdText& packet);
+ void HandleGuildSetPublicNoteOpcode(WorldPackets::Guild::GuildSetMemberNote& packet);
+ void HandleGuildSetOfficerNoteOpcode(WorldPackets::Guild::GuildSetMemberNote& packet);
+ void HandleGuildRankOpcode(WorldPackets::Guild::GuildSetRankPermissions& packet);
+ void HandleGuildAddRankOpcode(WorldPackets::Guild::GuildAddRank& packet);
+ void HandleGuildDelRankOpcode(WorldPackets::Guild::GuildDeleteRank& packet);
+ void HandleGuildChangeInfoTextOpcode(WorldPackets::Guild::GuildUpdateInfoText& packet);
+ void HandleSaveGuildEmblemOpcode(WorldPackets::Guild::SaveGuildEmblem& packet);
void HandleTaxiNodeStatusQueryOpcode(WorldPacket& recvPacket);
void HandleTaxiQueryAvailableNodes(WorldPacket& recvPacket);
@@ -953,19 +989,19 @@ class TC_GAME_API WorldSession
void HandleSetTaxiBenchmarkOpcode(WorldPacket& recvData);
// Guild Bank
- void HandleGuildPermissions(WorldPacket& recvData);
- void HandleGuildBankMoneyWithdrawn(WorldPacket& recvData);
- void HandleGuildBankerActivate(WorldPacket& recvData);
- void HandleGuildBankQueryTab(WorldPacket& recvData);
- void HandleGuildBankLogQuery(WorldPacket& recvData);
- void HandleGuildBankDepositMoney(WorldPacket& recvData);
- void HandleGuildBankWithdrawMoney(WorldPacket& recvData);
- void HandleGuildBankSwapItems(WorldPacket& recvData);
-
- void HandleGuildBankUpdateTab(WorldPacket& recvData);
- void HandleGuildBankBuyTab(WorldPacket& recvData);
- void HandleQueryGuildBankTabText(WorldPacket& recvData);
- void HandleSetGuildBankTabText(WorldPacket& recvData);
+ void HandleGuildPermissions(WorldPackets::Guild::GuildPermissionsQuery& packet);
+ void HandleGuildBankMoneyWithdrawn(WorldPackets::Guild::GuildBankRemainingWithdrawMoneyQuery& packet);
+ void HandleGuildBankerActivate(WorldPackets::Guild::GuildBankActivate& packet);
+ void HandleGuildBankQueryTab(WorldPackets::Guild::GuildBankQueryTab& packet);
+ void HandleGuildBankLogQuery(WorldPackets::Guild::GuildBankLogQuery& packet);
+ void HandleGuildBankDepositMoney(WorldPackets::Guild::GuildBankDepositMoney& packet);
+ void HandleGuildBankWithdrawMoney(WorldPackets::Guild::GuildBankWithdrawMoney& packet);
+ void HandleGuildBankSwapItems(WorldPackets::Guild::GuildBankSwapItems& packet);
+
+ void HandleGuildBankUpdateTab(WorldPackets::Guild::GuildBankUpdateTab& packet);
+ void HandleGuildBankBuyTab(WorldPackets::Guild::GuildBankBuyTab& packet);
+ void HandleQueryGuildBankTabText(WorldPackets::Guild::GuildBankTextQuery& packet);
+ void HandleSetGuildBankTabText(WorldPackets::Guild::GuildBankSetTabText& packet);
// Refer-a-Friend
void HandleGrantLevel(WorldPacket& recvData);