Files
WulaFallenEmpireRW/Source/WulaFallenEmpire/BuildingComp/WULA_StorageTurret/CompStorageTurret.cs
2025-12-24 17:05:36 +08:00

168 lines
4.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// File: Comp_StorageMultiTurretGun.cs
using System;
using Verse;
using Verse.AI;
using RimWorld;
using UnityEngine;
namespace WulaFallenEmpire
{
public class Comp_StorageMultiTurretGun : CompTurretGun
{
// 炮塔是否激活
private bool isActive = false;
// 缓存父级的Building_MechanoidRecycler
private Building_MechanoidRecycler cachedRecycler;
public new CompProperties_StorageMultiTurretGun Props => (CompProperties_StorageMultiTurretGun)props;
// 获取当前机械族数量
private int StoredMechanoidCount
{
get
{
if (cachedRecycler == null)
{
cachedRecycler = parent as Building_MechanoidRecycler;
}
return cachedRecycler?.StoredCount ?? 0;
}
}
// 检查炮塔是否应该激活
private bool ShouldBeActive
{
get
{
if (!Props.autoActivate)
return true;
return StoredMechanoidCount >= Props.requiredMechanoids;
}
}
public override void PostSpawnSetup(bool respawningAfterLoad)
{
base.PostSpawnSetup(respawningAfterLoad);
// 初始化状态
UpdateActivationState();
}
public override void CompTick()
{
// 每60ticks检查一次激活状态优化性能
if (parent.IsHashIntervalTick(60))
{
bool shouldBeActive = ShouldBeActive;
if (shouldBeActive != isActive)
{
isActive = shouldBeActive;
UpdateActivationState();
}
}
// 只有激活时才执行炮塔逻辑
if (isActive)
{
base.CompTick();
}
else
{
// 非激活状态:回正炮管,清空目标
ResetTurretToNeutral();
}
}
private void ResetTurretToNeutral()
{
// 清空当前目标
currentTarget = LocalTargetInfo.Invalid;
burstCooldownTicksLeft = 0;
burstWarmupTicksLeft = 0;
// 炮管回正到默认角度
curRotation = parent.Rotation.AsAngle + Props.angleOffset;
}
private void UpdateActivationState()
{
if (isActive)
{
// 激活:创建枪械(如果需要)
if (gun == null)
{
MakeGun();
}
// 发送激活消息
if (parent.Faction == Faction.OfPlayer && Prefs.DevMode)
{
Log.Message($"[StorageTurret] 炮塔 {Props.ID} 已激活 (需要机械族: {Props.requiredMechanoids}, 当前: {StoredMechanoidCount})");
}
}
else
{
// 非激活状态:清空目标,重置状态
ResetTurretToNeutral();
if (parent.Faction == Faction.OfPlayer && Prefs.DevMode)
{
Log.Message($"[StorageTurret] 炮塔 {Props.ID} 已停用 (需要机械族: {Props.requiredMechanoids}, 当前: {StoredMechanoidCount})");
}
}
}
private void MakeGun()
{
if (Props.turretDef == null)
return;
gun = ThingMaker.MakeThing(Props.turretDef);
UpdateGunVerbs();
}
private void UpdateGunVerbs()
{
if (gun == null)
return;
var compEq = gun.TryGetComp<CompEquippable>();
if (compEq == null)
return;
foreach (var verb in compEq.AllVerbs)
{
verb.caster = parent;
verb.castCompleteCallback = delegate
{
burstCooldownTicksLeft = AttackVerb.verbProps.defaultCooldownTime.SecondsToTicks();
};
}
}
public override void PostExposeData()
{
base.PostExposeData();
Scribe_Values.Look(ref isActive, "isActive", false);
}
// 提供外部接口手动激活/停用
public void SetActive(bool active)
{
isActive = active;
UpdateActivationState();
}
public bool IsActive => isActive;
// 获取炮塔状态信息
public string GetStatusInfo()
{
return $"炮塔 {Props.ID}: {(isActive ? "" : "")} (需要 {Props.requiredMechanoids} 个机械族,当前 {StoredMechanoidCount})";
}
}
}