public override void CompTick()
        {
            // Automatically attack if there is a forced target
            if (targetedTile != GlobalTargetInfo.Invalid)
            {
                var turretTop = (TurretTop)NonPublicFields.Building_TurretGun_top.GetValue(Turret);
                NonPublicProperties.TurretTop_set_CurRotation(turretTop, CurAngle);
                NonPublicFields.TurretTop_ticksUntilIdleTurn.SetValue(turretTop, Rand.RangeInclusive(150, 350));
                if (CanLaunch)
                {
                    if (warmupTicksLeft == 0)
                    {
                        TryLaunch(targetedTile.Tile);
                        ResetWarmupTicks();
                    }
                    else
                    {
                        warmupTicksLeft--;
                    }
                }
            }

            // Set warmup ticks if the turret is unmanned
            if (MannableComp != null && !MannableComp.MannedNow)
            {
                ResetWarmupTicks();
            }
        }
 public static bool BlockableByShield(this Projectile proj, Building_Shield shieldGen)
 {
     if (!proj.def.projectile.flyOverhead)
     {
         return(true);
     }
     return(!shieldGen.coveredCells.Contains(((Vector3)NonPublicFields.Projectile_origin.GetValue(proj)).ToIntVec3()) &&
            (int)NonPublicFields.Projectile_ticksToImpact.GetValue(proj) / (float)NonPublicProperties.Projectile_get_StartingTicksToImpact(proj) <= 0.5f);
 }