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 9001a0e46..3c808377a 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 @@ -9,12 +9,16 @@ 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.minecraft.nbt.NBTTagCompound; 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 static final String NBT_COMPARE = "Compare"; + private static final String NBT_TYPE = "Type"; + private ItemHandlerBasic itemFilter = new ItemHandlerBasic(1, new ItemHandlerListenerNetworkNode(this)) { @Override public void onContentsChanged(int slot) { @@ -76,6 +80,8 @@ public class NetworkNodeStorageMonitor extends NetworkNode implements IComparabl public void setCompare(int compare) { this.compare = compare; + RSUtils.updateBlock(holder.world(), holder.pos()); + markDirty(); } @@ -88,6 +94,8 @@ public class NetworkNodeStorageMonitor extends NetworkNode implements IComparabl public void setType(int type) { this.type = type; + RSUtils.updateBlock(holder.world(), holder.pos()); + markDirty(); } @@ -96,6 +104,35 @@ public class NetworkNodeStorageMonitor extends NetworkNode implements IComparabl return getType() == IType.ITEMS ? itemFilter : fluidFilter; } + @Override + public NBTTagCompound writeConfiguration(NBTTagCompound tag) { + super.writeConfiguration(tag); + + tag.setInteger(NBT_COMPARE, compare); + tag.setInteger(NBT_TYPE, type); + + RSUtils.writeItems(itemFilter, 0, tag); + RSUtils.writeItems(fluidFilter, 1, tag); + + return tag; + } + + @Override + public void readConfiguration(NBTTagCompound tag) { + super.readConfiguration(tag); + + if (tag.hasKey(NBT_COMPARE)) { + compare = tag.getInteger(NBT_COMPARE); + } + + if (tag.hasKey(NBT_TYPE)) { + type = tag.getInteger(NBT_TYPE); + } + + RSUtils.readItems(itemFilter, 0, tag); + RSUtils.readItems(fluidFilter, 1, tag); + } + public ItemHandlerBasic getItemFilter() { return itemFilter; } @@ -137,4 +174,9 @@ public class NetworkNodeStorageMonitor extends NetworkNode implements IComparabl } } } + + @Override + public boolean hasConnectivityState() { + return true; + } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockStorageMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockStorageMonitor.java index 5373f468b..91a57b1c7 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockStorageMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockStorageMonitor.java @@ -33,7 +33,7 @@ public class BlockStorageMonitor extends BlockNode { } @Override - public EnumPlacementType getPlacementType() { - return null; + public boolean hasConnectivityState() { + return true; } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyClient.java b/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyClient.java index 4566f2241..5c2e3e884 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyClient.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyClient.java @@ -207,7 +207,7 @@ public class ProxyClient extends ProxyCommon { ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RSBlocks.DISK_MANIPULATOR), 0, new ModelResourceLocation("refinedstorage:disk_manipulator", "inventory")); ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RSBlocks.SECURITY_MANAGER), 0, new ModelResourceLocation("refinedstorage:security_manager", "inventory")); ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RSBlocks.QUARTZ_ENRICHED_IRON), 0, new ModelResourceLocation("refinedstorage:quartz_enriched_iron_block", "inventory")); - ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RSBlocks.STORAGE_MONITOR), 0, new ModelResourceLocation("refinedstorage:storage_monitor", "inventory")); + ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RSBlocks.STORAGE_MONITOR), 0, new ModelResourceLocation("refinedstorage:storage_monitor", "connected=false,direction=north")); ModelLoaderRegistry.registerLoader(new ICustomModelLoader() { @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java b/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java index fec8e2928..1ff32eb17 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java @@ -800,6 +800,19 @@ public class ProxyCommon { 'C', new ItemStack(RSItems.NETWORK_CARD), 'A', new ItemStack(RSItems.PROCESSOR, 1, ItemProcessor.TYPE_ADVANCED) ); + + // Storage Monitor + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(RSBlocks.STORAGE_MONITOR), + "PCG", + "EMG", + "PDG", + 'E', new ItemStack(RSItems.QUARTZ_ENRICHED_IRON), + 'P', new ItemStack(RSItems.PROCESSOR, 1, ItemProcessor.TYPE_BASIC), + 'C', new ItemStack(RSItems.CORE, 1, ItemCore.TYPE_CONSTRUCTION), + 'D', new ItemStack(RSItems.CORE, 1, ItemCore.TYPE_DESTRUCTION), + 'M', new ItemStack(RSBlocks.MACHINE_CASING), + 'G', "blockGlass" + )); } public void init(FMLInitializationEvent e) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/render/TileEntitySpecialRendererStorageMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/render/TileEntitySpecialRendererStorageMonitor.java index 464e26fc8..86ab4015b 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/render/TileEntitySpecialRendererStorageMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/render/TileEntitySpecialRendererStorageMonitor.java @@ -2,34 +2,30 @@ package com.raoulvdberge.refinedstorage.render; import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.tile.TileStorageMonitor; +import com.raoulvdberge.refinedstorage.tile.config.IType; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.RenderItem; 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.item.ItemStack; +import net.minecraftforge.client.ForgeHooksClient; import org.lwjgl.opengl.GL11; public class TileEntitySpecialRendererStorageMonitor extends TileEntitySpecialRenderer { @Override public void renderTileEntityAt(TileStorageMonitor tile, double x, double y, double z, float partialTicks, int destroyStage) { + setLightmapDisabled(true); + GlStateManager.pushMatrix(); GlStateManager.translate(x + 0.5F, y + 0.5F, z - 0.01F); GlStateManager.rotate(180F, 0F, 0F, 1F); GlStateManager.color(1F, 1F, 1F, 1F); - setLightmapDisabled(true); GlStateManager.depthMask(false); GlStateManager.enableBlend(); GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); GlStateManager.depthMask(true); - GlStateManager.scale(0.4F, -0.4F, -0.015F); - - ItemStack stack = tile.getItemStack(); - - RenderItem itemRender = Minecraft.getMinecraft().getRenderItem(); Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); Minecraft.getMinecraft().getTextureManager().getTexture(TextureMap.LOCATION_BLOCKS_TEXTURE).setBlurMipmap(false, false); GlStateManager.enableRescaleNormal(); @@ -38,9 +34,13 @@ public class TileEntitySpecialRendererStorageMonitor extends TileEntitySpecialRe GlStateManager.enableBlend(); GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); GlStateManager.color(1F, 1F, 1F, 1F); - IBakedModel bakedmodel = itemRender.getItemModelWithOverrides(stack, null, Minecraft.getMinecraft().player); - bakedmodel = net.minecraftforge.client.ForgeHooksClient.handleCameraTransforms(bakedmodel, ItemCameraTransforms.TransformType.GUI, false); - itemRender.renderItem(stack, bakedmodel); + + if (tile.getItemStack() != null) { + IBakedModel bakedModel = Minecraft.getMinecraft().getRenderItem().getItemModelWithOverrides(tile.getItemStack(), null, Minecraft.getMinecraft().player); + bakedModel = ForgeHooksClient.handleCameraTransforms(bakedModel, ItemCameraTransforms.TransformType.GUI, false); + Minecraft.getMinecraft().getRenderItem().renderItem(tile.getItemStack(), bakedModel); + } + GlStateManager.disableAlpha(); GlStateManager.disableRescaleNormal(); GlStateManager.disableLighting(); @@ -52,15 +52,26 @@ public class TileEntitySpecialRendererStorageMonitor extends TileEntitySpecialRe GlStateManager.popMatrix(); GlStateManager.pushMatrix(); + String amount = tile.getType() == IType.ITEMS ? RSUtils.formatQuantity(tile.getAmount()) : RSUtils.QUANTITY_FORMATTER.format((float) tile.getAmount() / 1000F); - GlStateManager.translate(x + 0.5F, y + 0.5F, z - 0.02F); + // Very bad, but I don't know how to translate a 2D font width to a 3D font width... + float textWidth = 0; + for (int i = 0; i < amount.length(); ++i) { + char c = amount.charAt(i); + if (c == '.') { + textWidth += 0.005F; + } else { + textWidth += 0.024F; + } + } + + GlStateManager.translate(x + 0.5F + textWidth, y + 0.2F, z - 0.02F); GlStateManager.rotate(180F, 0F, 0F, 1F); - float size = 0.00450F; float factor = 2.0f; GlStateManager.scale(size * factor, size * factor, size); - Minecraft.getMinecraft().fontRendererObj.drawString(RSUtils.formatQuantity(tile.getAmount()), 0, 0, 0xFFFFFF); + Minecraft.getMinecraft().fontRendererObj.drawString(amount, 0, 0, 0xFFFFFF); GlStateManager.popMatrix(); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileNode.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileNode.java index ebc8ae2e0..3caeb179a 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileNode.java @@ -24,7 +24,7 @@ public abstract class TileNode extends TileBase implement public static final TileDataParameter REDSTONE_MODE = RedstoneMode.createParameter(); private NBTTagCompound legacyTagToRead; - private static final String NBT_ACTIVE = "Active"; + protected static final String NBT_ACTIVE = "Active"; public TileNode() { dataManager.addWatchedParameter(REDSTONE_MODE); @@ -99,9 +99,9 @@ public abstract class TileNode extends TileBase implement } public void readUpdate(NBTTagCompound tag) { - getNode().setActive(tag.getBoolean(NBT_ACTIVE)); - super.readUpdate(tag); + + getNode().setActive(tag.getBoolean(NBT_ACTIVE)); } public IItemHandler getDrops() { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileStorageMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileStorageMonitor.java index 1054574c4..14a9c8769 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileStorageMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileStorageMonitor.java @@ -7,7 +7,8 @@ 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; + +import javax.annotation.Nullable; public class TileStorageMonitor extends TileNode { private static final String NBT_TYPE = "Type"; @@ -19,8 +20,8 @@ public class TileStorageMonitor extends TileNode { private int type; private int amount; - private ItemStack itemStack = ItemStack.EMPTY; - private FluidStack fluidStack; + @Nullable + private ItemStack itemStack; public TileStorageMonitor() { dataManager.addWatchedParameter(COMPARE); @@ -37,7 +38,13 @@ public class TileStorageMonitor extends TileNode { 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())); + + ItemStack stack = getNode().getType() == IType.ITEMS ? getNode().getItemFilter().getStackInSlot(0) : getNode().getFluidFilter().getStackInSlot(0); + + if (!stack.isEmpty()) { + tag.setTag(NBT_STACK, stack.writeToNBT(new NBTTagCompound())); + } + tag.setInteger(NBT_AMOUNT, getNode().getAmount()); return tag; @@ -48,21 +55,16 @@ public class TileStorageMonitor extends TileNode { 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)); - } - + itemStack = tag.hasKey(NBT_STACK) ? new ItemStack(tag.getCompoundTag(NBT_STACK)) : null; amount = tag.getInteger(NBT_AMOUNT); } @Override protected boolean canUpdateCauseRerender(NBTTagCompound tag) { EnumFacing receivedDirection = EnumFacing.getFront(tag.getInteger(NBT_DIRECTION)); + boolean receivedActive = tag.getBoolean(NBT_ACTIVE); - return receivedDirection != getDirection(); + return receivedDirection != getDirection() || receivedActive != getNode().isActive(); } public int getType() { @@ -73,11 +75,8 @@ public class TileStorageMonitor extends TileNode { return amount; } + @Nullable public ItemStack getItemStack() { return itemStack; } - - public FluidStack getFluidStack() { - return fluidStack; - } } diff --git a/src/main/resources/assets/refinedstorage/blockstates/storage_monitor.json b/src/main/resources/assets/refinedstorage/blockstates/storage_monitor.json index 88f2eceb7..76c679ebd 100644 --- a/src/main/resources/assets/refinedstorage/blockstates/storage_monitor.json +++ b/src/main/resources/assets/refinedstorage/blockstates/storage_monitor.json @@ -1,19 +1,46 @@ { "forge_marker": 1, "defaults": { - "model": "cube_all", + "model": "cube", "textures": { - "all": "refinedstorage:blocks/machine_casing" + "particle": "refinedstorage:blocks/side", + "north": "refinedstorage:blocks/machine_casing", + "east": "refinedstorage:blocks/grid_left", + "south": "refinedstorage:blocks/grid_back", + "west": "refinedstorage:blocks/grid_right", + "up": "refinedstorage:blocks/grid_top", + "down": "refinedstorage:blocks/bottom" } }, "variants": { - "inventory": [ - { - "transform": "forge:default-block" + "connected": { + "true": { + "textures": { + "north": "refinedstorage:blocks/interface_connected" + } + }, + "false": { + } + }, + "direction": { + "north": { + "y": 0 + }, + "east": { + "y": 90 + }, + "south": { + "y": 180 + }, + "west": { + "y": 270 + }, + "up": { + "x": 270 + }, + "down": { + "x": 90 } - ], - "normal": { - "model": "cube_all" } } } \ No newline at end of file