From 1ab40869b028c8d4e35c6ea53069b8eb9debe785 Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 25 Nov 2022 14:28:29 +0100 Subject: [PATCH] GUI stuff, fluid API for plasma heater, boxduct inv rendering --- .../com/hbm/blocks/network/FluidDuctBox.java | 14 +- .../hbm/blocks/network/RadioTorchBase.java | 23 +- .../java/com/hbm/inventory/gui/GUIAnvil.java | 5 + .../com/hbm/inventory/gui/GUICoreEmitter.java | 5 + .../hbm/inventory/gui/GUICoreStabilizer.java | 5 + .../com/hbm/inventory/gui/GUINukeFstbmb.java | 5 + .../com/hbm/inventory/gui/GUIRBMKConsole.java | 5 + .../hbm/inventory/gui/GUIRBMKControlAuto.java | 5 + .../com/hbm/inventory/gui/GUIRadioRec.java | 5 + .../hbm/inventory/gui/GUIReactorControl.java | 5 + .../hbm/inventory/gui/GUIReactorResearch.java | 5 + .../com/hbm/inventory/gui/GUIScreenFluid.java | 5 + .../inventory/gui/GUIScreenRadioTorch.java | 134 ++++++++++ .../hbm/inventory/gui/GUIScreenSatCoord.java | 233 +++++++++--------- .../gui/GUIScreenTemplateFolder.java | 5 + .../com/hbm/inventory/gui/GUITurretBase.java | 5 + .../inventory/recipes/anvil/AnvilRecipes.java | 9 + .../com/hbm/items/machine/ItemFluidDuct.java | 8 +- .../java/com/hbm/main/CraftingManager.java | 24 +- .../com/hbm/render/block/RenderBoxDuct.java | 41 ++- .../TileEntityMachinePlasmaHeater.java | 24 +- .../network/TileEntityRadioTorchBase.java | 10 + src/main/resources/assets/hbm/lang/de_DE.lang | 4 +- src/main/resources/assets/hbm/lang/en_US.lang | 4 +- .../hbm/textures/gui/fluids/ethanol.png | Bin 648 -> 538 bytes .../hbm/textures/gui/fluids/lubricant.png | Bin 340 -> 486 bytes .../gui/machine/gui_rtty_receiver.png | Bin 2960 -> 2824 bytes .../textures/gui/machine/gui_rtty_sender.png | Bin 2603 -> 2685 bytes 28 files changed, 436 insertions(+), 152 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorch.java diff --git a/src/main/java/com/hbm/blocks/network/FluidDuctBox.java b/src/main/java/com/hbm/blocks/network/FluidDuctBox.java index 9db59c67d..5bef3dd4d 100644 --- a/src/main/java/com/hbm/blocks/network/FluidDuctBox.java +++ b/src/main/java/com/hbm/blocks/network/FluidDuctBox.java @@ -31,13 +31,13 @@ import net.minecraftforge.common.util.ForgeDirection; public class FluidDuctBox extends FluidDuctBase implements IBlockMulti, ILookOverlay { - @SideOnly(Side.CLIENT) protected IIcon[] iconStraight; - @SideOnly(Side.CLIENT) protected IIcon[] iconEnd; - @SideOnly(Side.CLIENT) protected IIcon[] iconCurveTL; - @SideOnly(Side.CLIENT) protected IIcon[] iconCurveTR; - @SideOnly(Side.CLIENT) protected IIcon[] iconCurveBL; - @SideOnly(Side.CLIENT) protected IIcon[] iconCurveBR; - @SideOnly(Side.CLIENT) protected IIcon[] iconJunction; + @SideOnly(Side.CLIENT) public IIcon[] iconStraight; + @SideOnly(Side.CLIENT) public IIcon[] iconEnd; + @SideOnly(Side.CLIENT) public IIcon[] iconCurveTL; + @SideOnly(Side.CLIENT) public IIcon[] iconCurveTR; + @SideOnly(Side.CLIENT) public IIcon[] iconCurveBL; + @SideOnly(Side.CLIENT) public IIcon[] iconCurveBR; + @SideOnly(Side.CLIENT) public IIcon[] iconJunction; private static final String[] materials = new String[] { "silver", "copper", "white" }; diff --git a/src/main/java/com/hbm/blocks/network/RadioTorchBase.java b/src/main/java/com/hbm/blocks/network/RadioTorchBase.java index 1f0f44b43..325990efa 100644 --- a/src/main/java/com/hbm/blocks/network/RadioTorchBase.java +++ b/src/main/java/com/hbm/blocks/network/RadioTorchBase.java @@ -1,14 +1,22 @@ package com.hbm.blocks.network; +import com.hbm.inventory.gui.GUIScreenRadioTorch; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.network.TileEntityRadioTorchBase; + import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.tileentity.TileEntity; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -public abstract class RadioTorchBase extends BlockContainer { +public abstract class RadioTorchBase extends BlockContainer implements IGUIProvider { public RadioTorchBase() { super(Material.circuits); @@ -41,4 +49,17 @@ public abstract class RadioTorchBase extends BlockContainer { public int onBlockPlaced(World world, int x, int y, int z, int side, float fX, float fY, float fZ, int meta) { return side; } + + @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return null; } + + @Override + @SideOnly(Side.CLIENT) + public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + TileEntity te = world.getTileEntity(x, y, z); + + if(te instanceof TileEntityRadioTorchBase) + return new GUIScreenRadioTorch((TileEntityRadioTorchBase) te); + + return null; + } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIAnvil.java b/src/main/java/com/hbm/inventory/gui/GUIAnvil.java index 1003ec2a3..35eb676a1 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIAnvil.java +++ b/src/main/java/com/hbm/inventory/gui/GUIAnvil.java @@ -373,4 +373,9 @@ public class GUIAnvil extends GuiContainer { super.keyTyped(c, key); } } + + @Override + public void onGuiClosed() { + Keyboard.enableRepeatEvents(false); + } } diff --git a/src/main/java/com/hbm/inventory/gui/GUICoreEmitter.java b/src/main/java/com/hbm/inventory/gui/GUICoreEmitter.java index 26ad8879d..1fe07a89f 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICoreEmitter.java +++ b/src/main/java/com/hbm/inventory/gui/GUICoreEmitter.java @@ -116,4 +116,9 @@ public class GUICoreEmitter extends GuiInfoContainer { super.keyTyped(p_73869_1_, p_73869_2_); } } + + @Override + public void onGuiClosed() { + Keyboard.enableRepeatEvents(false); + } } diff --git a/src/main/java/com/hbm/inventory/gui/GUICoreStabilizer.java b/src/main/java/com/hbm/inventory/gui/GUICoreStabilizer.java index 36cff060a..99c6fb2be 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICoreStabilizer.java +++ b/src/main/java/com/hbm/inventory/gui/GUICoreStabilizer.java @@ -99,4 +99,9 @@ public class GUICoreStabilizer extends GuiInfoContainer { super.keyTyped(p_73869_1_, p_73869_2_); } } + + @Override + public void onGuiClosed() { + Keyboard.enableRepeatEvents(false); + } } diff --git a/src/main/java/com/hbm/inventory/gui/GUINukeFstbmb.java b/src/main/java/com/hbm/inventory/gui/GUINukeFstbmb.java index 661f5681d..b03155b93 100644 --- a/src/main/java/com/hbm/inventory/gui/GUINukeFstbmb.java +++ b/src/main/java/com/hbm/inventory/gui/GUINukeFstbmb.java @@ -114,4 +114,9 @@ public class GUINukeFstbmb extends GuiInfoContainer { super.keyTyped(p_73869_1_, p_73869_2_); } } + + @Override + public void onGuiClosed() { + Keyboard.enableRepeatEvents(false); + } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIRBMKConsole.java b/src/main/java/com/hbm/inventory/gui/GUIRBMKConsole.java index bd2599747..8d9bda1d3 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIRBMKConsole.java +++ b/src/main/java/com/hbm/inventory/gui/GUIRBMKConsole.java @@ -376,4 +376,9 @@ public class GUIRBMKConsole extends GuiScreen { public boolean doesGuiPauseGame() { return false; } + + @Override + public void onGuiClosed() { + Keyboard.enableRepeatEvents(false); + } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIRBMKControlAuto.java b/src/main/java/com/hbm/inventory/gui/GUIRBMKControlAuto.java index 18ae397b9..13ce7330f 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIRBMKControlAuto.java +++ b/src/main/java/com/hbm/inventory/gui/GUIRBMKControlAuto.java @@ -170,4 +170,9 @@ public class GUIRBMKControlAuto extends GuiInfoContainer { super.keyTyped(c, i); } + + @Override + public void onGuiClosed() { + Keyboard.enableRepeatEvents(false); + } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIRadioRec.java b/src/main/java/com/hbm/inventory/gui/GUIRadioRec.java index 5d0203496..36e70e844 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIRadioRec.java +++ b/src/main/java/com/hbm/inventory/gui/GUIRadioRec.java @@ -222,4 +222,9 @@ public class GUIRadioRec extends GuiInfoContainer { } } } + + @Override + public void onGuiClosed() { + Keyboard.enableRepeatEvents(false); + } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIReactorControl.java b/src/main/java/com/hbm/inventory/gui/GUIReactorControl.java index e39421f65..b141317da 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIReactorControl.java +++ b/src/main/java/com/hbm/inventory/gui/GUIReactorControl.java @@ -175,4 +175,9 @@ public class GUIReactorControl extends GuiInfoContainer { super.keyTyped(c, i); } + + @Override + public void onGuiClosed() { + Keyboard.enableRepeatEvents(false); + } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIReactorResearch.java b/src/main/java/com/hbm/inventory/gui/GUIReactorResearch.java index 50e8c8229..e02d155a5 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIReactorResearch.java +++ b/src/main/java/com/hbm/inventory/gui/GUIReactorResearch.java @@ -166,4 +166,9 @@ public class GUIReactorResearch extends GuiInfoContainer { super.keyTyped(c, i); } + + @Override + public void onGuiClosed() { + Keyboard.enableRepeatEvents(false); + } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenFluid.java b/src/main/java/com/hbm/inventory/gui/GUIScreenFluid.java index 0d0ab2722..24a00b973 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenFluid.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenFluid.java @@ -180,4 +180,9 @@ public class GUIScreenFluid extends GuiScreen { } } } + + @Override + public void onGuiClosed() { + Keyboard.enableRepeatEvents(false); + } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorch.java b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorch.java new file mode 100644 index 000000000..422ebe9f3 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorch.java @@ -0,0 +1,134 @@ +package com.hbm.inventory.gui; + +import org.lwjgl.input.Keyboard; +import org.lwjgl.opengl.GL11; + +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.network.TileEntityRadioTorchBase; +import com.hbm.tileentity.network.TileEntityRadioTorchSender; +import com.hbm.util.I18nUtil; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.gui.GuiTextField; +import net.minecraft.util.ResourceLocation; + +public class GUIScreenRadioTorch extends GuiScreen { + + protected ResourceLocation texture; + protected static final ResourceLocation textureSender = new ResourceLocation(RefStrings.MODID + ":textures/gui/machine/gui_rtty_sender.png"); + protected static final ResourceLocation textureReceiver = new ResourceLocation(RefStrings.MODID + ":textures/gui/machine/gui_rtty_receiver.png"); + protected TileEntityRadioTorchBase radio; + protected String title = ""; + protected int xSize = 256; + protected int ySize = 204; + protected int guiLeft; + protected int guiTop; + protected GuiTextField frequency; + protected GuiTextField[] remap; + + public GUIScreenRadioTorch(TileEntityRadioTorchBase radio) { + this.radio = radio; + + if(radio instanceof TileEntityRadioTorchSender) { + this.texture = textureSender; + this.title = "container.rttySender"; + } else { + this.texture = textureReceiver; + this.title = "container.rttyReceiver"; + } + } + + @Override + public void initGui() { + super.initGui(); + this.guiLeft = (this.width - this.xSize) / 2; + this.guiTop = (this.height - this.ySize) / 2; + + Keyboard.enableRepeatEvents(true); + + int oX = 2; + int oY = 2; + int in = radio instanceof TileEntityRadioTorchSender ? 18 : 0; + + this.frequency = new GuiTextField(this.fontRendererObj, guiLeft + 25 + oX, guiTop + 17 + oY, 90, 14); + this.frequency.setTextColor(0x00ff00); + this.frequency.setDisabledTextColour(0x00ff00); + this.frequency.setEnableBackgroundDrawing(false); + this.frequency.setMaxStringLength(25); + this.frequency.setText(radio.channel == null ? "" : radio.channel); + + this.remap = new GuiTextField[16]; + + for(int i = 0; i < 16; i++) { + this.remap[i] = new GuiTextField(this.fontRendererObj, guiLeft + 7 + (130 * (i / 8)) + oX + in, guiTop + 53 + (18 * (i % 8)) + oY, 50, 14); + this.remap[i].setTextColor(0x00ff00); + this.remap[i].setDisabledTextColour(0x00ff00); + this.remap[i].setEnableBackgroundDrawing(false); + this.remap[i].setMaxStringLength(25); + this.remap[i].setText(radio.mapping[i] == null ? "" : radio.mapping[i]); + } + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + this.drawDefaultBackground(); + this.drawGuiContainerBackgroundLayer(f, mouseX, mouseY); + GL11.glDisable(GL11.GL_LIGHTING); + this.drawGuiContainerForegroundLayer(mouseX, mouseY); + GL11.glEnable(GL11.GL_LIGHTING); + } + + + private void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { + String name = I18nUtil.resolveKey(this.title); + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); + } + + + private void drawGuiContainerBackgroundLayer(float f, int mouseX, int mouseY) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + + if(radio.customMap) { + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + for(int j = 0; j < 16; j++) { + this.remap[j].drawTextBox(); + } + } else { + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, 35); + drawTexturedModalRect(guiLeft, guiTop + 35, 0, 197, xSize, 7); + } + + this.frequency.drawTextBox(); + } + + @Override + protected void mouseClicked(int x, int y, int i) { + super.mouseClicked(x, y, i); + + this.frequency.mouseClicked(x, y, i); + + if(radio.customMap) { + for(int j = 0; j < 16; j++) this.remap[j].mouseClicked(x, y, i); + } + } + + @Override + protected void keyTyped(char c, int i) { + + if(this.frequency.textboxKeyTyped(c, i)) + return; + + if(radio.customMap) { + for(int j = 0; j < 16; j++) if(this.remap[j].textboxKeyTyped(c, i)) return; + } + + super.keyTyped(c, i); + } + + @Override + public void onGuiClosed() { + Keyboard.enableRepeatEvents(false); + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenSatCoord.java b/src/main/java/com/hbm/inventory/gui/GUIScreenSatCoord.java index 1fc68ab2a..af560d0d9 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenSatCoord.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenSatCoord.java @@ -20,113 +20,105 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; public class GUIScreenSatCoord extends GuiScreen { - - protected static final ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/satellites/gui_sat_coord.png"); - protected int xSize = 176; - protected int ySize = 126; - protected int guiLeft; - protected int guiTop; - private final EntityPlayer player; - private GuiTextField xField; - private GuiTextField yField; - private GuiTextField zField; - - public GUIScreenSatCoord(EntityPlayer player) { - - this.player = player; - } - - public void initGui() - { - super.initGui(); - this.guiLeft = (this.width - this.xSize) / 2; - this.guiTop = (this.height - this.ySize) / 2; + protected static final ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/satellites/gui_sat_coord.png"); + protected int xSize = 176; + protected int ySize = 126; + protected int guiLeft; + protected int guiTop; + private final EntityPlayer player; - Keyboard.enableRepeatEvents(true); - this.xField = new GuiTextField(this.fontRendererObj, guiLeft + 66, guiTop + 21, 48, 12); - this.xField.setTextColor(-1); - this.xField.setDisabledTextColour(-1); - this.xField.setEnableBackgroundDrawing(false); - this.xField.setMaxStringLength(7); - this.yField = new GuiTextField(this.fontRendererObj, guiLeft + 66, guiTop + 56, 48, 12); - this.yField.setTextColor(-1); - this.yField.setDisabledTextColour(-1); - this.yField.setEnableBackgroundDrawing(false); - this.yField.setMaxStringLength(7); - this.zField = new GuiTextField(this.fontRendererObj, guiLeft + 66, guiTop + 92, 48, 12); - this.zField.setTextColor(-1); - this.zField.setDisabledTextColour(-1); - this.zField.setEnableBackgroundDrawing(false); - this.zField.setMaxStringLength(7); - } - - protected void mouseClicked(int i, int j, int k) - { - super.mouseClicked(i, j, k); - - if(ItemSatInterface.currentSat == null) - return; - - this.xField.mouseClicked(i, j, k); - if(ItemSatInterface.currentSat.coordAcs.contains(CoordActions.HAS_Y)) this.yField.mouseClicked(i, j, k); - this.zField.mouseClicked(i, j, k); + private GuiTextField xField; + private GuiTextField yField; + private GuiTextField zField; - if(i >= this.guiLeft + 133 && i < this.guiLeft + 133 + 18 && j >= this.guiTop + 52 && j < this.guiTop + 52 + 18 && player != null) { - - if(NumberUtils.isNumber(xField.getText()) && NumberUtils.isNumber(zField.getText())) { + public GUIScreenSatCoord(EntityPlayer player) { + + this.player = player; + } + + public void initGui() { + super.initGui(); + this.guiLeft = (this.width - this.xSize) / 2; + this.guiTop = (this.height - this.ySize) / 2; + + Keyboard.enableRepeatEvents(true); + this.xField = new GuiTextField(this.fontRendererObj, guiLeft + 66, guiTop + 21, 48, 12); + this.xField.setTextColor(-1); + this.xField.setDisabledTextColour(-1); + this.xField.setEnableBackgroundDrawing(false); + this.xField.setMaxStringLength(7); + this.yField = new GuiTextField(this.fontRendererObj, guiLeft + 66, guiTop + 56, 48, 12); + this.yField.setTextColor(-1); + this.yField.setDisabledTextColour(-1); + this.yField.setEnableBackgroundDrawing(false); + this.yField.setMaxStringLength(7); + this.zField = new GuiTextField(this.fontRendererObj, guiLeft + 66, guiTop + 92, 48, 12); + this.zField.setTextColor(-1); + this.zField.setDisabledTextColour(-1); + this.zField.setEnableBackgroundDrawing(false); + this.zField.setMaxStringLength(7); + } + + protected void mouseClicked(int i, int j, int k) { + super.mouseClicked(i, j, k); + + if(ItemSatInterface.currentSat == null) + return; + + this.xField.mouseClicked(i, j, k); + if(ItemSatInterface.currentSat.coordAcs.contains(CoordActions.HAS_Y)) + this.yField.mouseClicked(i, j, k); + this.zField.mouseClicked(i, j, k); + + if(i >= this.guiLeft + 133 && i < this.guiLeft + 133 + 18 && j >= this.guiTop + 52 && j < this.guiTop + 52 + 18 && player != null) { + + if(NumberUtils.isNumber(xField.getText()) && NumberUtils.isNumber(zField.getText())) { + + if(ItemSatInterface.currentSat.coordAcs.contains(CoordActions.HAS_Y)) { + + if(NumberUtils.isNumber(yField.getText())) { + + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("hbm:item.techBleep"), 1.0F)); + PacketDispatcher.wrapper.sendToServer(new SatCoordPacket((int) Double.parseDouble(xField.getText()), (int) Double.parseDouble(yField.getText()), + (int) Double.parseDouble(zField.getText()), ISatChip.getFreqS(player.getHeldItem()))); + + this.mc.thePlayer.closeScreen(); + } + + } else { + + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("hbm:item.techBleep"), 1.0F)); + PacketDispatcher.wrapper + .sendToServer(new SatCoordPacket((int) Double.parseDouble(xField.getText()), 0, (int) Double.parseDouble(zField.getText()), ISatChip.getFreqS(player.getHeldItem()))); + + this.mc.thePlayer.closeScreen(); + } + } + } + } + + public void drawScreen(int mouseX, int mouseY, float f) { + + this.drawDefaultBackground(); + this.drawGuiContainerBackgroundLayer(f, mouseX, mouseY); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_LIGHTING); + this.drawGuiContainerForegroundLayer(mouseX, mouseY); + GL11.glEnable(GL11.GL_LIGHTING); + } - if(ItemSatInterface.currentSat.coordAcs.contains(CoordActions.HAS_Y)) { - - if(NumberUtils.isNumber(yField.getText())) { - - mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("hbm:item.techBleep"), 1.0F)); - PacketDispatcher.wrapper.sendToServer( - new SatCoordPacket( - (int)Double.parseDouble(xField.getText()), - (int)Double.parseDouble(yField.getText()), - (int)Double.parseDouble(zField.getText()), - ISatChip.getFreqS(player.getHeldItem()))); - - this.mc.thePlayer.closeScreen(); - } - - } else { - - mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("hbm:item.techBleep"), 1.0F)); - PacketDispatcher.wrapper.sendToServer( - new SatCoordPacket( - (int)Double.parseDouble(xField.getText()), - 0, - (int)Double.parseDouble(zField.getText()), - ISatChip.getFreqS(player.getHeldItem()))); - - this.mc.thePlayer.closeScreen(); - } - } - } - } - - public void drawScreen(int mouseX, int mouseY, float f) { - - this.drawDefaultBackground(); - this.drawGuiContainerBackgroundLayer(f, mouseX, mouseY); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glDisable(GL11.GL_LIGHTING); - this.drawGuiContainerForegroundLayer(mouseX, mouseY); - GL11.glEnable(GL11.GL_LIGHTING); - } - @Override public boolean doesGuiPauseGame() { return false; } - + protected void drawGuiContainerForegroundLayer(int i, int j) { - this.xField.drawTextBox(); - if(ItemSatInterface.currentSat != null && ItemSatInterface.currentSat.coordAcs.contains(CoordActions.HAS_Y)) this.yField.drawTextBox(); - this.zField.drawTextBox(); + this.xField.drawTextBox(); + if(ItemSatInterface.currentSat != null && ItemSatInterface.currentSat.coordAcs.contains(CoordActions.HAS_Y)) + this.yField.drawTextBox(); + this.zField.drawTextBox(); } protected void drawGuiContainerBackgroundLayer(float f, int i, int j) { @@ -142,37 +134,40 @@ public class GUIScreenSatCoord extends GuiScreen { if(zField.isFocused()) drawTexturedModalRect(guiLeft + 61, guiTop + 88, 0, 126, 54, 18); - + if(ItemSatInterface.currentSat != null) { - + if(!ItemSatInterface.currentSat.coordAcs.contains(CoordActions.HAS_Y)) drawTexturedModalRect(guiLeft + 61, guiTop + 52, 0, 144, 54, 18); - + drawTexturedModalRect(guiLeft + 120, guiTop + 17, 194, 0, 7, 7); - + if(ItemSatInterface.currentSat.satIface == Interfaces.SAT_COORD) { - + drawTexturedModalRect(guiLeft + 120, guiTop + 25, 194, 0, 7, 7); } } } - - protected void keyTyped(char p_73869_1_, int p_73869_2_) { - - if (this.xField.textboxKeyTyped(p_73869_1_, p_73869_2_)) { - } else if (ItemSatInterface.currentSat != null && ItemSatInterface.currentSat.coordAcs.contains(CoordActions.HAS_Y) && this.yField.textboxKeyTyped(p_73869_1_, p_73869_2_)) { - } else if (this.zField.textboxKeyTyped(p_73869_1_, p_73869_2_)) { - } else { - - super.keyTyped(p_73869_1_, p_73869_2_); - } - - if (p_73869_2_ == 1 || p_73869_2_ == this.mc.gameSettings.keyBindInventory.getKeyCode()) - { - this.mc.thePlayer.closeScreen(); - } - - } + protected void keyTyped(char p_73869_1_, int p_73869_2_) { + + if(this.xField.textboxKeyTyped(p_73869_1_, p_73869_2_)) { + } else if(ItemSatInterface.currentSat != null && ItemSatInterface.currentSat.coordAcs.contains(CoordActions.HAS_Y) && this.yField.textboxKeyTyped(p_73869_1_, p_73869_2_)) { + } else if(this.zField.textboxKeyTyped(p_73869_1_, p_73869_2_)) { + } else { + + super.keyTyped(p_73869_1_, p_73869_2_); + } + + if(p_73869_2_ == 1 || p_73869_2_ == this.mc.gameSettings.keyBindInventory.getKeyCode()) { + this.mc.thePlayer.closeScreen(); + } + + } + + @Override + public void onGuiClosed() { + Keyboard.enableRepeatEvents(false); + } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java b/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java index b83b18a14..3ed299faa 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java @@ -353,4 +353,9 @@ public class GUIScreenTemplateFolder extends GuiScreen { } } } + + @Override + public void onGuiClosed() { + Keyboard.enableRepeatEvents(false); + } } diff --git a/src/main/java/com/hbm/inventory/gui/GUITurretBase.java b/src/main/java/com/hbm/inventory/gui/GUITurretBase.java index 07dac0c1d..c54616f12 100644 --- a/src/main/java/com/hbm/inventory/gui/GUITurretBase.java +++ b/src/main/java/com/hbm/inventory/gui/GUITurretBase.java @@ -299,6 +299,11 @@ public abstract class GUITurretBase extends GuiInfoContainer { return names.size(); } + + @Override + public void onGuiClosed() { + Keyboard.enableRepeatEvents(false); + } protected void keyTyped(char p_73869_1_, int p_73869_2_) { diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java index 5eb2a6cdb..8923bd65d 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -178,6 +178,15 @@ public class AnvilRecipes { constructionRecipes.add(new AnvilConstructionRecipe(new OreDictStack(TI.ingot(), 1), new AnvilOutput(new ItemStack(ModBlocks.deco_titanium))).setTier(1).setOverlay(OverlayType.CONSTRUCTION)); constructionRecipes.add(new AnvilConstructionRecipe(new OreDictStack(W.ingot(), 1), new AnvilOutput(new ItemStack(ModBlocks.deco_tungsten))).setTier(1).setOverlay(OverlayType.CONSTRUCTION)); + for(int i = 0; i < 15; i += 3) { + constructionRecipes.add(new AnvilConstructionRecipe(new OreDictStack(IRON.plate(), 1), new AnvilOutput(new ItemStack(ModBlocks.fluid_duct_box, 1, i))).setTier(2).setOverlay(OverlayType.CONSTRUCTION)); + constructionRecipes.add(new AnvilConstructionRecipe(new OreDictStack(CU.plate(), 1), new AnvilOutput(new ItemStack(ModBlocks.fluid_duct_box, 1, i + 1))).setTier(2).setOverlay(OverlayType.CONSTRUCTION)); + constructionRecipes.add(new AnvilConstructionRecipe(new OreDictStack(AL.plate(), 1), new AnvilOutput(new ItemStack(ModBlocks.fluid_duct_box, 1, i + 2))).setTier(2).setOverlay(OverlayType.CONSTRUCTION)); + constructionRecipes.add(new AnvilConstructionRecipe(new ComparableStack(ModBlocks.fluid_duct_box, 1, i), new AnvilOutput(new ItemStack(ModItems.plate_iron))).setTier(2).setOverlay(OverlayType.RECYCLING)); + constructionRecipes.add(new AnvilConstructionRecipe(new ComparableStack(ModBlocks.fluid_duct_box, 1, i + 1), new AnvilOutput(new ItemStack(ModItems.plate_copper))).setTier(2).setOverlay(OverlayType.RECYCLING)); + constructionRecipes.add(new AnvilConstructionRecipe(new ComparableStack(ModBlocks.fluid_duct_box, 1, i + 2), new AnvilOutput(new ItemStack(ModItems.plate_aluminium))).setTier(2).setOverlay(OverlayType.RECYCLING)); + } + constructionRecipes.add(new AnvilConstructionRecipe( new AStack[] {new OreDictStack(DNT.ingot(), 4), new ComparableStack(ModBlocks.depth_brick)}, new AnvilOutput(new ItemStack(ModBlocks.depth_dnt))).setTier(1916169)); diff --git a/src/main/java/com/hbm/items/machine/ItemFluidDuct.java b/src/main/java/com/hbm/items/machine/ItemFluidDuct.java index f2f3aa457..d9a704514 100644 --- a/src/main/java/com/hbm/items/machine/ItemFluidDuct.java +++ b/src/main/java/com/hbm/items/machine/ItemFluidDuct.java @@ -5,7 +5,7 @@ import java.util.List; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; -import com.hbm.tileentity.conductor.TileEntityFluidDuct; +import com.hbm.tileentity.conductor.TileEntityFluidDuctSimple; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -120,10 +120,10 @@ public class ItemFluidDuct extends Item { return false; } else { --stack.stackSize; - world.setBlock(x, y, z, ModBlocks.fluid_duct); + world.setBlock(x, y, z, ModBlocks.fluid_duct_neo); - if(world.getTileEntity(x, y, z) instanceof TileEntityFluidDuct) { - ((TileEntityFluidDuct) world.getTileEntity(x, y, z)).setType(Fluids.fromID(stack.getItemDamage())); + if(world.getTileEntity(x, y, z) instanceof TileEntityFluidDuctSimple) { + ((TileEntityFluidDuctSimple) world.getTileEntity(x, y, z)).setType(Fluids.fromID(stack.getItemDamage())); } world.playSoundEffect(x, y, z, "hbm:block.pipePlaced", 1.0F, 0.65F + world.rand.nextFloat() * 0.2F); diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index abbf505aa..2f93f4c02 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -598,7 +598,11 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.crystal_virus, 1), new Object[] { "STS", "THT", "STS", 'S', ModItems.particle_strange, 'T', W.dust(), 'H', ModItems.crystal_horn }); addRecipeAuto(new ItemStack(ModBlocks.crystal_pulsar, 32), new Object[] { "STS", "THT", "STS", 'S', ModItems.cell_uf6, 'T', AL.dust(), 'H', ModItems.crystal_charred }); - addRecipeAuto(new ItemStack(ModBlocks.fluid_duct, 8), new Object[] { "SAS", " ", "SAS", 'S', STEEL.plate(), 'A', AL.plate() }); + addRecipeAuto(new ItemStack(ModBlocks.fluid_duct_neo, 8, 0), new Object[] { "SAS", " ", "SAS", 'S', STEEL.plate(), 'A', AL.plate() }); + addRecipeAuto(new ItemStack(ModBlocks.fluid_duct_neo, 8, 1), new Object[] { "IAI", " ", "IAI", 'I', IRON.plate(), 'A', AL.plate() }); + addRecipeAuto(new ItemStack(ModBlocks.fluid_duct_neo, 8, 2), new Object[] { "ASA", " ", "ASA", 'S', STEEL.plate(), 'A', AL.plate() }); + addRecipeAuto(new ItemStack(ModBlocks.fluid_duct, 8), new Object[] { "SAS", " D ", "SAS", 'S', STEEL.plate(), 'A', AL.plate(), 'D', ModItems.ducttape }); + addShapelessAuto(new ItemStack(ModBlocks.fluid_duct_neo, 1, 0), new Object[] { ModBlocks.fluid_duct }); addRecipeAuto(new ItemStack(ModBlocks.fluid_duct_solid, 8), new Object[] { "SAS", "A A", "SAS", 'S', STEEL.ingot(), 'A', AL.plate() }); addRecipeAuto(new ItemStack(ModItems.template_folder, 1), new Object[] { "LPL", "BPB", "LPL", 'P', Items.paper, 'L', "dye", 'B', "dye" }); addRecipeAuto(new ItemStack(ModItems.pellet_antimatter, 1), new Object[] { "###", "###", "###", '#', ModItems.cell_antimatter }); @@ -686,20 +690,20 @@ public class CraftingManager { addShapelessAuto(new ItemStack(Items.slime_ball, 16), new Object[] { new ItemStack(Items.dye, 1, 15), new ItemStack(Items.dye, 1, 15), new ItemStack(Items.dye, 1, 15), new ItemStack(Items.dye, 1, 15), Fluids.SULFURIC_ACID.getDict(1000) }); for(int i = 1; i < Fluids.getAll().length; ++i) { - addShapelessAuto(new ItemStack(ModItems.fluid_duct, 1, i), new Object[] { new ItemStack(ModBlocks.fluid_duct, 1), new ItemStack(ModItems.fluid_identifier, 1, i) }); + addShapelessAuto(new ItemStack(ModItems.fluid_duct, 1, i), new Object[] { new ItemStack(ModBlocks.fluid_duct_neo, 1), new ItemStack(ModItems.fluid_identifier, 1, i) }); - addShapelessAuto(new ItemStack(ModItems.fluid_duct, 8, i), new Object[] { new ItemStack(ModBlocks.fluid_duct, 8), new ItemStack(ModBlocks.fluid_duct, 8), - new ItemStack(ModBlocks.fluid_duct, 8), new ItemStack(ModBlocks.fluid_duct, 8), new ItemStack(ModBlocks.fluid_duct, 8), - new ItemStack(ModBlocks.fluid_duct, 8), new ItemStack(ModBlocks.fluid_duct, 8), new ItemStack(ModBlocks.fluid_duct, 8), new ItemStack(ModItems.fluid_identifier, 1, i) }); + addShapelessAuto(new ItemStack(ModItems.fluid_duct, 8, i), new Object[] { new ItemStack(ModBlocks.fluid_duct_neo, 1), new ItemStack(ModBlocks.fluid_duct_neo, 1), + new ItemStack(ModBlocks.fluid_duct_neo, 1), new ItemStack(ModBlocks.fluid_duct_neo, 1), new ItemStack(ModBlocks.fluid_duct_neo, 1), + new ItemStack(ModBlocks.fluid_duct_neo, 1), new ItemStack(ModBlocks.fluid_duct_neo, 1), new ItemStack(ModBlocks.fluid_duct_neo, 1), new ItemStack(ModItems.fluid_identifier, 1, i) }); addShapelessAuto(new ItemStack(ModItems.fluid_duct, 1, i), new Object[] { new ItemStack(ModItems.fluid_duct, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.fluid_identifier, 1, i) }); - addShapelessAuto(new ItemStack(ModItems.fluid_duct, 8, i), new Object[] { new ItemStack(ModItems.fluid_duct, 8, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.fluid_duct, 8, OreDictionary.WILDCARD_VALUE), - new ItemStack(ModItems.fluid_duct, 8, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.fluid_duct, 8, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.fluid_duct, 8, OreDictionary.WILDCARD_VALUE), - new ItemStack(ModItems.fluid_duct, 8, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.fluid_duct, 8, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.fluid_duct, 8, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.fluid_identifier, 1, i) }); + addShapelessAuto(new ItemStack(ModItems.fluid_duct, 8, i), new Object[] { new ItemStack(ModItems.fluid_duct, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.fluid_duct, 1, OreDictionary.WILDCARD_VALUE), + new ItemStack(ModItems.fluid_duct, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.fluid_duct, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.fluid_duct, 1, OreDictionary.WILDCARD_VALUE), + new ItemStack(ModItems.fluid_duct, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.fluid_duct, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.fluid_duct, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.fluid_identifier, 1, i) }); } - addShapelessAuto(new ItemStack(ModBlocks.fluid_duct, 1), new Object[] { new ItemStack(ModItems.fluid_duct, 1, OreDictionary.WILDCARD_VALUE) }); + addShapelessAuto(new ItemStack(ModBlocks.fluid_duct_neo, 1), new Object[] { new ItemStack(ModItems.fluid_duct, 1, OreDictionary.WILDCARD_VALUE) }); addShapelessAuto(new ItemStack(ModItems.redstone_depleted, 1), new Object[] { new ItemStack(ModItems.battery_su, 1, OreDictionary.WILDCARD_VALUE) }); addShapelessAuto(new ItemStack(ModItems.redstone_depleted, 2), new Object[] { new ItemStack(ModItems.battery_su_l, 1, OreDictionary.WILDCARD_VALUE) }); @@ -712,7 +716,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.machine_missile_assembly, 1), new Object[] { "PWP", "SSS", "CCC", 'P', ModItems.pedestal_steel, 'W', ModItems.wrench, 'S', STEEL.plate(), 'C', ModBlocks.steel_scaffold }); addRecipeAuto(new ItemStack(ModBlocks.struct_launcher, 4), new Object[] { "PPP", "SDS", "CCC", 'P', STEEL.plate(), 'S', ModBlocks.steel_scaffold, 'D', ModBlocks.deco_pipe_quad, 'C', ModBlocks.concrete_smooth }); addRecipeAuto(new ItemStack(ModBlocks.struct_launcher, 4), new Object[] { "PPP", "SDS", "CCC", 'P', STEEL.plate(), 'S', ModBlocks.steel_scaffold, 'D', ModBlocks.deco_pipe_quad, 'C', ModBlocks.concrete }); - addRecipeAuto(new ItemStack(ModBlocks.struct_scaffold, 4), new Object[] { "SSS", "DCD", "SSS", 'S', ModBlocks.steel_scaffold, 'D', ModBlocks.fluid_duct, 'C', ModBlocks.red_cable }); + addRecipeAuto(new ItemStack(ModBlocks.struct_scaffold, 4), new Object[] { "SSS", "DCD", "SSS", 'S', ModBlocks.steel_scaffold, 'D', new ItemStack(ModBlocks.fluid_duct_neo, 1, OreDictionary.WILDCARD_VALUE), 'C', ModBlocks.red_cable }); addRecipeAuto(new ItemStack(ModItems.seg_10, 1), new Object[] { "P", "S", "B", 'P', AL.plate(), 'S', ModBlocks.steel_scaffold, 'B', ModBlocks.steel_beam }); addRecipeAuto(new ItemStack(ModItems.seg_15, 1), new Object[] { "PP", "SS", "BB", 'P', TI.plate(), 'S', ModBlocks.steel_scaffold, 'B', ModBlocks.steel_beam }); diff --git a/src/main/java/com/hbm/render/block/RenderBoxDuct.java b/src/main/java/com/hbm/render/block/RenderBoxDuct.java index 33f8f5f52..0fa600fc9 100644 --- a/src/main/java/com/hbm/render/block/RenderBoxDuct.java +++ b/src/main/java/com/hbm/render/block/RenderBoxDuct.java @@ -1,5 +1,7 @@ package com.hbm.render.block; +import org.lwjgl.opengl.GL11; + import com.hbm.blocks.network.FluidDuctBox; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; @@ -16,7 +18,42 @@ import net.minecraft.world.IBlockAccess; public class RenderBoxDuct implements ISimpleBlockRenderingHandler { @Override - public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { } + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + + Tessellator tessellator = Tessellator.instance; + FluidDuctBox duct = (FluidDuctBox) block; + int type = metadata % 3; + + float lower = 0.125F; + float upper = 0.875F; + + for(int i = 2; i < 13; i += 3) { + + if(metadata > i) { + lower += 0.0625F; + upper -= 0.0625F; + } + } + + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + + renderer.setRenderBounds(lower, lower, 0.0F, upper, upper, 1.0F); + + renderer.uvRotateNorth = 1; + renderer.uvRotateSouth = 2; + + tessellator.startDrawingQuads(); + tessellator.setNormal(0F, 1F, 0F); renderer.renderFaceYPos(block, 0, 0, 0, duct.iconStraight[type]); + tessellator.setNormal(0F, -1F, 0F); renderer.renderFaceYNeg(block, 0, 0, 0, duct.iconStraight[type]); + tessellator.setNormal(1F, 0F, 0F); renderer.renderFaceXPos(block, 0, 0, 0, duct.iconStraight[type]); + tessellator.setNormal(-1F, 0F, 0F); renderer.renderFaceXNeg(block, 0, 0, 0, duct.iconStraight[type]); + tessellator.setNormal(0F, 0F, 1F); renderer.renderFaceZPos(block, 0, 0, 0, duct.iconEnd[type]); + tessellator.setNormal(0F, 0F, -1F); renderer.renderFaceZNeg(block, 0, 0, 0, duct.iconEnd[type]); + tessellator.draw(); + + renderer.uvRotateNorth = 0; + renderer.uvRotateSouth = 0; + } @Override public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { @@ -173,7 +210,7 @@ public class RenderBoxDuct implements ISimpleBlockRenderingHandler { @Override public boolean shouldRender3DInInventory(int modelId) { - return false; + return true; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePlasmaHeater.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePlasmaHeater.java index ad902ff80..bc8d7253f 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePlasmaHeater.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePlasmaHeater.java @@ -14,6 +14,7 @@ import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityMachineBase; import api.hbm.energy.IEnergyUser; +import api.hbm.fluid.IFluidStandardReceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; @@ -21,7 +22,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachinePlasmaHeater extends TileEntityMachineBase implements IFluidAcceptor, IEnergyUser { +public class TileEntityMachinePlasmaHeater extends TileEntityMachineBase implements IFluidAcceptor, IEnergyUser, IFluidStandardReceiver { public long power; public static final long maxPower = 100000000; @@ -47,7 +48,8 @@ public class TileEntityMachinePlasmaHeater extends TileEntityMachineBase impleme if(!worldObj.isRemote) { - this.updateConnections(); + if(this.worldObj.getTotalWorldTime() % 20 == 0) + this.updateConnections(); /// START Managing all the internal stuff /// power = Library.chargeTEFromItems(slots, 0, power, maxPower); @@ -135,6 +137,8 @@ public class TileEntityMachinePlasmaHeater extends TileEntityMachineBase impleme for(int i = 1; i < 4; i++) { for(int j = -1; j < 2; j++) { this.trySubscribe(worldObj, xCoord + side.offsetX * j + dir.offsetX * 2, yCoord + i, zCoord + side.offsetZ * j + dir.offsetZ * 2, j < 0 ? ForgeDirection.DOWN : ForgeDirection.UP); + this.trySubscribe(tanks[0].getTankType(), worldObj, xCoord + side.offsetX * j + dir.offsetX * 2, yCoord + i, zCoord + side.offsetZ * j + dir.offsetZ * 2, j < 0 ? ForgeDirection.DOWN : ForgeDirection.UP); + this.trySubscribe(tanks[1].getTankType(), worldObj, xCoord + side.offsetX * j + dir.offsetX * 2, yCoord + i, zCoord + side.offsetZ * j + dir.offsetZ * 2, j < 0 ? ForgeDirection.DOWN : ForgeDirection.UP); } } } @@ -145,9 +149,6 @@ public class TileEntityMachinePlasmaHeater extends TileEntityMachineBase impleme private void updateType() { - //if(plasma.getFill() > 0) - // return; - List types = new ArrayList() {{ add(tanks[0].getTankType()); add(tanks[1].getTankType()); }}; if(types.contains(Fluids.DEUTERIUM) && types.contains(Fluids.TRITIUM)) { @@ -276,8 +277,17 @@ public class TileEntityMachinePlasmaHeater extends TileEntityMachineBase impleme @Override @SideOnly(Side.CLIENT) - public double getMaxRenderDistanceSquared() - { + public double getMaxRenderDistanceSquared() { return 65536.0D; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] {tanks[0], tanks[1], plasma}; + } + + @Override + public FluidTank[] getReceivingTanks() { + return tanks; + } } diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchBase.java b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchBase.java index d57223822..52f9fb55d 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchBase.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchBase.java @@ -4,6 +4,16 @@ import net.minecraft.tileentity.TileEntity; public class TileEntityRadioTorchBase extends TileEntity { + /** channel we're broadcasting on/listening to */ public String channel = ""; + /** previous redstone state for input/output, needed for state change detection */ + protected int lastState = 0; + /** last update tick, needed for receivers listening for changes */ protected long lastUpdate; + /** switches state change mode to tick-based polling */ + public boolean polling = false; + /** switches redstone passthrough to custom signal mapping */ + public boolean customMap = false; + /** custom mapping */ + public String[] mapping = new String[16]; } diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index f0c5c8e9c..38fda0441 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -3487,7 +3487,9 @@ tile.fireworks.message=Nachricht: %s tile.fireworks.color=Farbe: %s tile.flame_war.name=Flamewar aus der Box tile.float_bomb.name=Schwebebombe -tile.fluid_duct.name=Universelles Flüssigkeitsrohr +tile.fluid_duct.name=Universelles Flüssigkeitsrohr (Veraltet) +tile.fluid_duct_box.name=Universelles Flüssigkeitsrohr (Boxrohr) +tile.fluid_duct_neo.name=Universelles Flüssigkeitsrohr tile.fluid_duct_solid.name=Geschirmtes universelles Flüssigkeitsrohr tile.foam_layer.name=Schaumdecke tile.foundry_basin.name=Gussbecken diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 3402548ba..140f3c526 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -4015,7 +4015,9 @@ tile.fireworks.message=Message: %s tile.fireworks.color=Color: %s tile.flame_war.name=Flame War in a Box tile.float_bomb.name=Levitation Bomb -tile.fluid_duct.name=Universal Fluid Duct +tile.fluid_duct.name=Universal Fluid Duct (Deprecated) +tile.fluid_duct_box.name=Universal Fluid Duct (Boxduct) +tile.fluid_duct_neo.name=Universal Fluid Duct tile.fluid_duct_solid.name=Coated Universal Fluid Duct tile.foam_layer.name=Foam layer tile.foundry_basin.name=Foundry Basin diff --git a/src/main/resources/assets/hbm/textures/gui/fluids/ethanol.png b/src/main/resources/assets/hbm/textures/gui/fluids/ethanol.png index 672e1b7976d73b951464e6b52034506d12e78d2e..8a72bc22d3b93ad473abb80c239c099165187318 100644 GIT binary patch delta 497 zcmVv1wgDus@WoManfs9nzN>`HvUTwZUt8vxEZthIztN@0w_ITvx7rfj!cj(JW2 zh;MIiuTo09_ed#GN};vJdyn@%KIWWz!l6bRV~|oZO%wAxV}GrU$x=$vG(`wOS(dT5 z>pHym3mJg5HWnCTXqpCVEsw_|vKeDgN^!g0BA(|N9r`oI#Pf2wFwZjpLI|Xk^nL%2 zH{&>>12cg49&0UHYl@;^9LK02&vV+gWtt|ObM$?`c+fNr<2W)+)6+w3+eWDXVN%EA z5h*2FYtH90x__=~UdobRUB~%+j$^Frnqe5C^Wi+5P8eg@Y&MIDo3i8zOw&Y~rW_6j zc16ME)9KI>K$0XVr5J{R`~6PSG|L|Fp9qXnO4fT4Obq60V+`K===$FY0cTl8k|cCp z2SAo(i@J4UU|w%rz}8y&zDG)l5Q2}7kHv$vv>fLw5YCI`W+%yp`|zv}6cKToG`s)~r9s+3Y#%rNH==TKF0O31o%-m?pVTdm}j zQ2sZi6mrfKz`SRf#L z-g7t{NMcj}?|D5Q@y@a2OkNg-VL)Tw6Ndp2`5>5QQqDM4#=hquLNnta zf;~PmU9ar7TYt*sLYZgOtCCW>3&a@F&4y;iX3Zs=@x2t%`#U!?B2ZFd=sMhGo>5g| zjMQ4Wro_w33$Mo`-FltLjOld300B};1XWsV=(yQn!1a2)Ut%0b`e9%XG@zKV-E078 zX5>;>&S!Qpq9td1*WHWMawY&)E8;x>@2&Cv^C$fBP9--`!P} zpvvze$cp^cIpXs(0M!gLqf-Uv(B0?H_z-w-juF_khIfu?MqUFn=O}<*MVkn@H9Vky z^!>fh2IRGksaF2F-6&m0DFp$(bR8(Q u2Qz~A9Gs)IhODpcMKIt3NUgm7_`!b~zC_oGEOGw;0000pp-&H@`3cNl)_qzQVQo>o_}oHw*UVDLI}BFjG=8? zLJ0ZxRM%RwEKAN~jM#+F7?am&nusyx!%8W(Z98zIlp=(HO*aD>g4P=69Q(fKCRJ6j zt}7yfh-4VHZCmzzM??;d)^*LJ0wkrnuFFJ!zh7+AH1vJX`~7Ad$Besa8oc)zN?M0u zz!*ba*FRaCrhj3cXG8>RE$8!@)9J)Gjt5AIAFVasd)9TOZCmX9ey5C52+cuuh=fM}rVE+K~zdQ?*w$b|l0000Rwt^GOU04E@A@euoSU3=BwjL!T+lyDW_e z*v8PG^E`h=1OOl+sH(p6o0RXYvwqe(GeRJAG}Zn&7$j*ZFxc00000NkvXXu0mjfNDqfY diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_rtty_receiver.png b/src/main/resources/assets/hbm/textures/gui/machine/gui_rtty_receiver.png index 50f0fb4e836a3e1c8ec23972417dd682c4c8cd39..e035367c12fbcb1dce65510c5c5ccdd239ecc8fa 100644 GIT binary patch literal 2824 zcmbW3dpMNa9>>@Fni*pv%($h&WGijCjLM~iDP(kW3AIs1x+n=z9GCIZ?lRc9wzcKf zP41jF5@MX)rh95~$t4O~DW;1dGYxwUN4xW!{XFM+&il`L-)H^awZ6aa@AF&F;y7)y zmm{f@0043hOj{QK5crA!A^{FwM+^4D0T;5t!IcP~DB|8T0FW9TY}dPnXN~sWI=k3j z{p3rV^%qb4fN_^S+Ho@xuk?$oaw)!KgAFJ37S8)5<@7>7^Fh4%sz~x8di~-ujrWA~ za^EBLLD}bf!j$h$Pt`sWfw+Ry@w!PAR&KH8(Sew$?uRWq zOWlRT*1M0js(10Ow#zV5$HvCWtUgCsbsVp|HDzA&AhSKC!p@z%e#BcD4Do2FhFI=bc#-+#r2mgO^MZi4qo zz1uP$=8ScY65gg!Ro%c=>y8z1`I|5j_qY5aO@jDH&6TOUCCG#QUARo#+CorUq=5O` z6$4F;Mxj=(%0BYzD=1T(Rja`>3%wij#X>%l9X2*Vbw>L4`=)<+`i63IS|>14KgS6H z(M68&!!O8*XGmbjqRWH1CBLPy`$^y1>nd~a=XURyxiGDjf3PG~tJhZxwBF!ShU}CX zVr45qd|xOv{o?NFYwR)4Lra2~Nm`ceqP#Z~DM1Fn(0#_sQt(M(XF|=kqv-j^!x6?Y zA)ky!VCuDLS)jT*KsV#(#z1DCGnJ-n}SYJ zrGNNmf6SLDQQJ?9hVtF@Yu5O5Ohk&!cll6deeVR*Ur(a_E1w80JtDovpYwM_o6$}= z^Cw}A!zY3>*fzW>HR*xZAyg*>_j5PjCR?ky$y`X4b_KB}0+CO?bv;@382hgfk--C3 zu+ z?vlHs&bU|rXwFFIrf5=7xcnV6sdENlT0oiM!^Fke;#mo{G^P&vd`@nhEzRbu482*o z3&^ox{FH4TLlUl?Y(S2sr4WC-ovYA#?c~CF;b`k(axA(;kx1q+s%LXkn7AZ}temK! zDc(`yFp{5g7}ABJ#~0^vF?7V$4z6>C+O-v~glaq8T3J8$2~#NmTUHB12CJqGpbyNY z=+H7kwhh!ZN6}DzqYIL5V5Ycya@uzeu}f%$ogQ7XOtjZJtDHbWrl}sNT%uSIG>gI= z_eyqByQZoRy69_Jw$GOZmuIGf;x}k3=#XO%r_2KM?yv0fvoV1NO9wq?aE|z_(k49{ zqhyE-D&FDrJ#&XIkZ2V>{Mca+?D|!5?DZ9Ks|o;m8Rf2l4rdB21@Wz_5NVew`HcEk z9Wd4AHY|Ck)U4DmCb`1T{fD@m%P5xajd+Ey;ji~c!}MmC%G7MJ!r&AGT1v_onY>7e zgHAvnUH|VydWsvEIK9P?{!SU9gz}-?0uv=DPlDW#oA)jj^)>^~(l%2(V=}8@VVMKr z60DU8V3r`Au%Dg|aTq0tQXC18m9f&EXaGBZ^HMa0r1dMj#VM`f;vJ;JT2P&Vs9$Q+L4W0#KnNu8wAUNd&iAHY+v=nL93bUz`>t@9>@rJHrk(SU+XXO07=yH3! zQ?;vhs{u6GR}KU~C#aA}Lu>x&mNeq(;CUAIE}sW{%RB-K*o$PM5)no-ao6o;DXCEX zniJ$aJ(oBxLypb=2{ver3fFzi&D(2%Q+1EO^~eA`U?}zwXz1~iXZ)>vyr|h+t))%k z;}*}NzSCAli6??92rRuezD=%#6&NTvgh-MT6XM*uwEXk2S;X_?IE<467oZQ1!+7F% zQs-;t`|iISeqGn+sf$hWcTY|v7;7Y+II1W^n7?Oi9J9_U(_NRbI#MvyQO9o(|B+^a zqz4=y=l6Es2(e^Bxmy5k(kmhy z?YmS|v@jE8`9+a{T4aw*%^J3H-)NcjmZ6R`qOm*xVN`Xjzn!OVjejFFWNW5kN5oRB zJxm;$2u}bt3$aqaUz+1sU(`C{7S#l7?pl^1CDpuB3M4wi>spQ;)>S3mTK?{4l9WOp zuL{^Z4!X8VJ4WQmN(}k-R`)Q4r8ABGZef8`+>;OQHvs*RV0dl)+lO{`M#^YYX)#}+ QDL@k7V7JY-Yy&IqPqL)I(*OVf literal 2960 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 czC(8g<90YI@2Q$2{Gd(kR?mcJE-DmH$);{}W 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