This commit is contained in:
2026-02-24 17:33:16 +08:00
parent 96bc1d4c5a
commit 5195d05045
13 changed files with 333 additions and 205 deletions

View File

@@ -0,0 +1,284 @@
// File: HediffComp_SyncedWithMech_Fixed.cs
using System;
using System.Collections.Generic;
using RimWorld;
using UnityEngine;
using Verse;
using System.Linq;
namespace WulaFallenEmpire
{
public class HediffCompProperties_SyncedWithMech : HediffCompProperties
{
public float severityOnPawn = 0.5f; // 在Pawn身上的严重性
public float severityOnMech = 1.5f; // 在Mech身上的严重性
public bool transferToMech = true; // 是否转移到机甲
public bool removeWhenLeaving = true; // 离开时是否从机甲移除
public string syncEffectDef = null; // 同步时的效果
public HediffCompProperties_SyncedWithMech()
{
this.compClass = typeof(HediffComp_SyncedWithMech);
}
}
public class HediffComp_SyncedWithMech : HediffComp
{
// 同步状态数据
public Pawn linkedMech = null;
public bool isOnMech = false;
private bool initialized = false;
// 缓存属性
private HediffCompProperties_SyncedWithMech Props =>
(HediffCompProperties_SyncedWithMech)this.props;
// 新增供CompMechPilotHolder调用的公共方法
public void OnPilotEnteredMech(Pawn mech)
{
if (mech is Wulamechunit dmech)
{
LinkToMech(dmech);
}
else if (Prefs.DevMode)
{
Log.Warning($"[DD] OnPilotEnteredMech: 参数不是Wulamechunit类型: {mech?.GetType().Name}");
}
}
public void OnPilotExitedMech()
{
UnlinkFromMech();
}
public override void CompPostTick(ref float severityAdjustment)
{
base.CompPostTick(ref severityAdjustment);
// 首次初始化
if (!initialized)
{
Initialize();
initialized = true;
}
// 检查是否需要同步
CheckSyncStatus();
// 如果不在机甲上保持Pawn的严重性
if (!isOnMech && !(parent.pawn is Wulamechunit))
{
parent.Severity = Props.severityOnPawn;
}
}
private void Initialize()
{
// 如果Pawn是机甲不应用这个效果
if (parent.pawn is Wulamechunit)
{
return;
}
// 设置初始严重性
parent.Severity = Props.severityOnPawn;
// 检查Pawn是否已经在机甲中
CheckIfInMech();
}
// 检查Pawn是否在机甲中
private void CheckIfInMech()
{
// 如果Pawn是机甲跳过
if (parent.pawn is Wulamechunit)
return;
// 查找Pawn所在的机甲
var mech = FindMechContainingPawn(parent.pawn);
if (mech != null && mech != linkedMech)
{
// 连接到新的机甲
LinkToMech(mech);
}
else if (mech == null && linkedMech != null)
{
// 从机甲断开
UnlinkFromMech();
}
}
// 查找包含Pawn的机甲
private Wulamechunit FindMechContainingPawn(Pawn pawn)
{
if (pawn == null || pawn.Map == null)
return null;
// 检查所有机甲
foreach (var thing in pawn.Map.listerThings.ThingsInGroup(ThingRequestGroup.Pawn))
{
if (thing is Wulamechunit mech)
{
var pilotComp = mech.TryGetComp<CompMechPilotHolder>();
if (pilotComp != null && pilotComp.GetPilots().Contains(pawn))
{
return mech;
}
}
}
return null;
}
// 连接到机甲
private void LinkToMech(Wulamechunit mech)
{
if (mech == null || !Props.transferToMech)
return;
// 记录连接的机甲
linkedMech = mech;
isOnMech = true;
// 设置Pawn的严重性在机甲内
parent.Severity = Props.severityOnPawn;
// 在机甲上添加同样的Hediff
AddHediffToMech(mech);
// 触发同步效果
TriggerSyncEffect();
}
// 从机甲断开
private void UnlinkFromMech()
{
if (linkedMech == null)
return;
// 从机甲移除Hediff
if (Props.removeWhenLeaving)
{
RemoveHediffFromMech(linkedMech);
}
// 重置状态
var oldMech = linkedMech;
linkedMech = null;
isOnMech = false;
// 恢复Pawn的严重性
parent.Severity = Props.severityOnPawn;
}
// 在机甲上添加Hediff
private void AddHediffToMech(Wulamechunit mech)
{
try
{
// 检查是否已经有相同的Hediff
var existingHediff = mech.health.hediffSet.GetFirstHediffOfDef(parent.def);
if (existingHediff != null)
{
// 更新现有Hediff的严重性
existingHediff.Severity = Props.severityOnMech;
}
else
{
// 添加新的Hediff
var hediff = HediffMaker.MakeHediff(parent.def, mech);
hediff.Severity = Props.severityOnMech;
// 确保Hediff有同样的comp
var syncComp = hediff.TryGetComp<HediffComp_SyncedWithMech>();
if (syncComp != null)
{
syncComp.linkedMech = null; // 机甲上的Hediff不链接其他机甲
syncComp.isOnMech = true; // 标记为在机甲上
}
mech.health.AddHediff(hediff);
}
}
catch (Exception ex)
{
Log.Error($"[DD] 在机甲{mech.LabelShort}上添加Hediff时出错: {ex}");
}
}
// 从机甲移除Hediff
private void RemoveHediffFromMech(Pawn mech)
{
try
{
var hediff = mech.health.hediffSet.GetFirstHediffOfDef(parent.def);
if (hediff != null)
{
mech.health.RemoveHediff(hediff);
}
}
catch (Exception ex)
{
Log.Error($"[DD] 从机甲{mech.LabelShort}移除Hediff时出错: {ex}");
}
}
// 触发同步效果
private void TriggerSyncEffect()
{
if (string.IsNullOrEmpty(Props.syncEffectDef))
return;
try
{
var effectDef = DefDatabase<EffecterDef>.GetNamed(Props.syncEffectDef, false);
if (effectDef != null && parent.pawn.Spawned)
{
Effecter effecter = effectDef.Spawn();
effecter.Trigger(parent.pawn, parent.pawn);
effecter.Cleanup();
}
}
catch (Exception ex)
{
Log.Error($"[DD] 触发同步效果时出错: {ex}");
}
}
// 定期检查同步状态
private void CheckSyncStatus()
{
// 每60帧检查一次
if (Find.TickManager.TicksGame % 60 != 0)
return;
CheckIfInMech();
// 如果Pawn死亡或消失从机甲移除
if (parent.pawn == null || parent.pawn.Dead || parent.pawn.Destroyed)
{
UnlinkFromMech();
}
}
// 当Hediff被移除时
public override void CompPostPostRemoved()
{
base.CompPostPostRemoved();
// 从机甲移除对应的Hediff
UnlinkFromMech();
}
// 保存和加载状态
public override void CompExposeData()
{
base.CompExposeData();
Scribe_References.Look(ref linkedMech, "linkedMech");
Scribe_Values.Look(ref isOnMech, "isOnMech", false);
Scribe_Values.Look(ref initialized, "initialized", false);
}
}
}