aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/common')
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_ItemMeter.java77
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_LiquidMeter.java68
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_NeedMaintainance.java10
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_RedstoneWirelessBase.java6
-rw-r--r--src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverBase.java193
-rw-r--r--src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverExternal.java38
-rw-r--r--src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverInternal.java40
-rw-r--r--src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterBase.java192
-rw-r--r--src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterExternal.java48
-rw-r--r--src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterInternal.java53
-rw-r--r--src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedWirelessRedstoneBase.java443
-rw-r--r--src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessFluidDetector.java185
-rw-r--r--src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessItemDetector.java260
-rw-r--r--src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessMaintenanceDetector.java269
-rw-r--r--src/main/java/gregtech/common/items/GT_MetaGenerated_Item_01.java56
-rw-r--r--src/main/java/gregtech/common/items/GT_MetaGenerated_Item_02.java161
16 files changed, 1965 insertions, 134 deletions
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_ItemMeter.java b/src/main/java/gregtech/common/covers/GT_Cover_ItemMeter.java
index 82dffaf7a8..c894857b32 100644
--- a/src/main/java/gregtech/common/covers/GT_Cover_ItemMeter.java
+++ b/src/main/java/gregtech/common/covers/GT_Cover_ItemMeter.java
@@ -74,66 +74,47 @@ public class GT_Cover_ItemMeter extends GT_CoverBehaviorBase<GT_Cover_ItemMeter.
return false;
}
- @Override
- protected ItemMeterData doCoverThingsImpl(
- byte aSide,
- byte aInputRedstone,
- int aCoverID,
- ItemMeterData aCoverVariable,
- ICoverable aTileEntity,
- long aTimer) {
- long tMax = 0;
- long tUsed = 0;
- IMetaTileEntity mte = ((IGregTechTileEntity) aTileEntity).getMetaTileEntity();
+ public static byte computeSignalBasedOnItems(
+ ICoverable tileEntity, boolean inverted, int threshold, int slot, int side) {
+ long max = 0;
+ long used = 0;
+ IMetaTileEntity mte = ((IGregTechTileEntity) tileEntity).getMetaTileEntity();
if (mte instanceof GT_MetaTileEntity_DigitalChestBase) {
GT_MetaTileEntity_DigitalChestBase dc = (GT_MetaTileEntity_DigitalChestBase) mte;
- tMax = dc.getMaxItemCount(); // currently it is limited by int, but there is not much reason for that
- ItemStack[] inv = dc.getStoredItemData();
- if (inv != null && inv.length > 1 && inv[1] != null) tUsed = inv[1].stackSize;
+ max = dc.getMaxItemCount();
+ used = dc.getProgresstime();
} else if (GregTech_API.mAE2 && mte instanceof GT_MetaTileEntity_Hatch_OutputBus_ME) {
if (((GT_MetaTileEntity_Hatch_OutputBus_ME) mte).isLastOutputFailed()) {
- tMax = 64;
- tUsed = 64;
+ max = 64;
+ used = 64;
}
} else {
- int[] tSlots = aCoverVariable.slot >= 0
- ? new int[] {aCoverVariable.slot}
- : aTileEntity.getAccessibleSlotsFromSide(aSide);
-
- for (int i : tSlots) {
- if (i >= 0 && i < aTileEntity.getSizeInventory()) {
- tMax += 64;
- ItemStack tStack = aTileEntity.getStackInSlot(i);
- if (tStack != null) tUsed += (tStack.stackSize << 6) / tStack.getMaxStackSize();
+ int[] slots = slot >= 0 ? new int[] {slot} : tileEntity.getAccessibleSlotsFromSide(side);
+
+ for (int i : slots) {
+ if (i >= 0 && i < tileEntity.getSizeInventory()) {
+ max += 64;
+ ItemStack stack = tileEntity.getStackInSlot(i);
+ if (stack != null) used += ((long) stack.stackSize << 6) / stack.getMaxStackSize();
}
}
}
- long redstoneSignal;
- if (tUsed == 0L) {
- // nothing
- redstoneSignal = 0;
- } else if (tUsed >= tMax) {
- // full
- redstoneSignal = 15;
- } else {
- // 1-14 range
- redstoneSignal = 1 + (14 * tUsed) / tMax;
- }
-
- if (aCoverVariable.inverted) {
- redstoneSignal = 15 - redstoneSignal;
- }
+ return GT_Utility.convertRatioToRedstone(used, max, threshold, inverted);
+ }
- if (aCoverVariable.threshold > 0) {
- if (aCoverVariable.inverted && tUsed >= aCoverVariable.threshold) {
- redstoneSignal = 0;
- } else if (!aCoverVariable.inverted && tUsed < aCoverVariable.threshold) {
- redstoneSignal = 0;
- }
- }
+ @Override
+ protected ItemMeterData doCoverThingsImpl(
+ byte aSide,
+ byte aInputRedstone,
+ int aCoverID,
+ ItemMeterData aCoverVariable,
+ ICoverable aTileEntity,
+ long aTimer) {
+ byte signal = computeSignalBasedOnItems(
+ aTileEntity, aCoverVariable.inverted, aCoverVariable.threshold, aCoverVariable.slot, aSide);
+ aTileEntity.setOutputRedstoneSignal(aSide, signal);
- aTileEntity.setOutputRedstoneSignal(aSide, (byte) redstoneSignal);
return aCoverVariable;
}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_LiquidMeter.java b/src/main/java/gregtech/common/covers/GT_Cover_LiquidMeter.java
index ce795bdd09..48304d3fed 100644
--- a/src/main/java/gregtech/common/covers/GT_Cover_LiquidMeter.java
+++ b/src/main/java/gregtech/common/covers/GT_Cover_LiquidMeter.java
@@ -53,6 +53,29 @@ public class GT_Cover_LiquidMeter extends GT_CoverBehaviorBase<GT_Cover_LiquidMe
return false;
}
+ public static byte computeSignalBasedOnFluid(ICoverable tileEntity, boolean inverted, int threshold) {
+ if (tileEntity instanceof IFluidHandler) {
+ FluidTankInfo[] tanks = ((IFluidHandler) tileEntity).getTankInfo(ForgeDirection.UNKNOWN);
+ long max = 0;
+ long used = 0;
+ if (tanks != null) {
+ for (FluidTankInfo tank : tanks) {
+ if (tank != null) {
+ max += tank.capacity;
+ FluidStack tLiquid = tank.fluid;
+ if (tLiquid != null) {
+ used += tLiquid.amount;
+ }
+ }
+ }
+ }
+
+ return GT_Utility.convertRatioToRedstone(used, max, threshold, inverted);
+ } else {
+ return 0;
+ }
+ }
+
@Override
protected LiquidMeterData doCoverThingsImpl(
byte aSide,
@@ -61,50 +84,9 @@ public class GT_Cover_LiquidMeter extends GT_CoverBehaviorBase<GT_Cover_LiquidMe
LiquidMeterData aCoverVariable,
ICoverable aTileEntity,
long aTimer) {
- if ((aTileEntity instanceof IFluidHandler)) {
- FluidTankInfo[] tTanks = ((IFluidHandler) aTileEntity).getTankInfo(ForgeDirection.UNKNOWN);
- long tMax = 0;
- long tUsed = 0;
- if (tTanks != null) {
- for (FluidTankInfo tTank : tTanks) {
- if (tTank != null) {
- tMax += tTank.capacity;
- FluidStack tLiquid = tTank.fluid;
- if (tLiquid != null) {
- tUsed += tLiquid.amount;
- }
- }
- }
- }
-
- long redstoneSignal;
- if (tUsed == 0L) {
- // nothing
- redstoneSignal = 0;
- } else if (tUsed >= tMax) {
- // full
- redstoneSignal = 15;
- } else {
- // 1-14 range
- redstoneSignal = 1 + (14 * tUsed) / tMax;
- }
-
- if (aCoverVariable.inverted) {
- redstoneSignal = 15 - redstoneSignal;
- }
-
- if (aCoverVariable.threshold > 0) {
- if (aCoverVariable.inverted && tUsed >= aCoverVariable.threshold) {
- redstoneSignal = 0;
- } else if (!aCoverVariable.inverted && tUsed < aCoverVariable.threshold) {
- redstoneSignal = 0;
- }
- }
+ byte signal = computeSignalBasedOnFluid(aTileEntity, aCoverVariable.inverted, aCoverVariable.threshold);
+ aTileEntity.setOutputRedstoneSignal(aSide, signal);
- aTileEntity.setOutputRedstoneSignal(aSide, (byte) redstoneSignal);
- } else {
- aTileEntity.setOutputRedstoneSignal(aSide, (byte) 0);
- }
return aCoverVariable;
}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_NeedMaintainance.java b/src/main/java/gregtech/common/covers/GT_Cover_NeedMaintainance.java
index 369778ef12..2ea5a2c951 100644
--- a/src/main/java/gregtech/common/covers/GT_Cover_NeedMaintainance.java
+++ b/src/main/java/gregtech/common/covers/GT_Cover_NeedMaintainance.java
@@ -32,11 +32,11 @@ public class GT_Cover_NeedMaintainance extends GT_CoverBehavior {
super(coverTexture);
}
- private boolean isRotor(ItemStack aRotor) {
- return !(aRotor == null
- || !(aRotor.getItem() instanceof GT_MetaGenerated_Tool)
- || aRotor.getItemDamage() < 170
- || aRotor.getItemDamage() > 176);
+ public static boolean isRotor(ItemStack rotor) {
+ return (rotor != null
+ && rotor.getItem() instanceof GT_MetaGenerated_Tool
+ && rotor.getItemDamage() >= 170
+ && rotor.getItemDamage() <= 176);
}
@Override
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_RedstoneWirelessBase.java b/src/main/java/gregtech/common/covers/GT_Cover_RedstoneWirelessBase.java
index a942d39b57..a024400094 100644
--- a/src/main/java/gregtech/common/covers/GT_Cover_RedstoneWirelessBase.java
+++ b/src/main/java/gregtech/common/covers/GT_Cover_RedstoneWirelessBase.java
@@ -15,6 +15,7 @@ import gregtech.api.util.GT_Utility;
import gregtech.api.util.ISerializableObject;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fluids.Fluid;
public abstract class GT_Cover_RedstoneWirelessBase extends GT_CoverBehavior {
@@ -198,10 +199,13 @@ public abstract class GT_Cover_RedstoneWirelessBase extends GT_CoverBehavior {
private static final int spaceX = 18;
private static final int spaceY = 18;
+ private static final String guiTexturePath = "gregtech:textures/gui/GuiCoverLong.png";
+
private final int textColor = this.getTextColorOrDefault("text", 0xFF555555);
public GUI(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
- super(aTileEntity, 176, 107, GT_Utility.intToStack(aCoverID));
+ super(aTileEntity, 250, 107, GT_Utility.intToStack(aCoverID));
+ this.mGUIbackgroundLocation = new ResourceLocation(guiTexturePath);
this.side = aSide;
this.coverID = aCoverID;
this.coverVariable = aCoverVariable;
diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverBase.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverBase.java
new file mode 100644
index 0000000000..233be511a3
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverBase.java
@@ -0,0 +1,193 @@
+package gregtech.common.covers.redstone;
+
+import com.google.common.io.ByteArrayDataInput;
+import gregtech.api.gui.widgets.GT_GuiIcon;
+import gregtech.api.gui.widgets.GT_GuiIconButton;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import io.netty.buffer.ByteBuf;
+import java.util.UUID;
+import javax.annotation.Nonnull;
+import net.minecraft.client.gui.GuiButton;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+
+public abstract class GT_Cover_AdvancedRedstoneReceiverBase
+ extends GT_Cover_AdvancedWirelessRedstoneBase<GT_Cover_AdvancedRedstoneReceiverBase.ReceiverData> {
+
+ public GT_Cover_AdvancedRedstoneReceiverBase(ITexture coverTexture) {
+ super(ReceiverData.class, coverTexture);
+ }
+
+ @Override
+ public ReceiverData createDataObject() {
+ return new ReceiverData();
+ }
+
+ @Override
+ public ReceiverData createDataObject(int aLegacyData) {
+ return createDataObject();
+ }
+
+ /**
+ * GUI Stuff
+ */
+ @Override
+ public Object getClientGUIImpl(
+ byte aSide,
+ int aCoverID,
+ ReceiverData aCoverVariable,
+ ICoverable aTileEntity,
+ EntityPlayer aPlayer,
+ World aWorld) {
+ return new ReceiverGUI(aSide, aCoverID, aCoverVariable, aTileEntity);
+ }
+
+ public enum GateMode {
+ AND,
+ NAND,
+ OR,
+ NOR,
+ SINGLE_SOURCE
+ }
+
+ public static class ReceiverData extends GT_Cover_AdvancedWirelessRedstoneBase.WirelessData {
+ private GateMode mode;
+
+ public ReceiverData(int frequency, UUID uuid, GateMode mode) {
+ super(frequency, uuid);
+ this.mode = mode;
+ }
+
+ public ReceiverData() {
+ this(0, null, GateMode.AND);
+ }
+
+ public GateMode getGateMode() {
+ return mode;
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject copy() {
+ return new ReceiverData(frequency, uuid, mode);
+ }
+
+ @Nonnull
+ @Override
+ public NBTBase saveDataToNBT() {
+ NBTTagCompound tag = (NBTTagCompound) super.saveDataToNBT();
+ tag.setByte("mode", (byte) mode.ordinal());
+
+ return tag;
+ }
+
+ @Override
+ public void writeToByteBuf(ByteBuf aBuf) {
+ super.writeToByteBuf(aBuf);
+ aBuf.writeByte(mode.ordinal());
+ }
+
+ @Override
+ public void loadDataFromNBT(NBTBase aNBT) {
+ super.loadDataFromNBT(aNBT);
+
+ NBTTagCompound tag = (NBTTagCompound) aNBT;
+ mode = GateMode.values()[tag.getByte("mode")];
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) {
+ super.readFromPacket(aBuf, aPlayer);
+ mode = GateMode.values()[aBuf.readByte()];
+
+ return this;
+ }
+ }
+
+ private static class ReceiverGUI extends WirelessGUI<ReceiverData> {
+
+ private static final int gateModeButtonIdStart = 1;
+
+ public ReceiverGUI(byte aSide, int aCoverID, ReceiverData aCoverVariable, ICoverable aTileEntity) {
+ super(aSide, aCoverID, aCoverVariable, aTileEntity);
+
+ new GT_GuiIconButton(
+ this,
+ gateModeButtonIdStart + 0,
+ startX + spaceX * 0,
+ startY + spaceY * 2,
+ GT_GuiIcon.AND_GATE)
+ .setTooltipText(GT_Utility.trans("006", "AND Gate"));
+ new GT_GuiIconButton(
+ this,
+ gateModeButtonIdStart + 1,
+ startX + spaceX * 1,
+ startY + spaceY * 2,
+ GT_GuiIcon.NAND_GATE)
+ .setTooltipText(GT_Utility.trans("006", "NAND Gate"));
+ new GT_GuiIconButton(
+ this,
+ gateModeButtonIdStart + 2,
+ startX + spaceX * 2,
+ startY + spaceY * 2,
+ GT_GuiIcon.OR_GATE)
+ .setTooltipText(GT_Utility.trans("006", "OR Gate"));
+ new GT_GuiIconButton(
+ this,
+ gateModeButtonIdStart + 3,
+ startX + spaceX * 3,
+ startY + spaceY * 2,
+ GT_GuiIcon.NOR_GATE)
+ .setTooltipText(GT_Utility.trans("006", "NOR Gate"));
+ new GT_GuiIconButton(
+ this,
+ gateModeButtonIdStart + 4,
+ startX + spaceX * 4,
+ startY + spaceY * 2,
+ GT_GuiIcon.ANALOG_MODE)
+ .setTooltipText(
+ "ANALOG Mode", "Only use this mode with ONE transmitter in total,", "no logic involved");
+ }
+
+ @Override
+ public void drawExtras(int mouseX, int mouseY, float parTicks) {
+ super.drawExtras(mouseX, mouseY, parTicks);
+ this.getFontRenderer()
+ .drawString(
+ GT_Utility.trans("601", "Gate Mode"),
+ startX + spaceX * 5,
+ 4 + startY + spaceY * 2,
+ textColor);
+ }
+
+ @Override
+ protected void update() {
+ super.update();
+ updateButtons();
+ }
+
+ private void updateButtons() {
+ GuiButton button;
+ for (int i = gateModeButtonIdStart; i < gateModeButtonIdStart + 5; ++i) {
+ button = (GuiButton) this.buttonList.get(i);
+ button.enabled = (button.id - gateModeButtonIdStart) != coverVariable.mode.ordinal();
+ }
+ }
+
+ @Override
+ public void buttonClicked(GuiButton btn) {
+ if (btn.id >= gateModeButtonIdStart && btn.enabled) {
+ coverVariable.mode = GateMode.values()[btn.id - gateModeButtonIdStart];
+ }
+
+ super.buttonClicked(btn);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverExternal.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverExternal.java
new file mode 100644
index 0000000000..56b7fadd24
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverExternal.java
@@ -0,0 +1,38 @@
+package gregtech.common.covers.redstone;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+
+public class GT_Cover_AdvancedRedstoneReceiverExternal extends GT_Cover_AdvancedRedstoneReceiverBase {
+
+ public GT_Cover_AdvancedRedstoneReceiverExternal(ITexture coverTexture) {
+ super(coverTexture);
+ }
+
+ @Override
+ public ReceiverData doCoverThingsImpl(
+ byte aSide,
+ byte aInputRedstone,
+ int aCoverID,
+ ReceiverData aCoverVariable,
+ ICoverable aTileEntity,
+ long aTimer) {
+ aTileEntity.setOutputRedstoneSignal(
+ aSide,
+ getSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), aCoverVariable.getGateMode()));
+
+ return aCoverVariable;
+ }
+
+ @Override
+ protected boolean isRedstoneSensitiveImpl(
+ byte aSide, int aCoverID, ReceiverData aCoverVariable, ICoverable aTileEntity, long aTimer) {
+ return false;
+ }
+
+ @Override
+ protected boolean manipulatesSidedRedstoneOutputImpl(
+ byte aSide, int aCoverID, ReceiverData aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverInternal.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverInternal.java
new file mode 100644
index 0000000000..c3537350a6
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverInternal.java
@@ -0,0 +1,40 @@
+package gregtech.common.covers.redstone;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IMachineProgress;
+
+public class GT_Cover_AdvancedRedstoneReceiverInternal extends GT_Cover_AdvancedRedstoneReceiverBase {
+
+ public GT_Cover_AdvancedRedstoneReceiverInternal(ITexture coverTexture) {
+ super(coverTexture);
+ }
+
+ @Override
+ public ReceiverData doCoverThingsImpl(
+ byte aSide,
+ byte aInputRedstone,
+ int aCoverID,
+ ReceiverData aCoverVariable,
+ ICoverable aTileEntity,
+ long aTimer) {
+ if (aTileEntity instanceof IMachineProgress) {
+ IMachineProgress machine = ((IMachineProgress) aTileEntity);
+ if (getRedstoneInput(aSide, aInputRedstone, aCoverID, aCoverVariable, aTileEntity) > 0) {
+ machine.enableWorking();
+ } else {
+ machine.disableWorking();
+ }
+
+ machine.setWorkDataValue(aInputRedstone);
+ }
+
+ return aCoverVariable;
+ }
+
+ @Override
+ protected byte getRedstoneInputImpl(
+ byte aSide, byte aInputRedstone, int aCoverID, ReceiverData aCoverVariable, ICoverable aTileEntity) {
+ return getSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), aCoverVariable.getGateMode());
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterBase.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterBase.java
new file mode 100644
index 0000000000..07592a00dc
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterBase.java
@@ -0,0 +1,192 @@
+package gregtech.common.covers.redstone;
+
+import com.google.common.io.ByteArrayDataInput;
+import gregtech.api.gui.widgets.GT_GuiIcon;
+import gregtech.api.gui.widgets.GT_GuiIconCheckButton;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import io.netty.buffer.ByteBuf;
+import java.util.Objects;
+import java.util.UUID;
+import javax.annotation.Nonnull;
+import net.minecraft.client.gui.GuiButton;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+
+public abstract class GT_Cover_AdvancedRedstoneTransmitterBase<
+ T extends GT_Cover_AdvancedRedstoneTransmitterBase.TransmitterData>
+ extends GT_Cover_AdvancedWirelessRedstoneBase<T> {
+
+ public GT_Cover_AdvancedRedstoneTransmitterBase(Class<T> typeToken, ITexture coverTexture) {
+ super(typeToken, coverTexture);
+ }
+
+ private static void unregisterSignal(byte aSide, TransmitterData aCoverVariable, ICoverable aTileEntity) {
+ long hash = hashCoverCoords(aTileEntity, aSide);
+ removeSignalAt(aCoverVariable.uuid, aCoverVariable.frequency, hash);
+ }
+
+ @Override
+ public boolean onCoverRemovalImpl(
+ byte aSide, int aCoverID, TransmitterData aCoverVariable, ICoverable aTileEntity, boolean aForced) {
+ unregisterSignal(aSide, aCoverVariable, aTileEntity);
+ return true;
+ }
+
+ @Override
+ protected void onBaseTEDestroyedImpl(
+ byte aSide, int aCoverID, TransmitterData aCoverVariable, ICoverable aTileEntity) {
+ unregisterSignal(aSide, aCoverVariable, aTileEntity);
+ }
+
+ @Override
+ protected T onCoverScrewdriverClickImpl(
+ byte aSide,
+ int aCoverID,
+ T aCoverVariable,
+ ICoverable aTileEntity,
+ EntityPlayer aPlayer,
+ float aX,
+ float aY,
+ float aZ) {
+ aCoverVariable.invert = !aCoverVariable.invert;
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("055", aCoverVariable.invert ? "Inverted" : "Normal"));
+
+ return aCoverVariable;
+ }
+
+ @Override
+ protected void preDataChangedImpl(
+ byte aSide, int aCoverID, int aNewCoverId, T aCoverVariable, T aNewCoverVariable, ICoverable aTileEntity) {
+ if (aCoverVariable.frequency != aNewCoverVariable.frequency
+ || !Objects.equals(aCoverVariable.uuid, aNewCoverVariable.uuid)) {
+ unregisterSignal(aSide, aCoverVariable, aTileEntity);
+ }
+ }
+
+ public static class TransmitterData extends GT_Cover_AdvancedWirelessRedstoneBase.WirelessData {
+ protected boolean invert;
+
+ public TransmitterData(int frequency, UUID uuid, boolean invert) {
+ super(frequency, uuid);
+ this.invert = invert;
+ }
+
+ public TransmitterData() {
+ this(0, null, false);
+ }
+
+ public boolean isInvert() {
+ return invert;
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject copy() {
+ return new TransmitterData(frequency, uuid, invert);
+ }
+
+ @Nonnull
+ @Override
+ public NBTBase saveDataToNBT() {
+ NBTTagCompound tag = (NBTTagCompound) super.saveDataToNBT();
+ tag.setBoolean("invert", invert);
+
+ return tag;
+ }
+
+ @Override
+ public void writeToByteBuf(ByteBuf aBuf) {
+ super.writeToByteBuf(aBuf);
+ aBuf.writeBoolean(invert);
+ }
+
+ @Override
+ public void loadDataFromNBT(NBTBase aNBT) {
+ super.loadDataFromNBT(aNBT);
+
+ NBTTagCompound tag = (NBTTagCompound) aNBT;
+ invert = tag.getBoolean("invert");
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) {
+ super.readFromPacket(aBuf, aPlayer);
+ invert = aBuf.readBoolean();
+
+ return this;
+ }
+ }
+
+ /**
+ * GUI Stuff
+ */
+ @Override
+ public Object getClientGUIImpl(
+ byte aSide,
+ int aCoverID,
+ TransmitterData aCoverVariable,
+ ICoverable aTileEntity,
+ EntityPlayer aPlayer,
+ World aWorld) {
+ return new TransmitterGUI<>(aSide, aCoverID, aCoverVariable, aTileEntity);
+ }
+
+ protected class TransmitterGUI<X extends TransmitterData> extends WirelessGUI<X> {
+
+ private final GT_GuiIconCheckButton invertButton;
+
+ private final String INVERTED = GT_Utility.trans("INVERTED", "Inverted");
+ private final String NORMAL = GT_Utility.trans("NORMAL", "Normal");
+
+ public TransmitterGUI(
+ byte aSide, int aCoverID, X aCoverVariable, ICoverable aTileEntity, int frequencyRow, int buttonRow) {
+ super(aSide, aCoverID, aCoverVariable, aTileEntity, frequencyRow, buttonRow, true);
+ invertButton = new GT_GuiIconCheckButton(
+ this,
+ 1,
+ startX + spaceX * 9,
+ startY + spaceY * buttonRow,
+ GT_GuiIcon.REDSTONE_ON,
+ GT_GuiIcon.REDSTONE_OFF,
+ INVERTED,
+ NORMAL);
+ }
+
+ public TransmitterGUI(byte aSide, int aCoverID, X aCoverVariable, ICoverable aTileEntity) {
+ this(aSide, aCoverID, aCoverVariable, aTileEntity, 0, 1);
+ }
+
+ @Override
+ public void drawExtras(int mouseX, int mouseY, float parTicks) {
+ super.drawExtras(mouseX, mouseY, parTicks);
+ this.getFontRenderer()
+ .drawString(
+ coverVariable.invert ? INVERTED : NORMAL,
+ startX + spaceX * 10,
+ 4 + startY + spaceY * buttonRow,
+ textColor);
+ }
+
+ @Override
+ protected void update() {
+ super.update();
+ invertButton.setChecked(coverVariable.invert);
+ }
+
+ @Override
+ public void buttonClicked(GuiButton btn) {
+ if (btn == invertButton) {
+ coverVariable.invert = !coverVariable.invert;
+ }
+
+ super.buttonClicked(btn);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterExternal.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterExternal.java
new file mode 100644
index 0000000000..aaa526e565
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterExternal.java
@@ -0,0 +1,48 @@
+package gregtech.common.covers.redstone;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+
+public class GT_Cover_AdvancedRedstoneTransmitterExternal
+ extends GT_Cover_AdvancedRedstoneTransmitterBase<GT_Cover_AdvancedRedstoneTransmitterBase.TransmitterData> {
+
+ public GT_Cover_AdvancedRedstoneTransmitterExternal(ITexture coverTexture) {
+ super(TransmitterData.class, coverTexture);
+ }
+
+ @Override
+ public TransmitterData createDataObject() {
+ return new TransmitterData();
+ }
+
+ @Override
+ public TransmitterData createDataObject(int aLegacyData) {
+ return createDataObject();
+ }
+
+ @Override
+ public TransmitterData doCoverThingsImpl(
+ byte aSide,
+ byte aInputRedstone,
+ int aCoverID,
+ TransmitterData aCoverVariable,
+ ICoverable aTileEntity,
+ long aTimer) {
+ byte outputRedstone = aInputRedstone;
+ if (aCoverVariable.isInvert()) {
+ if (outputRedstone > 0) outputRedstone = 0;
+ else outputRedstone = 15;
+ }
+
+ long hash = hashCoverCoords(aTileEntity, aSide);
+ setSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), hash, outputRedstone);
+
+ return aCoverVariable;
+ }
+
+ @Override
+ public boolean letsRedstoneGoInImpl(
+ byte aSide, int aCoverID, TransmitterData aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterInternal.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterInternal.java
new file mode 100644
index 0000000000..1d21b7060f
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterInternal.java
@@ -0,0 +1,53 @@
+package gregtech.common.covers.redstone;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+
+public class GT_Cover_AdvancedRedstoneTransmitterInternal
+ extends GT_Cover_AdvancedRedstoneTransmitterBase<GT_Cover_AdvancedRedstoneTransmitterBase.TransmitterData> {
+
+ public GT_Cover_AdvancedRedstoneTransmitterInternal(ITexture coverTexture) {
+ super(TransmitterData.class, coverTexture);
+ }
+
+ @Override
+ public TransmitterData createDataObject() {
+ return new TransmitterData();
+ }
+
+ @Override
+ public TransmitterData createDataObject(int aLegacyData) {
+ return createDataObject();
+ }
+
+ @Override
+ public TransmitterData doCoverThingsImpl(
+ byte aSide,
+ byte aInputRedstone,
+ int aCoverID,
+ TransmitterData aCoverVariable,
+ ICoverable aTileEntity,
+ long aTimer) {
+ byte outputRedstone = aTileEntity.getOutputRedstoneSignal(aSide);
+ if (aCoverVariable.isInvert()) {
+ if (outputRedstone > 0) outputRedstone = 0;
+ else outputRedstone = 15;
+ }
+
+ long hash = hashCoverCoords(aTileEntity, aSide);
+ setSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), hash, outputRedstone);
+ return aCoverVariable;
+ }
+
+ @Override