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.cpp1268
1 files changed, 492 insertions, 776 deletions
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp
index 444aa00a8e6..955b1b6edac 100644
--- a/src/server/game/Guilds/Guild.cpp
+++ b/src/server/game/Guilds/Guild.cpp
@@ -35,56 +35,6 @@
#define MAX_GUILD_BANK_TAB_TEXT_LEN 500
#define EMBLEM_PRICE 10 * GOLD
-std::string _GetGuildEventString(GuildEvents event)
-{
- switch (event)
- {
- case GE_PROMOTION:
- return "Member promotion";
- case GE_DEMOTION:
- return "Member demotion";
- case GE_MOTD:
- return "Guild MOTD";
- case GE_JOINED:
- return "Member joined";
- case GE_LEFT:
- return "Member left";
- case GE_REMOVED:
- return "Member removed";
- case GE_LEADER_IS:
- return "Leader is";
- case GE_LEADER_CHANGED:
- return "Leader changed";
- case GE_DISBANDED:
- return "Guild disbanded";
- case GE_TABARDCHANGE:
- return "Tabard change";
- case GE_RANK_UPDATED:
- return "Rank updated";
- case GE_RANK_DELETED:
- return "Rank deleted";
- case GE_SIGNED_ON:
- return "Member signed on";
- case GE_SIGNED_OFF:
- return "Member signed off";
- case GE_GUILDBANKBAGSLOTS_CHANGED:
- return "Bank bag slots changed";
- case GE_BANK_TAB_PURCHASED:
- return "Bank tab purchased";
- case GE_BANK_TAB_UPDATED:
- return "Bank tab updated";
- case GE_BANK_MONEY_SET:
- return "Bank money set";
- case GE_BANK_TAB_AND_MONEY_UPDATED:
- return "Bank money changed";
- case GE_BANK_TEXT_CHANGED:
- return "Bank tab text changed";
- default:
- break;
- }
- return "<None>";
-}
-
inline uint32 _GetGuildBankTabPrice(uint8 tabId)
{
switch (tabId)
@@ -101,14 +51,11 @@ inline uint32 _GetGuildBankTabPrice(uint8 tabId)
void Guild::SendCommandResult(WorldSession* session, GuildCommandType type, GuildCommandError errCode, std::string const& param)
{
- // Note: SMSG_GUILD_COMMAND_RESULT and SMSG_GUILD_COMMAND_RESULT_2 do exactly the same in the client, they just have different structures.
- // There's no particular reason why we use SMSG_GUILD_COMMAND_RESULT_2, this one is processed inmediately as it is read from the client.
- // SMSG_GUILD_COMMAND_RESULT is a JAM opcode
- WorldPacket data(SMSG_GUILD_COMMAND_RESULT_2, 8 + param.size() + 1);
- data << uint32(type);
- data << param;
- data << uint32(errCode);
- session->SendPacket(&data);
+ WorldPackets::Guild::GuildCommandResult 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());
@@ -116,11 +63,11 @@ void Guild::SendCommandResult(WorldSession* session, GuildCommandType type, Guil
void Guild::SendSaveEmblemResult(WorldSession* session, GuildEmblemError errCode)
{
- WorldPacket data(SMSG_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", "SMSG_SAVE_GUILD_EMBLEM [%s] Code: %u", session->GetPlayerInfo().c_str(), errCode);
+ TC_LOG_DEBUG("guild", "Sent SMSG_SAVE_GUILD_EMBLEM [%s] Code: %u", session->GetPlayerInfo().c_str(), errCode);
}
// LogHolder
@@ -156,18 +103,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
-{
- ByteBuffer buffer;
- data.WriteBits(m_log.size(), 23);
- for (GuildLog::const_iterator itr = m_log.begin(); itr != m_log.end(); ++itr)
- (*itr)->WritePacket(data, buffer);
-
- data.FlushBits();
- data.append(buffer);
-}
-
inline uint32 Guild::LogHolder::GetNextGUID()
{
// Next guid was not initialized. It means there are no records for this holder in DB yet.
@@ -199,56 +134,18 @@ void Guild::EventLogEntry::SaveToDB(SQLTransaction& trans) const
CharacterDatabase.ExecuteOrAppend(trans, stmt);
}
-void Guild::EventLogEntry::WritePacket(WorldPacket& data, ByteBuffer& content) const
+void Guild::EventLogEntry::WritePacket(WorldPackets::Guild::GuildEventLogQueryResults& packet) const
{
- ObjectGuid guid1 = ObjectGuid::Create<HighGuid::Player>(m_playerGuid1);
- ObjectGuid guid2 = ObjectGuid::Create<HighGuid::Player>(m_playerGuid2);
+ ObjectGuid playerGUID = ObjectGuid::Create<HighGuid::Player>(m_playerGuid1);
+ ObjectGuid otherGUID = ObjectGuid::Create<HighGuid::Player>(m_playerGuid2);
- 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
- 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]);
+ WorldPackets::Guild::GuildEventEntry eventEntry;
+ eventEntry.PlayerGUID = playerGUID;
+ eventEntry.OtherGUID = otherGUID;
+ eventEntry.TransactionType = uint8(m_eventType);
+ eventEntry.TransactionDate = uint32(::time(NULL) - m_timestamp);
+ eventEntry.RankID = uint8(m_newRank);
+ packet.Entry.push_back(eventEntry);
}
// BankEventLogEntry
@@ -276,7 +173,7 @@ void Guild::BankEventLogEntry::SaveToDB(SQLTransaction& trans) const
CharacterDatabase.ExecuteOrAppend(trans, stmt);
}
-void Guild::BankEventLogEntry::WritePacket(WorldPacket& data, ByteBuffer& content) const
+void Guild::BankEventLogEntry::WritePacket(WorldPackets::Guild:: GuildBankLogQueryResults& packet) const
{
ObjectGuid logGuid = ObjectGuid::Create<HighGuid::Player>(m_playerGuid);
@@ -287,41 +184,24 @@ void Guild::BankEventLogEntry::WritePacket(WorldPacket& data, ByteBuffer& conten
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);
+ WorldPackets::Guild::GuildBankLogEntry bankLogEntry;
+ bankLogEntry.PlayerGUID = logGuid;
+ bankLogEntry.TimeOffset = int32(time(NULL) - m_timestamp);
+ bankLogEntry.EntryType = int8(m_eventType);
- content << uint32(time(NULL) - m_timestamp);
+ if (hasStack)
+ bankLogEntry.Count.Set(int32(m_itemStackCount));
if (IsMoneyEvent())
- content << uint64(m_itemOrMoney);
+ bankLogEntry.Money.Set(uint64(m_itemOrMoney));
+
+ if (hasItem)
+ bankLogEntry.ItemID.Set(int32(m_itemOrMoney));
if (itemMoved)
- content << uint8(m_destTabId);
+ bankLogEntry.OtherTab.Set(int8(m_destTabId));
+
+ packet.Entry.push_back(bankLogEntry);
}
void Guild::NewsLogEntry::SaveToDB(SQLTransaction& trans) const
@@ -338,39 +218,28 @@ void Guild::NewsLogEntry::SaveToDB(SQLTransaction& trans) const
CharacterDatabase.ExecuteOrAppend(trans, stmt);
}
-void Guild::NewsLogEntry::WritePacket(WorldPacket& data, ByteBuffer& /*content*/) const
+void Guild::NewsLogEntry::WritePacket(WorldPackets::Guild::GuildNews& newsPacket) const
{
- data.WriteBits(0, 26); // Not yet implemented used for guild achievements
- ObjectGuid guid = GetPlayerGuid();
-
- data.WriteBit(guid[7]);
- data.WriteBit(guid[0]);
- data.WriteBit(guid[6]);
- data.WriteBit(guid[5]);
- data.WriteBit(guid[4]);
- data.WriteBit(guid[3]);
- data.WriteBit(guid[1]);
- data.WriteBit(guid[2]);
+ WorldPackets::Guild::GuildNewsEvent newsEvent;
+ newsEvent.Id = int32(GetGUID());
+ newsEvent.MemberGuid = GetPlayerGuid();
+ newsEvent.CompletedDate = uint32(GetTimestamp());
+ newsEvent.Flags = int32(GetFlags());
+ newsEvent.Type = int32(GetType());
- data.FlushBits();
-
- data.WriteByteSeq(guid[5]);
+ //for (uint8 i = 0; i < 2; i++)
+ // newsEvent.Data[i] =
- data << uint32(GetFlags()); // 1 sticky
- data << uint32(GetValue());
- data << uint32(0); // always 0
+ //newsEvent.MemberList.push_back(MemberGuid);
- data.WriteByteSeq(guid[7]);
- data.WriteByteSeq(guid[6]);
- data.WriteByteSeq(guid[2]);
- data.WriteByteSeq(guid[3]);
- data.WriteByteSeq(guid[0]);
- data.WriteByteSeq(guid[4]);
- data.WriteByteSeq(guid[1]);
+ if (GetType() == GUILD_NEWS_ITEM_LOOTED || GetType() == GUILD_NEWS_ITEM_CRAFTED || GetType() == GUILD_NEWS_ITEM_PURCHASED)
+ {
+ WorldPackets::Item::ItemInstance itemInstance;
+ itemInstance.ItemID = GetValue();
+ newsEvent.Item.Set(itemInstance);
+ }
- data << uint32(GetGUID());
- data << uint32(GetType());
- data.AppendPackedTime(GetTimestamp());
+ newsPacket.NewsEvents.push_back(newsEvent);
}
// RankInfo
@@ -414,8 +283,8 @@ void Guild::RankInfo::CreateMissingTabsIfNeeded(uint8 tabs, SQLTransaction& tran
stmt->setUInt64(0, m_guildId);
stmt->setUInt8(1, i);
stmt->setUInt8(2, m_rankId);
- stmt->setUInt8(3, rightsAndSlots.GetRights());
- stmt->setUInt32(4, rightsAndSlots.GetSlots());
+ stmt->setInt8(3, rightsAndSlots.GetRights());
+ stmt->setInt32(4, rightsAndSlots.GetSlots());
trans->Append(stmt);
}
}
@@ -482,8 +351,8 @@ void Guild::RankInfo::SetBankTabSlotsAndRights(GuildBankRightsAndSlots rightsAnd
stmt->setUInt64(0, m_guildId);
stmt->setUInt8 (1, guildBR.GetTabId());
stmt->setUInt8 (2, m_rankId);
- stmt->setUInt8 (3, guildBR.GetRights());
- stmt->setUInt32(4, guildBR.GetSlots());
+ stmt->setInt8 (3, guildBR.GetRights());
+ stmt->setInt32 (4, guildBR.GetSlots());
CharacterDatabase.Execute(stmt);
}
}
@@ -613,21 +482,20 @@ bool Guild::BankTab::SetItem(SQLTransaction& trans, uint8 slotId, Item* item)
void Guild::BankTab::SendText(Guild const* guild, WorldSession* session) const
{
- WorldPacket data(SMSG_GUILD_BANK_QUERY_TEXT_RESULT, 1 + m_text.size() + 1);
- data.WriteBits(m_text.length(), 14);
- data << uint32(m_tabId);
- data.WriteString(m_text);
+ WorldPackets::Guild::GuildBankTextQueryResult textQuery;
+ textQuery.Tab = m_tabId;
+ textQuery.Text = m_text;
if (session)
{
TC_LOG_DEBUG("guild", "SMSG_GUILD_BANK_QUERY_TEXT_RESULT [%s]: Tabid: %u, Text: %s"
, session->GetPlayerInfo().c_str(), m_tabId, m_text.c_str());
- session->SendPacket(&data);
+ session->SendPacket(textQuery.Write());
}
else
{
TC_LOG_DEBUG("guild", "SMSG_GUILD_BANK_QUERY_TEXT_RESULT [Broadcast]: Tabid: %u, Text: %s", m_tabId, m_text.c_str());
- guild->BroadcastPacket(&data);
+ guild->BroadcastPacket(textQuery.Write());
}
}
@@ -637,16 +505,18 @@ void Guild::Member::SetStats(Player* player)
m_name = player->GetName();
m_level = player->getLevel();
m_class = player->getClass();
+ _gender = player->getGender();
m_zoneId = player->GetZoneId();
m_accountId = player->GetSession()->GetAccountId();
m_achievementPoints = player->GetAchievementPoints();
}
-void Guild::Member::SetStats(std::string const& name, uint8 level, uint8 _class, uint32 zoneId, uint32 accountId, uint32 reputation)
+void Guild::Member::SetStats(std::string const& name, uint8 level, uint8 _class, uint8 gender, uint32 zoneId, uint32 accountId, uint32 reputation)
{
m_name = name;
m_level = level;
m_class = _class;
+ _gender = gender;
m_zoneId = zoneId;
m_accountId = accountId;
m_totalReputation = reputation;
@@ -717,10 +587,11 @@ bool Guild::Member::LoadFromDB(Field* fields)
SetStats(fields[14].GetString(),
fields[15].GetUInt8(), // characters.level
fields[16].GetUInt8(), // characters.class
- fields[17].GetUInt16(), // characters.zone
- fields[18].GetUInt32(), // characters.account
+ fields[17].GetUInt8(), // characters.gender
+ fields[18].GetUInt16(), // characters.zone
+ fields[19].GetUInt32(), // characters.account
0);
- m_logoutTime = fields[19].GetUInt32(); // characters.logout_time
+ m_logoutTime = fields[20].GetUInt32(); // characters.logout_time
m_totalActivity = 0;
m_weekActivity = 0;
m_weekReputation = 0;
@@ -798,9 +669,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)
@@ -1159,9 +1034,7 @@ Guild::Guild():
m_eventLog(NULL),
m_newsLog(NULL),
m_achievementMgr(this),
- _level(1),
- _experience(0),
- _todayExperience(0)
+ _level(1)
{
memset(&m_bankEventLog, 0, (GUILD_BANK_MAX_TABS + 1) * sizeof(LogHolder*));
}
@@ -1209,8 +1082,6 @@ bool Guild::Create(Player* pLeader, std::string const& name)
m_bankMoney = 0;
m_createdDate = ::time(NULL);
_level = 1;
- _experience = 0;
- _todayExperience = 0;
_CreateLogHolders();
TC_LOG_DEBUG("guild", "GUILD: creating guild [%s] for leader %s (%s)",
@@ -1244,7 +1115,10 @@ bool Guild::Create(Player* pLeader, std::string const& name)
if (ret)
{
- _BroadcastEvent(GE_FOUNDER, ObjectGuid::Empty);
+ Member* leader = GetMember(m_leaderGuid);
+ if (leader)
+ SendEventNewLeader(leader, NULL);
+
sScriptMgr->OnGuildCreate(this, pLeader, name);
}
@@ -1257,7 +1131,9 @@ void Guild::Disband()
// Call scripts before guild data removed from database
sScriptMgr->OnGuildDisband(this);
- _BroadcastEvent(GE_DISBANDED, ObjectGuid::Empty);
+ WorldPackets::Guild::GuildEventDisbanded packet;
+ BroadcastPacket(packet.Write());
+
// Remove all members
while (!m_members.empty())
{
@@ -1309,13 +1185,6 @@ void Guild::SaveToDB()
{
SQLTransaction trans = CharacterDatabase.BeginTransaction();
- PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_EXPERIENCE);
- stmt->setUInt32(0, GetLevel());
- stmt->setUInt64(1, GetExperience());
- stmt->setUInt64(2, GetTodayExperience());
- stmt->setUInt64(3, GetId());
- trans->Append(stmt);
-
m_achievementMgr.SaveToDB(trans);
CharacterDatabase.CommitTransaction(trans);
@@ -1365,6 +1234,7 @@ bool Guild::SetName(std::string const& name)
stmt->setUInt64(1, GetId());
CharacterDatabase.Execute(stmt);
+ /* TODO 6.x update me
ObjectGuid guid = GetGUID();
WorldPacket data(SMSG_GUILD_NAME_CHANGED, 24 + 8 + 1);
data.WriteBit(guid[5]);
@@ -1387,93 +1257,56 @@ bool Guild::SetName(std::string const& name)
data.WriteByteSeq(guid[4]);
data.WriteByteSeq(guid[5]);
- BroadcastPacket(&data);
+ BroadcastPacket(&data); */
return true;
}
void Guild::HandleRoster(WorldSession* session)
{
- ByteBuffer memberData(100);
- // Guess size
- WorldPacket data(SMSG_GUILD_ROSTER, 100);
- data.WriteBits(m_motd.length(), 11);
- data.WriteBits(m_members.size(), 18);
+ WorldPackets::Guild::GuildRoster roster;
- for (Members::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
+ roster.NumAccounts = int32(m_accountsNumber);
+ roster.CreateDate = uint32(m_createdDate);
+ roster.GuildFlags = 0;
+
+ roster.MemberData.reserve(m_members.size());
+
+ for (auto itr : m_members)
{
- Member* member = itr->second;
- size_t pubNoteLength = member->GetPublicNote().length();
- size_t offNoteLength = member->GetOfficerNote().length();
-
- ObjectGuid guid = member->GetGUID();
- data.WriteBit(guid[3]);
- data.WriteBit(guid[4]);
- data.WriteBit(0); // Has Authenticator
- data.WriteBit(0); // Can Scroll of Ressurect
- data.WriteBits(pubNoteLength, 8);
- data.WriteBits(offNoteLength, 8);
- data.WriteBit(guid[0]);
- data.WriteBits(member->GetName().length(), 7);
- data.WriteBit(guid[1]);
- data.WriteBit(guid[2]);
- data.WriteBit(guid[6]);
- data.WriteBit(guid[5]);
- data.WriteBit(guid[7]);
-
- memberData << uint8(member->GetClass());
- memberData << uint32(member->GetTotalReputation());
- memberData.WriteByteSeq(guid[0]);
- memberData << uint64(member->GetWeekActivity());
- memberData << uint32(member->GetRankId());
- memberData << uint32(member->GetAchievementPoints());
-
- // for (2 professions)
- memberData << uint32(0) << uint32(0) << uint32(0);
- memberData << uint32(0) << uint32(0) << uint32(0);
-
- memberData.WriteByteSeq(guid[2]);
- memberData << uint8(member->GetFlags());
- memberData << uint32(member->GetZoneId());
- memberData << uint64(member->GetTotalActivity());
- memberData.WriteByteSeq(guid[7]);
- memberData << uint32(sWorld->getIntConfig(CONFIG_GUILD_WEEKLY_REP_CAP) - member->GetWeekReputation());
-
- if (pubNoteLength)
- memberData.WriteString(member->GetPublicNote());
-
- memberData.WriteByteSeq(guid[3]);
- memberData << uint8(member->GetLevel());
- memberData << int32(0); // unk
- memberData.WriteByteSeq(guid[5]);
- memberData.WriteByteSeq(guid[4]);
- memberData << uint8(0); // unk
- memberData.WriteByteSeq(guid[1]);
- memberData << float(member->IsOnline() ? 0.0f : float(::time(NULL) - member->GetLogoutTime()) / DAY);
-
- if (offNoteLength)
- memberData.WriteString(member->GetOfficerNote());
-
- memberData.WriteByteSeq(guid[6]);
- memberData.WriteString(member->GetName());
- }
-
- size_t infoLength = m_info.length();
- data.WriteBits(infoLength, 12);
-
- data.FlushBits();
- data.append(memberData);
-
- if (infoLength)
- data.WriteString(m_info);
-
- data.WriteString(m_motd);
- data << uint32(m_accountsNumber);
- data << uint32(sWorld->getIntConfig(CONFIG_GUILD_WEEKLY_REP_CAP));
- data.AppendPackedTime(m_createdDate);
- data << uint32(0);
+ Member* member = itr.second;
+
+ WorldPackets::Guild::GuildRosterMemberData memberData;
+
+ memberData.Guid = member->GetGUID();
+ memberData.RankID = int32(member->GetRankId());
+ memberData.AreaID = int32(member->GetZoneId());
+ memberData.PersonalAchievementPoints = int32(member->GetAchievementPoints());
+ memberData.GuildReputation = int32(member->GetTotalReputation());
+ memberData.LastSave = float(member->IsOnline() ? 0.0f : float(::time(NULL) - member->GetLogoutTime()) / DAY);
+
+ //GuildRosterProfessionData
+
+ memberData.VirtualRealmAddress = GetVirtualRealmAddress();
+ memberData.Status = member->GetFlags();
+ memberData.Level = member->GetLevel();
+ memberData.ClassID = member->GetClass();
+ memberData.Gender = member->GetGender();
+
+ memberData.Authenticated = false;
+ memberData.SorEligible = false;
+
+ memberData.Name = member->GetName();
+ memberData.Note = member->GetPublicNote();
+ memberData.OfficerNote = member->GetOfficerNote();
+
+ roster.MemberData.push_back(memberData);
+ }
+
+ 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::SendQueryResponse(WorldSession* session)
@@ -1506,10 +1339,9 @@ void Guild::SendQueryResponse(WorldSession* session)
void Guild::SendGuildRankInfo(WorldSession* session) const
{
- ByteBuffer rankData(100);
- WorldPacket data(SMSG_GUILD_RANKS, 100);
+ WorldPackets::Guild::GuildRanks ranks;
- data.WriteBits(_GetRanksSize(), 18);
+ ranks.Ranks.reserve(_GetRanksSize());
for (uint8 i = 0; i < _GetRanksSize(); i++)
{
@@ -1517,28 +1349,24 @@ void Guild::SendGuildRankInfo(WorldSession* session) const
if (!rankInfo)
continue;
- data.WriteBits(rankInfo->GetName().length(), 7);
+ WorldPackets::Guild::GuildRankData rankData;
- rankData << uint32(rankInfo->GetId());
+ rankData.RankID = uint32(rankInfo->GetId());
+ rankData.RankOrder = uint32(i);
+ rankData.Flags = rankInfo->GetRights();
+ rankData.WithdrawGoldLimit = uint32(rankInfo->GetBankMoneyPerDay());
+ rankData.RankName = rankInfo->GetName();
for (uint8 j = 0; j < GUILD_BANK_MAX_TABS; ++j)
{
- rankData << uint32(rankInfo->GetBankTabSlotsPerDay(j));
- rankData << uint32(rankInfo->GetBankTabRights(j));
+ rankData.TabFlags[j] = uint32(rankInfo->GetBankTabRights(j));
+ rankData.TabWithdrawItemLimit[j] = uint32(rankInfo->GetBankTabSlotsPerDay(j));
}
- rankData << uint32(rankInfo->GetBankMoneyPerDay());
- rankData << uint32(rankInfo->GetRights());
-
- if (rankInfo->GetName().length())
- rankData.WriteString(rankInfo->GetName());
-
- rankData << uint32(i);
+ ranks.Ranks.push_back(rankData);
}
- data.FlushBits();
- data.append(rankData);
- session->SendPacket(&data);
+ session->SendPacket(ranks.Write());
TC_LOG_DEBUG("guild", "SMSG_GUILD_RANK [%s]", session->GetPlayerInfo().c_str());
}
@@ -1589,7 +1417,7 @@ void Guild::HandleSetMOTD(WorldSession* session, std::string const& motd)
stmt->setUInt64(1, m_id);
CharacterDatabase.Execute(stmt);
- _BroadcastEvent(GE_MOTD, ObjectGuid::Empty, motd.c_str());
+ SendEventMOTD(session, true);
}
}
@@ -1646,7 +1474,8 @@ void Guild::HandleSetNewGuildMaster(WorldSession* session, std::string const& na
{
_SetLeaderGUID(newGuildMaster);
oldGuildMaster->ChangeRank(GR_INITIATE);
- _BroadcastEvent(GE_LEADER_CHANGED, ObjectGuid::Empty, player->GetName().c_str(), name.c_str());
+
+ SendEventNewLeader(newGuildMaster, oldGuildMaster);
}
}
}
@@ -1661,18 +1490,20 @@ void Guild::HandleSetBankTabInfo(WorldSession* session, uint8 tabId, std::string
return;
}
- char aux[2];
- sprintf(aux, "%u", tabId);
-
tab->SetInfo(name, icon);
- _BroadcastEvent(GE_BANK_TAB_UPDATED, ObjectGuid::Empty, aux, name.c_str(), icon.c_str());
+
+ WorldPackets::Guild::GuildEventTabModified packet;
+ packet.Tab = tabId;
+ packet.Name = name;
+ packet.Icon = icon;
+ BroadcastPacket(packet.Write());
}
void Guild::HandleSetMemberNote(WorldSession* session, std::string const& note, ObjectGuid guid, bool isPublic)
{
// Player must have rights to set public/officer note
- if (!_HasRankRight(session->GetPlayer(), isPublic ? GR_RIGHT_EPNOTE : GR_RIGHT_EOFFNOTE))
- SendCommandResult(session, GUILD_COMMAND_PUBLIC_NOTE, ERR_GUILD_PERMISSIONS);
+ if (!_HasRankRight(session->GetPlayer(), isPublic ? GR_RIGHT_EDIT_PUBLIC_NOTE : GR_RIGHT_EOFFNOTE))
+ SendCommandResult(session, GUILD_COMMAND_EDIT_PUBLIC_NOTE, ERR_GUILD_PERMISSIONS);
else if (Member* member = GetMember(guid))
{
if (isPublic)
@@ -1681,6 +1512,12 @@ void Guild::HandleSetMemberNote(WorldSession* session, std::string const& note,
member->SetOfficerNote(note);
HandleRoster(session); // FIXME - We should send SMSG_GUILD_MEMBER_UPDATE_NOTE
+
+ WorldPackets::Guild::GuildMemberUpdateNote updateNote;
+ updateNote.Member = guid;
+ updateNote.IsPublic = isPublic;
+ updateNote.Note = note;
+ session->SendPacket(updateNote.Write()); // @todo - Verify receiver of this packet...
}
}
@@ -1700,9 +1537,9 @@ void Guild::HandleSetRankInfo(WorldSession* session, uint8 rankId, std::string c
for (GuildBankRightsAndSlotsVec::const_iterator itr = rightsAndSlots.begin(); itr != rightsAndSlots.end(); ++itr)
_SetRankBankTabRightsAndSlots(rankId, *itr);
- char aux[2];
- sprintf(aux, "%u", rankId);
- _BroadcastEvent(GE_RANK_UPDATED, ObjectGuid::Empty, aux);
+ WorldPackets::Guild::GuildEventRankChanged packet;
+ packet.RankID = rankId;
+ BroadcastPacket(packet.Write());
}
}
@@ -1737,7 +1574,10 @@ void Guild::HandleBuyBankTab(WorldSession* session, uint8 tabId)
}
_CreateNewBankTab();
- _BroadcastEvent(GE_BANK_TAB_PURCHASED, ObjectGuid::Empty);
+
+ WorldPackets::Guild::GuildEventTabAdded packet;
+ BroadcastPacket(packet.Write());
+
SendPermissions(session); /// Hack to force client to update permissions
}
@@ -1746,7 +1586,7 @@ void Guild::HandleInviteMember(WorldSession* session, std::string const& name)
Player* pInvitee = ObjectAccessor::FindPlayerByName(name);
if (!pInvitee)
{
- SendCommandResult(session, GUILD_COMMAND_INVITE, ERR_GUILD_PLAYER_NOT_FOUND_S, name);
+ SendCommandResult(session, GUILD_COMMAND_INVITE_PLAYER, ERR_GUILD_PLAYER_NOT_FOUND_S, name);
return;
}
@@ -1757,100 +1597,62 @@ void Guild::HandleInviteMember(WorldSession* session, std::string const& name)
if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && pInvitee->GetTeam() != player->GetTeam())
{
- SendCommandResult(session, GUILD_COMMAND_INVITE, ERR_GUILD_NOT_ALLIED, name);
+ SendCommandResult(session, GUILD_COMMAND_INVITE_PLAYER, ERR_GUILD_NOT_ALLIED, name);
return;
}
// Invited player cannot be in another guild
/*if (pInvitee->GetGuildId())
{
- SendCommandResult(session, GUILD_COMMAND_INVITE, ERR_ALREADY_IN_GUILD_S, name);
+ SendCommandResult(session, GUILD_COMMAND_INVITE_PLAYER, ERR_ALREADY_IN_GUILD_S, name);
return;
}*/
// Invited player cannot be invited
if (pInvitee->GetGuildIdInvited())
{
- SendCommandResult(session, GUILD_COMMAND_INVITE, ERR_ALREADY_INVITED_TO_GUILD_S, name);
+ SendCommandResult(session, GUILD_COMMAND_INVITE_PLAYER, ERR_ALREADY_INVITED_TO_GUILD_S, name);
return;
}
+
// Inviting player must have rights to invite
if (!_HasRankRight(player, GR_RIGHT_INVITE))
{
- SendCommandResult(session, GUILD_COMMAND_INVITE, ERR_GUILD_PERMISSIONS);
+ SendCommandResult(session, GUILD_COMMAND_INVITE_PLAYER, ERR_GUILD_PERMISSIONS);
return;
}
- SendCommandResult(session, GUILD_COMMAND_INVITE, ERR_GUILD_COMMAND_SUCCESS, name);
+ SendCommandResult(session, GUILD_COMMAND_INVITE_PLAYER, ERR_GUILD_COMMAND_SUCCESS, name);
TC_LOG_DEBUG("guild", "Player %s invited %s to join his Guild", player->GetName().c_str(), name.c_str());
pInvitee->SetGuildIdInvited(m_id);
_LogEvent(GUILD_EVENT_LOG_INVITE_PLAYER, player->GetGUID().GetCounter(), pInvitee->GetGUID().GetCounter());
- WorldPacket data(SMSG_GUILD_INVITE, 100);
- data << uint32(GetLevel());
- data << uint32(m_emblemInfo.GetBorderStyle());
- data << uint32(m_emblemInfo.GetBorderColor());
- data << uint32(m_emblemInfo.GetStyle());
- data << uint32(m_emblemInfo.GetBackgroundColor());
- data << uint32(m_emblemInfo.GetColor());
-
- ObjectGuid oldGuildGuid;
- if (ObjectGuid::LowType oldId = pInvitee->GetGuildId())
- oldGuildGuid = ObjectGuid::Create<HighGuid::Guild>(oldId);
-
- ObjectGuid newGuildGuid = GetGUID();
-
- data.WriteBit(newGuildGuid[3]);
- data.WriteBit(newGuildGuid[2]);
- data.WriteBits(pInvitee->GetGuildName().length(), 8);
- data.WriteBit(newGuildGuid[1]);
- data.WriteBit(oldGuildGuid[6]);
- data.WriteBit(oldGuildGuid[4]);
- data.WriteBit(oldGuildGuid[1]);
- data.WriteBit(oldGuildGuid[5]);
- data.WriteBit(oldGuildGuid[7]);
- data.WriteBit(oldGuildGuid[2]);
- data.WriteBit(newGuildGuid[7]);
- data.WriteBit(newGuildGuid[0]);
- data.WriteBit(newGuildGuid[6]);
- data.WriteBits(m_name.length(), 8);
- data.WriteBit(oldGuildGuid[3]);
- data.WriteBit(oldGuildGuid[0]);
- data.WriteBit(newGuildGuid[5]);
- data.WriteBits(player->GetName().size(), 7);
- data.WriteBit(newGuildGuid[4]);
-
- data.FlushBits();
-
- data.WriteByteSeq(newGuildGuid[1]);
- data.WriteByteSeq(oldGuildGuid[3]);
- data.WriteByteSeq(newGuildGuid[6]);
- data.WriteByteSeq(oldGuildGuid[2]);
- data.WriteByteSeq(oldGuildGuid[1]);
- data.WriteByteSeq(newGuildGuid[0]);
-
- if (!pInvitee->GetGuildName().empty())
- data.WriteString(pInvitee->GetGuildName());
-
- data.WriteByteSeq(newGuildGuid[7]);
- data.WriteByteSeq(newGuildGuid[2]);
-
- data.WriteString(player->GetName());
-
- data.WriteByteSeq(oldGuildGuid[7]);
- data.WriteByteSeq(oldGuildGuid[6]);
- data.WriteByteSeq(oldGuildGuid[5]);
- data.WriteByteSeq(oldGuildGuid[0]);
- data.WriteByteSeq(newGuildGuid[4]);
-
- data.WriteString(m_name);
-
- data.WriteByteSeq(newGuildGuid[5]);
- data.WriteByteSeq(newGuildGuid[3]);
- data.WriteByteSeq(oldGuildGuid[4]);
- pInvitee->GetSession()->SendPacket(&data);
+ WorldPackets::Guild::GuildInvite invite;
+
+ invite.InviterVirtualRealmAddress = GetVirtualRealmAddress();
+ invite.GuildVirtualRealmAddress = GetVirtualRealmAddress();
+ invite.GuildGUID = GetGUID();
+
+ invite.EmblemStyle = uint32(m_emblemInfo.GetStyle());
+ invite.EmblemColor = uint32(m_emblemInfo.GetColor());
+ invite.BorderStyle = uint32(m_emblemInfo.GetBorderStyle());
+ invite.BorderColor = uint32(m_emblemInfo.GetBorderColor());
+ invite.Background = uint32(m_emblemInfo.GetBackgroundColor());
+ invite.Level = int32(GetLevel());
+
+ invite.InviterName = player->GetName();
+ invite.GuildName = GetName();
+
+ if (Guild* oldGuild = pInvitee->GetGuild())
+ {
+ invite.OldGuildGUID = oldGuild->GetGUID();
+ invite.OldGuildName = oldGuild->GetName();
+ invite.OldGuildVirtualRealmAddress = GetVirtualRealmAddress();
+ }
+
+ pInvitee->GetSession()->SendPacket(invite.Write());
TC_LOG_DEBUG("guild", "SMSG_GUILD_INVITE [%s]", pInvitee->GetName().c_str());
}
@@ -1874,9 +1676,9 @@ void Guild::HandleLeaveMember(WorldSession* session)
{
if (m_members.size() > 1)
// Leader cannot leave if he is not the last member
- SendCommandResult(session, GUILD_COMMAND_QUIT, ERR_GUILD_LEADER_LEAVE);
+ SendCommandResult(session, GUILD_COMMAND_LEAVE_GUILD, ERR_GUILD_LEADER_LEAVE);
else if (GetLevel() >= sWorld->getIntConfig(CONFIG_GUILD_UNDELETABLE_LEVEL))
- SendCommandResult(session, GUILD_COMMAND_QUIT, ERR_GUILD_UNDELETABLE_DUE_TO_LEVEL);
+ SendCommandResult(session, GUILD_COMMAND_LEAVE_GUILD, ERR_GUILD_UNDELETABLE_DUE_TO_LEVEL);
else
{
// Guild is disbanded if leader leaves.
@@ -1889,9 +1691,9 @@ void Guild::HandleLeaveMember(WorldSession* session)
DeleteMember(player->GetGUID(), false, false);
_LogEvent(GUILD_EVENT_LOG_LEAVE_GUILD, player->GetGUID().GetCounter());
- _BroadcastEvent(GE_LEFT, player->GetGUID(), player->GetName().c_str());
+ SendEventPlayerLeft(player);
- SendCommandResult(session, GUILD_COMMAND_QUIT, ERR_GUILD_COMMAND_SUCCESS, m_name);
+ SendCommandResult(session, GUILD_COMMAND_LEAVE_GUILD, ERR_GUILD_COMMAND_SUCCESS, m_name);
}
sCalendarMgr->RemovePlayerGuildEventsAndSignups(player->GetGUID(), GetId());
@@ -1906,27 +1708,30 @@ void Guild::HandleRemoveMember(WorldSession* session, ObjectGuid guid)
// Player must have rights to remove members
if (!_HasRankRight(player, GR_RIGHT_REMOVE))
- SendCommandResult(session, GUILD_COMMAND_REMOVE, ERR_GUILD_PERMISSIONS);
+ SendCommandResult(session, GUILD_COMMAND_REMOVE_PLAYER, ERR_GUILD_PERMISSIONS);
else if (Member* member = GetMember(guid))
{
std::string name = member->GetName();
// Guild masters cannot be removed
if (member->IsRank(GR_GUILDMASTER))
- SendCommandResult(session, GUILD_COMMAND_REMOVE, ERR_GUILD_LEADER_LEAVE);
+ SendCommandResult(session, GUILD_COMMAND_REMOVE_PLAYER, ERR_GUILD_LEADER_LEAVE);
// Do not allow to remove player with the same rank or higher
else
{
- Member const* memberMe = GetMember(player->GetGUID());
+ Member* memberMe = GetMember(player->GetGUID());
if (!memberMe || member->IsRankNotLower(memberMe->GetRankId()))
- SendCommandResult(session, GUILD_COMMAND_REMOVE, ERR_GUILD_RANK_TOO_HIGH_S, name);
+ SendCommandResult(session, GUILD_COMMAND_REMOVE_PLAYER, ERR_GUILD_RANK_TOO_HIGH_S, name);
else
{
// After call to DeleteMember pointer to member becomes invalid
DeleteMember(guid, false, true);
_LogEvent(GUILD_EVENT_LOG_UNINVITE_PLAYER, player->GetGUID().GetCounter(), guid.GetCounter());
- _BroadcastEvent(GE_REMOVED, ObjectGuid::Empty, name.c_str(), player->GetName().c_str());
- SendCommandResult(session, GUILD_COMMAND_REMOVE, ERR_GUILD_COMMAND_SUCCESS, name);
+
+ Player* pMember = ObjectAccessor::FindConnectedPlayer(guid);
+ SendEventPlayerLeft(pMember, player, true);
+
+ SendCommandResult(session, GUILD_COMMAND_REMOVE_PLAYER, ERR_GUILD_COMMAND_SUCCESS, name);
}
}
}
@@ -1935,7 +1740,7 @@ void Guild::HandleRemoveMember(WorldSession* session, ObjectGuid guid)
void Guild::HandleUpdateMemberRank(WorldSession* session, ObjectGuid guid, bool demote)
{
Player* player = session->GetPlayer();
- GuildCommandType type = demote ? GUILD_COMMAND_DEMOTE : GUILD_COMMAND_PROMOTE;
+ GuildCommandType type = demote ? GUILD_COMMAND_DEMOTE_PLAYER : GUILD_COMMAND_PROMOTE_PLAYER;
// Player must have rights to promote
if (!_HasRankRight(player, demote ? GR_RIGHT_DEMOTE : GR_RIGHT_PROMOTE))
SendCommandResult(session, type, ERR_GUILD_PERMISSIONS);
@@ -1982,7 +1787,7 @@ void Guild::HandleUpdateMemberRank(WorldSession* session, ObjectGuid guid, bool
uint32 newRankId = member->GetRankId() + (demote ? 1 : -1);
member->ChangeRank(newRankId);
_LogEvent(demote ? GUILD_EVENT_LOG_DEMOTE_PLAYER : GUILD_EVENT_LOG_PROMOTE_PLAYER, player->GetGUID().GetCounter(), member->GetGUID().GetCounter(), newRankId);
- _BroadcastEvent(demote ? GE_DEMOTION : GE_PROMOTION, ObjectGuid::Empty, player->GetName().c_str(), name.c_str(), _GetRankName(newRankId).c_str());
+ //_BroadcastEvent(demote ? GE_DEMOTION : GE_PROMOTION, ObjectGuid::Empty, player->GetName().c_str(), name.c_str(), _GetRankName(newRankId).c_str());
}
}
@@ -1993,12 +1798,12 @@ void Guild::HandleSetMemberRank(WorldSession* session, ObjectGuid targetGuid, Ob
if (!member)
return;
GuildRankRights rights = GR_RIGHT_PROMOTE;
- GuildCommandType type = GUILD_COMMAND_PROMOTE;
+ GuildCommandType type = GUILD_COMMAND_PROMOTE_PLAYER;
if (rank > member->GetRankId())
{
rights = GR_RIGHT_DEMOTE;
- type = GUILD_COMMAND_DEMOTE;
+ type = GUILD_COMMAND_DEMOTE_PLAYER;
}
// Promoted player must be a member of guild
@@ -2026,8 +1831,13 @@ void Guild::HandleAddNewRank(WorldSession* session, std::string const& name)
// Only leader can add new rank
if (_IsLeader(session->GetPlayer()))
+ {
if (_CreateRank(name, GR_RIGHT_GCHATLISTEN | GR_RIGHT_GCHATSPEAK))
- _BroadcastEvent(GE_RANK_CREATED, ObjectGuid::Empty);
+ {
+ WorldPackets::Guild::GuildEventRanksUpdated eventPacket;
+ BroadcastPacket(eventPacket.Write());
+ }
+ }
}
void Guild::HandleRemoveRank(WorldSession* session, uint8 rankId)
@@ -2041,6 +1851,7 @@ void Guild::HandleRemoveRank(WorldSession* session, uint8 rankId)
stmt->setUInt64(0, m_id);
stmt->setUInt8(1, rankId);
CharacterDatabase.Execute(stmt);
+
// Delete rank
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_RANK);
stmt->setUInt64(0, m_id);
@@ -2049,7 +1860,8 @@ void Guild::HandleRemoveRank(WorldSession* session, uint8 rankId)
m_ranks.erase(m_ranks.begin() + rankId);
- _BroadcastEvent(GE_RANK_DELETED, ObjectGuid::Empty, std::to_string(rankId).c_str());
+ WorldPackets::Guild::GuildEventRanksUpdated eventPacket;
+ BroadcastPacket(eventPacket.Write());
}
void Guild::HandleMemberDepositMoney(WorldSession* session, uint64 amount, bool cashFlow /*=false*/)
@@ -2070,8 +1882,7 @@ void Guild::HandleMemberDepositMoney(WorldSession* session, uint64 amount, bool
_LogBankEvent(trans, cashFlow ? GUILD_BANK_LOG_CASH_FLOW_DEPOSIT : GUILD_BANK_LOG_DEPOSIT_MONEY, uint8(0), player->GetGUID().GetCounter(), amount);
CharacterDatabase.CommitTransaction(trans);
- std::string aux = ByteArrayToHexStr(reinterpret_cast<uint8*>(&m_bankMoney), 8, true);
- _BroadcastEvent(GE_BANK_MONEY_SET, ObjectGuid::Empty, aux.c_str());
+ SendEventBankMoneyChanged();
if (player->GetSession()->HasPermission(rbac::RBAC_PERM_LOG_GM_TRADE))
{
@@ -2120,8 +1931,7 @@ bool Guild::HandleMemberWithdrawMoney(WorldSession* session, uint64 amount, bool
_LogBankEvent(trans, repair ? GUILD_BANK_LOG_REPAIR_MONEY : GUILD_BANK_LOG_WITHDRAW_MONEY, uint8(0), player->GetGUID().GetCounter(), amount);
CharacterDatabase.CommitTransaction(trans);
- std::string aux = ByteArrayToHexStr(reinterpret_cast<uint8*>(&m_bankMoney), 8, true);
- _BroadcastEvent(GE_BANK_MONEY_SET, ObjectGuid::Empty, aux.c_str());
+ SendEventBankMoneyChanged();
return true;
}
@@ -2134,18 +1944,18 @@ void Guild::HandleMemberLogout(WorldSession* session)
member->UpdateLogoutTime();
member->ResetFlags();
}
- _BroadcastEvent(GE_SIGNED_OFF, player->GetGUID(), player->GetName().c_str());
+ SendEventPresenceChanged(session, false, true);
SaveToDB();
}
-void Guild::HandleDisband(WorldSession* session)
+void Guild::HandleDelete(WorldSession* session)
{
// Only leader can disband guild
if (_IsLeader(session->GetPlayer()))
{
Disband();
- TC_LOG_DEBUG("guild", "Guild Successfully Disbanded");
+ TC_LOG_DEBUG("guild", "%s successfully deleted", GetGUID().ToString().c_str());
delete this;
}
}
@@ -2159,99 +1969,74 @@ void Guild::HandleGuildPartyRequest(WorldSession* session)
if (!IsMember(player->GetGUID()) || !group)
return;
- WorldPacket data(SMSG_GUILD_PARTY_STATE_RESPONSE, 13);
- data.WriteBit(player->GetMap()->GetOwnerGuildId(player->GetTeam()) == GetId()); // Is guild group
- data.FlushBits();
- data << float(0.f); // Guild XP multiplier
- data << uint32(0); // Current guild members
- data << uint32(0); // Needed guild members
+ WorldPackets::Guild::GuildPartyState partyStateResponse;
+ partyStateResponse.InGuildParty = (player->GetMap()->GetOwnerGuildId(player->GetTeam()) == GetId());
+ partyStateResponse.NumMembers = 0;
+ partyStateResponse.NumRequired = 0;
+ partyStateResponse.GuildXPEarnedMult = 0.0f;
+ session->SendPacket(partyStateResponse.Write());
- session->SendPacket(&data);
TC_LOG_DEBUG("guild", "SMSG_GUILD_PARTY_STATE_RESPONSE [%s]", session->GetPlayerInfo().c_str());
}
void Guild::HandleGuildRequestChallengeUpdate(WorldSession* session)
{
- WorldPacket data(SMSG_GUILD_CHALLENGE_UPDATED, 4 * GUILD_CHALLENGES_TYPES * 5);
-
- for (int i = 0; i < GUILD_CHALLENGES_TYPES; ++i)
- data << uint32(GuildChallengeXPReward[i]);
+ WorldPackets::Guild::GuildChallengeUpdate updatePacket;
for (int i = 0; i < GUILD_CHALLENGES_TYPES; ++i)
- data << uint32(GuildChallengeGoldReward[i]);
+ updatePacket.CurrentCount[i] = int32(0); /// @todo current count
for (int i = 0; i < GUILD_CHALLENGES_TYPES; ++i)
- data << uint32(GuildChallengesPerWeek[i]);
+ updatePacket.MaxCount[i] = int32(GuildChallengesMaxCount[i]);
for (int i = 0; i < GUILD_CHALLENGES_TYPES; ++i)
- data << uint32(GuildChallengeMaxLevelGoldReward[i]);
+ updatePacket.MaxLevelGold[i] = int32(GuildChallengeMaxLevelGoldReward[i]);
for (int i = 0; i < GUILD_CHALLENGES_TYPES; ++i)
- data << uint32(0); /// @todo current count
+ updatePacket.Gold[i] = int32(GuildChallengeGoldReward[i]);
- session->SendPacket(&data);
+ session->SendPacket(updatePacket.Write());
}
void Guild::SendEventLog(WorldSession* session) const
{
- WorldPacket data(SMSG_GUILD_EVENT_LOG_QUERY_RESULTS, 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 = (EventLogEntry*)(*itr);
+ eventLog->WritePacket(packet);
+ }
+
+ session->SendPacket(packet.Write());
+
TC_LOG_DEBUG("guild", "SMSG_GUILD_EVENT_LOG_QUERY_RESULT [%s]", session->GetPlayerInfo().c_str());
}
void Guild::SendNewsUpdate(WorldSession* session)
{
- uint32 size = m_newsLog->GetSize();
GuildLog* logs = m_newsLog->GetGuildLog();
if (!logs)
return;
- WorldPacket data(SMSG_GUILD_NEWS_UPDATE, (21 + size * (26 + 8)) / 8 + (8 + 6 * 4) * size);
- data.WriteBits(size, 21);
+ WorldPackets::Guild::GuildNews packet;
+ packet.NewsEvents.reserve(m_newsLog->GetSize());
for (GuildLog::const_iterator itr = logs->begin(); itr != logs->end(); ++itr)
{
- data.WriteBits(0, 26); // Not yet implemented used for guild achievements
- ObjectGuid guid = ((NewsLogEntry*)(*itr))->GetPlayerGuid();
-
- data.WriteBit(guid[7]);
- data.WriteBit(guid[0]);
- data.WriteBit(guid[6]);
- data.WriteBit(guid[5]);
- data.WriteBit(guid[4]);
- data.WriteBit(guid[3]);
- data.WriteBit(guid[1]);
- data.WriteBit(guid[2]);
+ NewsLogEntry* eventLog = (NewsLogEntry*)(*itr);
+ eventLog->WritePacket(packet);
}
- data.FlushBits();
-
- for (GuildLog::const_iterator itr = logs->begin(); itr != logs->end(); ++itr)
- {
- NewsLogEntry* news = (NewsLogEntry*)(*itr);
- ObjectGuid guid = news->GetPlayerGuid();
- data.WriteByteSeq(guid[5]);
-
- data << uint32(news->GetFlags()); // 1 sticky
- data << uint32(news->GetValue());
- data << uint32(0);
-
- data.WriteByteSeq(guid[7]);
- data.WriteByteSeq(guid[6]);
- data.WriteByteSeq(guid[2]);
- data.WriteByteSeq(guid[3]);
- data.WriteByteSeq(guid[0]);
- data.WriteByteSeq(guid[4]);
- data.WriteByteSeq(guid[1]);
-
- data << uint32(news->GetGUID());
- data << uint32(news->GetType());
- data.AppendPackedTime(news->GetTimestamp());
- }
+ session->SendPacket(packet.Write());
- session->SendPacket(&data);
TC_LOG_DEBUG("guild", "SMSG_GUILD_NEWS_UPDATE [%s]", session->GetPlayerInfo().c_str());
}
@@ -2260,14 +2045,26 @@ 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* 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);
+ GuildLog* logs = m_bankEventLog[tabId]->GetGuildLog();
+
+ if (!logs)
+ return;
+
+ WorldPackets::Guild::GuildBankLogQueryResults packet;
+ packet.Tab = int32(tabId);
+
//if (tabId == GUILD_BANK_MAX_TABS && hasCashFlow)
- // data << uint64(cashFlowContribution);
- session->SendPacket(&data);
+ // packet.WeeklyBonusMoney.Set(uint64(weeklyBonusMoney));
+
+ packet.Entry.reserve(m_bankEventLog[tabId]->GetSize());
+ for (GuildLog::const_iterator itr = logs->begin(); itr != logs->end(); ++itr)
+ {
+ BankEventLogEntry* bankEventLog = (BankEventLogEntry*)(*itr);
+ bankEventLog->WritePacket(packet);
+ }
+
+ session->SendPacket(packet.Write());
+
TC_LOG_DEBUG("guild", "SMSG_GUILD_BANK_LOG_QUERY_RESULT [%s] TabId: %u", session->GetPlayerInfo().c_str(), tabId);
}
}
@@ -2286,19 +2083,22 @@ void Guild::SendPermissions(WorldSession* session) const
uint8 rankId = member->GetRankId();
- WorldPacket data(SMSG_GUILD_PERMISSIONS_QUERY_RESULTS, 4 * 15 + 1);
- data << uint32(rankId);
- data << uint32(_GetPurchasedTabsSize());
- data << uint32(_GetRankRights(rankId));
- data << uint32(_GetMemberRemainingMoney(member));
- data.WriteBits(GUILD_BANK_MAX_TABS, 23);
+ WorldPackets::Guild::GuildPermissionsQueryResults queryResult;
+ queryResult.RankID = rankId;
+ queryResult.WithdrawGoldLimit = _GetMemberRemainingMoney(member);
+ queryResult.Flags = _GetRankRights(rankId);
+ queryResult.NumTabs = _GetPurchasedTabsSize();
+ queryResult.Tab.reserve(GUILD_BANK_MAX_TABS);
+
for (uint8 tabId = 0; tabId < GUILD_BANK_MAX_TABS; ++tabId)
{
- data << uint32(_GetRankBankTabRights(rankId, tabId));
- data << uint32(_GetMemberRemainingSlots(member, tabId));
+ WorldPackets::Guild::GuildPermissionsQueryResults::GuildRankTabPermissions tabPerm;
+ tabPerm.Flags = _GetRankBankTabRights(rankId, tabId);
+ tabPerm.WithdrawItemLimit = _GetMemberRemainingSlots(member, tabId);
+ queryResult.Tab.push_back(tabPerm);
}
- session->SendPacket(&data);
+ session->SendPacket(queryResult.Write());
TC_LOG_DEBUG("guild", "SMSG_GUILD_PERMISSIONS_QUERY_RESULTS [%s] Rank: %u", session->GetPlayerInfo().c_str(), rankId);
}
@@ -2309,9 +2109,11 @@ void Guild::SendMoneyInfo(WorldSession* session) const
return;
int32 amount = _GetMemberRemainingMoney(member);
- WorldPacket data(SMSG_GUILD_BANK_MONEY_WITHDRAWN, 8);
- data << int64(amount);
- session->SendPacket(&data);
+
+ WorldPackets::Guild::GuildBankRemainingWithdrawMoney packet;
+ packet.RemainingWithdrawMoney = int64(amount);
+ session->SendPacket(packet.Write());
+
TC_LOG_DEBUG("guild", "SMSG_GUILD_BANK_MONEY_WITHDRAWN [%s] Money: %u", session->GetPlayerInfo().c_str(), amount);
}
@@ -2324,53 +2126,111 @@ void Guild::SendLoginInfo(WorldSession* session)
/*
Login sequence:
- SMSG_GUILD_EVENT - GE_MOTD
+ SMSG_GUILD_EVENT_MOTD
SMSG_GUILD_RANK
- SMSG_GUILD_EVENT - GE_SIGNED_ON
+ SMSG_GUILD_EVENT_PRESENCE_CHANGE - LoggedOn: True
-- learn perks
- SMSG_GUILD_REPUTATION_WEEKLY_CAP
- SMSG_GUILD_ACHIEVEMENT_DATA
+ SMSG_ALL_GUILD_ACHIEVEMENTS
SMSG_GUILD_MEMBER_DAILY_RESET // bank withdrawal reset
*/
- WorldPacket data(SMSG_GUILD_EVENT, 1 + 1 + m_motd.size() + 1);
- data << uint8(GE_MOTD);
- data << uint8(1);
- data << m_motd;
- session->SendPacket(&data);
-
- TC_LOG_DEBUG("guild", "SMSG_GUILD_EVENT [%s] MOTD", session->GetPlayerInfo().c_str());
-
+ SendEventMOTD(session);
SendGuildRankInfo(session);
- _BroadcastEvent(GE_SIGNED_ON, player->GetGUID(), player->GetName().c_str());
+ SendEventPresenceChanged(session, true, true); // Broadcast
// Send to self separately, player is not in world yet and is not found by _BroadcastEvent
- data.Initialize(SMSG_GUILD_EVENT, 1 + 1 + player->GetName().size() + 8);
- data << uint8(GE_SIGNED_ON);
- data << uint8(1);
- data << player->GetName();
- data << player->GetGUID();
- session->SendPacket(&data);
+ SendEventPresenceChanged(session, true);
- data.Initialize(SMSG_GUILD_MEMBER_DAILY_RESET, 0); // tells the client to request bank withdrawal limit
- session->SendPacket(&data);
-
- if (!sWorld->getBoolConfig(CONFIG_GUILD_LEVELING_ENABLED))
- return;
+ if (member->GetGUID() == GetLeaderGUID())
+ {
+ WorldPackets::Guild::GuildFlaggedForRename renameFlag;
+ renameFlag.FlagSet = false;
+ player->GetSession()->SendPacket(renameFlag.Write());
+ }
for (uint32 i = 0; i < sGuildPerkSpellsStore.GetNumRows(); ++i)
if (GuildPerkSpellsEntry const* entry = sGuildPerkSpellsStore.LookupEntry(i))
if (entry->GuildLevel <= GetLevel())
player->LearnSpell(entry->SpellID, true);
- SendGuildReputationWeeklyCap(session, member->GetWeekReputation());
-
m_achievementMgr.SendAllAchievementData(player);
+ WorldPackets::Guild::GuildMemberDailyReset packet; // tells the client to request bank withdrawal limit
+ player->GetSession()->SendPacket(packet.Write());
+
member->SetStats(player);
member->AddFlag(GUILDMEMBER_STATUS_ONLINE);
}
+void Guild::SendEventBankMoneyChanged()
+{
+ WorldPackets::Guild::GuildEventBankMoneyChanged eventPacket;
+ eventPacket.Money = GetBankMoney();
+ BroadcastPacket(eventPacket.Write());
+}
+
+void Guild::SendEventMOTD(WorldSession* session, bool broadcast)
+{
+ WorldPackets::Guild::GuildEventMotd eventPacket;
+ eventPacket.MotdText = GetMOTD();
+
+ if (broadcast)
+ BroadcastPacket(eventPacket.Write());
+ else
+ {
+ session->SendPacket(eventPacket.Write());
+ TC_LOG_DEBUG("guild", "SMSG_GUILD_EVENT_MOTD [%s] ", session->GetPlayerInfo().c_str());
+ }
+}
+
+void Guild::SendEventNewLeader(Member* newLeader, Member* oldLeader, bool isSelfPromoted)
+{
+ WorldPackets::Guild::GuildEventNewLeader eventPacket;
+ eventPacket.SelfPromoted = isSelfPromoted;
+ eventPacket.NewLeaderGUID = newLeader->GetGUID();
+ eventPacket.NewLeaderName = newLeader->GetName();
+ eventPacket.NewLeaderVirtualRealmAddress = GetVirtualRealmAddress();
+ eventPacket.OldLeaderGUID = oldLeader->GetGUID();
+ eventPacket.OldLeaderName = oldLeader->GetName();
+ eventPacket.OldLeaderVirtualRealmAddress = GetVirtualRealmAddress();
+ BroadcastPacket(eventPacket.Write());
+}
+
+void Guild::SendEventPlayerLeft(Player* leaver, Player* remover, bool isRemoved)
+{
+ WorldPackets::Guild::GuildEventPlayerLeft eventPacket;
+ eventPacket.Removed = isRemoved;
+ eventPacket.LeaverGUID = leaver->GetGUID();
+ eventPacket.LeaverName = leaver->GetName();
+ eventPacket.LeaverVirtualRealmAddress = GetVirtualRealmAddress();
+
+ if (isRemoved)
+ {
+ eventPacket.RemoverGUID = remover->GetGUID();
+ eventPacket.RemoverName = remover->GetName();
+ eventPacket.RemoverVirtualRealmAddress = GetVirtualRealmAddress();
+ }
+
+ BroadcastPacket(eventPacket.Write());
+}
+
+void Guild::SendEventPresenceChanged(WorldSession* session, bool loggedOn, bool broadcast)
+{
+ Player* player = session->GetPlayer();
+
+ WorldPackets::Guild::GuildEventPresenceChange eventPacket;
+ eventPacket.Guid = player->GetGUID();
+ eventPacket.Name = player->GetName();
+ eventPacket.VirtualRealmAddress = GetVirtualRealmAddress();
+ eventPacket.LoggedOn = loggedOn;
+ eventPacket.Mobile = false;
+
+ if (broadcast)
+ BroadcastPacket(eventPacket.Write());
+ else
+ session->SendPacket(eventPacket.Write());
+}
+
// Loading methods
bool Guild::LoadFromDB(Field* fields)
{
@@ -2383,10 +2243,8 @@ bool Guild::LoadFromDB(Field* fields)
m_createdDate = time_t(fields[10].GetUInt32());
m_bankMoney = fields[11].GetUInt64();
_level = fields[12].GetUInt32();
- _experience = fields[13].GetUInt64();
- _todayExperience = fields[14].GetUInt64();
- uint8 purchasedTabs = uint8(fields[15].GetUInt64());
+ uint8 purchasedTabs = uint8(fields[13].GetUInt64());
if (purchasedTabs > GUILD_BANK_MAX_TABS)
purchasedTabs = GUILD_BANK_MAX_TABS;
@@ -2424,8 +2282,8 @@ bool Guild::LoadMemberFromDB(Field* fields)
void Guild::LoadBankRightFromDB(Field* fields)
{
- // tabId rights slots
- GuildBankRightsAndSlots rightsAndSlots(fields[1].GetUInt8(), fields[3].GetUInt8(), fields[4].GetUInt32());
+ // tabId rights slots
+ GuildBankRightsAndSlots rightsAndSlots(fields[1].GetUInt8(), fields[3].GetInt8(), fields[4].GetInt32());
// rankId
_SetRankBankTabRightsAndSlots(fields[2].GetUInt8(), rightsAndSlots, false);
}
@@ -2698,7 +2556,7 @@ bool Guild::AddMember(ObjectGuid guid, uint8 rankId)
// Remove all player signs from another petitions
// This will be prevent attempt to join many guilds and corrupt guild data integrity
- Player::RemovePetitionsAndSigns(guid, GUILD_CHARTER_TYPE);
+ Player::RemovePetitionsAndSigns(guid);
ObjectGuid::LowType lowguid = guid.GetCounter();
@@ -2734,8 +2592,9 @@ bool Guild::AddMember(ObjectGuid guid, uint8 rankId)
name,
fields[1].GetUInt8(),
fields[2].GetUInt8(),
- fields[3].GetUInt16(),
- fields[4].GetUInt32(),
+ fields[3].GetUInt8(),
+ fields[4].GetUInt16(),
+ fields[5].GetUInt32(),
0);
ok = member->CheckStats();
@@ -2754,7 +2613,13 @@ bool Guild::AddMember(ObjectGuid guid, uint8 rankId)
_UpdateAccountsNumber();
_LogEvent(GUILD_EVENT_LOG_JOIN_GUILD, lowguid);
- _BroadcastEvent(GE_JOINED, guid, name.c_str());
+
+ WorldPackets::Guild::GuildEventPlayerJoined joinNotificationPacket;
+ joinNotificationPacket.Guid = guid;
+ joinNotificationPacket.Name = name;
+ joinNotificationPacket.VirtualRealmAddress = GetVirtualRealmAddress();
+ BroadcastPacket(joinNotificationPacket.Write());
+
sGuildFinderMgr->RemoveAllMembershipRequestsFromPlayer(guid);
// Call scripts if member was succesfully added (and stored to database)
@@ -2798,8 +2663,8 @@ void Guild::DeleteMember(ObjectGuid guid, bool isDisbanding, bool isKicked, bool
// If leader does not exist (at guild loading with deleted leader) do not send broadcasts
if (oldLeader)
{
- _BroadcastEvent(GE_LEADER_CHANGED, ObjectGuid::Empty, oldLeader->GetName().c_str(), newLeader->GetName().c_str());
- _BroadcastEvent(GE_LEFT, guid, oldLeader->GetName().c_str());
+ SendEventNewLeader(newLeader, oldLeader, true);
+ SendEventPlayerLeft(player);
}
}
// Call script on remove before member is actually removed from guild (and database)
@@ -2879,6 +2744,10 @@ void Guild::SetBankTabText(uint8 tabId, std::string const& text)
{
pTab->SetText(text);
pTab->SendText(this, NULL);
+
+ WorldPackets::Guild::GuildEventTabTextChanged eventPacket;
+ eventPacket.Tab = tabId;
+ BroadcastPacket(eventPacket.Write());
}
}
@@ -3115,7 +2984,7 @@ inline void Guild::_UpdateMemberWithdrawSlots(SQLTransaction& trans, ObjectGuid
}
}
-inline bool Guild::_MemberHasTabRights(ObjectGuid guid, uint8 tabId, uint32 rights) const
+inline bool Guild::_MemberHasTabRights(ObjectGuid guid, uint8 tabId, int32 rights) const
{
if (const Member* member = GetMember(guid))
{
@@ -3313,111 +3182,98 @@ 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
+ WorldPackets::Guild::GuildBankQueryResults packet;
+ packet.FullUpdate = true; // @todo
+ packet.Tab = int32(tabId);
+ packet.Money = m_bankMoney;
for (SlotIds::const_iterator itr = slots.begin(); itr != slots.end(); ++itr)
{
- data.WriteBit(0);
-
Item const* tabItem = tab->GetItem(*itr);
- uint32 enchantCount = 0;
+
+ WorldPackets::Guild::GuildBankItemInfo itemInfo;
+
+ itemInfo.Slot = int32(*itr);
+ itemInfo.Item.ItemID = int32(tabItem ? tabItem->GetEntry() : 0);
+ itemInfo.Count = int32(tabItem ? tabItem->GetCount() : 0);
+ itemInfo.Charges = int32(tabItem ? abs(tabItem->GetSpellCharges()) : 0);
+ itemInfo.OnUseEnchantmentID = 0/*int32(tabItem->GetItemSuffixFactor())*/;
+ itemInfo.Flags = 0;
+ itemInfo.Locked = false;
+
if (tabItem)
{
- for (uint32 enchSlot = 0; enchSlot < MAX_ENCHANTMENT_SLOT; ++enchSlot)
+ uint32 enchants = 0;
+ for (uint32 ench = 0; ench < MAX_ENCHANTMENT_SLOT; ++ench)
+ if (uint32 enchantId = tabItem->GetEnchantmentId(EnchantmentSlot(ench)))
+ ++enchants;
+
+ itemInfo.SocketEnchant.reserve(enchants);
+ for (uint32 ench = 0; ench < MAX_ENCHANTMENT_SLOT; ++ench)
{
- if (uint32 enchantId = tabItem->GetEnchantmentId(EnchantmentSlot(enchSlot)))
+ if (uint32 enchantId = tabItem->GetEnchantmentId(EnchantmentSlot(ench)))
{
- tabData << uint32(enchantId);
- tabData << uint32(enchSlot);
- ++enchantCount;
+ WorldPackets::Guild::GuildBankItemInfo::GuildBankSocketEnchant socketEnchant;
+ socketEnchant.SocketEnchantID = int32(enchantId);
+ socketEnchant.SocketIndex = int32(ench);
+ itemInfo.SocketEnchant.push_back(socketEnchant);
}
}
}
- 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
+ packet.ItemInfo.push_back(itemInfo);
}
- data.FlushBits();
-
- data << uint64(m_bankMoney);
- if (!tabData.empty())
- data.append(tabData);
-
- data << uint32(tabId);
-
- size_t rempos = data.wpos();
- data << uint32(0); // Item withdraw amount, will be filled later
-
for (Members::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
if (_MemberHasTabRights(itr->second->GetGUID(), tabId, GUILD_BANK_RIGHT_VIEW_TAB))
if (Player* player = itr->second->FindPlayer())
{
- data.put<uint32>(rempos, uint32(_GetMemberRemainingSlots(itr->second, tabId)));
- player->GetSession()->SendPacket(&data);
+ packet.WithdrawalsRemaining = int32(_GetMemberRemainingSlots(itr->second, tabId));
+ player->GetSession()->SendPacket(packet.Write());
}
- TC_LOG_DEBUG("guild", "WORLD: Sent (SMSG_GUILD_BANK_LIST)");
+ TC_LOG_DEBUG("guild", "WORLD: Sent SMSG_GUILD_BANK_QUERY_RESULTS");
}
}
-void Guild::_BroadcastEvent(GuildEvents guildEvent, ObjectGuid guid, const char* param1, const char* param2, const char* 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.IsEmpty())
- data << guid;
-
- BroadcastPacket(&data);
-
- if (sLog->ShouldLog("guild", LOG_LEVEL_DEBUG))
- TC_LOG_DEBUG("guild", "SMSG_GUILD_EVENT [Broadcast] Event: %s (%u)", _GetGuildEventString(guildEvent).c_str(), guildEvent);
-}
-
-void Guild::SendBankList(WorldSession* session, uint8 tabId, bool withContent, bool withTabInfo) const
+void Guild::SendBankList(WorldSession* session, uint8 tabId, bool fullUpdate) const
{
Member const* member = GetMember(session->GetPlayer()->GetGUID());
if (!member) // Shouldn't happen, just in case
return;
- ByteBuffer tabData;
- WorldPacket data(SMSG_GUILD_BANK_LIST, 500);
- data.WriteBit(0);
+ WorldPackets::Guild::GuildBankQueryResults packet;
+
+ packet.Money = uint64(m_bankMoney);
+ packet.WithdrawalsRemaining = int32(_GetMemberRemainingSlots(member, tabId));
+ packet.Tab = int32(tabId);
+ packet.FullUpdate = fullUpdate;
+
+ // TabInfo
+ if (fullUpdate)
+ {
+ packet.TabInfo.reserve(_GetPurchasedTabsSize());
+ for (uint8 i = 0; i < _GetPurchasedTabsSize(); ++i)
+ {
+ WorldPackets::Guild::GuildBankTabInfo tabInfo;
+ tabInfo.TabIndex = i;
+ tabInfo.Name = m_bankTabs[i]->GetName();
+ tabInfo.Icon = m_bankTabs[i]->GetIcon();
+ packet.TabInfo.push_back(tabInfo);
+ }
+ }
+
+ // ItemInfo
uint32 itemCount = 0;
- if (withContent && _MemberHasTabRights(session->GetPlayer()->GetGUID(), tabId, GUILD_BANK_RIGHT_VIEW_TAB))
+ if (fullUpdate && _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 (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))
+ packet.ItemInfo.reserve(itemCount);
+
+ if (fullUpdate && _MemberHasTabRights(session->GetPlayer()->GetGUID(), tabId, GUILD_BANK_RIGHT_VIEW_TAB))
{
if (BankTab const* tab = GetBankTab(tabId))
{
@@ -3425,67 +3281,44 @@ void Guild::SendBankList(WorldSession* session, uint8 tabId, bool withContent, b
{
if (Item* tabItem = tab->GetItem(slotId))
{
- data.WriteBit(0);
+ WorldPackets::Guild::GuildBankItemInfo itemInfo;
+
+ itemInfo.Slot = int32(slotId);
+ itemInfo.Item.ItemID = tabItem->GetEntry();
+ itemInfo.Count = int32(tabItem->GetCount());
+ itemInfo.Charges = int32(abs(tabItem->GetSpellCharges()));
+ itemInfo.EnchantmentID = int32(tabItem->GetItemRandomPropertyId()); // verify that...
+ itemInfo.OnUseEnchantmentID = 0/*int32(tabItem->GetItemSuffixFactor())*/;
+ itemInfo.Flags = 0;
uint32 enchants = 0;
for (uint32 ench = 0; ench < MAX_ENCHANTMENT_SLOT; ++ench)
+ if (uint32 enchantId = tabItem->GetEnchantmentId(EnchantmentSlot(ench)))
+ ++enchants;
+
+ itemInfo.SocketEnchant.reserve(enchants);
+ for (uint32 ench = 0; ench < MAX_ENCHANTMENT_SLOT; ++ench)
{
if (uint32 enchantId = tabItem->GetEnchantmentId(EnchantmentSlot(ench)))
{
- tabData << uint32(enchantId);
- tabData << uint32(ench);
- ++enchants;
+ WorldPackets::Guild::GuildBankItemInfo::GuildBankSocketEnchant socketEnchant;
+ socketEnchant.SocketEnchantID = int32(enchantId);
+ socketEnchant.SocketIndex = int32(ench);
+ itemInfo.SocketEnchant.push_back(socketEnchant);
}
}
- 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
+ itemInfo.Locked = false;
+
+ packet.ItemInfo.push_back(itemInfo);
}
}
}
}
- if (withTabInfo)
- {
- for (uint8 i = 0; i < _GetPurchasedTabsSize(); ++i)
- {
- data.WriteBits(m_bankTabs[i]->GetIcon().length(), 9);
- data.WriteBits(m_bankTabs[i]->GetName().length(), 7);
- }
- }
-
- data.FlushBits();
+ session->SendPacket(packet.Write());
- 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);
- if (!tabData.empty())
- data.append(tabData);
-
- data << uint32(tabId);
- data << uint32(_GetMemberRemainingSlots(member, tabId));
-
- session->SendPacket(&data);
-
- TC_LOG_DEBUG("guild", "WORLD: Sent (SMSG_GUILD_BANK_LIST)");
+ TC_LOG_DEBUG("guild", "WORLD: Sent SMSG_GUILD_BANK_QUERY_RESULTS");
}
void Guild::SendGuildRanksUpdate(ObjectGuid setterGuid, ObjectGuid targetGuid, uint32 rank)
@@ -3493,45 +3326,12 @@ void Guild::SendGuildRanksUpdate(ObjectGuid setterGuid, ObjectGuid targetGuid, u
Member* member = GetMember(targetGuid);
ASSERT(member);
- WorldPacket data(SMSG_GUILD_SEND_RANK_CHANGE, 100);
- data.WriteBit(setterGuid[7]);
- data.WriteBit(setterGuid[2]);
- data.WriteBit(targetGuid[2]);
- data.WriteBit(setterGuid[1]);
- data.WriteBit(targetGuid[1]);
- data.WriteBit(targetGuid[7]);
- data.WriteBit(targetGuid[0]);
- data.WriteBit(targetGuid[5]);
- data.WriteBit(targetGuid[4]);
- data.WriteBit(rank < member->GetRankId()); // 1 == higher, 0 = lower?
- data.WriteBit(setterGuid[5]);
- data.WriteBit(setterGuid[0]);
- data.WriteBit(targetGuid[6]);
- data.WriteBit(setterGuid[3]);
- data.WriteBit(setterGuid[6]);
- data.WriteBit(targetGuid[3]);
- data.WriteBit(setterGuid[4]);
-
- data.FlushBits();
-
- data << uint32(rank);
- data.WriteByteSeq(setterGuid[3]);
- data.WriteByteSeq(targetGuid[7]);
- data.WriteByteSeq(setterGuid[6]);
- data.WriteByteSeq(setterGuid[2]);
- data.WriteByteSeq(targetGuid[5]);
- data.WriteByteSeq(targetGuid[0]);
- data.WriteByteSeq(setterGuid[7]);
- data.WriteByteSeq(setterGuid[5]);
- data.WriteByteSeq(targetGuid[2]);
- data.WriteByteSeq(targetGuid[1]);
- data.WriteByteSeq(setterGuid[0]);
- data.WriteByteSeq(setterGuid[4]);
- data.WriteByteSeq(setterGuid[1]);
- data.WriteByteSeq(targetGuid[3]);
- data.WriteByteSeq(targetGuid[6]);
- data.WriteByteSeq(targetGuid[4]);
- BroadcastPacket(&data);
+ WorldPackets::Guild::GuildSendRankChange rankChange;
+ rankChange.Officer = setterGuid;
+ rankChange.Other = targetGuid;
+ rankChange.RankID = rank;
+ rankChange.Promote = (rank < member->GetRankId());
+ BroadcastPacket(rankChange.Write());
member->ChangeRank(rank);
@@ -3539,96 +3339,15 @@ void Guild::SendGuildRanksUpdate(ObjectGuid setterGuid, ObjectGuid targetGuid, u
targetGuid.ToString().c_str(), setterGuid.ToString().c_str(), rank);
}
-void Guild::GiveXP(uint32 xp, Player* source)
-{
- if (!sWorld->getBoolConfig(CONFIG_GUILD_LEVELING_ENABLED))
- return;
-
- /// @todo: Award reputation and count activity for player
-
- if (GetLevel() >= sWorld->getIntConfig(CONFIG_GUILD_MAX_LEVEL))
- xp = 0; // SMSG_GUILD_XP_GAIN is always sent, even for no gains
-
- if (GetLevel() < GUILD_EXPERIENCE_UNCAPPED_LEVEL)
- xp = std::min(xp, sWorld->getIntConfig(CONFIG_GUILD_DAILY_XP_CAP) - uint32(_todayExperience));
-
- WorldPacket data(SMSG_GUILD_XP_GAIN, 8);
- data << uint64(xp);
- source->GetSession()->SendPacket(&data);
-
- _experience += xp;
- _todayExperience += xp;
-
- if (!xp)
- return;
-
- uint32 oldLevel = GetLevel();
-
- // Ding, mon!
- while (GetExperience() >= sGuildMgr->GetXPForGuildLevel(GetLevel()) && GetLevel() < sWorld->getIntConfig(CONFIG_GUILD_MAX_LEVEL))
- {
- _experience -= sGuildMgr->GetXPForGuildLevel(GetLevel());
- ++_level;
-
- // Find all guild perks to learn
- std::vector<uint32> perksToLearn;
- for (uint32 i = 0; i < sGuildPerkSpellsStore.GetNumRows(); ++i)
- if (GuildPerkSpellsEntry const* entry = sGuildPerkSpellsStore.LookupEntry(i))
- if (entry->GuildLevel > oldLevel && entry->GuildLevel <= GetLevel())
- perksToLearn.push_back(entry->SpellID);
-
- // Notify all online players that guild level changed and learn perks
- for (Members::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
- {
- if (Player* player = itr->second->FindPlayer())
- {
- player->SetGuildLevel(GetLevel());
- for (size_t i = 0; i < perksToLearn.size(); ++i)
- player->LearnSpell(perksToLearn[i], true);
- }
- }
-
- AddGuildNews(GUILD_NEWS_LEVEL_UP, ObjectGuid::Empty, 0, _level);
- UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_GUILD_LEVEL, GetLevel(), 0, 0, NULL, source);
-
- ++oldLevel;
- }
-}
-
-void Guild::SendGuildXP(WorldSession* session /* = NULL */) const
-{
- //Member const* member = GetMember(session->GetGuidLow());
-
- WorldPacket data(SMSG_GUILD_XP, 40);
- data << uint64(/*member ? member->GetTotalActivity() :*/ 0);
- data << uint64(sGuildMgr->GetXPForGuildLevel(GetLevel()) - GetExperience()); // XP missing for next level
- data << uint64(GetTodayExperience());
- data << uint64(/*member ? member->GetWeeklyActivity() :*/ 0);
- data << uint64(GetExperience());
- session->SendPacket(&data);
-}
-
-void Guild::SendGuildReputationWeeklyCap(WorldSession* session, uint32 reputation) const
-{
- uint32 cap = sWorld->getIntConfig(CONFIG_GUILD_WEEKLY_REP_CAP) - reputation;
- WorldPacket data(SMSG_GUILD_REPUTATION_WEEKLY_CAP, 4);
- data << uint32(cap);
- session->SendPacket(&data);
- TC_LOG_DEBUG("guild", "SMSG_GUILD_REPUTATION_WEEKLY_CAP [%s]: Left: %u",
- session->GetPlayerInfo().c_str(), cap);
-}
-
void Guild::ResetTimes(bool weekly)
{
- _todayExperience = 0;
for (Members::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
{
itr->second->ResetValues(weekly);
if (Player* player = itr->second->FindPlayer())
{
- //SendGuildXP(player->GetSession());
- WorldPacket data(SMSG_GUILD_MEMBER_DAILY_RESET, 0); // tells the client to request bank withdrawal limit
- player->GetSession()->SendPacket(&data);
+ WorldPackets::Guild::GuildMemberDailyReset packet; // tells the client to request bank withdrawal limit
+ player->GetSession()->SendPacket(packet.Write());
}
}
}
@@ -3641,12 +3360,10 @@ void Guild::AddGuildNews(uint8 type, ObjectGuid guid, uint32 flags, uint32 value
m_newsLog->AddEvent(trans, news);
CharacterDatabase.CommitTransaction(trans);
- WorldPacket data(SMSG_GUILD_NEWS_UPDATE, 7 + 32);
- data.WriteBits(1, 21); // size, we are only sending 1 news here
- ByteBuffer buffer;
- news->WritePacket(data, buffer);
-
- BroadcastPacket(&data);
+ WorldPackets::Guild::GuildNews newsPacket;
+ newsPacket.NewsEvents.reserve(1);
+ news->WritePacket(newsPacket);
+ BroadcastPacket(newsPacket.Write());
}
bool Guild::HasAchieved(uint32 achievementId) const
@@ -3676,12 +3393,11 @@ void Guild::HandleNewsSetSticky(WorldSession* session, uint32 newsId, bool stick
NewsLogEntry* news = (NewsLogEntry*)(*itr);
news->SetSticky(sticky);
- TC_LOG_DEBUG("guild", "HandleNewsSetSticky: [%s] chenged newsId %u sticky to %u",
+ TC_LOG_DEBUG("guild", "HandleNewsSetSticky: [%s] changed newsId %u sticky to %u",
session->GetPlayerInfo().c_str(), newsId, sticky);
- WorldPacket data(SMSG_GUILD_NEWS_UPDATE, 7 + 32);
- data.WriteBits(1, 21);
- ByteBuffer buffer;
- news->WritePacket(data, buffer);
- session->SendPacket(&data);
+ WorldPackets::Guild::GuildNews newsPacket;
+ newsPacket.NewsEvents.reserve(1);
+ news->WritePacket(newsPacket);
+ session->SendPacket(newsPacket.Write());
}