// File: WorkGiver_EnterMech.cs using RimWorld; using System; using System.Collections.Generic; using System.Linq; using Verse; using Verse.AI; namespace WulaFallenEmpire { public class WorkGiver_EnterMech : WorkGiver_Scanner { // 缓存机甲定义列表 private static List cachedMechDefs = null; public override PathEndMode PathEndMode => PathEndMode.Touch; // 获取所有机甲定义的列表 private List GetAllMechDefs() { if (cachedMechDefs == null) { cachedMechDefs = new List(); // 搜索所有ThingDef,找出继承自Wulamechunit的类 foreach (var def in DefDatabase.AllDefs) { try { if (def.thingClass == typeof(Wulamechunit) || def.thingClass?.IsSubclassOf(typeof(Wulamechunit)) == true) { cachedMechDefs.Add(def); } } catch (Exception ex) { // 忽略错误,继续搜索 Log.Warning($"[WULA] Error checking ThingDef {def.defName}: {ex.Message}"); } } } return cachedMechDefs; } // 检查Thing是否为机甲 private bool IsMech(Thing thing) { return thing is Wulamechunit || thing?.GetType()?.IsSubclassOf(typeof(Wulamechunit)) == true; } public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false) { try { // 检查基本条件 if (t == null || pawn == null) return false; // 必须是Wulamechunit或其子类 if (!IsMech(t)) return false; // 检查距离 if (!pawn.CanReach(t, PathEndMode, Danger.Deadly)) return false; // 检查机甲是否有驾驶员槽位组件 var comp = t.TryGetComp(); if (comp == null) return false; // 检查是否已满 if (comp.IsFull) return false; // 检查殖民者是否可以成为驾驶员 if (!comp.CanAddPilot(pawn)) return false; // 检查殖民者状态 if (pawn.Downed || pawn.Dead) return false; // 检查殖民者是否正在执行任务 if (pawn.CurJob != null && pawn.CurJob.def != JobDefOf.Wait) return false; // 检查是否被征召 if (pawn.Drafted) return false; // 检查是否为囚犯 if (pawn.IsPrisoner) return false; // 检查是否为奴隶 if (pawn.IsSlave) return false; return true; } catch (Exception ex) { Log.Error($"[WULA] Error in HasJobOnThing: {ex}"); return false; } } public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false) { try { if (IsMech(t)) { // 创建进入机甲的工作 return JobMaker.MakeJob(Wula_JobDefOf.WULA_EnterMech, t); } } catch (Exception ex) { Log.Error($"[WULA] Error creating job: {ex}"); } return null; } public override IEnumerable PotentialWorkThingsGlobal(Pawn pawn) { try { // 只搜索玩家拥有的机甲 List potentialMechs = new List(); // 获取地图中的所有机甲 if (pawn.Map != null) { // 使用缓存的机甲定义列表 var mechDefs = GetAllMechDefs(); foreach (var def in mechDefs) { try { var allMechs = pawn.Map.listerThings.ThingsOfDef(def); foreach (var mech in allMechs) { if (mech.Faction == Faction.OfPlayer && mech.TryGetComp() != null) { potentialMechs.Add(mech); } } } catch (Exception ex) { Log.Warning($"[WULA] Error getting mechs for def {def.defName}: {ex.Message}"); } } } return potentialMechs; } catch (Exception ex) { Log.Error($"[WULA] Error in PotentialWorkThingsGlobal: {ex}"); return Enumerable.Empty(); } } public override bool ShouldSkip(Pawn pawn, bool forced = false) { try { // 简化版本:只检查殖民者状态 if (pawn.Downed || pawn.Dead || pawn.Drafted || pawn.IsPrisoner || pawn.IsSlave) return true; return false; } catch (Exception ex) { Log.Error($"[WULA] Error in ShouldSkip: {ex}"); return true; } } } }