ParticleConverter.java

package it.fulminazzo.yagl;

import it.fulminazzo.yagl.particles.Particle;
import it.fulminazzo.yagl.utils.EnumUtils;
import lombok.AccessLevel;
import lombok.Getter;
import org.jetbrains.annotations.NotNull;

/**
 * Since Minecraft <b>1.20.6</b>, {@link org.bukkit.Particle} have their official <b>Minecraft key</b> as name for the enum.
 * This class enables conversion between {@link Particle} and {@link org.bukkit.Particle} by converting {@link Particle#getType()}
 * to the names contained in this list.
 */
enum ParticleConverter {
    BLOCK_CRACK("BLOCK"),
    BLOCK_DUST("BLOCK"),
    CRIT_MAGIC("ENCHANTED_HIT"),
    DRIP_LAVA("DRIPPING_LAVA"),
    DRIP_WATER("DRIPPING_WATER"),
    ENCHANTMENT_TABLE("ENCHANT"),
    EXPLOSION_HUGE("EXPLOSION_EMITTER"),
    EXPLOSION_LARGE("EXPLOSION"),
    EXPLOSION_NORMAL("POOF"),
    FIREWORKS_SPARK("FIREWORK"),
    ITEM_CRACK("ITEM"),
    MOB_APPEARANCE("ELDER_GUARDIAN"),
    REDSTONE("DUST"),
    SLIME("ITEM_SLIME"),
    SMOKE_LARGE("LARGE_SMOKE"),
    SMOKE_NORMAL("SMOKE"),
    SNOWBALL("ITEM_SNOWBALL"),
    SNOW_SHOVEL("ITEM_SNOWBALL"),
    SPELL("EFFECT"),
    SPELL_INSTANT("INSTANT_EFFECT"),
    SPELL_MOB("ENTITY_EFFECT"),
    SPELL_MOB_AMBIENT("AMBIENT_ENTITY_EFFECT"),
    SPELL_WITCH("WITCH"),
    SUSPENDED("UNDERWATER"),
    SUSPENDED_DEPTH("UNDERWATER"),
    TOTEM("TOTEM_OF_UNDYING"),
    TOWN_AURA("MYCELIUM"),
    VILLAGER_ANGRY("ANGRY_VILLAGER"),
    VILLAGER_HAPPY("HAPPY_VILLAGER"),
    WATER_BUBBLE("BUBBLE"),
    WATER_DROP("RAIN"),
    WATER_SPLASH("SPLASH"),
    WATER_WAKE("FISHING"),
    ;

    @Getter(AccessLevel.PACKAGE)
    private final String particleName;

    ParticleConverter(final @NotNull String particleName) {
        this.particleName = particleName;
    }

    /**
     * Converts the given {@link Particle} to a {@link org.bukkit.Particle}.
     * If it fails one time, it will try to convert the type using the fields contained in this enum.
     * If it fails again it throws a {@link IllegalArgumentException}.
     *
     * @param particle the particle
     * @return the converted particle
     */
    public static Object convertToBukkit(final @NotNull Particle particle) {
        try {
            return EnumUtils.valueOf(org.bukkit.Particle.class, particle.getType());
        } catch (IllegalArgumentException e) {
            try {
                ParticleConverter converter = ParticleConverter.valueOf(particle.getType());
                return EnumUtils.valueOf(org.bukkit.Particle.class, converter.particleName);
            } catch (IllegalArgumentException ex) {
                throw e;
            }
        }
    }

}