public void Upgrade()
        {
            upgraded        = true;
            upgradeWorkDone = upgradeWorkTotal;

            // Set health to max health
            if (parent.def.useHitPoints)
            {
                parent.HitPoints = parent.MaxHitPoints;
            }

            // Update turret top
            if (parent is Building_TurretGun gunTurret && Props.turretGunDef != null)
            {
                gunTurret.gun.Destroy();
                gunTurret.gun = ThingMaker.MakeThing(Props.turretGunDef);
                NonPublicMethods.Building_TurretGun_UpdateGunVerbs(gunTurret);
            }

            // Update barrel durability
            if (parent.TryGetComp <CompRefuelable>() is CompRefuelable refuelableComp)
            {
                float newFuel = (float)NonPublicFields.CompRefuelable_fuel.GetValue(refuelableComp) * Props.fuelMultiplierFactor;
                NonPublicFields.CompRefuelable_fuel.SetValue(refuelableComp, newFuel);
            }

            // Reset CompPowerTrader
            if (parent.TryGetComp <CompPowerTrader>() is CompPowerTrader powerComp)
            {
                powerComp.SetUpPowerVars();
            }

            // Force redraw
            parent.Map.mapDrawer.SectionAt(parent.Position).RegenerateAllLayers();
        }
Beispiel #2
0
            private static float TurretCooldown(StatRequest req, BuildingProperties buildingProps)
            {
                if (req.Thing is Building_TurretGun gunTurret)
                {
                    return(NonPublicMethods.Building_TurretGun_BurstCooldownTime(gunTurret));
                }

                return(buildingProps.turretBurstCooldownTime > 0
                    ? buildingProps.turretBurstCooldownTime
                    : buildingProps.turretGunDef.GetStatValueAbstract(StatDefOf.RangedWeapon_Cooldown));
            }
            public static bool Prefix(VerbProperties __instance, Verb ownerVerb, Pawn attacker, ref float __result)
            {
                // Vanilla gun turret
                if (ownerVerb.Caster is Building_TurretGun gunTurret)
                {
                    __result = TurretExtensionsUtility.AdjustedTurretBurstWarmupTicks(gunTurret.def.building.turretBurstWarmupTime.SecondsToTicks(), gunTurret).TicksToSeconds() +
                               NonPublicMethods.Building_TurretGun_BurstCooldownTime(gunTurret) + ((__instance.burstShotCount - 1) * __instance.ticksBetweenBurstShots).TicksToSeconds();
                    return(false);
                }

                return(true);
            }
Beispiel #4
0
            public static void Postfix(Building_TurretGun __instance, LocalTargetInfo ___forcedTarget)
            {
                // If the turret has CompSmartForcedTarget and is attacking a pawn that just got downed, automatically make it target something else
                var smartTargetComp = __instance.TryGetComp <CompSmartForcedTarget>();

                if (smartTargetComp != null && ___forcedTarget.Thing is Pawn pawn)
                {
                    if (!pawn.Downed && !smartTargetComp.attackingNonDownedPawn && (!smartTargetComp.Props.onlyApplyWhenUpgraded || __instance.IsUpgraded(out CompUpgradable upgradableComp)))
                    {
                        smartTargetComp.attackingNonDownedPawn = true;
                    }

                    else if (pawn.Downed && smartTargetComp.attackingNonDownedPawn)
                    {
                        smartTargetComp.attackingNonDownedPawn = false;
                        NonPublicMethods.Building_TurretGun_ResetForcedTarget(__instance);
                    }
                }
            }