Better unit factory implementation

This commit is contained in:
Anuken
2020-05-01 18:07:37 -04:00
parent 676ee8beda
commit 35bd6a40c5
6 changed files with 40 additions and 17 deletions
+1 -7
View File
@@ -1674,12 +1674,10 @@ public class Blocks implements ContentList{
requirements(Category.units, ItemStack.with(Items.copper, 30, Items.lead, 70)); requirements(Category.units, ItemStack.with(Items.copper, 30, Items.lead, 70));
plans = new UnitPlan[]{ plans = new UnitPlan[]{
new UnitPlan(UnitTypes.dagger, 200f, ItemStack.with(Items.silicon, 10)), new UnitPlan(UnitTypes.dagger, 200f, ItemStack.with(Items.silicon, 10)),
new UnitPlan(UnitTypes.titan, 400f, ItemStack.with(Items.silicon, 10)), new UnitPlan(UnitTypes.titan, 400f, ItemStack.with(Items.silicon, 20, Items.thorium, 20)),
}; };
size = 3; size = 3;
consumes.power(1.2f); consumes.power(1.2f);
//TODO this is incorrect
consumes.items(new ItemStack(Items.silicon, 10));
}}; }};
airFactory = new UnitFactory("air-factory"){{ airFactory = new UnitFactory("air-factory"){{
@@ -1690,8 +1688,6 @@ public class Blocks implements ContentList{
}; };
size = 3; size = 3;
consumes.power(1.2f); consumes.power(1.2f);
//TODO
consumes.items(new ItemStack(Items.silicon, 10));
}}; }};
navalFactory = new UnitFactory("naval-factory"){{ navalFactory = new UnitFactory("naval-factory"){{
@@ -1702,8 +1698,6 @@ public class Blocks implements ContentList{
size = 3; size = 3;
requiresWater = true; requiresWater = true;
consumes.power(1.2f); consumes.power(1.2f);
//TODO
consumes.items(new ItemStack(Items.silicon, 10));
}}; }};
repairPoint = new RepairPoint("repair-point"){{ repairPoint = new RepairPoint("repair-point"){{
+2
View File
@@ -4,6 +4,8 @@ import arc.struct.Array;
import mindustry.content.Items; import mindustry.content.Items;
public class ItemStack implements Comparable<ItemStack>{ public class ItemStack implements Comparable<ItemStack>{
public static final ItemStack[] empty = {};
public Item item; public Item item;
public int amount = 0; public int amount = 0;
@@ -45,7 +45,6 @@ public class ForceProjector extends Block{
update = true; update = true;
solid = true; solid = true;
hasPower = true; hasPower = true;
canOverdrive = false;
hasLiquids = true; hasLiquids = true;
hasItems = true; hasItems = true;
expanded = true; expanded = true;
@@ -118,7 +117,7 @@ public class ForceProjector extends Block{
scale *= (cooldownLiquid * (1f + (liquids.current().heatCapacity - 0.4f) * 0.9f)); scale *= (cooldownLiquid * (1f + (liquids.current().heatCapacity - 0.4f) * 0.9f));
} }
buildup -= Time.delta() * scale; buildup -= delta() * scale;
} }
if(broken && buildup <= 0){ if(broken && buildup <= 0){
@@ -5,6 +5,7 @@ import arc.graphics.g2d.*;
import arc.math.*; import arc.math.*;
import arc.scene.ui.layout.*; import arc.scene.ui.layout.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*;
import arc.util.io.*; import arc.util.io.*;
import mindustry.*; import mindustry.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
@@ -23,6 +24,8 @@ import mindustry.world.meta.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class UnitFactory extends Block{ public class UnitFactory extends Block{
public float launchVelocity = 5f; public float launchVelocity = 5f;
public TextureRegion topRegion; public TextureRegion topRegion;
public int[] capacities; public int[] capacities;
@@ -39,6 +42,15 @@ public class UnitFactory extends Block{
configurable = true; configurable = true;
config(Integer.class, (tile, i) -> ((UnitFactoryEntity)tile).currentPlan = i < 0 || i >= plans.length ? -1 : i); config(Integer.class, (tile, i) -> ((UnitFactoryEntity)tile).currentPlan = i < 0 || i >= plans.length ? -1 : i);
consumes.add(new ConsumeItemDynamic(e -> {
UnitFactoryEntity entity = (UnitFactoryEntity)e;
if(entity.currentPlan != -1){
return plans[entity.currentPlan].requirements;
}
return ItemStack.empty;
}));
} }
@Remote(called = Loc.server) @Remote(called = Loc.server)
@@ -52,10 +64,9 @@ public class UnitFactory extends Block{
super.init(); super.init();
capacities = new int[Vars.content.items().size]; capacities = new int[Vars.content.items().size];
if(consumes.has(ConsumeType.item)){ for(UnitPlan plan : plans){
ConsumeItems cons = consumes.get(ConsumeType.item); for(ItemStack stack : plan.requirements){
for(ItemStack stack : cons.items){ capacities[stack.item.id] = Math.max(capacities[stack.item.id], stack.amount * 2);
capacities[stack.item.id] = stack.amount * 2;
} }
} }
} }
@@ -211,6 +222,12 @@ public class UnitFactory extends Block{
return capacities[item.id]; return capacities[item.id];
} }
@Override
public boolean acceptItem(Tilec source, Item item){
return currentPlan != -1 && items.get(item) < getMaximumAccepted(item) &&
Structs.contains(plans[currentPlan].requirements, stack -> stack.item == item);
}
@Override @Override
public byte version(){ public byte version(){
return 1; return 1;
@@ -9,7 +9,6 @@ import mindustry.type.*;
import mindustry.ui.*; import mindustry.ui.*;
import mindustry.world.meta.*; import mindustry.world.meta.*;
//TODO
public class ConsumeItemDynamic extends Consume{ public class ConsumeItemDynamic extends Consume{
public final @NonNull Func<Tilec, ItemStack[]> items; public final @NonNull Func<Tilec, ItemStack[]> items;
@@ -29,6 +28,19 @@ public class ConsumeItemDynamic extends Consume{
@Override @Override
public void build(Tilec tile, Table table){ public void build(Tilec tile, Table table){
ItemStack[][] current = {items.get(tile)};
table.update(() -> {
if(current[0] != items.get(tile)){
rebuild(tile, table);
current[0] = items.get(tile);
}
});
rebuild(tile, table);
}
private void rebuild(Tilec tile, Table table){
for(ItemStack stack : items.get(tile)){ for(ItemStack stack : items.get(tile)){
table.add(new ReqImage(new ItemImage(stack.item.icon(Cicon.medium), stack.amount), table.add(new ReqImage(new ItemImage(stack.item.icon(Cicon.medium), stack.amount),
() -> tile.items() != null && tile.items().has(stack.item, stack.amount))).size(8 * 4).padRight(5); () -> tile.items() != null && tile.items().has(stack.item, stack.amount))).size(8 * 4).padRight(5);
@@ -59,7 +71,6 @@ public class ConsumeItemDynamic extends Consume{
@Override @Override
public void display(BlockStats stats){ public void display(BlockStats stats){
//TODO //should be handled by the block
//stats.add(booster ? BlockStat.booster : BlockStat.input, new ItemListValue(items));
} }
} }
+1 -1
View File
@@ -1,3 +1,3 @@
org.gradle.daemon=true org.gradle.daemon=true
org.gradle.jvmargs=-Xms256m -Xmx1024m org.gradle.jvmargs=-Xms256m -Xmx1024m
archash=00ccb60840294db20d561feda12fa739edaaf601 archash=a8d2cb198a6f34654766bf3da73a084d6810e210