From 74659706679398f28bcbf03148a6210df217088a Mon Sep 17 00:00:00 2001 From: Samtrion Date: Mon, 25 Jun 2018 18:57:13 +0200 Subject: [PATCH] RS API Extension - Network Energy Core (#1829) * RS API Extension - Network Energy Core for #1823 + ADDED: Config option to adjust max receive rate for the controller * Fixed points of code review. * Fixed minor styling issues, and missing renames * NAARR * Update TilePortableGrid.java * Update TilePortableGrid.java * Update TileController.java * Update EnergyProxy.java * Update IEnergy.java * Update Energy.java * Update TileController.java * Update TilePortableGrid.java --- .gitignore | 1 + .../raoulvdberge/refinedstorage/RSConfig.java | 2 + .../api/energy/EnergyProxy.java | 49 +++++++++++ .../refinedstorage/api/energy/IEnergy.java | 19 ++++ .../refinedstorage/api/network/INetwork.java | 6 ++ .../refinedstorage/apiimpl/energy/Energy.java | 87 +++++++++++++++++++ .../refinedstorage/block/BlockController.java | 6 +- .../integration/forgeenergy/EnergyForge.java | 25 ------ .../refinedstorage/tile/TileController.java | 48 +++++----- .../tile/grid/portable/TilePortableGrid.java | 14 +-- 10 files changed, 199 insertions(+), 58 deletions(-) create mode 100644 src/main/java/com/raoulvdberge/refinedstorage/api/energy/EnergyProxy.java create mode 100644 src/main/java/com/raoulvdberge/refinedstorage/api/energy/IEnergy.java create mode 100644 src/main/java/com/raoulvdberge/refinedstorage/apiimpl/energy/Energy.java delete mode 100644 src/main/java/com/raoulvdberge/refinedstorage/integration/forgeenergy/EnergyForge.java diff --git a/.gitignore b/.gitignore index ae019ee66..2deaebd86 100755 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ run/ *.iws .idea/ out/ +/bin/ \ No newline at end of file diff --git a/src/main/java/com/raoulvdberge/refinedstorage/RSConfig.java b/src/main/java/com/raoulvdberge/refinedstorage/RSConfig.java index 5d45a349d..ba522b91c 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/RSConfig.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/RSConfig.java @@ -16,6 +16,7 @@ public final class RSConfig { //region Energy public int controllerBaseUsage; + public int controllerMaxReceive; public int cableUsage; public int constructorUsage; public int crafterUsage; @@ -140,6 +141,7 @@ public final class RSConfig { private void loadConfig() { //region Energy controllerBaseUsage = config.getInt("controllerBase", ENERGY, 0, 0, Integer.MAX_VALUE, "The base energy used by the Controller"); + controllerMaxReceive = config.getInt("controllerMaxReceive", ENERGY, Integer.MAX_VALUE, 0, Integer.MAX_VALUE, "The maximum energy the controller receives per tick"); cableUsage = config.getInt("cable", ENERGY, 0, 0, Integer.MAX_VALUE, "The energy used by Cables"); constructorUsage = config.getInt("constructor", ENERGY, 1, 0, Integer.MAX_VALUE, "The energy used by Constructors"); crafterUsage = config.getInt("crafter", ENERGY, 2, 0, Integer.MAX_VALUE, "The base energy used by Crafters"); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/energy/EnergyProxy.java b/src/main/java/com/raoulvdberge/refinedstorage/api/energy/EnergyProxy.java new file mode 100644 index 000000000..4b894a2ae --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/energy/EnergyProxy.java @@ -0,0 +1,49 @@ +package com.raoulvdberge.refinedstorage.api.energy; + +import net.minecraftforge.energy.IEnergyStorage; + +public final class EnergyProxy implements IEnergyStorage { + private final int maxReceive; + private final int maxExtract; + private final IEnergy energy; + + public EnergyProxy(IEnergy energy, int maxTransfer) { + this(energy, maxTransfer, maxTransfer); + } + + public EnergyProxy(IEnergy energy, int maxReceive, int maxExtract) { + this.energy = energy; + this.maxReceive = maxReceive; + this.maxExtract = maxExtract; + } + + @Override + public int receiveEnergy(int maxReceive, boolean simulate) { + return !canReceive() ? 0 : this.energy.insert(Math.min(this.maxReceive, maxReceive), simulate); + } + + @Override + public int extractEnergy(int maxExtract, boolean simulate) { + return !canExtract() ? 0 : this.energy.extract(Math.min(this.maxExtract, maxExtract), simulate); + } + + @Override + public int getEnergyStored() { + return this.energy.getStored(); + } + + @Override + public int getMaxEnergyStored() { + return this.energy.getCapacity(); + } + + @Override + public boolean canExtract() { + return this.maxExtract > 0; + } + + @Override + public boolean canReceive() { + return this.maxReceive > 0; + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/energy/IEnergy.java b/src/main/java/com/raoulvdberge/refinedstorage/api/energy/IEnergy.java new file mode 100644 index 000000000..e5b776fba --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/energy/IEnergy.java @@ -0,0 +1,19 @@ +package com.raoulvdberge.refinedstorage.api.energy; + +import java.util.UUID; + +public interface IEnergy { + void decreaseCapacity(UUID id, int amount); + + int extract(int amount, boolean simulate); + + int getCapacity(); + + int getStored(); + + void increaseCapacity(UUID id, int amount); + + int insert(int amount, boolean simulate); + + void setStored(int energyAmount); +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetwork.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetwork.java index 984e10f68..32d981924 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetwork.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetwork.java @@ -1,6 +1,7 @@ package com.raoulvdberge.refinedstorage.api.network; import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingManager; +import com.raoulvdberge.refinedstorage.api.energy.IEnergy; import com.raoulvdberge.refinedstorage.api.network.grid.handler.IFluidGridHandler; import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler; import com.raoulvdberge.refinedstorage.api.network.item.INetworkItemHandler; @@ -52,6 +53,11 @@ public interface INetwork { * @return the {@link ICraftingManager} of this network */ ICraftingManager getCraftingManager(); + + /** + * @return the {@link IEnergy} of this network + */ + IEnergy getEnergy(); /** * @return the {@link IItemGridHandler} of this network diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/energy/Energy.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/energy/Energy.java new file mode 100644 index 000000000..15c2f7ed8 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/energy/Energy.java @@ -0,0 +1,87 @@ +package com.raoulvdberge.refinedstorage.apiimpl.energy; + +import java.util.Map; +import java.util.UUID; + +import com.raoulvdberge.refinedstorage.api.energy.IEnergy; + +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; + +public final class Energy implements IEnergy { + private static final UUID UUID_EMPTY = new UUID(0l, 0l); + + protected int capacity; + protected int energy; + + private final Map energyStorages; + + public Energy(int controllerCapacity) { + this.energyStorages = new Object2ObjectOpenHashMap(); + this.energyStorages.put(UUID_EMPTY, controllerCapacity); + calculateCapacity(); + } + + private void calculateCapacity() { + long newCapacity = energyStorages.values().stream().mapToLong(Long::valueOf).sum(); + this.capacity = (int) Math.min(newCapacity, Integer.MAX_VALUE); + } + + @Override + public void decreaseCapacity(UUID id, int amount) { + if (id.equals(UUID_EMPTY)) { + return; + } + this.energyStorages.remove(id); + calculateCapacity(); + } + + @Override + public int extract(int maxExtract, boolean simulate) { + if (maxExtract <= 0) { + return 0; + } + + int energyExtracted = Math.min(energy, maxExtract); + if (!simulate) { + energy -= energyExtracted; + } + return energyExtracted; + } + + @Override + public int getCapacity() { + return this.capacity; + } + + @Override + public int getStored() { + return this.energy; + } + + @Override + public void increaseCapacity(UUID id, int amount) { + if (id.equals(UUID_EMPTY) || amount <= 0) { + return; + } + this.energyStorages.merge(id, amount, (k, v) -> amount); + calculateCapacity(); + } + + @Override + public int insert (int maxReceive, boolean simulate) { + if (maxReceive <= 0) { + return 0; + } + + int energyReceived = Math.min(capacity - energy, maxReceive); + if (!simulate) { + energy += energyReceived; + } + return energyReceived; + } + + @Override + public void setStored(int energy) { + this.energy = Math.min(energy, this.capacity); + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockController.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockController.java index 962fe7323..6d3fe8c93 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockController.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockController.java @@ -89,7 +89,7 @@ public class BlockController extends BlockBase { NBTTagCompound tag = stack.getTagCompound(); if (tag != null && tag.hasKey(TileController.NBT_ENERGY)) { - controller.getEnergy().setEnergyStored(tag.getInteger(TileController.NBT_ENERGY)); + controller.getEnergy().setStored(tag.getInteger(TileController.NBT_ENERGY)); } } @@ -101,8 +101,8 @@ public class BlockController extends BlockBase { ItemStack stack = new ItemStack(RSBlocks.CONTROLLER, 1, RSBlocks.CONTROLLER.getMetaFromState(state)); stack.setTagCompound(new NBTTagCompound()); - stack.getTagCompound().setInteger(TileController.NBT_ENERGY, ((TileController) world.getTileEntity(pos)).getEnergy().getEnergyStored()); - stack.getTagCompound().setInteger(TileController.NBT_ENERGY_CAPACITY, ((TileController) world.getTileEntity(pos)).getEnergy().getMaxEnergyStored()); + stack.getTagCompound().setInteger(TileController.NBT_ENERGY, ((TileController) world.getTileEntity(pos)).getEnergy().getStored()); + stack.getTagCompound().setInteger(TileController.NBT_ENERGY_CAPACITY, ((TileController) world.getTileEntity(pos)).getEnergy().getCapacity()); drops.add(stack); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/integration/forgeenergy/EnergyForge.java b/src/main/java/com/raoulvdberge/refinedstorage/integration/forgeenergy/EnergyForge.java deleted file mode 100644 index 915408261..000000000 --- a/src/main/java/com/raoulvdberge/refinedstorage/integration/forgeenergy/EnergyForge.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.raoulvdberge.refinedstorage.integration.forgeenergy; - -import net.minecraftforge.energy.EnergyStorage; - -public class EnergyForge extends EnergyStorage { - public EnergyForge(int capacity) { - super(capacity, capacity, 0); - } - - public int extractEnergyInternal(int maxExtract) { - int energyExtracted = Math.min(energy, maxExtract); - - energy -= energyExtracted; - - return energyExtracted; - } - - public void setMaxEnergyStored(int capacity) { - this.capacity = capacity; - } - - public void setEnergyStored(int energy) { - this.energy = energy; - } -} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java index cc39e0113..e0ecbb006 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java @@ -4,6 +4,8 @@ import com.google.common.base.Preconditions; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSBlocks; import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingManager; +import com.raoulvdberge.refinedstorage.api.energy.EnergyProxy; +import com.raoulvdberge.refinedstorage.api.energy.IEnergy; import com.raoulvdberge.refinedstorage.api.network.INetwork; import com.raoulvdberge.refinedstorage.api.network.INetworkNodeGraph; import com.raoulvdberge.refinedstorage.api.network.grid.handler.IFluidGridHandler; @@ -19,6 +21,7 @@ import com.raoulvdberge.refinedstorage.api.storage.IStorage; import com.raoulvdberge.refinedstorage.api.storage.IStorageCache; import com.raoulvdberge.refinedstorage.api.storage.IStorageTracker; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.CraftingManager; +import com.raoulvdberge.refinedstorage.apiimpl.energy.Energy; import com.raoulvdberge.refinedstorage.apiimpl.network.NetworkNodeGraph; import com.raoulvdberge.refinedstorage.apiimpl.network.grid.handler.FluidGridHandler; import com.raoulvdberge.refinedstorage.apiimpl.network.grid.handler.ItemGridHandler; @@ -35,7 +38,6 @@ import com.raoulvdberge.refinedstorage.block.BlockController; import com.raoulvdberge.refinedstorage.block.ControllerEnergyType; import com.raoulvdberge.refinedstorage.block.ControllerType; import com.raoulvdberge.refinedstorage.capability.CapabilityNetworkNodeProxy; -import com.raoulvdberge.refinedstorage.integration.forgeenergy.EnergyForge; import com.raoulvdberge.refinedstorage.tile.config.IRedstoneConfigurable; import com.raoulvdberge.refinedstorage.tile.config.RedstoneMode; import com.raoulvdberge.refinedstorage.tile.data.RSSerializers; @@ -75,8 +77,8 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe public static final TileDataParameter REDSTONE_MODE = RedstoneMode.createParameter(); public static final TileDataParameter ENERGY_USAGE = new TileDataParameter<>(DataSerializers.VARINT, 0, TileController::getEnergyUsage); - public static final TileDataParameter ENERGY_STORED = new TileDataParameter<>(DataSerializers.VARINT, 0, t -> t.getEnergy().getEnergyStored()); - public static final TileDataParameter ENERGY_CAPACITY = new TileDataParameter<>(DataSerializers.VARINT, 0, t -> t.getEnergy().getMaxEnergyStored()); + public static final TileDataParameter ENERGY_STORED = new TileDataParameter<>(DataSerializers.VARINT, 0, t -> t.getEnergy().getStored()); + public static final TileDataParameter ENERGY_CAPACITY = new TileDataParameter<>(DataSerializers.VARINT, 0, t -> t.getEnergy().getCapacity()); public static final TileDataParameter, TileController> NODES = new TileDataParameter<>(RSSerializers.CLIENT_NODE_SERIALIZER, new ArrayList<>(), t -> { List nodes = new ArrayList<>(); @@ -134,7 +136,8 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe private IReaderWriterManager readerWriterManager = new ReaderWriterManager(this); - private EnergyForge energy = new EnergyForge(RS.INSTANCE.config.controllerCapacity); + private final IEnergy energy = new Energy(RS.INSTANCE.config.controllerCapacity); + private final EnergyProxy energyProxy = new EnergyProxy(this.energy, RS.INSTANCE.config.controllerMaxReceive, 0); private boolean throttlingDisabled = true; // Will be enabled after first update private boolean couldRun; @@ -163,9 +166,10 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe } }); } - - public EnergyForge getEnergy() { - return energy; + + @Override + public IEnergy getEnergy() { + return this.energy; } @Override @@ -175,7 +179,7 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe @Override public boolean canRun() { - return energy.getEnergyStored() > 0 && redstoneMode.isEnabled(world, pos); + return this.energy.getStored() > 0 && redstoneMode.isEnabled(world, pos); } @Override @@ -208,14 +212,14 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe if (getType() == ControllerType.NORMAL) { if (!RS.INSTANCE.config.controllerUsesEnergy) { - energy.setEnergyStored(energy.getMaxEnergyStored()); - } else if (energy.getEnergyStored() - getEnergyUsage() >= 0) { - energy.extractEnergyInternal(getEnergyUsage()); + this.energy.setStored(this.energy.getCapacity()); + } else if (this.energy.extract(getEnergyUsage(), true) >= 0) { + this.energy.extract(getEnergyUsage(), false); } else { - energy.setEnergyStored(0); + this.energy.setStored(0); } } else if (getType() == ControllerType.CREATIVE) { - energy.setEnergyStored(energy.getMaxEnergyStored()); + this.energy.setStored(this.energy.getCapacity()); } boolean canRun = canRun(); @@ -489,7 +493,7 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe super.read(tag); if (tag.hasKey(NBT_ENERGY)) { - energy.setEnergyStored(tag.getInteger(NBT_ENERGY)); + this.energy.setStored(tag.getInteger(NBT_ENERGY)); } redstoneMode = RedstoneMode.read(tag); @@ -511,7 +515,7 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe public NBTTagCompound write(NBTTagCompound tag) { super.write(tag); - tag.setInteger(NBT_ENERGY, energy.getEnergyStored()); + tag.setInteger(NBT_ENERGY, this.energy.getStored()); redstoneMode.write(tag); @@ -566,7 +570,7 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe return energyType; } - return getEnergyType(energy.getEnergyStored(), energy.getMaxEnergyStored()); + return getEnergyType(this.energy.getStored(), this.energy.getCapacity()); } @Override @@ -580,17 +584,11 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe markDirty(); } - + @Override public int getEnergyUsage() { int usage = RS.INSTANCE.config.controllerBaseUsage; - - for (INetworkNode node : nodeGraph.all()) { - if (node.canUpdate()) { - usage += node.getEnergyUsage(); - } - } - + usage += nodeGraph.all().stream().mapToInt(x-> x.getEnergyUsage()).sum(); return usage; } @@ -635,7 +633,7 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe @Override public T getCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) { if (capability == CapabilityEnergy.ENERGY) { - return CapabilityEnergy.ENERGY.cast(energy); + return CapabilityEnergy.ENERGY.cast(energyProxy); } if (capability == CapabilityNetworkNodeProxy.NETWORK_NODE_PROXY_CAPABILITY) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java index 8e6c5ae1f..381c3f551 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java @@ -28,7 +28,6 @@ import com.raoulvdberge.refinedstorage.block.PortableGridDiskState; import com.raoulvdberge.refinedstorage.block.PortableGridType; import com.raoulvdberge.refinedstorage.gui.GuiBase; import com.raoulvdberge.refinedstorage.gui.grid.GuiGrid; -import com.raoulvdberge.refinedstorage.integration.forgeenergy.EnergyForge; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBase; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerFilter; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerListenerTile; @@ -54,6 +53,7 @@ import net.minecraft.util.EnumFacing; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.Constants; import net.minecraftforge.energy.CapabilityEnergy; +import net.minecraftforge.energy.EnergyStorage; import net.minecraftforge.items.IItemHandlerModifiable; import javax.annotation.Nonnull; @@ -108,7 +108,7 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid, private static final String NBT_CONNECTED = "Connected"; private static final String NBT_STORAGE_TRACKER = "StorageTracker"; - private EnergyForge energyStorage = new EnergyForge(ItemEnergyItem.CAPACITY); + private EnergyStorage energyStorage = recreateEnergyStorage(0); private PortableGridType type; private RedstoneMode redstoneMode = RedstoneMode.IGNORE; @@ -200,7 +200,7 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid, this.tabPage = ItemWirelessGrid.getTabPage(stack); this.size = ItemWirelessGrid.getSize(stack); - this.energyStorage.setEnergyStored(stack.getCapability(CapabilityEnergy.ENERGY, null).getEnergyStored()); + this.energyStorage = recreateEnergyStorage(stack.getCapability(CapabilityEnergy.ENERGY, null).getEnergyStored()); if (stack.hasTagCompound()) { for (int i = 0; i < 4; ++i) { @@ -221,6 +221,10 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid, markDirty(); } + private EnergyStorage recreateEnergyStorage(int energyStored) { + return new EnergyStorage(ItemEnergyItem.CAPACITY, ItemEnergyItem.CAPACITY, 0, energyStored); + } + public ItemStack getAsItem() { ItemStack stack = new ItemStack(RSBlocks.PORTABLE_GRID, 1, getPortableType() == PortableGridType.NORMAL ? ItemBlockPortableGrid.TYPE_NORMAL : ItemBlockPortableGrid.TYPE_CREATIVE); @@ -468,7 +472,7 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid, @Override public void drainEnergy(int energy) { if (RS.INSTANCE.config.portableGridUsesEnergy && getPortableType() != PortableGridType.CREATIVE && redstoneMode.isEnabled(world, pos)) { - energyStorage.extractEnergyInternal(energy); + energyStorage.extractEnergy(energy, false); checkIfDiskStateChanged(); } @@ -580,7 +584,7 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid, StackUtils.readItems(filter, 1, tag); if (tag.hasKey(NBT_ENERGY)) { - energyStorage.setEnergyStored(tag.getInteger(NBT_ENERGY)); + energyStorage = recreateEnergyStorage(tag.getInteger(NBT_ENERGY)); } redstoneMode = RedstoneMode.read(tag);