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); }
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); }
public virtual float?Apply(ShieldDamages damages) { var primaryResist = CanResist(damages.Primary); if (primaryResist == null) { return(null); } return(primaryResist.Value + CannotResist(damages.Secondaries)); }
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)); }
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); }
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)); }
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); }
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); }
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); }
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); }
public float Block(ShieldDamages damages, Vector3 position) { return(_shield.Block(damages, position)); }
public float CalculateDamage(ShieldDamages damages) { return(_shield.CalculateDamage(damages)); }