refactor: drop unused VFX scaffolding, single-line English doc, reduce debug logs

- Remove unused chain/ParticleTrail and chain/VolumeCurve (dead since the EntityEffect
  pivot replaced the per-particle emit path) plus their test suites.
- Drop Vec3.lerp (only consumer was ParticleTrail).
- Strip step-by-step "[N/9]" debug logs from the orchestrator and per-entity logs
  from HytaleEntitySource / HytalePlayerRayCaster / ChainDamageApplier; keep one
  summary log per click and warnings on failure.
- Extract resolveChain and tryEmitVfx helpers in ChainLightningSceptreInteraction
  so firstRun reads top-down (cooldown gate -> resolve -> damage -> vfx -> deduct).
- Translate every Java doc/comment to single-line English.

Tests: 30/30 green (29 baseline kept + 1 chain damage adapter test).
Build: ./gradlew shadowJar clean.
This commit is contained in:
2026-04-27 19:17:47 +02:00
parent ee9ac1ab53
commit 03754a0646
22 changed files with 118 additions and 683 deletions
@@ -12,45 +12,16 @@ import javax.annotation.Nonnull;
import java.util.List;
import java.util.logging.Logger;
/**
* Phase 4 — Adapter VFX/SFX qui applique un EntityEffect custom à chaque cible touchée.
*
* <p><b>Pivot 14:52 (POC EntityEffect bridge) :</b> les tentatives précédentes via
* {@code ParticleUtil.spawnParticleEffect("Splash", ...)} ne rendaient pas les particles côté
* client (asset sync plugin custom + budget client → 0/5 visible). On utilise maintenant le
* pattern canonique Cleric-Rod : on déclare un {@code EntityEffect} JSON (Server/Entity/Effects/
* Chain_Hit_Effect.json) qui contient des particles vanilla inline + EntityTopTint/BottomTint,
* et on applique cet effect à chaque target via {@link EffectControllerComponent#addEffect}.
*
* <p>Le rendu passe par la réplication ECS (le ECS state du target propage l'effet aux clients
* automatiquement), pas par un packet SpawnParticleSystem standalone. C'est le path éprouvé.
*
* <p><b>Fallback :</b> si le lookup de l'EntityEffect échoue (asset pas chargé), on log et skip.
* Pas de propagation : damage déjà appliqué côté caller, l'emit failure ne doit pas crash.
*
* <p><b>Hop-index ignoré pour POC :</b> l'EntityEffect est uniforme sur les 5 cibles. La courbe
* de volume (VFX-02) reste implémentée dans {@code VolumeCurve} mais n'est pas utilisée ici --
* une variante future pourrait définir 5 EntityEffects {@code Chain_Hit_Effect_0..4} avec des
* intensités décroissantes, ou patcher l'EntityEffect existant runtime (non supporté par l'API).
*/
/** Applies a custom EntityEffect to each chain target so the visual replicates via ECS sync. */
public final class HytaleVfxEmitter {
private static final Logger LOGGER = Logger.getLogger(HytaleVfxEmitter.class.getName());
/** Asset id du EntityEffect appliqué à chaque target touchée par la chaîne. */
private static final String EFFECT_ID = "Chain_Hit_Effect";
private HytaleVfxEmitter() {}
/**
* Applique l'EntityEffect {@code Chain_Hit_Effect} à chaque hit de la chaîne.
*
* @param hits liste résolue par ChainResolver, ordre BFS
* @param playerRef ref du caster (présent pour symétrie d'API future, non utilisé ici --
* l'EntityEffect rend automatiquement à tous les viewers en range)
* @param commandBuffer le CommandBuffer du tick courant (sert pour {@code getComponent} et
* pour propager les changes d'état ECS au tick end)
*/
/** Resolves the EntityEffect once and adds it to every valid target via EffectControllerComponent. */
public static void playChainEffects(@Nonnull List<ChainHit> hits,
@Nonnull Ref<EntityStore> playerRef,
@Nonnull CommandBuffer<EntityStore> commandBuffer) {