aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Guilds/Guild.cpp
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2020-09-09 20:38:04 +0200
committerGitHub <noreply@github.com>2020-09-09 20:38:04 +0200
commitcd28423a4e813baf6833f38c93613a7f82a721f8 (patch)
treef8461904532942d916e71b1822319d1a7e1ad691 /src/server/game/Guilds/Guild.cpp
parent4f636b80e4942c4c9c4811496d1c1b77f767378d (diff)
[3.3.5] Core/Guilds: Guild cleanup (PR #25422)
Diffstat (limited to 'src/server/game/Guilds/Guild.cpp')
-rw-r--r--src/server/game/Guilds/Guild.cpp454
1 files changed, 199 insertions, 255 deletions
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp
index 3b93c021878..43e06277b64 100644
--- a/src/server/game/Guilds/Guild.cpp
+++ b/src/server/game/Guilds/Guild.cpp
@@ -102,7 +102,7 @@ inline uint32 GetGuildBankTabPrice(uint8 tabId)
return tabPrices[tabId];
}
-void Guild::SendCommandResult(WorldSession* session, GuildCommandType type, GuildCommandError errCode, std::string const& param)
+void Guild::SendCommandResult(WorldSession* session, GuildCommandType type, GuildCommandError errCode, std::string_view param)
{
WorldPackets::Guild::GuildCommandResult resultPacket;
resultPacket.Command = type;
@@ -111,7 +111,7 @@ void Guild::SendCommandResult(WorldSession* session, GuildCommandType type, Guil
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());
+ , session->GetPlayerInfo().c_str(), type, errCode, resultPacket.Name.c_str());
}
void Guild::SendSaveEmblemResult(WorldSession* session, GuildEmblemError errCode)
@@ -124,39 +124,34 @@ void Guild::SendSaveEmblemResult(WorldSession* session, GuildEmblemError errCode
}
// LogHolder
-Guild::LogHolder::~LogHolder()
-{
- // Cleanup
- for (auto itr = m_log.begin(); itr != m_log.end(); ++itr)
- delete (*itr);
-}
+template <typename Entry>
+Guild::LogHolder<Entry>::LogHolder()
+ : m_maxRecords(sWorld->getIntConfig(std::is_same_v<Entry, BankEventLogEntry> ? CONFIG_GUILD_BANK_EVENT_LOG_COUNT : CONFIG_GUILD_EVENT_LOG_COUNT)), m_nextGUID(uint32(GUILD_EVENT_LOG_GUID_UNDEFINED))
+{ }
-// Adds event loaded from database to collection
-inline void Guild::LogHolder::LoadEvent(LogEntry* entry)
+template <typename Entry> template <typename... Ts>
+void Guild::LogHolder<Entry>::LoadEvent(Ts&&... args)
{
+ Entry const& newEntry = m_log.emplace_front(std::forward<Ts>(args)...);
if (m_nextGUID == uint32(GUILD_EVENT_LOG_GUID_UNDEFINED))
- m_nextGUID = entry->GetGUID();
- m_log.push_front(entry);
+ m_nextGUID = newEntry.GetGUID();
}
-// Adds new event happened in game.
-// If maximum number of events is reached, oldest event is removed from collection.
-inline void Guild::LogHolder::AddEvent(CharacterDatabaseTransaction& trans, LogEntry* entry)
+template <typename Entry> template <typename... Ts>
+void Guild::LogHolder<Entry>::AddEvent(CharacterDatabaseTransaction trans, Ts&&... args)
{
// Check max records limit
- if (m_log.size() >= m_maxRecords)
- {
- LogEntry* oldEntry = m_log.front();
- delete oldEntry;
+ if (!CanInsert())
m_log.pop_front();
- }
+
// Add event to list
- m_log.push_back(entry);
+ Entry const& entry = m_log.emplace_back(std::forward<Ts>(args)...);
// Save to DB
- entry->SaveToDB(trans);
+ entry.SaveToDB(trans);
}
-inline uint32 Guild::LogHolder::GetNextGUID()
+template <typename Entry>
+inline uint32 Guild::LogHolder<Entry>::GetNextGUID()
{
// Next guid was not initialized. It means there are no records for this holder in DB yet.
// Start from the beginning.
@@ -303,7 +298,7 @@ void Guild::RankInfo::CreateMissingTabsIfNeeded(uint8 tabs, CharacterDatabaseTra
}
}
-void Guild::RankInfo::SetName(std::string const& name)
+void Guild::RankInfo::SetName(std::string_view name)
{
if (m_name == name)
return;
@@ -373,9 +368,7 @@ void Guild::RankInfo::SetBankTabSlotsAndRights(GuildBankRightsAndSlots rightsAnd
// BankTab
Guild::BankTab::BankTab(ObjectGuid::LowType guildId, uint8 tabId) : m_guildId(guildId), m_tabId(tabId)
-{
- memset(m_items, 0, GUILD_BANK_MAX_SLOTS * sizeof(Item*));
-}
+{ }
void Guild::BankTab::LoadFromDB(Field* fields)
{
@@ -438,9 +431,9 @@ void Guild::BankTab::Delete(CharacterDatabaseTransaction& trans, bool removeItem
}
}
-void Guild::BankTab::SetInfo(std::string const& name, std::string const& icon)
+void Guild::BankTab::SetInfo(std::string_view name, std::string_view icon)
{
- if (m_name == name && m_icon == icon)
+ if ((m_name == name) && (m_icon == icon))
return;
m_name = name;
@@ -454,7 +447,7 @@ void Guild::BankTab::SetInfo(std::string const& name, std::string const& icon)
CharacterDatabase.Execute(stmt);
}
-void Guild::BankTab::SetText(std::string const& text)
+void Guild::BankTab::SetText(std::string_view text)
{
if (m_text == text)
return;
@@ -533,9 +526,7 @@ Guild::Member::Member(ObjectGuid::LowType guildId, ObjectGuid guid, uint8 rankId
m_logoutTime(GameTime::GetGameTime()),
m_accountId(0),
m_rankId(rankId)
-{
- memset(m_bankWithdraw, 0, (GUILD_BANK_MAX_TABS + 1) * sizeof(int32));
-}
+{}
void Guild::Member::SetStats(Player* player)
{
@@ -547,7 +538,7 @@ void Guild::Member::SetStats(Player* player)
m_accountId = player->GetSession()->GetAccountId();
}
-void Guild::Member::SetStats(std::string const& name, uint8 level, uint8 _class, uint8 gender, uint32 zoneId, uint32 accountId)
+void Guild::Member::SetStats(std::string_view name, uint8 level, uint8 _class, uint8 gender, uint32 zoneId, uint32 accountId)
{
m_name = name;
m_level = level;
@@ -557,7 +548,7 @@ void Guild::Member::SetStats(std::string const& name, uint8 level, uint8 _class,
m_accountId = accountId;
}
-void Guild::Member::SetPublicNote(std::string const& publicNote)
+void Guild::Member::SetPublicNote(std::string_view publicNote)
{
if (m_publicNote == publicNote)
return;
@@ -565,12 +556,12 @@ void Guild::Member::SetPublicNote(std::string const& publicNote)
m_publicNote = publicNote;
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_MEMBER_PNOTE);
- stmt->setString(0, publicNote);
+ stmt->setString(0, m_publicNote);
stmt->setUInt32(1, m_guid.GetCounter());
CharacterDatabase.Execute(stmt);
}
-void Guild::Member::SetOfficerNote(std::string const& officerNote)
+void Guild::Member::SetOfficerNote(std::string_view officerNote)
{
if (m_officerNote == officerNote)
return;
@@ -578,7 +569,7 @@ void Guild::Member::SetOfficerNote(std::string const& officerNote)
m_officerNote = officerNote;
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_MEMBER_OFFNOTE);
- stmt->setString(0, officerNote);
+ stmt->setString(0, m_officerNote);
stmt->setUInt32(1, m_guid.GetCounter());
CharacterDatabase.Execute(stmt);
}
@@ -588,7 +579,7 @@ void Guild::Member::ChangeRank(CharacterDatabaseTransaction trans, uint8 newRank
m_rankId = newRank;
// Update rank information in player's field, if he is online.
- if (Player* player = FindPlayer())
+ if (Player* player = FindConnectedPlayer())
player->SetRank(newRank);
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_MEMBER_RANK);
@@ -879,7 +870,7 @@ bool Guild::BankMoveItemData::HasWithdrawRights(MoveItemData* pOther) const
int32 slots = 0;
if (Member const* member = m_pGuild->GetMember(m_pPlayer->GetGUID()))
- slots = m_pGuild->_GetMemberRemainingSlots(member, m_container);
+ slots = m_pGuild->_GetMemberRemainingSlots(*member, m_container);
return slots != 0;
}
@@ -1081,36 +1072,18 @@ Guild::Guild():
m_leaderGuid(),
m_createdDate(0),
m_accountsNumber(0),
- m_bankMoney(0),
- m_eventLog(nullptr)
+ m_bankMoney(0)
{
- memset(&m_bankEventLog, 0, (GUILD_BANK_MAX_TABS + 1) * sizeof(LogHolder*));
}
Guild::~Guild()
{
CharacterDatabaseTransaction temp(nullptr);
_DeleteBankItems(temp);
-
- // Cleanup
- delete m_eventLog;
- m_eventLog = nullptr;
-
- for (uint8 tabId = 0; tabId <= GUILD_BANK_MAX_TABS; ++tabId)
- {
- delete m_bankEventLog[tabId];
- m_bankEventLog[tabId] = nullptr;
- }
-
- for (auto itr = m_members.begin(); itr != m_members.end(); ++itr)
- {
- delete itr->second;
- itr->second = nullptr;
- }
}
// Creates new guild with default data and saves it to database.
-bool Guild::Create(Player* pLeader, std::string const& name)
+bool Guild::Create(Player* pLeader, std::string_view name)
{
// Check if guild with such name already exists
if (sGuildMgr->GetGuildByName(name))
@@ -1127,10 +1100,9 @@ bool Guild::Create(Player* pLeader, std::string const& name)
m_motd = "No message set.";
m_bankMoney = 0;
m_createdDate = GameTime::GetGameTime();
- _CreateLogHolders();
TC_LOG_DEBUG("guild", "GUILD: creating guild [%s] for leader %s %s",
- name.c_str(), pLeader->GetName().c_str(), m_leaderGuid.ToString().c_str());
+ m_name.c_str(), pLeader->GetName().c_str(), m_leaderGuid.ToString().c_str());
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
@@ -1141,7 +1113,7 @@ bool Guild::Create(Player* pLeader, std::string const& name)
uint8 index = 0;
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GUILD);
stmt->setUInt32( index, m_id);
- stmt->setString(++index, name);
+ stmt->setString(++index, m_name);
stmt->setUInt32(++index, m_leaderGuid.GetCounter());
stmt->setString(++index, m_info);
stmt->setString(++index, m_motd);
@@ -1160,7 +1132,7 @@ bool Guild::Create(Player* pLeader, std::string const& name)
CharacterDatabase.CommitTransaction(trans);
if (ret)
- sScriptMgr->OnGuildCreate(this, pLeader, name);
+ sScriptMgr->OnGuildCreate(this, pLeader, m_name);
return ret;
}
@@ -1178,7 +1150,7 @@ void Guild::Disband()
while (!m_members.empty())
{
auto itr = m_members.begin();
- DeleteMember(trans, itr->second->GetGUID(), true);
+ DeleteMember(trans, itr->second.GetGUID(), true);
}
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD);
@@ -1246,7 +1218,7 @@ void Guild::OnPlayerStatusChange(Player* player, uint32 flag, bool state)
}
}
-bool Guild::SetName(std::string const& name)
+bool Guild::SetName(std::string_view name)
{
if (m_name == name || name.empty() || name.length() > 24 || sObjectMgr->IsReservedName(name) || !ObjectMgr::IsValidCharterName(name))
return false;
@@ -1277,26 +1249,24 @@ void Guild::HandleRoster(WorldSession* session)
}
bool sendOfficerNote = _HasRankRight(session->GetPlayer(), GR_RIGHT_VIEWOFFNOTE);
- for (std::pair<uint32 const, Member*> const& itr : m_members)
+ for (auto const& [guid, member] : m_members)
{
- Member* member = itr.second;
-
WorldPackets::Guild::GuildRosterMemberData& memberData = roster.MemberData.emplace_back();
- memberData.Guid = member->GetGUID();
- memberData.RankID = int32(member->GetRankId());
- memberData.AreaID = int32(member->GetZoneId());
- memberData.LastSave = float(float(GameTime::GetGameTime() - member->GetLogoutTime()) / DAY);
+ memberData.Guid = member.GetGUID();
+ memberData.RankID = int32(member.GetRankId());
+ memberData.AreaID = int32(member.GetZoneId());
+ memberData.LastSave = float(float(GameTime::GetGameTime() - member.GetLogoutTime()) / DAY);
- memberData.Status = member->GetFlags();
- memberData.Level = member->GetLevel();
- memberData.ClassID = member->GetClass();
- memberData.Gender = member->GetGender();
+ memberData.Status = member.GetFlags();
+ memberData.Level = member.GetLevel();
+ memberData.ClassID = member.GetClass();
+ memberData.Gender = member.GetGender();
- memberData.Name = member->GetName();
- memberData.Note = member->GetPublicNote();
+ memberData.Name = member.GetName();
+ memberData.Note = member.GetPublicNote();
if (sendOfficerNote)
- memberData.OfficerNote = member->GetOfficerNote();
+ memberData.OfficerNote = member.GetOfficerNote();
}
roster.WelcomeText = m_motd;
@@ -1328,7 +1298,7 @@ void Guild::HandleQuery(WorldSession* session)
TC_LOG_DEBUG("guild", "SMSG_GUILD_QUERY_RESPONSE [%s]", session->GetPlayerInfo().c_str());
}
-void Guild::HandleSetMOTD(WorldSession* session, std::string const& motd)
+void Guild::HandleSetMOTD(WorldSession* session, std::string_view motd)
{
if (m_motd == motd)
return;
@@ -1340,18 +1310,18 @@ void Guild::HandleSetMOTD(WorldSession* session, std::string const& motd)
{
m_motd = motd;
- sScriptMgr->OnGuildMOTDChanged(this, motd);
+ sScriptMgr->OnGuildMOTDChanged(this, m_motd);
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_MOTD);
- stmt->setString(0, motd);
+ stmt->setString(0, m_motd);
stmt->setUInt32(1, m_id);
CharacterDatabase.Execute(stmt);
- _BroadcastEvent(GE_MOTD, ObjectGuid::Empty, motd.c_str());
+ _BroadcastEvent(GE_MOTD, ObjectGuid::Empty, m_motd);
}
}
-void Guild::HandleSetInfo(WorldSession* session, std::string const& info)
+void Guild::HandleSetInfo(WorldSession* session, std::string_view info)
{
if (m_info == info)
return;
@@ -1361,10 +1331,10 @@ void Guild::HandleSetInfo(WorldSession* session, std::string const& info)
{
m_info = info;
- sScriptMgr->OnGuildInfoChanged(this, info);
+ sScriptMgr->OnGuildInfoChanged(this, m_info);
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_INFO);
- stmt->setString(0, info);
+ stmt->setString(0, m_info);
stmt->setUInt32(1, m_id);
CharacterDatabase.Execute(stmt);
}
@@ -1390,7 +1360,7 @@ void Guild::HandleSetEmblem(WorldSession* session, EmblemInfo const& emblemInfo)
}
}
-void Guild::HandleSetLeader(WorldSession* session, std::string const& name)
+void Guild::HandleSetLeader(WorldSession* session, std::string_view name)
{
Player* player = session->GetPlayer();
// Only leader can assign new leader
@@ -1402,16 +1372,16 @@ void Guild::HandleSetLeader(WorldSession* session, std::string const& name)
// New leader must be a member of guild
if (Member* pNewLeader = GetMember(name))
{
- _SetLeaderGUID(pNewLeader);
+ _SetLeaderGUID(*pNewLeader);
CharacterDatabaseTransaction trans(nullptr);
pOldLeader->ChangeRank(trans, GR_OFFICER);
- _BroadcastEvent(GE_LEADER_CHANGED, ObjectGuid::Empty, player->GetName().c_str(), name.c_str());
+ _BroadcastEvent(GE_LEADER_CHANGED, ObjectGuid::Empty, player->GetName(), pNewLeader->GetName());
}
}
}
-void Guild::HandleSetBankTabInfo(WorldSession* session, uint8 tabId, std::string const& name, std::string const& icon)
+void Guild::HandleSetBankTabInfo(WorldSession* session, uint8 tabId, std::string_view name, std::string_view icon)
{
BankTab* tab = GetBankTab(tabId);
if (!tab)
@@ -1422,10 +1392,10 @@ void Guild::HandleSetBankTabInfo(WorldSession* session, uint8 tabId, std::string
}
tab->SetInfo(name, icon);
- _BroadcastEvent(GE_BANK_TAB_UPDATED, ObjectGuid::Empty, std::to_string(tabId).c_str(), name.c_str(), icon.c_str());
+ _BroadcastEvent(GE_BANK_TAB_UPDATED, ObjectGuid::Empty, std::to_string(tabId), tab->GetName(), tab->GetIcon());
}
-void Guild::HandleSetMemberNote(WorldSession* session, std::string const& name, std::string const& note, bool officer)
+void Guild::HandleSetMemberNote(WorldSession* session, std::string_view name, std::string_view note, bool officer)
{
// Player must have rights to set public/officer note
if (!_HasRankRight(session->GetPlayer(), officer ? GR_RIGHT_EOFFNOTE : GR_RIGHT_EPNOTE))
@@ -1441,15 +1411,13 @@ void Guild::HandleSetMemberNote(WorldSession* session, std::string const& name,
}
}
-void Guild::HandleSetRankInfo(WorldSession* session, uint8 rankId, std::string const& name, uint32 rights, uint32 moneyPerDay, GuildBankRightsAndSlotsVec const& rightsAndSlots)
+void Guild::HandleSetRankInfo(WorldSession* session, uint8 rankId, std::string_view name, uint32 rights, uint32 moneyPerDay, std::array<GuildBankRightsAndSlots, GUILD_BANK_MAX_TABS> const& rightsAndSlots)
{
// Only leader can modify ranks
if (!_IsLeader(session->GetPlayer()))
SendCommandResult(session, GUILD_COMMAND_CHANGE_RANK, ERR_GUILD_PERMISSIONS);
else if (RankInfo* rankInfo = GetRankInfo(rankId))
{
- TC_LOG_DEBUG("guild", "Changed RankName to '%s', rights to 0x%08X", name.c_str(), rights);
-
rankInfo->SetName(name);
rankInfo->SetRights(rights);
_SetRankBankMoneyPerDay(rankId, moneyPerDay);
@@ -1457,7 +1425,9 @@ void Guild::HandleSetRankInfo(WorldSession* session, uint8 rankId, std::string c
for (auto itr = rightsAndSlots.begin(); itr != rightsAndSlots.end(); ++itr)
_SetRankBankTabRightsAndSlots(rankId, *itr);
- _BroadcastEvent(GE_RANK_UPDATED, ObjectGuid::Empty, std::to_string(rankId).c_str(), name.c_str(), std::to_string(m_ranks.size()).c_str());
+ _BroadcastEvent(GE_RANK_UPDATED, ObjectGuid::Empty, std::to_string(rankId), rankInfo->GetName(), std::to_string(m_ranks.size()));
+
+ TC_LOG_DEBUG("guild", "Changed RankName to '%s', rights to 0x%08X", rankInfo->GetName().c_str(), rights);
}
}
@@ -1491,7 +1461,7 @@ void Guild::HandleBuyBankTab(WorldSession* session, uint8 tabId)
SendPermissions(session); /// Hack to force client to update permissions
}
-void Guild::HandleInviteMember(WorldSession* session, std::string const& name)
+void Guild::HandleInviteMember(WorldSession* session, std::string_view name)
{
Player* pInvitee = ObjectAccessor::FindPlayerByName(name);
if (!pInvitee)
@@ -1531,7 +1501,7 @@ void Guild::HandleInviteMember(WorldSession* session, std::string const& name)
SendCommandResult(session, GUILD_COMMAND_INVITE, ERR_GUILD_COMMAND_SUCCESS, name);
- TC_LOG_DEBUG("guild", "Player %s invited %s to join his Guild", player->GetName().c_str(), name.c_str());
+ TC_LOG_DEBUG("guild", "Player %s invited %s to join his Guild", player->GetName().c_str(), pInvitee->GetName().c_str());
pInvitee->SetGuildIdInvited(m_id);
_LogEvent(GUILD_EVENT_LOG_INVITE_PLAYER, player->GetGUID().GetCounter(), pInvitee->GetGUID().GetCounter());
@@ -1580,7 +1550,7 @@ void Guild::HandleLeaveMember(WorldSession* session)
DeleteMember(trans, player->GetGUID(), false, false);
_LogEvent(GUILD_EVENT_LOG_LEAVE_GUILD, player->GetGUID().GetCounter());
- _BroadcastEvent(GE_LEFT, player->GetGUID(), player->GetName().c_str());
+ _BroadcastEvent(GE_LEFT, player->GetGUID(), player->GetName());
SendCommandResult(session, GUILD_COMMAND_QUIT, ERR_GUILD_COMMAND_SUCCESS, m_name);
}
@@ -1591,7 +1561,7 @@ void Guild::HandleLeaveMember(WorldSession* session)
delete this;
}
-void Guild::HandleRemoveMember(WorldSession* session, std::string const& name)
+void Guild::HandleRemoveMember(WorldSession* session, std::string_view name)
{
Player* player = session->GetPlayer();
// Player must have rights to remove members
@@ -1616,13 +1586,13 @@ void Guild::HandleRemoveMember(WorldSession* session, std::string const& name)
CharacterDatabaseTransaction trans(nullptr);
DeleteMember(trans, 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());
+ _BroadcastEvent(GE_REMOVED, ObjectGuid::Empty, member->GetName(), player->GetName());
}
}
}
}
-void Guild::HandleUpdateMemberRank(WorldSession* session, std::string const& name, bool demote)
+void Guild::HandleUpdateMemberRank(WorldSession* session, std::string_view name, bool demote)
{
Player* player = session->GetPlayer();
GuildCommandType type = demote ? GUILD_COMMAND_DEMOTE : GUILD_COMMAND_PROMOTE;
@@ -1672,11 +1642,11 @@ void Guild::HandleUpdateMemberRank(WorldSession* session, std::string const& nam
CharacterDatabaseTransaction trans(nullptr);
member->ChangeRank(trans, 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(), member->GetName(), _GetRankName(newRankId));
}
}
-void Guild::HandleAddNewRank(WorldSession* session, std::string const& name)
+void Guild::HandleAddNewRank(WorldSession* session, std::string_view name)
{
uint8 size = _GetRanksSize();
if (size >= GUILD_RANKS_MAX_COUNT)
@@ -1687,7 +1657,7 @@ void Guild::HandleAddNewRank(WorldSession* session, std::string const& name)
{
CharacterDatabaseTransaction trans(nullptr);
if (_CreateRank(trans, name, GR_RIGHT_GCHATLISTEN | GR_RIGHT_GCHATSPEAK))
- _BroadcastEvent(GE_RANK_UPDATED, ObjectGuid::Empty, std::to_string(size).c_str(), name.c_str(), std::to_string(m_ranks.size()).c_str());
+ _BroadcastEvent(GE_RANK_UPDATED, ObjectGuid::Empty, std::to_string(size), name, std::to_string(m_ranks.size()));
}
}
@@ -1716,7 +1686,7 @@ void Guild::HandleRemoveRank(WorldSession* session, uint8 rankId)
// match what the sql statement does
m_ranks.erase(m_ranks.begin() + rankId, m_ranks.end());
- _BroadcastEvent(GE_RANK_DELETED, ObjectGuid::Empty, std::to_string(m_ranks.size()).c_str());
+ _BroadcastEvent(GE_RANK_DELETED, ObjectGuid::Empty, std::to_string(m_ranks.size()));
}
void Guild::HandleMemberDepositMoney(WorldSession* session, uint32 amount)
@@ -1741,7 +1711,7 @@ void Guild::HandleMemberDepositMoney(WorldSession* session, uint32 amount)
CharacterDatabase.CommitTransaction(trans);
- _BroadcastEvent(GE_BANK_MONEY_SET, ObjectGuid::Empty, Trinity::StringFormat("%016llX", m_bankMoney).c_str());
+ _BroadcastEvent(GE_BANK_MONEY_SET, ObjectGuid::Empty, Trinity::StringFormat("%016llX", m_bankMoney));
if (player->GetSession()->HasPermission(rbac::RBAC_PERM_LOG_GM_TRADE))
{
@@ -1765,7 +1735,7 @@ bool Guild::HandleMemberWithdrawMoney(WorldSession* session, uint32 amount, bool
if (!member)
return false;
- if (uint32(_GetMemberRemainingMoney(member)) < amount) // Check if we have enough slot/money today
+ if (uint32(_GetMemberRemainingMoney(*member)) < amount) // Check if we have enough slot/money today
return false;
// Call script after validation and before money transfer.
@@ -1790,7 +1760,7 @@ bool Guild::HandleMemberWithdrawMoney(WorldSession* session, uint32 amount, bool
_LogBankEvent(trans, repair ? GUILD_BANK_LOG_REPAIR_MONEY : GUILD_BANK_LOG_WITHDRAW_MONEY, uint8(0), player->GetGUID().GetCounter(), amount);
CharacterDatabase.CommitTransaction(trans);
- _BroadcastEvent(GE_BANK_MONEY_SET, ObjectGuid::Empty, Trinity::StringFormat("%016llX", m_bankMoney).c_str());
+ _BroadcastEvent(GE_BANK_MONEY_SET, ObjectGuid::Empty, Trinity::StringFormat("%016llX", m_bankMoney));
return true;
}
@@ -1803,7 +1773,7 @@ void Guild::HandleMemberLogout(WorldSession* session)
member->UpdateLogoutTime();
member->ResetFlags();
}
- _BroadcastEvent(GE_SIGNED_OFF, player->GetGUID(), player->GetName().c_str());
+ _BroadcastEvent(GE_SIGNED_OFF, player->GetGUID(), player->GetName());
}
void Guild::HandleDisband(WorldSession* session)
@@ -1832,19 +1802,13 @@ void Guild::SendInfo(WorldSession* session) const
void Guild::SendEventLog(WorldSession* session) const
{
- GuildLog* logs = m_eventLog->GetGuildLog();
-
- if (!logs)
- return;
+ std::list<EventLogEntry> const& eventLog = m_eventLog.GetGuildLog();
WorldPackets::Guild::GuildEventLogQueryResults packet;
- packet.Entry.reserve(m_eventLog->GetSize());
+ packet.Entry.reserve(eventLog.size());
- for (GuildLog::const_iterator itr = logs->begin(); itr != logs->end(); ++itr)
- {
- EventLogEntry* eventLog = static_cast<EventLogEntry*>(*itr);
- eventLog->WritePacket(packet);
- }
+ for (EventLogEntry const& entry : eventLog)
+ entry.WritePacket(packet);
session->SendPacket(packet.Write());
TC_LOG_DEBUG("guild", "MSG_GUILD_EVENT_LOG_QUERY [%s]", session->GetPlayerInfo().c_str());
@@ -1855,20 +1819,14 @@ 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)
{
- GuildLog* logs = m_bankEventLog[tabId]->GetGuildLog();
-
- if (!logs)
- return;
+ std::list<BankEventLogEntry> const& bankEventLog = m_bankEventLog[tabId].GetGuildLog();
WorldPackets::Guild::GuildBankLogQueryResults packet;
packet.Tab = tabId;
- packet.Entry.reserve(m_bankEventLog[tabId]->GetSize());
- for (GuildLog::const_iterator itr = logs->begin(); itr != logs->end(); ++itr)
- {
- BankEventLogEntry* bankEventLog = static_cast<BankEventLogEntry*>(*itr);
- bankEventLog->WritePacket(packet);
- }
+ packet.Entry.reserve(bankEventLog.size());
+ for (BankEventLogEntry const& entry : bankEventLog)
+ entry.WritePacket(packet);
session->SendPacket(packet.Write());
@@ -1910,7 +1868,7 @@ void Guild::SendPermissions(WorldSession* session) const
for (uint8 tabId = 0; tabId < GUILD_BANK_MAX_TABS; ++tabId)
{
queryResult.Tab[tabId].Flags = _GetRankBankTabRights(rankId, tabId);
- queryResult.Tab[tabId].WithdrawItemLimit = _GetMemberRemainingSlots(member, tabId);
+ queryResult.Tab[tabId].WithdrawItemLimit = _GetMemberRemainingSlots(*member, tabId);
}
session->SendPacket(queryResult.Write());
@@ -1923,7 +1881,7 @@ void Guild::SendMoneyInfo(WorldSession* session) const
if (!member)
return;
- int32 amount = _GetMemberRemainingMoney(member);
+ int32 amount = _GetMemberRemainingMoney(*member);
WorldPackets::Guild::GuildBankRemainingWithdrawMoney packet;
packet.RemainingWithdrawMoney = amount;
@@ -1946,7 +1904,7 @@ void Guild::SendLoginInfo(WorldSession* session)
Player* player = session->GetPlayer();
HandleRoster(session);
- _BroadcastEvent(GE_SIGNED_ON, player->GetGUID(), player->GetName().c_str());
+ _BroadcastEvent(GE_SIGNED_ON, player->GetGUID(), player->GetName());
if (Member* member = GetMember(player->GetGUID()))
{
@@ -1971,11 +1929,10 @@ bool Guild::LoadFromDB(Field* fields)
if (purchasedTabs > GUILD_BANK_MAX_TABS)
purchasedTabs = GUILD_BANK_MAX_TABS;
- m_bankTabs.resize(purchasedTabs);
+ m_bankTabs.clear();
+ m_bankTabs.reserve(purchasedTabs);
for (uint8 i = 0; i < purchasedTabs; ++i)
- m_bankTabs[i] = new BankTab(m_id, i);
-
- _CreateLogHolders();
+ m_bankTabs.emplace_back(m_id, i);
return true;
}
@@ -1992,17 +1949,24 @@ bool Guild::LoadMemberFromDB(Field* fields)
{
ObjectGuid::LowType lowguid = fields[1].GetUInt32();
ObjectGuid playerGuid(HighGuid::Player, lowguid);
- Member* member = new Member(m_id, playerGuid, fields[2].GetUInt8());
- if (!member->LoadFromDB(fields))
+
+ auto [memberIt, isNew] = m_members.try_emplace(lowguid, m_id, playerGuid, fields[2].GetUInt8());
+ if (!isNew)
+ {
+ TC_LOG_ERROR("guild", "Tried to add %s to guild '%s'. Member already exists.", playerGuid.ToString().c_str(), m_name.c_str());
+ return false;
+ }
+
+ Member& member = memberIt->second;
+ if (!member.LoadFromDB(fields))
{
CharacterDatabaseTransaction trans(nullptr);
_DeleteMemberFromDB(trans, lowguid);
- delete member;
+ m_members.erase(memberIt);
return false;
}
sCharacterCache->UpdateCharacterGuildId(playerGuid, GetId());
- m_members[lowguid] = member;
return true;
}
@@ -2016,16 +1980,16 @@ void Guild::LoadBankRightFromDB(Field* fields)
bool Guild::LoadEventLogFromDB(Field* fields)
{
- if (m_eventLog->CanInsert())
+ if (m_eventLog.CanInsert())
{
- m_eventLog->LoadEvent(new EventLogEntry(
+ m_eventLog.LoadEvent(
m_id, // guild id
fields[1].GetUInt32(), // guid
time_t(fields[6].GetUInt32()), // timestamp
GuildEventLogTypes(fields[2].GetUInt8()), // event type
fields[3].GetUInt32(), // player guid 1
fields[4].GetUInt32(), // player guid 2
- fields[5].GetUInt8())); // rank
+ fields[5].GetUInt8()); // rank
return true;
}
return false;
@@ -2038,8 +2002,8 @@ bool Guild::LoadBankEventLogFromDB(Field* fields)
if (dbTabId < _GetPurchasedTabsSize() || isMoneyTab)
{
uint8 tabId = isMoneyTab ? uint8(GUILD_BANK_MAX_TABS) : dbTabId;
- LogHolder* pLog = m_bankEventLog[tabId];
- if (pLog->CanInsert())
+ LogHolder<BankEventLogEntry>& bankLog = m_bankEventLog[tabId];
+ if (bankLog.CanInsert())
{
ObjectGuid::LowType guid = fields[2].GetUInt32();
GuildBankEventLogTypes eventType = GuildBankEventLogTypes(fields[3].GetUInt8());
@@ -2056,7 +2020,7 @@ bool Guild::LoadBankEventLogFromDB(Field* fields)
TC_LOG_ERROR("guild", "GuildBankEventLog ERROR: non-money event (LogGuid: %u, Guild: %u) belongs to money tab, ignoring...", guid, m_id);
return false;
}
- pLog->LoadEvent(new BankEventLogEntry(
+ bankLog.LoadEvent(
m_id, // guild id
guid, // guid
time_t(fields[8].GetUInt32()), // timestamp
@@ -2065,7 +2029,7 @@ bool Guild::LoadBankEventLogFromDB(Field* fields)
fields[4].GetUInt32(), // player guid
fields[5].GetUInt32(), // item or money
fields[6].GetUInt16(), // itam stack count
- fields[7].GetUInt8())); // dest tab id
+ fields[7].GetUInt8()); // dest tab id
}
}
return true;
@@ -2077,7 +2041,7 @@ void Guild::LoadBankTabFromDB(Field* fields)
if (tabId >= _GetPurchasedTabsSize())
TC_LOG_ERROR("guild", "Invalid tab (tabId: %u) in guild bank, skipped.", tabId);
else
- m_bankTabs[tabId]->LoadFromDB(fields);
+ m_bankTabs[tabId].LoadFromDB(fields);
}
bool Guild::LoadBankItemFromDB(Field* fields)
@@ -2089,7 +2053,7 @@ bool Guild::LoadBankItemFromDB(Field* fields)
fields[14].GetUInt32(), fields[15].GetUInt32());
return false;
}
- return m_bankTabs[tabId]->LoadItemFromDB(fields);
+ return m_bankTabs[tabId].LoadItemFromDB(fields);
}
// Validates guild data loaded from database. Returns false if guild should be deleted.
@@ -2131,9 +2095,9 @@ bool Guild::Validate()
}
// Validate members' data
- for (auto itr = m_members.begin(); itr != m_members.end(); ++itr)
- if (itr->second->GetRankId() > _GetRanksSize())
- itr->second->ChangeRank(trans, _GetLowestRankId());
+ for (auto& [guid, member] : m_members)
+ if (member.GetRankId() > _GetRanksSize())
+ member.ChangeRank(trans, _GetLowestRankId());
// Repair the structure of the guild.
// If the guildmaster doesn't exist or isn't member of the guild
@@ -2151,13 +2115,13 @@ bool Guild::Validate()
}
}
else if (!pLeader->IsRank(GR_GUILDMASTER))
- _SetLeaderGUID(pLeader);
+ _SetLeaderGUID(*pLeader);
// Check config if multiple guildmasters are allowed
if (!sConfigMgr->GetBoolDefault("Guild.AllowMultipleGuildMaster", 0))
- for (auto itr = m_members.begin(); itr != m_members.end(); ++itr)
- if (itr->second->GetRankId() == GR_GUILDMASTER && !itr->second->IsSamePlayer(m_leaderGuid))
- itr->second->ChangeRank(trans, GR_OFFICER);
+ for (auto& [guid, member] : m_members)
+ if ((member.GetRankId() == GR_GUILDMASTER) && !member.IsSamePlayer(m_leaderGuid))
+ member.ChangeRank(trans, GR_OFFICER);
if (trans->GetSize() > 0)
CharacterDatabase.CommitTransaction(trans);
@@ -2166,14 +2130,14 @@ bool Guild::Validate()
}
// Broadcasts
-void Guild::BroadcastToGuild(WorldSession* session, bool officerOnly, std::string const& msg, uint32 language) const
+void Guild::BroadcastToGuild(WorldSession* session, bool officerOnly, std::string_view msg, uint32 language) const
{
if (session && session->GetPlayer() && _HasRankRight(session->GetPlayer(), officerOnly ? GR_RIGHT_OFFCHATSPEAK : GR_RIGHT_GCHATSPEAK))
{
WorldPacket data;
ChatHandler::BuildChatPacket(data, officerOnly ? CHAT_MSG_OFFICER : CHAT_MSG_GUILD, Language(language), session->GetPlayer(), nullptr, msg);
- for (auto itr = m_members.begin(); itr != m_members.end(); ++itr)
- if (Player* player = itr->second->FindConnectedPlayer())
+ for (auto const& [guid, member] : m_members)
+ if (Player* player = member.FindConnectedPlayer())
if (player->GetSession() && _HasRankRight(player, officerOnly ? GR_RIGHT_OFFCHATLISTEN : GR_RIGHT_GCHATLISTEN) &&
!player->GetSocial()->HasIgnore(session->GetPlayer()->GetGUID()))
player->SendDirectMessage(&data);
@@ -2182,16 +2146,16 @@ void Guild::BroadcastToGuild(WorldSession* session, bool officerOnly, std::strin
void Guild::BroadcastPacketToRank(WorldPacket const* packet, uint8 rankId) const
{
- for (auto itr = m_members.begin(); itr != m_members.end(); ++itr)
- if (itr->second->IsRank(rankId))
- if (Player* player = itr->second->FindConnectedPlayer())
+ for (auto const& [guid, member] : m_members)
+ if (member.IsRank(rankId))
+ if (Player* player = member.FindConnectedPlayer())
player->SendDirectMessage(packet);
}
void Guild::BroadcastPacket(WorldPacket const* packet) const
{
- for (auto itr = m_members.begin(); itr != m_members.end(); ++itr)
- if (Player* player = itr->second->FindPlayer())
+ for (auto const& [guid, member] : m_members)
+ if (Player* player = member.FindConnectedPlayer())
player->SendDirectMessage(packet);
}
@@ -2202,7 +2166,7 @@ void Guild::MassInviteToEvent(WorldSession* session, uint32 minLevel, uint32 max
WorldPacket data(SMSG_CALENDAR_FILTER_GUILD);
data << uint32(count); // count placeholder
- for (auto itr = m_members.begin(); itr != m_members.end(); ++itr)
+ for (auto const& [guid, member] : m_members)
{
// not sure if needed, maybe client checks it as well
if (count >= CALENDAR_MAX_INVITES)
@@ -2212,12 +2176,11 @@ void Guild::MassInviteToEvent(WorldSession* session, uint32 minLevel, uint32 max
return;
}
- Member* member = itr->second;
- uint32 level = sCharacterCache->GetCharacterLevelByGuid(member->GetGUID());
+ uint32 level = sCharacterCache->GetCharacterLevelByGuid(member.GetGUID());
- if (member->GetGUID() != session->GetPlayer()->GetGUID() && level >= minLevel && level <= maxLevel && member->IsRankNotLower(minRank))
+ if (member.GetGUID() != session->GetPlayer()->GetGUID() && level >= minLevel && level <= maxLevel && member.IsRankNotLower(minRank))
{
- data.appendPackGUID(member->GetGUID().GetRawValue());
+ data.appendPackGUID(member.GetGUID().GetRawValue());
data << uint8(0); // unk
++count;
}
@@ -2251,21 +2214,27 @@ bool Guild::AddMember(CharacterDatabaseTransaction& trans, ObjectGuid guid, uint
if (rankId == GUILD_RANK_NONE)
rankId = _GetLowestRankId();
- Member* member = new Member(m_id, guid, rankId);
+ auto [memberIt, isNew] = m_members.try_emplace(lowguid, m_id, guid, rankId);
+ if (!isNew)
+ {
+ TC_LOG_ERROR("guild", "Tried to add %s to guild '%s'. Member already exists.", guid.ToString().c_str(), m_name.c_str());
+ return false;
+ }
+
+ Member& member = memberIt->second;
std::string name;
if (player)
{
- m_members[lowguid] = member;
player->SetInGuild(m_id);
player->SetGuildIdInvited(0);
player->SetRank(rankId);
- member->SetStats(player);
+ member.SetStats(player);
SendLoginInfo(player->GetSession());
name = player->GetName();
}
else
{
- member->ResetFlags();
+ member.ResetFlags();
bool ok = false;
// Player must exist
@@ -2275,7 +2244,7 @@ bool Guild::AddMember(CharacterDatabaseTransaction& trans, ObjectGuid guid, uint
{
Field* fields = result->Fetch();
name = fields[0].GetString();
- member->SetStats(
+ member.SetStats(
name,
fields[1].GetUInt8(),
fields[2].GetUInt8(),
@@ -2283,22 +2252,21 @@ bool Guild::AddMember(CharacterDatabaseTransaction& trans, ObjectGuid guid, uint
fields[4].GetUInt16(),
fields[5].GetUInt32());
- ok = member->CheckStats();
+ ok = member.CheckStats();
}
if (!ok)
{
- delete member;
+ m_members.erase(memberIt);
return false;
}
- m_members[lowguid] = member;
sCharacterCache->UpdateCharacterGuildId(guid, GetId());
}
- member->SaveToDB(trans);
+ member.SaveToDB(trans);
_UpdateAccountsNumber();
_LogEvent(GUILD_EVENT_LOG_JOIN_GUILD, lowguid);
- _BroadcastEvent(GE_JOINED, guid, name.c_str());
+ _BroadcastEvent(GE_JOINED, guid, name);
// Call scripts if member was succesfully added (and stored to database)
sScriptMgr->OnGuildAddMember(this, player, rankId);
@@ -2317,12 +2285,12 @@ void Guild::DeleteMember(CharacterDatabaseTransaction& trans, ObjectGuid guid, b
{
Member* oldLeader = nullptr;
Member* newLeader = nullptr;
- for (auto i = m_members.begin(); i != m_members.end(); ++i)
+ for (auto& [guid, member] : m_members)
{
- if (i->first == lowguid)
- oldLeader = i->second;
- else if (!newLeader || newLeader->GetRankId() > i->second->GetRankId())
- newLeader = i->second;
+ if (guid == lowguid)
+ oldLeader = &member;
+ else if (!newLeader || newLeader->GetRankId() > member.GetRankId())
+ newLeader = &member;
}
if (!newLeader)
@@ -2333,7 +2301,7 @@ void Guild::DeleteMember(CharacterDatabaseTransaction& trans, ObjectGuid guid, b
return;
}
- _SetLeaderGUID(newLeader);
+ _SetLeaderGUID(*newLeader);
// If player not online data in data field will be loaded from guild tabs no need to update it !!
if (Player* newLeaderPlayer = newLeader->FindPlayer())
@@ -2342,19 +2310,14 @@ void Guild::DeleteMember(CharacterDatabaseTransaction& trans, ObjectGuid guid, b
// 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());
+ _BroadcastEvent(GE_LEADER_CHANGED, ObjectGuid::Empty, oldLeader->GetName(), newLeader->GetName());
+ _BroadcastEvent(GE_LEFT, guid, oldLeader->GetName());
}
}
// Call script on remove before member is actually removed from guild (and database)
sScriptMgr->OnGuildRemoveMember(this, player, isDisbanding, isKicked);
- auto memberItr = m_members.find(lowguid);
- if (memberItr != m_members.end())
- {
- delete memberItr->second;
- m_members.erase(memberItr);
- }
+ m_members.erase(lowguid);
// If player not online data in data field will be loaded from guild tabs no need to update it !!
if (player)
@@ -2413,7 +2376,7 @@ void Guild::SwapItemsWithInventory(Player* player, bool toChar, uint8 tabId, uin
}
// Bank tabs
-void Guild::SetBankTabText(uint8 tabId, std::string const& text)
+void Guild::SetBankTabText(uint8 tabId, std::string_view text)
{
if (BankTab* pTab = GetBankTab(tabId))
{
@@ -2438,17 +2401,10 @@ void Guild::_DeleteMemberFromDB(CharacterDatabaseTransaction& trans, ObjectGuid:
}
// Private methods
-void Guild::_CreateLogHolders()
-{
- m_eventLog = new LogHolder(sWorld->getIntConfig(CONFIG_GUILD_EVENT_LOG_COUNT));
- for (uint8 tabId = 0; tabId <= GUILD_BANK_MAX_TABS; ++tabId)
- m_bankEventLog[tabId] = new LogHolder(sWorld->getIntConfig(CONFIG_GUILD_BANK_EVENT_LOG_COUNT));
-}
-
void Guild::_CreateNewBankTab()
{
uint8 tabId = _GetPurchasedTabsSize(); // Next free id
- m_bankTabs.push_back(new BankTab(m_id, tabId));
+ m_bankTabs.emplace_back(m_id, tabId);
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
@@ -2488,7 +2444,7 @@ void Guild::_CreateDefaultGuildRanks(CharacterDatabaseTransaction& trans, Locale
_CreateRank(trans, sObjectMgr->GetTrinityString(LANG_GUILD_INITIATE, loc), GR_RIGHT_GCHATLISTEN | GR_RIGHT_GCHATSPEAK);
}
-bool Guild::_CreateRank(CharacterDatabaseTransaction& trans, std::string const& name, uint32 rights)
+bool Guild::_CreateRank(CharacterDatabaseTransaction& trans, std::string_view name, uint32 rights)
{
uint8 newRankId = _GetRanksSize();
if (newRankId >= GUILD_RANKS_MAX_COUNT)
@@ -2516,9 +2472,9 @@ bool Guild::_CreateRank(CharacterDatabaseTransaction& trans, std::string const&
void Guild::_UpdateAccountsNumber()
{
// We use a set to be sure each element will be unique
- std::set<uint32> accountsIdSet;
- for (auto itr = m_members.begin(); itr != m_members.end(); ++itr)
- accountsIdSet.insert(itr->second->GetAccountId());
+ std::unordered_set<uint32> accountsIdSet;
+ for (auto const& [guid, member] : m_members)
+ accountsIdSet.insert(member.GetAccountId());
m_accountsNumber = accountsIdSet.size();
}
@@ -2538,11 +2494,8 @@ bool Guild::_IsLeader(Player* player) const
void Guild::_DeleteBankItems(CharacterDatabaseTransaction& trans, bool removeItemsFromDB)
{
for (uint8 tabId = 0; tabId < _GetPurchasedTabsSize(); ++tabId)
- {
- m_bankTabs[tabId]->Delete(trans, removeItemsFromDB);
- delete m_bankTabs[tabId];
- m_bankTabs[tabId] = nullptr;
- }
+ m_bankTabs[tabId].Delete(trans, removeItemsFromDB);
+
m_bankTabs.clear();
}
@@ -2565,14 +2518,11 @@ bool Guild::_ModifyBankMoney(CharacterDatabaseTransaction& trans, uint64 amount,
return true;
}
-void Guild::_SetLeaderGUID(Member* pLeader)
+void Guild::_SetLeaderGUID(Member& pLeader)
{
- if (!pLeader)
- return;
-
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
- m_leaderGuid = pLeader->GetGUID();
- pLeader->ChangeRank(trans, GR_GUILDMASTER);
+ m_leaderGuid = pLeader.GetGUID();
+ pLeader.ChangeRank(trans, GR_GUILDMASTER);
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_LEADER);
stmt->setUInt32(0, m_leaderGuid.GetCounter());
@@ -2633,37 +2583,31 @@ inline int8 Guild::_GetRankBankTabRights(uint8 rankId, uint8 tabId) const
return 0;
}
-inline int32 Guild::_GetMemberRemainingSlots(Member const* member, uint8 tabId) const
+inline int32 Guild::_GetMemberRemainingSlots(Member const& member, uint8 tabId) const
{
- if (member)
+ uint8 rankId = member.GetRankId();
+ if (rankId == GR_GUILDMASTER)
+ return static_cast<int32>(GUILD_WITHDRAW_SLOT_UNLIMITED);
+ if ((_GetRankBankTabRights(rankId, tabId) & GUILD_BANK_RIGHT_VIEW_TAB) != 0)
{
- uint8 rankId = member->GetRankId();
- if (rankId == GR_GUILDMASTER)
- return static_cast<int32>(GUILD_WITHDRAW_SLOT_UNLIMITED);
- if ((_GetRankBankTabRights(rankId, tabId) & GUILD_BANK_RIGHT_VIEW_TAB) != 0)
- {
- int32 remaining = _GetRankBankTabSlotsPerDay(rankId, tabId) - member->GetBankWithdrawValue(tabId);
- if (remaining > 0)
- return remaining;
- }
+ int32 remaining = _GetRankBankTabSlotsPerDay(rankId, tabId) - member.GetBankWithdrawValue(tabId);
+ if (remaining > 0)
+ return remaining;
}
return 0;
}
-inline int32 Guild::_GetMemberRemainingMoney(Member const* member) const
+inline int32 Guild::_GetMemberRemainingMoney(Member const& member) const
{
- if (member)
- {
- uint8 rankId = member->GetRankId();
- if (rankId == GR_GUILDMASTER)
- return static_cast<int32>(GUILD_WITHDRAW_MONEY_UNLIMITED);
+ uint8 rankId = member.GetRankId();
+ if (rankId == GR_GUILDMASTER)
+ return static_cast<int32>(GUILD_WITHDRAW_MONEY_UNLIMITED);
- if ((_GetRankRights(rankId) & (GR_RIGHT_WITHDRAW_REPAIR | GR_RIGHT_WITHDRAW_GOLD)) != 0)
- {
- int32 remaining = _GetRankBankMoneyPerDay(rankId) - member->GetBankWithdrawValue(GUILD_BANK_MAX_TABS);
- if (remaining > 0)
- return remaining;
- }
+ if ((_GetRankRights(rankId) & (GR_RIGHT_WITHDRAW_REPAIR | GR_RIGHT_WITHDRAW_GOLD)) != 0)
+ {
+ int32 remaining = _GetRankBankMoneyPerDay(rankId) - member.GetBankWithdrawValue(GUILD_BANK_MAX_TABS);
+ if (remaining > 0)
+ return remaining;
}
return 0;
}
@@ -2695,7 +2639,7 @@ inline bool Guild::_MemberHasTabRights(ObjectGuid guid, uint8 tabId, uint32 righ
inline void Guild::_LogEvent(GuildEventLogTypes eventType, ObjectGuid::LowType playerGuid1, ObjectGuid::LowType playerGuid2, uint8 newRank)
{
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
- m_eventLog->AddEvent(trans, new EventLogEntry(m_id, m_eventLog->GetNextGUID(), eventType, playerGuid1, playerGuid2, newRank));
+ m_eventLog.AddEvent(trans, m_id, m_eventLog.GetNextGUID(), eventType, playerGuid1, playerGuid2, newRank);
CharacterDatabase.CommitTransaction(trans);
sScriptMgr->OnGuildEvent(this, uint8(eventType), playerGuid1, playerGuid2, newRank);
@@ -2717,8 +2661,8 @@ void Guild::_LogBankEvent(CharacterDatabaseTransaction& trans, GuildBankEventLog
tabId = GUILD_BANK_MAX_TABS;
dbTabId = GUILD_BANK_MONEY_LOGS_TAB;
}
- LogHolder* pLog = m_bankEventLog[tabId];
- pLog->AddEvent(trans, new BankEventLogEntry(m_id, pLog->GetNextGUID(), eventType, dbTabId, lowguid, itemOrMoney, itemStackCount, destTabId));
+ LogHolder<BankEventLogEntry>& pLog = m_bankEventLog[tabId];
+ pLog.AddEvent(trans, m_id, pLog.GetNextGUID(), eventType, dbTabId, lowguid, itemOrMoney, itemStackCount, destTabId);
sScriptMgr->OnGuildBankEvent(this, uint8(eventType), tabId, lowguid, itemOrMoney, itemStackCount, destTabId);
}
@@ -2884,7 +2828,7 @@ void Guild::_SendBankContentUpdate(uint8 tabId, SlotIds slots) const
_SendBankList(nullptr, tabId, false, &slots);
}
-void Guild::_BroadcastEvent(GuildEvents guildEvent, ObjectGuid guid, char const* param1, char const* param2, char const* param3) const
+void Guild::_BroadcastEvent(GuildEvents guildEvent, ObjectGuid guid, std::string_view param1, std::string_view param2, std::string_view param3) const
{
WorldPackets::Guild::GuildEvent event;
event.Type = guildEvent;
@@ -2911,8 +2855,8 @@ void Guild::_SendBankList(WorldSession* session /* = nullptr*/, uint8 tabId /*=
for (uint8 i = 0; i < _GetPurchasedTabsSize(); ++i)
{
WorldPackets::Guild::GuildBankTabInfo tabInfo;
- tabInfo.Name = m_bankTabs[i]->GetName();
- tabInfo.Icon = m_bankTabs[i]->GetIcon();
+ tabInfo.Name = m_bankTabs[i].GetName();
+ tabInfo.Icon = m_bankTabs[i].GetIcon();
packet.TabInfo.push_back(tabInfo);
}
}
@@ -2969,7 +2913,7 @@ void Guild::_SendBankList(WorldSession* session /* = nullptr*/, uint8 tabId /*=
if (session)
{
if (Member const* member = GetMember(session->GetPlayer()->GetGUID()))
- packet.WithdrawalsRemaining = _GetMemberRemainingSlots(member, tabId);
+ packet.WithdrawalsRemaining = _GetMemberRemainingSlots(*member, tabId);
session->SendPacket(packet.Write());
TC_LOG_DEBUG("guild", "SMSG_GUILD_BANK_LIST [%s]: TabId: %u, FullSlots: %u, slots: %d",
@@ -2978,15 +2922,15 @@ void Guild::_SendBankList(WorldSession* session /* = nullptr*/, uint8 tabId /*=
else /// @todo - Probably this is just sent to session + those that have sent CMSG_GUILD_BANKER_ACTIVATE
{
packet.Write();
- for (auto itr = m_members.begin(); itr != m_members.end(); ++itr)
+ for (auto const& [guid, member] : m_members)
{
- if (!_MemberHasTabRights(itr->second->GetGUID(), tabId, GUILD_BANK_RIGHT_VIEW_TAB))
+ if (!_MemberHasTabRights(member.GetGUID(), tabId, GUILD_BANK_RIGHT_VIEW_TAB))
continue;
- Player* player = itr->second->FindPlayer();
+ Player* player = member.FindPlayer();
if (!player)
continue;
- packet.SetWithdrawalsRemaining(_GetMemberRemainingSlots(itr->second, tabId));
+ packet.SetWithdrawalsRemaining(_GetMemberRemainingSlots(member, tabId));
player->SendDirectMessage(packet.GetRawPacket());
TC_LOG_DEBUG("guild", "SMSG_GUILD_BANK_LIST [%s]: TabId: %u, FullSlots: %u, slots: %u"
, player->GetName().c_str(), tabId, sendAllSlots, packet.WithdrawalsRemaining);
@@ -2996,8 +2940,8 @@ void Guild::_SendBankList(WorldSession* session /* = nullptr*/, uint8 tabId /*=
void Guild::ResetTimes()
{
- for (auto itr = m_members.begin(); itr != m_members.end(); ++itr)
- itr->second->ResetValues();
+ for (auto& [guid, member] : m_members)
+ member.ResetValues();
_BroadcastEvent(GE_BANK_TAB_AND_MONEY_UPDATED, ObjectGuid::Empty);
}