Overflow gate delay
This commit is contained in:
@@ -1,44 +1,56 @@
|
|||||||
package io.anuke.mindustry.world.blocks.distribution;
|
package io.anuke.mindustry.world.blocks.distribution;
|
||||||
|
|
||||||
import io.anuke.arc.math.Mathf;
|
import io.anuke.arc.math.Mathf;
|
||||||
import io.anuke.arc.util.Time;
|
|
||||||
import io.anuke.mindustry.entities.type.TileEntity;
|
import io.anuke.mindustry.entities.type.TileEntity;
|
||||||
import io.anuke.mindustry.type.Item;
|
import io.anuke.mindustry.type.Item;
|
||||||
import io.anuke.mindustry.world.*;
|
import io.anuke.mindustry.world.*;
|
||||||
|
import io.anuke.mindustry.world.meta.BlockGroup;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
|
||||||
public class OverflowGate extends Router{
|
public class OverflowGate extends Block{
|
||||||
private int bufferCapacity = 10;
|
protected int bufferCapacity = 10;
|
||||||
|
protected float speed = 45f;
|
||||||
|
|
||||||
public OverflowGate(String name){
|
public OverflowGate(String name){
|
||||||
super(name);
|
super(name);
|
||||||
hasItems = true;
|
hasItems = true;
|
||||||
speed = 1f;
|
solid = true;
|
||||||
|
update = true;
|
||||||
|
group = BlockGroup.transportation;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(Tile tile){
|
public void update(Tile tile){
|
||||||
SplitterEntity entity = tile.entity();
|
OverflowGateEntity entity = tile.entity();
|
||||||
|
|
||||||
if(entity.lastItem == null && entity.items.total() > 0){
|
for(int i = 0; i < 4; i++){
|
||||||
entity.items.clear();
|
Item item = entity.buffer.poll(i);
|
||||||
}
|
if(item != null){
|
||||||
|
Tile other = getTileTarget(tile, item, tile.getNearby(i), true);
|
||||||
if(entity.lastItem != null){
|
if(other != null && other.block().acceptItem(item, other, tile)){
|
||||||
entity.time += 1f / speed * Time.delta();
|
other.block().handleItem(item, other, tile);
|
||||||
Tile target = getTileTarget(tile, entity.lastItem, entity.lastInput, false);
|
entity.buffer.remove(i);
|
||||||
|
}
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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){
|
Tile getTileTarget(Tile tile, Item item, Tile src, boolean flip){
|
||||||
int from = tile.relativeTo(src.x, src.y);
|
int from = tile.relativeTo(src.x, src.y);
|
||||||
if(from == -1) return null;
|
if(from == -1) return null;
|
||||||
@@ -74,9 +86,19 @@ public class OverflowGate extends Router{
|
|||||||
return to;
|
return to;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TileEntity newEntity(){
|
||||||
|
return new OverflowGateEntity();
|
||||||
|
}
|
||||||
|
|
||||||
public class OverflowGateEntity extends TileEntity{
|
public class OverflowGateEntity extends TileEntity{
|
||||||
DirectionalItemBuffer buffer = new DirectionalItemBuffer(bufferCapacity, speed);
|
DirectionalItemBuffer buffer = new DirectionalItemBuffer(bufferCapacity, speed);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte version(){
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void write(DataOutput stream) throws IOException{
|
public void write(DataOutput stream) throws IOException{
|
||||||
super.write(stream);
|
super.write(stream);
|
||||||
@@ -86,7 +108,9 @@ public class OverflowGate extends Router{
|
|||||||
@Override
|
@Override
|
||||||
public void read(DataInput stream, byte revision) throws IOException{
|
public void read(DataInput stream, byte revision) throws IOException{
|
||||||
super.read(stream, revision);
|
super.read(stream, revision);
|
||||||
buffer.read(stream);
|
if(revision == 1){
|
||||||
|
buffer.read(stream);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ public class Router extends Block{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(Tile tile){
|
public void update(Tile tile){
|
||||||
SplitterEntity entity = tile.entity();
|
RouterEntity entity = tile.entity();
|
||||||
|
|
||||||
if(entity.lastItem == null && entity.items.total() > 0){
|
if(entity.lastItem == null && entity.items.total() > 0){
|
||||||
entity.items.clear();
|
entity.items.clear();
|
||||||
@@ -42,14 +42,14 @@ public class Router extends Block{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean acceptItem(Item item, Tile tile, Tile source){
|
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;
|
return tile.getTeam() == source.getTeam() && entity.lastItem == null && entity.items.total() == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleItem(Item item, Tile tile, Tile source){
|
public void handleItem(Item item, Tile tile, Tile source){
|
||||||
SplitterEntity entity = tile.entity();
|
RouterEntity entity = tile.entity();
|
||||||
entity.items.add(item, 1);
|
entity.items.add(item, 1);
|
||||||
entity.lastItem = item;
|
entity.lastItem = item;
|
||||||
entity.time = 0f;
|
entity.time = 0f;
|
||||||
@@ -72,7 +72,7 @@ public class Router extends Block{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int removeStack(Tile tile, Item item, int amount){
|
public int removeStack(Tile tile, Item item, int amount){
|
||||||
SplitterEntity entity = tile.entity();
|
RouterEntity entity = tile.entity();
|
||||||
int result = super.removeStack(tile, item, amount);
|
int result = super.removeStack(tile, item, amount);
|
||||||
if(result != 0 && item == entity.lastItem){
|
if(result != 0 && item == entity.lastItem){
|
||||||
entity.lastItem = null;
|
entity.lastItem = null;
|
||||||
@@ -82,10 +82,10 @@ public class Router extends Block{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TileEntity newEntity(){
|
public TileEntity newEntity(){
|
||||||
return new SplitterEntity();
|
return new RouterEntity();
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SplitterEntity extends TileEntity{
|
public class RouterEntity extends TileEntity{
|
||||||
Item lastItem;
|
Item lastItem;
|
||||||
Tile lastInput;
|
Tile lastInput;
|
||||||
float time;
|
float time;
|
||||||
|
|||||||
@@ -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();
|
SorterEntity entity = dest.entity();
|
||||||
|
|
||||||
int dir = source.relativeTo(dest.x, dest.y);
|
int dir = source.relativeTo(dest.x, dest.y);
|
||||||
@@ -145,6 +146,11 @@ public class Sorter extends Block{
|
|||||||
DirectionalItemBuffer buffer = new DirectionalItemBuffer(bufferCapacity, speed);
|
DirectionalItemBuffer buffer = new DirectionalItemBuffer(bufferCapacity, speed);
|
||||||
Item sortItem;
|
Item sortItem;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte version(){
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void write(DataOutput stream) throws IOException{
|
public void write(DataOutput stream) throws IOException{
|
||||||
super.write(stream);
|
super.write(stream);
|
||||||
@@ -156,7 +162,9 @@ public class Sorter extends Block{
|
|||||||
public void read(DataInput stream, byte revision) throws IOException{
|
public void read(DataInput stream, byte revision) throws IOException{
|
||||||
super.read(stream, revision);
|
super.read(stream, revision);
|
||||||
sortItem = content.item(stream.readShort());
|
sortItem = content.item(stream.readShort());
|
||||||
buffer.read(stream);
|
if(revision == 1){
|
||||||
|
buffer.read(stream);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user