From 1a532aa4dd10babdad95d2c3567c8d9ec4a10969 Mon Sep 17 00:00:00 2001 From: Timo Ley Date: Fri, 9 Dec 2022 22:33:37 +0100 Subject: [PATCH] feat: more generic approach to energy compat --- .../compat/CompatHandler.java | 30 +++++++++++--- ...ickHandler.java => CompatTickHandler.java} | 6 +-- .../compat/ic2/EnergyNetCache.java | 40 ------------------- .../compat/ic2/EventHandler.java | 32 --------------- .../compat/ic2/IC2CompatHelper.java | 21 ---------- .../compat/ic2/IC2CompatModule.java | 20 +++++++++- .../core/UniversalElectricity.java | 2 +- .../prefab/tile/ElectricTileDriver.java | 7 +++- .../prefab/tile/TileEntityConductor.java | 4 ++ 9 files changed, 56 insertions(+), 106 deletions(-) rename src/main/java/universalelectricity/compat/{ic2/TickHandler.java => CompatTickHandler.java} (74%) delete mode 100644 src/main/java/universalelectricity/compat/ic2/EnergyNetCache.java delete mode 100644 src/main/java/universalelectricity/compat/ic2/EventHandler.java delete mode 100644 src/main/java/universalelectricity/compat/ic2/IC2CompatHelper.java diff --git a/src/main/java/universalelectricity/compat/CompatHandler.java b/src/main/java/universalelectricity/compat/CompatHandler.java index 9ce1561..e554575 100644 --- a/src/main/java/universalelectricity/compat/CompatHandler.java +++ b/src/main/java/universalelectricity/compat/CompatHandler.java @@ -1,20 +1,40 @@ package universalelectricity.compat; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.Loader; -import net.minecraftforge.common.MinecraftForge; +import net.minecraft.tileentity.TileEntity; import universalelectricity.api.CompatibilityModule; import universalelectricity.compat.ic2.IC2CompatModule; -import universalelectricity.compat.ic2.EventHandler; -import universalelectricity.compat.ic2.TickHandler; +import universalelectricity.prefab.tile.ElectricTileDriver; public class CompatHandler { + static Map ticklist = new ConcurrentHashMap<>(); + public static void initCompatHandlers() { + FMLCommonHandler.instance().bus().register(new CompatTickHandler()); if (Loader.isModLoaded("IC2")) { CompatibilityModule.register(new IC2CompatModule()); - MinecraftForge.EVENT_BUS.register(new EventHandler()); - FMLCommonHandler.instance().bus().register(new TickHandler()); + } + } + + public static void tick() { + for(TileEntity t : ticklist.keySet()) { + ElectricTileDriver driver = ticklist.get(t); + if (!driver.tick()) { + System.out.println("Remove driver for tile at x:" + t.xCoord + " y:" + t.yCoord + " z:" + t.zCoord); + ticklist.remove(t); + driver.invalidate(); + } + } + } + + public static void registerTile(TileEntity tile) { + if (!ticklist.containsKey(tile) && CompatibilityModule.isHandler(tile)) { + ticklist.put(tile, new ElectricTileDriver(tile)); } } diff --git a/src/main/java/universalelectricity/compat/ic2/TickHandler.java b/src/main/java/universalelectricity/compat/CompatTickHandler.java similarity index 74% rename from src/main/java/universalelectricity/compat/ic2/TickHandler.java rename to src/main/java/universalelectricity/compat/CompatTickHandler.java index 21c0e0b..dc61260 100644 --- a/src/main/java/universalelectricity/compat/ic2/TickHandler.java +++ b/src/main/java/universalelectricity/compat/CompatTickHandler.java @@ -1,15 +1,15 @@ -package universalelectricity.compat.ic2; +package universalelectricity.compat; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent.Phase; import cpw.mods.fml.common.gameevent.TickEvent.ServerTickEvent; -public class TickHandler { +public class CompatTickHandler { @SubscribeEvent public void onTick(ServerTickEvent event) { if (event.phase == Phase.END) { - EnergyNetCache.tickAll(); + CompatHandler.tick(); } } diff --git a/src/main/java/universalelectricity/compat/ic2/EnergyNetCache.java b/src/main/java/universalelectricity/compat/ic2/EnergyNetCache.java deleted file mode 100644 index 126769b..0000000 --- a/src/main/java/universalelectricity/compat/ic2/EnergyNetCache.java +++ /dev/null @@ -1,40 +0,0 @@ -package universalelectricity.compat.ic2; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import universalelectricity.core.Pair; -import universalelectricity.core.vector.Vector3; -import universalelectricity.prefab.tile.ElectricTileDriver; - -public class EnergyNetCache { - - private static Map, ElectricTileDriver> tiles = new ConcurrentHashMap<>(); - - public static Pair toKey(TileEntity tile) { - return new Pair(tile.getWorldObj(), new Vector3(tile)); - } - - public static void load(TileEntity tile) { - tiles.put(toKey(tile), new ElectricTileDriver(tile)); - } - - public static void unload(TileEntity tile) { - ElectricTileDriver handler = tiles.get(toKey(tile)); - if (handler != null) handler.invalidate(); - tiles.remove(toKey(tile)); - } - - public static void tickAll() { - for (ElectricTileDriver handler : tiles.values()) { - handler.tick(); - } - } - - public static boolean contains(TileEntity tile) { - return tiles.containsKey(toKey(tile)); - } - -} diff --git a/src/main/java/universalelectricity/compat/ic2/EventHandler.java b/src/main/java/universalelectricity/compat/ic2/EventHandler.java deleted file mode 100644 index 5e7eabb..0000000 --- a/src/main/java/universalelectricity/compat/ic2/EventHandler.java +++ /dev/null @@ -1,32 +0,0 @@ -package universalelectricity.compat.ic2; - -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.gameevent.TickEvent.Phase; -import cpw.mods.fml.common.gameevent.TickEvent.ServerTickEvent; -import cpw.mods.fml.common.gameevent.TickEvent.WorldTickEvent; -import cpw.mods.fml.relauncher.Side; -import ic2.api.energy.event.EnergyTileLoadEvent; -import ic2.api.energy.event.EnergyTileUnloadEvent; -import ic2.api.energy.tile.IEnergySink; -import ic2.api.energy.tile.IEnergySource; -import mekanism.api.energy.ICableOutputter; -import mekanism.api.energy.IStrictEnergyAcceptor; -import net.minecraft.tileentity.TileEntity; -import universalelectricity.core.block.IConnector; - -public class EventHandler { - - @SubscribeEvent - public void onLoadTile(EnergyTileLoadEvent event) { - TileEntity te = (TileEntity) event.energyTile; - if (te instanceof IConnector || te instanceof IStrictEnergyAcceptor || te instanceof ICableOutputter) return; - if (te instanceof IEnergySink || te instanceof IEnergySource) EnergyNetCache.load(te); - } - - @SubscribeEvent - public void onUnloadTile(EnergyTileUnloadEvent event) { - TileEntity te = (TileEntity) event.energyTile; - EnergyNetCache.unload(te); - } - -} diff --git a/src/main/java/universalelectricity/compat/ic2/IC2CompatHelper.java b/src/main/java/universalelectricity/compat/ic2/IC2CompatHelper.java deleted file mode 100644 index a9bb075..0000000 --- a/src/main/java/universalelectricity/compat/ic2/IC2CompatHelper.java +++ /dev/null @@ -1,21 +0,0 @@ -package universalelectricity.compat.ic2; - -public class IC2CompatHelper { - - public static int voltToTier(double volt) { - if (volt <= 120.0) return 1; - if (volt <= 240.0) return 2; - if (volt <= 480.0) return 3; - return 4; - } - - public static double tierToVolt(int tier) { - switch (tier) { - case 1: return 120.0; - case 2: return 240.0; - case 3: return 480.0; - default: return 960.0; - } - } - -} diff --git a/src/main/java/universalelectricity/compat/ic2/IC2CompatModule.java b/src/main/java/universalelectricity/compat/ic2/IC2CompatModule.java index 313e830..8ff1fb2 100644 --- a/src/main/java/universalelectricity/compat/ic2/IC2CompatModule.java +++ b/src/main/java/universalelectricity/compat/ic2/IC2CompatModule.java @@ -162,7 +162,7 @@ public class IC2CompatModule extends CompatibilityModule { TileEntity tile = getENetTile(handler); if (tile instanceof IEnergySink) { - return IC2CompatHelper.tierToVolt(((IEnergySink)tile).getSinkTier()); + return tierToVolt(((IEnergySink)tile).getSinkTier()); } return 0; @@ -173,7 +173,7 @@ public class IC2CompatModule extends CompatibilityModule { TileEntity tile = getENetTile(handler); if (tile instanceof IEnergySource) { - return IC2CompatHelper.tierToVolt(((IEnergySource)tile).getSourceTier()); + return tierToVolt(((IEnergySource)tile).getSourceTier()); } return 0; @@ -222,5 +222,21 @@ public class IC2CompatModule extends CompatibilityModule { } return 0; } + + public static int voltToTier(double volt) { + if (volt <= 120.0) return 1; + if (volt <= 240.0) return 2; + if (volt <= 480.0) return 3; + return 4; + } + + public static double tierToVolt(int tier) { + switch (tier) { + case 1: return 120.0; + case 2: return 240.0; + case 3: return 480.0; + default: return 960.0; + } + } } diff --git a/src/main/java/universalelectricity/core/UniversalElectricity.java b/src/main/java/universalelectricity/core/UniversalElectricity.java index ffb2a9c..729ee32 100644 --- a/src/main/java/universalelectricity/core/UniversalElectricity.java +++ b/src/main/java/universalelectricity/core/UniversalElectricity.java @@ -17,7 +17,7 @@ public class UniversalElectricity { public static final Configuration CONFIGURATION = new Configuration(new File(Loader.instance().getConfigDir(), "UniversalElectricity.cfg")); public static double UE_IC2_RATIO = CompatibilityType.INDUSTRIALCRAFT.reciprocal_ratio; public static double UE_RF_RATIO = CompatibilityType.REDSTONE_FLUX.reciprocal_ratio; - public static boolean isVoltageSensitive = false; + public static boolean isVoltageSensitive = true; public static boolean isNetworkActive = false; public static final Material machine = new Material(MapColor.ironColor); diff --git a/src/main/java/universalelectricity/prefab/tile/ElectricTileDriver.java b/src/main/java/universalelectricity/prefab/tile/ElectricTileDriver.java index 61a734c..bc0edc9 100644 --- a/src/main/java/universalelectricity/prefab/tile/ElectricTileDriver.java +++ b/src/main/java/universalelectricity/prefab/tile/ElectricTileDriver.java @@ -9,6 +9,7 @@ import java.util.Set; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; import universalelectricity.api.CompatibilityModule; +import universalelectricity.core.UniversalElectricity; import universalelectricity.core.electricity.ElectricityNetworkHelper; import universalelectricity.core.electricity.ElectricityPack; import universalelectricity.core.electricity.IElectricityNetwork; @@ -26,7 +27,8 @@ public class ElectricTileDriver { ElectricityNetworkHelper.invalidate(handler); } - public void tick() { + public boolean tick() { + if (handler.isInvalid()) return false; Map networks = getNetworks(); Set inputSides = new HashSet<>(); if (CompatibilityModule.canReceive(handler, ForgeDirection.UNKNOWN)) { @@ -35,6 +37,7 @@ public class ElectricTileDriver { if (CompatibilityModule.canExtract(handler, ForgeDirection.UNKNOWN)) { produce(networks, inputSides); } + return networks.size() > 0; } public Set consume(Map networks) { @@ -50,7 +53,7 @@ public class ElectricTileDriver { inputSides.add(side); net.startRequesting(handler, wattsPerSide / voltage, voltage); ElectricityPack receivedPack = net.consumeElectricity(handler); - if (receivedPack.voltage > voltage) { + if (receivedPack.voltage > voltage && UniversalElectricity.isVoltageSensitive) { handler.getWorldObj().createExplosion(null, handler.xCoord, handler.yCoord, handler.zCoord, 1, true); return EnumSet.allOf(ForgeDirection.class); } diff --git a/src/main/java/universalelectricity/prefab/tile/TileEntityConductor.java b/src/main/java/universalelectricity/prefab/tile/TileEntityConductor.java index 29ceab2..1fcd78a 100644 --- a/src/main/java/universalelectricity/prefab/tile/TileEntityConductor.java +++ b/src/main/java/universalelectricity/prefab/tile/TileEntityConductor.java @@ -11,8 +11,10 @@ import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.compat.CompatHandler; import universalelectricity.core.block.IConductor; import universalelectricity.core.block.INetworkProvider; +import universalelectricity.core.block.ISelfDriven; import universalelectricity.core.electricity.ElectricityNetwork; import universalelectricity.core.electricity.ElectricityNetworkHelper; import universalelectricity.core.electricity.IElectricityNetwork; @@ -34,6 +36,8 @@ public abstract class TileEntityConductor extends TileEntityAdvanced implements this.visuallyConnected[side.ordinal()] = true; if(tileEntity.getClass() == this.getClass() && tileEntity instanceof INetworkProvider) { this.getNetwork().mergeConnection(((INetworkProvider)tileEntity).getNetwork()); + } else if (!(tileEntity instanceof ISelfDriven)) { + CompatHandler.registerTile(tileEntity); } return;