aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/gregtech/api/GregTech_API.java47
-rw-r--r--src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverBase.java3
-rw-r--r--src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterBase.java3
-rw-r--r--src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterExternal.java6
-rw-r--r--src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterInternal.java3
5 files changed, 47 insertions, 15 deletions
diff --git a/src/main/java/gregtech/api/GregTech_API.java b/src/main/java/gregtech/api/GregTech_API.java
index fefbe06518..d4fd4206cf 100644
--- a/src/main/java/gregtech/api/GregTech_API.java
+++ b/src/main/java/gregtech/api/GregTech_API.java
@@ -20,6 +20,7 @@ import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.internal.IGT_RecipeAdder;
import gregtech.api.interfaces.internal.IThaumcraftCompat;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.ICoverable;
import gregtech.api.interfaces.tileentity.IMachineBlockUpdateable;
import gregtech.api.items.GT_CoolantCellIC_Item;
import gregtech.api.items.GT_CoolantCell_Item;
@@ -176,24 +177,50 @@ public class GregTech_API {
/**
* The Advanced Redstone Frequencies
*/
- public static final Map<String, Map<Integer, Byte>> sAdvancedWirelessRedstone = new ConcurrentHashMap<>();
+ public static final Map<String, Map<Integer, Map<Long, Byte>>> sAdvancedWirelessRedstone = new ConcurrentHashMap<>();
public static Byte getAdvancedRedstone(UUID uuid, int frequency) {
- Map<Integer, Byte> frequencies = GregTech_API.sAdvancedWirelessRedstone.get(String.valueOf(uuid));
+ Map<Integer, Map<Long, Byte>> frequencies = GregTech_API.sAdvancedWirelessRedstone.get(String.valueOf(uuid));
if (frequencies == null) return 0;
- return frequencies.getOrDefault(frequency, (byte) 0);
+
+ // TODO: Implement All Modes
+ Map<Long, Byte> signals = frequencies.get(frequency);
+ if (signals == null) return 0;
+
+ return (byte) (signals.values().stream()
+ .map(signal -> signal > 0)
+ .reduce(true, (signalA, signalB) -> signalA && signalB) ? 15 : 0);
}
- public static void removeAdvancedRedstone(UUID uuid, int frequency) {
- Map<Integer, Byte> frequencies = GregTech_API.sAdvancedWirelessRedstone.get(String.valueOf(uuid));
+ public static void removeAdvancedRedstone(UUID uuid, int frequency, long hash) {
+ Map<Integer, Map<Long, Byte>> frequencies = GregTech_API.sAdvancedWirelessRedstone.get(String.valueOf(uuid));
if (frequencies == null) return;
- frequencies.remove(frequency);
+ frequencies.computeIfPresent(frequency, (freq, longByteMap) -> {
+ longByteMap.remove(hash);
+ return longByteMap.isEmpty() ? null : longByteMap;
+ });
+ }
+
+ public static void setAdvancedRedstone(UUID uuid, int frequency, long hash, byte value) {
+ Map<Integer, Map<Long, Byte>> frequencies = GregTech_API.sAdvancedWirelessRedstone.computeIfAbsent(String.valueOf(uuid), k -> new ConcurrentHashMap<>());
+ Map<Long, Byte> signals = frequencies.computeIfAbsent(frequency, k -> new ConcurrentHashMap<>());
+ signals.put(hash, value);
}
- public static void setAdvancedRedstone(UUID uuid, int frequency, byte value) {
- String key = String.valueOf(uuid);
- Map<Integer, Byte> frequencies = GregTech_API.sAdvancedWirelessRedstone.computeIfAbsent(key, k -> new ConcurrentHashMap<>());
- frequencies.put(frequency, value);
+ /**
+ * x hashed into first 20 bytes
+ * y hashed into second 20 bytes
+ * z hashed into fifth 10 bytes
+ * dim hashed into sixth 10 bytes
+ * side hashed into last 4 bytes
+ */
+ public static long hashCoverCoords(ICoverable tile, byte side) {
+ return (((((long)
+ tile.getXCoord() << 20) +
+ tile.getZCoord() << 10) +
+ tile.getYCoord() << 10) +
+ tile.getWorld().provider.dimensionId << 4) +
+ side;
}
/**
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
index ccd0ea0b8f..bbe43f9c92 100644
--- a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverBase.java
+++ b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverBase.java
@@ -47,7 +47,8 @@ public class GT_Cover_AdvancedRedstoneReceiverBase extends GT_CoverBehaviorBase<
@Override
public boolean onCoverRemovalImpl(byte aSide, int aCoverID, ReceiverData aCoverVariable, ICoverable aTileEntity,
boolean aForced) {
- GregTech_API.removeAdvancedRedstone(aCoverVariable.uuid, aCoverVariable.frequency);
+ long hash = GregTech_API.hashCoverCoords(aTileEntity, aSide);
+ GregTech_API.removeAdvancedRedstone(aCoverVariable.uuid, aCoverVariable.frequency, hash);
return true;
}
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
index a71cea094a..f7f6cc3a40 100644
--- a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterBase.java
+++ b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterBase.java
@@ -47,7 +47,8 @@ public class GT_Cover_AdvancedRedstoneTransmitterBase extends GT_CoverBehaviorBa
@Override
public boolean onCoverRemovalImpl(byte aSide, int aCoverID, TransmitterData aCoverVariable, ICoverable aTileEntity,
boolean aForced) {
- GregTech_API.removeAdvancedRedstone(aCoverVariable.uuid, aCoverVariable.frequency);
+ long hash = GregTech_API.hashCoverCoords(aTileEntity, aSide);
+ GregTech_API.removeAdvancedRedstone(aCoverVariable.uuid, aCoverVariable.frequency, hash);
return true;
}
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
index 51533c2b98..d33ed2d47a 100644
--- a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterExternal.java
+++ b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterExternal.java
@@ -12,14 +12,16 @@ public class GT_Cover_AdvancedRedstoneTransmitterExternal extends GT_Cover_Advan
@Override
public TransmitterData doCoverThingsImpl(byte aSide, byte aInputRedstone, int aCoverID,
- TransmitterData aCoverVariable, ICoverable tile, long aTimer) {
+ TransmitterData aCoverVariable, ICoverable aTileEntity, long aTimer) {
byte outputRedstone = aInputRedstone;
if (aCoverVariable.isInvert()) {
if (outputRedstone > 0) outputRedstone = 0;
else outputRedstone = 15;
}
- GregTech_API.setAdvancedRedstone(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), outputRedstone);
+ long hash = GregTech_API.hashCoverCoords(aTileEntity, aSide);
+ GregTech_API.setAdvancedRedstone(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), hash, outputRedstone);
+
return aCoverVariable;
}
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
index 058081fd13..93f769c567 100644
--- a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterInternal.java
+++ b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterInternal.java
@@ -19,7 +19,8 @@ public class GT_Cover_AdvancedRedstoneTransmitterInternal extends GT_Cover_Advan
else outputRedstone = 15;
}
- GregTech_API.setAdvancedRedstone(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), outputRedstone);
+ long hash = GregTech_API.hashCoverCoords(aTileEntity, aSide);
+ GregTech_API.setAdvancedRedstone(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), hash, outputRedstone);
return aCoverVariable;
}