DEATH AND DESTRUCTION
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
package mindustry.world.consumers;
|
||||
|
||||
import arc.scene.ui.layout.*;
|
||||
import arc.struct.*;
|
||||
import mindustry.gen.*;
|
||||
import mindustry.world.*;
|
||||
import mindustry.world.meta.*;
|
||||
|
||||
/** An abstract class that defines a type of resource that a block can consume. */
|
||||
@@ -11,21 +11,15 @@ public abstract class Consume{
|
||||
public boolean optional;
|
||||
/** If true, this consumer will be displayed as a boost input. */
|
||||
public boolean booster;
|
||||
|
||||
//TODO bad.
|
||||
@Deprecated
|
||||
public boolean update = true;
|
||||
|
||||
/**
|
||||
* Apply a filter to items accepted.
|
||||
* This should set all item IDs that are present in the filter to true.
|
||||
* Apply extra filters to a block.
|
||||
*/
|
||||
public void applyItemFilter(Bits filter){
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply a filter to liquids accepted.
|
||||
* This should set all liquid IDs that are present in the filter to true.
|
||||
*/
|
||||
public void applyLiquidFilter(Bits filter){
|
||||
public void apply(Block block){
|
||||
|
||||
}
|
||||
|
||||
@@ -39,25 +33,12 @@ public abstract class Consume{
|
||||
return optional(true, true);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public Consume update(boolean update){
|
||||
this.update = update;
|
||||
return this;
|
||||
}
|
||||
|
||||
public boolean isOptional(){
|
||||
return optional;
|
||||
}
|
||||
|
||||
public boolean isBoost(){
|
||||
return booster;
|
||||
}
|
||||
|
||||
public boolean isUpdate(){
|
||||
return update;
|
||||
}
|
||||
|
||||
public abstract ConsumeType type();
|
||||
|
||||
public void build(Building build, Table table){}
|
||||
|
||||
/** Called when a consumption is triggered manually. */
|
||||
|
||||
@@ -5,6 +5,7 @@ import arc.scene.ui.layout.*;
|
||||
import mindustry.gen.*;
|
||||
import mindustry.type.*;
|
||||
import mindustry.ui.*;
|
||||
import mindustry.world.*;
|
||||
|
||||
public class ConsumeItemDynamic extends Consume{
|
||||
public final Func<Building, ItemStack[]> items;
|
||||
@@ -15,8 +16,9 @@ public class ConsumeItemDynamic extends Consume{
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConsumeType type(){
|
||||
return ConsumeType.item;
|
||||
public void apply(Block block){
|
||||
block.hasItems = true;
|
||||
block.acceptsItems = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -2,10 +2,10 @@ package mindustry.world.consumers;
|
||||
|
||||
import arc.func.*;
|
||||
import arc.scene.ui.layout.*;
|
||||
import arc.struct.*;
|
||||
import mindustry.gen.*;
|
||||
import mindustry.type.*;
|
||||
import mindustry.ui.*;
|
||||
import mindustry.world.*;
|
||||
import mindustry.world.meta.*;
|
||||
|
||||
import static mindustry.Vars.*;
|
||||
@@ -18,13 +18,10 @@ public class ConsumeItemFilter extends Consume{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void applyItemFilter(Bits arr){
|
||||
content.items().each(filter, item -> arr.set(item.id));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConsumeType type(){
|
||||
return ConsumeType.item;
|
||||
public void apply(Block block){
|
||||
block.hasItems = true;
|
||||
block.acceptsItems = true;
|
||||
content.items().each(filter, item -> block.itemFilter[item.id] = true);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package mindustry.world.consumers;
|
||||
|
||||
import arc.scene.ui.layout.*;
|
||||
import arc.struct.*;
|
||||
import mindustry.gen.*;
|
||||
import mindustry.type.*;
|
||||
import mindustry.ui.*;
|
||||
import mindustry.world.*;
|
||||
import mindustry.world.meta.*;
|
||||
|
||||
public class ConsumeItems extends Consume{
|
||||
@@ -20,17 +20,14 @@ public class ConsumeItems extends Consume{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void applyItemFilter(Bits filter){
|
||||
public void apply(Block block){
|
||||
block.hasItems = true;
|
||||
block.acceptsItems = true;
|
||||
for(var stack : items){
|
||||
filter.set(stack.item.id);
|
||||
block.itemFilter[stack.item.id] = true;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConsumeType type(){
|
||||
return ConsumeType.item;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void build(Building build, Table table){
|
||||
table.table(c -> {
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package mindustry.world.consumers;
|
||||
|
||||
import arc.scene.ui.layout.*;
|
||||
import arc.struct.*;
|
||||
import mindustry.gen.*;
|
||||
import mindustry.type.*;
|
||||
import mindustry.ui.*;
|
||||
import mindustry.world.*;
|
||||
import mindustry.world.meta.*;
|
||||
|
||||
import static mindustry.Vars.*;
|
||||
@@ -23,8 +23,9 @@ public class ConsumeLiquid extends ConsumeLiquidBase{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void applyLiquidFilter(Bits filter){
|
||||
filter.set(liquid.id);
|
||||
public void apply(Block block){
|
||||
super.apply(block);
|
||||
block.liquidFilter[liquid.id] = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package mindustry.world.consumers;
|
||||
|
||||
import mindustry.gen.*;
|
||||
import mindustry.world.*;
|
||||
|
||||
public abstract class ConsumeLiquidBase extends Consume{
|
||||
/** amount used per frame */
|
||||
@@ -13,8 +14,8 @@ public abstract class ConsumeLiquidBase extends Consume{
|
||||
public ConsumeLiquidBase(){}
|
||||
|
||||
@Override
|
||||
public ConsumeType type(){
|
||||
return ConsumeType.liquid;
|
||||
public void apply(Block block){
|
||||
block.hasLiquids = true;
|
||||
}
|
||||
|
||||
protected float use(Building entity){
|
||||
|
||||
@@ -6,6 +6,7 @@ import arc.struct.*;
|
||||
import mindustry.gen.*;
|
||||
import mindustry.type.*;
|
||||
import mindustry.ui.*;
|
||||
import mindustry.world.*;
|
||||
import mindustry.world.meta.*;
|
||||
|
||||
import static mindustry.Vars.*;
|
||||
@@ -23,8 +24,9 @@ public class ConsumeLiquidFilter extends ConsumeLiquidBase{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void applyLiquidFilter(Bits arr){
|
||||
content.liquids().each(filter, item -> arr.set(item.id));
|
||||
public void apply(Block block){
|
||||
block.hasLiquids = true;
|
||||
content.liquids().each(filter, item -> block.liquidFilter[item.id] = true);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
package mindustry.world.consumers;
|
||||
|
||||
import arc.scene.ui.layout.*;
|
||||
import arc.struct.*;
|
||||
import mindustry.*;
|
||||
import mindustry.gen.*;
|
||||
import mindustry.type.*;
|
||||
import mindustry.ui.*;
|
||||
import mindustry.world.*;
|
||||
import mindustry.world.meta.*;
|
||||
|
||||
//TODO test!
|
||||
@@ -22,17 +22,13 @@ public class ConsumeLiquids extends Consume{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void applyLiquidFilter(Bits filter){
|
||||
public void apply(Block block){
|
||||
block.hasLiquids = true;
|
||||
for(var stack : liquids){
|
||||
filter.set(stack.liquid.id);
|
||||
block.itemFilter[stack.liquid.id] = true;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConsumeType type(){
|
||||
return ConsumeType.liquid;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void build(Building build, Table table){
|
||||
table.table(c -> {
|
||||
|
||||
@@ -60,9 +60,4 @@ public class ConsumePayloadDynamic extends Consume{
|
||||
}
|
||||
}).left();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConsumeType type(){
|
||||
return ConsumeType.payload;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,9 +61,4 @@ public class ConsumePayloadFilter extends Consume{
|
||||
|
||||
table.add(image).size(8 * 4);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConsumeType type(){
|
||||
return ConsumeType.payload;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,9 +49,4 @@ public class ConsumePayloads extends Consume{
|
||||
}
|
||||
}).left();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConsumeType type(){
|
||||
return ConsumeType.payload;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package mindustry.world.consumers;
|
||||
|
||||
import arc.math.*;
|
||||
import arc.scene.ui.layout.*;
|
||||
import mindustry.gen.*;
|
||||
import mindustry.world.*;
|
||||
import mindustry.world.meta.*;
|
||||
|
||||
/** Consumer class for blocks which consume power while being connected to a power graph. */
|
||||
@@ -25,8 +25,9 @@ public class ConsumePower extends Consume{
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConsumeType type(){
|
||||
return ConsumeType.power;
|
||||
public void apply(Block block){
|
||||
block.hasPower = true;
|
||||
block.consPower = this;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
package mindustry.world.consumers;
|
||||
|
||||
import arc.func.*;
|
||||
import mindustry.gen.*;
|
||||
|
||||
/** A power consumer that only activates sometimes. */
|
||||
public class ConsumePowerCondition extends ConsumePower{
|
||||
private final Boolf<Building> consume;
|
||||
|
||||
public ConsumePowerCondition(float usage, Boolf<Building> consume){
|
||||
super(usage, 0, false);
|
||||
this.consume = consume;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float requestedPower(Building entity){
|
||||
return consume.get(entity) ? usage : 0f;
|
||||
}
|
||||
}
|
||||
19
core/src/mindustry/world/consumers/ConsumePowerDynamic.java
Normal file
19
core/src/mindustry/world/consumers/ConsumePowerDynamic.java
Normal file
@@ -0,0 +1,19 @@
|
||||
package mindustry.world.consumers;
|
||||
|
||||
import arc.func.*;
|
||||
import mindustry.gen.*;
|
||||
|
||||
/** A power consumer that uses a dynamic amount of power. */
|
||||
public class ConsumePowerDynamic extends ConsumePower{
|
||||
private final Floatf<Building> usage;
|
||||
|
||||
public ConsumePowerDynamic(Floatf<Building> usage){
|
||||
super(0, 0, false);
|
||||
this.usage = usage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float requestedPower(Building entity){
|
||||
return usage.get(entity);
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
package mindustry.world.consumers;
|
||||
|
||||
public enum ConsumeType{
|
||||
item,
|
||||
power,
|
||||
liquid,
|
||||
payload;
|
||||
|
||||
public static final ConsumeType[] all = values();
|
||||
}
|
||||
@@ -1,141 +0,0 @@
|
||||
package mindustry.world.consumers;
|
||||
|
||||
import arc.func.*;
|
||||
import arc.struct.*;
|
||||
import arc.util.*;
|
||||
import mindustry.*;
|
||||
import mindustry.gen.*;
|
||||
import mindustry.type.*;
|
||||
import mindustry.world.blocks.power.*;
|
||||
import mindustry.world.meta.*;
|
||||
|
||||
public class Consumers{
|
||||
private Consume[] map = new Consume[ConsumeType.all.length];
|
||||
|
||||
public Consume[] all = {}, optionals = {};
|
||||
|
||||
public final Bits itemFilters = new Bits(Vars.content.items().size);
|
||||
public final Bits liquidfilters = new Bits(Vars.content.liquids().size);
|
||||
|
||||
public boolean consumesItem(Item item){
|
||||
return itemFilters.get(item.id);
|
||||
}
|
||||
|
||||
public boolean consumesLiquid(Liquid liq){
|
||||
return liquidfilters.get(liq.id);
|
||||
}
|
||||
|
||||
public boolean any(){
|
||||
return all.length > 0;
|
||||
}
|
||||
|
||||
public void each(Cons<Consume> c){
|
||||
for(var cons : map){
|
||||
if(cons != null){
|
||||
c.get(cons);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void init(){
|
||||
all = Structs.filter(Consume.class, map, m -> m != null);
|
||||
optionals = Structs.filter(Consume.class, map, m -> m != null && m.isOptional());
|
||||
|
||||
for(Consume cons : all){
|
||||
cons.applyItemFilter(itemFilters);
|
||||
cons.applyLiquidFilter(liquidfilters);
|
||||
}
|
||||
}
|
||||
|
||||
public ConsumePower getPower(){
|
||||
return get(ConsumeType.power);
|
||||
}
|
||||
|
||||
public ConsumeItems getItem(){
|
||||
return get(ConsumeType.item);
|
||||
}
|
||||
|
||||
public boolean hasPower(){
|
||||
return has(ConsumeType.power);
|
||||
}
|
||||
|
||||
public ConsumeLiquid liquid(Liquid liquid, float amount){
|
||||
return add(new ConsumeLiquid(liquid, amount));
|
||||
}
|
||||
|
||||
public ConsumeLiquids liquids(LiquidStack... stacks){
|
||||
return add(new ConsumeLiquids(stacks));
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a consumer which directly uses power without buffering it.
|
||||
* @param powerPerTick The amount of power which is required each tick for 100% efficiency.
|
||||
* @return the created consumer object.
|
||||
*/
|
||||
public ConsumePower power(float powerPerTick){
|
||||
return add(new ConsumePower(powerPerTick, 0.0f, false));
|
||||
}
|
||||
|
||||
/** Creates a consumer which only consumes power when the condition is met. */
|
||||
public <T extends Building> ConsumePower powerCond(float usage, Boolf<T> cons){
|
||||
return add(new ConditionalConsumePower(usage, (Boolf<Building>)cons));
|
||||
}
|
||||
|
||||
/** Creates a consumer that consumes a dynamic amount of power. */
|
||||
public <T extends Building> ConsumePower powerDynamic(Floatf<T> usage){
|
||||
return add(new DynamicConsumePower((Floatf<Building>)usage));
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a consumer which stores power.
|
||||
* @param powerCapacity The maximum capacity in power units.
|
||||
*/
|
||||
public ConsumePower powerBuffered(float powerCapacity){
|
||||
return add(new ConsumePower(0f, powerCapacity, true));
|
||||
}
|
||||
|
||||
public ConsumeItems item(Item item){
|
||||
return item(item, 1);
|
||||
}
|
||||
|
||||
public ConsumeItems item(Item item, int amount){
|
||||
return add(new ConsumeItems(new ItemStack[]{new ItemStack(item, amount)}));
|
||||
}
|
||||
|
||||
public ConsumeItems items(ItemStack... items){
|
||||
return add(new ConsumeItems(items));
|
||||
}
|
||||
|
||||
public <T extends Consume> T add(T consume){
|
||||
map[consume.type().ordinal()] = consume;
|
||||
return consume;
|
||||
}
|
||||
|
||||
public void remove(ConsumeType type){
|
||||
map[type.ordinal()] = null;
|
||||
}
|
||||
|
||||
public boolean has(ConsumeType type){
|
||||
return map[type.ordinal()] != null;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public <T extends Consume> T get(ConsumeType type){
|
||||
if(map[type.ordinal()] == null){
|
||||
throw new IllegalArgumentException("Block does not contain consumer of type '" + type + "'!");
|
||||
}
|
||||
return (T)map[type.ordinal()];
|
||||
}
|
||||
|
||||
public @Nullable <T extends Consume>T getOrNull(ConsumeType type){
|
||||
return (T)map[type.ordinal()];
|
||||
}
|
||||
|
||||
public void display(Stats stats){
|
||||
for(Consume c : map){
|
||||
if(c != null){
|
||||
c.display(stats);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user