Storage graph inventory sharing
This commit is contained in:
@@ -24,7 +24,7 @@ import io.anuke.mindustry.net.Packets.*;
|
||||
import io.anuke.mindustry.net.TraceInfo;
|
||||
import io.anuke.mindustry.net.ValidateException;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
import io.anuke.mindustry.world.modules.InventoryModule;
|
||||
import io.anuke.mindustry.world.modules.ItemModule;
|
||||
import io.anuke.ucore.core.Core;
|
||||
import io.anuke.ucore.core.Settings;
|
||||
import io.anuke.ucore.core.Timers;
|
||||
@@ -296,7 +296,7 @@ public class NetClient extends Module{
|
||||
if(tile != null && tile.entity != null){
|
||||
tile.entity.items.read(input);
|
||||
}else{
|
||||
new InventoryModule().read(input);
|
||||
new ItemModule().read(input);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ import io.anuke.mindustry.world.Tile;
|
||||
import io.anuke.mindustry.world.blocks.defense.Wall;
|
||||
import io.anuke.mindustry.world.consumers.Consume;
|
||||
import io.anuke.mindustry.world.modules.ConsumeModule;
|
||||
import io.anuke.mindustry.world.modules.InventoryModule;
|
||||
import io.anuke.mindustry.world.modules.ItemModule;
|
||||
import io.anuke.mindustry.world.modules.LiquidModule;
|
||||
import io.anuke.mindustry.world.modules.PowerModule;
|
||||
import io.anuke.ucore.core.Effects;
|
||||
@@ -47,7 +47,7 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
|
||||
public float timeScale = 1f, timeScaleDuration;
|
||||
|
||||
public PowerModule power;
|
||||
public InventoryModule items;
|
||||
public ItemModule items;
|
||||
public LiquidModule liquids;
|
||||
public ConsumeModule cons;
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ import io.anuke.mindustry.game.Team;
|
||||
import io.anuke.mindustry.world.blocks.BlockPart;
|
||||
import io.anuke.mindustry.world.blocks.Floor;
|
||||
import io.anuke.mindustry.world.modules.ConsumeModule;
|
||||
import io.anuke.mindustry.world.modules.InventoryModule;
|
||||
import io.anuke.mindustry.world.modules.ItemModule;
|
||||
import io.anuke.mindustry.world.modules.LiquidModule;
|
||||
import io.anuke.mindustry.world.modules.PowerModule;
|
||||
import io.anuke.ucore.entities.trait.PosTrait;
|
||||
@@ -423,7 +423,7 @@ public class Tile implements PosTrait, TargetTrait{
|
||||
if(block.hasEntity()){
|
||||
entity = block.newEntity().init(this, block.update);
|
||||
entity.cons = new ConsumeModule();
|
||||
if(block.hasItems) entity.items = new InventoryModule();
|
||||
if(block.hasItems) entity.items = new ItemModule();
|
||||
if(block.hasLiquids) entity.liquids = new LiquidModule();
|
||||
if(block.hasPower){
|
||||
entity.power = new PowerModule();
|
||||
|
||||
@@ -22,7 +22,7 @@ import io.anuke.mindustry.world.BarType;
|
||||
import io.anuke.mindustry.world.Block;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
import io.anuke.mindustry.world.meta.BlockBar;
|
||||
import io.anuke.mindustry.world.modules.InventoryModule;
|
||||
import io.anuke.mindustry.world.modules.ItemModule;
|
||||
import io.anuke.ucore.core.Effects;
|
||||
import io.anuke.ucore.core.Graphics;
|
||||
import io.anuke.ucore.graphics.Draw;
|
||||
@@ -246,7 +246,7 @@ public class BuildBlock extends Block{
|
||||
}
|
||||
}
|
||||
|
||||
private float checkRequired(InventoryModule inventory, float amount, boolean remove){
|
||||
private float checkRequired(ItemModule inventory, float amount, boolean remove){
|
||||
float maxProgress = amount;
|
||||
|
||||
for(int i = 0; i < recipe.requirements.length; i++){
|
||||
|
||||
@@ -19,7 +19,6 @@ import io.anuke.mindustry.graphics.Shaders;
|
||||
import io.anuke.mindustry.maps.TutorialSector;
|
||||
import io.anuke.mindustry.net.Net;
|
||||
import io.anuke.mindustry.type.Item;
|
||||
import io.anuke.mindustry.type.ItemType;
|
||||
import io.anuke.mindustry.world.BarType;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
import io.anuke.mindustry.world.meta.BlockFlag;
|
||||
@@ -163,25 +162,6 @@ public class CoreBlock extends StorageBlock{
|
||||
return entity.solid;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int acceptStack(Item item, int amount, Tile tile, Unit source){
|
||||
if(acceptItem(item, tile, tile) && hasItems && (source == null || source.getTeam() == tile.getTeam())){
|
||||
return Math.min(itemCapacity - tile.entity.items.get(item), amount);
|
||||
}else{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaximumAccepted(Tile tile, Item item){
|
||||
return itemCapacity;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean acceptItem(Item item, Tile tile, Tile source){
|
||||
return tile.entity.items.get(item) < itemCapacity && item.type == ItemType.material;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleItem(Item item, Tile tile, Tile source){
|
||||
if(Net.server() || !Net.active()) super.handleItem(item, tile, source);
|
||||
|
||||
@@ -1,10 +1,19 @@
|
||||
package io.anuke.mindustry.world.blocks.storage;
|
||||
|
||||
import com.badlogic.gdx.graphics.Color;
|
||||
import com.badlogic.gdx.utils.Array;
|
||||
import io.anuke.mindustry.entities.TileEntity;
|
||||
import io.anuke.mindustry.entities.Unit;
|
||||
import io.anuke.mindustry.graphics.Palette;
|
||||
import io.anuke.mindustry.graphics.Shaders;
|
||||
import io.anuke.mindustry.type.Item;
|
||||
import io.anuke.mindustry.world.Block;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
import io.anuke.ucore.core.Graphics;
|
||||
import io.anuke.ucore.graphics.Draw;
|
||||
import io.anuke.ucore.graphics.Fill;
|
||||
|
||||
import static io.anuke.mindustry.Vars.tilesize;
|
||||
|
||||
public abstract class StorageBlock extends Block{
|
||||
|
||||
@@ -37,6 +46,42 @@ public abstract class StorageBlock extends Block{
|
||||
entity.graph.remove(tile);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawSelect(Tile tile){
|
||||
|
||||
StorageEntity entity = tile.entity();
|
||||
|
||||
if(entity.graph.getTiles().size > 1){
|
||||
|
||||
Shaders.outline.color.set(Palette.accent);
|
||||
Graphics.beginShaders(Shaders.outline);
|
||||
|
||||
for(Tile other : entity.graph.getTiles()){
|
||||
Fill.square(other.drawx(), other.drawy(), other.block().size * tilesize);
|
||||
}
|
||||
|
||||
Draw.color(Color.CLEAR);
|
||||
Graphics.endShaders();
|
||||
Draw.color();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean acceptItem(Item item, Tile tile, Tile source){
|
||||
StorageEntity entity = tile.entity();
|
||||
return entity.graph.accept(item);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int acceptStack(Item item, int amount, Tile tile, Unit source){
|
||||
StorageEntity entity = tile.entity();
|
||||
if(acceptItem(item, tile, tile) && hasItems && (source == null || source.getTeam() == tile.getTeam())){
|
||||
return Math.min(entity.graph.accept(item, amount), amount);
|
||||
}else{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public TileEntity newEntity(){
|
||||
return new StorageEntity();
|
||||
@@ -47,7 +92,7 @@ public abstract class StorageBlock extends Block{
|
||||
Array<Object> arr = super.getDebugInfo(tile);
|
||||
|
||||
StorageEntity entity = tile.entity();
|
||||
arr.addAll("storage graph", entity.graph.getID());
|
||||
arr.addAll("storage graph", entity.graph.getID(), "graph capacity", entity.graph.getCapacity(), "graph tiles", entity.graph.getTiles().size);
|
||||
|
||||
return arr;
|
||||
}
|
||||
|
||||
@@ -3,21 +3,32 @@ package io.anuke.mindustry.world.blocks.storage;
|
||||
import com.badlogic.gdx.utils.IntSet;
|
||||
import com.badlogic.gdx.utils.ObjectSet;
|
||||
import com.badlogic.gdx.utils.Queue;
|
||||
import io.anuke.mindustry.type.Item;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
import io.anuke.mindustry.world.blocks.storage.StorageBlock.StorageEntity;
|
||||
import io.anuke.mindustry.world.modules.ItemModule;
|
||||
|
||||
public class StorageGraph{
|
||||
private static IntSet closedSet = new IntSet();
|
||||
private static Queue<Tile> queue = new Queue<>();
|
||||
private static int lastID;
|
||||
|
||||
private final int id = lastID++;
|
||||
private ObjectSet<Tile> tiles = new ObjectSet<>();
|
||||
private ItemModule items = new ItemModule();
|
||||
private int capacity;
|
||||
private int cores;
|
||||
private int id = lastID++;
|
||||
|
||||
public void add(Tile tile){
|
||||
if(tiles.add(tile) && tile.block() instanceof CoreBlock){
|
||||
cores ++;
|
||||
if(tiles.add(tile)){
|
||||
if(tile.block() instanceof CoreBlock) cores ++;
|
||||
capacity += tile.block().itemCapacity;
|
||||
|
||||
if(tile.entity.items != items){
|
||||
items.addAll(tile.entity.items);
|
||||
}
|
||||
|
||||
tile.entity.items = items;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,6 +38,7 @@ public class StorageGraph{
|
||||
}
|
||||
|
||||
cores = 0;
|
||||
capacity = 0;
|
||||
|
||||
for(Tile other : tile.entity.proximity()){
|
||||
if(other.block() instanceof StorageBlock && other.<StorageEntity>entity().graph == null){
|
||||
@@ -61,10 +73,24 @@ public class StorageGraph{
|
||||
for(Tile tile : other.tiles){
|
||||
StorageEntity e = tile.entity();
|
||||
e.graph = this;
|
||||
add(tile);
|
||||
}
|
||||
}
|
||||
|
||||
tiles.addAll(other.tiles);
|
||||
cores += other.cores;
|
||||
public boolean accept(Item item){
|
||||
return accept(item, 1) == 1;
|
||||
}
|
||||
|
||||
public int accept(Item item, int amount){
|
||||
if(hasCores()){
|
||||
return Math.min(capacity - items.get(item), amount);
|
||||
}else{
|
||||
return Math.min(capacity - items.total(), amount);
|
||||
}
|
||||
}
|
||||
|
||||
public ObjectSet<Tile> getTiles(){
|
||||
return tiles;
|
||||
}
|
||||
|
||||
public boolean hasCores(){
|
||||
@@ -74,4 +100,12 @@ public class StorageGraph{
|
||||
public int getID(){
|
||||
return id;
|
||||
}
|
||||
|
||||
public int getCapacity(){
|
||||
return capacity;
|
||||
}
|
||||
|
||||
public ItemModule items(){
|
||||
return items;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,85 +1,13 @@
|
||||
package io.anuke.mindustry.world.blocks.storage;
|
||||
|
||||
import com.badlogic.gdx.utils.Array;
|
||||
import io.anuke.mindustry.entities.TileEntity;
|
||||
import io.anuke.mindustry.type.Item;
|
||||
import io.anuke.mindustry.world.Edges;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
import io.anuke.ucore.core.Timers;
|
||||
import static io.anuke.mindustry.Vars.*;
|
||||
|
||||
public class Vault extends StorageBlock{
|
||||
|
||||
public Vault(String name){
|
||||
super(name);
|
||||
solid = true;
|
||||
update = true;
|
||||
update = false;
|
||||
destructible = true;
|
||||
itemCapacity = 1000;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(Tile tile){
|
||||
int iterations = Math.max(1, (int) (Timers.delta() + 0.4f));
|
||||
|
||||
for(int i = 0; i < iterations; i++){
|
||||
if(tile.entity.items.total() > 0){
|
||||
tryDump(tile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean acceptItem(Item item, Tile tile, Tile source){
|
||||
return tile.entity.items.total() < itemCapacity;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean tryDump(Tile tile, Item todump){
|
||||
TileEntity entity = tile.entity;
|
||||
if(entity == null || !hasItems || tile.entity.items.total() == 0 || (todump != null && !entity.items.has(todump)))
|
||||
return false;
|
||||
|
||||
Array<Tile> proximity = entity.proximity();
|
||||
int dump = tile.getDump();
|
||||
|
||||
if(proximity.size == 0) return false;
|
||||
|
||||
for(int i = 0; i < proximity.size; i++){
|
||||
Tile other = proximity.get((i + dump) % proximity.size);
|
||||
Tile in = Edges.getFacingEdge(tile, other);
|
||||
|
||||
if(other == null || !(other.block() instanceof StorageBlock)) continue;
|
||||
|
||||
if(!(other.block() instanceof Vault)){
|
||||
|
||||
for(int ii = 0; ii < content.items().size; ii++){
|
||||
Item item = content.item(ii);
|
||||
|
||||
if(entity.items.has(item) && other.block().acceptItem(item, other, in) && canDump(tile, other, item)){
|
||||
other.block().handleItem(item, other, in);
|
||||
tile.entity.items.remove(item, 1);
|
||||
incrementDump(tile, proximity.size);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}else{
|
||||
todump = content.item(0);
|
||||
|
||||
if(other.block().acceptItem(todump, other, in) && canDump(tile, other, todump)){
|
||||
other.block().handleItem(removeItem(tile, null), other, in);
|
||||
incrementDump(tile, proximity.size);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
incrementDump(tile, proximity.size);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canDump(Tile tile, Tile to, Item item){
|
||||
return !(to.block() instanceof Vault) || (float) to.entity.items.total() / to.block().itemCapacity < (float) tile.entity.items.total() / itemCapacity;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ import io.anuke.mindustry.world.meta.BlockBar;
|
||||
import io.anuke.mindustry.world.meta.BlockFlag;
|
||||
import io.anuke.mindustry.world.meta.BlockStat;
|
||||
import io.anuke.mindustry.world.meta.StatUnit;
|
||||
import io.anuke.mindustry.world.modules.InventoryModule;
|
||||
import io.anuke.mindustry.world.modules.ItemModule;
|
||||
import io.anuke.ucore.core.Effects;
|
||||
import io.anuke.ucore.core.Graphics;
|
||||
import io.anuke.ucore.graphics.Draw;
|
||||
@@ -211,7 +211,7 @@ public class UnitFactory extends Block{
|
||||
return new UnitFactoryEntity();
|
||||
}
|
||||
|
||||
protected boolean hasRequirements(InventoryModule inv, float fraction){
|
||||
protected boolean hasRequirements(ItemModule inv, float fraction){
|
||||
for(ItemStack stack : consumes.items()){
|
||||
if(!inv.has(stack.item, (int) (fraction * stack.amount))){
|
||||
return false;
|
||||
|
||||
@@ -7,9 +7,10 @@ import java.io.DataInput;
|
||||
import java.io.DataOutput;
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
|
||||
import static io.anuke.mindustry.Vars.content;
|
||||
|
||||
public class InventoryModule extends BlockModule{
|
||||
public class ItemModule extends BlockModule{
|
||||
private int[] items = new int[content.items().size];
|
||||
private int total;
|
||||
|
||||
@@ -85,6 +86,13 @@ public class InventoryModule extends BlockModule{
|
||||
total += amount;
|
||||
}
|
||||
|
||||
public void addAll(ItemModule items){
|
||||
for(int i = 0; i < items.items.length; i++){
|
||||
this.items[i] += items.items[i];
|
||||
total += items.items[i];
|
||||
}
|
||||
}
|
||||
|
||||
public void remove(Item item, int amount){
|
||||
amount = Math.min(amount, items[item.id]);
|
||||
|
||||
Reference in New Issue
Block a user