This commit is contained in:
2025-09-02 12:21:49 +08:00
parent 06b0a74cbd
commit 61a7013946
12 changed files with 657 additions and 9 deletions

Binary file not shown.

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<Defs>
<![CDATA[
<DutyDef>
<defName>ARA_DefendAndExpandHive</defName>
<thinkNode Class="ThinkNode_Priority">
<subNodes>
<li Class="JobGiver_HiveDefense">
<needLOSToAcquireNonPawnTargets>true</needLOSToAcquireNonPawnTargets>
<targetAcquireRadius>30</targetAcquireRadius>
<chaseTarget>false</chaseTarget>
</li>
<li Class="ThinkNode_ChancePerHour_Constant">
<mtbHours>2.5</mtbHours>
<subNodes>
<li Class="ArachnaeSwarm.JobGiver_MaintainBuildings">
<maintainableThingDefs>
<li>ARA_InteractiveEggSac</li> <!-- 默认维护Hive -->
</maintainableThingDefs>
</li>
</subNodes>
</li>
<li Class="ArachnaeSwarm.JobGiver_MaintainBuildings">
<maintainableThingDefs>
<li>ARA_InteractiveEggSac</li> <!-- 默认维护Hive -->
</maintainableThingDefs>
<onlyIfDamagingState>true</onlyIfDamagingState>
</li>
<li Class="ThinkNode_ConditionalBodySize">
<min>0.7</min>
<subNodes>
<li Class="ThinkNode_ConditionalHiveCanReproduce">
<subNodes>
<li Class="ThinkNode_ChancePerHour_InsectDigChance">
<subNodes>
<li Class="JobGiver_MineRandom" />
</subNodes>
</li>
</subNodes>
</li>
</subNodes>
</li>
<li Class="ThinkNode_Tagger">
<tagToGive>SatisfyingNeeds</tagToGive>
<subNodes>
<li Class="ThinkNode_PrioritySorter">
<subNodes>
<li Class="JobGiver_GetFood" />
<li Class="JobGiver_GetRest" />
</subNodes>
</li>
</subNodes>
</li>
<li Class="JobGiver_WanderHive">
<maxDanger>Deadly</maxDanger>
</li>
</subNodes>
</thinkNode>
</DutyDef>
]]>
</Defs>

View File

@@ -4,7 +4,7 @@
<JobDef>
<defName>ARA_IncubateJob</defName>
<driverClass>ArachnaeSwarm.JobDriver_Incubate</driverClass>
<reportString>incubating TargetA.</reportString>
<reportString> TargetA 注入信息素.</reportString>
</JobDef>
</Defs>

View File

@@ -376,7 +376,7 @@
<race>
<!-- <fleshType>WULA_Fleshtype</fleshType> -->
<!-- AI行为勿改 -->
<thinkTreeMain>Humanlike</thinkTreeMain>
<thinkTreeMain>ARA_Humanlike</thinkTreeMain>
<!-- 智力水平 -->
<intelligence>Humanlike</intelligence>
<!-- 血液,不流血 -->

View File

@@ -599,7 +599,7 @@
<body>ArachnaeQueen_Body</body>
<fleshType>Normal</fleshType>
<!-- AI行为勿改 -->
<thinkTreeMain>Humanlike</thinkTreeMain>
<thinkTreeMain>ARA_Humanlike</thinkTreeMain>
<!-- 智力水平 -->
<intelligence>Humanlike</intelligence>
<!-- 肉和皮革的定义 -->

View File

@@ -3,8 +3,8 @@
<ThingDef ParentName="BuildingNaturalBase">
<defName>ARA_InteractiveEggSac</defName>
<label>阿拉克涅虫卵囊-休眠中</label>
<description>一个脆弱、易燃、黏滑的囊状物,,是阿拉克涅女皇种所诞之卵,内含哺育一只新督虫所需的营养和遗传物质——可以通过阿拉克涅女皇种的交互完成激活进程。</description>
<thingClass>ArachnaeSwarm.Building_Incubator</thingClass>
<description>一个脆弱、易燃、黏滑的囊状物,是阿拉克涅女皇种所诞之卵,内含哺育一只新督虫所需的营养和遗传物质——可以通过阿拉克涅女皇种的交互完成激活进程。</description>
<thingClass>Building</thingClass>
<category>Building</category>
<size>(1,1)</size>
<minifiedDef>MinifiedThing</minifiedDef>
@@ -53,9 +53,31 @@
<whitelist>
<li>ARA_ArachnaeQueen</li>
</whitelist>
<delay>300</delay> <!-- 5 seconds -->
<pawnKindDelays>
<li>
<pawnKind>Megascarab</pawnKind>
<delay>3000</delay>
</li>
<li>
<pawnKind>Spelopede</pawnKind>
<delay>3000</delay>
</li>
<li>
<pawnKind>Megaspider</pawnKind>
<delay>3000</delay>
</li>
<li>
<pawnKind>ArachnaeNode_Race_Myrmecocystus</pawnKind>
<delay>300</delay>
</li>
</pawnKindDelays>
<destroyOnSpawn>true</destroyOnSpawn>
</li>
<li Class="CompProperties_Maintainable">
<ticksHealthy>60000</ticksHealthy>
<ticksNeedsMaintenance>60000</ticksNeedsMaintenance>
<damagePerTickRare>10</damagePerTickRare>
</li>
<li Class="CompProperties_SpawnEffecterOnDestroy">
<effect>CocoonDestroyed</effect>
</li>

View File

@@ -0,0 +1,501 @@
<?xml version="1.0" encoding="utf-8"?>
<Defs>
<ThinkTreeDef>
<defName>ARA_Humanlike</defName> <!-- 更改defName以避免与原版Humanlike冲突 -->
<thinkRoot Class="ThinkNode_Priority">
<subNodes>
<!-- Do lovin' -->
<li Class="ThinkNode_ConditionalLyingDown">
<subNodes>
<li Class="ThinkNode_ChancePerHour_Lovin">
<subNodes>
<li Class="ThinkNode_Tagger">
<tagToGive>SatisfyingNeeds</tagToGive>
<subNodes>
<li Class="JobGiver_DoLovin" />
</subNodes>
</li>
</subNodes>
</li>
</subNodes>
</li>
<!-- If we HAVE to keep lying down... -->
<li Class="ThinkNode_ConditionalMustKeepLyingDown">
<subNodes>
<!-- Do a queued job if possible (e.g. watch tv in bed) -->
<li Class="ThinkNode_QueuedJob">
<inBedOnly>true</inBedOnly>
</li>
<!-- Get joy -->
<li Class="ThinkNode_Tagger">
<tagToGive>SatisfyingNeeds</tagToGive>
<subNodes>
<li Class="ThinkNode_PrioritySorter">
<subNodes>
<li Class="ThinkNode_Priority_GetJoy">
<subNodes>
<li Class="JobGiver_GetJoyInBed" />
</subNodes>
</li>
<li Class="JobGiver_MeditateInBed"/>
</subNodes>
</li>
</subNodes>
</li>
<!-- Keep lying down -->
<li Class="JobGiver_KeepLyingDown" />
</subNodes>
</li>
<li Class="ThinkNode_Subtree">
<treeDef>Downed</treeDef>
</li>
<li Class="ThinkNode_Subtree">
<treeDef>BurningResponse</treeDef>
</li>
<li Class="ThinkNode_Subtree">
<treeDef>MentalStateCritical</treeDef>
</li>
<!-- Escaping threats -->
<li Class="ThinkNode_Subtree" MayRequire="Ludeon.RimWorld.Biotech">
<treeDef>Abilities_Escape</treeDef>
</li>
<!-- React to close melee threat -->
<li Class="JobGiver_ReactToCloseMeleeThreat" />
<!-- Mental state non critical -->
<li Class="ThinkNode_Subtree">
<treeDef>MentalStateNonCritical</treeDef>
</li>
<!-- Behavior when roped -->
<li Class="ThinkNode_Subtree">
<treeDef>RopedPawn</treeDef>
</li>
<!-- Insertion hook for modders -->
<li Class="ThinkNode_SubtreesByTag">
<insertTag>Humanlike_PostMentalState</insertTag>
</li>
<!-- Do a queued job -->
<li Class="ThinkNode_QueuedJob" />
<!-- Wait if drafted -->
<li Class="ThinkNode_ConditionalColonist">
<subNodes>
<li Class="ThinkNode_Tagger">
<tagToGive>DraftedOrder</tagToGive>
<subNodes>
<li Class="JobGiver_MoveToStandable" />
<li Class="JobGiver_Orders" />
</subNodes>
</li>
</subNodes>
</li>
<!-- Self-tend if you're an NPC -->
<li Class="ThinkNode_ConditionalNPCCanSelfTendNow">
<subNodes>
<li Class="JobGiver_SelfTend" />
</subNodes>
</li>
<!-- Lord directives (high priority) -->
<li Class="ThinkNode_JoinVoluntarilyJoinableLord">
<dutyHook>HighPriority</dutyHook>
<subNodes>
<li Class="ThinkNode_Subtree">
<treeDef>LordDuty</treeDef>
</li>
</subNodes>
</li>
<!-- Insertion hook for modders -->
<li Class="ThinkNode_SubtreesByTag">
<insertTag>Humanlike_PostDuty</insertTag>
</li>
<!-- JobGiver_MaintainBuildings start -->
<li Class="ThinkNode_ChancePerHour_Constant">
<mtbHours>2.5</mtbHours>
<subNodes>
<li Class="ArachnaeSwarm.JobGiver_MaintainBuildings">
<maintainableThingDefs>
<li>ARA_InteractiveEggSac</li> <!-- 默认维护Hive -->
</maintainableThingDefs>
</li>
</subNodes>
</li>
<li Class="ArachnaeSwarm.JobGiver_MaintainBuildings">
<maintainableThingDefs>
<li>ARA_InteractiveEggSac</li> <!-- 默认维护Hive -->
</maintainableThingDefs>
<onlyIfDamagingState>true</onlyIfDamagingState>
</li>
<!-- JobGiver_MaintainBuildings end -->
<!-- Prisoner -->
<li Class="ThinkNode_ConditionalPrisoner">
<leaveJoinableLordIfIssuesJob>true</leaveJoinableLordIfIssuesJob>
<subNodes>
<!-- If it's the player home map... -->
<li Class="ThinkNode_ConditionalInNonPlayerHomeMap">
<invert>true</invert>
<subNodes>
<!-- Wait instead of escaping if should -->
<li Class="ThinkNode_Tagger">
<tagToGive>Idle</tagToGive>
<subNodes>
<li Class="JobGiver_PrisonerWaitInsteadOfEscaping">
<maxDanger>Deadly</maxDanger>
</li>
</subNodes>
</li>
<!-- Escape -->
<li Class="ThinkNode_Tagger">
<tagToGive>Escaping</tagToGive>
<subNodes>
<li Class="JobGiver_PrisonerEscape" />
</subNodes>
</li>
</subNodes>
</li>
<!-- Exit map if released -->
<li Class="ThinkNode_ConditionalReleased">
<subNodes>
<li Class="ThinkNode_Tagger">
<tagToGive>Misc</tagToGive>
<subNodes>
<li Class="JobGiver_ExitMapBest">
<defaultLocomotion>Walk</defaultLocomotion>
</li>
</subNodes>
</li>
</subNodes>
</li>
<li Class="ThinkNode_Tagger">
<tagToGive>RestingForMedicalReasons</tagToGive>
<subNodes>
<li Class="JobGiver_PatientGoToBed" />
</subNodes>
</li>
<li Class="ThinkNode_Tagger">
<tagToGive>ChangingApparel</tagToGive>
<subNodes>
<li Class="JobGiver_PrisonerGetDressed" />
</subNodes>
</li>
<li Class="ThinkNode_Tagger">
<tagToGive>SatisfyingNeeds</tagToGive>
<subNodes>
<li Class="ThinkNode_PrioritySorter">
<subNodes>
<li Class="JobGiver_Autofeed" MayRequire="Ludeon.RimWorld.Biotech" />
<li Class="JobGiver_GetFood"/>
<li Class="JobGiver_GetRest"/>
<li Class="JobGiver_SatisfyChemicalNeed"/>
<li Class="JobGiver_SatifyChemicalDependency" MayRequire="Ludeon.RimWorld.Biotech" />
<li Class="JobGiver_GetHemogen" MayRequire="Ludeon.RimWorld.Biotech" />
<li Class="JobGiver_GetDeathrest" MayRequire="Ludeon.RimWorld.Biotech" />
<li Class="ThinkNode_Priority_GetJoy">
<subNodes>
<li Class="JobGiver_GetJoy"/>
<li Class="JobGiver_GetJoyInBed"/>
</subNodes>
</li>
<li Class="JobGiver_Meditate"/>
</subNodes>
</li>
</subNodes>
</li>
<!-- If in non-PlayerHomeMap -->
<li Class="ThinkNode_ConditionalInNonPlayerHomeMap">
<subNodes>
<!-- No colonist spawned in the map -->
<li Class="ThinkNode_ConditionalAnyUndownedColonistSpawnedNearby">
<invert>true</invert>
<subNodes>
<li Class="ThinkNode_Tagger">
<tagToGive>Escaping</tagToGive>
<subNodes>
<li Class="JobGiver_PrisonerEscape" />
</subNodes>
</li>
</subNodes>
</li>
<!-- Wander -->
<li Class="ThinkNode_Tagger">
<tagToGive>Idle</tagToGive>
<subNodes>
<li Class="JobGiver_WanderColony">
<maxDanger>Deadly</maxDanger>
</li>
</subNodes>
</li>
</subNodes>
</li>
<li Class="ThinkNode_Tagger">
<tagToGive>Idle</tagToGive>
<subNodes>
<li Class="JobGiver_WanderCurrentRoom">
<maxDanger>Deadly</maxDanger>
</li>
</subNodes>
</li>
<li Class="JobGiver_IdleError" />
</subNodes>
</li>
<!-- If on colonist team, do forced and emergency work -->
<li Class="ThinkNode_ConditionalColonist">
<subNodes>
<!-- Seek allowed area -->
<li Class="JobGiver_SeekAllowedArea" />
<!-- Seek safe temperatures -->
<li Class="JobGiver_BringBabyToSafety" />
<li Class="JobGiver_SeekSafeTemperature" />
<!-- Drop unnused inventory -->
<li Class="JobGiver_DropUnusedInventory" />
<!-- Emergency work -->
<li Class="JobGiver_Work">
<leaveJoinableLordIfIssuesJob>true</leaveJoinableLordIfIssuesJob>
<emergency>true</emergency>
</li>
<!-- Get food (only if starving) -->
<li Class="ThinkNode_ConditionalStarving">
<subNodes>
<li Class="ThinkNode_Tagger">
<tagToGive>SatisfyingNeeds</tagToGive>
<subNodes>
<li Class="JobGiver_GetFood">
<leaveJoinableLordIfIssuesJob>true</leaveJoinableLordIfIssuesJob>
</li>
</subNodes>
</li>
</subNodes>
</li>
<!-- Breastfeed -->
<li Class="ThinkNode_Tagger">
<tagToGive>Misc</tagToGive>
<subNodes>
<li Class="JobGiver_Autofeed" MayRequire="Ludeon.RimWorld.Biotech" />
</subNodes>
</li>
<!-- Lord directives (medium priority) -->
<li Class="ThinkNode_JoinVoluntarilyJoinableLord">
<dutyHook>MediumPriority</dutyHook>
<subNodes>
<li Class="ThinkNode_Subtree">
<treeDef>LordDuty</treeDef>
</li>
</subNodes>
</li>
<!-- Pick up a weapon dropped while previously downed -->
<li Class="JobGiver_PickupDroppedWeapon">
<ignoreForbidden>true</ignoreForbidden>
</li>
<!-- Optimize apparel -->
<li Class="ThinkNode_Tagger">
<tagToGive>ChangingApparel</tagToGive>
<subNodes>
<li Class="JobGiver_OptimizeApparel">
<leaveJoinableLordIfIssuesJob>true</leaveJoinableLordIfIssuesJob>
</li>
</subNodes>
</li>
<!-- Look change -->
<li MayRequire="Ludeon.RimWorld.Ideology" Class="ThinkNode_ConditionalWantsLookChange">
<subNodes>
<li Class="JobGiver_UseStylingStationAutomatic" />
</subNodes>
</li>
<!-- Dye hair -->
<li MayRequire="Ludeon.RimWorld.Ideology" Class="JobGiver_DyeHair" />
<!-- Take for inventory stock -->
<li Class="ThinkNode_Tagger">
<tagToGive>TakeForInventoryStock</tagToGive>
<subNodes>
<li Class="JobGiver_TakeForInventoryStock">
<leaveJoinableLordIfIssuesJob>true</leaveJoinableLordIfIssuesJob>
</li>
</subNodes>
</li>
<!-- Unload your inventory -->
<li Class="ThinkNode_Tagger">
<tagToGive>UnloadingOwnInventory</tagToGive>
<subNodes>
<li Class="JobGiver_UnloadYourInventory" />
</subNodes>
</li>
<!-- Pack food if not hungry-->
<li Class="ThinkNode_ConditionalNeedPercentageAbove">
<need>Food</need>
<threshold>0.6</threshold>
<subNodes>
<li Class="JobGiver_PackFood">
<leaveJoinableLordIfIssuesJob>true</leaveJoinableLordIfIssuesJob>
</li>
</subNodes>
</li>
</subNodes>
</li>
<!-- Behavior from traits -->
<li Class="ThinkNode_TraitBehaviors" />
<!-- Insertion hook for modders -->
<li Class="ThinkNode_SubtreesByTag">
<insertTag>Humanlike_PreMain</insertTag>
</li>
<!-- Main colonist behavior core -->
<li Class="ThinkNode_ConditionalColonist">
<subNodes>
<li Class="ThinkNode_Subtree">
<treeDef>MainColonistBehaviorCore</treeDef>
<leaveJoinableLordIfIssuesJob>true</leaveJoinableLordIfIssuesJob>
</li>
</subNodes>
</li>
<!-- Main wild man behavior core -->
<li Class="ThinkNode_ConditionalPawnKind">
<pawnKind>WildMan</pawnKind>
<subNodes>
<li Class="ThinkNode_Subtree">
<treeDef>MainWildManBehaviorCore</treeDef>
<leaveJoinableLordIfIssuesJob>true</leaveJoinableLordIfIssuesJob>
</li>
</subNodes>
</li>
<!-- Insertion hook for modders -->
<li Class="ThinkNode_SubtreesByTag">
<insertTag>Humanlike_PostMain</insertTag>
</li>
<!-- Idle colonist -->
<li Class="ThinkNode_ConditionalColonist">
<subNodes>
<li Class="ThinkNode_Tagger">
<tagToGive>Idle</tagToGive>
<subNodes>
<!-- Do random joy activity -->
<li Class="ThinkNode_ConditionalNeedPercentageAbove">
<need>Joy</need>
<threshold>0.9</threshold>
<invert>true</invert>
<subNodes>
<li Class="JobGiver_IdleJoy" />
</subNodes>
</li>
<!-- Wander -->
<li Class="JobGiver_WanderColony">
<maxDanger>None</maxDanger>
</li>
</subNodes>
</li>
</subNodes>
</li>
<!-- Idle wild man -->
<li Class="ThinkNode_ConditionalPawnKind">
<pawnKind>WildMan</pawnKind>
<subNodes>
<li Class="ThinkNode_Tagger">
<tagToGive>Idle</tagToGive>
<subNodes>
<!-- Wander -->
<li Class="JobGiver_WanderAnywhere">
<maxDanger>Deadly</maxDanger>
<ticksBetweenWandersRange>120~240</ticksBetweenWandersRange>
</li>
</subNodes>
</li>
</subNodes>
</li>
<!-- If you're a neutral guest, if you're not hurt exit the map, otherwise use a medical bed -->
<li Class="ThinkNode_ConditionalGuest">
<subNodes>
<li Class="ThinkNode_ConditionalNonPlayerNonHostileFactionOrFactionless">
<subNodes>
<li Class="ThinkNode_Tagger">
<tagToGive>RestingForMedicalReasons</tagToGive>
<subNodes>
<li Class="JobGiver_PatientGoToBed" />
</subNodes>
</li>
<li Class="ThinkNode_Tagger">
<tagToGive>Misc</tagToGive>
<subNodes>
<li Class="JobGiver_ExitMapBest">
<defaultLocomotion>Walk</defaultLocomotion>
</li>
</subNodes>
</li>
</subNodes>
</li>
</subNodes>
</li>
<!-- Final backup: If you're just here for no apparent reason, and not a colonist, leave the map
e.g. This happens for pawns who are downed during combat, then later self-heal -->
<li Class="ThinkNode_ConditionalColonist">
<invert>true</invert>
<subNodes>
<li Class="ThinkNode_Tagger">
<tagToGive>Misc</tagToGive>
<subNodes>
<li Class="JobGiver_ExitMapBest">
<defaultLocomotion>Walk</defaultLocomotion>
</li>
</subNodes>
</li>
</subNodes>
</li>
<!-- If you can't leave, just wander -->
<li Class="ThinkNode_Tagger">
<tagToGive>Idle</tagToGive>
<subNodes>
<li Class="JobGiver_WanderAnywhere">
<maxDanger>Deadly</maxDanger>
</li>
</subNodes>
</li>
<li Class="JobGiver_IdleError" />
</subNodes>
</thinkRoot>
</ThinkTreeDef>
</Defs>

View File

@@ -83,7 +83,7 @@
<Compile Include="HediffComp_HiveMindDrone.cs" />
<Compile Include="CompAbilityEffect_BindDrone.cs" />
<Compile Include="CompProperties_AbilityBindDrone.cs" />
<Compile Include="Alert_UnlinkedHiveMindDrone.cs" />
<Compile Include="JobGiver_MaintainBuildings.cs" />
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

View File

@@ -9,7 +9,7 @@ namespace ArachnaeSwarm
{
public List<PawnKindDef> pawnKinds;
public List<PawnKindDef> whitelist;
public int delay = 0;
public List<PawnKindDelay> pawnKindDelays;
public bool destroyOnSpawn = false;
public IntRange spawnCount = new IntRange(1, 1);
public Type lordJob;
@@ -32,4 +32,10 @@ namespace ArachnaeSwarm
}
}
}
}
public class PawnKindDelay
{
public PawnKindDef pawnKind;
public int delay;
}

View File

@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System.Linq;
using Verse;
using RimWorld;
using Verse.AI;
@@ -45,7 +46,8 @@ namespace ArachnaeSwarm
public void StartIncubation()
{
spawningPawnKind = selectedPawnKind;
spawnUntilTick = Find.TickManager.TicksGame + Props.delay;
int delay = Props.pawnKindDelays?.FirstOrDefault(pkd => pkd.pawnKind == selectedPawnKind)?.delay ?? 0;
spawnUntilTick = Find.TickManager.TicksGame + delay;
}
public override void CompTick()

View File

@@ -0,0 +1,56 @@
using System.Collections.Generic;
using Verse;
using RimWorld;
using Verse.AI;
using Verse.AI.Group;
namespace ArachnaeSwarm
{
public class JobGiver_MaintainBuildings : JobGiver_AIFightEnemies
{
private bool onlyIfDamagingState;
// 新增属性用于存储可维护的ThingDef列表
public List<ThingDef> maintainableThingDefs;
private static readonly float CellsInScanRadius = GenRadial.NumCellsInRadius(7.9f);
public override ThinkNode DeepCopy(bool resolve = true)
{
JobGiver_MaintainBuildings obj = (JobGiver_MaintainBuildings)base.DeepCopy(resolve);
obj.onlyIfDamagingState = onlyIfDamagingState;
obj.maintainableThingDefs = maintainableThingDefs; // 复制列表
return obj;
}
protected override Job TryGiveJob(Pawn pawn)
{
Room room = pawn.GetRoom();
for (int i = 0; (float)i < CellsInScanRadius; i++)
{
IntVec3 intVec = pawn.Position + GenRadial.RadialPattern[i];
if (!intVec.InBounds(pawn.Map) || intVec.GetRoom(pawn.Map) != room)
{
continue;
}
// 遍历可维护的ThingDef列表
foreach (ThingDef thingDef in maintainableThingDefs)
{
// 查找指定ThingDef的建筑
Thing targetThing = (Thing)pawn.Map.thingGrid.ThingAt(intVec, thingDef);
if (targetThing != null && pawn.CanReserve(targetThing))
{
CompMaintainable compMaintainable = targetThing.TryGetComp<CompMaintainable>();
if (compMaintainable != null && compMaintainable.CurStage != 0 && (!onlyIfDamagingState || compMaintainable.CurStage == MaintainableStage.Damaging))
{
return JobMaker.MakeJob(JobDefOf.Maintain, targetThing);
}
}
}
}
return null;
}
}
}