aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/common/redstonecircuits
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/common/redstonecircuits')
-rw-r--r--src/main/java/gregtech/common/redstonecircuits/GT_Circuit_BasicLogic.java137
-rw-r--r--src/main/java/gregtech/common/redstonecircuits/GT_Circuit_BitAnd.java81
-rw-r--r--src/main/java/gregtech/common/redstonecircuits/GT_Circuit_CombinationLock.java109
-rw-r--r--src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Equals.java73
-rw-r--r--src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Pulser.java92
-rw-r--r--src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Randomizer.java86
-rw-r--r--src/main/java/gregtech/common/redstonecircuits/GT_Circuit_RedstoneMeter.java94
-rw-r--r--src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Repeater.java86
-rw-r--r--src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Timer.java108
9 files changed, 866 insertions, 0 deletions
diff --git a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_BasicLogic.java b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_BasicLogic.java
new file mode 100644
index 0000000000..34093a95de
--- /dev/null
+++ b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_BasicLogic.java
@@ -0,0 +1,137 @@
+package gregtech.common.redstonecircuits;
+
+import gregtech.api.interfaces.IRedstoneCircuitBlock;
+import gregtech.api.util.GT_CircuitryBehavior;
+
+public class GT_Circuit_BasicLogic extends GT_CircuitryBehavior {
+
+ public GT_Circuit_BasicLogic(int aIndex) {
+ super(aIndex);
+ }
+
+ @Override
+ public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ aCircuitData[0] = 0;
+ }
+
+ @Override
+ public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (aCircuitData[0] < 0) {
+ aCircuitData[0] = 0;
+ }
+ if (aCircuitData[0] > 13) {
+ aCircuitData[0] = 13;
+ }
+ }
+
+ @Override
+ public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (aCircuitData[0] < 2) {
+ aRedstoneCircuitBlock.setRedstone(
+ (byte) (aCircuitData[0] % 2 == (getAnyRedstone(aRedstoneCircuitBlock) ? 0 : 1) ? 15 : 0),
+ aRedstoneCircuitBlock.getOutputFacing());
+ } else if (aCircuitData[0] < 4) {
+ aRedstoneCircuitBlock.setRedstone(
+ (byte) (aCircuitData[0] % 2 == (getOneRedstone(aRedstoneCircuitBlock) ? 0 : 1) ? 15 : 0),
+ aRedstoneCircuitBlock.getOutputFacing());
+ } else if (aCircuitData[0] < 6) {
+ aRedstoneCircuitBlock.setRedstone(
+ (byte) (aCircuitData[0] % 2 == (getAllRedstone(aRedstoneCircuitBlock) ? 0 : 1) ? 15 : 0),
+ aRedstoneCircuitBlock.getOutputFacing());
+ } else if (aCircuitData[0] < 7) {
+ aRedstoneCircuitBlock.setRedstone(
+ (byte) (15 - getStrongestRedstone(aRedstoneCircuitBlock)),
+ aRedstoneCircuitBlock.getOutputFacing());
+ } else if (aCircuitData[0] < 9) {
+ aRedstoneCircuitBlock.setRedstone(
+ (byte) ((aCircuitData[0] % 2 == 0 ? 15 : 0)
+ ^ (getStrongestRedstone(aRedstoneCircuitBlock) | getWeakestRedstone(aRedstoneCircuitBlock))),
+ aRedstoneCircuitBlock.getOutputFacing());
+ } else if (aCircuitData[0] < 11) {
+ aRedstoneCircuitBlock.setRedstone(
+ (byte) ((aCircuitData[0] % 2 == 0 ? 15 : 0) ^ getStrongestRedstone(aRedstoneCircuitBlock)
+ ^ getWeakestRedstone(aRedstoneCircuitBlock)),
+ aRedstoneCircuitBlock.getOutputFacing());
+ } else if (aCircuitData[0] < 13) {
+ aRedstoneCircuitBlock.setRedstone(
+ (byte) ((aCircuitData[0] % 2 == 0 ? 15 : 0)
+ ^ getStrongestRedstone(aRedstoneCircuitBlock) & getWeakestRedstone(aRedstoneCircuitBlock)),
+ aRedstoneCircuitBlock.getOutputFacing());
+ } else if (aCircuitData[0] < 14) {
+ aRedstoneCircuitBlock.setRedstone(
+ (byte) (getStrongestRedstone(aRedstoneCircuitBlock) ^ 0xF),
+ aRedstoneCircuitBlock.getOutputFacing());
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "Basic Logic";
+ }
+
+ @Override
+ public String getDescription() {
+ return "Regular Logic Gates";
+ }
+
+ @Override
+ public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) {
+ if (aCircuitDataIndex == 0) {
+ switch (aCircuitData[0]) {
+ case 0 -> {
+ return "OR";
+ }
+ case 1 -> {
+ return "NOR";
+ }
+ case 2 -> {
+ return "XOR";
+ }
+ case 3 -> {
+ return "XNOR";
+ }
+ case 4 -> {
+ return "AND";
+ }
+ case 5 -> {
+ return "NAND";
+ }
+ case 6 -> {
+ return "INVERT";
+ }
+ case 7 -> {
+ return "BIT_OR";
+ }
+ case 8 -> {
+ return "BIT_NOR";
+ }
+ case 9 -> {
+ return "BIT_XOR";
+ }
+ case 10 -> {
+ return "BIT_XNOR";
+ }
+ case 11 -> {
+ return "BIT_AND";
+ }
+ case 12 -> {
+ return "BIT_NAND";
+ }
+ case 13 -> {
+ return "BIT_INVERT";
+ }
+ }
+ }
+ return "";
+ }
+
+ @Override
+ public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) {
+ return false;
+ }
+
+ @Override
+ public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) {
+ return "";
+ }
+}
diff --git a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_BitAnd.java b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_BitAnd.java
new file mode 100644
index 0000000000..f5f83a7e10
--- /dev/null
+++ b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_BitAnd.java
@@ -0,0 +1,81 @@
+package gregtech.common.redstonecircuits;
+
+import gregtech.api.interfaces.IRedstoneCircuitBlock;
+import gregtech.api.util.GT_CircuitryBehavior;
+
+public class GT_Circuit_BitAnd extends GT_CircuitryBehavior {
+
+ public GT_Circuit_BitAnd(int aIndex) {
+ super(aIndex);
+ }
+
+ @Override
+ public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ aCircuitData[0] = 0;
+ aCircuitData[1] = 0;
+ aCircuitData[2] = 0;
+ aCircuitData[3] = 0;
+ }
+
+ @Override
+ public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (aCircuitData[0] < 0) {
+ aCircuitData[0] = 0;
+ }
+ if (aCircuitData[1] < 0) {
+ aCircuitData[1] = 0;
+ }
+ if (aCircuitData[2] < 0) {
+ aCircuitData[2] = 0;
+ }
+ if (aCircuitData[3] < 0) {
+ aCircuitData[3] = 0;
+ }
+ if (aCircuitData[0] > 1) {
+ aCircuitData[0] = 1;
+ }
+ if (aCircuitData[1] > 1) {
+ aCircuitData[1] = 1;
+ }
+ if (aCircuitData[2] > 1) {
+ aCircuitData[2] = 1;
+ }
+ if (aCircuitData[3] > 1) {
+ aCircuitData[3] = 1;
+ }
+ }
+
+ @Override
+ public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ aRedstoneCircuitBlock.setRedstone(
+ (byte) ((getStrongestRedstone(aRedstoneCircuitBlock)
+ & (aCircuitData[0] | aCircuitData[1] << 1 | aCircuitData[2] << 2 | aCircuitData[3] << 3)) != 0 ? 15
+ : 0),
+ aRedstoneCircuitBlock.getOutputFacing());
+ }
+
+ @Override
+ public String getName() {
+ return "Hardcode Bit-AND";
+ }
+
+ @Override
+ public String getDescription() {
+ return "( signal & this ) != 0";
+ }
+
+ @Override
+ public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) {
+ return "Bit " + aCircuitDataIndex + ":";
+ }
+
+ @Override
+ public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) {
+ return false;
+ }
+
+ @Override
+ public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) {
+ return aCircuitData[aCircuitDataIndex] == 0 ? "OFF" : "ON";
+ }
+}
diff --git a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_CombinationLock.java b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_CombinationLock.java
new file mode 100644
index 0000000000..67d8527606
--- /dev/null
+++ b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_CombinationLock.java
@@ -0,0 +1,109 @@
+package gregtech.common.redstonecircuits;
+
+import gregtech.api.interfaces.IRedstoneCircuitBlock;
+import gregtech.api.util.GT_CircuitryBehavior;
+
+public class GT_Circuit_CombinationLock extends GT_CircuitryBehavior {
+
+ public GT_Circuit_CombinationLock(int aIndex) {
+ super(aIndex);
+ }
+
+ @Override
+ public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ aCircuitData[0] = 1;
+ aCircuitData[1] = 0;
+ aCircuitData[2] = 0;
+ aCircuitData[3] = 0;
+ aCircuitData[4] = 0;
+ aCircuitData[5] = 0;
+ }
+
+ @Override
+ public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (aCircuitData[0] < 1) {
+ aCircuitData[0] = 1;
+ }
+ if (aCircuitData[1] < 0) {
+ aCircuitData[1] = 0;
+ }
+ if (aCircuitData[2] < 0) {
+ aCircuitData[2] = 0;
+ }
+ if (aCircuitData[3] < 0) {
+ aCircuitData[3] = 0;
+ }
+ if (aCircuitData[0] > 15) {
+ aCircuitData[0] = 15;
+ }
+ if (aCircuitData[1] > 15) {
+ aCircuitData[1] = 15;
+ }
+ if (aCircuitData[2] > 15) {
+ aCircuitData[2] = 15;
+ }
+ if (aCircuitData[3] > 15) {
+ aCircuitData[3] = 15;
+ }
+ if (aCircuitData[4] < 0) {
+ aCircuitData[4] = 0;
+ }
+ if (aCircuitData[4] > 3) {
+ aCircuitData[4] = 3;
+ }
+ if (aCircuitData[5] < 0) {
+ aCircuitData[5] = 0;
+ }
+ }
+
+ @Override
+ public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ while ((aCircuitData[aCircuitData[4]] == 0) && (aCircuitData[4] < 4)) {
+ aCircuitData[4] += 1;
+ }
+ if (aCircuitData[4] < 4) {
+ int tRedstone = getStrongestRedstone(aRedstoneCircuitBlock);
+ if (tRedstone > 0) {
+ if (aCircuitData[5] == 0) {
+ if (tRedstone == aCircuitData[aCircuitData[4]]) {
+ aCircuitData[4] += 1;
+ } else {
+ aCircuitData[4] = 0;
+ }
+ }
+ aCircuitData[5] = 1;
+ } else {
+ aCircuitData[5] = 0;
+ }
+ aRedstoneCircuitBlock.setRedstone((byte) 0, aRedstoneCircuitBlock.getOutputFacing());
+ } else {
+ aRedstoneCircuitBlock.setRedstone((byte) 15, aRedstoneCircuitBlock.getOutputFacing());
+ aCircuitData[4] = 0;
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "Combination Lock";
+ }
+
+ @Override
+ public String getDescription() {
+ return "Checks Combinations";
+ }
+
+ @Override
+ public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) {
+ return "Power " + aCircuitDataIndex;
+ }
+
+ @Override
+ public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) {
+ return false;
+ }
+
+ @Override
+ public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) {
+ return null;
+ }
+}
diff --git a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Equals.java b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Equals.java
new file mode 100644
index 0000000000..9e9af183e8
--- /dev/null
+++ b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Equals.java
@@ -0,0 +1,73 @@
+package gregtech.common.redstonecircuits;
+
+import gregtech.api.interfaces.IRedstoneCircuitBlock;
+import gregtech.api.util.GT_CircuitryBehavior;
+
+public class GT_Circuit_Equals extends GT_CircuitryBehavior {
+
+ public GT_Circuit_Equals(int aIndex) {
+ super(aIndex);
+ }
+
+ @Override
+ public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ aCircuitData[0] = 0;
+ aCircuitData[1] = 0;
+ }
+
+ @Override
+ public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (aCircuitData[0] < 0) {
+ aCircuitData[0] = 0;
+ }
+ if (aCircuitData[0] > 15) {
+ aCircuitData[0] = 15;
+ }
+ if (aCircuitData[1] < 0) {
+ aCircuitData[3] = 0;
+ }
+ if (aCircuitData[1] > 1) {
+ aCircuitData[3] = 1;
+ }
+ }
+
+ @Override
+ public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ aRedstoneCircuitBlock.setRedstone(
+ ((byte) (((aCircuitData[1] != 0) == (getStrongestRedstone(aRedstoneCircuitBlock) == aCircuitData[0])) ? 0
+ : 15)),
+ aRedstoneCircuitBlock.getOutputFacing());
+ }
+
+ @Override
+ public String getName() {
+ return "Equals";
+ }
+
+ @Override
+ public String getDescription() {
+ return "signal == this";
+ }
+
+ @Override
+ public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) {
+ return switch (aCircuitDataIndex) {
+ case 0 -> "Signal";
+ case 1 -> aCircuitData[1] == 0 ? "Equal" : "Unequal";
+ default -> "";
+ };
+ }
+
+ @Override
+ public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) {
+ return false;
+ }
+
+ @Override
+ public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) {
+ if (aCircuitDataIndex > 0) {
+ return "";
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Pulser.java b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Pulser.java
new file mode 100644
index 0000000000..c54d0be060
--- /dev/null
+++ b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Pulser.java
@@ -0,0 +1,92 @@
+package gregtech.common.redstonecircuits;
+
+import gregtech.api.interfaces.IRedstoneCircuitBlock;
+import gregtech.api.util.GT_CircuitryBehavior;
+
+public class GT_Circuit_Pulser extends GT_CircuitryBehavior {
+
+ public GT_Circuit_Pulser(int aIndex) {
+ super(aIndex);
+ }
+
+ @Override
+ public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ aCircuitData[0] = 1;
+ aCircuitData[1] = 16;
+ aCircuitData[4] = 0;
+ }
+
+ @Override
+ public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (aCircuitData[0] < 1) {
+ aCircuitData[0] = 1;
+ }
+ if (aCircuitData[1] < 0) {
+ aCircuitData[1] = 0;
+ }
+ if (aCircuitData[1] > 16) {
+ aCircuitData[1] = 16;
+ }
+ if (aCircuitData[4] < 0) {
+ aCircuitData[4] = 0;
+ }
+ }
+
+ @Override
+ public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ byte redstoneSignal = aCircuitData[1] == 0 ? getWeakestNonZeroRedstone(aRedstoneCircuitBlock)
+ : getStrongestRedstone(aRedstoneCircuitBlock);
+ if (aCircuitData[4] == 0) {
+ aCircuitData[5] = redstoneSignal;
+ }
+ if ((redstoneSignal > 0) || (aCircuitData[4] > 0)) {
+ int index = 4;
+ int tmp42_41 = aCircuitData[index];
+ aCircuitData[index] = (tmp42_41 + 1);
+ if ((tmp42_41 >= aCircuitData[0]) && (redstoneSignal <= 0)) {
+ aCircuitData[4] = 0;
+ }
+ }
+ aRedstoneCircuitBlock.setRedstone(
+ (aCircuitData[4] > 0) && (aCircuitData[4] <= aCircuitData[0]) ? (byte) aCircuitData[1]
+ : (aCircuitData[1] <= 0) || (aCircuitData[1] > 15) ? (byte) aCircuitData[5] : 0,
+ aRedstoneCircuitBlock.getOutputFacing());
+ }
+
+ @Override
+ public String getName() {
+ return "Pulser";
+ }
+
+ @Override
+ public String getDescription() {
+ return "Limits&Enlengths";
+ }
+
+ @Override
+ public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) {
+ return switch (aCircuitDataIndex) {
+ case 0 -> "Length";
+ case 1 -> "RS Out";
+ default -> "";
+ };
+ }
+
+ @Override
+ public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) {
+ return false;
+ }
+
+ @Override
+ public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) {
+ if (aCircuitDataIndex == 1) {
+ if (aCircuitData[aCircuitDataIndex] == 16) {
+ return "HIGHEST";
+ }
+ if (aCircuitData[aCircuitDataIndex] == 0) {
+ return "LOWEST";
+ }
+ }
+ return aCircuitDataIndex > 1 ? "" : null;
+ }
+}
diff --git a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Randomizer.java b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Randomizer.java
new file mode 100644
index 0000000000..336bf9928d
--- /dev/null
+++ b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Randomizer.java
@@ -0,0 +1,86 @@
+package gregtech.common.redstonecircuits;
+
+import gregtech.api.interfaces.IRedstoneCircuitBlock;
+import gregtech.api.util.GT_CircuitryBehavior;
+
+public class GT_Circuit_Randomizer extends GT_CircuitryBehavior {
+
+ public GT_Circuit_Randomizer(int aIndex) {
+ super(aIndex);
+ }
+
+ @Override
+ public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ aCircuitData[0] = 1;
+ aCircuitData[4] = 0;
+ }
+
+ @Override
+ public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (aCircuitData[0] < 1) {
+ aCircuitData[0] = 1;
+ }
+ if (aCircuitData[3] < 0) {
+ aCircuitData[3] = 0;
+ }
+ if (aCircuitData[3] > 1) {
+ aCircuitData[3] = 1;
+ }
+ if (aCircuitData[4] < 0) {
+ aCircuitData[4] = 0;
+ }
+ }
+
+ @Override
+ public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (aCircuitData[3] == 1) {
+ if (getAnyRedstone(aRedstoneCircuitBlock)) {
+ aCircuitData[4] += 1;
+ } else {
+ aCircuitData[4] = 0;
+ }
+ } else if (getAnyRedstone(aRedstoneCircuitBlock)) {
+ aCircuitData[4] = 0;
+ } else {
+ aCircuitData[4] += 1;
+ }
+ if (aCircuitData[4] >= aCircuitData[0]) {
+ aCircuitData[4] = 0;
+ aRedstoneCircuitBlock
+ .setRedstone((byte) aRedstoneCircuitBlock.getRandom(16), aRedstoneCircuitBlock.getOutputFacing());
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "Randomizer";
+ }
+
+ @Override
+ public String getDescription() {
+ return "Randomizes Redstone";
+ }
+
+ @Override
+ public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) {
+ return switch (aCircuitDataIndex) {
+ case 0 -> "Delay";
+ case 3 -> aCircuitData[aCircuitDataIndex] == 1 ? "RS => ON" : "RS => OFF";
+ case 4 -> "Status";
+ default -> "";
+ };
+ }
+
+ @Override
+ public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) {
+ return false;
+ }
+
+ @Override
+ public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) {
+ if (aCircuitDataIndex != 0) {
+ return "";
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_RedstoneMeter.java b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_RedstoneMeter.java
new file mode 100644
index 0000000000..4db261fcf0
--- /dev/null
+++ b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_RedstoneMeter.java
@@ -0,0 +1,94 @@
+package gregtech.common.redstonecircuits;
+
+import gregtech.api.interfaces.IRedstoneCircuitBlock;
+import gregtech.api.util.GT_CircuitryBehavior;
+
+public class GT_Circuit_RedstoneMeter extends GT_CircuitryBehavior {
+
+ public GT_Circuit_RedstoneMeter(int aIndex) {
+ super(aIndex);
+ }
+
+ @Override
+ public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ aCircuitData[0] = 1;
+ aCircuitData[1] = 15;
+ aCircuitData[2] = 0;
+ aCircuitData[3] = 15;
+ }
+
+ @Override
+ public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (aCircuitData[0] < 0) {
+ aCircuitData[0] = 0;
+ }
+ if (aCircuitData[0] > 15) {
+ aCircuitData[0] = 15;
+ }
+ if (aCircuitData[1] < 0) {
+ aCircuitData[1] = 0;
+ }
+ if (aCircuitData[1] > 15) {
+ aCircuitData[1] = 15;
+ }
+ if (aCircuitData[1] < aCircuitData[0]) {
+ aCircuitData[1] = aCircuitData[0];
+ }
+ if (aCircuitData[2] < 0) {
+ aCircuitData[2] = 0;
+ }
+ if (aCircuitData[2] > 1) {
+ aCircuitData[2] = 1;
+ }
+ if (aCircuitData[3] < 0) {
+ aCircuitData[3] = 0;
+ }
+ if (aCircuitData[3] > 15) {
+ aCircuitData[3] = 15;
+ }
+ }
+
+ @Override
+ public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ byte tRedstone = getStrongestRedstone(aRedstoneCircuitBlock);
+ aRedstoneCircuitBlock
+ .setRedstone(
+ ((tRedstone >= aCircuitData[0]) && (tRedstone <= aCircuitData[1]) ? 1 : 0)
+ != (aCircuitData[2] != 0 ? 1 : 0) ? (byte) aCircuitData[3] : 0,
+ aRedstoneCircuitBlock.getOutputFacing());
+ }
+
+ @Override
+ public String getName() {
+ return "Redstone Meter";
+ }
+
+ @Override
+ public String getDescription() {
+ return "Checks Boundaries";
+ }
+
+ @Override
+ public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) {
+ return switch (aCircuitDataIndex) {
+ case 0 -> "Lower";
+ case 1 -> "Upper";
+ case 2 -> "Invert:";
+ case 3 -> "RS Out:";
+ default -> "";
+ };
+ }
+
+ @Override
+ public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) {
+ return false;
+ }
+
+ @Override
+ public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) {
+ if (aCircuitDataIndex == 2) {
+ return aCircuitData[2] == 0 ? "OFF" : "ON";
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Repeater.java b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Repeater.java
new file mode 100644
index 0000000000..b96762d73b
--- /dev/null
+++ b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Repeater.java
@@ -0,0 +1,86 @@
+package gregtech.common.redstonecircuits;
+
+import gregtech.api.interfaces.IRedstoneCircuitBlock;
+import gregtech.api.util.GT_CircuitryBehavior;
+
+public class GT_Circuit_Repeater extends GT_CircuitryBehavior {
+
+ public GT_Circuit_Repeater(int aIndex) {
+ super(aIndex);
+ }
+
+ @Override
+ public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ aCircuitData[0] = 1;
+ aCircuitData[4] = 0;
+ aCircuitData[5] = -1;
+ }
+
+ @Override
+ public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (aCircuitData[0] < 1) {
+ aCircuitData[0] = 1;
+ }
+ if (aCircuitData[4] < 0) {
+ aCircuitData[4] = 0;
+ }
+ if (aCircuitData[5] < -1) {
+ aCircuitData[5] = -1;
+ }
+ }
+
+ @Override
+ public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (getAnyRedstone(aRedstoneCircuitBlock)) {
+ aCircuitData[4] += 1;
+ if (aCircuitData[5] < 0) {
+ aCircuitData[5] = 0;
+ }
+ }
+ if ((aCircuitData[5] >= 0) && (aCircuitData[5] < aCircuitData[0])) {
+ aCircuitData[5] += 1;
+ }
+ if (aCircuitData[4] > 0) {
+ if (aCircuitData[5] >= aCircuitData[0]) {
+ aCircuitData[4] -= 1;
+ aRedstoneCircuitBlock.setRedstone((byte) 15, aRedstoneCircuitBlock.getOutputFacing());
+ } else {
+ aRedstoneCircuitBlock.setRedstone((byte) 0, aRedstoneCircuitBlock.getOutputFacing());
+ }
+ } else {
+ aRedstoneCircuitBlock.setRedstone((byte) 0, aRedstoneCircuitBlock.getOutputFacing());
+ aCircuitData[5] = -1;
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "Repeater";
+ }
+
+ @Override
+ public String getDescription() {
+ return "Delays RS-Signal";
+ }
+
+ @Override
+ public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) {
+ if (aCircuitDataIndex == 0) {
+ return "Delay";
+ }
+ return "";
+ }
+
+ @Override
+ public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) {
+ return false;
+ }
+
+ @Override
+ public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) {
+ if (aCircuitDataIndex > 0) {
+ return "";
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Timer.java b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Timer.java
new file mode 100644
index 0000000000..026c83dfbc
--- /dev/null
+++ b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Timer.java
@@ -0,0 +1,108 @@
+package gregtech.common.redstonecircuits;
+
+import gregtech.api.interfaces.IRedstoneCircuitBlock;
+import gregtech.api.util.GT_CircuitryBehavior;
+
+public class GT_Circuit_Timer extends GT_CircuitryBehavior {
+
+ public GT_Circuit_Timer(int aIndex) {
+ super(aIndex);
+ }
+
+ @Override
+ public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ aCircuitData[0] = 2;
+ aCircuitData[1] = 1;
+ aCircuitData[2] = 2;
+ aCircuitData[4] = 0;
+ }
+
+ @Override
+ public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (aCircuitData[0] < 2) {
+ aCircuitData[0] = 2;
+ }
+ if (aCircuitData[1] < 1) {
+ aCircuitData[1] = 1;
+ }
+ if (aCircuitData[2] < 2) {
+ aCircuitData[2] = 2;
+ }
+ if (aCircuitData[3] < 0) {
+ aCircuitData[3] = 0;
+ }
+ if (aCircuitData[3] > 1) {
+ aCircuitData[3] = 1;
+ }
+ if (aCircuitData[4] < 0) {
+ aCircuitData[4] = 0;
+ }
+ }
+
+ @Override
+ public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (aCircuitData[3] == 1) {
+ if (getAnyRedstone(aRedstoneCircuitBlock)) {
+ aCircuitData[4] += 1;
+ } else {
+ aCircuitData[4] = 0;
+ }
+ } else if (getAnyRedstone(aRedstoneCircuitBlock)) {
+ aCircuitData[4] = 0;
+ } else {
+ aCircuitData[4] += 1;
+ }
+ if (aCircuitData[4] >= aCircuitData[0]) {
+ if (aCircuitData[1] > 1) {
+ if (aCircuitData[4] >= aCircuitData[0] + (aCircuitData[1] - 1) * aCircuitData[2]) {
+ aRedstoneCircuitBlock.setRedstone((byte) 15, aRedstoneCircuitBlock.getOutputFacing());
+ aCircuitData[4] = 0;
+ } else {
+ aRedstoneCircuitBlock.setRedstone(
+ (byte) ((aCircuitData[4] - aCircuitData[0]) % aCircuitData[2] == 0 ? 15 : 0),
+ aRedstoneCircuitBlock.getOutputFacing());
+ }
+ } else {
+ aRedstoneCircuitBlock.setRedstone((byte) 15, aRedstoneCircuitBlock.getOutputFacing());
+ aCircuitData[4] = 0;
+ }
+ } else {
+ aRedstoneCircuitBlock.setRedstone((byte) 0, aRedstoneCircuitBlock.getOutputFacing());
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "Timer";
+ }
+
+ @Override
+ public String getDescription() {
+ return "Pulses Redstone";
+ }
+
+ @Override
+ public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) {
+ return switch (aCircuitDataIndex) {
+ case 0 -> "Delay";
+ case 1 -> "Pulses";
+ case 2 -> "Length";
+ case 3 -> aCircuitData[aCircuitDataIndex] == 1 ? "RS => ON" : "RS => OFF";
+ case 4 -> "Time";
+ default -> "";
+ };
+ }
+
+ @Override
+ public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) {
+ return false;
+ }
+
+ @Override
+ public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) {
+ if (aCircuitDataIndex == 3) {
+ return "";
+ }
+ return null;
+ }
+}