diff --git a/src/main/java/malte0811/industrialWires/CommonProxy.java b/src/main/java/malte0811/industrialWires/CommonProxy.java
index 3d4ba8d..760dd10 100644
--- a/src/main/java/malte0811/industrialWires/CommonProxy.java
+++ b/src/main/java/malte0811/industrialWires/CommonProxy.java
@@ -23,6 +23,7 @@ import malte0811.industrialWires.blocks.controlpanel.TileEntityRSPanelConn;
import malte0811.industrialWires.containers.ContainerPanelComponent;
import malte0811.industrialWires.containers.ContainerPanelCreator;
import malte0811.industrialWires.containers.ContainerRSPanelConn;
+import malte0811.industrialWires.containers.ContainerRenameKey;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.item.ItemStack;
@@ -60,8 +61,12 @@ public class CommonProxy implements IGuiHandler {
} else if (ID == 1) {//ITEM GUI
EnumHand h = z == 1 ? EnumHand.MAIN_HAND : EnumHand.OFF_HAND;
ItemStack held = player.getHeldItem(h);
- if (held != null && held.getItem() == IndustrialWires.panelComponent) {
- return new ContainerPanelComponent(h);
+ if (held!=null) {
+ if (held.getItem() == IndustrialWires.panelComponent) {
+ return new ContainerPanelComponent(h);
+ } else if (held.getItem() == IndustrialWires.key) {
+ return new ContainerRenameKey(h);
+ }
}
}
return null;
diff --git a/src/main/java/malte0811/industrialWires/IndustrialWires.java b/src/main/java/malte0811/industrialWires/IndustrialWires.java
index 49eaba0..85e8648 100644
--- a/src/main/java/malte0811/industrialWires/IndustrialWires.java
+++ b/src/main/java/malte0811/industrialWires/IndustrialWires.java
@@ -35,10 +35,12 @@ import malte0811.industrialWires.blocks.converter.TileEntityMechIEtoIC;
import malte0811.industrialWires.blocks.wire.*;
import malte0811.industrialWires.controlpanel.PanelUtils;
import malte0811.industrialWires.crafting.RecipeCoilLength;
+import malte0811.industrialWires.crafting.RecipeKeyLock;
import malte0811.industrialWires.items.ItemIC2Coil;
+import malte0811.industrialWires.items.ItemKey;
import malte0811.industrialWires.items.ItemPanelComponent;
-import malte0811.industrialWires.network.MessageComponentSync;
import malte0811.industrialWires.network.MessageGUIInteract;
+import malte0811.industrialWires.network.MessageItemSync;
import malte0811.industrialWires.network.MessagePanelInteract;
import malte0811.industrialWires.network.MessageTileSyncIW;
import malte0811.industrialWires.wires.IC2Wiretype;
@@ -74,6 +76,7 @@ public class IndustrialWires {
public static BlockPanel panel;
public static ItemIC2Coil coil;
public static ItemPanelComponent panelComponent;
+ public static ItemKey key;
public static final SimpleNetworkWrapper packetHandler = NetworkRegistry.INSTANCE.newSimpleChannel(MODID);
@Mod.Instance(MODID)
public static IndustrialWires instance = new IndustrialWires();
@@ -97,8 +100,12 @@ public class IndustrialWires {
if (IWConfig.enableConversion)
mechConv = new BlockMechanicalConverter();
jacobsLadder = new BlockJacobsLadder();
+ panel = new BlockPanel();
+
coil = new ItemIC2Coil();
panelComponent = new ItemPanelComponent();
+
+ key = new ItemKey();
panel = new BlockPanel();
GameRegistry.registerTileEntity(TileEntityIC2ConnectorTin.class, "ic2ConnectorTin");
GameRegistry.registerTileEntity(TileEntityIC2ConnectorCopper.class, "ic2ConnectorCopper");
@@ -195,13 +202,15 @@ public class IndustrialWires {
"stickIron", Blocks.LEVER, "wireCopper"));
GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(panelComponent, 1, 6),
"aaa", "asa", 'a', "plateAluminum", 's', new ItemStack(panelComponent, 2, 5)));
+ RecipeSorter.register("industrialwires:key_lock", RecipeKeyLock.class, Category.SHAPELESS, "after:forge:shapelessore");
+ GameRegistry.addRecipe(new RecipeKeyLock());
ExtraIC2Compat.addToolConmpat();
packetHandler.registerMessage(MessageTileSyncIW.HandlerClient.class, MessageTileSyncIW.class, 0, Side.CLIENT);
packetHandler.registerMessage(MessagePanelInteract.HandlerServer.class, MessagePanelInteract.class, 1, Side.SERVER);
packetHandler.registerMessage(MessageGUIInteract.HandlerServer.class, MessageGUIInteract.class, 2, Side.SERVER);
- packetHandler.registerMessage(MessageComponentSync.HandlerServer.class, MessageComponentSync.class, 3, Side.SERVER);
+ packetHandler.registerMessage(MessageItemSync.HandlerServer.class, MessageItemSync.class, 3, Side.SERVER);
NetworkRegistry.INSTANCE.registerGuiHandler(instance, proxy);
}
diff --git a/src/main/java/malte0811/industrialWires/client/ClientProxy.java b/src/main/java/malte0811/industrialWires/client/ClientProxy.java
index 50f15ec..1244de5 100644
--- a/src/main/java/malte0811/industrialWires/client/ClientProxy.java
+++ b/src/main/java/malte0811/industrialWires/client/ClientProxy.java
@@ -37,6 +37,7 @@ import malte0811.industrialWires.blocks.controlpanel.TileEntityRSPanelConn;
import malte0811.industrialWires.client.gui.GuiPanelComponent;
import malte0811.industrialWires.client.gui.GuiPanelCreator;
import malte0811.industrialWires.client.gui.GuiRSPanelConn;
+import malte0811.industrialWires.client.gui.GuiRenameKey;
import malte0811.industrialWires.client.panelmodel.PanelModelLoader;
import malte0811.industrialWires.client.render.TileRenderJacobsLadder;
import malte0811.industrialWires.controlpanel.PanelComponent;
@@ -284,8 +285,12 @@ public class ClientProxy extends CommonProxy {
} else if (ID == 1) {
EnumHand h = z == 1 ? EnumHand.MAIN_HAND : EnumHand.OFF_HAND;
ItemStack held = player.getHeldItem(h);
- if (held != null && held.getItem() == IndustrialWires.panelComponent) {
- return new GuiPanelComponent(h, ItemPanelComponent.componentFromStack(held));
+ if (held!=null) {
+ if (held.getItem() == IndustrialWires.panelComponent) {
+ return new GuiPanelComponent(h, ItemPanelComponent.componentFromStack(held));
+ } else if (held.getItem() == IndustrialWires.key) {
+ return new GuiRenameKey(h);
+ }
}
}
return null;
diff --git a/src/main/java/malte0811/industrialWires/client/gui/GuiPanelComponent.java b/src/main/java/malte0811/industrialWires/client/gui/GuiPanelComponent.java
index 1f2c8d0..50d209a 100644
--- a/src/main/java/malte0811/industrialWires/client/gui/GuiPanelComponent.java
+++ b/src/main/java/malte0811/industrialWires/client/gui/GuiPanelComponent.java
@@ -11,7 +11,8 @@ import malte0811.industrialWires.client.gui.elements.GuiIntChooser;
import malte0811.industrialWires.containers.ContainerPanelComponent;
import malte0811.industrialWires.controlpanel.IConfigurableComponent;
import malte0811.industrialWires.controlpanel.PanelComponent;
-import malte0811.industrialWires.network.MessageComponentSync;
+import malte0811.industrialWires.items.ItemPanelComponent;
+import malte0811.industrialWires.network.MessageItemSync;
import net.minecraft.client.gui.Gui;
import net.minecraft.client.gui.GuiTextField;
import net.minecraft.client.gui.inventory.GuiContainer;
@@ -245,41 +246,41 @@ public class GuiPanelComponent extends GuiContainer {
private void sync(int id, String value) {
NBTTagCompound update = new NBTTagCompound();
- update.setInteger(MessageComponentSync.TYPE, IConfigurableComponent.ConfigType.STRING.ordinal());
- update.setInteger(MessageComponentSync.ID, id);
- update.setString(MessageComponentSync.VALUE, value);
+ update.setInteger(ItemPanelComponent.TYPE, IConfigurableComponent.ConfigType.STRING.ordinal());
+ update.setInteger(ItemPanelComponent.ID, id);
+ update.setString(ItemPanelComponent.VALUE, value);
syncSingle(update);
}
private void sync(int id, boolean value) {
NBTTagCompound update = new NBTTagCompound();
- update.setInteger(MessageComponentSync.TYPE, IConfigurableComponent.ConfigType.BOOL.ordinal());
- update.setInteger(MessageComponentSync.ID, id);
- update.setBoolean(MessageComponentSync.VALUE, value);
+ update.setInteger(ItemPanelComponent.TYPE, IConfigurableComponent.ConfigType.BOOL.ordinal());
+ update.setInteger(ItemPanelComponent.ID, id);
+ update.setBoolean(ItemPanelComponent.VALUE, value);
syncSingle(update);
}
private void sync(int id, byte value) {
NBTTagCompound update = new NBTTagCompound();
- update.setInteger(MessageComponentSync.TYPE, IConfigurableComponent.ConfigType.RS_CHANNEL.ordinal());
- update.setInteger(MessageComponentSync.ID, id);
- update.setByte(MessageComponentSync.VALUE, value);
+ update.setInteger(ItemPanelComponent.TYPE, IConfigurableComponent.ConfigType.RS_CHANNEL.ordinal());
+ update.setInteger(ItemPanelComponent.ID, id);
+ update.setByte(ItemPanelComponent.VALUE, value);
syncSingle(update);
}
private void sync(int id, int value) {
NBTTagCompound update = new NBTTagCompound();
- update.setInteger(MessageComponentSync.TYPE, IConfigurableComponent.ConfigType.INT.ordinal());
- update.setInteger(MessageComponentSync.ID, id);
- update.setInteger(MessageComponentSync.VALUE, value);
+ update.setInteger(ItemPanelComponent.TYPE, IConfigurableComponent.ConfigType.INT.ordinal());
+ update.setInteger(ItemPanelComponent.ID, id);
+ update.setInteger(ItemPanelComponent.VALUE, value);
syncSingle(update);
}
private void sync(int id, float value) {
NBTTagCompound update = new NBTTagCompound();
- update.setInteger(MessageComponentSync.TYPE, IConfigurableComponent.ConfigType.FLOAT.ordinal());
- update.setInteger(MessageComponentSync.ID, id);
- update.setFloat(MessageComponentSync.VALUE, value);
+ update.setInteger(ItemPanelComponent.TYPE, IConfigurableComponent.ConfigType.FLOAT.ordinal());
+ update.setInteger(ItemPanelComponent.ID, id);
+ update.setFloat(ItemPanelComponent.VALUE, value);
syncSingle(update);
}
@@ -287,37 +288,37 @@ public class GuiPanelComponent extends GuiContainer {
NBTTagList list = new NBTTagList();
for (int i = 0; i < stringTexts.size(); i++) {
NBTTagCompound update = new NBTTagCompound();
- update.setInteger(MessageComponentSync.TYPE, IConfigurableComponent.ConfigType.STRING.ordinal());
- update.setInteger(MessageComponentSync.ID, i);
- update.setString(MessageComponentSync.VALUE, stringTexts.get(i).getText());
+ update.setInteger(ItemPanelComponent.TYPE, IConfigurableComponent.ConfigType.STRING.ordinal());
+ update.setInteger(ItemPanelComponent.ID, i);
+ update.setString(ItemPanelComponent.VALUE, stringTexts.get(i).getText());
list.appendTag(update);
}
for (int i = 0; i < boolButtons.size(); i++) {
NBTTagCompound update = new NBTTagCompound();
- update.setInteger(MessageComponentSync.TYPE, IConfigurableComponent.ConfigType.BOOL.ordinal());
- update.setInteger(MessageComponentSync.ID, i);
- update.setBoolean(MessageComponentSync.VALUE, boolButtons.get(i).state);
+ update.setInteger(ItemPanelComponent.TYPE, IConfigurableComponent.ConfigType.BOOL.ordinal());
+ update.setInteger(ItemPanelComponent.ID, i);
+ update.setBoolean(ItemPanelComponent.VALUE, boolButtons.get(i).state);
list.appendTag(update);
}
for (int i = 0; i < rsChannelChoosers.size(); i++) {
NBTTagCompound update = new NBTTagCompound();
- update.setInteger(MessageComponentSync.TYPE, IConfigurableComponent.ConfigType.RS_CHANNEL.ordinal());
- update.setInteger(MessageComponentSync.ID, i);
- update.setByte(MessageComponentSync.VALUE, rsChannelChoosers.get(i).getSelected());
+ update.setInteger(ItemPanelComponent.TYPE, IConfigurableComponent.ConfigType.RS_CHANNEL.ordinal());
+ update.setInteger(ItemPanelComponent.ID, i);
+ update.setByte(ItemPanelComponent.VALUE, rsChannelChoosers.get(i).getSelected());
list.appendTag(update);
}
for (int i = 0; i < intChoosers.size(); i++) {
NBTTagCompound update = new NBTTagCompound();
- update.setInteger(MessageComponentSync.TYPE, IConfigurableComponent.ConfigType.INT.ordinal());
- update.setInteger(MessageComponentSync.ID, i);
- update.setInteger(MessageComponentSync.VALUE, intChoosers.get(i).getValue());
+ update.setInteger(ItemPanelComponent.TYPE, IConfigurableComponent.ConfigType.INT.ordinal());
+ update.setInteger(ItemPanelComponent.ID, i);
+ update.setInteger(ItemPanelComponent.VALUE, intChoosers.get(i).getValue());
list.appendTag(update);
}
for (int i = 0; i < floatSliders.size(); i++) {
NBTTagCompound update = new NBTTagCompound();
- update.setInteger(MessageComponentSync.TYPE, IConfigurableComponent.ConfigType.FLOAT.ordinal());
- update.setInteger(MessageComponentSync.ID, i);
- update.setFloat(MessageComponentSync.VALUE, (float) floatSliders.get(i).getValue());
+ update.setInteger(ItemPanelComponent.TYPE, IConfigurableComponent.ConfigType.FLOAT.ordinal());
+ update.setInteger(ItemPanelComponent.ID, i);
+ update.setFloat(ItemPanelComponent.VALUE, (float) floatSliders.get(i).getValue());
list.appendTag(update);
}
sync(list);
@@ -332,6 +333,6 @@ public class GuiPanelComponent extends GuiContainer {
private void sync(NBTTagList list) {
NBTTagCompound nbt = new NBTTagCompound();
nbt.setTag("data", list);
- IndustrialWires.packetHandler.sendToServer(new MessageComponentSync(container.hand, nbt));
+ IndustrialWires.packetHandler.sendToServer(new MessageItemSync(container.hand, nbt));
}
}
\ No newline at end of file
diff --git a/src/main/java/malte0811/industrialWires/client/gui/GuiRenameKey.java b/src/main/java/malte0811/industrialWires/client/gui/GuiRenameKey.java
new file mode 100644
index 0000000..e56f600
--- /dev/null
+++ b/src/main/java/malte0811/industrialWires/client/gui/GuiRenameKey.java
@@ -0,0 +1,106 @@
+/*
+ * This file is part of Industrial Wires.
+ * Copyright (C) 2016-2017 malte0811
+ *
+ * Industrial Wires is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Industrial Wires is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Industrial Wires. If not, see .
+ */
+
+package malte0811.industrialWires.client.gui;
+
+import malte0811.industrialWires.IndustrialWires;
+import malte0811.industrialWires.containers.ContainerRenameKey;
+import malte0811.industrialWires.network.MessageItemSync;
+import net.minecraft.client.gui.Gui;
+import net.minecraft.client.gui.GuiTextField;
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.client.renderer.GlStateManager;
+import net.minecraft.client.renderer.RenderHelper;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumHand;
+import net.minecraft.util.ResourceLocation;
+
+import java.io.IOException;
+
+public class GuiRenameKey extends GuiContainer {
+ private EnumHand hand;
+ private GuiTextField field;
+
+ public GuiRenameKey(EnumHand h) {
+ super(new ContainerRenameKey(h));
+ hand = h;
+ }
+
+ @Override
+ public void initGui() {
+ super.initGui();
+ field = new GuiTextField(0, mc.fontRenderer, (width-58)/2, (height-12)/2, 58, 12);
+ ItemStack held = mc.player.getHeldItem(hand);
+ NBTTagCompound nbt = held.getTagCompound();
+ if (nbt!=null&&nbt.hasKey("name")) {
+ field.setText(nbt.getString("name"));
+ }
+ xSize = 64;
+ ySize = 64;
+ guiLeft = (width - xSize) / 2;
+ guiTop = (height - ySize) / 2;
+ }
+
+ @Override
+ public void drawScreen(int mouseX, int mouseY, float partialTicks) {
+ super.drawScreen(mouseX, mouseY, partialTicks);
+ GlStateManager.color(1, 1, 1, 1);
+ RenderHelper.disableStandardItemLighting();
+ field.drawTextBox();
+ RenderHelper.enableStandardItemLighting();
+ }
+
+ private ResourceLocation textureLoc = new ResourceLocation(IndustrialWires.MODID, "textures/gui/rs_wire_controller.png");
+
+ @Override
+ protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) {
+ GlStateManager.color(1, 1, 1, 1);
+ mc.getTextureManager().bindTexture(textureLoc);
+ Gui.drawModalRectWithCustomSizedTexture(guiLeft, guiTop, 0, 0, xSize, ySize, 64, 64);
+ }
+
+ @Override
+ public boolean doesGuiPauseGame() {
+ return false;
+ }
+
+ @Override
+ protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException {
+ super.mouseClicked(mouseX, mouseY, mouseButton);
+ field.mouseClicked(mouseX, mouseY, mouseButton);
+ }
+
+ @Override
+ protected void keyTyped(char typedChar, int keyCode) throws IOException {
+ if (!field.textboxKeyTyped(typedChar, keyCode)) {
+ super.keyTyped(typedChar, keyCode);
+ }
+ }
+
+ @Override
+ public void onGuiClosed() {
+ super.onGuiClosed();
+ if (!field.getText().isEmpty()) {
+ NBTTagCompound nbt = new NBTTagCompound();
+ nbt.setString("name", field.getText());
+ IndustrialWires.packetHandler.sendToServer(new MessageItemSync(hand, nbt));
+ }
+ }
+
+}
diff --git a/src/main/java/malte0811/industrialWires/containers/ContainerRenameKey.java b/src/main/java/malte0811/industrialWires/containers/ContainerRenameKey.java
new file mode 100644
index 0000000..4e8c6bd
--- /dev/null
+++ b/src/main/java/malte0811/industrialWires/containers/ContainerRenameKey.java
@@ -0,0 +1,39 @@
+/*
+ * This file is part of Industrial Wires.
+ * Copyright (C) 2016-2017 malte0811
+ *
+ * Industrial Wires is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Industrial Wires is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Industrial Wires. If not, see .
+ */
+
+package malte0811.industrialWires.containers;
+
+import malte0811.industrialWires.IndustrialWires;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.util.EnumHand;
+
+import javax.annotation.Nonnull;
+
+public class ContainerRenameKey extends Container {
+ private final EnumHand hand;
+
+ public ContainerRenameKey(EnumHand h) {
+ hand = h;
+ }
+
+ @Override
+ public boolean canInteractWith(@Nonnull EntityPlayer playerIn) {
+ return playerIn.getHeldItem(hand).getItem()== IndustrialWires.key;
+ }
+}
diff --git a/src/main/java/malte0811/industrialWires/controlpanel/LightedButton.java b/src/main/java/malte0811/industrialWires/controlpanel/LightedButton.java
index cb36439..59e61b4 100644
--- a/src/main/java/malte0811/industrialWires/controlpanel/LightedButton.java
+++ b/src/main/java/malte0811/industrialWires/controlpanel/LightedButton.java
@@ -64,8 +64,8 @@ public class LightedButton extends PanelComponent implements IConfigurableCompon
@Override
protected void writeCustomNBT(NBTTagCompound nbt, boolean toItem) {
nbt.setInteger(COLOR, color);
- nbt.setInteger("timeout", ticksTillOff);
if (!toItem) {
+ nbt.setInteger("timeout", ticksTillOff);
nbt.setBoolean("active", active);
}
nbt.setBoolean(LATCHING, latching);
diff --git a/src/main/java/malte0811/industrialWires/controlpanel/Lock.java b/src/main/java/malte0811/industrialWires/controlpanel/Lock.java
new file mode 100644
index 0000000..b2e174b
--- /dev/null
+++ b/src/main/java/malte0811/industrialWires/controlpanel/Lock.java
@@ -0,0 +1,355 @@
+/*
+ * This file is part of Industrial Wires.
+ * Copyright (C) 2016-2017 malte0811
+ *
+ * Industrial Wires is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Industrial Wires is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Industrial Wires. If not, see .
+ */
+
+package malte0811.industrialWires.controlpanel;
+
+import blusunrize.immersiveengineering.common.util.chickenbones.Matrix4;
+import malte0811.industrialWires.IndustrialWires;
+import malte0811.industrialWires.blocks.controlpanel.TileEntityPanel;
+import malte0811.industrialWires.client.RawQuad;
+import malte0811.industrialWires.client.gui.GuiPanelCreator;
+import malte0811.industrialWires.items.ItemKey;
+import net.minecraft.client.resources.I18n;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagByte;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagInt;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.EnumHand;
+import net.minecraft.util.math.AxisAlignedBB;
+import net.minecraft.util.math.Vec3d;
+import org.lwjgl.util.vector.Vector3f;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.*;
+import java.util.function.BiConsumer;
+
+//TODO drop key when broken
+public class Lock extends PanelComponent implements IConfigurableComponent {
+ private final static Random rand = new Random();
+ @Nullable
+ private NBTTagCompound keyNBT;
+ private boolean turned;
+ private boolean latching = false;
+ private int rsOutputId;
+ private int rsOutputChannel;
+ private int ticksTillOff;
+ private int lockID;
+ private Set> rsOut = new HashSet<>();
+
+ public Lock() {
+ super("lock");
+ }
+
+ public Lock(boolean latching, int rsOutputId, int rsOutputChannel) {
+ this();
+ this.latching = latching;
+ this.rsOutputChannel = rsOutputChannel;
+ this.rsOutputId = rsOutputId;
+ while (lockID==0) {
+ lockID = rand.nextInt();
+ }
+ }
+
+ @Override
+ protected void writeCustomNBT(NBTTagCompound nbt, boolean toItem) {
+ if (!toItem) {
+ nbt.setInteger("timeout", ticksTillOff);
+ nbt.setBoolean("turned", turned);
+ if (keyNBT != null) {
+ nbt.setTag("key", keyNBT);
+ }
+ }
+ nbt.setInteger("lockId", lockID);
+ nbt.setBoolean(LATCHING, latching);
+ nbt.setInteger(RS_CHANNEL, rsOutputChannel);
+ nbt.setInteger(RS_ID, rsOutputId);
+ }
+
+ @Override
+ protected void readCustomNBT(NBTTagCompound nbt) {
+ ticksTillOff = nbt.getInteger("timeout");
+ if (nbt.hasKey("key", 10)) {
+ keyNBT = nbt.getCompoundTag("key");
+ } else {
+ keyNBT = null;
+ }
+ turned = nbt.getBoolean("turned");
+ if (nbt.hasKey("lockId")) {
+ lockID = nbt.getInteger("lockId");
+ }
+ latching = nbt.getBoolean(LATCHING);
+ rsOutputChannel = nbt.getInteger(RS_CHANNEL);
+ rsOutputId = nbt.getInteger(RS_ID);
+ }
+
+ private final static float size = .0625F;
+ private final static float keyWidth = .125F * size;
+ private final static float yOffset = size / 2 + .0001F;
+ private final static float xOffset = (size - keyWidth) / 2;
+ private final static float[] DARK_GRAY = {.4F, .4F, .4F};
+ private final static float zOffset = keyWidth / 2;
+ private final static float keyOffset = keyWidth;
+ private final static float zOffsetLowerKey = size / 3;
+
+
+ @Override
+ public List getQuads() {
+ List ret = new ArrayList<>(5);
+ PanelUtils.addColoredBox(GRAY, GRAY, null, new Vector3f(0, 0, 0), new Vector3f(size, size / 2, size), ret, false);
+ if (keyNBT != null) {
+ Matrix4 mat = null;
+ if (turned) {
+ mat = new Matrix4();
+ mat.translate(size / 2, 0, size / 2);
+ mat.rotate(Math.PI / 2, 0, 1, 0);
+ mat.translate(-size / 2, 0, -size / 2);
+ }
+ addKey(ret, mat);
+ } else {
+ PanelUtils.addColoredQuad(ret, new Vector3f(xOffset + keyWidth, yOffset, zOffset), new Vector3f(xOffset, yOffset, zOffset),
+ new Vector3f(xOffset, yOffset, size - zOffset), new Vector3f(xOffset + keyWidth, yOffset, size - zOffset),
+ EnumFacing.UP, DARK_GRAY);
+ }
+ return ret;
+ }
+
+ private void addKey(List out, Matrix4 mat) {
+ PanelUtils.addColoredBox(DARK_GRAY, DARK_GRAY, null, new Vector3f(xOffset, size / 2, zOffsetLowerKey), new Vector3f(keyWidth, keyOffset, size / 3), out, false, mat);
+ PanelUtils.addColoredBox(DARK_GRAY, DARK_GRAY, null, new Vector3f(xOffset, size / 2 + keyOffset, zOffset), new Vector3f(keyWidth, size, size - 2 * zOffset), out, false, mat);
+ }
+
+ @Override
+ @Nonnull
+ public PanelComponent copyOf() {
+ Lock ret = new Lock(latching, rsOutputId, rsOutputChannel);
+ ret.turned = turned;
+ ret.keyNBT = keyNBT == null ? null : keyNBT.copy();
+ ret.ticksTillOff = ticksTillOff;
+ ret.setX(x);
+ ret.setY(y);
+ ret.panelHeight = panelHeight;
+ return ret;
+ }
+
+ @Nonnull
+ @Override
+ public AxisAlignedBB getBlockRelativeAABB() {
+ if (aabb == null) {
+ aabb = new AxisAlignedBB(x, 0, y, x + size, getHeight(), y + size);
+ }
+ return aabb;
+ }
+
+ @Override
+ public void interactWith(Vec3d hitRel, TileEntityPanel tile, EntityPlayerMP player) {
+ boolean update = false;
+ if (keyNBT == null) {
+ for (EnumHand hand : EnumHand.values()) {
+ ItemStack held = player.getHeldItem(hand);
+ if (held.getItem() == IndustrialWires.key && ItemKey.idForKey(held) == lockID) {
+ keyNBT = held.serializeNBT();
+ player.setHeldItem(hand, ItemStack.EMPTY);
+ break;
+ }
+ }
+ } else if (!turned) {
+ if (player.isSneaking() && player.getHeldItemMainhand().isEmpty()) {
+ player.setHeldItem(EnumHand.MAIN_HAND, new ItemStack(keyNBT));
+ keyNBT = null;
+ } else {
+ turned = true;
+ }
+ update = true;
+ } else {
+ if (latching) {
+ turned = false;
+ update = true;
+ } else {
+ ticksTillOff = 10;
+ }
+ }
+ if (update) {
+ setOut(tile);
+ if (!latching && turned) {
+ ticksTillOff = 10;
+ }
+ }
+ tile.markDirty();
+ tile.triggerRenderUpdate();
+ }
+
+ @Override
+ public void update(TileEntityPanel tile) {
+ if (!latching && ticksTillOff > 0) {
+ ticksTillOff--;
+ tile.markDirty();
+ if (ticksTillOff == 0) {
+ turned = false;
+ tile.markDirty();
+ tile.triggerRenderUpdate();
+ setOut(tile);
+ }
+ }
+ }
+
+ @Override
+ public void registerRSOutput(int id, @Nonnull BiConsumer out) {
+ if (id == rsOutputId) {
+ rsOut.add(out);
+ out.accept(rsOutputChannel, (byte) (turned ? 15 : 0));
+ }
+ }
+
+ @Override
+ public void unregisterRSOutput(int id, @Nonnull BiConsumer out) {
+ if (id == rsOutputId) {
+ rsOut.remove(out);
+ }
+ }
+
+ @Override
+ public float getHeight() {
+ return size / 2;
+ }
+
+ @Override
+ public void renderInGUI(GuiPanelCreator gui) {
+ //TODO somethin more fancy?
+ renderInGUIDefault(gui, GRAY_INT);
+ }
+
+ @Override
+ public void invalidate(TileEntityPanel te) {
+ setOut(te);
+ }
+
+ private void setOut(TileEntityPanel tile) {
+ tile.markDirty();
+ tile.triggerRenderUpdate();
+ for (BiConsumer rs : rsOut) {
+ rs.accept(rsOutputChannel, (byte) (turned ? 15 : 0));
+ }
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ if (!super.equals(o)) return false;
+
+ Lock lock = (Lock) o;
+
+ if (turned != lock.turned) return false;
+ if (latching != lock.latching) return false;
+ if (rsOutputId != lock.rsOutputId) return false;
+ if (rsOutputChannel != lock.rsOutputChannel) return false;
+ if (ticksTillOff != lock.ticksTillOff) return false;
+ if (lockID != lock.lockID) return false;
+ if (true) return false;
+ return keyNBT != null ? keyNBT.equals(lock.keyNBT) : lock.keyNBT == null;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = super.hashCode();
+ result = 31 * result + (keyNBT != null ? keyNBT.hashCode() : 0);
+ result = 31 * result + (turned ? 1 : 0);
+ result = 31 * result + (latching ? 1 : 0);
+ result = 31 * result + rsOutputId;
+ result = 31 * result + rsOutputChannel;
+ result = 31 * result + ticksTillOff;
+ result = 31 * result + lockID;
+ return result;
+ }
+
+ @Override
+ public void applyConfigOption(ConfigType type, int id, NBTBase value) {
+ switch (type) {
+ case BOOL:
+ if (id == 0) {
+ latching = ((NBTTagByte) value).getByte() != 0;
+ }
+ break;
+ case RS_CHANNEL:
+ if (id == 0) {
+ rsOutputChannel = ((NBTTagByte) value).getByte();
+ }
+ break;
+ case INT:
+ if (id == 0) {
+ rsOutputId = ((NBTTagInt) value).getInt();
+ }
+ break;
+ }
+ }
+
+ @Override
+ public String fomatConfigName(ConfigType type, int id) {
+ switch (type) {
+ case BOOL:
+ return I18n.format(IndustrialWires.MODID + ".desc.latching");
+ case RS_CHANNEL:
+ case INT:
+ return null;
+ default:
+ return "INVALID";
+ }
+ }
+
+ @Override
+ public String fomatConfigDescription(ConfigType type, int id) {
+ switch (type) {
+ case BOOL:
+ return I18n.format(IndustrialWires.MODID + ".desc.latching_info");
+ case RS_CHANNEL:
+ return I18n.format(IndustrialWires.MODID + ".desc.rschannel_info");
+ case INT:
+ return I18n.format(IndustrialWires.MODID + ".desc.rsid_info");
+ default:
+ return "INVALID?";
+ }
+ }
+
+ @Override
+ public RSChannelConfig[] getRSChannelOptions() {
+ return new RSChannelConfig[]{new RSChannelConfig("channel", 0, 0, (byte) rsOutputChannel)};
+ }
+
+ @Override
+ public IntConfig[] getIntegerOptions() {
+ return new IntConfig[]{new IntConfig("rsId", 0, 50, rsOutputId, 2, false)};
+ }
+
+ @Override
+ public BoolConfig[] getBooleanOptions() {
+ return new BoolConfig[]{new BoolConfig("latching", 0, 70, latching)};
+ }
+
+ @Override
+ public int getColor() {
+ return GRAY_INT;
+ }
+
+ public int getLockID() {
+ return lockID;
+ }
+}
diff --git a/src/main/java/malte0811/industrialWires/controlpanel/PanelComponent.java b/src/main/java/malte0811/industrialWires/controlpanel/PanelComponent.java
index cea87b3..d924052 100644
--- a/src/main/java/malte0811/industrialWires/controlpanel/PanelComponent.java
+++ b/src/main/java/malte0811/industrialWires/controlpanel/PanelComponent.java
@@ -69,6 +69,7 @@ public abstract class PanelComponent {
baseCreaters.put("variac", Variac::new);
baseCreaters.put("toggle_switch", ToggleSwitch::new);
baseCreaters.put("toggle_switch_covered", CoveredToggleSwitch::new);
+ baseCreaters.put("lock", Lock::new);
}
protected abstract void writeCustomNBT(NBTTagCompound nbt, boolean toItem);
diff --git a/src/main/java/malte0811/industrialWires/crafting/RecipeCoilLength.java b/src/main/java/malte0811/industrialWires/crafting/RecipeCoilLength.java
index 2333a98..f216e7b 100644
--- a/src/main/java/malte0811/industrialWires/crafting/RecipeCoilLength.java
+++ b/src/main/java/malte0811/industrialWires/crafting/RecipeCoilLength.java
@@ -51,7 +51,7 @@ public class RecipeCoilLength implements IRecipe {
@Override
public int getRecipeSize() {
- return 0;
+ return 1;
}
@Override
diff --git a/src/main/java/malte0811/industrialWires/crafting/RecipeKeyLock.java b/src/main/java/malte0811/industrialWires/crafting/RecipeKeyLock.java
new file mode 100644
index 0000000..4955bff
--- /dev/null
+++ b/src/main/java/malte0811/industrialWires/crafting/RecipeKeyLock.java
@@ -0,0 +1,111 @@
+/*
+ * This file is part of Industrial Wires.
+ * Copyright (C) 2016-2017 malte0811
+ *
+ * Industrial Wires is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Industrial Wires is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Industrial Wires. If not, see .
+ */
+package malte0811.industrialWires.crafting;
+
+import malte0811.industrialWires.IndustrialWires;
+import malte0811.industrialWires.controlpanel.Lock;
+import malte0811.industrialWires.controlpanel.PanelComponent;
+import malte0811.industrialWires.items.ItemKey;
+import malte0811.industrialWires.items.ItemPanelComponent;
+import net.minecraft.inventory.InventoryCrafting;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.crafting.IRecipe;
+import net.minecraft.util.NonNullList;
+import net.minecraft.world.World;
+
+import javax.annotation.Nonnull;
+//TODO JEI
+public class RecipeKeyLock implements IRecipe {
+
+ @Override
+ public boolean matches(@Nonnull InventoryCrafting inv, @Nonnull World worldIn) {
+ return getLockId(inv) != 0;
+ }
+
+ @Nonnull
+ @Override
+ public ItemStack getCraftingResult(@Nonnull InventoryCrafting inv) {
+ ItemStack ret = getKey(inv).copy();
+ ItemKey.setId(ret, getLockId(inv));
+ return ret;
+ }
+
+ @Override
+ public int getRecipeSize() {
+ return 2;
+ }
+
+ @Nonnull
+ @Override
+ public ItemStack getRecipeOutput() {
+ return new ItemStack(IndustrialWires.key);
+ }
+
+ @Nonnull
+ @Override
+ public NonNullList getRemainingItems(@Nonnull InventoryCrafting inv) {
+ NonNullList ret = NonNullList.withSize(inv.getSizeInventory(), ItemStack.EMPTY);
+ for (int i = 0; i < ret.size(); i++) {
+ ItemStack here = inv.getStackInSlot(i);
+ if (here.getItem() == IndustrialWires.panelComponent) {
+ ret.set(i, here);
+ }
+ }
+ return ret;
+ }
+
+ private int getLockId(@Nonnull InventoryCrafting inv) {
+ int id = 0;
+ boolean hasKey = false;
+ for (int i = 0; i < inv.getSizeInventory(); i++) {
+ ItemStack here = inv.getStackInSlot(i);
+ if (here.getItem() == IndustrialWires.key) {
+ if (hasKey || ItemKey.idForKey(here) != 0) {//too many keys or non-blanks
+ return 0;
+ }
+ hasKey = true;
+ } else if (here.getItem() == IndustrialWires.panelComponent) {
+ if (id != 0) {//too many locks/components
+ return 0;
+ }
+ PanelComponent pc = ItemPanelComponent.componentFromStack(here);
+ if (pc instanceof Lock) {
+ id = ((Lock) pc).getLockID();
+ } else {
+ return 0;
+ }
+ }
+ }
+ if (!hasKey) {
+ return 0;
+ }
+ return id;
+ }
+
+ @Nonnull
+ //assumes that the recipe is valid
+ private ItemStack getKey(@Nonnull InventoryCrafting inv) {
+ for (int i = 0; i < inv.getSizeInventory(); i++) {
+ ItemStack here = inv.getStackInSlot(i);
+ if (here.getItem() == IndustrialWires.key) {
+ return here;
+ }
+ }
+ return ItemStack.EMPTY;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/malte0811/industrialWires/items/INetGUIItem.java b/src/main/java/malte0811/industrialWires/items/INetGUIItem.java
new file mode 100644
index 0000000..58d069e
--- /dev/null
+++ b/src/main/java/malte0811/industrialWires/items/INetGUIItem.java
@@ -0,0 +1,27 @@
+/*
+ * This file is part of Industrial Wires.
+ * Copyright (C) 2016-2017 malte0811
+ *
+ * Industrial Wires is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Industrial Wires is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Industrial Wires. If not, see .
+ */
+
+package malte0811.industrialWires.items;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumHand;
+
+public interface INetGUIItem {
+ void onChange(NBTTagCompound nbt, EntityPlayer p, EnumHand hand);
+}
diff --git a/src/main/java/malte0811/industrialWires/items/ItemIC2Coil.java b/src/main/java/malte0811/industrialWires/items/ItemIC2Coil.java
index 0ca682f..9953d69 100644
--- a/src/main/java/malte0811/industrialWires/items/ItemIC2Coil.java
+++ b/src/main/java/malte0811/industrialWires/items/ItemIC2Coil.java
@@ -17,7 +17,6 @@
*/
package malte0811.industrialWires.items;
-import blusunrize.immersiveengineering.ImmersiveEngineering;
import blusunrize.immersiveengineering.api.Lib;
import blusunrize.immersiveengineering.api.TargetingInfo;
import blusunrize.immersiveengineering.api.energy.wires.IImmersiveConnectable;
@@ -41,13 +40,12 @@ import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagInt;
import net.minecraft.tileentity.TileEntity;
-import net.minecraft.util.EnumActionResult;
-import net.minecraft.util.EnumFacing;
-import net.minecraft.util.EnumHand;
+import net.minecraft.util.*;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraft.world.World;
+import net.minecraftforge.fml.common.registry.GameRegistry;
import javax.annotation.Nonnull;
import java.util.HashSet;
@@ -63,7 +61,8 @@ public class ItemIC2Coil extends Item implements IWireCoil {
setHasSubtypes(true);
this.setCreativeTab(IndustrialWires.creativeTab);
setMaxStackSize(64);
- ImmersiveEngineering.registerByFullName(this, IndustrialWires.MODID + ":" + "ic2WireCoil");
+ setRegistryName(new ResourceLocation(IndustrialWires.MODID, "ic2WireCoil"));
+ GameRegistry.register(this);
}
@Override
diff --git a/src/main/java/malte0811/industrialWires/items/ItemKey.java b/src/main/java/malte0811/industrialWires/items/ItemKey.java
new file mode 100644
index 0000000..1162f8c
--- /dev/null
+++ b/src/main/java/malte0811/industrialWires/items/ItemKey.java
@@ -0,0 +1,103 @@
+/*
+ * This file is part of Industrial Wires.
+ * Copyright (C) 2016-2017 malte0811
+ *
+ * Industrial Wires is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Industrial Wires is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Industrial Wires. If not, see .
+ */
+
+package malte0811.industrialWires.items;
+
+import malte0811.industrialWires.IndustrialWires;
+import net.minecraft.client.resources.I18n;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagInt;
+import net.minecraft.util.ActionResult;
+import net.minecraft.util.EnumActionResult;
+import net.minecraft.util.EnumHand;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.world.World;
+import net.minecraftforge.fml.common.registry.GameRegistry;
+
+import javax.annotation.Nonnull;
+
+public class ItemKey extends Item implements INetGUIItem {
+ private static final String lockId = "lockId";
+
+ public ItemKey() {
+ setUnlocalizedName(IndustrialWires.MODID + ".key");
+ setHasSubtypes(true);
+ this.setCreativeTab(IndustrialWires.creativeTab);
+ setMaxStackSize(64);
+ setRegistryName(new ResourceLocation(IndustrialWires.MODID, "key"));
+ GameRegistry.register(this);
+ }
+
+ @Nonnull
+ @Override
+ public String getItemStackDisplayName(@Nonnull ItemStack stack) {
+ NBTTagCompound nbt = stack.getTagCompound();
+ if (nbt!=null&&nbt.hasKey("name")) {
+ return I18n.format("item."+IndustrialWires.MODID+".key_named.name")+nbt.getString("name");
+ }
+ return super.getItemStackDisplayName(stack);
+ }
+
+ @Nonnull
+ @Override
+ public String getUnlocalizedName(ItemStack stack) {
+ NBTTagCompound nbt = stack.getTagCompound();
+ if (nbt==null||!nbt.hasKey(lockId)) {
+ return I18n.format("item."+IndustrialWires.MODID+".key_raw.name");
+ }
+ return super.getUnlocalizedName(stack);
+ }
+
+ public static void setId(ItemStack stack, int lockID) {
+ stack.setTagInfo(lockId, new NBTTagInt(lockID));
+ }
+
+ public static int idForKey(@Nonnull ItemStack held) {
+ if (held.getItem()!=IndustrialWires.key) {
+ return 0;
+ }
+ NBTTagCompound nbt = held.getTagCompound();
+ if (nbt!=null) {
+ return nbt.getInteger(lockId);
+ }
+ return 0;
+ }
+
+ @Override
+ public int getItemStackLimit(ItemStack stack) {
+ return 1;
+ }
+
+ @Override
+ @Nonnull
+ public ActionResult onItemRightClick(World worldIn, EntityPlayer playerIn, @Nonnull EnumHand hand) {
+ if (!worldIn.isRemote) {
+ playerIn.openGui(IndustrialWires.MODID, 1, worldIn, 0, 0, hand == EnumHand.MAIN_HAND ? 1 : 0);
+ }
+ return new ActionResult<>(EnumActionResult.SUCCESS, playerIn.getHeldItem(hand));
+ }
+
+ @Override
+ public void onChange(NBTTagCompound nbt, EntityPlayer p, EnumHand hand) {
+ ItemStack held = p.getHeldItem(hand);
+ held.setTagInfo("name", nbt.getTag("name"));
+ }
+}
diff --git a/src/main/java/malte0811/industrialWires/items/ItemPanelComponent.java b/src/main/java/malte0811/industrialWires/items/ItemPanelComponent.java
index 78decb7..9074057 100644
--- a/src/main/java/malte0811/industrialWires/items/ItemPanelComponent.java
+++ b/src/main/java/malte0811/industrialWires/items/ItemPanelComponent.java
@@ -18,8 +18,10 @@
package malte0811.industrialWires.items;
+import blusunrize.immersiveengineering.api.ApiUtils;
import blusunrize.immersiveengineering.client.ClientProxy;
import malte0811.industrialWires.IndustrialWires;
+import malte0811.industrialWires.controlpanel.IConfigurableComponent;
import malte0811.industrialWires.controlpanel.PanelComponent;
import malte0811.industrialWires.controlpanel.PanelUtils;
import net.minecraft.client.gui.FontRenderer;
@@ -30,6 +32,7 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.ActionResult;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumHand;
@@ -43,10 +46,13 @@ import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.List;
-public class ItemPanelComponent extends Item {
+public class ItemPanelComponent extends Item implements INetGUIItem {
public static final String[] types = {
- "lighted_button", "label", "indicator_light", "slider", "variac", "toggle_switch", "toggle_switch_covered"
+ "lighted_button", "label", "indicator_light", "slider", "variac", "toggle_switch", "toggle_switch_covered", "lock"
};
+ public static final String TYPE = "type";
+ public static final String ID = "cfgId";
+ public static final String VALUE = "value";
public ItemPanelComponent() {
setUnlocalizedName(IndustrialWires.MODID + ".panel_component");
@@ -154,4 +160,27 @@ public class ItemPanelComponent extends Item {
}
return new ActionResult<>(EnumActionResult.SUCCESS, itemStackIn);
}
+
+ @Override
+ public void onChange(NBTTagCompound data, EntityPlayer player, EnumHand hand) {
+ ItemStack held = player.getHeldItem(hand);
+ if (held!=null && held.getItem() == IndustrialWires.panelComponent) {
+ PanelComponent old = ItemPanelComponent.componentFromStack(held);
+ if (old instanceof IConfigurableComponent) {
+ NBTTagList changes = data.getTagList("data", 10);
+ IConfigurableComponent cmp = (IConfigurableComponent) old;
+ for (int i = 0; i < changes.tagCount(); i++) {
+ NBTTagCompound curr = changes.getCompoundTagAt(i);
+ IConfigurableComponent.ConfigType type = IConfigurableComponent.ConfigType.values()[curr.getInteger(TYPE)];
+ try {
+ cmp.applyConfigOption(type, curr.getInteger(ID), curr.getTag(VALUE));
+ } catch (Exception x) {
+ x.printStackTrace();
+ }
+ }
+ ItemStack newCmp = ApiUtils.copyStackWithAmount(ItemPanelComponent.stackFromComponent(old), held.stackSize);
+ player.setHeldItem(hand, newCmp);
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/src/main/java/malte0811/industrialWires/network/MessageItemSync.java b/src/main/java/malte0811/industrialWires/network/MessageItemSync.java
new file mode 100644
index 0000000..41eba0d
--- /dev/null
+++ b/src/main/java/malte0811/industrialWires/network/MessageItemSync.java
@@ -0,0 +1,68 @@
+/*
+ * This file is part of Industrial Wires.
+ * Copyright (C) 2016-2017 malte0811
+ *
+ * Industrial Wires is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Industrial Wires is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Industrial Wires. If not, see .
+ */
+
+package malte0811.industrialWires.network;
+
+import io.netty.buffer.ByteBuf;
+import malte0811.industrialWires.items.INetGUIItem;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumHand;
+import net.minecraftforge.fml.common.network.ByteBufUtils;
+import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
+import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
+import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
+
+public class MessageItemSync implements IMessage {
+ private EnumHand hand;
+ private NBTTagCompound data;
+
+ public MessageItemSync(EnumHand h, NBTTagCompound data) {
+ hand = h;
+ this.data = data;
+ }
+
+ public MessageItemSync() {
+ }
+
+ @Override
+ public void fromBytes(ByteBuf buf) {
+ hand = EnumHand.values()[buf.readInt()];
+ data = ByteBufUtils.readTag(buf);
+ }
+
+ @Override
+ public void toBytes(ByteBuf buf) {
+ buf.writeInt(hand.ordinal());
+ ByteBufUtils.writeTag(buf, data);
+ }
+
+ public static class HandlerServer implements IMessageHandler {
+ @Override
+ public IMessage onMessage(MessageItemSync message, MessageContext ctx) {
+ EntityPlayer player = ctx.getServerHandler().player;
+ ItemStack held = player.getHeldItem(message.hand);
+ if (held.getItem() instanceof INetGUIItem) {
+ ctx.getServerHandler().player.getServerWorld().addScheduledTask(() ->
+ ((INetGUIItem)held.getItem()).onChange(message.data, player, message.hand));
+ }
+ return null;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/industrialwires/lang/en_US.lang b/src/main/resources/assets/industrialwires/lang/en_US.lang
index 4a2a00d..d517436 100644
--- a/src/main/resources/assets/industrialwires/lang/en_US.lang
+++ b/src/main/resources/assets/industrialwires/lang/en_US.lang
@@ -35,6 +35,9 @@ item.industrialwires.panel_component.slider.name=Slider
item.industrialwires.panel_component.variac.name=VariacĀ®
item.industrialwires.panel_component.toggle_switch.name=Toggle Switch
item.industrialwires.panel_component.toggle_switch_covered.name=Covered Toggle Switch
+item.industrialwires.key.name=Key
+item.industrialwires.key_named.name=Key for
+item.industrialwires.key_raw.name=Blank Key
industrialwires.desc.wireLength=Wire length: %1s block(s)