This commit is contained in:
2026-03-24 17:32:51 +08:00
parent 3e24e7e987
commit 6f905aa913
7 changed files with 559 additions and 144 deletions

View File

@@ -2,24 +2,32 @@
"Version": 1,
"WorkspaceRootPath": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\",
"Documents": [
{
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\hediffs\\hediffcomp_reflectmeleedamage.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:hediffs\\hediffcomp_reflectmeleedamage.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\\ara_defof.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:ara_defof.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_supercarry\\jobdriver_supercarry.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:jobs\\jobdriver_supercarry\\jobdriver_supercarry.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_swarmmaintain\\jobdriver_swarmmaintain.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_swarmmaintain\\jobdriver_swarmmaintain.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:jobs\\jobdriver_swarmmaintain\\jobdriver_swarmmaintain.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_swarmmaintain\\jobgiver_swarmmaintain.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_swarmmaintain\\jobgiver_swarmmaintain.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:jobs\\jobdriver_swarmmaintain\\jobgiver_swarmmaintain.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_swarmmaintain\\thinknode_conditionalshouldmaintain.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_swarmmaintain\\thinknode_conditionalshouldmaintain.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:jobs\\jobdriver_swarmmaintain\\thinknode_conditionalshouldmaintain.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\\damage\\damageworker_explosionwithterrain.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\\damage\\damageworker_explosionwithterrain.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:damage\\damageworker_explosionwithterrain.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
@@ -98,24 +106,54 @@
"DocumentGroups": [
{
"DockedWidth": 200,
"SelectedChildIndex": 0,
"SelectedChildIndex": 2,
"Children": [
{
"$type": "Bookmark",
"Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}"
},
{
"$type": "Document",
"DocumentIndex": 1,
"Title": "ARA_DefOf.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\ARA_DefOf.cs",
"RelativeDocumentMoniker": "ARA_DefOf.cs",
"ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\ARA_DefOf.cs*",
"RelativeToolTip": "ARA_DefOf.cs*",
"ViewState": "AgIAAFQAAAAAAAAAAAAUwGcAAAAmAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-03-24T08:34:43.383Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 0,
"Title": "HediffComp_ReflectMeleeDamage.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\HediffComp_ReflectMeleeDamage.cs",
"RelativeDocumentMoniker": "Hediffs\\HediffComp_ReflectMeleeDamage.cs",
"ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\HediffComp_ReflectMeleeDamage.cs*",
"RelativeToolTip": "Hediffs\\HediffComp_ReflectMeleeDamage.cs*",
"ViewState": "AgIAAFUAAAAAAAAAAAAowGoAAAA/AAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-03-24T08:33:52.75Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 2,
"Title": "JobDriver_SuperCarry.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_SuperCarry\\JobDriver_SuperCarry.cs",
"RelativeDocumentMoniker": "Jobs\\JobDriver_SuperCarry\\JobDriver_SuperCarry.cs",
"ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_SuperCarry\\JobDriver_SuperCarry.cs",
"RelativeToolTip": "Jobs\\JobDriver_SuperCarry\\JobDriver_SuperCarry.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAABcAAABWAAAAAAAAAA==",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAA8AAAA3AAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-03-06T03:21:58.524Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 1,
"DocumentIndex": 3,
"Title": "JobDriver_SwarmMaintain.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_SwarmMaintain\\JobDriver_SwarmMaintain.cs",
"RelativeDocumentMoniker": "Jobs\\JobDriver_SwarmMaintain\\JobDriver_SwarmMaintain.cs",
@@ -123,16 +161,11 @@
"RelativeToolTip": "Jobs\\JobDriver_SwarmMaintain\\JobDriver_SwarmMaintain.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAABYAAAAXAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-03-06T03:21:31.585Z",
"EditorCaption": ""
},
{
"$type": "Bookmark",
"Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}"
"WhenOpened": "2026-03-06T03:21:31.585Z"
},
{
"$type": "Document",
"DocumentIndex": 2,
"DocumentIndex": 4,
"Title": "JobGiver_SwarmMaintain.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_SwarmMaintain\\JobGiver_SwarmMaintain.cs",
"RelativeDocumentMoniker": "Jobs\\JobDriver_SwarmMaintain\\JobGiver_SwarmMaintain.cs",
@@ -140,12 +173,11 @@
"RelativeToolTip": "Jobs\\JobDriver_SwarmMaintain\\JobGiver_SwarmMaintain.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-03-06T03:21:34.528Z",
"EditorCaption": ""
"WhenOpened": "2026-03-06T03:21:34.528Z"
},
{
"$type": "Document",
"DocumentIndex": 3,
"DocumentIndex": 5,
"Title": "ThinkNode_ConditionalShouldMaintain.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_SwarmMaintain\\ThinkNode_ConditionalShouldMaintain.cs",
"RelativeDocumentMoniker": "Jobs\\JobDriver_SwarmMaintain\\ThinkNode_ConditionalShouldMaintain.cs",
@@ -153,12 +185,11 @@
"RelativeToolTip": "Jobs\\JobDriver_SwarmMaintain\\ThinkNode_ConditionalShouldMaintain.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-03-06T03:21:32.052Z",
"EditorCaption": ""
"WhenOpened": "2026-03-06T03:21:32.052Z"
},
{
"$type": "Document",
"DocumentIndex": 4,
"DocumentIndex": 6,
"Title": "DamageWorker_ExplosionWithTerrain.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Damage\\DamageWorker_ExplosionWithTerrain.cs",
"RelativeDocumentMoniker": "Damage\\DamageWorker_ExplosionWithTerrain.cs",
@@ -166,12 +197,11 @@
"RelativeToolTip": "Damage\\DamageWorker_ExplosionWithTerrain.cs",
"ViewState": "AgIAAA0AAAAAAAAAAAAQwB4AAAARAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-03-06T01:33:29.803Z",
"EditorCaption": ""
"WhenOpened": "2026-03-06T01:33:29.803Z"
},
{
"$type": "Document",
"DocumentIndex": 5,
"DocumentIndex": 7,
"Title": "DamageDefExtension_TerrainCover.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Damage\\DamageDefExtension_TerrainCover.cs",
"RelativeDocumentMoniker": "Damage\\DamageDefExtension_TerrainCover.cs",
@@ -183,7 +213,7 @@
},
{
"$type": "Document",
"DocumentIndex": 6,
"DocumentIndex": 8,
"Title": "JobDriver_StripChitin.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_StripChitin\\JobDriver_StripChitin.cs",
"RelativeDocumentMoniker": "Jobs\\JobDriver_StripChitin\\JobDriver_StripChitin.cs",
@@ -195,7 +225,7 @@
},
{
"$type": "Document",
"DocumentIndex": 7,
"DocumentIndex": 9,
"Title": "JobDriver_FeedWithHoney.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_FeedWithHoney\\JobDriver_FeedWithHoney.cs",
"RelativeDocumentMoniker": "Jobs\\JobDriver_FeedWithHoney\\JobDriver_FeedWithHoney.cs",
@@ -207,7 +237,7 @@
},
{
"$type": "Document",
"DocumentIndex": 8,
"DocumentIndex": 10,
"Title": "JobGiver_ExtractHoney.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_ExtractHoney\\JobGiver_ExtractHoney.cs",
"RelativeDocumentMoniker": "Jobs\\JobDriver_ExtractHoney\\JobGiver_ExtractHoney.cs",
@@ -219,7 +249,7 @@
},
{
"$type": "Document",
"DocumentIndex": 9,
"DocumentIndex": 11,
"Title": "JobDriver_ExtractHoney.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_ExtractHoney\\JobDriver_ExtractHoney.cs",
"RelativeDocumentMoniker": "Jobs\\JobDriver_ExtractHoney\\JobDriver_ExtractHoney.cs",
@@ -231,7 +261,7 @@
},
{
"$type": "Document",
"DocumentIndex": 12,
"DocumentIndex": 14,
"Title": "WorldComponent_AircraftManager.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Flyover\\ARA_AircraftHangar\\WorldComponent_AircraftManager.cs",
"RelativeDocumentMoniker": "Flyover\\ARA_AircraftHangar\\WorldComponent_AircraftManager.cs",
@@ -243,7 +273,7 @@
},
{
"$type": "Document",
"DocumentIndex": 11,
"DocumentIndex": 13,
"Title": "GameComponent_DropPodInterceptor.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Flyover\\GameComponent_DropPodInterceptor.cs",
"RelativeDocumentMoniker": "Flyover\\GameComponent_DropPodInterceptor.cs",
@@ -255,7 +285,7 @@
},
{
"$type": "Document",
"DocumentIndex": 10,
"DocumentIndex": 12,
"Title": "CompAbilityEffect_ToggleDropPodIntercept.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\CompAbilityEffect_ToggleDropPodIntercept.cs",
"RelativeDocumentMoniker": "Abilities\\CompAbilityEffect_ToggleDropPodIntercept.cs",
@@ -267,7 +297,7 @@
},
{
"$type": "Document",
"DocumentIndex": 13,
"DocumentIndex": 15,
"Title": "HediffComp_GestaltNode.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_GestaltNode\\HediffComp_GestaltNode.cs",
"RelativeDocumentMoniker": "Hediffs\\ARA_GestaltNode\\HediffComp_GestaltNode.cs",
@@ -279,7 +309,7 @@
},
{
"$type": "Document",
"DocumentIndex": 14,
"DocumentIndex": 16,
"Title": "Comp_SwarmSpellHolder.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_SwarmSpellHolder\\Comp_SwarmSpellHolder.cs",
"RelativeDocumentMoniker": "Pawn_Comps\\ARA_SwarmSpellHolder\\Comp_SwarmSpellHolder.cs",
@@ -291,7 +321,7 @@
},
{
"$type": "Document",
"DocumentIndex": 18,
"DocumentIndex": 20,
"Title": "Building_ResearchBlueprintReader.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_ResearchBlueprintReader\\Building_ResearchBlueprintReader.cs",
"RelativeDocumentMoniker": "Buildings\\Building_ResearchBlueprintReader\\Building_ResearchBlueprintReader.cs",
@@ -303,7 +333,7 @@
},
{
"$type": "Document",
"DocumentIndex": 17,
"DocumentIndex": 19,
"Title": "ResearchBlueprintReaderManager.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_ResearchBlueprintReader\\ResearchBlueprintReaderManager.cs",
"RelativeDocumentMoniker": "Buildings\\Building_ResearchBlueprintReader\\ResearchBlueprintReaderManager.cs",
@@ -315,7 +345,7 @@
},
{
"$type": "Document",
"DocumentIndex": 16,
"DocumentIndex": 18,
"Title": "CompProperties_AbilityFanShapedStunKnockback.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_FanShapedStunKnockback\\CompProperties_AbilityFanShapedStunKnockback.cs",
"RelativeDocumentMoniker": "Abilities\\ARA_FanShapedStunKnockback\\CompProperties_AbilityFanShapedStunKnockback.cs",
@@ -327,7 +357,7 @@
},
{
"$type": "Document",
"DocumentIndex": 15,
"DocumentIndex": 17,
"Title": "CompAbilityEffect_FanShapedStunKnockback.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_FanShapedStunKnockback\\CompAbilityEffect_FanShapedStunKnockback.cs",
"RelativeDocumentMoniker": "Abilities\\ARA_FanShapedStunKnockback\\CompAbilityEffect_FanShapedStunKnockback.cs",
@@ -339,7 +369,7 @@
},
{
"$type": "Document",
"DocumentIndex": 19,
"DocumentIndex": 21,
"Title": "CompAbilityEffect_EjectOrgans.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_EjectOrgans\\CompAbilityEffect_EjectOrgans.cs",
"RelativeDocumentMoniker": "Abilities\\ARA_EjectOrgans\\CompAbilityEffect_EjectOrgans.cs",
@@ -351,7 +381,7 @@
},
{
"$type": "Document",
"DocumentIndex": 21,
"DocumentIndex": 23,
"Title": "CompHediffGiver.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_CompHediffGiver\\CompHediffGiver.cs",
"RelativeDocumentMoniker": "Pawn_Comps\\ARA_CompHediffGiver\\CompHediffGiver.cs",
@@ -363,7 +393,7 @@
},
{
"$type": "Document",
"DocumentIndex": 20,
"DocumentIndex": 22,
"Title": "CompProperties_HediffGiver.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_CompHediffGiver\\CompProperties_HediffGiver.cs",
"RelativeDocumentMoniker": "Pawn_Comps\\ARA_CompHediffGiver\\CompProperties_HediffGiver.cs",

View File

@@ -100,4 +100,13 @@ namespace ArachnaeSwarm
DefOfHelper.EnsureInitializedInCtor(typeof(ARA_StatDefOf));
}
}
[DefOf]
public static class ARA_ThingDefOf
{
public static ThingDef Mote_SparkSimple;
static ARA_ThingDefOf()
{
DefOfHelper.EnsureInitializedInCtor(typeof(ARA_ThingDefOf));
}
}
}

View File

@@ -312,6 +312,7 @@
<Compile Include="Hediffs\ARA_ProductionQueue\HediffComp_ProductionQueue.cs" />
<Compile Include="Hediffs\DRM_HediffCurseFlame\Hediff_CurseFlame.cs" />
<Compile Include="Hediffs\HediffComp_LifespanDisplay.cs" />
<Compile Include="Hediffs\HediffComp_ReflectMeleeDamage.cs" />
<Compile Include="Hediffs\HediffComp_SpawnPawnOnRemoved.cs" />
<Compile Include="Hediffs\HediffComp_Temperature.cs" />
<Compile Include="Hediffs\HediffComp_TerrainBasedSeverity\HediffCompProperties_TerrainBasedSeverity.cs" />

View File

@@ -0,0 +1,298 @@
using ArachnaeSwarm;
using RimWorld;
using System;
using System.Collections.Generic;
using UnityEngine;
using Verse;
namespace ArachnaeSwarmVerse
{
/// <summary>
/// 近战伤害反射组件的属性
/// </summary>
public class HediffCompProperties_ReflectMeleeDamage : HediffCompProperties
{
public float reflectMultiplier = 3.0f; // 反射倍数默认300%
public bool showReflectionEffect = true; // 是否显示反射效果
public bool reflectOnlyMelee = true; // 是否只反射近战伤害
public bool includeToolBasedRanged = false; // 是否包含使用工具的远程伤害
public float minDamageToReflect = 0.1f; // 最小反射伤害阈值
public HediffCompProperties_ReflectMeleeDamage()
{
this.compClass = typeof(HediffComp_ReflectMeleeDamage);
}
}
/// <summary>
/// 近战伤害反射组件
/// 当Pawn受到近战伤害时将300%的伤害反射给攻击者
/// </summary>
public class HediffComp_ReflectMeleeDamage : HediffComp
{
private bool isProcessingReflection = false; // 防止递归调用
private int lastReflectionTick = -100; // 上次反射的tick
private const int MIN_TICKS_BETWEEN_REFLECTIONS = 2; // 最小反射间隔
public HediffCompProperties_ReflectMeleeDamage Props => (HediffCompProperties_ReflectMeleeDamage)props;
/// <summary>
/// 获取反射倍率
/// </summary>
public float ReflectMultiplier => Props.reflectMultiplier;
/// <summary>
/// 检查是否为近战伤害
/// 根据题目要求所有damageinfo有tool的视为近战伤害
/// </summary>
private bool IsMeleeDamage(DamageInfo dinfo)
{
// 如果有Tool视为近战伤害
if (dinfo.Tool != null)
{
return true;
}
// 如果没有Tool进一步检查武器类型
if (dinfo.Weapon != null)
{
// 检查是否为近战武器
if (dinfo.Weapon.IsMeleeWeapon)
{
return true;
}
// 如果设置为包含使用工具的远程伤害,且武器有工具定义
if (Props.includeToolBasedRanged && dinfo.Weapon.tools != null && dinfo.Weapon.tools.Count > 0)
{
return true;
}
}
// 默认情况下,不视为近战伤害
return false;
}
/// <summary>
/// 检查是否应该反射此伤害
/// </summary>
private bool ShouldReflectDamage(DamageInfo dinfo, Pawn pawn)
{
// 防止递归调用
if (isProcessingReflection)
{
return false;
}
// 检查最小伤害阈值
if (dinfo.Amount < Props.minDamageToReflect)
{
return false;
}
// 检查是否只反射近战伤害
if (Props.reflectOnlyMelee && !IsMeleeDamage(dinfo))
{
return false;
}
// 检查伤害来源
if (dinfo.Instigator == null || dinfo.Instigator == pawn)
{
return false;
}
// 检查最小反射间隔
if (Find.TickManager.TicksGame - lastReflectionTick < MIN_TICKS_BETWEEN_REFLECTIONS)
{
return false;
}
// 检查攻击者是否有效
Pawn attacker = dinfo.Instigator as Pawn;
if (attacker != null && (attacker.Dead || attacker.Destroyed))
{
return false;
}
return true;
}
/// <summary>
/// 反射伤害给攻击者
/// </summary>
private void ReflectDamageToAttacker(DamageInfo originalDinfo, Pawn pawn)
{
try
{
isProcessingReflection = true;
lastReflectionTick = Find.TickManager.TicksGame;
// 计算反射伤害
float reflectedAmount = originalDinfo.Amount * ReflectMultiplier;
// 确保有最小伤害
if (reflectedAmount < 1f)
{
reflectedAmount = 1f;
}
// 获取攻击者
Thing attacker = originalDinfo.Instigator;
if (attacker == null || attacker.Destroyed)
{
return;
}
// 创建反射伤害信息
DamageInfo reflectedDinfo = new DamageInfo(
def: originalDinfo.Def,
amount: reflectedAmount,
armorPenetration: originalDinfo.ArmorPenetrationInt,
angle: Rand.Range(0, 359),
instigator: pawn, // 反射者作为伤害来源
hitPart: null,
weapon: originalDinfo.Weapon,
category: DamageInfo.SourceCategory.ThingOrUnknown,
intendedTarget: attacker
);
// 设置反射伤害的特殊属性
reflectedDinfo.SetAllowDamagePropagation(true);
reflectedDinfo.SetIgnoreArmor(false);
// 如果有Tool传递Tool信息但标记为反射伤害
if (originalDinfo.Tool != null)
{
reflectedDinfo.SetTool(originalDinfo.Tool);
}
// 记录日志
if (Prefs.DevMode)
{
Log.Message($"[ReflectMeleeDamage] {pawn.LabelShortCap} reflected {reflectedAmount:F1} damage " +
$"({originalDinfo.Amount:F1} × {ReflectMultiplier:F1}) to {attacker.LabelShortCap}");
}
// 对攻击者造成伤害
attacker.TakeDamage(reflectedDinfo);
// 显示反射效果
if (Props.showReflectionEffect)
{
ShowReflectionEffect(pawn, attacker);
}
// 发送消息
if (pawn.Faction == Faction.OfPlayer && attacker.Faction != Faction.OfPlayer)
{
Messages.Message(
"ASV_ReflectDamageMessage".Translate(
pawn.LabelShort,
attacker.LabelShort,
reflectedAmount.ToString("F0")
),
pawn,
MessageTypeDefOf.NeutralEvent
);
}
}
catch (Exception ex)
{
Log.Error($"[ReflectMeleeDamage] Error reflecting damage: {ex}");
}
finally
{
isProcessingReflection = false;
}
}
/// <summary>
/// 显示反射效果
/// </summary>
private void ShowReflectionEffect(Pawn pawn, Thing attacker)
{
try
{
// 显示反弹粒子
if (pawn.Spawned && attacker.Spawned && pawn.Map == attacker.Map)
{
Vector3 startPos = pawn.DrawPos;
Vector3 endPos = attacker.DrawPos;
// 创建一个从反射者到攻击者的弹道效果
for (int i = 0; i < 3; i++)
{
MoteThrown mote = (MoteThrown)ThingMaker.MakeThing(ARA_ThingDefOf.Mote_SparkSimple, null);
mote.Scale = Rand.Range(0.5f, 0.8f);
mote.exactPosition = startPos + new Vector3(
Rand.Range(-0.3f, 0.3f),
0f,
Rand.Range(-0.3f, 0.3f)
);
mote.SetVelocity(
(endPos - startPos).normalized.x * Rand.Range(15f, 25f),
0f
);
GenSpawn.Spawn(mote, pawn.Position, pawn.Map);
}
}
}
catch (Exception ex)
{
Log.Error($"[ReflectMeleeDamage] Error showing reflection effect: {ex}");
}
}
/// <summary>
/// 在Pawn受到伤害后调用
/// </summary>
public override void Notify_PawnPostApplyDamage(DamageInfo dinfo, float totalDamageDealt)
{
base.Notify_PawnPostApplyDamage(dinfo, totalDamageDealt);
Pawn pawn = this.Pawn;
if (pawn == null || pawn.Dead || pawn.Destroyed)
{
return;
}
// 检查是否应该反射伤害
if (ShouldReflectDamage(dinfo, pawn))
{
// 反射伤害给攻击者
ReflectDamageToAttacker(dinfo, pawn);
}
}
/// <summary>
/// 获取组件描述
/// </summary>
public override string CompTipStringExtra
{
get
{
string tip = "ASV_ReflectMeleeDamage_Tip".Translate(ReflectMultiplier.ToStringPercent());
if (Props.includeToolBasedRanged)
{
tip += "\n" + "ASV_ReflectIncludesToolRanged".Translate();
}
return tip;
}
}
/// <summary>
/// 获取调试信息
/// </summary>
public override string CompDebugString()
{
return $"Reflect multiplier: {ReflectMultiplier:F1}x\n" +
$"Last reflection tick: {lastReflectionTick}\n" +
$"Min damage to reflect: {Props.minDamageToReflect}\n" +
$"Reflects only melee: {Props.reflectOnlyMelee}\n" +
$"Includes tool-based ranged: {Props.includeToolBasedRanged}";
}
}
}