-
Notifications
You must be signed in to change notification settings - Fork 2.9k
/
Sorter.java
154 lines (123 loc) · 3.68 KB
/
Sorter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
package io.anuke.mindustry.world.blocks.types.distribution;
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.core.Draw;
import io.anuke.ucore.core.Timers;
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.Mathf;
import io.anuke.ucore.util.Tmp;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
public class Sorter extends Junction{
public Sorter(String name) {
super(name);
}
@Override
public void draw(Tile tile){
super.draw(tile);
SorterEntity entity = tile.entity();
TextureRegion region = Draw.region("icon-" + entity.sortItem.name);
Tmp.tr1.setRegion(region, 4, 4, 1, 1);
Draw.rect(Tmp.tr1, tile.worldx(), tile.worldy(), 4f, 4f);
}
@Override
public boolean acceptItem(Item item, Tile tile, Tile source){
if(source.block() instanceof Sorter) return false;
Tile to = getTileTarget(item, tile, source, false);
return to != null && to.block().acceptItem(item, to, tile);
}
@Override
public void handleItem(Item item, Tile tile, Tile source){
Tile to = getTileTarget(item, tile, source, true);
Timers.run(15, () -> {
to.block().handleItem(item, to, tile);
});
}
Tile getTileTarget(Item item, Tile dest, Tile source, boolean flip){
SorterEntity entity = dest.entity();
int dir = source.relativeTo(dest.x, dest.y);
if(dir == -1) return null;
Tile to = null;
if(item == entity.sortItem){
to = dest.getNearby()[dir];
}else{
Tile a = dest.getNearby()[Mathf.mod(dir - 1, 4)];
Tile b = dest.getNearby()[Mathf.mod(dir + 1, 4)];
boolean ac = a.block().acceptItem(item, a, dest);
boolean bc = b.block().acceptItem(item, b, dest);
if(ac && !bc){
to = a;
}else if(bc && !ac){
to = b;
}else{
if(dest.getDump() == 0){
to = a;
if(flip)
dest.setDump((byte)1);
}else{
to = b;
if(flip)
dest.setDump((byte)0);
}
}
}
return to;
}
@Override
public void configure(Tile tile, byte data) {
SorterEntity entity = tile.entity();
if(entity != null){
entity.sortItem = Item.getByID(data);
}
}
@Override
public boolean isConfigurable(Tile tile){
return true;
}
@Override
public void buildTable(Tile tile, Table table){
SorterEntity 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(105f);
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(Draw.region("icon-"+items.get(i).name)));
button.setChecked(entity.sortItem.id == f);
if(i%4 == 3){
cont.row();
}
}
table.add(cont);
}
@Override
public TileEntity getEntity(){
return new SorterEntity();
}
public static class SorterEntity 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());
}
}
}