Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }