package net.glowstone.constants;
import org.apache.commons.lang3.Validate;
import org.bukkit.Effect;
import org.bukkit.material.MaterialData;
import java.util.Arrays;
/**
* Id mappings for particles.
*/
public final class GlowParticle {
private static final int[] EMPTY = new int[0];
private GlowParticle() {
}
private static final int[] ids = new int[Effect.values().length];
/**
* Get the particle id for a specified Particle.
* @param particle the Particle.
* @return the particle id.
*/
public static int getId(Effect particle) {
Validate.notNull(particle, "particle cannot be null");
return ids[particle.ordinal()];
}
/**
* Convert a MaterialData to an extData array if possible for a particle.
* @param particle the Particle to validate.
* @param material the MaterialData to convert.
* @return The extData array for the particle effect.
* @throws IllegalArgumentException if data is provided incorrectly
*/
public static int[] getData(Effect particle, MaterialData material) {
switch (particle) {
case ITEM_BREAK:
case TILE_BREAK:
case TILE_DUST:
if (material == null) {
throw new IllegalArgumentException("Particle " + particle + " requires material, null provided");
}
if (particle == Effect.ITEM_BREAK) {
// http://wiki.vg/Protocol#Particle
// data "Length depends on particle. "iconcrack" [Effect.ITEM_BREAK] has length of 2, "blockcrack",
// and "blockdust" have lengths of 1, the rest have 0"
// iconcrack_(id)_(data) 36
return new int[]{material.getItemTypeId(), material.getData()};
}
return new int[]{material.getItemTypeId()};
default:
if (material != null && material.getItemTypeId() != 0) {
throw new IllegalArgumentException("Particle " + particle + " does not use material, " + material + " provided");
}
return EMPTY;
}
}
/**
* Determine whether a particle type is considered long distance, meaning
* it has a higher visible range than normal.
* @param particle the Particle.
* @return True if the particle is long distance.
*/
public static boolean isLongDistance(Effect particle) {
return particle == Effect.EXPLOSION ||
particle == Effect.EXPLOSION_LARGE ||
particle == Effect.EXPLOSION_HUGE ||
particle == Effect.MOB_APPEARANCE;
}
private static void set(Effect particle, int id) {
ids[particle.ordinal()] = id;
}
static {
Arrays.fill(ids, -1);
// http://wiki.vg/Protocol#Particle IDs, but keyed by API enum
set(Effect.EXPLOSION, 0); // explode
set(Effect.EXPLOSION_LARGE, 1); // largeexplode
set(Effect.EXPLOSION_HUGE, 2); // hugeexplosion
set(Effect.FIREWORKS_SPARK, 3); // fireworksSpark
set(Effect.BUBBLE, 4); // bubble
set(Effect.SPLASH, 5); // splash
set(Effect.WAKE, 6); // wake
set(Effect.SUSPENDED, 7); // suspended
set(Effect.VOID_FOG, 8); // depthsuspend
set(Effect.CRIT, 9); // crit
set(Effect.MAGIC_CRIT, 10); // magicCrit
set(Effect.PARTICLE_SMOKE, 11); // smoke
set(Effect.LARGE_SMOKE, 12); // largesmoke
set(Effect.POTION_SWIRL, 13); // spell
set(Effect.INSTANT_SPELL, 14); // instantSpell
set(Effect.SPELL, 15); // spell
set(Effect.POTION_SWIRL_TRANSPARENT, 16); // mobSpellAmbient
set(Effect.WITCH_MAGIC, 17); // witchMagic
set(Effect.WATERDRIP, 18); // dripWater
set(Effect.LAVADRIP, 19); // dripLava
set(Effect.VILLAGER_THUNDERCLOUD, 20); // angryVillager
set(Effect.HAPPY_VILLAGER, 21); // happyVillager
set(Effect.SMALL_SMOKE, 22); // townaura
set(Effect.NOTE, 23); // note
set(Effect.PORTAL, 24); // portal
set(Effect.FLYING_GLYPH, 25); // enchantmenttable
set(Effect.FLAME, 26); // flame
set(Effect.LAVA_POP, 27); // lava
set(Effect.FOOTSTEP, 28); // footstep
set(Effect.CLOUD, 29); // cloud
set(Effect.COLOURED_DUST, 30); // reddust
set(Effect.SNOWBALL_BREAK, 31); // snowballpoof
set(Effect.SNOW_SHOVEL, 32); // snowshovel
set(Effect.SLIME, 33); // slime
set(Effect.HEART, 34); // heart
set(Effect.BARRIER, 35); // barrier
set(Effect.ITEM_BREAK, 36); // iconcrack_(id)_(data)
set(Effect.TILE_BREAK, 37); // blockcrack_(id+(data<<12))
set(Effect.TILE_DUST, 38); // blockdust_(id)
set(Effect.WATER_DROPLET, 39); // droplet
set(Effect.ITEM_TAKE, 40); // take
set(Effect.MOB_APPEARANCE, 41); // mobappearance
}
}