mirror of
https://github.com/GTNewHorizons/TinkersConstruct.git
synced 2026-10-25 20:32:32 +00:00
Fix smeltery fuel gauge to account for all lava tanks (#273)
Co-authored-by: Ruling-0 <47913168+Ruling-0@users.noreply.github.com>
This commit is contained in:
1 parent
96345b9f31
commit
3548fcb9a9
3 files changed
+110
-71
No files matched your search
@@ -39,24 +39,17 @@ public class SmelteryGui extends ActiveContainerGui {
|
||||
private final int columns;
|
||||
private final int smelterySize;
|
||||
public static final int maxRows = 8;
|
||||
private int fuelDisplayTick = 0;
|
||||
|
||||
public SmelteryGui(InventoryPlayer inventoryplayer, SmelteryLogic smeltery, World world, int x, int y, int z) {
|
||||
super((ActiveContainer) smeltery.getGuiContainer(inventoryplayer, world, x, y, z));
|
||||
logic = smeltery;
|
||||
smelterySize = smeltery.getBlockCapacity();
|
||||
smeltery.updateFuelDisplay();
|
||||
|
||||
columns = ((SmelteryContainer) this.inventorySlots).columns;
|
||||
xSize = 254 + (columns - 3) * 22; // Adjust for column count
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initGui() {
|
||||
super.initGui();
|
||||
|
||||
if (logic != null) logic.updateFuelDisplay();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawScreen(int mouseX, int mouseY, float par3) {
|
||||
// the smeltery changed. we close the screen because updating the changes in all containers would be way too
|
||||
@@ -66,11 +59,13 @@ public class SmelteryGui extends ActiveContainerGui {
|
||||
return;
|
||||
}
|
||||
|
||||
if (fuelDisplayTick++ % 5 == 0) logic.updateFuelDisplay();
|
||||
updateScrollbar(mouseX, mouseY);
|
||||
|
||||
super.drawScreen(mouseX, mouseY, par3);
|
||||
updateScrollbar(mouseX, mouseY, par3);
|
||||
}
|
||||
|
||||
protected void updateScrollbar(int mouseX, int mouseY, float par3) {
|
||||
protected void updateScrollbar(int mouseX, int mouseY) {
|
||||
if (smelterySize > columns * maxRows) {
|
||||
boolean mouseDown = Mouse.isButtonDown(0);
|
||||
int lefto = this.guiLeft;
|
||||
@@ -144,13 +139,12 @@ public class SmelteryGui extends ActiveContainerGui {
|
||||
}
|
||||
|
||||
// lava/fuel
|
||||
if (logic.fuelGague > 0) {
|
||||
int fuel = logic.getScaledFuelGague(52);
|
||||
if (fuel > 0) {
|
||||
int leftX = cornerX + 117;
|
||||
int topY = (cornerY + 68) - logic.getScaledFuelGague(52);
|
||||
int sizeX = 12;
|
||||
int sizeY = logic.getScaledFuelGague(52);
|
||||
if (mouseX >= leftX && mouseX <= leftX + sizeX && mouseY >= topY && mouseY < topY + sizeY) {
|
||||
drawFluidStackTooltip(getFuelTooltip(logic.getFuel()), mouseX - cornerX + 36, mouseY - cornerY);
|
||||
int topY = (cornerY + 68) - fuel;
|
||||
if (mouseX >= leftX && mouseX <= leftX + 12 && mouseY >= topY && mouseY < topY + fuel) {
|
||||
drawFluidStackTooltip(getFuelTooltip(), mouseX - cornerX + 36, mouseY - cornerY);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -170,11 +164,11 @@ public class SmelteryGui extends ActiveContainerGui {
|
||||
|
||||
// Fuel - Lava
|
||||
this.mc.getTextureManager().bindTexture(TextureMap.locationBlocksTexture);
|
||||
if (logic.fuelGague > 0) {
|
||||
int fuel = logic.getScaledFuelGague(52);
|
||||
if (fuel > 0) {
|
||||
FluidStack fuelStack = logic.getFuel();
|
||||
IIcon lavaIcon = fuelStack.getFluid().getStillIcon();
|
||||
if (lavaIcon == null) lavaIcon = Blocks.lava.getIcon(0, 0);
|
||||
int fuel = logic.getScaledFuelGague(52);
|
||||
int count = 0;
|
||||
while (fuel > 0) {
|
||||
int size = Math.min(fuel, 16);
|
||||
@@ -346,10 +340,10 @@ public class SmelteryGui extends ActiveContainerGui {
|
||||
this.zLevel = 0;
|
||||
}
|
||||
|
||||
private List<String> getFuelTooltip(FluidStack liquid) {
|
||||
private List<String> getFuelTooltip() {
|
||||
ArrayList<String> list = new ArrayList<>();
|
||||
list.add("\u00A7f" + StatCollector.translateToLocal("gui.smeltery.fuel"));
|
||||
list.add("mB: " + liquid.amount);
|
||||
list.add(logic.fuelAmount + "/" + logic.fuelCapacity + " mB");
|
||||
return list;
|
||||
}
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ public class LavaTankLogic extends MultiServantLogic implements IFluidHandler {
|
||||
public int fill(ForgeDirection from, FluidStack resource, boolean doFill) {
|
||||
int amount = tank.fill(resource, doFill);
|
||||
if (amount > 0 && doFill) {
|
||||
renderOffset += resource.amount;
|
||||
renderOffset += amount;
|
||||
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
|
||||
worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, this.getBlockType());
|
||||
}
|
||||
@@ -41,7 +41,7 @@ public class LavaTankLogic extends MultiServantLogic implements IFluidHandler {
|
||||
public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) {
|
||||
FluidStack amount = tank.drain(maxDrain, doDrain);
|
||||
if (amount != null && doDrain) {
|
||||
renderOffset = -maxDrain;
|
||||
renderOffset = -amount.amount;
|
||||
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
|
||||
worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, this.getBlockType());
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package tconstruct.smeltery.logic;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
@@ -75,9 +76,10 @@ public class SmelteryLogic extends InventoryLogic implements IActiveLogic, IFaci
|
||||
public int useTime;
|
||||
public int fuelGague;
|
||||
public int fuelAmount;
|
||||
public int fuelCapacity;
|
||||
protected boolean inUse;
|
||||
|
||||
protected ArrayList<CoordTuple> lavaTanks;
|
||||
protected List<CoordTuple> lavaTanks;
|
||||
protected ArrayList<CoordTuple> drains;
|
||||
protected CoordTuple activeLavaTank;
|
||||
|
||||
@@ -96,7 +98,7 @@ public class SmelteryLogic extends InventoryLogic implements IActiveLogic, IFaci
|
||||
|
||||
public SmelteryLogic() {
|
||||
super(0);
|
||||
lavaTanks = new ArrayList<>();
|
||||
lavaTanks = Collections.synchronizedList(new ArrayList<>());
|
||||
drains = new ArrayList<>();
|
||||
activeTemps = new int[0];
|
||||
meltingTemps = new int[0];
|
||||
@@ -262,8 +264,9 @@ public class SmelteryLogic extends InventoryLogic implements IActiveLogic, IFaci
|
||||
}
|
||||
|
||||
public int getScaledFuelGague(int scale) {
|
||||
int ret = (fuelGague * scale) / 52;
|
||||
if (ret < 1) ret = 1;
|
||||
if (fuelCapacity <= 0) return 0;
|
||||
int ret = (int) ((float) fuelAmount * (float) scale / (float) fuelCapacity);
|
||||
if (ret < 1 && fuelAmount > 0) ret = 1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -502,22 +505,40 @@ public class SmelteryLogic extends InventoryLogic implements IActiveLogic, IFaci
|
||||
}
|
||||
|
||||
public void updateFuelDisplay() {
|
||||
// ensure our active tank is valid
|
||||
verifyFuelTank();
|
||||
if (activeLavaTank == null) {
|
||||
fuelAmount = 0;
|
||||
fuelGague = 0;
|
||||
return;
|
||||
int totalAmount = 0;
|
||||
int totalCapacity = 0;
|
||||
FluidStack fuelType = null;
|
||||
|
||||
synchronized (lavaTanks) {
|
||||
Iterator<CoordTuple> iter = lavaTanks.iterator();
|
||||
while (iter.hasNext()) {
|
||||
CoordTuple coord = iter.next();
|
||||
if (!worldObj.blockExists(coord.x, coord.y, coord.z)) continue;
|
||||
|
||||
TileEntity te = worldObj.getTileEntity(coord.x, coord.y, coord.z);
|
||||
if (!(te instanceof IFluidHandler)) {
|
||||
iter.remove();
|
||||
continue;
|
||||
}
|
||||
|
||||
FluidTankInfo[] info = ((IFluidHandler) te).getTankInfo(ForgeDirection.DOWN);
|
||||
if (info.length <= 0) continue;
|
||||
|
||||
totalCapacity += info[0].capacity;
|
||||
|
||||
if (info[0].fluid != null && info[0].fluid.amount > 0) {
|
||||
if (fuelType == null) {
|
||||
fuelType = info[0].fluid;
|
||||
totalAmount += info[0].fluid.amount;
|
||||
} else if (fuelType.isFluidEqual(info[0].fluid)) {
|
||||
totalAmount += info[0].fluid.amount;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// checks are all done before in verifyFuelTank. Don't do this without checks!
|
||||
IFluidHandler tankContainer = (IFluidHandler) worldObj
|
||||
.getTileEntity(activeLavaTank.x, activeLavaTank.y, activeLavaTank.z);
|
||||
FluidTankInfo[] info = tankContainer.getTankInfo(ForgeDirection.DOWN);
|
||||
|
||||
int capacity = info[0].capacity;
|
||||
fuelAmount = info[0].fluid.amount;
|
||||
fuelGague = (int) ((float) fuelAmount * 52f / (float) capacity);
|
||||
fuelAmount = totalAmount;
|
||||
fuelCapacity = totalCapacity;
|
||||
}
|
||||
|
||||
// actually is updateFuel.
|
||||
@@ -566,24 +587,26 @@ public class SmelteryLogic extends InventoryLogic implements IActiveLogic, IFaci
|
||||
|
||||
// our tank got derped or is empty. time to look for a new one!
|
||||
activeLavaTank = null;
|
||||
for (CoordTuple tank : lavaTanks) {
|
||||
// does the tank still exist?
|
||||
if (!worldObj.blockExists(tank.x, tank.y, tank.z)) continue;
|
||||
synchronized (lavaTanks) {
|
||||
for (CoordTuple tank : lavaTanks) {
|
||||
// does the tank still exist?
|
||||
if (!worldObj.blockExists(tank.x, tank.y, tank.z)) continue;
|
||||
|
||||
// yes, it does, but is it a tank?
|
||||
TileEntity tankContainer = worldObj.getTileEntity(tank.x, tank.y, tank.z);
|
||||
if (!(tankContainer instanceof IFluidHandler)) continue;
|
||||
// yes, it does, but is it a tank?
|
||||
TileEntity tankContainer = worldObj.getTileEntity(tank.x, tank.y, tank.z);
|
||||
if (!(tankContainer instanceof IFluidHandler)) continue;
|
||||
|
||||
// yes it is, but does it contain a liquid?
|
||||
FluidTankInfo[] info = ((IFluidHandler) tankContainer).getTankInfo(ForgeDirection.DOWN);
|
||||
if (info.length <= 0 || info[0].fluid == null || info[0].fluid.amount <= 0) continue;
|
||||
// yes it is, but does it contain a liquid?
|
||||
FluidTankInfo[] info = ((IFluidHandler) tankContainer).getTankInfo(ForgeDirection.DOWN);
|
||||
if (info.length <= 0 || info[0].fluid == null || info[0].fluid.amount <= 0) continue;
|
||||
|
||||
// is it also a smeltery fuel?
|
||||
if (!Smeltery.isSmelteryFuel(info[0].fluid.getFluid())) continue;
|
||||
// is it also a smeltery fuel?
|
||||
if (!Smeltery.isSmelteryFuel(info[0].fluid.getFluid())) continue;
|
||||
|
||||
// we found a tank! :)
|
||||
activeLavaTank = tank;
|
||||
return;
|
||||
// we found a tank! :)
|
||||
activeLavaTank = tank;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// possibly assign default empty tank here (tanks.get(0)) so we don't have a null activeLavaTank if all are
|
||||
@@ -592,15 +615,35 @@ public class SmelteryLogic extends InventoryLogic implements IActiveLogic, IFaci
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
public FluidStack getFuel() {
|
||||
if (activeLavaTank == null)
|
||||
// sane default
|
||||
FluidStack combined = null;
|
||||
|
||||
synchronized (lavaTanks) {
|
||||
Iterator<CoordTuple> iter = lavaTanks.iterator();
|
||||
while (iter.hasNext()) {
|
||||
CoordTuple coord = iter.next();
|
||||
if (!worldObj.blockExists(coord.x, coord.y, coord.z)) continue;
|
||||
|
||||
TileEntity te = worldObj.getTileEntity(coord.x, coord.y, coord.z);
|
||||
if (!(te instanceof IFluidHandler)) {
|
||||
iter.remove();
|
||||
continue;
|
||||
}
|
||||
|
||||
FluidTankInfo[] info = ((IFluidHandler) te).getTankInfo(ForgeDirection.DOWN);
|
||||
if (info.length <= 0 || info[0].fluid == null || info[0].fluid.amount <= 0) continue;
|
||||
|
||||
if (combined == null) {
|
||||
combined = info[0].fluid.copy();
|
||||
} else if (combined.isFluidEqual(info[0].fluid)) {
|
||||
combined.amount += info[0].fluid.amount;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (combined == null) {
|
||||
return new FluidStack(FluidRegistry.LAVA, 0);
|
||||
|
||||
TileEntity tankContainer = worldObj.getTileEntity(activeLavaTank.x, activeLavaTank.y, activeLavaTank.z);
|
||||
if (tankContainer instanceof IFluidHandler)
|
||||
return ((IFluidHandler) tankContainer).getTankInfo(ForgeDirection.DOWN)[0].fluid;
|
||||
|
||||
return new FluidStack(FluidRegistry.LAVA, 0);
|
||||
}
|
||||
return combined;
|
||||
}
|
||||
|
||||
public FluidStack getResultFor(ItemStack stack) {
|
||||
@@ -736,17 +779,19 @@ public class SmelteryLogic extends InventoryLogic implements IActiveLogic, IFaci
|
||||
if (tempValidStructure) {
|
||||
// try to derive temperature from fueltank
|
||||
activeLavaTank = null;
|
||||
for (CoordTuple tank : lavaTanks) {
|
||||
TileEntity tankContainer = worldObj.getTileEntity(tank.x, tank.y, tank.z);
|
||||
if (!(tankContainer instanceof IFluidHandler)) continue;
|
||||
synchronized (lavaTanks) {
|
||||
for (CoordTuple tank : lavaTanks) {
|
||||
TileEntity tankContainer = worldObj.getTileEntity(tank.x, tank.y, tank.z);
|
||||
if (!(tankContainer instanceof IFluidHandler)) continue;
|
||||
|
||||
FluidStack liquid = ((IFluidHandler) tankContainer).getTankInfo(ForgeDirection.DOWN)[0].fluid;
|
||||
if (liquid == null) continue;
|
||||
if (!Smeltery.isSmelteryFuel(liquid.getFluid())) continue;
|
||||
FluidStack liquid = ((IFluidHandler) tankContainer).getTankInfo(ForgeDirection.DOWN)[0].fluid;
|
||||
if (liquid == null) continue;
|
||||
if (!Smeltery.isSmelteryFuel(liquid.getFluid())) continue;
|
||||
|
||||
internalTemp = Smeltery.getFuelPower(liquid.getFluid());
|
||||
activeLavaTank = tank;
|
||||
break;
|
||||
internalTemp = Smeltery.getFuelPower(liquid.getFluid());
|
||||
activeLavaTank = tank;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// no tank with fuel. we reserve the first found one
|
||||
|
||||
Reference in new issue
Block a user