21a4c71413
- KnockbackUtil.Stamp: shared knockback-stamp used by AbilityFireSystem + MeleeComboSystem (guard + planar normalize + write; speed passed in). - BakerStructureExt: AddPlacedStructure/AddDamageable extensions on Baker<T>; rewired Turret/Structure/Harvester/Conveyor/Fabricator bakers (baked data + serialized fields unchanged). - EnemyPrefabBakeExt.AddEnemyPrefabPool: shared prefab-buffer bake for ZoneEnemyDirector/WaveDirector authoring (fields stay flat — no serialization change). - Editor AnimRigUtil (HasParam + root-yaw overlay clip) shared by PlayerRigTools/EnemyRigTools; EnemyRigTools.MakeMat now GUID-preserving (CopySerialized over existing) — the composite AnimatorController copy left as-is with a caveat comment. 466/466 EditMode tests pass, 0 warnings. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
29 lines
1.4 KiB
C#
29 lines
1.4 KiB
C#
using Unity.Entities;
|
|
using Unity.Mathematics;
|
|
|
|
namespace ProjectM.Simulation
|
|
{
|
|
/// <summary>
|
|
/// Shared knockback stamp for melee/cone hits. Guarded exactly as the two call sites were: the target must own
|
|
/// <see cref="KnockbackState"/> (dummies/structures lacking it would throw at ECB playback if written) and must
|
|
/// NOT be a boss (<see cref="BossState"/> = knockback-immune, A4). The planar (XZ) heading is
|
|
/// normalize(targetPos - sourcePos), falling back to <paramref name="faceFallback"/> when that delta is
|
|
/// degenerate. Deduplicates the identical stamps in <see cref="AbilityFireSystem"/> (Warrior cone) and
|
|
/// <see cref="MeleeComboSystem"/> (melee cleave). Callers still gate their own speed/window (e.g. the melee
|
|
/// KnockSpeed > 0 check) before calling.
|
|
/// </summary>
|
|
static class KnockbackUtil
|
|
{
|
|
public static void Stamp(ref ComponentLookup<KnockbackState> lookup, in ComponentLookup<BossState> bossLookup,
|
|
Entity target, float3 sourcePos, float3 targetPos, float2 faceFallback, float speed, uint untilTick)
|
|
{
|
|
if (!lookup.HasComponent(target) || bossLookup.HasComponent(target))
|
|
return;
|
|
|
|
float3 delta = targetPos - sourcePos;
|
|
float2 dir = math.lengthsq(delta.xz) > 1e-6f ? math.normalize(delta.xz) : faceFallback;
|
|
lookup[target] = new KnockbackState { Dir = dir, Speed = speed, UntilTick = untilTick };
|
|
}
|
|
}
|
|
}
|