diff --git a/1.6/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/1.6/Assemblies/WulaFallenEmpire.dll
index 981c5099..bbc3cbec 100644
Binary files a/1.6/1.6/Assemblies/WulaFallenEmpire.dll and b/1.6/1.6/Assemblies/WulaFallenEmpire.dll differ
diff --git a/Source/WulaFallenEmpire/BuildingComp/CompPathCostUpdater.cs b/Source/WulaFallenEmpire/BuildingComp/CompPathCostUpdater.cs
index 6ae3c338..f73dc290 100644
--- a/Source/WulaFallenEmpire/BuildingComp/CompPathCostUpdater.cs
+++ b/Source/WulaFallenEmpire/BuildingComp/CompPathCostUpdater.cs
@@ -1,6 +1,7 @@
using System.Collections.Generic;
using RimWorld;
using Verse;
+using Verse.AI;
namespace WulaFallenEmpire
{
@@ -8,85 +9,17 @@ namespace WulaFallenEmpire
{
private CompProperties_PathCostUpdater Props => (CompProperties_PathCostUpdater)props;
- // 记录是否需要更新路径成本
- private bool needsPathUpdate = false;
-
- // 记录需要更新的区域
- private CellRect updateRect;
-
- public override void Initialize(CompProperties props)
- {
- base.Initialize(props);
-
- if (parent.Spawned)
- {
- MarkForPathUpdate();
- }
- }
-
public override void PostSpawnSetup(bool respawningAfterLoad)
{
base.PostSpawnSetup(respawningAfterLoad);
- // 如果组件在生成后添加,也需要标记更新
- if (!respawningAfterLoad)
- {
- MarkForPathUpdate();
- }
- }
-
- public override void CompTick()
- {
- base.CompTick();
-
- // 每帧检查是否需要更新路径
- if (needsPathUpdate && parent.Spawned)
+ if (!respawningAfterLoad && 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;
- }
-
///
/// 更新路径成本
///
@@ -97,80 +30,25 @@ namespace WulaFallenEmpire
Map map = parent.Map;
- // 1. 更新路径网格
- RecalculatePathGrid(map);
+ // 获取建筑占用的所有单元格
+ CellRect occupiedRect = parent.OccupiedRect();
- // 2. 更新区域网格(如果需要)
- UpdateRegionGrid(map);
-
- // 3. 清理可达性缓存
- ClearReachabilityCache(map);
- }
-
- ///
- /// 重新计算路径网格
- ///
- private void RecalculatePathGrid(Map map)
- {
- // 使用局部变量跟踪是否已通知过变化
- bool haveNotified = false;
+ // 根据组件属性决定扩展范围
+ 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))
{
- // 调用PathGrid的正确方法(根据您提供的PathGrid代码)
- map.pathGrid.RecalculatePerceivedPathCostAt(cell, ref haveNotified);
-
- // 如果是可通行变化较大的建筑,需要更新相邻单元格
- if (parent.def.passability == Traversability.Impassable ||
- parent.def.passability == Traversability.PassThroughOnly)
- {
- foreach (IntVec3 adjacent in GenAdj.AdjacentCells)
- {
- IntVec3 adjCell = cell + adjacent;
- if (adjCell.InBounds(map))
- {
- map.pathGrid.RecalculatePerceivedPathCostAt(adjCell, ref haveNotified);
- }
- }
- }
+ // 使用 Pathing 的正确方法
+ map.pathing.RecalculatePerceivedPathCostAt(cell);
}
}
- }
-
- ///
- /// 更新区域网格
- ///
- private void UpdateRegionGrid(Map map)
- {
- if (Props.updateRegions && parent.def.AffectsRegions)
- {
- // 标记区域网格需要更新
- map.regionAndRoomUpdater.Enabled = true;
- map.regionAndRoomUpdater.RebuildAllRegionsAndRooms();
- }
- else
- {
- // 只更新受影响区域
- foreach (IntVec3 cell in updateRect)
- {
- if (cell.InBounds(map))
- {
- // 根据PathGrid代码,使用Notify_WalkabilityChanged方法
- map.regionDirtyer.Notify_WalkabilityChanged(cell, map.pathGrid.WalkableFast(cell));
- }
- }
- }
- }
-
- ///
- /// 清理可达性缓存
- ///
- private void ClearReachabilityCache(Map map)
- {
- // 清理整个地图的可达性缓存
+
+ // 清理可达性缓存
map.reachability.ClearCache();
}
@@ -179,11 +57,7 @@ namespace WulaFallenEmpire
///
public void ForceImmediateUpdate()
{
- if (parent.Spawned)
- {
- UpdatePathCosts();
- needsPathUpdate = false;
- }
+ UpdatePathCosts();
}
public override IEnumerable CompGetGizmosExtra()
@@ -203,20 +77,15 @@ namespace WulaFallenEmpire
};
}
}
-
- // 移除PostDeSpawn方法,因为不需要处理销毁
}
public class CompProperties_PathCostUpdater : CompProperties
{
- // 是否启用自适应扩展(根据建筑大小决定更新区域)
- public bool adaptiveExpansion = true;
+ // 是否扩展到相邻单元格
+ public bool expandToAdjacent = true;
- // 是否重建区域网格(性能消耗较大)
- public bool updateRegions = false;
-
- // 固定扩展距离(如果adaptiveExpansion为false)
- public int fixedExpansionDistance = 1;
+ // 扩展距离
+ public int expandDistance = 1;
public CompProperties_PathCostUpdater()
{