From bc387ee47ad984357c836de7f46a1561ed283666 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Tue, 4 Aug 2020 13:50:22 +0200 Subject: [PATCH] Updated EnergyNet code --- .../core/networks/energy/EnergyNet.java | 175 ++++++++++-------- .../listeners/DebugFishListener.java | 22 +-- 2 files changed, 105 insertions(+), 92 deletions(-) diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/networks/energy/EnergyNet.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/networks/energy/EnergyNet.java index 3f8440eda..d995fbc9f 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/networks/energy/EnergyNet.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/networks/energy/EnergyNet.java @@ -25,7 +25,6 @@ import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.Slimefun; -import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; /** * The {@link EnergyNet} is an implementation of {@link Network} that deals with @@ -44,20 +43,20 @@ public class EnergyNet extends Network { private static final int RANGE = 6; - public static EnergyNetComponentType getComponent(Location l) { + private static EnergyNetComponent getComponent(Location l) { String id = BlockStorage.checkID(l); if (id == null) { - return EnergyNetComponentType.NONE; + return null; } SlimefunItem item = SlimefunItem.getByID(id); if (item instanceof EnergyNetComponent) { - return ((EnergyNetComponent) item).getEnergyComponentType(); + return ((EnergyNetComponent) item); } - return EnergyNetComponentType.NONE; + return null; } public static EnergyNet getNetworkFromLocationOrCreate(Location l) { @@ -73,9 +72,9 @@ public class EnergyNet extends Network { } } - private final Set generators = new HashSet<>(); - private final Set storage = new HashSet<>(); - private final Set consumers = new HashSet<>(); + private final Map generators = new HashMap<>(); + private final Map capacitors = new HashMap<>(); + private final Map consumers = new HashMap<>(); protected EnergyNet(Location l) { super(SlimefunPlugin.getNetworkManager(), l); @@ -92,15 +91,22 @@ public class EnergyNet extends Network { return NetworkComponent.REGULATOR; } - switch (getComponent(l)) { - case CAPACITOR: - return NetworkComponent.CONNECTOR; - case CONSUMER: - case GENERATOR: - return NetworkComponent.TERMINUS; - default: + EnergyNetComponent component = getComponent(l); + + if (component == null) { return null; } + else { + switch (component.getEnergyComponentType()) { + case CAPACITOR: + return NetworkComponent.CONNECTOR; + case CONSUMER: + case GENERATOR: + return NetworkComponent.TERMINUS; + default: + return null; + } + } } @Override @@ -110,18 +116,22 @@ public class EnergyNet extends Network { consumers.remove(l); } - switch (getComponent(l)) { - case CAPACITOR: - storage.add(l); - break; - case CONSUMER: - consumers.add(l); - break; - case GENERATOR: - generators.add(l); - break; - default: - break; + EnergyNetComponent component = getComponent(l); + + if (component != null) { + switch (component.getEnergyComponentType()) { + case CAPACITOR: + capacitors.put(l, component); + break; + case CONSUMER: + consumers.put(l, component); + break; + case GENERATOR: + generators.put(l, component); + break; + default: + break; + } } } @@ -139,14 +149,15 @@ public class EnergyNet extends Network { SimpleHologram.update(b, "&4No Energy Network found"); } else { - Map generatorsWithCapacity = new HashMap<>(); - int supply = tickAllGenerators(generatorsWithCapacity, timestamp::getAndAdd) + tickAllCapacitors(); + int supply = tickAllGenerators(timestamp::getAndAdd) + tickAllCapacitors(); int remainingEnergy = supply; int demand = 0; - for (Location machine : consumers) { - int capacity = ChargableBlock.getMaxCharge(machine); - int charge = ChargableBlock.getCharge(machine); + for (Map.Entry entry : consumers.entrySet()) { + Location l = entry.getKey(); + EnergyNetComponent component = entry.getValue(); + int capacity = component.getCapacity(); + int charge = component.getCharge(l); if (charge < capacity) { int availableSpace = capacity - charge; @@ -154,18 +165,18 @@ public class EnergyNet extends Network { if (remainingEnergy > 0) { if (remainingEnergy > availableSpace) { - ChargableBlock.setUnsafeCharge(machine, capacity, false); + component.setCharge(l, capacity); remainingEnergy -= availableSpace; } else { - ChargableBlock.setUnsafeCharge(machine, charge + remainingEnergy, false); + component.setCharge(l, charge + remainingEnergy); remainingEnergy = 0; } } } } - storeExcessEnergy(generatorsWithCapacity, remainingEnergy); + storeRemainingEnergy(remainingEnergy); updateHologram(b, supply, demand); } @@ -173,75 +184,76 @@ public class EnergyNet extends Network { SlimefunPlugin.getProfiler().closeEntry(b.getLocation(), SlimefunItems.ENERGY_REGULATOR.getItem(), timestamp.get()); } - private void storeExcessEnergy(Map generators, int available) { - for (Location capacitor : storage) { - if (available > 0) { - int capacity = ChargableBlock.getMaxCharge(capacitor); + private void storeRemainingEnergy(int remainingEnergy) { + for (Map.Entry entry : capacitors.entrySet()) { + Location l = entry.getKey(); + EnergyNetComponent component = entry.getValue(); - if (available > capacity) { - ChargableBlock.setUnsafeCharge(capacitor, capacity, true); - available -= capacity; + if (remainingEnergy > 0) { + int capacity = component.getCapacity(); + + if (remainingEnergy > capacity) { + component.setCharge(l, capacity); + remainingEnergy -= capacity; } else { - ChargableBlock.setUnsafeCharge(capacitor, available, true); - available = 0; + component.setCharge(l, remainingEnergy); + remainingEnergy = 0; } } else { - ChargableBlock.setUnsafeCharge(capacitor, 0, true); + component.setCharge(l, 0); } } - for (Map.Entry entry : generators.entrySet()) { - Location generator = entry.getKey(); - int capacity = entry.getValue(); + for (Map.Entry entry : generators.entrySet()) { + Location l = entry.getKey(); + EnergyNetComponent component = entry.getValue(); + int capacity = component.getCapacity(); - if (available > 0) { - if (available > capacity) { - ChargableBlock.setUnsafeCharge(generator, capacity, false); - available -= capacity; + if (remainingEnergy > 0) { + if (remainingEnergy > capacity) { + component.setCharge(l, capacity); + remainingEnergy -= capacity; } else { - ChargableBlock.setUnsafeCharge(generator, available, false); - available = 0; + component.setCharge(l, remainingEnergy); + remainingEnergy = 0; } } else { - ChargableBlock.setUnsafeCharge(generator, 0, false); + component.setCharge(l, 0); } } } - private int tickAllGenerators(Map generatorsWithCapacity, LongConsumer timeCallback) { + private int tickAllGenerators(LongConsumer timings) { Set exploded = new HashSet<>(); int supply = 0; - for (Location source : generators) { + for (Map.Entry entry : generators.entrySet()) { long timestamp = SlimefunPlugin.getProfiler().newEntry(); - Config config = BlockStorage.getLocationInfo(source); - SlimefunItem item = SlimefunItem.getByID(config.getString("id")); + Location l = entry.getKey(); + EnergyNetComponent component = entry.getValue(); - if (item instanceof EnergyNetProvider) { + if (component instanceof EnergyNetProvider) { + SlimefunItem item = (SlimefunItem) component; try { - EnergyNetProvider provider = (EnergyNetProvider) item; - int energy = provider.getGeneratedOutput(source, config); + EnergyNetProvider provider = (EnergyNetProvider) component; + Config config = BlockStorage.getLocationInfo(l); + int energy = provider.getGeneratedOutput(l, config); if (provider.isChargeable()) { - generatorsWithCapacity.put(source, provider.getCapacity()); - String charge = config.getString("energy-charge"); - - if (charge != null) { - energy += Integer.parseInt(charge); - } + energy += provider.getCharge(l); } - if (provider.willExplode(source, config)) { - exploded.add(source); - BlockStorage.clearBlockInfo(source); + if (provider.willExplode(l, config)) { + exploded.add(l); + BlockStorage.clearBlockInfo(l); Slimefun.runSync(() -> { - source.getBlock().setType(Material.LAVA); - source.getWorld().createExplosion(source, 0F, false); + l.getBlock().setType(Material.LAVA); + l.getWorld().createExplosion(l, 0F, false); }); } else { @@ -249,28 +261,29 @@ public class EnergyNet extends Network { } } catch (Exception | LinkageError t) { - exploded.add(source); - new ErrorReport(t, source, item); + exploded.add(l); + new ErrorReport(t, l, item); } - long time = SlimefunPlugin.getProfiler().closeEntry(source, item, timestamp); - timeCallback.accept(time); + long time = SlimefunPlugin.getProfiler().closeEntry(l, item, timestamp); + timings.accept(time); } else { // This block seems to be gone now, better remove it to be extra safe - exploded.add(source); + exploded.add(l); } } - generators.removeAll(exploded); + // Remove all generators which have exploded + generators.keySet().removeAll(exploded); return supply; } private int tickAllCapacitors() { int supply = 0; - for (Location capacitor : storage) { - supply += ChargableBlock.getCharge(capacitor); + for (Map.Entry entry : capacitors.entrySet()) { + supply += entry.getValue().getCharge(entry.getKey()); } return supply; diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/DebugFishListener.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/DebugFishListener.java index ad9edce67..019861205 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/DebugFishListener.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/DebugFishListener.java @@ -18,7 +18,6 @@ import io.github.thebusybiscuit.cscorelib2.chat.ChatColors; import io.github.thebusybiscuit.cscorelib2.skull.SkullBlock; import io.github.thebusybiscuit.slimefun4.core.attributes.EnergyNetComponent; import io.github.thebusybiscuit.slimefun4.core.attributes.EnergyNetProvider; -import io.github.thebusybiscuit.slimefun4.core.networks.energy.EnergyNet; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; import io.github.thebusybiscuit.slimefun4.utils.HeadTexture; @@ -26,7 +25,6 @@ import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.Slimefun; -import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; /** * This {@link Listener} is responsible for handling our debugging tool, the debug fish. @@ -135,16 +133,18 @@ public class DebugFishListener implements Listener { p.sendMessage(ChatColors.color(" &dChunk Timings: &e" + SlimefunPlugin.getProfiler().getTime(b.getChunk()))); } - if (ChargableBlock.isChargable(b)) { - p.sendMessage(ChatColors.color("&dChargeable: " + greenCheckmark)); - p.sendMessage(ChatColors.color(" &dEnergy: &e" + ChargableBlock.getCharge(b) + " / " + ChargableBlock.getMaxCharge(b))); - } - else { - p.sendMessage(ChatColors.color("&dChargeable: " + redCross)); - } - if (item instanceof EnergyNetComponent) { - p.sendMessage(ChatColors.color(" &dEnergyNet Type: &e" + EnergyNet.getComponent(b.getLocation()))); + EnergyNetComponent component = (EnergyNetComponent) item; + p.sendMessage(ChatColors.color("&dEnergyNet Component")); + p.sendMessage(ChatColors.color(" &dType: &e" + component.getEnergyComponentType())); + + if (component.isChargeable()) { + p.sendMessage(ChatColors.color("&dChargeable: " + greenCheckmark)); + p.sendMessage(ChatColors.color(" &dEnergy: &e" + component.getCharge(b.getLocation()) + " / " + component.getCapacity())); + } + else { + p.sendMessage(ChatColors.color("&dChargeable: " + redCross)); + } } p.sendMessage(ChatColors.color("&6" + BlockStorage.getBlockInfoAsJson(b)));