diff options
author | Treeston <treeston.mmoc@gmail.com> | 2020-09-09 20:38:04 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-02-05 19:20:18 +0100 |
commit | b6635be04184cdea0e3ed269cc1687f72c3dc5a9 (patch) | |
tree | d66809191630116aed2afb507b9e8949d7366492 /src | |
parent | 42be7836dfacd9e8d6b0c2b5d5f230ed6a55f088 (diff) |
[3.3.5] Core/Guilds: Guild cleanup (PR #25422)
(cherry picked from commit cd28423a4e813baf6833f38c93613a7f82a721f8)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 14 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.h | 14 | ||||
-rw-r--r-- | src/server/game/Guilds/Guild.cpp | 513 | ||||
-rw-r--r-- | src/server/game/Guilds/Guild.h | 131 | ||||
-rw-r--r-- | src/server/game/Guilds/GuildMgr.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Guilds/GuildMgr.h | 2 | ||||
-rw-r--r-- | src/server/game/Handlers/GuildHandler.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Server/Packets/PacketUtilities.h | 2 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 2 |
10 files changed, 314 insertions, 384 deletions
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 45213a1e214..c8334a3dfaf 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -8641,7 +8641,7 @@ void ObjectMgr::LoadReservedPlayersNames() TC_LOG_INFO("server.loading", ">> Loaded %u reserved player names in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } -bool ObjectMgr::IsReservedName(const std::string& name) const +bool ObjectMgr::IsReservedName(std::string_view name) const { std::wstring wstr; if (!Utf8toWStr (name, wstr)) @@ -8725,7 +8725,7 @@ bool isValidString(const std::wstring& wstr, uint32 strictMask, bool numericOrSp return false; } -ResponseCodes ObjectMgr::CheckPlayerName(std::string const& name, LocaleConstant locale, bool create /*= false*/) +ResponseCodes ObjectMgr::CheckPlayerName(std::string_view name, LocaleConstant locale, bool create /*= false*/) { std::wstring wname; if (!Utf8toWStr(name, wname)) @@ -8750,7 +8750,7 @@ ResponseCodes ObjectMgr::CheckPlayerName(std::string const& name, LocaleConstant return sDB2Manager.ValidateName(wname, locale); } -bool ObjectMgr::IsValidCharterName(const std::string& name) +bool ObjectMgr::IsValidCharterName(std::string_view name) { std::wstring wname; if (!Utf8toWStr(name, wname)) @@ -8768,7 +8768,7 @@ bool ObjectMgr::IsValidCharterName(const std::string& name) return isValidString(wname, strictMask, true); } -PetNameInvalidReason ObjectMgr::CheckPetName(const std::string& name) +PetNameInvalidReason ObjectMgr::CheckPetName(std::string_view name) { std::wstring wname; if (!Utf8toWStr(name, wname)) @@ -9084,7 +9084,7 @@ void ObjectMgr::LoadGameTele() TC_LOG_INFO("server.loading", ">> Loaded %u GameTeleports in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } -GameTele const* ObjectMgr::GetGameTele(const std::string& name) const +GameTele const* ObjectMgr::GetGameTele(std::string_view name) const { // explicit name case std::wstring wname; @@ -9107,7 +9107,7 @@ GameTele const* ObjectMgr::GetGameTele(const std::string& name) const return alt; } -GameTele const* ObjectMgr::GetGameTeleExactName(const std::string& name) const +GameTele const* ObjectMgr::GetGameTeleExactName(std::string_view name) const { // explicit name case std::wstring wname; @@ -9159,7 +9159,7 @@ bool ObjectMgr::AddGameTele(GameTele& tele) return true; } -bool ObjectMgr::DeleteGameTele(const std::string& name) +bool ObjectMgr::DeleteGameTele(std::string_view name) { // explicit name case std::wstring wname; diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index e157a84c539..bef065c7ba2 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -1611,12 +1611,12 @@ class TC_GAME_API ObjectMgr // reserved names void LoadReservedPlayersNames(); - bool IsReservedName(std::string const& name) const; + bool IsReservedName(std::string_view name) const; // name with valid structure and symbols - static ResponseCodes CheckPlayerName(std::string const& name, LocaleConstant locale, bool create = false); - static PetNameInvalidReason CheckPetName(std::string const& name); - static bool IsValidCharterName(std::string const& name); + static ResponseCodes CheckPlayerName(std::string_view name, LocaleConstant locale, bool create = false); + static PetNameInvalidReason CheckPetName(std::string_view name); + static bool IsValidCharterName(std::string_view name); static bool CheckDeclinedNames(const std::wstring& w_ownname, DeclinedName const& names); @@ -1626,11 +1626,11 @@ class TC_GAME_API ObjectMgr if (itr == _gameTeleStore.end()) return nullptr; return &itr->second; } - GameTele const* GetGameTele(std::string const& name) const; - GameTele const* GetGameTeleExactName(std::string const& name) const; + GameTele const* GetGameTele(std::string_view name) const; + GameTele const* GetGameTeleExactName(std::string_view name) const; GameTeleContainer const& GetGameTeleMap() const { return _gameTeleStore; } bool AddGameTele(GameTele& data); - bool DeleteGameTele(std::string const& name); + bool DeleteGameTele(std::string_view name); Trainer::Trainer const* GetTrainer(uint32 trainerId) const; uint32 GetCreatureDefaultTrainer(uint32 creatureId) const diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index eb7ce272537..ae1d80796cb 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -53,7 +53,7 @@ inline uint64 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; @@ -62,7 +62,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) @@ -75,39 +75,35 @@ 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> +Entry& 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& entry = m_log.emplace_back(std::forward<Ts>(args)...); // Save to DB - entry->SaveToDB(trans); + entry.SaveToDB(trans); + return entry; } -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. @@ -297,7 +293,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; @@ -364,9 +360,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) { @@ -429,9 +423,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; @@ -445,7 +439,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; @@ -530,9 +524,7 @@ Guild::Member::Member(ObjectGuid::LowType guildId, ObjectGuid guid, GuildRankId m_weekActivity(0), m_totalReputation(0), m_weekReputation(0) -{ - memset(m_bankWithdraw, 0, (GUILD_BANK_MAX_TABS) * sizeof(uint32)); -} +{} void Guild::Member::SetStats(Player* player) { @@ -545,7 +537,7 @@ void Guild::Member::SetStats(Player* player) m_achievementPoints = player->GetAchievementPoints(); } -void Guild::Member::SetStats(std::string const& name, uint8 level, uint8 _class, uint8 gender, uint32 zoneId, uint32 accountId, uint32 reputation) +void Guild::Member::SetStats(std::string_view name, uint8 level, uint8 _class, uint8 gender, uint32 zoneId, uint32 accountId, uint32 reputation) { m_name = name; m_level = level; @@ -556,7 +548,7 @@ void Guild::Member::SetStats(std::string const& name, uint8 level, uint8 _class, m_totalReputation = reputation; } -void Guild::Member::SetPublicNote(std::string const& publicNote) +void Guild::Member::SetPublicNote(std::string_view publicNote) { if (m_publicNote == publicNote) return; @@ -564,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->setUInt64(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; @@ -577,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->setUInt64(1, m_guid.GetCounter()); CharacterDatabase.Execute(stmt); } @@ -911,7 +903,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; } @@ -1114,39 +1106,18 @@ Guild::Guild(): m_createdDate(0), m_accountsNumber(0), m_bankMoney(0), - m_eventLog(nullptr), - m_newsLog(nullptr), m_achievementMgr(this) { - 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; - delete m_newsLog; - m_newsLog = 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)) @@ -1163,10 +1134,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(); @@ -1177,7 +1147,7 @@ bool Guild::Create(Player* pLeader, std::string const& name) uint8 index = 0; stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GUILD); stmt->setUInt64( index, m_id); - stmt->setString(++index, name); + stmt->setString(++index, m_name); stmt->setUInt64(++index, m_leaderGuid.GetCounter()); stmt->setString(++index, m_info); stmt->setString(++index, m_motd); @@ -1201,7 +1171,7 @@ bool Guild::Create(Player* pLeader, std::string const& name) if (leader) SendEventNewLeader(leader, nullptr); - sScriptMgr->OnGuildCreate(this, pLeader, name); + sScriptMgr->OnGuildCreate(this, pLeader, m_name); } return ret; @@ -1221,7 +1191,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); @@ -1302,7 +1272,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; @@ -1331,35 +1301,34 @@ void Guild::HandleRoster(WorldSession* session) roster.MemberData.reserve(m_members.size()); - for (auto itr : m_members) + bool sendOfficerNote = _HasRankRight(session->GetPlayer(), GR_RIGHT_VIEWOFFNOTE); + for (auto const& [guid, member] : m_members) { - Member* member = itr.second; + WorldPackets::Guild::GuildRosterMemberData& memberData = roster.MemberData.emplace_back(); - 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 = member->GetInactiveDays(); + 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 = member.GetInactiveDays(); //GuildRosterProfessionData memberData.VirtualRealmAddress = GetVirtualRealmAddress(); - 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.Authenticated = false; memberData.SorEligible = false; - memberData.Name = member->GetName(); - memberData.Note = member->GetPublicNote(); - memberData.OfficerNote = member->GetOfficerNote(); + memberData.Name = member.GetName(); + memberData.Note = member.GetPublicNote(); + if (sendOfficerNote) + memberData.OfficerNote = member.GetOfficerNote(); - roster.MemberData.push_back(memberData); } roster.WelcomeText = m_motd; @@ -1460,7 +1429,7 @@ void Guild::HandleGetAchievementMembers(WorldSession* session, uint32 achievemen m_achievementMgr.SendAchievementMembers(session->GetPlayer(), achievementId); } -void Guild::HandleSetMOTD(WorldSession* session, std::string const& motd) +void Guild::HandleSetMOTD(WorldSession* session, std::string_view motd) { if (m_motd == motd) return; @@ -1472,10 +1441,10 @@ 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->setUInt64(1, m_id); CharacterDatabase.Execute(stmt); @@ -1483,7 +1452,7 @@ void Guild::HandleSetMOTD(WorldSession* session, std::string const& motd) } } -void Guild::HandleSetInfo(WorldSession* session, std::string const& info) +void Guild::HandleSetInfo(WorldSession* session, std::string_view info) { if (m_info == info) return; @@ -1493,10 +1462,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->setUInt64(1, m_id); CharacterDatabase.Execute(stmt); } @@ -1522,7 +1491,7 @@ void Guild::HandleSetEmblem(WorldSession* session, EmblemInfo const& emblemInfo) } } -void Guild::HandleSetNewGuildMaster(WorldSession* session, std::string const& name, bool isSelfPromote) +void Guild::HandleSetNewGuildMaster(WorldSession* session, std::string_view name, bool isSelfPromote) { Player* player = session->GetPlayer(); @@ -1561,7 +1530,7 @@ void Guild::HandleSetNewGuildMaster(WorldSession* session, std::string const& na CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction(); - _SetLeader(trans, newGuildMaster); + _SetLeader(trans, *newGuildMaster); oldGuildMaster->ChangeRank(trans, _GetLowestRankId()); SendEventNewLeader(newGuildMaster, oldGuildMaster, isSelfPromote); @@ -1569,7 +1538,7 @@ void Guild::HandleSetNewGuildMaster(WorldSession* session, std::string const& na CharacterDatabase.CommitTransaction(trans); } -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) @@ -1588,7 +1557,7 @@ void Guild::HandleSetBankTabInfo(WorldSession* session, uint8 tabId, std::string BroadcastPacket(packet.Write()); } -void Guild::HandleSetMemberNote(WorldSession* session, std::string const& note, ObjectGuid guid, bool isPublic) +void Guild::HandleSetMemberNote(WorldSession* session, std::string_view note, ObjectGuid guid, bool isPublic) { // Player must have rights to set public/officer note if (!_HasRankRight(session->GetPlayer(), isPublic ? GR_RIGHT_EDIT_PUBLIC_NOTE : GR_RIGHT_EOFFNOTE)) @@ -1608,15 +1577,13 @@ void Guild::HandleSetMemberNote(WorldSession* session, std::string const& note, } } -void Guild::HandleSetRankInfo(WorldSession* session, GuildRankId rankId, std::string const& name, uint32 rights, uint32 moneyPerDay, GuildBankRightsAndSlotsVec const& rightsAndSlots) +void Guild::HandleSetRankInfo(WorldSession* session, GuildRankId 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 * GOLD); @@ -1668,7 +1635,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) @@ -1711,7 +1678,7 @@ void Guild::HandleInviteMember(WorldSession* session, std::string const& 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()); + 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()); @@ -1925,7 +1892,7 @@ void Guild::HandleSetMemberRank(WorldSession* session, ObjectGuid targetGuid, Ob SendGuildRanksUpdate(setterGuid, targetGuid, newRank->GetId()); } -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) @@ -2091,7 +2058,7 @@ bool Guild::HandleMemberWithdrawMoney(WorldSession* session, uint64 amount, bool if (!_HasRankRight(player, repair ? GR_RIGHT_WITHDRAW_REPAIR : GR_RIGHT_WITHDRAW_GOLD)) return false; - if (_GetMemberRemainingMoney(member) < int64(amount)) // Check if we have enough slot/money today + if (_GetMemberRemainingMoney(*member) < int64(amount)) // Check if we have enough slot/money today return false; // Call script after validation and before money transfer. @@ -2185,19 +2152,13 @@ void Guild::HandleGuildRequestChallengeUpdate(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()); @@ -2206,19 +2167,13 @@ void Guild::SendEventLog(WorldSession* session) const void Guild::SendNewsUpdate(WorldSession* session) const { - GuildLog* logs = m_newsLog->GetGuildLog(); - - if (!logs) - return; + std::list<NewsLogEntry> const& newsLog = m_newsLog.GetGuildLog(); WorldPackets::Guild::GuildNews packet; - packet.NewsEvents.reserve(m_newsLog->GetSize()); + packet.NewsEvents.reserve(newsLog.size()); - for (GuildLog::const_iterator itr = logs->begin(); itr != logs->end(); ++itr) - { - NewsLogEntry* eventLog = static_cast<NewsLogEntry*>(*itr); - eventLog->WritePacket(packet); - } + for (NewsLogEntry const& newsLogEntry : newsLog) + newsLogEntry.WritePacket(packet); session->SendPacket(packet.Write()); @@ -2230,10 +2185,7 @@ 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 = int32(tabId); @@ -2241,12 +2193,9 @@ void Guild::SendBankLog(WorldSession* session, uint8 tabId) const //if (tabId == GUILD_BANK_MAX_TABS && hasCashFlow) // 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 = static_cast<BankEventLogEntry*>(*itr); - bankEventLog->WritePacket(packet); - } + packet.Entry.reserve(bankEventLog.size()); + for (BankEventLogEntry const& entry : bankEventLog) + entry.WritePacket(packet); session->SendPacket(packet.Write()); @@ -2277,10 +2226,9 @@ void Guild::SendPermissions(WorldSession* session) const for (uint8 tabId = 0; tabId < GUILD_BANK_MAX_TABS; ++tabId) { - WorldPackets::Guild::GuildPermissionsQueryResults::GuildRankTabPermissions tabPerm; + WorldPackets::Guild::GuildPermissionsQueryResults::GuildRankTabPermissions& tabPerm = queryResult.Tab.emplace_back(); tabPerm.Flags = _GetRankBankTabRights(rankId, tabId); - tabPerm.WithdrawItemLimit = _GetMemberRemainingSlots(member, tabId); - queryResult.Tab.push_back(tabPerm); + tabPerm.WithdrawItemLimit = _GetMemberRemainingSlots(*member, tabId); } session->SendPacket(queryResult.Write()); @@ -2293,7 +2241,7 @@ void Guild::SendMoneyInfo(WorldSession* session) const if (!member) return; - int64 amount = _GetMemberRemainingMoney(member); + int64 amount = _GetMemberRemainingMoney(*member); WorldPackets::Guild::GuildBankRemainingWithdrawMoney packet; packet.RemainingWithdrawMoney = amount; @@ -2468,11 +2416,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; } @@ -2489,17 +2436,24 @@ bool Guild::LoadMemberFromDB(Field* fields) { ObjectGuid::LowType lowguid = fields[1].GetUInt64(); ObjectGuid playerGuid(ObjectGuid::Create<HighGuid::Player>(lowguid)); - Member* member = new Member(m_id, playerGuid, GuildRankId(fields[2].GetUInt8())); - if (!member->LoadFromDB(fields)) + + auto [memberIt, isNew] = m_members.try_emplace(playerGuid, m_id, playerGuid, GuildRankId(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); Guild::_DeleteMemberFromDB(trans, lowguid); - delete member; + m_members.erase(memberIt); return false; } sCharacterCache->UpdateCharacterGuildId(playerGuid, GetId()); - m_members[member->GetGUID()] = member; return true; } @@ -2511,18 +2465,18 @@ void Guild::LoadBankRightFromDB(Field* fields) _SetRankBankTabRightsAndSlots(GuildRankId(fields[2].GetUInt8()), rightsAndSlots, false); } -bool Guild::LoadEventLogFromDB(Field* fields) const +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 fields[6].GetInt64(), // timestamp GuildEventLogTypes(fields[2].GetUInt8()), // event type fields[3].GetUInt64(), // player guid 1 fields[4].GetUInt64(), // player guid 2 - fields[5].GetUInt8())); // rank + fields[5].GetUInt8()); // rank return true; } return false; @@ -2535,8 +2489,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()) { uint32 guid = fields[2].GetUInt32(); GuildBankEventLogTypes eventType = GuildBankEventLogTypes(fields[3].GetUInt8()); @@ -2553,7 +2507,7 @@ bool Guild::LoadBankEventLogFromDB(Field* fields) TC_LOG_ERROR("guild", "GuildBankEventLog ERROR: non-money event (LogGuid: %u, Guild: " UI64FMTD ") belongs to money tab, ignoring...", guid, m_id); return false; } - pLog->LoadEvent(new BankEventLogEntry( + bankLog.LoadEvent( m_id, // guild id guid, // guid fields[8].GetInt64(), // timestamp @@ -2562,25 +2516,25 @@ bool Guild::LoadBankEventLogFromDB(Field* fields) fields[4].GetUInt64(), // player guid fields[5].GetUInt64(), // item or money fields[6].GetUInt16(), // itam stack count - fields[7].GetUInt8())); // dest tab id + fields[7].GetUInt8()); // dest tab id } } return true; } -void Guild::LoadGuildNewsLogFromDB(Field* fields) const +void Guild::LoadGuildNewsLogFromDB(Field* fields) { - if (!m_newsLog->CanInsert()) + if (!m_newsLog.CanInsert()) return; - m_newsLog->LoadEvent(new NewsLogEntry( + m_newsLog.LoadEvent( m_id, // guild id fields[1].GetUInt32(), // guid fields[6].GetInt64(), // timestamp //64 bits? GuildNews(fields[2].GetUInt8()), // type ObjectGuid::Create<HighGuid::Player>(fields[3].GetUInt64()), // player guid fields[4].GetUInt32(), // Flags - fields[5].GetUInt32())); // value + fields[5].GetUInt32()); // value } void Guild::LoadBankTabFromDB(Field* fields) @@ -2589,7 +2543,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) @@ -2601,7 +2555,7 @@ bool Guild::LoadBankItemFromDB(Field* fields) fields[0].GetUInt32(), fields[1].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. @@ -2643,9 +2597,9 @@ bool Guild::Validate() } // Validate members' data - for (auto itr = m_members.begin(); itr != m_members.end(); ++itr) - if (!GetRankInfo(itr->second->GetRankId())) - itr->second->ChangeRank(trans, _GetLowestRankId()); + for (auto& [guid, member] : m_members) + if (!GetRankInfo(member.GetRankId())) + member.ChangeRank(trans, _GetLowestRankId()); // Repair the structure of the guild. // If the guildmaster doesn't exist or isn't member of the guild @@ -2663,13 +2617,13 @@ bool Guild::Validate() } } else if (!leader->IsRank(GuildRankId::GuildMaster)) - _SetLeader(trans, leader); + _SetLeader(trans, *leader); // Check config if multiple guildmasters are allowed if (!sConfigMgr->GetBoolDefault("Guild.AllowMultipleGuildMaster", false)) - for (auto itr = m_members.begin(); itr != m_members.end(); ++itr) - if (itr->second->GetRankId() == GuildRankId::GuildMaster && !itr->second->IsSamePlayer(m_leaderGuid)) - itr->second->ChangeRank(trans, GetRankInfo(GuildRankOrder(1))->GetId()); + for (auto& [guid, member] : m_members) + if (member.GetRankId() == GuildRankId::GuildMaster && !member.IsSamePlayer(m_leaderGuid)) + member.ChangeRank(trans, GetRankInfo(GuildRankOrder(1))->GetId()); if (trans->GetSize() > 0) CharacterDatabase.CommitTransaction(trans); @@ -2678,30 +2632,30 @@ 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)) { WorldPackets::Chat::Chat packet; packet.Initialize(officerOnly ? CHAT_MSG_OFFICER : CHAT_MSG_GUILD, Language(language), session->GetPlayer(), nullptr, msg); WorldPacket const* data = packet.Write(); - 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(), session->GetAccountGUID())) player->SendDirectMessage(data); } } -void Guild::BroadcastAddonToGuild(WorldSession* session, bool officerOnly, std::string const& msg, std::string const& prefix, bool isLogged) const +void Guild::BroadcastAddonToGuild(WorldSession* session, bool officerOnly, std::string_view msg, std::string_view prefix, bool isLogged) const { if (session && session->GetPlayer() && _HasRankRight(session->GetPlayer(), officerOnly ? GR_RIGHT_OFFCHATSPEAK : GR_RIGHT_GCHATSPEAK)) { WorldPackets::Chat::Chat packet; packet.Initialize(officerOnly ? CHAT_MSG_OFFICER : CHAT_MSG_GUILD, isLogged ? LANG_ADDON_LOGGED : LANG_ADDON, session->GetPlayer(), nullptr, msg, 0, "", DEFAULT_LOCALE, prefix); WorldPacket const* data = packet.Write(); - for (Members::const_iterator 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.FindPlayer()) if (player->GetSession() && _HasRankRight(player, officerOnly ? GR_RIGHT_OFFCHATLISTEN : GR_RIGHT_GCHATLISTEN) && !player->GetSocial()->HasIgnore(session->GetPlayer()->GetGUID(), session->GetAccountGUID()) && player->GetSession()->IsAddonRegistered(prefix)) @@ -2711,24 +2665,24 @@ void Guild::BroadcastAddonToGuild(WorldSession* session, bool officerOnly, std:: void Guild::BroadcastPacketToRank(WorldPacket const* packet, GuildRankId 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); } void Guild::BroadcastPacketIfTrackingAchievement(WorldPacket const* packet, uint32 criteriaId) const { - for (Members::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr) - if (itr->second->IsTrackingCriteriaId(criteriaId)) - if (Player* player = itr->second->FindPlayer()) + for (auto const& [guid, member] : m_members) + if (member.IsTrackingCriteriaId(criteriaId)) + if (Player* player = member.FindPlayer()) player->GetSession()->SendPacket(packet); } @@ -2736,7 +2690,7 @@ void Guild::MassInviteToEvent(WorldSession* session, uint32 minLevel, uint32 max { WorldPackets::Calendar::CalendarCommunityInvite packet; - 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 (packet.Invites.size() >= CALENDAR_MAX_INVITES) @@ -2746,19 +2700,18 @@ void Guild::MassInviteToEvent(WorldSession* session, uint32 minLevel, uint32 max return; } - Member* member = itr->second; - if (member->GetGUID() == session->GetPlayer()->GetGUID()) + if (guid == session->GetPlayer()->GetGUID()) continue; - uint32 level = sCharacterCache->GetCharacterLevelByGuid(member->GetGUID()); + uint32 level = sCharacterCache->GetCharacterLevelByGuid(guid); if (level < minLevel || level > maxLevel) continue; - RankInfo const* rank = GetRankInfo(member->GetRankId()); + RankInfo const* rank = GetRankInfo(member.GetRankId()); if (rank->GetOrder() > minRank) continue; - packet.Invites.emplace_back(member->GetGUID(), level); + packet.Invites.emplace_back(guid, level); } session->SendPacket(packet.Write()); @@ -2787,21 +2740,28 @@ bool Guild::AddMember(CharacterDatabaseTransaction& trans, ObjectGuid guid, Opti if (!rankId) rankId = _GetLowestRankId(); - Member* member = new Member(m_id, guid, *rankId); + auto [memberIt, isNew] = m_members.try_emplace(guid, 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[guid] = member; player->SetInGuild(m_id); player->SetGuildIdInvited(UI64LIT(0)); player->SetGuildRank(AsUnderlyingType(*rankId)); player->SetGuildLevel(GetLevel()); + member.SetStats(player); SendLoginInfo(player->GetSession()); name = player->GetName(); } else { - member->ResetFlags(); + member.ResetFlags(); bool ok = false; // Player must exist @@ -2811,7 +2771,7 @@ bool Guild::AddMember(CharacterDatabaseTransaction& trans, ObjectGuid guid, Opti { Field* fields = result->Fetch(); name = fields[0].GetString(); - member->SetStats( + member.SetStats( name, fields[1].GetUInt8(), fields[2].GetUInt8(), @@ -2820,19 +2780,18 @@ bool Guild::AddMember(CharacterDatabaseTransaction& trans, ObjectGuid guid, Opti fields[5].GetUInt32(), 0); - ok = member->CheckStats(); + ok = member.CheckStats(); } if (!ok) { - delete member; + m_members.erase(memberIt); return false; } - m_members[guid] = member; sCharacterCache->UpdateCharacterGuildId(guid, GetId()); } - member->SaveToDB(trans); + member.SaveToDB(trans); _UpdateAccountsNumber(); _LogEvent(GUILD_EVENT_LOG_JOIN_GUILD, lowguid); @@ -2857,12 +2816,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& [memberGuid, member] : m_members) { - if (i->first == guid) - oldLeader = i->second; - else if (!newLeader || newLeader->GetRankId() > i->second->GetRankId()) - newLeader = i->second; + if (memberGuid == guid) + oldLeader = &member; + else if (!newLeader || newLeader->GetRankId() > member.GetRankId()) + newLeader = &member; } if (!newLeader) @@ -2873,7 +2832,7 @@ void Guild::DeleteMember(CharacterDatabaseTransaction& trans, ObjectGuid guid, b return; } - _SetLeader(trans, newLeader); + _SetLeader(trans, *newLeader); // If leader does not exist (at guild loading with deleted leader) do not send broadcasts if (oldLeader) @@ -2885,12 +2844,7 @@ void Guild::DeleteMember(CharacterDatabaseTransaction& trans, ObjectGuid guid, b // Call script on remove before member is actually removed from guild (and database) sScriptMgr->OnGuildRemoveMember(this, guid, isDisbanding, isKicked); - auto memberItr = m_members.find(guid); - if (memberItr != m_members.end()) - { - delete memberItr->second; - m_members.erase(memberItr); - } + m_members.erase(guid); // If player not online data in data field will be loaded from guild tabs no need to update it !! Player* player = ObjectAccessor::FindConnectedPlayer(guid); @@ -2927,8 +2881,7 @@ bool Guild::ChangeMemberRank(CharacterDatabaseTransaction trans, ObjectGuid guid bool Guild::IsMember(ObjectGuid guid) const { - Members::const_iterator itr = m_members.find(guid); - return itr != m_members.end(); + return m_members.find(guid) != m_members.end(); } // Bank (items move) @@ -2960,7 +2913,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)) { @@ -3029,18 +2982,10 @@ void Guild::_DeleteMemberFromDB(CharacterDatabaseTransaction& trans, ObjectGuid: } // Private methods -void Guild::_CreateLogHolders() -{ - m_eventLog = new LogHolder(sWorld->getIntConfig(CONFIG_GUILD_EVENT_LOG_COUNT)); - m_newsLog = new LogHolder(sWorld->getIntConfig(CONFIG_GUILD_NEWS_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(); @@ -3080,7 +3025,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) { if (m_ranks.size() >= GUILD_RANKS_MAX_COUNT) return false; @@ -3116,9 +3061,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(); } @@ -3138,11 +3083,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(); } @@ -3165,17 +3107,14 @@ bool Guild::_ModifyBankMoney(CharacterDatabaseTransaction& trans, uint64 amount, return true; } -void Guild::_SetLeader(CharacterDatabaseTransaction& trans, Member* leader) +void Guild::_SetLeader(CharacterDatabaseTransaction trans, Member& leader) { - if (!leader) - return; - bool isInTransaction = bool(trans); if (!isInTransaction) trans = CharacterDatabase.BeginTransaction(); - m_leaderGuid = leader->GetGUID(); - leader->ChangeRank(trans, GuildRankId::GuildMaster); + m_leaderGuid = leader.GetGUID(); + leader.ChangeRank(trans, GuildRankId::GuildMaster); CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_LEADER); stmt->setUInt64(0, m_leaderGuid.GetCounter()); @@ -3237,37 +3176,33 @@ inline int8 Guild::_GetRankBankTabRights(GuildRankId 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) + GuildRankId rankId = member.GetRankId(); + if (rankId == GuildRankId::GuildMaster) + return static_cast<int32>(GUILD_WITHDRAW_SLOT_UNLIMITED); + if ((_GetRankBankTabRights(rankId, tabId) & GUILD_BANK_RIGHT_VIEW_TAB) != 0) { - GuildRankId rankId = member->GetRankId(); - if (rankId == GuildRankId::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->GetBankTabWithdrawValue(tabId); - if (remaining > 0) - return remaining; - } + + int32 remaining = _GetRankBankTabSlotsPerDay(rankId, tabId) - member.GetBankTabWithdrawValue(tabId); + if (remaining > 0) + return remaining; + } return 0; } -inline int64 Guild::_GetMemberRemainingMoney(Member const* member) const +inline int64 Guild::_GetMemberRemainingMoney(Member const& member) const { - if (member) - { - GuildRankId rankId = member->GetRankId(); - if (rankId == GuildRankId::GuildMaster) - return std::numeric_limits<int64>::max(); + GuildRankId rankId = member.GetRankId(); + if (rankId == GuildRankId::GuildMaster) + return std::numeric_limits<int64>::max(); - if ((_GetRankRights(rankId) & (GR_RIGHT_WITHDRAW_REPAIR | GR_RIGHT_WITHDRAW_GOLD)) != 0) - { - int64 remaining = (int64(_GetRankBankMoneyPerDay(rankId)) * GOLD) - member->GetBankMoneyWithdrawValue(); - if (remaining > 0) - return remaining; - } + if ((_GetRankRights(rankId) & (GR_RIGHT_WITHDRAW_REPAIR | GR_RIGHT_WITHDRAW_GOLD)) != 0) + { + int64 remaining = _GetRankBankMoneyPerDay(rankId) - member.GetBankMoneyWithdrawValue(); + if (remaining > 0) + return remaining; } return 0; } @@ -3294,7 +3229,7 @@ inline bool Guild::_MemberHasTabRights(ObjectGuid guid, uint8 tabId, int32 right 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); @@ -3316,8 +3251,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); } @@ -3515,13 +3450,18 @@ void Guild::_SendBankContentUpdate(uint8 tabId, SlotIds slots) const packet.ItemInfo.push_back(itemInfo); } - 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()) - { - packet.WithdrawalsRemaining = _GetMemberRemainingSlots(itr->second, tabId); - player->GetSession()->SendPacket(packet.Write()); - } + for (auto const& [guid, member] : m_members) + { + if (!_MemberHasTabRights(member.GetGUID(), tabId, GUILD_BANK_RIGHT_VIEW_TAB)) + continue; + + Player* player = member.FindPlayer(); + if (!player) + continue; + + packet.WithdrawalsRemaining = _GetMemberRemainingSlots(member, tabId); + player->GetSession()->SendPacket(packet.Write()); + } } } @@ -3534,7 +3474,7 @@ void Guild::SendBankList(WorldSession* session, uint8 tabId, bool fullUpdate) co WorldPackets::Guild::GuildBankQueryResults packet; packet.Money = m_bankMoney; - packet.WithdrawalsRemaining = _GetMemberRemainingSlots(member, tabId); + packet.WithdrawalsRemaining = _GetMemberRemainingSlots(*member, tabId); packet.Tab = int32(tabId); packet.FullUpdate = fullUpdate; @@ -3544,11 +3484,10 @@ void Guild::SendBankList(WorldSession* session, uint8 tabId, bool fullUpdate) co packet.TabInfo.reserve(_GetPurchasedTabsSize()); for (uint8 i = 0; i < _GetPurchasedTabsSize(); ++i) { - WorldPackets::Guild::GuildBankTabInfo tabInfo; + WorldPackets::Guild::GuildBankTabInfo& tabInfo = packet.TabInfo.emplace_back(); tabInfo.TabIndex = i; - tabInfo.Name = m_bankTabs[i]->GetName(); - tabInfo.Icon = m_bankTabs[i]->GetIcon(); - packet.TabInfo.push_back(tabInfo); + tabInfo.Name = m_bankTabs[i].GetName(); + tabInfo.Icon = m_bankTabs[i].GetIcon(); } } @@ -3570,7 +3509,8 @@ void Guild::SendBankList(WorldSession* session, uint8 tabId, bool fullUpdate) co { if (Item* tabItem = tab->GetItem(slotId)) { - WorldPackets::Guild::GuildBankItemInfo itemInfo; + WorldPackets::Guild::GuildBankItemInfo& itemInfo = packet.ItemInfo.emplace_back(); + itemInfo.Slot = int32(slotId); itemInfo.Item.ItemID = tabItem->GetEntry(); @@ -3594,8 +3534,6 @@ void Guild::SendBankList(WorldSession* session, uint8 tabId, bool fullUpdate) co } itemInfo.Locked = false; - - packet.ItemInfo.push_back(itemInfo); } } } @@ -3625,10 +3563,10 @@ void Guild::SendGuildRanksUpdate(ObjectGuid setterGuid, ObjectGuid targetGuid, G void Guild::ResetTimes(bool weekly) { - for (auto itr = m_members.begin(); itr != m_members.end(); ++itr) + for (auto& [guid, member] : m_members) { - itr->second->ResetValues(weekly); - if (Player* player = itr->second->FindPlayer()) + member.ResetValues(weekly); + if (Player* player = member.FindPlayer()) { WorldPackets::Guild::GuildMemberDailyReset packet; // tells the client to request bank withdrawal limit player->GetSession()->SendPacket(packet.Write()); @@ -3636,17 +3574,15 @@ void Guild::ResetTimes(bool weekly) } } -void Guild::AddGuildNews(uint8 type, ObjectGuid guid, uint32 flags, uint32 value) const +void Guild::AddGuildNews(uint8 type, ObjectGuid guid, uint32 flags, uint32 value) { - NewsLogEntry* news = new NewsLogEntry(m_id, m_newsLog->GetNextGUID(), GuildNews(type), guid, flags, value); - CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction(); - m_newsLog->AddEvent(trans, news); + NewsLogEntry& news = m_newsLog.AddEvent(trans, m_id, m_newsLog.GetNextGUID(), GuildNews(type), guid, flags, value); CharacterDatabase.CommitTransaction(trans); WorldPackets::Guild::GuildNews newsPacket; newsPacket.NewsEvents.reserve(1); - news->WritePacket(newsPacket); + news.WritePacket(newsPacket); BroadcastPacket(newsPacket.Write()); } @@ -3660,28 +3596,27 @@ void Guild::UpdateCriteria(CriteriaType type, uint64 miscValue1, uint64 miscValu m_achievementMgr.UpdateCriteria(type, miscValue1, miscValue2, miscValue3, ref, player); } -void Guild::HandleNewsSetSticky(WorldSession* session, uint32 newsId, bool sticky) const +void Guild::HandleNewsSetSticky(WorldSession* session, uint32 newsId, bool sticky) { - GuildLog* logs = m_newsLog->GetGuildLog(); - GuildLog::iterator itr = logs->begin(); - while (itr != logs->end() && (*itr)->GetGUID() != newsId) + std::list<NewsLogEntry>& newsLog = m_newsLog.GetGuildLog(); + auto itr = newsLog.begin(); + while (itr != newsLog.end() && itr->GetGUID() != newsId) ++itr; - if (itr == logs->end()) + if (itr == newsLog.end()) { TC_LOG_DEBUG("guild", "HandleNewsSetSticky: [%s] requested unknown newsId %u - Sticky: %u", session->GetPlayerInfo().c_str(), newsId, sticky); return; } - NewsLogEntry* news = static_cast<NewsLogEntry*>(*itr); - news->SetSticky(sticky); + itr->SetSticky(sticky); TC_LOG_DEBUG("guild", "HandleNewsSetSticky: [%s] changed newsId %u sticky to %u", session->GetPlayerInfo().c_str(), newsId, sticky); WorldPackets::Guild::GuildNews newsPacket; newsPacket.NewsEvents.reserve(1); - news->WritePacket(newsPacket); + itr->WritePacket(newsPacket); session->SendPacket(newsPacket.Write()); } diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index 8167d04b31e..075acebb06e 100644 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -24,7 +24,9 @@ #include "Optional.h" #include "RaceMask.h" #include "SharedDefines.h" +#include <set> #include <unordered_map> +#include <unordered_set> class Item; class Player; @@ -296,9 +298,7 @@ class GuildBankRightsAndSlots int32 slots; }; -typedef std::vector <GuildBankRightsAndSlots> GuildBankRightsAndSlotsVec; - -typedef std::set <uint8> SlotIds; +using SlotIds = std::set<uint8>; class TC_GAME_API Guild { @@ -310,11 +310,11 @@ class TC_GAME_API Guild Member(ObjectGuid::LowType guildId, ObjectGuid guid, GuildRankId rankId); void SetStats(Player* player); - void SetStats(std::string const& name, uint8 level, uint8 _class, uint8 gender, uint32 zoneId, uint32 accountId, uint32 reputation); + void SetStats(std::string_view name, uint8 level, uint8 _class, uint8 gender, uint32 zoneId, uint32 accountId, uint32 reputation); bool CheckStats() const; - void SetPublicNote(std::string const& publicNote); - void SetOfficerNote(std::string const& officerNote); + void SetPublicNote(std::string_view publicNote); + void SetOfficerNote(std::string_view officerNote); void SetZoneId(uint32 id) { m_zoneId = id; } void SetAchievementPoints(uint32 val) { m_achievementPoints = val; } void SetLevel(uint8 var) { m_level = var; } @@ -385,7 +385,7 @@ class TC_GAME_API Guild std::set<uint32> m_trackedCriteriaIds; - uint32 m_bankWithdraw[GUILD_BANK_MAX_TABS]; + std::array<uint32, GUILD_BANK_MAX_TABS> m_bankWithdraw; uint64 m_bankWithdrawMoney; uint32 m_achievementPoints; uint64 m_totalActivity; @@ -510,27 +510,30 @@ class TC_GAME_API Guild }; // Class encapsulating work with events collection - typedef std::list<LogEntry*> GuildLog; - + template <typename Entry> class LogHolder { public: - LogHolder(uint32 maxRecords) : m_maxRecords(maxRecords), m_nextGUID(uint32(GUILD_EVENT_LOG_GUID_UNDEFINED)) { } - ~LogHolder(); + LogHolder(); + + // Checks if new log entry can be added to holder + bool CanInsert() const { return m_log.size() < m_maxRecords; } - uint8 GetSize() const { return uint8(m_log.size()); } - // Checks if new log entry can be added to holder when loading from DB - inline bool CanInsert() const { return m_log.size() < m_maxRecords; } // Adds event from DB to collection - void LoadEvent(LogEntry* entry); + template <typename... Ts> + void LoadEvent(Ts&&... args); + // Adds new event to collection and saves it to DB - void AddEvent(CharacterDatabaseTransaction& trans, LogEntry* entry); + template <typename... Ts> + Entry& AddEvent(CharacterDatabaseTransaction trans, Ts&&... args); + uint32 GetNextGUID(); - GuildLog* GetGuildLog() { return &m_log; } + std::list<Entry>& GetGuildLog() { return m_log; } + std::list<Entry> const& GetGuildLog() const { return m_log; } private: - GuildLog m_log; - uint32 m_maxRecords; + std::list<Entry> m_log; + uint32 const m_maxRecords; uint32 m_nextGUID; }; @@ -540,7 +543,7 @@ class TC_GAME_API Guild public: RankInfo(): m_guildId(UI64LIT(0)), m_rankId(GuildRankId(0xFF)), m_rankOrder(GuildRankOrder(0)), m_rights(GR_RIGHT_NONE), m_bankMoneyPerDay(0) { } RankInfo(ObjectGuid::LowType guildId) : m_guildId(guildId), m_rankId(GuildRankId(0xFF)), m_rankOrder(GuildRankOrder(0)), m_rights(GR_RIGHT_NONE), m_bankMoneyPerDay(0) { } - RankInfo(ObjectGuid::LowType guildId, GuildRankId rankId, GuildRankOrder rankOrder, std::string const& name, uint32 rights, uint32 money) : + RankInfo(ObjectGuid::LowType guildId, GuildRankId rankId, GuildRankOrder rankOrder, std::string_view name, uint32 rights, uint32 money) : m_guildId(guildId), m_rankId(rankId), m_rankOrder(rankOrder), m_name(name), m_rights(rights), m_bankMoneyPerDay(money) { } void LoadFromDB(Field* fields); @@ -552,7 +555,7 @@ class TC_GAME_API Guild void SetOrder(GuildRankOrder rankOrder) { m_rankOrder = rankOrder; } std::string const& GetName() const { return m_name; } - void SetName(std::string const& name); + void SetName(std::string_view name); uint32 GetRights() const { return m_rights; } void SetRights(uint32 rights); @@ -584,7 +587,7 @@ class TC_GAME_API Guild std::string m_name; uint32 m_rights; uint32 m_bankMoneyPerDay; - GuildBankRightsAndSlots m_bankTabRightsAndSlots[GUILD_BANK_MAX_TABS]; + std::array<GuildBankRightsAndSlots, GUILD_BANK_MAX_TABS> m_bankTabRightsAndSlots = {}; }; class BankTab @@ -596,8 +599,8 @@ class TC_GAME_API Guild bool LoadItemFromDB(Field* fields); void Delete(CharacterDatabaseTransaction& trans, bool removeItemsFromDB = false); - void SetInfo(std::string const& name, std::string const& icon); - void SetText(std::string const& text); + void SetInfo(std::string_view name, std::string_view icon); + void SetText(std::string_view text); void SendText(Guild const* guild, WorldSession* session) const; std::string const& GetName() const { return m_name; } @@ -611,7 +614,7 @@ class TC_GAME_API Guild ObjectGuid::LowType m_guildId; uint8 m_tabId; - Item* m_items[GUILD_BANK_MAX_SLOTS]; + std::array<Item*, GUILD_BANK_MAX_SLOTS> m_items = {}; std::string m_name; std::string m_icon; std::string m_text; @@ -706,18 +709,14 @@ class TC_GAME_API Guild void CanStoreItemInTab(Item* pItem, uint8 skipSlotId, bool merge, uint32& count); }; - typedef std::unordered_map<ObjectGuid, Member*> Members; - typedef std::vector<RankInfo> Ranks; - typedef std::vector<BankTab*> BankTabs; - public: - static void SendCommandResult(WorldSession* session, GuildCommandType type, GuildCommandError errCode, std::string const& param = ""); + static void SendCommandResult(WorldSession* session, GuildCommandType type, GuildCommandError errCode, std::string_view param = ""); static void SendSaveEmblemResult(WorldSession* session, GuildEmblemError errCode); Guild(); ~Guild(); - bool Create(Player* pLeader, std::string const& name); + bool Create(Player* pLeader, std::string_view name); void Disband(); void SaveToDB(); @@ -732,28 +731,28 @@ class TC_GAME_API Guild time_t GetCreatedDate() const { return m_createdDate; } uint64 GetBankMoney() const { return m_bankMoney; } - bool SetName(std::string const& name); + bool SetName(std::string_view name); // Handle client commands void HandleRoster(WorldSession* session); void SendQueryResponse(WorldSession* session, ObjectGuid const& playerGuid); void HandleSetAchievementTracking(WorldSession* session, uint32 const* achievementIdsBegin, uint32 const* achievementIdsEnd); void HandleGetAchievementMembers(WorldSession* session, uint32 achievementId) const; - void HandleSetMOTD(WorldSession* session, std::string const& motd); - void HandleSetInfo(WorldSession* session, std::string const& info); + void HandleSetMOTD(WorldSession* session, std::string_view motd); + void HandleSetInfo(WorldSession* session, std::string_view info); void HandleSetEmblem(WorldSession* session, EmblemInfo const& emblemInfo); - void HandleSetNewGuildMaster(WorldSession* session, std::string const& name, bool isSelfPromote); - void HandleSetBankTabInfo(WorldSession* session, uint8 tabId, std::string const& name, std::string const& icon); - void HandleSetMemberNote(WorldSession* session, std::string const& note, ObjectGuid guid, bool isPublic); - void HandleSetRankInfo(WorldSession* session, GuildRankId rankId, std::string const& name, uint32 rights, uint32 moneyPerDay, GuildBankRightsAndSlotsVec const& rightsAndSlots); + void HandleSetNewGuildMaster(WorldSession* session, std::string_view name, bool isSelfPromote); + void HandleSetBankTabInfo(WorldSession* session, uint8 tabId, std::string_view name, std::string_view icon); + void HandleSetMemberNote(WorldSession* session, std::string_view note, ObjectGuid guid, bool isPublic); + void HandleSetRankInfo(WorldSession* session, GuildRankId rankId, std::string_view name, uint32 rights, uint32 moneyPerDay, std::array<GuildBankRightsAndSlots, GUILD_BANK_MAX_TABS> const& rightsAndSlots); void HandleBuyBankTab(WorldSession* session, uint8 tabId); - void HandleInviteMember(WorldSession* session, std::string const& name); + void HandleInviteMember(WorldSession* session, std::string_view name); void HandleAcceptMember(WorldSession* session); void HandleLeaveMember(WorldSession* session); void HandleRemoveMember(WorldSession* session, ObjectGuid guid); void HandleUpdateMemberRank(WorldSession* session, ObjectGuid guid, bool demote); void HandleSetMemberRank(WorldSession* session, ObjectGuid guid, ObjectGuid setterGuid, GuildRankOrder rank); - void HandleAddNewRank(WorldSession* session, std::string const& name); + void HandleAddNewRank(WorldSession* session, std::string_view name); void HandleRemoveRank(WorldSession* session, GuildRankOrder rankOrder); void HandleShiftRank(WorldSession* session, GuildRankOrder rankOrder, bool shiftUp); void HandleMemberDepositMoney(WorldSession* session, uint64 amount, bool cashFlow = false); @@ -761,7 +760,7 @@ class TC_GAME_API Guild void HandleMemberLogout(WorldSession* session); void HandleDelete(WorldSession* session); void HandleGuildPartyRequest(WorldSession* session) const; - void HandleNewsSetSticky(WorldSession* session, uint32 newsId, bool sticky) const; + void HandleNewsSetSticky(WorldSession* session, uint32 newsId, bool sticky); void HandleGuildRequestChallengeUpdate(WorldSession* session) const; void UpdateMemberData(Player* player, uint8 dataid, uint32 value); @@ -788,10 +787,10 @@ class TC_GAME_API Guild // Load from DB bool LoadFromDB(Field* fields); - void LoadGuildNewsLogFromDB(Field* fields) const; + void LoadGuildNewsLogFromDB(Field* fields); void LoadRankFromDB(Field* fields); bool LoadMemberFromDB(Field* fields); - bool LoadEventLogFromDB(Field* fields) const; + bool LoadEventLogFromDB(Field* fields); void LoadBankRightFromDB(Field* fields); void LoadBankTabFromDB(Field* fields); bool LoadBankEventLogFromDB(Field* fields); @@ -799,8 +798,8 @@ class TC_GAME_API Guild bool Validate(); // Broadcasts - void BroadcastToGuild(WorldSession* session, bool officerOnly, std::string const& msg, uint32 language = LANG_UNIVERSAL) const; - void BroadcastAddonToGuild(WorldSession* session, bool officerOnly, std::string const& msg, std::string const& prefix, bool isLogged) const; + void BroadcastToGuild(WorldSession* session, bool officerOnly, std::string_view msg, uint32 language = LANG_UNIVERSAL) const; + void BroadcastAddonToGuild(WorldSession* session, bool officerOnly, std::string_view msg, std::string_view prefix, bool isLogged) const; void BroadcastPacketToRank(WorldPacket const* packet, GuildRankId rankId) const; void BroadcastPacket(WorldPacket const* packet) const; void BroadcastPacketIfTrackingAchievement(WorldPacket const* packet, uint32 criteriaId) const; @@ -811,7 +810,7 @@ class TC_GAME_API Guild void BroadcastWorker(Do& _do, Player* except = nullptr) { for (auto itr = m_members.begin(); itr != m_members.end(); ++itr) - if (Player* player = itr->second->FindConnectedPlayer()) + if (Player* player = itr->second.FindConnectedPlayer()) if (player != except) _do(player); } @@ -829,7 +828,7 @@ class TC_GAME_API Guild void SwapItemsWithInventory(Player* player, bool toChar, uint8 tabId, uint8 slotId, uint8 playerBag, uint8 playerSlotId, uint32 splitedAmount); // Bank tabs - void SetBankTabText(uint8 tabId, std::string const& text); + void SetBankTabText(uint8 tabId, std::string_view text); GuildAchievementMgr& GetAchievementMgr() { return m_achievementMgr; } GuildAchievementMgr const& GetAchievementMgr() const { return m_achievementMgr; } @@ -837,7 +836,7 @@ class TC_GAME_API Guild // Pre-6.x guild leveling uint8 GetLevel() const { return GUILD_OLD_MAX_LEVEL; } - void AddGuildNews(uint8 type, ObjectGuid guid, uint32 flags, uint32 value) const; + void AddGuildNews(uint8 type, ObjectGuid guid, uint32 flags, uint32 value); EmblemInfo const& GetEmblemInfo() const { return m_emblemInfo; } void ResetTimes(bool weekly); @@ -857,14 +856,14 @@ class TC_GAME_API Guild uint32 m_accountsNumber; uint64 m_bankMoney; - Ranks m_ranks; - Members m_members; - BankTabs m_bankTabs; + std::vector<RankInfo> m_ranks; + std::unordered_map<ObjectGuid, Member> m_members; + std::vector<BankTab> m_bankTabs; // These are actually ordered lists. The first element is the oldest entry. - LogHolder* m_eventLog; - LogHolder* m_bankEventLog[GUILD_BANK_MAX_TABS + 1]; - LogHolder* m_newsLog; + LogHolder<EventLogEntry> m_eventLog; + std::array<LogHolder<BankEventLogEntry>, GUILD_BANK_MAX_TABS + 1> m_bankEventLog = {}; + LogHolder<NewsLogEntry> m_newsLog; GuildAchievementMgr m_achievementMgr; private: @@ -878,46 +877,44 @@ class TC_GAME_API Guild inline GuildRankId _GetLowestRankId() const { return m_ranks.back().GetId(); } inline uint8 _GetPurchasedTabsSize() const { return uint8(m_bankTabs.size()); } - inline BankTab* GetBankTab(uint8 tabId) { return tabId < m_bankTabs.size() ? m_bankTabs[tabId] : nullptr; } - inline BankTab const* GetBankTab(uint8 tabId) const { return tabId < m_bankTabs.size() ? m_bankTabs[tabId] : nullptr; } + inline BankTab* GetBankTab(uint8 tabId) { return tabId < m_bankTabs.size() ? &m_bankTabs[tabId] : nullptr; } + inline BankTab const* GetBankTab(uint8 tabId) const { return tabId < m_bankTabs.size() ? &m_bankTabs[tabId] : nullptr; } inline Member const* GetMember(ObjectGuid const& guid) const { auto itr = m_members.find(guid); - return itr != m_members.end() ? itr->second : nullptr; + return (itr != m_members.end()) ? &itr->second : nullptr; } inline Member* GetMember(ObjectGuid const& guid) { auto itr = m_members.find(guid); - return itr != m_members.end() ? itr->second : nullptr; + return (itr != m_members.end()) ? &itr->second : nullptr; } - inline Member* GetMember(std::string const& name) + inline Member* GetMember(std::string_view name) { for (auto itr = m_members.begin(); itr != m_members.end(); ++itr) - if (itr->second->GetName() == name) - return itr->second; + if (itr->second.GetName() == name) + return &itr->second; return nullptr; } static void _DeleteMemberFromDB(CharacterDatabaseTransaction& trans, ObjectGuid::LowType lowguid); - // Creates log holders (either when loading or when creating guild) - void _CreateLogHolders(); // Tries to create new bank tab void _CreateNewBankTab(); // Creates default guild ranks with names in given locale void _CreateDefaultGuildRanks(CharacterDatabaseTransaction& trans, LocaleConstant loc); // Creates new rank - bool _CreateRank(CharacterDatabaseTransaction& trans, std::string const& name, uint32 rights); + bool _CreateRank(CharacterDatabaseTransaction& trans, std::string_view name, uint32 rights); // Update account number when member added/removed from guild void _UpdateAccountsNumber(); bool _IsLeader(Player* player) const; void _DeleteBankItems(CharacterDatabaseTransaction& trans, bool removeItemsFromDB = false); bool _ModifyBankMoney(CharacterDatabaseTransaction& trans, uint64 amount, bool add); - void _SetLeader(CharacterDatabaseTransaction& trans, Member* leader); + void _SetLeader(CharacterDatabaseTransaction trans, Member& leader); void _SetRankBankMoneyPerDay(GuildRankId rankId, uint32 moneyPerDay); void _SetRankBankTabRightsAndSlots(GuildRankId rankId, GuildBankRightsAndSlots rightsAndSlots, bool saveToDB = true); @@ -927,8 +924,8 @@ class TC_GAME_API Guild int32 _GetRankBankTabSlotsPerDay(GuildRankId rankId, uint8 tabId) const; std::string _GetRankName(GuildRankId rankId) const; - int32 _GetMemberRemainingSlots(Member const* member, uint8 tabId) const; - int64 _GetMemberRemainingMoney(Member const* member) const; + int32 _GetMemberRemainingSlots(Member const& member, uint8 tabId) const; + int64 _GetMemberRemainingMoney(Member const& member) const; void _UpdateMemberWithdrawSlots(CharacterDatabaseTransaction& trans, ObjectGuid guid, uint8 tabId); bool _MemberHasTabRights(ObjectGuid guid, uint8 tabId, int32 rights) const; diff --git a/src/server/game/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp index a497d20b652..aa113f369e4 100644 --- a/src/server/game/Guilds/GuildMgr.cpp +++ b/src/server/game/Guilds/GuildMgr.cpp @@ -21,6 +21,7 @@ #include "Guild.h" #include "Log.h" #include "ObjectMgr.h" +#include "Util.h" #include "World.h" #include <algorithm> @@ -81,17 +82,12 @@ Guild* GuildMgr::GetGuildByGuid(ObjectGuid guid) const return nullptr; } -Guild* GuildMgr::GetGuildByName(const std::string& guildName) const +Guild* GuildMgr::GetGuildByName(std::string_view guildName) const { - std::string search = guildName; - std::transform(search.begin(), search.end(), search.begin(), ::toupper); - for (GuildContainer::const_iterator itr = GuildStore.begin(); itr != GuildStore.end(); ++itr) - { - std::string gname = itr->second->GetName(); - std::transform(gname.begin(), gname.end(), gname.begin(), ::toupper); - if (search == gname) - return itr->second; - } + for (auto [id, guild] : GuildStore) + if (StringEqualI(guild->GetName(), guildName)) + return guild; + return nullptr; } diff --git a/src/server/game/Guilds/GuildMgr.h b/src/server/game/Guilds/GuildMgr.h index bcd11d226ac..f700f8122c1 100644 --- a/src/server/game/Guilds/GuildMgr.h +++ b/src/server/game/Guilds/GuildMgr.h @@ -40,7 +40,7 @@ public: Guild* GetGuildByLeader(ObjectGuid guid) const; Guild* GetGuildById(ObjectGuid::LowType guildId) const; Guild* GetGuildByGuid(ObjectGuid guid) const; - Guild* GetGuildByName(std::string const& guildName) const; + Guild* GetGuildByName(std::string_view guildName) const; std::string GetGuildNameById(ObjectGuid::LowType guildId) const; void LoadGuildRewards(); diff --git a/src/server/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp index 8c82e3ae0e7..3596e1fefdd 100644 --- a/src/server/game/Handlers/GuildHandler.cpp +++ b/src/server/game/Handlers/GuildHandler.cpp @@ -514,7 +514,7 @@ void WorldSession::HandleGuildSetRankPermissions(WorldPackets::Guild::GuildSetRa if (!guild) return; - GuildBankRightsAndSlotsVec rightsAndSlots(GUILD_BANK_MAX_TABS); + std::array<GuildBankRightsAndSlots, GUILD_BANK_MAX_TABS> rightsAndSlots; for (uint8 tabId = 0; tabId < GUILD_BANK_MAX_TABS; ++tabId) rightsAndSlots[tabId] = GuildBankRightsAndSlots(tabId, uint8(packet.TabFlags[tabId]), uint32(packet.TabWithdrawItemLimit[tabId])); diff --git a/src/server/game/Server/Packets/PacketUtilities.h b/src/server/game/Server/Packets/PacketUtilities.h index 3be2bf786a9..a4ecc96c08c 100644 --- a/src/server/game/Server/Packets/PacketUtilities.h +++ b/src/server/game/Server/Packets/PacketUtilities.h @@ -22,6 +22,7 @@ #include "Duration.h" #include "Tuples.h" #include <boost/container/static_vector.hpp> +#include <string_view> #include <ctime> namespace WorldPackets @@ -79,6 +80,7 @@ namespace WorldPackets bool empty() const { return _storage.empty(); } char const* c_str() const { return _storage.c_str(); } + operator std::string_view() const { return _storage; } operator std::string&() { return _storage; } operator std::string const&() const { return _storage; } diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 8e58a700c6c..0e14b0afc49 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -931,7 +931,7 @@ void WorldSession::SaveTutorialsData(CharacterDatabaseTransaction& trans) _tutorialsChanged &= ~TUTORIALS_FLAG_CHANGED; } -bool WorldSession::IsAddonRegistered(const std::string& prefix) const +bool WorldSession::IsAddonRegistered(std::string_view prefix) const { if (!_filterAddonMessages) // if we have hit the softcap (64) nothing should be filtered return true; diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 89f0038d6fc..b71a6a193d3 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -962,7 +962,7 @@ class TC_GAME_API WorldSession bool PlayerRecentlyLoggedOut() const { return m_playerRecentlyLogout; } bool PlayerDisconnected() const; - bool IsAddonRegistered(const std::string& prefix) const; + bool IsAddonRegistered(std::string_view prefix) const; void SendPacket(WorldPacket const* packet, bool forced = false); void AddInstanceConnection(std::shared_ptr<WorldSocket> sock) { m_Socket[CONNECTION_TYPE_INSTANCE] = sock; } |