From 0e72180e41542e0081f4797b08c6e5f91c8fa1b0 Mon Sep 17 00:00:00 2001 From: Vaern Date: Mon, 22 Apr 2024 22:49:03 -0700 Subject: [PATCH] i had to switch gears on em, fish-tail in the rear view mirr-on em skrttt! --- src/main/java/com/hbm/blocks/ModBlocks.java | 3 + .../hbm/blocks/network/RadioTorchLogic.java | 86 ++++++++ .../gui/GUIScreenRadioTorchLogic.java | 204 ++++++++++++++++++ .../java/com/hbm/main/CraftingManager.java | 1 + .../java/com/hbm/render/block/RenderRTTY.java | 9 + .../java/com/hbm/tileentity/TileMappings.java | 1 + .../network/TileEntityRadioTorchLogic.java | 193 +++++++++++++++++ src/main/resources/assets/hbm/lang/en_US.lang | 13 ++ .../hbm/textures/blocks/rtty_logic_off.png | Bin 0 -> 225 bytes .../hbm/textures/blocks/rtty_logic_on.png | Bin 0 -> 277 bytes .../textures/blocks/rtty_logic_on.png.mcmeta | 5 + .../gui/machine/gui_rtty_logic_receiver.png | Bin 0 -> 4233 bytes 12 files changed, 515 insertions(+) create mode 100644 src/main/java/com/hbm/blocks/network/RadioTorchLogic.java create mode 100644 src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorchLogic.java create mode 100644 src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchLogic.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/rtty_logic_off.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/rtty_logic_on.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/rtty_logic_on.png.mcmeta create mode 100644 src/main/resources/assets/hbm/textures/gui/machine/gui_rtty_logic_receiver.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 899843fef..d59d10733 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -796,6 +796,7 @@ public class ModBlocks { public static Block radio_torch_sender; public static Block radio_torch_receiver; public static Block radio_torch_counter; + public static Block radio_torch_logic; public static Block radio_telex; public static Block conveyor; @@ -1950,6 +1951,7 @@ public class ModBlocks { 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"); + radio_torch_logic = new RadioTorchLogic().setBlockName("radio_torch_logic").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); radio_telex = new RadioTelex().setBlockName("radio_telex").setHardness(3F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":radio_telex"); conveyor = new BlockConveyor().setBlockName("conveyor").setHardness(2.0F).setResistance(2.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":conveyor"); @@ -3230,6 +3232,7 @@ public class ModBlocks { register(radio_torch_sender); register(radio_torch_receiver); register(radio_torch_counter); + register(radio_torch_logic); register(radio_telex); register(crane_extractor); diff --git a/src/main/java/com/hbm/blocks/network/RadioTorchLogic.java b/src/main/java/com/hbm/blocks/network/RadioTorchLogic.java new file mode 100644 index 000000000..d359389fc --- /dev/null +++ b/src/main/java/com/hbm/blocks/network/RadioTorchLogic.java @@ -0,0 +1,86 @@ +package com.hbm.blocks.network; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.ILookOverlay; +import com.hbm.inventory.gui.GUIScreenRadioTorchLogic; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.network.TileEntityRadioTorchBase; +import com.hbm.tileentity.network.TileEntityRadioTorchLogic; +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.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; + +public class RadioTorchLogic extends RadioTorchRWBase { + + public RadioTorchLogic() { + super(); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":rtty_logic_off"); + this.iconOn = iconRegister.registerIcon(RefStrings.MODID + ":rtty_logic_on"); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + TileEntityRadioTorchLogic tile = new TileEntityRadioTorchLogic(); + tile.lastUpdate = world.getTotalWorldTime(); + return tile; + } + + @Override + public boolean canProvidePower() { + return true; + } + + @Override + public int isProvidingWeakPower(IBlockAccess world, int x, int y, int z, int side) { + + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityRadioTorchLogic) { + int state = ((TileEntityRadioTorchLogic) tile).lastState; + return state; + } + + return 0; + } + + @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 TileEntityRadioTorchLogic) { + TileEntityRadioTorchLogic radio = (TileEntityRadioTorchLogic) 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 + @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 TileEntityRadioTorchLogic) + return new GUIScreenRadioTorchLogic((TileEntityRadioTorchLogic) te); + + return null; + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorchLogic.java b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorchLogic.java new file mode 100644 index 000000000..42b495f45 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenRadioTorchLogic.java @@ -0,0 +1,204 @@ +package com.hbm.inventory.gui; + +import java.util.Arrays; + +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +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.tileentity.network.TileEntityRadioTorchLogic; +import com.hbm.tileentity.network.TileEntityRadioTorchSender; +import com.hbm.util.I18nUtil; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.PositionedSoundRecord; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.gui.GuiTextField; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ResourceLocation; + +public class GUIScreenRadioTorchLogic extends GuiScreen { + + protected static final ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/machine/gui_rtty_logic_receiver.png"); + + protected TileEntityRadioTorchLogic logic; + protected GuiTextField frequency; + protected GuiTextField[] map; + protected int[] conditions; //so the 'save settings' paradigm applies to the conditions, too + + protected static final int xSize = 256; + protected static final int ySize = 204; + protected int guiLeft; + protected int guiTop; + + public GUIScreenRadioTorchLogic(TileEntityRadioTorchLogic logic) { + this.logic = logic; + } + + @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 = 4; + int oY = 4; + + this.frequency = new GuiTextField(this.fontRendererObj, guiLeft + 25 + oX, guiTop + 17 + oY, 90 - oX * 2, 14); + this.frequency.setTextColor(0x00ff00); + this.frequency.setDisabledTextColour(0x00ff00); + this.frequency.setEnableBackgroundDrawing(false); + this.frequency.setMaxStringLength(10); + this.frequency.setText(logic.channel == null ? "" : logic.channel); + + this.map = new GuiTextField[16]; + this.conditions = new int[16]; + + for(int i = 0; i < 16; i++) { + this.map[i] = new GuiTextField(this.fontRendererObj, guiLeft + 7 + (130 * (i / 8)) + oX + 18, guiTop + 53 + (18 * (i % 8)) + oY, 54 - oX * 2, 14); + this.map[i].setTextColor(0x00ff00); + this.map[i].setDisabledTextColour(0x00ff00); + this.map[i].setEnableBackgroundDrawing(false); + this.map[i].setMaxStringLength(15); + this.map[i].setText(logic.mapping[i] == null ? "" : logic.mapping[i]); + + this.conditions[i] = logic.conditions[i]; + } + } + + @Override + public void drawScreen(int x, int y, float f) { + this.drawDefaultBackground(); + this.drawGuiContainerBackgroundLayer(f, x, y); + GL11.glDisable(GL11.GL_LIGHTING); + this.drawGuiContainerForegroundLayer(x, y); + GL11.glEnable(GL11.GL_LIGHTING); + //easy selection + if(guiLeft > x && guiLeft + xSize <= x && guiTop > y && guiTop + ySize <= y) return; + + if(!Mouse.isButtonDown(0) && !Mouse.isButtonDown(1) && Mouse.next()) { + for(int j = 0; j < 16; j++) { + if(guiLeft + 7 + (130 * (j / 8)) <= x && guiLeft + 7 + 18 + (130 * (j / 8)) > x && guiTop + 53 + (18 * (j % 8)) <= y && guiTop + 53 + 18 + (18 * (j % 8)) > y) { + int scroll = Mouse.getEventDWheel(); + + if(scroll > 0) this.conditions[j] = (this.conditions[j] + 1) % 10; + if(scroll < 0) this.conditions[j] = (this.conditions[j] + 9) % 10; + return; + } + } + } + } + + private void drawGuiContainerForegroundLayer(int x, int y) { + String name = I18nUtil.resolveKey("container.rttyLogic"); + this.fontRendererObj.drawString(name, this.guiLeft + this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, this.guiTop + 6, 4210752); + //TODO add localization for *every* RTTY + if(guiLeft + 137 <= x && guiLeft + 137 + 18 > x && guiTop + 17 < y && guiTop + 17 + 18 >= y) { + func_146283_a(Arrays.asList(new String[] { logic.descending ? "Descending Order" : "Ascending Order" }), x, y); + } + if(guiLeft + 173 <= x && guiLeft + 173 + 18 > x && guiTop + 17 < y && guiTop + 17 + 18 >= y) { + func_146283_a(Arrays.asList(new String[] { logic.polling ? "Polling" : "State Change" }), x, y); + } + if(guiLeft + 209 <= x && guiLeft + 209 + 18 > x && guiTop + 17 < y && guiTop + 17 + 18 >= y) { + func_146283_a(Arrays.asList(new String[] { "Save Settings" }), x, y); + } + for(int j = 0; j < 16; j++) { + if(guiLeft + 7 + (130 * (j / 8)) <= x && guiLeft + 7 + 18 + (130 * (j / 8)) > x && guiTop + 53 + (18 * (j % 8)) <= y && guiTop + 53 + 18 + (18 * (j % 8)) > y) { + func_146283_a(Arrays.asList(new String[] { I18nUtil.resolveKey("desc.gui.rttyLogic.cond" + this.conditions[j]) }), x, y); + break; + } + } + } + + private void drawGuiContainerBackgroundLayer(float f, int mouseX, int mouseY) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + if(logic.descending) drawTexturedModalRect(guiLeft + 137, guiTop + 17, 0, 204, 18, 18); + if(logic.polling) drawTexturedModalRect(guiLeft + 173, guiTop + 17, 0, 222, 18, 18); + + for(int i = 0; i < 16; i++) { + if(logic.mapping[i].isEmpty()) { + if(this.conditions[i] != 0) + drawTexturedModalRect(guiLeft + 7 + (130 * (i / 8)), guiTop + 53 + (18 * (i % 8)), 18 + this.conditions[i] * 18, 222, 18, 18); + } else { + drawTexturedModalRect(guiLeft + 7 + (130 * (i / 8)), guiTop + 53 + (18 * (i % 8)), 18 + this.conditions[i] * 18, 204, 18, 18); + drawTexturedModalRect(guiLeft + 85 + (130 * (i / 8)), guiTop + 57 + (18 * (i % 8)), 198, 204, 14, 10); + } + } + + for(int i = 0; i < 16; i++) this.map[i].drawTextBox(); + this.frequency.drawTextBox(); + } + + @Override + protected void mouseClicked(int x, int y, int i) { + super.mouseClicked(x, y, i); + + this.frequency.mouseClicked(x, y, i); + for(int j = 0; j < 16; j++) this.map[j].mouseClicked(x, y, i); + + if(guiLeft + 137 <= x && guiLeft + 137 + 18 > x && guiTop + 17 < y && guiTop + 17 + 18 >= y) { + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + NBTTagCompound data = new NBTTagCompound(); + data.setBoolean("d", !logic.descending); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, logic.xCoord, logic.yCoord, logic.zCoord)); + } + + if(guiLeft + 173 <= x && guiLeft + 173 + 18 > x && guiTop + 17 < y && guiTop + 17 + 18 >= y) { + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + NBTTagCompound data = new NBTTagCompound(); + data.setBoolean("p", !logic.polling); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, logic.xCoord, logic.yCoord, logic.zCoord)); + } + + if(guiLeft + 209 <= x && guiLeft + 209 + 18 > x && guiTop + 17 < y && guiTop + 17 + 18 >= y) { + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + NBTTagCompound data = new NBTTagCompound(); + data.setString("c", this.frequency.getText()); + for(int j = 0; j < 16; j++) data.setString("m" + j, this.map[j].getText().isEmpty() ? "" : this.map[j].getText()); + for(int j = 0; j < 16; j++) data.setInteger("c" + j, this.conditions[j]); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, logic.xCoord, logic.yCoord, logic.zCoord)); + } + + for(int j = 0; j < 16; j++) { + if(guiLeft + 7 + (130 * (j / 8)) <= x && guiLeft + 7 + 18 + (130 * (j / 8)) > x && guiTop + 53 + (18 * (j % 8)) <= y && guiTop + 53 + 18 + (18 * (j % 8)) > y) { + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + this.conditions[j] = (this.conditions[j] + 1) % 10; + } + } + } + + @Override + protected void keyTyped(char c, int i) { + + if(this.frequency.textboxKeyTyped(c, i)) + return; + + for(int j = 0; j < 16; j++) if(this.map[j].textboxKeyTyped(c, i)) return; + + if(i == 1 || i == this.mc.gameSettings.keyBindInventory.getKeyCode()) { + this.mc.thePlayer.closeScreen(); + this.mc.setIngameFocus(); + } + } + + @Override + public void 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 cb9013f34..8d0ff07ea 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -248,6 +248,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_logic, 4), new Object[] { "G", "R", "I", 'G', "dustGlowstone", 'R', Blocks.redstone_torch, 'I', ModItems.circuit_copper }); 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.radio_telex, 2), new Object[] { "SCR", "W#W", "WWW", 'S', ModBlocks.radio_torch_sender, 'C', ModItems.crt_display, 'R', ModBlocks.radio_torch_receiver, 'W', KEY_PLANKS, '#', ModItems.circuit_aluminium }); diff --git a/src/main/java/com/hbm/render/block/RenderRTTY.java b/src/main/java/com/hbm/render/block/RenderRTTY.java index 0f657c636..68b3af3ec 100644 --- a/src/main/java/com/hbm/render/block/RenderRTTY.java +++ b/src/main/java/com/hbm/render/block/RenderRTTY.java @@ -4,6 +4,7 @@ import com.hbm.blocks.network.RadioTorchBase; import com.hbm.main.ResourceManager; import com.hbm.render.util.ObjUtil; import com.hbm.tileentity.network.TileEntityRadioTorchBase; +import com.hbm.tileentity.network.TileEntityRadioTorchLogic; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import net.minecraft.block.Block; @@ -39,6 +40,14 @@ public class RenderRTTY implements ISimpleBlockRenderingHandler { icon = block.getIcon(1, 0); } } + //consequences of my actions + if(tile instanceof TileEntityRadioTorchLogic) { + TileEntityRadioTorchLogic rtty = (TileEntityRadioTorchLogic) tile; + + if(rtty.lastState > 0) { + icon = block.getIcon(1, 0); + } + } float flip = 0; float rotation = 0; diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index ca90591b5..b64de7096 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -399,6 +399,7 @@ public class TileMappings { put(TileEntityRadioTorchSender.class, "tileentity_rtty_sender"); put(TileEntityRadioTorchReceiver.class, "tileentity_rtty_rec"); put(TileEntityRadioTorchCounter.class, "tileentity_rtty_counter"); + put(TileEntityRadioTorchLogic.class, "tileentity_rtty_logic"); put(TileEntityRadioTelex.class, "tileentity_rtty_telex"); put(TileEntityDroneWaypoint.class, "tileentity_drone_waypoint"); diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchLogic.java b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchLogic.java new file mode 100644 index 000000000..b5d87c8bf --- /dev/null +++ b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchLogic.java @@ -0,0 +1,193 @@ +package com.hbm.tileentity.network; + +import com.hbm.interfaces.IControlReceiver; +import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.network.RTTYSystem.RTTYChannel; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MathHelper; + +public class TileEntityRadioTorchLogic extends TileEntity implements INBTPacketReceiver, IControlReceiver { + + /** channel we're broadcasting on/listening to */ + public String channel = ""; + /** previous redstone state for input/output, needed for state change detection */ + public int lastState = 0; + /** last update tick, needed for receivers listening for changes */ + public long lastUpdate; + /** switches state change mode to tick-based polling */ + public boolean polling = false; + /** switches evaluation of conditions from ascending to descending */ + public boolean descending = false; + /** mapping for constants to compare against */ + public String[] mapping; + /** mapping for conditions through [1, 10], being (<, <=, >=, >, ==, !=, equals, !equals, contains, !contains) */ + public int[] conditions; + + public TileEntityRadioTorchLogic() { + this.mapping = new String[16]; + for(int i = 0; i < 16; i++) this.mapping[i] = ""; + this.conditions = new int[16]; + for(int i = 0; i < 16; i++) this.conditions[i] = 0; + } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + if(!this.channel.isEmpty()) { + + RTTYChannel chan = RTTYSystem.listen(worldObj, this.channel); + + if(chan != null && (this.polling || (chan.timeStamp > this.lastUpdate - 1 && chan.timeStamp != -1))) { // if we're either polling or a new message has come in + String msg = "" + chan.signal; + this.lastUpdate = worldObj.getTotalWorldTime(); + int nextState = 0; //if no remap apply, default to 0 + + if(chan.timeStamp < this.lastUpdate - 2 && this.polling) { + /* the vast majority use-case for this is going to be inequalities, NOT parsing, and the input is undefined - not the output + * if no signal => 0 for polling, advanced users parsing strings can easily accommodate this fact instead of breaking numerical torches */ + msg = "0"; + } + + if(descending) { + for(int i = 15; i >= 0; i--) { + if(!mapping[i].equals("") && parseSignal(msg, i)) { + nextState = i; + break; + } + } + } else { + for(int i = 0; i <= 15; i++) { + if(!mapping[i].equals("") && parseSignal(msg, i)) { + nextState = i; + break; + } + } + } + + if(this.lastState != nextState) { + this.lastState = nextState; + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, this.getBlockType()); + this.markDirty(); + } + } + } + + NBTTagCompound data = new NBTTagCompound(); + data.setBoolean("p", polling); + data.setBoolean("d", descending); + if(channel != null) data.setString("c", channel); + for(int i = 0; i < 16; i++) if(!mapping[i].equals("")) data.setString("m" + i, mapping[i]); + for(int i = 0; i < 16; i++) if(conditions[i] > 0) data.setInteger("c" + i, conditions[i]); + INBTPacketReceiver.networkPack(this, data, 50); + } + } + + public boolean parseSignal(String signal, int index) { + if(conditions[index] <= 5) { //if a non-string operator + int sig = 0; + int map = 0; + try { sig = Integer.parseInt(signal); map = Integer.parseInt(mapping[index]); } catch(Exception x) { + return false; //not a valid input; skip! slightly annoying about the mapping but we'll restrict input anyway + }; + + switch(conditions[index]) { + default: + return sig < map; + case 1: + return sig <= map; + case 2: + return sig >= map; + case 3: + return sig > map; + case 4: + return sig == map; + case 5: + return sig != map; + } + } + + switch(conditions[index]) { + default: + return signal.equals(mapping[index]); + case 7: + return !signal.equals(mapping[index]); + case 8: + return signal.contains(mapping[index]); + case 9: + return !signal.contains(mapping[index]); + } + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.polling = nbt.getBoolean("p"); + this.descending = nbt.getBoolean("d"); + this.lastState = nbt.getInteger("l"); + this.lastUpdate = nbt.getLong("u"); + this.channel = nbt.getString("c"); + for(int i = 0; i < 16; i++) this.mapping[i] = nbt.getString("m" + i); + for(int i = 0; i < 16; i++) this.conditions[i] = nbt.getInteger("c" + i); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setBoolean("p", polling); + nbt.setBoolean("d", descending); + nbt.setInteger("l", lastState); + nbt.setLong("u", lastUpdate); + if(channel != null) nbt.setString("c", channel); + for(int i = 0; i < 16; i++) if(!mapping[i].equals("")) nbt.setString("m" + i, mapping[i]); + for(int i = 0; i < 16; i++) if(conditions[i] > 0) nbt.setInteger("c" + i, conditions[i]); + } + + public void networkUnpack(NBTTagCompound nbt) { + this.polling = nbt.getBoolean("p"); + this.channel = nbt.getString("c"); + this.descending = nbt.getBoolean("d"); + for(int i = 0; i < 16; i++) this.mapping[i] = nbt.getString("m" + i); + for(int i = 0; i < 16; i++) this.conditions[i] = nbt.getInteger("c" + i); + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setByte("l", (byte) this.lastState); + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + int last = this.lastState; + this.lastState = pkt.func_148857_g().getByte("l"); + if(this.lastState != last) { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + + @Override + public boolean hasPermission(EntityPlayer player) { + return player.getDistance(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 16D; + } + + @Override + public void receiveControl(NBTTagCompound data) { + if(data.hasKey("p")) this.polling = data.getBoolean("p"); + if(data.hasKey("c")) this.channel = data.getString("c"); + if(data.hasKey("d")) this.descending = data.getBoolean("d"); + for(int i = 0; i < 16; i++) if(data.hasKey("m" + i)) this.mapping[i] = data.getString("m" + i); + for(int i = 0; i < 16; i++) if(data.hasKey("c" + i)) this.conditions[i] = data.getInteger("c" + i); + + this.markDirty(); + } +} diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 872fd2161..b930e3455 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -814,6 +814,7 @@ container.reix=Rei-X Mainframe container.rtg=RT Generator container.rtgFurnace=RTG Furnace container.rttyCounter=Redstone-over-Radio Item Counter +container.rttyLogic=Redstone-over-Radio Logic Receiver container.rttyReceiver=Redstone-over-Radio Receiver container.rttySender=Redstone-over-Radio Transmitter container.safe=Safe @@ -926,6 +927,16 @@ desc.gui.nukeGadget.desc=§1Requires:§r$ * 4 Arrays of First-Generation$ High desc.gui.nukeMan.desc=§1Requires:§r$ * 4 Arrays of First-Generation$ High-Explosive Lenses$ * Plutonium Core$ * Bomb Firing Unit desc.gui.nukeMike.desc=§1Requires:§r$ * 4 Arrays of High-Explosive Lenses$ * Plutonium Core$ * Deuterium Cooling Unit$ * Uranium Coated Deuterium Tank$ * Deuterium Tank desc.gui.nukeTsar.desc=§1Requires:§r$ * 4 Arrays of High-Explosive Lenses$ * Plutonium Core$§9Optional:§r$ * Tsar Bomba Core +desc.gui.rttyLogic.cond0=Signal §6LESS THAN§r Constant +desc.gui.rttyLogic.cond1=Signal §6LESS THAN OR EQUAL TO§r Constant +desc.gui.rttyLogic.cond2=Signal §6GREATER THAN OR EQUAL TO§r Constant +desc.gui.rttyLogic.cond3=Signal §6GREATER THAN§r Constant +desc.gui.rttyLogic.cond4=Signal §6EQUAL TO§r Constant +desc.gui.rttyLogic.cond5=Signal §6NOT EQUAL TO§r Constant +desc.gui.rttyLogic.cond6=Signal §6MATCHES§r String +desc.gui.rttyLogic.cond7=Signal §6DOES NOT MATCH§r String +desc.gui.rttyLogic.cond8=Signal §6CONTAINS§r String +desc.gui.rttyLogic.cond9=Signal §6DOES NOT CONTAIN§r String desc.gui.radiolysis.desc=§9Description§r$This RTG is more efficient then others, and$comes equipped with a radiolysis chamber for$cracking and sterilization. desc.gui.rtgBFurnace.desc=Requires at least 15 heat to process$The more heat on top of that, the faster it runs$Heat going over maximum speed will have no effect$Short-lived pellets may decay desc.gui.rtg.heat=§eCurrent heat level: %s @@ -5489,6 +5500,8 @@ tile.radar_screen.name=Radar Screen tile.radio_telex.name=Telex Machine 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_logic.name=Redstone-over-Radio Logic Receiver +tile.radio_torch_logic.desc=Placable on flat surfaces or comparator-compatible blocks$Maps redstone signals to conditions evaluated in a set order$Numerical or string inputs are compared against a constant 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_logic_off.png b/src/main/resources/assets/hbm/textures/blocks/rtty_logic_off.png new file mode 100644 index 0000000000000000000000000000000000000000..789d461f45e5389bc0e0a27b54ad018338a041ba GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!7@)5#}EtuWC_-0**~>MKghQ%j9Jsb>6Oed z;n@8}Z9Mu7S{#y1q75d0fA0Tl&oLpDf#Xl@$q)a}>Kd6gJEW#Qtv5C{{&a|eWyg*k z694}GW`8=7QRADFhsTL}XJ_Y6dlxKR=y-vNn{1`ISV`@iy0XB4ude`@%$AjK*3d>E{-7{-pLZI&9Z+|6Mpa?3ed}BSn}~d zufjX^%K{r1|1W3$Sbr*JKfb@0pW@CpeStWyyCEO8kHR!D?;3rxTewPWV*B2K?O8b?}XY*pznJ3)^fK?C_B0ddkSm%<#=L VS^rs5Qa{ku44$rjF6*2UngD0!X;1(F literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/rtty_logic_on.png.mcmeta b/src/main/resources/assets/hbm/textures/blocks/rtty_logic_on.png.mcmeta new file mode 100644 index 000000000..efc331201 --- /dev/null +++ b/src/main/resources/assets/hbm/textures/blocks/rtty_logic_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 10 + } +} diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_rtty_logic_receiver.png b/src/main/resources/assets/hbm/textures/gui/machine/gui_rtty_logic_receiver.png new file mode 100644 index 0000000000000000000000000000000000000000..568aa79ad00259f00b8f6fe28ed8adb779b510e4 GIT binary patch literal 4233 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