aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp16
-rw-r--r--src/server/game/Globals/ObjectMgr.h14
-rw-r--r--src/server/game/Guilds/Guild.cpp454
-rw-r--r--src/server/game/Guilds/Guild.h125
-rw-r--r--src/server/game/Guilds/GuildMgr.cpp16
-rw-r--r--src/server/game/Guilds/GuildMgr.h2
-rw-r--r--src/server/game/Handlers/GuildHandler.cpp2
-rw-r--r--src/server/game/Server/Packets/GuildPackets.cpp2
-rw-r--r--src/server/game/Server/Packets/GuildPackets.h2
-rw-r--r--src/server/game/Server/Packets/PacketUtilities.h2
10 files changed, 287 insertions, 348 deletions
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 8498e19dfc5..c900c4f0ed9 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -8501,7 +8501,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))
@@ -8585,7 +8585,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))
@@ -8610,7 +8610,7 @@ ResponseCodes ObjectMgr::CheckPlayerName(std::string const& name, LocaleConstant
return ValidateName(wname, locale);
}
-bool ObjectMgr::IsValidCharterName(const std::string& name)
+bool ObjectMgr::IsValidCharterName(std::string_view name)
{
std::wstring wname;
if (!Utf8toWStr(name, wname))
@@ -8628,7 +8628,7 @@ bool ObjectMgr::IsValidCharterName(const std::string& name)
return isValidString(wname, strictMask, true);
}
-PetNameInvalidReason ObjectMgr::CheckPetName(const std::string& name, LocaleConstant locale)
+PetNameInvalidReason ObjectMgr::CheckPetName(std::string_view name, LocaleConstant locale)
{
std::wstring wname;
if (!Utf8toWStr(name, wname))
@@ -8930,7 +8930,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;
@@ -8953,7 +8953,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;
@@ -9005,7 +9005,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;
@@ -9680,7 +9680,7 @@ uint32 ObjectMgr::GetScriptId(std::string const& name)
return 0;
ScriptNameContainer::const_iterator itr = std::lower_bound(_scriptNamesStore.begin(), _scriptNamesStore.end(), name);
- if (itr == _scriptNamesStore.end() || *itr != name)
+ if (itr == _scriptNamesStore.end() || (*itr != name))
return 0;
return uint32(itr - _scriptNamesStore.begin());
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 43eb008f2f2..c06cfa1bf61 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -1468,12 +1468,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, LocaleConstant locale);
- 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, LocaleConstant locale);
+ static bool IsValidCharterName(std::string_view name);
static bool CheckDeclinedNames(const std::wstring& w_ownname, DeclinedName const& names);
@@ -1483,11 +1483,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 creatureId) const;
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);
}
diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h
index eb4ba839923..5c9370093aa 100644
--- a/src/server/game/Guilds/Guild.h
+++ b/src/server/game/Guilds/Guild.h
@@ -21,7 +21,9 @@
#include "DatabaseEnvFwd.h"
#include "ObjectGuid.h"
#include "SharedDefines.h"
+#include <set>
#include <unordered_map>
+#include <unordered_set>
class Item;
class Player;
@@ -274,9 +276,7 @@ class GuildBankRightsAndSlots
uint32 slots;
};
-typedef std::vector <GuildBankRightsAndSlots> GuildBankRightsAndSlotsVec;
-
-typedef std::set <uint8> SlotIds;
+using SlotIds = std::set<uint8>;
class TC_GAME_API Guild
{
@@ -288,11 +288,11 @@ class TC_GAME_API Guild
Member(ObjectGuid::LowType guildId, ObjectGuid guid, uint8 rankId);
void SetStats(Player* player);
- void SetStats(std::string const& name, uint8 level, uint8 _class, uint8 gender, uint32 zoneId, uint32 accountId);
+ void SetStats(std::string_view name, uint8 level, uint8 _class, uint8 gender, uint32 zoneId, uint32 accountId);
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 SetLevel(uint8 var) { m_level = var; }
@@ -348,7 +348,7 @@ class TC_GAME_API Guild
std::string m_publicNote;
std::string m_officerNote;
- int32 m_bankWithdraw[GUILD_BANK_MAX_TABS + 1];
+ std::array<int32, GUILD_BANK_MAX_TABS + 1> m_bankWithdraw = {};
};
// Base class for event entries
@@ -432,27 +432,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>
+ void 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;
};
@@ -462,7 +465,7 @@ class TC_GAME_API Guild
public:
RankInfo(): m_guildId(0), m_rankId(GUILD_RANK_NONE), m_rights(GR_RIGHT_EMPTY), m_bankMoneyPerDay(0) { }
RankInfo(ObjectGuid::LowType guildId) : m_guildId(guildId), m_rankId(GUILD_RANK_NONE), m_rights(GR_RIGHT_EMPTY), m_bankMoneyPerDay(0) { }
- RankInfo(ObjectGuid::LowType guildId, uint8 rankId, std::string const& name, uint32 rights, uint32 money) :
+ RankInfo(ObjectGuid::LowType guildId, uint8 rankId, std::string_view name, uint32 rights, uint32 money) :
m_guildId(guildId), m_rankId(rankId), m_name(name), m_rights(rights),
m_bankMoneyPerDay(rankId != GR_GUILDMASTER ? money : GUILD_WITHDRAW_MONEY_UNLIMITED) { }
@@ -472,7 +475,7 @@ class TC_GAME_API Guild
uint8 GetId() const { return m_rankId; }
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);
@@ -501,7 +504,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
@@ -513,8 +516,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; }
@@ -528,7 +531,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;
@@ -620,18 +623,14 @@ class TC_GAME_API Guild
void CanStoreItemInTab(Item* pItem, uint8 skipSlotId, bool merge, uint32& count);
};
- typedef std::unordered_map<uint32, 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();
// Getters
@@ -644,25 +643,25 @@ 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 HandleQuery(WorldSession* session);
- 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 HandleSetLeader(WorldSession* session, std::string const& name);
- void HandleSetBankTabInfo(WorldSession* session, uint8 tabId, std::string const& name, std::string const& icon);
- void HandleSetMemberNote(WorldSession* session, std::string const& name, std::string const& note, bool officer);
- void HandleSetRankInfo(WorldSession* session, uint8 rankId, std::string const& name, uint32 rights, uint32 moneyPerDay, GuildBankRightsAndSlotsVec const& rightsAndSlots);
+ void HandleSetLeader(WorldSession* session, std::string_view name);
+ void HandleSetBankTabInfo(WorldSession* session, uint8 tabId, std::string_view name, std::string_view icon);
+ void HandleSetMemberNote(WorldSession* session, std::string_view name, std::string_view note, bool officer);
+ void HandleSetRankInfo(WorldSession* session, uint8 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, std::string const& name);
- void HandleUpdateMemberRank(WorldSession* session, std::string const& name, bool demote);
- void HandleAddNewRank(WorldSession* session, std::string const& name);
+ void HandleRemoveMember(WorldSession* session, std::string_view name);
+ void HandleUpdateMemberRank(WorldSession* session, std::string_view name, bool demote);
+ void HandleAddNewRank(WorldSession* session, std::string_view name);
void HandleRemoveRank(WorldSession* session, uint8 rankId);
void HandleRemoveLowestRank(WorldSession* session);
void HandleMemberDepositMoney(WorldSession* session, uint32 amount);
@@ -696,7 +695,7 @@ class TC_GAME_API Guild
bool Validate();
// Broadcasts
- void BroadcastToGuild(WorldSession* session, bool officerOnly, std::string const& msg, uint32 language = LANG_UNIVERSAL) const;
+ void BroadcastToGuild(WorldSession* session, bool officerOnly, std::string_view msg, uint32 language = LANG_UNIVERSAL) const;
void BroadcastPacketToRank(WorldPacket const* packet, uint8 rankId) const;
void BroadcastPacket(WorldPacket const* packet) const;
@@ -706,7 +705,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);
}
@@ -722,7 +721,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);
void ResetTimes();
@@ -738,13 +737,13 @@ 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<uint32, 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<EventLogEntry> m_eventLog;
+ std::array<LogHolder<BankEventLogEntry>, GUILD_BANK_MAX_TABS + 1> m_bankEventLog = {};
private:
inline uint8 _GetRanksSize() const { return uint8(m_ranks.size()); }
@@ -755,46 +754,44 @@ class TC_GAME_API Guild
inline uint8 _GetLowestRankId() const { return uint8(m_ranks.size() - 1); }
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 guid) const
{
auto itr = m_members.find(guid.GetCounter());
- return itr != m_members.end() ? itr->second : nullptr;
+ return (itr != m_members.end()) ? &itr->second : nullptr;
}
inline Member* GetMember(ObjectGuid guid)
{
auto itr = m_members.find(guid.GetCounter());
- 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 _SetLeaderGUID(Member* pLeader);
+ void _SetLeaderGUID(Member& pLeader);
void _SetRankBankMoneyPerDay(uint8 rankId, uint32 moneyPerDay);
void _SetRankBankTabRightsAndSlots(uint8 rankId, GuildBankRightsAndSlots rightsAndSlots, bool saveToDB = true);
@@ -804,8 +801,8 @@ class TC_GAME_API Guild
int32 _GetRankBankTabSlotsPerDay(uint8 rankId, uint8 tabId) const;
std::string _GetRankName(uint8 rankId) const;
- int32 _GetMemberRemainingSlots(Member const* member, uint8 tabId) const;
- int32 _GetMemberRemainingMoney(Member const* member) const;
+ int32 _GetMemberRemainingSlots(Member const& member, uint8 tabId) const;
+ int32 _GetMemberRemainingMoney(Member const& member) const;
void _UpdateMemberWithdrawSlots(CharacterDatabaseTransaction& trans, ObjectGuid guid, uint8 tabId);
bool _MemberHasTabRights(ObjectGuid guid, uint8 tabId, uint32 rights) const;
@@ -823,6 +820,6 @@ class TC_GAME_API Guild
void _SendBankContentUpdate(uint8 tabId, SlotIds slots) const;
void _SendBankList(WorldSession* session = nullptr, uint8 tabId = 0, bool sendFullSlots = false, SlotIds* slots = nullptr) const;
- void _BroadcastEvent(GuildEvents guildEvent, ObjectGuid guid, char const* param1 = nullptr, char const* param2 = nullptr, char const* param3 = nullptr) const;
+ void _BroadcastEvent(GuildEvents guildEvent, ObjectGuid guid, std::string_view param1 = "", std::string_view param2 = "", std::string_view param3 = "") const;
};
#endif
diff --git a/src/server/game/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp
index d227b42abbd..cbf7f3285bc 100644
--- a/src/server/game/Guilds/GuildMgr.cpp
+++ b/src/server/game/Guilds/GuildMgr.cpp
@@ -20,6 +20,7 @@
#include "Guild.h"
#include "Log.h"
#include "ObjectMgr.h"
+#include "Util.h"
#include "World.h"
GuildMgr::GuildMgr() : NextGuildId(1)
@@ -61,17 +62,12 @@ Guild* GuildMgr::GetGuildById(ObjectGuid::LowType guildId) 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 75b1d02c239..00d2136623a 100644
--- a/src/server/game/Guilds/GuildMgr.h
+++ b/src/server/game/Guilds/GuildMgr.h
@@ -38,7 +38,7 @@ public:
Guild* GetGuildByLeader(ObjectGuid guid) const;
Guild* GetGuildById(ObjectGuid::LowType guildId) const;
- Guild* GetGuildByName(std::string const& guildName) const;
+ Guild* GetGuildByName(std::string_view guildName) const;
std::string GetGuildNameById(ObjectGuid::LowType guildId) const;
void LoadGuilds();
diff --git a/src/server/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp
index 818567cdfac..b7f8c2898c5 100644
--- a/src/server/game/Handlers/GuildHandler.cpp
+++ b/src/server/game/Handlers/GuildHandler.cpp
@@ -169,7 +169,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/GuildPackets.cpp b/src/server/game/Server/Packets/GuildPackets.cpp
index 4f642221f8f..1cc7e23a062 100644
--- a/src/server/game/Server/Packets/GuildPackets.cpp
+++ b/src/server/game/Server/Packets/GuildPackets.cpp
@@ -122,7 +122,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Guild::GuildRosterMemberD
WorldPacket const* WorldPackets::Guild::GuildEvent::Write()
{
_worldPacket << uint8(Type);
- uint8 paramCount = Params[2] ? 3 : (Params[1] ? 2 : (Params[0] ? 1 : 0));
+ uint8 paramCount = Params[2].empty() ? (Params[1].empty() ? (Params[0].empty() ? 0 : 1) : 2) : 3;
_worldPacket << uint8(paramCount);
for (uint8 i = 0; i < paramCount; ++i)
_worldPacket << Params[i];
diff --git a/src/server/game/Server/Packets/GuildPackets.h b/src/server/game/Server/Packets/GuildPackets.h
index c687706ab66..44796c422da 100644
--- a/src/server/game/Server/Packets/GuildPackets.h
+++ b/src/server/game/Server/Packets/GuildPackets.h
@@ -207,7 +207,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
uint8 Type = 0;
- std::array<char const*, 3> Params = { };
+ std::array<std::string_view, 3> Params = { };
ObjectGuid Guid;
};
diff --git a/src/server/game/Server/Packets/PacketUtilities.h b/src/server/game/Server/Packets/PacketUtilities.h
index 406a472d3fa..0c06be5ea71 100644
--- a/src/server/game/Server/Packets/PacketUtilities.h
+++ b/src/server/game/Server/Packets/PacketUtilities.h
@@ -20,6 +20,7 @@
#include "ByteBuffer.h"
#include "Tuples.h"
+#include <string_view>
namespace WorldPackets
{
@@ -76,6 +77,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; }