Core/Guild: Handle changing the leader in one db transaction

This commit is contained in:
hondacrx
2018-04-22 16:00:48 -04:00
parent 783ad9b9e1
commit f36bb5767a
3 changed files with 32 additions and 32 deletions
+2 -2
View File
@@ -5246,8 +5246,8 @@ namespace Game.Entities
ApplyModFlag(PlayerFields.Flags, PlayerFlags.GuildLevelEnabled, guildId != 0); ApplyModFlag(PlayerFields.Flags, PlayerFlags.GuildLevelEnabled, guildId != 0);
SetUInt16Value(ObjectFields.Type, 1, (ushort)(guildId != 0 ? 1 : 0)); SetUInt16Value(ObjectFields.Type, 1, (ushort)(guildId != 0 ? 1 : 0));
} }
public void SetRank(uint rankId) { SetUInt32Value(PlayerFields.GuildRank, rankId); } public void SetGuildRank(uint rankId) { SetUInt32Value(PlayerFields.GuildRank, rankId); }
byte GetRank() { return (byte)GetUInt32Value(PlayerFields.GuildRank); } byte GetGuildRank() { return (byte)GetUInt32Value(PlayerFields.GuildRank); }
public void SetGuildLevel(uint level) { SetUInt32Value(PlayerFields.GuildLevel, level); } public void SetGuildLevel(uint level) { SetUInt32Value(PlayerFields.GuildLevel, level); }
uint GetGuildLevel() { return GetUInt32Value(PlayerFields.GuildLevel); } uint GetGuildLevel() { return GetUInt32Value(PlayerFields.GuildLevel); }
public void SetGuildIdInvited(ulong GuildId) { m_GuildIdInvited = GuildId; } public void SetGuildIdInvited(ulong GuildId) { m_GuildIdInvited = GuildId; }
+28 -24
View File
@@ -419,10 +419,14 @@ namespace Game.Guilds
Member newGuildMaster = GetMember(name); Member newGuildMaster = GetMember(name);
if (newGuildMaster != null) if (newGuildMaster != null)
{ {
_SetLeaderGUID(newGuildMaster); SQLTransaction trans = new SQLTransaction();
oldGuildMaster.ChangeRank(null, GuildDefaultRanks.Initiate);
_SetLeader(trans, newGuildMaster);
oldGuildMaster.ChangeRank(trans, GuildDefaultRanks.Initiate);
SendEventNewLeader(newGuildMaster, oldGuildMaster); SendEventNewLeader(newGuildMaster, oldGuildMaster);
DB.Characters.CommitTransaction(trans);
} }
} }
} }
@@ -1353,8 +1357,8 @@ namespace Game.Guilds
// Repair the structure of the guild. // Repair the structure of the guild.
// If the guildmaster doesn't exist or isn't member of the guild // If the guildmaster doesn't exist or isn't member of the guild
// attempt to promote another member. // attempt to promote another member.
Member pLeader = GetMember(m_leaderGuid); Member leader = GetMember(m_leaderGuid);
if (pLeader == null) if (leader == null)
{ {
DeleteMember(trans, m_leaderGuid); DeleteMember(trans, m_leaderGuid);
// If no more members left, disband guild // If no more members left, disband guild
@@ -1364,8 +1368,8 @@ namespace Game.Guilds
return false; return false;
} }
} }
else if (!pLeader.IsRank(GuildDefaultRanks.Master)) else if (!leader.IsRank(GuildDefaultRanks.Master))
_SetLeaderGUID(pLeader); _SetLeader(trans, leader);
if (trans.commands.Count > 0) if (trans.commands.Count > 0)
DB.Characters.CommitTransaction(trans); DB.Characters.CommitTransaction(trans);
@@ -1498,7 +1502,7 @@ namespace Game.Guilds
m_members[guid] = member; m_members[guid] = member;
player.SetInGuild(m_id); player.SetInGuild(m_id);
player.SetGuildIdInvited(0); player.SetGuildIdInvited(0);
player.SetRank(rankId); player.SetGuildRank(rankId);
player.SetGuildLevel(GetLevel()); player.SetGuildLevel(GetLevel());
SendLoginInfo(player.GetSession()); SendLoginInfo(player.GetSession());
name = player.GetName(); name = player.GetName();
@@ -1576,12 +1580,7 @@ namespace Game.Guilds
return; return;
} }
_SetLeaderGUID(newLeader); _SetLeader(trans, newLeader);
// If player not online data in data field will be loaded from guild tabs no need to update it !!
Player newLeaderPlayer = newLeader.FindPlayer();
if (newLeaderPlayer)
newLeaderPlayer.SetRank(GuildDefaultRanks.Master);
// If leader does not exist (at guild loading with deleted leader) do not send broadcasts // If leader does not exist (at guild loading with deleted leader) do not send broadcasts
if (oldLeader != null) if (oldLeader != null)
@@ -1599,7 +1598,7 @@ namespace Game.Guilds
if (player != null) if (player != null)
{ {
player.SetInGuild(0); player.SetInGuild(0);
player.SetRank(0); player.SetGuildRank(0);
player.SetGuildLevel(0); player.SetGuildLevel(0);
foreach (var entry in CliDB.GuildPerkSpellsStorage.Values) foreach (var entry in CliDB.GuildPerkSpellsStorage.Values)
@@ -1795,21 +1794,25 @@ namespace Game.Guilds
return true; return true;
} }
void _SetLeaderGUID(Member pLeader) void _SetLeader(SQLTransaction trans, Member leader)
{ {
if (pLeader == null) if (leader == null)
return; return;
SQLTransaction trans = new SQLTransaction(); bool isInTransaction = trans != null;
m_leaderGuid = pLeader.GetGUID(); if (!isInTransaction)
pLeader.ChangeRank(trans, GuildDefaultRanks.Master); trans = new SQLTransaction();
m_leaderGuid = leader.GetGUID();
leader.ChangeRank(trans, GuildDefaultRanks.Master);
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_GUILD_LEADER); PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_GUILD_LEADER);
stmt.AddValue(0, m_leaderGuid.GetCounter()); stmt.AddValue(0, m_leaderGuid.GetCounter());
stmt.AddValue(1, m_id); stmt.AddValue(1, m_id);
trans.Append(stmt); trans.Append(stmt);
DB.Characters.CommitTransaction(trans); if (!isInTransaction)
DB.Characters.CommitTransaction(trans);
} }
void _SetRankBankMoneyPerDay(uint rankId, uint moneyPerDay) void _SetRankBankMoneyPerDay(uint rankId, uint moneyPerDay)
@@ -2509,9 +2512,9 @@ namespace Game.Guilds
m_rankId = (byte)newRank; m_rankId = (byte)newRank;
// Update rank information in player's field, if he is online. // Update rank information in player's field, if he is online.
Player player = FindPlayer(); Player player = FindConnectedPlayer();
if (player != null) if (player != null)
player.SetRank((byte)newRank); player.SetGuildRank((byte)newRank);
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_GUILD_MEMBER_RANK); PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_GUILD_MEMBER_RANK);
stmt.AddValue(0, newRank); stmt.AddValue(0, newRank);
@@ -2587,7 +2590,7 @@ namespace Game.Guilds
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_GUILD_MEMBER_WITHDRAW_TABS); PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_GUILD_MEMBER_WITHDRAW_TABS);
stmt.AddValue(0, m_guid.GetCounter()); stmt.AddValue(0, m_guid.GetCounter());
for (byte i = 0; i < GuildConst.MaxBankTabs; ) for (byte i = 0; i < GuildConst.MaxBankTabs;)
{ {
uint withdraw = m_bankWithdraw[i++]; uint withdraw = m_bankWithdraw[i++];
stmt.AddValue(i, withdraw); stmt.AddValue(i, withdraw);
@@ -2653,7 +2656,7 @@ namespace Game.Guilds
public List<uint> GetTrackedCriteriaIds() { return m_trackedCriteriaIds; } public List<uint> GetTrackedCriteriaIds() { return m_trackedCriteriaIds; }
public void SetTrackedCriteriaIds(List<uint> criteriaIds) { m_trackedCriteriaIds = criteriaIds; } public void SetTrackedCriteriaIds(List<uint> criteriaIds) { m_trackedCriteriaIds = criteriaIds; }
public bool IsTrackingCriteriaId(uint criteriaId) { return m_trackedCriteriaIds.Contains(criteriaId); } public bool IsTrackingCriteriaId(uint criteriaId) { return m_trackedCriteriaIds.Contains(criteriaId); }
public bool IsOnline() { return m_flags.HasAnyFlag(GuildMemberFlags.Online); } public bool IsOnline() { return m_flags.HasAnyFlag(GuildMemberFlags.Online); }
public void UpdateLogoutTime() { m_logoutTime = (ulong)Time.UnixTime; } public void UpdateLogoutTime() { m_logoutTime = (ulong)Time.UnixTime; }
@@ -2665,6 +2668,7 @@ namespace Game.Guilds
public ulong GetBankMoneyWithdrawValue() { return m_bankWithdrawMoney; } public ulong GetBankMoneyWithdrawValue() { return m_bankWithdrawMoney; }
public Player FindPlayer() { return Global.ObjAccessor.FindPlayer(m_guid); } public Player FindPlayer() { return Global.ObjAccessor.FindPlayer(m_guid); }
Player FindConnectedPlayer() { return Global.ObjAccessor.FindConnectedPlayer(m_guid); }
#region Fields #region Fields
ulong m_guildId; ulong m_guildId;
+2 -6
View File
@@ -676,7 +676,7 @@ namespace Game
if (!resultGuild.IsEmpty()) if (!resultGuild.IsEmpty())
{ {
pCurrChar.SetInGuild(resultGuild.Read<uint>(0)); pCurrChar.SetInGuild(resultGuild.Read<uint>(0));
pCurrChar.SetRank(resultGuild.Read<byte>(1)); pCurrChar.SetGuildRank(resultGuild.Read<byte>(1));
Guild guild = Global.GuildMgr.GetGuildById(pCurrChar.GetGuildId()); Guild guild = Global.GuildMgr.GetGuildById(pCurrChar.GetGuildId());
if (guild) if (guild)
pCurrChar.SetGuildLevel(guild.GetLevel()); pCurrChar.SetGuildLevel(guild.GetLevel());
@@ -684,14 +684,10 @@ namespace Game
else if (pCurrChar.GetGuildId() != 0) else if (pCurrChar.GetGuildId() != 0)
{ {
pCurrChar.SetInGuild(0); pCurrChar.SetInGuild(0);
pCurrChar.SetRank(0); pCurrChar.SetGuildRank(0);
pCurrChar.SetGuildLevel(0); pCurrChar.SetGuildLevel(0);
} }
//WorldPacket data = new WorldPacket(ServerOpcodes.LearnedDanceMoves);
//data.WriteUInt64(0);
//SendPacket(data);
// TODO: Move this to BattlePetMgr::SendJournalLock() just to have all packets in one file // TODO: Move this to BattlePetMgr::SendJournalLock() just to have all packets in one file
SendPacket(new BattlePetJournalLockAcquired()); SendPacket(new BattlePetJournalLockAcquired());