private bool CheckIntercept(Thing thing, CompProjectileInterceptor interceptor, bool withDebug = false) { Vector3 vector = thing.Position.ToVector3Shifted(); float num = interceptor.Props.radius + def.projectile.SpeedTilesPerTick + 0.1f; var newExactPos = ExactPosition; if ((newExactPos.x - vector.x) * (newExactPos.x - vector.x) + (newExactPos.z - vector.z) * (newExactPos.z - vector.z) > num * num) { return(false); } if (!interceptor.Active) { return(false); } bool flag = false; if (interceptor.Props.interceptGroundProjectiles) { flag = !def.projectile.flyOverhead; } else { if (interceptor.Props.interceptAirProjectiles) { flag = def.projectile.flyOverhead; } } if (!flag) { return(false); } if ((launcher == null || !launcher.HostileTo(thing)) && !((bool)interceptDebug.GetValue(interceptor))) { return(false); } if ((new Vector2(vector.x, vector.z) - new Vector2(lastExactPos.x, lastExactPos.z)).sqrMagnitude <= interceptor.Props.radius * interceptor.Props.radius) { return(false); } if (!GenGeo.IntersectLineCircleOutline(new Vector2(vector.x, vector.z), interceptor.Props.radius, new Vector2(lastExactPos.x, lastExactPos.z), new Vector2(newExactPos.x, newExactPos.z))) { return(false); } interceptAngleField.SetValue(interceptor, lastExactPos.AngleToFlat(thing.TrueCenter())); interceptTicksField.SetValue(interceptor, Find.TickManager.TicksGame); if (def.projectile.damageDef == DamageDefOf.EMP || ((def.projectile as ProjectilePropertiesCE)?.secondaryDamage?.Any(x => x.def == DamageDefOf.EMP) ?? false)) { interceptEMPField.SetValue(interceptor, Find.TickManager.TicksGame); } Effecter eff = new Effecter(EffecterDefOf.Interceptor_BlockedProjectile); eff.Trigger(new TargetInfo(newExactPos.ToIntVec3(), thing.Map, false), TargetInfo.Invalid); eff.Cleanup(); return(true); }
public static Vector3 LaserIntercept(CompProjectileInterceptor __instance, Projectile projectile, Vector3 lastExactPos, Vector3 newExactPos) { LaserBeam beam = projectile as LaserBeam; if (beam != null) { Vector3 vec = LaserIntersectionPoint(newExactPos, lastExactPos, __instance.parent.Position.ToVector3Shifted(), __instance.Props.radius - 0.5f)[0]; vec.y = AltitudeLayer.MoteOverhead.AltitudeFor(); beam.destination = vec; return(vec); } return(newExactPos); }
private bool CheckIntercept(Thing interceptorThing, CompProjectileInterceptor interceptorComp, bool withDebug = false) { Vector3 shieldPosition = interceptorThing.Position.ToVector3ShiftedWithAltitude(0.5f); float radius = interceptorComp.Props.radius; float blockRadius = radius + def.projectile.SpeedTilesPerTick + 0.1f; var newExactPos = ExactPosition; if ((newExactPos - shieldPosition).sqrMagnitude > Mathf.Pow(blockRadius, 2)) { return(false); } if (!interceptorComp.Active) { return(false); } if (interceptorComp.Props.interceptGroundProjectiles && def.projectile.flyOverhead) { return(false); } if (interceptorComp.Props.interceptAirProjectiles && !def.projectile.flyOverhead) { return(false); } if ((launcher == null || !launcher.HostileTo(interceptorThing)) && !((bool)interceptDebug.GetValue(interceptorComp)) && !interceptorComp.Props.interceptNonHostileProjectiles) { return(false); } if (!interceptorComp.Props.interceptOutgoingProjectiles && (shieldPosition - lastExactPos).sqrMagnitude <= Mathf.Pow((float)radius, 2)) { return(false); } if (!IntersectLineSphericalOutline(shieldPosition, radius, lastExactPos, newExactPos)) { return(false); } interceptAngleField.SetValue(interceptorComp, lastExactPos.AngleToFlat(interceptorThing.TrueCenter())); interceptTicksField.SetValue(interceptorComp, Find.TickManager.TicksGame); var areWeLucky = Rand.Chance((def.projectile as ProjectilePropertiesCE)?.empShieldBreakChance ?? 0); if (areWeLucky) { var firstEMPSecondaryDamage = (def.projectile as ProjectilePropertiesCE)?.secondaryDamage?.FirstOrDefault(sd => sd.def == DamageDefOf.EMP); if (def.projectile.damageDef == DamageDefOf.EMP) { interceptBreakShield.Invoke(interceptorComp, new object[] { new DamageInfo(def.projectile.damageDef, def.projectile.damageDef.defaultDamage) }); } else if (firstEMPSecondaryDamage != null) { interceptBreakShield.Invoke(interceptorComp, new object[] { new DamageInfo(firstEMPSecondaryDamage.def, firstEMPSecondaryDamage.def.defaultDamage) }); } } Effecter eff = new Effecter(EffecterDefOf.Interceptor_BlockedProjectile); eff.Trigger(new TargetInfo(newExactPos.ToIntVec3(), interceptorThing.Map, false), TargetInfo.Invalid); eff.Cleanup(); return(true); }