aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Guilds
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-03-13 18:51:29 +0100
committerShauren <shauren.trinity@gmail.com>2024-03-13 18:51:29 +0100
commit4779fa5048642b57a0f69de7ab56b9d563c1cbc4 (patch)
tree9bd8f8daccb5d3e7f8e98c3556db8f3c9b204460 /src/server/game/Guilds
parent18200e1b88596dbead10d0b8ecbd10557db43323 (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.cpp39
-rw-r--r--src/server/game/Guilds/Guild.h8
-rw-r--r--src/server/game/Guilds/GuildMgr.cpp28
-rw-r--r--src/server/game/Guilds/GuildMgr.h3
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;