diff --git a/1.6/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/1.6/Assemblies/WulaFallenEmpire.dll index bbc3cbec..984f5c40 100644 Binary files a/1.6/1.6/Assemblies/WulaFallenEmpire.dll and b/1.6/1.6/Assemblies/WulaFallenEmpire.dll differ diff --git a/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Turret_Buildings.xml b/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Turret_Buildings.xml index aade8b90..7b657761 100644 --- a/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Turret_Buildings.xml +++ b/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Turret_Buildings.xml @@ -412,6 +412,9 @@ 让地堡中的两只乌拉猫猫继续操纵地堡中的机枪,剩下的乌拉猫猫抬着地堡移动——虽然很难相信但是事实就是这样的。 Wula/UI/Commands/WULA_BunkerCat +
  • + true +
  • @@ -663,6 +666,9 @@ 2 true +
  • + true +
  • @@ -953,6 +959,9 @@ 2 true +
  • + true +
  • @@ -1238,6 +1247,9 @@ 2 true +
  • + true +
  • diff --git a/Source/WulaFallenEmpire/BuildingComp/CompPathCostUpdater.cs b/Source/WulaFallenEmpire/BuildingComp/CompPathCostUpdater.cs index f73dc290..4ea34aad 100644 --- a/Source/WulaFallenEmpire/BuildingComp/CompPathCostUpdater.cs +++ b/Source/WulaFallenEmpire/BuildingComp/CompPathCostUpdater.cs @@ -9,17 +9,74 @@ namespace WulaFallenEmpire { private CompProperties_PathCostUpdater Props => (CompProperties_PathCostUpdater)props; + // 记录是否需要更新路径成本 + private bool needsPathUpdate = false; + + // 记录需要更新的区域 + private CellRect updateRect; + public override void PostSpawnSetup(bool respawningAfterLoad) { base.PostSpawnSetup(respawningAfterLoad); - if (!respawningAfterLoad && parent.Spawned) + if (!respawningAfterLoad) { - // 建筑生成时更新路径 - UpdatePathCosts(); + MarkForPathUpdate(); } } + public override void CompTick() + { + base.CompTick(); + + // 每帧检查是否需要更新路径 + if (needsPathUpdate && parent.Spawned) + { + UpdatePathCosts(); + needsPathUpdate = false; + } + } + + /// + /// 标记需要更新路径成本 + /// + public void MarkForPathUpdate() + { + if (!parent.Spawned) + return; + + needsPathUpdate = true; + + // 计算需要更新的区域 + updateRect = parent.OccupiedRect(); + + // 根据建筑大小决定扩展区域 + int expandBy = CalculateExpandDistance(); + updateRect = updateRect.ExpandedBy(expandBy); + updateRect = updateRect.ClipInsideMap(parent.Map); + } + + /// + /// 根据建筑大小计算需要扩展的距离 + /// + private int CalculateExpandDistance() + { + if (Props == null || !Props.adaptiveExpansion) + return 1; + + // 根据建筑尺寸决定扩展距离 + int size = parent.def.size.x * parent.def.size.z; + + if (size <= 1) // 1x1 建筑 + return 1; + else if (size <= 4) // 2x2 或 1x4 建筑 + return 2; + else if (size <= 9) // 3x3 建筑 + return 3; + else // 大型建筑 + return 4; + } + /// /// 更新路径成本 /// @@ -30,25 +87,20 @@ namespace WulaFallenEmpire Map map = parent.Map; - // 获取建筑占用的所有单元格 - CellRect occupiedRect = parent.OccupiedRect(); - - // 根据组件属性决定扩展范围 - int expandBy = Props != null && Props.expandToAdjacent ? Props.expandDistance : 0; - CellRect updateRect = occupiedRect.ExpandedBy(expandBy).ClipInsideMap(map); - - // 更新指定区域内的路径成本 - bool haveNotified = false; - foreach (IntVec3 cell in updateRect) - { - if (cell.InBounds(map)) - { - // 使用 Pathing 的正确方法 - map.pathing.RecalculatePerceivedPathCostAt(cell); - } - } + // 使用map.pathing来更新路径成本 + // 根据Pathing.cs的RecalculatePerceivedPathCostUnderThing方法,我们可以直接调用它 + map.pathing.RecalculatePerceivedPathCostUnderThing(parent); // 清理可达性缓存 + ClearReachabilityCache(map); + } + + /// + /// 清理可达性缓存 + /// + private void ClearReachabilityCache(Map map) + { + // 清理整个地图的可达性缓存 map.reachability.ClearCache(); } @@ -57,7 +109,11 @@ namespace WulaFallenEmpire /// public void ForceImmediateUpdate() { - UpdatePathCosts(); + if (parent.Spawned) + { + UpdatePathCosts(); + needsPathUpdate = false; + } } public override IEnumerable CompGetGizmosExtra() @@ -81,11 +137,8 @@ namespace WulaFallenEmpire public class CompProperties_PathCostUpdater : CompProperties { - // 是否扩展到相邻单元格 - public bool expandToAdjacent = true; - - // 扩展距离 - public int expandDistance = 1; + // 是否启用自适应扩展(根据建筑大小决定更新区域) + public bool adaptiveExpansion = true; public CompProperties_PathCostUpdater() {