diff options
author | Shauren <shauren.trinity@gmail.com> | 2012-08-23 15:35:53 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2012-08-23 15:35:53 +0200 |
commit | dbda9b549cab53a93c54f55347283c71f33635c3 (patch) | |
tree | ea83b08e5211a3955f6dda070cf12eb92991b3b7 | |
parent | 537c4b7f2d8a38c6c87d74e8a972ec1cf9316a98 (diff) |
Core/PacketIO: Updated SMSG_GUILD_BANK_LIST
-rw-r--r-- | src/server/game/Guilds/Guild.cpp | 230 | ||||
-rwxr-xr-x | src/server/game/Guilds/Guild.h | 17 | ||||
-rwxr-xr-x | src/server/game/Handlers/GuildHandler.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 12 | ||||
-rwxr-xr-x | src/server/shared/Packets/ByteBuffer.h | 3 |
5 files changed, 138 insertions, 128 deletions
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 0bab8ab2418..4b193b62b2b 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -370,48 +370,6 @@ void Guild::BankTab::Delete(SQLTransaction& trans, bool removeItemsFromDB) } } -inline void Guild::BankTab::WritePacket(WorldPacket& data) const -{ - data << uint8(GUILD_BANK_MAX_SLOTS); - for (uint8 slotId = 0; slotId < GUILD_BANK_MAX_SLOTS; ++slotId) - WriteSlotPacket(data, slotId); -} - -// Writes information about contents of specified slot into packet. -void Guild::BankTab::WriteSlotPacket(WorldPacket& data, uint8 slotId) const -{ - Item* pItem = GetItem(slotId); - uint32 itemEntry = pItem ? pItem->GetEntry() : 0; - - data << uint8(slotId); - data << uint32(itemEntry); - if (itemEntry) - { - data << uint32(0); // 3.3.0 (0x00018020, 0x00018000) - data << uint32(pItem->GetItemRandomPropertyId()); // Random item property id - - if (pItem->GetItemRandomPropertyId()) - data << uint32(pItem->GetItemSuffixFactor()); // SuffixFactor - - data << uint32(pItem->GetCount()); // ITEM_FIELD_STACK_COUNT - data << uint32(0); - data << uint8(abs(pItem->GetSpellCharges())); // Spell charges - - uint8 enchCount = 0; - size_t enchCountPos = data.wpos(); - - data << uint8(enchCount); // Number of enchantments - for (uint32 i = PERM_ENCHANTMENT_SLOT; i < MAX_ENCHANTMENT_SLOT; ++i) - if (uint32 enchId = pItem->GetEnchantmentId(EnchantmentSlot(i))) - { - data << uint8(i); - data << uint32(enchId); - ++enchCount; - } - data.put<uint8>(enchCountPos, enchCount); - } -} - void Guild::BankTab::SetInfo(const std::string& name, const std::string& icon) { if (m_name == name && m_icon == icon) @@ -1436,8 +1394,7 @@ void Guild::HandleSetBankTabInfo(WorldSession* session, uint8 tabId, const std:: if (BankTab* pTab = GetBankTab(tabId)) { pTab->SetInfo(name, icon); - SendBankTabsInfo(session); - _SendBankContent(session, tabId); + SendBankList(session, tabId, true, true); } } @@ -1498,7 +1455,7 @@ void Guild::HandleBuyBankTab(WorldSession* session, uint8 tabId) _SetRankBankMoneyPerDay(player->GetRank(), uint32(GUILD_WITHDRAW_MONEY_UNLIMITED)); _SetRankBankTabRightsAndSlots(player->GetRank(), tabId, GuildBankRightsAndSlots(GUILD_BANK_RIGHT_FULL, uint32(GUILD_WITHDRAW_SLOT_UNLIMITED))); HandleRoster(); // Broadcast for tab rights update - SendBankTabsInfo(session); + SendBankList(session, tabId, false, true); } void Guild::HandleInviteMember(WorldSession* session, const std::string& name) @@ -1822,9 +1779,7 @@ void Guild::HandleMemberDepositMoney(WorldSession* session, uint32 amount) CharacterDatabase.CommitTransaction(trans); - SendBankTabsInfo(session); - _SendBankContent(session, 0); - _SendBankMoneyUpdate(session); + SendBankList(session, 0, false, false); } bool Guild::HandleMemberWithdrawMoney(WorldSession* session, uint32 amount, bool repair) @@ -1865,11 +1820,7 @@ bool Guild::HandleMemberWithdrawMoney(WorldSession* session, uint32 amount, bool SendMoneyInfo(session); if (!repair) - { - SendBankTabsInfo(session); - _SendBankContent(session, 0); - _SendBankMoneyUpdate(session); - } + SendBankList(session, 0, false, false); return true; } @@ -1940,29 +1891,86 @@ void Guild::SendBankLog(WorldSession* session, uint8 tabId) const } } -void Guild::SendBankTabData(WorldSession* session, uint8 tabId) const +void Guild::SendBankList(WorldSession* session, uint8 tabId, bool withContent, bool withTabInfo) const { - if (tabId < _GetPurchasedTabsSize()) + ByteBuffer tabData; + WorldPacket data(SMSG_GUILD_BANK_LIST, 500); + data.WriteBit(0); + uint32 itemCount = 0; + if (withContent && _MemberHasTabRights(session->GetPlayer()->GetGUID(), tabId, GUILD_BANK_RIGHT_VIEW_TAB)) + if (BankTab const* tab = GetBankTab(tabId)) + for (uint8 slotId = 0; slotId < GUILD_BANK_MAX_SLOTS; ++slotId) + if (Item* tabItem = tab->GetItem(slotId)) + ++itemCount; + + data.WriteBits(itemCount, 20); + data.WriteBits(withTabInfo ? _GetPurchasedTabsSize() : 0, 22); + if (withContent && _MemberHasTabRights(session->GetPlayer()->GetGUID(), tabId, GUILD_BANK_RIGHT_VIEW_TAB)) + { + if (BankTab const* tab = GetBankTab(tabId)) + { + for (uint8 slotId = 0; slotId < GUILD_BANK_MAX_SLOTS; ++slotId) + { + if (Item* tabItem = tab->GetItem(slotId)) + { + data.WriteBit(0); + + uint32 enchants = 0; + for (uint32 ench = 0; ench < MAX_ENCHANTMENT_SLOT; ++ench) + { + if (uint32 enchantId = tabItem->GetEnchantmentId(EnchantmentSlot(ench))) + { + tabData << uint32(enchantId); + tabData << uint32(ench); + ++enchants; + } + } + + data.WriteBits(enchants, 23); + + tabData << uint32(0); + tabData << uint32(0); + tabData << uint32(0); + tabData << uint32(tabItem->GetCount()); // ITEM_FIELD_STACK_COUNT + tabData << uint32(slotId); + tabData << uint32(0); + tabData << uint32(tabItem->GetEntry()); + tabData << uint32(tabItem->GetItemRandomPropertyId()); + tabData << uint32(abs(tabItem->GetSpellCharges())); // Spell charges + tabData << uint32(tabItem->GetItemSuffixFactor()); // SuffixFactor + } + } + } + } + + if (withTabInfo) { - SendMoneyInfo(session); - _SendBankContent(session, tabId); + for (uint8 i = 0; i < _GetPurchasedTabsSize(); ++i) + { + data.WriteBits(m_bankTabs[i]->GetIcon().length(), 9); + data.WriteBits(m_bankTabs[i]->GetName().length(), 7); + } } -} -void Guild::SendBankTabsInfo(WorldSession* session) const -{ - WorldPacket data(SMSG_GUILD_BANK_LIST, 500); + data.FlushBits(); + + if (withTabInfo) + { + for (uint8 i = 0; i < _GetPurchasedTabsSize(); ++i) + { + data.WriteString(m_bankTabs[i]->GetIcon()); + data << uint32(i); + data.WriteString(m_bankTabs[i]->GetName()); + } + } data << uint64(m_bankMoney); - data << uint8(0); // TabInfo packet must be for tabId 0 - data << uint32(_GetMemberRemainingSlots(session->GetPlayer()->GetGUID(), 0)); - data << uint8(1); // Tell client that this packet includes tab info + if (!tabData.empty()) + data.append(tabData); - data << uint8(_GetPurchasedTabsSize()); // Number of tabs - for (uint8 i = 0; i < _GetPurchasedTabsSize(); ++i) - m_bankTabs[i]->WriteInfoPacket(data); + data << uint32(tabId); + data << uint32(_GetMemberRemainingSlots(session->GetPlayer()->GetGUID(), 0)); - data << uint8(0); // Do not send tab content session->SendPacket(&data); sLog->outDebug(LOG_FILTER_GUILD, "WORLD: Sent (SMSG_GUILD_BANK_LIST)"); @@ -2880,41 +2888,6 @@ bool Guild::_DoItemsMove(MoveItemData* pSrc, MoveItemData* pDest, bool sendError return true; } -void Guild::_SendBankContent(WorldSession* session, uint8 tabId) const -{ - uint64 guid = session->GetPlayer()->GetGUID(); - if (_MemberHasTabRights(guid, tabId, GUILD_BANK_RIGHT_VIEW_TAB)) - if (const BankTab* pTab = GetBankTab(tabId)) - { - WorldPacket data(SMSG_GUILD_BANK_LIST, 1200); - - data << uint64(m_bankMoney); - data << uint8(tabId); - data << uint32(_GetMemberRemainingSlots(guid, tabId)); - data << uint8(0); // Tell client that there's no tab info in this packet - - pTab->WritePacket(data); - - session->SendPacket(&data); - - sLog->outDebug(LOG_FILTER_GUILD, "WORLD: Sent (SMSG_GUILD_BANK_LIST)"); - } -} - -void Guild::_SendBankMoneyUpdate(WorldSession* session) const -{ - WorldPacket data(SMSG_GUILD_BANK_LIST, 8 + 1 + 4 + 1 + 1); - - data << uint64(m_bankMoney); - data << uint8(0); // tabId, default 0 - data << uint32(_GetMemberRemainingSlots(session->GetPlayer()->GetGUID(), 0)); - data << uint8(0); // Tell that there's no tab info in this packet - data << uint8(0); // No items - BroadcastPacket(&data); - - sLog->outDebug(LOG_FILTER_GUILD, "WORLD: Sent (SMSG_GUILD_BANK_LIST)"); -} - void Guild::_SendBankContentUpdate(MoveItemData* pSrc, MoveItemData* pDest) const { ASSERT(pSrc->IsBank() || pDest->IsBank()); @@ -2943,6 +2916,7 @@ void Guild::_SendBankContentUpdate(MoveItemData* pSrc, MoveItemData* pDest) cons tabId = pDest->GetContainer(); pDest->CopySlots(slots); } + _SendBankContentUpdate(tabId, slots); } @@ -2950,19 +2924,55 @@ void Guild::_SendBankContentUpdate(uint8 tabId, SlotIds slots) const { if (BankTab const* tab = GetBankTab(tabId)) { + ByteBuffer tabData; WorldPacket data(SMSG_GUILD_BANK_LIST, 1200); + data.WriteBit(0); + data.WriteBits(slots.size(), 20); // Item count + data.WriteBits(0, 22); // Tab count + + for (SlotIds::const_iterator itr = slots.begin(); itr != slots.end(); ++itr) + { + data.WriteBit(0); + + Item const* tabItem = tab->GetItem(*itr); + uint32 enchantCount = 0; + if (tabItem) + { + for (uint32 enchSlot = 0; enchSlot < MAX_ENCHANTMENT_SLOT; ++enchSlot) + { + if (uint32 enchantId = tabItem->GetEnchantmentId(EnchantmentSlot(enchSlot))) + { + tabData << uint32(enchantId); + tabData << uint32(enchSlot); + ++enchantCount; + } + } + } + + data.WriteBits(enchantCount, 23); // enchantment count + + tabData << uint32(0); + tabData << uint32(0); + tabData << uint32(0); + tabData << uint32(tabItem ? tabItem->GetCount() : 0); // ITEM_FIELD_STACK_COUNT + tabData << uint32(*itr); + tabData << uint32(0); + tabData << uint32(tabItem ? tabItem->GetEntry() : 0); + tabData << uint32(tabItem ? tabItem->GetItemRandomPropertyId() : 0); + tabData << uint32(tabItem ? abs(tabItem->GetSpellCharges()) : 0); // Spell charges + tabData << uint32(tabItem ? tabItem->GetItemSuffixFactor() : 0); // SuffixFactor + } + + data.FlushBits(); data << uint64(m_bankMoney); - data << uint8(tabId); + if (!tabData.empty()) + data.append(tabData); + + data << uint32(tabId); size_t rempos = data.wpos(); data << uint32(0); // Item withdraw amount, will be filled later - data << uint8(0); // Tell client that there's no tab info in this packet - - data << uint8(slots.size()); - for (uint8 slotId = 0; slotId < GUILD_BANK_MAX_SLOTS; ++slotId) - if (slots.find(slotId) != slots.end()) - tab->WriteSlotPacket(data, slotId); for (Members::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr) if (_MemberHasTabRights(itr->second->GetGUID(), tabId, GUILD_BANK_RIGHT_VIEW_TAB)) diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index c4ec165d4ab..67888f636ff 100755 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -502,18 +502,14 @@ private: bool LoadItemFromDB(Field* fields); void Delete(SQLTransaction& trans, bool removeItemsFromDB = false); - void WritePacket(WorldPacket& data) const; - void WriteSlotPacket(WorldPacket& data, uint8 slotId) const; - void WriteInfoPacket(WorldPacket& data) const - { - data << m_name; - data << m_icon; - } - void SetInfo(const std::string& name, const std::string& icon); void SetText(const std::string& text); void SendText(const Guild* 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] : NULL; } bool SetItem(SQLTransaction& trans, uint8 slotId, Item* pItem); @@ -664,8 +660,7 @@ public: // Send info to client void SendEventLog(WorldSession* session) const; void SendBankLog(WorldSession* session, uint8 tabId) const; - void SendBankTabsInfo(WorldSession* session) const; - void SendBankTabData(WorldSession* session, uint8 tabId) const; + void SendBankList(WorldSession* session, uint8 tabId, bool withContent, bool withTabInfo) const; void SendBankTabText(WorldSession* session, uint8 tabId) const; void SendPermissions(WorldSession* session) const; void SendMoneyInfo(WorldSession* session) const; @@ -814,8 +809,6 @@ private: 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 _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 ff9189ff704..778ecc2659f 100755 --- a/src/server/game/Handlers/GuildHandler.cpp +++ b/src/server/game/Handlers/GuildHandler.cpp @@ -433,7 +433,7 @@ void WorldSession::HandleGuildBankerActivate(WorldPacket& recvData) if (GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid, GAMEOBJECT_TYPE_GUILD_BANK)) { if (Guild* guild = _GetPlayerGuild(this)) - guild->SendBankTabsInfo(this); + guild->SendBankList(this, 0, true, true); else Guild::SendCommandResult(this, GUILD_UNK1, ERR_GUILD_PLAYER_NOT_IN_GUILD); } @@ -455,7 +455,7 @@ void WorldSession::HandleGuildBankQueryTab(WorldPacket & recvData) if (GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid, GAMEOBJECT_TYPE_GUILD_BANK)) if (Guild* guild = _GetPlayerGuild(this)) - guild->SendBankTabData(this, tabId); + guild->SendBankList(this, tabId, true, false); } void WorldSession::HandleGuildBankDepositMoney(WorldPacket & recvData) diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index f4f77dbe702..7138b90ba23 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -22,7 +22,13 @@ OpcodeHandler* opcodeTable[NUM_OPCODE_HANDLERS] = { }; template<bool isInValidRange, bool isNonZero> -inline void ValidateAndSetOpcode(uint16 opcode, char const* name, SessionStatus status, PacketProcessing processing, pOpcodeHandler handler) +inline void ValidateAndSetOpcode(uint16 /*opcode*/, char const* /*name*/, SessionStatus /*status*/, PacketProcessing /*processing*/, pOpcodeHandler /*handler*/) +{ + // if for some reason we are here, that means NUM_OPCODE_HANDLERS == 0 (or your compiler is broken) +} + +template<> +void ValidateAndSetOpcode<true, true>(uint16 opcode, char const* name, SessionStatus status, PacketProcessing processing, pOpcodeHandler handler) { if (opcodeTable[opcode] != NULL) { @@ -40,7 +46,7 @@ void ValidateAndSetOpcode<false, true>(uint16 opcode, char const* /*name*/, Sess } template<> -void ValidateAndSetOpcode<false, false>(uint16 /*opcode*/, char const* name, SessionStatus /*status*/, PacketProcessing /*processing*/, pOpcodeHandler /*handler*/) +void ValidateAndSetOpcode<true, false>(uint16 /*opcode*/, char const* name, SessionStatus /*status*/, PacketProcessing /*processing*/, pOpcodeHandler /*handler*/) { sLog->outError(LOG_FILTER_NETWORKIO, "Opcode %s got value 0", name); } @@ -843,7 +849,7 @@ void InitOpcodes() DEFINE_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_DELETED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_EARNED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_MEMBERS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - DEFINE_OPCODE_HANDLER(SMSG_GUILD_BANK_LIST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_GUILD_BANK_LIST, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_GUILD_BANK_LOG_QUERY_RESULTS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_GUILD_BANK_MONEY_WITHDRAWN, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_GUILD_BANK_QUERY_TEXT_RESULTS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); diff --git a/src/server/shared/Packets/ByteBuffer.h b/src/server/shared/Packets/ByteBuffer.h index 4386ce03d42..0b08b4118d4 100755 --- a/src/server/shared/Packets/ByteBuffer.h +++ b/src/server/shared/Packets/ByteBuffer.h @@ -456,7 +456,8 @@ class ByteBuffer //! without null-terminating the string void WriteString(std::string const& str) { - append(str.c_str(), str.length()); + if (size_t len = str.length()) + append(str.c_str(), len); } const uint8 *contents() const { return &_storage[0]; } |