diff options
| author | Shauren <shauren.trinity@gmail.com> | 2024-03-13 18:51:29 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2024-03-13 18:51:29 +0100 |
| commit | 4779fa5048642b57a0f69de7ab56b9d563c1cbc4 (patch) | |
| tree | 9bd8f8daccb5d3e7f8e98c3556db8f3c9b204460 /src/server/game/Guilds | |
| parent | 18200e1b88596dbead10d0b8ecbd10557db43323 (diff) | |
Core/Misc: Use our new unique_trackable_ptr for various classes exposed to scripts (not actually used anywhere currently)
Diffstat (limited to 'src/server/game/Guilds')
| -rw-r--r-- | src/server/game/Guilds/Guild.cpp | 39 | ||||
| -rw-r--r-- | src/server/game/Guilds/Guild.h | 8 | ||||
| -rw-r--r-- | src/server/game/Guilds/GuildMgr.cpp | 28 | ||||
| -rw-r--r-- | src/server/game/Guilds/GuildMgr.h | 3 |
4 files changed, 39 insertions, 39 deletions
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index dd37eb767fb..714d9fd4729 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -1761,7 +1761,8 @@ void Guild::HandleAcceptMember(WorldSession* session) void Guild::HandleLeaveMember(WorldSession* session) { Player* player = session->GetPlayer(); - bool disband = false; + + sCalendarMgr->RemovePlayerGuildEventsAndSignups(player->GetGUID(), GetId()); // If leader is leaving if (_IsLeader(player)) @@ -1773,7 +1774,6 @@ void Guild::HandleLeaveMember(WorldSession* session) { // Guild is disbanded if leader leaves. Disband(); - disband = true; } } else @@ -1781,16 +1781,11 @@ void Guild::HandleLeaveMember(WorldSession* session) _LogEvent(GUILD_EVENT_LOG_LEAVE_GUILD, player->GetGUID().GetCounter()); SendEventPlayerLeft(GetMember(player->GetGUID())); + SendCommandResult(session, GUILD_COMMAND_LEAVE_GUILD, ERR_GUILD_COMMAND_SUCCESS, m_name); + CharacterDatabaseTransaction trans(nullptr); DeleteMember(trans, player->GetGUID(), false, false); - - SendCommandResult(session, GUILD_COMMAND_LEAVE_GUILD, ERR_GUILD_COMMAND_SUCCESS, m_name); } - - sCalendarMgr->RemovePlayerGuildEventsAndSignups(player->GetGUID(), GetId()); - - if (disband) - delete this; } void Guild::HandleRemoveMember(WorldSession* session, ObjectGuid guid) @@ -1821,11 +1816,11 @@ void Guild::HandleRemoveMember(WorldSession* session, ObjectGuid guid) _LogEvent(GUILD_EVENT_LOG_UNINVITE_PLAYER, player->GetGUID().GetCounter(), guid.GetCounter()); SendEventPlayerLeft(member, memberMe, true); + SendCommandResult(session, GUILD_COMMAND_REMOVE_PLAYER, ERR_GUILD_COMMAND_SUCCESS, name); + // After call to DeleteMember pointer to member becomes invalid CharacterDatabaseTransaction trans(nullptr); DeleteMember(trans, guid, false, true); - - SendCommandResult(session, GUILD_COMMAND_REMOVE_PLAYER, ERR_GUILD_COMMAND_SUCCESS, name); } } } @@ -2145,7 +2140,6 @@ void Guild::HandleDelete(WorldSession* session) { Disband(); TC_LOG_DEBUG("guild", "{} successfully deleted", GetGUID().ToString()); - delete this; } } @@ -2708,13 +2702,8 @@ bool Guild::Validate() if (!leader) { CharacterDatabaseTransaction dummy(nullptr); - DeleteMember(dummy, m_leaderGuid); - // If no more members left, disband guild - if (m_members.empty()) - { - Disband(); + if (DeleteMember(dummy, m_leaderGuid)) return false; - } } else if (!leader->IsRank(GuildRankId::GuildMaster)) _SetLeader(trans, *leader); @@ -2963,7 +2952,7 @@ bool Guild::AddMember(CharacterDatabaseTransaction trans, ObjectGuid guid, Optio return true; } -void Guild::DeleteMember(CharacterDatabaseTransaction trans, ObjectGuid guid, bool isDisbanding, bool isKicked, bool canDeleteGuild) +bool Guild::DeleteMember(CharacterDatabaseTransaction trans, ObjectGuid guid, bool isDisbanding, bool isKicked) { // Guild master can be deleted when loading guild and guid doesn't exist in characters table // or when he is removed from guild by gm command @@ -2982,9 +2971,7 @@ void Guild::DeleteMember(CharacterDatabaseTransaction trans, ObjectGuid guid, bo if (!newLeader) { Disband(); - if (canDeleteGuild) - delete this; - return; + return true; } _SetLeader(trans, *newLeader); @@ -3018,6 +3005,14 @@ void Guild::DeleteMember(CharacterDatabaseTransaction trans, ObjectGuid guid, bo Guild::_DeleteMemberFromDB(trans, guid.GetCounter()); if (!isDisbanding) _UpdateAccountsNumber(); + + if (m_members.empty()) + { + Disband(); + return true; + } + + return false; } bool Guild::ChangeMemberRank(CharacterDatabaseTransaction trans, ObjectGuid guid, GuildRankId newRank) diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index 10384f091d1..ea39a1682b7 100644 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -25,6 +25,7 @@ #include "Optional.h" #include "RaceMask.h" #include "SharedDefines.h" +#include "UniqueTrackablePtr.h" #include <set> #include <unordered_map> @@ -843,7 +844,7 @@ class TC_GAME_API Guild // Members // Adds member to guild. If rankId == GUILD_RANK_NONE, lowest rank is assigned. bool AddMember(CharacterDatabaseTransaction trans, ObjectGuid guid, Optional<GuildRankId> rankId = {}); - void DeleteMember(CharacterDatabaseTransaction trans, ObjectGuid guid, bool isDisbanding = false, bool isKicked = false, bool canDeleteGuild = false); + bool DeleteMember(CharacterDatabaseTransaction trans, ObjectGuid guid, bool isDisbanding = false, bool isKicked = false); bool ChangeMemberRank(CharacterDatabaseTransaction trans, ObjectGuid guid, GuildRankId newRank); bool IsMember(ObjectGuid guid) const; uint32 GetMembersCount() const { return uint32(m_members.size()); } @@ -872,6 +873,9 @@ class TC_GAME_API Guild bool HasAchieved(uint32 achievementId) const; void UpdateCriteria(CriteriaType type, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, WorldObject const* ref, Player* player); + Trinity::unique_weak_ptr<Guild> GetWeakPtr() const { return m_weakRef; } + void SetWeakPtr(Trinity::unique_weak_ptr<Guild> weakRef) { m_weakRef = std::move(weakRef); } + protected: ObjectGuid::LowType m_id; std::string m_name; @@ -894,6 +898,8 @@ class TC_GAME_API Guild LogHolder<NewsLogEntry> m_newsLog; std::unique_ptr<GuildAchievementMgr> m_achievementMgr; + Trinity::unique_weak_ptr<Guild> m_weakRef; + private: inline uint8 _GetRanksSize() const { return uint8(m_ranks.size()); } RankInfo const* GetRankInfo(GuildRankId rankId) const; diff --git a/src/server/game/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp index f7d8dd86f6e..b7d32576147 100644 --- a/src/server/game/Guilds/GuildMgr.cpp +++ b/src/server/game/Guilds/GuildMgr.cpp @@ -17,8 +17,8 @@ #include "GuildMgr.h" #include "AchievementMgr.h" -#include "DatabaseEnv.h" #include "DB2Stores.h" +#include "DatabaseEnv.h" #include "Guild.h" #include "Log.h" #include "ObjectMgr.h" @@ -29,15 +29,13 @@ GuildMgr::GuildMgr() : NextGuildId(UI64LIT(1)) { } -GuildMgr::~GuildMgr() -{ - for (GuildContainer::iterator itr = GuildStore.begin(); itr != GuildStore.end(); ++itr) - delete itr->second; -} +GuildMgr::~GuildMgr() = default; void GuildMgr::AddGuild(Guild* guild) { - GuildStore[guild->GetId()] = guild; + Trinity::unique_trackable_ptr<Guild>& ptr = GuildStore[guild->GetId()]; + ptr.reset(guild); + guild->SetWeakPtr(ptr); } void GuildMgr::RemoveGuild(ObjectGuid::LowType guildId) @@ -66,7 +64,7 @@ Guild* GuildMgr::GetGuildById(ObjectGuid::LowType guildId) const { GuildContainer::const_iterator itr = GuildStore.find(guildId); if (itr != GuildStore.end()) - return itr->second; + return itr->second.get(); return nullptr; } @@ -84,9 +82,9 @@ Guild* GuildMgr::GetGuildByGuid(ObjectGuid guid) const Guild* GuildMgr::GetGuildByName(std::string_view guildName) const { - for (auto [id, guild] : GuildStore) + for (auto const& [id, guild] : GuildStore) if (StringEqualI(guild->GetName(), guildName)) - return guild; + return guild.get(); return nullptr; } @@ -109,7 +107,7 @@ Guild* GuildMgr::GetGuildByLeader(ObjectGuid guid) const { for (GuildContainer::const_iterator itr = GuildStore.begin(); itr != GuildStore.end(); ++itr) if (itr->second->GetLeaderGUID() == guid) - return itr->second; + return itr->second.get(); return nullptr; } @@ -483,10 +481,10 @@ void GuildMgr::LoadGuilds() for (GuildContainer::iterator itr = GuildStore.begin(); itr != GuildStore.end();) { - Guild* guild = itr->second; + Guild* guild = itr->second.get(); ++itr; - if (guild && !guild->Validate()) - delete guild; + if (guild) + guild->Validate(); } TC_LOG_INFO("server.loading", ">> Validated data of loaded guilds in {} ms", GetMSTimeDiffToNow(oldMSTime)); @@ -562,6 +560,6 @@ void GuildMgr::ResetTimes(bool week) CharacterDatabase.Execute(CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_MEMBER_WITHDRAW)); for (GuildContainer::const_iterator itr = GuildStore.begin(); itr != GuildStore.end(); ++itr) - if (Guild* guild = itr->second) + if (Guild* guild = itr->second.get()) guild->ResetTimes(week); } diff --git a/src/server/game/Guilds/GuildMgr.h b/src/server/game/Guilds/GuildMgr.h index f700f8122c1..5c021648a28 100644 --- a/src/server/game/Guilds/GuildMgr.h +++ b/src/server/game/Guilds/GuildMgr.h @@ -20,6 +20,7 @@ #include "Define.h" #include "ObjectGuid.h" +#include "UniqueTrackablePtr.h" #include <unordered_map> #include <vector> @@ -60,7 +61,7 @@ public: void ResetTimes(bool week); protected: - typedef std::unordered_map<ObjectGuid::LowType, Guild*> GuildContainer; + typedef std::unordered_map<ObjectGuid::LowType, Trinity::unique_trackable_ptr<Guild>> GuildContainer; ObjectGuid::LowType NextGuildId; GuildContainer GuildStore; std::vector<GuildReward> GuildRewards; |
