diff options
Diffstat (limited to 'src/main/java/gregtech/api/GregTech_API.java')
-rw-r--r-- | src/main/java/gregtech/api/GregTech_API.java | 47 |
1 files changed, 37 insertions, 10 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; } /** |