Skip to content

Commit

Permalink
Fix integer overflow for total fuel burn time (#1683)
Browse files Browse the repository at this point in the history
  • Loading branch information
warjort authored Jul 13, 2021
1 parent f68d70d commit d879f47
Showing 9 changed files with 52 additions and 12 deletions.
8 changes: 8 additions & 0 deletions src/main/java/gregtech/api/capability/IFuelInfo.java
Original file line number Diff line number Diff line change
@@ -26,7 +26,15 @@ public interface IFuelInfo {

/**
* @return the estimated amount of time in ticks for burning the remaining fuel
* @deprecated use the long version
*/
@Deprecated
int getFuelBurnTime();

/**
* @return the estimated amount of time in ticks for burning the remaining fuel
*/
default long getFuelBurnTimeLong() {
return getFuelBurnTime();
}
}
26 changes: 23 additions & 3 deletions src/main/java/gregtech/api/capability/impl/AbstractFuelInfo.java
Original file line number Diff line number Diff line change
@@ -10,9 +10,13 @@ public abstract class AbstractFuelInfo implements IFuelInfo {
private int fuelRemaining;
private int fuelCapacity;
private int fuelMinConsumed;
private int fuelBurnTime;
private long fuelBurnTime;

public AbstractFuelInfo(int fuelRemaining, int fuelCapacity, int fuelMinConsumed, int fuelBurnTime) {
public AbstractFuelInfo(final int fuelRemaining, final int fuelCapacity, final int fuelMinConsumed, final int fuelBurnTime) {
this(fuelRemaining, fuelCapacity, fuelMinConsumed, (long) fuelBurnTime);
}

public AbstractFuelInfo(final int fuelRemaining, final int fuelCapacity, final int fuelMinConsumed, final long fuelBurnTime) {
this.fuelRemaining = fuelRemaining;
this.fuelCapacity = fuelCapacity;
this.fuelMinConsumed = fuelMinConsumed;
@@ -31,8 +35,14 @@ public int getFuelMinConsumed() {
return fuelMinConsumed;
}

@Override
public int getFuelBurnTime() {
return fuelBurnTime;
return this.fuelBurnTime > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) this.fuelBurnTime;
}

@Override
public long getFuelBurnTimeLong() {
return this.fuelBurnTime;
}

public void setFuelRemaining(int fuelRemaining) {
@@ -47,10 +57,15 @@ public void setMinConsumed(int fuelMinConsumed) {
this.fuelMinConsumed = fuelMinConsumed;
}

@Deprecated
public void setFuelBurnTime(int fuelBurnTime) {
this.fuelBurnTime = fuelBurnTime;
}

public void setFuelBurnTime(final long fuelBurnTime) {
this.fuelBurnTime = fuelBurnTime;
}

public void addFuelRemaining(int fuelRemaining) {
this.fuelRemaining += fuelRemaining;
}
@@ -59,7 +74,12 @@ public void addFuelCapacity(int fuelCapacity) {
this.fuelCapacity += fuelCapacity;
}

@Deprecated
public void addFuelBurnTime(int fuelBurnTime) {
this.fuelBurnTime += fuelBurnTime;
}

public void addFuelBurnTime(final long fuelBurnTime) {
this.fuelBurnTime += fuelBurnTime;
}
}
Original file line number Diff line number Diff line change
@@ -9,7 +9,13 @@ public class FluidFuelInfo extends AbstractFuelInfo {

private final FluidStack fluidStack;

public FluidFuelInfo(FluidStack fluidStack, int fuelRemaining, int fuelCapacity, int fuelMinConsumed, int fuelBurnTime) {
@Deprecated
public FluidFuelInfo(final FluidStack fluidStack, final int fuelRemaining, final int fuelCapacity, final int fuelMinConsumed, final int fuelBurnTime) {
super(fuelRemaining, fuelCapacity, fuelMinConsumed, fuelBurnTime);
this.fluidStack = fluidStack;
}

public FluidFuelInfo(final FluidStack fluidStack, final int fuelRemaining, final int fuelCapacity, final int fuelMinConsumed, final long fuelBurnTime) {
super(fuelRemaining, fuelCapacity, fuelMinConsumed, fuelBurnTime);
this.fluidStack = fluidStack;
}
Original file line number Diff line number Diff line change
@@ -82,7 +82,7 @@ public Collection<IFuelInfo> getFuels() {
continue;
int amountPerRecipe = calculateFuelAmount(recipe);
int duration = calculateRecipeDuration(recipe);
int fuelBurnTime = duration * fuelRemaining / amountPerRecipe;
long fuelBurnTime = (duration * fuelRemaining) / amountPerRecipe;

FluidFuelInfo fuelInfo = (FluidFuelInfo) fuels.get(tankContents.getUnlocalizedName());
if (fuelInfo == null) {
8 changes: 7 additions & 1 deletion src/main/java/gregtech/api/capability/impl/ItemFuelInfo.java
Original file line number Diff line number Diff line change
@@ -9,7 +9,13 @@ public class ItemFuelInfo extends AbstractFuelInfo {

private final ItemStack itemStack;

public ItemFuelInfo(ItemStack itemStack, int fuelRemaining, int fuelCapacity, int fuelMinConsumed, int fuelBurnTime) {
@Deprecated
public ItemFuelInfo(final ItemStack itemStack, final int fuelRemaining, final int fuelCapacity, final int fuelMinConsumed, final int fuelBurnTime) {
super(fuelRemaining, fuelCapacity, fuelMinConsumed, fuelBurnTime);
this.itemStack = itemStack;
}

public ItemFuelInfo(final ItemStack itemStack, final int fuelRemaining, final int fuelCapacity, final int fuelMinConsumed, final long fuelBurnTime) {
super(fuelRemaining, fuelCapacity, fuelMinConsumed, fuelBurnTime);
this.itemStack = itemStack;
}
Original file line number Diff line number Diff line change
@@ -527,7 +527,7 @@ public Collection<IFuelInfo> getFuels() {
int voltageMultiplier = (int) Math.max(1L, recipeVoltage / GTValues.V[GTValues.LV]);
int burnTime = (int) Math.ceil(dieselRecipe.getDuration() * CONSUMPTION_MULTIPLIER / 2.0 * voltageMultiplier * getThrottleMultiplier());
int fuelAmountToConsume = (int) Math.ceil(dieselRecipe.getRecipeFluid().amount * CONSUMPTION_MULTIPLIER * boilerType.fuelConsumptionMultiplier * getThrottleMultiplier());
int fuelBurnTime = fuelStack.amount * burnTime / fuelAmountToConsume;
final long fuelBurnTime = (fuelStack.amount * burnTime) / fuelAmountToConsume;
FluidFuelInfo fluidFuelInfo = (FluidFuelInfo) fuels.get(fuelStack.getUnlocalizedName());
if (fluidFuelInfo == null) {
fluidFuelInfo = new FluidFuelInfo(fuelStack, fuelStack.amount, fluidCapacity, fuelAmountToConsume, fuelBurnTime);
@@ -544,7 +544,7 @@ public Collection<IFuelInfo> getFuels() {
int voltageMultiplier = (int) Math.max(1L, recipeVoltage / GTValues.V[GTValues.LV]);
int burnTime = (int) Math.ceil(denseFuelRecipe.getDuration() * CONSUMPTION_MULTIPLIER * 2 * voltageMultiplier * getThrottleMultiplier());
int fuelAmountToConsume = (int) Math.ceil(denseFuelRecipe.getRecipeFluid().amount * CONSUMPTION_MULTIPLIER * boilerType.fuelConsumptionMultiplier * getThrottleMultiplier());
int fuelBurnTime = fuelStack.amount * burnTime / fuelAmountToConsume;
final long fuelBurnTime = (fuelStack.amount * burnTime) / fuelAmountToConsume;
FluidFuelInfo fluidFuelInfo = (FluidFuelInfo) fuels.get(fuelStack.getUnlocalizedName());
if (fluidFuelInfo == null) {
fluidFuelInfo = new FluidFuelInfo(fuelStack, fuelStack.amount, fluidCapacity, fuelAmountToConsume, fuelBurnTime);
@@ -562,7 +562,7 @@ public Collection<IFuelInfo> getFuels() {
}
for (int slotIndex = 0; slotIndex < itemImportInventory.getSlots(); slotIndex++) {
ItemStack itemStack = itemImportInventory.getStackInSlot(slotIndex);
int burnTime = (int) Math.ceil(TileEntityFurnace.getItemBurnTime(itemStack) / (50.0 * boilerType.fuelConsumptionMultiplier * getThrottleMultiplier()));
final long burnTime = (int) Math.ceil(TileEntityFurnace.getItemBurnTime(itemStack) / (50.0 * this.boilerType.fuelConsumptionMultiplier * getThrottleMultiplier()));
if (burnTime > 0) {
ItemFuelInfo itemFuelInfo = (ItemFuelInfo) fuels.get(itemStack.getTranslationKey());
if (itemFuelInfo == null) {
Original file line number Diff line number Diff line change
@@ -85,7 +85,7 @@ public Collection<IFuelInfo> getFuels() {
return Collections.emptySet();
final int fuelRemaining = fuelInSlot.getCount();
final int fuelCapacity = importItems.getSlotLimit(0);
final int burnTime = fuelRemaining * TileEntityFurnace.getItemBurnTime(fuelInSlot) * (isHighPressure ? 6 : 12);
final long burnTime = fuelRemaining * TileEntityFurnace.getItemBurnTime(fuelInSlot) * (this.isHighPressure ? 6 : 12);
return Collections.singleton(new ItemFuelInfo(fuelInSlot, fuelRemaining, fuelCapacity, 1, burnTime));
}

Original file line number Diff line number Diff line change
@@ -71,7 +71,7 @@ public Collection<IFuelInfo> getFuels() {
return Collections.emptySet();
final int fuelRemaining = lava.amount;
final int fuelCapacity = lavaFluidTank.getCapacity();
final int burnTime = fuelRemaining * (isHighPressure ? 6 : 12); // 100 mb lasts 600 or 1200 ticks
final long burnTime = fuelRemaining * (this.isHighPressure ? 6 : 12); // 100 mb lasts 600 or 1200 ticks
return Collections.singleton(new FluidFuelInfo(lava, fuelRemaining, fuelCapacity, LAVA_PER_OPERATION, burnTime));
}

Original file line number Diff line number Diff line change
@@ -42,7 +42,7 @@ protected void addProbeInfo(IFuelable capability, IProbeInfo probeInfo, TileEnti
final int fuelRemaining = fuelInfo.getFuelRemaining();
final int fuelCapacity = fuelInfo.getFuelCapacity();
final int fuelMinConsumed = fuelInfo.getFuelMinConsumed();
final int burnTime = fuelInfo.getFuelBurnTime()/20;
final long burnTime = fuelInfo.getFuelBurnTimeLong() / 20;

IProbeInfo horizontalPane = probeInfo.horizontal(probeInfo.defaultLayoutStyle().alignment(ElementAlignment.ALIGN_CENTER));
if (fuelInfo instanceof ItemFuelInfo) {

0 comments on commit d879f47

Please sign in to comment.