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
+7 -6
View File
@@ -83,13 +83,14 @@ namespace Framework.Constants
All = 0x00DDFFBF All = 0x00DDFFBF
} }
public struct GuildDefaultRanks public enum GuildRankId
{ {
public const int Master = 0; GuildMaster = 0
public const int Officer = 1; }
public const int Veteran = 2;
public const int Member = 3; public enum GuildRankOrder
public const int Initiate = 4; {
} }
[Flags] [Flags]
@@ -260,7 +260,7 @@ namespace Framework.Database
PrepareStatement(CharStatements.DEL_GUILD_MEMBER, "DELETE FROM guild_member WHERE guid = ?"); PrepareStatement(CharStatements.DEL_GUILD_MEMBER, "DELETE FROM guild_member WHERE guid = ?");
PrepareStatement(CharStatements.DEL_GUILD_MEMBERS, "DELETE FROM guild_member WHERE guildid = ?"); 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_RANKS, "DELETE FROM guild_rank WHERE guildid = ?");
PrepareStatement(CharStatements.DEL_GUILD_RANK, "DELETE FROM guild_rank WHERE guildid = ? AND rid = ?"); 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 (?, ?)"); 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_MOTD, "UPDATE guild SET motd = ? WHERE guildid = ?");
PrepareStatement(CharStatements.UPD_GUILD_INFO, "UPDATE guild SET info = ? 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_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_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 = ?"); 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_MOTD,
UPD_GUILD_INFO, UPD_GUILD_INFO,
UPD_GUILD_LEADER, UPD_GUILD_LEADER,
UPD_GUILD_RANK_ORDER,
UPD_GUILD_RANK_NAME, UPD_GUILD_RANK_NAME,
UPD_GUILD_RANK_RIGHTS, UPD_GUILD_RANK_RIGHTS,
UPD_GUILD_EMBLEM_INFO, UPD_GUILD_EMBLEM_INFO,
+1 -1
View File
@@ -152,7 +152,7 @@ namespace Game.Chat
if (!byte.TryParse(rankStr, out byte newRank)) if (!byte.TryParse(rankStr, out byte newRank))
return false; return false;
return targetGuild.ChangeMemberRank(null, targetGuid, newRank); return targetGuild.ChangeMemberRank(null, targetGuid, (GuildRankId)newRank);
} }
[Command("rename", RBACPermissions.CommandGuildRename, true)] [Command("rename", RBACPermissions.CommandGuildRename, true)]
+173 -107
View File
@@ -81,7 +81,7 @@ namespace Game.Guilds
trans.Append(stmt); trans.Append(stmt);
_CreateDefaultGuildRanks(trans, pLeaderSession.GetSessionDbLocaleIndex()); // Create default ranks _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); DB.Characters.CommitTransaction(trans);
if (ret) if (ret)
@@ -221,7 +221,7 @@ namespace Game.Guilds
GuildRosterMemberData memberData = new(); GuildRosterMemberData memberData = new();
memberData.Guid = member.GetGUID(); memberData.Guid = member.GetGUID();
memberData.RankID = member.GetRankId(); memberData.RankID = (int)member.GetRankId();
memberData.AreaID = (int)member.GetZoneId(); memberData.AreaID = (int)member.GetZoneId();
memberData.PersonalAchievementPoints = (int)member.GetAchievementPoints(); memberData.PersonalAchievementPoints = (int)member.GetAchievementPoints();
memberData.GuildReputation = (int)member.GetTotalReputation(); memberData.GuildReputation = (int)member.GetTotalReputation();
@@ -268,8 +268,8 @@ namespace Game.Guilds
response.Info.BorderColor = m_emblemInfo.GetBorderColor(); response.Info.BorderColor = m_emblemInfo.GetBorderColor();
response.Info.BackgroundColor = m_emblemInfo.GetBackgroundColor(); response.Info.BackgroundColor = m_emblemInfo.GetBackgroundColor();
for (byte i = 0; i < _GetRanksSize(); ++i) foreach (RankInfo rankInfo in m_ranks)
response.Info.Ranks.Add(new QueryGuildInfoResponse.GuildInfo.RankInfo(m_ranks[i].GetId(), i, m_ranks[i].GetName())); response.Info.Ranks.Add(new QueryGuildInfoResponse.GuildInfo.RankInfo((byte)rankInfo.GetId(), (byte)rankInfo.GetOrder(), rankInfo.GetName()));
response.Info.GuildName = m_name; response.Info.GuildName = m_name;
@@ -280,18 +280,14 @@ namespace Game.Guilds
{ {
GuildRanks ranks = new(); 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(); GuildRankData rankData = new();
rankData.RankID = rankInfo.GetId(); rankData.RankID = (byte)rankInfo.GetId();
rankData.RankOrder = i; rankData.RankOrder = (byte)rankInfo.GetOrder();
rankData.Flags = (uint)rankInfo.GetRights(); 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(); rankData.RankName = rankInfo.GetName();
for (byte j = 0; j < GuildConst.MaxBankTabs; ++j) for (byte j = 0; j < GuildConst.MaxBankTabs; ++j)
@@ -415,7 +411,10 @@ namespace Game.Guilds
if (newGuildMaster == null) if (newGuildMaster == null)
return; 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); SendCommandResult(session, GuildCommandType.ChangeLeader, GuildCommandError.Permissions);
return; return;
@@ -437,7 +436,7 @@ namespace Game.Guilds
SQLTransaction trans = new(); SQLTransaction trans = new();
_SetLeader(trans, newGuildMaster); _SetLeader(trans, newGuildMaster);
oldGuildMaster.ChangeRank(trans, GuildDefaultRanks.Initiate); oldGuildMaster.ChangeRank(trans, _GetLowestRankId());
SendEventNewLeader(newGuildMaster, oldGuildMaster, isSelfPromote); 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 // Only leader can modify ranks
if (!_IsLeader(session.GetPlayer())) if (!_IsLeader(session.GetPlayer()))
@@ -503,7 +502,7 @@ namespace Game.Guilds
_SetRankBankTabRightsAndSlots(rankId, rightsAndSlot); _SetRankBankTabRightsAndSlots(rankId, rightsAndSlot);
GuildEventRankChanged packet = new(); GuildEventRankChanged packet = new();
packet.RankID = rankId; packet.RankID = (byte)rankId;
BroadcastPacket(packet); BroadcastPacket(packet);
} }
} }
@@ -672,13 +671,16 @@ namespace Game.Guilds
string name = member.GetName(); string name = member.GetName();
// Guild masters cannot be removed // Guild masters cannot be removed
if (member.IsRank(GuildDefaultRanks.Master)) if (member.IsRank(GuildRankId.GuildMaster))
SendCommandResult(session, GuildCommandType.RemovePlayer, GuildCommandError.LeaderLeave); SendCommandResult(session, GuildCommandType.RemovePlayer, GuildCommandError.LeaderLeave);
// Do not allow to remove player with the same rank or higher // Do not allow to remove player with the same rank or higher
else else
{ {
Member memberMe = GetMember(player.GetGUID()); 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); SendCommandResult(session, GuildCommandType.RemovePlayer, GuildCommandError.RankTooHigh_S, name);
else else
{ {
@@ -714,48 +716,59 @@ namespace Game.Guilds
} }
Member memberMe = GetMember(player.GetGUID()); Member memberMe = GetMember(player.GetGUID());
byte rankId = memberMe.GetRankId(); RankInfo myRank = GetRankInfo(memberMe.GetRankId());
RankInfo oldRank = GetRankInfo(member.GetRankId());
GuildRankId newRankId;
if (demote) if (demote)
{ {
// Player can demote only lower rank members // Player can demote only lower rank members
if (member.IsRankNotLower(rankId)) if (oldRank.GetOrder() <= myRank.GetOrder())
{ {
SendCommandResult(session, type, GuildCommandError.RankTooHigh_S, name); SendCommandResult(session, type, GuildCommandError.RankTooHigh_S, name);
return; return;
} }
// Lowest rank cannot be demoted // 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); SendCommandResult(session, type, GuildCommandError.RankTooLow_S, name);
return; return;
} }
newRankId = newRank.GetId();
} }
else else
{ {
// Allow to promote only to lower rank than member's rank // Allow to promote only to lower rank than member's rank
// member.GetRankId() + 1 is the highest rank that current player can promote to // memberMe->GetRankId() + 1 is the highest rank that current player can promote to
if (member.IsRankNotLower((uint)(rankId + 1))) if ((oldRank.GetOrder() - 1) <= myRank.GetOrder())
{ {
SendCommandResult(session, type, GuildCommandError.RankTooHigh_S, name); SendCommandResult(session, type, GuildCommandError.RankTooHigh_S, name);
return; return;
} }
newRankId = GetRankInfo((oldRank.GetOrder() - 1)).GetId();
} }
uint newRankId = (uint)(member.GetRankId() + (demote ? 1 : -1));
member.ChangeRank(null, newRankId); member.ChangeRank(null, newRankId);
_LogEvent(demote ? GuildEventLogTypes.DemotePlayer : GuildEventLogTypes.PromotePlayer, player.GetGUID().GetCounter(), member.GetGUID().GetCounter(), (byte)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)); //_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(); Player player = session.GetPlayer();
Member member = GetMember(targetGuid); Member member = GetMember(targetGuid);
GuildRankRights rights = GuildRankRights.Promote; GuildRankRights rights = GuildRankRights.Promote;
GuildCommandType type = GuildCommandType.PromotePlayer; 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; rights = GuildRankRights.Demote;
type = GuildCommandType.DemotePlayer; type = GuildCommandType.DemotePlayer;
@@ -775,7 +788,7 @@ namespace Game.Guilds
return; return;
} }
SendGuildRanksUpdate(setterGuid, targetGuid, rank); SendGuildRanksUpdate(setterGuid, targetGuid, newRank.GetId());
} }
public void HandleAddNewRank(WorldSession session, string name) public void HandleAddNewRank(WorldSession session, string name)
@@ -790,24 +803,49 @@ namespace Game.Guilds
BroadcastPacket(new GuildEventRanksUpdated()); 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 // 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; return;
var rankInfo = m_ranks.Find(rank => rank.GetOrder() == rankOrder);
if (rankInfo == null)
return;
SQLTransaction trans = new SQLTransaction();
// Delete bank rights for rank // Delete bank rights for rank
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_GUILD_BANK_RIGHTS_FOR_RANK); PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_GUILD_BANK_RIGHTS_FOR_RANK);
stmt.AddValue(0, m_id); stmt.AddValue(0, m_id);
stmt.AddValue(1, rankId); stmt.AddValue(1, (byte)rankInfo.GetId());
DB.Characters.Execute(stmt); trans.Append(stmt);
// Delete rank // Delete rank
stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_GUILD_RANK); stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_GUILD_RANK);
stmt.AddValue(0, m_id); stmt.AddValue(0, m_id);
stmt.AddValue(1, rankId); stmt.AddValue(1, (byte)rankInfo.GetId());
DB.Characters.Execute(stmt); 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()); BroadcastPacket(new GuildEventRanksUpdated());
} }
@@ -1031,10 +1069,10 @@ namespace Game.Guilds
if (member == null) if (member == null)
return; return;
byte rankId = member.GetRankId(); GuildRankId rankId = member.GetRankId();
GuildPermissionsQueryResults queryResult = new(); GuildPermissionsQueryResults queryResult = new();
queryResult.RankID = rankId; queryResult.RankID = (byte)rankId;
queryResult.WithdrawGoldLimit = (int)_GetMemberRemainingMoney(member); queryResult.WithdrawGoldLimit = (int)_GetMemberRemainingMoney(member);
queryResult.Flags = (int)_GetRankRights(rankId); queryResult.Flags = (int)_GetRankRights(rankId);
queryResult.NumTabs = _GetPurchasedTabsSize(); queryResult.NumTabs = _GetPurchasedTabsSize();
@@ -1238,7 +1276,7 @@ namespace Game.Guilds
{ {
ulong lowguid = field.Read<ulong>(1); ulong lowguid = field.Read<ulong>(1);
ObjectGuid playerGuid = ObjectGuid.Create(HighGuid.Player, lowguid); 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)) if (!member.LoadFromDB(field))
{ {
_DeleteMemberFromDB(null, lowguid); _DeleteMemberFromDB(null, lowguid);
@@ -1254,7 +1292,7 @@ namespace Game.Guilds
// tabId rights slots // tabId rights slots
GuildBankRightsAndSlots rightsAndSlots = new(field.Read<byte>(1), field.Read<sbyte>(3), field.Read<int>(4)); GuildBankRightsAndSlots rightsAndSlots = new(field.Read<byte>(1), field.Read<sbyte>(3), field.Read<int>(4));
// rankId // rankId
_SetRankBankTabRightsAndSlots(field.Read<byte>(2), rightsAndSlots, false); _SetRankBankTabRightsAndSlots((GuildRankId)field.Read<byte>(2), rightsAndSlots, false);
} }
public bool LoadEventLogFromDB(SQLFields field) public bool LoadEventLogFromDB(SQLFields field)
@@ -1373,8 +1411,8 @@ namespace Game.Guilds
{ {
for (byte rankId = 0; rankId < ranks; ++rankId) for (byte rankId = 0; rankId < ranks; ++rankId)
{ {
RankInfo rankInfo = GetRankInfo(rankId); RankInfo rankInfo = GetRankInfo((GuildRankId)rankId);
if (rankInfo.GetId() != 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); Log.outError(LogFilter.Guild, "Guild {0} has broken rank id {1}, creating default set of ranks...", m_id, rankId);
broken_ranks = true; broken_ranks = true;
@@ -1394,7 +1432,7 @@ namespace Game.Guilds
// Validate members' data // Validate members' data
foreach (var member in m_members.Values) foreach (var member in m_members.Values)
if (member.GetRankId() > _GetRanksSize()) if (GetRankInfo(member.GetRankId()) == null)
member.ChangeRank(trans, _GetLowestRankId()); member.ChangeRank(trans, _GetLowestRankId());
// Repair the structure of the guild. // Repair the structure of the guild.
@@ -1411,7 +1449,7 @@ namespace Game.Guilds
return false; return false;
} }
} }
else if (!leader.IsRank(GuildDefaultRanks.Master)) else if (!leader.IsRank(GuildRankId.GuildMaster))
_SetLeader(trans, leader); _SetLeader(trans, leader);
if (trans.commands.Count > 0) 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) 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(); CalendarCommunityInvite packet = new();
@@ -1507,16 +1545,24 @@ namespace Game.Guilds
return; 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)) uint level = Global.CharacterCacheStorage.GetCharacterLevelByGuid(member.GetGUID());
packet.Invites.Add(new CalendarEventInitialInviteInfo(member.GetGUID(), (byte)level)); 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); 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 player = Global.ObjAccessor.FindPlayer(guid);
// Player cannot be in guild // Player cannot be in guild
@@ -1535,17 +1581,17 @@ namespace Game.Guilds
ulong lowguid = guid.GetCounter(); ulong lowguid = guid.GetCounter();
// If rank was not passed, assign lowest possible rank // If rank was not passed, assign lowest possible rank
if (rankId == GuildConst.RankNone) if (!rankId.HasValue)
rankId = _GetLowestRankId(); rankId = _GetLowestRankId();
Member member = new(m_id, guid, rankId); Member member = new(m_id, guid, rankId.Value);
string name = ""; string name = "";
if (player != null) if (player != null)
{ {
m_members[guid] = member; m_members[guid] = member;
player.SetInGuild(m_id); player.SetInGuild(m_id);
player.SetGuildIdInvited(0); player.SetGuildIdInvited(0);
player.SetGuildRank(rankId); player.SetGuildRank((byte)rankId);
player.SetGuildLevel(GetLevel()); player.SetGuildLevel(GetLevel());
SendLoginInfo(player.GetSession()); SendLoginInfo(player.GetSession());
name = player.GetName(); name = player.GetName();
@@ -1593,7 +1639,7 @@ namespace Game.Guilds
BroadcastPacket(joinNotificationPacket); BroadcastPacket(joinNotificationPacket);
// Call scripts if member was succesfully added (and stored to database) // 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; return true;
} }
@@ -1654,9 +1700,9 @@ namespace Game.Guilds
_UpdateAccountsNumber(); _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); Member member = GetMember(guid);
if (member != null) 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 // Private methods
void _CreateLogHolders() void _CreateLogHolders()
{ {
@@ -1766,12 +1822,15 @@ namespace Game.Guilds
bool _CreateRank(SQLTransaction trans, string name, GuildRankRights rights) bool _CreateRank(SQLTransaction trans, string name, GuildRankRights rights)
{ {
byte newRankId = _GetRanksSize(); if (m_ranks.Count >= GuildConst.MaxRanks)
if (newRankId >= GuildConst.MaxRanks)
return false; return false;
byte newRankId = 0;
while (GetRankInfo((GuildRankId)newRankId) != null)
++newRankId;
// Ranks represent sequence 0, 1, 2, ... where 0 means guildmaster // 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); m_ranks.Add(info);
bool isInTransaction = trans != null; bool isInTransaction = trans != null;
@@ -1805,7 +1864,7 @@ namespace Game.Guilds
Member member = GetMember(player.GetGUID()); Member member = GetMember(player.GetGUID());
if (member != null) if (member != null)
return member.IsRank(GuildDefaultRanks.Master); return member.IsRank(GuildRankId.GuildMaster);
return false; return false;
} }
@@ -1848,7 +1907,7 @@ namespace Game.Guilds
trans = new SQLTransaction(); trans = new SQLTransaction();
m_leaderGuid = leader.GetGUID(); m_leaderGuid = leader.GetGUID();
leader.ChangeRank(trans, GuildDefaultRanks.Master); leader.ChangeRank(trans, GuildRankId.GuildMaster);
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());
@@ -1859,14 +1918,14 @@ namespace Game.Guilds
DB.Characters.CommitTransaction(trans); DB.Characters.CommitTransaction(trans);
} }
void _SetRankBankMoneyPerDay(uint rankId, uint moneyPerDay) void _SetRankBankMoneyPerDay(GuildRankId rankId, uint moneyPerDay)
{ {
RankInfo rankInfo = GetRankInfo(rankId); RankInfo rankInfo = GetRankInfo(rankId);
if (rankInfo != null) if (rankInfo != null)
rankInfo.SetBankMoneyPerDay(moneyPerDay); 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()) if (rightsAndSlots.GetTabId() >= _GetPurchasedTabsSize())
return; return;
@@ -1876,7 +1935,7 @@ namespace Game.Guilds
rankInfo.SetBankTabSlotsAndRights(rightsAndSlots, saveToDB); rankInfo.SetBankTabSlotsAndRights(rightsAndSlots, saveToDB);
} }
string _GetRankName(byte rankId) string _GetRankName(GuildRankId rankId)
{ {
RankInfo rankInfo = GetRankInfo(rankId); RankInfo rankInfo = GetRankInfo(rankId);
if (rankInfo != null) if (rankInfo != null)
@@ -1884,7 +1943,7 @@ namespace Game.Guilds
return "<unknown>"; return "<unknown>";
} }
GuildRankRights _GetRankRights(byte rankId) GuildRankRights _GetRankRights(GuildRankId rankId)
{ {
RankInfo rankInfo = GetRankInfo(rankId); RankInfo rankInfo = GetRankInfo(rankId);
if (rankInfo != null) if (rankInfo != null)
@@ -1892,7 +1951,7 @@ namespace Game.Guilds
return 0; return 0;
} }
uint _GetRankBankMoneyPerDay(byte rankId) uint _GetRankBankMoneyPerDay(GuildRankId rankId)
{ {
RankInfo rankInfo = GetRankInfo(rankId); RankInfo rankInfo = GetRankInfo(rankId);
if (rankInfo != null) if (rankInfo != null)
@@ -1900,7 +1959,7 @@ namespace Game.Guilds
return 0; return 0;
} }
int _GetRankBankTabSlotsPerDay(byte rankId, byte tabId) int _GetRankBankTabSlotsPerDay(GuildRankId rankId, byte tabId)
{ {
if (tabId < _GetPurchasedTabsSize()) if (tabId < _GetPurchasedTabsSize())
{ {
@@ -1911,7 +1970,7 @@ namespace Game.Guilds
return 0; return 0;
} }
GuildBankRights _GetRankBankTabRights(byte rankId, byte tabId) GuildBankRights _GetRankBankTabRights(GuildRankId rankId, byte tabId)
{ {
RankInfo rankInfo = GetRankInfo(rankId); RankInfo rankInfo = GetRankInfo(rankId);
if (rankInfo != null) if (rankInfo != null)
@@ -1923,8 +1982,8 @@ namespace Game.Guilds
{ {
if (member != null) if (member != null)
{ {
byte rankId = member.GetRankId(); GuildRankId rankId = member.GetRankId();
if (rankId == GuildDefaultRanks.Master) if (rankId == GuildRankId.GuildMaster)
return Convert.ToInt32(GuildConst.WithdrawSlotUnlimited); return Convert.ToInt32(GuildConst.WithdrawSlotUnlimited);
if ((_GetRankBankTabRights(rankId, tabId) & GuildBankRights.ViewTab) != 0) if ((_GetRankBankTabRights(rankId, tabId) & GuildBankRights.ViewTab) != 0)
{ {
@@ -1940,8 +1999,8 @@ namespace Game.Guilds
{ {
if (member != null) if (member != null)
{ {
byte rankId = member.GetRankId(); GuildRankId rankId = member.GetRankId();
if (rankId == GuildDefaultRanks.Master) if (rankId == GuildRankId.GuildMaster)
return long.MaxValue; return long.MaxValue;
if ((_GetRankRights(rankId) & (GuildRankRights.WithdrawRepair | GuildRankRights.WithdrawGold)) != 0) if ((_GetRankRights(rankId) & (GuildRankRights.WithdrawRepair | GuildRankRights.WithdrawGold)) != 0)
@@ -1967,7 +2026,7 @@ namespace Game.Guilds
if (member != null) if (member != null)
{ {
// Leader always has full rights // Leader always has full rights
if (member.IsRank(GuildDefaultRanks.Master) || m_leaderGuid == guid) if (member.IsRank(GuildRankId.GuildMaster) || m_leaderGuid == guid)
return true; return true;
return (_GetRankBankTabRights(member.GetRankId(), tabId) & rights) == rights; return (_GetRankBankTabRights(member.GetRankId(), tabId) & rights) == rights;
} }
@@ -2286,7 +2345,7 @@ namespace Game.Guilds
session.SendPacket(packet); session.SendPacket(packet);
} }
void SendGuildRanksUpdate(ObjectGuid setterGuid, ObjectGuid targetGuid, uint rank) void SendGuildRanksUpdate(ObjectGuid setterGuid, ObjectGuid targetGuid, GuildRankId rank)
{ {
Member member = GetMember(targetGuid); Member member = GetMember(targetGuid);
Cypher.Assert(member != null); Cypher.Assert(member != null);
@@ -2294,7 +2353,7 @@ namespace Game.Guilds
GuildSendRankChange rankChange = new(); GuildSendRankChange rankChange = new();
rankChange.Officer = setterGuid; rankChange.Officer = setterGuid;
rankChange.Other = targetGuid; rankChange.Other = targetGuid;
rankChange.RankID = rank; rankChange.RankID = (byte)rank;
rankChange.Promote = (rank < member.GetRankId()); rankChange.Promote = (rank < member.GetRankId());
BroadcastPacket(rankChange); BroadcastPacket(rankChange);
@@ -2405,7 +2464,7 @@ namespace Game.Guilds
return false; return false;
} }
byte _GetLowestRankId() { return (byte)(m_ranks.Count - 1); } GuildRankId _GetLowestRankId() { return m_ranks.Last().GetId(); }
byte _GetPurchasedTabsSize() { return (byte)m_bankTabs.Count; } byte _GetPurchasedTabsSize() { return (byte)m_bankTabs.Count; }
@@ -2494,7 +2553,7 @@ namespace Game.Guilds
#region Classes #region Classes
public class Member public class Member
{ {
public Member(ulong guildId, ObjectGuid guid, byte rankId) public Member(ulong guildId, ObjectGuid guid, GuildRankId rankId)
{ {
m_guildId = guildId; m_guildId = guildId;
m_guid = guid; m_guid = guid;
@@ -2560,9 +2619,9 @@ namespace Game.Guilds
DB.Characters.Execute(stmt); 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. // Update rank information in player's field, if he is online.
Player player = FindConnectedPlayer(); Player player = FindConnectedPlayer();
@@ -2570,7 +2629,7 @@ namespace Game.Guilds
player.SetGuildRank((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, (byte)newRank);
stmt.AddValue(1, m_guid.GetCounter()); stmt.AddValue(1, m_guid.GetCounter());
DB.Characters.ExecuteOrAppend(trans, stmt); DB.Characters.ExecuteOrAppend(trans, stmt);
} }
@@ -2580,7 +2639,7 @@ namespace Game.Guilds
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_GUILD_MEMBER); PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_GUILD_MEMBER);
stmt.AddValue(0, m_guildId); stmt.AddValue(0, m_guildId);
stmt.AddValue(1, m_guid.GetCounter()); stmt.AddValue(1, m_guid.GetCounter());
stmt.AddValue(2, m_rankId); stmt.AddValue(2, (byte)m_rankId);
stmt.AddValue(3, m_publicNote); stmt.AddValue(3, m_publicNote);
stmt.AddValue(4, m_officerNote); stmt.AddValue(4, m_officerNote);
DB.Characters.ExecuteOrAppend(trans, stmt); DB.Characters.ExecuteOrAppend(trans, stmt);
@@ -2699,7 +2758,7 @@ namespace Game.Guilds
public ObjectGuid GetGUID() { return m_guid; } public ObjectGuid GetGUID() { return m_guid; }
public string GetName() { return m_name; } public string GetName() { return m_name; }
public uint GetAccountId() { return m_accountId; } 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 ulong GetLogoutTime() { return m_logoutTime; }
public string GetPublicNote() { return m_publicNote; } public string GetPublicNote() { return m_publicNote; }
public string GetOfficerNote() { return m_officerNote; } public string GetOfficerNote() { return m_officerNote; }
@@ -2720,8 +2779,7 @@ namespace Game.Guilds
public bool IsOnline() { return m_flags.HasFlag(GuildMemberFlags.Online); } public bool IsOnline() { return m_flags.HasFlag(GuildMemberFlags.Online); }
public void UpdateLogoutTime() { m_logoutTime = (ulong)GameTime.GetGameTime(); } public void UpdateLogoutTime() { m_logoutTime = (ulong)GameTime.GetGameTime(); }
public bool IsRank(byte rankId) { return m_rankId == rankId; } public bool IsRank(GuildRankId rankId) { return m_rankId == rankId; }
public bool IsRankNotLower(uint rankId) { return m_rankId <= rankId; }
public bool IsSamePlayer(ObjectGuid guid) { return m_guid == guid; } public bool IsSamePlayer(ObjectGuid guid) { return m_guid == guid; }
public uint GetBankTabWithdrawValue(byte tabId) { return m_bankWithdraw[tabId]; } public uint GetBankTabWithdrawValue(byte tabId) { return m_bankWithdraw[tabId]; }
@@ -2741,7 +2799,7 @@ namespace Game.Guilds
GuildMemberFlags m_flags; GuildMemberFlags m_flags;
ulong m_logoutTime; ulong m_logoutTime;
uint m_accountId; uint m_accountId;
byte m_rankId; GuildRankId m_rankId;
string m_publicNote = ""; string m_publicNote = "";
string m_officerNote = ""; string m_officerNote = "";
@@ -3076,7 +3134,8 @@ namespace Game.Guilds
public RankInfo(ulong guildId = 0) public RankInfo(ulong guildId = 0)
{ {
m_guildId = guildId; m_guildId = guildId;
m_rankId = GuildConst.RankNone; m_rankId = (GuildRankId)0xFF;
m_rankOrder = 0;
m_rights = GuildRankRights.None; m_rights = GuildRankRights.None;
m_bankMoneyPerDay = 0; m_bankMoneyPerDay = 0;
@@ -3084,10 +3143,11 @@ namespace Game.Guilds
m_bankTabRightsAndSlots[i] = new GuildBankRightsAndSlots(); 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_guildId = guildId;
m_rankId = rankId; m_rankId = rankId;
m_rankOrder = rankOrder;
m_name = name; m_name = name;
m_rights = rights; m_rights = rights;
m_bankMoneyPerDay = money; m_bankMoneyPerDay = money;
@@ -3098,11 +3158,12 @@ namespace Game.Guilds
public void LoadFromDB(SQLFields field) public void LoadFromDB(SQLFields field)
{ {
m_rankId = field.Read<byte>(1); m_rankId = (GuildRankId)field.Read<byte>(1);
m_name = field.Read<string>(2); m_rankOrder = (GuildRankOrder)field.Read<byte>(2);
m_rights = (GuildRankRights)field.Read<uint>(3); m_name = field.Read<string>(3);
m_bankMoneyPerDay = field.Read<uint>(4); m_rights = (GuildRankRights)field.Read<uint>(4);
if (m_rankId == GuildDefaultRanks.Master) // Prevent loss of leader rights m_bankMoneyPerDay = field.Read<uint>(5);
if (m_rankId == GuildRankId.GuildMaster) // Prevent loss of leader rights
m_rights |= GuildRankRights.All; m_rights |= GuildRankRights.All;
} }
@@ -3110,10 +3171,11 @@ namespace Game.Guilds
{ {
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_GUILD_RANK); PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_GUILD_RANK);
stmt.AddValue(0, m_guildId); stmt.AddValue(0, m_guildId);
stmt.AddValue(1, m_rankId); stmt.AddValue(1, (byte)m_rankId);
stmt.AddValue(2, m_name); stmt.AddValue(2, (byte)m_rankOrder);
stmt.AddValue(3, (uint)m_rights); stmt.AddValue(3, m_name);
stmt.AddValue(4, m_bankMoneyPerDay); stmt.AddValue(4, (uint)m_rights);
stmt.AddValue(5, m_bankMoneyPerDay);
DB.Characters.ExecuteOrAppend(trans, stmt); DB.Characters.ExecuteOrAppend(trans, stmt);
} }
@@ -3126,16 +3188,16 @@ namespace Game.Guilds
continue; continue;
rightsAndSlots.SetTabId(i); rightsAndSlots.SetTabId(i);
if (m_rankId == GuildDefaultRanks.Master) if (m_rankId == GuildRankId.GuildMaster)
rightsAndSlots.SetGuildMasterValues(); rightsAndSlots.SetGuildMasterValues();
if (logOnCreate) 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); PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_GUILD_BANK_RIGHT);
stmt.AddValue(0, m_guildId); stmt.AddValue(0, m_guildId);
stmt.AddValue(1, i); stmt.AddValue(1, i);
stmt.AddValue(2, m_rankId); stmt.AddValue(2, (byte)m_rankId);
stmt.AddValue(3, (sbyte)rightsAndSlots.GetRights()); stmt.AddValue(3, (sbyte)rightsAndSlots.GetRights());
stmt.AddValue(4, rightsAndSlots.GetSlots()); stmt.AddValue(4, rightsAndSlots.GetSlots());
trans.Append(stmt); trans.Append(stmt);
@@ -3151,14 +3213,14 @@ namespace Game.Guilds
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_GUILD_RANK_NAME); PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_GUILD_RANK_NAME);
stmt.AddValue(0, m_name); stmt.AddValue(0, m_name);
stmt.AddValue(1, m_rankId); stmt.AddValue(1, (byte)m_rankId);
stmt.AddValue(2, m_guildId); stmt.AddValue(2, m_guildId);
DB.Characters.Execute(stmt); DB.Characters.Execute(stmt);
} }
public void SetRights(GuildRankRights rights) 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; rights = GuildRankRights.All;
if (m_rights == rights) if (m_rights == rights)
@@ -3168,7 +3230,7 @@ namespace Game.Guilds
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_GUILD_RANK_RIGHTS); PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_GUILD_RANK_RIGHTS);
stmt.AddValue(0, (uint)m_rights); stmt.AddValue(0, (uint)m_rights);
stmt.AddValue(1, m_rankId); stmt.AddValue(1, (byte)m_rankId);
stmt.AddValue(2, m_guildId); stmt.AddValue(2, m_guildId);
DB.Characters.Execute(stmt); DB.Characters.Execute(stmt);
} }
@@ -3182,14 +3244,14 @@ namespace Game.Guilds
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_GUILD_RANK_BANK_MONEY); PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_GUILD_RANK_BANK_MONEY);
stmt.AddValue(0, money); stmt.AddValue(0, money);
stmt.AddValue(1, m_rankId); stmt.AddValue(1, (byte)m_rankId);
stmt.AddValue(2, m_guildId); stmt.AddValue(2, m_guildId);
DB.Characters.Execute(stmt); DB.Characters.Execute(stmt);
} }
public void SetBankTabSlotsAndRights(GuildBankRightsAndSlots rightsAndSlots, bool saveToDB) 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(); rightsAndSlots.SetGuildMasterValues();
m_bankTabRightsAndSlots[rightsAndSlots.GetTabId()] = rightsAndSlots; m_bankTabRightsAndSlots[rightsAndSlots.GetTabId()] = rightsAndSlots;
@@ -3199,14 +3261,18 @@ namespace Game.Guilds
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_GUILD_BANK_RIGHT); PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_GUILD_BANK_RIGHT);
stmt.AddValue(0, m_guildId); stmt.AddValue(0, m_guildId);
stmt.AddValue(1, rightsAndSlots.GetTabId()); stmt.AddValue(1, rightsAndSlots.GetTabId());
stmt.AddValue(2, m_rankId); stmt.AddValue(2, (byte)m_rankId);
stmt.AddValue(3, (sbyte)rightsAndSlots.GetRights()); stmt.AddValue(3, (sbyte)rightsAndSlots.GetRights());
stmt.AddValue(4, rightsAndSlots.GetSlots()); stmt.AddValue(4, rightsAndSlots.GetSlots());
DB.Characters.Execute(stmt); 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; } public string GetName() { return m_name; }
@@ -3214,7 +3280,7 @@ namespace Game.Guilds
public uint GetBankMoneyPerDay() 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) public GuildBankRights GetBankTabRights(byte tabId)
@@ -3227,9 +3293,9 @@ namespace Game.Guilds
return tabId < GuildConst.MaxBankTabs ? m_bankTabRightsAndSlots[tabId].GetSlots() : 0; return tabId < GuildConst.MaxBankTabs ? m_bankTabRightsAndSlots[tabId].GetSlots() : 0;
} }
ulong m_guildId; ulong m_guildId;
byte m_rankId; GuildRankId m_rankId;
GuildRankOrder m_rankOrder;
string m_name; string m_name;
GuildRankRights m_rights; GuildRankRights m_rights;
uint m_bankMoneyPerDay; uint m_bankMoneyPerDay;
+2 -2
View File
@@ -141,8 +141,8 @@ namespace Game
// Delete orphaned guild rank entries before loading the valid ones // 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"); 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 // 0 1 2 3 4 5
SQLResult result = DB.Characters.Query("SELECT guildid, rid, rname, rights, BankMoneyPerDay FROM guild_rank ORDER BY guildid ASC, rid ASC"); SQLResult result = DB.Characters.Query("SELECT guildid, rid, RankOrder, rname, rights, BankMoneyPerDay FROM guild_rank ORDER BY guildid ASC, rid ASC");
if (result.IsEmpty()) if (result.IsEmpty())
{ {
+1 -1
View File
@@ -113,7 +113,7 @@ namespace Game
{ {
Guild guild = Global.GuildMgr.GetGuildById(GetPlayer().GetGuildId()); Guild guild = Global.GuildMgr.GetGuildById(GetPlayer().GetGuildId());
if (guild) if (guild)
guild.MassInviteToEvent(this, calendarCommunityInvite.MinLevel, calendarCommunityInvite.MaxLevel, calendarCommunityInvite.MaxRankOrder); guild.MassInviteToEvent(this, calendarCommunityInvite.MinLevel, calendarCommunityInvite.MaxLevel, (GuildRankOrder)calendarCommunityInvite.MaxRankOrder);
} }
[WorldPacketHandler(ClientOpcodes.CalendarAddEvent)] [WorldPacketHandler(ClientOpcodes.CalendarAddEvent)]
+3 -3
View File
@@ -114,7 +114,7 @@ namespace Game
Guild guild = GetPlayer().GetGuild(); Guild guild = GetPlayer().GetGuild();
if (guild) if (guild)
guild.HandleSetMemberRank(this, packet.Member, setterGuid, (byte)packet.RankOrder); guild.HandleSetMemberRank(this, packet.Member, setterGuid, (GuildRankOrder)packet.RankOrder);
} }
[WorldPacketHandler(ClientOpcodes.GuildLeave)] [WorldPacketHandler(ClientOpcodes.GuildLeave)]
@@ -189,7 +189,7 @@ namespace Game
{ {
Guild guild = GetPlayer().GetGuild(); Guild guild = GetPlayer().GetGuild();
if (guild) if (guild)
guild.HandleRemoveRank(this, (byte)packet.RankOrder); guild.HandleRemoveRank(this, (GuildRankOrder)packet.RankOrder);
} }
[WorldPacketHandler(ClientOpcodes.GuildUpdateInfoText)] [WorldPacketHandler(ClientOpcodes.GuildUpdateInfoText)]
@@ -579,7 +579,7 @@ namespace Game
for (byte tabId = 0; tabId < GuildConst.MaxBankTabs; ++tabId) for (byte tabId = 0; tabId < GuildConst.MaxBankTabs; ++tabId)
rightsAndSlots[tabId] = new Guild.GuildBankRightsAndSlots(tabId, (sbyte)packet.TabFlags[tabId], (int)packet.TabWithdrawItemLimit[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)] [WorldPacketHandler(ClientOpcodes.RequestGuildPartyState)]
+1 -1
View File
@@ -917,7 +917,7 @@ namespace Game.Scripting
// not enough injured units // not enough injured units
// fill remainder with full health units // fill remainder with full health units
targets.AddRange(lookupPlayers[true]); targets.AddRange(lookupPlayers[true]);
targets.AddRange(lookupPlayers[false].Shuffle())); targets.AddRange(lookupPlayers[false].Shuffle());
} }
else if (lookupPlayers[true].Count() > maxTargets) else if (lookupPlayers[true].Count() > maxTargets)
{ {