@@ -1,41 +1,151 @@
|
||||
package org.bukkit.craftbukkit;
|
||||
|
||||
import net.minecraft.server.Block;
|
||||
import net.minecraft.server.EnumParticle;
|
||||
import net.minecraft.server.IBlockData;
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.google.common.collect.BiMap;
|
||||
import com.google.common.collect.HashBiMap;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import net.minecraft.server.MinecraftKey;
|
||||
import net.minecraft.server.ParticleParam;
|
||||
import net.minecraft.server.ParticleParamBlock;
|
||||
import net.minecraft.server.ParticleParamItem;
|
||||
import net.minecraft.server.ParticleParamRedstone;
|
||||
import net.minecraft.server.ParticleType;
|
||||
import org.bukkit.Color;
|
||||
import org.bukkit.Particle;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
import org.bukkit.craftbukkit.block.data.CraftBlockData;
|
||||
import org.bukkit.craftbukkit.inventory.CraftItemStack;
|
||||
import org.bukkit.craftbukkit.util.CraftMagicNumbers;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.material.MaterialData;
|
||||
|
||||
public class CraftParticle {
|
||||
public enum CraftParticle {
|
||||
|
||||
public static EnumParticle toNMS(Particle bukkit) {
|
||||
return EnumParticle.valueOf(bukkit.name());
|
||||
EXPLOSION_NORMAL("poof"),
|
||||
EXPLOSION_LARGE("explosion"),
|
||||
EXPLOSION_HUGE("explosion_emitter"),
|
||||
FIREWORKS_SPARK("firework"),
|
||||
WATER_BUBBLE("bubble"),
|
||||
WATER_SPLASH("splash"),
|
||||
WATER_WAKE("fishing"),
|
||||
SUSPENDED("underwater"),
|
||||
SUSPENDED_DEPTH("underwater"),
|
||||
CRIT("crit"),
|
||||
CRIT_MAGIC("enchanted_hit"),
|
||||
SMOKE_NORMAL("smoke"),
|
||||
SMOKE_LARGE("large_smoke"),
|
||||
SPELL("effect"),
|
||||
SPELL_INSTANT("instant_effect"),
|
||||
SPELL_MOB("entity_effect"),
|
||||
SPELL_MOB_AMBIENT("ambient_entity_effect"),
|
||||
SPELL_WITCH("witch"),
|
||||
DRIP_WATER("dripping_water"),
|
||||
DRIP_LAVA("dripping_lava"),
|
||||
VILLAGER_ANGRY("angry_villager"),
|
||||
VILLAGER_HAPPY("happy_villager"),
|
||||
TOWN_AURA("mycelium"),
|
||||
NOTE("note"),
|
||||
PORTAL("portal"),
|
||||
ENCHANTMENT_TABLE("enchant"),
|
||||
FLAME("flame"),
|
||||
LAVA("lava"),
|
||||
CLOUD("cloud"),
|
||||
REDSTONE("dust"),
|
||||
SNOWBALL("item_snowball"),
|
||||
SNOW_SHOVEL("item_snowball"),
|
||||
SLIME("item_slime"),
|
||||
HEART("heart"),
|
||||
BARRIER("barrier"),
|
||||
ITEM_CRACK("item"),
|
||||
BLOCK_CRACK("block"),
|
||||
BLOCK_DUST("block"),
|
||||
WATER_DROP("rain"),
|
||||
MOB_APPEARANCE("elder_guardian"),
|
||||
DRAGON_BREATH("dragon_breath"),
|
||||
END_ROD("end_rod"),
|
||||
DAMAGE_INDICATOR("damage_indicator"),
|
||||
SWEEP_ATTACK("sweep_attack"),
|
||||
FALLING_DUST("falling_dust"),
|
||||
TOTEM("totem_of_undying"),
|
||||
SPIT("spit"),
|
||||
SQUID_INK("squid_ink"),
|
||||
BUBBLE_POP("bubble_pop"),
|
||||
CURRENT_DOWN("current_down"),
|
||||
BUBBLE_COLUMN_UP("bubble_column_up"),
|
||||
NAUTILUS("nautilus"),
|
||||
DOLPHIN("dolphin"),
|
||||
// ----- Legacy Separator -----
|
||||
LEGACY_BLOCK_CRACK("block"),
|
||||
LEGACY_BLOCK_DUST("block"),
|
||||
LEGACY_FALLING_DUST("falling_dust");
|
||||
private final MinecraftKey minecraftKey;
|
||||
private final Particle bukkit;
|
||||
private static final BiMap<Particle, MinecraftKey> particles;
|
||||
private static final Map<Particle, Particle> aliases;
|
||||
|
||||
static {
|
||||
particles = HashBiMap.create();
|
||||
aliases = new HashMap<>();
|
||||
|
||||
for (CraftParticle particle : CraftParticle.values()) {
|
||||
if (particles.containsValue(particle.minecraftKey)) {
|
||||
aliases.put(particle.bukkit, particles.inverse().get(particle.minecraftKey));
|
||||
} else {
|
||||
particles.put(particle.bukkit, particle.minecraftKey);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static Particle toBukkit(EnumParticle nms) {
|
||||
return Particle.valueOf(nms.name());
|
||||
private CraftParticle(String minecraftKey) {
|
||||
this.minecraftKey = new MinecraftKey(minecraftKey);
|
||||
|
||||
this.bukkit = Particle.valueOf(this.name());
|
||||
Preconditions.checkState(bukkit != null, "Bukkit particle %s does not exist", this.name());
|
||||
}
|
||||
|
||||
public static int[] toData(Particle particle, Object obj) {
|
||||
public static ParticleParam toNMS(Particle bukkit) {
|
||||
return toNMS(bukkit, null);
|
||||
}
|
||||
|
||||
public static <T> ParticleParam toNMS(Particle particle, T obj) {
|
||||
Particle canonical = particle;
|
||||
if (aliases.containsKey(particle)) {
|
||||
canonical = aliases.get(particle);
|
||||
}
|
||||
|
||||
net.minecraft.server.Particle nms = net.minecraft.server.Particle.REGISTRY.get(particles.get(canonical));
|
||||
Preconditions.checkArgument(nms != null, "No NMS particle %s", particle);
|
||||
|
||||
if (particle.getDataType().equals(Void.class)) {
|
||||
return new int[0];
|
||||
return (ParticleType) nms;
|
||||
}
|
||||
Preconditions.checkArgument(obj != null, "Particle %s requires data, null provided", particle);
|
||||
if (particle.getDataType().equals(ItemStack.class)) {
|
||||
if (obj == null) {
|
||||
return new int[]{0, 0};
|
||||
}
|
||||
ItemStack itemStack = (ItemStack) obj;
|
||||
return new int[]{itemStack.getType().getId(), itemStack.getDurability()};
|
||||
return new ParticleParamItem((net.minecraft.server.Particle<ParticleParamItem>) nms, CraftItemStack.asNMSCopy(itemStack));
|
||||
}
|
||||
if (particle.getDataType().equals(MaterialData.class)) {
|
||||
if (obj == null) {
|
||||
return new int[]{0};
|
||||
}
|
||||
if (particle.getDataType() == MaterialData.class) {
|
||||
MaterialData data = (MaterialData) obj;
|
||||
return new int[]{data.getItemTypeId() + ((int)(data.getData()) << 12)};
|
||||
return new ParticleParamBlock((net.minecraft.server.Particle<ParticleParamBlock>) nms, CraftMagicNumbers.getBlock(data));
|
||||
}
|
||||
if (particle.getDataType() == BlockData.class) {
|
||||
BlockData data = (BlockData) obj;
|
||||
return new ParticleParamBlock((net.minecraft.server.Particle<ParticleParamBlock>) nms, ((CraftBlockData) data).getState());
|
||||
}
|
||||
if (particle.getDataType() == Particle.DustOptions.class) {
|
||||
Particle.DustOptions data = (Particle.DustOptions) obj;
|
||||
Color color = data.getColor();
|
||||
return new ParticleParamRedstone(color.getRed(), color.getGreen(), color.getBlue(), data.getSize());
|
||||
}
|
||||
throw new IllegalArgumentException(particle.getDataType().toString());
|
||||
}
|
||||
|
||||
public static Particle toBukkit(net.minecraft.server.ParticleParam nms) {
|
||||
return toBukkit(nms.b());
|
||||
}
|
||||
|
||||
public static Particle toBukkit(net.minecraft.server.Particle nms) {
|
||||
return particles.inverse().get(nms.d());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user