Added sorted unloader and new block group system

This commit is contained in:
Anuken
2018-03-10 15:22:34 -05:00
parent 6a11f0dd8d
commit bf6e33791d
32 changed files with 247 additions and 132 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 276 B

View File

@@ -426,42 +426,42 @@ snowedge
index: -1
stone1
rotate: false
xy: 721, 252
xy: 701, 248
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
stone2
rotate: false
xy: 701, 248
xy: 711, 242
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
stone3
rotate: false
xy: 711, 242
xy: 721, 242
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
stoneblock1
rotate: false
xy: 721, 242
xy: 867, 437
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
stoneblock2
rotate: false
xy: 867, 437
xy: 877, 437
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
stoneblock3
rotate: false
xy: 877, 437
xy: 887, 437
size: 8, 8
orig: 8, 8
offset: 0, 0
@@ -475,49 +475,49 @@ stoneedge
index: -1
titanium1
rotate: false
xy: 887, 427
xy: 897, 427
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
titanium2
rotate: false
xy: 897, 427
xy: 907, 427
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
titanium3
rotate: false
xy: 907, 427
xy: 917, 427
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
uranium1
rotate: false
xy: 733, 284
xy: 733, 274
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
uranium2
rotate: false
xy: 733, 274
xy: 733, 264
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
uranium3
rotate: false
xy: 733, 264
xy: 261, 33
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
water
rotate: false
xy: 313, 37
xy: 323, 37
size: 8, 8
orig: 8, 8
offset: 0, 0
@@ -762,49 +762,49 @@ solarpanel
index: -1
stonedrill
rotate: false
xy: 887, 437
xy: 897, 437
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
stoneformer
rotate: false
xy: 897, 437
xy: 907, 437
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
thermalgenerator
rotate: false
xy: 877, 427
xy: 887, 427
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
titaniumdrill
rotate: false
xy: 917, 427
xy: 927, 434
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
titaniumextractor
rotate: false
xy: 927, 434
xy: 937, 434
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
uraniumdrill
rotate: false
xy: 261, 33
xy: 273, 37
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
uraniumextractor
rotate: false
xy: 273, 37
xy: 283, 37
size: 8, 8
orig: 8, 8
offset: 0, 0
@@ -984,51 +984,58 @@ shieldprojector
orig: 16, 16
offset: 0, 0
index: -1
sorter
sortedunloader
rotate: false
xy: 835, 380
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
splitter
sorter
rotate: false
xy: 815, 370
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
steelconveyor
splitter
rotate: false
xy: 825, 370
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
steelconveyormove
steelconveyor
rotate: false
xy: 835, 370
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
teleporter
steelconveyormove
rotate: false
xy: 917, 437
xy: 711, 252
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
teleporter-top
teleporter
rotate: false
xy: 867, 427
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
teleporter-top
rotate: false
xy: 877, 427
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
unloader
rotate: false
xy: 545, 57
xy: 733, 284
size: 8, 8
orig: 8, 8
offset: 0, 0
@@ -1042,7 +1049,7 @@ vault
index: -1
vault-icon
rotate: false
xy: 283, 37
xy: 293, 37
size: 8, 8
orig: 8, 8
offset: 0, 0
@@ -1266,7 +1273,7 @@ ironwall
index: -1
steelwall
rotate: false
xy: 711, 252
xy: 721, 252
size: 8, 8
orig: 8, 8
offset: 0, 0
@@ -1280,21 +1287,21 @@ steelwall-large
index: -1
stonewall
rotate: false
xy: 907, 437
xy: 917, 437
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
titaniumshieldwall
rotate: false
xy: 937, 434
xy: 947, 434
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
titaniumwall
rotate: false
xy: 947, 434
xy: 927, 424
size: 8, 8
orig: 8, 8
offset: 0, 0
@@ -1378,7 +1385,7 @@ shot-long
index: -1
titanshell
rotate: false
xy: 927, 424
xy: 937, 424
size: 8, 8
orig: 8, 8
offset: 0, 0
@@ -2658,28 +2665,28 @@ shockgun-equip
index: -1
triblaster
rotate: false
xy: 937, 424
xy: 947, 424
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
triblaster-equip
rotate: false
xy: 947, 424
xy: 545, 57
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
vulcan
rotate: false
xy: 293, 37
xy: 303, 37
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
vulcan-equip
rotate: false
xy: 303, 37
xy: 313, 37
size: 8, 8
orig: 8, 8
offset: 0, 0

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 89 KiB

View File

@@ -1,7 +1,7 @@
#Autogenerated file. Do not modify.
#Sat Mar 10 13:27:15 EST 2018
#Sat Mar 10 15:19:13 EST 2018
version=release
androidBuildCode=426
androidBuildCode=431
name=Mindustry
code=3.4
build=custom build

View File

@@ -33,6 +33,7 @@ public class Recipes {
new Recipe(distribution, DistributionBlocks.splitter, stack(Item.steel, 1)),
new Recipe(distribution, DistributionBlocks.vault, stack(Item.steel, 50)),
new Recipe(distribution, DistributionBlocks.unloader, stack(Item.steel, 5)),
new Recipe(distribution, DistributionBlocks.sortedunloader, stack(Item.steel, 5)),
new Recipe(weapon, WeaponBlocks.doubleturret, stack(Item.stone, 7)),
new Recipe(weapon, WeaponBlocks.gatlingturret, stack(Item.iron, 8), stack(Item.stone, 10)),

View File

@@ -73,8 +73,6 @@ public class Block extends BaseBlock {
public Liquid liquidDrop = null;
/**multiblock size*/
public int size = 1;
/**Brief block description. Should be short enough fit in the place menu.*/
public final String description;
/**Detailed description of the block. Can be as long as necesary.*/
public final String fullDescription;
/**Whether to draw this block in the expanded draw range.*/
@@ -89,6 +87,8 @@ public class Block extends BaseBlock {
public boolean alwaysReplace = false;
/**whether this block has instant transfer checking. used for calculations to prevent infinite loops.*/
public boolean instantTransfer = false;
/**The block group. Unless {@link #canReplace} is overriden, blocks in the same group can replace each other.*/
public BlockGroup group = BlockGroup.none;
/**list of displayed block status bars. Defaults to health bar.*/
public BlockBars bars = new BlockBars();
/**List of block stats.*/
@@ -97,7 +97,6 @@ public class Block extends BaseBlock {
public Block(String name) {
this.name = name;
this.formalName = Bundles.get("block." + name + ".name", name);
this.description = Bundles.getOrNull("block." + name + ".description");
this.fullDescription = Bundles.getOrNull("block." + name + ".fulldescription");
this.solid = false;
this.id = lastid++;
@@ -129,6 +128,7 @@ public class Block extends BaseBlock {
public void setConfigure(Tile tile, byte data){
if(Net.active()) NetEvents.handleBlockConfig(tile, data);
configure(tile, data);
}
public boolean isConfigurable(Tile tile){
@@ -160,7 +160,7 @@ public class Block extends BaseBlock {
}
public boolean canReplace(Block other){
return false;
return other != this && this.group != BlockGroup.none && other.group == this.group;
}
public int handleDamage(Tile tile, int amount){

View File

@@ -0,0 +1,5 @@
package io.anuke.mindustry.world;
public enum BlockGroup {
none, walls, turrets, transportation, power, liquids, drills;
}

View File

@@ -14,9 +14,9 @@ public abstract class BaseBlock {
public boolean hasPower;
public int itemCapacity;
public float liquidCapacity;
public float liquidCapacity = 10f;
public float liquidFlowFactor = 4.9f;
public float powerCapacity;
public float powerCapacity = 10f;
public void handleItem(Item item, Tile tile, Tile source){
tile.entity.inventory.addItem(item, 1);

View File

@@ -1,7 +1,9 @@
package io.anuke.mindustry.world.blocks;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.types.LiquidBlock;
import io.anuke.mindustry.world.blocks.types.distribution.*;
import io.anuke.mindustry.world.blocks.types.storage.SortedUnloader;
import io.anuke.mindustry.world.blocks.types.storage.Unloader;
import io.anuke.mindustry.world.blocks.types.storage.Vault;
@@ -9,11 +11,11 @@ public class DistributionBlocks{
public static final Block
conduit = new Conduit("conduit"){{
conduit = new LiquidBlock("conduit"){{
health = 45;
}},
pulseconduit = new Conduit("pulseconduit"){{
pulseconduit = new LiquidBlock("pulseconduit"){{
liquidCapacity = 16f;
liquidFlowFactor = 4.9f;
health = 65;
@@ -51,6 +53,10 @@ public class DistributionBlocks{
unloader = new Unloader("unloader"){{
}},
sortedunloader = new SortedUnloader("sortedunloader"){{
}},
junction = new Junction("junction"){{

View File

@@ -188,6 +188,7 @@ public class ProductionBlocks{
drillTime = 240;
size = 2;
powerUse = 0.08f;
hasPower = true;
}
},
@@ -196,6 +197,7 @@ public class ProductionBlocks{
drillTime = 240;
size = 3;
powerUse = 0.32f;
hasPower = true;
}
},
@@ -205,6 +207,8 @@ public class ProductionBlocks{
drillTime = 240;
size = 4;
powerUse = 0.16f;
hasLiquids = true;
hasPower = true;
}
},
@@ -223,8 +227,10 @@ public class ProductionBlocks{
result = Item.biomatter;
inputLiquid = Liquid.water;
liquidUse = 0.1f;
drillTime = 50;
drillTime = 300;
size = 2;
hasLiquids = true;
hasPower = true;
}
},

View File

@@ -1,6 +1,7 @@
package io.anuke.mindustry.world.blocks.types;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.BlockGroup;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.modules.LiquidModule;
import io.anuke.ucore.graphics.Draw;
@@ -12,6 +13,8 @@ public class LiquidBlock extends Block{
super(name);
rotate = true;
update = true;
hasLiquids = true;
group = BlockGroup.liquids;
}
@Override

View File

@@ -2,6 +2,7 @@ package io.anuke.mindustry.world.blocks.types;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.BlockGroup;
public abstract class PowerBlock extends Block{
public float powerCapacity = 10f;
@@ -12,6 +13,7 @@ public abstract class PowerBlock extends Block{
update = true;
solid = true;
hasPower = true;
group = BlockGroup.power;
}
@Override

View File

@@ -1,6 +1,7 @@
package io.anuke.mindustry.world.blocks.types;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.BlockGroup;
public class Wall extends Block{
@@ -8,10 +9,12 @@ public class Wall extends Block{
super(name);
solid = true;
destructible = true;
group = BlockGroup.walls;
}
@Override
public boolean canReplace(Block other){
return other instanceof Wall && health > other.health;
return super.canReplace(other) && health > other.health;
}
}

View File

@@ -56,6 +56,7 @@ public class Turret extends Block{
update = true;
solid = true;
layer = Layer.turret;
group = BlockGroup.turrets;
}
@Override
@@ -76,11 +77,6 @@ public class Turret extends Block{
stats.add("shots", shots);
}
@Override
public boolean canReplace(Block other){
return other instanceof Turret;
}
@Override
public void draw(Tile tile){
if(base == null) {

View File

@@ -1,16 +0,0 @@
package io.anuke.mindustry.world.blocks.types.distribution;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.types.LiquidBlock;
public class Conduit extends LiquidBlock {
public Conduit(String name) {
super(name);
}
@Override
public boolean canReplace(Block other) {
return other instanceof Conduit && other != this;
}
}

View File

@@ -4,6 +4,7 @@ import com.badlogic.gdx.utils.LongArray;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.BlockGroup;
import io.anuke.mindustry.world.Layer;
import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Timers;
@@ -38,6 +39,7 @@ public class Conveyor extends Block{
rotate = true;
update = true;
layer = Layer.overlay;
group = BlockGroup.transportation;
}
@Override
@@ -46,11 +48,6 @@ public class Conveyor extends Block{
stats.add("itemspeedsecond", Strings.toFixed(speed * 60, 1));
}
@Override
public boolean canReplace(Block other){
return other instanceof Conveyor || other instanceof Router || other instanceof Junction;
}
@Override
public void draw(Tile tile){
byte rotation = tile.getRotation();

View File

@@ -5,6 +5,7 @@ import com.badlogic.gdx.utils.NumberUtils;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.BlockGroup;
import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.function.Consumer;
@@ -19,11 +20,7 @@ public class Junction extends Block{
update = true;
solid = true;
instantTransfer = true;
}
@Override
public boolean canReplace(Block other){
return other instanceof Conveyor || other instanceof Router;
group = BlockGroup.transportation;
}
@Override

View File

@@ -6,7 +6,7 @@ import io.anuke.mindustry.world.blocks.types.LiquidBlock;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
public class LiquidJunction extends Conduit{
public class LiquidJunction extends LiquidBlock{
public LiquidJunction(String name) {
super(name);

View File

@@ -2,9 +2,10 @@ package io.anuke.mindustry.world.blocks.types.distribution;
import io.anuke.mindustry.resource.Liquid;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.LiquidBlock;
import io.anuke.ucore.graphics.Draw;
public class LiquidRouter extends Conduit{
public class LiquidRouter extends LiquidBlock{
public LiquidRouter(String name) {
super(name);

View File

@@ -1,7 +1,6 @@
package io.anuke.mindustry.world.blocks.types.distribution;
import com.badlogic.gdx.graphics.Color;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.generation.Generator;
@@ -17,11 +16,6 @@ public class PowerLaser extends Generator{
health = 50;
}
@Override
public boolean canReplace(Block other) {
return other instanceof PowerLaser && other != this;
}
@Override
public void update(Tile tile){
distributeLaserPower(tile);

View File

@@ -2,6 +2,7 @@ package io.anuke.mindustry.world.blocks.types.distribution;
import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.BlockGroup;
import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Timers;
@@ -12,11 +13,7 @@ public class Router extends Block{
update = true;
solid = true;
itemCapacity = 20;
}
@Override
public boolean canReplace(Block other){
return other instanceof Junction || other instanceof Conveyor;
group = BlockGroup.transportation;
}
@Override

View File

@@ -5,6 +5,7 @@ import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.BlockGroup;
import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.scene.style.TextureRegionDrawable;
@@ -25,6 +26,7 @@ public class Sorter extends Block{
update = true;
solid = true;
instantTransfer = true;
group = BlockGroup.transportation;
}
@Override
@@ -38,11 +40,6 @@ public class Sorter extends Block{
Draw.rect(Tmp.tr1, tile.worldx(), tile.worldy(), 4f, 4f);
}
@Override
public boolean canReplace(Block other){
return other instanceof Conveyor || other instanceof Router;
}
@Override
public boolean acceptItem(Item item, Tile tile, Tile source){
@@ -121,13 +118,12 @@ public class Sorter extends Block{
cont.margin(4);
cont.marginBottom(5);
cont.add().colspan(4).height(105f);
cont.add().colspan(4).height(50f * (int)(items.size/4f + 1f));
cont.row();
for(int i = 0; i < items.size; i ++){
final int f = i;
ImageButton button = cont.addImageButton("white", "toggle", 24, () -> {
entity.sortItem = items.get(f);
setConfigure(tile, (byte)f);
}).size(38, 42).padBottom(-5.1f).group(group).get();
button.getStyle().imageUp = new TextureRegionDrawable(new TextureRegion(items.get(i).region));

View File

@@ -19,7 +19,6 @@ import io.anuke.ucore.util.Strings;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Arrays;
import static io.anuke.mindustry.Vars.syncBlockState;
@@ -56,7 +55,7 @@ public class Teleporter extends PowerBlock{
TeleporterEntity entity = tile.entity();
if(entity != null){
entity.color = data;
Arrays.fill(entity.inventory.items, 0);
entity.inventory.clear();
}
}
@@ -117,7 +116,6 @@ public class Teleporter extends PowerBlock{
for(int i = 0; i < colors; i ++){
final int f = i;
ImageButton button = cont.addImageButton("white", "toggle", 24, () -> {
entity.color = (byte)f;
lastColor = (byte)f;
setConfigure(tile, (byte)f);
}).size(34, 38).padBottom(-5.1f).group(group).get();

View File

@@ -2,9 +2,10 @@ package io.anuke.mindustry.world.blocks.types.distribution;
import io.anuke.mindustry.resource.Liquid;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.LiquidBlock;
import io.anuke.ucore.graphics.Draw;
public class TunnelConduit extends Conduit {
public class TunnelConduit extends LiquidBlock {
protected int maxdist = 3;
protected float speed = 53;

View File

@@ -5,6 +5,7 @@ import com.badlogic.gdx.utils.NumberUtils;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.BlockGroup;
import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.util.Bits;
@@ -21,13 +22,9 @@ public class TunnelConveyor extends Block{
solid = true;
health = 70;
instantTransfer = true;
group = BlockGroup.transportation;
}
@Override
public boolean canReplace(Block other){
return other instanceof Conveyor || other instanceof Router || other instanceof Junction;
}
@Override
public void handleItem(Item item, Tile tile, Tile source){
TunnelEntity entity = tile.entity();

View File

@@ -6,6 +6,7 @@ import io.anuke.mindustry.world.blocks.types.BlockModule;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Arrays;
public class InventoryModule extends BlockModule{
public int[] items = new int[Item.getAllItems().size];
@@ -38,6 +39,10 @@ public class InventoryModule extends BlockModule{
items[item.id] -= amount;
}
public void clear(){
Arrays.fill(items, 0);
}
@Override
public void write(DataOutputStream stream) throws IOException {
byte amount = 0;

View File

@@ -5,6 +5,7 @@ import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.graphics.Fx;
import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.BlockGroup;
import io.anuke.mindustry.world.Layer;
import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Effects;
@@ -31,6 +32,7 @@ public class Drill extends Block{
solid = true;
layer = Layer.overlay;
itemCapacity = 5;
group = BlockGroup.drills;
}
@Override

View File

@@ -1,7 +1,7 @@
package io.anuke.mindustry.world.blocks.types.production;
import io.anuke.mindustry.resource.Liquid;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.BlockGroup;
import io.anuke.mindustry.world.Layer;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.LiquidBlock;
@@ -22,11 +22,7 @@ public class Pump extends LiquidBlock{
solid = true;
layer = Layer.overlay;
liquidFlowFactor = 3f;
}
@Override
public boolean canReplace(Block other) {
return other instanceof Pump && other != this;
group = BlockGroup.liquids;
}
@Override
@@ -58,7 +54,7 @@ public class Pump extends LiquidBlock{
@Override
public void drawLayer(Tile tile){
Draw.colorl(0.85f + Mathf.absin(Timers.time(), 6f, 0.15f));
Draw.rect("cross", tile.worldx(), tile.worldy());
Draw.rect("cross-"+size, tile.worldx(), tile.worldy());
Draw.color();
}

View File

@@ -1,6 +1,5 @@
package io.anuke.mindustry.world.blocks.types.storage;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.world.Tile;
@@ -37,9 +36,9 @@ public class CoreBlock extends StorageBlock {
}
@Override
public Item removeItem(Tile tile){
public Item removeItem(Tile tile, Item item){
for(int i = 0; i < state.inventory.getItems().length; i ++){
if(state.inventory.getItems()[i] > 0){
if(state.inventory.getItems()[i] > 0 && (item == null || item.id == i)){
if(Net.server() || !Net.active()) state.inventory.getItems()[i] --;
return Item.getByID(i);
}
@@ -48,10 +47,9 @@ public class CoreBlock extends StorageBlock {
}
@Override
public boolean hasItem(Tile tile){
TileEntity entity = tile.entity;
public boolean hasItem(Tile tile, Item item){
for(int i = 0; i < state.inventory.getItems().length; i ++){
if(state.inventory.getItems()[i] > 0){
if(state.inventory.getItems()[i] > 0 && (item == null || item.id == i)){
return true;
}
}

View File

@@ -0,0 +1,118 @@
package io.anuke.mindustry.world.blocks.types.storage;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.scene.style.TextureRegionDrawable;
import io.anuke.ucore.scene.ui.ButtonGroup;
import io.anuke.ucore.scene.ui.ImageButton;
import io.anuke.ucore.scene.ui.layout.Table;
import io.anuke.ucore.util.Tmp;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
public class SortedUnloader extends Unloader {
public SortedUnloader(String name){
super(name);
}
@Override
public void update(Tile tile){
SortedUnloaderEntity entity = tile.entity();
if(entity.inventory.totalItems() == 0 && entity.timer.get(timerUnload, 5)){
tile.allNearby(other -> {
if(other.block() instanceof StorageBlock && entity.inventory.totalItems() == 0 &&
((StorageBlock)other.block()).hasItem(other, entity.sortItem)){
offloadNear(tile, ((StorageBlock)other.block()).removeItem(other, entity.sortItem));
}
});
}
if(entity.inventory.totalItems() > 0){
tryDump(tile);
}
}
@Override
public void draw(Tile tile){
super.draw(tile);
SortedUnloaderEntity entity = tile.entity();
TextureRegion region = entity.sortItem.region;
Tmp.tr1.setRegion(region, 4, 4, 1, 1);
Draw.rect(Tmp.tr1, tile.worldx(), tile.worldy(), 2f, 2f);
}
@Override
public boolean isConfigurable(Tile tile){
return true;
}
@Override
public void configure(Tile tile, byte data) {
SortedUnloaderEntity entity = tile.entity();
if(entity != null){
entity.sortItem = Item.getByID(data);
entity.inventory.clear();
}
}
@Override
public void buildTable(Tile tile, Table table){
SortedUnloaderEntity entity = tile.entity();
Array<Item> items = Item.getAllItems();
ButtonGroup<ImageButton> group = new ButtonGroup<>();
Table cont = new Table();
cont.margin(4);
cont.marginBottom(5);
cont.add().colspan(4).height(50f * (int)(items.size/4f + 1f));
cont.row();
for(int i = 0; i < items.size; i ++){
final int f = i;
ImageButton button = cont.addImageButton("white", "toggle", 24, () -> {
setConfigure(tile, (byte)f);
}).size(38, 42).padBottom(-5.1f).group(group).get();
button.getStyle().imageUp = new TextureRegionDrawable(new TextureRegion(items.get(i).region));
button.setChecked(entity.sortItem.id == f);
if(i%4 == 3){
cont.row();
}
}
table.add(cont);
}
@Override
public TileEntity getEntity(){
return new SortedUnloaderEntity();
}
public static class SortedUnloaderEntity extends TileEntity{
public Item sortItem = Item.iron;
@Override
public void write(DataOutputStream stream) throws IOException {
stream.writeByte(sortItem.id);
}
@Override
public void read(DataInputStream stream) throws IOException{
sortItem = Item.getAllItems().get(stream.readByte());
}
}
}

View File

@@ -11,11 +11,12 @@ public abstract class StorageBlock extends Block {
super(name);
}
/**Removes any one item and returns it. Returns null if no items are there.*/
public Item removeItem(Tile tile){
/**Removes an item and returns it. If item is not null, it should return the item.
* Returns null if no items are there.*/
public Item removeItem(Tile tile, Item item){
TileEntity entity = tile.entity;
for(int i = 0; i < entity.inventory.items.length; i ++){
if(entity.inventory.items[i] > 0){
if(entity.inventory.items[i] > 0 && (item == null || i == item.id)){
entity.inventory.items[i] --;
return Item.getByID(i);
}
@@ -23,10 +24,12 @@ public abstract class StorageBlock extends Block {
return null;
}
public boolean hasItem(Tile tile){
/**Returns whether this storage block has the specified item.
* If the item is null, it should return whether it has ANY items.*/
public boolean hasItem(Tile tile, Item item){
TileEntity entity = tile.entity;
for(int i = 0; i < entity.inventory.items.length; i ++){
if(entity.inventory.items[i] > 0){
if(entity.inventory.items[i] > 0 && (item == null || i == item.id)){
return true;
}
}

View File

@@ -2,6 +2,7 @@ package io.anuke.mindustry.world.blocks.types.storage;
import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.BlockGroup;
import io.anuke.mindustry.world.Tile;
public class Unloader extends Block {
@@ -12,6 +13,7 @@ public class Unloader extends Block {
update = true;
solid = true;
health = 70;
group = BlockGroup.transportation;
}
@Override
@@ -19,8 +21,8 @@ public class Unloader extends Block {
if(tile.entity.inventory.totalItems() == 0 && tile.entity.timer.get(timerUnload, 5)){
tile.allNearby(other -> {
if(other.block() instanceof StorageBlock && tile.entity.inventory.totalItems() == 0 &&
((StorageBlock)other.block()).hasItem(other)){
offloadNear(tile, ((StorageBlock)other.block()).removeItem(other));
((StorageBlock)other.block()).hasItem(other, null)){
offloadNear(tile, ((StorageBlock)other.block()).removeItem(other, null));
}
});
}