diff options
| author | Treeston <treeston.mmoc@gmail.com> | 2020-09-09 20:38:04 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-09-09 20:38:04 +0200 |
| commit | cd28423a4e813baf6833f38c93613a7f82a721f8 (patch) | |
| tree | f8461904532942d916e71b1822319d1a7e1ad691 /src/server/game/Guilds/Guild.cpp | |
| parent | 4f636b80e4942c4c9c4811496d1c1b77f767378d (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.cpp | 454 |
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); } |
