Files
Project-M/Assets/_Project/Scripts/Simulation/Combat/ConeContactPending.cs
T
kronic 2aebc37115 G6+G4: Cone damage-at-contact + zone fill telegraph (ZoneEffect GhostFields) + co-op saturation budget
Cone/SpecialSlam damage lands at its visual contact via ConeContactPending (knob 32, 0=legacy;
early-flush + resolve re-validate; death + BOTH class-swap paths drop armed pendings — fixes the
shipped melee death-strand in the same stroke). Zones: [GhostField] Caster/Radius/NextTick +
ZoneTelegraphSystem (Geyser latch contract on InterpolationTick; rim = true radius; arm grows,
persistent phase drains). Cone cues latch to contact (FireStartRaw, C14); TuningConfig.Defaults()
fallback at client cue sites (release-build timing fix). G4: SaturationMath ally-FX degrade
(living-enemy census, solo-exempt; enemy telegraphs structurally exempt) + CombatStressDebug +
overlay saturation rows. Reviews wf_98bf1268 (13 confirmed folded) / wf_9757d214 (5 confirmed fixed).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 13:27:50 -07:00

23 lines
1.5 KiB
C#

using Unity.Entities;
namespace ProjectM.Simulation
{
/// <summary>07-21 G6 (socket honesty, design review wf_98bf1268): SERVER-ONLY scheduled Cone-socket cleave —
/// the <see cref="MeleeCleavePending"/> schedule-and-consume idiom applied to the SpecialSlam (Cone archetype)
/// socket, so its damage lands at the animation's visual contact instead of the fire tick. Stamped by
/// AbilityFireSystem when a Cone socket fires (ResolveTick = fire + TuningConfig.ConeContactTicks; knob 0 =
/// legacy immediate, no stamp), fired on a wrap-safe elapsed compare from LIVE state (cast-turn steers the
/// cone until contact; stats re-folded at resolve), CONSUMED by zeroing. A still-armed pending is FLUSHED
/// (fired early) before a recast overwrites it. Cleared on death (PlayerDeathStateSystem — an armed pending
/// must never fire from the respawn position) and by the dev SetClass swap (socket identity changes).
/// At resolve the socket is re-validated (bounds + still a Cone Spark) — consume-drop on mismatch.
/// Not replicated; client contact cues are presentation-side (CombatFeedbackSystem). Baked zeroed.</summary>
public struct ConeContactPending : IComponentData
{
/// <summary>NonZero tick the armed cone's slam lands; 0 = nothing pending.</summary>
public uint ResolveTick;
/// <summary>Socket index (0..SocketId.Count-1) of the ARMED cast — stats/aim re-read live at resolve.</summary>
public byte Socket;
}
}