/*
* Copyright (C) 2013-2016 Gonçalo Baltazar <me@goncalomb.com>
*
* This file is part of NBTEditor.
*
* NBTEditor is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* NBTEditor is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with NBTEditor. If not, see <http://www.gnu.org/licenses/>.
*/
package com.goncalomb.bukkit.nbteditor.nbt;
import org.bukkit.entity.EntityType;
import com.goncalomb.bukkit.mylib.reflect.NBTTagCompound;
import com.goncalomb.bukkit.mylib.reflect.NBTTagList;
import com.goncalomb.bukkit.nbteditor.nbt.variable.BlockVariable;
import com.goncalomb.bukkit.nbteditor.nbt.variable.BooleanVariable;
import com.goncalomb.bukkit.nbteditor.nbt.variable.ByteVariable;
import com.goncalomb.bukkit.nbteditor.nbt.variable.FloatVariable;
import com.goncalomb.bukkit.nbteditor.nbt.variable.IntegerVariable;
import com.goncalomb.bukkit.nbteditor.nbt.variable.NBTGenericVariableContainer;
import com.goncalomb.bukkit.nbteditor.nbt.variable.RotationVariable;
import com.goncalomb.bukkit.nbteditor.nbt.variable.ShortVariable;
import com.goncalomb.bukkit.nbteditor.nbt.variable.StringVariable;
import com.goncalomb.bukkit.nbteditor.nbt.variable.VectorVariable;
public class EntityNBT extends EntityNBTBase {
static {
registerEntity(EntityType.PIG, BreedNBT.class);
registerEntity(EntityType.SHEEP, BreedNBT.class);
registerEntity(EntityType.COW, BreedNBT.class);
registerEntity(EntityType.CHICKEN, BreedNBT.class);
registerEntity(EntityType.MUSHROOM_COW, BreedNBT.class);
registerEntity(EntityType.POLAR_BEAR, BreedNBT.class);
registerEntity(EntityType.SQUID, MobNBT.class);
registerEntity(EntityType.WOLF, TamedNBT.class);
registerEntity(EntityType.OCELOT, TamedNBT.class);
registerEntity(EntityType.HORSE, HorseNBT.class);
registerEntity(EntityType.VILLAGER, VillagerNBT.class);
registerEntity(EntityType.IRON_GOLEM, MobNBT.class);
registerEntity(EntityType.SNOWMAN, MobNBT.class);
registerEntity(EntityType.ZOMBIE, ZombieNBT.class);
registerEntity(EntityType.PIG_ZOMBIE, ZombieNBT.class);
registerEntity(EntityType.SLIME, SlimeNBT.class);
registerEntity(EntityType.MAGMA_CUBE, SlimeNBT.class);
registerEntity(EntityType.GHAST, MobNBT.class);
registerEntity(EntityType.SKELETON, MobNBT.class);
registerEntity(EntityType.CREEPER, MobNBT.class);
registerEntity(EntityType.BAT, MobNBT.class);
registerEntity(EntityType.BLAZE, MobNBT.class);
registerEntity(EntityType.SPIDER, MobNBT.class);
registerEntity(EntityType.CAVE_SPIDER, MobNBT.class);
registerEntity(EntityType.GIANT, MobNBT.class);
registerEntity(EntityType.ENDERMAN, MobNBT.class);
registerEntity(EntityType.SILVERFISH, MobNBT.class);
registerEntity(EntityType.WITCH, MobNBT.class);
registerEntity(EntityType.GUARDIAN, MobNBT.class);
registerEntity(EntityType.ENDERMITE, MobNBT.class);
registerEntity(EntityType.RABBIT, MobNBT.class);
registerEntity(EntityType.SHULKER, MobNBT.class);
registerEntity(EntityType.ENDER_DRAGON, MobNBT.class);
registerEntity(EntityType.WITHER, MobNBT.class);
registerEntity(EntityType.PRIMED_TNT, EntityNBT.class);
registerEntity(EntityType.FALLING_BLOCK, FallingBlockNBT.class);
registerEntity(EntityType.DROPPED_ITEM, DroppedItemNBT.class);
registerEntity(EntityType.EXPERIENCE_ORB, XPOrbNBT.class);
registerEntity(EntityType.ENDER_CRYSTAL, EntityNBT.class);
registerEntity(EntityType.FIREWORK, FireworkNBT.class);
registerEntity(EntityType.ARROW, ArrowNBT.class);
registerEntity(EntityType.SPECTRAL_ARROW, ArrowNBT.class);
registerEntity(EntityType.TIPPED_ARROW, TippedArrowNBT.class);
registerEntity(EntityType.ENDER_PEARL, EntityNBT.class);
registerEntity(EntityType.THROWN_EXP_BOTTLE, EntityNBT.class);
registerEntity(EntityType.SNOWBALL, EntityNBT.class);
registerEntity(EntityType.EGG, EntityNBT.class);
registerEntity(EntityType.SPLASH_POTION, ThrownPotionNBT.class);
registerEntity(EntityType.FIREBALL, FireballNBT.class);
registerEntity(EntityType.SMALL_FIREBALL, FireballNBT.class);
registerEntity(EntityType.DRAGON_FIREBALL, FireballNBT.class);
registerEntity(EntityType.WITHER_SKULL, FireballNBT.class);
registerEntity(EntityType.ARMOR_STAND, EquippableNBT.class);
registerEntity(EntityType.AREA_EFFECT_CLOUD, AreaEffectCloudNBT.class);
registerEntity(EntityType.BOAT, EntityNBT.class);
registerEntity(EntityType.MINECART, MinecartNBT.class);
registerEntity(EntityType.MINECART_CHEST, MinecartContainerNBT.class);
registerEntity(EntityType.MINECART_FURNACE, MinecartNBT.class);
registerEntity(EntityType.MINECART_HOPPER, MinecartContainerNBT.class);
registerEntity(EntityType.MINECART_MOB_SPAWNER, MinecartSpawnerNBT.class);
registerEntity(EntityType.MINECART_TNT, MinecartNBT.class);
registerEntity(EntityType.MINECART_COMMAND, MinecartCommandNBT.class);
NBTGenericVariableContainer variables = null;
variables = new NBTGenericVariableContainer("Entity");
variables.add("Position", new VectorVariable("Pos", true));
variables.add("Velocity", new VectorVariable("Motion"));
variables.add("Rotation", new RotationVariable("Rotation"));
variables.add("FallDistance", new FloatVariable("FallDistance", 0.0f));
variables.add("Fire", new ShortVariable("Fire"));
variables.add("Air", new ShortVariable("Air", (short) 0, (short) 200));
variables.add("NoGravity", new BooleanVariable("NoGravity"));
variables.add("Invulnerable", new BooleanVariable("Invulnerable"));
variables.add("Silent", new BooleanVariable("Silent"));
variables.add("Glowing", new BooleanVariable("Glowing"));
registerVariables(EntityNBT.class, variables);
variables = new NBTGenericVariableContainer("Pig");
variables.add("Saddle", new BooleanVariable("Saddle"));
registerVariables(EntityType.PIG, variables);
variables = new NBTGenericVariableContainer("Sheep");
variables.add("Sheared", new BooleanVariable("Sheared"));
variables.add("Color", new ByteVariable("Color", (byte) 0, (byte) 15));
registerVariables(EntityType.SHEEP, variables);
variables = new NBTGenericVariableContainer("Chicken");
variables.add("EggLayTime", new IntegerVariable("EggLayTime"));
registerVariables(EntityType.CHICKEN, variables);
variables = new NBTGenericVariableContainer("Wolf");
variables.add("Angry", new BooleanVariable("Angry"));
variables.add("CollarColor", new ByteVariable("CollarColor", (byte) 0, (byte) 15));
registerVariables(EntityType.WOLF, variables);
variables = new NBTGenericVariableContainer("Ocelot");
variables.add("Type", new IntegerVariable("CatType", 0, 3));
registerVariables(EntityType.OCELOT, variables);
variables = new NBTGenericVariableContainer("IronGolem");
variables.add("PlayerCreated", new BooleanVariable("PlayerCreated"));
registerVariables(EntityType.IRON_GOLEM, variables);
variables = new NBTGenericVariableContainer("PigZombie");
variables.add("Anger", new ShortVariable("Anger"));
registerVariables(EntityType.PIG_ZOMBIE, variables);
variables = new NBTGenericVariableContainer("Ghast");
variables.add("ExplosionPower", new IntegerVariable("ExplosionPower", 0, 25)); // Limited to 25
registerVariables(EntityType.GHAST, variables);
variables = new NBTGenericVariableContainer("Skeleton");
variables.add("Type", new ByteVariable("SkeletonType", (byte) 0, (byte) 2));
registerVariables(EntityType.SKELETON, variables);
variables = new NBTGenericVariableContainer("Creeper");
variables.add("Powered", new BooleanVariable("powered"));
variables.add("ExplosionRadius", new ByteVariable("ExplosionRadius", (byte) 0, (byte) 25)); // Limited to 25
variables.add("Fuse", new ShortVariable("Fuse", (short) 0));
variables.add("Ignited", new BooleanVariable("ignited"));
registerVariables(EntityType.CREEPER, variables);
variables = new NBTGenericVariableContainer("Enderman");
variables.add("Block", new BlockVariable("carried", "carriedData", true));
registerVariables(EntityType.ENDERMAN, variables);
variables = new NBTGenericVariableContainer("Guardian");
variables.add("Elder", new BooleanVariable("Elder"));
registerVariables(EntityType.GUARDIAN, variables);
variables = new NBTGenericVariableContainer("Endermite");
variables.add("Lifetime", new IntegerVariable("Lifetime"));
variables.add("PlayerSpawned", new BooleanVariable("PlayerSpawned"));
registerVariables(EntityType.ENDERMITE, variables);
variables = new NBTGenericVariableContainer("Rabbit");
variables.add("Type", new IntegerVariable("RabbitType", 0, 99));
registerVariables(EntityType.RABBIT, variables);
variables = new NBTGenericVariableContainer("EnderDragon");
variables.add("DragonPhase", new IntegerVariable("DragonPhase", 0, 10));
registerVariables(EntityType.ENDER_DRAGON, variables);
variables = new NBTGenericVariableContainer("Wither");
variables.add("InvulnerableTime", new IntegerVariable("Invul", 0));
registerVariables(EntityType.WITHER, variables);
variables = new NBTGenericVariableContainer("PrimedTNT");
variables.add("Fuse", new ByteVariable("Fuse", (byte) 0));
registerVariables(EntityType.PRIMED_TNT, variables);
variables = new NBTGenericVariableContainer("EnderCrystal");
variables.add("ShowBottom", new BooleanVariable("ShowBottom"));
registerVariables(EntityType.ENDER_CRYSTAL, variables);
variables = new NBTGenericVariableContainer("SpectralArrow");
variables.add("Duration", new IntegerVariable("Duration", 0));
registerVariables(EntityType.SPECTRAL_ARROW, variables);
variables = new NBTGenericVariableContainer("Enderpearl");
variables.add("Owner", new StringVariable("ownerName"));
registerVariables(EntityType.ENDER_PEARL, variables);
variables = new NBTGenericVariableContainer("LargeFireball");
variables.add("ExplosionPower", new IntegerVariable("ExplosionPower", 0, 25)); // Limited to 25
registerVariables(EntityType.FIREBALL, variables);
variables = new NBTGenericVariableContainer("Boat");
variables.add("Type", new StringVariable("Type"));
registerVariables(EntityType.BOAT, variables);
variables = new NBTGenericVariableContainer("ArmorStand");
variables.add("Marker", new BooleanVariable("Marker"));
variables.add("Invisible", new BooleanVariable("Invisible"));
variables.add("NoBasePlate", new BooleanVariable("NoBasePlate"));
variables.add("ShowArms", new BooleanVariable("ShowArms"));
variables.add("Small", new BooleanVariable("Small"));
variables.add("PoseBody", new RotationVariable("Body", true, "Pose"));
variables.add("PoseLeftArm", new RotationVariable("LeftArm", true, "Pose"));
variables.add("PoseRightArm", new RotationVariable("RightArm", true, "Pose"));
variables.add("PoseLeftLeg", new RotationVariable("LeftLeg", true, "Pose"));
variables.add("PoseRightLeg", new RotationVariable("RightLeg", true, "Pose"));
variables.add("PoseHead", new RotationVariable("Head", true, "Pose"));
registerVariables(EntityType.ARMOR_STAND, variables);
}
protected EntityNBT() {
super(null);
}
protected EntityNBT(EntityType entityType) {
super(entityType);
}
public void setPos(double x, double y, double z) {
_data.setList("Pos", x, y, z);
}
public void removePos() {
_data.remove("Pos");
}
public void setMotion(double x, double y, double z) {
_data.setList("Motion", x, y, z);
}
public void removeMotion() {
_data.remove("Motion");
}
public EntityNBT getFirstPassenger() {
NBTTagList passengers = _data.getList("Passengers");
if (passengers != null && passengers.size() > 0) {
NBTTagCompound passenger = (NBTTagCompound) passengers.get(0);
return fromEntityData(passenger);
}
return null;
}
// TODO: implement a way to set multiple passengers per entity
public void setRiders(EntityNBT... riders) {
if (riders == null || riders.length == 0) {
_data.remove("Passengers");
return;
}
NBTTagCompound now = _data;
for (EntityNBT rider : riders) {
NBTTagCompound next = rider._data.clone();
now.setList("Passengers", new NBTTagList(next));
now = next;
}
}
}