Example #1
0
        public static void DamageCorpse(Point3D location, Map map, bool largeExplosion)
        {
            int projectiles   = 5;
            int particleSpeed = 8;

            int minRadius = 1;
            int maxRadius = 5;

            List <Point3D> m_ValidLocations = SpecialAbilities.GetSpawnableTiles(location, true, false, location, map, projectiles, 20, minRadius, maxRadius, false);

            if (m_ValidLocations.Count == 0)
            {
                return;
            }

            for (int b = 0; b < projectiles; b++)
            {
                Point3D newLocation = m_ValidLocations[Utility.RandomMinMax(0, m_ValidLocations.Count - 1)];

                IEntity effectStartLocation = new Entity(Serial.Zero, new Point3D(location.X, location.Y, location.Z + 2), map);
                IEntity effectEndLocation   = new Entity(Serial.Zero, new Point3D(newLocation.X, newLocation.Y, newLocation.Z + 20), map);

                newLocation.Z += 5;

                Effects.SendMovingEffect(effectStartLocation, effectEndLocation, Utility.RandomList(4651, 4652, 4653, 4654, 5701), particleSpeed, 0, false, false, 0, 0);
            }

            for (int a = 0; a < 4; a++)
            {
                Point3D newPoint = new Point3D(location.X + Utility.RandomList(-2, -1, 1, 2), location.Y + Utility.RandomList(-2, -1, 1, 2), location.Z);
                SpellHelper.AdjustField(ref newPoint, map, 12, false);

                new Blood().MoveToWorld(newPoint, map);
            }

            int radius         = 2;
            int explosionSound = Utility.RandomList(0x5DA, 0x580);

            if (largeExplosion)
            {
                explosionSound = 0x309;
                radius         = 4;

                List <int> m_ExtraParts = new List <int>();

                m_ExtraParts.Add(Utility.RandomList(7407)); //Entrail
                m_ExtraParts.Add(Utility.RandomList(6929)); //Bones
                m_ExtraParts.Add(Utility.RandomList(6930)); //Bones
                m_ExtraParts.Add(Utility.RandomList(6937)); //Bones
                m_ExtraParts.Add(Utility.RandomList(6938)); //Bones
                m_ExtraParts.Add(Utility.RandomList(6931)); //Bones
                m_ExtraParts.Add(Utility.RandomList(6932)); //Bones

                m_ExtraParts.Add(Utility.RandomList(4650)); //Blood
                m_ExtraParts.Add(Utility.RandomList(4651)); //Blood
                m_ExtraParts.Add(Utility.RandomList(4652)); //Blood
                m_ExtraParts.Add(Utility.RandomList(4653)); //Blood
                m_ExtraParts.Add(Utility.RandomList(4654)); //Blood
                m_ExtraParts.Add(Utility.RandomList(5701)); //Blood
                m_ExtraParts.Add(Utility.RandomList(4655)); //Blood
                m_ExtraParts.Add(Utility.RandomList(7439)); //Blood
                m_ExtraParts.Add(Utility.RandomList(7438)); //Blood
                m_ExtraParts.Add(Utility.RandomList(7436)); //Blood
                m_ExtraParts.Add(Utility.RandomList(7433)); //Blood
                m_ExtraParts.Add(Utility.RandomList(7431)); //Blood
                m_ExtraParts.Add(Utility.RandomList(7428)); //Blood
                m_ExtraParts.Add(Utility.RandomList(7425)); //Blood
                m_ExtraParts.Add(Utility.RandomList(7410)); //Blood
                m_ExtraParts.Add(Utility.RandomList(7415)); //Blood
                m_ExtraParts.Add(Utility.RandomList(7416)); //Blood
                m_ExtraParts.Add(Utility.RandomList(7418)); //Blood
                m_ExtraParts.Add(Utility.RandomList(7420)); //Blood
                m_ExtraParts.Add(Utility.RandomList(7425)); //Blood

                double extraPartChance = .5;

                int minRange = radius * -1;
                int maxRange = radius;

                List <Point3D> m_ExplosionPoints = new List <Point3D>();

                for (int a = minRange; a < maxRange + 1; a++)
                {
                    for (int b = minRange; b < maxRange + 1; b++)
                    {
                        Point3D newPoint = new Point3D(location.X + a, location.Y + b, location.Z);
                        SpellHelper.AdjustField(ref newPoint, map, 12, false);

                        if (map.InLOS(location, newPoint))
                        {
                            m_ExplosionPoints.Add(newPoint);
                        }
                    }
                }

                for (int a = 0; a < m_ExplosionPoints.Count; a++)
                {
                    if (Utility.RandomDouble() <= extraPartChance)
                    {
                        Point3D explosionPoint = m_ExplosionPoints[a];

                        int itemId = m_ExtraParts[Utility.RandomMinMax(0, m_ExtraParts.Count - 1)];

                        int distance = Utility.GetDistance(location, explosionPoint);

                        Timer.DelayCall(TimeSpan.FromSeconds(distance * .15), delegate
                        {
                            TimedStatic gore = new TimedStatic(itemId, 10);
                            gore.Name        = "gore";
                            gore.MoveToWorld(explosionPoint, map);

                            if (Utility.RandomDouble() <= .5)
                            {
                                Item item = null;

                                switch (Utility.RandomMinMax(1, 8))
                                {
                                //case 1: item = new CookedBird(); break;
                                //case 2: item = new ChickenLeg(); break;
                                //case 3: item = new LambLeg(); item.Name = "chicken drumstick"; break;
                                case 4: item = new Feather(); break;

                                case 5: item = new Feather(); break;

                                case 6: item = new Feather(); break;

                                case 7: item = new Feather(); break;

                                case 8: item = new Feather(); break;
                                }

                                if (item != null)
                                {
                                    item.MoveToWorld(explosionPoint, map);
                                }
                            }
                        });
                    }
                }
            }

            Effects.PlaySound(location, map, explosionSound);
        }