Core/Guilds: Separate guild rank id from guild rank order

Port From (https://github.com/TrinityCore/TrinityCore/commit/0d3235f56969a6e414071edbb669ac63b4398958)
This commit is contained in:
hondacrx
2022-02-25 10:40:47 -05:00
parent f66e622f1d
commit 91c2fedb6e
8 changed files with 191 additions and 122 deletions
+173 -107
View File
@@ -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<ulong>(1);
ObjectGuid playerGuid = ObjectGuid.Create(HighGuid.Player, lowguid);
Member member = new(m_id, playerGuid, field.Read<byte>(2));
Member member = new(m_id, playerGuid, (GuildRankId)field.Read<byte>(2));
if (!member.LoadFromDB(field))
{
_DeleteMemberFromDB(null, lowguid);
@@ -1254,7 +1292,7 @@ namespace Game.Guilds
// tabId rights slots
GuildBankRightsAndSlots rightsAndSlots = new(field.Read<byte>(1), field.Read<sbyte>(3), field.Read<int>(4));
// rankId
_SetRankBankTabRightsAndSlots(field.Read<byte>(2), rightsAndSlots, false);
_SetRankBankTabRightsAndSlots((GuildRankId)field.Read<byte>(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 "<unknown>";
}
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<byte>(1);
m_name = field.Read<string>(2);
m_rights = (GuildRankRights)field.Read<uint>(3);
m_bankMoneyPerDay = field.Read<uint>(4);
if (m_rankId == GuildDefaultRanks.Master) // Prevent loss of leader rights
m_rankId = (GuildRankId)field.Read<byte>(1);
m_rankOrder = (GuildRankOrder)field.Read<byte>(2);
m_name = field.Read<string>(3);
m_rights = (GuildRankRights)field.Read<uint>(4);
m_bankMoneyPerDay = field.Read<uint>(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;
+2 -2
View File
@@ -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())
{