This commit is contained in:
2025-09-02 17:52:41 +08:00
parent 9acd5aac1e
commit b21de9de91
8 changed files with 514 additions and 42 deletions

View File

@@ -96,6 +96,8 @@
<Compile Include="CompNoTrainingDecay.cs" />
<Compile Include="ThinkNode_ConditionalAnimalShouldSow.cs" />
<Compile Include="ThinkNode_ConditionalAnimalShouldPlantCut.cs" />
<Compile Include="CompProperties_AnimalWorkSettings.cs" />
<Compile Include="CompAnimalWorkSettings.cs" />
</ItemGroup>
<ItemGroup>
<Compile Include="WULA_AutoMechCarrier\CompAutoMechCarrier.cs" />

View File

@@ -0,0 +1,49 @@
using System.Collections.Generic;
using Verse;
using RimWorld;
namespace ArachnaeSwarm
{
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;
// 关键:如果 pawn 没有 workSettings则为其创建一个
if (pawn.workSettings == null)
{
// Log.Message($"Initializing Pawn_WorkSettings for animal: {pawn.LabelShort}");
pawn.workSettings = new Pawn_WorkSettings(pawn);
pawn.workSettings.EnableAndInitializeIfNotAlreadyInitialized();
// 注意Pawn_WorkSettings 的构造函数和 EnableAndInitializeIfNotAlreadyInitialized()
// 通常会处理所有可用的 WorkTypeDef并将它们的优先级初始化为 0。
// 这正是我们想要的初始状态。具体的优先级将由其他逻辑(如你的 CompInstantTrain 或 ThinkNode来设置。
}
// 设置工作优先级
if (pawn.workSettings != null)
{
foreach (var entry in Props.workTypeMap)
{
TrainableDef trainable = entry.trainable;
WorkTypeDef workType = entry.workType;
// 检查动物是否学会了对应的 Trainable
if (pawn.training != null && pawn.training.HasLearned(trainable))
{
// 设置一个默认的非零优先级,例如 3 (Medium)
// 真正的"开关"由 ThinkNode_Conditional 的 GetWanted 控制
pawn.workSettings.SetPriority(workType, 3);
}
}
}
}
}
}

View File

@@ -4,7 +4,6 @@ using RimWorld;
namespace ArachnaeSwarm
{
// 定义在 XML 中使用的属性
public class CompProperties_InstantTrain : CompProperties
{
public List<TrainableDef> trainables = new List<TrainableDef>();
@@ -15,19 +14,15 @@ namespace ArachnaeSwarm
}
}
// 实现组件的逻辑
public class CompInstantTrain : ThingComp
{
// 方便地访问属性
public CompProperties_InstantTrain Props => (CompProperties_InstantTrain)this.props;
// 在 Pawn 生成到地图上后被调用
public override void PostSpawnSetup(bool respawningAfterLoad)
{
base.PostSpawnSetup(respawningAfterLoad);
// 如果不是在加载存档时重生,则执行训练逻辑
if (!respawningAfterLoad)
if (!respawningAfterLoad) // 只在初次生成时执行
{
Pawn pawn = this.parent as Pawn;
if (pawn == null || pawn.training == null)
@@ -35,13 +30,11 @@ namespace ArachnaeSwarm
return;
}
// 遍历在 XML 中定义的需要训练技能列表
// 瞬间训练技能
foreach (TrainableDef trainableDef in Props.trainables)
{
// 检查 Pawn 是否还未学会此技能
if (!pawn.training.HasLearned(trainableDef))
{
// 调用原版方法,瞬间完成训练
pawn.training.Train(trainableDef, null, true);
}
}

View File

@@ -0,0 +1,25 @@
using System.Collections.Generic;
using Verse;
using RimWorld;
namespace ArachnaeSwarm
{
public class CompProperties_AnimalWorkSettings : CompProperties
{
// 使用列表存储键值对因为RimWorld的XML解析器对字典有特殊要求
public List<WorkTypeMapEntry> workTypeMap = new List<WorkTypeMapEntry>();
// 可以在这里添加一些配置选项,比如默认优先级等,但现在简单起见,可以留空或只做基本初始化
public CompProperties_AnimalWorkSettings()
{
this.compClass = typeof(CompAnimalWorkSettings);
}
}
// 定义键值对的结构
public class WorkTypeMapEntry
{
public TrainableDef trainable;
public WorkTypeDef workType;
}
}