From e78406f64f5bc0f795afa63a28a9556999831ad9 Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 6 Jul 2023 15:33:05 +0200 Subject: [PATCH] redstone over radio item counter --- changelog | 10 ++ src/main/java/com/hbm/blocks/ModBlocks.java | 3 + .../hbm/blocks/network/RadioTorchBase.java | 49 +----- .../hbm/blocks/network/RadioTorchCounter.java | 70 ++++++++ .../hbm/blocks/network/RadioTorchRWBase.java | 62 +++++++ .../blocks/network/RadioTorchReceiver.java | 2 +- .../hbm/blocks/network/RadioTorchSender.java | 2 +- .../container/ContainerCounterTorch.java | 76 +++++++++ .../hbm/inventory/gui/GUICounterTorch.java | 151 ++++++++++++++++++ .../java/com/hbm/main/CraftingManager.java | 1 + .../hbm/tileentity/TileEntityMachineBase.java | 7 +- .../java/com/hbm/tileentity/TileMappings.java | 1 + .../network/TileEntityRadioTorchCounter.java | 125 +++++++++++++++ src/main/resources/assets/hbm/lang/de_DE.lang | 3 + src/main/resources/assets/hbm/lang/en_US.lang | 3 + .../hbm/textures/blocks/rtty_counter.png | Bin 184 -> 182 bytes .../textures/gui/machine/gui_rtty_counter.png | Bin 0 -> 2546 bytes 17 files changed, 514 insertions(+), 51 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/network/RadioTorchCounter.java create mode 100644 src/main/java/com/hbm/blocks/network/RadioTorchRWBase.java create mode 100644 src/main/java/com/hbm/inventory/container/ContainerCounterTorch.java create mode 100644 src/main/java/com/hbm/inventory/gui/GUICounterTorch.java create mode 100644 src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchCounter.java create mode 100644 src/main/resources/assets/hbm/textures/gui/machine/gui_rtty_counter.png diff --git a/changelog b/changelog index b7101ac1a..90238bcbc 100644 --- a/changelog +++ b/changelog @@ -2,13 +2,23 @@ * Industrial boiler * A slightly taller variant of the boiler with higher capacity * Unlike the regular boiler, it can't explode +* Redstone-over-radio counter + * Can count and send the amount of an item stored in a container + * Counting supports filters by item ID, ID+meta and ore dictionary names + * Each torch can count up to three items and output the results on different channels + * This allows for more precise control over things like assembler chests, like turning off the ejector for an item that is already full but not other ejectors + * This property makes automating things with multiple inputs a lot easier + * Due to the ore dictionary ability of the counter, buffered items can precisely match the requirements of the recipe ## Changed * The regular boiler now only holds 16k instead of 64k (which is still a lot) * Added labels to the large mining drill's levers * Glyphid eggs can now be broken apart using an anvil, yielding glyphid meat, bones and experience bottles +* The assembler now uses the new multiblock system, making it less annoying to playe and less ear-piercing to break + * The conversion happens automatically so it's not necessary to remove the assemblers beforehand ## Fixed * Fixed quantity of the fusion reactor's construction recipe not being displayed right * Fixed fluid valve and redstone fluid valves having the wrong names * Fixed mobs' max health getting buffed by pollution, but the actual health staying the same +* Fixed bug regarding the loot pools of satellite miners diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index d72021648..4dff0bb1f 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -793,6 +793,7 @@ public class ModBlocks { public static Block fluid_switch; public static Block radio_torch_sender; public static Block radio_torch_receiver; + public static Block radio_torch_counter; public static Block conveyor; //public static Block conveyor_classic; @@ -1942,6 +1943,7 @@ public class ModBlocks { fluid_switch = new FluidSwitch(Material.iron).setBlockName("fluid_switch").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); radio_torch_sender = new RadioTorchSender().setBlockName("radio_torch_sender").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); radio_torch_receiver = new RadioTorchReceiver().setBlockName("radio_torch_receiver").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); + radio_torch_counter = new RadioTorchCounter().setBlockName("radio_torch_counter").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":rtty_counter"); conveyor = new BlockConveyor().setBlockName("conveyor").setHardness(2.0F).setResistance(2.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":conveyor"); //conveyor_classic = new BlockConveyorClassic().setBlockName("conveyor_classic").setHardness(2.0F).setResistance(2.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":conveyor"); @@ -3172,6 +3174,7 @@ public class ModBlocks { register(fluid_switch); register(radio_torch_sender); register(radio_torch_receiver); + register(radio_torch_counter); GameRegistry.registerBlock(crane_extractor, crane_extractor.getUnlocalizedName()); GameRegistry.registerBlock(crane_inserter, crane_inserter.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/network/RadioTorchBase.java b/src/main/java/com/hbm/blocks/network/RadioTorchBase.java index f6255c271..049bc565b 100644 --- a/src/main/java/com/hbm/blocks/network/RadioTorchBase.java +++ b/src/main/java/com/hbm/blocks/network/RadioTorchBase.java @@ -1,15 +1,11 @@ package com.hbm.blocks.network; -import java.util.ArrayList; import java.util.List; import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ITooltipProvider; -import com.hbm.inventory.gui.GUIScreenRadioTorch; import com.hbm.main.MainRegistry; import com.hbm.tileentity.IGUIProvider; -import com.hbm.tileentity.network.TileEntityRadioTorchBase; -import com.hbm.util.I18nUtil; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; @@ -18,25 +14,21 @@ import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; 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.item.ItemStack; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IIcon; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; +/** + * Base class for all torch-like RTTY blocks + * @author hbm + */ public abstract class RadioTorchBase extends BlockContainer implements IGUIProvider, ILookOverlay, ITooltipProvider { - @SideOnly(Side.CLIENT) protected IIcon iconOn; - public RadioTorchBase() { super(Material.circuits); } @@ -87,12 +79,6 @@ public abstract class RadioTorchBase extends BlockContainer implements IGUIProvi return super.collisionRayTrace(world, x, y, z, vec0, vec1); } - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int metadata) { - return side == 0 ? this.blockIcon : this.iconOn; - } - @Override public int onBlockPlaced(World world, int x, int y, int z, int side, float fX, float fY, float fZ, int meta) { return side; @@ -130,36 +116,9 @@ public abstract class RadioTorchBase extends BlockContainer implements IGUIProvi return !player.isSneaking(); } } - - @Override - @SideOnly(Side.CLIENT) - public void printHook(Pre event, World world, int x, int y, int z) { - TileEntity te = world.getTileEntity(x, y, z); - - if(te instanceof TileEntityRadioTorchBase) { - TileEntityRadioTorchBase radio = (TileEntityRadioTorchBase) te; - List text = new ArrayList(); - if(radio.channel != null && !radio.channel.isEmpty()) text.add(EnumChatFormatting.AQUA + "Freq: " + radio.channel); - text.add(EnumChatFormatting.RED + "Signal: " + radio.lastState); - ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); - } - } @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { addStandardInfo(stack, player, list, ext); } - - @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/blocks/network/RadioTorchCounter.java b/src/main/java/com/hbm/blocks/network/RadioTorchCounter.java new file mode 100644 index 000000000..a78aafc4a --- /dev/null +++ b/src/main/java/com/hbm/blocks/network/RadioTorchCounter.java @@ -0,0 +1,70 @@ +package com.hbm.blocks.network; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.ILookOverlay; +import com.hbm.inventory.container.ContainerCounterTorch; +import com.hbm.inventory.gui.GUICounterTorch; +import com.hbm.main.MainRegistry; +import com.hbm.tileentity.network.TileEntityRadioTorchCounter; +import com.hbm.util.I18nUtil; + +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +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.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; + +public class RadioTorchCounter extends RadioTorchBase { + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + if(!world.isRemote && !player.isSneaking()) { + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); + return true; + } else { + return !player.isSneaking(); + } + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityRadioTorchCounter(); + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new ContainerCounterTorch(player.inventory, (TileEntityRadioTorchCounter) world.getTileEntity(x, y, z)); + } + + @Override + @SideOnly(Side.CLIENT) + public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new GUICounterTorch(player.inventory, (TileEntityRadioTorchCounter) world.getTileEntity(x, y, z)); + } + + @Override + public void printHook(Pre event, World world, int x, int y, int z) { + TileEntity te = world.getTileEntity(x, y, z); + + if(te instanceof TileEntityRadioTorchCounter) { + TileEntityRadioTorchCounter radio = (TileEntityRadioTorchCounter) te; + List text = new ArrayList(); + + for(int i = 0; i < 3; i++) { + if(!radio.channel[i].isEmpty()) { + text.add(EnumChatFormatting.AQUA + "Freq " + (i + 1) + ": " + radio.channel[i]); + text.add(EnumChatFormatting.RED + "Signal " + (i + 1) + ": " + radio.lastCount[i]); + } + } + + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } + } +} diff --git a/src/main/java/com/hbm/blocks/network/RadioTorchRWBase.java b/src/main/java/com/hbm/blocks/network/RadioTorchRWBase.java new file mode 100644 index 000000000..8199991a5 --- /dev/null +++ b/src/main/java/com/hbm/blocks/network/RadioTorchRWBase.java @@ -0,0 +1,62 @@ +package com.hbm.blocks.network; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.ILookOverlay; +import com.hbm.inventory.gui.GUIScreenRadioTorch; +import com.hbm.tileentity.network.TileEntityRadioTorchBase; +import com.hbm.util.I18nUtil; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +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.util.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; + +/** + * Base class for the basic sender and receiver RTTY torch + * @author hbm + */ +public abstract class RadioTorchRWBase extends RadioTorchBase { + + @SideOnly(Side.CLIENT) protected IIcon iconOn; + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int metadata) { + return side == 0 ? this.blockIcon : this.iconOn; + } + + @Override + @SideOnly(Side.CLIENT) + public void printHook(Pre event, World world, int x, int y, int z) { + TileEntity te = world.getTileEntity(x, y, z); + + if(te instanceof TileEntityRadioTorchBase) { + TileEntityRadioTorchBase radio = (TileEntityRadioTorchBase) te; + List text = new ArrayList(); + if(radio.channel != null && !radio.channel.isEmpty()) text.add(EnumChatFormatting.AQUA + "Freq: " + radio.channel); + text.add(EnumChatFormatting.RED + "Signal: " + radio.lastState); + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } + } + + @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/blocks/network/RadioTorchReceiver.java b/src/main/java/com/hbm/blocks/network/RadioTorchReceiver.java index 7ce90e43f..4d7f28c83 100644 --- a/src/main/java/com/hbm/blocks/network/RadioTorchReceiver.java +++ b/src/main/java/com/hbm/blocks/network/RadioTorchReceiver.java @@ -10,7 +10,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -public class RadioTorchReceiver extends RadioTorchBase { +public class RadioTorchReceiver extends RadioTorchRWBase { public RadioTorchReceiver() { super(); diff --git a/src/main/java/com/hbm/blocks/network/RadioTorchSender.java b/src/main/java/com/hbm/blocks/network/RadioTorchSender.java index 2e5a675d4..2045be8a3 100644 --- a/src/main/java/com/hbm/blocks/network/RadioTorchSender.java +++ b/src/main/java/com/hbm/blocks/network/RadioTorchSender.java @@ -9,7 +9,7 @@ import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -public class RadioTorchSender extends RadioTorchBase { +public class RadioTorchSender extends RadioTorchRWBase { public RadioTorchSender() { super(); diff --git a/src/main/java/com/hbm/inventory/container/ContainerCounterTorch.java b/src/main/java/com/hbm/inventory/container/ContainerCounterTorch.java new file mode 100644 index 000000000..56af3c613 --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerCounterTorch.java @@ -0,0 +1,76 @@ +package com.hbm.inventory.container; + +import com.hbm.tileentity.network.TileEntityRadioTorchCounter; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerCounterTorch extends Container { + + protected TileEntityRadioTorchCounter radio; + + public ContainerCounterTorch(InventoryPlayer invPlayer, TileEntityRadioTorchCounter radio) { + this.radio = radio; + + for(int i = 0; i < 3; i++) { + this.addSlotToContainer(new Slot(radio, i, 138, 18 + 44 * i)); + } + + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 9; j++) { + this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 12 + j * 18, 156 + i * 18)); + } + } + + for(int i = 0; i < 9; i++) { + this.addSlotToContainer(new Slot(invPlayer, i, 12 + i * 18, 214)); + } + } + + @Override public ItemStack transferStackInSlot(EntityPlayer player, int slot) { return null; } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return radio.isUseableByPlayer(player); + } + + @Override + public ItemStack slotClick(int index, int button, int mode, EntityPlayer player) { + + //L/R: 0 + //M3: 3 + //SHIFT: 1 + //DRAG: 5 + if(index < 0 || index > 2) { + return super.slotClick(index, button, mode, player); + } + + Slot slot = this.getSlot(index); + + ItemStack ret = null; + ItemStack held = player.inventory.getItemStack(); + + if(slot.getHasStack()) + ret = slot.getStack().copy(); + + if(button == 1 && mode == 0 && slot.getHasStack()) { + radio.matcher.nextMode(radio.getWorldObj(), slot.getStack(), index); + return ret; + + } else { + slot.putStack(held != null ? held.copy() : null); + + if(slot.getHasStack()) { + slot.getStack().stackSize = 1; + } + + slot.onSlotChanged(); + radio.matcher.initPatternStandard(radio.getWorldObj(), slot.getStack(), index); + + return ret; + } + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUICounterTorch.java b/src/main/java/com/hbm/inventory/gui/GUICounterTorch.java new file mode 100644 index 000000000..0b02ddf1a --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUICounterTorch.java @@ -0,0 +1,151 @@ +package com.hbm.inventory.gui; + +import java.util.Arrays; + +import org.lwjgl.input.Keyboard; +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerCounterTorch; +import com.hbm.lib.RefStrings; +import com.hbm.packet.NBTControlPacket; +import com.hbm.packet.PacketDispatcher; +import com.hbm.tileentity.network.TileEntityRadioTorchCounter; +import com.hbm.util.I18nUtil; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.PositionedSoundRecord; +import net.minecraft.client.gui.GuiTextField; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Slot; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; + +public class GUICounterTorch extends GuiInfoContainer { + + protected static final ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/machine/gui_rtty_counter.png"); + + protected TileEntityRadioTorchCounter counter; + protected GuiTextField[] frequency; + + public GUICounterTorch(InventoryPlayer invPlayer, TileEntityRadioTorchCounter counter) { + super(new ContainerCounterTorch(invPlayer, counter)); + this.counter = counter; + + this.xSize = 218; + this.ySize = 238; + } + + @Override + public void initGui() { + super.initGui(); + + Keyboard.enableRepeatEvents(true); + + this.frequency = new GuiTextField[3]; + + for(int i = 0; i < 3; i++) { + + this.frequency[i] = new GuiTextField(this.fontRendererObj, guiLeft + 29, guiTop + 21 + 44 * i, 86, 14); + this.frequency[i].setTextColor(0x00ff00); + this.frequency[i].setDisabledTextColour(0x00ff00); + this.frequency[i].setEnableBackgroundDrawing(false); + this.frequency[i].setMaxStringLength(10); + this.frequency[i].setText(counter.channel[i] == null ? "" : counter.channel[i]); + } + } + + @Override + public void drawScreen(int x, int y, float interp) { + super.drawScreen(x, y, interp); + + if(guiLeft + 193 <= x && guiLeft + 193 + 18 > x && guiTop + 8 < y && guiTop + 8 + 18 >= y) { + func_146283_a(Arrays.asList(new String[] { counter.polling ? "Polling" : "State Change" }), x, y); + } + if(guiLeft + 193 <= x && guiLeft + 193 + 18 > x && guiTop + 30 < y && guiTop + 30 + 18 >= y) { + func_146283_a(Arrays.asList(new String[] { "Save Settings" }), x, y); + } + + if(this.mc.thePlayer.inventory.getItemStack() == null) { + for(int i = 0; i < 3; ++i) { + Slot slot = (Slot) this.inventorySlots.inventorySlots.get(i); + + if(this.isMouseOverSlot(slot, x, y) && counter.matcher.modes[i] != null) { + + String label = EnumChatFormatting.YELLOW + ""; + + switch(counter.matcher.modes[i]) { + case "exact": label += "Item and meta match"; break; + case "wildcard": label += "Item matches"; break; + default: label += "Ore dict key matches: " + counter.matcher.modes[i]; break; + } + + this.func_146283_a(Arrays.asList(new String[] { EnumChatFormatting.RED + "Right click to change", label }), x, y - 30); + } + } + } + } + + @Override + protected void mouseClicked(int x, int y, int i) { + super.mouseClicked(x, y, i); + + /*for(int j = 0; j < 3; j++) this.frequency[j].mouseClicked(x, y, i); + + if(guiLeft + 193 <= x && guiLeft + 193 + 18 > x && guiTop + 8 < y && guiTop + 8 + 18 >= y) { + + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + NBTTagCompound data = new NBTTagCompound(); + data.setBoolean("polling", true); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, counter.xCoord, counter.yCoord, counter.zCoord)); + } + + if(guiLeft + 193 <= x && guiLeft + 193 + 18 > x && guiTop + 30 < y && guiTop + 30 + 18 >= y) { + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + NBTTagCompound data = new NBTTagCompound(); + + for(int j = 0; j < 3; j++) data.setString("c" + j, this.frequency[j].getText()); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, counter.xCoord, counter.yCoord, counter.zCoord)); + }*/ + } + + @Override + protected void drawGuiContainerForegroundLayer(int x, int y) { + String name = I18nUtil.resolveKey(this.counter.getInventoryName()); + this.fontRendererObj.drawString(name, 184 / 2 - this.fontRendererObj.getStringWidth(name) / 2, this.guiTop + 6, 4210752); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 16, this.ySize - 96 + 2, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float interp, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + if(counter.polling) { + drawTexturedModalRect(guiLeft + 193, guiTop + 8, 218, 0, 18, 18); + } + + for(int i = 0; i < 3; i++) this.frequency[i].drawTextBox(); + } + + @Override + protected void keyTyped(char c, int i) { + + //for(int j = 0; j < 3; j++) if(this.frequency[j].textboxKeyTyped(c, i)) return; + + super.keyTyped(c, i); + } + + @Override + public void onGuiClosed() { + super.onGuiClosed(); + Keyboard.enableRepeatEvents(false); + } + + @Override + public boolean doesGuiPauseGame() { + return false; + } +} diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 9ebfb3281..f0bc031ac 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -253,6 +253,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.radio_torch_sender, 4), new Object[] { "G", "R", "I", 'G', "dustGlowstone", 'R', Blocks.redstone_torch, 'I', NETHERQUARTZ.gem() }); addRecipeAuto(new ItemStack(ModBlocks.radio_torch_receiver, 4), new Object[] { "G", "R", "I", 'G', "dustGlowstone", 'R', Blocks.redstone_torch, 'I', IRON.ingot() }); + addRecipeAuto(new ItemStack(ModBlocks.radio_torch_counter, 4), new Object[] { "G", "R", "I", 'G', "dustGlowstone", 'R', Blocks.redstone_torch, 'I', ModItems.circuit_aluminium }); addRecipeAuto(new ItemStack(ModBlocks.conveyor, 16), new Object[] { "LLL", "I I", "LLL", 'L', Items.leather, 'I', IRON.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.conveyor, 16), new Object[] { "RSR", "I I", "RSR", 'I', IRON.ingot(), 'R', DictFrame.fromOne(ModItems.plant_item, EnumPlantType.ROPE), 'S', IRON.plate() }); diff --git a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java index d71c1ab66..988d683b8 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java +++ b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java @@ -83,11 +83,10 @@ public abstract class TileEntityMachineBase extends TileEntityLoadedBase impleme @Override public boolean isUseableByPlayer(EntityPlayer player) { - if(worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) - { + if(worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) { return false; - }else{ - return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <=128; + } else { + return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <= 128; } } diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 2ff4005f6..5afef6e01 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -372,6 +372,7 @@ public class TileMappings { put(TileEntityRadioTorchSender.class, "tileentity_rtty_sender"); put(TileEntityRadioTorchReceiver.class, "tileentity_rtty_rec"); + put(TileEntityRadioTorchCounter.class, "tileentity_rtty_counter"); } private static void put(Class clazz, String... names) { diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchCounter.java b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchCounter.java new file mode 100644 index 000000000..809fec28f --- /dev/null +++ b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchCounter.java @@ -0,0 +1,125 @@ +package com.hbm.tileentity.network; + +import com.hbm.interfaces.IControlReceiver; +import com.hbm.module.ModulePatternMatcher; +import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.Compat; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityRadioTorchCounter extends TileEntityMachineBase implements IControlReceiver { + + public String[] channel; + public int[] lastCount; + public boolean polling = false; + public ModulePatternMatcher matcher; + + public TileEntityRadioTorchCounter() { + super(3); + this.channel = new String[3]; + for(int i = 0; i < 3; i++) this.channel[i] = ""; + this.lastCount = new int[3]; + this.matcher = new ModulePatternMatcher(3); + } + + @Override + public String getName() { + return "container.rttyCounter"; + } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata()).getOpposite(); + + TileEntity tile = Compat.getTileStandard(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ); + if(tile instanceof IInventory) { + IInventory inv = (IInventory) tile; + ItemStack[] invSlots = new ItemStack[inv.getSizeInventory()]; + for(int i = 0; i < invSlots.length; i++) invSlots[i] = inv.getStackInSlot(i); + + for(int i = 0; i < 3; i++) { + if(channel[i].isEmpty()) continue; + if(slots[i] == null) continue; + ItemStack pattern = slots[i]; + + int count = 0; + + for(int j = 0; j < invSlots.length; j++) { + if(invSlots[j] != null && matcher.isValidForFilter(pattern, i, invSlots[j])) { + count += invSlots[j].stackSize; + } + } + + if(this.polling || this.lastCount[i] != count) { + RTTYSystem.broadcast(worldObj, this.channel[i], count); + } + + this.lastCount[i] = count; + } + } + + NBTTagCompound data = new NBTTagCompound(); + data.setBoolean("polling", polling); + data.setIntArray("last", lastCount); + this.matcher.writeToNBT(data); + for(int i = 0; i < 3; i++) if(channel[i] != null) data.setString("c" + i, channel[i]); + this.networkPack(data, 15); + } + } + + public void networkUnpack(NBTTagCompound nbt) { + this.polling = nbt.getBoolean("polling"); + this.lastCount = nbt.getIntArray("last"); + this.matcher.modes = new String[this.matcher.modes.length]; + this.matcher.readFromNBT(nbt); + for(int i = 0; i < 3; i++) this.channel[i] = nbt.getString("c" + i); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.polling = nbt.getBoolean("p"); + for(int i = 0; i < 3; i++) { + this.channel[i] = nbt.getString("c" + i); + this.lastCount[i] = nbt.getInteger("l" + i); + } + this.matcher.readFromNBT(nbt); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setBoolean("p", polling); + for(int i = 0; i < 3; i++) { + if(channel[i] != null) nbt.setString("c" + i, channel[i]); + nbt.setInteger("l" + i, lastCount[i]); + } + this.matcher.writeToNBT(nbt); + } + + @Override + public boolean hasPermission(EntityPlayer player) { + return this.isUseableByPlayer(player); + } + + @Override + public void receiveControl(NBTTagCompound data) { + if(data.hasKey("polling")) { + this.polling = !this.polling; + this.markChanged(); + } else { + System.out.println("guh"); + for(int i = 0; i < 3; i++) { + this.channel[i] = data.getString("c" + i); + } + this.markChanged(); + } + } +} diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 5440f43b5..a76c6a773 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -392,6 +392,7 @@ container.reactorSmall=Atomreaktor container.reix=Rei-X Hauptrechner container.rtg=Radioisotopengenerator container.rtgFurnace=RTG-Ofen +container.rttyCounter=Redstone-over-Radio Itemzähler container.rttyReceiver=Redstone-over-Radio Empfänger container.rttySender=Redstone-over-Radio Sender container.safe=Panzerschrank @@ -4197,6 +4198,8 @@ tile.pribris.name=RBMK-Schutt tile.pribris_burning.name=Flammender RBMK-Schutt tile.pribris_digamma.name=Geschwärzter RBMK-Schutt tile.pribris_radiating.name=Glühender RBMK-Schutt +tile.radio_torch_counter.name=Redstone-over-Radio Itemzähler +tile.radio_torch_counter.desc=Kann auf ebenen Flächen oder Komparator-kompatiblen Blöcken platziert werden$Signal basiert auf Anzahl passender Items tile.radio_torch_receiver.name=Redstone-over-Radio Empfänger tile.radio_torch_receiver.desc=Kann auf ebenen Flächen oder Komparator-kompatiblen Blöcken platziert werden tile.radio_torch_sender.name=Redstone-over-Radio Sender diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 859d763ce..4f6bc3080 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -730,6 +730,7 @@ container.reactorResearch=Research Reactor container.reix=Rei-X Mainframe container.rtg=RT Generator container.rtgFurnace=RTG Furnace +container.rttyCounter=Redstone-over-Radio Item Counter container.rttyReceiver=Redstone-over-Radio Receiver container.rttySender=Redstone-over-Radio Transmitter container.safe=Safe @@ -5075,6 +5076,8 @@ tile.pribris.name=RBMK Debris tile.pribris_burning.name=Flaming RBMK Debris tile.pribris_digamma.name=Blackened RBMK Debris tile.pribris_radiating.name=Smoldering RBMK Debris +tile.radio_torch_counter.name=Redstone-over-Radio Item Counter +tile.radio_torch_counter.desc=Placable on flat surfaces or comparator-compatible blocks$Bases signal on the amount of matching items tile.radio_torch_receiver.name=Redstone-over-Radio Receiver tile.radio_torch_receiver.desc=Placable on flat surfaces or comparator-compatible blocks tile.radio_torch_sender.name=Redstone-over-Radio Transmitter diff --git a/src/main/resources/assets/hbm/textures/blocks/rtty_counter.png b/src/main/resources/assets/hbm/textures/blocks/rtty_counter.png index e1d9764f73240c483f65da1d7903e5fa1b900026..f00b829ac17ab690e1bdfca18495433885d953e6 100644 GIT binary patch delta 59 zcmdnNxQ%gw31jX=Q$zmL^bb{x>$$b&hZ)Y0J#lDasj3V|6{Ed^k{CnwJiYxKx>*ej OK;Y@>=d#Wzp$Py@4HA(6 delta 61 zcmdnSxPx(m31j|5Q$zl@`X8$p*K=#l4>O#x_WRL^rK)lopAYp)n{!k#GE97;pY`z> R7b61@c)I$ztaD0e0s!2w7N`IK diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_rtty_counter.png b/src/main/resources/assets/hbm/textures/gui/machine/gui_rtty_counter.png new file mode 100644 index 0000000000000000000000000000000000000000..70c49adf402460a014a8f3d9310a33ee0ccde091 GIT binary patch literal 2546 zcmb`JdpOkV7RTSYFhhw=vg5&YmDG%KDWi-^1$lC(tt%R`81(VK0ieLJwc6ntnJwz74%Dh& zhU&Q~Xp_USF+sV-7IBNM<^9#MaE*&Fh5|XCNzp_E&LQ=Al@2#CYq}Kmkyff?+u)x3 z%ZJD0Tr~FxS?3&Wj#ZLE%t+X%C(7twUD^bZHByn_nmN~2wocXm{L56j$qZg*m{?m| zdyXz18#AQkKmxC*+X<*|a+fY~YNrqV+{1g~p?zYiQu(Jj8*4raS~S zjX6b^VM)Ev6-B3cWpk{QloUU4Q{wRb`R-dtkiU)I%25UG5q;yd82%`>>59-ZK9X1% zGw8+Vv|j;KHWDD$0`i%zXz>ZDf7ez8v|4s{PTI&PZmg+z(lr}RGKE<(k}M=^qgy6> z^B(X{XR!hU9YcX*_Q$f7AVWAez0QxNk&ffGr+0ez^|w9be9AI30kPBL1BK6PROd!J zara+G{XP>S(2SUUWOVsBGi_$MRMN0bxY&=e-kciv=ulN;*&F*>L9hVdJRl6`P+GMk z2j&xoyPn}2wx>8@jaYJ#lj5O+b=BRmk)m@49xa(%{(i*Ss}Ov8*Eo5cDFji?OF^CI zXdpp4#YuIsE3=SI^QBi?d-sP?!|(85soD+2iDP)s-cUry3wlb@w(O9OC+3!@y@Hiv z+h_7vQO5^CNEq7k{=HDJUtFwnVgHFC@6V2}U@G0+?$XS)lW(o?0PTPR@svSeF+-W{ zklm|BxHX9Zx~#z?zSFC833(3f8TJfUj0oVqE@21s9t7x;&EOR42!CWdY5HOa4>rMA zOcexYd~9nYh52;T=0y)q%4&)()TlZrQAtLP<@2{3`^S%tC$++9tL#a4PO3L6>|sDD z-@uIzNG0mg{GHKgU>6Yf{$V(r^E`BIb6>@d738BTri~rvCLJa#GhKwAM=jRpXm6_+ z$7Jk9y_$jOGtfr&8UMQ2#m;v;GxE}h**L9!p&9ih+3@Y-xD|UpW}S}?)gjj+Fa_CK zNnmzoD}u^WC2C zSkvbF3AgnJeY_{iPJ(LbeEs_8u#W7*i@Edjv8QAVH;NwFtw%gOXSFoSjqE9R{u^)@ zLm03x$7;0Cti|lD6o$dI!Byi}p5Mb_)pRSArLm*u6rWEctbtiN-0jxS>f5+LDaJ4e zwr;A``~C56ZD}ODRf_rf~@Mf1}JNor$O3lk{ru@X*UeP{SMAV0}UrsuzS#(TMx@ zB_-#V05}(BNrsTxV2>JWz;QYA=~C_TgHIs9T6nO_x`N`wX$r({F!XG<<$!er7a-Qb z&RIdI&$!C7gSR$^`1+ROjYo;Ha6VH;=GBrF3gso1;L_MwHr7|#V ztvCq`wB-5wV=4L3FPfze?8-@&v#-iASpEJ62M<$k4i4y z1#Vm~K-~G$b82h3=J(bx2r%UvwAp&q4g`tkmk9QW86AK$bw?S-o-Mp@p^<(S&SCH5@`wF1MYf&!-S)njvMr!Um`_A4i>$?Q`T6-qdAOO9 zd_rnz^^;6;3_{&txm=(301BF{3$`=!3q`?G@z~+%HYZ1lR_QuL31R3acQAi7@)5k0`>Mo0~6sBcL(UQSUoD4}DUgZ;QH?Lx?L)#8(Ve z+L`DE!G7%jnVX+N|Lp3&p-c`6!flV5I4;oJZ==mW+ICR5d+$>Hf;gOVpfx6p@9Z68 zotu!508NU78cab$nXg^OFMDVe#lKnS#$+SDkHr7|V53#Zct7_GG0o`wmweu)Rn8V( zNEdIBFyohXx&u(t`mee9`2pX;te`W!kY`LcuW~-!4gVpTw1=y2Lg z&J8+ds~Iin(Kk8$hqU~Q>)Yn!B#(HHXfL@^&Y|zxq*j=okTJa5Y}v%yTzxDS>rZ+c zOwqO+xP*J+6N)KE>wzH#pS*ij9<{DxX5qK(C!?B7#Wj7jP>6e>d}YC5yPIfLx|4k7 EAKRyc`Tzg` literal 0 HcmV?d00001