Some cleanup of contains keys and try get values (#246)

This commit is contained in:
Kamron Batman 2020-09-13 20:20:44 -07:00 • committed by GitHub
parent 9cbb0cfd23
commit a236617ad9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
69 changed files with 3508 additions and 350 deletions

View file

@ -66,9 +66,13 @@ namespace Server.Guilds
public void SetFlag(RankFlags flag, bool value)
{
if (value)
{
Flags |= flag;
}
else
{
Flags &= ~flag;
}
}
}
@ -89,8 +93,7 @@ namespace Server.Guilds
leader.Alliance = this;
partner.Alliance = this;
if (!Alliances.ContainsKey(Name.ToLower()))
Alliances.Add(Name.ToLower(), this);
Alliances.TryAdd(Name.ToLower(), this);
}
public AllianceInfo(IGenericReader reader)
@ -126,12 +129,16 @@ namespace Server.Guilds
set
{
if (m_Leader != value && value != null)
{
AllianceMessage(1070765, value.Name); // Your Alliance is now led by ~1_GUILDNAME~
}
m_Leader = value;
if (m_Leader == null)
{
CalculateAllianceLeader();
}
}
}
@ -147,14 +154,18 @@ namespace Server.Guilds
CalculateAllianceLeader();
if (m_Leader == null)
{
Disband();
}
}
}
public bool IsPendingMember(Guild g)
{
if (g.Alliance != this)
{
return false;
}
return m_PendingMembers.Contains(g);
}
@ -162,7 +173,9 @@ namespace Server.Guilds
public bool IsMember(Guild g)
{
if (g.Alliance != this)
{
return false;
}
return m_Members.Contains(g);
}
@ -177,14 +190,15 @@ namespace Server.Guilds
writer.WriteGuildList(m_Members, true);
writer.WriteGuildList(m_PendingMembers, true);
if (!Alliances.ContainsKey(Name.ToLower()))
Alliances.Add(Name.ToLower(), this);
Alliances.TryAdd(Name.ToLower(), this);
}
public void AddPendingGuild(Guild g)
{
if (g.Alliance != this || m_PendingMembers.Contains(g) || m_Members.Contains(g))
{
return;
}
m_PendingMembers.Add(g);
}
@ -192,7 +206,9 @@ namespace Server.Guilds
public void TurnToMember(Guild g)
{
if (g.Alliance != this || !m_PendingMembers.Contains(g) || m_Members.Contains(g))
{
return;
}
g.GuildMessage(1070760, Name); // Your Guild has joined the ~1_ALLIANCENAME~ Alliance.
AllianceMessage(1070761, g.Name); // A new Guild has joined your Alliance: ~1_GUILDNAME~
@ -204,7 +220,10 @@ namespace Server.Guilds
public void RemoveGuild(Guild g)
{
if (m_PendingMembers.Contains(g)) m_PendingMembers.Remove(g);
if (m_PendingMembers.Contains(g))
{
m_PendingMembers.Remove(g);
}
if (m_Members.Contains(g)) // Sanity, just incase someone with a custom script adds a character to BOTH arrays
{
@ -219,10 +238,15 @@ namespace Server.Guilds
// to check on OSI: have 3 guilds, make 2 of them a member, one pending. remove one of the memebers. alliance still exist?
// ANSWER: NO
if (g == m_Leader) CalculateAllianceLeader();
if (g == m_Leader)
{
CalculateAllianceLeader();
}
if (m_Members.Count < 2)
{
Disband();
}
}
public void Disband()
@ -230,13 +254,21 @@ namespace Server.Guilds
AllianceMessage(1070762); // Your Alliance has dissolved.
for (var i = 0; i < m_PendingMembers.Count; i++)
{
m_PendingMembers[i].Alliance = null;
}
for (var i = 0; i < m_Members.Count; i++)
{
m_Members[i].Alliance = null;
}
if (Alliances.TryGetValue(Name.ToLower(), out var aInfo) && aInfo == this)
Alliances.Remove(Name.ToLower());
var lowerName = Name.ToLower();
if (Alliances.TryGetValue(lowerName, out var aInfo) && aInfo == this)
{
Alliances.Remove(lowerName);
}
}
public void InvalidateMemberProperties(bool onlyOPL = false)
@ -252,7 +284,9 @@ namespace Server.Guilds
public void InvalidateMemberNotoriety()
{
for (var i = 0; i < m_Members.Count; i++)
{
m_Members[i].InvalidateMemberNotoriety();
}
}
public void AllianceMessage(int num, bool append, string format, params object[] args)
@ -263,19 +297,25 @@ namespace Server.Guilds
public void AllianceMessage(int number)
{
for (var i = 0; i < m_Members.Count; ++i)
{
m_Members[i].GuildMessage(number);
}
}
public void AllianceMessage(int number, string args, int hue = 0x3B2)
{
for (var i = 0; i < m_Members.Count; ++i)
{
m_Members[i].GuildMessage(number, args, hue);
}
}
public void AllianceMessage(int number, bool append, string affix, string args = "", int hue = 0x3B2)
{
for (var i = 0; i < m_Members.Count; ++i)
{
m_Members[i].GuildMessage(number, append, affix, args, hue);
}
}
public void AllianceTextMessage(string text)
@ -291,7 +331,9 @@ namespace Server.Guilds
public void AllianceTextMessage(int hue, string text)
{
for (var i = 0; i < m_Members.Count; ++i)
{
m_Members[i].GuildTextMessage(hue, text);
}
}
public void AllianceTextMessage(int hue, string format, params object[] args)
@ -383,7 +425,9 @@ namespace Server.Guilds
public override void OnResponse(NetState sender, RelayInfo info)
{
if (info.ButtonID != 8) // So that they can't get to the AdvancedSearch button
{
base.OnResponse(sender, info);
}
}
}
}
@ -451,23 +495,33 @@ namespace Server.Guilds
get
{
if (Opponent?.Disbanded != false)
{
return WarStatus.Win;
}
if (Guild?.Disbanded != false)
{
return WarStatus.Lose;
}
var w = Opponent.FindActiveWar(Guild);
if (Opponent.FindPendingWar(Guild) != null && Guild.FindPendingWar(Opponent) != null)
{
return WarStatus.Pending;
}
if (w == null)
{
return WarStatus.Win;
}
if (WarLength != TimeSpan.Zero && WarBeginning + WarLength < DateTime.UtcNow)
{
if (Kills > w.Kills)
{
return WarStatus.Win;
}
return Kills < w.Kills ? WarStatus.Lose : WarStatus.Draw;
}
@ -475,9 +529,14 @@ namespace Server.Guilds
if (MaxKills > 0)
{
if (Kills >= MaxKills)
{
return WarStatus.Win;
}
if (w.Kills >= w.MaxKills)
{
return WarStatus.Lose;
}
}
return WarStatus.InProgress;
@ -509,13 +568,17 @@ namespace Server.Guilds
public static void Initialize()
{
if (Guild.NewGuildSystem)
{
new WarTimer().Start();
}
}
protected override void OnTick()
{
foreach (var g in BaseGuild.List.Values)
{
(g as Guild)?.CheckExpiredWars();
}
}
}
@ -561,7 +624,9 @@ namespace Server.Guilds
AddMember(m_Leader);
if (m_Leader is PlayerMobile mobile)
{
mobile.GuildRank = RankDefinition.Leader;
}
AcceptedWars = new List<WarDeclaration>();
PendingWars = new List<WarDeclaration>();
@ -580,22 +645,30 @@ namespace Server.Guilds
get
{
if (Disbanded || m_Leader.Guild != this)
{
CalculateGuildmaster();
}
return m_Leader;
}
set
{
if (value != null)
{
AddMember(value); // Also removes from old guild.
}
if (m_Leader is PlayerMobile leader && leader.Guild == this)
{
leader.GuildRank = RankDefinition.Member;
}
m_Leader = value;
if (m_Leader is PlayerMobile mobile)
{
mobile.GuildRank = RankDefinition.Leader;
}
}
}
@ -606,7 +679,9 @@ namespace Server.Guilds
get
{
if (m_AllianceInfo != null)
{
return m_AllianceInfo;
}
return m_AllianceLeader?.m_AllianceInfo;
}
@ -615,16 +690,22 @@ namespace Server.Guilds
var current = Alliance;
if (value == current)
{
return;
}
current?.RemoveGuild(this);
if (value != null)
{
if (value.Leader == this)
{
m_AllianceInfo = value;
}
else
{
m_AllianceLeader = value.Leader;
}
value.AddPendingGuild(this);
}
@ -748,14 +829,18 @@ namespace Server.Guilds
m.InvalidateProperties();
if (!onlyOPL)
{
m.Delta(MobileDelta.Noto);
}
}
}
public void InvalidateMemberNotoriety()
{
for (var i = 0; i < Members?.Count; i++)
{
Members[i].Delta(MobileDelta.Noto);
}
}
public void InvalidateWarNotoriety()
@ -763,21 +848,31 @@ namespace Server.Guilds
var g = GetAllianceLeader(this);
if (g.Alliance != null)
{
g.Alliance.InvalidateMemberNotoriety();
}
else
{
g.InvalidateMemberNotoriety();
}
if (g.AcceptedWars == null)
{
return;
}
foreach (var warDec in g.AcceptedWars)
{
var opponent = warDec.Opponent;
if (opponent.Alliance != null)
{
opponent.Alliance.InvalidateMemberNotoriety();
}
else
{
opponent.InvalidateMemberNotoriety();
}
}
}
@ -797,7 +892,9 @@ namespace Server.Guilds
m.SendLocalizedMessage(502131); // Your guild has disbanded.
if (m is PlayerMobile mobile)
{
mobile.GuildRank = RankDefinition.Lowest;
}
m.Guild = null;
}
@ -805,15 +902,25 @@ namespace Server.Guilds
Members.Clear();
for (var i = Allies.Count - 1; i >= 0; --i)
{
if (i < Allies.Count)
{
RemoveAlly(Allies[i]);
}
}
for (var i = Enemies.Count - 1; i >= 0; --i)
{
if (i < Enemies.Count)
{
RemoveEnemy(Enemies[i]);
}
}
if (!NewGuildSystem)
{
Guildstone?.Delete();
}
Guildstone = null;
@ -846,7 +953,9 @@ namespace Server.Guilds
from.SendGump(new PropertiesGump(from, g));
if (NewGuildSystem && from.AccessLevel >= AccessLevel.GameMaster && from is PlayerMobile mobile)
{
mobile.SendGump(new GuildInfoGump(mobile, g));
}
}
}
}
@ -854,12 +963,18 @@ namespace Server.Guilds
public static void EventSink_GuildGumpRequest(Mobile m)
{
if (!NewGuildSystem || !(m is PlayerMobile pm))
{
return;
}
if (pm.Guild == null)
{
pm.SendGump(new CreateGuildGump(pm));
}
else
{
pm.SendGump(new GuildInfoGump(pm, pm.Guild as Guild));
}
}
public static void EventSink_CreateGuild(CreateGuildEventArgs args)
@ -872,7 +987,9 @@ namespace Server.Guilds
var alliance = g.Alliance;
if (alliance?.Leader != null && alliance.IsMember(g))
{
return alliance.Leader;
}
return g;
}
@ -884,7 +1001,9 @@ namespace Server.Guilds
var w = PendingWars[i];
if (w.Opponent == g)
{
return w;
}
}
return null;
@ -897,7 +1016,9 @@ namespace Server.Guilds
var w = AcceptedWars[i];
if (w.Opponent == g)
{
return w;
}
}
return null;
@ -942,10 +1063,14 @@ namespace Server.Guilds
AcceptedWars.Remove(w);
if (g == null)
{
continue;
}
if (status != WarStatus.Draw)
{
status = (WarStatus)((int)status + 1 % 2);
}
if (otherInAlliance)
{
@ -980,12 +1105,16 @@ namespace Server.Guilds
public static void HandleDeath(Mobile victim, Mobile killer = null)
{
if (!NewGuildSystem)
{
return;
}
killer ??= victim.FindMostRecentDamager(false);
if (killer?.Guild == null || victim.Guild == null)
{
return;
}
var victimGuild = GetAllianceLeader(victim.Guild as Guild);
var killerGuild = GetAllianceLeader(killer.Guild as Guild);
@ -993,14 +1122,20 @@ namespace Server.Guilds
var war = killerGuild.FindActiveWar(victimGuild);
if (war == null)
{
return;
}
war.Kills++;
if (war.Opponent == victimGuild)
{
killerGuild.CheckExpiredWars();
}
else
{
victimGuild.CheckExpiredWars();
}
}
public bool IsMember(Mobile m) => Members.Contains(m);
@ -1014,10 +1149,14 @@ namespace Server.Guilds
public bool IsWar(Guild g)
{
if (g == null)
{
return false;
}
if (!NewGuildSystem)
{
return Enemies.Contains(g);
}
var guild = GetAllianceLeader(this);
var otherGuild = GetAllianceLeader(g);
@ -1028,7 +1167,9 @@ namespace Server.Guilds
public override void Serialize(IGenericWriter writer)
{
if (LastFealty + TimeSpan.FromDays(1.0) < DateTime.UtcNow)
{
CalculateGuildmaster();
}
CheckExpiredWars();
@ -1038,19 +1179,29 @@ namespace Server.Guilds
writer.Write(PendingWars.Count);
for (var i = 0; i < PendingWars.Count; i++) PendingWars[i].Serialize(writer);
for (var i = 0; i < PendingWars.Count; i++)
{
PendingWars[i].Serialize(writer);
}
writer.Write(AcceptedWars.Count);
for (var i = 0; i < AcceptedWars.Count; i++) AcceptedWars[i].Serialize(writer);
for (var i = 0; i < AcceptedWars.Count; i++)
{
AcceptedWars[i].Serialize(writer);
}
var isAllianceLeader = m_AllianceLeader == null && m_AllianceInfo != null;
writer.Write(isAllianceLeader);
if (isAllianceLeader)
{
m_AllianceInfo.Serialize(writer);
}
else
{
writer.Write(m_AllianceLeader);
}
//
@ -1094,18 +1245,28 @@ namespace Server.Guilds
var count = reader.ReadInt();
PendingWars = new List<WarDeclaration>();
for (var i = 0; i < count; i++) PendingWars.Add(new WarDeclaration(reader));
for (var i = 0; i < count; i++)
{
PendingWars.Add(new WarDeclaration(reader));
}
count = reader.ReadInt();
AcceptedWars = new List<WarDeclaration>();
for (var i = 0; i < count; i++) AcceptedWars.Add(new WarDeclaration(reader));
for (var i = 0; i < count; i++)
{
AcceptedWars.Add(new WarDeclaration(reader));
}
var isAllianceLeader = reader.ReadBool();
if (isAllianceLeader)
{
m_AllianceInfo = new AllianceInfo(reader);
}
else
{
m_AllianceLeader = reader.ReadGuild() as Guild;
}
goto case 4;
}
@ -1139,7 +1300,9 @@ namespace Server.Guilds
m_Leader = reader.ReadMobile();
if (m_Leader is PlayerMobile mobile)
{
mobile.GuildRank = RankDefinition.Leader;
}
m_Name = reader.ReadString();
m_Abbreviation = reader.ReadString();
@ -1174,7 +1337,9 @@ namespace Server.Guilds
private void VerifyGuild_Callback()
{
if (!NewGuildSystem && Guildstone == null || Members.Count == 0)
{
Disband();
}
CheckExpiredWars();
@ -1186,7 +1351,9 @@ namespace Server.Guilds
if (alliance?.IsMember(this) == false && !alliance.IsPendingMember(this)
) // This block is there to fix a bug in the code in an older version.
{
Alliance = null; // Will call Alliance.RemoveGuild which will set it null & perform all the pertient checks as far as alliacne disbanding
}
}
public void AddMember(Mobile m)
@ -1194,7 +1361,9 @@ namespace Server.Guilds
if (!Members.Contains(m))
{
if (m.Guild != null && m.Guild != this)
{
((Guild)m.Guild).RemoveMember(m);
}
Members.Add(m);
m.Guild = this;
@ -1202,7 +1371,9 @@ namespace Server.Guilds
m.GuildFealty = !NewGuildSystem ? m_Leader : null;
if (m is PlayerMobile mobile)
{
mobile.GuildRank = RankDefinition.Lowest;
}
((Guild)m.Guild).InvalidateWarNotoriety();
}
@ -1219,21 +1390,29 @@ namespace Server.Guilds
m.Guild = null;
if (m is PlayerMobile mobile)
{
mobile.GuildRank = RankDefinition.Lowest;
}
if (message > 0)
{
m.SendLocalizedMessage(message);
}
if (m == m_Leader)
{
CalculateGuildmaster();
if (m_Leader == null)
{
Disband();
}
}
if (Members.Count == 0)
{
Disband();
}
guild?.InvalidateWarNotoriety();
@ -1289,19 +1468,25 @@ namespace Server.Guilds
public void GuildMessage(int number)
{
for (var i = 0; i < Members.Count; ++i)
{
Members[i].SendLocalizedMessage(number);
}
}
public void GuildMessage(int number, string args, int hue = 0x3B2)
{
for (var i = 0; i < Members.Count; ++i)
{
Members[i].SendLocalizedMessage(number, args, hue);
}
}
public void GuildMessage(int number, bool append, string affix, string args = "", int hue = 0x3B2)
{
for (var i = 0; i < Members.Count; ++i)
{
Members[i].SendLocalizedMessage(number, append, affix, args, hue);
}
}
public void GuildTextMessage(string text)
@ -1317,7 +1502,9 @@ namespace Server.Guilds
public void GuildTextMessage(int hue, string text)
{
for (var i = 0; i < Members.Count; ++i)
{
Members[i].SendMessage(hue, text);
}
}
public void GuildTextMessage(int hue, string format, params object[] args)
@ -1371,20 +1558,28 @@ namespace Server.Guilds
var memb = Members[i];
if (!CanVote(memb))
{
continue;
}
var m = memb.GuildFealty;
if (!CanBeVotedFor(m))
{
if (!Disbanded && m_Leader.Guild == this)
{
m = m_Leader;
}
else
{
m = memb;
}
}
if (m == null)
{
continue;
}
votes[m] = 1 + (votes.TryGetValue(m, out var v) ? v : 0);
votingMembers++;
@ -1407,10 +1602,14 @@ namespace Server.Guilds
if (NewGuildSystem && highVotes * 100 / Math.Max(votingMembers, 1) < MajorityPercentage && !Disbanded &&
winner != m_Leader && m_Leader.Guild == this)
{
winner = m_Leader;
}
if (m_Leader != winner && winner != null)
{
GuildMessage(1018015, true, winner.Name); // Guild Message: Guildmaster changed to:
}
Leader = winner;
LastFealty = DateTime.UtcNow;
@ -1456,7 +1655,9 @@ namespace Server.Guilds
from.SendGump(new PropertiesGump(from, g));
if (NewGuildSystem && from.AccessLevel >= AccessLevel.GameMaster && from is PlayerMobile pm)
{
pm.SendGump(new GuildInfoGump(pm, g));
}
}
}
}