From 6e53b19e201d14bf1772b70aaf74ba3f5503a865 Mon Sep 17 00:00:00 2001 From: "ProjectKoi-Kalo\\Kalo" Date: Sun, 7 Sep 2025 15:28:24 +0800 Subject: [PATCH 1/7] =?UTF-8?q?zz=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.6/1.6/Assemblies/ArachnaeSwarm.dll | Bin 88064 -> 93184 bytes .../AbilityDefs/Abilities_TrackingCharge.xml | 46 ++++++ .../CompAbilityEffect_TrackingCharge.cs | 10 ++ .../CompProperties_TrackingCharge.cs | 20 +++ .../Abilities/PawnFlyer_TrackingCharge.cs | 156 ++++++++++++++++++ .../Verb_CastAbilityTrackingCharge.cs | 47 ++++++ Source/ArachnaeSwarm/ArachnaeSwarm.csproj | 6 + .../Documents/design_doc_tracking_charge.md | 97 +++++++++++ 8 files changed, 382 insertions(+) create mode 100644 1.6/Defs/AbilityDefs/Abilities_TrackingCharge.xml create mode 100644 Source/ArachnaeSwarm/Abilities/CompAbilityEffect_TrackingCharge.cs create mode 100644 Source/ArachnaeSwarm/Abilities/CompProperties_TrackingCharge.cs create mode 100644 Source/ArachnaeSwarm/Abilities/PawnFlyer_TrackingCharge.cs create mode 100644 Source/ArachnaeSwarm/Abilities/Verb_CastAbilityTrackingCharge.cs create mode 100644 Source/Documents/design_doc_tracking_charge.md diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll index 8dfdd792d3e3e45d429bd46467e43e5d40264abd..54e8aea1ef660515e91e662296188a35106edc14 100644 GIT binary patch delta 29940 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 + + + + + ARA_Flyer_TrackingCharge + ArachnaeSwarm.PawnFlyer_TrackingCharge + + 0.5 + 2.0 + + + + + + ARA_Ability_TrackingCharge + + Launch yourself towards a target, dealing damage to everything in your path. The damage increases the further you travel. + UI/Abilities/Charge + 600 + + ArachnaeSwarm.Verb_CastAbilityTrackingCharge + + + true + false + true + true + false + + 30 + 1.0 + + +
  • + 1.5 + 15 + 2 + 4 + Blunt + ARA_Flyer_TrackingCharge +
  • +
    +
    + +
    \ No newline at end of file diff --git a/Source/ArachnaeSwarm/Abilities/CompAbilityEffect_TrackingCharge.cs b/Source/ArachnaeSwarm/Abilities/CompAbilityEffect_TrackingCharge.cs new file mode 100644 index 0000000..4ad20ec --- /dev/null +++ b/Source/ArachnaeSwarm/Abilities/CompAbilityEffect_TrackingCharge.cs @@ -0,0 +1,10 @@ +using RimWorld; +using Verse; + +namespace ArachnaeSwarm +{ + public class CompAbilityEffect_TrackingCharge : CompAbilityEffect + { + public new CompProperties_TrackingCharge Props => (CompProperties_TrackingCharge)this.props; + } +} \ No newline at end of file diff --git a/Source/ArachnaeSwarm/Abilities/CompProperties_TrackingCharge.cs b/Source/ArachnaeSwarm/Abilities/CompProperties_TrackingCharge.cs new file mode 100644 index 0000000..db76cb4 --- /dev/null +++ b/Source/ArachnaeSwarm/Abilities/CompProperties_TrackingCharge.cs @@ -0,0 +1,20 @@ +using RimWorld; +using Verse; + +namespace ArachnaeSwarm +{ + public class CompProperties_TrackingCharge : CompProperties_AbilityEffect + { + public float homingSpeed = 1.0f; + public float initialDamage = 10f; + public float damagePerTile = 2f; + public float inertiaDistance = 3f; + public DamageDef collisionDamageDef; + public ThingDef flyerDef; + + public CompProperties_TrackingCharge() + { + this.compClass = typeof(CompAbilityEffect_TrackingCharge); + } + } +} \ No newline at end of file diff --git a/Source/ArachnaeSwarm/Abilities/PawnFlyer_TrackingCharge.cs b/Source/ArachnaeSwarm/Abilities/PawnFlyer_TrackingCharge.cs new file mode 100644 index 0000000..d15706d --- /dev/null +++ b/Source/ArachnaeSwarm/Abilities/PawnFlyer_TrackingCharge.cs @@ -0,0 +1,156 @@ +using RimWorld; +using UnityEngine; +using Verse; +using System.Reflection; +using System.Linq; +using Verse.AI; +using System.Collections.Generic; + +namespace ArachnaeSwarm +{ + public class PawnFlyer_TrackingCharge : PawnFlyer + { + // --- Public fields to be set by the Verb --- + public float homingSpeed; + public float initialDamage; + public float damagePerTile; + public float inertiaDistance; + public DamageDef collisionDamageDef; + public LocalTargetInfo primaryTarget; + + // --- Internal state --- + private Vector3 currentSpeed; + private float distanceTraveled = 0f; + private bool homing = true; + private int inertiaTicks = -1; + private Vector3 exactPosition; + + // --- Reflection Fields --- + private static FieldInfo TicksFlyingInfo; + private static FieldInfo TicksFlightTimeInfo; + private static FieldInfo StartVecInfo; + private static FieldInfo DestCellInfo; + private static FieldInfo PawnWasDraftedInfo; + private static FieldInfo PawnCanFireAtWillInfo; + private static FieldInfo JobQueueInfo; + private static FieldInfo InnerContainerInfo; + + static PawnFlyer_TrackingCharge() + { + TicksFlyingInfo = typeof(PawnFlyer).GetField("ticksFlying", BindingFlags.Instance | BindingFlags.NonPublic); + TicksFlightTimeInfo = typeof(PawnFlyer).GetField("ticksFlightTime", BindingFlags.Instance | BindingFlags.NonPublic); + StartVecInfo = typeof(PawnFlyer).GetField("startVec", BindingFlags.Instance | BindingFlags.NonPublic); + DestCellInfo = typeof(PawnFlyer).GetField("destCell", BindingFlags.Instance | BindingFlags.NonPublic); + PawnWasDraftedInfo = typeof(PawnFlyer).GetField("pawnWasDrafted", BindingFlags.NonPublic | BindingFlags.Instance); + PawnCanFireAtWillInfo = typeof(PawnFlyer).GetField("pawnCanFireAtWill", BindingFlags.NonPublic | BindingFlags.Instance); + JobQueueInfo = typeof(PawnFlyer).GetField("jobQueue", BindingFlags.NonPublic | BindingFlags.Instance); + InnerContainerInfo = typeof(PawnFlyer).GetField("innerContainer", BindingFlags.NonPublic | BindingFlags.Instance); + } + + // Custom initializer called by the Verb + public void StartFlight(Pawn pawn, IntVec3 finalDest) + { + var innerContainer = (ThingOwner)InnerContainerInfo.GetValue(this); + + StartVecInfo.SetValue(this, pawn.TrueCenter()); + DestCellInfo.SetValue(this, finalDest); + PawnWasDraftedInfo.SetValue(this, pawn.Drafted); + if (pawn.drafter != null) PawnCanFireAtWillInfo.SetValue(this, pawn.drafter.FireAtWill); + if (pawn.CurJob != null) pawn.jobs.SuspendCurrentJob(JobCondition.InterruptForced); + JobQueueInfo.SetValue(this, pawn.jobs.CaptureAndClearJobQueue()); + + if (pawn.Spawned) pawn.DeSpawn(DestroyMode.WillReplace); + if (!innerContainer.TryAdd(pawn)) + { + Log.Error("Could not add pawn to tracking flyer."); + pawn.Destroy(); + } + } + + public override void SpawnSetup(Map map, bool respawningAfterLoad) + { + base.SpawnSetup(map, respawningAfterLoad); + if (!respawningAfterLoad) + { + this.exactPosition = base.DrawPos; + } + } + + protected override void Tick() + { + int ticksFlying = (int)TicksFlyingInfo.GetValue(this); + + if (ticksFlying == 0) + { + Vector3 startVec = (Vector3)StartVecInfo.GetValue(this); + IntVec3 destCell = (IntVec3)DestCellInfo.GetValue(this); + Vector3 destinationPos = GenThing.TrueCenter(destCell, Rot4.North, this.FlyingThing.def.size, this.def.Altitude); + Vector3 direction = (destinationPos - startVec).normalized; + this.currentSpeed = direction * this.def.pawnFlyer.flightSpeed; + } + + this.exactPosition += this.currentSpeed; + this.distanceTraveled += this.currentSpeed.magnitude; + + if (inertiaTicks > 0) + { + inertiaTicks--; + if (inertiaTicks <= 0) { Land(); return; } + } + else + { + if (homing && primaryTarget.HasThing && primaryTarget.Thing.Spawned) + { + Vector3 desiredDirection = (primaryTarget.Thing.DrawPos - this.exactPosition).normalized; + this.currentSpeed = Vector3.RotateTowards(this.currentSpeed, desiredDirection, this.homingSpeed * 0.017f, 999f).normalized * this.def.pawnFlyer.flightSpeed; + } + else + { + homing = false; + } + + float calculatedDamage = this.initialDamage + (this.distanceTraveled * this.damagePerTile); + var dinfo = new DamageInfo(this.collisionDamageDef, calculatedDamage, 1f, -1, this.FlyingPawn); + + if (homing && primaryTarget.HasThing && (this.exactPosition - primaryTarget.Thing.DrawPos).sqrMagnitude < 1.5f * 1.5f) + { + primaryTarget.Thing.TakeDamage(dinfo); + homing = false; + this.inertiaTicks = (int)(this.inertiaDistance / this.currentSpeed.magnitude); + } + + foreach (var thing in GenRadial.RadialDistinctThingsAround(this.exactPosition.ToIntVec3(), this.Map, 1.0f, false)) + { + if (thing == this.FlyingPawn || thing == this || thing == primaryTarget.Thing) continue; + if (thing is Pawn pawn && !pawn.Downed && pawn.HostileTo(this.FlyingPawn)) pawn.TakeDamage(dinfo); + else if (thing.def.destroyable && thing.def.building != null) thing.TakeDamage(dinfo); + } + } + + try + { + DestCellInfo.SetValue(this, this.exactPosition.ToIntVec3()); + TicksFlightTimeInfo.SetValue(this, ticksFlying + 2); + } + catch (System.Exception ex) + { + Log.ErrorOnce($"Exception during reflection in PawnFlyer_TrackingCharge: {ex}", this.thingIDNumber); + } + + TicksFlyingInfo.SetValue(this, ticksFlying + 1); + + int flightTime = (int)TicksFlightTimeInfo.GetValue(this); + if (!this.exactPosition.ToIntVec3().InBounds(this.Map) || ticksFlying > flightTime * 2) + { + Land(); + } + } + + private void Land() + { + if (this.Destroyed) return; + base.RespawnPawn(); + this.Destroy(); + } + } +} \ No newline at end of file diff --git a/Source/ArachnaeSwarm/Abilities/Verb_CastAbilityTrackingCharge.cs b/Source/ArachnaeSwarm/Abilities/Verb_CastAbilityTrackingCharge.cs new file mode 100644 index 0000000..0cb816c --- /dev/null +++ b/Source/ArachnaeSwarm/Abilities/Verb_CastAbilityTrackingCharge.cs @@ -0,0 +1,47 @@ +using RimWorld; +using Verse; +using System.Linq; + +namespace ArachnaeSwarm +{ + public class Verb_CastAbilityTrackingCharge : Verb_CastAbility + { + protected override bool TryCastShot() + { + var props = this.ability.def.comps?.OfType().FirstOrDefault(); + if (props == null) + { + Log.Error("Verb_CastAbilityTrackingCharge requires CompProperties_TrackingCharge on the ability def."); + return false; + } + + if (props.flyerDef == null) + { + Log.Error("CompProperties_TrackingCharge requires a flyerDef."); + return false; + } + + if (this.CasterPawn == null || !this.CasterPawn.Spawned) + { + return false; + } + + // --- This is now a fully custom Thing, so we spawn it directly --- + var trackingCharge = (PawnFlyer_TrackingCharge)ThingMaker.MakeThing(props.flyerDef); + + // Inject properties + trackingCharge.homingSpeed = props.homingSpeed; + trackingCharge.initialDamage = props.initialDamage; + trackingCharge.damagePerTile = props.damagePerTile; + trackingCharge.inertiaDistance = props.inertiaDistance; + trackingCharge.collisionDamageDef = props.collisionDamageDef; + trackingCharge.primaryTarget = this.currentTarget; + + // Setup and spawn + trackingCharge.StartFlight(this.CasterPawn, this.currentTarget.Cell); + GenSpawn.Spawn(trackingCharge, this.CasterPawn.Position, this.CasterPawn.Map); + + return true; + } + } +} \ No newline at end of file diff --git a/Source/ArachnaeSwarm/ArachnaeSwarm.csproj b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj index abfe60a..78f4b07 100644 --- a/Source/ArachnaeSwarm/ArachnaeSwarm.csproj +++ b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj @@ -133,6 +133,12 @@ + + + + + + diff --git a/Source/Documents/design_doc_tracking_charge.md b/Source/Documents/design_doc_tracking_charge.md new file mode 100644 index 0000000..e0d56a0 --- /dev/null +++ b/Source/Documents/design_doc_tracking_charge.md @@ -0,0 +1,97 @@ +# 设计文档:跟踪冲撞技能 (Tracking Charge) + +**版本:** 0.1 + +## 1. 概述 + +本文档旨在详细说明一个新的 RimWorld 技能:“跟踪冲撞”。该技能允许一个 Pawn(施法者)像制导导弹一样冲向一个目标 Pawn。在飞行过程中,它会对路径上接触到的所有敌对单位和可破坏建筑造成伤害。伤害值会随着飞行距离的增加而累积。当撞击到主目标后,施法者会因惯性继续向前滑行一小段距离。 + +## 2. 核心功能需求 + +* **技能类型**: 主动施放的 targeted ability。 +* **移动方式**: 动态追踪曲线移动,而非直线或抛物线。 +* **伤害机制**: + * **路径伤害**: 对飞行路径上碰撞到的所有有效目标(敌方、中立、可破坏建筑)造成伤害。 + * **累积伤害**: 总伤害 = 基础伤害 + (飞行距离 * 每米伤害增量)。 + * **主目标伤害**: 与路径伤害计算方式相同。 +* **最终效果**: 撞击主目标后,追踪停止,施法者沿最后的方向继续滑行一小段距离后停下。 + +## 3. 技术架构 + +我们将采用基于自定义 `PawnFlyer` 的核心架构。这种方法将移动和效果逻辑封装在一个临时的 `Thing` 中,而施法者 Pawn 本身在技能持续期间会从地图上暂时移除。 + +### 3.1. 核心组件 + +| 组件名称 (C# Class) | 类型 | 职责 | +| ---------------------------------- | ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------- | +| `Verb_CastAbilityTrackingCharge` | `Verb` | **技能启动器**: 验证目标,从 `CompProperties` 读取配置,创建并初始化 `PawnFlyer_TrackingCharge`。 | +| `PawnFlyer_TrackingCharge` | `PawnFlyer` | **核心逻辑处理器**: 接收来自 `Verb` 的参数,实现追踪、碰撞、伤害、惯性等所有动态逻辑。 | +| `CompProperties_TrackingCharge` | `CompProperties_AbilityEffect` | **XML配置接口**: 在 `AbilityDef` 的 `` 中定义技能的所有可调参数,如伤害、速度、惯性等。 | +| `CompAbilityEffect_TrackingCharge` | `CompAbilityEffect` | **数据容器**: 作为一个轻量级的组件,其主要作用是让 `CompProperties_TrackingCharge` 能被游戏正确加载。它本身不执行复杂逻辑。 | + +### 3.2. 设计决策:配置的分层与传递 + +* **采纳的方案 (混合模式)**: 我们将采用一种既符合直觉又技术稳健的混合模式。 + 1. **配置集中在 `AbilityDef`**: 使用 `CompProperties_TrackingCharge` (继承自 `CompProperties_AbilityEffect`) 来存放所有技能参数。这使得 Mod 用户可以在 `AbilityDef` 的 `` 节点中方便地调整一切,符合 RimWorld 的标准实践。 + 2. **`Verb` 作为数据中介**: `Verb_CastAbilityTrackingCharge` 在施法时,会从 `this.ability.def` 中轻松获取到 `CompProperties_TrackingCharge` 的实例,读取所有配置参数。 + 3. **`PawnFlyer` 接收参数**: `Verb` 在创建 `PawnFlyer_TrackingCharge` 实例后,会通过一个自定义的初始化方法(例如 `Initialize(...)`),将所有读取到的参数“注入”到 `PawnFlyer` 实例中。 +* **优点**: 这个方案完美地解决了您的顾虑。配置的**易用性**(在 `AbilityDef` 中)和逻辑的**清晰性**(`PawnFlyer` 负责执行)都得到了保证。 + +### 3.3. 数据流与交互 + +```mermaid +graph TD + subgraph Player Action + A[玩家选择目标并施放技能] --> B(AbilityDef); + end + + subgraph XML Definitions + B -- contains --> E[CompProperties_TrackingCharge]; + B -- uses --> C(VerbDef); + C -- verbClass --> D[Verb_CastAbilityTrackingCharge]; + F(ThingDef for Flyer) -- thingClass --> G[PawnFlyer_TrackingCharge]; + end + + subgraph C# Logic + D -- 1. Reads Params from --> E; + D -- 2. Creates --> G; + D -- 3. Injects Params into --> G; + G -- 4. Executes Tick Logic --> H{追踪 & 碰撞}; + H -- 5. Applies Damage to --> I[Things on Path]; + G -- 6. Handles Inertia & Self-Destructs --> J[Final Position]; + end + + PlayerInput([施法者 Pawn]) -- temporarily removed --> G; + G -- places back --> PlayerInput; +``` + +## 4. 详细实现步骤 + +### 步骤 1: 创建 C# 类骨架 (最终版) + +* **文件**: `CompProperties_TrackingCharge.cs` + * **继承**: `Verse.CompProperties_AbilityEffect` + * **职责**: 定义所有可在 XML 中配置的技能参数。 + * **示例字段**: `public float homingSpeed;`, `public float initialDamage;`, `public float damagePerTile;`, `public float inertiaDistance;`, `public DamageDef collisionDamageDef;`, `public ThingDef flyerDef;` (用于指定飞行器的ThingDef)。 + +* **文件**: `CompAbilityEffect_TrackingCharge.cs` + * **继承**: `Verse.CompAbilityEffect` + * **职责**: 轻量级组件,其存在是为了让 `CompProperties_TrackingCharge` 能被游戏正确加载和访问。 + +* **文件**: `Verb_CastAbilityTrackingCharge.cs` + * **继承**: `Verse.Verb_CastAbility` + * **职责**: + 1. 在 `TryCastShot()` 中,从 `this.ability.GetComp().Props` 获取配置。 + 2. 调用 `PawnFlyer.MakeFlyer(Props.flyerDef, ...)` 创建 `PawnFlyer_TrackingCharge` 实例。 + 3. **将配置参数设置到 `PawnFlyer` 的公共字段上**。 + 4. 调用 `flyer.Launch()` 启动。 + +* **文件**: `PawnFlyer_TrackingCharge.cs` + * **继承**: `Verse.PawnFlyer` + * **职责**: + 1. 定义一系列**公共字段** (`public float homingSpeed;` 等) 来接收来自 `Verb` 的参数。 + 2. 在 `Tick()` 中实现所有核心的追踪、碰撞和伤害逻辑。 + * **注意**: **不**创建自定义的 `Initialize()` 方法,也**不**重写 `Launch()` 来接收参数,以保持设计的简洁和标准。 + +--- +> **下一步**: 设计文档已最终确定。我将开始实施 **步骤 1**,为您创建这四个 C# 类的代码框架。 \ No newline at end of file From b6f9e6193a4a0d9f11d1a2aa52322ce3f91bac5b Mon Sep 17 00:00:00 2001 From: "ProjectKoi-Kalo\\Kalo" Date: Sun, 7 Sep 2025 16:49:34 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E6=9A=82=E5=AD=981?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Defs/AbilityDefs/Abilities_TrackingCharge.xml | 14 +++++++------- 1.6/1.6/Defs/PawnKindDef/ARA_PawnKinds.xml | 3 +++ 2 files changed, 10 insertions(+), 7 deletions(-) rename 1.6/{ => 1.6}/Defs/AbilityDefs/Abilities_TrackingCharge.xml (74%) diff --git a/1.6/Defs/AbilityDefs/Abilities_TrackingCharge.xml b/1.6/1.6/Defs/AbilityDefs/Abilities_TrackingCharge.xml similarity index 74% rename from 1.6/Defs/AbilityDefs/Abilities_TrackingCharge.xml rename to 1.6/1.6/Defs/AbilityDefs/Abilities_TrackingCharge.xml index c1c2807..b8db240 100644 --- a/1.6/Defs/AbilityDefs/Abilities_TrackingCharge.xml +++ b/1.6/1.6/Defs/AbilityDefs/Abilities_TrackingCharge.xml @@ -6,17 +6,17 @@ ARA_Flyer_TrackingCharge ArachnaeSwarm.PawnFlyer_TrackingCharge - 0.5 - 2.0 + 0.1 + 0.1 ARA_Ability_TrackingCharge - - Launch yourself towards a target, dealing damage to everything in your path. The damage increases the further you travel. - UI/Abilities/Charge + + 阿拉克涅盾头种对目标发起蓄势冲撞,对路径上的一切造成伤害。飞行的距离越远,伤害越高。 + UI/Abilities/Charge 600 ArachnaeSwarm.Verb_CastAbilityTrackingCharge @@ -28,7 +28,7 @@ true false - 30 + 60 1.0 @@ -37,7 +37,7 @@ 15 2 4 - Blunt + Crush ARA_Flyer_TrackingCharge diff --git a/1.6/1.6/Defs/PawnKindDef/ARA_PawnKinds.xml b/1.6/1.6/Defs/PawnKindDef/ARA_PawnKinds.xml index 1ab551d..627874e 100644 --- a/1.6/1.6/Defs/PawnKindDef/ARA_PawnKinds.xml +++ b/1.6/1.6/Defs/PawnKindDef/ARA_PawnKinds.xml @@ -147,6 +147,9 @@ 0 + +
  • ARA_Ability_TrackingCharge
  • +
    ArachnaeNode_Race_WeaponSmith From 7a6d5380e1f32f0411ad206bb0a4d34505fdbf21 Mon Sep 17 00:00:00 2001 From: "ProjectKoi-Kalo\\Kalo" Date: Sun, 7 Sep 2025 17:11:53 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.6/1.6/Assemblies/ArachnaeSwarm.dll | Bin 93184 -> 93184 bytes .../AbilityDefs/Abilities_TrackingCharge.xml | 10 +++---- .../Abilities/PawnFlyer_TrackingCharge.cs | 19 ++++++++----- .../Verb_CastAbilityTrackingCharge.cs | 25 ++++++++++++++++-- 4 files changed, 41 insertions(+), 13 deletions(-) diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll index 54e8aea1ef660515e91e662296188a35106edc14..7cdd6efe33047a68ba7c2c23981e01d2064a5812 100644 GIT binary patch delta 19519 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 b7sd+}dxIVn{#1!qviF)N373R5S=#>(-jZ#( delta 19137 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ℜAKXcgd}QZ!94)JxH% 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 ArachnaeSwarm.PawnFlyer_TrackingCharge - 0.1 - 0.1 + 0.5 + 0 @@ -16,7 +16,7 @@ ARA_Ability_TrackingCharge 阿拉克涅盾头种对目标发起蓄势冲撞,对路径上的一切造成伤害。飞行的距离越远,伤害越高。 - UI/Abilities/Charge + UI/Commands/WarTrumpet 600 ArachnaeSwarm.Verb_CastAbilityTrackingCharge @@ -36,8 +36,8 @@ 1.5 15 2 - 4 - Crush + 6 + Blunt ARA_Flyer_TrackingCharge
    diff --git a/Source/ArachnaeSwarm/Abilities/PawnFlyer_TrackingCharge.cs b/Source/ArachnaeSwarm/Abilities/PawnFlyer_TrackingCharge.cs index d15706d..de8bea8 100644 --- a/Source/ArachnaeSwarm/Abilities/PawnFlyer_TrackingCharge.cs +++ b/Source/ArachnaeSwarm/Abilities/PawnFlyer_TrackingCharge.cs @@ -17,6 +17,7 @@ namespace ArachnaeSwarm public float inertiaDistance; public DamageDef collisionDamageDef; public LocalTargetInfo primaryTarget; + public int maxFlightTicks; // --- Internal state --- private Vector3 currentSpeed; @@ -24,6 +25,7 @@ namespace ArachnaeSwarm private bool homing = true; private int inertiaTicks = -1; private Vector3 exactPosition; + private bool hasHitPrimaryTarget = false; // --- Reflection Fields --- private static FieldInfo TicksFlyingInfo; @@ -112,8 +114,9 @@ namespace ArachnaeSwarm float calculatedDamage = this.initialDamage + (this.distanceTraveled * this.damagePerTile); var dinfo = new DamageInfo(this.collisionDamageDef, calculatedDamage, 1f, -1, this.FlyingPawn); - if (homing && primaryTarget.HasThing && (this.exactPosition - primaryTarget.Thing.DrawPos).sqrMagnitude < 1.5f * 1.5f) + if (!hasHitPrimaryTarget && homing && primaryTarget.HasThing && primaryTarget.Thing.Spawned && (this.exactPosition - primaryTarget.Thing.DrawPos).sqrMagnitude < 1.5f * 1.5f) { + hasHitPrimaryTarget = true; // Mark as hit to prevent re-triggering primaryTarget.Thing.TakeDamage(dinfo); homing = false; this.inertiaTicks = (int)(this.inertiaDistance / this.currentSpeed.magnitude); @@ -121,7 +124,9 @@ namespace ArachnaeSwarm foreach (var thing in GenRadial.RadialDistinctThingsAround(this.exactPosition.ToIntVec3(), this.Map, 1.0f, false)) { - if (thing == this.FlyingPawn || thing == this || thing == primaryTarget.Thing) continue; + // Avoid damaging self or the primary target (which is handled above) + if (thing == this.FlyingPawn || thing == this || (hasHitPrimaryTarget && thing == primaryTarget.Thing)) continue; + if (thing is Pawn pawn && !pawn.Downed && pawn.HostileTo(this.FlyingPawn)) pawn.TakeDamage(dinfo); else if (thing.def.destroyable && thing.def.building != null) thing.TakeDamage(dinfo); } @@ -129,8 +134,10 @@ namespace ArachnaeSwarm try { + // We still need to update the destination for the base flyer logic to work correctly DestCellInfo.SetValue(this, this.exactPosition.ToIntVec3()); - TicksFlightTimeInfo.SetValue(this, ticksFlying + 2); + // --- FIX for infinite flight --- + // The old TicksFlightTimeInfo update logic is removed. } catch (System.Exception ex) { @@ -138,9 +145,9 @@ namespace ArachnaeSwarm } TicksFlyingInfo.SetValue(this, ticksFlying + 1); - - int flightTime = (int)TicksFlightTimeInfo.GetValue(this); - if (!this.exactPosition.ToIntVec3().InBounds(this.Map) || ticksFlying > flightTime * 2) + + // --- RELIABLE TIMEOUT & BOUNDS CHECK --- + if (ticksFlying > this.maxFlightTicks || !this.exactPosition.ToIntVec3().InBounds(this.Map)) { Land(); } diff --git a/Source/ArachnaeSwarm/Abilities/Verb_CastAbilityTrackingCharge.cs b/Source/ArachnaeSwarm/Abilities/Verb_CastAbilityTrackingCharge.cs index 0cb816c..71f2a6f 100644 --- a/Source/ArachnaeSwarm/Abilities/Verb_CastAbilityTrackingCharge.cs +++ b/Source/ArachnaeSwarm/Abilities/Verb_CastAbilityTrackingCharge.cs @@ -21,11 +21,21 @@ namespace ArachnaeSwarm return false; } + // --- Best Practice: Cache Map and Position FIRST --- + // Per MCP analysis, Caster.Map is the most reliable source. + // Cache this before ANY other logic. + Map map = this.Caster.Map; + if (map == null) + { + Log.Error($"Verb_CastAbilityTrackingCharge: Caster {this.Caster.LabelCap} has a null map. Cannot cast."); + return false; + } + if (this.CasterPawn == null || !this.CasterPawn.Spawned) { return false; } - + // --- This is now a fully custom Thing, so we spawn it directly --- var trackingCharge = (PawnFlyer_TrackingCharge)ThingMaker.MakeThing(props.flyerDef); @@ -37,9 +47,20 @@ namespace ArachnaeSwarm trackingCharge.collisionDamageDef = props.collisionDamageDef; trackingCharge.primaryTarget = this.currentTarget; + // --- Dynamic Timeout Calculation --- + float flightSpeed = props.flyerDef.pawnFlyer.flightSpeed; + if (flightSpeed <= 0) + { + Log.Error("flyerDef has no flightSpeed, cannot calculate timeout."); + return false; + } + // Timeout is twice the time it would take to fly the max range in a straight line + int maxTicks = (int)((this.verbProps.range / flightSpeed) * 2.0f); + trackingCharge.maxFlightTicks = maxTicks; + // Setup and spawn trackingCharge.StartFlight(this.CasterPawn, this.currentTarget.Cell); - GenSpawn.Spawn(trackingCharge, this.CasterPawn.Position, this.CasterPawn.Map); + GenSpawn.Spawn(trackingCharge, this.CasterPawn.Position, map); // Use the cached map return true; } From b28594c604541a63f21beaeb3d01e621180619b3 Mon Sep 17 00:00:00 2001 From: "ProjectKoi-Kalo\\Kalo" Date: Sun, 7 Sep 2025 17:27:06 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.6/1.6/Assemblies/ArachnaeSwarm.dll | Bin 93184 -> 93696 bytes .../AbilityDefs/Abilities_TrackingCharge.xml | 3 +++ .../CompProperties_TrackingCharge.cs | 3 +++ .../Abilities/PawnFlyer_TrackingCharge.cs | 9 ++++++++- .../Verb_CastAbilityTrackingCharge.cs | 14 +++----------- 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll index 7cdd6efe33047a68ba7c2c23981e01d2064a5812..e6c77194a5856e68f92917dcede0f64db651053b 100644 GIT binary patch delta 25412 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 BA1?p^ delta 25531 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 diff --git a/1.6/1.6/Defs/AbilityDefs/Abilities_TrackingCharge.xml b/1.6/1.6/Defs/AbilityDefs/Abilities_TrackingCharge.xml index bd9904e..fb0e415 100644 --- a/1.6/1.6/Defs/AbilityDefs/Abilities_TrackingCharge.xml +++ b/1.6/1.6/Defs/AbilityDefs/Abilities_TrackingCharge.xml @@ -39,6 +39,9 @@ 6 Blunt ARA_Flyer_TrackingCharge + 600 + 2.5 + Pawn_Melee_BigBash_HitPawn
    diff --git a/Source/ArachnaeSwarm/Abilities/CompProperties_TrackingCharge.cs b/Source/ArachnaeSwarm/Abilities/CompProperties_TrackingCharge.cs index db76cb4..f770f25 100644 --- a/Source/ArachnaeSwarm/Abilities/CompProperties_TrackingCharge.cs +++ b/Source/ArachnaeSwarm/Abilities/CompProperties_TrackingCharge.cs @@ -11,6 +11,9 @@ namespace ArachnaeSwarm public float inertiaDistance = 3f; public DamageDef collisionDamageDef; public ThingDef flyerDef; + public int maxFlightTicks = 300; // Default 5 seconds timeout + public float collisionRadius = 1.5f; + public SoundDef impactSound; public CompProperties_TrackingCharge() { diff --git a/Source/ArachnaeSwarm/Abilities/PawnFlyer_TrackingCharge.cs b/Source/ArachnaeSwarm/Abilities/PawnFlyer_TrackingCharge.cs index de8bea8..2edbe83 100644 --- a/Source/ArachnaeSwarm/Abilities/PawnFlyer_TrackingCharge.cs +++ b/Source/ArachnaeSwarm/Abilities/PawnFlyer_TrackingCharge.cs @@ -5,6 +5,7 @@ using System.Reflection; using System.Linq; using Verse.AI; using System.Collections.Generic; +using Verse.Sound; namespace ArachnaeSwarm { @@ -18,6 +19,8 @@ namespace ArachnaeSwarm public DamageDef collisionDamageDef; public LocalTargetInfo primaryTarget; public int maxFlightTicks; + public float collisionRadius; + public SoundDef impactSound; // --- Internal state --- private Vector3 currentSpeed; @@ -114,8 +117,12 @@ namespace ArachnaeSwarm float calculatedDamage = this.initialDamage + (this.distanceTraveled * this.damagePerTile); var dinfo = new DamageInfo(this.collisionDamageDef, calculatedDamage, 1f, -1, this.FlyingPawn); - if (!hasHitPrimaryTarget && homing && primaryTarget.HasThing && primaryTarget.Thing.Spawned && (this.exactPosition - primaryTarget.Thing.DrawPos).sqrMagnitude < 1.5f * 1.5f) + if (!hasHitPrimaryTarget && homing && primaryTarget.HasThing && primaryTarget.Thing.Spawned && (this.exactPosition - primaryTarget.Thing.DrawPos).sqrMagnitude < this.collisionRadius * this.collisionRadius) { + if (this.impactSound != null) + { + SoundStarter.PlayOneShot(this.impactSound, new TargetInfo(this.exactPosition.ToIntVec3(), this.Map)); + } hasHitPrimaryTarget = true; // Mark as hit to prevent re-triggering primaryTarget.Thing.TakeDamage(dinfo); homing = false; diff --git a/Source/ArachnaeSwarm/Abilities/Verb_CastAbilityTrackingCharge.cs b/Source/ArachnaeSwarm/Abilities/Verb_CastAbilityTrackingCharge.cs index 71f2a6f..2c07dce 100644 --- a/Source/ArachnaeSwarm/Abilities/Verb_CastAbilityTrackingCharge.cs +++ b/Source/ArachnaeSwarm/Abilities/Verb_CastAbilityTrackingCharge.cs @@ -46,17 +46,9 @@ namespace ArachnaeSwarm trackingCharge.inertiaDistance = props.inertiaDistance; trackingCharge.collisionDamageDef = props.collisionDamageDef; trackingCharge.primaryTarget = this.currentTarget; - - // --- Dynamic Timeout Calculation --- - float flightSpeed = props.flyerDef.pawnFlyer.flightSpeed; - if (flightSpeed <= 0) - { - Log.Error("flyerDef has no flightSpeed, cannot calculate timeout."); - return false; - } - // Timeout is twice the time it would take to fly the max range in a straight line - int maxTicks = (int)((this.verbProps.range / flightSpeed) * 2.0f); - trackingCharge.maxFlightTicks = maxTicks; + trackingCharge.maxFlightTicks = props.maxFlightTicks; + trackingCharge.collisionRadius = props.collisionRadius; + trackingCharge.impactSound = props.impactSound; // Setup and spawn trackingCharge.StartFlight(this.CasterPawn, this.currentTarget.Cell); From acfc078f91484ce50a2083986bdbb18ef984d63e Mon Sep 17 00:00:00 2001 From: "ProjectKoi-Kalo\\Kalo" Date: Sun, 7 Sep 2025 18:10:03 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.6/1.6/Assemblies/ArachnaeSwarm.dll | Bin 93696 -> 92672 bytes .../AbilityDefs/Abilities_TrackingCharge.xml | 5 +- .../CompProperties_TrackingCharge.cs | 2 - .../Abilities/PawnFlyer_TrackingCharge.cs | 117 ++++++++---------- .../Verb_CastAbilityTrackingCharge.cs | 8 +- 5 files changed, 62 insertions(+), 70 deletions(-) diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll index e6c77194a5856e68f92917dcede0f64db651053b..e2e49d2e066f4fa7d49e3900638a534fd9e9a53b 100644 GIT binary patch delta 23947 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 delta 24874 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 Blunt ARA_Flyer_TrackingCharge - 600 2.5 Pawn_Melee_BigBash_HitPawn +
  • + WarTrumpet + 20 +
  • diff --git a/Source/ArachnaeSwarm/Abilities/CompProperties_TrackingCharge.cs b/Source/ArachnaeSwarm/Abilities/CompProperties_TrackingCharge.cs index f770f25..2ab22a9 100644 --- a/Source/ArachnaeSwarm/Abilities/CompProperties_TrackingCharge.cs +++ b/Source/ArachnaeSwarm/Abilities/CompProperties_TrackingCharge.cs @@ -11,10 +11,8 @@ namespace ArachnaeSwarm public float inertiaDistance = 3f; public DamageDef collisionDamageDef; public ThingDef flyerDef; - public int maxFlightTicks = 300; // Default 5 seconds timeout public float collisionRadius = 1.5f; public SoundDef impactSound; - public CompProperties_TrackingCharge() { this.compClass = typeof(CompAbilityEffect_TrackingCharge); diff --git a/Source/ArachnaeSwarm/Abilities/PawnFlyer_TrackingCharge.cs b/Source/ArachnaeSwarm/Abilities/PawnFlyer_TrackingCharge.cs index 2edbe83..197e2be 100644 --- a/Source/ArachnaeSwarm/Abilities/PawnFlyer_TrackingCharge.cs +++ b/Source/ArachnaeSwarm/Abilities/PawnFlyer_TrackingCharge.cs @@ -23,12 +23,9 @@ namespace ArachnaeSwarm public SoundDef impactSound; // --- Internal state --- - private Vector3 currentSpeed; - private float distanceTraveled = 0f; private bool homing = true; - private int inertiaTicks = -1; - private Vector3 exactPosition; private bool hasHitPrimaryTarget = false; + private Vector3 exactPosition; // --- Reflection Fields --- private static FieldInfo TicksFlyingInfo; @@ -83,88 +80,76 @@ namespace ArachnaeSwarm protected override void Tick() { - int ticksFlying = (int)TicksFlyingInfo.GetValue(this); + // --- THE CORRECT APPROACH --- + // Let the base class handle all flight mechanics (position, timing, etc.) + // We only intervene to do two things: + // 1. Continuously update the destination to "steer" the flyer. + // 2. Perform our own collision check. - if (ticksFlying == 0) + if (homing && primaryTarget.HasThing && primaryTarget.Thing.Spawned) { - Vector3 startVec = (Vector3)StartVecInfo.GetValue(this); - IntVec3 destCell = (IntVec3)DestCellInfo.GetValue(this); - Vector3 destinationPos = GenThing.TrueCenter(destCell, Rot4.North, this.FlyingThing.def.size, this.def.Altitude); - Vector3 direction = (destinationPos - startVec).normalized; - this.currentSpeed = direction * this.def.pawnFlyer.flightSpeed; + // Steer the flyer by constantly updating its destination cell. + DestCellInfo.SetValue(this, primaryTarget.Thing.Position); } - - this.exactPosition += this.currentSpeed; - this.distanceTraveled += this.currentSpeed.magnitude; - if (inertiaTicks > 0) + // Perform our custom collision check. + if (!hasHitPrimaryTarget && primaryTarget.HasThing && primaryTarget.Thing.Spawned) { - inertiaTicks--; - if (inertiaTicks <= 0) { Land(); return; } - } - else - { - if (homing && primaryTarget.HasThing && primaryTarget.Thing.Spawned) - { - Vector3 desiredDirection = (primaryTarget.Thing.DrawPos - this.exactPosition).normalized; - this.currentSpeed = Vector3.RotateTowards(this.currentSpeed, desiredDirection, this.homingSpeed * 0.017f, 999f).normalized * this.def.pawnFlyer.flightSpeed; - } - else - { - homing = false; - } - - float calculatedDamage = this.initialDamage + (this.distanceTraveled * this.damagePerTile); - var dinfo = new DamageInfo(this.collisionDamageDef, calculatedDamage, 1f, -1, this.FlyingPawn); - - if (!hasHitPrimaryTarget && homing && primaryTarget.HasThing && primaryTarget.Thing.Spawned && (this.exactPosition - primaryTarget.Thing.DrawPos).sqrMagnitude < this.collisionRadius * this.collisionRadius) + // Use DrawPos for accurate distance checking, not Position. + if ((this.DrawPos - primaryTarget.Thing.DrawPos).sqrMagnitude < this.collisionRadius * this.collisionRadius) { + // --- Impact! --- if (this.impactSound != null) { - SoundStarter.PlayOneShot(this.impactSound, new TargetInfo(this.exactPosition.ToIntVec3(), this.Map)); + SoundStarter.PlayOneShot(this.impactSound, new TargetInfo(this.Position, this.Map)); } - hasHitPrimaryTarget = true; // Mark as hit to prevent re-triggering + + // Calculate damage based on distance traveled so far. + // We need to get the distance from the base class now. + Vector3 startPosition = (Vector3)StartVecInfo.GetValue(this); + float distance = (this.DrawPos - startPosition).magnitude; + float calculatedDamage = this.initialDamage + (distance * this.damagePerTile); + var dinfo = new DamageInfo(this.collisionDamageDef, calculatedDamage, 1f, -1, this.FlyingPawn); + primaryTarget.Thing.TakeDamage(dinfo); - homing = false; - this.inertiaTicks = (int)(this.inertiaDistance / this.currentSpeed.magnitude); - } - - foreach (var thing in GenRadial.RadialDistinctThingsAround(this.exactPosition.ToIntVec3(), this.Map, 1.0f, false)) - { - // Avoid damaging self or the primary target (which is handled above) - if (thing == this.FlyingPawn || thing == this || (hasHitPrimaryTarget && thing == primaryTarget.Thing)) continue; + hasHitPrimaryTarget = true; - if (thing is Pawn pawn && !pawn.Downed && pawn.HostileTo(this.FlyingPawn)) pawn.TakeDamage(dinfo); - else if (thing.def.destroyable && thing.def.building != null) thing.TakeDamage(dinfo); + // Stop homing. The flyer will now continue to its last set destination. + homing = false; + + // To create the "inertia" effect, we now set the destination to be a point + // past the target. + Vector3 direction = (this.DrawPos - startPosition).normalized; + IntVec3 inertiaEndPos = (this.DrawPos + (direction * this.inertiaDistance)).ToIntVec3(); + DestCellInfo.SetValue(this, inertiaEndPos); } } - try + // --- AOE Damage Logic --- + // Damage other hostiles in the path. + float aoeDamage = this.initialDamage + (((Vector3)StartVecInfo.GetValue(this) - this.DrawPos).magnitude * this.damagePerTile); + var aoeDinfo = new DamageInfo(this.collisionDamageDef, aoeDamage, 1f, -1, this.FlyingPawn); + foreach (var thing in GenRadial.RadialDistinctThingsAround(this.Position, this.Map, 1.0f, false)) { - // We still need to update the destination for the base flyer logic to work correctly - DestCellInfo.SetValue(this, this.exactPosition.ToIntVec3()); - // --- FIX for infinite flight --- - // The old TicksFlightTimeInfo update logic is removed. - } - catch (System.Exception ex) - { - Log.ErrorOnce($"Exception during reflection in PawnFlyer_TrackingCharge: {ex}", this.thingIDNumber); - } - - TicksFlyingInfo.SetValue(this, ticksFlying + 1); - - // --- RELIABLE TIMEOUT & BOUNDS CHECK --- - if (ticksFlying > this.maxFlightTicks || !this.exactPosition.ToIntVec3().InBounds(this.Map)) - { - Land(); + if (thing != this.FlyingPawn && thing != this && thing != primaryTarget.Thing) + { + if (thing is Pawn pawn && !pawn.Downed && pawn.HostileTo(this.FlyingPawn)) + { + pawn.TakeDamage(aoeDinfo); + } + } } + + // Let the base class do its thing. This is crucial. + // It will handle the movement, timing, and eventual landing based on its calculated ticksFlightTime. + base.Tick(); } - private void Land() + protected override void RespawnPawn() { - if (this.Destroyed) return; + // This is the correct place to call the base method. + // The base class's TickInterval will call this method before destroying the flyer. base.RespawnPawn(); - this.Destroy(); } } } \ No newline at end of file diff --git a/Source/ArachnaeSwarm/Abilities/Verb_CastAbilityTrackingCharge.cs b/Source/ArachnaeSwarm/Abilities/Verb_CastAbilityTrackingCharge.cs index 2c07dce..e69a855 100644 --- a/Source/ArachnaeSwarm/Abilities/Verb_CastAbilityTrackingCharge.cs +++ b/Source/ArachnaeSwarm/Abilities/Verb_CastAbilityTrackingCharge.cs @@ -46,7 +46,6 @@ namespace ArachnaeSwarm trackingCharge.inertiaDistance = props.inertiaDistance; trackingCharge.collisionDamageDef = props.collisionDamageDef; trackingCharge.primaryTarget = this.currentTarget; - trackingCharge.maxFlightTicks = props.maxFlightTicks; trackingCharge.collisionRadius = props.collisionRadius; trackingCharge.impactSound = props.impactSound; @@ -54,6 +53,13 @@ namespace ArachnaeSwarm trackingCharge.StartFlight(this.CasterPawn, this.currentTarget.Cell); GenSpawn.Spawn(trackingCharge, this.CasterPawn.Position, map); // Use the cached map + // --- FIX for Comp Effects --- + // --- The Standard Pattern to trigger Comps like EffecterOnCaster --- + // After our custom verb logic (spawning the flyer) is done, + // we call the ability's Activate method with invalid targets. + // This triggers the standard Comp cycle without re-casting the verb. + this.ability.Activate(LocalTargetInfo.Invalid, LocalTargetInfo.Invalid); + return true; } } From b954781675845d90e25b7fee653e3138c1832ef9 Mon Sep 17 00:00:00 2001 From: "ProjectKoi-Kalo\\Kalo" Date: Sun, 7 Sep 2025 18:26:43 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.6/1.6/Assemblies/ArachnaeSwarm.dll | Bin 92672 -> 93184 bytes .../Abilities/PawnFlyer_TrackingCharge.cs | 10 ++++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll index e2e49d2e066f4fa7d49e3900638a534fd9e9a53b..bb89772ae01fca6f86b152a08b0fdfc3ee74c1df 100644 GIT binary patch delta 24497 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 InjYr=1NjMxZvX%Q delta 24288 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 Ziz#Anz%=ovMmpJPujMXrRcz>_|9?0D57Gbt diff --git a/Source/ArachnaeSwarm/Abilities/PawnFlyer_TrackingCharge.cs b/Source/ArachnaeSwarm/Abilities/PawnFlyer_TrackingCharge.cs index 197e2be..378472c 100644 --- a/Source/ArachnaeSwarm/Abilities/PawnFlyer_TrackingCharge.cs +++ b/Source/ArachnaeSwarm/Abilities/PawnFlyer_TrackingCharge.cs @@ -127,14 +127,20 @@ namespace ArachnaeSwarm // --- AOE Damage Logic --- // Damage other hostiles in the path. - float aoeDamage = this.initialDamage + (((Vector3)StartVecInfo.GetValue(this) - this.DrawPos).magnitude * this.damagePerTile); - var aoeDinfo = new DamageInfo(this.collisionDamageDef, aoeDamage, 1f, -1, this.FlyingPawn); + float distanceTravelled = ((Vector3)StartVecInfo.GetValue(this) - this.DrawPos).magnitude; + float currentAOEDamage = this.initialDamage + (distanceTravelled * this.damagePerTile); + foreach (var thing in GenRadial.RadialDistinctThingsAround(this.Position, this.Map, 1.0f, false)) { if (thing != this.FlyingPawn && thing != this && thing != primaryTarget.Thing) { if (thing is Pawn pawn && !pawn.Downed && pawn.HostileTo(this.FlyingPawn)) { + // --- CRITICAL FIX --- + // Create a *new* DamageInfo object for each target. + // Reusing the same dinfo object causes its damage value to be modified (e.g., by armor), + // resulting in subsequent targets taking zero damage. + var aoeDinfo = new DamageInfo(this.collisionDamageDef, currentAOEDamage, 1f, -1, this.FlyingPawn); pawn.TakeDamage(aoeDinfo); } } From c43bc0f0bb8479a83a83a2f42bd9d4cdfebe5941 Mon Sep 17 00:00:00 2001 From: "ProjectKoi-Kalo\\Kalo" Date: Sun, 7 Sep 2025 18:41:35 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.6/1.6/Assemblies/ArachnaeSwarm.dll | Bin 93184 -> 92672 bytes .../AbilityDefs/Abilities_TrackingCharge.xml | 3 +- .../CompProperties_TrackingCharge.cs | 2 + .../Abilities/PawnFlyer_TrackingCharge.cs | 38 ++++++++---------- .../Verb_CastAbilityTrackingCharge.cs | 1 + 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll index bb89772ae01fca6f86b152a08b0fdfc3ee74c1df..a3f0ccc45a080bfe2540df5df78306d0c874d732 100644 GIT binary patch delta 20028 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 delta 20084 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 Y6|o6 Blunt ARA_Flyer_TrackingCharge - 2.5 + 1.5 Pawn_Melee_BigBash_HitPawn + true
  • WarTrumpet diff --git a/Source/ArachnaeSwarm/Abilities/CompProperties_TrackingCharge.cs b/Source/ArachnaeSwarm/Abilities/CompProperties_TrackingCharge.cs index 2ab22a9..2865f46 100644 --- a/Source/ArachnaeSwarm/Abilities/CompProperties_TrackingCharge.cs +++ b/Source/ArachnaeSwarm/Abilities/CompProperties_TrackingCharge.cs @@ -13,6 +13,8 @@ namespace ArachnaeSwarm public ThingDef flyerDef; public float collisionRadius = 1.5f; public SoundDef impactSound; + public bool damageHostileOnly = true; + public CompProperties_TrackingCharge() { this.compClass = typeof(CompAbilityEffect_TrackingCharge); diff --git a/Source/ArachnaeSwarm/Abilities/PawnFlyer_TrackingCharge.cs b/Source/ArachnaeSwarm/Abilities/PawnFlyer_TrackingCharge.cs index 378472c..e1767a8 100644 --- a/Source/ArachnaeSwarm/Abilities/PawnFlyer_TrackingCharge.cs +++ b/Source/ArachnaeSwarm/Abilities/PawnFlyer_TrackingCharge.cs @@ -18,9 +18,10 @@ namespace ArachnaeSwarm public float inertiaDistance; public DamageDef collisionDamageDef; public LocalTargetInfo primaryTarget; - public int maxFlightTicks; public float collisionRadius; public SoundDef impactSound; + public bool damageHostileOnly; + public int maxFlightTicks; // --- Internal state --- private bool homing = true; @@ -68,7 +69,7 @@ namespace ArachnaeSwarm pawn.Destroy(); } } - + public override void SpawnSetup(Map map, bool respawningAfterLoad) { base.SpawnSetup(map, respawningAfterLoad); @@ -77,14 +78,14 @@ namespace ArachnaeSwarm this.exactPosition = base.DrawPos; } } - + protected override void Tick() { // --- THE CORRECT APPROACH --- // Let the base class handle all flight mechanics (position, timing, etc.) // We only intervene to do two things: // 1. Continuously update the destination to "steer" the flyer. - // 2. Perform our own collision check. + // 2. Perform our own collision checks (for primary target and AOE). if (homing && primaryTarget.HasThing && primaryTarget.Thing.Spawned) { @@ -92,10 +93,9 @@ namespace ArachnaeSwarm DestCellInfo.SetValue(this, primaryTarget.Thing.Position); } - // Perform our custom collision check. + // --- Primary Target Collision Check --- if (!hasHitPrimaryTarget && primaryTarget.HasThing && primaryTarget.Thing.Spawned) { - // Use DrawPos for accurate distance checking, not Position. if ((this.DrawPos - primaryTarget.Thing.DrawPos).sqrMagnitude < this.collisionRadius * this.collisionRadius) { // --- Impact! --- @@ -104,8 +104,6 @@ namespace ArachnaeSwarm SoundStarter.PlayOneShot(this.impactSound, new TargetInfo(this.Position, this.Map)); } - // Calculate damage based on distance traveled so far. - // We need to get the distance from the base class now. Vector3 startPosition = (Vector3)StartVecInfo.GetValue(this); float distance = (this.DrawPos - startPosition).magnitude; float calculatedDamage = this.initialDamage + (distance * this.damagePerTile); @@ -114,11 +112,8 @@ namespace ArachnaeSwarm primaryTarget.Thing.TakeDamage(dinfo); hasHitPrimaryTarget = true; - // Stop homing. The flyer will now continue to its last set destination. homing = false; - // To create the "inertia" effect, we now set the destination to be a point - // past the target. Vector3 direction = (this.DrawPos - startPosition).normalized; IntVec3 inertiaEndPos = (this.DrawPos + (direction * this.inertiaDistance)).ToIntVec3(); DestCellInfo.SetValue(this, inertiaEndPos); @@ -126,35 +121,36 @@ namespace ArachnaeSwarm } // --- AOE Damage Logic --- - // Damage other hostiles in the path. float distanceTravelled = ((Vector3)StartVecInfo.GetValue(this) - this.DrawPos).magnitude; float currentAOEDamage = this.initialDamage + (distanceTravelled * this.damagePerTile); - foreach (var thing in GenRadial.RadialDistinctThingsAround(this.Position, this.Map, 1.0f, false)) + foreach (var thing in GenRadial.RadialDistinctThingsAround(this.Position, this.Map, this.collisionRadius, false)) { if (thing != this.FlyingPawn && thing != this && thing != primaryTarget.Thing) { - if (thing is Pawn pawn && !pawn.Downed && pawn.HostileTo(this.FlyingPawn)) + if (thing is Pawn pawn && !pawn.Downed) + { + if (!this.damageHostileOnly || pawn.HostileTo(this.FlyingPawn)) + { + var aoeDinfo = new DamageInfo(this.collisionDamageDef, currentAOEDamage, 1f, -1, this.FlyingPawn); + pawn.TakeDamage(aoeDinfo); + } + } + else if (thing.def.destroyable && thing.def.building != null) { - // --- CRITICAL FIX --- - // Create a *new* DamageInfo object for each target. - // Reusing the same dinfo object causes its damage value to be modified (e.g., by armor), - // resulting in subsequent targets taking zero damage. var aoeDinfo = new DamageInfo(this.collisionDamageDef, currentAOEDamage, 1f, -1, this.FlyingPawn); - pawn.TakeDamage(aoeDinfo); + thing.TakeDamage(aoeDinfo); } } } // Let the base class do its thing. This is crucial. - // It will handle the movement, timing, and eventual landing based on its calculated ticksFlightTime. base.Tick(); } protected override void RespawnPawn() { // This is the correct place to call the base method. - // The base class's TickInterval will call this method before destroying the flyer. base.RespawnPawn(); } } diff --git a/Source/ArachnaeSwarm/Abilities/Verb_CastAbilityTrackingCharge.cs b/Source/ArachnaeSwarm/Abilities/Verb_CastAbilityTrackingCharge.cs index e69a855..d4225f1 100644 --- a/Source/ArachnaeSwarm/Abilities/Verb_CastAbilityTrackingCharge.cs +++ b/Source/ArachnaeSwarm/Abilities/Verb_CastAbilityTrackingCharge.cs @@ -48,6 +48,7 @@ namespace ArachnaeSwarm trackingCharge.primaryTarget = this.currentTarget; trackingCharge.collisionRadius = props.collisionRadius; trackingCharge.impactSound = props.impactSound; + trackingCharge.damageHostileOnly = props.damageHostileOnly; // Setup and spawn trackingCharge.StartFlight(this.CasterPawn, this.currentTarget.Cell);