package me.km.blocks; import java.awt.Color; import java.util.LinkedList; import net.minecraft.block.state.IBlockState; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.network.NetworkManager; import net.minecraft.network.play.server.SPacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; public class TileEntityCauldron extends TileEntity { private CauldronColorMixer mixer; public TileEntityCauldron() { mixer = new CauldronColorMixer(); } @Override public NBTTagCompound writeToNBT(NBTTagCompound com) { super.writeToNBT(com); NBTTagList list = new NBTTagList(); LinkedList items = mixer.getItems(); items.stream().forEach(stack -> { NBTTagCompound nbttagcompound = new NBTTagCompound(); stack.writeToNBT(nbttagcompound); list.appendTag(nbttagcompound); }); com.setTag("items", list); return com; } @Override public void readFromNBT(NBTTagCompound com) { super.readFromNBT(com); readItems(com); } private void readItems(NBTTagCompound com) { if(com.hasKey("items", 9)) { mixer.reset(); NBTTagList list = com.getTagList("items", 10); LinkedList items = mixer.getItems(); for(NBTBase base : list) { items.add(new ItemStack((NBTTagCompound) base)); } mixer.cache(); } } @Override protected void setWorldCreate(World w) { this.setWorld(w); } public boolean hasDefaultColor() { return mixer.getItems().isEmpty(); } public int getNumberOfIngredients() { return mixer.getItems().size(); } public LinkedList getIngredients() { return mixer.getItems(); } public Color getColor() { return mixer.getMixedColor(); } public void reset() { mixer.reset(); } public boolean addItemStack(ItemStack stack) { boolean b = mixer.addColor(stack); if(b) { notifyBlockUpdate(); markDirty(); } return b; } public void setColor(int red, int green, int blue) { mixer.reset(new Color(red, green, blue)); notifyBlockUpdate(); markDirty(); } private void notifyBlockUpdate() { IBlockState state = world.getBlockState(pos); this.world.notifyBlockUpdate(pos, state, state, 3); } @Override public SPacketUpdateTileEntity getUpdatePacket() { return new SPacketUpdateTileEntity(this.pos, -1, this.getUpdateTag()); } @Override public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) { readItems(pkt.getNbtCompound()); notifyBlockUpdate(); } @Override public NBTTagCompound getUpdateTag() { return writeToNBT(new NBTTagCompound()); } @Override public boolean shouldRefresh(World w, BlockPos pos, IBlockState oldState, IBlockState newState) { return oldState.getBlock() != newState.getBlock(); } }