package com.laytonsmith.abstraction.bukkit.entities; import com.laytonsmith.PureUtilities.Vector3D; import com.laytonsmith.abstraction.MCArmorStand; import com.laytonsmith.abstraction.MCEntityEquipment; import com.laytonsmith.abstraction.MCItemStack; import com.laytonsmith.abstraction.bukkit.BukkitMCEntityEquipment; import com.laytonsmith.abstraction.bukkit.BukkitMCItemStack; import com.laytonsmith.abstraction.enums.MCBodyPart; import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.inventory.EntityEquipment; import org.bukkit.inventory.ItemStack; import org.bukkit.util.EulerAngle; import java.util.EnumMap; import java.util.Map; public class BukkitMCArmorStand extends BukkitMCLivingEntity implements MCArmorStand { ArmorStand as; ArmorStandEquipmentProxy ase; public BukkitMCArmorStand(Entity le) { super((LivingEntity) le); as = (ArmorStand) le; ase = new ArmorStandEquipmentProxy(as); } /** * LivingEntity#getEquipment returns null for ArmorStands, so we need to supply our own. * Needed for get|set_mob_equipment. * * @return Custom implementation of org.bukkit.inventory.EntityEquipment */ @Override public MCEntityEquipment getEquipment() { return new BukkitMCEntityEquipment(ase); } @Override public Map<MCBodyPart, Vector3D> getAllPoses() { Map<MCBodyPart, Vector3D> slots = new EnumMap<MCBodyPart, Vector3D>(MCBodyPart.class); for (MCBodyPart key : MCBodyPart.values()) { switch (key) { case Head: slots.put(key, getHeadPose()); break; case Torso: slots.put(key, getBodyPose()); break; case ArmLeft: slots.put(key, getLeftArmPose()); break; case ArmRight: slots.put(key, getRightArmPose()); break; case LegLeft: slots.put(key, getLeftLegPose()); break; case LegRight: slots.put(key, getRightLegPose()); break; } } return slots; } @Override public void setAllPoses(Map<MCBodyPart, Vector3D> posemap) { Vector3D pose = null; for (MCBodyPart key : posemap.keySet()) { pose = posemap.get(key); switch (key) { case Head: setHeadPose(pose); break; case Torso: setBodyPose(pose); break; case ArmLeft: setLeftArmPose(pose); break; case ArmRight: setRightArmPose(pose); break; case LegLeft: setLeftLegPose(pose); break; case LegRight: setRightLegPose(pose); break; } } } @Override public MCItemStack getItemInHand() { return new BukkitMCItemStack(as.getItemInHand()); } @Override public void setItemInHand(MCItemStack item) { as.setItemInHand(item == null ? null : ((BukkitMCItemStack) item).asItemStack()); } @Override public MCItemStack getBoots() { return new BukkitMCItemStack(as.getBoots()); } @Override public void setBoots(MCItemStack item) { as.setBoots(item == null ? null : ((BukkitMCItemStack) item).asItemStack()); } @Override public MCItemStack getLeggings() { return new BukkitMCItemStack(as.getLeggings()); } @Override public void setLeggings(MCItemStack item) { as.setLeggings(item == null ? null : ((BukkitMCItemStack) item).asItemStack()); } @Override public MCItemStack getChestplate() { return new BukkitMCItemStack(as.getChestplate()); } @Override public void setChestplate(MCItemStack item) { as.setChestplate(item == null ? null : ((BukkitMCItemStack) item).asItemStack()); } @Override public MCItemStack getHelmet() { return new BukkitMCItemStack(as.getHelmet()); } @Override public void setHelmet(MCItemStack item) { as.setHelmet(item == null ? null : ((BukkitMCItemStack) item).asItemStack()); } @Override public Vector3D getBodyPose() { EulerAngle pose = as.getBodyPose(); return new Vector3D(pose.getX(), pose.getY(), pose.getZ()); } @Override public void setBodyPose(Vector3D pose) { as.setBodyPose(new EulerAngle(pose.X(), pose.Y(), pose.Z())); } @Override public Vector3D getLeftArmPose() { EulerAngle pose = as.getLeftArmPose(); return new Vector3D(pose.getX(), pose.getY(), pose.getZ()); } @Override public void setLeftArmPose(Vector3D pose) { as.setLeftArmPose(new EulerAngle(pose.X(), pose.Y(), pose.Z())); } @Override public Vector3D getRightArmPose() { EulerAngle pose = as.getRightArmPose(); return new Vector3D(pose.getX(), pose.getY(), pose.getZ()); } @Override public void setRightArmPose(Vector3D pose) { as.setRightArmPose(new EulerAngle(pose.X(), pose.Y(), pose.Z())); } @Override public Vector3D getLeftLegPose() { EulerAngle pose = as.getLeftLegPose(); return new Vector3D(pose.getX(), pose.getY(), pose.getZ()); } @Override public void setLeftLegPose(Vector3D pose) { as.setLeftLegPose(new EulerAngle(pose.X(), pose.Y(), pose.Z())); } @Override public Vector3D getRightLegPose() { EulerAngle pose = as.getRightLegPose(); return new Vector3D(pose.getX(), pose.getY(), pose.getZ()); } @Override public void setRightLegPose(Vector3D pose) { as.setRightLegPose(new EulerAngle(pose.X(), pose.Y(), pose.Z())); } @Override public Vector3D getHeadPose() { EulerAngle pose = as.getHeadPose(); return new Vector3D(pose.getX(), pose.getY(), pose.getZ()); } @Override public void setHeadPose(Vector3D pose) { as.setHeadPose(new EulerAngle(pose.X(), pose.Y(), pose.Z())); } @Override public boolean hasBasePlate() { return as.hasBasePlate(); } @Override public void setHasBasePlate(boolean basePlate) { as.setBasePlate(basePlate); } @Override public boolean hasGravity() { return as.hasGravity(); } @Override public void setHasGravity(boolean gravity) { as.setGravity(gravity); } @Override public boolean isVisible() { return as.isVisible(); } @Override public void setVisible(boolean visible) { as.setVisible(visible); } @Override public boolean hasArms() { return as.hasArms(); } @Override public void setHasArms(boolean arms) { as.setArms(arms); } @Override public boolean isSmall() { return as.isSmall(); } @Override public void setSmall(boolean small) { as.setSmall(small); } @Override public Boolean isMarker() { try { return as.isMarker(); } catch(NoSuchMethodError ex){ // Probably before 1.8.7 return null; } } @Override public void setMarker(boolean marker) { try { as.setMarker(marker); } catch(NoSuchMethodError ex){ // Probably before 1.8.7 } } /** * @author jb_aero * <p/> * Custom implementation of EntityEquipment * This remaps calls to EntityEquipment's methods to those of the associated ArmorStand * <p/> * Methods related to droprates are unmodified as they do nothing, but are not needed anyway. */ private class ArmorStandEquipmentProxy implements EntityEquipment { ArmorStand holder; ArmorStandEquipmentProxy(ArmorStand stand) { holder = stand; } @Override public Entity getHolder() { return holder; } @Override public ItemStack getItemInHand() { return holder.getItemInHand(); } @Override public void setItemInHand(ItemStack itemStack) { holder.setItemInHand(itemStack); } @Override public ItemStack getItemInMainHand(){ return holder.getItemInHand(); } @Override public void setItemInMainHand(ItemStack itemStack){ holder.setItemInHand(itemStack); } @Override public ItemStack getItemInOffHand() { return holder.getEquipment().getItemInOffHand(); } @Override public void setItemInOffHand(ItemStack itemStack){ holder.getEquipment().setItemInOffHand(itemStack); } @Override public ItemStack getHelmet() { return holder.getHelmet(); } @Override public void setHelmet(ItemStack itemStack) { holder.setHelmet(itemStack); } @Override public ItemStack getChestplate() { return holder.getChestplate(); } @Override public void setChestplate(ItemStack itemStack) { holder.setChestplate(itemStack); } @Override public ItemStack getLeggings() { return holder.getLeggings(); } @Override public void setLeggings(ItemStack itemStack) { holder.setLeggings(itemStack); } @Override public ItemStack getBoots() { return holder.getBoots(); } @Override public void setBoots(ItemStack itemStack) { holder.setBoots(itemStack); } @Override public ItemStack[] getArmorContents() { return new ItemStack[]{getBoots(), getLeggings(), getChestplate(), getHelmet()}; } @Override public void setArmorContents(ItemStack[] itemStacks) { switch (itemStacks.length) { case 4: setHelmet(itemStacks[3]); case 3: setChestplate(itemStacks[2]); case 2: setLeggings(itemStacks[1]); case 1: setBoots(itemStacks[0]); case 0: return; default: setHelmet(itemStacks[3]); setChestplate(itemStacks[2]); setLeggings(itemStacks[1]); setBoots(itemStacks[0]); } } @Override public void clear() { setHelmet(null); setChestplate(null); setLeggings(null); setBoots(null); setItemInHand(null); setItemInOffHand(null); } @Override public float getItemInHandDropChance() { return 0; } @Override public void setItemInHandDropChance(float v) { } @Override public float getItemInMainHandDropChance() { return 0; } @Override public void setItemInMainHandDropChance(float v) { } @Override public float getItemInOffHandDropChance() { return 0; } @Override public void setItemInOffHandDropChance(float v) { } @Override public float getHelmetDropChance() { return 0; } @Override public void setHelmetDropChance(float v) { } @Override public float getChestplateDropChance() { return 0; } @Override public void setChestplateDropChance(float v) { } @Override public float getLeggingsDropChance() { return 0; } @Override public void setLeggingsDropChance(float v) { } @Override public float getBootsDropChance() { return 0; } @Override public void setBootsDropChance(float v) { } } }