diff --git a/src/main/java/com/glodblock/github/client/GuiFluidLevelMaintainer.java b/src/main/java/com/glodblock/github/client/GuiFluidLevelMaintainer.java index 847b26e1..d4df6fb2 100644 --- a/src/main/java/com/glodblock/github/client/GuiFluidLevelMaintainer.java +++ b/src/main/java/com/glodblock/github/client/GuiFluidLevelMaintainer.java @@ -1,4 +1,131 @@ package com.glodblock.github.client; -public class GuiFluidLevelMaintainer { +import appeng.client.gui.AEBaseGui; +import appeng.client.gui.widgets.GuiNumberBox; +import appeng.core.localization.GuiText; +import com.glodblock.github.FluidCraft; +import com.glodblock.github.client.container.ContainerFluidLevelMaintainer; +import com.glodblock.github.common.tile.TileFluidLevelMaintainer; +import com.glodblock.github.network.CPacketUpdateFluidLevel; +import com.glodblock.github.util.NameConst; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.items.IItemHandler; + +import java.io.IOException; + +public class GuiFluidLevelMaintainer extends AEBaseGui { + + private static final ResourceLocation TEX_BG = FluidCraft.resource("textures/gui/fluid_level_maintainer.png"); + + private final ContainerFluidLevelMaintainer cont; + private final GuiNumberBox[] maintain = new GuiNumberBox[TileFluidLevelMaintainer.MAX_FLUID]; + private final GuiNumberBox[] request = new GuiNumberBox[TileFluidLevelMaintainer.MAX_FLUID]; + + public GuiFluidLevelMaintainer(InventoryPlayer ipl, TileFluidLevelMaintainer tile) { + super(new ContainerFluidLevelMaintainer(ipl, tile)); + this.cont = (ContainerFluidLevelMaintainer) inventorySlots; + this.ySize = 214; + for (int i = 0; i < TileFluidLevelMaintainer.MAX_FLUID; i ++) { + maintain[i] = new GuiNumberBox(this.fontRenderer, this.guiLeft + 39, this.guiTop + 22 + i * 20, 42, 10, Integer.class); + request[i] = new GuiNumberBox(this.fontRenderer, this.guiLeft + 102, this.guiTop + 22 + i * 20, 42, 10, Integer.class); + } + } + + protected void keyTyped(char character, int key) throws IOException { + + if (!this.checkHotbarKeys(key)) { + GuiNumberBox focus = null; + int id = 0; + for (int i = 0; i < TileFluidLevelMaintainer.MAX_FLUID; i ++) { + if (maintain[i].isFocused()) { + focus = maintain[i]; + id = i; + } + if (request[i].isFocused()) { + focus = request[i]; + id = i + 10; + } + } + if (focus != null) { + if ((key == 211 || key == 205 || key == 203 || key == 14 || character == '-' || Character.isDigit(character)) && focus.textboxKeyTyped(character, key)) { + try { + String out = focus.getText(); + + boolean fixed; + for(fixed = false; out.startsWith("0") && out.length() > 1; fixed = true) { + out = out.substring(1); + } + + if (fixed) { + focus.setText(out); + } + + if (out.isEmpty()) { + out = "0"; + } + + long result = Long.parseLong(out); + if (result < 0L) { + focus.setText("1"); + result = 1; + } + + FluidCraft.proxy.netHandler.sendToServer(new CPacketUpdateFluidLevel(id, (int) result)); + + } catch (NumberFormatException ignored) { + } + } + } + else { + super.keyTyped(character, key); + } + } + + } + + @Override + public void initGui() { + super.initGui(); + TileFluidLevelMaintainer tile = this.cont.getTile(); + IItemHandler inv = tile.getInventoryHandler(); + for (int i = 0; i < inv.getSlots(); i ++) { + if (!inv.getStackInSlot(i).isEmpty()) { + this.maintain[i].setText(String.valueOf(inv.getStackInSlot(i).getCount())); + } + else { + this.maintain[i].setText("0"); + } + this.request[i].setText(String.valueOf(tile.getRequest()[i])); + } + } + + @Override + protected void mouseClicked(int xCoord, int yCoord, int btn) throws IOException { + for (int i = 0; i < TileFluidLevelMaintainer.MAX_FLUID; i ++) { + this.configNumberBar(request[i], xCoord, yCoord, btn); + this.configNumberBar(maintain[i], xCoord, yCoord, btn); + } + super.mouseClicked(xCoord, yCoord, btn); + } + + private void configNumberBar(GuiNumberBox bar, int xCoord, int yCoord, int btn) { + bar.mouseClicked(xCoord, yCoord, btn); + if (btn == 1 && bar.isFocused()) { + bar.setText(""); + } + } + + @Override + public void drawFG(int offsetX, int offsetY, int mouseX, int mouseY) { + fontRenderer.drawString(getGuiDisplayName(I18n.format(NameConst.GUI_FLUID_LEVEL_MAINTAINER)), 8, 6, 0x404040); + fontRenderer.drawString(GuiText.inventory.getLocal(), 8, ySize - 94, 0x404040); + } + + @Override + public void drawBG(int offsetX, int offsetY, int mouseX, int mouseY) { + mc.getTextureManager().bindTexture(TEX_BG); + drawTexturedModalRect(offsetX, offsetY, 0, 0, 176, ySize); + } } diff --git a/src/main/java/com/glodblock/github/client/container/ContainerFluidLevelMaintainer.java b/src/main/java/com/glodblock/github/client/container/ContainerFluidLevelMaintainer.java index 12105383..a85448a7 100644 --- a/src/main/java/com/glodblock/github/client/container/ContainerFluidLevelMaintainer.java +++ b/src/main/java/com/glodblock/github/client/container/ContainerFluidLevelMaintainer.java @@ -1,6 +1,5 @@ package com.glodblock.github.client.container; -import appeng.api.storage.data.IAEItemStack; import appeng.container.AEBaseContainer; import appeng.container.slot.SlotFake; import com.glodblock.github.common.item.ItemFluidDrop; @@ -8,6 +7,7 @@ import com.glodblock.github.common.item.ItemFluidPacket; import com.glodblock.github.common.tile.TileFluidLevelMaintainer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidTankProperties; import net.minecraftforge.items.IItemHandler; @@ -34,14 +34,13 @@ public class ContainerFluidLevelMaintainer extends AEBaseContainer { private static class DisplayFluidSlot extends SlotFake { - IItemHandler icv; - public DisplayFluidSlot(IItemHandler inv, int idx, int x, int y) { super(inv, idx, x, y); - this.icv = inv; } + @Override public void putStack(ItemStack is) { + //System.out.print(is + "\n"); if (is.isEmpty()) { super.putStack(is); return; @@ -59,6 +58,15 @@ public class ContainerFluidLevelMaintainer extends AEBaseContainer { super.putStack(ItemStack.EMPTY); } + /*@Override + public ItemStack getDisplayStack() { + ItemStack drops = super.getDisplayStack(); + System.out.print(drops + "\n"); + FluidStack fluid = ItemFluidDrop.getFluidStack(drops); + System.out.print(fluid + "\n"); + return ItemFluidPacket.newDisplayStack(fluid); + }*/ + } } diff --git a/src/main/java/com/glodblock/github/common/block/BlockFluidLevelMaintainer.java b/src/main/java/com/glodblock/github/common/block/BlockFluidLevelMaintainer.java new file mode 100644 index 00000000..f9e8064b --- /dev/null +++ b/src/main/java/com/glodblock/github/common/block/BlockFluidLevelMaintainer.java @@ -0,0 +1,39 @@ +package com.glodblock.github.common.block; + +import appeng.block.AEBaseTileBlock; +import com.glodblock.github.common.tile.TileFluidLevelMaintainer; +import com.glodblock.github.inventory.GuiType; +import com.glodblock.github.inventory.InventoryHandler; +import net.minecraft.block.material.Material; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public class BlockFluidLevelMaintainer extends AEBaseTileBlock { + + public BlockFluidLevelMaintainer() { + super(Material.IRON); + setTileEntity(TileFluidLevelMaintainer.class); + } + + @Override + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, + EnumFacing facing, float hitX, float hitY, float hitZ) { + if (player.isSneaking()) { + return false; + } + TileFluidLevelMaintainer tile = getTileEntity(world, pos); + if (tile != null) { + if (!world.isRemote) { + InventoryHandler.openGui(player, world, pos, facing, GuiType.FLUID_LEVEL_MAINTAINER); + } + return true; + } + + return false; + } + +} diff --git a/src/main/java/com/glodblock/github/common/item/ItemFluidPacket.java b/src/main/java/com/glodblock/github/common/item/ItemFluidPacket.java index 87e93a6b..9bac4bc1 100644 --- a/src/main/java/com/glodblock/github/common/item/ItemFluidPacket.java +++ b/src/main/java/com/glodblock/github/common/item/ItemFluidPacket.java @@ -37,6 +37,10 @@ public class ItemFluidPacket extends Item implements HasCustomModel { @Nonnull public String getItemStackDisplayName(@Nonnull ItemStack stack) { FluidStack fluid = getFluidStack(stack); + boolean display = isDisplay(stack); + if (display) { + return fluid != null ? fluid.getUnlocalizedName() : super.getItemStackDisplayName(stack); + } return fluid != null ? String.format("%s, %,d mB", fluid.getLocalizedName(), fluid.amount) : super.getItemStackDisplayName(stack); } @@ -45,6 +49,8 @@ public class ItemFluidPacket extends Item implements HasCustomModel { @Override public void addInformation(@Nonnull ItemStack stack, @Nullable World world, @Nonnull List tooltip, @Nonnull ITooltipFlag flags) { FluidStack fluid = getFluidStack(stack); + boolean display = isDisplay(stack); + if (display) return; if (fluid != null) { for (String line : I18n.translateToLocal(NameConst.TT_FLUID_PACKET).split("\\\\n")) { tooltip.add(TextFormatting.GRAY + line); @@ -63,6 +69,13 @@ public class ItemFluidPacket extends Item implements HasCustomModel { return (fluid != null && fluid.amount > 0) ? fluid : null; } + public static boolean isDisplay(ItemStack stack) { + if (stack.isEmpty() || !stack.hasTagCompound() || stack.getTagCompound() == null) { + return false; + } + return stack.getTagCompound().getBoolean("DisplayOnly"); + } + @Nullable public static FluidStack getFluidStack(@Nullable IAEItemStack stack) { return stack != null ? getFluidStack(stack.getDefinition()) : null; @@ -81,6 +94,22 @@ public class ItemFluidPacket extends Item implements HasCustomModel { return stack; } + public static ItemStack newDisplayStack(@Nullable FluidStack fluid) { + if (fluid == null) { + return ItemStack.EMPTY; + } + FluidStack copy = fluid.copy(); + copy.amount = 1000; + ItemStack stack = new ItemStack(FCItems.FLUID_PACKET); + NBTTagCompound tag = new NBTTagCompound(); + NBTTagCompound fluidTag = new NBTTagCompound(); + copy.writeToNBT(fluidTag); + tag.setTag("FluidStack", fluidTag); + tag.setBoolean("DisplayOnly", true); + stack.setTagCompound(tag); + return stack; + } + @Nullable public static IAEItemStack newAeStack(@Nullable FluidStack fluid) { return AEItemStack.fromItemStack(newStack(fluid)); diff --git a/src/main/java/com/glodblock/github/common/tile/TileFluidLevelMaintainer.java b/src/main/java/com/glodblock/github/common/tile/TileFluidLevelMaintainer.java index 360d9da7..a9c312ae 100644 --- a/src/main/java/com/glodblock/github/common/tile/TileFluidLevelMaintainer.java +++ b/src/main/java/com/glodblock/github/common/tile/TileFluidLevelMaintainer.java @@ -14,7 +14,6 @@ import appeng.api.networking.storage.IStorageGrid; import appeng.api.storage.IMEMonitor; import appeng.api.storage.IStorageChannel; import appeng.api.storage.channels.IFluidStorageChannel; -import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEFluidStack; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IAEStack; @@ -62,6 +61,13 @@ public class TileFluidLevelMaintainer extends AENetworkTile implements IStackWat this.config.setStackInSlot(id, item.getDefinition()); } + public void setConfig(int id, int size) { + if (id < 0 || id > MAX_FLUID || this.config.getStackInSlot(id).isEmpty()) { + return; + } + this.config.getStackInSlot(id).setCount(size); + } + public void setRequest(int id, long amount) { if (id < 0 || id > MAX_FLUID) { return; @@ -73,6 +79,10 @@ public class TileFluidLevelMaintainer extends AENetworkTile implements IStackWat return this.config; } + public long[] getRequest() { + return this.request; + } + @Override public void readFromNBT(NBTTagCompound data) { super.readFromNBT(data); @@ -200,4 +210,5 @@ public class TileFluidLevelMaintainer extends AENetworkTile implements IStackWat public void onChangeInventory(IItemHandler iItemHandler, int i, InvOperation invOperation, ItemStack itemStack, ItemStack itemStack1) { markForUpdate(); } + } diff --git a/src/main/java/com/glodblock/github/inventory/GuiType.java b/src/main/java/com/glodblock/github/inventory/GuiType.java index 8fd7459d..79cd5d7f 100644 --- a/src/main/java/com/glodblock/github/inventory/GuiType.java +++ b/src/main/java/com/glodblock/github/inventory/GuiType.java @@ -16,10 +16,7 @@ import appeng.parts.reporting.AbstractPartTerminal; import com.glodblock.github.client.*; import com.glodblock.github.client.container.*; import com.glodblock.github.common.part.PartFluidExportBus; -import com.glodblock.github.common.tile.TileBurette; -import com.glodblock.github.common.tile.TileFluidPacketDecoder; -import com.glodblock.github.common.tile.TileFluidPatternEncoder; -import com.glodblock.github.common.tile.TileIngredientBuffer; +import com.glodblock.github.common.tile.*; import com.glodblock.github.interfaces.FCPriorityHost; import com.google.common.collect.ImmutableList; import net.minecraft.entity.player.EntityPlayer; @@ -35,6 +32,18 @@ import java.util.List; public enum GuiType { + FLUID_LEVEL_MAINTAINER(new PartOrTileGuiFactory(TileFluidLevelMaintainer.class) { + @Override + protected Object createServerGui(EntityPlayer player, TileFluidLevelMaintainer inv) { + return new ContainerFluidLevelMaintainer(player.inventory, inv); + } + + @Override + protected Object createClientGui(EntityPlayer player, TileFluidLevelMaintainer inv) { + return new GuiFluidLevelMaintainer(player.inventory, inv); + } + }), + FLUID_EXPORT_BUS(new PartOrTileGuiFactory(PartFluidExportBus.class) { @Override protected Object createServerGui(EntityPlayer player, PartFluidExportBus inv) { diff --git a/src/main/java/com/glodblock/github/loader/ChannelLoader.java b/src/main/java/com/glodblock/github/loader/ChannelLoader.java index ec3db543..2cdbd68d 100644 --- a/src/main/java/com/glodblock/github/loader/ChannelLoader.java +++ b/src/main/java/com/glodblock/github/loader/ChannelLoader.java @@ -7,6 +7,7 @@ import net.minecraftforge.fml.relauncher.Side; public class ChannelLoader implements Runnable { @Override + @SuppressWarnings("all") public void run() { int id = 0; FluidCraft.proxy.netHandler.registerMessage(new CPacketSwitchGuis.Handler(), CPacketSwitchGuis.class, id ++, Side.SERVER); @@ -14,6 +15,7 @@ public class ChannelLoader implements Runnable { FluidCraft.proxy.netHandler.registerMessage(new CPacketTransposeFluid.Handler(), CPacketTransposeFluid.class, id ++, Side.SERVER); FluidCraft.proxy.netHandler.registerMessage(new CPacketEncodePattern.Handler(), CPacketEncodePattern.class, id ++, Side.SERVER); FluidCraft.proxy.netHandler.registerMessage(new CPacketLoadPattern.Handler(), CPacketLoadPattern.class, id ++, Side.SERVER); + FluidCraft.proxy.netHandler.registerMessage(new CPacketUpdateFluidLevel.Handler(), CPacketUpdateFluidLevel.class, id ++, Side.SERVER); } } diff --git a/src/main/java/com/glodblock/github/loader/FCBlocks.java b/src/main/java/com/glodblock/github/loader/FCBlocks.java index 14fde4b5..7e3c153e 100644 --- a/src/main/java/com/glodblock/github/loader/FCBlocks.java +++ b/src/main/java/com/glodblock/github/loader/FCBlocks.java @@ -20,6 +20,8 @@ public class FCBlocks { public static BlockBurette BURETTE; @GameRegistry.ObjectHolder(FluidCraft.MODID + ":" + NameConst.BLOCK_DUAL_INTERFACE) public static BlockDualInterface DUAL_INTERFACE; + /*@GameRegistry.ObjectHolder(FluidCraft.MODID + ":" + NameConst.BLOCK_FLUID_LEVEL_MAINTAINER) + public static BlockFluidLevelMaintainer FLUID_LEVEL_MAINTAINER;*/ public static void init(RegistryHandler regHandler) { regHandler.block(NameConst.BLOCK_FLUID_DISCRETIZER, new BlockFluidDiscretizer()); @@ -28,6 +30,7 @@ public class FCBlocks { regHandler.block(NameConst.BLOCK_INGREDIENT_BUFFER, new BlockIngredientBuffer()); regHandler.block(NameConst.BLOCK_BURETTE, new BlockBurette()); regHandler.block(NameConst.BLOCK_DUAL_INTERFACE, new BlockDualInterface()); + //regHandler.block(NameConst.BLOCK_FLUID_LEVEL_MAINTAINER, new BlockFluidLevelMaintainer()); } } diff --git a/src/main/java/com/glodblock/github/network/CPacketUpdateFluidLevel.java b/src/main/java/com/glodblock/github/network/CPacketUpdateFluidLevel.java new file mode 100644 index 00000000..998c1910 --- /dev/null +++ b/src/main/java/com/glodblock/github/network/CPacketUpdateFluidLevel.java @@ -0,0 +1,61 @@ +package com.glodblock.github.network; + +import com.glodblock.github.client.container.ContainerFluidLevelMaintainer; +import com.glodblock.github.common.tile.TileFluidLevelMaintainer; +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; + +import javax.annotation.Nullable; + +public class CPacketUpdateFluidLevel implements IMessage { + + private int index; + private int size; + + public CPacketUpdateFluidLevel() { + //NO-OP + } + + public CPacketUpdateFluidLevel(int id, int value) { + this.index = id; + this.size = value; + } + + @Override + public void fromBytes(ByteBuf buf) { + index = buf.readInt(); + size = buf.readInt(); + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeInt(index); + buf.writeInt(size); + } + + public static class Handler implements IMessageHandler { + + @Nullable + @Override + public IMessage onMessage(CPacketUpdateFluidLevel message, MessageContext ctx) { + EntityPlayerMP player = ctx.getServerHandler().player; + player.getServerWorld().addScheduledTask(() -> { + if (player.openContainer instanceof ContainerFluidLevelMaintainer) { + TileFluidLevelMaintainer te = ((ContainerFluidLevelMaintainer) player.openContainer).getTile(); + if (message.index > 10) { + te.setRequest(message.index - 10, message.size); + } + else { + te.setConfig(message.index, message.size); + } + } + }); + return null; + } + + } + +} diff --git a/src/main/java/com/glodblock/github/proxy/CommonProxy.java b/src/main/java/com/glodblock/github/proxy/CommonProxy.java index ea0dde14..a57e2293 100644 --- a/src/main/java/com/glodblock/github/proxy/CommonProxy.java +++ b/src/main/java/com/glodblock/github/proxy/CommonProxy.java @@ -51,6 +51,7 @@ public class CommonProxy { GameRegistry.registerTileEntity(TileIngredientBuffer.class, FluidCraft.resource(NameConst.BLOCK_INGREDIENT_BUFFER)); GameRegistry.registerTileEntity(TileBurette.class, FluidCraft.resource(NameConst.BLOCK_BURETTE)); GameRegistry.registerTileEntity(TileDualInterface.class, FluidCraft.resource(NameConst.BLOCK_DUAL_INTERFACE)); + //GameRegistry.registerTileEntity(TileFluidLevelMaintainer.class, FluidCraft.resource(NameConst.BLOCK_FLUID_LEVEL_MAINTAINER)); (new ChannelLoader()).run(); if (ModAndClassUtil.AUTO_P) { initPackagedAutoIntegration(); diff --git a/src/main/resources/assets/ae2fc/blockstates/fluid_level_maintainer.json b/src/main/resources/assets/ae2fc/blockstates/fluid_level_maintainer.json new file mode 100644 index 00000000..636f6db2 --- /dev/null +++ b/src/main/resources/assets/ae2fc/blockstates/fluid_level_maintainer.json @@ -0,0 +1,7 @@ +{ + "variants": { + "normal": { + "model": "ae2fc:fluid_level_maintainer" + } + } +} diff --git a/src/main/resources/assets/ae2fc/models/block/fluid_level_maintainer.json b/src/main/resources/assets/ae2fc/models/block/fluid_level_maintainer.json new file mode 100644 index 00000000..dad40836 --- /dev/null +++ b/src/main/resources/assets/ae2fc/models/block/fluid_level_maintainer.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "ae2fc:blocks/fluid_level_maintainer" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ae2fc/models/item/fluid_level_maintainer.json b/src/main/resources/assets/ae2fc/models/item/fluid_level_maintainer.json new file mode 100644 index 00000000..95e97f17 --- /dev/null +++ b/src/main/resources/assets/ae2fc/models/item/fluid_level_maintainer.json @@ -0,0 +1,3 @@ +{ + "parent": "ae2fc:block/fluid_level_maintainer" +} diff --git a/src/main/resources/assets/ae2fc/textures/blocks/fluid_level_maintainer.png b/src/main/resources/assets/ae2fc/textures/blocks/fluid_level_maintainer.png new file mode 100644 index 00000000..66f1159e Binary files /dev/null and b/src/main/resources/assets/ae2fc/textures/blocks/fluid_level_maintainer.png differ