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
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -13,3 +13,4 @@ run/
|
||||
*.iws
|
||||
.idea/
|
||||
out/
|
||||
/bin/
|
@@ -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");
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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);
|
||||
}
|
@@ -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;
|
||||
@@ -53,6 +54,11 @@ public interface INetwork {
|
||||
*/
|
||||
ICraftingManager getCraftingManager();
|
||||
|
||||
/**
|
||||
* @return the {@link IEnergy} of this network
|
||||
*/
|
||||
IEnergy getEnergy();
|
||||
|
||||
/**
|
||||
* @return the {@link IItemGridHandler} of this network
|
||||
*/
|
||||
|
@@ -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<UUID, Integer> energyStorages;
|
||||
|
||||
public Energy(int controllerCapacity) {
|
||||
this.energyStorages = new Object2ObjectOpenHashMap<UUID, Integer>();
|
||||
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);
|
||||
}
|
||||
}
|
@@ -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);
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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<Integer, TileController> REDSTONE_MODE = RedstoneMode.createParameter();
|
||||
public static final TileDataParameter<Integer, TileController> ENERGY_USAGE = new TileDataParameter<>(DataSerializers.VARINT, 0, TileController::getEnergyUsage);
|
||||
public static final TileDataParameter<Integer, TileController> ENERGY_STORED = new TileDataParameter<>(DataSerializers.VARINT, 0, t -> t.getEnergy().getEnergyStored());
|
||||
public static final TileDataParameter<Integer, TileController> ENERGY_CAPACITY = new TileDataParameter<>(DataSerializers.VARINT, 0, t -> t.getEnergy().getMaxEnergyStored());
|
||||
public static final TileDataParameter<Integer, TileController> ENERGY_STORED = new TileDataParameter<>(DataSerializers.VARINT, 0, t -> t.getEnergy().getStored());
|
||||
public static final TileDataParameter<Integer, TileController> ENERGY_CAPACITY = new TileDataParameter<>(DataSerializers.VARINT, 0, t -> t.getEnergy().getCapacity());
|
||||
public static final TileDataParameter<List<ClientNode>, TileController> NODES = new TileDataParameter<>(RSSerializers.CLIENT_NODE_SERIALIZER, new ArrayList<>(), t -> {
|
||||
List<ClientNode> 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;
|
||||
@@ -164,8 +167,9 @@ 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
|
||||
@@ -584,13 +588,7 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe
|
||||
@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> T getCapability(@Nonnull Capability<T> 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) {
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user