This commit is contained in:
2026-01-23 12:04:23 +08:00
parent 3c9ddc4c60
commit 51ba45982f
34 changed files with 1665 additions and 432 deletions

View File

@@ -1,21 +1,41 @@
{
"Version": 1,
"WorkspaceRootPath": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\",
"WorkspaceRootPath": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\",
"Documents": [
{
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|e:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\pawn_comps\\ara_flight\\pawn_flighttrackerpatches.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\buildings\\building_corpsevat\\building_corpsevat.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:buildings\\building_corpsevat\\building_corpsevat.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\buildings\\building_corpsevat\\jobdriver_haulcorpsetovat.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:buildings\\building_corpsevat\\jobdriver_haulcorpsetovat.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\buildings\\building_dormancyvat\\building_dormancyvat.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:buildings\\building_dormancyvat\\building_dormancyvat.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\buildings\\building_corpsevat\\corpsevatextension.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:buildings\\building_corpsevat\\corpsevatextension.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\jobs\\jobdriver_followproducer\\thinknode_conditionalnotproducedbymechcarrier.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:jobs\\jobdriver_followproducer\\thinknode_conditionalnotproducedbymechcarrier.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\pawn_comps\\ara_flight\\pawn_flighttrackerpatches.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:pawn_comps\\ara_flight\\pawn_flighttrackerpatches.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|e:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\pawn_comps\\ara_flight\\compproperties_pawnflight.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\pawn_comps\\ara_flight\\compproperties_pawnflight.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:pawn_comps\\ara_flight\\compproperties_pawnflight.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|e:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\hediffs\\ara_productionqueue\\hediffcompproperties_productionqueue.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\hediffs\\ara_productionqueue\\hediffcompproperties_productionqueue.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:hediffs\\ara_productionqueue\\hediffcompproperties_productionqueue.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|e:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\hediffs\\ara_productionqueue\\hediffcomp_productionqueue.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\hediffs\\ara_productionqueue\\hediffcomp_productionqueue.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:hediffs\\ara_productionqueue\\hediffcomp_productionqueue.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
}
],
@@ -26,19 +46,84 @@
"DocumentGroups": [
{
"DockedWidth": 200,
"SelectedChildIndex": 1,
"SelectedChildIndex": 2,
"Children": [
{
"$type": "Document",
"DocumentIndex": 3,
"Title": "CorpseVatExtension.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_CorpseVat\\CorpseVatExtension.cs",
"RelativeDocumentMoniker": "Buildings\\Building_CorpseVat\\CorpseVatExtension.cs",
"ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_CorpseVat\\CorpseVatExtension.cs",
"RelativeToolTip": "Buildings\\Building_CorpseVat\\CorpseVatExtension.cs",
"ViewState": "AgIAAAYAAAAAAAAAAAAAABkAAAAIAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-23T04:01:21.774Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 1,
"Title": "JobDriver_HaulCorpseToVat.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_CorpseVat\\JobDriver_HaulCorpseToVat.cs",
"RelativeDocumentMoniker": "Buildings\\Building_CorpseVat\\JobDriver_HaulCorpseToVat.cs",
"ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_CorpseVat\\JobDriver_HaulCorpseToVat.cs",
"RelativeToolTip": "Buildings\\Building_CorpseVat\\JobDriver_HaulCorpseToVat.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAA0AAAA0AAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-23T04:01:20.292Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 0,
"Title": "Building_CorpseVat.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_CorpseVat\\Building_CorpseVat.cs",
"RelativeDocumentMoniker": "Buildings\\Building_CorpseVat\\Building_CorpseVat.cs",
"ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_CorpseVat\\Building_CorpseVat.cs",
"RelativeToolTip": "Buildings\\Building_CorpseVat\\Building_CorpseVat.cs",
"ViewState": "AgIAAEYBAAAAAAAAAAAawFgBAAAMAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-23T04:01:18.535Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 2,
"Title": "Building_DormancyVat.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_DormancyVat\\Building_DormancyVat.cs",
"RelativeDocumentMoniker": "Buildings\\Building_DormancyVat\\Building_DormancyVat.cs",
"ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_DormancyVat\\Building_DormancyVat.cs",
"RelativeToolTip": "Buildings\\Building_DormancyVat\\Building_DormancyVat.cs",
"ViewState": "AgIAACUAAAAAAAAAAIA8wDcAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-23T03:49:32.234Z",
"EditorCaption": ""
},
{
"$type": "Bookmark",
"Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}"
},
{
"$type": "Document",
"DocumentIndex": 0,
"DocumentIndex": 4,
"Title": "ThinkNode_ConditionalNotProducedByMechCarrier.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_FollowProducer\\ThinkNode_ConditionalNotProducedByMechCarrier.cs",
"RelativeDocumentMoniker": "Jobs\\JobDriver_FollowProducer\\ThinkNode_ConditionalNotProducedByMechCarrier.cs",
"ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_FollowProducer\\ThinkNode_ConditionalNotProducedByMechCarrier.cs",
"RelativeToolTip": "Jobs\\JobDriver_FollowProducer\\ThinkNode_ConditionalNotProducedByMechCarrier.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAoAAAA+AAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-23T02:44:35.619Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 5,
"Title": "Pawn_FlightTrackerPatches.cs",
"DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_Flight\\Pawn_FlightTrackerPatches.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_Flight\\Pawn_FlightTrackerPatches.cs",
"RelativeDocumentMoniker": "Pawn_Comps\\ARA_Flight\\Pawn_FlightTrackerPatches.cs",
"ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_Flight\\Pawn_FlightTrackerPatches.cs",
"ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_Flight\\Pawn_FlightTrackerPatches.cs",
"RelativeToolTip": "Pawn_Comps\\ARA_Flight\\Pawn_FlightTrackerPatches.cs",
"ViewState": "AgIAAB0AAAAAAAAAAAAuwEsAAAAfAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
@@ -47,42 +132,39 @@
},
{
"$type": "Document",
"DocumentIndex": 1,
"DocumentIndex": 6,
"Title": "CompProperties_PawnFlight.cs",
"DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_Flight\\CompProperties_PawnFlight.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_Flight\\CompProperties_PawnFlight.cs",
"RelativeDocumentMoniker": "Pawn_Comps\\ARA_Flight\\CompProperties_PawnFlight.cs",
"ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_Flight\\CompProperties_PawnFlight.cs",
"ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_Flight\\CompProperties_PawnFlight.cs",
"RelativeToolTip": "Pawn_Comps\\ARA_Flight\\CompProperties_PawnFlight.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAA4AAAAeAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-22T14:02:45.434Z",
"EditorCaption": ""
"WhenOpened": "2026-01-22T14:02:45.434Z"
},
{
"$type": "Document",
"DocumentIndex": 3,
"DocumentIndex": 8,
"Title": "HediffComp_ProductionQueue.cs",
"DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_ProductionQueue\\HediffComp_ProductionQueue.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_ProductionQueue\\HediffComp_ProductionQueue.cs",
"RelativeDocumentMoniker": "Hediffs\\ARA_ProductionQueue\\HediffComp_ProductionQueue.cs",
"ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_ProductionQueue\\HediffComp_ProductionQueue.cs",
"ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_ProductionQueue\\HediffComp_ProductionQueue.cs",
"RelativeToolTip": "Hediffs\\ARA_ProductionQueue\\HediffComp_ProductionQueue.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAB8AAAAMAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-22T10:31:06.201Z",
"EditorCaption": ""
"WhenOpened": "2026-01-22T10:31:06.201Z"
},
{
"$type": "Document",
"DocumentIndex": 2,
"DocumentIndex": 7,
"Title": "HediffCompProperties_ProductionQueue.cs",
"DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_ProductionQueue\\HediffCompProperties_ProductionQueue.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_ProductionQueue\\HediffCompProperties_ProductionQueue.cs",
"RelativeDocumentMoniker": "Hediffs\\ARA_ProductionQueue\\HediffCompProperties_ProductionQueue.cs",
"ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_ProductionQueue\\HediffCompProperties_ProductionQueue.cs",
"ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_ProductionQueue\\HediffCompProperties_ProductionQueue.cs",
"RelativeToolTip": "Hediffs\\ARA_ProductionQueue\\HediffCompProperties_ProductionQueue.cs",
"ViewState": "AgIAAB8AAAAAAAAAAAAewEoAAAApAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-22T09:30:17.721Z",
"EditorCaption": ""
"WhenOpened": "2026-01-22T09:30:17.721Z"
}
]
}

View File

@@ -34,6 +34,9 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Compile Include="Buildings\Building_CorpseVat\Building_CorpseVat.cs" />
<Compile Include="Buildings\Building_CorpseVat\CorpseVatExtension.cs" />
<Compile Include="Buildings\Building_CorpseVat\JobDriver_HaulCorpseToVat.cs" />
<Compile Include="Damage\DamageDefExtension_TerrainCover.cs" />
<Compile Include="Damage\DamageWorker_ExplosionWithTerrain.cs" />
<Compile Include="Hediffs\ARA_GestaltNode\CompGestalt.cs" />
@@ -311,6 +314,7 @@
<Compile Include="Jobs\JobDriver_FollowProducer\JobGiver_AIDefendProducer.cs" />
<Compile Include="Jobs\JobDriver_FollowProducer\JobGiver_AIFollowProducer.cs" />
<Compile Include="Jobs\JobDriver_FollowProducer\JobGiver_WanderNearProducer.cs" />
<Compile Include="Jobs\JobDriver_FollowProducer\ThinkNode_ConditionalNotProducedByMechCarrier.cs" />
<Compile Include="Jobs\JobDriver_FollowProducer\ThinkNode_ConditionalShouldFollowProducer.cs" />
<Compile Include="Jobs\JobDriver_Refuel_Nutrition.cs" />
<Compile Include="Jobs\JobDriver_StripChitin\CompProperties_ChitinStripping.cs" />

View File

@@ -0,0 +1,45 @@
using System;
using RimWorld;
using UnityEngine;
using Verse;
namespace ArachnaeSwarm
{
/// <summary>
/// 尸体保存建筑的扩展定义
/// </summary>
public class CorpseVatExtension : DefModExtension
{
// ===== 贴图配置 =====
public string topGraphicPath; // 顶部贴图路径
public Type graphicClass = typeof(Graphic_Multi); // 贴图类
// ===== 尸体绘制配置 =====
public Vector3 corpseDrawOffset = Vector3.zero; // 尸体绘制偏移
public float corpseDrawRotation = 0f; // 尸体绘制旋转
public float corpseDrawScale = 1f; // 尸体绘制缩放
public bool drawPreservationEffect = true; // 是否绘制保存效果
// ===== 功能配置 =====
public bool requiresPower = true; // 是否需要电源
public float slowDecayRate = 0.1f; // 腐烂减缓率0-10=完全停止腐烂1=正常腐烂)
// ===== 音效配置 =====
public SoundDef insertSound; // 放入音效
public SoundDef ejectSound; // 弹出音效
public string GetConfigSummary()
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.AppendLine("=== CorpseVat 配置摘要 ===");
sb.AppendLine($"需要电源: {requiresPower}");
sb.AppendLine($"减缓腐烂: {(slowDecayRate * 100):F0}%");
sb.AppendLine($"顶部贴图: {topGraphicPath ?? ""}");
sb.AppendLine($"绘制偏移: {corpseDrawOffset}");
sb.AppendLine($"绘制旋转: {corpseDrawRotation}");
sb.AppendLine($"绘制缩放: {corpseDrawScale}");
return sb.ToString();
}
}
}

View File

@@ -1,22 +0,0 @@
using Verse;
namespace ArachnaeSwarm
{
public class DefModExtension_CorpseContainer : DefModExtension
{
// 最大容量
public int maxCapacity = 1;
// 是否允许存储非人类尸体
public bool allowNonHumanCorpses = true;
// 是否允许存储腐烂的尸体
public bool allowRottingCorpses = true;
// 是否自动保鲜(防止腐烂)
public bool preserveCorpses = false;
// 自定义存储效果描述
public string storageEffectDescriptionKey;
}
}

View File

@@ -1,64 +0,0 @@
using RimWorld;
using Verse;
using Verse.AI;
namespace ArachnaeSwarm
{
public class JobDriver_HaulCorpseToContainer : JobDriver
{
private const TargetIndex CorpseIndex = TargetIndex.A;
private const TargetIndex ContainerIndex = TargetIndex.B;
private const TargetIndex StoreCellIndex = TargetIndex.C;
private Corpse Corpse => (Corpse)job.GetTarget(CorpseIndex).Thing;
private Building_CorpseContainer Container => (Building_CorpseContainer)job.GetTarget(ContainerIndex).Thing;
public override bool TryMakePreToilReservations(bool errorOnFailed)
{
return pawn.Reserve(Corpse, job, 1, -1, null, errorOnFailed) &&
pawn.Reserve(Container, job, 1, -1, null, errorOnFailed);
}
protected override IEnumerable<Toil> MakeNewToils()
{
// 验证目标
this.FailOnDestroyedOrNull(CorpseIndex);
this.FailOnDestroyedOrNull(ContainerIndex);
this.FailOnForbidden(CorpseIndex);
this.FailOnForbidden(ContainerIndex);
// 前往尸体
yield return Toils_Goto.GotoThing(CorpseIndex, PathEndMode.Touch)
.FailOnSomeonePhysicallyInteracting(CorpseIndex);
// 捡起尸体
yield return Toils_Haul.StartCarryThing(CorpseIndex);
// 前往容器
yield return Toils_Goto.GotoThing(ContainerIndex, PathEndMode.InteractionCell);
// 存储尸体到容器
Toil storeToil = new Toil();
storeToil.initAction = delegate
{
if (pawn.carryTracker.CarriedThing is Corpse carriedCorpse)
{
AcceptanceReport report = Container.TryAcceptCorpse(carriedCorpse);
if (report.Accepted)
{
// 尸体已成功存储,清空搬运
pawn.carryTracker.innerContainer.Clear();
}
else
{
// 存储失败,结束工作
EndJobWith(JobCondition.Incompletable);
}
}
};
storeToil.defaultCompleteMode = ToilCompleteMode.Instant;
yield return storeToil;
}
}
}

View File

@@ -0,0 +1,73 @@
using RimWorld;
using Verse;
using Verse.AI;
namespace ArachnaeSwarm
{
/// <summary>
/// 自定义的搬运尸体工作驱动
/// </summary>
public class JobDriver_HaulCorpseToVat : JobDriver_HaulToContainer
{
protected override Toil CarryToContainerToil()
{
Toil toil = base.CarryToContainerToil();
// 添加自定义行为
toil.AddPreTickAction(() =>
{
Corpse corpse = TargetThingA as Corpse;
Building_CorpseVat vat = TargetThingB as Building_CorpseVat;
if (corpse != null && vat != null && pawn != null)
{
// 检查距离,如果太远可以取消工作
float distance = corpse.Position.DistanceTo(vat.Position);
if (distance > 100f) // 最大距离限制
{
pawn.jobs.EndCurrentJob(JobCondition.Incompletable);
}
}
});
return toil;
}
protected override Toil FindCarryToCellToil()
{
Toil toil = base.FindCarryToCellToil();
// 添加额外条件检查
toil.AddFailCondition(() =>
{
Corpse corpse = TargetThingA as Corpse;
Building_CorpseVat vat = TargetThingB as Building_CorpseVat;
if (corpse == null || corpse.Destroyed || vat == null || vat.Destroyed)
{
return true;
}
// 检查尸体是否仍然可以被接受
AcceptanceReport report = vat.CanAcceptCorpse(corpse);
return !report.Accepted;
});
return toil;
}
public override bool TryMakePreToilReservations(bool errorOnFailed)
{
// 为尸体和建筑预留
if (!pawn.Reserve(TargetA, job, 1, -1, null, errorOnFailed))
{
return false;
}
if (!pawn.Reserve(TargetB, job, 1, -1, null, errorOnFailed))
{
return false;
}
return true;
}
}
}

View File

@@ -0,0 +1,94 @@
using RimWorld;
using Verse;
using Verse.AI;
namespace ArachnaeSwarm
{
/// <summary>
/// 反向条件节点:如果单位不是由生产者生产的,则进入此节点
/// 与ThinkNode_ConditionalShouldFollowProducer逻辑相反
/// </summary>
public class ThinkNode_ConditionalNotProducedByMechCarrier : ThinkNode_Conditional
{
// 可选:是否检查生产者是否存活
private bool checkProducerAlive = true;
// 可选:是否检查生产者是否在同一地图
private bool checkSameMap = true;
// 可选:是否检查生产者是否可到达
private bool checkReachable = true;
// 可选是否检查生产者类型pawn必须征召才跟随
private bool checkProducerTypeConditions = true;
// 可选额外条件类可以通过XML添加额外条件
public string extraConditionClass;
public ThinkNode_ConditionalNotProducedByMechCarrier()
{
}
protected override bool Satisfied(Pawn pawn)
{
// 基础检查如果不是生产者生产的返回true
bool isProduced = IsProducedByMechCarrier(pawn);
// 如果是生产者生产的,再检查其他条件
if (isProduced)
{
return false; // 是生产者生产的,不满足条件
}
// 不是生产者生产的,满足条件
return true;
}
/// <summary>
/// 检查pawn是否由生产者生产
/// </summary>
private bool IsProducedByMechCarrier(Pawn pawn)
{
if (!pawn.Spawned)
return false;
// 检查是否有生产者Comp
CompProducedByMechCarrier producerComp = pawn.TryGetComp<CompProducedByMechCarrier>();
if (producerComp == null || !producerComp.HasValidProducer)
return false;
Thing producer = producerComp.Producer;
if (producer == null || producer.Destroyed)
return false;
// 检查生产者是否在同一地图
if (checkSameMap && producer.Map != pawn.Map)
return false;
// 检查是否可以到达生产者
if (checkReachable && !pawn.CanReach(producer, PathEndMode.OnCell, Danger.Deadly))
return false;
// 根据生产者类型检查特定条件
if (checkProducerTypeConditions && producer is Pawn pawnProducer)
{
// 如果生产者是pawn则只在征召状态下才跟随
// 这是为了模拟原版动物跟随主人的逻辑
if (checkProducerAlive && (pawnProducer.Dead || pawnProducer.Downed))
return false;
// 只有在征召状态下才认为需要跟随
if (!pawnProducer.Drafted)
return false;
}
else if (checkProducerTypeConditions && producer is Building buildingProducer)
{
// 如果生产者是建筑默认返回true
// 可以根据需要添加其他条件
return true;
}
return true;
}
}
}