public void OnTick() { if (!OnGoing) { return; } CheckParticipation(); UpdateAllGumps(); if (StartTime + TimeSpan.FromMinutes(Duration) < DateTime.UtcNow) { EndBattle(); return; } if (LastOccupationCheck + TimeSpan.FromMinutes(1) < DateTime.UtcNow) { CheckOccupation(); LastOccupationCheck = DateTime.UtcNow; } if (NextAltarActivate != DateTime.MinValue && NextAltarActivate < DateTime.UtcNow) { ActivateAltar(); NextAltarActivate = DateTime.MinValue; } if (NextSigilSpawn != DateTime.MinValue && NextSigilSpawn < DateTime.UtcNow) { if (Sigil == null || Sigil.Deleted) { SpawnSigil(); } } ActivateArrows(); if (KillCooldown != null) { List <Mobile> list = KillCooldown.Keys.Where(mob => KillCooldown[mob] < DateTime.UtcNow).ToList(); foreach (Mobile m in list) { KillCooldown.Remove(m); } ColUtility.Free(list); } if (Turrets != null) { Turrets.ForEach(t => { t.Scan(); }); } }
public void Update(VvVPlayerEntry victim, VvVPlayerEntry killer, UpdateType type) { VvVGuildBattleStats killerStats = GetGuildStats(killer.Guild); VvVGuildBattleStats victimStats = victim == null ? null : GetGuildStats(victim.Guild); switch (type) { case UpdateType.Kill: if (killer != null) { killer.Kills++; } if (victim != null) { victim.Deaths++; } if (killerStats != null) { killerStats.Kills++; } if (victimStats != null) { victimStats.Deaths++; } if (victim != null && victim.Player != null) { if (!KillCooldown.ContainsKey(victim.Player) || KillCooldown[victim.Player] < DateTime.UtcNow) { if (killerStats != null) { killerStats.Points += KillPoints; } SendStatusMessage(String.Format("{0} has killed {1}!", killer.Player.Name, victim.Player.Name)); killerStats.Silver += KillSilver + (OppositionCount(killer.Guild) * 50); KillCooldown[victim.Player] = DateTime.UtcNow + TimeSpan.FromMinutes(KillCooldownDuration); } } break; case UpdateType.Assist: if (killer != null) { killer.Assists++; } if (killerStats != null) { killerStats.Assists++; } break; case UpdateType.Steal: if (killerStats != null) { killer.StolenSigils++; killerStats.Stolen++; SendStatusMessage(String.Format("{0} has stolen the sigil!", killer.Player.Name)); } break; case UpdateType.TurnInVice: if (killerStats != null) { killer.ReturnedSigils++; killerStats.ViceReturned++; killerStats.Points += TurnInPoints; killerStats.Silver += TurnInSilver + (OppositionCount(killer.Guild) * 50); SendStatusMessage(String.Format("{0} has returned the sigil!", killer.Player.Name)); NextSigilSpawn = DateTime.UtcNow + TimeSpan.FromMinutes(1); } RemovePriests(); break; case UpdateType.TurnInVirtue: if (killerStats != null) { killer.ReturnedSigils++; killerStats.VirtueReturned++; killerStats.Points += TurnInPoints; killerStats.Silver += TurnInSilver + (OppositionCount(killer.Guild) * 50); SendStatusMessage(String.Format("{0} has returned the sigil!", killer.Player.Name)); NextSigilSpawn = DateTime.UtcNow + TimeSpan.FromMinutes(1); } RemovePriests(); break; case UpdateType.Disarm: if (killerStats != null) { killerStats.Disarmed++; killer.DisarmedTraps++; killerStats.Silver += DisarmSilver + (OppositionCount(killer.Guild) * 50); SendStatusMessage(String.Format("{0} has disarmed a trap!", killer.Player.Name)); } break; } CheckScore(); }
public void EndBattle() { EndTimer(); if (Region is GuardedRegion) { ((GuardedRegion)Region).Disabled = false; } CooldownEnds = DateTime.UtcNow + TimeSpan.FromMinutes(Cooldown); ViceVsVirtueSystem.Instance.OnBattleEnd(); foreach (VvVAltar altar in Altars) { if (!altar.Deleted) { altar.Delete(); } } foreach (VvVTrap trap in Traps) { if (!trap.Deleted) { trap.Delete(); } } foreach (CannonTurret turret in Turrets) { if (!turret.Deleted) { turret.Delete(); } } if (VicePriest != null) { VicePriest.Delete(); VicePriest = null; } if (VirtuePriest != null) { VirtuePriest.Delete(); VirtuePriest = null; } if (Sigil != null) { Sigil.Delete(); Sigil = null; } Guild leader = GetLeader(); foreach (Mobile m in this.Region.GetEnumeratedMobiles()) { Guild g = m.Guild as Guild; if (leader != null && (g == leader || leader.IsAlly(g))) { System.AwardPoints(m, WinSilver + (OppositionCount(g) * 50), message: false); } } SendBattleStatsGump(); System.SendVvVMessage(1154722); // A VvV battle has just concluded. The next battle will begin in less than five minutes! Altars.Clear(); GuildStats.Clear(); KillCooldown.Clear(); Participants.Clear(); Participants.TrimExcess(); Messages.Clear(); Messages.TrimExcess(); Traps.Clear(); Traps.TrimExcess(); Warned.Clear(); Warned.TrimExcess(); Turrets.Clear(); Turrets.TrimExcess(); if (Region is GuardedRegion) { ((GuardedRegion)Region).Disabled = false; } OnGoing = false; NextSigilSpawn = DateTime.MinValue; LastOccupationCheck = DateTime.MinValue; NextAnnouncement = DateTime.MinValue; StartTime = DateTime.MinValue; NextAltarActivate = DateTime.MinValue; ManaSpikeEndEffects = DateTime.MinValue; NextManaSpike = DateTime.MinValue; }
public void Update(VvVPlayerEntry victim, VvVPlayerEntry killer, UpdateType type) { if (killer == null || killer.Player == null || killer.Guild == null) { return; } VvVPlayerBattleStats killerStats = GetPlayerStats(killer.Player); VvVPlayerBattleStats victimStats = victim == null ? null : GetPlayerStats(victim.Player); BattleTeam killerTeam = GetTeam(killer.Guild); BattleTeam victimTeam = null; if (victim != null) { victimTeam = GetTeam(victim.Guild); } switch (type) { case UpdateType.Kill: if (killerStats != null) { killerStats.Kills++; } if (victimStats != null) { victimStats.Deaths++; } if (killerTeam != null) { killerTeam.Kills++; } if (victimTeam != null) { victimTeam.Deaths++; } if (victim != null && victim.Player != null) { if (!KillCooldown.ContainsKey(victim.Player) || KillCooldown[victim.Player] < DateTime.UtcNow) { if (killerTeam != null) { killerTeam.Score += (int)KillPoints; killerTeam.Silver += AwardSilver(KillSilver + (OppositionCount(killer.Guild) * 50)); } SendStatusMessage(String.Format("{0} has killed {1}!", killer.Player.Name, victim.Player.Name)); KillCooldown[victim.Player] = DateTime.UtcNow + TimeSpan.FromMinutes(KillCooldownDuration); } } break; case UpdateType.Assist: if (killerStats != null) { killerStats.Assists++; } if (killerTeam != null) { killerTeam.Assists++; } break; case UpdateType.Steal: if (killerStats != null) { killerStats.Stolen++; SendStatusMessage(String.Format("{0} has stolen the sigil!", killer.Player.Name)); } if (killerTeam != null) { killerTeam.Stolen++; } break; case UpdateType.TurnInVice: case UpdateType.TurnInVirtue: if (killerTeam != null) { killerTeam.Score += (int)TurnInPoints; killerTeam.Silver += AwardSilver(TurnInSilver + (OppositionCount(killer.Guild) * 50)); } if (killerStats != null && killerTeam != null) { if (type == UpdateType.TurnInVirtue) { killerStats.VirtueReturned++; killerTeam.VirtueReturned++; } else { killerStats.ViceReturned++; killerTeam.ViceReturned++; } } SendStatusMessage(String.Format("{0} has returned the sigil!", killer.Player.Name)); NextSigilSpawn = DateTime.UtcNow + TimeSpan.FromMinutes(1); RemovePriests(); break; case UpdateType.Disarm: SendStatusMessage(String.Format("{0} has disarmed a trap!", killer.Player.Name)); if (killerStats != null) { killerStats.Disarmed++; } if (killerTeam != null) { killerTeam.Silver += AwardSilver(DisarmSilver + (OppositionCount(killer.Guild) * 50)); killerTeam.Disarmed++; } break; } CheckScore(); }
public void EndBattle() { OnGoing = false; EndTimer(); if (Region is GuardedRegion) { ((GuardedRegion)Region).Disabled = false; foreach (PlayerMobile pm in Region.GetEnumeratedMobiles().OfType <PlayerMobile>()) { pm.RecheckTownProtection(); } } foreach (VvVAltar altar in Altars) { if (!altar.Deleted) { altar.Delete(); } } foreach (VvVTrap trap in Traps) { if (!trap.Deleted) { trap.Delete(); } } foreach (CannonTurret turret in Turrets) { if (!turret.Deleted) { turret.Delete(); } } if (VicePriest != null) { VicePriest.Delete(); VicePriest = null; } if (VirtuePriest != null) { VirtuePriest.Delete(); VirtuePriest = null; } if (Sigil != null) { Sigil.Delete(); Sigil = null; } TallyStats(); SendBattleStatsGump(); System.SendVvVMessage(1154722); // A VvV battle has just concluded. The next battle will begin in less than five minutes! if (BattleAggression != null) { BattleAggression.Clear(); } ColUtility.Free(Altars); ColUtility.Free(Teams); KillCooldown.Clear(); ColUtility.Free(Messages); ColUtility.Free(Traps); ColUtility.Free(Warned); ColUtility.Free(Turrets); if (Region is GuardedRegion) { ((GuardedRegion)Region).Disabled = false; } NextSigilSpawn = DateTime.MinValue; LastOccupationCheck = DateTime.MinValue; NextAnnouncement = DateTime.MinValue; StartTime = DateTime.MinValue; NextAltarActivate = DateTime.MinValue; ManaSpikeEndEffects = DateTime.MinValue; NextManaSpike = DateTime.MinValue; CooldownEnds = DateTime.UtcNow + TimeSpan.FromMinutes(Cooldown); Timer.DelayCall(TimeSpan.FromMinutes(Cooldown), () => { System.CheckBattleStatus(); }); }