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);
SetUInt16Value(ObjectFields.Type, 1, (ushort)(guildId != 0 ? 1 : 0));
}
public void SetRank(uint rankId) { SetUInt32Value(PlayerFields.GuildRank, rankId); }
byte GetRank() { return (byte)GetUInt32Value(PlayerFields.GuildRank); }
public void SetGuildRank(uint rankId) { SetUInt32Value(PlayerFields.GuildRank, rankId); }
byte GetGuildRank() { return (byte)GetUInt32Value(PlayerFields.GuildRank); }
public void SetGuildLevel(uint level) { SetUInt32Value(PlayerFields.GuildLevel, level); }
uint GetGuildLevel() { return GetUInt32Value(PlayerFields.GuildLevel); }
public void SetGuildIdInvited(ulong GuildId) { m_GuildIdInvited = GuildId; }
+28 -24
View File
@@ -419,10 +419,14 @@ namespace Game.Guilds
Member newGuildMaster = GetMember(name);
if (newGuildMaster != null)
{
_SetLeaderGUID(newGuildMaster);
oldGuildMaster.ChangeRank(null, GuildDefaultRanks.Initiate);
SQLTransaction trans = new SQLTransaction();
_SetLeader(trans, newGuildMaster);
oldGuildMaster.ChangeRank(trans, GuildDefaultRanks.Initiate);
SendEventNewLeader(newGuildMaster, oldGuildMaster);
DB.Characters.CommitTransaction(trans);
}
}
}
@@ -1353,8 +1357,8 @@ namespace Game.Guilds
// Repair the structure of the guild.
// If the guildmaster doesn't exist or isn't member of the guild
// attempt to promote another member.
Member pLeader = GetMember(m_leaderGuid);
if (pLeader == null)
Member leader = GetMember(m_leaderGuid);
if (leader == null)
{
DeleteMember(trans, m_leaderGuid);
// If no more members left, disband guild
@@ -1364,8 +1368,8 @@ namespace Game.Guilds
return false;
}
}
else if (!pLeader.IsRank(GuildDefaultRanks.Master))
_SetLeaderGUID(pLeader);
else if (!leader.IsRank(GuildDefaultRanks.Master))
_SetLeader(trans, leader);
if (trans.commands.Count > 0)
DB.Characters.CommitTransaction(trans);
@@ -1498,7 +1502,7 @@ namespace Game.Guilds
m_members[guid] = member;
player.SetInGuild(m_id);
player.SetGuildIdInvited(0);
player.SetRank(rankId);
player.SetGuildRank(rankId);
player.SetGuildLevel(GetLevel());
SendLoginInfo(player.GetSession());
name = player.GetName();
@@ -1576,12 +1580,7 @@ namespace Game.Guilds
return;
}
_SetLeaderGUID(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);
_SetLeader(trans, newLeader);
// If leader does not exist (at guild loading with deleted leader) do not send broadcasts
if (oldLeader != null)
@@ -1599,7 +1598,7 @@ namespace Game.Guilds
if (player != null)
{
player.SetInGuild(0);
player.SetRank(0);
player.SetGuildRank(0);
player.SetGuildLevel(0);
foreach (var entry in CliDB.GuildPerkSpellsStorage.Values)
@@ -1795,21 +1794,25 @@ namespace Game.Guilds
return true;
}
void _SetLeaderGUID(Member pLeader)
void _SetLeader(SQLTransaction trans, Member leader)
{
if (pLeader == null)
if (leader == null)
return;
SQLTransaction trans = new SQLTransaction();
m_leaderGuid = pLeader.GetGUID();
pLeader.ChangeRank(trans, GuildDefaultRanks.Master);
bool isInTransaction = trans != null;
if (!isInTransaction)
trans = new SQLTransaction();
m_leaderGuid = leader.GetGUID();
leader.ChangeRank(trans, GuildDefaultRanks.Master);
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_GUILD_LEADER);
stmt.AddValue(0, m_leaderGuid.GetCounter());
stmt.AddValue(1, m_id);
trans.Append(stmt);
DB.Characters.CommitTransaction(trans);
if (!isInTransaction)
DB.Characters.CommitTransaction(trans);
}
void _SetRankBankMoneyPerDay(uint rankId, uint moneyPerDay)
@@ -2509,9 +2512,9 @@ namespace Game.Guilds
m_rankId = (byte)newRank;
// Update rank information in player's field, if he is online.
Player player = FindPlayer();
Player player = FindConnectedPlayer();
if (player != null)
player.SetRank((byte)newRank);
player.SetGuildRank((byte)newRank);
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_GUILD_MEMBER_RANK);
stmt.AddValue(0, newRank);
@@ -2587,7 +2590,7 @@ namespace Game.Guilds
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_GUILD_MEMBER_WITHDRAW_TABS);
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++];
stmt.AddValue(i, withdraw);
@@ -2653,7 +2656,7 @@ namespace Game.Guilds
public List<uint> GetTrackedCriteriaIds() { return m_trackedCriteriaIds; }
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 void UpdateLogoutTime() { m_logoutTime = (ulong)Time.UnixTime; }
@@ -2665,6 +2668,7 @@ namespace Game.Guilds
public ulong GetBankMoneyWithdrawValue() { return m_bankWithdrawMoney; }
public Player FindPlayer() { return Global.ObjAccessor.FindPlayer(m_guid); }
Player FindConnectedPlayer() { return Global.ObjAccessor.FindConnectedPlayer(m_guid); }
#region Fields
ulong m_guildId;
+2 -6
View File
@@ -676,7 +676,7 @@ namespace Game
if (!resultGuild.IsEmpty())
{
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());
if (guild)
pCurrChar.SetGuildLevel(guild.GetLevel());
@@ -684,14 +684,10 @@ namespace Game
else if (pCurrChar.GetGuildId() != 0)
{
pCurrChar.SetInGuild(0);
pCurrChar.SetRank(0);
pCurrChar.SetGuildRank(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
SendPacket(new BattlePetJournalLockAcquired());