修割除

This commit is contained in:
2025-09-03 12:50:35 +08:00
parent 2d4d171eb9
commit 9a8b90be82
2 changed files with 38 additions and 25 deletions

Binary file not shown.

View File

@@ -8,41 +8,58 @@ namespace ArachnaeSwarm
public class JobGiver_Grower : ThinkNode_JobGiver public class JobGiver_Grower : ThinkNode_JobGiver
{ {
private WorkGiver_GrowerHarvest _workGiverHarvest; private WorkGiver_GrowerHarvest _workGiverHarvest;
private WorkGiver_ArachnaeSow _workGiverArachnaeSow; // 修改为我们的新 WorkGiver private WorkGiver_Scanner _workGiverPlantsCut; // 通用扫描器类型
private WorkGiver_ArachnaeSow _workGiverArachnaeSow;
protected override Job TryGiveJob(Pawn pawn) protected override Job TryGiveJob(Pawn pawn)
{ {
// 懒加载 WorkGiver 实例,确保 DefOf 已被初始化
if (_workGiverHarvest == null) if (_workGiverHarvest == null)
{ {
_workGiverHarvest = WorkGiverDefOf.GrowerHarvest.Worker as WorkGiver_GrowerHarvest; _workGiverHarvest = WorkGiverDefOf.GrowerHarvest.Worker as WorkGiver_GrowerHarvest;
_workGiverArachnaeSow = new WorkGiver_ArachnaeSow(); // 直接实例化我们的 WorkGiver _workGiverPlantsCut = WorkGiverDefOf.PlantsCut.Worker as WorkGiver_Scanner;
_workGiverArachnaeSow = new WorkGiver_ArachnaeSow();
if (_workGiverHarvest == null || _workGiverArachnaeSow == null)
if (_workGiverHarvest == null || _workGiverPlantsCut == 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); Log.ErrorOnce("JobGiver_Grower: Failed to get a required WorkGiver. DefOfs might not be initialized.", 123458);
return null; return null;
} }
} }
// 1. 优先收获 - 使用基于 Cell 的新方法 // 1. 优先收获(自动)
IntVec3 bestHarvestCell = FindClosestHarvestableCell(pawn); IntVec3 bestHarvestCell = FindClosestHarvestableCell(pawn);
if (bestHarvestCell.IsValid) if (bestHarvestCell.IsValid)
{ {
return _workGiverHarvest.JobOnCell(pawn, bestHarvestCell); return _workGiverHarvest.JobOnCell(pawn, bestHarvestCell);
} }
// 2. 其次播种 // 2. 其次处理手动指定的砍伐/收获任务
(IntVec3 bestSowCell, ThingDef plantToSow) = FindClosestSowableCellAndPlant(pawn, _workGiverArachnaeSow); // 使用我们的新 WorkGiver Thing bestCuttable = FindClosestWorkableThing(pawn, _workGiverPlantsCut);
if (bestCuttable != null)
{
return _workGiverPlantsCut.JobOnThing(pawn, bestCuttable);
}
// 3. 最后播种(自动,并清理障碍)
(IntVec3 bestSowCell, ThingDef plantToSow) = FindClosestSowableCellAndPlant(pawn, _workGiverArachnaeSow);
if (bestSowCell.IsValid && plantToSow != null) if (bestSowCell.IsValid && plantToSow != null)
{ {
// 现在直接调用 WorkGiver_ArachnaeSow 的 JobOnCell它会处理 Job 的创建和 plantDefToSow 的设置
return _workGiverArachnaeSow.JobOnCell(pawn, bestSowCell); return _workGiverArachnaeSow.JobOnCell(pawn, bestSowCell);
} }
return null; return null;
} }
private Thing FindClosestWorkableThing(Pawn pawn, WorkGiver_Scanner scanner)
{
return GenClosest.ClosestThing_Global(
pawn.Position,
scanner.PotentialWorkThingsGlobal(pawn),
maxDistance: 9999f,
validator: t => t != null && !t.IsForbidden(pawn) && scanner.HasJobOnThing(pawn, t) && pawn.CanReach(t, PathEndMode.Touch, Danger.Deadly)
);
}
private IntVec3 FindClosestHarvestableCell(Pawn pawn) private IntVec3 FindClosestHarvestableCell(Pawn pawn)
{ {
IntVec3 bestCell = IntVec3.Invalid; IntVec3 bestCell = IntVec3.Invalid;
@@ -52,13 +69,11 @@ namespace ArachnaeSwarm
{ {
if (zone is Zone_Growing growingZone) if (zone is Zone_Growing growingZone)
{ {
// 遍历区域中的所有单元格
foreach (IntVec3 cell in growingZone.Cells) foreach (IntVec3 cell in growingZone.Cells)
{ {
float distSq = pawn.Position.DistanceToSquared(cell); float distSq = pawn.Position.DistanceToSquared(cell);
if (distSq < bestDistSq && pawn.CanReach(cell, PathEndMode.ClosestTouch, Danger.Deadly)) if (distSq < bestDistSq && pawn.CanReach(cell, PathEndMode.ClosestTouch, Danger.Deadly))
{ {
// 使用 HasJobOnCell 来判断是否可以收获
if (_workGiverHarvest.HasJobOnCell(pawn, cell)) if (_workGiverHarvest.HasJobOnCell(pawn, cell))
{ {
bestDistSq = distSq; bestDistSq = distSq;
@@ -70,8 +85,8 @@ namespace ArachnaeSwarm
} }
return bestCell; return bestCell;
} }
private (IntVec3, ThingDef) FindClosestSowableCellAndPlant(Pawn pawn, WorkGiver_ArachnaeSow scanner) // 修改为我们的新 WorkGiver 类型 private (IntVec3, ThingDef) FindClosestSowableCellAndPlant(Pawn pawn, WorkGiver_ArachnaeSow scanner)
{ {
IntVec3 bestCell = IntVec3.Invalid; IntVec3 bestCell = IntVec3.Invalid;
ThingDef bestPlantToSow = null; ThingDef bestPlantToSow = null;
@@ -81,7 +96,7 @@ namespace ArachnaeSwarm
{ {
if (zone is Zone_Growing growingZone) if (zone is Zone_Growing growingZone)
{ {
ThingDef wantedPlant = growingZone.GetPlantDefToGrow(); ThingDef wantedPlant = growingZone.GetPlantDefToGrow();
if (wantedPlant == null) continue; if (wantedPlant == null) continue;
foreach (IntVec3 cell in growingZone.Cells) foreach (IntVec3 cell in growingZone.Cells)
@@ -89,13 +104,11 @@ namespace ArachnaeSwarm
float distSq = pawn.Position.DistanceToSquared(cell); float distSq = pawn.Position.DistanceToSquared(cell);
if (distSq < bestDistSq && pawn.CanReach(cell, PathEndMode.ClosestTouch, Danger.Deadly)) if (distSq < bestDistSq && pawn.CanReach(cell, PathEndMode.ClosestTouch, Danger.Deadly))
{ {
// 这里不再需要 WorkGiver_Grower.wantedPlantDef 的复杂处理 if (scanner.HasJobOnCell(pawn, cell))
// 因为 WorkGiver_ArachnaeSow.JobOnCell 会直接使用它计算出的 wantedPlantDef
if (scanner.HasJobOnCell(pawn, cell)) // HasJobOnCell 内部会根据 wantedPlant 计算
{ {
bestDistSq = distSq; bestDistSq = distSq;
bestCell = cell; bestCell = cell;
bestPlantToSow = wantedPlant; // 确保返回正确的 plantDef bestPlantToSow = wantedPlant;
} }
} }
} }
@@ -106,12 +119,12 @@ namespace ArachnaeSwarm
} }
} }
// 确保 WorkGiverDefOf 被正确初始化,放在命名空间顶层
[DefOf] [DefOf]
public static class WorkGiverDefOf public static class WorkGiverDefOf
{ {
public static WorkGiverDef GrowerHarvest; public static WorkGiverDef GrowerHarvest;
public static WorkGiverDef PlantsCut;
static WorkGiverDefOf() static WorkGiverDefOf()
{ {
DefOfHelper.EnsureInitializedInCtor(typeof(WorkGiverDefOf)); DefOfHelper.EnsureInitializedInCtor(typeof(WorkGiverDefOf));