Пример #1
0
        public void ThrowSkull(BaseCreature creature)
        {
            if (creature == null)
            {
                return;
            }
            if (creature.Deleted || !creature.Alive)
            {
                return;
            }

            if (creature.Combatant != null)
            {
                Mobile  combatant = creature.Combatant;
                Point3D location  = creature.Location;
                Map     map       = creature.Map;

                if (combatant.Alive && creature.InLOS(combatant) && creature.GetDistanceToSqrt(combatant) <= 12)
                {
                    Animate(4, 4, 1, true, false, 0);

                    double stationaryDuration = 3;

                    creature.CantWalk = true;
                    creature.Frozen   = true;

                    creature.AIObject.NextMove              = creature.AIObject.NextMove + TimeSpan.FromSeconds(stationaryDuration);
                    creature.LastSwingTime                  = creature.LastSwingTime + TimeSpan.FromSeconds(stationaryDuration);
                    creature.NextSpellTime                  = creature.NextSpellTime + TimeSpan.FromSeconds(stationaryDuration);
                    creature.NextCombatHealActionAllowed    = creature.NextCombatHealActionAllowed + TimeSpan.FromSeconds(stationaryDuration);
                    creature.NextCombatSpecialActionAllowed = creature.NextCombatSpecialActionAllowed + TimeSpan.FromSeconds(stationaryDuration);
                    creature.NextCombatEpicActionAllowed    = creature.NextCombatEpicActionAllowed + TimeSpan.FromSeconds(stationaryDuration);

                    IEntity startLocation = new Entity(Serial.Zero, new Point3D(creature.Location.X, creature.Location.Y, creature.Location.Z + 8), map);

                    int attackSound = 0x5D3;
                    int hitSound    = 0x653;

                    Effects.PlaySound(location, map, attackSound);
                    creature.MovingEffect(combatant, 8707, 8, 1, false, false, 2612, 0);

                    double distance         = Utility.GetDistanceToSqrt(creature.Location, combatant.Location);
                    double destinationDelay = (double)distance * .08;

                    Timer.DelayCall(TimeSpan.FromSeconds(destinationDelay), delegate
                    {
                        if (creature == null)
                        {
                            return;
                        }
                        if (creature.Deleted || !creature.Alive)
                        {
                            return;
                        }

                        creature.CantWalk = false;
                        creature.Frozen   = false;

                        m_NextThrownSkullAllowed = DateTime.UtcNow + NextThrownSkullDelay;

                        if (!SpecialAbilities.IsDamagable(combatant))
                        {
                            return;
                        }

                        Effects.PlaySound(combatant.Location, combatant.Map, hitSound);

                        Effects.SendLocationParticles(EffectItem.Create(combatant.Location, map, TimeSpan.FromSeconds(0.25)), 0x3709, 10, 20, 2613, 0, 5029, 0);
                        Effects.SendLocationParticles(EffectItem.Create(combatant.Location, map, TimeSpan.FromSeconds(0.25)), 0x3779, 10, 60, 2613, 0, 5029, 0);
                        Effects.SendLocationParticles(EffectItem.Create(combatant.Location, map, TimeSpan.FromSeconds(0.5)), 0x3996, 10, 60, 2613, 0, 5029, 0);

                        BaseCreature monsterToSpawn = null;

                        double spawnPercent = (double)intervalCount / (double)totalIntervals;

                        int creatureCount = 1 + (int)(Math.Ceiling(3 * spawnPercent));

                        for (int a = 0; a < creatureCount; a++)
                        {
                            switch (Utility.RandomMinMax(1, 10))
                            {
                            case 1: monsterToSpawn = new Skeleton(); break;

                            case 2: monsterToSpawn = new Skeleton(); break;

                            case 3: monsterToSpawn = new Skeleton(); break;

                            case 4: monsterToSpawn = new PatchworkSkeleton(); break;

                            case 5: monsterToSpawn = new PatchworkSkeleton(); break;

                            case 6: monsterToSpawn = new SkeletalKnight(); break;

                            case 7: monsterToSpawn = new UndeadKnight(); break;

                            case 8: monsterToSpawn = new RisenKnight(); break;

                            case 9: monsterToSpawn = new RisenNoble(); break;

                            case 10: monsterToSpawn = new SkeletalDrake(); break;
                            }

                            if (monsterToSpawn != null)
                            {
                                monsterToSpawn.BossMinion = true;
                                monsterToSpawn.MoveToWorld(combatant.Location, combatant.Map);
                                monsterToSpawn.BossMinion = true;

                                m_Creatures.Add(monsterToSpawn);
                            }
                        }

                        for (int a = 0; a < 5; a++)
                        {
                            Blood bones           = new Blood();
                            bones.Name            = "bones";
                            bones.ItemID          = Utility.RandomList(6929, 6930, 6937, 6938, 6933, 6934, 6935, 6936, 6939, 6940, 6880, 6881, 6882, 6883);
                            Point3D bonesLocation = new Point3D(combatant.Location.X + Utility.RandomList(-1, 1), combatant.Location.Y + Utility.RandomList(-1, 1), combatant.Location.Z);
                            bones.MoveToWorld(bonesLocation, map);
                        }

                        int damage = creature.DamageMin;

                        if (combatant is BaseCreature)
                        {
                            damage = (int)((double)damage * 1.5);
                        }

                        new Blood().MoveToWorld(combatant.Location, combatant.Map);
                        AOS.Damage(combatant, creature, damage, 0, 100, 0, 0, 0);
                    });
                }
            }
        }