NEO-98: Shorten NPC melee strike maxRange to 1 m.

pull/137/head
VinPropane 2026-05-30 17:53:14 -04:00
parent 3169106f28
commit b9e2d2f4c9
5 changed files with 5 additions and 5 deletions

View File

@ -5,7 +5,7 @@
"id": "prototype_npc_melee_strike", "id": "prototype_npc_melee_strike",
"displayName": "NPC Melee Strike", "displayName": "NPC Melee Strike",
"baseDamage": 15, "baseDamage": 15,
"maxRange": 6.0, "maxRange": 1.0,
"cooldownSeconds": 3.0, "cooldownSeconds": 3.0,
"abilityKind": "attack" "abilityKind": "attack"
}, },

View File

@ -62,7 +62,7 @@ public class AbilityDefinitionCatalogLoaderTests
"id": "prototype_npc_melee_strike", "id": "prototype_npc_melee_strike",
"displayName": "NPC Melee Strike", "displayName": "NPC Melee Strike",
"baseDamage": 15, "baseDamage": 15,
"maxRange": 6.0, "maxRange": 1.0,
"cooldownSeconds": 3.0, "cooldownSeconds": 3.0,
"abilityKind": "attack" "abilityKind": "attack"
}, },

View File

@ -66,6 +66,6 @@ public class AbilityDefinitionsWorldApiTests
var meleeStrike = body.Abilities.Single(a => a.Id == "prototype_npc_melee_strike"); var meleeStrike = body.Abilities.Single(a => a.Id == "prototype_npc_melee_strike");
Assert.Equal(15, meleeStrike.BaseDamage); Assert.Equal(15, meleeStrike.BaseDamage);
Assert.Equal(6.0, meleeStrike.MaxRange); Assert.Equal(1.0, meleeStrike.MaxRange);
} }
} }

View File

@ -44,7 +44,7 @@ public static class PrototypeNpcTestFixtures
"NPC Melee Strike", "NPC Melee Strike",
15, 15,
3.0, 3.0,
6.0, 1.0,
"attack"), "attack"),
[PrototypeNpcAttackAbilityRegistry.PrototypeNpcRangedShot] = new( [PrototypeNpcAttackAbilityRegistry.PrototypeNpcRangedShot] = new(
PrototypeNpcAttackAbilityRegistry.PrototypeNpcRangedShot, PrototypeNpcAttackAbilityRegistry.PrototypeNpcRangedShot,

View File

@ -161,7 +161,7 @@ Per-NPC aggro holders live in **`Game/Npc/`** as **`IThreatStateStore`** + **`In
| Rule | Behavior | | Rule | Behavior |
|------|----------| |------|----------|
| **Acquire** | First **damaging** cast on an NPC sets holder to the casting player when the row is empty (**`AggroOperations.TryAcquire`** from **`AbilityCastApi`**). Zero-damage abilities do not acquire. | | **Acquire** | First **damaging** cast on an NPC sets holder to the casting player when the row is empty (**`AggroOperations.TryAcquire`** from **`AbilityCastApi`**). Zero-damage abilities do not acquire. |
| **Attack range** | At telegraph resolve, damage applies only when the holder is within the bound attack ability's catalog **`maxRange`** of the NPC anchor (horizontal X/Z, inclusive). Melee strike **6 m**, ranged shot **10 m**, elite slam **8 m** — distinct from behavior **`aggroRadius`** (re-aggro) and tab-lock **6 m**. Out-of-range windups whiff (no damage; state still advances). | | **Attack range** | At telegraph resolve, damage applies only when the holder is within the bound attack ability's catalog **`maxRange`** of the NPC anchor (horizontal X/Z, inclusive). Melee strike **1 m**, ranged shot **10 m**, elite slam **8 m** — distinct from behavior **`aggroRadius`** (re-aggro) and tab-lock **6 m**. Out-of-range windups whiff (no damage; state still advances). |
| **Leash clear** | Holder clears when that player moves beyond the bound behavior def **`leashRadius`** from the NPC anchor (horizontal X/Z distance). Wired on **`POST /move`**, **`POST /move-stream`**, and before acquire on cast. | | **Leash clear** | Holder clears when that player moves beyond the bound behavior def **`leashRadius`** from the NPC anchor (horizontal X/Z distance). Wired on **`POST /move`**, **`POST /move-stream`**, and before acquire on cast. |
| **Defeat clear** | When **`ICombatEntityHealthStore`** marks the NPC **`defeated`**, **`NpcRuntimeOperations.TryStopOnTargetDefeat`** clears holder and resets runtime to **`idle`** (cast accept + lazy advance guard). | | **Defeat clear** | When **`ICombatEntityHealthStore`** marks the NPC **`defeated`**, **`NpcRuntimeOperations.TryStopOnTargetDefeat`** clears holder and resets runtime to **`idle`** (cast accept + lazy advance guard). |
| **Re-aggro** | After clear, the same first-hit rule applies — no proximity auto-aggro in this slice. | | **Re-aggro** | After clear, the same first-hit rule applies — no proximity auto-aggro in this slice. |