blob: eaa33e51ac7977be54a4607252449199e1211036 [file] [log] [blame] [raw]
package net.glowstone.io.entity;
import net.glowstone.entity.objects.GlowArmorStand;
import net.glowstone.io.nbt.NbtSerialization;
import net.glowstone.util.nbt.CompoundTag;
import net.glowstone.util.nbt.TagType;
import org.bukkit.Location;
import org.bukkit.entity.EntityType;
import org.bukkit.util.EulerAngle;
import java.util.Arrays;
import java.util.List;
class ArmorStandStore extends LivingEntityStore<GlowArmorStand> {
public ArmorStandStore() {
super(GlowArmorStand.class, EntityType.ARMOR_STAND);
}
@Override
public GlowArmorStand createEntity(Location location, CompoundTag compound) {
return new GlowArmorStand(location);
}
@Override
public void load(GlowArmorStand entity, CompoundTag tag) {
super.load(entity, tag);
if (tag.isList("Equipment", TagType.COMPOUND)) {
List<CompoundTag> equip = tag.getCompoundList("Equipment");
entity.setItemInHand(NbtSerialization.readItem(equip.get(0)));
entity.setBoots(NbtSerialization.readItem(equip.get(1)));
entity.setLeggings(NbtSerialization.readItem(equip.get(2)));
entity.setChestplate(NbtSerialization.readItem(equip.get(3)));
entity.setHelmet(NbtSerialization.readItem(equip.get(4)));
}
if (tag.containsKey("Marker")) {
entity.setMarker(tag.getBool("Marker"));
}
if (tag.containsKey("Invisible")) {
entity.setVisible(!tag.getBool("Invisible"));
}
if (tag.containsKey("NoBasePlate")) {
entity.setBasePlate(!tag.getBool("NoBasePlate"));
}
if (tag.containsKey("NoGravity")) {
entity.setGravity(!tag.getBool("NoGravity"));
}
if (tag.containsKey("ShowArms")) {
entity.setArms(tag.getBool("ShowArms"));
}
if (tag.containsKey("Small")) {
entity.setSmall(tag.getBool("Small"));
}
if (tag.isCompound("Pose")) {
entity.setBodyPose(readSafeAngle(tag.getCompound("Pose"), "Body"));
entity.setLeftArmPose(readSafeAngle(tag.getCompound("Pose"), "LeftArm"));
entity.setRightArmPose(readSafeAngle(tag.getCompound("Pose"), "RightArm"));
entity.setLeftLegPose(readSafeAngle(tag.getCompound("Pose"), "LeftLeg"));
entity.setRightLegPose(readSafeAngle(tag.getCompound("Pose"), "RightLeg"));
entity.setHeadPose(readSafeAngle(tag.getCompound("Pose"), "Head"));
}
}
@Override
public void save(GlowArmorStand entity, CompoundTag tag) {
super.save(entity, tag);
tag.putCompoundList("Equipment", Arrays.asList(
NbtSerialization.writeItem(entity.getItemInHand(), -1),
NbtSerialization.writeItem(entity.getBoots(), -1),
NbtSerialization.writeItem(entity.getLeggings(), -1),
NbtSerialization.writeItem(entity.getChestplate(), -1),
NbtSerialization.writeItem(entity.getHelmet(), -1)
));
tag.putBool("Marker", entity.isMarker());
tag.putBool("Invisible", !entity.isVisible());
tag.putBool("NoBasePlate", !entity.hasBasePlate());
tag.putBool("NoGravity", !entity.hasGravity());
tag.putBool("ShowArms", entity.hasArms());
tag.putBool("Small", entity.isSmall());
CompoundTag pose = new CompoundTag();
pose.putList("Body", TagType.FLOAT, toFloatList(entity.getBodyPose()));
pose.putList("LeftArm", TagType.FLOAT, toFloatList(entity.getLeftArmPose()));
pose.putList("RightArm", TagType.FLOAT, toFloatList(entity.getRightArmPose()));
pose.putList("LeftLeg", TagType.FLOAT, toFloatList(entity.getLeftLegPose()));
pose.putList("RightLeg", TagType.FLOAT, toFloatList(entity.getRightLegPose()));
pose.putList("Head", TagType.FLOAT, toFloatList(entity.getHeadPose()));
tag.putCompound("Pose", pose);
}
private List<Float> toFloatList(EulerAngle angle) {
return Arrays.asList(
(float) Math.toDegrees(angle.getX()),
(float) Math.toDegrees(angle.getY()),
(float) Math.toDegrees(angle.getZ())
);
}
private EulerAngle readSafeAngle(CompoundTag tag, String key) {
if (tag.isList(key, TagType.FLOAT)) {
List<Float> list = tag.getList(key, TagType.FLOAT);
return new EulerAngle(Math.toRadians(list.get(0)), Math.toRadians(list.get(1)), Math.toRadians(list.get(2)));
} else {
return EulerAngle.ZERO;
}
}
}