diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll index 5935d56..161b7e5 100644 Binary files a/1.6/1.6/Assemblies/ArachnaeSwarm.dll and b/1.6/1.6/Assemblies/ArachnaeSwarm.dll differ diff --git a/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml b/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml index 5a0dd5b..327f160 100644 --- a/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml +++ b/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml @@ -1209,93 +1209,6 @@ - - ARA_Praetorian_Commander_Hediff - - 阿拉克涅禁卫种正在指挥附近的虫族部队,因为需要分神搭建次级蜂巢思维网络,其战斗力被削弱了。 - HediffWithComps - (0.6, 0.4, 0.8) - false - false - 1.0 - -
  • - 0 - -
  • - Consciousness - 0.9 -
  • - - -
    - -
  • - 24 - ARA_Praetorian_Command_Hediff - - - - -
  • ArachnaeNode_Race_ShieldHead
  • -
  • ArachnaeNode_Race_WeaponSmith
  • -
  • ArachnaeNode_Race_Fighter
  • -
  • ArachnaeNode_Race_Facehugger
  • -
  • ArachnaeNode_Race_Myrmecocystus
  • -
  • ArachnaeNode_Race_Smokepop
  • -
  • ArachnaeNode_Race_NeuroSwarm
  • -
  • ArachnaeNode_Race_Skyraider
  • -
  • ArachnaeNode_Race_Praetorian
  • -
  • ArachnaeBase_Race_Acidcut
  • -
  • ArachnaeBase_Race_Acidling
  • -
  • ArachnaeBase_Race_Skyhive
  • -
  • ArachnaeNode_Race_MimicNematode
  • - - - - - false - true - false - true - false - - true - true - -
    -
    - - ARA_Praetorian_Command_Hediff - - 一只阿拉克涅禁卫种在附近承担战场指挥官的职责,受到指挥的阿拉克涅虫族通过一个次级蜂巢思维网络进行链接,加强了其整体战斗力。 - HediffWithComps - false - (0.6, 0.6, 0.6) - false - -
  • - - 1.5 - 2 - 0.75 - 2 - 0 - -
  • -
    - -
  • - false -
  • -
  • -
  • -
    -
    ARA_Pouch_Hatching_Acidling diff --git a/1.6/1.6/Defs/Effects/ARA_Flecks.xml b/1.6/1.6/Defs/Effects/ARA_Flecks.xml index a1bcae3..2c66a52 100644 --- a/1.6/1.6/Defs/Effects/ARA_Flecks.xml +++ b/1.6/1.6/Defs/Effects/ARA_Flecks.xml @@ -24,4 +24,112 @@ 0 0.2 + + ARA_GunTail_Frost + Projectile + 0.05 + 0.1 + + ArachnaeSwarm/Mote/ARA_GunTail_Plasma + MoteGlow + 1.25 + (9,211,255,155) + + + + + ARA_Mote_halo + + ArachnaeSwarm/Mote/halo + MoteGlow + + MoteOverhead + + 0 + 0 + 0.1 + 40 + true + + + + ARA_Mote_fire + + ArachnaeSwarm/Mote/fire + MoteGlow + + MoteOverhead + + 0 + 0 + 0.2 + 8 + true + + + + ARA_Mote_ChargeLanceShot + + ArachnaeSwarm/Mote/ARA_Spike_Shell + (0.75,1.5) + MoteGlow + (255,255,255) + + Projectile + + 0.2 + 0.4 + 0.2 + -0.8 + true + + + + ARA_RW_Lighting_Cannon_Hit + +
  • + SubEffecter_SprayerTriggered + 0.1 + ARA_Mote_halo + 1~1 + 0.4~0.8 + 0.05~0.05 + OnSource + (255,255,255) +
  • +
  • + SubEffecter_SprayerTriggered + 0.02 + ARA_Mote_fire + 1~1 + 0.3~0.4 + 5~10 + 0.1~0.2 + OnSource + (255,255,255) +
  • +
  • + SubEffecter_SprayerTriggered + ARA_Mote_ChargeLanceShot + 1~4 + 0.4~0.8 + 20~40 + 135~225 + 0.01 + OnSource +
  • +
  • + SubEffecter_SprayerTriggered + ARA_Mote_ChargeLanceShot + 2~3 + 0.4~0.8 + 10~20 + 135~225 + 0.01 + OnSource +
  • +
    + 0.25~0.25 + 0.1 +
    \ No newline at end of file diff --git a/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_Psy.xml b/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_Psy.xml index 0765b60..e67de4d 100644 --- a/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_Psy.xml +++ b/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_Psy.xml @@ -91,7 +91,6 @@
  • 0.75 - 0
  • @@ -112,4 +111,92 @@ + + + ARA_Praetorian_Commander_Hediff + + 阿拉克涅禁卫种正在指挥附近的虫族部队,因为需要分神搭建次级蜂巢思维网络,其战斗力被削弱了。 + HediffWithComps + (0.6, 0.4, 0.8) + false + false + 1.0 + +
  • + 0 + +
  • + Consciousness + 0.9 +
  • + + +
    + +
  • + 24 + ARA_Praetorian_Command_Hediff + + + + +
  • ArachnaeNode_Race_ShieldHead
  • +
  • ArachnaeNode_Race_WeaponSmith
  • +
  • ArachnaeNode_Race_Fighter
  • +
  • ArachnaeNode_Race_Facehugger
  • +
  • ArachnaeNode_Race_Myrmecocystus
  • +
  • ArachnaeNode_Race_Smokepop
  • +
  • ArachnaeNode_Race_NeuroSwarm
  • +
  • ArachnaeNode_Race_Skyraider
  • +
  • ArachnaeNode_Race_Praetorian
  • +
  • ArachnaeBase_Race_Acidcut
  • +
  • ArachnaeBase_Race_Acidling
  • +
  • ArachnaeBase_Race_Skyhive
  • +
  • ArachnaeNode_Race_MimicNematode
  • + + + + + false + true + false + true + false + + true + true + +
    +
    + + ARA_Praetorian_Command_Hediff + + 一只阿拉克涅禁卫种在附近承担战场指挥官的职责,受到指挥的阿拉克涅虫族通过一个次级蜂巢思维网络进行链接,加强了其整体战斗力。 + HediffWithComps + false + (0.6, 0.6, 0.6) + false + +
  • + + 1.5 + 2 + 0.75 + 2 + 0 + +
  • +
    + +
  • + false +
  • +
  • +
  • +
    +
    \ No newline at end of file diff --git a/1.6/1.6/Defs/HediffDefs/ARA_PowerArmor_Hediffs.xml b/1.6/1.6/Defs/HediffDefs/ARA_PowerArmor_Hediffs.xml index 70f21ac..beab156 100644 --- a/1.6/1.6/Defs/HediffDefs/ARA_PowerArmor_Hediffs.xml +++ b/1.6/1.6/Defs/HediffDefs/ARA_PowerArmor_Hediffs.xml @@ -1,10 +1,9 @@ - ARA_PowerArmor_NoFuel - - 生物外骨骼因缺少养分而营养不良,这会对宿主造成不良影响. + + 共生肌群因缺少养分而营养不良,这会对宿主造成不良影响. HediffWithComps (0.6, 0.6, 0.6) true @@ -21,4 +20,77 @@ + + ARA_SpiderOne_PowerArmor_MainHediff + + 阿拉克涅虫群的特殊活体结构,本身虽然拥有生物的大部分器官,但是没有任何智能,可以与督虫的神经系统进行融合,成为类似动力装甲一样的装备。共生肌群会为宿主提供额外的重型武器,并且身上也装备了大量的微型武装器官,使得阿拉克涅虫族可以驾驭比肩人类战车的力量。 + + + HediffWithComps + (0.6, 0.4, 0.8) + +
  • +
  • + +
  • + + +
  • Blunt
  • + + 25 + 2.2 + true + + +
  • + Stun + 12 +
  • +
    +
    + + + + +
    + +
  • + + 2 + 0.5 + 0 + +
  • +
    + +
  • + ARA_SpiderOne_PowerArmor_MainHediff + PawnRenderNodeWorker_AttachmentBody + +
  • ArachnaeSwarm/Apparel/ARA_SpiderOne_PowerArmor_Thin_south_Top
  • + + 1 + +
  • South
  • +
    + + 2.1 + + -99999 + + + -99999 + + + -99999 + + + 50 + (0, 0, -0.5) + + + +
    +
    \ No newline at end of file diff --git a/1.6/1.6/Defs/SoundDefs/ARA_Sounds.xml b/1.6/1.6/Defs/SoundDefs/ARA_Sounds.xml index a8c65f4..2aee4e0 100644 --- a/1.6/1.6/Defs/SoundDefs/ARA_Sounds.xml +++ b/1.6/1.6/Defs/SoundDefs/ARA_Sounds.xml @@ -15,4 +15,25 @@ + + ARA_RW_Lighting_Cannon_Shootingsound + true + MapOnly + 1 + PrioritizeNearest + + +
  • + + +
  • + ArachnaeSwarm/ARA_RW_Lighting_Cannon_Shootingsound +
  • + + 0.99~1.01 + 50 + + +
    +
    \ No newline at end of file diff --git a/1.6/1.6/Defs/ThingDef_Races/ARA_RaceNodeSwarm.xml b/1.6/1.6/Defs/ThingDef_Races/ARA_RaceNodeSwarm.xml index b880494..fc8add0 100644 --- a/1.6/1.6/Defs/ThingDef_Races/ARA_RaceNodeSwarm.xml +++ b/1.6/1.6/Defs/ThingDef_Races/ARA_RaceNodeSwarm.xml @@ -625,6 +625,7 @@
  • RemovePorcupineQuill
  • +
  • SurgicalInspection
  • ARA_Surgery_Install_Plasteel
  • ARA_Surgery_Install_Carapace_Shell
  • ARA_Surgery_Install_Huge_Stomach
  • @@ -1863,11 +1864,6 @@ true Fresh,Rotting - - -
  • ARA_PowerArmor
  • -
    -
    @@ -1910,11 +1906,6 @@ Head false - - -
  • ARA_PowerArmor
  • -
    -
  • diff --git a/1.6/1.6/Defs/Thing_Misc/ARA_Things_Gas.xml b/1.6/1.6/Defs/Thing_Misc/ARA_Things_Gas.xml index 39bf344..9597d66 100644 --- a/1.6/1.6/Defs/Thing_Misc/ARA_Things_Gas.xml +++ b/1.6/1.6/Defs/Thing_Misc/ARA_Things_Gas.xml @@ -102,6 +102,7 @@ Things/Gas/Puff + MoteGlow 2.6 (0.52, 1, 0.95,0.5) diff --git a/1.6/1.6/Defs/Thing_Misc/Apparels/ARA_Apparel.xml b/1.6/1.6/Defs/Thing_Misc/Apparels/ARA_Apparel.xml index 20e78e3..496fdcc 100644 --- a/1.6/1.6/Defs/Thing_Misc/Apparels/ARA_Apparel.xml +++ b/1.6/1.6/Defs/Thing_Misc/Apparels/ARA_Apparel.xml @@ -540,8 +540,8 @@ - Shield - + ARA_Shield + 275 \ No newline at end of file diff --git a/1.6/1.6/Defs/Thing_Misc/Apparels/ARA_PowerArmor.xml b/1.6/1.6/Defs/Thing_Misc/Apparels/ARA_PowerArmor.xml index 95e3b03..dd99aa1 100644 --- a/1.6/1.6/Defs/Thing_Misc/Apparels/ARA_PowerArmor.xml +++ b/1.6/1.6/Defs/Thing_Misc/Apparels/ARA_PowerArmor.xml @@ -7,8 +7,8 @@ 阿拉克涅虫群的特殊活体结构,本身虽然拥有生物的大部分器官,但是没有任何智能,可以与督虫的神经系统进行融合,成为类似动力装甲一样的装备。共生肌群会为宿主提供额外的重型武器,并且身上也装备了大量的微型武装器官,使得阿拉克涅虫族可以驾驭比肩人类战车的力量。 Graphic_Multi - (1,1) - ArachnaeSwarm/Apparel/ARA_Building_SpiderOne + (3,3) + ArachnaeSwarm/Building/ARA_Building_SpiderOne ARA_SpiderOne_PowerArmor @@ -79,11 +79,12 @@
  • - 使用拥有极致对单伤害的高能系武器,以快速点杀对方高价值目标。 + 使用拥有极致对单输出的高能系武器,以快速点杀对方高价值目标。 ARA_RW_Lighting_Cannon + ArachnaeSwarm/UI/Abilities/ARA_RW_Lighting_Cannon_Switch
  • @@ -97,7 +98,7 @@ 25 - ArachnaeSwarm/Apparel/ARA_Bunny_Girl_Uniform + ArachnaeSwarm/Building/ARA_Building_SpiderOne_south @@ -111,15 +112,27 @@ -
  • Middle
  • +
  • ARA_Shield
  • ArachnaeSwarm/Apparel/ARA_SpiderOne_PowerArmor 2.1 - 350 - (0, 0, -0.4) + 50 + (0, 0, -0.5) + + 50 + (0, 0, -0.5) + + + 350 + (0, 0, -0.5) + + + -150 + (0, 0, -0.4) +
    @@ -131,7 +144,7 @@ 0
  • - ARA_TerrainMoveSpeedHediff + ARA_SpiderOne_PowerArmor_MainHediff
  • + 0 + true + + + ARA_RW_Lighting_Cannon_Hit + + ArachnaeSwarm/Mote/ARA_Spike_Shell Graphic_Single_AgeSecs @@ -685,7 +696,10 @@
  • -1 0 - false + true + + + ARA_RW_Lighting_Cannon_Hit
  • @@ -2019,6 +2033,7 @@ 5 49 12 + 1 SpitterSpit true @@ -2067,15 +2082,20 @@ (63,223,222,180) 0.8 - Projectile_Explosive + ArachnaeSwarm.Projectile_ExplosiveWithTrail + +
  • + ARA_GunTail_Frost + 3 +
  • +
    True 1 ARA_Damage_Freeze_ex - 25 - 1 + 5 75 - 1 + 0 3.5 true ARA_FrostGasCloud_Ex @@ -2097,10 +2117,11 @@ None true - ArachnaeSwarm/Weapon/ARA_RW_Acid_Mortar + ArachnaeSwarm/Weapon/ARA_RW_Lighting_Cannon Graphic_Single - 1.5 + 1.2 + 0.8 2.6 0.60 @@ -2132,7 +2153,7 @@ 0 - BeamGraser_Shooting + ARA_RW_Lighting_Cannon_Shootingsound Fleck_IncineratorBeamBurn 0.32 Mote_ARA_RW_Lighting_Cannon_Beam diff --git a/Content/Textures/ArachnaeSwarm/Apparel/ARA_SpiderOne_PowerArmor_Thin_east.png b/Content/Textures/ArachnaeSwarm/Apparel/ARA_SpiderOne_PowerArmor_Thin_east.png index cda87fa..b261694 100644 Binary files a/Content/Textures/ArachnaeSwarm/Apparel/ARA_SpiderOne_PowerArmor_Thin_east.png and b/Content/Textures/ArachnaeSwarm/Apparel/ARA_SpiderOne_PowerArmor_Thin_east.png differ diff --git a/Content/Textures/ArachnaeSwarm/Apparel/ARA_SpiderOne_PowerArmor_Thin_north.png b/Content/Textures/ArachnaeSwarm/Apparel/ARA_SpiderOne_PowerArmor_Thin_north.png index fabb0d4..33d710e 100644 Binary files a/Content/Textures/ArachnaeSwarm/Apparel/ARA_SpiderOne_PowerArmor_Thin_north.png and b/Content/Textures/ArachnaeSwarm/Apparel/ARA_SpiderOne_PowerArmor_Thin_north.png differ diff --git a/Content/Textures/ArachnaeSwarm/Apparel/ARA_SpiderOne_PowerArmor_Thin_south.png b/Content/Textures/ArachnaeSwarm/Apparel/ARA_SpiderOne_PowerArmor_Thin_south.png index fabb0d4..0304429 100644 Binary files a/Content/Textures/ArachnaeSwarm/Apparel/ARA_SpiderOne_PowerArmor_Thin_south.png and b/Content/Textures/ArachnaeSwarm/Apparel/ARA_SpiderOne_PowerArmor_Thin_south.png differ diff --git a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo index d73507a..62e10fb 100644 Binary files a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo and b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo differ diff --git a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json index bfef8fb..f5a7b14 100644 --- a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json +++ b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json @@ -3,44 +3,8 @@ "WorkspaceRootPath": "E:\\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\\powerarmor\\ara_powerarmor.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:powerarmor\\ara_powerarmor.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\\powerarmor\\jobdriver_enterpowerarmor.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:powerarmor\\jobdriver_enterpowerarmor.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\\powerarmor\\comppowerarmorstation.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:powerarmor\\comppowerarmorstation.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\\powerarmor\\gizmo_structurepanel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:powerarmor\\gizmo_structurepanel.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\\abilities\\ara_huggingface\\compabilityeffect_possess.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:abilities\\ara_huggingface\\compabilityeffect_possess.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\\building_comps\\ara_nutrientvat\\building_nutrientvat.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:building_comps\\ara_nutrientvat\\building_nutrientvat.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\\building_comps\\ara_building_refuelingvat\\building_refuelingvat.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:building_comps\\ara_building_refuelingvat\\building_refuelingvat.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\\building_comps\\ara_compinteractiveproducer\\compinteractiveproducer.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:building_comps\\ara_compinteractiveproducer\\compinteractiveproducer.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\\building_comps\\compnutritiontofuelconverter.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:building_comps\\compnutritiontofuelconverter.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\\building_comps\\ara_compinteractiveproducer\\compresearchproducer.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:building_comps\\ara_compinteractiveproducer\\compresearchproducer.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\\verbs\\verb_shootarc.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:verbs\\verb_shootarc.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" } ], "DocumentGroupContainers": [ @@ -50,134 +14,24 @@ "DocumentGroups": [ { "DockedWidth": 200, - "SelectedChildIndex": 4, + "SelectedChildIndex": 1, "Children": [ { "$type": "Bookmark", "Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}" }, - { - "$type": "Document", - "DocumentIndex": 2, - "Title": "CompPowerArmorStation.cs", - "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\PowerArmor\\CompPowerArmorStation.cs", - "RelativeDocumentMoniker": "PowerArmor\\CompPowerArmorStation.cs", - "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\PowerArmor\\CompPowerArmorStation.cs", - "RelativeToolTip": "PowerArmor\\CompPowerArmorStation.cs", - "ViewState": "AgIAAAAAAAAAAAAAAAAAAAwAAAAmAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2025-10-18T16:40:43.953Z", - "EditorCaption": "" - }, - { - "$type": "Document", - "DocumentIndex": 1, - "Title": "JobDriver_EnterPowerArmor.cs", - "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\PowerArmor\\JobDriver_EnterPowerArmor.cs", - "RelativeDocumentMoniker": "PowerArmor\\JobDriver_EnterPowerArmor.cs", - "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\PowerArmor\\JobDriver_EnterPowerArmor.cs", - "RelativeToolTip": "PowerArmor\\JobDriver_EnterPowerArmor.cs", - "ViewState": "AgIAAGUAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2025-10-18T16:33:18.657Z", - "EditorCaption": "" - }, - { - "$type": "Document", - "DocumentIndex": 3, - "Title": "Gizmo_StructurePanel.cs", - "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\PowerArmor\\Gizmo_StructurePanel.cs", - "RelativeDocumentMoniker": "PowerArmor\\Gizmo_StructurePanel.cs", - "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\PowerArmor\\Gizmo_StructurePanel.cs", - "RelativeToolTip": "PowerArmor\\Gizmo_StructurePanel.cs", - "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2025-10-18T16:32:53.277Z" - }, { "$type": "Document", "DocumentIndex": 0, - "Title": "ARA_PowerArmor.cs", - "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\PowerArmor\\ARA_PowerArmor.cs", - "RelativeDocumentMoniker": "PowerArmor\\ARA_PowerArmor.cs", - "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\PowerArmor\\ARA_PowerArmor.cs", - "RelativeToolTip": "PowerArmor\\ARA_PowerArmor.cs", - "ViewState": "AgIAAAAAAAAAAAAAAAAAACQAAAAAAAAAAAAAAA==", + "Title": "Verb_ShootArc.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Verbs\\Verb_ShootArc.cs", + "RelativeDocumentMoniker": "Verbs\\Verb_ShootArc.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Verbs\\Verb_ShootArc.cs", + "RelativeToolTip": "Verbs\\Verb_ShootArc.cs", + "ViewState": "AgIAAAAAAAAAAAAAAADwvwAAAAAAAAAAAAAAAA==", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2025-10-18T16:30:55.497Z", + "WhenOpened": "2025-10-19T13:10:19.942Z", "EditorCaption": "" - }, - { - "$type": "Document", - "DocumentIndex": 4, - "Title": "CompAbilityEffect_Possess.cs", - "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_HuggingFace\\CompAbilityEffect_Possess.cs", - "RelativeDocumentMoniker": "Abilities\\ARA_HuggingFace\\CompAbilityEffect_Possess.cs", - "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_HuggingFace\\CompAbilityEffect_Possess.cs", - "RelativeToolTip": "Abilities\\ARA_HuggingFace\\CompAbilityEffect_Possess.cs", - "ViewState": "AgIAACwAAAAAAAAAAAAkwDsAAAAtAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2025-10-18T13:31:46.288Z" - }, - { - "$type": "Document", - "DocumentIndex": 5, - "Title": "Building_NutrientVat.cs", - "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_NutrientVat\\Building_NutrientVat.cs", - "RelativeDocumentMoniker": "Building_Comps\\ARA_NutrientVat\\Building_NutrientVat.cs", - "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_NutrientVat\\Building_NutrientVat.cs", - "RelativeToolTip": "Building_Comps\\ARA_NutrientVat\\Building_NutrientVat.cs", - "ViewState": "AgIAAAgAAAAAAAAAAAAQwBAAAAAIAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2025-10-18T11:56:31.022Z" - }, - { - "$type": "Document", - "DocumentIndex": 6, - "Title": "Building_RefuelingVat.cs", - "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_Building_RefuelingVat\\Building_RefuelingVat.cs", - "RelativeDocumentMoniker": "Building_Comps\\ARA_Building_RefuelingVat\\Building_RefuelingVat.cs", - "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_Building_RefuelingVat\\Building_RefuelingVat.cs", - "RelativeToolTip": "Building_Comps\\ARA_Building_RefuelingVat\\Building_RefuelingVat.cs", - "ViewState": "AgIAAGcAAAAAAAAAAAAAAI4AAAAgAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2025-10-18T11:56:12.333Z" - }, - { - "$type": "Document", - "DocumentIndex": 8, - "Title": "CompNutritionToFuelConverter.cs", - "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\CompNutritionToFuelConverter.cs", - "RelativeDocumentMoniker": "Building_Comps\\CompNutritionToFuelConverter.cs", - "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\CompNutritionToFuelConverter.cs", - "RelativeToolTip": "Building_Comps\\CompNutritionToFuelConverter.cs", - "ViewState": "AgIAAGEAAAAAAAAAAAAQwHYAAAAJAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2025-10-17T11:32:00.484Z" - }, - { - "$type": "Document", - "DocumentIndex": 9, - "Title": "CompResearchProducer.cs", - "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_CompInteractiveProducer\\CompResearchProducer.cs", - "RelativeDocumentMoniker": "Building_Comps\\ARA_CompInteractiveProducer\\CompResearchProducer.cs", - "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_CompInteractiveProducer\\CompResearchProducer.cs", - "RelativeToolTip": "Building_Comps\\ARA_CompInteractiveProducer\\CompResearchProducer.cs", - "ViewState": "AgIAADoBAAAAAAAAAAAkwFIBAAAmAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2025-10-17T09:09:18.518Z" - }, - { - "$type": "Document", - "DocumentIndex": 7, - "Title": "CompInteractiveProducer.cs", - "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_CompInteractiveProducer\\CompInteractiveProducer.cs", - "RelativeDocumentMoniker": "Building_Comps\\ARA_CompInteractiveProducer\\CompInteractiveProducer.cs", - "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_CompInteractiveProducer\\CompInteractiveProducer.cs", - "RelativeToolTip": "Building_Comps\\ARA_CompInteractiveProducer\\CompInteractiveProducer.cs", - "ViewState": "AgIAAAwAAAAAAAAAAAAgwGYAAABWAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2025-10-17T09:00:51.526Z" } ] } diff --git a/Source/ArachnaeSwarm/Verbs/Projectiles/Projectile_WulaPenetratingBullet.cs b/Source/ArachnaeSwarm/Verbs/Projectiles/Projectile_WulaPenetratingBullet.cs index 1481ad4..6e7056c 100644 --- a/Source/ArachnaeSwarm/Verbs/Projectiles/Projectile_WulaPenetratingBullet.cs +++ b/Source/ArachnaeSwarm/Verbs/Projectiles/Projectile_WulaPenetratingBullet.cs @@ -5,197 +5,181 @@ using Verse; namespace ArachnaeSwarm { - // Final, robust extension class for configuring path-based penetration. - public class Wula_PathPierce_Extension : DefModExtension + // 在 Wula_PathPierce_Extension 类中添加粒子特效相关的属性 + public class Wula_PathPierce_Extension : DefModExtension + { + // 原有的穿透属性 + public int maxHits = 3; + public float damageFalloff = 0.25f; + public bool preventFriendlyFire = false; + public FleckDef tailFleckDef; + public int fleckDelayTicks = 10; + + // 新增的击中特效属性(来自 Projectile_BulletWithEffect_Extension) + public EffecterDef impactEffecter; // 击中时的特效 + } + public class Projectile_WulaLineAttack : Bullet + { + private int hitCounter = 0; + private List alreadyDamaged = new List(); + private Vector3 lastTickPosition; + private int Fleck_MakeFleckTick; + public int Fleck_MakeFleckTickMax = 1; + public IntRange Fleck_MakeFleckNum = new IntRange(1, 1); + public FloatRange Fleck_Angle = new FloatRange(-180f, 180f); + public FloatRange Fleck_Scale = new FloatRange(1f, 1f); + public FloatRange Fleck_Speed = new FloatRange(0f, 0f); + public FloatRange Fleck_Rotation = new FloatRange(-180f, 180f); + private Wula_PathPierce_Extension Props => def.GetModExtension(); + public override void ExposeData() { - // Set to a positive number for limited hits, or -1 for infinite penetration. - public int maxHits = 3; - // The percentage of damage lost per hit. 0.25 means 25% damage loss per hit. - public float damageFalloff = 0.25f; - // If true, this projectile will never cause friendly fire, regardless of game settings. - public bool preventFriendlyFire = false; - public FleckDef tailFleckDef; // 用于配置拖尾特效的 FleckDef - public int fleckDelayTicks = 10; // 拖尾特效延迟生成时间(tick) + base.ExposeData(); + Scribe_Values.Look(ref hitCounter, "hitCounter", 0); + Scribe_Collections.Look(ref alreadyDamaged, "alreadyDamaged", LookMode.Reference); + Scribe_Values.Look(ref lastTickPosition, "lastTickPosition"); + if (alreadyDamaged == null) + { + alreadyDamaged = new List(); + } + } + public override void Launch(Thing launcher, Vector3 origin, LocalTargetInfo usedTarget, LocalTargetInfo intendedTarget, ProjectileHitFlags hitFlags, bool preventFriendlyFire = false, Thing equipment = null, ThingDef targetCoverDef = null) + { + base.Launch(launcher, origin, usedTarget, intendedTarget, hitFlags, preventFriendlyFire, equipment, targetCoverDef); + this.lastTickPosition = origin; + this.alreadyDamaged.Clear(); + this.hitCounter = 0; + this.preventFriendlyFire = preventFriendlyFire || (Props?.preventFriendlyFire ?? false); + } + protected override void Tick() + { + Vector3 startPos = this.lastTickPosition; + base.Tick(); + + if (this.Destroyed) return; + this.Fleck_MakeFleckTick++; + if (this.Fleck_MakeFleckTick >= Props.fleckDelayTicks) + { + if (this.Fleck_MakeFleckTick >= (Props.fleckDelayTicks + this.Fleck_MakeFleckTickMax)) + { + this.Fleck_MakeFleckTick = Props.fleckDelayTicks; + } + Map map = base.Map; + int randomInRange = this.Fleck_MakeFleckNum.RandomInRange; + Vector3 currentPosition = this.ExactPosition; + for (int i = 0; i < randomInRange; i++) + { + float currentBulletAngle = ExactRotation.eulerAngles.y; + float fleckRotationAngle = currentBulletAngle; + float velocityAngle = this.Fleck_Angle.RandomInRange + currentBulletAngle; + float randomInRange2 = this.Fleck_Scale.RandomInRange; + float randomInRange3 = this.Fleck_Speed.RandomInRange; + + if (Props?.tailFleckDef != null) + { + FleckCreationData dataStatic = FleckMaker.GetDataStatic(currentPosition, map, Props.tailFleckDef, randomInRange2); + dataStatic.rotation = fleckRotationAngle; + dataStatic.rotationRate = this.Fleck_Rotation.RandomInRange; + dataStatic.velocityAngle = velocityAngle; + dataStatic.velocitySpeed = randomInRange3; + map.flecks.CreateFleck(dataStatic); + } + } + } + if (this.Destroyed) return; + Vector3 endPos = this.ExactPosition; + + CheckPathForDamage(startPos, endPos); + this.lastTickPosition = endPos; } - public class Projectile_WulaLineAttack : Bullet + protected override void Impact(Thing hitThing, bool blockedByShield = false) { - private int hitCounter = 0; - private List alreadyDamaged = new List(); - private Vector3 lastTickPosition; - private int Fleck_MakeFleckTick; // 拖尾特效的计时器 - public int Fleck_MakeFleckTickMax = 1; // 拖尾特效的生成频率 - public IntRange Fleck_MakeFleckNum = new IntRange(1, 1); // 每次生成的粒子数量 - public FloatRange Fleck_Angle = new FloatRange(-180f, 180f); // 粒子角度 - public FloatRange Fleck_Scale = new FloatRange(1f, 1f); // 粒子大小 - public FloatRange Fleck_Speed = new FloatRange(0f, 0f); // 粒子速度 - public FloatRange Fleck_Rotation = new FloatRange(-180f, 180f); // 粒子旋转 + // 原有的穿透检测 + CheckPathForDamage(lastTickPosition, this.ExactPosition); - private Wula_PathPierce_Extension Props => def.GetModExtension(); + if (hitThing != null && alreadyDamaged.Contains(hitThing)) + { + base.Impact(null, blockedByShield); + } + else + { + base.Impact(hitThing, blockedByShield); + } - public override void ExposeData() - { - base.ExposeData(); - Scribe_Values.Look(ref hitCounter, "hitCounter", 0); - Scribe_Collections.Look(ref alreadyDamaged, "alreadyDamaged", LookMode.Reference); - Scribe_Values.Look(ref lastTickPosition, "lastTickPosition"); - if (alreadyDamaged == null) - { - alreadyDamaged = new List(); - } - } + // 新增:触发击中特效(来自 Projectile_BulletWithEffect 的功能) + if (Props?.impactEffecter != null) + { + // 创建一个新的 Effecter 实例并触发 + Effecter effecter = Props.impactEffecter.Spawn(); + effecter.Trigger(new TargetInfo(this.ExactPosition.ToIntVec3(), this.launcher.Map, false), this.launcher); - public override void Launch(Thing launcher, Vector3 origin, LocalTargetInfo usedTarget, LocalTargetInfo intendedTarget, ProjectileHitFlags hitFlags, bool preventFriendlyFire = false, Thing equipment = null, ThingDef targetCoverDef = null) - { - base.Launch(launcher, origin, usedTarget, intendedTarget, hitFlags, preventFriendlyFire, equipment, targetCoverDef); - this.lastTickPosition = origin; - this.alreadyDamaged.Clear(); - this.hitCounter = 0; - // Friendly fire is prevented if EITHER the game setting is true OR the XML extension is true. - this.preventFriendlyFire = preventFriendlyFire || (Props?.preventFriendlyFire ?? false); - } - - protected override void Tick() - { - Vector3 startPos = this.lastTickPosition; - base.Tick(); - - if (this.Destroyed) return; - - this.Fleck_MakeFleckTick++; - // 只有当达到延迟时间后才开始生成Fleck - if (this.Fleck_MakeFleckTick >= Props.fleckDelayTicks) - { - if (this.Fleck_MakeFleckTick >= (Props.fleckDelayTicks + this.Fleck_MakeFleckTickMax)) - { - this.Fleck_MakeFleckTick = Props.fleckDelayTicks; // 重置计时器,从延迟时间开始循环 - } - - Map map = base.Map; - int randomInRange = this.Fleck_MakeFleckNum.RandomInRange; - Vector3 currentPosition = this.ExactPosition; // Current position of the bullet - Vector3 previousPosition = this.lastTickPosition; // Previous position of the bullet - - for (int i = 0; i < randomInRange; i++) - { - float currentBulletAngle = ExactRotation.eulerAngles.y; // 使用子弹当前的水平旋转角度 - float fleckRotationAngle = currentBulletAngle; // Fleck 的旋转角度与子弹方向一致 - float velocityAngle = this.Fleck_Angle.RandomInRange + currentBulletAngle; // Fleck 的速度角度基于子弹方向加上随机偏移 - float randomInRange2 = this.Fleck_Scale.RandomInRange; - float randomInRange3 = this.Fleck_Speed.RandomInRange; - - if (Props?.tailFleckDef != null) - { - FleckCreationData dataStatic = FleckMaker.GetDataStatic(currentPosition, map, Props.tailFleckDef, randomInRange2); - dataStatic.rotation = fleckRotationAngle; - dataStatic.rotationRate = this.Fleck_Rotation.RandomInRange; - dataStatic.velocityAngle = velocityAngle; - dataStatic.velocitySpeed = randomInRange3; - map.flecks.CreateFleck(dataStatic); - } - } - } - - if (this.Destroyed) return; - - Vector3 endPos = this.ExactPosition; - - CheckPathForDamage(startPos, endPos); - - this.lastTickPosition = endPos; - } - - protected override void Impact(Thing hitThing, bool blockedByShield = false) - { - CheckPathForDamage(lastTickPosition, this.ExactPosition); - - if (hitThing != null && alreadyDamaged.Contains(hitThing)) - { - base.Impact(null, blockedByShield); - } - else - { - base.Impact(hitThing, blockedByShield); - } - } - - private void CheckPathForDamage(Vector3 startPos, Vector3 endPos) - { - if (startPos == endPos) return; - - int maxHits = Props?.maxHits ?? 1; - bool infinitePenetration = maxHits < 0; - - if (!infinitePenetration && hitCounter >= maxHits) return; - - Map map = this.Map; - float distance = Vector3.Distance(startPos, endPos); - Vector3 direction = (endPos - startPos).normalized; - - for (float i = 0; i < distance; i += 0.8f) - { - if (!infinitePenetration && hitCounter >= maxHits) break; - - Vector3 checkPos = startPos + direction * i; - var thingsInCell = new HashSet(map.thingGrid.ThingsListAt(checkPos.ToIntVec3())); - - foreach (Thing thing in thingsInCell) - { - if (thing is Pawn pawn && pawn != this.launcher && !alreadyDamaged.Contains(pawn)) - { - bool shouldDamage = false; - - // Case 1: Always damage the intended target if it's a pawn. This allows hunting. - if (this.intendedTarget.Thing == pawn) - { - shouldDamage = true; - } - // Case 2: Always damage hostile pawns in the path. - else if (pawn.HostileTo(this.launcher)) - { - shouldDamage = true; - } - // Case 3: Damage non-hostiles (friendlies, neutrals) if the shot itself isn't marked to prevent friendly fire. - else if (!this.preventFriendlyFire) - { - shouldDamage = true; - } - - if (shouldDamage) - { - ApplyPathDamage(pawn); - if (!infinitePenetration && hitCounter >= maxHits) break; - } - } - } - } - } - - private void ApplyPathDamage(Pawn pawn) - { - Wula_PathPierce_Extension props = Props; - float falloff = props?.damageFalloff ?? 0.25f; - - // Damage falloff now applies universally, even for infinite penetration. - float damageMultiplier = Mathf.Pow(1f - falloff, hitCounter); - - int damageAmount = (int)(this.DamageAmount * damageMultiplier); - if (damageAmount <= 0) return; - - var dinfo = new DamageInfo( - this.def.projectile.damageDef, - damageAmount, - this.ArmorPenetration * damageMultiplier, - this.ExactRotation.eulerAngles.y, - this.launcher, - null, - this.equipmentDef, - DamageInfo.SourceCategory.ThingOrUnknown, - this.intendedTarget.Thing); - - pawn.TakeDamage(dinfo); - alreadyDamaged.Add(pawn); - hitCounter++; - } + // 可选:在一段时间后清理 Effecter + // 这里我们使用一个临时的 Effecter,所以不需要手动清理 + } } + private void CheckPathForDamage(Vector3 startPos, Vector3 endPos) + { + if (startPos == endPos) return; + int maxHits = Props?.maxHits ?? 1; + bool infinitePenetration = maxHits < 0; + if (!infinitePenetration && hitCounter >= maxHits) return; + Map map = this.Map; + float distance = Vector3.Distance(startPos, endPos); + Vector3 direction = (endPos - startPos).normalized; + for (float i = 0; i < distance; i += 0.8f) + { + if (!infinitePenetration && hitCounter >= maxHits) break; + Vector3 checkPos = startPos + direction * i; + var thingsInCell = new HashSet(map.thingGrid.ThingsListAt(checkPos.ToIntVec3())); + foreach (Thing thing in thingsInCell) + { + if (thing is Pawn pawn && pawn != this.launcher && !alreadyDamaged.Contains(pawn)) + { + bool shouldDamage = false; + if (this.intendedTarget.Thing == pawn) + { + shouldDamage = true; + } + else if (pawn.HostileTo(this.launcher)) + { + shouldDamage = true; + } + else if (!this.preventFriendlyFire) + { + shouldDamage = true; + } + if (shouldDamage) + { + ApplyPathDamage(pawn); + if (!infinitePenetration && hitCounter >= maxHits) break; + } + } + } + } + } + private void ApplyPathDamage(Pawn pawn) + { + Wula_PathPierce_Extension props = Props; + float falloff = props?.damageFalloff ?? 0.25f; + + float damageMultiplier = Mathf.Pow(1f - falloff, hitCounter); + + int damageAmount = (int)(this.DamageAmount * damageMultiplier); + if (damageAmount <= 0) return; + var dinfo = new DamageInfo( + this.def.projectile.damageDef, + damageAmount, + this.ArmorPenetration * damageMultiplier, + this.ExactRotation.eulerAngles.y, + this.launcher, + null, + this.equipmentDef, + DamageInfo.SourceCategory.ThingOrUnknown, + this.intendedTarget.Thing); + + pawn.TakeDamage(dinfo); + alreadyDamaged.Add(pawn); + hitCounter++; + } + } } \ No newline at end of file diff --git a/非公开资源/Content/Textures/Apperal/ARA_SpiderOne_PowerArmor_Thin_south.sai2 b/非公开资源/Content/Textures/Apperal/ARA_SpiderOne_PowerArmor_Thin_south.sai2 index 980d782..65f3b67 100644 Binary files a/非公开资源/Content/Textures/Apperal/ARA_SpiderOne_PowerArmor_Thin_south.sai2 and b/非公开资源/Content/Textures/Apperal/ARA_SpiderOne_PowerArmor_Thin_south.sai2 differ