From 254a621c55cf38a07518286ddda09d80cecb0387 Mon Sep 17 00:00:00 2001 From: "ProjectKoi-Kalo\\Kalo" Date: Wed, 3 Sep 2025 11:57:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.6/1.6/Assemblies/ArachnaeSwarm.dll | Bin 0 -> 45056 bytes .../Defs/ThingDef_Races/ARA_RaceBaseSwarm.xml | 30 +++--- 1.6/1.6/Defs/ThinkTreeDefs/ARA_ThinkTrees.xml | 45 ++------ .../Defs/TrainableDefs/ARA_PlantCutting.xml | 19 ---- 1.6/1.6/Defs/TrainableDefs/ARA_Sowing.xml | 6 +- .../ArachnaeSwarm/AnimalWorkSystemPatcher.cs | 75 ------------- Source/ArachnaeSwarm/ArachnaeSwarm.csproj | 19 ++-- Source/ArachnaeSwarm/CompAdvancedTraining.cs | 77 ++++++++++++++ .../ArachnaeSwarm/CompAnimalWorkSettings.cs | 97 ----------------- Source/ArachnaeSwarm/CompInstantTrain.cs | 46 -------- Source/ArachnaeSwarm/CompNoTrainingDecay.cs | 15 --- Source/ArachnaeSwarm/CompWorkForNonMechs.cs | 37 ------- Source/ArachnaeSwarm/JobGiver_Grower.cs | 99 ++++++++++++++++++ Source/ArachnaeSwarm/JobGiver_PlantCutting.cs | 56 ---------- Source/ArachnaeSwarm/JobGiver_PlantHarvest.cs | 63 ----------- Source/ArachnaeSwarm/JobGiver_PlantSow.cs | 41 -------- Source/ArachnaeSwarm/Patch_QualityUtility.cs | 62 ----------- .../Patch_TrainingTracker_TickRare.cs | 31 ------ .../ArachnaeSwarm/Patch_WorkGivers_Growing.cs | 96 ----------------- ...de_ConditionalAnimalShouldDoGrowingWork.cs | 43 ++++++++ ...inkNode_ConditionalAnimalShouldPlantCut.cs | 21 ---- .../ThinkNode_ConditionalAnimalShouldSow.cs | 37 ------- .../ArachnaeSwarm/TrainingSystem_Patcher.cs | 48 +++++++++ ...amework,Version=v4.8.AssemblyAttributes.cs | 4 - ...achnaeSwarm.csproj.AssemblyReference.cache | Bin 50550 -> 0 bytes ...achnaeSwarm.csproj.CoreCompileInputs.cache | 1 - .../ArachnaeSwarm.csproj.FileListAbsolute.txt | 2 - 27 files changed, 298 insertions(+), 772 deletions(-) create mode 100644 1.6/1.6/Assemblies/ArachnaeSwarm.dll delete mode 100644 1.6/1.6/Defs/TrainableDefs/ARA_PlantCutting.xml delete mode 100644 Source/ArachnaeSwarm/AnimalWorkSystemPatcher.cs create mode 100644 Source/ArachnaeSwarm/CompAdvancedTraining.cs delete mode 100644 Source/ArachnaeSwarm/CompAnimalWorkSettings.cs delete mode 100644 Source/ArachnaeSwarm/CompInstantTrain.cs delete mode 100644 Source/ArachnaeSwarm/CompNoTrainingDecay.cs delete mode 100644 Source/ArachnaeSwarm/CompWorkForNonMechs.cs create mode 100644 Source/ArachnaeSwarm/JobGiver_Grower.cs delete mode 100644 Source/ArachnaeSwarm/JobGiver_PlantCutting.cs delete mode 100644 Source/ArachnaeSwarm/JobGiver_PlantHarvest.cs delete mode 100644 Source/ArachnaeSwarm/JobGiver_PlantSow.cs delete mode 100644 Source/ArachnaeSwarm/Patch_QualityUtility.cs delete mode 100644 Source/ArachnaeSwarm/Patch_TrainingTracker_TickRare.cs delete mode 100644 Source/ArachnaeSwarm/Patch_WorkGivers_Growing.cs create mode 100644 Source/ArachnaeSwarm/ThinkNode_ConditionalAnimalShouldDoGrowingWork.cs delete mode 100644 Source/ArachnaeSwarm/ThinkNode_ConditionalAnimalShouldPlantCut.cs delete mode 100644 Source/ArachnaeSwarm/ThinkNode_ConditionalAnimalShouldSow.cs create mode 100644 Source/ArachnaeSwarm/TrainingSystem_Patcher.cs delete mode 100644 Source/ArachnaeSwarm/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs delete mode 100644 Source/ArachnaeSwarm/obj/Debug/ArachnaeSwarm.csproj.AssemblyReference.cache delete mode 100644 Source/ArachnaeSwarm/obj/Debug/ArachnaeSwarm.csproj.CoreCompileInputs.cache delete mode 100644 Source/ArachnaeSwarm/obj/Debug/ArachnaeSwarm.csproj.FileListAbsolute.txt diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll new file mode 100644 index 0000000000000000000000000000000000000000..944902615f6b8ee1562e6b11c63d64bbf1902e46 GIT binary patch literal 45056 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 literal 0 HcmV?d00001 diff --git a/1.6/1.6/Defs/ThingDef_Races/ARA_RaceBaseSwarm.xml b/1.6/1.6/Defs/ThingDef_Races/ARA_RaceBaseSwarm.xml index f8e3c6a..fbb66f2 100644 --- a/1.6/1.6/Defs/ThingDef_Races/ARA_RaceBaseSwarm.xml +++ b/1.6/1.6/Defs/ThingDef_Races/ARA_RaceBaseSwarm.xml @@ -79,7 +79,6 @@
  • Dig
  • ARA_Sowing
  • -
  • ARA_PlantCutting
  • @@ -103,25 +102,20 @@ DeathActionWorker_Vanish - -
  • Hauling
  • -
  • Mining
  • -
  • Construction
  • -
  • Crafting
  • -
  • Smithing
  • -
  • Tailoring
  • -
  • Cooking
  • -
  • Research
  • -
  • PlantCutting
  • -
  • Growing
  • -
  • Cleaning
  • -
  • Doctor
  • -
  • Firefighter
  • - - 10 -
  • +
  • + +
  • + Plants + 10 +
  • + + +
  • ARA_Sowing
  • +
    + true +
  • AnimalInsect
  • diff --git a/1.6/1.6/Defs/ThinkTreeDefs/ARA_ThinkTrees.xml b/1.6/1.6/Defs/ThinkTreeDefs/ARA_ThinkTrees.xml index fd0e1ae..a5101a2 100644 --- a/1.6/1.6/Defs/ThinkTreeDefs/ARA_ThinkTrees.xml +++ b/1.6/1.6/Defs/ThinkTreeDefs/ARA_ThinkTrees.xml @@ -324,44 +324,19 @@ - -
  • - ARA_Sowing - -
  • + +
  • + ARA_Sowing - -
  • + +
  • + + +
  • + +
  • - - - - -
  • - ARA_Sowing - -
  • - - -
  • - -
  • - - - - -
  • - ARA_PlantCutting - -
  • - - -
  • - -
  • - - diff --git a/1.6/1.6/Defs/TrainableDefs/ARA_PlantCutting.xml b/1.6/1.6/Defs/TrainableDefs/ARA_PlantCutting.xml deleted file mode 100644 index 9dcdf64..0000000 --- a/1.6/1.6/Defs/TrainableDefs/ARA_PlantCutting.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - ARA_PlantCutting - - 允许该生物执行植物割除任务。 - - true - - 3 - Advanced - - 1 - - 99 - - - \ No newline at end of file diff --git a/1.6/1.6/Defs/TrainableDefs/ARA_Sowing.xml b/1.6/1.6/Defs/TrainableDefs/ARA_Sowing.xml index 9c3fcde..ca09fab 100644 --- a/1.6/1.6/Defs/TrainableDefs/ARA_Sowing.xml +++ b/1.6/1.6/Defs/TrainableDefs/ARA_Sowing.xml @@ -3,8 +3,8 @@ ARA_Sowing - - 允许该生物执行播种任务。 + + 允许该生物执行种植任务。 true @@ -14,7 +14,7 @@ Advanced - 1 + 3 100 diff --git a/Source/ArachnaeSwarm/AnimalWorkSystemPatcher.cs b/Source/ArachnaeSwarm/AnimalWorkSystemPatcher.cs deleted file mode 100644 index 6efbef3..0000000 --- a/Source/ArachnaeSwarm/AnimalWorkSystemPatcher.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System.Collections.Generic; -using System.Reflection; -using HarmonyLib; -using RimWorld; -using Verse; - -namespace ArachnaeSwarm -{ - [StaticConstructorOnStartup] - public static class AnimalWorkSystemPatcher - { - static AnimalWorkSystemPatcher() - { - var harmony = new Harmony("com.yourname.animalworksystem"); - harmony.PatchAll(); - } - } - - [HarmonyPatch(typeof(Pawn_WorkSettings), "EnableAndInitialize")] - public static class Patch_Pawn_WorkSettings_EnableAndInitialize - { - public static void Postfix(Pawn_WorkSettings __instance, Pawn ___pawn) - { - // 检查是否是我们想要启用工作系统的动物,并且它不是机械体 - // 因为原版的 EnableAndInitialize 已经处理了机械体的工作设置 - if (___pawn.Faction != null && ___pawn.Faction.IsPlayer && - !___pawn.RaceProps.IsMechanoid && - ShouldEnableWorkSystem(___pawn)) - { - // 获取 CompProperties_WorkForNonMechs - CompProperties_WorkForNonMechs compProps = null; - if (___pawn.def.comps != null) - { - foreach (var comp in ___pawn.def.comps) - { - if (comp is CompProperties_WorkForNonMechs props) - { - compProps = props; - break; - } - } - } - - if (compProps != null && compProps.workTypes != null) - { - // 设置 CompProperties_WorkForNonMechs 中定义的工作类型优先级 - foreach (var workType in compProps.workTypes) - { - if (!__instance.WorkIsActive(workType) && !___pawn.WorkTypeIsDisabled(workType)) - { - __instance.SetPriority(workType, 3); // 默认优先级 - } - } - } - } - } - - private static bool ShouldEnableWorkSystem(Pawn pawn) - { - // 检查 ThingDef 中是否有 CompProperties_WorkForNonMechs 配置 - if (pawn.def.comps != null) - { - foreach (var compProperties in pawn.def.comps) - { - if (compProperties is CompProperties_WorkForNonMechs) - { - return true; - } - } - } - - return false; - } - } -} \ No newline at end of file diff --git a/Source/ArachnaeSwarm/ArachnaeSwarm.csproj b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj index 40d3856..fa0e51d 100644 --- a/Source/ArachnaeSwarm/ArachnaeSwarm.csproj +++ b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj @@ -86,26 +86,19 @@ - - - - + - - - - - - - - - + + + + + diff --git a/Source/ArachnaeSwarm/CompAdvancedTraining.cs b/Source/ArachnaeSwarm/CompAdvancedTraining.cs new file mode 100644 index 0000000..9a0b8c9 --- /dev/null +++ b/Source/ArachnaeSwarm/CompAdvancedTraining.cs @@ -0,0 +1,77 @@ +using System.Collections.Generic; +using Verse; +using RimWorld; + +namespace ArachnaeSwarm +{ + public class CompProperties_AdvancedTraining : CompProperties + { + // 1. 用于设置固定技能等级 + public List skillLevels = new List(); + + // 2. 用于指定生成时立即完成的训练 + public List instantTrainables = new List(); + + // 3. 全局开关:是否阻止所有技能衰减 + public bool disableAllSkillDecay = false; + + public CompProperties_AdvancedTraining() + { + this.compClass = typeof(CompAdvancedTraining); + } + } + + public class SkillLevelEntry + { + public SkillDef skill; + public int level = 0; + // 这里的 disableDecay 字段现在是冗余的,因为我们有全局的 disableAllSkillDecay + // 但为了兼容性或未来可能的需求,可以保留。 + // 在当前方案中,它的值将被忽略。 + public bool disableDecay = true; + } + + public class CompAdvancedTraining : ThingComp + { + public CompProperties_AdvancedTraining Props => (CompProperties_AdvancedTraining)this.props; + + public override void PostSpawnSetup(bool respawningAfterLoad) + { + base.PostSpawnSetup(respawningAfterLoad); + + Pawn pawn = this.parent as Pawn; + if (pawn == null) return; + + // --- 1. 设置固定技能等级 --- + if (pawn.skills != null && !Props.skillLevels.NullOrEmpty()) + { + foreach (var entry in Props.skillLevels) + { + if (entry.skill != null) + { + var skillRecord = pawn.skills.GetSkill(entry.skill); + if (skillRecord != null) + { + skillRecord.Level = entry.level; + // 注意: 激情 (passion) 影响学习速度,不直接阻止衰减。 + // 实际的衰减阻止逻辑在 TrainingSystem_Patcher.cs 中处理。 + // 默认情况下,我们不改变 passion,除非有特殊需求。 + } + } + } + } + + // --- 2. 执行瞬间训练 (只在初次生成时) --- + if (!respawningAfterLoad && pawn.training != null && !Props.instantTrainables.NullOrEmpty()) + { + foreach (var trainable in Props.instantTrainables) + { + if (trainable != null && !pawn.training.HasLearned(trainable)) + { + pawn.training.Train(trainable, null, complete: true); + } + } + } + } + } +} \ No newline at end of file diff --git a/Source/ArachnaeSwarm/CompAnimalWorkSettings.cs b/Source/ArachnaeSwarm/CompAnimalWorkSettings.cs deleted file mode 100644 index 6c462cc..0000000 --- a/Source/ArachnaeSwarm/CompAnimalWorkSettings.cs +++ /dev/null @@ -1,97 +0,0 @@ -using System.Collections.Generic; -using Verse; -using RimWorld; - -namespace ArachnaeSwarm -{ - public class CompProperties_AnimalWorkSettings : CompProperties - { - // 使用列表存储键值对,因为RimWorld的XML解析器对字典有特殊要求 - public List workTypeMap = new List(); - // 定义动物的技能等级 - public List skillLevels = new List(); - - public CompProperties_AnimalWorkSettings() - { - this.compClass = typeof(CompAnimalWorkSettings); - } - } - - // 定义键值对的结构 - public class WorkTypeMapEntry - { - public TrainableDef trainable; - public WorkTypeDef workType; - } - - // 定义技能和等级的结构 - public class SkillLevelEntry - { - public SkillDef skill; - public int level = 0; // 默认等级为0 - // 可选:是否阻止技能衰减 - public bool disableDecay = true; - } - - public class CompAnimalWorkSettings : ThingComp - { - public CompProperties_AnimalWorkSettings Props => (CompProperties_AnimalWorkSettings)this.props; - - public override void PostSpawnSetup(bool respawningAfterLoad) - { - base.PostSpawnSetup(respawningAfterLoad); - - Pawn pawn = this.parent as Pawn; - if (pawn == null) return; - - // 1. 确保 workSettings 存在 - if (pawn.workSettings == null) - { - pawn.workSettings = new Pawn_WorkSettings(pawn); - pawn.workSettings.EnableAndInitializeIfNotAlreadyInitialized(); - } - - // 2. 设置技能等级 (如果定义了) - if (pawn.skills != null && Props.skillLevels != null) - { - foreach (var entry in Props.skillLevels) - { - if (entry.skill != null) - { - var skillRecord = pawn.skills.GetSkill(entry.skill); - if (skillRecord != null) - { - // 设置技能等级 - skillRecord.Level = entry.level; - - // 可选:阻止技能衰减 - // 在新版本中,将激情设置为 None 可以阻止自然增长和衰减 - if (entry.disableDecay) - { - skillRecord.passion = Passion.None; - // 注意:仅设置 passion=None 可能不足以完全阻止衰减 - // 如果仍有问题,可能需要在 ThinkNode 或其他地方定期重置技能等级 - } - } - } - } - } - - // 3. 设置工作优先级 (如果定义了映射关系) - // 这里我们不检查 pawn.training.HasLearned,因为这个组件只负责提供"能力" - // 具体是否执行工作由 ThinkNode_Conditional 控制 - if (pawn.workSettings != null && Props.workTypeMap != null) - { - foreach (var entry in Props.workTypeMap) - { - if (entry.trainable != null && entry.workType != null) - { - // 为相关工作类型设置默认优先级 - // 实际是否执行由 ThinkNode_Conditional 的 GetWanted 控制 - pawn.workSettings.SetPriority(entry.workType, 3); - } - } - } - } - } -} diff --git a/Source/ArachnaeSwarm/CompInstantTrain.cs b/Source/ArachnaeSwarm/CompInstantTrain.cs deleted file mode 100644 index cfb504d..0000000 --- a/Source/ArachnaeSwarm/CompInstantTrain.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System.Collections.Generic; -using Verse; -using RimWorld; - -namespace ArachnaeSwarm -{ - public class CompInstantTrain : ThingComp - { - public CompProperties_InstantTrain Props => (CompProperties_InstantTrain)this.props; - - public override void PostSpawnSetup(bool respawningAfterLoad) - { - base.PostSpawnSetup(respawningAfterLoad); - - // 只在初次生成时执行,加载存档时不需要重新训练 - if (respawningAfterLoad) return; - - Pawn pawn = this.parent as Pawn; - if (pawn?.training == null) return; - - // 瞬间训练所有在 Props 中指定的技能 - foreach (var trainable in Props.trainables) - { - if (trainable != null && !pawn.training.HasLearned(trainable)) - { - // 注意:直接调用 Train 方法,它会内部处理 SetWanted 的逻辑 - // 原版的 SetWanted 方法可能已被移除或变为内部方法 - pawn.training.Train(trainable, null, true); // true表示瞬间完成 - } - } - - // CompInstantTrain 的职责到此结束 - // 工作优先级设置由 CompAnimalWorkSettings 负责 - } - } - - public class CompProperties_InstantTrain : CompProperties - { - public List trainables = new List(); - - public CompProperties_InstantTrain() - { - this.compClass = typeof(CompInstantTrain); - } - } -} diff --git a/Source/ArachnaeSwarm/CompNoTrainingDecay.cs b/Source/ArachnaeSwarm/CompNoTrainingDecay.cs deleted file mode 100644 index f612d2a..0000000 --- a/Source/ArachnaeSwarm/CompNoTrainingDecay.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Verse; - -namespace ArachnaeSwarm -{ - // 这是一个“标记”组件。它的唯一目的就是在 XML 中被添加到 ThingDef, - // 以便我们的 Harmony 补丁可以识别哪些 Pawn 的训练不应该衰减。 - // 它本身不需要任何逻辑。 - public class CompProperties_NoTrainingDecay : CompProperties - { - public CompProperties_NoTrainingDecay() - { - this.compClass = typeof(ThingComp); // 我们可以使用一个通用的、空的 ThingComp - } - } -} \ No newline at end of file diff --git a/Source/ArachnaeSwarm/CompWorkForNonMechs.cs b/Source/ArachnaeSwarm/CompWorkForNonMechs.cs deleted file mode 100644 index 3f5b471..0000000 --- a/Source/ArachnaeSwarm/CompWorkForNonMechs.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System.Collections.Generic; -using RimWorld; -using Verse; - -namespace ArachnaeSwarm -{ - public class CompProperties_WorkForNonMechs : CompProperties - { - public List workTypes; - - public CompProperties_WorkForNonMechs() - { - compClass = typeof(CompWorkForNonMechs); - } - } - - public class CompWorkForNonMechs : ThingComp - { - public CompProperties_WorkForNonMechs Props => (CompProperties_WorkForNonMechs)props; - - public override void PostSpawnSetup(bool respawningAfterLoad) - { - base.PostSpawnSetup(respawningAfterLoad); - - var pawn = parent as Pawn; - if (pawn == null || pawn.Faction == null || !pawn.Faction.IsPlayer) return; - - // 确保 workSettings 实例存在 - if (pawn.workSettings == null) - { - pawn.workSettings = new Pawn_WorkSettings(pawn); - } - - pawn.workSettings.EnableAndInitialize(); - } - } -} \ No newline at end of file diff --git a/Source/ArachnaeSwarm/JobGiver_Grower.cs b/Source/ArachnaeSwarm/JobGiver_Grower.cs new file mode 100644 index 0000000..2c10f81 --- /dev/null +++ b/Source/ArachnaeSwarm/JobGiver_Grower.cs @@ -0,0 +1,99 @@ +using System.Collections.Generic; +using Verse; +using Verse.AI; +using RimWorld; + +namespace ArachnaeSwarm +{ + // 确保 WorkGiverDefOf 被正确初始化 + [DefOf] + public static class WorkGiverDefOf + { + public static WorkGiverDef Harvest; + public static WorkGiverDef GrowerSow; + + static WorkGiverDefOf() + { + DefOfHelper.EnsureInitializedInCtor(typeof(WorkGiverDefOf)); + } + } + + public class JobGiver_Grower : ThinkNode_JobGiver + { + private static WorkGiver_GrowerHarvest _workGiverHarvest; + private static WorkGiver_GrowerSow _workGiverSow; + + static JobGiver_Grower() + { + // 确保在访问 WorkGiverDefOf 之前,它已经被初始化 + // 尽管 [DefOf] 会自动处理,但显式调用可以避免某些加载时序问题 + DefOfHelper.EnsureInitializedInCtor(typeof(WorkGiverDefOf)); + _workGiverHarvest = WorkGiverDefOf.Harvest.Worker as WorkGiver_GrowerHarvest; + _workGiverSow = WorkGiverDefOf.GrowerSow.Worker as WorkGiver_GrowerSow; + } + + protected override Job TryGiveJob(Pawn pawn) + { + if (_workGiverHarvest == null || _workGiverSow == null) + { + Log.ErrorOnce("JobGiver_Grower could not find vanilla Grower WorkGivers.", 123457); + return null; + } + + // 1. 优先收获 + Thing bestHarvestable = FindClosestThing(pawn, _workGiverHarvest); + if (bestHarvestable != null) + { + return _workGiverHarvest.JobOnThing(pawn, bestHarvestable); + } + + // 2. 其次播种 + IntVec3 bestSowCell = FindClosestSowableCell(pawn, _workGiverSow); + if (bestSowCell.IsValid) + { + return _workGiverSow.JobOnCell(pawn, bestSowCell); + } + + return null; + } + + private Thing FindClosestThing(Pawn pawn, WorkGiver_Scanner scanner) + { + return GenClosest.ClosestThingReachable( + pawn.Position, + pawn.Map, + scanner.PotentialWorkThingRequest, + PathEndMode.Touch, + TraverseParms.For(pawn), + 9999f, + t => scanner.HasJobOnThing(pawn, t) + ); + } + + private IntVec3 FindClosestSowableCell(Pawn pawn, WorkGiver_Scanner scanner) + { + 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)) + { + if (scanner.HasJobOnCell(pawn, cell)) + { + bestDistSq = distSq; + bestCell = cell; + } + } + } + } + } + return bestCell; + } + } +} \ No newline at end of file diff --git a/Source/ArachnaeSwarm/JobGiver_PlantCutting.cs b/Source/ArachnaeSwarm/JobGiver_PlantCutting.cs deleted file mode 100644 index 4ea44c1..0000000 --- a/Source/ArachnaeSwarm/JobGiver_PlantCutting.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System.Collections.Generic; -using Verse; -using Verse.AI; -using RimWorld; - -namespace ArachnaeSwarm -{ - public class JobGiver_PlantCutting : ThinkNode_JobGiver - { - private WorkGiverDef cutWorkGiverDef = null; - private bool triedToLoad = false; - - protected override Job TryGiveJob(Pawn pawn) - { - if (!triedToLoad || cutWorkGiverDef == null) - { - triedToLoad = true; - cutWorkGiverDef = DefDatabase.GetNamed("PlantsCut", false); - if (cutWorkGiverDef == null) - { - Log.ErrorOnce("[ArachnaeSwarm] Could not find WorkGiverDef named 'PlantsCut'. Plant Cutting will not work.", 847595); - return null; - } - } - - if (cutWorkGiverDef?.Worker is WorkGiver_Scanner workGiver) - { - // ... (你的逻辑,调用 workGiver 的方法) ... - IEnumerable potentialPlants = workGiver.PotentialWorkThingsGlobal(pawn); - // ... (后续逻辑,确保都用 workGiver 实例) ... - if (!workGiver.ShouldSkip(pawn) && workGiver.MissingRequiredCapacity(pawn) == null) - { - return workGiver.NonScanJob(pawn); - } - // ... - } - else - { - Log.Warning($"[ArachnaeSwarm] WorkGiverDef 'PlantsCut' Worker is not a WorkGiver_Scanner for pawn {pawn?.LabelShort ?? "NULL"}."); - } - - return null; - } - - // ... (Validator 方法也需要修改) ... - private static bool Validator(Pawn pawn, WorkGiver_Scanner workGiver, Thing t) - { - if (t.IsForbidden(pawn)) - { - return false; - } - // if (workGiver.ShouldSkip(pawn)) { return false; } // 这个检查可以保留或去掉 - return workGiver.JobOnThing(pawn, t) != null; // 使用传入的实例 - } - } -} diff --git a/Source/ArachnaeSwarm/JobGiver_PlantHarvest.cs b/Source/ArachnaeSwarm/JobGiver_PlantHarvest.cs deleted file mode 100644 index 13563fe..0000000 --- a/Source/ArachnaeSwarm/JobGiver_PlantHarvest.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System.Collections.Generic; -using Verse; -using Verse.AI; -using RimWorld; - -namespace ArachnaeSwarm -{ - public class JobGiver_PlantHarvest : ThinkNode_JobGiver - { - // 声明变量,但不立即初始化 - private WorkGiverDef harvestWorkGiverDef = null; - // 用一个标志位确保只尝试加载一次 - private bool triedToLoad = false; - - protected override Job TryGiveJob(Pawn pawn) - { - // 如果还没尝试加载,或者之前加载失败了 - if (!triedToLoad || harvestWorkGiverDef == null) - { - triedToLoad = true; // 标记为已尝试 - // 在需要时才查找 Def - harvestWorkGiverDef = DefDatabase.GetNamed("GrowerHarvest", false); - if (harvestWorkGiverDef == null) - { - // 这个 Log 可以保留,方便调试 - Log.ErrorOnce("[ArachnaeSwarm] Could not find WorkGiverDef named 'GrowerHarvest'. Harvesting will not work.", 847593); - return null; // 找不到就直接返回 - } - } - - // 现在可以安全地使用 harvestWorkGiverDef 了 - if (harvestWorkGiverDef?.Worker is WorkGiver_Scanner workGiver) - { - // ... (你原来的逻辑) ... - IEnumerable potentialPlants = workGiver.PotentialWorkThingsGlobal(pawn); - // ... (后续逻辑) ... - // 确保调用的是 workGiver (已解析的实例) - if (!workGiver.ShouldSkip(pawn) && workGiver.MissingRequiredCapacity(pawn) == null) - { - return workGiver.NonScanJob(pawn); - } - // ... 其他逻辑 ... - } - else - { - Log.Warning($"[ArachnaeSwarm] WorkGiverDef 'GrowerHarvest' Worker is not a WorkGiver_Scanner for pawn {pawn?.LabelShort ?? "NULL"}."); - } - - return null; - } - - // ... (Validator 方法也需要确保使用传入的 workGiver 实例) ... - private static bool HarvestValidator(Pawn pawn, WorkGiver_Scanner workGiver, Thing t) - { - if (t.IsForbidden(pawn)) - { - return false; - } - // 使用传入的已解析实例 - return workGiver.JobOnThing(pawn, t) != null; - } - } -} diff --git a/Source/ArachnaeSwarm/JobGiver_PlantSow.cs b/Source/ArachnaeSwarm/JobGiver_PlantSow.cs deleted file mode 100644 index 5994d2b..0000000 --- a/Source/ArachnaeSwarm/JobGiver_PlantSow.cs +++ /dev/null @@ -1,41 +0,0 @@ -using Verse; -using Verse.AI; -using RimWorld; - -namespace ArachnaeSwarm -{ - public class JobGiver_PlantSow : ThinkNode_JobGiver - { - private WorkGiverDef sowWorkGiverDef = null; - private bool triedToLoad = false; - - protected override Job TryGiveJob(Pawn pawn) - { - if (!triedToLoad || sowWorkGiverDef == null) - { - triedToLoad = true; - sowWorkGiverDef = DefDatabase.GetNamed("GrowerSow", false); - if (sowWorkGiverDef == null) - { - Log.ErrorOnce("[ArachnaeSwarm] Could not find WorkGiverDef named 'GrowerSow'. Sowing will not work.", 847594); - return null; - } - } - - if (sowWorkGiverDef?.Worker is WorkGiver_Scanner sowerScanner) // 直接用 Scanner 接口 - { - // ... (你的逻辑,调用 sowerScanner 的方法) ... - if (!sowerScanner.ShouldSkip(pawn) && sowerScanner.MissingRequiredCapacity(pawn) == null) - { - return sowerScanner.NonScanJob(pawn); // 使用 Scanner 接口 - } - } - else - { - Log.Warning($"[ArachnaeSwarm] WorkGiverDef 'GrowerSow' Worker is not a WorkGiver_Scanner for pawn {pawn?.LabelShort ?? "NULL"}."); - } - - return null; - } - } -} diff --git a/Source/ArachnaeSwarm/Patch_QualityUtility.cs b/Source/ArachnaeSwarm/Patch_QualityUtility.cs deleted file mode 100644 index dfa742e..0000000 --- a/Source/ArachnaeSwarm/Patch_QualityUtility.cs +++ /dev/null @@ -1,62 +0,0 @@ -using HarmonyLib; -using RimWorld; -using Verse; -using System.Reflection; // For MethodInfo - -namespace ArachnaeSwarm -{ - [StaticConstructorOnStartup] - public static class QualityUtilityPatch - { - static QualityUtilityPatch() - { - var harmony = new Harmony("com.yourname.qualityutilitypatch"); - harmony.Patch( - original: AccessTools.Method(typeof(QualityUtility), nameof(QualityUtility.GenerateQualityCreatedByPawn), new[] { typeof(Pawn), typeof(SkillDef), typeof(bool) }), - prefix: new HarmonyMethod(typeof(QualityUtilityPatch), nameof(GenerateQualityCreatedByPawn_Prefix)) - ); - } - - public static bool GenerateQualityCreatedByPawn_Prefix(Pawn pawn, SkillDef relevantSkill, bool consumeInspiration, ref QualityCategory __result) - { - // 检查当前 Pawn 是否是我们的自定义动物(通过检查其 ThingDef 是否拥有 CompProperties_WorkForNonMechs) - if (pawn != null && pawn.def.comps != null && ShouldEnableWorkSystem(pawn)) - { - // 如果是,强制使用 mechFixedSkillLevel - int relevantSkillLevel = pawn.RaceProps.mechFixedSkillLevel; - bool inspired = consumeInspiration && pawn.InspirationDef == InspirationDefOf.Inspired_Creativity; - - // 调用 QualityUtility.GenerateQualityCreatedByPawn 的 int 重载 - __result = QualityUtility.GenerateQualityCreatedByPawn(relevantSkillLevel, inspired); - - // 消耗灵感(如果适用) - if (inspired) - { - pawn.mindState.inspirationHandler.EndInspiration(InspirationDefOf.Inspired_Creativity); - } - - // 返回 false,跳过原版方法执行 - return false; - } - - // 返回 true,执行原版方法 - return true; - } - - private static bool ShouldEnableWorkSystem(Pawn pawn) - { - // 检查 ThingDef 中是否有 CompProperties_WorkForNonMechs 配置 - if (pawn.def.comps != null) - { - foreach (var compProperties in pawn.def.comps) - { - if (compProperties is CompProperties_WorkForNonMechs) - { - return true; - } - } - } - return false; - } - } -} \ No newline at end of file diff --git a/Source/ArachnaeSwarm/Patch_TrainingTracker_TickRare.cs b/Source/ArachnaeSwarm/Patch_TrainingTracker_TickRare.cs deleted file mode 100644 index e4fa9ac..0000000 --- a/Source/ArachnaeSwarm/Patch_TrainingTracker_TickRare.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Verse; -using HarmonyLib; -using RimWorld; - -namespace ArachnaeSwarm -{ - [HarmonyPatch(typeof(Pawn_TrainingTracker), "TrainingTrackerTickRare")] - public static class Patch_TrainingTracker_TickRare - { - // [HarmonyPrefix] 表示这是一个“前缀”补丁,在原方法执行前运行 - // 它返回一个 bool 值: - // - return true: 继续执行原方法 (TrainingTrackerTickRare) - // - return false: 阻止执行原方法,直接跳过 - [HarmonyPrefix] - public static bool PreventDecayForSpecialAnimals(Pawn_TrainingTracker __instance) - { - // __instance 是原方法的实例对象,我们可以通过它访问 pawn - Pawn pawn = __instance.pawn; - - // 检查 Pawn 的 ThingDef 是否有我们的“标记”组件 - if (pawn.def.HasComp(typeof(CompProperties_NoTrainingDecay))) - { - // 如果有,则这是一个不应衰减训练度的特殊动物,返回 false 阻止原方法执行 - return false; - } - - // 如果没有,则这是一个普通动物,返回 true 让原版的衰减逻辑正常执行 - return true; - } - } -} \ No newline at end of file diff --git a/Source/ArachnaeSwarm/Patch_WorkGivers_Growing.cs b/Source/ArachnaeSwarm/Patch_WorkGivers_Growing.cs deleted file mode 100644 index 4a416ee..0000000 --- a/Source/ArachnaeSwarm/Patch_WorkGivers_Growing.cs +++ /dev/null @@ -1,96 +0,0 @@ -using HarmonyLib; -using RimWorld; -using Verse; -using Verse.AI; -using System.Reflection; - -namespace ArachnaeSwarm -{ - [StaticConstructorOnStartup] - public static class Patch_WorkGivers_Growing - { - static Patch_WorkGivers_Growing() - { - var harmony = new Harmony("com.yourname.workgiversgrowingpatch"); - - // Patch WorkGiver_GrowerSow.JobOnCell - harmony.Patch( - original: AccessTools.Method(typeof(WorkGiver_GrowerSow), nameof(WorkGiver_GrowerSow.JobOnCell)), - prefix: new HarmonyMethod(typeof(Patch_WorkGivers_Growing), nameof(JobOnCell_GrowerSow_Prefix)) - ); - - // Patch JobDriver_Deconstruct.TickActionInterval - harmony.Patch( - original: AccessTools.Method(typeof(JobDriver_Deconstruct), "TickActionInterval"), - prefix: new HarmonyMethod(typeof(Patch_WorkGivers_Growing), nameof(TickActionInterval_Deconstruct_Prefix)) - ); - } - - public static bool JobOnCell_GrowerSow_Prefix(Pawn pawn, IntVec3 c, ref Job __result, WorkGiver_GrowerSow __instance) - { - // 检查是否是我们的自定义动物,并且它不是真正的机械体 (因为真正的机械体原版会处理) - if (ShouldEnableWorkSystem(pawn) && !pawn.RaceProps.IsMechanoid) - { - // 使用反射获取 WorkGiver_GrowerSow 实例的 wantedPlantDef 字段 - ThingDef wantedPlantDef = (ThingDef)AccessTools.Field(typeof(WorkGiver_Grower), "wantedPlantDef").GetValue(__instance); - - if (wantedPlantDef == null) - { - __result = null; - return false; // 跳过原版方法 - } - - // 强制使用 mechFixedSkillLevel 作为相关技能等级 - int relevantSkillLevel = pawn.RaceProps.mechFixedSkillLevel; - - // 然后进行原始的 sowMinSkill 检查 - if (wantedPlantDef.plant.sowMinSkill > relevantSkillLevel) - { - __result = null; // 技能不足,不生成 Job - return false; // 跳过原版方法 - } - - // 如果技能足够,让原版方法继续执行,处理其他复杂的检查 - // 注意:这里我们只处理了技能检查部分,其他逻辑仍然依赖原版方法。 - // 如果原版方法在其他地方再次访问 pawn.skills,仍然可能出错。 - // 但这是最直接的修复方法,避免了完全复制整个原始方法。 - } - - return true; // 执行原版方法 - } - - public static bool TickActionInterval_Deconstruct_Prefix(JobDriver_Deconstruct __instance, Pawn ___pawn, int delta) - { - // 检查是否是我们的自定义动物,并且它不是真正的机械体 - if (ShouldEnableWorkSystem(___pawn) && !___pawn.RaceProps.IsMechanoid) - { - // 模拟技能学习,避免访问 pawn.skills 导致 NullReferenceException - // 这里我们不实际增加经验值,只是模拟原版方法的行为 - // 避免了对 pawn.skills 的访问 - if (__instance.Building.def.CostListAdjusted(__instance.Building.Stuff).Count > 0) - { - // 可以选择在这里添加一些日志,以便调试 - // Log.Message($"Animal {___pawn.LabelShort} is deconstructing, simulating skill gain."); - } - return false; // 跳过原版方法 - } - return true; // 执行原版方法 - } - - private static bool ShouldEnableWorkSystem(Pawn pawn) - { - // 检查 ThingDef 中是否有 CompProperties_WorkForNonMechs 配置 - if (pawn.def.comps != null) - { - foreach (var compProperties in pawn.def.comps) - { - if (compProperties is CompProperties_WorkForNonMechs) - { - return true; - } - } - } - return false; - } - } -} \ No newline at end of file diff --git a/Source/ArachnaeSwarm/ThinkNode_ConditionalAnimalShouldDoGrowingWork.cs b/Source/ArachnaeSwarm/ThinkNode_ConditionalAnimalShouldDoGrowingWork.cs new file mode 100644 index 0000000..3170615 --- /dev/null +++ b/Source/ArachnaeSwarm/ThinkNode_ConditionalAnimalShouldDoGrowingWork.cs @@ -0,0 +1,43 @@ +using Verse; +using Verse.AI; +using RimWorld; + +namespace ArachnaeSwarm +{ + // 将 DefOf 类放在这里,以便在命名空间内共享 + [DefOf] + public static class ARA_TrainableDefOf + { + public static TrainableDef ARA_Sowing; + public static TrainableDef ARA_PlantCutting; + + static ARA_TrainableDefOf() + { + DefOfHelper.EnsureInitializedInCtor(typeof(ARA_TrainableDefOf)); + } + } + + // 这个新的条件节点将检查动物是否应该执行任何农业工作(播种或切割/收获) + public class ThinkNode_ConditionalAnimalShouldDoGrowingWork : ThinkNode_Conditional + { + protected override bool Satisfied(Pawn pawn) + { + // 首先,进行安全检查,确保 pawn.training 存在 + if (pawn.training == null) + { + return false; + } + + // 检查动物是否学会并被允许执行“播种”工作 + bool canSow = pawn.training.HasLearned(ARA_TrainableDefOf.ARA_Sowing) && + pawn.training.GetWanted(ARA_TrainableDefOf.ARA_Sowing); + + // 检查动物是否学会并被允许执行“植物切割”工作 + bool canCut = pawn.training.HasLearned(ARA_TrainableDefOf.ARA_PlantCutting) && + pawn.training.GetWanted(ARA_TrainableDefOf.ARA_PlantCutting); + + // 只要满足其中任何一个条件,就返回 true + return canSow || canCut; + } + } +} \ No newline at end of file diff --git a/Source/ArachnaeSwarm/ThinkNode_ConditionalAnimalShouldPlantCut.cs b/Source/ArachnaeSwarm/ThinkNode_ConditionalAnimalShouldPlantCut.cs deleted file mode 100644 index 4489b91..0000000 --- a/Source/ArachnaeSwarm/ThinkNode_ConditionalAnimalShouldPlantCut.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Verse; -using Verse.AI; -using RimWorld; - -namespace ArachnaeSwarm -{ - public class ThinkNode_ConditionalAnimalShouldPlantCut : ThinkNode_Conditional - { - protected override bool Satisfied(Pawn pawn) - { - if (pawn.training == null) - { - return false; - } - - // 使用我们之前创建的静态 DefOf 类来安全地引用 Def - return pawn.training.HasLearned(ARA_TrainableDefOf.ARA_PlantCutting) && - pawn.training.GetWanted(ARA_TrainableDefOf.ARA_PlantCutting); - } - } -} \ No newline at end of file diff --git a/Source/ArachnaeSwarm/ThinkNode_ConditionalAnimalShouldSow.cs b/Source/ArachnaeSwarm/ThinkNode_ConditionalAnimalShouldSow.cs deleted file mode 100644 index da6319c..0000000 --- a/Source/ArachnaeSwarm/ThinkNode_ConditionalAnimalShouldSow.cs +++ /dev/null @@ -1,37 +0,0 @@ -using Verse; -using Verse.AI; -using RimWorld; - -namespace ArachnaeSwarm -{ - // 使用 [DefOf] 属性,让游戏在启动时自动为我们填充这些字段 - [DefOf] - public static class ARA_TrainableDefOf - { - // 确保这些字段名与你在 XML 中定义的 defName 完全一致 - public static TrainableDef ARA_Sowing; - public static TrainableDef ARA_PlantCutting; - - // 静态构造函数,确保 DefOf 被初始化 - static ARA_TrainableDefOf() - { - DefOfHelper.EnsureInitializedInCtor(typeof(ARA_TrainableDefOf)); - } - } - - public class ThinkNode_ConditionalAnimalShouldSow : ThinkNode_Conditional - { - protected override bool Satisfied(Pawn pawn) - { - // MCP 已证实:对于野生动物等情况,pawn.training 可能为 null,此检查是必要的。 - if (pawn.training == null) - { - return false; - } - - // 使用静态缓存的 Def,检查动物是否学会了该技能,并且玩家是否在“动物”标签页中勾选了允许 - return pawn.training.HasLearned(ARA_TrainableDefOf.ARA_Sowing) && - pawn.training.GetWanted(ARA_TrainableDefOf.ARA_Sowing); - } - } -} \ No newline at end of file diff --git a/Source/ArachnaeSwarm/TrainingSystem_Patcher.cs b/Source/ArachnaeSwarm/TrainingSystem_Patcher.cs new file mode 100644 index 0000000..6383318 --- /dev/null +++ b/Source/ArachnaeSwarm/TrainingSystem_Patcher.cs @@ -0,0 +1,48 @@ +using HarmonyLib; +using RimWorld; +using Verse; + +namespace ArachnaeSwarm +{ + // Patcher 1: 阻止训练退化 + [HarmonyPatch(typeof(Pawn_TrainingTracker), "TrainingTrackerTickRare")] + public static class Patch_TrainingTracker_TickRare + { + public static bool Prefix(Pawn_TrainingTracker __instance) + { + Pawn pawn = Traverse.Create(__instance).Field("pawn").GetValue(); + if (pawn == null) return true; + + var comp = pawn.GetComp(); + if (comp != null && comp.Props.disableAllSkillDecay) + { + return false; // 阻止原版方法运行 + } + return true; + } + } + + // Patcher 2: 阻止特定技能的衰减 + [HarmonyPatch(typeof(SkillRecord), "Interval")] + public static class Patch_SkillRecord_Interval + { + // 使用 __instance 来获取 SkillRecord 对象, __pawn 为 SkillRecord 内部的私有字段 + public static bool Prefix(SkillRecord __instance, Pawn ___pawn) + { + if (___pawn == null) return true; + + var comp = ___pawn.GetComp(); + if (comp == null || comp.Props.skillLevels.NullOrEmpty()) + { + return true; // 没有组件或配置,正常执行原版衰减 + } + + // 检查全局开关:如果设置了 disableAllSkillDecay 为 true,则阻止衰减 + if (comp.Props.disableAllSkillDecay) + { + return false; // 阻止原版 Interval 方法的执行 + } + return true; // 正常执行原版衰减 + } + } +} \ No newline at end of file diff --git a/Source/ArachnaeSwarm/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs b/Source/ArachnaeSwarm/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs deleted file mode 100644 index 15efebf..0000000 --- a/Source/ArachnaeSwarm/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs +++ /dev/null @@ -1,4 +0,0 @@ -// -using System; -using System.Reflection; -[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] diff --git a/Source/ArachnaeSwarm/obj/Debug/ArachnaeSwarm.csproj.AssemblyReference.cache b/Source/ArachnaeSwarm/obj/Debug/ArachnaeSwarm.csproj.AssemblyReference.cache deleted file mode 100644 index 33b62db7d9822e26b0067feb5749542eb9e34e35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50550 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