Full implementation of #7014
This commit is contained in:
@@ -121,6 +121,8 @@ public class Reconstructor extends UnitBlock{
|
||||
}
|
||||
}
|
||||
|
||||
consumeBuilder.each(c -> c.multiplier = b -> state.rules.unitCost(b.team));
|
||||
|
||||
super.init();
|
||||
}
|
||||
|
||||
|
||||
@@ -123,6 +123,8 @@ public class UnitAssembler extends PayloadBlock{
|
||||
updateClipRadius(areaSize * tilesize);
|
||||
consume(consPayload = new ConsumePayloadDynamic((UnitAssemblerBuild build) -> build.plan().requirements));
|
||||
|
||||
consumeBuilder.each(c -> c.multiplier = b -> state.rules.unitCost(b.team));
|
||||
|
||||
super.init();
|
||||
}
|
||||
|
||||
|
||||
@@ -25,6 +25,8 @@ import mindustry.world.blocks.payloads.*;
|
||||
import mindustry.world.consumers.*;
|
||||
import mindustry.world.meta.*;
|
||||
|
||||
import static mindustry.Vars.*;
|
||||
|
||||
public class UnitFactory extends UnitBlock{
|
||||
public int[] capacities = {};
|
||||
|
||||
@@ -74,6 +76,8 @@ public class UnitFactory extends UnitBlock{
|
||||
}
|
||||
}
|
||||
|
||||
consumeBuilder.each(c -> c.multiplier = b -> state.rules.unitCost(b.team));
|
||||
|
||||
super.init();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package mindustry.world.consumers;
|
||||
|
||||
import arc.func.*;
|
||||
import arc.scene.ui.layout.*;
|
||||
import mindustry.gen.*;
|
||||
import mindustry.world.*;
|
||||
@@ -13,6 +14,8 @@ public abstract class Consume{
|
||||
public boolean booster;
|
||||
/** If false, this consumer will still be checked, but it will need to updated manually. */
|
||||
public boolean update = true;
|
||||
/** Multiplier for costs. Does not work for power consumers. */
|
||||
public Floatf<Building> multiplier = b -> 1f;
|
||||
|
||||
/**
|
||||
* Apply extra filters to a block.
|
||||
|
||||
@@ -37,13 +37,13 @@ public class ConsumeItemDynamic extends Consume{
|
||||
});
|
||||
}
|
||||
|
||||
private void rebuild(Building tile, Table table){
|
||||
private void rebuild(Building build, Table table){
|
||||
table.clear();
|
||||
int i = 0;
|
||||
|
||||
for(ItemStack stack : items.get(tile)){
|
||||
table.add(new ReqImage(new ItemImage(stack.item.uiIcon, stack.amount),
|
||||
() -> tile.items != null && tile.items.has(stack.item, stack.amount))).padRight(8).left();
|
||||
for(ItemStack stack : items.get(build)){
|
||||
table.add(new ReqImage(new ItemImage(stack.item.uiIcon, Math.round(stack.amount * multiplier.get(build))),
|
||||
() -> build.items != null && build.items.has(stack.item, Math.round(stack.amount * multiplier.get(build))))).padRight(8).left();
|
||||
if(++i % 4 == 0) table.row();
|
||||
}
|
||||
}
|
||||
@@ -51,12 +51,12 @@ public class ConsumeItemDynamic extends Consume{
|
||||
@Override
|
||||
public void trigger(Building build){
|
||||
for(ItemStack stack : items.get(build)){
|
||||
build.items.remove(stack);
|
||||
build.items.remove(stack.item, Math.round(stack.amount * multiplier.get(build)));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public float efficiency(Building build){
|
||||
return build.consumeTriggerValid() || build.items.has(items.get(build)) ? 1f : 0f;
|
||||
return build.consumeTriggerValid() || build.items.has(items.get(build), multiplier.get(build)) ? 1f : 0f;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,8 +33,8 @@ public class ConsumeItems extends Consume{
|
||||
table.table(c -> {
|
||||
int i = 0;
|
||||
for(var stack : items){
|
||||
c.add(new ReqImage(new ItemImage(stack.item.uiIcon, stack.amount),
|
||||
() -> build.items.has(stack.item, stack.amount))).padRight(8);
|
||||
c.add(new ReqImage(new ItemImage(stack.item.uiIcon, Math.round(stack.amount * multiplier.get(build))),
|
||||
() -> build.items.has(stack.item, Math.round(stack.amount * multiplier.get(build))))).padRight(8);
|
||||
if(++i % 4 == 0) c.row();
|
||||
}
|
||||
}).left();
|
||||
@@ -43,13 +43,13 @@ public class ConsumeItems extends Consume{
|
||||
@Override
|
||||
public void trigger(Building build){
|
||||
for(var stack : items){
|
||||
build.items.remove(stack);
|
||||
build.items.remove(stack.item, Math.round(stack.amount * multiplier.get(build)));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public float efficiency(Building build){
|
||||
return build.consumeTriggerValid() || build.items.has(items) ? 1f : 0f;
|
||||
return build.consumeTriggerValid() || build.items.has(items, multiplier.get(build)) ? 1f : 0f;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -35,7 +35,7 @@ public class ConsumeLiquid extends ConsumeLiquidBase{
|
||||
|
||||
@Override
|
||||
public void update(Building build){
|
||||
build.liquids.remove(liquid, amount * build.edelta());
|
||||
build.liquids.remove(liquid, amount * build.edelta() * multiplier.get(build));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -43,7 +43,7 @@ public class ConsumeLiquid extends ConsumeLiquidBase{
|
||||
float ed = build.edelta() * build.efficiencyScale();
|
||||
if(ed <= 0.00000001f) return 0f;
|
||||
//there can be more liquid than necessary, so cap at 1
|
||||
return Math.min(build.liquids.get(liquid) / (amount * ed), 1f);
|
||||
return Math.min(build.liquids.get(liquid) / (amount * ed * multiplier.get(build)), 1f);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -43,7 +43,7 @@ public class ConsumeLiquidFilter extends ConsumeLiquidBase{
|
||||
public void update(Building build){
|
||||
Liquid liq = getConsumed(build);
|
||||
if(liq != null){
|
||||
build.liquids.remove(liq, amount * build.edelta());
|
||||
build.liquids.remove(liq, amount * build.edelta() * multiplier.get(build));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ public class ConsumeLiquidFilter extends ConsumeLiquidBase{
|
||||
var liq = getConsumed(build);
|
||||
float ed = build.edelta();
|
||||
if(ed <= 0.00000001f) return 0f;
|
||||
return liq != null ? Math.min(build.liquids.get(liq) / (amount * ed), 1f) : 0f;
|
||||
return liq != null ? Math.min(build.liquids.get(liq) / (amount * ed * multiplier.get(build)), 1f) : 0f;
|
||||
}
|
||||
|
||||
public @Nullable Liquid getConsumed(Building build){
|
||||
|
||||
@@ -42,18 +42,20 @@ public class ConsumeLiquids extends Consume{
|
||||
|
||||
@Override
|
||||
public void update(Building build){
|
||||
float mult = multiplier.get(build);
|
||||
for(var stack : liquids){
|
||||
build.liquids.remove(stack.liquid, stack.amount * build.edelta());
|
||||
build.liquids.remove(stack.liquid, stack.amount * build.edelta() * mult);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public float efficiency(Building build){
|
||||
float mult = multiplier.get(build);
|
||||
float ed = build.edelta();
|
||||
if(ed <= 0.00000001f) return 0f;
|
||||
float min = 1f;
|
||||
for(var stack : liquids){
|
||||
min = Math.min(build.liquids.get(stack.liquid) / (stack.amount * ed), min);
|
||||
min = Math.min(build.liquids.get(stack.liquid) / (stack.amount * ed * mult), min);
|
||||
}
|
||||
return min;
|
||||
}
|
||||
|
||||
@@ -18,12 +18,21 @@ public class ConsumePayloadDynamic extends Consume{
|
||||
|
||||
@Override
|
||||
public float efficiency(Building build){
|
||||
return build.getPayloads().contains(payloads.get(build)) ? 1f : 0f;
|
||||
float mult = multiplier.get(build);
|
||||
for(PayloadStack stack : payloads.get(build)){
|
||||
if(!build.getPayloads().contains(stack.item, Math.round(stack.amount * mult))){
|
||||
return 0f;
|
||||
}
|
||||
}
|
||||
return 1f;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void trigger(Building build){
|
||||
build.getPayloads().remove(payloads.get(build));
|
||||
float mult = multiplier.get(build);
|
||||
for(PayloadStack stack : payloads.get(build)){
|
||||
build.getPayloads().remove(stack.item, Math.round(stack.amount * mult));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -54,8 +63,8 @@ public class ConsumePayloadDynamic extends Consume{
|
||||
table.table(c -> {
|
||||
int i = 0;
|
||||
for(var stack : pay){
|
||||
c.add(new ReqImage(new ItemImage(stack.item.uiIcon, stack.amount),
|
||||
() -> inv.contains(stack.item, stack.amount))).padRight(8);
|
||||
c.add(new ReqImage(new ItemImage(stack.item.uiIcon, Math.round(stack.amount * multiplier.get(build))),
|
||||
() -> inv.contains(stack.item, Math.round(stack.amount * multiplier.get(build))))).padRight(8);
|
||||
if(++i % 4 == 0) c.row();
|
||||
}
|
||||
}).left();
|
||||
|
||||
@@ -16,12 +16,21 @@ public class ConsumePayloads extends Consume{
|
||||
|
||||
@Override
|
||||
public float efficiency(Building build){
|
||||
return build.getPayloads().contains(payloads) ? 1f : 0f;
|
||||
float mult = multiplier.get(build);
|
||||
for(PayloadStack stack : payloads){
|
||||
if(!build.getPayloads().contains(stack.item, Math.round(stack.amount * mult))){
|
||||
return 0f;
|
||||
}
|
||||
}
|
||||
return 1f;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void trigger(Building build){
|
||||
build.getPayloads().remove(payloads);
|
||||
float mult = multiplier.get(build);
|
||||
for(PayloadStack stack : payloads){
|
||||
build.getPayloads().remove(stack.item, Math.round(stack.amount * mult));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -42,8 +51,8 @@ public class ConsumePayloads extends Consume{
|
||||
table.table(c -> {
|
||||
int i = 0;
|
||||
for(var stack : payloads){
|
||||
c.add(new ReqImage(new ItemImage(stack.item.uiIcon, stack.amount),
|
||||
() -> inv.contains(stack.item, stack.amount))).padRight(8);
|
||||
c.add(new ReqImage(new ItemImage(stack.item.uiIcon, Math.round(stack.amount * multiplier.get(build))),
|
||||
() -> inv.contains(stack.item, Math.round(stack.amount * multiplier.get(build))))).padRight(8);
|
||||
if(++i % 4 == 0) c.row();
|
||||
}
|
||||
}).left();
|
||||
|
||||
Reference in New Issue
Block a user