Skip to content

Commit 1857d32

Browse files
committed
Work-in-progress Batteries and battery boxes for the electric system.
Improvements and bugfixes to energy transfer and block networks.
1 parent c5e8d31 commit 1857d32

34 files changed

+467
-47
lines changed

energy/build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ dependencies {
1717
if(findProject(":catalyst") != null){
1818
implementation project(path: ':catalyst', configuration: "namedElements")
1919
implementation project(path: ":btwaila",configuration: "namedElements")
20+
implementation project(path: ":guilib",configuration: "namedElements")
2021
} else {
2122
implementation project(path: ':', configuration: "namedElements")
2223
}

energy/src/main/java/sunsetsatellite/catalyst/CatalystEnergy.java

+13
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,16 @@
66
import net.minecraft.core.data.tag.Tag;
77
import org.slf4j.Logger;
88
import org.slf4j.LoggerFactory;
9+
import sunsetsatellite.catalyst.core.util.MpGuiEntry;
10+
import sunsetsatellite.catalyst.core.util.tile.TEFeature;
11+
import sunsetsatellite.catalyst.core.util.tile.feature.ItemContainerFeature;
912
import sunsetsatellite.catalyst.energy.improved.electric.test.block.color.BlockColorWire;
13+
import sunsetsatellite.catalyst.energy.improved.electric.test.container.ContainerSimpleElectricBatteryBox;
1014
import sunsetsatellite.catalyst.energy.improved.electric.test.data.ElectricBlocks;
1115
import sunsetsatellite.catalyst.energy.improved.electric.test.data.ElectricConfig;
16+
import sunsetsatellite.catalyst.energy.improved.electric.test.data.ElectricItems;
1217
import sunsetsatellite.catalyst.energy.improved.electric.test.data.WireMaterials;
18+
import sunsetsatellite.catalyst.energy.improved.electric.test.gui.GuiSimpleElectricBatteryBox;
1319
import sunsetsatellite.catalyst.energy.improved.electric.test.tile.TileEntityCable;
1420
import sunsetsatellite.catalyst.energy.improved.electric.test.tile.TileEntitySimpleElectricBatteryBox;
1521
import sunsetsatellite.catalyst.energy.improved.electric.test.tile.TileEntitySimpleElectricGenerator;
@@ -34,6 +40,8 @@ public class CatalystEnergy implements ModInitializer, GameStartEntrypoint {
3440
public static final Tag<Block> ENERGY_CONDUITS_CONNECT = Tag.of("energy_conduits_connect");
3541
public static final Tag<Block> WIRES_CONNECT = Tag.of("wires_connect");
3642

43+
public static final String ITEM_CONTAINER_FEATURE = "catalyst-energy:feature/item_container";
44+
3745
/*public static final BlockWire wire = new BlockBuilder(MOD_ID)
3846
.setTextures("catalyst-energy:block/wire")
3947
.build(new BlockWire("wire",1550));
@@ -80,12 +88,17 @@ public void onInitialize() {
8088
ElectricConfig.class.getClass();
8189
new WireMaterials().init();
8290
new ElectricBlocks().init();
91+
new ElectricItems().init();
92+
93+
TEFeature.registerFeature(ITEM_CONTAINER_FEATURE, ItemContainerFeature.class);
8394

8495
EntityHelper.createTileEntity(TileEntitySimpleElectricBatteryBox.class,"ElBatteryBox");
8596
EntityHelper.createTileEntity(TileEntitySimpleElectricGenerator.class,"ElSimpleGenerator");
8697
EntityHelper.createTileEntity(TileEntitySimpleElectricMachine.class,"ElSimpleMachine");
8798
EntityHelper.createTileEntity(TileEntityCable.class,"ElCable");
8899

100+
Catalyst.GUIS.register("ElBatteryBox",new MpGuiEntry(TileEntitySimpleElectricBatteryBox.class, GuiSimpleElectricBatteryBox.class, ContainerSimpleElectricBatteryBox.class));
101+
89102
LOGGER.info("Catalyst: Energy initialized.");
90103
}
91104

energy/src/main/java/sunsetsatellite/catalyst/energy/improved/electric/api/IElectric.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,16 @@ default long internalRemoveEnergy(long energy) {
7676
return internalChangeEnergy(-Math.min(getEnergy(),energy));
7777
}
7878

79+
double getAverageEnergyTransfer();
80+
7981
/**
8082
* @return Amperage currently being used
8183
*/
8284
long getAmpsCurrentlyUsed();
8385

84-
void addAmpUsage(long amperage);
86+
double getAverageAmpLoad();
87+
88+
void addAmpsToUse(long amperage);
8589

8690
/**
8791
* Only this method should be to pass energy in blocks, handles both voltage and amperage.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package sunsetsatellite.catalyst.energy.improved.electric.api;
2+
3+
import net.minecraft.core.item.ItemStack;
4+
5+
public interface IElectricItem {
6+
7+
/**
8+
* @return Amount of energy currently available in item
9+
*/
10+
long getEnergy(ItemStack stack);
11+
/**
12+
* @return Maximum energy capacity of the item
13+
*/
14+
long getCapacity();
15+
16+
/**
17+
* @return Amount of unused capacity left
18+
*/
19+
default long getCapacityRemaining(ItemStack stack) {
20+
return getCapacity() - getEnergy(stack);
21+
}
22+
23+
/**
24+
* @return Maximum voltage this item can handle
25+
*/
26+
long getMaxVoltage();
27+
28+
/**
29+
* @return Maximum amount of amps this item can use
30+
*/
31+
long getMaxInputAmperage();
32+
33+
34+
/**
35+
* @return Maximum amperage this item can deliver
36+
*/
37+
long getMaxOutputAmperage();
38+
39+
}
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
package sunsetsatellite.catalyst.energy.improved.electric.api;
22

3+
import sunsetsatellite.catalyst.energy.improved.electric.test.block.BlockElectric;
4+
35
public interface IVoltageTiered {
46

57
VoltageTier getTier();
8+
9+
default VoltageTier getTier(BlockElectric block){
10+
return block.getTier();
11+
}
612
}

energy/src/main/java/sunsetsatellite/catalyst/energy/improved/electric/api/VoltageTier.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ public enum VoltageTier {
77
LV("Low Voltage",9,32, TextFormatting.RED,0xFF5555),
88
MV("Medium Voltage",33,128, TextFormatting.ORANGE,0xFFAA00),
99
HV("High Voltage",129,512, TextFormatting.YELLOW,0xFFFF55),
10-
EV("Extreme Voltage",513,1024, TextFormatting.GREEN,0x55FF55),
11-
UV("Ultra Voltage",1025,2048, TextFormatting.LIGHT_BLUE,0x5555FF),
12-
OV("Over Voltage",2049,Integer.MAX_VALUE, TextFormatting.MAGENTA,0xFF55FF);
10+
EV("Extreme Voltage",513,2048, TextFormatting.GREEN,0x55FF55),
11+
UV("Ultimate Voltage",2048,8192, TextFormatting.LIGHT_BLUE,0x8C0000),
12+
OV("Over Voltage",8193,32767, TextFormatting.PURPLE,0x8C0000),
13+
MAX("Maximum Voltage",32768,65535, TextFormatting.MAGENTA,0xFF55FF);
1314

1415
VoltageTier(String voltageName, int minVoltage, int maxVoltage, TextFormatting textColor, int color){
1516
this.voltageName = voltageName;

energy/src/main/java/sunsetsatellite/catalyst/energy/improved/electric/api/impl/btwaila/tooltip/ElectricTooltip.java

+23-8
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package sunsetsatellite.catalyst.energy.improved.electric.api.impl.btwaila.tooltip;
22

33
import net.minecraft.client.render.stitcher.TextureRegistry;
4+
import net.minecraft.core.net.command.TextFormatting;
45
import sunsetsatellite.catalyst.energy.improved.electric.base.TileEntityElectricBase;
56
import sunsetsatellite.catalyst.energy.improved.electric.base.TileEntityElectricGenerator;
7+
import sunsetsatellite.catalyst.energy.improved.electric.base.TileEntityElectricStorage;
68
import sunsetsatellite.catalyst.energy.improved.electric.test.tile.TileEntitySimpleElectricBatteryBox;
79
import sunsetsatellite.catalyst.energy.improved.electric.test.tile.TileEntitySimpleElectricGenerator;
810
import sunsetsatellite.catalyst.energy.improved.electric.test.tile.TileEntitySimpleElectricMachine;
@@ -20,20 +22,33 @@ public void initTooltip() {
2022

2123
@Override
2224
public void drawAdvancedTooltip(TileEntityElectricBase tile, AdvancedInfoComponent c) {
23-
ProgressBarOptions progressBarOptions = new ProgressBarOptions(160, "Amps: ", true, false);
24-
progressBarOptions.fgOptions.setColor(0xFFAA00);
25-
progressBarOptions.fgOptions.setCoordinate(TextureRegistry.getTexture("minecraft:block/sand"));
26-
progressBarOptions.bgOptions.setCoordinate(TextureRegistry.getTexture("minecraft:block/obsidian"));
25+
//Amps
2726
if(tile instanceof TileEntityElectricGenerator){
28-
c.drawProgressBarTextureWithText((int) tile.getAmpsCurrentlyUsed(),(int) tile.getMaxOutputAmperage(),progressBarOptions,0);
29-
27+
/*ProgressBarOptions progressBarOptions = new ProgressBarOptions(160, "Amps OUT: ", true, false);
28+
progressBarOptions.fgOptions.setColor(0xFFAA00);
29+
progressBarOptions.fgOptions.setCoordinate(TextureRegistry.getTexture("minecraft:block/sand"));
30+
progressBarOptions.bgOptions.setCoordinate(TextureRegistry.getTexture("minecraft:block/obsidian"));
31+
c.drawProgressBarTextureWithText((int) tile.getAmpsCurrentlyUsed(),(int) tile.getMaxOutputAmperage(),progressBarOptions,0);*/
32+
} else if(tile instanceof TileEntityElectricStorage) {
33+
ProgressBarOptions progressBarOptions = new ProgressBarOptions(160, "Current Draw (mA): ", true, false);
34+
progressBarOptions.fgOptions.setColor(0xFFAA00);
35+
progressBarOptions.fgOptions.setCoordinate(TextureRegistry.getTexture("minecraft:block/sand"));
36+
progressBarOptions.bgOptions.setCoordinate(TextureRegistry.getTexture("minecraft:block/obsidian"));
37+
c.drawProgressBarTextureWithText((int) (tile.getAverageAmpLoad()*1000), (int) (tile.getMaxInputAmperage()*1000), progressBarOptions,0);
3038
} else {
31-
c.drawProgressBarTextureWithText((int) tile.getAmpsCurrentlyUsed(),(int) tile.getMaxInputAmperage(), progressBarOptions,0);
39+
ProgressBarOptions progressBarOptions = new ProgressBarOptions(160, "Current Draw (mA): ", true, false);
40+
progressBarOptions.fgOptions.setColor(0xFFAA00);
41+
progressBarOptions.fgOptions.setCoordinate(TextureRegistry.getTexture("minecraft:block/sand"));
42+
progressBarOptions.bgOptions.setCoordinate(TextureRegistry.getTexture("minecraft:block/obsidian"));
43+
c.drawProgressBarTextureWithText((int) (tile.getAverageAmpLoad()*1000), (int) (tile.getMaxInputAmperage()*1000), progressBarOptions,0);
3244
}
33-
progressBarOptions = new ProgressBarOptions(160, "Energy: ", true, true);
45+
//Energy
46+
ProgressBarOptions progressBarOptions = new ProgressBarOptions(160, "Energy: ", true, true);
3447
progressBarOptions.fgOptions.setColor(0xFF2020);
3548
progressBarOptions.fgOptions.setCoordinate(TextureRegistry.getTexture("minecraft:block/sand"));
3649
progressBarOptions.bgOptions.setCoordinate(TextureRegistry.getTexture("minecraft:block/obsidian"));
3750
c.drawProgressBarTextureWithText((int) tile.getEnergy(),(int) tile.getCapacity(),progressBarOptions,0);
51+
52+
c.drawStringJustified("Energy Net Change: "+ TextFormatting.YELLOW+tile.getAverageEnergyTransfer()+TextFormatting.RESET,0,160,0xFFFFFFFF);
3853
}
3954
}

energy/src/main/java/sunsetsatellite/catalyst/energy/improved/electric/base/TileEntityElectricBase.java

+31-3
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
package sunsetsatellite.catalyst.energy.improved.electric.base;
22

3-
import net.minecraft.core.block.entity.TileEntity;
3+
import com.mojang.nbt.CompoundTag;
4+
import sunsetsatellite.catalyst.core.util.AveragingCounter;
45
import sunsetsatellite.catalyst.core.util.Direction;
56
import sunsetsatellite.catalyst.core.util.Vec3i;
67
import sunsetsatellite.catalyst.core.util.mixin.interfaces.ITileEntityInit;
78
import sunsetsatellite.catalyst.core.util.network.Network;
89
import sunsetsatellite.catalyst.core.util.network.NetworkComponentTile;
910
import sunsetsatellite.catalyst.core.util.network.NetworkType;
11+
import sunsetsatellite.catalyst.core.util.tile.ExtendableTileEntity;
1012
import sunsetsatellite.catalyst.energy.improved.electric.api.IElectric;
1113
import sunsetsatellite.catalyst.energy.improved.electric.api.IVoltageTiered;
1214
import sunsetsatellite.catalyst.energy.improved.electric.api.VoltageTier;
1315
import sunsetsatellite.catalyst.energy.improved.electric.test.block.BlockElectric;
1416

1517

1618
@SuppressWarnings({"FieldMayBeFinal", "FieldCanBeLocal"})
17-
public abstract class TileEntityElectricBase extends TileEntity implements IElectric, IVoltageTiered, ITileEntityInit, NetworkComponentTile {
19+
public abstract class TileEntityElectricBase extends ExtendableTileEntity implements IElectric, IVoltageTiered, ITileEntityInit, NetworkComponentTile {
1820

1921
protected long energy = 0;
2022
protected long capacity = 0;
@@ -25,6 +27,8 @@ public abstract class TileEntityElectricBase extends TileEntity implements IElec
2527
protected long maxVoltageOut = 0;
2628
protected long maxAmpsOut = 0;
2729

30+
protected AveragingCounter averageAmpLoad = new AveragingCounter();
31+
protected AveragingCounter averageEnergyTransfer = new AveragingCounter();
2832
protected long ampsUsing = 0;
2933

3034
public TileEntityElectricBase() {}
@@ -68,20 +72,32 @@ public long getMaxOutputAmperage() {
6872

6973
@Override
7074
public long internalChangeEnergy(long difference) {
75+
averageEnergyTransfer.increment(worldObj,difference);
7176
energy += difference;
7277
return difference;
7378
}
7479

80+
@Override
81+
public double getAverageEnergyTransfer() {
82+
return averageEnergyTransfer.getAverage(worldObj);
83+
}
84+
7585
@Override
7686
public long getAmpsCurrentlyUsed() {
7787
return ampsUsing;
7888
}
7989

8090
@Override
81-
public void addAmpUsage(long amperage) {
91+
public void addAmpsToUse(long amperage) {
92+
averageAmpLoad.increment(worldObj,amperage);
8293
ampsUsing += amperage;
8394
}
8495

96+
@Override
97+
public double getAverageAmpLoad() {
98+
return averageAmpLoad.getAverage(worldObj);
99+
}
100+
85101
//NetworkComponent
86102
public Network energyNet;
87103

@@ -109,4 +125,16 @@ public void networkChanged(Network network) {
109125
public void removedFromNetwork(Network network) {
110126
this.energyNet = null;
111127
}
128+
129+
@Override
130+
public void readFromNBT(CompoundTag tag) {
131+
energy = tag.getLong("Energy");
132+
super.readFromNBT(tag);
133+
}
134+
135+
@Override
136+
public void writeToNBT(CompoundTag tag) {
137+
tag.putLong("Energy",energy);
138+
super.writeToNBT(tag);
139+
}
112140
}

energy/src/main/java/sunsetsatellite/catalyst/energy/improved/electric/base/TileEntityElectricConductor.java

+5
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,9 @@ public double getAverageAmpLoad(){
7171
public WireProperties getProperties() {
7272
return properties;
7373
}
74+
75+
@Override
76+
public void tick() {
77+
super.tick();
78+
}
7479
}

energy/src/main/java/sunsetsatellite/catalyst/energy/improved/electric/base/TileEntityElectricDevice.java

+33-15
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,11 @@ public boolean canReceive(@NotNull Direction dir) {
1919
@Override
2020
public void tick() {
2121
super.tick();
22+
//reset counters
2223
ampsUsing = 0;
24+
averageAmpLoad.increment(worldObj,0);
25+
averageEnergyTransfer.increment(worldObj,0);
26+
//try to pull max allowed current from any connected side
2327
for (Direction dir : Direction.values()) {
2428
TileEntity tile = dir.getTileEntity(worldObj,this);
2529
if(tile instanceof TileEntityElectricConductor) {
@@ -35,21 +39,28 @@ public long receiveEnergy(@NotNull Direction dir, long amperage) {
3539
return 0;
3640
}
3741
long remainingCapacity = getCapacityRemaining();
42+
long willUseAmps = 0;
3843
TileEntity tile = dir.getTileEntity(worldObj,this);
3944
if(tile instanceof TileEntityElectricConductor) {
4045
TileEntityElectricConductor wire = (TileEntityElectricConductor) tile;
4146

47+
//for every known path
4248
for (NetworkPath path : energyNet.getPathData(wire.getPosition())) {
4349
long pathLoss = 0;
50+
//ignore itself or non-electric components in the path
4451
if(path.target == this || !(path.target instanceof IElectric)){
4552
continue;
4653
}
4754
IElectric dest = (IElectric) path.target;
4855

49-
if(dest.canProvide(path.targetDirection)) {
56+
//receive/provide check
57+
if(dest.canProvide(path.targetDirection.getOpposite())) {
5058
if (canReceive(dir)) {
59+
//get max voltage from destination
60+
//limit amps to maximum available from dest
5161
long voltage = dest.getMaxOutputVoltage();
5262
amperage = Math.min(amperage, (dest.getMaxOutputAmperage() - dest.getAmpsCurrentlyUsed()));
63+
//calculate path loss
5364
for (NetworkComponentTile component : path.path) {
5465
if(component instanceof TileEntityElectricConductor){
5566
pathLoss += ((TileEntityElectricConductor) component).getProperties().getMaterial().getLossPerBlock();
@@ -59,8 +70,10 @@ public long receiveEnergy(@NotNull Direction dir, long amperage) {
5970
//avoid paths where all energy is lost
6071
continue;
6172
}
73+
//voltage drop
6274
long pathVoltage = voltage - pathLoss;
6375
boolean pathBroken = false;
76+
//handle wires with insufficient voltage rating
6477
for (NetworkComponentTile pathTile : path.path) {
6578
if(pathTile instanceof TileEntityElectricConductor){
6679
TileEntityElectricConductor pathWire = (TileEntityElectricConductor) pathTile;
@@ -75,29 +88,34 @@ public long receiveEnergy(@NotNull Direction dir, long amperage) {
7588
if(pathBroken) continue;
7689

7790
if(pathVoltage > 0){
91+
//handle device over-voltage
7892
if(pathVoltage > getMaxInputVoltage()){
7993
//TODO: do something bad here later :tf:
8094
return Math.max(amperage, getMaxInputAmperage() - ampsUsing); //short circuit amperage
8195
}
8296
if(remainingCapacity >= pathVoltage){
83-
long willUseAmps = Math.min(remainingCapacity / pathVoltage, Math.min(amperage, getMaxInputAmperage() - ampsUsing));
97+
//calculate real current draw
98+
willUseAmps = Math.min(remainingCapacity / pathVoltage, Math.min(amperage, getMaxInputAmperage() - ampsUsing));
8499
if(willUseAmps > 0){
85-
for (NetworkComponentTile pathTile : path.path) {
86-
if (pathTile instanceof TileEntityElectricConductor) {
87-
TileEntityElectricConductor pathWire = (TileEntityElectricConductor) pathTile;
88-
long voltageTraveled = voltage;
89-
voltageTraveled -= pathWire.getProperties().getMaterial().getLossPerBlock();
90-
if (voltageTraveled <= 0) break;
91-
pathWire.incrementAmperage(willUseAmps);
92-
}
93-
}
94100
long willUseEnergy = pathVoltage * willUseAmps;
95101
if(dest.getEnergy() >= willUseEnergy){
96-
addAmpUsage(willUseAmps);
97-
dest.addAmpUsage(willUseAmps);
102+
103+
//set current in wires
104+
for (NetworkComponentTile pathTile : path.path) {
105+
if (pathTile instanceof TileEntityElectricConductor) {
106+
TileEntityElectricConductor pathWire = (TileEntityElectricConductor) pathTile;
107+
long voltageTraveled = voltage;
108+
voltageTraveled -= pathWire.getProperties().getMaterial().getLossPerBlock();
109+
if (voltageTraveled <= 0) break;
110+
pathWire.incrementAmperage(willUseAmps);
111+
}
112+
}
113+
114+
//finish energy transfer
115+
addAmpsToUse(willUseAmps);
116+
//dest.addAmpsToUse(willUseAmps);
98117
internalAddEnergy(willUseEnergy);
99118
dest.internalRemoveEnergy(willUseEnergy);
100-
return willUseAmps;
101119
}
102120
}
103121
}
@@ -106,6 +124,6 @@ public long receiveEnergy(@NotNull Direction dir, long amperage) {
106124
}
107125
}
108126
}
109-
return 0;
127+
return willUseAmps; //return amps used
110128
}
111129
}

0 commit comments

Comments
 (0)