diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/OverflowGate.java b/core/src/io/anuke/mindustry/world/blocks/distribution/OverflowGate.java index d0e403a017..5b7eed7a99 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/OverflowGate.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/OverflowGate.java @@ -1,44 +1,56 @@ package io.anuke.mindustry.world.blocks.distribution; import io.anuke.arc.math.Mathf; -import io.anuke.arc.util.Time; import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.meta.BlockGroup; import java.io.*; -public class OverflowGate extends Router{ - private int bufferCapacity = 10; +public class OverflowGate extends Block{ + protected int bufferCapacity = 10; + protected float speed = 45f; public OverflowGate(String name){ super(name); hasItems = true; - speed = 1f; + solid = true; + update = true; + group = BlockGroup.transportation; } @Override public void update(Tile tile){ - SplitterEntity entity = tile.entity(); + OverflowGateEntity entity = tile.entity(); - if(entity.lastItem == null && entity.items.total() > 0){ - entity.items.clear(); - } - - if(entity.lastItem != null){ - entity.time += 1f / speed * Time.delta(); - Tile target = getTileTarget(tile, entity.lastItem, entity.lastInput, false); - - if(target != null && (entity.time >= 1f)){ - getTileTarget(tile, entity.lastItem, entity.lastInput, true); - target.block().handleItem(entity.lastItem, target, Edges.getFacingEdge(tile, target)); - entity.items.remove(entity.lastItem, 1); - entity.lastItem = null; + for(int i = 0; i < 4; i++){ + Item item = entity.buffer.poll(i); + if(item != null){ + Tile other = getTileTarget(tile, item, tile.getNearby(i), true); + if(other != null && other.block().acceptItem(item, other, tile)){ + other.block().handleItem(item, other, tile); + entity.buffer.remove(i); + } } } } @Override + public boolean acceptItem(Item item, Tile tile, Tile source){ + OverflowGateEntity entity = tile.entity(); + return entity.buffer.accepts(tile.relativeTo(source.x, source.y)); + } + + @Override + public void handleItem(Item item, Tile tile, Tile source){ + OverflowGateEntity entity = tile.entity(); + int buffer = tile.relativeTo(source.x, source.y); + if(entity.buffer.accepts(buffer)){ + entity.buffer.accept(buffer, item); + } + } + Tile getTileTarget(Tile tile, Item item, Tile src, boolean flip){ int from = tile.relativeTo(src.x, src.y); if(from == -1) return null; @@ -74,9 +86,19 @@ public class OverflowGate extends Router{ return to; } + @Override + public TileEntity newEntity(){ + return new OverflowGateEntity(); + } + public class OverflowGateEntity extends TileEntity{ DirectionalItemBuffer buffer = new DirectionalItemBuffer(bufferCapacity, speed); + @Override + public byte version(){ + return 1; + } + @Override public void write(DataOutput stream) throws IOException{ super.write(stream); @@ -86,7 +108,9 @@ public class OverflowGate extends Router{ @Override public void read(DataInput stream, byte revision) throws IOException{ super.read(stream, revision); - buffer.read(stream); + if(revision == 1){ + buffer.read(stream); + } } } } diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Router.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Router.java index 21a7baf18c..1294e8a2b2 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Router.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Router.java @@ -21,7 +21,7 @@ public class Router extends Block{ @Override public void update(Tile tile){ - SplitterEntity entity = tile.entity(); + RouterEntity entity = tile.entity(); if(entity.lastItem == null && entity.items.total() > 0){ entity.items.clear(); @@ -42,14 +42,14 @@ public class Router extends Block{ @Override public boolean acceptItem(Item item, Tile tile, Tile source){ - SplitterEntity entity = tile.entity(); + RouterEntity entity = tile.entity(); return tile.getTeam() == source.getTeam() && entity.lastItem == null && entity.items.total() == 0; } @Override public void handleItem(Item item, Tile tile, Tile source){ - SplitterEntity entity = tile.entity(); + RouterEntity entity = tile.entity(); entity.items.add(item, 1); entity.lastItem = item; entity.time = 0f; @@ -72,7 +72,7 @@ public class Router extends Block{ @Override public int removeStack(Tile tile, Item item, int amount){ - SplitterEntity entity = tile.entity(); + RouterEntity entity = tile.entity(); int result = super.removeStack(tile, item, amount); if(result != 0 && item == entity.lastItem){ entity.lastItem = null; @@ -82,10 +82,10 @@ public class Router extends Block{ @Override public TileEntity newEntity(){ - return new SplitterEntity(); + return new RouterEntity(); } - public class SplitterEntity extends TileEntity{ + public class RouterEntity extends TileEntity{ Item lastItem; Tile lastInput; float time; diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java index 00d53f99df..c80c130c61 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java @@ -92,7 +92,8 @@ public class Sorter extends Block{ } } - @Nullable Tile getTileTarget(Item item, Tile dest, Tile source, boolean flip){ + @Nullable + Tile getTileTarget(Item item, Tile dest, Tile source, boolean flip){ SorterEntity entity = dest.entity(); int dir = source.relativeTo(dest.x, dest.y); @@ -145,6 +146,11 @@ public class Sorter extends Block{ DirectionalItemBuffer buffer = new DirectionalItemBuffer(bufferCapacity, speed); Item sortItem; + @Override + public byte version(){ + return 1; + } + @Override public void write(DataOutput stream) throws IOException{ super.write(stream); @@ -156,7 +162,9 @@ public class Sorter extends Block{ public void read(DataInput stream, byte revision) throws IOException{ super.read(stream, revision); sortItem = content.item(stream.readShort()); - buffer.read(stream); + if(revision == 1){ + buffer.read(stream); + } } } }