Esempio n. 1
0
        private static bool TryBlockProjectile(
            Projectile projectile,
            Vector3 currentPosition,
            Vector3 nextPosition,
            int ticksToImpact,
            Vector3 origin)
        {
            // allow projectiles that have no damage components through
            if (projectile.def?.projectile?.damageDef == null)
            {
                return(false);
            }

            var damages = new ShieldDamages(
                new ShieldDamage(
                    projectile.def.projectile.damageDef,
                    projectile.def.projectile.GetDamageAmount(1f)));

            return(TryBlock(
                       projectile,
                       currentPosition,
                       nextPosition,
                       ticksToImpact,
                       origin,
                       projectile.def.projectile.flyOverhead,
                       damages) != null);
        }
Esempio n. 2
0
        private static bool TryBlockProjectileCE(
            ProjectileCE projectile,
            Vector3 currentPosition,
            Vector3 nextPosition,
            int ticksToImpact,
            Vector2 origin)
        {
            var ap      = projectile.def.projectile.GetArmorPenetration(1f);
            var damages = new ShieldDamages(
                new ShieldDamage(
                    projectile.def.projectile.damageDef,
                    projectile.def.projectile.GetDamageAmount(ap)));

            (projectile.def.projectile as ProjectilePropertiesCE)?.secondaryDamage.ForEach(second =>
            {
                damages.Add(new ShieldDamage(
                                second.def,
                                second.amount * ap));
            });

            var result = TryBlock(
                projectile,
                currentPosition,
                nextPosition,
                ticksToImpact,
                Common.ToVector3(origin),
                // TODO might be able to calculate the exact path with 3d CE projectiles
                projectile.def.projectile.flyOverhead,
                damages) != null;

            return(result);
        }
Esempio n. 3
0
        public virtual float?Apply(ShieldDamages damages)
        {
            var primaryResist = CanResist(damages.Primary);

            if (primaryResist == null)
            {
                return(null);
            }
            return(primaryResist.Value + CannotResist(damages.Secondaries));
        }
Esempio n. 4
0
        private static bool TryBlock(Thing explosion, DamageDef damType, int damAmount, IntVec3 position)
        {
            if (damType?.defName == null)
            {
                return(false);
            }
            var damages = new ShieldDamages(new ShieldDamage(damType, damAmount));

            return(explosion.Map.GetComponent <ShieldManager>().Block(
                       explosion.TrueCenter(),
                       PositionUtility.ToVector3(position),
                       damages));
        }
Esempio n. 5
0
        protected static bool TryBlock(Map map, Vector3 origin, DamageDef damType, int damAmount, Vector3 position)
        {
            if (damType?.defName == null)
            {
                return(false);
            }
            var damages = new ShieldDamages(new ShieldDamage(damType, damAmount));
            var blocked = new FieldQuery(map)
                          .IsActive()
                          .Intersects(origin, PositionUtility.ToVector3(position).Yto0())
                          .Block(damages);

            return(blocked);
        }
Esempio n. 6
0
 protected static bool TryBlockOverhead(
     Thing projectile,
     Vector3 origin,
     Vector3 currentPosition,
     ShieldDamages damages,
     Action <IShieldField, Vector3> onBlock = null)
 {
     return(new FieldQuery(projectile.Map)
            .IsActive()
            .Intersects(origin, true)
            .Intersects(currentPosition)
            // TODO calculate mortar damage better
            .Block(damages, onBlock));
 }
Esempio n. 7
0
        protected static Vector3?TryBlock(
            Thing projectile,
            Vector3 currentPosition,
            Vector3 nextPosition,
            int ticksToImpact,
            Vector3 origin,
            bool flyOverhead,
            ShieldDamages damages)
        {
            var shieldManager = projectile.Map.GetComponent <ShieldManager>();

            if (BlacklistedDefs.Contains(projectile.def.defName))
            {
                return(null);
            }

            if (flyOverhead)
            {
                if (ticksToImpact <= 1)
                {
                    // fix for fire foam projectiles having 99999 damage
                    if (projectile.def.defName == "Bullet_Shell_Firefoam")
                    {
                        damages.OverrideDamage = 10;
                    }

                    if (shieldManager.Block(
                            Common.ToVector3(origin),
                            Common.ToVector3(currentPosition),
                            // TODO calculate mortar damage better
                            damages))
                    {
                        return(currentPosition);
                    }
                    return(null);
                }
            }
            else
            {
                return(shieldManager.Block(
                           Common.ToVector3(origin),
                           Common.ToVector3(currentPosition),
                           Common.ToVector3(nextPosition),
                           damages));
            }

            return(null);
        }
Esempio n. 8
0
        private static ShieldDamages CalculateDamages(ThingDef def)
        {
            var ap      = def.projectile.GetArmorPenetration(1f);
            var damages = new ShieldDamages(
                new ShieldDamage(
                    def.projectile.damageDef,
                    def.projectile.GetDamageAmount(ap)));

            (def.projectile as ProjectilePropertiesCE)?.secondaryDamage.ForEach(second =>
            {
                damages.Add(new ShieldDamage(
                                second.def,
                                second.amount * ap));
            });
            return(damages);
        }
Esempio n. 9
0
        protected static bool TryBlock(
            Thing projectile,
            Vector3 currentPosition,
            Vector3 nextPosition,
            int ticksToImpact,
            Vector3 origin,
            bool flyOverhead,
            ShieldDamages damages,
            Action <IShieldField, Vector3> onBlock = null)
        {
            if (IsBlacklisted(projectile))
            {
                return(false);
            }

            if (flyOverhead)
            {
                if (ticksToImpact <= 1)
                {
                    // fix for fire foam projectiles having 99999 damage
                    if (projectile.def.defName == "Bullet_Shell_Firefoam")
                    {
                        damages.OverrideDamage = 10;
                    }

                    var blocked = TryBlockOverhead(projectile, origin, currentPosition, damages, onBlock);
                    return(blocked);
                }
            }
            else
            {
                return(new FieldQuery(projectile.Map)
                       .IsActive()
                       .Intersects(
                           currentPosition,
                           nextPosition)
                       .Block(damages, onBlock));
            }

            return(false);
        }
Esempio n. 10
0
        private static bool TryBlockProjectile(
            Projectile projectile,
            Vector3 currentPosition,
            Vector3 nextPosition,
            int ticksToImpact,
            Vector3 origin)
        {
            var damages = new ShieldDamages(
                new ShieldDamage(
                    projectile.def.projectile.damageDef,
                    projectile.def.projectile.GetDamageAmount(1f)));

            return(TryBlock(
                       projectile,
                       currentPosition,
                       nextPosition,
                       ticksToImpact,
                       origin,
                       projectile.def.projectile.flyOverhead,
                       damages) != null);
        }
Esempio n. 11
0
 public float Block(ShieldDamages damages, Vector3 position)
 {
     return(_shield.Block(damages, position));
 }
Esempio n. 12
0
 public float CalculateDamage(ShieldDamages damages)
 {
     return(_shield.CalculateDamage(damages));
 }