diff options
-rw-r--r-- | src/server/game/Guilds/Guild.cpp | 506 | ||||
-rw-r--r-- | src/server/game/Guilds/Guild.h | 44 | ||||
-rw-r--r-- | src/server/game/Handlers/GuildHandler.cpp | 420 | ||||
-rw-r--r-- | src/server/game/Server/Packets/AllPackets.h | 1 | ||||
-rw-r--r-- | src/server/game/Server/Packets/GuildPackets.cpp | 459 | ||||
-rw-r--r-- | src/server/game/Server/Packets/GuildPackets.h | 627 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 106 |
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); |