diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll index d270c71..bdd2907 100644 Binary files a/1.6/1.6/Assemblies/ArachnaeSwarm.dll and b/1.6/1.6/Assemblies/ArachnaeSwarm.dll differ diff --git a/Source/ArachnaeSwarm/JobGiver_Grower.cs b/Source/ArachnaeSwarm/JobGiver_Grower.cs index 29e70f5..9f22bb2 100644 --- a/Source/ArachnaeSwarm/JobGiver_Grower.cs +++ b/Source/ArachnaeSwarm/JobGiver_Grower.cs @@ -9,7 +9,7 @@ namespace ArachnaeSwarm { private WorkGiver_GrowerHarvest _workGiverHarvest; private WorkGiver_ArachnaeSow _workGiverArachnaeSow; // 修改为我们的新 WorkGiver - + protected override Job TryGiveJob(Pawn pawn) { // 懒加载 WorkGiver 实例,确保 DefOf 已被初始化 @@ -17,22 +17,21 @@ namespace ArachnaeSwarm { _workGiverHarvest = WorkGiverDefOf.GrowerHarvest.Worker as WorkGiver_GrowerHarvest; _workGiverArachnaeSow = new WorkGiver_ArachnaeSow(); // 直接实例化我们的 WorkGiver - + if (_workGiverHarvest == null || _workGiverArachnaeSow == null) { Log.ErrorOnce("JobGiver_Grower: Failed to get WorkGiver_GrowerHarvest or WorkGiver_ArachnaeSow. DefOfs might not be initialized or WorkGiver_ArachnaeSow could not be instantiated.", 123457); return null; } } - - // 1. 优先收获 - Thing bestHarvestable = FindClosestThing(pawn, _workGiverHarvest); - if (bestHarvestable != null) + + // 1. 优先收获 - 使用基于 Cell 的新方法 + IntVec3 bestHarvestCell = FindClosestHarvestableCell(pawn); + if (bestHarvestCell.IsValid) { - // 调用 JobOnCell 以利用 WorkGiver_GrowerHarvest 的多目标打包逻辑 - return _workGiverHarvest.JobOnCell(pawn, bestHarvestable.Position); + return _workGiverHarvest.JobOnCell(pawn, bestHarvestCell); } - + // 2. 其次播种 (IntVec3 bestSowCell, ThingDef plantToSow) = FindClosestSowableCellAndPlant(pawn, _workGiverArachnaeSow); // 使用我们的新 WorkGiver if (bestSowCell.IsValid && plantToSow != null) @@ -43,20 +42,35 @@ namespace ArachnaeSwarm return null; } - - private Thing FindClosestThing(Pawn pawn, WorkGiver_Scanner scanner) + + private IntVec3 FindClosestHarvestableCell(Pawn pawn) { - return GenClosest.ClosestThingReachable( - pawn.Position, - pawn.Map, - scanner.PotentialWorkThingRequest, - PathEndMode.Touch, - TraverseParms.For(pawn), - 9999f, - t => scanner.HasJobOnThing(pawn, t) - ); - } + IntVec3 bestCell = IntVec3.Invalid; + float bestDistSq = float.MaxValue; + foreach (Zone zone in pawn.Map.zoneManager.AllZones) + { + if (zone is Zone_Growing growingZone) + { + // 遍历区域中的所有单元格 + foreach (IntVec3 cell in growingZone.Cells) + { + float distSq = pawn.Position.DistanceToSquared(cell); + if (distSq < bestDistSq && pawn.CanReach(cell, PathEndMode.ClosestTouch, Danger.Deadly)) + { + // 使用 HasJobOnCell 来判断是否可以收获 + if (_workGiverHarvest.HasJobOnCell(pawn, cell)) + { + bestDistSq = distSq; + bestCell = cell; + } + } + } + } + } + return bestCell; + } + private (IntVec3, ThingDef) FindClosestSowableCellAndPlant(Pawn pawn, WorkGiver_ArachnaeSow scanner) // 修改为我们的新 WorkGiver 类型 { IntVec3 bestCell = IntVec3.Invalid; @@ -97,7 +111,6 @@ namespace ArachnaeSwarm public static class WorkGiverDefOf { public static WorkGiverDef GrowerHarvest; - public static WorkGiverDef GrowerSow; static WorkGiverDefOf() {