Directional duct unloader

This commit is contained in:
Anuken
2021-11-05 19:45:27 -04:00
parent 52a88e7301
commit 059dc4b3bc
7 changed files with 177 additions and 4 deletions

View File

@@ -74,7 +74,7 @@ public class Blocks implements ContentList{
//transport
conveyor, titaniumConveyor, plastaniumConveyor, armoredConveyor, distributor, junction, itemBridge, phaseConveyor, sorter, invertedSorter, router,
overflowGate, underflowGate, massDriver,
duct, ductRouter, ductBridge,
duct, ductRouter, ductBridge, ductUnloader,
surgeConveyor,
//liquid
@@ -1308,6 +1308,11 @@ public class Blocks implements ContentList{
speed = 4f;
}};
ductUnloader = new DirectionalUnloader("duct-unloader"){{
requirements(Category.distribution, with(Items.graphite, 10));
speed = 4f;
}};
surgeConveyor = new StackConveyor("surge-conveyor"){{
requirements(Category.distribution, with(Items.surgeAlloy, 3, Items.graphite, 5));
health = 90;

View File

@@ -0,0 +1,159 @@
package mindustry.world.blocks.distribution;
import arc.graphics.g2d.*;
import arc.scene.ui.layout.*;
import arc.util.*;
import arc.util.io.*;
import mindustry.annotations.Annotations.*;
import mindustry.entities.units.*;
import mindustry.gen.*;
import mindustry.type.*;
import mindustry.world.*;
import mindustry.world.blocks.*;
import mindustry.world.meta.*;
import static mindustry.Vars.*;
public class DirectionalUnloader extends Block{
public @Load(value = "@-center", fallback = "unloader-center") TextureRegion centerRegion;
public @Load("@-top") TextureRegion topRegion;
public @Load("@-arrow") TextureRegion arrowRegion;
public float speed = 1f;
public DirectionalUnloader(String name){
super(name);
update = true;
solid = true;
hasItems = true;
configurable = true;
saveConfig = true;
rotate = true;
itemCapacity = 0;
noUpdateDisabled = true;
unloadable = false;
envDisabled = Env.none;
config(Item.class, (DirectionalUnloaderBuild tile, Item item) -> tile.unloadItem = item);
configClear((DirectionalUnloaderBuild tile) -> tile.unloadItem = null);
}
@Override
public void setStats(){
super.setStats();
stats.add(Stat.speed, 60f / speed, StatUnit.itemsSecond);
}
@Override
public void drawRequestRegion(BuildPlan req, Eachable<BuildPlan> list){
Draw.rect(region, req.drawx(), req.drawy());
Draw.rect(topRegion, req.drawx(), req.drawy(), req.rotation * 90);
drawRequestConfig(req, list);
}
@Override
public void drawRequestConfig(BuildPlan req, Eachable<BuildPlan> list){
drawRequestConfigCenter(req, req.config, "duct-unloader-center");
}
@Override
public void setBars(){
super.setBars();
bars.remove("items");
}
@Override
public TextureRegion[] icons(){
return new TextureRegion[]{region, topRegion, arrowRegion};
}
public class DirectionalUnloaderBuild extends Building{
public float unloadTimer = 0f;
public Item unloadItem = null;
public int offset = 0;
@Override
public void updateTile(){
if((unloadTimer += edelta()) >= speed){
Building front = front(), back = back();
if(front != null && back != null && back.items != null && front.team == team && back.team == team && back.canUnload()){
if(unloadItem == null){
var itemseq = content.items();
int itemc = itemseq.size;
for(int i = 0; i < itemc; i++){
Item item = itemseq.get((i + offset) % itemc);
if(back.items.has(item) && front.acceptItem(this, item)){
front.handleItem(this, item);
back.items.remove(item, 1);
back.itemTaken(item);
offset ++;
offset %= itemc;
break;
}
}
}else if(back.items.has(unloadItem) && front.acceptItem(this, unloadItem)){
front.handleItem(this, unloadItem);
back.items.remove(unloadItem, 1);
back.itemTaken(unloadItem);
}
}
unloadTimer %= speed;
}
}
@Override
public void draw(){
Draw.rect(region, x, y);
Draw.rect(topRegion, x, y, rotdeg());
if(unloadItem != null){
Draw.color(unloadItem.color);
Draw.rect(centerRegion, x, y);
Draw.color();
}else{
Draw.rect(arrowRegion, x, y, rotdeg());
}
}
@Override
public void buildConfiguration(Table table){
ItemSelection.buildTable(DirectionalUnloader.this, table, content.items(), () -> unloadItem, this::configure);
}
@Override
public boolean onConfigureTileTapped(Building other){
if(this == other){
deselect();
configure(null);
return false;
}
return true;
}
@Override
public Item config(){
return unloadItem;
}
@Override
public void write(Writes write){
super.write(write);
write.s(unloadItem == null ? -1 : unloadItem.id);
write.s(offset);
}
@Override
public void read(Reads read, byte revision){
super.read(read, revision);
int id = read.s();
unloadItem = id == -1 ? null : content.items().get(id);
offset = read.s();
}
}
}

View File

@@ -6,6 +6,7 @@ import arc.scene.ui.layout.*;
import arc.struct.*;
import arc.util.*;
import arc.util.io.*;
import mindustry.annotations.Annotations.*;
import mindustry.entities.units.*;
import mindustry.gen.*;
import mindustry.type.*;
@@ -16,6 +17,8 @@ import mindustry.world.meta.*;
import static mindustry.Vars.*;
public class Unloader extends Block{
public @Load(value = "@-center", fallback = "unloader-center") TextureRegion centerRegion;
public float speed = 1f;
public Unloader(String name){
@@ -29,7 +32,6 @@ public class Unloader extends Block{
itemCapacity = 0;
noUpdateDisabled = true;
unloadable = false;
envEnabled = Env.any;
config(Item.class, (UnloaderBuild tile, Item item) -> tile.sortItem = item);
configClear((UnloaderBuild tile) -> tile.sortItem = null);
@@ -203,7 +205,7 @@ public class Unloader extends Block{
super.draw();
Draw.color(sortItem == null ? Color.clear : sortItem.color);
Draw.rect("unloader-center", x, y);
Draw.rect(centerRegion, x, y);
Draw.color();
}

View File

@@ -20,5 +20,7 @@ public class Env{
//has oxygen in the atmosphere
oxygen = 1 << 7,
//all attributes combined, only used for bitmasking purposes
any = 0xffffffff;
any = 0xffffffff,
//no attributes (0)
none = 0;
}

View File

@@ -119,6 +119,10 @@ public class ItemModule extends BlockModule{
return sum;
}
public boolean has(int id){
return items[id] > 0;
}
public boolean has(Item item){
return get(item) > 0;
}