Example #1
0
        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(); });
            }
        }
Example #2
0
        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();
        }
Example #3
0
        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;
        }
Example #4
0
        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();
        }
Example #5
0
        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();
            });
        }