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 attributes the hit to the tracked player the hurt names and to nobody else: a name resolving to no tracked player (mob, arrow, TNT) and a hurt naming nobody at all (fall, fire, drowning) both fail open. Only where the protocol cannot name causes (legacy 1.8-1.19.3) does it fall back to the nearest tracked player within 4 blocks that has a recent swing, and it fails open when nobody qualifies. If no attacker swing within ±2 ticks, increments a per-attacker noSwingCount; flags at >= threshold (3) no-swing hurts in 60 ticks, one alert per episode at setbackVL + 1.0 and re-arming when the no-swing hurts stop.

False-positive guards

  • VELOCITY hurts excluded (knockback follow-up, not a melee)
  • Named-cause guard: when the hurt names a cause, only the player it names can be the inferred attacker, so a mob / arrow / TNT hit on the victim fails open instead of landing on whoever swung nearby
  • Unnamed-hurt guard: on a protocol that names damage causes an unnamed hurt is attributed to no player, so environmental damage next to a bystander cannot charge their no-swing episode
  • Proximity-attacker fallback survives only for the legacy channels that name nobody, and 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 levelsetbackVL + 1.0, one alert per episode (corroborator tier)

Source

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