HitsWithoutSwing

[!] Inferential
No-swing attack detector — Slinky Hit Select / Grim PacketOrderB. The cheat deals damage with no swing animation in the window (a disabler suppresses the swing packet, or hit-select attacks without the arm animation). Every vanilla melee attack carries a swing, so a no-swing hurt is a cheat OR an unseen attacker — a weak, noisy signal, so this is CORROBORATOR-tier (never initiates a tier alone).
id: hitsWithoutSwing  ·  class: HitsWithoutSwingCheck  ·  group: Combat

What it detects

No-swing attack detector — Slinky Hit Select / Grim PacketOrderB. The cheat deals damage with no swing animation in the window (a disabler suppresses the swing packet, or hit-select attacks without the arm animation). Every vanilla melee attack carries a swing, so a no-swing hurt is a cheat OR an unseen attacker — a weak, noisy signal, so this is CORROBORATOR-tier (never initiates a tier alone).

Observer signature

Subscribes SwingSignal (per-attacker lastSwingTick) + HurtSignal. On a melee hurt (STATUS/ENTITY_DAMAGE/DAMAGE_TILT; VELOCITY excluded) it infers the attacker — the tracked player matching attackerEntityId when the channel provides one, else the nearest tracked player within 4 blocks — and fails open if none is that close (unseen attacker / environment). If no attacker swing within ±2 ticks, increments a per-attacker noSwingCount; flags (level 1.0) at >= threshold (3) no-swing hurts in 60 ticks, transition-gated one flag per episode.

False-positive guards

  • VELOCITY hurts excluded (knockback follow-up, not a melee)
  • Proximity-attacker fallback fails open when no tracked player is within melee range (unseen attacker / fall / fire)
  • Per-attacker episode transition gate: >= threshold no-swing hurts from the SAME inferred attacker in 60 ticks (one-off unseen-attacker or packet-ordering noise doesn't accumulate)
  • Swing window ±2 ticks absorbs packet-ordering edges

Configuration

Defaults (editable in-game via the YACL config screen or /ius config):

FieldDefault
enabledtrue
setbackVL5.0
decay0.5
threshold3.0
swing window±2 ticks
melee range4 blocks (16 sq)
episode60 ticks
flag level1.0 (corroborator)

Source

src/main/kotlin/dev/iustitia/checks/combat/HitsWithoutSwingCheck.kt  ↗