1
This commit is contained in:
@@ -1,4 +1,3 @@
|
||||
// HediffCompProperties_NanoRepair.cs
|
||||
using RimWorld;
|
||||
using Verse;
|
||||
using System.Collections.Generic;
|
||||
@@ -44,8 +43,6 @@ namespace WulaFallenEmpire
|
||||
var wulaEnergy = Pawn.needs.TryGetNeed(DefDatabase<NeedDef>.GetNamedSilentFail("WULA_Energy"));
|
||||
if (wulaEnergy != null)
|
||||
{
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 使用 WULA_Energy 作为能量源");
|
||||
return wulaEnergy;
|
||||
}
|
||||
|
||||
@@ -53,13 +50,9 @@ namespace WulaFallenEmpire
|
||||
var mechEnergy = Pawn.needs?.TryGetNeed<Need_MechEnergy>();
|
||||
if (mechEnergy != null)
|
||||
{
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 使用 MechEnergy 作为能量源");
|
||||
return mechEnergy;
|
||||
}
|
||||
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 没有找到可用的能量源");
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -88,8 +81,6 @@ namespace WulaFallenEmpire
|
||||
if (parent.Severity != Props.inactiveSeverity)
|
||||
{
|
||||
parent.Severity = Props.inactiveSeverity;
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 修复系统已关闭,设置为不活跃状态");
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -98,10 +89,6 @@ namespace WulaFallenEmpire
|
||||
if (Find.TickManager.TicksGame % CheckInterval == 0)
|
||||
{
|
||||
debugCounter++;
|
||||
if (debugCounter % 10 == 0)
|
||||
{
|
||||
Log.Message($"[NanoRepair] Tick {Find.TickManager.TicksGame} - 开始检查修复状态");
|
||||
}
|
||||
UpdateSeverityAndRepair();
|
||||
}
|
||||
}
|
||||
@@ -110,8 +97,6 @@ namespace WulaFallenEmpire
|
||||
{
|
||||
if (Pawn == null || Pawn.Dead)
|
||||
{
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] Pawn为null或已死亡");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -122,22 +107,13 @@ namespace WulaFallenEmpire
|
||||
if (parent.Severity != targetSeverity)
|
||||
{
|
||||
parent.Severity = targetSeverity;
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 更新严重性: {parent.Severity} -> {targetSeverity}");
|
||||
}
|
||||
|
||||
// 如果处于活跃状态,执行修复
|
||||
if (shouldBeActive)
|
||||
{
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 系统活跃,尝试修复损伤");
|
||||
TryRepairDamage();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 系统不活跃,跳过修复");
|
||||
}
|
||||
}
|
||||
|
||||
private bool ShouldBeActive()
|
||||
@@ -145,8 +121,6 @@ namespace WulaFallenEmpire
|
||||
// 如果修复系统关闭,直接返回不活跃
|
||||
if (!repairSystemEnabled)
|
||||
{
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 修复系统已关闭,系统不活跃");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -154,15 +128,11 @@ namespace WulaFallenEmpire
|
||||
var energyNeed = GetEnergyNeed();
|
||||
if (energyNeed == null)
|
||||
{
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 没有能量需求,系统不活跃");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (energyNeed.CurLevelPercentage < Props.minEnergyThreshold)
|
||||
{
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 能量不足: {energyNeed.CurLevelPercentage:P0} < {Props.minEnergyThreshold:P0},系统不活跃");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -170,21 +140,15 @@ namespace WulaFallenEmpire
|
||||
int cooldownRemaining = ActualRepairCooldownAfterDamage - (Find.TickManager.TicksGame - lastDamageTick);
|
||||
if (cooldownRemaining > 0)
|
||||
{
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 冷却中: {cooldownRemaining} ticks剩余,系统不活跃");
|
||||
return false;
|
||||
}
|
||||
|
||||
// 检查是否有需要修复的损伤
|
||||
if (!HasDamageToRepair())
|
||||
{
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 没有需要修复的损伤,系统不活跃");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 所有条件满足,系统活跃");
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -192,8 +156,6 @@ namespace WulaFallenEmpire
|
||||
{
|
||||
if (Pawn.health == null || Pawn.health.hediffSet == null)
|
||||
{
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] Health或HediffSet为null");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -201,22 +163,16 @@ namespace WulaFallenEmpire
|
||||
var missingParts = Pawn.health.hediffSet.GetMissingPartsCommonAncestors();
|
||||
if (missingParts.Count > 0)
|
||||
{
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 检测到缺失部件: {missingParts.Count}个");
|
||||
return true;
|
||||
}
|
||||
|
||||
// 检查是否有损伤
|
||||
if (HasDamagedParts())
|
||||
{
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 检测到损伤部位");
|
||||
return true;
|
||||
}
|
||||
|
||||
// 不再检查疾病
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 没有检测到任何需要修复的损伤");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -238,14 +194,9 @@ namespace WulaFallenEmpire
|
||||
if (currentHealth < maxHealth)
|
||||
{
|
||||
damagedCount++;
|
||||
if (debugCounter % 10 == 0 && damagedCount == 1)
|
||||
Log.Message($"[NanoRepair] 部位 {part.def.defName} 有损伤: {currentHealth}/{maxHealth}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (debugCounter % 10 == 0 && damagedCount > 0)
|
||||
Log.Message($"[NanoRepair] 总共检测到 {damagedCount} 个损伤部位");
|
||||
|
||||
return damagedCount > 0;
|
||||
}
|
||||
@@ -267,14 +218,9 @@ namespace WulaFallenEmpire
|
||||
if (currentHealth < maxHealth)
|
||||
{
|
||||
damagedParts.Add(part);
|
||||
if (debugCounter % 10 == 0 && damagedParts.Count <= 3)
|
||||
Log.Message($"[NanoRepair] 损伤部位: {part.def.defName} ({currentHealth}/{maxHealth})");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (debugCounter % 10 == 0 && damagedParts.Count > 3)
|
||||
Log.Message($"[NanoRepair] ... 还有 {damagedParts.Count - 3} 个损伤部位");
|
||||
|
||||
return damagedParts;
|
||||
}
|
||||
@@ -284,34 +230,22 @@ namespace WulaFallenEmpire
|
||||
var energyNeed = GetEnergyNeed();
|
||||
if (energyNeed == null)
|
||||
{
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 能量需求为null,无法修复");
|
||||
return;
|
||||
}
|
||||
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 当前能量({GetEnergyNeedName()}): {energyNeed.CurLevel:F1}/{energyNeed.MaxLevel:F1} ({energyNeed.CurLevelPercentage:P0})");
|
||||
|
||||
// 优先修复缺失部件
|
||||
if (TryRepairMissingParts(energyNeed))
|
||||
{
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 已修复缺失部件");
|
||||
return;
|
||||
}
|
||||
|
||||
// 然后修复损伤
|
||||
if (TryRepairDamagedParts(energyNeed))
|
||||
{
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 已修复损伤部位");
|
||||
return;
|
||||
}
|
||||
|
||||
// 不再修复疾病
|
||||
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 没有执行任何修复");
|
||||
}
|
||||
|
||||
private bool TryRepairMissingParts(Need energyNeed)
|
||||
@@ -319,14 +253,9 @@ namespace WulaFallenEmpire
|
||||
var missingParts = Pawn.health.hediffSet.GetMissingPartsCommonAncestors();
|
||||
if (missingParts == null || missingParts.Count == 0)
|
||||
{
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 没有缺失部件需要修复");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 检查修复缺失部件,共有 {missingParts.Count} 个");
|
||||
|
||||
// 选择最小的缺失部件进行修复(成本较低)
|
||||
Hediff_MissingPart partToRepair = null;
|
||||
float minHealth = float.MaxValue;
|
||||
@@ -353,24 +282,14 @@ namespace WulaFallenEmpire
|
||||
repairCost *= mechEnergyLoss;
|
||||
}
|
||||
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 尝试修复缺失部件 {partToRepair.Part.def.defName}, 成本: {repairCost:F2}, 当前能量: {energyNeed.CurLevel:F2}");
|
||||
|
||||
if (energyNeed.CurLevel >= repairCost)
|
||||
{
|
||||
if (ConvertMissingPartToInjury(partToRepair, repairCost))
|
||||
{
|
||||
energyNeed.CurLevel -= repairCost;
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 成功将缺失部件 {partToRepair.Part.def.defName} 转换为损伤, 消耗能量: {repairCost:F2}");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 能量不足修复缺失部件: {energyNeed.CurLevel:F2} < {repairCost:F2}");
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -380,14 +299,9 @@ namespace WulaFallenEmpire
|
||||
var damagedParts = GetDamagedParts();
|
||||
if (damagedParts.Count == 0)
|
||||
{
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 没有损伤部位需要修复");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 检查修复损伤部位,共有 {damagedParts.Count} 个");
|
||||
|
||||
// 选择健康值最低的部位进行修复
|
||||
BodyPartRecord partToRepair = null;
|
||||
float minHealthRatio = float.MaxValue;
|
||||
@@ -421,24 +335,14 @@ namespace WulaFallenEmpire
|
||||
repairCost *= mechEnergyLoss;
|
||||
}
|
||||
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 尝试修复部位 {partToRepair.def.defName}, 健康: {currentHealth:F1}/{maxHealth:F1}, 修复量: {healthToRepair:F1}, 成本: {repairCost:F2}");
|
||||
|
||||
if (energyNeed.CurLevel >= repairCost)
|
||||
{
|
||||
if (RepairDamagedPart(partToRepair, repairCost))
|
||||
{
|
||||
energyNeed.CurLevel -= repairCost;
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 成功修复部位 {partToRepair.def.defName}, 消耗能量: {repairCost:F2}");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 能量不足修复损伤: {energyNeed.CurLevel:F2} < {repairCost:F2}");
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -451,9 +355,6 @@ namespace WulaFallenEmpire
|
||||
float maxHealth = part.def.GetMaxHealth(Pawn);
|
||||
float currentHealth = Pawn.health.hediffSet.GetPartHealth(part);
|
||||
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 开始修复部位 {part.def.defName}, 当前健康: {currentHealth:F1}/{maxHealth:F1}");
|
||||
|
||||
// 获取该部位的所有hediff
|
||||
var hediffsOnPart = new List<Hediff>();
|
||||
foreach (var hediff in Pawn.health.hediffSet.hediffs)
|
||||
@@ -461,21 +362,14 @@ namespace WulaFallenEmpire
|
||||
if (hediff.Part == part)
|
||||
{
|
||||
hediffsOnPart.Add(hediff);
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 部位 {part.def.defName} 上的hediff: {hediff.def.defName}, 类型: {hediff.GetType()}, 严重性: {hediff.Severity}");
|
||||
}
|
||||
}
|
||||
|
||||
if (hediffsOnPart.Count == 0)
|
||||
{
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 部位 {part.def.defName} 上没有找到任何hediff");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 在部位 {part.def.defName} 上找到 {hediffsOnPart.Count} 个hediff");
|
||||
|
||||
bool anyRepairDone = false;
|
||||
|
||||
foreach (var hediff in hediffsOnPart)
|
||||
@@ -483,8 +377,6 @@ namespace WulaFallenEmpire
|
||||
// 检查hediff是否可修复
|
||||
if (!CanRepairHediff(hediff))
|
||||
{
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 跳过不可修复的hediff: {hediff.def.defName}");
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -493,8 +385,6 @@ namespace WulaFallenEmpire
|
||||
{
|
||||
Pawn.health.RemoveHediff(hediff);
|
||||
anyRepairDone = true;
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 删除严重性小于1的hediff: {hediff.def.defName} (严重性: {hediff.Severity:F2})");
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -503,14 +393,9 @@ namespace WulaFallenEmpire
|
||||
hediff.Severity = 0f;
|
||||
Pawn.health.RemoveHediff(hediff);
|
||||
anyRepairDone = true;
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 完全修复hediff: {hediff.def.defName} (严重性: {originalSeverity:F2} -> 0)");
|
||||
}
|
||||
}
|
||||
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 部位 {part.def.defName} 修复完成,执行了 {anyRepairDone} 次修复");
|
||||
|
||||
return anyRepairDone;
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
@@ -526,8 +411,6 @@ namespace WulaFallenEmpire
|
||||
// 跳过疾病
|
||||
if (IsDisease(hediff))
|
||||
{
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 跳过疾病: {hediff.def.defName}");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -568,9 +451,6 @@ namespace WulaFallenEmpire
|
||||
{
|
||||
try
|
||||
{
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 开始将缺失部件 {missingPart.Part.def.defName} 转换为损伤");
|
||||
|
||||
float partMaxHealth = missingPart.Part.def.GetMaxHealth(Pawn);
|
||||
|
||||
// 关键修复:确保转换后的损伤不会导致部位再次缺失
|
||||
@@ -600,9 +480,6 @@ namespace WulaFallenEmpire
|
||||
|
||||
Pawn.health.AddHediff(injury);
|
||||
|
||||
if (debugCounter % 10 == 0)
|
||||
Log.Message($"[NanoRepair] 成功将缺失部件 {missingPart.Part.def.defName} 转换为 {injuryDef.defName} 损伤, 严重性: {injurySeverity} (最大健康值: {partMaxHealth})");
|
||||
|
||||
return true;
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
@@ -628,7 +505,6 @@ namespace WulaFallenEmpire
|
||||
|
||||
// 记录最后一次受到伤害的时间
|
||||
lastDamageTick = Find.TickManager.TicksGame;
|
||||
Log.Message($"[NanoRepair] 受到伤害,开始修复冷却: {lastDamageTick}");
|
||||
}
|
||||
|
||||
// 新增:动态获取属性值的方法
|
||||
@@ -675,7 +551,6 @@ namespace WulaFallenEmpire
|
||||
"WULA_NanoRepair_DisabledMsg".Translate(Pawn.LabelShort),
|
||||
MessageTypeDefOf.SilentInput
|
||||
);
|
||||
Log.Message($"[NanoRepair] 修复系统已{(repairSystemEnabled ? "启用" : "禁用")}");
|
||||
},
|
||||
hotKey = KeyBindingDefOf.Misc1
|
||||
};
|
||||
|
||||
@@ -87,184 +87,12 @@ namespace WulaFallenEmpire
|
||||
}
|
||||
}
|
||||
|
||||
private bool ShouldAttackVolleyTarget
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!VolleyTargetManager.IsVolleyEnabled(Pawn))
|
||||
return false;
|
||||
|
||||
LocalTargetInfo volleyTarget = VolleyTargetManager.GetVolleyTarget(Pawn);
|
||||
if (!volleyTarget.IsValid)
|
||||
return false;
|
||||
|
||||
// 检查目标是否在射程内
|
||||
float distance = Pawn.Position.DistanceTo(volleyTarget.Cell);
|
||||
if (distance > AttackVerb.verbProps.range)
|
||||
return false;
|
||||
|
||||
// 检查是否可以命中目标
|
||||
return AttackVerb.CanHitTarget(volleyTarget);
|
||||
}
|
||||
}
|
||||
public override void CompPostTick(ref float severityAdjustment)
|
||||
{
|
||||
base.CompPostTick(ref severityAdjustment);
|
||||
|
||||
if (!TurretEnabled)
|
||||
{
|
||||
ResetCurrentTarget();
|
||||
return;
|
||||
}
|
||||
if (!this.CanShoot)
|
||||
{
|
||||
return;
|
||||
}
|
||||
// 新增:优先处理齐射目标
|
||||
if (ShouldAttackVolleyTarget)
|
||||
{
|
||||
LocalTargetInfo volleyTarget = VolleyTargetManager.GetVolleyTarget(Pawn);
|
||||
this.currentTarget = volleyTarget;
|
||||
this.curRotation = (volleyTarget.Cell.ToVector3Shifted() - this.Pawn.DrawPos).AngleFlat() + this.Props.angleOffset;
|
||||
}
|
||||
else if (this.currentTarget.IsValid)
|
||||
{
|
||||
this.curRotation = (this.currentTarget.Cell.ToVector3Shifted() - this.Pawn.DrawPos).AngleFlat() + this.Props.angleOffset;
|
||||
}
|
||||
|
||||
this.AttackVerb.VerbTick();
|
||||
if (this.AttackVerb.state != VerbState.Bursting)
|
||||
{
|
||||
if (this.WarmingUp)
|
||||
{
|
||||
this.burstWarmupTicksLeft--;
|
||||
if (this.burstWarmupTicksLeft == 0)
|
||||
{
|
||||
this.AttackVerb.TryStartCastOn(this.currentTarget, false, true, false, true);
|
||||
this.lastAttackTargetTick = Find.TickManager.TicksGame;
|
||||
this.lastAttackedTarget = this.currentTarget;
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (this.burstCooldownTicksLeft > 0)
|
||||
{
|
||||
this.burstCooldownTicksLeft--;
|
||||
}
|
||||
if (this.burstCooldownTicksLeft <= 0 && this.Pawn.IsHashIntervalTick(10))
|
||||
{
|
||||
// 只有在没有齐射目标时才寻找新目标
|
||||
if (!ShouldAttackVolleyTarget)
|
||||
{
|
||||
this.currentTarget = (Thing)AttackTargetFinder.BestShootTargetFromCurrentPosition(this, TargetScanFlags.NeedThreat | TargetScanFlags.NeedAutoTargetable, null, 0f, 9999f);
|
||||
if (this.currentTarget.IsValid)
|
||||
{
|
||||
this.burstWarmupTicksLeft = 1;
|
||||
return;
|
||||
}
|
||||
}
|
||||
this.ResetCurrentTarget();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 新增:齐射Gizmos
|
||||
public override IEnumerable<Gizmo> CompGetGizmos()
|
||||
{
|
||||
// 只有 pawn 被选中且是玩家派系时才显示按钮
|
||||
if (this.Pawn.Faction == Faction.OfPlayer && Find.Selector.IsSelected(this.Pawn))
|
||||
{
|
||||
// 原有开关按钮
|
||||
yield return new Command_Toggle
|
||||
{
|
||||
defaultLabel = "CommandToggleTurret".Translate(),
|
||||
defaultDesc = "CommandToggleTurretDesc".Translate(),
|
||||
icon = ContentFinder<Texture2D>.Get("UI/Gizmos/ToggleTurret"),
|
||||
isActive = () => TurretEnabled,
|
||||
toggleAction = () => TurretEnabled = !TurretEnabled,
|
||||
hotKey = KeyBindingDefOf.Misc1
|
||||
};
|
||||
// 新增:齐射开关按钮
|
||||
yield return new Command_Toggle
|
||||
{
|
||||
defaultLabel = "CommandToggleVolley".Translate(),
|
||||
defaultDesc = "CommandToggleVolleyDesc".Translate(),
|
||||
icon = ContentFinder<Texture2D>.Get("UI/Gizmos/VolleyFire"),
|
||||
isActive = () => VolleyTargetManager.IsVolleyEnabled(Pawn),
|
||||
toggleAction = () => VolleyTargetManager.ToggleVolley(Pawn),
|
||||
hotKey = KeyBindingDefOf.Misc2
|
||||
};
|
||||
// 新增:设置齐射目标按钮(只在齐射启用时显示)
|
||||
if (VolleyTargetManager.IsVolleyEnabled(Pawn))
|
||||
{
|
||||
yield return new Command_Action
|
||||
{
|
||||
defaultLabel = "CommandSetVolleyTarget".Translate(),
|
||||
defaultDesc = "CommandSetVolleyTargetDesc".Translate(),
|
||||
icon = ContentFinder<Texture2D>.Get("UI/Gizmos/SetTarget"),
|
||||
action = () => Find.Targeter.BeginTargeting(TargetingParameters.ForAttack(),
|
||||
delegate (LocalTargetInfo target)
|
||||
{
|
||||
VolleyTargetManager.SetVolleyTarget(Pawn, target);
|
||||
},
|
||||
null,
|
||||
null,
|
||||
"SetVolleyTarget".Translate()),
|
||||
hotKey = KeyBindingDefOf.Misc3
|
||||
};
|
||||
// 新增:清除齐射目标按钮
|
||||
LocalTargetInfo currentVolleyTarget = VolleyTargetManager.GetVolleyTarget(Pawn);
|
||||
if (currentVolleyTarget.IsValid)
|
||||
{
|
||||
yield return new Command_Action
|
||||
{
|
||||
defaultLabel = "CommandClearVolleyTarget".Translate(),
|
||||
defaultDesc = "CommandClearVolleyTargetDesc".Translate(),
|
||||
icon = ContentFinder<Texture2D>.Get("UI/Gizmos/ClearTarget"),
|
||||
action = () => VolleyTargetManager.ClearVolleyTarget(Pawn),
|
||||
hotKey = KeyBindingDefOf.Misc4
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 新增:在提示中显示齐射状态
|
||||
public override string CompTipStringExtra
|
||||
{
|
||||
get
|
||||
{
|
||||
string baseString = base.CompTipStringExtra;
|
||||
string turretStatus = TurretEnabled ? "Turret: Active" : "Turret: Inactive";
|
||||
|
||||
string volleyStatus = "Volley: ";
|
||||
if (VolleyTargetManager.IsVolleyEnabled(Pawn))
|
||||
{
|
||||
LocalTargetInfo volleyTarget = VolleyTargetManager.GetVolleyTarget(Pawn);
|
||||
if (volleyTarget.IsValid)
|
||||
{
|
||||
volleyStatus += $"Targeting {volleyTarget.Thing?.LabelCap ?? volleyTarget.Cell.ToString()}";
|
||||
}
|
||||
else
|
||||
{
|
||||
volleyStatus += "Enabled (No Target)";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
volleyStatus += "Disabled";
|
||||
}
|
||||
string result = turretStatus + "\n" + volleyStatus;
|
||||
return string.IsNullOrEmpty(baseString) ? result : baseString + "\n" + result;
|
||||
}
|
||||
}
|
||||
|
||||
// 新增:炮塔启用状态
|
||||
public bool TurretEnabled
|
||||
{
|
||||
get { return turretEnabled; }
|
||||
set
|
||||
{
|
||||
set
|
||||
{
|
||||
turretEnabled = value;
|
||||
if (!turretEnabled)
|
||||
{
|
||||
@@ -366,7 +194,7 @@ namespace WulaFallenEmpire
|
||||
public override void CompPostTick(ref float severityAdjustment)
|
||||
{
|
||||
base.CompPostTick(ref severityAdjustment);
|
||||
|
||||
|
||||
// 新增:只在启用状态下执行攻击逻辑
|
||||
if (!TurretEnabled)
|
||||
{
|
||||
@@ -432,7 +260,7 @@ namespace WulaFallenEmpire
|
||||
Scribe_Values.Look<bool>(ref this.fireAtWill, "fireAtWill", true, false);
|
||||
// 新增:保存启用状态
|
||||
Scribe_Values.Look<bool>(ref this.turretEnabled, "turretEnabled", Props.defaultEnabled, false);
|
||||
|
||||
|
||||
if (Scribe.mode == LoadSaveMode.PostLoadInit)
|
||||
{
|
||||
if (this.gun == null)
|
||||
@@ -486,11 +314,11 @@ namespace WulaFallenEmpire
|
||||
private LocalTargetInfo lastAttackedTarget = LocalTargetInfo.Invalid;
|
||||
private int lastAttackTargetTick;
|
||||
private float curRotation;
|
||||
|
||||
|
||||
// 新增:炮塔启用状态字段
|
||||
private bool turretEnabled = true;
|
||||
|
||||
[Unsaved(false)]
|
||||
public Material turretMat;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user