VFX guide

Armaria's particle engine. Trigger compound effects on hit, swing, charge, and cast.

Using presets

@Override
public void postHurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) {
    VFXPresets.stormChain(attacker, InteractionHand.MAIN_HAND);
}

Preset map

PresetPrimarySecondary 1Secondary 2
impactBurstFLAME (40)SMALL_FLAME (20)CRIT (15)
voidTrailSOUL_FIRE_FLAME (25)SMALL_FLAME (15)PORTAL (10)
prismWaveENCHANTED_HIT (35)ENCHANT (20)TOTEM_OF_UNDYING (10)
stormChainELECTRIC_SPARK (30)CRIT (20)FLAME (15)
chronoShatterEND_ROD (40)PORTAL (25)CRIT (20)
emberBurstLAVA (30)FLAME (25)SMALL_FLAME (20)
frostShardsSNOWFLAKE (35)ITEM_SNOWBALL (20)CLOUD (15)
dissolveBurstCAMPFIRE_COSY_SMOKE (30)LARGE_SMOKE (20)POOF (15)
shockwaveSWEEP_ATTACK (40)CRIT (30)ENCHANTED_HIT (20)
fresnelAuraENCHANT (30)TOTEM_OF_UNDYING (20)HEART (10)
voidRuptureREVERSE_PORTAL (35)PORTAL (25)SMALL_FLAME (20)
impactShatterEXPLOSION (30)CRIT (25)FLAME (20)

Performance budget

Each effect spawns 60-100 particles. Add a cooldown to keep the budget sane.

private int lastVfxTick = 0;
private static final int COOLDOWN = 8;

@Override
public void postHurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) {
    int currentTick = attacker.level().getGameTime();
    if (currentTick - lastVfxTick >= COOLDOWN) {
        VFXPresets.stormChain(attacker, InteractionHand.MAIN_HAND);
        lastVfxTick = currentTick;
    }
}
Server-validated, client-rendered VFX triggers are server-side via ServerLivingEntityEvents.AFTER_DAMAGE, then rendered client-side. This prevents cheating and keeps multiplayer consistent.