private bool CheckPastTimeToLive(LaunchedMissileComp lmc)
 {
     if (lmc.TimeAlive > lmc.projectileInfo.TimeToLive)
     {
         RangedCombatHelper.PerformAreaExplosion(lmc);
         return(true);
     }
     return(false);
 }
 private void HandleDetonationDistance(LaunchedMissileComp lmc)
 {
     if (lmc.detonationDistance.IsAlmost(0))
     {
         return;
     }
     if (lmc.projectileInfo.target != null && Vector3.SqrMagnitude(lmc.transform.position - lmc.projectileInfo.target.position) <= lmc.detonationDistance)
     {
         RangedCombatHelper.PerformAreaExplosion(lmc);
     }
 }
        private void UpdatePIDMethod(LaunchedMissileComp lmc)
        {
            Vector3 hitPos = RangedCombatHelper.Predict(lmc.transform.position, lmc.projectileInfo.target.position, lmc.targetLastPos, lmc.projectileInfo.FlightSpeed);

            lmc.targetLastPos = lmc.projectileInfo.target.position;

            lmc.transform.rotation = Quaternion.Lerp(lmc.transform.rotation,
                                                     Quaternion.LookRotation(hitPos - lmc.transform.position),
                                                     Time.deltaTime * lmc.projectileInfo.RotationSpeed);

            lmc.transform.position += lmc.transform.forward * Time.deltaTime * lmc.projectileInfo.FlightSpeed;
        }
        public override void Update()
        {
            var matches = missileMatcher.GetMatches();

            foreach (var match in matches)
            {
                var cc  = match.GetComponent <CollisionEnterComp>();
                var lmc = match.GetComponent <LaunchedMissileComp>();

                if (lmc.projectileInfo.ExplosionImpactRadius > 0 && cc.Other.Count > 0)
                {
                    Debug.Log($"Performing area explosion from collision");
                    RangedCombatHelper.PerformAreaExplosion(lmc);
                }
                else
                {
                    foreach (var coll in cc.Other)
                    {
                        //var oth = coll.gameObject.GetComponent<EntityWrapper>();
                        var oth = coll.gameObject.GetEntityWrapper();
                        if (oth != null)
                        {
                            if (!oth.Entity.HasComponent(ComponentTypes.DamageComp))
                            {
                                Debug.Log($"Missile Collision system adding collision to {oth.Entity.EntityName}");
                                var dc = oth.Entity.GetOrAddComponent <DamageComp>(ComponentTypes.DamageComp);
                                dc.damagePackets.Push(new DamagePacket(lmc.projectileInfo.HullDamage, lmc.projectileInfo.ShieldDamage));

                                ZenUtils.ApplyExplosionForce(oth, coll.contacts[0].point, lmc.projectileInfo.ExplosionImpactRadius);
                            }
                        }
                    }

                    if (cc.Other.Count > 0)                     // missile hit *something* so blow up
                    {
                        Debug.Log($"Missile Collision system adding damage from collision to missile");
                        match.GetOrAddComponent <DamageComp>(ComponentTypes.DamageComp).damagePackets.Push(new DamagePacket());
                    }
                }
            }
        }