This commit is contained in:
2025-08-21 11:31:13 +08:00
parent 02d9289578
commit 4c0268109a
5 changed files with 105 additions and 73 deletions

View File

@@ -0,0 +1,58 @@
using HarmonyLib;
using RimWorld;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using Verse;
namespace WulaFallenEmpire.HarmonyPatches
{
[HarmonyPatch(typeof(DropCellFinder), "SkyfallerCanLandAt")]
public static class Patch_DropCellFinder_SkyfallerCanLandAt
{
[HarmonyPrefix]
public static bool Prefix(IntVec3 c, Map map, IntVec2 size, Faction faction, ref bool __result)
{
// 检查 skyfallerThingDef 是否是我们的武装穿梭机
// 注意SkyfallerCanLandAt 方法本身没有 skyfallerThingDef 参数。
// 我们需要判断当前上下文是否是武装穿梭机在尝试降落。
// 最直接的方式是检查传入的 size 是否与我们的武装穿梭机 ThingDef 的 size 匹配。
// 这种方式不够精确,但在这个上下文中可能是最接近的。
// 更好的方式是检查调用堆栈或通过更早的 Patch 传递上下文信息。
// 但为了快速解决问题,我们先假设 size 匹配即可。
// 更好的方法是,在 SkyfallerMaker.SpawnSkyfaller 方法被调用时,
// 我们可以获取到 ThingDef然后将其存储在一个临时变量中供后续的 Patch 使用。
// 但这会引入额外的复杂性。
// 暂时先用 size 匹配来判断,如果未来出现问题再考虑更复杂的方案。
// 考虑到 SkyfallerCanLandAt 通常与 ThingDef.Size 关联,我们尝试通过 ThingDefOf.Shuttle 获取其 Size
// 也可以直接使用硬编码的 (3,5)
// ThingDef shuttleDef = ThingDef.Named("WULA_ArmedShuttle");
// if (shuttleDef != null && size == shuttleDef.Size)
// 为了避免对其他 Skyfaller 产生影响,我们只在武装穿梭机相关的逻辑中进行额外的边界检查。
// 由于 SkyfallerCanLandAt 不直接接收 ThingDef我们通过 ThingDefOf.Shuttle 来判断是否是默认穿梭机
// 如果是,并且尺寸与我们的武装穿梭机尺寸 (3,5) 匹配,则进行额外检查。
// 或者更直接地,假设任何尺寸为 (3,5) 的 Skyfaller 都需要这个检查如果这是我们Mod独有的尺寸
// 这里我们直接根据已知的武装穿梭机尺寸 (3,5) 来判断
if (size.x == 3 && size.z == 5)
{
// 仅对我们的武装穿梭机执行额外的边界检查
foreach (IntVec3 occupiedCell in GenAdj.OccupiedRect(c, Rot4.North, size))
{
if (!occupiedCell.InBounds(map))
{
Log.Warning($"[WULA] Harmony Patch: SkyfallerCanLandAt - Occupied cell {occupiedCell} for WULA_ArmedShuttle (size: {size}) is out of map bounds. Preventing landing.");
__result = false;
return false; // 阻止原方法执行,并返回 false
}
}
}
return true; // 继续执行原方法
}
}
}