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:
Samtrion
2018-06-25 18:57:13 +02:00
committed by Raoul
parent 6929566324
commit 7465970667
10 changed files with 199 additions and 58 deletions

1
.gitignore vendored
View File

@@ -13,3 +13,4 @@ run/
*.iws
.idea/
out/
/bin/

View File

@@ -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");

View File

@@ -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;
}
}

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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);
}
}

View File

@@ -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);
}

View File

@@ -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;
}
}

View File

@@ -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;
@@ -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> 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) {

View File

@@ -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);