The on-going consumer disaster
This commit is contained in:
@@ -187,13 +187,13 @@ public class RegenProjector extends Block{
|
||||
|
||||
@Override
|
||||
public void draw(){
|
||||
drawer.drawBase(this);
|
||||
drawer.draw(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawLight(){
|
||||
super.drawLight();
|
||||
drawer.drawLights(this);
|
||||
drawer.drawLight(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,6 +43,7 @@ public class BaseTurret extends Block{
|
||||
public void init(){
|
||||
//just makes things a little more convenient
|
||||
if(coolant != null){
|
||||
//TODO coolant fix
|
||||
coolant.update = false;
|
||||
coolant.booster = true;
|
||||
coolant.optional = true;
|
||||
|
||||
@@ -315,7 +315,7 @@ public class Turret extends ReloadTurret{
|
||||
|
||||
@Override
|
||||
public void draw(){
|
||||
draw.drawBase(this);
|
||||
draw.draw(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -54,13 +54,13 @@ public class HeatConductor extends Block{
|
||||
|
||||
@Override
|
||||
public void draw(){
|
||||
drawer.drawBase(this);
|
||||
drawer.draw(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawLight(){
|
||||
super.drawLight();
|
||||
drawer.drawLights(this);
|
||||
drawer.drawLight(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
package mindustry.world.blocks.power;
|
||||
|
||||
import mindustry.type.*;
|
||||
import mindustry.world.draw.*;
|
||||
|
||||
//TODO deprecate this whole class?
|
||||
public class BurnerGenerator extends ItemLiquidGenerator{
|
||||
|
||||
public BurnerGenerator(String name){
|
||||
super(true, false, name);
|
||||
|
||||
drawer = new DrawMulti(new DrawBlock(), new DrawWarmupRegion(), new DrawTurbines());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected float getLiquidEfficiency(Liquid liquid){
|
||||
return liquid.flammability;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected float getItemEfficiency(Item item){
|
||||
return item.flammability;
|
||||
}
|
||||
|
||||
public class BurnerGeneratorBuild extends ItemLiquidGeneratorBuild{
|
||||
|
||||
}
|
||||
}
|
||||
@@ -7,6 +7,7 @@ import mindustry.content.*;
|
||||
import mindustry.entities.*;
|
||||
import mindustry.graphics.*;
|
||||
import mindustry.type.*;
|
||||
import mindustry.world.consumers.*;
|
||||
import mindustry.world.meta.*;
|
||||
|
||||
/**
|
||||
@@ -22,6 +23,9 @@ public class ConsumeGenerator extends PowerGenerator{
|
||||
|
||||
public @Nullable LiquidStack liquidOutput;
|
||||
|
||||
public @Nullable ConsumeItemFilter filterItem;
|
||||
public @Nullable ConsumeLiquidFilter filterLiquid;
|
||||
|
||||
public ConsumeGenerator(String name){
|
||||
super(name);
|
||||
}
|
||||
@@ -37,10 +41,15 @@ public class ConsumeGenerator extends PowerGenerator{
|
||||
|
||||
@Override
|
||||
public void init(){
|
||||
filterItem = findConsumer(c -> c instanceof ConsumeItemFilter);
|
||||
filterLiquid = findConsumer(c -> c instanceof ConsumeLiquidFilter);
|
||||
|
||||
if(liquidOutput != null){
|
||||
outputsLiquid = true;
|
||||
hasLiquids = true;
|
||||
}
|
||||
|
||||
//TODO hardcoded
|
||||
emitLight = true;
|
||||
lightRadius = 65f * size;
|
||||
super.init();
|
||||
@@ -61,6 +70,7 @@ public class ConsumeGenerator extends PowerGenerator{
|
||||
|
||||
public class ConsumeGeneratorBuild extends GeneratorBuild{
|
||||
public float warmup, totalTime;
|
||||
public float itemMultiplier = 1f;
|
||||
|
||||
@Override
|
||||
public void updateTile(){
|
||||
@@ -68,7 +78,17 @@ public class ConsumeGenerator extends PowerGenerator{
|
||||
|
||||
warmup = Mathf.lerpDelta(warmup, enabled && valid ? 1f : 0f, 0.05f);
|
||||
|
||||
productionEfficiency = valid ? 1f : 0f;
|
||||
float multiplier = 1f;
|
||||
if(valid){
|
||||
if(filterItem != null && filterItem.getConsumed(this) != null){
|
||||
itemMultiplier = filterItem.getEfficiency(this);
|
||||
}
|
||||
|
||||
//efficiency is added together
|
||||
multiplier *= itemMultiplier + (filterLiquid == null ? 0f : filterLiquid.getEfficiency(this));
|
||||
}
|
||||
|
||||
productionEfficiency = (valid ? 1f : 0f) * multiplier;
|
||||
totalTime += warmup * Time.delta;
|
||||
|
||||
//randomly produce the effect
|
||||
@@ -93,10 +113,6 @@ public class ConsumeGenerator extends PowerGenerator{
|
||||
generateTime -= Math.min(1f / itemDuration * delta(), generateTime);
|
||||
}
|
||||
|
||||
public float getEfficiencyMultiplier(){
|
||||
return 1f;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean consumeTriggerValid(){
|
||||
return generateTime > 0;
|
||||
@@ -114,7 +130,9 @@ public class ConsumeGenerator extends PowerGenerator{
|
||||
|
||||
@Override
|
||||
public void drawLight(){
|
||||
//TODO
|
||||
//???
|
||||
drawer.drawLight(this);
|
||||
//TODO hard coded
|
||||
Drawf.light(team, x, y, (60f + Mathf.absin(10f, 5f)) * size, Color.orange, 0.5f * warmup);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
package mindustry.world.blocks.power;
|
||||
|
||||
import mindustry.type.*;
|
||||
import mindustry.world.meta.*;
|
||||
|
||||
public class DecayGenerator extends ItemLiquidGenerator{
|
||||
|
||||
public DecayGenerator(String name){
|
||||
super(true, false, name);
|
||||
hasItems = true;
|
||||
hasLiquids = false;
|
||||
envEnabled = Env.any;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected float getItemEfficiency(Item item){
|
||||
return item.radioactivity;
|
||||
}
|
||||
}
|
||||
@@ -1,173 +0,0 @@
|
||||
package mindustry.world.blocks.power;
|
||||
|
||||
import arc.func.*;
|
||||
import arc.graphics.*;
|
||||
import arc.math.*;
|
||||
import arc.util.*;
|
||||
import mindustry.content.*;
|
||||
import mindustry.entities.*;
|
||||
import mindustry.graphics.*;
|
||||
import mindustry.type.*;
|
||||
import mindustry.world.consumers.*;
|
||||
import mindustry.world.draw.*;
|
||||
import mindustry.world.meta.*;
|
||||
|
||||
import static mindustry.Vars.*;
|
||||
|
||||
/**
|
||||
* Power generation block which can use items, liquids or both as input sources for power production.
|
||||
* Liquids will take priority over items.
|
||||
*/
|
||||
//TODO remove
|
||||
@Deprecated
|
||||
public class ItemLiquidGenerator extends PowerGenerator{
|
||||
public float minItemEfficiency = 0.2f;
|
||||
/** The time in number of ticks during which a single item will produce power. */
|
||||
public float itemDuration = 70f;
|
||||
|
||||
/** Minimum liquid efficiency for a generator to accept it. */
|
||||
public float minLiquidEfficiency = 0.2f;
|
||||
/** Maximum liquid used per frame. */
|
||||
public float maxLiquidGenerate = 0.4f;
|
||||
|
||||
public Effect generateEffect = Fx.generatespark;
|
||||
public float generateEffectRnd = 3f;
|
||||
public Effect explodeEffect = Fx.generatespark;
|
||||
public boolean randomlyExplode = true;
|
||||
public boolean defaults = false;
|
||||
|
||||
public ItemLiquidGenerator(boolean hasItems, boolean hasLiquids, String name){
|
||||
this(name);
|
||||
this.hasItems = hasItems;
|
||||
this.hasLiquids = hasLiquids;
|
||||
setDefaults();
|
||||
}
|
||||
|
||||
public ItemLiquidGenerator(String name){
|
||||
super(name);
|
||||
|
||||
drawer = new DrawMulti(new DrawBlock(), new DrawWarmupRegion());
|
||||
}
|
||||
|
||||
protected void setDefaults(){
|
||||
if(hasItems){
|
||||
consume(new ConsumeItemFilter(item -> getItemEfficiency(item) >= minItemEfficiency)).update(false).optional(true, false);
|
||||
}
|
||||
|
||||
if(hasLiquids){
|
||||
consume(new ConsumeLiquidFilter(liquid -> getLiquidEfficiency(liquid) >= minLiquidEfficiency, maxLiquidGenerate)).update(false).optional(true, false);
|
||||
}
|
||||
|
||||
defaults = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(){
|
||||
emitLight = true;
|
||||
lightRadius = 65f * size;
|
||||
if(!defaults){
|
||||
setDefaults();
|
||||
}
|
||||
super.init();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setStats(){
|
||||
super.setStats();
|
||||
|
||||
if(hasItems){
|
||||
stats.add(Stat.productionTime, itemDuration / 60f, StatUnit.seconds);
|
||||
}
|
||||
}
|
||||
|
||||
protected float getItemEfficiency(Item item){
|
||||
return 0.0f;
|
||||
}
|
||||
|
||||
protected float getLiquidEfficiency(Liquid liquid){
|
||||
return 0.0f;
|
||||
}
|
||||
|
||||
public class ItemLiquidGeneratorBuild extends GeneratorBuild{
|
||||
protected Boolf<Liquid> liquidFilter = other -> liquids.get(other) >= 0.001f && getLiquidEfficiency(other) >= minLiquidEfficiency;
|
||||
|
||||
public float explosiveness, heat, totalTime;
|
||||
|
||||
@Override
|
||||
public boolean productionValid(){
|
||||
return generateTime > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateTile(){
|
||||
//Note: Do not use this delta when calculating the amount of power or the power efficiency, but use it for resource consumption if necessary.
|
||||
//Power amount is delta'd by PowerGraph class already.
|
||||
float calculationDelta = delta();
|
||||
boolean cons = consValid();
|
||||
|
||||
heat = Mathf.lerpDelta(heat, generateTime >= 0.001f && enabled && cons ? 1f : 0f, 0.05f);
|
||||
|
||||
if(!cons){
|
||||
productionEfficiency = 0.0f;
|
||||
return;
|
||||
}
|
||||
|
||||
Liquid liquid = hasLiquids ? content.liquids().find(liquidFilter) : null;
|
||||
totalTime += heat * Time.delta;
|
||||
|
||||
//liquid takes priority over solids
|
||||
//TODO several issues with this! - it does not work correctly, consumption should not be handled here, why am I re-implementing consumes
|
||||
//TODO what an awful class
|
||||
if(hasLiquids && liquid != null && liquids.get(liquid) >= 0.001f){
|
||||
float baseLiquidEfficiency = getLiquidEfficiency(liquid);
|
||||
float maximumPossible = maxLiquidGenerate * calculationDelta;
|
||||
float used = Math.min(liquids.get(liquid) * calculationDelta, maximumPossible);
|
||||
|
||||
liquids.remove(liquid, used);
|
||||
productionEfficiency = baseLiquidEfficiency * used / maximumPossible;
|
||||
|
||||
//TODO this aggressively spams the generate effect why would anyone want this why is this here
|
||||
if(used > 0.001f && (generateTime -= delta()) <= 0f){
|
||||
generateEffect.at(x + Mathf.range(generateEffectRnd), y + Mathf.range(generateEffectRnd));
|
||||
generateTime = 1f;
|
||||
}
|
||||
}else if(hasItems){
|
||||
// No liquids accepted or none supplied, try using items if accepted
|
||||
if(generateTime <= 0f && items.total() > 0){
|
||||
generateEffect.at(x + Mathf.range(generateEffectRnd), y + Mathf.range(generateEffectRnd));
|
||||
Item item = items.take();
|
||||
productionEfficiency = getItemEfficiency(item);
|
||||
explosiveness = item.explosiveness;
|
||||
generateTime = 1f;
|
||||
}
|
||||
|
||||
if(generateTime > 0f){
|
||||
generateTime -= Math.min(1f / itemDuration * delta(), generateTime);
|
||||
|
||||
if(randomlyExplode && state.rules.reactorExplosions && Mathf.chance(delta() * 0.06 * Mathf.clamp(explosiveness - 0.5f))){
|
||||
//this block is run last so that in the event of a block destruction, no code relies on the block type
|
||||
damage(Mathf.random(11f));
|
||||
explodeEffect.at(x + Mathf.range(size * tilesize / 2f), y + Mathf.range(size * tilesize / 2f));
|
||||
}
|
||||
}else{
|
||||
productionEfficiency = 0.0f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public float warmup(){
|
||||
return heat;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float totalProgress(){
|
||||
return totalTime;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawLight(){
|
||||
Drawf.light(team, x, y, (60f + Mathf.absin(10f, 5f)) * size, Color.orange, 0.5f * heat);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -73,13 +73,13 @@ public class PowerGenerator extends PowerDistributor{
|
||||
|
||||
@Override
|
||||
public void draw(){
|
||||
drawer.drawBase(this);
|
||||
drawer.draw(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawLight(){
|
||||
super.drawLight();
|
||||
drawer.drawLights(this);
|
||||
drawer.drawLight(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -31,8 +31,8 @@ public class GenericCrafter extends Block{
|
||||
/** if true, crafters with multiple liquid outputs will dump excess when there's still space for at least one liquid type */
|
||||
public boolean dumpExtraLiquid = true;
|
||||
public boolean ignoreLiquidFullness = false;
|
||||
/** if true, liquid will be outputted continuously regardless of craft time */
|
||||
public boolean continuousLiquidOutput = false;
|
||||
|
||||
//TODO should be seconds?
|
||||
public float craftTime = 80;
|
||||
public Effect craftEffect = Fx.none;
|
||||
public Effect updateEffect = Fx.none;
|
||||
@@ -66,7 +66,7 @@ public class GenericCrafter extends Block{
|
||||
}
|
||||
|
||||
if(outputLiquids != null){
|
||||
stats.add(Stat.output, StatValues.liquids(continuousLiquidOutput ? 1f : craftTime, outputLiquids));
|
||||
stats.add(Stat.output, StatValues.liquids(1f, outputLiquids));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -145,13 +145,13 @@ public class GenericCrafter extends Block{
|
||||
|
||||
@Override
|
||||
public void draw(){
|
||||
drawer.drawBase(this);
|
||||
drawer.draw(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawLight(){
|
||||
super.drawLight();
|
||||
drawer.drawLights(this);
|
||||
drawer.drawLight(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -193,7 +193,7 @@ public class GenericCrafter extends Block{
|
||||
warmup = Mathf.approachDelta(warmup, warmupTarget(), warmupSpeed);
|
||||
|
||||
//continuously output based on efficiency
|
||||
if(outputLiquids != null && continuousLiquidOutput){
|
||||
if(outputLiquids != null){
|
||||
float inc = getProgressIncrease(1f);
|
||||
for(var output : outputLiquids){
|
||||
handleLiquid(this, output.liquid, Math.min(output.amount * inc, liquidCapacity - liquids.get(output.liquid)));
|
||||
@@ -242,12 +242,6 @@ public class GenericCrafter extends Block{
|
||||
}
|
||||
}
|
||||
|
||||
if(outputLiquids != null && !continuousLiquidOutput){
|
||||
for(var output : outputLiquids){
|
||||
handleLiquid(this, output.liquid, output.amount);
|
||||
}
|
||||
}
|
||||
|
||||
craftEffect.at(x, y);
|
||||
progress %= 1f;
|
||||
}
|
||||
|
||||
@@ -1,72 +0,0 @@
|
||||
package mindustry.world.blocks.production;
|
||||
|
||||
import arc.math.*;
|
||||
import arc.util.*;
|
||||
import mindustry.world.consumers.*;
|
||||
import mindustry.world.meta.*;
|
||||
|
||||
public class LiquidConverter extends GenericCrafter{
|
||||
protected @Nullable ConsumeLiquid consumer;
|
||||
|
||||
public LiquidConverter(String name){
|
||||
super(name);
|
||||
hasLiquids = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean outputsItems(){
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(){
|
||||
super.init();
|
||||
|
||||
consumer = findConsumer(b -> b instanceof ConsumeLiquid);
|
||||
if(consumer == null) throw new RuntimeException("LiquidConverters must have a ConsumeLiquid.");
|
||||
consumer.update = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setStats(){
|
||||
super.setStats();
|
||||
stats.remove(Stat.output);
|
||||
stats.add(Stat.output, outputLiquid.liquid, outputLiquid.amount * 60f, true);
|
||||
}
|
||||
|
||||
public class LiquidConverterBuild extends GenericCrafterBuild{
|
||||
@Override
|
||||
public void drawLight(){
|
||||
if(hasLiquids && drawLiquidLight && outputLiquid.liquid.lightColor.a > 0.001f){
|
||||
drawLiquidLight(outputLiquid.liquid, liquids.get(outputLiquid.liquid));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateTile(){
|
||||
if(consValid()){
|
||||
if(Mathf.chanceDelta(updateEffectChance)){
|
||||
updateEffect.at(x + Mathf.range(size * 4f), y + Mathf.range(size * 4));
|
||||
}
|
||||
|
||||
warmup = Mathf.lerpDelta(warmup, 1f, 0.02f);
|
||||
float use = Math.min(consumer.amount * edelta(), liquidCapacity - liquids.get(outputLiquid.liquid));
|
||||
float ratio = outputLiquid.amount / consumer.amount;
|
||||
|
||||
liquids.remove(consumer.liquid, Math.min(use, liquids.get(consumer.liquid)));
|
||||
|
||||
progress += use / consumer.amount;
|
||||
liquids.add(outputLiquid.liquid, use * ratio);
|
||||
if(progress >= craftTime){
|
||||
consume();
|
||||
progress %= craftTime;
|
||||
}
|
||||
}else{
|
||||
//warmup is still 1 even if not consuming
|
||||
warmup = Mathf.lerp(warmup, canConsume() ? 1f : 0f, 0.02f);
|
||||
}
|
||||
|
||||
dumpLiquid(outputLiquid.liquid);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -110,13 +110,13 @@ public class Pump extends LiquidBlock{
|
||||
|
||||
@Override
|
||||
public void draw(){
|
||||
draw.drawBase(this);
|
||||
draw.draw(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawLight(){
|
||||
super.drawLight();
|
||||
draw.drawLights(this);
|
||||
draw.drawLight(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user