From de3553a1deae7bb321b603a38813e1f290a4c400 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Sun, 12 Feb 2017 21:14:49 +0100 Subject: [PATCH] Render item from storage --- .../node/NetworkNodeStorageMonitor.java | 81 ++++++++++++++++++- .../container/ContainerStorageMonitor.java | 20 +---- ...leEntitySpecialRendererStorageMonitor.java | 6 +- .../refinedstorage/tile/TileBase.java | 12 ++- .../refinedstorage/tile/TileSolderer.java | 7 ++ .../tile/TileStorageMonitor.java | 62 ++++++++++++++ 6 files changed, 164 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeStorageMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeStorageMonitor.java index aff5e859e..9001a0e46 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeStorageMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeStorageMonitor.java @@ -1,5 +1,6 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.node; +import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBasic; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerFluid; @@ -7,21 +8,55 @@ import com.raoulvdberge.refinedstorage.inventory.ItemHandlerListenerNetworkNode; import com.raoulvdberge.refinedstorage.tile.TileStorageMonitor; import com.raoulvdberge.refinedstorage.tile.config.IComparable; import com.raoulvdberge.refinedstorage.tile.config.IType; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.items.IItemHandler; public class NetworkNodeStorageMonitor extends NetworkNode implements IComparable, IType { public static final String ID = "storage_monitor"; - private ItemHandlerBasic itemFilter = new ItemHandlerBasic(1, new ItemHandlerListenerNetworkNode(this)); - private ItemHandlerFluid fluidFilter = new ItemHandlerFluid(1, new ItemHandlerListenerNetworkNode(this)); + private ItemHandlerBasic itemFilter = new ItemHandlerBasic(1, new ItemHandlerListenerNetworkNode(this)) { + @Override + public void onContentsChanged(int slot) { + super.onContentsChanged(slot); + + RSUtils.updateBlock(holder.world(), holder.pos()); + } + }; + + private ItemHandlerFluid fluidFilter = new ItemHandlerFluid(1, new ItemHandlerListenerNetworkNode(this)) { + @Override + public void onContentsChanged(int slot) { + super.onContentsChanged(slot); + + RSUtils.updateBlock(holder.world(), holder.pos()); + } + }; private int compare = IComparer.COMPARE_NBT | IComparer.COMPARE_DAMAGE; private int type = IType.ITEMS; + private int oldAmount = -1; + public NetworkNodeStorageMonitor(INetworkNodeHolder holder) { super(holder); } + @Override + public void update() { + super.update(); + + int newAmount = getAmount(); + + if (oldAmount == -1) { + oldAmount = newAmount; + } else if (oldAmount != newAmount) { + oldAmount = newAmount; + + RSUtils.updateBlock(holder.world(), holder.pos()); + } + } + @Override public int getEnergyUsage() { return 0; @@ -60,4 +95,46 @@ public class NetworkNodeStorageMonitor extends NetworkNode implements IComparabl public IItemHandler getFilterInventory() { return getType() == IType.ITEMS ? itemFilter : fluidFilter; } + + public ItemHandlerBasic getItemFilter() { + return itemFilter; + } + + public ItemHandlerFluid getFluidFilter() { + return fluidFilter; + } + + public int getAmount() { + if (network == null) { + return 0; + } + + switch (type) { + case ITEMS: { + ItemStack toCheck = itemFilter.getStackInSlot(0); + + if (toCheck.isEmpty()) { + return 0; + } + + ItemStack stored = network.getItemStorageCache().getList().get(toCheck, compare); + + return stored != null ? stored.getCount() : 0; + } + case FLUIDS: { + FluidStack toCheck = fluidFilter.getFluidStackInSlot(0); + + if (toCheck == null) { + return 0; + } + + FluidStack stored = network.getFluidStorageCache().getList().get(toCheck, compare); + + return stored != null ? stored.amount : 0; + } + default: { + return 0; + } + } + } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerStorageMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerStorageMonitor.java index a9c8bd8e3..4594c4305 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerStorageMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerStorageMonitor.java @@ -17,26 +17,12 @@ public class ContainerStorageMonitor extends ContainerBase { @Override public ItemStack transferStackInSlot(EntityPlayer player, int index) { - ItemStack stack = ItemStack.EMPTY; - Slot slot = getSlot(index); - if (slot.getHasStack()) { - stack = slot.getStack(); + ItemStack stack = slot.getStack(); - if (index < 4) { - if (!mergeItemStack(stack, 4, inventorySlots.size(), false)) { - return ItemStack.EMPTY; - } - } else if (!mergeItemStack(stack, 0, 4, false)) { - return mergeItemStackToFilters(stack, 4, 4 + 1); - } - - if (stack.getCount() == 0) { - slot.putStack(ItemStack.EMPTY); - } else { - slot.onSlotChanged(); - } + if (index > 0 && slot.getHasStack()) { + return mergeItemStackToFilters(stack, 0, 1); } return stack; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/render/TileEntitySpecialRendererStorageMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/render/TileEntitySpecialRendererStorageMonitor.java index 381e87923..464e26fc8 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/render/TileEntitySpecialRendererStorageMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/render/TileEntitySpecialRendererStorageMonitor.java @@ -1,5 +1,6 @@ package com.raoulvdberge.refinedstorage.render; +import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.tile.TileStorageMonitor; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GlStateManager; @@ -8,7 +9,6 @@ import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.ItemCameraTransforms; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; -import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import org.lwjgl.opengl.GL11; @@ -27,7 +27,7 @@ public class TileEntitySpecialRendererStorageMonitor extends TileEntitySpecialRe GlStateManager.scale(0.4F, -0.4F, -0.015F); - ItemStack stack = new ItemStack(Blocks.PISTON); + ItemStack stack = tile.getItemStack(); RenderItem itemRender = Minecraft.getMinecraft().getRenderItem(); Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); @@ -60,7 +60,7 @@ public class TileEntitySpecialRendererStorageMonitor extends TileEntitySpecialRe float factor = 2.0f; GlStateManager.scale(size * factor, size * factor, size); - Minecraft.getMinecraft().fontRendererObj.drawString("It works", 0, 0, 0xFFFFFF); + Minecraft.getMinecraft().fontRendererObj.drawString(RSUtils.formatQuantity(tile.getAmount()), 0, 0, 0xFFFFFF); GlStateManager.popMatrix(); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileBase.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileBase.java index 2eb622c7a..f62142346 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileBase.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileBase.java @@ -16,7 +16,7 @@ import net.minecraftforge.items.IItemHandler; import javax.annotation.Nullable; public abstract class TileBase extends TileEntity implements ITickable { - private static final String NBT_DIRECTION = "Direction"; + protected static final String NBT_DIRECTION = "Direction"; private EnumFacing direction = EnumFacing.NORTH; @@ -65,9 +65,17 @@ public abstract class TileBase extends TileEntity implements ITickable { } public void readUpdate(NBTTagCompound tag) { + boolean doRerender = canUpdateCauseRerender(tag); + direction = EnumFacing.getFront(tag.getInteger(NBT_DIRECTION)); - RSUtils.updateBlock(getWorld(), pos); + if (doRerender) { + RSUtils.updateBlock(getWorld(), pos); + } + } + + protected boolean canUpdateCauseRerender(NBTTagCompound tag) { + return true; } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileSolderer.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileSolderer.java index 3b9a93eba..9bdd22691 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileSolderer.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileSolderer.java @@ -78,6 +78,13 @@ public class TileSolderer extends TileNode { return working; } + @Override + protected boolean canUpdateCauseRerender(NBTTagCompound tag) { + EnumFacing receivedDirection = EnumFacing.getFront(tag.getInteger(NBT_DIRECTION)); + + return receivedDirection != getDirection(); + } + @Override @Nonnull public NetworkNodeSolderer createNode() { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileStorageMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileStorageMonitor.java index 2909bf16b..1054574c4 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileStorageMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileStorageMonitor.java @@ -4,11 +4,24 @@ import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNodeStorageMo import com.raoulvdberge.refinedstorage.tile.config.IComparable; import com.raoulvdberge.refinedstorage.tile.config.IType; import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.fluids.FluidStack; public class TileStorageMonitor extends TileNode { + private static final String NBT_TYPE = "Type"; + private static final String NBT_STACK = "Stack"; + private static final String NBT_AMOUNT = "Amount"; + public static final TileDataParameter COMPARE = IComparable.createParameter(); public static final TileDataParameter TYPE = IType.createParameter(); + private int type; + private int amount; + private ItemStack itemStack = ItemStack.EMPTY; + private FluidStack fluidStack; + public TileStorageMonitor() { dataManager.addWatchedParameter(COMPARE); dataManager.addWatchedParameter(TYPE); @@ -18,4 +31,53 @@ public class TileStorageMonitor extends TileNode { public NetworkNodeStorageMonitor createNode() { return new NetworkNodeStorageMonitor(this); } + + @Override + public NBTTagCompound writeUpdate(NBTTagCompound tag) { + super.writeUpdate(tag); + + tag.setInteger(NBT_TYPE, getNode().getType()); + tag.setTag(NBT_STACK, getNode().getType() == IType.ITEMS ? getNode().getItemFilter().getStackInSlot(0).writeToNBT(new NBTTagCompound()) : getNode().getFluidFilter().getFluidStackInSlot(0).writeToNBT(new NBTTagCompound())); + tag.setInteger(NBT_AMOUNT, getNode().getAmount()); + + return tag; + } + + @Override + public void readUpdate(NBTTagCompound tag) { + super.readUpdate(tag); + + type = tag.getInteger(NBT_TYPE); + + if (type == IType.ITEMS) { + itemStack = new ItemStack(tag.getCompoundTag(NBT_STACK)); + } else { + fluidStack = FluidStack.loadFluidStackFromNBT(tag.getCompoundTag(NBT_STACK)); + } + + amount = tag.getInteger(NBT_AMOUNT); + } + + @Override + protected boolean canUpdateCauseRerender(NBTTagCompound tag) { + EnumFacing receivedDirection = EnumFacing.getFront(tag.getInteger(NBT_DIRECTION)); + + return receivedDirection != getDirection(); + } + + public int getType() { + return type; + } + + public int getAmount() { + return amount; + } + + public ItemStack getItemStack() { + return itemStack; + } + + public FluidStack getFluidStack() { + return fluidStack; + } }