package net.glowstone.io.entity; import net.glowstone.entity.GlowHumanEntity; import net.glowstone.io.nbt.NbtSerialization; import net.glowstone.util.nbt.CompoundTag; import net.glowstone.util.nbt.TagType; import org.bukkit.GameMode; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.PlayerInventory; import java.util.List; abstract class HumanEntityStore<T extends GlowHumanEntity> extends LivingEntityStore<T> { public HumanEntityStore(Class<T> clazz, String id) { super(clazz, id); } // documented at http://minecraft.gamepedia.com/Player.dat_Format // player data that does not correspond to HumanEntity is in PlayerStore @Override public void load(T entity, CompoundTag tag) { super.load(entity, tag); if (tag.isInt("XpSeed")) { entity.setXpSeed(tag.getInt("XpSeed")); } if (tag.isInt("playerGameType")) { GameMode mode = GameMode.getByValue(tag.getInt("playerGameType")); if (mode != null) { entity.setGameMode(mode); } } if (tag.isInt("SelectedItemSlot")) { entity.getInventory().setHeldItemSlot(tag.getInt("SelectedItemSlot")); } // Sleeping and SleepTimer are ignored on load. if (tag.isList("Inventory", TagType.COMPOUND)) { PlayerInventory inventory = entity.getInventory(); List<CompoundTag> items = tag.getCompoundList("Inventory"); inventory.setContents(NbtSerialization.readInventory(items, 0, inventory.getSize())); inventory.setArmorContents(NbtSerialization.readInventory(items, 100, 4)); } if (tag.isList("EnderItems", TagType.COMPOUND)) { Inventory inventory = entity.getEnderChest(); List<CompoundTag> items = tag.getCompoundList("EnderItems"); inventory.setContents(NbtSerialization.readInventory(items, 0, inventory.getSize())); } } @Override public void save(T entity, CompoundTag tag) { super.save(entity, tag); // humans don't have these properties tag.remove("CustomName"); tag.remove("CustomNameVisible"); tag.remove("Equipment"); tag.remove("DropChances"); tag.remove("CanPickUpLoot"); tag.remove("PersistenceRequired"); tag.remove("Leashed"); tag.remove("Leash"); tag.putInt("playerGameType", entity.getGameMode().getValue()); tag.putInt("SelectedItemSlot", entity.getInventory().getHeldItemSlot()); tag.putBool("Sleeping", entity.isSleeping()); tag.putShort("SleepTimer", entity.getSleepTicks()); tag.putInt("XpSeed", entity.getXpSeed()); // inventory List<CompoundTag> inventory; inventory = NbtSerialization.writeInventory(entity.getInventory().getContents(), 0); inventory.addAll(NbtSerialization.writeInventory(entity.getInventory().getArmorContents(), 100)); tag.putCompoundList("Inventory", inventory); // ender items inventory = NbtSerialization.writeInventory(entity.getEnderChest().getContents(), 0); tag.putCompoundList("EnderItems", inventory); } }