Better multi-liquid support / Reinforced pump progress

This commit is contained in:
Anuken
2021-11-16 10:25:59 -05:00
parent bf1909295e
commit eefcce5cf1
16 changed files with 182 additions and 109 deletions

View File

@@ -4,7 +4,6 @@ import arc.math.*;
import arc.util.io.*;
import mindustry.graphics.*;
import mindustry.ui.*;
import mindustry.world.blocks.power.NuclearReactor.*;
import mindustry.world.blocks.production.*;
import mindustry.world.draw.*;
@@ -30,7 +29,7 @@ public class HeatProducer extends GenericCrafter{
public void setBars(){
super.setBars();
bars.add("heat", (NuclearReactorBuild entity) -> new Bar("bar.heat", Pal.lightOrange, () -> entity.heat));
bars.add("heat", (HeatProducerBuild entity) -> new Bar("bar.heat", Pal.lightOrange, () -> entity.heat));
}
public class HeatProducerBuild extends GenericCrafterBuild implements HeatBlock{

View File

@@ -5,6 +5,7 @@ import mindustry.gen.*;
import mindustry.type.*;
import mindustry.world.meta.*;
//TODO should leak!
public class LiquidJunction extends LiquidBlock{
public LiquidJunction(String name){

View File

@@ -12,9 +12,7 @@ import mindustry.entities.units.*;
import mindustry.gen.*;
import mindustry.logic.*;
import mindustry.type.*;
import mindustry.ui.*;
import mindustry.world.*;
import mindustry.world.consumers.*;
import mindustry.world.draw.*;
import mindustry.world.meta.*;
@@ -74,41 +72,14 @@ public class GenericCrafter extends Block{
public void setBars(){
super.setBars();
//set up liquid bars for multiple liquid outputs
//TODO this will currently screw up input display if input liquids are filters - no good way to fix that yet
//set up liquid bars for liquid outputs
if(outputLiquids != null && outputLiquids.length > 0){
//no need for dynamic liquid bar
bars.remove("liquid");
Seq<Liquid> consumed = new Seq<>();
//find list of liquids consumed
if(consumes.has(ConsumeType.liquid)){
var consl = consumes.get(ConsumeType.liquid);
if(consl instanceof ConsumeLiquid liq){
consumed.add(liq.liquid);
}else if(consl instanceof ConsumeLiquids multi){
for(var stack : multi.liquids){
consumed.add(stack.liquid);
}
}
}
//display consumed first
for(var liq : consumed){
bars.add("liquid-consume-" + liq.name, entity -> new Bar(
() -> liq.localizedName,
liq::barColor,
() -> entity.liquids.get(liq) / liquidCapacity)
);
}
//then display output buffer
for(var stack : outputLiquids){
bars.add("liquid-output-" + stack.liquid.name, entity -> new Bar(
() -> stack.liquid.localizedName,
() -> stack.liquid.barColor(),
() -> entity.liquids.get(stack.liquid) / liquidCapacity)
);
addLiquidBar(stack.liquid);
}
}
}

View File

@@ -3,6 +3,7 @@ package mindustry.world.blocks.production;
import arc.*;
import arc.graphics.*;
import arc.graphics.g2d.*;
import arc.util.*;
import mindustry.game.*;
import mindustry.graphics.*;
import mindustry.type.*;
@@ -82,6 +83,14 @@ public class Pump extends LiquidBlock{
}
}
@Override
public void setBars(){
super.setBars();
//replace dynamic output bar with own custom bar
addLiquidBar((PumpBuild build) -> build.liquidDrop);
}
protected boolean canPump(Tile tile){
return tile != null && tile.floor().liquidDrop != null;
}
@@ -89,13 +98,15 @@ public class Pump extends LiquidBlock{
public class PumpBuild extends LiquidBuild{
public float consTimer;
public float amount = 0f;
public Liquid liquidDrop = null;
public @Nullable Liquid liquidDrop = null;
@Override
public void draw(){
Draw.rect(name, x, y);
Draw.rect(region, x, y);
Drawf.liquid(liquidRegion, x, y, liquids.currentAmount() / liquidCapacity, liquids.current().color);
if(liquidDrop == null) return;
Drawf.liquid(liquidRegion, x, y, liquids.get(liquidDrop) / liquidCapacity, liquidDrop.color);
}
@Override
@@ -126,17 +137,19 @@ public class Pump extends LiquidBlock{
@Override
public void updateTile(){
if(consValid() && liquidDrop != null){
float maxPump = Math.min(liquidCapacity - liquids.total(), amount * pumpAmount * edelta());
float maxPump = Math.min(liquidCapacity - liquids.get(liquidDrop), amount * pumpAmount * edelta());
liquids.add(liquidDrop, maxPump);
//does nothing for most pumps, as those do not require items.
if((consTimer += delta()) >= consumeTime){
consume();
consumeTime = 0f;
consTimer = 0f;
}
}
dumpLiquid(liquids.current());
if(liquidDrop != null){
dumpLiquid(liquidDrop);
}
}
}

View File

@@ -30,6 +30,7 @@ public class LiquidVoid extends Block{
@Override
public void handleLiquid(Building source, Liquid liquid, float amount){
liquids.handleFlow(liquid, amount);
}
}