aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Guilds/Guild.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Guilds/Guild.cpp')
-rw-r--r--src/server/game/Guilds/Guild.cpp174
1 files changed, 127 insertions, 47 deletions
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp
index 595ad77feeb..ba9d8610c12 100644
--- a/src/server/game/Guilds/Guild.cpp
+++ b/src/server/game/Guilds/Guild.cpp
@@ -99,9 +99,13 @@ inline void Guild::LogHolder::AddEvent(SQLTransaction& trans, LogEntry* entry)
// Writes information about all events into packet.
inline void Guild::LogHolder::WritePacket(WorldPacket& data) const
{
- data << uint8(m_log.size());
+ ByteBuffer buffer;
+ data.WriteBits(m_log.size(), 23);
for (GuildLog::const_iterator itr = m_log.begin(); itr != m_log.end(); ++itr)
- (*itr)->WritePacket(data);
+ (*itr)->WritePacket(data, buffer);
+
+ data.FlushBits();
+ data.append(buffer);
}
inline uint32 Guild::LogHolder::GetNextGUID()
@@ -138,20 +142,56 @@ void Guild::EventLogEntry::SaveToDB(SQLTransaction& trans) const
CharacterDatabase.ExecuteOrAppend(trans, stmt);
}
-void Guild::EventLogEntry::WritePacket(WorldPacket& data) const
+void Guild::EventLogEntry::WritePacket(WorldPacket& data, ByteBuffer& content) const
{
- // Event type
- data << uint8(m_eventType);
- // Player 1
- data << uint64(MAKE_NEW_GUID(m_playerGuid1, 0, HIGHGUID_PLAYER));
- // Player 2 not for left/join guild events
- if (m_eventType != GUILD_EVENT_LOG_JOIN_GUILD && m_eventType != GUILD_EVENT_LOG_LEAVE_GUILD)
- data << uint64(MAKE_NEW_GUID(m_playerGuid2, 0, HIGHGUID_PLAYER));
- // 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);
+ ObjectGuid guid1 = MAKE_NEW_GUID(m_playerGuid1, 0, HIGHGUID_PLAYER);
+ ObjectGuid guid2 = MAKE_NEW_GUID(m_playerGuid2, 0, HIGHGUID_PLAYER);
+
+ data.WriteBit(guid1[2]);
+ data.WriteBit(guid1[4]);
+ data.WriteBit(guid2[7]);
+ data.WriteBit(guid2[6]);
+ data.WriteBit(guid1[3]);
+ data.WriteBit(guid2[3]);
+ data.WriteBit(guid2[5]);
+ data.WriteBit(guid1[7]);
+ data.WriteBit(guid1[5]);
+ data.WriteBit(guid1[0]);
+ data.WriteBit(guid2[4]);
+ data.WriteBit(guid2[2]);
+ data.WriteBit(guid2[0]);
+ data.WriteBit(guid2[1]);
+ data.WriteBit(guid1[1]);
+ data.WriteBit(guid1[6]);
+
+ content.WriteByteSeq(guid2[3]);
+ content.WriteByteSeq(guid2[2]);
+ content.WriteByteSeq(guid2[5]);
+
+ // New Rank
+ content << uint8(m_newRank);
+
+ content.WriteByteSeq(guid2[4]);
+ content.WriteByteSeq(guid1[0]);
+ content.WriteByteSeq(guid1[4]);
+
// Event timestamp
- data << uint32(::time(NULL) - m_timestamp);
+ content << uint32(::time(NULL) - m_timestamp);
+
+ content.WriteByteSeq(guid1[7]);
+ content.WriteByteSeq(guid1[3]);
+ content.WriteByteSeq(guid2[0]);
+ content.WriteByteSeq(guid2[6]);
+ content.WriteByteSeq(guid2[7]);
+ content.WriteByteSeq(guid1[5]);
+
+ // Event type
+ content << uint8(m_eventType);
+
+ content.WriteByteSeq(guid2[1]);
+ content.WriteByteSeq(guid1[2]);
+ content.WriteByteSeq(guid1[6]);
+ content.WriteByteSeq(guid1[1]);
}
///////////////////////////////////////////////////////////////////////////////
@@ -181,20 +221,52 @@ void Guild::BankEventLogEntry::SaveToDB(SQLTransaction& trans) const
CharacterDatabase.ExecuteOrAppend(trans, stmt);
}
-void Guild::BankEventLogEntry::WritePacket(WorldPacket& data) const
+void Guild::BankEventLogEntry::WritePacket(WorldPacket& data, ByteBuffer& content) const
{
- data << uint8(m_eventType);
- data << uint64(MAKE_NEW_GUID(m_playerGuid, 0, HIGHGUID_PLAYER));
- data << uint32(m_itemOrMoney);
- // if ( m_eventType != 4 || m_eventType != 5 || m_eventType != 6 || m_eventType != 8 || m_eventType != 9 )
- if (m_eventType < GUILD_BANK_LOG_DEPOSIT_MONEY)
- {
- data << uint32(m_itemStackCount);
- if (m_eventType == GUILD_BANK_LOG_MOVE_ITEM || m_eventType == GUILD_BANK_LOG_MOVE_ITEM2)
- data << uint8(m_destTabId);
- }
+ ObjectGuid logGuid = MAKE_NEW_GUID(m_playerGuid, 0, HIGHGUID_PLAYER);
- data << uint32(time(NULL) - m_timestamp);
+ bool hasItem = m_eventType == GUILD_BANK_LOG_DEPOSIT_ITEM || m_eventType == GUILD_BANK_LOG_WITHDRAW_ITEM ||
+ m_eventType == GUILD_BANK_LOG_MOVE_ITEM || m_eventType == GUILD_BANK_LOG_MOVE_ITEM2;
+
+ bool itemMoved = (m_eventType == GUILD_BANK_LOG_MOVE_ITEM || m_eventType == GUILD_BANK_LOG_MOVE_ITEM2);
+
+ bool hasStack = (hasItem && m_itemStackCount > 1) || itemMoved;
+
+ data.WriteBit(IsMoneyEvent());
+ data.WriteBit(logGuid[4]);
+ data.WriteBit(logGuid[1]);
+ data.WriteBit(hasItem);
+ data.WriteBit(hasStack);
+ data.WriteBit(logGuid[2]);
+ data.WriteBit(logGuid[5]);
+ data.WriteBit(logGuid[3]);
+ data.WriteBit(logGuid[6]);
+ data.WriteBit(logGuid[0]);
+ data.WriteBit(itemMoved);
+ data.WriteBit(logGuid[7]);
+
+ content.WriteByteSeq(logGuid[6]);
+ content.WriteByteSeq(logGuid[1]);
+ content.WriteByteSeq(logGuid[5]);
+ if (hasStack)
+ content << uint32(m_itemStackCount);
+
+ content << uint8(m_eventType);
+ content.WriteByteSeq(logGuid[2]);
+ content.WriteByteSeq(logGuid[4]);
+ content.WriteByteSeq(logGuid[0]);
+ content.WriteByteSeq(logGuid[7]);
+ content.WriteByteSeq(logGuid[3]);
+ if (hasItem)
+ content << uint32(m_itemOrMoney);
+
+ content << uint32(time(NULL) - m_timestamp);
+
+ if (IsMoneyEvent())
+ content << uint64(m_itemOrMoney);
+
+ if (itemMoved)
+ content << uint8(m_destTabId);
}
///////////////////////////////////////////////////////////////////////////////
@@ -403,12 +475,12 @@ void Guild::BankTab::SetText(const std::string& text)
// Sets/removes contents of specified slot.
// If pItem == NULL contents are removed.
-bool Guild::BankTab::SetItem(SQLTransaction& trans, uint8 slotId, Item* pItem)
+bool Guild::BankTab::SetItem(SQLTransaction& trans, uint8 slotId, Item* item)
{
if (slotId >= GUILD_BANK_MAX_SLOTS)
return false;
- m_items[slotId] = pItem;
+ m_items[slotId] = item;
PreparedStatement* stmt = NULL;
@@ -418,28 +490,29 @@ bool Guild::BankTab::SetItem(SQLTransaction& trans, uint8 slotId, Item* pItem)
stmt->setUInt8 (2, slotId);
CharacterDatabase.ExecuteOrAppend(trans, stmt);
- if (pItem)
+ if (item)
{
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GUILD_BANK_ITEM);
stmt->setUInt32(0, m_guildId);
stmt->setUInt8 (1, m_tabId);
stmt->setUInt8 (2, slotId);
- stmt->setUInt32(3, pItem->GetGUIDLow());
+ stmt->setUInt32(3, item->GetGUIDLow());
CharacterDatabase.ExecuteOrAppend(trans, stmt);
- pItem->SetUInt64Value(ITEM_FIELD_CONTAINED, 0);
- pItem->SetUInt64Value(ITEM_FIELD_OWNER, 0);
- pItem->FSetState(ITEM_NEW);
- pItem->SaveToDB(trans); // Not in inventory and can be saved standalone
+ item->SetUInt64Value(ITEM_FIELD_CONTAINED, 0);
+ item->SetUInt64Value(ITEM_FIELD_OWNER, 0);
+ item->FSetState(ITEM_NEW);
+ item->SaveToDB(trans); // Not in inventory and can be saved standalone
}
return true;
}
-void Guild::BankTab::SendText(const Guild* guild, WorldSession* session) const
+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;
+ WorldPacket data(SMSG_GUILD_BANK_QUERY_TEXT_RESULT, 1 + m_text.size() + 1);
+ data.WriteBits(m_text.length(), 14);
+ data << uint32(m_tabId);
+ data.WriteString(m_text);
if (session)
session->SendPacket(&data);
@@ -1882,10 +1955,10 @@ void Guild::HandleGuildPartyRequest(WorldSession* session)
// Send data to client
void Guild::SendEventLog(WorldSession* session) const
{
- WorldPacket data(MSG_GUILD_EVENT_LOG_QUERY, 1 + m_eventLog->GetSize() * (1 + 8 + 4));
+ WorldPacket data(SMSG_GUILD_EVENT_LOG_QUERY_RESULT, 1 + m_eventLog->GetSize() * (1 + 8 + 4));
m_eventLog->WritePacket(data);
session->SendPacket(&data);
- sLog->outDebug(LOG_FILTER_GUILD, "WORLD: Sent (MSG_GUILD_EVENT_LOG_QUERY)");
+ sLog->outDebug(LOG_FILTER_GUILD, "WORLD: Sent (SMSG_GUILD_EVENT_LOG_QUERY_RESULT)");
}
void Guild::SendBankLog(WorldSession* session, uint8 tabId) const
@@ -1893,12 +1966,15 @@ 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)
{
- const LogHolder* pLog = m_bankEventLog[tabId];
- WorldPacket data(MSG_GUILD_BANK_LOG_QUERY, pLog->GetSize() * (4 * 4 + 1) + 1 + 1);
- data << uint8(tabId);
- pLog->WritePacket(data);
+ LogHolder const* log = m_bankEventLog[tabId];
+ WorldPacket data(SMSG_GUILD_BANK_LOG_QUERY_RESULT, log->GetSize() * (4 * 4 + 1) + 1 + 1);
+ data.WriteBit(GetLevel() >= 5 && tabId == GUILD_BANK_MAX_TABS); // has Cash Flow perk
+ log->WritePacket(data);
+ data << uint32(tabId);
+ //if (tabId == GUILD_BANK_MAX_TABS && hasCashFlow)
+ // data << uint64(cashFlowContribution);
session->SendPacket(&data);
- sLog->outDebug(LOG_FILTER_GUILD, "WORLD: Sent (MSG_GUILD_BANK_LOG_QUERY)");
+ sLog->outDebug(LOG_FILTER_GUILD, "WORLD: Sent (SMSG_GUILD_BANK_LOG_QUERY_RESULT) for tab %u", tabId);
}
}
@@ -1989,8 +2065,8 @@ void Guild::SendBankList(WorldSession* session, uint8 tabId, bool withContent, b
void Guild::SendBankTabText(WorldSession* session, uint8 tabId) const
{
- if (const BankTab* pTab = GetBankTab(tabId))
- pTab->SendText(this, session);
+ if (BankTab const* tab = GetBankTab(tabId))
+ tab->SendText(this, session);
}
void Guild::SendPermissions(WorldSession* session) const
@@ -2769,6 +2845,10 @@ void Guild::_LogBankEvent(SQLTransaction& trans, GuildBankEventLogTypes eventTyp
if (tabId > GUILD_BANK_MAX_TABS)
return;
+ // not logging moves within the same tab
+ if (eventType == GUILD_BANK_LOG_MOVE_ITEM && tabId == destTabId)
+ return;
+
uint8 dbTabId = tabId;
if (BankEventLogEntry::IsMoneyEvent(eventType))
{