Skip to content

Commit

Permalink
Fix frontPos cache, make FE conversions use consistent ratio for calc…
Browse files Browse the repository at this point in the history
…ulation (#697)
  • Loading branch information
Tictim authored Feb 25, 2022
1 parent 71f0a30 commit 1fe9d4e
Show file tree
Hide file tree
Showing 10 changed files with 91 additions and 44 deletions.
27 changes: 27 additions & 0 deletions src/main/java/gregtech/api/capability/FeCompat.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package gregtech.api.capability;

import gregtech.common.ConfigHolder;
import net.minecraftforge.energy.IEnergyStorage;

public class FeCompat {

Expand All @@ -27,11 +28,37 @@ public static long toEu(long fe, int ratio){
return fe / ratio;
}

/**
* @deprecated Specify ratio
*/
public static int toFe(long eu) {
return (int) (eu * ratio(false));
}

/**
* @deprecated Specify ratio
*/
public static long toEu(long fe) {
return fe / ratio(true);
}

/**
* Inserts energy to the storage. EU -> FE conversion is performed.
* @return amount of EU inserted
*/
public static long insertEu(IEnergyStorage storage, long amountEU){
int euToFeRatio = ratio(false);
int feSent = storage.receiveEnergy(toFe(amountEU, euToFeRatio), true);
return toEu(storage.receiveEnergy(feSent - (feSent % euToFeRatio), false), euToFeRatio);
}

/**
* Extracts energy from the storage. EU -> FE conversion is performed.
* @return amount of EU extracted
*/
public static long extractEu(IEnergyStorage storage, long amountEU){
int euToFeRatio = ratio(false);
int extract = storage.extractEnergy(toFe(amountEU, euToFeRatio), true);
return toEu(storage.extractEnergy(extract - (extract % euToFeRatio), false), euToFeRatio);
}
}
29 changes: 6 additions & 23 deletions src/main/java/gregtech/api/capability/impl/EUToFEProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ public long acceptEnergyFromNetwork(EnumFacing facing, long voltage, long ampera
}
}

long maxPacket = FeCompat.toFe(voltage);
long maxPacket = FeCompat.toFe(voltage, FeCompat.ratio(false));
long maximalValue = maxPacket * amperage;

// Try to consume our remainder buffer plus a fresh packet
Expand Down Expand Up @@ -147,35 +147,18 @@ public long acceptEnergyFromNetwork(EnumFacing facing, long voltage, long ampera
@Override
public long changeEnergy(long delta) {
if (delta == 0) return 0;

if (delta < 0L) {

int extract = energyStorage.extractEnergy(FeCompat.toFe(delta), true);

if (extract != ConfigHolder.compat.energy.euToFeRatio)
extract -= extract % ConfigHolder.compat.energy.euToFeRatio;

return FeCompat.toEu(energyStorage.extractEnergy(extract, false));

} else {

int receive = energyStorage.receiveEnergy(FeCompat.toFe(delta), true);

if (receive != ConfigHolder.compat.energy.euToFeRatio)
receive -= receive % ConfigHolder.compat.energy.euToFeRatio;

return FeCompat.toEu(energyStorage.receiveEnergy(receive, false));
}
else if (delta < 0) return FeCompat.extractEu(energyStorage, -delta);
else return FeCompat.insertEu(energyStorage, delta);
}

@Override
public long getEnergyCapacity() {
return FeCompat.toEu(energyStorage.getMaxEnergyStored());
return FeCompat.toEu(energyStorage.getMaxEnergyStored(), FeCompat.ratio(false));
}

@Override
public long getEnergyStored() {
return FeCompat.toEu(energyStorage.getEnergyStored());
return FeCompat.toEu(energyStorage.getEnergyStored(), FeCompat.ratio(false));
}

/**
Expand All @@ -198,7 +181,7 @@ public long getInputVoltage() {
long maxInput = energyStorage.receiveEnergy(Integer.MAX_VALUE, true);

if (maxInput == 0) return 0;
return GTValues.V[GTUtility.getTierByVoltage(FeCompat.toEu(maxInput))];
return GTValues.V[GTUtility.getTierByVoltage(FeCompat.toEu(maxInput, FeCompat.ratio(false)))];
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public long acceptEnergyFromNetwork(EnumFacing side, long voltage, long amperage
energy -= electricItem.charge(Math.min(distributed, GTValues.V[electricItem.getTier()] * 2L), getTier(), true, false);
} else if (item instanceof IEnergyStorage) {
IEnergyStorage energyStorage = (IEnergyStorage) item;
energy -= FeCompat.toEu(energyStorage.receiveEnergy(FeCompat.toFe(Math.min(distributed, GTValues.V[getTier()] * 2L)), false));
energy -= FeCompat.insertEu(energyStorage, Math.min(distributed, GTValues.V[getTier()] * 2L));
}
}

Expand Down Expand Up @@ -172,7 +172,7 @@ public long getEnergyCapacity() {
} else {
IEnergyStorage energyStorage = batteryStack.getCapability(CapabilityEnergy.ENERGY, null);
if (energyStorage != null) {
energyCapacity += FeCompat.toEu(energyStorage.getMaxEnergyStored());
energyCapacity += FeCompat.toEu(energyStorage.getMaxEnergyStored(), FeCompat.ratio(false));
}
}
}
Expand All @@ -191,7 +191,7 @@ public long getEnergyStored() {
} else {
IEnergyStorage energyStorage = batteryStack.getCapability(CapabilityEnergy.ENERGY, null);
if (energyStorage != null) {
energyStored += FeCompat.toEu(energyStorage.getEnergyStored());
energyStored += FeCompat.toEu(energyStorage.getEnergyStored(), FeCompat.ratio(false));
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public long acceptEnergyFromNetwork(EnumFacing side, long voltage, long amperage
energy -= electricItem.charge(Math.min(distributed, GTValues.V[electricItem.getTier()] * 4L), getTier(), true, false);
} else if (item instanceof IEnergyStorage) {
IEnergyStorage energyStorage = (IEnergyStorage) item;
energy -= FeCompat.toEu(energyStorage.receiveEnergy(FeCompat.toFe(Math.min(distributed, GTValues.V[getTier()] * 4L)), false));
energy -= FeCompat.insertEu(energyStorage, Math.min(distributed, GTValues.V[getTier()] * 4L));
}
}

Expand Down Expand Up @@ -117,7 +117,7 @@ public long getEnergyCapacity() {
} else {
IEnergyStorage energyStorage = batteryStack.getCapability(CapabilityEnergy.ENERGY, null);
if (energyStorage != null) {
energyCapacity += FeCompat.toEu(energyStorage.getMaxEnergyStored());
energyCapacity += FeCompat.toEu(energyStorage.getMaxEnergyStored(), FeCompat.ratio(false));
}
}
}
Expand All @@ -136,7 +136,7 @@ public long getEnergyStored() {
} else {
IEnergyStorage energyStorage = batteryStack.getCapability(CapabilityEnergy.ENERGY, null);
if (energyStorage != null) {
energyStored += FeCompat.toEu(energyStorage.getEnergyStored());
energyStored += FeCompat.toEu(energyStorage.getEnergyStored(), FeCompat.ratio(false));
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ private boolean handleForgeEnergyItem(IEnergyStorage energyStorage) {
double chargePercent = getEnergyStored() / (getEnergyCapacity() * 1.0);

if (chargePercent > 0.5) {
long chargedBy = FeCompat.toEu(energyStorage.receiveEnergy(FeCompat.toFe(GTValues.V[machineTier]), false));
long chargedBy = FeCompat.insertEu(energyStorage, GTValues.V[machineTier]);
removeEnergy(chargedBy);
return chargedBy > 0;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -742,10 +742,10 @@ public long changeEnergy(long l) {
return 0;
}
public long getEnergyStored() {
return FeCompat.toEu(fe.getEnergyStored());
return FeCompat.toEu(fe.getEnergyStored(), FeCompat.ratio(false));
}
public long getEnergyCapacity() {
return FeCompat.toEu(fe.getMaxEnergyStored());
return FeCompat.toEu(fe.getMaxEnergyStored(), FeCompat.ratio(false));
}
public long getInputAmperage() {
return 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,9 +132,7 @@ protected void pushEnergy() {
if (storage == null) return;

// send out energy
// subtract the modulus of the fe possible to send
int feSent = storage.receiveEnergy(FeCompat.toFe(storedEU), true);
energyInserted = FeCompat.toEu(storage.receiveEnergy(feSent - (feSent % FeCompat.ratio(true)), false));
energyInserted = FeCompat.insertEu(storage, storedEU);
}
extractInternal(energyInserted);
}
Expand All @@ -146,6 +144,11 @@ protected <T> T getCapabilityAtFront(Capability<T> capability) {
return tile.getCapability(capability, opposite);
}

@Override
public void onFrontFacingSet(EnumFacing newFrontFacing) {
this.frontPos = null;
}

// -- GTCEu Energy--------------------------------------------

public class EUContainer implements IEnergyContainer {
Expand Down Expand Up @@ -237,7 +240,7 @@ public int receiveEnergy(int maxReceive, boolean simulate) {
if (!feToEu || maxReceive <= 0) return 0;
int received = Math.min(getMaxEnergyStored() - getEnergyStored(), maxReceive);
received -= received % FeCompat.ratio(true); // avoid rounding issues
if (!simulate) storedEU += FeCompat.toEu(received);
if (!simulate) storedEU += FeCompat.toEu(received, FeCompat.ratio(true));
return received;
}

Expand All @@ -248,12 +251,12 @@ public int extractEnergy(int maxExtract, boolean simulate) {

@Override
public int getEnergyStored() {
return FeCompat.toFe(storedEU);
return FeCompat.toFe(storedEU, FeCompat.ratio(feToEu));
}

@Override
public int getMaxEnergyStored() {
return FeCompat.toFe(baseCapacity);
return FeCompat.toFe(baseCapacity, FeCompat.ratio(feToEu));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,11 +80,13 @@ public boolean onRightClick(EntityPlayer playerIn, EnumHand hand, EnumFacing fac
if (converterTrait.isFeToEu()) {
setFeToEu(false);
playerIn.sendMessage(new TextComponentTranslation("gregtech.machine.energy_converter.message_conversion_eu",
converterTrait.getBaseAmps(), converterTrait.getVoltage(), FeCompat.toFe(converterTrait.getVoltage() * converterTrait.getBaseAmps())));
converterTrait.getBaseAmps(), converterTrait.getVoltage(),
FeCompat.toFe(converterTrait.getVoltage() * converterTrait.getBaseAmps(), FeCompat.ratio(false))));
} else {
setFeToEu(true);
playerIn.sendMessage(new TextComponentTranslation("gregtech.machine.energy_converter.message_conversion_fe",
FeCompat.toFe(converterTrait.getVoltage() * converterTrait.getBaseAmps()), converterTrait.getBaseAmps(), converterTrait.getVoltage()));
FeCompat.toFe(converterTrait.getVoltage() * converterTrait.getBaseAmps(), FeCompat.ratio(true)),
converterTrait.getBaseAmps(), converterTrait.getVoltage()));
}
return true;
}
Expand Down Expand Up @@ -201,8 +203,8 @@ public void addInformation(ItemStack stack, @Nullable World player, List<String>
long amps = converterTrait.getBaseAmps();
tooltip.add(I18n.format("gregtech.machine.energy_converter.tooltip_tool_usage"));
tooltip.add(I18n.format("gregtech.universal.tooltip.energy_storage_capacity", converterTrait.getEnergyEUContainer().getEnergyCapacity()));
tooltip.add(I18n.format("gregtech.machine.energy_converter.tooltip_conversion_fe", FeCompat.toFe(voltage * amps), amps, voltage, GTValues.VNF[getTier()]));
tooltip.add(I18n.format("gregtech.machine.energy_converter.tooltip_conversion_eu", amps, voltage, GTValues.VNF[getTier()], FeCompat.toFe(voltage * amps)));
tooltip.add(I18n.format("gregtech.machine.energy_converter.tooltip_conversion_fe", FeCompat.toFe(voltage * amps, FeCompat.ratio(true)), amps, voltage, GTValues.VNF[getTier()]));
tooltip.add(I18n.format("gregtech.machine.energy_converter.tooltip_conversion_eu", amps, voltage, GTValues.VNF[getTier()], FeCompat.toFe(voltage * amps, FeCompat.ratio(false))));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,11 @@ protected void addProbeInfo(ConverterTrait capability, IProbeInfo probeInfo, Til
if (sideHit == mte.getFrontFacing()) {
pane.text(TextStyleClass.INFO + "{*gregtech.top.transform_output*} " + voltageN + TextFormatting.GREEN + " (" + amperage + "A)");
} else {
pane.text(TextStyleClass.INFO + "{*gregtech.top.transform_input*} " + TextFormatting.RED + FeCompat.toFe(capability.getVoltage()) + "FE");
pane.text(TextStyleClass.INFO + "{*gregtech.top.transform_input*} " + TextFormatting.RED + FeCompat.toFe(capability.getVoltage(), FeCompat.ratio(true)) + "FE");
}
} else {
if (sideHit == mte.getFrontFacing()) {
pane.text(TextStyleClass.INFO + "{*gregtech.top.transform_output*} " + TextFormatting.RED + FeCompat.toFe(capability.getVoltage()) + "FE");
pane.text(TextStyleClass.INFO + "{*gregtech.top.transform_output*} " + TextFormatting.RED + FeCompat.toFe(capability.getVoltage(), FeCompat.ratio(false)) + "FE");
} else {
pane.text(TextStyleClass.INFO + "{*gregtech.top.transform_input*} " + voltageN + TextFormatting.GREEN + " (" + amperage + "A)");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import gregtech.api.GTValues;
import gregtech.api.capability.GregtechCapabilities;
import gregtech.api.capability.IEnergyContainer;
import gregtech.common.ConfigHolder;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.capabilities.Capability;
Expand Down Expand Up @@ -172,6 +173,37 @@ public void Test_No_Energy_Loss() {
assertEquals(120, storage.getEnergyStored());
}

@Test
public void Test_Non_Identical_Ratio_Configuration() {
resetEnergyStorage();
converter_1A.setFeToEu(true);

// Change two ratios to different value
ConfigHolder.compat.energy.feToEuRatio = 4;
ConfigHolder.compat.energy.euToFeRatio = 1;

IEnergyStorage storage = converter_1A.getCapability(CapabilityEnergy.ENERGY, EnumFacing.SOUTH);
IEnergyContainer container = converter_1A.getCapability(GregtechCapabilities.CAPABILITY_ENERGY_CONTAINER, EnumFacing.NORTH);
assertNotNull(storage);
assertNotNull(container);

// No changes should be observed
int accepted = storage.receiveEnergy(128, false);
assertEquals(128, accepted);
assertEquals(128, storage.getEnergyStored());
assertEquals(32, container.getEnergyStored());

converter_1A.setFeToEu(false);

// When flipped to EU -> FE, stored EU is expected to be same, while FE is expected to become eq to stored EU
// according to config value.
assertEquals(32, storage.getEnergyStored());
assertEquals(32, container.getEnergyStored());

ConfigHolder.compat.energy.feToEuRatio = 4;
ConfigHolder.compat.energy.euToFeRatio = 4;
}

private static void resetEnergyStorage() {
((ConverterTraitTestWrapper) converter_1A.getCapability(GregtechCapabilities.CAPABILITY_CONVERTER, null)).drainStorage();
FEStorage.extractEnergy(Integer.MAX_VALUE, false);
Expand Down

0 comments on commit 1fe9d4e

Please sign in to comment.