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
-
-
-
- false
- 24
-
-
-
-
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
+
+
+
+ false
+ 24
+
+
+
+
\ 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 @@
Frost cloud
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