From 91c2fedb6eaf2d4b0325cae981456f9cc8afba6a Mon Sep 17 00:00:00 2001 From: hondacrx Date: Fri, 25 Feb 2022 10:40:47 -0500 Subject: [PATCH] Core/Guilds: Separate guild rank id from guild rank order Port From (https://github.com/TrinityCore/TrinityCore/commit/0d3235f56969a6e414071edbb669ac63b4398958) --- Source/Framework/Constants/GuildConst.cs | 13 +- .../Database/Databases/CharacterDatabase.cs | 4 +- Source/Game/Chat/Commands/GuildCommands.cs | 2 +- Source/Game/Guilds/Guild.cs | 280 +++++++++++------- Source/Game/Guilds/GuildManager.cs | 4 +- Source/Game/Handlers/CalendarHandler.cs | 2 +- Source/Game/Handlers/GuildHandler.cs | 6 +- Source/Game/Scripting/SpellScript.cs | 2 +- 8 files changed, 191 insertions(+), 122 deletions(-) diff --git a/Source/Framework/Constants/GuildConst.cs b/Source/Framework/Constants/GuildConst.cs index 541fab2d3..ead681f83 100644 --- a/Source/Framework/Constants/GuildConst.cs +++ b/Source/Framework/Constants/GuildConst.cs @@ -83,13 +83,14 @@ namespace Framework.Constants All = 0x00DDFFBF } - public struct GuildDefaultRanks + public enum GuildRankId { - public const int Master = 0; - public const int Officer = 1; - public const int Veteran = 2; - public const int Member = 3; - public const int Initiate = 4; + GuildMaster = 0 + } + + public enum GuildRankOrder + { + } [Flags] diff --git a/Source/Framework/Database/Databases/CharacterDatabase.cs b/Source/Framework/Database/Databases/CharacterDatabase.cs index 4975b8713..2ed759e59 100644 --- a/Source/Framework/Database/Databases/CharacterDatabase.cs +++ b/Source/Framework/Database/Databases/CharacterDatabase.cs @@ -260,7 +260,7 @@ namespace Framework.Database PrepareStatement(CharStatements.DEL_GUILD_MEMBER, "DELETE FROM guild_member WHERE guid = ?"); PrepareStatement(CharStatements.DEL_GUILD_MEMBERS, "DELETE FROM guild_member WHERE guildid = ?"); - PrepareStatement(CharStatements.INS_GUILD_RANK, "INSERT INTO guild_rank (guildid, rid, rname, rights, BankMoneyPerDay) VALUES (?, ?, ?, ?, ?)"); + PrepareStatement(CharStatements.INS_GUILD_RANK, "INSERT INTO guild_rank (guildid, rid, RankOrder, rname, rights, BankMoneyPerDay) VALUES (?, ?, ?, ?, ?, ?)"); PrepareStatement(CharStatements.DEL_GUILD_RANKS, "DELETE FROM guild_rank WHERE guildid = ?"); PrepareStatement(CharStatements.DEL_GUILD_RANK, "DELETE FROM guild_rank WHERE guildid = ? AND rid = ?"); PrepareStatement(CharStatements.INS_GUILD_BANK_TAB, "INSERT INTO guild_bank_tab (guildid, TabId) VALUES (?, ?)"); @@ -290,6 +290,7 @@ namespace Framework.Database PrepareStatement(CharStatements.UPD_GUILD_MOTD, "UPDATE guild SET motd = ? WHERE guildid = ?"); PrepareStatement(CharStatements.UPD_GUILD_INFO, "UPDATE guild SET info = ? WHERE guildid = ?"); PrepareStatement(CharStatements.UPD_GUILD_LEADER, "UPDATE guild SET leaderguid = ? WHERE guildid = ?"); + PrepareStatement(CharStatements.UPD_GUILD_RANK_ORDER, "UPDATE guild_rank SET RankOrder = ? WHERE rid = ? AND guildid = ?"); PrepareStatement(CharStatements.UPD_GUILD_RANK_NAME, "UPDATE guild_rank SET rname = ? WHERE rid = ? AND guildid = ?"); PrepareStatement(CharStatements.UPD_GUILD_RANK_RIGHTS, "UPDATE guild_rank SET rights = ? WHERE rid = ? AND guildid = ?"); @@ -1001,6 +1002,7 @@ namespace Framework.Database UPD_GUILD_MOTD, UPD_GUILD_INFO, UPD_GUILD_LEADER, + UPD_GUILD_RANK_ORDER, UPD_GUILD_RANK_NAME, UPD_GUILD_RANK_RIGHTS, UPD_GUILD_EMBLEM_INFO, diff --git a/Source/Game/Chat/Commands/GuildCommands.cs b/Source/Game/Chat/Commands/GuildCommands.cs index 3068c366f..2ab314fa7 100644 --- a/Source/Game/Chat/Commands/GuildCommands.cs +++ b/Source/Game/Chat/Commands/GuildCommands.cs @@ -152,7 +152,7 @@ namespace Game.Chat if (!byte.TryParse(rankStr, out byte newRank)) return false; - return targetGuild.ChangeMemberRank(null, targetGuid, newRank); + return targetGuild.ChangeMemberRank(null, targetGuid, (GuildRankId)newRank); } [Command("rename", RBACPermissions.CommandGuildRename, true)] diff --git a/Source/Game/Guilds/Guild.cs b/Source/Game/Guilds/Guild.cs index b5eba2331..b96b45faf 100644 --- a/Source/Game/Guilds/Guild.cs +++ b/Source/Game/Guilds/Guild.cs @@ -81,7 +81,7 @@ namespace Game.Guilds trans.Append(stmt); _CreateDefaultGuildRanks(trans, pLeaderSession.GetSessionDbLocaleIndex()); // Create default ranks - bool ret = AddMember(trans, m_leaderGuid, GuildDefaultRanks.Master); // Add guildmaster + bool ret = AddMember(trans, m_leaderGuid, GuildRankId.GuildMaster); // Add guildmaster DB.Characters.CommitTransaction(trans); if (ret) @@ -221,7 +221,7 @@ namespace Game.Guilds GuildRosterMemberData memberData = new(); memberData.Guid = member.GetGUID(); - memberData.RankID = member.GetRankId(); + memberData.RankID = (int)member.GetRankId(); memberData.AreaID = (int)member.GetZoneId(); memberData.PersonalAchievementPoints = (int)member.GetAchievementPoints(); memberData.GuildReputation = (int)member.GetTotalReputation(); @@ -268,8 +268,8 @@ namespace Game.Guilds response.Info.BorderColor = m_emblemInfo.GetBorderColor(); response.Info.BackgroundColor = m_emblemInfo.GetBackgroundColor(); - for (byte i = 0; i < _GetRanksSize(); ++i) - response.Info.Ranks.Add(new QueryGuildInfoResponse.GuildInfo.RankInfo(m_ranks[i].GetId(), i, m_ranks[i].GetName())); + foreach (RankInfo rankInfo in m_ranks) + response.Info.Ranks.Add(new QueryGuildInfoResponse.GuildInfo.RankInfo((byte)rankInfo.GetId(), (byte)rankInfo.GetOrder(), rankInfo.GetName())); response.Info.GuildName = m_name; @@ -280,18 +280,14 @@ namespace Game.Guilds { GuildRanks ranks = new(); - for (byte i = 0; i < _GetRanksSize(); i++) + foreach (RankInfo rankInfo in m_ranks) { - RankInfo rankInfo = GetRankInfo(i); - if (rankInfo == null) - continue; - GuildRankData rankData = new(); - rankData.RankID = rankInfo.GetId(); - rankData.RankOrder = i; + rankData.RankID = (byte)rankInfo.GetId(); + rankData.RankOrder = (byte)rankInfo.GetOrder(); rankData.Flags = (uint)rankInfo.GetRights(); - rankData.WithdrawGoldLimit = (rankInfo.GetId() == GuildDefaultRanks.Master ? uint.MaxValue : (rankInfo.GetBankMoneyPerDay() / MoneyConstants.Gold)); + rankData.WithdrawGoldLimit = (rankInfo.GetId() == GuildRankId.GuildMaster ? uint.MaxValue : (rankInfo.GetBankMoneyPerDay() / MoneyConstants.Gold)); rankData.RankName = rankInfo.GetName(); for (byte j = 0; j < GuildConst.MaxBankTabs; ++j) @@ -415,7 +411,10 @@ namespace Game.Guilds if (newGuildMaster == null) return; - if (!newGuildMaster.IsRankNotLower(GuildDefaultRanks.Member) || oldGuildMaster.GetInactiveDays() < GuildConst.MasterDethroneInactiveDays) + RankInfo oldRank = GetRankInfo(newGuildMaster.GetRankId()); + + // only second highest rank can take over guild + if (oldRank.GetOrder() != (GuildRankOrder)1 || oldGuildMaster.GetInactiveDays() < GuildConst.MasterDethroneInactiveDays) { SendCommandResult(session, GuildCommandType.ChangeLeader, GuildCommandError.Permissions); return; @@ -437,7 +436,7 @@ namespace Game.Guilds SQLTransaction trans = new(); _SetLeader(trans, newGuildMaster); - oldGuildMaster.ChangeRank(trans, GuildDefaultRanks.Initiate); + oldGuildMaster.ChangeRank(trans, _GetLowestRankId()); SendEventNewLeader(newGuildMaster, oldGuildMaster, isSelfPromote); @@ -484,7 +483,7 @@ namespace Game.Guilds } } - public void HandleSetRankInfo(WorldSession session, uint rankId, string name, GuildRankRights rights, uint moneyPerDay, GuildBankRightsAndSlots[] rightsAndSlots) + public void HandleSetRankInfo(WorldSession session, GuildRankId rankId, string name, GuildRankRights rights, uint moneyPerDay, GuildBankRightsAndSlots[] rightsAndSlots) { // Only leader can modify ranks if (!_IsLeader(session.GetPlayer())) @@ -503,7 +502,7 @@ namespace Game.Guilds _SetRankBankTabRightsAndSlots(rankId, rightsAndSlot); GuildEventRankChanged packet = new(); - packet.RankID = rankId; + packet.RankID = (byte)rankId; BroadcastPacket(packet); } } @@ -672,13 +671,16 @@ namespace Game.Guilds string name = member.GetName(); // Guild masters cannot be removed - if (member.IsRank(GuildDefaultRanks.Master)) + if (member.IsRank(GuildRankId.GuildMaster)) SendCommandResult(session, GuildCommandType.RemovePlayer, GuildCommandError.LeaderLeave); // Do not allow to remove player with the same rank or higher else { Member memberMe = GetMember(player.GetGUID()); - if (memberMe == null || member.IsRankNotLower(memberMe.GetRankId())) + RankInfo myRank = GetRankInfo(memberMe.GetRankId()); + RankInfo targetRank = GetRankInfo(member.GetRankId()); + + if (memberMe == null || targetRank.GetOrder() <= myRank.GetOrder()) SendCommandResult(session, GuildCommandType.RemovePlayer, GuildCommandError.RankTooHigh_S, name); else { @@ -714,48 +716,59 @@ namespace Game.Guilds } Member memberMe = GetMember(player.GetGUID()); - byte rankId = memberMe.GetRankId(); + RankInfo myRank = GetRankInfo(memberMe.GetRankId()); + RankInfo oldRank = GetRankInfo(member.GetRankId()); + GuildRankId newRankId; if (demote) { // Player can demote only lower rank members - if (member.IsRankNotLower(rankId)) + if (oldRank.GetOrder() <= myRank.GetOrder()) { SendCommandResult(session, type, GuildCommandError.RankTooHigh_S, name); return; } // Lowest rank cannot be demoted - if (member.GetRankId() >= _GetLowestRankId()) + RankInfo newRank = GetRankInfo(oldRank.GetOrder() + 1); + if (newRank == null) { SendCommandResult(session, type, GuildCommandError.RankTooLow_S, name); return; } + + newRankId = newRank.GetId(); } else { // Allow to promote only to lower rank than member's rank - // member.GetRankId() + 1 is the highest rank that current player can promote to - if (member.IsRankNotLower((uint)(rankId + 1))) + // memberMe->GetRankId() + 1 is the highest rank that current player can promote to + if ((oldRank.GetOrder() - 1) <= myRank.GetOrder()) { SendCommandResult(session, type, GuildCommandError.RankTooHigh_S, name); return; } + + newRankId = GetRankInfo((oldRank.GetOrder() - 1)).GetId(); } - uint newRankId = (uint)(member.GetRankId() + (demote ? 1 : -1)); member.ChangeRank(null, newRankId); _LogEvent(demote ? GuildEventLogTypes.DemotePlayer : GuildEventLogTypes.PromotePlayer, player.GetGUID().GetCounter(), member.GetGUID().GetCounter(), (byte)newRankId); //_BroadcastEvent(demote ? GuildEvents.Demotion : GuildEvents.Promotion, ObjectGuid.Empty, player.GetName(), name, _GetRankName((byte)newRankId)); } } - public void HandleSetMemberRank(WorldSession session, ObjectGuid targetGuid, ObjectGuid setterGuid, uint rank) + public void HandleSetMemberRank(WorldSession session, ObjectGuid targetGuid, ObjectGuid setterGuid, GuildRankOrder rank) { Player player = session.GetPlayer(); Member member = GetMember(targetGuid); GuildRankRights rights = GuildRankRights.Promote; GuildCommandType type = GuildCommandType.PromotePlayer; - if (rank > member.GetRankId()) + RankInfo oldRank = GetRankInfo(member.GetRankId()); + RankInfo newRank = GetRankInfo(rank); + if (oldRank == null || newRank == null) + return; + + if (rank > oldRank.GetOrder()) { rights = GuildRankRights.Demote; type = GuildCommandType.DemotePlayer; @@ -775,7 +788,7 @@ namespace Game.Guilds return; } - SendGuildRanksUpdate(setterGuid, targetGuid, rank); + SendGuildRanksUpdate(setterGuid, targetGuid, newRank.GetId()); } public void HandleAddNewRank(WorldSession session, string name) @@ -790,24 +803,49 @@ namespace Game.Guilds BroadcastPacket(new GuildEventRanksUpdated()); } - public void HandleRemoveRank(WorldSession session, uint rankId) + public void HandleRemoveRank(WorldSession session, GuildRankOrder rankOrder) { // Cannot remove rank if total count is minimum allowed by the client or is not leader - if (_GetRanksSize() <= GuildConst.MinRanks || rankId >= _GetRanksSize() || !_IsLeader(session.GetPlayer())) + if (_GetRanksSize() <= GuildConst.MinRanks || !_IsLeader(session.GetPlayer())) return; + var rankInfo = m_ranks.Find(rank => rank.GetOrder() == rankOrder); + + if (rankInfo == null) + return; + + SQLTransaction trans = new SQLTransaction(); + // Delete bank rights for rank PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_GUILD_BANK_RIGHTS_FOR_RANK); stmt.AddValue(0, m_id); - stmt.AddValue(1, rankId); - DB.Characters.Execute(stmt); + stmt.AddValue(1, (byte)rankInfo.GetId()); + trans.Append(stmt); + // Delete rank stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_GUILD_RANK); stmt.AddValue(0, m_id); - stmt.AddValue(1, rankId); - DB.Characters.Execute(stmt); + stmt.AddValue(1, (byte)rankInfo.GetId()); + trans.Append(stmt); - m_ranks.RemoveAt((int)rankId); + m_ranks.Remove(rankInfo); + + // correct order of other ranks + foreach (RankInfo otherRank in m_ranks) + { + if (otherRank.GetOrder() < rankOrder) + continue; + + otherRank.SetOrder(otherRank.GetOrder() - 1); + + stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_GUILD_RANK_ORDER); + stmt.AddValue(0, (byte)otherRank.GetOrder()); + stmt.AddValue(1, (byte)otherRank.GetId()); + stmt.AddValue(2, m_id); + trans.Append(stmt); + } + + DB.Characters.CommitTransaction(trans); BroadcastPacket(new GuildEventRanksUpdated()); } @@ -1031,10 +1069,10 @@ namespace Game.Guilds if (member == null) return; - byte rankId = member.GetRankId(); + GuildRankId rankId = member.GetRankId(); GuildPermissionsQueryResults queryResult = new(); - queryResult.RankID = rankId; + queryResult.RankID = (byte)rankId; queryResult.WithdrawGoldLimit = (int)_GetMemberRemainingMoney(member); queryResult.Flags = (int)_GetRankRights(rankId); queryResult.NumTabs = _GetPurchasedTabsSize(); @@ -1238,7 +1276,7 @@ namespace Game.Guilds { ulong lowguid = field.Read(1); ObjectGuid playerGuid = ObjectGuid.Create(HighGuid.Player, lowguid); - Member member = new(m_id, playerGuid, field.Read(2)); + Member member = new(m_id, playerGuid, (GuildRankId)field.Read(2)); if (!member.LoadFromDB(field)) { _DeleteMemberFromDB(null, lowguid); @@ -1254,7 +1292,7 @@ namespace Game.Guilds // tabId rights slots GuildBankRightsAndSlots rightsAndSlots = new(field.Read(1), field.Read(3), field.Read(4)); // rankId - _SetRankBankTabRightsAndSlots(field.Read(2), rightsAndSlots, false); + _SetRankBankTabRightsAndSlots((GuildRankId)field.Read(2), rightsAndSlots, false); } public bool LoadEventLogFromDB(SQLFields field) @@ -1373,8 +1411,8 @@ namespace Game.Guilds { for (byte rankId = 0; rankId < ranks; ++rankId) { - RankInfo rankInfo = GetRankInfo(rankId); - if (rankInfo.GetId() != rankId) + RankInfo rankInfo = GetRankInfo((GuildRankId)rankId); + if (rankInfo.GetId() != (GuildRankId)rankId) { Log.outError(LogFilter.Guild, "Guild {0} has broken rank id {1}, creating default set of ranks...", m_id, rankId); broken_ranks = true; @@ -1394,7 +1432,7 @@ namespace Game.Guilds // Validate members' data foreach (var member in m_members.Values) - if (member.GetRankId() > _GetRanksSize()) + if (GetRankInfo(member.GetRankId()) == null) member.ChangeRank(trans, _GetLowestRankId()); // Repair the structure of the guild. @@ -1411,7 +1449,7 @@ namespace Game.Guilds return false; } } - else if (!leader.IsRank(GuildDefaultRanks.Master)) + else if (!leader.IsRank(GuildRankId.GuildMaster)) _SetLeader(trans, leader); if (trans.commands.Count > 0) @@ -1456,7 +1494,7 @@ namespace Game.Guilds } } - public void BroadcastPacketToRank(ServerPacket packet, byte rankId) + public void BroadcastPacketToRank(ServerPacket packet, GuildRankId rankId) { foreach (var member in m_members.Values) { @@ -1492,7 +1530,7 @@ namespace Game.Guilds } } - public void MassInviteToEvent(WorldSession session, uint minLevel, uint maxLevel, uint minRank) + public void MassInviteToEvent(WorldSession session, uint minLevel, uint maxLevel, GuildRankOrder minRank) { CalendarCommunityInvite packet = new(); @@ -1507,16 +1545,24 @@ namespace Game.Guilds return; } - uint level = Global.CharacterCacheStorage.GetCharacterLevelByGuid(member.GetGUID()); + if (member.GetGUID() == session.GetPlayer().GetGUID()) + continue; - if (member.GetGUID() != session.GetPlayer().GetGUID() && level >= minLevel && level <= maxLevel && member.IsRankNotLower(minRank)) - packet.Invites.Add(new CalendarEventInitialInviteInfo(member.GetGUID(), (byte)level)); + uint level = Global.CharacterCacheStorage.GetCharacterLevelByGuid(member.GetGUID()); + if (level < minLevel || level > maxLevel) + continue; + + RankInfo rank = GetRankInfo(member.GetRankId()); + if (rank.GetOrder() > minRank) + continue; + + packet.Invites.Add(new CalendarEventInitialInviteInfo(member.GetGUID(), (byte)level)); } session.SendPacket(packet); } - public bool AddMember(SQLTransaction trans, ObjectGuid guid, byte rankId = GuildConst.RankNone) + public bool AddMember(SQLTransaction trans, ObjectGuid guid, GuildRankId? rankId = null) { Player player = Global.ObjAccessor.FindPlayer(guid); // Player cannot be in guild @@ -1535,17 +1581,17 @@ namespace Game.Guilds ulong lowguid = guid.GetCounter(); // If rank was not passed, assign lowest possible rank - if (rankId == GuildConst.RankNone) + if (!rankId.HasValue) rankId = _GetLowestRankId(); - Member member = new(m_id, guid, rankId); + Member member = new(m_id, guid, rankId.Value); string name = ""; if (player != null) { m_members[guid] = member; player.SetInGuild(m_id); player.SetGuildIdInvited(0); - player.SetGuildRank(rankId); + player.SetGuildRank((byte)rankId); player.SetGuildLevel(GetLevel()); SendLoginInfo(player.GetSession()); name = player.GetName(); @@ -1593,7 +1639,7 @@ namespace Game.Guilds BroadcastPacket(joinNotificationPacket); // Call scripts if member was succesfully added (and stored to database) - Global.ScriptMgr.OnGuildAddMember(this, player, rankId); + Global.ScriptMgr.OnGuildAddMember(this, player, (byte)rankId); return true; } @@ -1654,9 +1700,9 @@ namespace Game.Guilds _UpdateAccountsNumber(); } - public bool ChangeMemberRank(SQLTransaction trans, ObjectGuid guid, byte newRank) + public bool ChangeMemberRank(SQLTransaction trans, ObjectGuid guid, GuildRankId newRank) { - if (newRank <= _GetLowestRankId()) // Validate rank (allow only existing ranks) + if (GetRankInfo(newRank) != null) // Validate rank (allow only existing ranks) { Member member = GetMember(guid); if (member != null) @@ -1714,6 +1760,16 @@ namespace Game.Guilds } } + RankInfo GetRankInfo(GuildRankId rankId) + { + return m_ranks.Find(rank => rank.GetId() == rankId); + } + + RankInfo GetRankInfo(GuildRankOrder rankOrder) + { + return m_ranks.Find(rank => rank.GetOrder() == rankOrder); + } + // Private methods void _CreateLogHolders() { @@ -1766,12 +1822,15 @@ namespace Game.Guilds bool _CreateRank(SQLTransaction trans, string name, GuildRankRights rights) { - byte newRankId = _GetRanksSize(); - if (newRankId >= GuildConst.MaxRanks) + if (m_ranks.Count >= GuildConst.MaxRanks) return false; + byte newRankId = 0; + while (GetRankInfo((GuildRankId)newRankId) != null) + ++newRankId; + // Ranks represent sequence 0, 1, 2, ... where 0 means guildmaster - RankInfo info = new(m_id, newRankId, name, rights, 0); + RankInfo info = new(m_id, (GuildRankId)newRankId, (GuildRankOrder)m_ranks.Count, name, rights, 0); m_ranks.Add(info); bool isInTransaction = trans != null; @@ -1805,7 +1864,7 @@ namespace Game.Guilds Member member = GetMember(player.GetGUID()); if (member != null) - return member.IsRank(GuildDefaultRanks.Master); + return member.IsRank(GuildRankId.GuildMaster); return false; } @@ -1848,7 +1907,7 @@ namespace Game.Guilds trans = new SQLTransaction(); m_leaderGuid = leader.GetGUID(); - leader.ChangeRank(trans, GuildDefaultRanks.Master); + leader.ChangeRank(trans, GuildRankId.GuildMaster); PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_GUILD_LEADER); stmt.AddValue(0, m_leaderGuid.GetCounter()); @@ -1859,14 +1918,14 @@ namespace Game.Guilds DB.Characters.CommitTransaction(trans); } - void _SetRankBankMoneyPerDay(uint rankId, uint moneyPerDay) + void _SetRankBankMoneyPerDay(GuildRankId rankId, uint moneyPerDay) { RankInfo rankInfo = GetRankInfo(rankId); if (rankInfo != null) rankInfo.SetBankMoneyPerDay(moneyPerDay); } - void _SetRankBankTabRightsAndSlots(uint rankId, GuildBankRightsAndSlots rightsAndSlots, bool saveToDB = true) + void _SetRankBankTabRightsAndSlots(GuildRankId rankId, GuildBankRightsAndSlots rightsAndSlots, bool saveToDB = true) { if (rightsAndSlots.GetTabId() >= _GetPurchasedTabsSize()) return; @@ -1876,7 +1935,7 @@ namespace Game.Guilds rankInfo.SetBankTabSlotsAndRights(rightsAndSlots, saveToDB); } - string _GetRankName(byte rankId) + string _GetRankName(GuildRankId rankId) { RankInfo rankInfo = GetRankInfo(rankId); if (rankInfo != null) @@ -1884,7 +1943,7 @@ namespace Game.Guilds return ""; } - GuildRankRights _GetRankRights(byte rankId) + GuildRankRights _GetRankRights(GuildRankId rankId) { RankInfo rankInfo = GetRankInfo(rankId); if (rankInfo != null) @@ -1892,7 +1951,7 @@ namespace Game.Guilds return 0; } - uint _GetRankBankMoneyPerDay(byte rankId) + uint _GetRankBankMoneyPerDay(GuildRankId rankId) { RankInfo rankInfo = GetRankInfo(rankId); if (rankInfo != null) @@ -1900,7 +1959,7 @@ namespace Game.Guilds return 0; } - int _GetRankBankTabSlotsPerDay(byte rankId, byte tabId) + int _GetRankBankTabSlotsPerDay(GuildRankId rankId, byte tabId) { if (tabId < _GetPurchasedTabsSize()) { @@ -1911,7 +1970,7 @@ namespace Game.Guilds return 0; } - GuildBankRights _GetRankBankTabRights(byte rankId, byte tabId) + GuildBankRights _GetRankBankTabRights(GuildRankId rankId, byte tabId) { RankInfo rankInfo = GetRankInfo(rankId); if (rankInfo != null) @@ -1923,8 +1982,8 @@ namespace Game.Guilds { if (member != null) { - byte rankId = member.GetRankId(); - if (rankId == GuildDefaultRanks.Master) + GuildRankId rankId = member.GetRankId(); + if (rankId == GuildRankId.GuildMaster) return Convert.ToInt32(GuildConst.WithdrawSlotUnlimited); if ((_GetRankBankTabRights(rankId, tabId) & GuildBankRights.ViewTab) != 0) { @@ -1940,8 +1999,8 @@ namespace Game.Guilds { if (member != null) { - byte rankId = member.GetRankId(); - if (rankId == GuildDefaultRanks.Master) + GuildRankId rankId = member.GetRankId(); + if (rankId == GuildRankId.GuildMaster) return long.MaxValue; if ((_GetRankRights(rankId) & (GuildRankRights.WithdrawRepair | GuildRankRights.WithdrawGold)) != 0) @@ -1967,7 +2026,7 @@ namespace Game.Guilds if (member != null) { // Leader always has full rights - if (member.IsRank(GuildDefaultRanks.Master) || m_leaderGuid == guid) + if (member.IsRank(GuildRankId.GuildMaster) || m_leaderGuid == guid) return true; return (_GetRankBankTabRights(member.GetRankId(), tabId) & rights) == rights; } @@ -2286,7 +2345,7 @@ namespace Game.Guilds session.SendPacket(packet); } - void SendGuildRanksUpdate(ObjectGuid setterGuid, ObjectGuid targetGuid, uint rank) + void SendGuildRanksUpdate(ObjectGuid setterGuid, ObjectGuid targetGuid, GuildRankId rank) { Member member = GetMember(targetGuid); Cypher.Assert(member != null); @@ -2294,7 +2353,7 @@ namespace Game.Guilds GuildSendRankChange rankChange = new(); rankChange.Officer = setterGuid; rankChange.Other = targetGuid; - rankChange.RankID = rank; + rankChange.RankID = (byte)rank; rankChange.Promote = (rank < member.GetRankId()); BroadcastPacket(rankChange); @@ -2405,7 +2464,7 @@ namespace Game.Guilds return false; } - byte _GetLowestRankId() { return (byte)(m_ranks.Count - 1); } + GuildRankId _GetLowestRankId() { return m_ranks.Last().GetId(); } byte _GetPurchasedTabsSize() { return (byte)m_bankTabs.Count; } @@ -2494,7 +2553,7 @@ namespace Game.Guilds #region Classes public class Member { - public Member(ulong guildId, ObjectGuid guid, byte rankId) + public Member(ulong guildId, ObjectGuid guid, GuildRankId rankId) { m_guildId = guildId; m_guid = guid; @@ -2560,9 +2619,9 @@ namespace Game.Guilds DB.Characters.Execute(stmt); } - public void ChangeRank(SQLTransaction trans, uint newRank) + public void ChangeRank(SQLTransaction trans, GuildRankId newRank) { - m_rankId = (byte)newRank; + m_rankId = newRank; // Update rank information in player's field, if he is online. Player player = FindConnectedPlayer(); @@ -2570,7 +2629,7 @@ namespace Game.Guilds player.SetGuildRank((byte)newRank); PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_GUILD_MEMBER_RANK); - stmt.AddValue(0, newRank); + stmt.AddValue(0, (byte)newRank); stmt.AddValue(1, m_guid.GetCounter()); DB.Characters.ExecuteOrAppend(trans, stmt); } @@ -2580,7 +2639,7 @@ namespace Game.Guilds PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_GUILD_MEMBER); stmt.AddValue(0, m_guildId); stmt.AddValue(1, m_guid.GetCounter()); - stmt.AddValue(2, m_rankId); + stmt.AddValue(2, (byte)m_rankId); stmt.AddValue(3, m_publicNote); stmt.AddValue(4, m_officerNote); DB.Characters.ExecuteOrAppend(trans, stmt); @@ -2699,7 +2758,7 @@ namespace Game.Guilds public ObjectGuid GetGUID() { return m_guid; } public string GetName() { return m_name; } public uint GetAccountId() { return m_accountId; } - public byte GetRankId() { return m_rankId; } + public GuildRankId GetRankId() { return m_rankId; } public ulong GetLogoutTime() { return m_logoutTime; } public string GetPublicNote() { return m_publicNote; } public string GetOfficerNote() { return m_officerNote; } @@ -2720,8 +2779,7 @@ namespace Game.Guilds public bool IsOnline() { return m_flags.HasFlag(GuildMemberFlags.Online); } public void UpdateLogoutTime() { m_logoutTime = (ulong)GameTime.GetGameTime(); } - public bool IsRank(byte rankId) { return m_rankId == rankId; } - public bool IsRankNotLower(uint rankId) { return m_rankId <= rankId; } + public bool IsRank(GuildRankId rankId) { return m_rankId == rankId; } public bool IsSamePlayer(ObjectGuid guid) { return m_guid == guid; } public uint GetBankTabWithdrawValue(byte tabId) { return m_bankWithdraw[tabId]; } @@ -2741,7 +2799,7 @@ namespace Game.Guilds GuildMemberFlags m_flags; ulong m_logoutTime; uint m_accountId; - byte m_rankId; + GuildRankId m_rankId; string m_publicNote = ""; string m_officerNote = ""; @@ -3076,7 +3134,8 @@ namespace Game.Guilds public RankInfo(ulong guildId = 0) { m_guildId = guildId; - m_rankId = GuildConst.RankNone; + m_rankId = (GuildRankId)0xFF; + m_rankOrder = 0; m_rights = GuildRankRights.None; m_bankMoneyPerDay = 0; @@ -3084,10 +3143,11 @@ namespace Game.Guilds m_bankTabRightsAndSlots[i] = new GuildBankRightsAndSlots(); } - public RankInfo(ulong guildId, byte rankId, string name, GuildRankRights rights, uint money) + public RankInfo(ulong guildId, GuildRankId rankId, GuildRankOrder rankOrder, string name, GuildRankRights rights, uint money) { m_guildId = guildId; m_rankId = rankId; + m_rankOrder = rankOrder; m_name = name; m_rights = rights; m_bankMoneyPerDay = money; @@ -3098,11 +3158,12 @@ namespace Game.Guilds public void LoadFromDB(SQLFields field) { - m_rankId = field.Read(1); - m_name = field.Read(2); - m_rights = (GuildRankRights)field.Read(3); - m_bankMoneyPerDay = field.Read(4); - if (m_rankId == GuildDefaultRanks.Master) // Prevent loss of leader rights + m_rankId = (GuildRankId)field.Read(1); + m_rankOrder = (GuildRankOrder)field.Read(2); + m_name = field.Read(3); + m_rights = (GuildRankRights)field.Read(4); + m_bankMoneyPerDay = field.Read(5); + if (m_rankId == GuildRankId.GuildMaster) // Prevent loss of leader rights m_rights |= GuildRankRights.All; } @@ -3110,10 +3171,11 @@ namespace Game.Guilds { PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_GUILD_RANK); stmt.AddValue(0, m_guildId); - stmt.AddValue(1, m_rankId); - stmt.AddValue(2, m_name); - stmt.AddValue(3, (uint)m_rights); - stmt.AddValue(4, m_bankMoneyPerDay); + stmt.AddValue(1, (byte)m_rankId); + stmt.AddValue(2, (byte)m_rankOrder); + stmt.AddValue(3, m_name); + stmt.AddValue(4, (uint)m_rights); + stmt.AddValue(5, m_bankMoneyPerDay); DB.Characters.ExecuteOrAppend(trans, stmt); } @@ -3126,16 +3188,16 @@ namespace Game.Guilds continue; rightsAndSlots.SetTabId(i); - if (m_rankId == GuildDefaultRanks.Master) + if (m_rankId == GuildRankId.GuildMaster) rightsAndSlots.SetGuildMasterValues(); if (logOnCreate) - Log.outError(LogFilter.Guild, "Guild {0} has broken Tab {1} for rank {2}. Created default tab.", m_guildId, i, m_rankId); + Log.outError(LogFilter.Guild, $"Guild {m_guildId} has broken Tab {i} for rank {m_rankId}. Created default tab."); PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_GUILD_BANK_RIGHT); stmt.AddValue(0, m_guildId); stmt.AddValue(1, i); - stmt.AddValue(2, m_rankId); + stmt.AddValue(2, (byte)m_rankId); stmt.AddValue(3, (sbyte)rightsAndSlots.GetRights()); stmt.AddValue(4, rightsAndSlots.GetSlots()); trans.Append(stmt); @@ -3151,14 +3213,14 @@ namespace Game.Guilds PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_GUILD_RANK_NAME); stmt.AddValue(0, m_name); - stmt.AddValue(1, m_rankId); + stmt.AddValue(1, (byte)m_rankId); stmt.AddValue(2, m_guildId); DB.Characters.Execute(stmt); } public void SetRights(GuildRankRights rights) { - if (m_rankId == GuildDefaultRanks.Master) // Prevent loss of leader rights + if (m_rankId == GuildRankId.GuildMaster) // Prevent loss of leader rights rights = GuildRankRights.All; if (m_rights == rights) @@ -3168,7 +3230,7 @@ namespace Game.Guilds PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_GUILD_RANK_RIGHTS); stmt.AddValue(0, (uint)m_rights); - stmt.AddValue(1, m_rankId); + stmt.AddValue(1, (byte)m_rankId); stmt.AddValue(2, m_guildId); DB.Characters.Execute(stmt); } @@ -3182,14 +3244,14 @@ namespace Game.Guilds PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_GUILD_RANK_BANK_MONEY); stmt.AddValue(0, money); - stmt.AddValue(1, m_rankId); + stmt.AddValue(1, (byte)m_rankId); stmt.AddValue(2, m_guildId); DB.Characters.Execute(stmt); } public void SetBankTabSlotsAndRights(GuildBankRightsAndSlots rightsAndSlots, bool saveToDB) { - if (m_rankId == GuildDefaultRanks.Master) // Prevent loss of leader rights + if (m_rankId == GuildRankId.GuildMaster) // Prevent loss of leader rights rightsAndSlots.SetGuildMasterValues(); m_bankTabRightsAndSlots[rightsAndSlots.GetTabId()] = rightsAndSlots; @@ -3199,14 +3261,18 @@ namespace Game.Guilds PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_GUILD_BANK_RIGHT); stmt.AddValue(0, m_guildId); stmt.AddValue(1, rightsAndSlots.GetTabId()); - stmt.AddValue(2, m_rankId); + stmt.AddValue(2, (byte)m_rankId); stmt.AddValue(3, (sbyte)rightsAndSlots.GetRights()); stmt.AddValue(4, rightsAndSlots.GetSlots()); DB.Characters.Execute(stmt); } } - public byte GetId() { return m_rankId; } + public GuildRankId GetId() { return m_rankId; } + + public GuildRankOrder GetOrder() { return m_rankOrder; } + + public void SetOrder(GuildRankOrder rankOrder) { m_rankOrder = rankOrder; } public string GetName() { return m_name; } @@ -3214,7 +3280,7 @@ namespace Game.Guilds public uint GetBankMoneyPerDay() { - return m_rankId != GuildDefaultRanks.Master ? m_bankMoneyPerDay : GuildConst.WithdrawMoneyUnlimited; + return m_rankId != GuildRankId.GuildMaster ? m_bankMoneyPerDay : GuildConst.WithdrawMoneyUnlimited; } public GuildBankRights GetBankTabRights(byte tabId) @@ -3227,9 +3293,9 @@ namespace Game.Guilds return tabId < GuildConst.MaxBankTabs ? m_bankTabRightsAndSlots[tabId].GetSlots() : 0; } - ulong m_guildId; - byte m_rankId; + GuildRankId m_rankId; + GuildRankOrder m_rankOrder; string m_name; GuildRankRights m_rights; uint m_bankMoneyPerDay; diff --git a/Source/Game/Guilds/GuildManager.cs b/Source/Game/Guilds/GuildManager.cs index ad5928580..1b6b7988b 100644 --- a/Source/Game/Guilds/GuildManager.cs +++ b/Source/Game/Guilds/GuildManager.cs @@ -141,8 +141,8 @@ namespace Game // Delete orphaned guild rank entries before loading the valid ones DB.Characters.DirectExecute("DELETE gr FROM guild_rank gr LEFT JOIN guild g ON gr.guildId = g.guildId WHERE g.guildId IS NULL"); - // 0 1 2 3 4 - SQLResult result = DB.Characters.Query("SELECT guildid, rid, rname, rights, BankMoneyPerDay FROM guild_rank ORDER BY guildid ASC, rid ASC"); + // 0 1 2 3 4 5 + SQLResult result = DB.Characters.Query("SELECT guildid, rid, RankOrder, rname, rights, BankMoneyPerDay FROM guild_rank ORDER BY guildid ASC, rid ASC"); if (result.IsEmpty()) { diff --git a/Source/Game/Handlers/CalendarHandler.cs b/Source/Game/Handlers/CalendarHandler.cs index 3caf5b56d..bd3bf35af 100644 --- a/Source/Game/Handlers/CalendarHandler.cs +++ b/Source/Game/Handlers/CalendarHandler.cs @@ -113,7 +113,7 @@ namespace Game { Guild guild = Global.GuildMgr.GetGuildById(GetPlayer().GetGuildId()); if (guild) - guild.MassInviteToEvent(this, calendarCommunityInvite.MinLevel, calendarCommunityInvite.MaxLevel, calendarCommunityInvite.MaxRankOrder); + guild.MassInviteToEvent(this, calendarCommunityInvite.MinLevel, calendarCommunityInvite.MaxLevel, (GuildRankOrder)calendarCommunityInvite.MaxRankOrder); } [WorldPacketHandler(ClientOpcodes.CalendarAddEvent)] diff --git a/Source/Game/Handlers/GuildHandler.cs b/Source/Game/Handlers/GuildHandler.cs index e5d510d45..a81b6c497 100644 --- a/Source/Game/Handlers/GuildHandler.cs +++ b/Source/Game/Handlers/GuildHandler.cs @@ -114,7 +114,7 @@ namespace Game Guild guild = GetPlayer().GetGuild(); if (guild) - guild.HandleSetMemberRank(this, packet.Member, setterGuid, (byte)packet.RankOrder); + guild.HandleSetMemberRank(this, packet.Member, setterGuid, (GuildRankOrder)packet.RankOrder); } [WorldPacketHandler(ClientOpcodes.GuildLeave)] @@ -189,7 +189,7 @@ namespace Game { Guild guild = GetPlayer().GetGuild(); if (guild) - guild.HandleRemoveRank(this, (byte)packet.RankOrder); + guild.HandleRemoveRank(this, (GuildRankOrder)packet.RankOrder); } [WorldPacketHandler(ClientOpcodes.GuildUpdateInfoText)] @@ -579,7 +579,7 @@ namespace Game for (byte tabId = 0; tabId < GuildConst.MaxBankTabs; ++tabId) rightsAndSlots[tabId] = new Guild.GuildBankRightsAndSlots(tabId, (sbyte)packet.TabFlags[tabId], (int)packet.TabWithdrawItemLimit[tabId]); - guild.HandleSetRankInfo(this, (byte)packet.RankOrder, packet.RankName, (GuildRankRights)packet.Flags, packet.WithdrawGoldLimit, rightsAndSlots); + guild.HandleSetRankInfo(this, (GuildRankId)packet.RankID, packet.RankName, (GuildRankRights)packet.Flags, packet.WithdrawGoldLimit, rightsAndSlots); } [WorldPacketHandler(ClientOpcodes.RequestGuildPartyState)] diff --git a/Source/Game/Scripting/SpellScript.cs b/Source/Game/Scripting/SpellScript.cs index d9cf5c254..e80a31c43 100644 --- a/Source/Game/Scripting/SpellScript.cs +++ b/Source/Game/Scripting/SpellScript.cs @@ -917,7 +917,7 @@ namespace Game.Scripting // not enough injured units // fill remainder with full health units targets.AddRange(lookupPlayers[true]); - targets.AddRange(lookupPlayers[false].Shuffle())); + targets.AddRange(lookupPlayers[false].Shuffle()); } else if (lookupPlayers[true].Count() > maxTargets) {