Exemple #1
0
        public void OnSlice()
        {
            if (!m_Active || Deleted)
            {
                return;
            }

            if (m_Champion != null)
            {
                if (m_Champion.Deleted)
                {
                    RegisterDamageTo(m_Champion);

                    if (m_Champion is BaseChampion)
                    {
                        AwardArtifact(((BaseChampion)m_Champion).GetArtifact());
                    }

                    m_DamageEntries.Clear();

                    if (m_Altar != null)
                    {
                        m_Altar.Hue = 0x455;

                        if (m_Altar.Map == Map.Felucca)
                        {
                            new StarRoomGate(true, m_Altar.Location, m_Altar.Map);
                        }
                    }

                    m_Champion = null;
                    Stop();

                    m_HasBeenAdvanced = false;

                    BeginRestart(m_RestartDelay);
                }
                else
                {
                    if (m_Champion.Region != m_Region)
                    {
                        m_Champion.MoveToWorld(new Point3D(X, Y, Z - 15), Map);
                    }
                }
            }
            else
            {
                int kills = m_Kills;

                for (int i = 0; i < m_Creatures.Count; ++i)
                {
                    Mobile creature = m_Creatures[i];

                    if (creature.Deleted)
                    {
                        if (creature.Corpse != null && !creature.Corpse.Deleted)
                        {
                            ((Corpse)creature.Corpse).BeginDecay(TimeSpan.FromMinutes(1.0));
                        }

                        m_Creatures.RemoveAt(i);
                        --i;
                        ++m_Kills;

                        RegisterDamageTo(creature);

                        Mobile killer = creature.FindMostRecentDamager(false);

                        if (killer is BaseCreature)
                        {
                            killer = ((BaseCreature)killer).GetMaster();
                        }

                        if (killer is PlayerMobile && killer.Alive && killer.Region == m_Region)
                        {
                            if (creature.Fame > Utility.Random(1000000))
                            {
                                if (Map == Map.Felucca && Utility.RandomBool())
                                {
                                    PowerScroll ps = PowerScroll.CreateRandomNoCraft(5, 5);

                                    ps.LootType = LootType.Blessed;

                                    killer.SendLocalizedMessage(1049524);                                       // You have received a scroll of power!

                                    killer.AddToBackpack(ps);
                                }
                                else
                                {
                                    ScrollOfTranscendence sot;

                                    if (this.Map.Rules == MapRules.FeluccaRules)
                                    {
                                        sot = ScrollOfTranscendence.CreateRandom(6, 10);
                                    }
                                    else
                                    {
                                        sot = ScrollOfTranscendence.CreateRandom(1, 5);
                                    }

                                    killer.SendLocalizedMessage(1094936);                                       // You have received a Scroll of Transcendence!

                                    killer.AddToBackpack(sot);
                                }
                            }

                            int mobSubLevel = GetSubLevelFor(creature) + 1;

                            if (mobSubLevel >= 0)
                            {
                                bool gainedPath = false;

                                int pointsToGain = mobSubLevel * 40;

                                if (VirtueHelper.Award(killer, VirtueName.Valor, pointsToGain, ref gainedPath))
                                {
                                    if (gainedPath)
                                    {
                                        killer.SendLocalizedMessage(1054032);                                           // You have gained a path in Valor!
                                    }
                                    else
                                    {
                                        killer.SendLocalizedMessage(1054030);                                           // You have gained in Valor!
                                    }
                                    // No delay on Valor gains
                                }
                            }

                            #region Champion Monster Titles
                            int type = -1;

                            switch (m_Type)
                            {
                            case ChampionSpawnType.ColdBlood:
                                type = 0;
                                break;

                            case ChampionSpawnType.ForestLord:
                                type = 1;
                                break;

                            case ChampionSpawnType.Arachnid:
                                type = 2;
                                break;

                            case ChampionSpawnType.Abyss:
                                type = 3;
                                break;

                            case ChampionSpawnType.VerminHorde:
                                type = 4;
                                break;

                            case ChampionSpawnType.UnholyTerror:
                                type = 5;
                                break;

                            case ChampionSpawnType.SleepingDragon:
                                type = 6;
                                break;

                            case ChampionSpawnType.Corrupt:
                                type = 7;
                                break;

                            case ChampionSpawnType.Glade:
                                type = 8;
                                break;

                            case ChampionSpawnType.Unliving:
                                type = 9;
                                break;

                            case ChampionSpawnType.Pit:
                                type = 10;
                                break;
                            }

                            BaseCreature bc = creature as BaseCreature;

                            if (bc != null && type != -1)
                            {
                                bc.CalculateTitlesScore((PlayerMobile)killer, bc.SpawnLevel, type);
                            }
                            #endregion
                        }
                    }
                }

                // Only really needed once.
                if (m_Kills > kills)
                {
                    InvalidateProperties();
                }

                double n = m_Kills / (double)MaxKills;
                int    p = (int)(n * 100);

                if (p >= 90)
                {
                    AdvanceLevel();
                }
                else if (p > 0)
                {
                    SetWhiteSkullCount(p / 20);
                }

                if (DateTime.Now >= m_ExpireTime)
                {
                    Expire();
                }

                if (DateTime.Now >= m_KickTime)
                {
                    KickGhosts();
                }

                Respawn();
            }
        }