Completely borked liquid/power/inventory system

This commit is contained in:
Anuken
2018-03-07 22:54:12 -05:00
parent 1e456d6560
commit c611066791
59 changed files with 678 additions and 2108 deletions

View File

@@ -22,7 +22,7 @@ task deploy(type: Copy){
android { android {
buildToolsVersion '26.0.2' buildToolsVersion '26.0.2'
compileSdkVersion 26 compileSdkVersion 27
sourceSets { sourceSets {
main { main {
manifest.srcFile 'AndroidManifest.xml' manifest.srcFile 'AndroidManifest.xml'
@@ -51,7 +51,7 @@ android {
applicationId "io.anuke.mindustry" applicationId "io.anuke.mindustry"
minSdkVersion 9 minSdkVersion 9
targetSdkVersion 26 targetSdkVersion 27
versionCode code versionCode code
versionName "$versionNumber-$versionType-${props['build'].replace(" ", "-")}" versionName "$versionNumber-$versionType-${props['build'].replace(" ", "-")}"
} }

View File

@@ -177,48 +177,47 @@ placemode.touch.name=touch
placemode.cursor.name=cursor placemode.cursor.name=cursor
text.blocks.extrainfo=[accent]extra block info: text.blocks.extrainfo=[accent]extra block info:
text.blocks.blockinfo=Block Info text.blocks.blockinfo=Block Info
text.blocks.powercapacity=Power Capacity text.blocks.powercapacity=[powerinfo]Power Capacity
text.blocks.powershot=Power/shot text.blocks.powershot=[turretinfo]Power/shot
text.blocks.powersecond=Power/second text.blocks.powersecond=[powerinfo]Power/second
text.blocks.powerdraindamage=Power Drain/damage text.blocks.powerdraindamage=[powerinfo]Power Drain/damage
text.blocks.shieldradius=Shield Radius text.blocks.shieldradius=[powerinfo]Shield Radius
text.blocks.itemspeedsecond=Item Speed/second text.blocks.itemspeedsecond=[iteminfo]Item Speed/second
text.blocks.range=Range text.blocks.range=[turretinfo]Range
text.blocks.size=Size text.blocks.size=[gray]Size
text.blocks.powerliquid=Power/Liquid text.blocks.powerliquid=[powerinfo]Power/Liquid
text.blocks.maxliquidsecond=Max liquid/second text.blocks.maxliquidsecond=[liquidinfo]Max liquid/second
text.blocks.liquidcapacity=Liquid capacity text.blocks.liquidcapacity=[liquidinfo]Liquid capacity
text.blocks.liquidsecond=Liquid/second text.blocks.liquidsecond=[liquidinfo]Liquid/second
text.blocks.damageshot=Damage/shot text.blocks.damageshot=[turretinfo]Damage/shot
text.blocks.ammocapacity=Ammo Capacity text.blocks.ammocapacity=[turretinfo]Ammo Capacity
text.blocks.ammo=Ammo text.blocks.ammo=[turretinfo]Ammo
text.blocks.ammoitem=Ammo/item text.blocks.ammoitem=[turretinfo]Ammo/item
text.blocks.maxitemssecond=Max items/second text.blocks.maxitemssecond=[iteminfo]Max items/second
text.blocks.powerrange=Power range text.blocks.lasertilerange=[powerinfo]Laser tile range
text.blocks.lasertilerange=Laser tile range text.blocks.capacity=[iteminfo]Capacity
text.blocks.capacity=Capacity text.blocks.itemcapacity=[iteminfo]Item Capacity
text.blocks.itemcapacity=Item Capacity text.blocks.maxpowergenerationsecond=[powerinfo]Max Power Generation/second
text.blocks.maxpowergenerationsecond=Max Power Generation/second text.blocks.powergenerationsecond=[powerinfo]Power Generation/second
text.blocks.powergenerationsecond=Power Generation/second text.blocks.generationsecondsitem=[powerinfo]Generation Seconds/item
text.blocks.generationsecondsitem=Generation Seconds/item text.blocks.input=[liquidinfo]Input
text.blocks.input=Input text.blocks.inputliquid=[liquidinfo]Input Liquid
text.blocks.inputliquid=Input Liquid text.blocks.inputitem=[liquidinfo]Input Item
text.blocks.inputitem=Input Item text.blocks.output=[liquidinfo]Output
text.blocks.output=Output text.blocks.secondsitem=[liquidinfo]Seconds/item
text.blocks.secondsitem=Seconds/item text.blocks.maxpowertransfersecond=[powerinfo]Max power transfer/second
text.blocks.maxpowertransfersecond=Max power transfer/second text.blocks.explosive=[orange]Highly explosive!
text.blocks.explosive=Highly explosive! text.blocks.repairssecond=[turretinfo]Repaired/second
text.blocks.repairssecond=Repaired/second text.blocks.health=[healthstats]Health
text.blocks.health=Health text.blocks.inaccuracy=[turretinfo]Inaccuracy
text.blocks.inaccuracy=Inaccuracy text.blocks.shots=[turretinfo]Shots
text.blocks.shots=Shots text.blocks.shotssecond=[turretinfo]Shots/second
text.blocks.shotssecond=Shots/second text.blocks.fuel=[craftinfo]Fuel
text.blocks.fuel=Fuel text.blocks.fuelduration=[craftinfo]Fuel Duration
text.blocks.fuelduration=Fuel Duration text.blocks.maxoutputsecond=[craftinfo]Max output/second
text.blocks.maxoutputsecond=Max output/second text.blocks.inputcapacity=[craftinfo]Input capacity
text.blocks.inputcapacity=Input capacity text.blocks.outputcapacity=[craftinfo]Output capacity
text.blocks.outputcapacity=Output capacity text.blocks.poweritem=[powerinfo]Power/Item
text.blocks.poweritem=Power/Item
text.placemode=Place Mode text.placemode=Place Mode
text.breakmode=Break Mode text.breakmode=Break Mode
text.health=health text.health=health

View File

@@ -1,7 +1,7 @@
#Autogenerated file. Do not modify. #Autogenerated file. Do not modify.
#Mon Mar 05 23:28:13 EST 2018 #Wed Mar 07 22:53:33 EST 2018
version=release version=release
androidBuildCode=402 androidBuildCode=407
name=Mindustry name=Mindustry
code=3.4 code=3.4
build=custom build build=custom build

View File

@@ -16,7 +16,6 @@ import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.net.Net.SendMode; import io.anuke.mindustry.net.Net.SendMode;
import io.anuke.mindustry.net.NetworkIO; import io.anuke.mindustry.net.NetworkIO;
import io.anuke.mindustry.net.Packets.*; import io.anuke.mindustry.net.Packets.*;
import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Map; import io.anuke.mindustry.world.Map;
import io.anuke.mindustry.world.Placement; import io.anuke.mindustry.world.Placement;
@@ -253,39 +252,6 @@ public class NetClient extends Module {
Net.handleClient(FriendlyFireChangePacket.class, packet -> state.friendlyFire = packet.enabled); Net.handleClient(FriendlyFireChangePacket.class, packet -> state.friendlyFire = packet.enabled);
Net.handleClient(ItemTransferPacket.class, packet -> {
Runnable r = () -> {
Tile tile = world.tile(packet.position);
if (tile == null || tile.entity == null) return;
Tile next = tile.getNearby(packet.rotation);
tile.entity.items[packet.itemid] --;
next.block().handleItem(Item.getByID(packet.itemid), next, tile);
};
threads.run(r);
});
Net.handleClient(ItemSetPacket.class, packet -> {
Runnable r = () -> {
Tile tile = world.tile(packet.position);
if (tile == null || tile.entity == null) return;
tile.entity.items[packet.itemid] = packet.amount;
};
threads.run(r);
});
Net.handleClient(ItemOffloadPacket.class, packet -> {
Runnable r = () -> {
Tile tile = world.tile(packet.position);
if (tile == null || tile.entity == null) return;
Tile next = tile.getNearby(tile.getRotation());
next.block().handleItem(Item.getByID(packet.itemid), next, tile);
};
threads.run(r);
});
Net.handleClient(NetErrorPacket.class, packet -> { Net.handleClient(NetErrorPacket.class, packet -> {
ui.showError(packet.message); ui.showError(packet.message);
disconnectQuietly(); disconnectQuietly();

View File

@@ -3,10 +3,12 @@ package io.anuke.mindustry.entities;
import io.anuke.mindustry.graphics.Fx; import io.anuke.mindustry.graphics.Fx;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.net.NetEvents; import io.anuke.mindustry.net.NetEvents;
import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.Wall; import io.anuke.mindustry.world.blocks.types.Wall;
import io.anuke.mindustry.world.blocks.types.modules.InventoryModule;
import io.anuke.mindustry.world.blocks.types.modules.LiquidModule;
import io.anuke.mindustry.world.blocks.types.modules.PowerModule;
import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;
import io.anuke.ucore.entities.Entity; import io.anuke.ucore.entities.Entity;
@@ -22,11 +24,14 @@ import static io.anuke.mindustry.Vars.world;
public class TileEntity extends Entity{ public class TileEntity extends Entity{
public Tile tile; public Tile tile;
public int[] items = new int[Item.getAllItems().size];
public Timer timer; public Timer timer;
public float health; public float health;
public boolean dead = false; public boolean dead = false;
public boolean added; public boolean added;
public PowerModule power;
public InventoryModule inventory;
public LiquidModule liquid;
/**Sets this tile entity data to this tile, and adds it if necessary.*/ /**Sets this tile entity data to this tile, and adds it if necessary.*/
public TileEntity init(Tile tile, boolean added){ public TileEntity init(Tile tile, boolean added){
@@ -53,10 +58,6 @@ public class TileEntity extends Entity{
public void read(DataInputStream stream) throws IOException{ public void read(DataInputStream stream) throws IOException{
} }
public void readNetwork(DataInputStream stream, float elapsed) throws IOException{
read(stream);
}
public void onDeath(){ public void onDeath(){
onDeath(false); onDeath(false);
@@ -118,34 +119,6 @@ public class TileEntity extends Entity{
} }
} }
public int totalItems(){
int sum = 0;
for(int i = 0; i < items.length; i ++){
sum += items[i];
}
return sum;
}
public int getItem(Item item){
return items[item.id];
}
public boolean hasItem(Item item){
return getItem(item) > 0;
}
public boolean hasItem(Item item, int amount){
return getItem(item) >= amount;
}
public void addItem(Item item, int amount){
items[item.id] += amount;
}
public void removeItem(Item item, int amount){
items[item.id] -= amount;
}
@Override @Override
public TileEntity add(){ public TileEntity add(){
return add(tileGroup); return add(tileGroup);

View File

@@ -5,7 +5,6 @@ import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.graphics.Fx; import io.anuke.mindustry.graphics.Fx;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.PowerAcceptor;
import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects;
import io.anuke.ucore.entities.TimedEntity; import io.anuke.ucore.entities.TimedEntity;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
@@ -54,9 +53,8 @@ public class EMP extends TimedEntity{
Tile tile = array.get(i); Tile tile = array.get(i);
targets.add(tile); targets.add(tile);
if(tile != null && tile.block() instanceof PowerAcceptor){ if(tile != null && tile.block().hasPower){
PowerAcceptor p = (PowerAcceptor)tile.block(); tile.entity.power.amount = 0f;
p.setPower(tile, 0f);
tile.entity.damage((int)(damage*2f)); //extra damage tile.entity.damage((int)(damage*2f)); //extra damage
} }

View File

@@ -4,25 +4,17 @@ import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.Base64Coder; import com.badlogic.gdx.utils.Base64Coder;
import com.badlogic.gdx.utils.IntMap; import com.badlogic.gdx.utils.IntMap;
import io.anuke.mindustry.io.versions.Save12; import io.anuke.mindustry.io.versions.Save16;
import io.anuke.mindustry.io.versions.Save13;
import io.anuke.mindustry.io.versions.Save14;
import io.anuke.mindustry.io.versions.Save15;
import io.anuke.ucore.core.Settings; import io.anuke.ucore.core.Settings;
import java.io.*; import java.io.*;
import static io.anuke.mindustry.Vars.gwt; import static io.anuke.mindustry.Vars.*;
import static io.anuke.mindustry.Vars.logic;
import static io.anuke.mindustry.Vars.saveDirectory;
public class SaveIO{ public class SaveIO{
public static final IntMap<SaveFileVersion> versions = new IntMap<>(); public static final IntMap<SaveFileVersion> versions = new IntMap<>();
public static final Array<SaveFileVersion> versionArray = Array.with( public static final Array<SaveFileVersion> versionArray = Array.with(
new Save12(), new Save16()
new Save13(),
new Save14(),
new Save15()
); );
static{ static{

View File

@@ -1,287 +0,0 @@
package io.anuke.mindustry.io.versions;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.TimeUtils;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.entities.enemies.Enemy;
import io.anuke.mindustry.entities.enemies.EnemyType;
import io.anuke.mindustry.game.GameMode;
import io.anuke.mindustry.io.BlockLoader;
import io.anuke.mindustry.io.SaveFileVersion;
import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.resource.Upgrade;
import io.anuke.mindustry.resource.Weapon;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.Blocks;
import io.anuke.ucore.core.Core;
import io.anuke.ucore.entities.Entities;
import io.anuke.ucore.entities.EntityGroup.EntityContainer;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Arrays;
import static io.anuke.mindustry.Vars.*;
public class Save12 extends SaveFileVersion {
public Save12(){
super(12);
}
@Override
public void read(DataInputStream stream) throws IOException {
/*long loadTime = */stream.readLong();
//general state
byte mode = stream.readByte();
byte mapid = stream.readByte();
int wave = stream.readInt();
float wavetime = stream.readFloat();
float playerx = stream.readFloat();
float playery = stream.readFloat();
int playerhealth = stream.readInt();
Vars.player.x = playerx;
Vars.player.y = playery;
Vars.player.health = playerhealth;
state.mode = GameMode.values()[mode];
Core.camera.position.set(playerx, playery, 0);
//weapons
control.upgrades().getWeapons().clear();
control.upgrades().getWeapons().add(Weapon.blaster);
Vars.player.weaponLeft = Vars.player.weaponRight = Weapon.blaster;
int weapons = stream.readByte();
for(int i = 0; i < weapons; i ++){
control.upgrades().addWeapon((Weapon)Upgrade.getByID(stream.readByte()));
}
ui.hudfrag.updateWeapons();
//inventory
int totalItems = stream.readByte();
Arrays.fill(state.inventory.getItems(), 0);
for(int i = 0; i < totalItems; i ++){
Item item = Item.getByID(stream.readByte());
int amount = stream.readInt();
state.inventory.getItems()[item.id] = amount;
}
ui.hudfrag.updateItems();
//enemies
Entities.clear();
int enemies = stream.readInt();
Array<Enemy> enemiesToUpdate = new Array<>();
for(int i = 0; i < enemies; i ++){
byte type = stream.readByte();
int lane = stream.readByte();
float x = stream.readFloat();
float y = stream.readFloat();
byte tier = stream.readByte();
int health = stream.readInt();
try{
Enemy enemy = new Enemy(EnemyType.getByID(type));
enemy.lane = lane;
enemy.health = health;
enemy.x = x;
enemy.y = y;
enemy.tier = tier;
enemy.add(enemyGroup);
enemiesToUpdate.add(enemy);
}catch (Exception e){
throw new RuntimeException(e);
}
}
state.enemies = enemies;
state.wave = wave;
state.wavetime = wavetime;
if(!android)
Vars.player.add();
//map
int seed = stream.readInt();
int tiles = stream.readInt();
world.loadMap(world.maps().getMap(mapid), seed);
renderer.clearTiles();
for(Enemy enemy : enemiesToUpdate){
enemy.node = -2;
}
for(int x = 0; x < world.width(); x ++){
for(int y = 0; y < world.height(); y ++){
Tile tile = world.tile(x, y);
//remove breakables like rocks
if(tile.breakable()){
world.tile(x, y).setBlock(Blocks.air);
}
}
}
for(int i = 0; i < tiles; i ++){
int pos = stream.readInt();
byte link = stream.readByte();
boolean hasEntity = stream.readBoolean();
int blockid = stream.readInt();
Tile tile = world.tile(pos % world.width(), pos / world.width());
tile.setBlock(BlockLoader.getByOldID(blockid));
tile.link = link;
if(hasEntity){
byte rotation = stream.readByte();
int health = stream.readInt();
int items = stream.readByte();
tile.entity.health = health;
tile.setRotation(rotation);
for(int j = 0; j < items; j ++){
int itemid = stream.readByte();
int itemamount = stream.readInt();
tile.entity.items[itemid] = itemamount;
}
tile.entity.read(stream);
}
}
}
@Override
public void write(DataOutputStream stream) throws IOException {
//--META--
stream.writeInt(version); //version id
stream.writeLong(TimeUtils.millis()); //last saved
//--GENERAL STATE--
stream.writeByte(state.mode.ordinal()); //gamemode
stream.writeByte(world.getMap().id); //map ID
stream.writeInt(state.wave); //wave
stream.writeFloat(state.wavetime); //wave countdown
stream.writeFloat(Vars.player.x); //player x/y
stream.writeFloat(Vars.player.y);
stream.writeInt(Vars.player.health); //player health
stream.writeByte(control.upgrades().getWeapons().size - 1); //amount of weapons
//start at 1, because the first weapon is always the starter - ignore that
for(int i = 1; i < control.upgrades().getWeapons().size; i ++){
stream.writeByte(control.upgrades().getWeapons().get(i).id); //weapon ordinal
}
//--INVENTORY--
int l = state.inventory.getItems().length;
int itemsize = 0;
for(int i = 0; i < l; i ++){
if(state.inventory.getItems()[i] > 0){
itemsize ++;
}
}
stream.writeByte(itemsize); //amount of items
for(int i = 0; i < l; i ++){
if(state.inventory.getItems()[i] > 0){
stream.writeByte(i); //item ID
stream.writeInt(state.inventory.getItems()[i]); //item amount
}
}
//--ENEMIES--
EntityContainer<Enemy> enemies = enemyGroup.all();
stream.writeInt(enemies.size()); //enemy amount
for(int i = 0; i < enemies.size(); i ++){
Enemy enemy = enemies.get(i);
stream.writeByte(enemy.type.id); //type
stream.writeByte(enemy.lane); //lane
stream.writeFloat(enemy.x); //x
stream.writeFloat(enemy.y); //y
stream.writeByte(enemy.tier); //tier
stream.writeInt(enemy.health); //health
}
//--MAP DATA--
//seed
stream.writeInt(world.getSeed());
int totalblocks = 0;
for(int x = 0; x < world.width(); x ++){
for(int y = 0; y < world.height(); y ++){
Tile tile = world.tile(x, y);
if(tile.breakable()){
totalblocks ++;
}
}
}
//tile amount
stream.writeInt(totalblocks);
for(int x = 0; x < world.width(); x ++){
for(int y = 0; y < world.height(); y ++){
Tile tile = world.tile(x, y);
if(tile.breakable()){
stream.writeInt(x + y*world.width()); //tile pos
stream.writeByte(tile.link);
stream.writeBoolean(tile.entity != null); //whether it has a tile entity
stream.writeInt(tile.block().id); //block ID
if(tile.entity != null){
stream.writeByte(tile.getRotation()); //rotation
stream.writeInt((int)tile.entity.health); //health
int amount = 0;
for(int i = 0; i < tile.entity.items.length; i ++){
if(tile.entity.items[i] > 0) amount ++;
}
stream.writeByte(amount); //amount of items
for(int i = 0; i < tile.entity.items.length; i ++){
if(tile.entity.items[i] > 0){
stream.writeByte(i); //item ID
stream.writeInt(tile.entity.items[i]); //item amount
}
}
tile.entity.write(stream);
}
}
}
}
}
}

View File

@@ -1,320 +0,0 @@
package io.anuke.mindustry.io.versions;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.TimeUtils;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.entities.enemies.Enemy;
import io.anuke.mindustry.entities.enemies.EnemyType;
import io.anuke.mindustry.game.GameMode;
import io.anuke.mindustry.io.BlockLoader;
import io.anuke.mindustry.io.SaveFileVersion;
import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.resource.Upgrade;
import io.anuke.mindustry.resource.Weapon;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.WorldGenerator;
import io.anuke.mindustry.world.blocks.Blocks;
import io.anuke.mindustry.world.blocks.types.BlockPart;
import io.anuke.mindustry.world.blocks.types.Rock;
import io.anuke.ucore.core.Core;
import io.anuke.ucore.entities.Entities;
import io.anuke.ucore.entities.EntityGroup.EntityContainer;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Arrays;
import static io.anuke.mindustry.Vars.*;
public class Save13 extends SaveFileVersion {
public Save13(){
super(13);
}
@Override
public void read(DataInputStream stream) throws IOException {
/*long loadTime = */stream.readLong();
//general state
byte mode = stream.readByte();
byte mapid = stream.readByte();
int wave = stream.readInt();
float wavetime = stream.readFloat();
float playerx = stream.readFloat();
float playery = stream.readFloat();
int playerhealth = stream.readInt();
Vars.player.x = playerx;
Vars.player.y = playery;
Vars.player.health = playerhealth;
state.mode = GameMode.values()[mode];
Core.camera.position.set(playerx, playery, 0);
//weapons
control.upgrades().getWeapons().clear();
control.upgrades().getWeapons().add(Weapon.blaster);
Vars.player.weaponLeft = Vars.player.weaponRight = Weapon.blaster;
int weapons = stream.readByte();
for(int i = 0; i < weapons; i ++){
control.upgrades().addWeapon((Weapon) Upgrade.getByID(stream.readByte()));
}
ui.hudfrag.updateWeapons();
//inventory
int totalItems = stream.readByte();
Arrays.fill(state.inventory.getItems(), 0);
for(int i = 0; i < totalItems; i ++){
Item item = Item.getByID(stream.readByte());
int amount = stream.readInt();
state.inventory.getItems()[item.id] = amount;
}
ui.hudfrag.updateItems();
//enemies
Entities.clear();
int enemies = stream.readInt();
Array<Enemy> enemiesToUpdate = new Array<>();
for(int i = 0; i < enemies; i ++){
byte type = stream.readByte();
int lane = stream.readByte();
float x = stream.readFloat();
float y = stream.readFloat();
byte tier = stream.readByte();
int health = stream.readShort();
try{
Enemy enemy = new Enemy(EnemyType.getByID(type));
enemy.lane = lane;
enemy.health = health;
enemy.x = x;
enemy.y = y;
enemy.tier = tier;
enemy.add(enemyGroup);
enemiesToUpdate.add(enemy);
}catch (Exception e){
throw new RuntimeException(e);
}
}
state.enemies = enemies;
state.wave = wave;
state.wavetime = wavetime;
if(!android)
Vars.player.add();
//map
int seed = stream.readInt();
world.loadMap(world.maps().getMap(mapid), seed);
renderer.clearTiles();
for(Enemy enemy : enemiesToUpdate){
enemy.node = -2;
}
int rocks = stream.readInt();
for(int x = 0; x < world.width(); x ++){
for(int y = 0; y < world.height(); y ++){
Tile tile = world.tile(x, y);
//remove breakables like rocks
if(tile.breakable()){
world.tile(x, y).setBlock(Blocks.air);
}
}
}
for(int i = 0; i < rocks; i ++){
int pos = stream.readInt();
Tile tile = world.tile(pos % world.width(), pos / world.width());
Block result = WorldGenerator.rocks.get(tile.floor());
if(result != null) tile.setBlock(result);
}
int tiles = stream.readInt();
for(int i = 0; i < tiles; i ++){
int pos = stream.readInt();
int blockid = stream.readInt();
Tile tile = world.tile(pos % world.width(), pos / world.width());
tile.setBlock(BlockLoader.getByOldID(blockid));
if(blockid == Blocks.blockpart.id){
tile.link = stream.readByte();
}
if(tile.entity != null){
byte rotation = stream.readByte();
short health = stream.readShort();
int items = stream.readByte();
tile.entity.health = health;
tile.setRotation(rotation);
for(int j = 0; j < items; j ++){
int itemid = stream.readByte();
int itemamount = stream.readInt();
tile.entity.items[itemid] = itemamount;
}
tile.entity.read(stream);
}
}
}
@Override
public void write(DataOutputStream stream) throws IOException {
//--META--
stream.writeInt(version); //version id
stream.writeLong(TimeUtils.millis()); //last saved
//--GENERAL STATE--
stream.writeByte(state.mode.ordinal()); //gamemode
stream.writeByte(world.getMap().id); //map ID
stream.writeInt(state.wave); //wave
stream.writeFloat(state.wavetime); //wave countdown
stream.writeFloat(Vars.player.x); //player x/y
stream.writeFloat(Vars.player.y);
stream.writeInt(Vars.player.health); //player health
stream.writeByte(control.upgrades().getWeapons().size - 1); //amount of weapons
//start at 1, because the first weapon is always the starter - ignore that
for(int i = 1; i < control.upgrades().getWeapons().size; i ++){
stream.writeByte(control.upgrades().getWeapons().get(i).id); //weapon ordinal
}
//--INVENTORY--
int l = state.inventory.getItems().length;
int itemsize = 0;
for(int i = 0; i < l; i ++){
if(state.inventory.getItems()[i] > 0){
itemsize ++;
}
}
stream.writeByte(itemsize); //amount of items
for(int i = 0; i < l; i ++){
if(state.inventory.getItems()[i] > 0){
stream.writeByte(i); //item ID
stream.writeInt(state.inventory.getItems()[i]); //item amount
}
}
//--ENEMIES--
EntityContainer<Enemy> enemies = enemyGroup.all();
stream.writeInt(enemies.size()); //enemy amount
for(int i = 0; i < enemies.size(); i ++){
Enemy enemy = enemies.get(i);
stream.writeByte(enemy.type.id); //type
stream.writeByte(enemy.lane); //lane
stream.writeFloat(enemy.x); //x
stream.writeFloat(enemy.y); //y
stream.writeByte(enemy.tier); //tier
stream.writeShort(enemy.health); //health
}
//--MAP DATA--
//seed
stream.writeInt(world.getSeed());
int totalblocks = 0;
int totalrocks = 0;
for(int x = 0; x < world.width(); x ++){
for(int y = 0; y < world.height(); y ++){
Tile tile = world.tile(x, y);
if(tile.breakable()){
if(tile.block() instanceof Rock){
totalrocks ++;
}else{
totalblocks ++;
}
}
}
}
//amount of rocks
stream.writeInt(totalrocks);
//write all rocks
for(int x = 0; x < world.width(); x ++) {
for (int y = 0; y < world.height(); y++) {
Tile tile = world.tile(x, y);
if (tile.block() instanceof Rock) {
stream.writeInt(tile.packedPosition());
}
}
}
//write all blocks
stream.writeInt(totalblocks);
for(int x = 0; x < world.width(); x ++){
for(int y = 0; y < world.height(); y ++){
Tile tile = world.tile(x, y);
if(tile.breakable() && !(tile.block() instanceof Rock)){
stream.writeInt(x + y*world.width()); //tile pos
stream.writeInt(tile.block().id); //block ID
if(tile.block() instanceof BlockPart) stream.writeByte(tile.link);
if(tile.entity != null){
stream.writeByte(tile.getRotation()); //rotation
stream.writeShort((short)tile.entity.health); //health
byte amount = 0;
for(int i = 0; i < tile.entity.items.length; i ++){
if(tile.entity.items[i] > 0) amount ++;
}
stream.writeByte(amount); //amount of items
for(int i = 0; i < tile.entity.items.length; i ++){
if(tile.entity.items[i] > 0){
stream.writeByte(i); //item ID
stream.writeInt(tile.entity.items[i]); //item amount
}
}
tile.entity.write(stream);
}
}
}
}
}
}

View File

@@ -1,345 +0,0 @@
package io.anuke.mindustry.io.versions;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.IntMap;
import com.badlogic.gdx.utils.TimeUtils;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.entities.enemies.Enemy;
import io.anuke.mindustry.entities.enemies.EnemyType;
import io.anuke.mindustry.game.GameMode;
import io.anuke.mindustry.io.SaveFileVersion;
import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.resource.Upgrade;
import io.anuke.mindustry.resource.Weapon;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.WorldGenerator;
import io.anuke.mindustry.world.blocks.Blocks;
import io.anuke.mindustry.world.blocks.types.BlockPart;
import io.anuke.mindustry.world.blocks.types.Rock;
import io.anuke.ucore.core.Core;
import io.anuke.ucore.entities.Entities;
import io.anuke.ucore.entities.EntityGroup.EntityContainer;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Arrays;
import static io.anuke.mindustry.Vars.*;
public class Save14 extends SaveFileVersion{
public Save14(){
super(14);
}
@Override
public void read(DataInputStream stream) throws IOException {
/*long loadTime = */
stream.readLong();
//general state
byte mode = stream.readByte();
byte mapid = stream.readByte();
int wave = stream.readInt();
float wavetime = stream.readFloat();
//block header
int blocksize = stream.readInt();
IntMap<Block> map = new IntMap<>();
for(int i = 0; i < blocksize; i ++){
String name = readString(stream);
int id = stream.readShort();
map.put(id, Block.getByName(name));
}
float playerx = stream.readFloat();
float playery = stream.readFloat();
int playerhealth = stream.readInt();
Vars.player.x = playerx;
Vars.player.y = playery;
Vars.player.health = playerhealth;
state.mode = GameMode.values()[mode];
Core.camera.position.set(playerx, playery, 0);
//weapons
control.upgrades().getWeapons().clear();
control.upgrades().getWeapons().add(Weapon.blaster);
Vars.player.weaponLeft = Vars.player.weaponRight = Weapon.blaster;
int weapons = stream.readByte();
for(int i = 0; i < weapons; i ++){
control.upgrades().addWeapon((Weapon) Upgrade.getByID(stream.readByte()));
}
ui.hudfrag.updateWeapons();
//inventory
int totalItems = stream.readByte();
Arrays.fill(state.inventory.getItems(), 0);
for(int i = 0; i < totalItems; i ++){
Item item = Item.getByID(stream.readByte());
int amount = stream.readInt();
state.inventory.getItems()[item.id] = amount;
}
ui.hudfrag.updateItems();
//enemies
Entities.clear();
int enemies = stream.readInt();
Array<Enemy> enemiesToUpdate = new Array<>();
for(int i = 0; i < enemies; i ++){
byte type = stream.readByte();
int lane = stream.readByte();
float x = stream.readFloat();
float y = stream.readFloat();
byte tier = stream.readByte();
int health = stream.readShort();
try{
Enemy enemy = new Enemy(EnemyType.getByID(type));
enemy.lane = lane;
enemy.health = health;
enemy.x = x;
enemy.y = y;
enemy.tier = tier;
enemy.add(enemyGroup);
enemiesToUpdate.add(enemy);
}catch (Exception e){
throw new RuntimeException(e);
}
}
state.enemies = enemies;
state.wave = wave;
state.wavetime = wavetime;
if(!android)
Vars.player.add();
//map
int seed = stream.readInt();
world.loadMap(world.maps().getMap(mapid), seed);
renderer.clearTiles();
for(Enemy enemy : enemiesToUpdate){
enemy.node = -2;
}
int rocks = stream.readInt();
for(int x = 0; x < world.width(); x ++){
for(int y = 0; y < world.height(); y ++){
Tile tile = world.tile(x, y);
//remove breakables like rocks
if(tile.breakable()){
world.tile(x, y).setBlock(Blocks.air);
}
}
}
for(int i = 0; i < rocks; i ++){
int pos = stream.readInt();
Tile tile = world.tile(pos % world.width(), pos / world.width());
if(tile == null) continue;
Block result = WorldGenerator.rocks.get(tile.floor());
if(result != null) tile.setBlock(result);
}
int tiles = stream.readInt();
for(int i = 0; i < tiles; i ++){
int pos = stream.readInt();
int blockid = stream.readInt();
Tile tile = world.tile(pos % world.width(), pos / world.width());
tile.setBlock(map.get(blockid));
if(blockid == Blocks.blockpart.id){
tile.link = stream.readByte();
}
if(tile.entity != null){
byte rotation = stream.readByte();
short health = stream.readShort();
int items = stream.readByte();
tile.entity.health = health;
tile.setRotation(rotation);
for(int j = 0; j < items; j ++){
int itemid = stream.readByte();
int itemamount = stream.readInt();
tile.entity.items[itemid] = itemamount;
}
tile.entity.read(stream);
}
}
}
@Override
public void write(DataOutputStream stream) throws IOException {
//--META--
stream.writeInt(version); //version id
stream.writeLong(TimeUtils.millis()); //last saved
//--GENERAL STATE--
stream.writeByte(state.mode.ordinal()); //gamemode
stream.writeByte(world.getMap().id); //map ID
stream.writeInt(state.wave); //wave
stream.writeFloat(state.wavetime); //wave countdown
//--BLOCK HEADER--
stream.writeInt(Block.getAllBlocks().size);
for(int i = 0; i < Block.getAllBlocks().size; i ++){
Block block = Block.getAllBlocks().get(i);
writeString(stream, block.name);
stream.writeShort(block.id);
}
stream.writeFloat(Vars.player.x); //player x/y
stream.writeFloat(Vars.player.y);
stream.writeInt(Vars.player.health); //player health
stream.writeByte(control.upgrades().getWeapons().size - 1); //amount of weapons
//start at 1, because the first weapon is always the starter - ignore that
for(int i = 1; i < control.upgrades().getWeapons().size; i ++){
stream.writeByte(control.upgrades().getWeapons().get(i).id); //weapon ordinal
}
//--INVENTORY--
int l = state.inventory.getItems().length;
int itemsize = 0;
for(int i = 0; i < l; i ++){
if(state.inventory.getItems()[i] > 0){
itemsize ++;
}
}
stream.writeByte(itemsize); //amount of items
for(int i = 0; i < l; i ++){
if(state.inventory.getItems()[i] > 0){
stream.writeByte(i); //item ID
stream.writeInt(state.inventory.getItems()[i]); //item amount
}
}
//--ENEMIES--
EntityContainer<Enemy> enemies = enemyGroup.all();
stream.writeInt(enemies.size()); //enemy amount
for(int i = 0; i < enemies.size(); i ++){
Enemy enemy = enemies.get(i);
stream.writeByte(enemy.type.id); //type
stream.writeByte(enemy.lane); //lane
stream.writeFloat(enemy.x); //x
stream.writeFloat(enemy.y); //y
stream.writeByte(enemy.tier); //tier
stream.writeShort(enemy.health); //health
}
//--MAP DATA--
//seed
stream.writeInt(world.getSeed());
int totalblocks = 0;
int totalrocks = 0;
for(int x = 0; x < world.width(); x ++){
for(int y = 0; y < world.height(); y ++){
Tile tile = world.tile(x, y);
if(tile.breakable()){
if(tile.block() instanceof Rock){
totalrocks ++;
}else{
totalblocks ++;
}
}
}
}
//amount of rocks
stream.writeInt(totalrocks);
//write all rocks
for(int x = 0; x < world.width(); x ++) {
for (int y = 0; y < world.height(); y++) {
Tile tile = world.tile(x, y);
if (tile.block() instanceof Rock) {
stream.writeInt(tile.packedPosition());
}
}
}
//write all blocks
stream.writeInt(totalblocks);
for(int x = 0; x < world.width(); x ++){
for(int y = 0; y < world.height(); y ++){
Tile tile = world.tile(x, y);
if(tile.breakable() && !(tile.block() instanceof Rock)){
stream.writeInt(x + y*world.width()); //tile pos
stream.writeInt(tile.block().id); //block ID
if(tile.block() instanceof BlockPart) stream.writeByte(tile.link);
if(tile.entity != null){
stream.writeByte(tile.getRotation()); //rotation
stream.writeShort((short)tile.entity.health); //health
byte amount = 0;
for(int i = 0; i < tile.entity.items.length; i ++){
if(tile.entity.items[i] > 0) amount ++;
}
stream.writeByte(amount); //amount of items
for(int i = 0; i < tile.entity.items.length; i ++){
if(tile.entity.items[i] > 0){
stream.writeByte(i); //item ID
stream.writeInt(tile.entity.items[i]); //item amount
}
}
tile.entity.write(stream);
}
}
}
}
}
}

View File

@@ -28,10 +28,10 @@ import java.util.Arrays;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
public class Save15 extends SaveFileVersion { public class Save16 extends SaveFileVersion {
public Save15(){ public Save16(){
super(15); super(16);
} }
public SaveMeta getData(DataInputStream stream) throws IOException{ public SaveMeta getData(DataInputStream stream) throws IOException{
@@ -205,11 +205,9 @@ public class Save15 extends SaveFileVersion {
tile.entity.health = health; tile.entity.health = health;
tile.setRotation(rotation); tile.setRotation(rotation);
for(int j = 0; j < items; j ++){ if(tile.entity.inventory != null) tile.entity.inventory.read(stream);
int itemid = stream.readByte(); if(tile.entity.power != null) tile.entity.power.read(stream);
int itemamount = stream.readInt(); if(tile.entity.liquid != null) tile.entity.liquid.read(stream);
tile.entity.items[itemid] = itemamount;
}
tile.entity.read(stream); tile.entity.read(stream);
} }
@@ -348,18 +346,10 @@ public class Save15 extends SaveFileVersion {
if(tile.entity != null){ if(tile.entity != null){
stream.writeByte(tile.getRotation()); //rotation stream.writeByte(tile.getRotation()); //rotation
stream.writeShort((short)tile.entity.health); //health stream.writeShort((short)tile.entity.health); //health
byte amount = 0;
for(int i = 0; i < tile.entity.items.length; i ++){
if(tile.entity.items[i] > 0) amount ++;
}
stream.writeByte(amount); //amount of items
for(int i = 0; i < tile.entity.items.length; i ++){ if(tile.entity.inventory != null) tile.entity.inventory.write(stream);
if(tile.entity.items[i] > 0){ if(tile.entity.power != null) tile.entity.power.write(stream);
stream.writeByte(i); //item ID if(tile.entity.liquid != null) tile.entity.liquid.write(stream);
stream.writeInt(tile.entity.items[i]); //item amount
}
}
tile.entity.write(stream); tile.entity.write(stream);
} }

View File

@@ -7,7 +7,6 @@ import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.enemies.Enemy; import io.anuke.mindustry.entities.enemies.Enemy;
import io.anuke.mindustry.net.Net.SendMode; import io.anuke.mindustry.net.Net.SendMode;
import io.anuke.mindustry.net.Packets.*; import io.anuke.mindustry.net.Packets.*;
import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.resource.Weapon; import io.anuke.mindustry.resource.Weapon;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
@@ -128,29 +127,6 @@ public class NetEvents {
Net.send(packet, SendMode.tcp); Net.send(packet, SendMode.tcp);
} }
public static void handleTransfer(Tile tile, byte rotation, Item item){
ItemTransferPacket packet = new ItemTransferPacket();
packet.position = tile.packedPosition();
packet.rotation = rotation;
packet.itemid = (byte)item.id;
Net.send(packet, SendMode.udp);
}
public static void handleItemSet(Tile tile, Item item, byte amount){
ItemSetPacket packet = new ItemSetPacket();
packet.position = tile.packedPosition();
packet.itemid = (byte)item.id;
packet.amount = amount;
Net.send(packet, SendMode.udp);
}
public static void handleOffload(Tile tile, Item item){
ItemOffloadPacket packet = new ItemOffloadPacket();
packet.position = tile.packedPosition();
packet.itemid = (byte)item.id;
Net.send(packet, SendMode.udp);
}
public static void handleAdminSet(Player player, boolean admin){ public static void handleAdminSet(Player player, boolean admin){
PlayerAdminPacket packet = new PlayerAdminPacket(); PlayerAdminPacket packet = new PlayerAdminPacket();
packet.admin = admin; packet.admin = admin;

View File

@@ -191,10 +191,9 @@ public class NetworkIO {
stream.writeByte(tile.getExtra()); stream.writeByte(tile.getExtra());
stream.writeShort((short)tile.entity.health); //health stream.writeShort((short)tile.entity.health); //health
//items if(tile.entity.inventory != null) tile.entity.inventory.write(stream);
for(int i = 0; i < tile.entity.items.length; i ++){ if(tile.entity.power != null) tile.entity.power.write(stream);
stream.writeInt(tile.entity.items[i]); if(tile.entity.liquid != null) tile.entity.liquid.write(stream);
}
//timer data //timer data
@@ -326,9 +325,9 @@ public class NetworkIO {
tile.entity.health = health; tile.entity.health = health;
for(int j = 0; j < tile.entity.items.length; j ++){ if(tile.entity.inventory != null) tile.entity.inventory.read(stream);
tile.entity.items[j] = stream.readInt(); if(tile.entity.power != null) tile.entity.power.read(stream);
} if(tile.entity.liquid != null) tile.entity.liquid.read(stream);
byte timers = stream.readByte(); byte timers = stream.readByte();
for(int time = 0; time < timers; time ++){ for(int time = 0; time < timers; time ++){

View File

@@ -504,62 +504,6 @@ public class Packets {
public void read(ByteBuffer buffer) { } public void read(ByteBuffer buffer) { }
} }
public static class ItemTransferPacket implements Packet, UnimportantPacket{
public int position;
public byte rotation;
public byte itemid;
@Override
public void write(ByteBuffer buffer) {
buffer.putInt((rotation) | (position << 2));
buffer.put(itemid);
}
@Override
public void read(ByteBuffer buffer) {
int i = buffer.getInt();
rotation = (byte)(i & 0x3);
position = i >> 2;
itemid = buffer.get();
}
}
public static class ItemSetPacket implements Packet, UnimportantPacket{
public int position;
public byte itemid, amount;
@Override
public void write(ByteBuffer buffer) {
buffer.putInt(position);
buffer.put(itemid);
buffer.put(amount);
}
@Override
public void read(ByteBuffer buffer) {
position = buffer.getInt();
itemid = buffer.get();
amount = buffer.get();
}
}
public static class ItemOffloadPacket implements Packet{
public int position;
public byte itemid;
@Override
public void write(ByteBuffer buffer) {
buffer.putInt(position);
buffer.put(itemid);
}
@Override
public void read(ByteBuffer buffer) {
position = buffer.getInt();
itemid = buffer.get();
}
}
public static class NetErrorPacket implements Packet{ public static class NetErrorPacket implements Packet{
public String message; public String message;

View File

@@ -38,9 +38,6 @@ public class Registrator {
CustomMapPacket.class, CustomMapPacket.class,
MapAckPacket.class, MapAckPacket.class,
EntitySpawnPacket.class, EntitySpawnPacket.class,
ItemTransferPacket.class,
ItemSetPacket.class,
ItemOffloadPacket.class,
NetErrorPacket.class, NetErrorPacket.class,
PlayerAdminPacket.class, PlayerAdminPacket.class,
AdministerRequestPacket.class, AdministerRequestPacket.class,

View File

@@ -10,6 +10,7 @@ public class Liquid {
public static final Liquid public static final Liquid
none = new Liquid("none", Color.CLEAR),
water = new Liquid("water", Color.ROYAL), water = new Liquid("water", Color.ROYAL),
plasma = new Liquid("plasma", Color.CORAL){ plasma = new Liquid("plasma", Color.CORAL){
{ {

View File

@@ -9,6 +9,7 @@ import io.anuke.mindustry.input.InputHandler;
import io.anuke.mindustry.resource.*; import io.anuke.mindustry.resource.*;
import io.anuke.mindustry.ui.dialogs.FloatingDialog; import io.anuke.mindustry.ui.dialogs.FloatingDialog;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.types.BlockStats;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Hue; import io.anuke.ucore.graphics.Hue;
import io.anuke.ucore.scene.Element; import io.anuke.ucore.scene.Element;
@@ -29,7 +30,6 @@ import static io.anuke.mindustry.Vars.*;
public class BlocksFragment implements Fragment{ public class BlocksFragment implements Fragment{
private Table desctable, itemtable, blocks, weapons; private Table desctable, itemtable, blocks, weapons;
private Stack stack = new Stack(); private Stack stack = new Stack();
private Array<String> statlist = new Array<>();
private boolean shown = true; private boolean shown = true;
private Recipe hoveredDescriptionRecipe; private Recipe hoveredDescriptionRecipe;
@@ -293,8 +293,12 @@ public class BlocksFragment implements Fragment{
} }
public void showBlockInfo(Block block){ public void showBlockInfo(Block block){
statlist.clear(); Array<String> statlist = new Array<String>();
block.getStats(statlist); BlockStats stats = block.stats;
for(String s : stats.getMap().orderedKeys()){
statlist.add(Bundles.get("text.blocks." + s) + ": []" + stats.getMap().get(s));
}
Label desclabel = new Label(block.fullDescription); Label desclabel = new Label(block.fullDescription);
desclabel.setWrap(true); desclabel.setWrap(true);
@@ -324,12 +328,6 @@ public class BlocksFragment implements Fragment{
} }
for(String s : statlist){ for(String s : statlist){
if(s.contains(":")) {
String color = s.substring(0, s.indexOf("]")+1);
String first = s.substring(color.length(), s.indexOf(":")).replace("/", "").replace(" ", "").toLowerCase();
String last = s.substring(s.indexOf(":"), s.length());
s = color + Bundles.get("text.blocks." + first) + last;
}
table.add(s).left(); table.add(s).left();
table.row(); table.row();
} }

View File

@@ -2,7 +2,6 @@ package io.anuke.mindustry.world;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.math.GridPoint2;
import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.ObjectMap; import com.badlogic.gdx.utils.ObjectMap;
@@ -12,9 +11,10 @@ import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.graphics.Fx; import io.anuke.mindustry.graphics.Fx;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.net.NetEvents; import io.anuke.mindustry.net.NetEvents;
import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.resource.ItemStack; import io.anuke.mindustry.resource.ItemStack;
import io.anuke.mindustry.resource.Liquid; import io.anuke.mindustry.resource.Liquid;
import io.anuke.mindustry.world.blocks.BaseBlock;
import io.anuke.mindustry.world.blocks.types.BlockStats;
import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Effects.Effect;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
@@ -22,9 +22,10 @@ import io.anuke.ucore.scene.ui.layout.Table;
import io.anuke.ucore.util.Bundles; import io.anuke.ucore.util.Bundles;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.state;
import static io.anuke.mindustry.Vars.tilesize;
public class Block{ public class Block extends BaseBlock {
private static int lastid; private static int lastid;
private static Array<Block> blocks = new Array<>(); private static Array<Block> blocks = new Array<>();
private static ObjectMap<String, Block> map = new ObjectMap<>(); private static ObjectMap<String, Block> map = new ObjectMap<>();
@@ -93,6 +94,8 @@ public class Block{
/**whether this block has instant transfer checking. used for calculations to prevent infinite loops.*/ /**whether this block has instant transfer checking. used for calculations to prevent infinite loops.*/
public boolean instantTransfer = false; public boolean instantTransfer = false;
public BlockStats stats = new BlockStats();
public Block(String name) { public Block(String name) {
this.name = name; this.name = name;
this.formalName = Bundles.get("block." + name + ".name", name); this.formalName = Bundles.get("block." + name + ".name", name);
@@ -116,7 +119,11 @@ public class Block{
public void drawSelect(Tile tile){} public void drawSelect(Tile tile){}
public void drawPlace(int x, int y, int rotation, boolean valid){} public void drawPlace(int x, int y, int rotation, boolean valid){}
public void placed(Tile tile){} public void placed(Tile tile){}
public void init(){} /**Called after all blocks are created.*/
public void init(){
setStats();
setBars();
}
public void tapped(Tile tile){} public void tapped(Tile tile){}
public void buildTable(Tile tile, Table table) {} public void buildTable(Tile tile, Table table) {}
@@ -130,9 +137,20 @@ public class Block{
return false; return false;
} }
public void getStats(Array<String> list){ public void setStats(){
list.add("[gray]size: " + size); stats.add("size", size);
list.add("[healthstats]health: " + health); stats.add("health", health);
if(hasPower) stats.add("powercapacity", powerCapacity);
if(hasLiquids) stats.add("liquidcapacity", liquidCapacity);
if(hasInventory) stats.add("capacity", itemCapacity);
}
//TODO make this easier to config.
public void setBars(){
if(hasPower) bars.add(new BlockBar(Color.YELLOW, true, tile -> tile.entity.power.amount / powerCapacity));
if(hasLiquids) bars.add(new BlockBar(Color.ROYAL, true, tile -> tile.entity.liquid.amount / liquidCapacity));
if(hasInventory) bars.add(new BlockBar(Color.GREEN, true, tile -> (float)tile.entity.inventory.totalItems() / itemCapacity));
} }
public String name(){ public String name(){
@@ -150,16 +168,6 @@ public class Block{
public int handleDamage(Tile tile, int amount){ public int handleDamage(Tile tile, int amount){
return amount; return amount;
} }
public void handleItem(Item item, Tile tile, Tile source){
if(tile.entity == null) return;
tile.entity.addItem(item, 1);
}
public boolean acceptItem(Item item, Tile tile, Tile source){
return false;
}
public void update(Tile tile){} public void update(Tile tile){}
@@ -185,82 +193,6 @@ public class Block{
public TileEntity getEntity(){ public TileEntity getEntity(){
return new TileEntity(); return new TileEntity();
} }
public boolean syncEntity(){
return true;
}
/**
* Tries to put this item into a nearby container, if there are no available
* containers, it gets added to the block's inventory.*/
public void offloadNear(Tile tile, Item item){
GridPoint2[] nearby = Edges.getEdges(size);
for(int j = 0; j < nearby.length; j ++){
Tile other = tile.getNearby(nearby[j]);
Tile in = tile.getNearby(Edges.getInsideEdges(size)[j]);
if(other != null && other.block().acceptItem(item, other, in) && canDump(tile, other, item)){
other.block().handleItem(item, other, in);
return;
}
}
handleItem(item, tile, tile);
}
/**Try dumping any item near the tile.*/
protected boolean tryDump(Tile tile){
return tryDump(tile, null);
}
/**Try dumping a specific item near the tile.*/
protected boolean tryDump(Tile tile, Item todump){
GridPoint2[] nearby = Edges.getEdges(size);
byte i = (byte)(tile.getDump() % nearby.length);
for(int j = 0; j < nearby.length; j ++){
Tile other;
Tile in;
for(Item item : Item.getAllItems()){
other = tile.getNearby(nearby[i]);
in = tile.getNearby(Edges.getInsideEdges(size)[i]);
if(todump != null && item != todump) continue;
if(tile.entity.hasItem(item) && other != null && other.block().acceptItem(item, other, in) && canDump(tile, other, item)){
other.block().handleItem(item, other, in);
tile.entity.removeItem(item, 1);
i = (byte)((i + 1) % nearby.length);
tile.setDump(i);
return true;
}
}
i = (byte)((i + 1) % nearby.length);
tile.setDump(i);
}
return false;
}
/**Used for dumping items.*/
public boolean canDump(Tile tile, Tile to, Item item){
return true;
}
/**
* Try offloading an item to a nearby container in its facing direction. Returns true if success.
*/
protected boolean offloadDir(Tile tile, Item item){
Tile other = tile.getNearby(tile.getRotation());
if(other != null && other.block().acceptItem(item, other, tile)){
other.block().handleItem(item, other, tile);
return true;
}
return false;
}
public void draw(Tile tile){ public void draw(Tile tile){
//note: multiblocks do not support rotation //note: multiblocks do not support rotation
@@ -318,7 +250,7 @@ public class Block{
"entity.x", tile.entity.x, "entity.x", tile.entity.x,
"entity.y", tile.entity.y, "entity.y", tile.entity.y,
"entity.id", tile.entity.id, "entity.id", tile.entity.id,
"entity.items.total", tile.entity.totalItems() "entity.items.total", tile.entity.inventory.totalItems()
); );
} }

View File

@@ -0,0 +1,149 @@
package io.anuke.mindustry.world.blocks;
import com.badlogic.gdx.math.GridPoint2;
import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.resource.Liquid;
import io.anuke.mindustry.world.Edges;
import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.util.Mathf;
public abstract class BaseBlock {
public boolean hasLiquids;
public boolean hasInventory;
public boolean hasPower;
public int itemCapacity;
public float liquidCapacity;
public float liquidFlowFactor = 4.9f;
public float powerCapacity;
public void handleItem(Item item, Tile tile, Tile source){
tile.entity.inventory.addItem(item, 1);
}
public boolean acceptItem(Item item, Tile tile, Tile source){
return false;
}
public boolean acceptLiquid(Tile tile, Tile source, Liquid liquid, float amount){
return tile.entity.liquid.amount + amount < liquidCapacity
&& (tile.entity.liquid.liquid == liquid || tile.entity.liquid.amount <= 0.01f);
}
public void handleLiquid(Tile tile, Tile source, Liquid liquid, float amount){
tile.entity.liquid.liquid = liquid;
tile.entity.liquid.amount += amount;
}
public boolean acceptPower(Tile tile, Tile source, float amount){
return amount + tile.entity.power.amount <= powerCapacity;
}
public float addPower(Tile tile, float amount){
float canAccept = Math.min(powerCapacity - tile.entity.power.amount, amount);
tile.entity.power.amount += canAccept;
return canAccept;
}
public void tryDumpLiquid(Tile tile){
if(tile.entity.liquid.amount > 0.01f){
tryMoveLiquid(tile, tile.getNearby(tile.getDump()));
tile.setDump((byte) Mathf.mod(tile.getDump() + 1, 4));
}
}
public void tryMoveLiquid(Tile tile, Tile next){
if(next != null && next.block().hasLiquids && tile.entity.liquid.amount > 0.01f){
float flow = Math.min(next.block().liquidCapacity - next.entity.liquid.amount - 0.001f,
Math.min(tile.entity.liquid.amount/liquidFlowFactor * Math.max(Timers.delta(), 1f), tile.entity.liquid.amount));
if(flow <= 0f || tile.entity.liquid.amount < flow) return;
if(next.block().acceptLiquid(next, tile, tile.entity.liquid.liquid, flow)){
next.block().handleLiquid(next, tile, tile.entity.liquid.liquid, flow);
tile.entity.liquid.amount -= flow;
}
}
}
/**
* Tries to put this item into a nearby container, if there are no available
* containers, it gets added to the block's inventory.*/
public void offloadNear(Tile tile, Item item){
int size = tile.block().size;
GridPoint2[] nearby = Edges.getEdges(size);
for(int j = 0; j < nearby.length; j ++){
Tile other = tile.getNearby(nearby[j]);
Tile in = tile.getNearby(Edges.getInsideEdges(size)[j]);
if(other != null && other.block().acceptItem(item, other, in) && canDump(tile, other, item)){
other.block().handleItem(item, other, in);
return;
}
}
handleItem(item, tile, tile);
}
/**Try dumping any item near the tile.*/
public boolean tryDump(Tile tile){
return tryDump(tile, null);
}
/**Try dumping a specific item near the tile.*/
public boolean tryDump(Tile tile, Item todump){
int size = tile.block().size;
GridPoint2[] nearby = Edges.getEdges(size);
byte i = (byte)(tile.getDump() % nearby.length);
for(int j = 0; j < nearby.length; j ++){
Tile other;
Tile in;
for(Item item : Item.getAllItems()){
other = tile.getNearby(nearby[i]);
in = tile.getNearby(Edges.getInsideEdges(size)[i]);
if(todump != null && item != todump) continue;
if(tile.entity.inventory.hasItem(item) && other != null && other.block().acceptItem(item, other, in) && canDump(tile, other, item)){
other.block().handleItem(item, other, in);
tile.entity.inventory.removeItem(item, 1);
i = (byte)((i + 1) % nearby.length);
tile.setDump(i);
return true;
}
}
i = (byte)((i + 1) % nearby.length);
tile.setDump(i);
}
return false;
}
/**Used for dumping items.*/
public boolean canDump(Tile tile, Tile to, Item item){
return true;
}
/**
* Try offloading an item to a nearby container in its facing direction. Returns true if success.
*/
public boolean offloadDir(Tile tile, Item item){
Tile other = tile.getNearby(tile.getRotation());
if(other != null && other.block().acceptItem(item, other, tile)){
other.block().handleItem(item, other, tile);
return true;
}
return false;
}
}

View File

@@ -20,15 +20,10 @@ public class DebugBlocks {
laserDirections = 4; laserDirections = 4;
} }
@Override
public boolean acceptsPower(Tile tile) {
return false;
}
@Override @Override
public void update(Tile tile){ public void update(Tile tile){
super.update(tile); super.update(tile);
tile.<GeneratorEntity>entity().power = powerCapacity; tile.entity.power.amount = powerCapacity;
} }
}; };
} }

View File

@@ -15,7 +15,7 @@ public class DistributionBlocks{
pulseconduit = new Conduit("pulseconduit"){{ pulseconduit = new Conduit("pulseconduit"){{
liquidCapacity = 16f; liquidCapacity = 16f;
flowfactor = 4.9f; liquidFlowFactor = 4.9f;
health = 65; health = 65;
}}, }},
@@ -42,7 +42,7 @@ public class DistributionBlocks{
multiplexer = new Router("multiplexer"){{ multiplexer = new Router("multiplexer"){{
size = 2; size = 2;
capacity = 80; itemCapacity = 80;
}}, }},
vault = new Vault("vault"){{ vault = new Vault("vault"){{
@@ -63,9 +63,6 @@ public class DistributionBlocks{
}}, }},
liquidjunction = new LiquidJunction("liquidjunction"){{ liquidjunction = new LiquidJunction("liquidjunction"){{
}},
powerbooster = new PowerBooster("powerbooster"){{
powerRange = 4;
}}, }},
powerlaser = new PowerLaser("powerlaser"){{ powerlaser = new PowerLaser("powerlaser"){{
}}, }},

View File

@@ -0,0 +1,10 @@
package io.anuke.mindustry.world.blocks.types;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
public abstract class BlockModule {
public abstract void write(DataOutputStream stream) throws IOException;
public abstract void read(DataInputStream stream) throws IOException;
}

View File

@@ -8,7 +8,7 @@ import io.anuke.mindustry.world.Tile;
/**Used for multiblocks. Each block that is not the center of the multiblock is a blockpart. /**Used for multiblocks. Each block that is not the center of the multiblock is a blockpart.
* Think of these as delegates to the actual block; all events are passed to the target block. * Think of these as delegates to the actual block; all events are passed to the target block.
* They are made to share all properties from the linked tile/block.*/ * They are made to share all properties from the linked tile/block.*/
public class BlockPart extends Block implements PowerAcceptor, LiquidAcceptor{ public class BlockPart extends Block{
public BlockPart() { public BlockPart() {
super("blockpart"); super("blockpart");
@@ -40,56 +40,35 @@ public class BlockPart extends Block implements PowerAcceptor, LiquidAcceptor{
@Override @Override
public boolean acceptLiquid(Tile tile, Tile source, Liquid liquid, float amount){ public boolean acceptLiquid(Tile tile, Tile source, Liquid liquid, float amount){
Block block = linked(tile); Block block = linked(tile);
return block instanceof LiquidAcceptor return block.hasLiquids
&& ((LiquidAcceptor)block).acceptLiquid(tile.getLinked(), source, liquid, amount); && block.acceptLiquid(tile.getLinked(), source, liquid, amount);
} }
@Override @Override
public void handleLiquid(Tile tile, Tile source, Liquid liquid, float amount){ public void handleLiquid(Tile tile, Tile source, Liquid liquid, float amount){
Block block = linked(tile); Block block = linked(tile);
((LiquidAcceptor)block).handleLiquid(tile.getLinked(), source, liquid, amount); block.handleLiquid(tile.getLinked(), source, liquid, amount);
}
@Override
public float getLiquid(Tile tile){
Block block = linked(tile);
return block instanceof LiquidAcceptor ? ((LiquidAcceptor)block).getLiquid(tile.getLinked()) : 0;
}
@Override
public float getLiquidCapacity(Tile tile){
Block block = linked(tile);
return block instanceof LiquidAcceptor ? ((LiquidAcceptor)block).getLiquidCapacity(tile.getLinked()) : 0;
} }
@Override @Override
public float addPower(Tile tile, float amount){ public float addPower(Tile tile, float amount){
Block block = linked(tile); Block block = linked(tile);
if(block instanceof PowerAcceptor){ if(block.hasPower){
return ((PowerAcceptor)block).addPower(tile.getLinked(), amount); return block.addPower(tile.getLinked(), amount);
}else{ }else{
return amount; return amount;
} }
} }
@Override @Override
public boolean acceptsPower(Tile tile){ public boolean acceptPower(Tile tile, Tile from, float amount){
Block block = linked(tile); Block block = linked(tile);
if(block instanceof PowerAcceptor){ if(block.hasPower){
return ((PowerAcceptor)block).acceptsPower(tile.getLinked()); return block.acceptPower(tile.getLinked(), from, amount);
}else{ }else{
return false; return false;
} }
} }
@Override
public void setPower(Tile tile, float power){
Block block = linked(tile);
if(block instanceof PowerAcceptor){
((PowerAcceptor)block).setPower(tile.getLinked(), power);
}
}
private Block linked(Tile tile){ private Block linked(Tile tile){
return tile.getLinked().block(); return tile.getLinked().block();

View File

@@ -0,0 +1,23 @@
package io.anuke.mindustry.world.blocks.types;
import com.badlogic.gdx.utils.OrderedMap;
import io.anuke.ucore.util.Bundles;
public class BlockStats {
private OrderedMap<String, Object> map = new OrderedMap<>();
public void add(String label, Object value){
if(!Bundles.has("text.blocks." + label)) throw new RuntimeException("No bundle entry for description label \"" + label + "\"!");
if(map.containsKey(label)) throw new RuntimeException("Duplicate label entry: \"" +label + "\"");
map.put(label, value);
}
public void remove(String label){
Object o = map.remove(label) != null;
if(o == null) throw new RuntimeException("No label entry found with name \"" + label + "\"!");
}
public OrderedMap<String, Object> getMap() {
return map;
}
}

View File

@@ -1,12 +0,0 @@
package io.anuke.mindustry.world.blocks.types;
import io.anuke.mindustry.resource.Liquid;
import io.anuke.mindustry.world.Tile;
public interface LiquidAcceptor{
public boolean acceptLiquid(Tile tile, Tile source, Liquid liquid, float amount);
public void handleLiquid(Tile tile, Tile source, Liquid liquid, float amount);
public float getLiquid(Tile tile);
public float getLiquidCapacity(Tile tile);
}

View File

@@ -1,136 +1,39 @@
package io.anuke.mindustry.world.blocks.types; package io.anuke.mindustry.world.blocks.types;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.resource.Liquid;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Timers; import io.anuke.mindustry.world.blocks.types.modules.LiquidModule;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Mathf;
import java.io.DataInputStream; public class LiquidBlock extends Block{
import java.io.DataOutputStream;
import java.io.IOException;
public class LiquidBlock extends Block implements LiquidAcceptor{
protected final int timerFlow = timers++; protected final int timerFlow = timers++;
protected float liquidCapacity = 10f;
protected float flowfactor = 4.9f;
public LiquidBlock(String name) { public LiquidBlock(String name) {
super(name); super(name);
rotate = true; rotate = true;
update = true; update = true;
} }
@Override
public void getStats(Array<String> list){
super.getStats(list);
list.add("[liquidinfo]Liquid Capacity: " + liquidCapacity);
}
@Override @Override
public void draw(Tile tile){ public void draw(Tile tile){
LiquidEntity entity = tile.entity(); LiquidModule mod = tile.entity.liquid;
Draw.rect(name() + "bottom", tile.worldx(), tile.worldy(), tile.getRotation() * 90); Draw.rect(name() + "bottom", tile.worldx(), tile.worldy(), tile.getRotation() * 90);
if(entity.liquid != null && entity.liquidAmount > 0.01f){ if(mod.amount > 0.01f){
Draw.color(entity.liquid.color); Draw.color(mod.liquid.color);
Draw.alpha(entity.liquidAmount / liquidCapacity); Draw.alpha(mod.amount / liquidCapacity);
Draw.rect("conduitliquid", tile.worldx(), tile.worldy(), tile.getRotation() * 90); Draw.rect("conduitliquid", tile.worldx(), tile.worldy(), tile.getRotation() * 90);
Draw.color(); Draw.color();
} }
Draw.rect(name() + "top", tile.worldx(), tile.worldy(), tile.getRotation() * 90); Draw.rect(name() + "top", tile.worldx(), tile.worldy(), tile.getRotation() * 90);
}
@Override
public TileEntity getEntity(){
return new LiquidEntity();
} }
@Override @Override
public void update(Tile tile){ public void update(Tile tile){
LiquidEntity entity = tile.entity(); if(tile.entity.liquid.amount > 0.01f && tile.entity.timer.get(timerFlow, 1)){
if(entity.liquidAmount > 0.01f && entity.timer.get(timerFlow, 1)){
tryMoveLiquid(tile, tile.getNearby(tile.getRotation())); tryMoveLiquid(tile, tile.getNearby(tile.getRotation()));
} }
} }
public void tryDumpLiquid(Tile tile){
LiquidEntity entity = tile.entity();
if(entity.liquidAmount > 0.01f){
tryMoveLiquid(tile, tile.getNearby(tile.getDump()));
tile.setDump((byte)Mathf.mod(tile.getDump() + 1, 4));
}
}
public void tryMoveLiquid(Tile tile, Tile next){
LiquidEntity entity = tile.entity();
Liquid liquid = entity.liquid;
if(next != null && next.block() instanceof LiquidAcceptor && entity.liquidAmount > 0.01f){
LiquidAcceptor other = (LiquidAcceptor)next.block();
float flow = Math.min(other.getLiquidCapacity(next) - other.getLiquid(next) - 0.001f,
Math.min(entity.liquidAmount/flowfactor * Math.max(Timers.delta(), 1f), entity.liquidAmount));
if(flow <= 0f || entity.liquidAmount < flow) return;
if(other.acceptLiquid(next, tile, liquid, flow)){
other.handleLiquid(next, tile, liquid, flow);
entity.liquidAmount -= flow;
}
}
}
@Override
public boolean acceptLiquid(Tile tile, Tile source, Liquid liquid, float amount){
LiquidEntity entity = tile.entity();
return entity.liquidAmount + amount < liquidCapacity && (entity.liquid == liquid || entity.liquidAmount <= 0.01f);
}
@Override
public void handleLiquid(Tile tile, Tile source, Liquid liquid, float amount){
LiquidEntity entity = tile.entity();
entity.liquid = liquid;
entity.liquidAmount += amount;
}
@Override
public float getLiquid(Tile tile){
LiquidEntity entity = tile.entity();
return entity.liquidAmount;
}
@Override
public float getLiquidCapacity(Tile tile){
return liquidCapacity;
}
public static class LiquidEntity extends TileEntity{
public Liquid liquid;
public float liquidAmount;
@Override
public void write(DataOutputStream stream) throws IOException{
stream.writeByte(liquid == null ? -1 : liquid.id);
stream.writeByte((byte)(liquidAmount));
}
@Override
public void read(DataInputStream stream) throws IOException{
byte id = stream.readByte();
liquid = id == -1 ? null : Liquid.getByID(id);
liquidAmount = stream.readByte();
}
}
} }

View File

@@ -1,15 +0,0 @@
package io.anuke.mindustry.world.blocks.types;
import io.anuke.mindustry.world.Tile;
public interface PowerAcceptor{
/**Attempts to add some power to this block; returns the amount of power <i>not</i> accepted.
* To add no power, you would return amount.*/
public float addPower(Tile tile, float amount);
/**Whether this block accepts power at all.*/
public boolean acceptsPower(Tile tile);
/**Sets the power on this block. This can be negative!*/
public void setPower(Tile tile, float power);
}

View File

@@ -1,17 +1,9 @@
package io.anuke.mindustry.world.blocks.types; package io.anuke.mindustry.world.blocks.types;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.BlockBar;
import io.anuke.mindustry.world.Tile;
import java.io.DataInputStream; public abstract class PowerBlock extends Block{
import java.io.DataOutputStream;
import java.io.IOException;
public abstract class PowerBlock extends Block implements PowerAcceptor{
public float powerCapacity = 10f; public float powerCapacity = 10f;
public float voltage = 0.001f; public float voltage = 0.001f;
@@ -19,41 +11,6 @@ public abstract class PowerBlock extends Block implements PowerAcceptor{
super(name); super(name);
update = true; update = true;
solid = true; solid = true;
bars.add(new BlockBar(Color.YELLOW, true, tile -> tile.<PowerEntity>entity().power / powerCapacity));
}
@Override
public void getStats(Array<String> list){
super.getStats(list);
list.add("[powerinfo]Power Capacity: " + powerCapacity);
}
@Override
public boolean acceptsPower(Tile tile){
PowerEntity entity = tile.entity();
return entity.power + 0.001f <= powerCapacity;
}
@Override
public float addPower(Tile tile, float amount){
if(amount < voltage){
return amount;
}
PowerEntity entity = tile.entity();
float canAccept = Math.min(powerCapacity - entity.power, amount);
entity.power += canAccept;
return canAccept;
}
@Override
public void setPower(Tile tile, float power){
PowerEntity entity = tile.entity();
entity.power = power;
} }
@Override @Override
@@ -62,17 +19,6 @@ public abstract class PowerBlock extends Block implements PowerAcceptor{
} }
public static class PowerEntity extends TileEntity{ public static class PowerEntity extends TileEntity{
public float power;
public float time; //generator time. this is a bit of a hack public float time; //generator time. this is a bit of a hack
@Override
public void write(DataOutputStream stream) throws IOException{
stream.writeFloat(power);
}
@Override
public void read(DataInputStream stream) throws IOException{
power = stream.readFloat();
}
} }
} }

View File

@@ -1,15 +1,9 @@
package io.anuke.mindustry.world.blocks.types.defense; package io.anuke.mindustry.world.blocks.types.defense;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.resource.Liquid; import io.anuke.mindustry.resource.Liquid;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.LiquidAcceptor;
import java.io.DataInputStream; public abstract class LiquidTurret extends Turret{
import java.io.DataOutputStream;
import java.io.IOException;
public abstract class LiquidTurret extends Turret implements LiquidAcceptor{
public Liquid ammoLiquid = Liquid.water; public Liquid ammoLiquid = Liquid.water;
public float liquidCapacity = 60f; public float liquidCapacity = 60f;
public float liquidPerShot = 1f; public float liquidPerShot = 1f;
@@ -20,62 +14,20 @@ public abstract class LiquidTurret extends Turret implements LiquidAcceptor{
@Override @Override
public boolean hasAmmo(Tile tile){ public boolean hasAmmo(Tile tile){
LiquidTurretEntity entity = tile.entity(); TurretEntity entity = tile.entity();
return entity.liquidAmount > liquidPerShot; return entity.liquid.amount > liquidPerShot;
} }
@Override @Override
public void consumeAmmo(Tile tile){ public void consumeAmmo(Tile tile){
LiquidTurretEntity entity = tile.entity(); TurretEntity entity = tile.entity();
entity.liquidAmount -= liquidPerShot; entity.liquid.amount -= liquidPerShot;
} }
@Override @Override
public boolean acceptLiquid(Tile tile, Tile source, Liquid liquid, float amount){ public boolean acceptLiquid(Tile tile, Tile source, Liquid liquid, float amount){
LiquidTurretEntity entity = tile.entity(); return ammoLiquid == liquid && super.acceptLiquid(tile, source, liquid, amount);
return ammoLiquid == liquid && entity.liquidAmount + amount < liquidCapacity && (entity.liquid == liquid || entity.liquidAmount <= 0.01f);
} }
@Override
public void handleLiquid(Tile tile, Tile source, Liquid liquid, float amount){
LiquidTurretEntity entity = tile.entity();
entity.liquid = liquid;
entity.liquidAmount += amount;
}
@Override
public float getLiquid(Tile tile){
LiquidTurretEntity entity = tile.entity();
return entity.liquidAmount;
}
@Override
public float getLiquidCapacity(Tile tile){
return liquidCapacity;
}
@Override
public TileEntity getEntity() {
return new LiquidTurretEntity();
}
static class LiquidTurretEntity extends TurretEntity{
public Liquid liquid;
public float liquidAmount;
@Override
public void write(DataOutputStream stream) throws IOException {
super.write(stream);
stream.writeByte(liquid == null ? -1 : liquid.id);
stream.writeByte((byte)(liquidAmount));
}
@Override
public void read(DataInputStream stream) throws IOException{
super.read(stream);
byte id = stream.readByte();
liquid = id == -1 ? null : Liquid.getByID(id);
liquidAmount = stream.readByte();
}
}
} }

View File

@@ -1,36 +1,25 @@
package io.anuke.mindustry.world.blocks.types.defense; package io.anuke.mindustry.world.blocks.types.defense;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.resource.Item; import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.world.BlockBar;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.PowerAcceptor;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Lines; import io.anuke.ucore.graphics.Lines;
import io.anuke.ucore.util.Strings; import io.anuke.ucore.util.Strings;
import java.io.DataInputStream; public abstract class PowerTurret extends Turret{
import java.io.DataOutputStream;
import java.io.IOException;
public abstract class PowerTurret extends Turret implements PowerAcceptor{
public float powerCapacity = 20f;
public float powerUsed = 0.5f; public float powerUsed = 0.5f;
public PowerTurret(String name) { public PowerTurret(String name) {
super(name); super(name);
ammo = null; ammo = null;
hasPower = true;
bars.set(1, new BlockBar(Color.YELLOW, true, tile -> tile.<PowerTurretEntity>entity().power / powerCapacity));
} }
@Override @Override
public void getStats(Array<String> list){ public void setStats(){
super.getStats(list); super.setStats();
list.add("[powerinfo]Power Capacity: " + (int)powerCapacity); stats.add("powershot", Strings.toFixed(powerUsed, 1));
list.add("[powerinfo]Power/shot: " + Strings.toFixed(powerUsed, 1));
} }
@Override @Override
@@ -42,61 +31,16 @@ public abstract class PowerTurret extends Turret implements PowerAcceptor{
@Override @Override
public boolean hasAmmo(Tile tile){ public boolean hasAmmo(Tile tile){
PowerTurretEntity entity = tile.entity(); return tile.entity.power.amount >= powerUsed;
return entity.power >= powerUsed;
} }
@Override @Override
public void consumeAmmo(Tile tile){ public void consumeAmmo(Tile tile){
PowerTurretEntity entity = tile.entity(); tile.entity.power.amount -= powerUsed;
entity.power -= powerUsed;
} }
@Override @Override
public boolean acceptItem(Item item, Tile tile, Tile source){ public boolean acceptItem(Item item, Tile tile, Tile source){
return false; return false;
} }
@Override
public boolean acceptsPower(Tile tile){
PowerTurretEntity entity = tile.entity();
return entity.power + 0.001f <= powerCapacity;
}
@Override
public float addPower(Tile tile, float amount){
PowerTurretEntity entity = tile.entity();
float canAccept = Math.min(powerCapacity - entity.power, amount);
entity.power += canAccept;
return canAccept;
}
@Override
public void setPower(Tile tile, float power){
PowerTurretEntity entity = tile.entity();
entity.power = power;
}
@Override
public TileEntity getEntity(){
return new PowerTurretEntity();
}
public static class PowerTurretEntity extends TurretEntity{
public float power;
@Override
public void write(DataOutputStream stream) throws IOException{
stream.writeFloat(power);
}
@Override
public void read(DataInputStream stream) throws IOException{
power = stream.readFloat();
}
}
} }

View File

@@ -2,7 +2,6 @@ package io.anuke.mindustry.world.blocks.types.defense;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.world.Layer; import io.anuke.mindustry.world.Layer;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
@@ -26,19 +25,18 @@ public class RepairTurret extends PowerTurret{
} }
@Override @Override
public void getStats(Array<String> list){ public void setStats(){
list.add("[health]health: " + health); super.setStats();
list.add("[powerinfo]Power Capacity: " + (int)powerCapacity);
list.add("[powerinfo]Power/shot: " + Strings.toFixed(powerUsed, 1)); //TODO remove extra crap
list.add("[turretinfo]Range: " + (int)range); stats.add("repairssecond", Strings.toFixed(60f/reload * repairFrac * 100, 1) + "%");
list.add("[turretinfo]Repairs/Second: " + Strings.toFixed(60f/reload * repairFrac * 100, 1) + "%");
} }
@Override @Override
public void update(Tile tile){ public void update(Tile tile){
PowerTurretEntity entity = tile.entity(); TurretEntity entity = tile.entity();
if(entity.power < powerUsed){ if(entity.power.amount < powerUsed){
return; return;
} }
@@ -66,7 +64,7 @@ public class RepairTurret extends PowerTurret{
if(entity.blockTarget.health > maxhealth) if(entity.blockTarget.health > maxhealth)
entity.blockTarget.health = maxhealth; entity.blockTarget.health = maxhealth;
entity.power -= powerUsed; entity.power.amount -= powerUsed;
} }
} }
} }
@@ -80,10 +78,10 @@ public class RepairTurret extends PowerTurret{
@Override @Override
public void drawLayer2(Tile tile){ public void drawLayer2(Tile tile){
PowerTurretEntity entity = tile.entity(); TurretEntity entity = tile.entity();
TileEntity target = entity.blockTarget; TileEntity target = entity.blockTarget;
if(entity.power >= powerUsed && target != null && Angles.angleDist(entity.angleTo(target), entity.rotation) < 10){ if(entity.power.amount >= powerUsed && target != null && Angles.angleDist(entity.angleTo(target), entity.rotation) < 10){
Tile targetTile = target.tile; Tile targetTile = target.tile;
float len = 4f; float len = 4f;

View File

@@ -1,6 +1,5 @@
package io.anuke.mindustry.world.blocks.types.defense; package io.anuke.mindustry.world.blocks.types.defense;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.Vars; import io.anuke.mindustry.Vars;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.effect.Shield; import io.anuke.mindustry.entities.effect.Shield;
@@ -30,11 +29,11 @@ public class ShieldBlock extends PowerBlock{
} }
@Override @Override
public void getStats(Array<String> list){ public void setStats(){
super.getStats(list); super.setStats();
list.add("[powerinfo]Power/second: " + Strings.toFixed(powerDrain*60, 2)); stats.add("powersecond", Strings.toFixed(powerDrain*60, 2));
list.add("[powerinfo]Power Drain/damage: " + Strings.toFixed(powerPerDamage, 2)); stats.add("powerdraindamage", Strings.toFixed(powerPerDamage, 2));
list.add("[powerinfo]Shield Radius: " + (int)shieldRadius); stats.add("shieldradius", (int)shieldRadius);
} }
@Override @Override
@@ -47,19 +46,19 @@ public class ShieldBlock extends PowerBlock{
entity.shield.add(); entity.shield.add();
} }
if(entity.power > powerPerDamage){ if(entity.power.amount > powerPerDamage){
if(!entity.shield.active){ if(!entity.shield.active){
entity.shield.add(); entity.shield.add();
} }
entity.power -= powerDrain * Timers.delta(); entity.power.amount -= powerDrain * Timers.delta();
}else{ }else{
if(entity.shield.active && !(Vars.infiniteAmmo && Vars.debug)){ if(entity.shield.active && !(Vars.infiniteAmmo && Vars.debug)){
entity.shield.removeDelay(); entity.shield.removeDelay();
} }
} }
entity.shield.radius = Mathf.lerp(entity.shield.radius, Math.min(entity.power / powerCapacity * radiusScale, maxRadius), Timers.delta() * 0.05f); entity.shield.radius = Mathf.lerp(entity.shield.radius, Math.min(entity.power.amount / powerCapacity * radiusScale, maxRadius), Timers.delta() * 0.05f);
} }
@@ -71,7 +70,7 @@ public class ShieldBlock extends PowerBlock{
public void handleBullet(Tile tile, BulletEntity bullet){ public void handleBullet(Tile tile, BulletEntity bullet){
ShieldEntity entity = tile.entity(); ShieldEntity entity = tile.entity();
if(entity.power < bullet.getDamage() * powerPerDamage){ if(entity.power.amount < bullet.getDamage() * powerPerDamage){
return; return;
} }
@@ -79,7 +78,7 @@ public class ShieldBlock extends PowerBlock{
Effects.effect(bullet.damage > 5 ? Fx.shieldhit : Fx.laserhit, bullet); Effects.effect(bullet.damage > 5 ? Fx.shieldhit : Fx.laserhit, bullet);
if(!headless) renderer.addShieldHit(bullet.x, bullet.y); if(!headless) renderer.addShieldHit(bullet.x, bullet.y);
entity.power -= bullet.getDamage() * powerPerDamage; entity.power.amount -= bullet.getDamage() * powerPerDamage;
} }
static class ShieldEntity extends PowerEntity{ static class ShieldEntity extends PowerEntity{

View File

@@ -1,8 +1,6 @@
package io.anuke.mindustry.world.blocks.types.defense; package io.anuke.mindustry.world.blocks.types.defense;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.utils.Array;
import static io.anuke.mindustry.Vars.*;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.PowerBlock; import io.anuke.mindustry.world.blocks.types.PowerBlock;
@@ -11,6 +9,7 @@ import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Strings; import io.anuke.ucore.util.Strings;
import static io.anuke.mindustry.Vars.renderer; import static io.anuke.mindustry.Vars.renderer;
import static io.anuke.mindustry.Vars.tilesize;
public class ShieldedWallBlock extends PowerBlock{ public class ShieldedWallBlock extends PowerBlock{
static final float hitTime = 18f; static final float hitTime = 18f;
@@ -29,13 +28,13 @@ public class ShieldedWallBlock extends PowerBlock{
float drain = amount * powerPerDamage; float drain = amount * powerPerDamage;
ShieldedWallEntity entity = tile.entity(); ShieldedWallEntity entity = tile.entity();
if(entity.power > drain){ if(entity.power.amount > drain){
entity.power -= drain; entity.power.amount -= drain;
entity.hit = hitTime; entity.hit = hitTime;
return 0; return 0;
}else if(entity.power > 0){ }else if(entity.power.amount > 0){
int reduction = (int)(entity.power / powerPerDamage); int reduction = (int)(entity.power.amount / powerPerDamage);
entity.power = 0; entity.power.amount = 0;
return amount - reduction; return amount - reduction;
} }
@@ -44,9 +43,9 @@ public class ShieldedWallBlock extends PowerBlock{
} }
@Override @Override
public void getStats(Array<String> list){ public void setStats(){
super.getStats(list); super.setStats();
list.add("[powerinfo]Power Drain/damage: " + Strings.toFixed(powerPerDamage, 2)); stats.add("powerdraindamage", Strings.toFixed(powerPerDamage, 2));
} }
@Override @Override
@@ -55,7 +54,7 @@ public class ShieldedWallBlock extends PowerBlock{
ShieldedWallEntity entity = tile.entity(); ShieldedWallEntity entity = tile.entity();
if(entity.power > powerPerDamage){ if(entity.power.amount > powerPerDamage){
renderer.addShield(() -> Draw.rect("blank", tile.worldx(), tile.worldy(), tilesize, tilesize)); renderer.addShield(() -> Draw.rect("blank", tile.worldx(), tile.worldy(), tilesize, tilesize));
} }

View File

@@ -1,7 +1,6 @@
package io.anuke.mindustry.world.blocks.types.defense; package io.anuke.mindustry.world.blocks.types.defense;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.entities.Bullet; import io.anuke.mindustry.entities.Bullet;
import io.anuke.mindustry.entities.BulletType; import io.anuke.mindustry.entities.BulletType;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
@@ -65,16 +64,16 @@ public class Turret extends Block{
} }
@Override @Override
public void getStats(Array<String> list){ public void setStats(){
super.getStats(list); super.setStats();
if(ammo != null) list.add("[turretinfo]Ammo: " + ammo); if(ammo != null) stats.add("ammo", ammo);
if(ammo != null) list.add("[turretinfo]Ammo Capacity: " + maxammo); if(ammo != null) stats.add("ammocapacity", maxammo);
if(ammo != null) list.add("[turretinfo]Ammo/Item: " + ammoMultiplier); if(ammo != null) stats.add("ammoitem", ammoMultiplier);
list.add("[turretinfo]Range: " + (int)range); stats.add("range", (int)range);
list.add("[turretinfo]Inaccuracy: " + (int)inaccuracy); stats.add("inaccuracy", (int)inaccuracy);
list.add("[turretinfo]Damage/Shot: " + bullet.damage); stats.add("damageshot", bullet.damage);
list.add("[turretinfo]Shots/Second: " + Strings.toFixed(60f/reload, 1)); stats.add("shotssecond", Strings.toFixed(60f/reload, 1));
list.add("[turretinfo]Shots: " + shots); stats.add("shots", shots);
} }
@Override @Override
@@ -125,9 +124,9 @@ public class Turret extends Block{
public void update(Tile tile){ public void update(Tile tile){
TurretEntity entity = tile.entity(); TurretEntity entity = tile.entity();
if(ammo != null && entity.hasItem(ammo)){ if(ammo != null && entity.inventory.hasItem(ammo)){
entity.ammo += ammoMultiplier; entity.ammo += ammoMultiplier;
entity.removeItem(ammo, 1); entity.inventory.removeItem(ammo, 1);
} }
if(entity.target != null && entity.target.isDead()) if(entity.target != null && entity.target.isDead())

View File

@@ -1,6 +1,5 @@
package io.anuke.mindustry.world.blocks.types.distribution; package io.anuke.mindustry.world.blocks.types.distribution;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.LongArray; import com.badlogic.gdx.utils.LongArray;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.resource.Item; import io.anuke.mindustry.resource.Item;
@@ -42,9 +41,9 @@ public class Conveyor extends Block{
} }
@Override @Override
public void getStats(Array<String> list){ public void setStats(){
super.getStats(list); super.setStats();
list.add("[iteminfo]Item Speed/second: " + Strings.toFixed(speed * 60, 1)); stats.add("itemspeedsecond", Strings.toFixed(speed * 60, 1));
} }
@Override @Override
@@ -177,11 +176,6 @@ public class Conveyor extends Block{
} }
} }
@Override
public boolean syncEntity(){
return false;
}
/** /**
* Conveyor data format: * Conveyor data format:
* [0] item ordinal * [0] item ordinal

View File

@@ -10,14 +10,13 @@ public class LiquidRouter extends Conduit{
super(name); super(name);
rotate = false; rotate = false;
solid = true; solid = true;
flowfactor = 2f; liquidFlowFactor = 2f;
} }
@Override @Override
public void update(Tile tile){ public void update(Tile tile){
LiquidEntity entity = tile.entity();
if(entity.liquidAmount > 0){ if(tile.entity.liquid.amount > 0){
if(tile.getExtra() != tile.getRotation()){ if(tile.getExtra() != tile.getRotation()){
tryMoveLiquid(tile, tile.getNearby(tile.getRotation())); tryMoveLiquid(tile, tile.getNearby(tile.getRotation()));
} }
@@ -29,18 +28,15 @@ public class LiquidRouter extends Conduit{
@Override @Override
public void handleLiquid(Tile tile, Tile source, Liquid liquid, float amount){ public void handleLiquid(Tile tile, Tile source, Liquid liquid, float amount){
super.handleLiquid(tile, source, liquid, amount); super.handleLiquid(tile, source, liquid, amount);
tile.setExtra((byte)tile.relativeTo(source.x, source.y)); tile.setExtra(tile.relativeTo(source.x, source.y));
} }
@Override @Override
public void draw(Tile tile){ public void draw(Tile tile){
LiquidEntity entity = tile.entity();
Draw.rect(name(), tile.worldx(), tile.worldy()); Draw.rect(name(), tile.worldx(), tile.worldy());
if(entity.liquid == null) return; Draw.color(tile.entity.liquid.liquid.color);
Draw.alpha(tile.entity.liquid.amount / liquidCapacity);
Draw.color(entity.liquid.color);
Draw.alpha(entity.liquidAmount / liquidCapacity);
Draw.rect("blank", tile.worldx(), tile.worldy(), 2, 2); Draw.rect("blank", tile.worldx(), tile.worldy(), 2, 2);
Draw.color(); Draw.color();
} }

View File

@@ -1,110 +0,0 @@
package io.anuke.mindustry.world.blocks.types.distribution;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.PowerAcceptor;
import io.anuke.mindustry.world.blocks.types.generation.Generator;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Lines;
import io.anuke.ucore.util.Mathf;
import static io.anuke.mindustry.Vars.tilesize;
import static io.anuke.mindustry.Vars.world;
public class PowerBooster extends Generator{
protected final int timerGenerate = timers++;
public int powerRange = 4;
public PowerBooster(String name) {
super(name);
explosive = false;
hasLasers = false;
powerSpeed = 0.4f;
}
@Override
public void drawSelect(Tile tile){
super.drawSelect(tile);
Draw.color(Color.YELLOW);
Lines.dashCircle(tile.worldx(), tile.worldy(), powerRange * tilesize);
Draw.reset();
}
@Override
public void drawPlace(int x, int y, int rotation, boolean valid){
Draw.color(Color.PURPLE);
Lines.stroke(1f);
Lines.dashCircle(x * tilesize, y * tilesize, powerRange * tilesize);
Draw.reset();
}
@Override
public void getStats(Array<String> list){
super.getStats(list);
list.add("[powerinfo]Power Range: " + powerRange + " tiles");
}
@Override
public void update(Tile tile){
distributePower(tile);
}
@Override
public void drawLayer(Tile tile){}
@Override
public boolean acceptsPower(Tile tile){
PowerEntity entity = tile.entity();
return entity.power + 0.001f <= powerCapacity;
}
//TODO better distribution
protected void distributePower(Tile tile){
PowerEntity p = tile.entity();
if(!p.timer.get(timerGenerate, powerTime)){
return;
}
int acceptors = 0;
float flow = 0f;
for(int i = 0; i < 2; i++){
for(int x = -powerRange; x <= powerRange; x++){
for(int y = -powerRange; y <= powerRange; y++){
if(x == 0 && y == 0){
continue;
}
if(Vector2.dst(x, y, 0, 0) < powerRange){
Tile dest = world.tile(tile.x + x, tile.y + y);
if(dest != null && dest.block() instanceof PowerAcceptor && ((PowerAcceptor) dest.block()).acceptsPower(dest)){
if(i == 1){
PowerAcceptor block = (PowerAcceptor) dest.block();
float transmission = Math.min(flow, p.power);
float amount = block.addPower(dest, transmission);
p.power -= amount;
}else{
acceptors++;
}
}
}
}
}
//TODO better distribution scheme
if(i == 0 && acceptors > 0){
flow = Mathf.clamp(p.power / acceptors, 0f, powerSpeed / acceptors * Timers.delta());
}
}
}
}

View File

@@ -28,9 +28,9 @@ public class PowerLaser extends Generator{
} }
@Override @Override
public boolean acceptsPower(Tile tile){ public boolean acceptPower(Tile tile, Tile from, float amount){
PowerEntity entity = tile.entity(); PowerEntity entity = tile.entity();
return entity.power + 0.001f <= powerCapacity; return entity.power.amount <= powerCapacity;
} }
} }

View File

@@ -1,27 +1,17 @@
package io.anuke.mindustry.world.blocks.types.distribution; package io.anuke.mindustry.world.blocks.types.distribution;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.resource.Item; import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.BlockBar;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;
public class Router extends Block{ public class Router extends Block{
protected int capacity = 20;
public Router(String name) { public Router(String name) {
super(name); super(name);
update = true; update = true;
solid = true; solid = true;
bars.add(new BlockBar(Color.GREEN, true, tile -> (float)tile.entity.totalItems()/capacity)); itemCapacity = 20;
}
@Override
public void getStats(Array<String> list){
super.getStats(list);
list.add("[iteminfo]Capacity: " + capacity);
} }
@Override @Override
@@ -34,7 +24,7 @@ public class Router extends Block{
int iterations = Math.max(1, (int) (Timers.delta() + 0.4f)); int iterations = Math.max(1, (int) (Timers.delta() + 0.4f));
for(int i = 0; i < iterations; i ++) { for(int i = 0; i < iterations; i ++) {
if (tile.entity.totalItems() > 0) { if (tile.entity.inventory.totalItems() > 0) {
tryDump(tile); tryDump(tile);
} }
} }
@@ -48,8 +38,8 @@ 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){
int items = tile.entity.totalItems(); int items = tile.entity.inventory.totalItems();
return items < capacity; return items < itemCapacity;
} }
} }

View File

@@ -59,9 +59,9 @@ public class Teleporter extends PowerBlock{
} }
@Override @Override
public void getStats(Array<String> list){ public void setStats(){
super.getStats(list); super.setStats();
list.add("[powerinfo]Power/item: " + Strings.toFixed(powerPerItem, 1)); stats.add("poweritem", Strings.toFixed(powerPerItem, 1));
} }
@Override @Override
@@ -90,7 +90,7 @@ public class Teleporter extends PowerBlock{
teleporters[entity.color].add(tile); teleporters[entity.color].add(tile);
if(entity.totalItems() > 0){ if(entity.inventory.totalItems() > 0){
tryDump(tile); tryDump(tile);
} }
} }
@@ -139,17 +139,17 @@ public class Teleporter extends PowerBlock{
if(links.size > 0){ if(links.size > 0){
if(!syncBlockState || Net.server() || !Net.active()){ if(!syncBlockState || Net.server() || !Net.active()){
Tile target = links.random(); Tile target = links.random();
target.entity.addItem(item, 1); target.entity.inventory.addItem(item, 1);
} }
} }
entity.power -= powerPerItem; entity.power.amount -= powerPerItem;
} }
@Override @Override
public boolean acceptItem(Item item, Tile tile, Tile source){ public boolean acceptItem(Item item, Tile tile, Tile source){
PowerEntity entity = tile.entity(); PowerEntity entity = tile.entity();
return !(source.block() instanceof Teleporter) && entity.power >= powerPerItem && findLinks(tile).size > 0; return !(source.block() instanceof Teleporter) && entity.power.amount >= powerPerItem && findLinks(tile).size > 0;
} }
@Override @Override
@@ -168,7 +168,7 @@ public class Teleporter extends PowerBlock{
if(other.block() instanceof Teleporter){ if(other.block() instanceof Teleporter){
if(other.<TeleporterEntity>entity().color != entity.color){ if(other.<TeleporterEntity>entity().color != entity.color){
removal.add(other); removal.add(other);
}else if(other.entity.totalItems() == 0){ }else if(other.entity.inventory.totalItems() == 0){
returns.add(other); returns.add(other);
} }
}else{ }else{

View File

@@ -2,7 +2,6 @@ package io.anuke.mindustry.world.blocks.types.distribution;
import io.anuke.mindustry.resource.Liquid; import io.anuke.mindustry.resource.Liquid;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.LiquidAcceptor;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
public class TunnelConduit extends Conduit { public class TunnelConduit extends Conduit {
@@ -27,11 +26,9 @@ public class TunnelConduit extends Conduit {
Tile tunnel = getDestTunnel(tile); Tile tunnel = getDestTunnel(tile);
if (tunnel == null) return; if (tunnel == null) return;
Tile to = tunnel.getNearby(tunnel.getRotation()); Tile to = tunnel.getNearby(tunnel.getRotation());
if (to == null || !(to.block() instanceof LiquidAcceptor)) return; if (to == null || !(to.block().hasLiquids)) return;
LiquidAcceptor a = (LiquidAcceptor) to.block(); if (to.block().acceptLiquid(tile, source, liquid, amount)) to.block().handleLiquid(to, tunnel, liquid, amount);
if (a.acceptLiquid(tile, source, liquid, amount)) a.handleLiquid(to, tunnel, liquid, amount);
} }
@Override @Override
@@ -42,8 +39,8 @@ public class TunnelConduit extends Conduit {
if (tunnel != null) { if (tunnel != null) {
Tile to = tunnel.getNearby(tunnel.getRotation()); Tile to = tunnel.getNearby(tunnel.getRotation());
return to != null && (to.block() instanceof LiquidAcceptor) && return to != null && (to.block().hasLiquids) &&
((LiquidAcceptor) to.block()).acceptLiquid(to, tunnel, liquid, amount); (to.block()).acceptLiquid(to, tunnel, liquid, amount);
} else { } else {
return false; return false;
} }

View File

@@ -104,7 +104,7 @@ public class TunnelConveyor extends Block{
arr.add(entity.index); arr.add(entity.index);
for(int i = 0; i < entity.index; i++){ for(int i = 0; i < entity.index; i++){
long l = entity.items[i]; long l = entity.inventory.items[i];
float time = NumberUtils.intBitsToFloat(Bits.getLeftInt(l)); float time = NumberUtils.intBitsToFloat(Bits.getLeftInt(l));
Item item = Item.getByID(Bits.getRightInt(l)); Item item = Item.getByID(Bits.getRightInt(l));
Tile dest = getDestTunnel(tile, item); Tile dest = getDestTunnel(tile, item);

View File

@@ -3,13 +3,11 @@ package io.anuke.mindustry.world.blocks.types.generation;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.math.GridPoint2; import com.badlogic.gdx.math.GridPoint2;
import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.graphics.Fx; import io.anuke.mindustry.graphics.Fx;
import io.anuke.mindustry.world.Layer; import io.anuke.mindustry.world.Layer;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.PowerAcceptor;
import io.anuke.mindustry.world.blocks.types.PowerBlock; import io.anuke.mindustry.world.blocks.types.PowerBlock;
import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Settings; import io.anuke.ucore.core.Settings;
@@ -18,7 +16,10 @@ import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Hue; import io.anuke.ucore.graphics.Hue;
import io.anuke.ucore.graphics.Lines; import io.anuke.ucore.graphics.Lines;
import io.anuke.ucore.graphics.Shapes; import io.anuke.ucore.graphics.Shapes;
import io.anuke.ucore.util.*; import io.anuke.ucore.util.Geometry;
import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Strings;
import io.anuke.ucore.util.Translator;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
@@ -43,16 +44,17 @@ public class Generator extends PowerBlock{
} }
@Override @Override
public void getStats(Array<String> list){ public void setStats(){
super.getStats(list); super.setStats();
if(hasLasers){ if(hasLasers){
list.add("[powerinfo]Laser tile range: " + laserRange); stats.add("lasertilerange", laserRange);
list.add("[powerinfo]Max power transfer/second: " + Strings.toFixed(powerSpeed * 60, 2)); stats.add("maxpowertransfersecond", Strings.toFixed(powerSpeed * 60, 2));
} }
//TODO fix this
if(explosive){ if(explosive){
list.add("[orange]" + Bundles.get("text.blocks.explosive")); stats.add("explosive", "!!! //TODO");
} }
} }
@@ -138,7 +140,7 @@ public class Generator extends PowerBlock{
GeneratorEntity entity = tile.entity(); GeneratorEntity entity = tile.entity();
for(int i = 0; i < laserDirections; i++){ for(int i = 0; i < laserDirections; i++){
if(entity.power > powerSpeed){ if(entity.power.amount > powerSpeed){
entity.laserThickness = Mathf.lerpDelta(entity.laserThickness, 1f, 0.05f); entity.laserThickness = Mathf.lerpDelta(entity.laserThickness, 1f, 0.05f);
}else{ }else{
entity.laserThickness = Mathf.lerpDelta(entity.laserThickness, 0.2f, 0.05f); entity.laserThickness = Mathf.lerpDelta(entity.laserThickness, 0.2f, 0.05f);
@@ -150,7 +152,7 @@ public class Generator extends PowerBlock{
} }
@Override @Override
public boolean acceptsPower(Tile tile){ public boolean acceptPower(Tile tile, Tile source, float amount){
return false; return false;
} }
@@ -173,11 +175,10 @@ public class Generator extends PowerBlock{
if(target == null || isInterfering(target, rot)) if(target == null || isInterfering(target, rot))
continue; continue;
PowerAcceptor p = (PowerAcceptor) target.block(); float transmit = Math.min(powerSpeed * Timers.delta(), entity.power.amount);
float transmit = Math.min(powerSpeed * Timers.delta(), entity.power); if(target.block().acceptPower(target, tile, transmit)){
if(p.acceptsPower(target)){ float accepted = target.block().addPower(target, transmit);
float accepted = p.addPower(target, transmit); entity.power.amount -= accepted;
entity.power -= accepted;
} }
} }
@@ -253,9 +254,9 @@ public class Generator extends PowerBlock{
for(int i = 1; i < laserRange; i++){ for(int i = 1; i < laserRange; i++){
Tile other = world.tile(tile.x + i * point.x, tile.y + i * point.y); Tile other = world.tile(tile.x + i * point.x, tile.y + i * point.y);
if(other != null && other.block() instanceof PowerAcceptor){ if(other != null && other.block().hasPower){
Tile linked = other.getLinked(); Tile linked = other.getLinked();
if(linked == null || linked.block() instanceof PowerAcceptor){ if(linked == null || linked.block().hasPower){
return other; return other;
} }
} }

View File

@@ -1,7 +1,6 @@
package io.anuke.mindustry.world.blocks.types.generation; package io.anuke.mindustry.world.blocks.types.generation;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.graphics.Fx; import io.anuke.mindustry.graphics.Fx;
import io.anuke.mindustry.resource.Item; import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.world.BlockBar; import io.anuke.mindustry.world.BlockBar;
@@ -25,16 +24,15 @@ public class ItemPowerGenerator extends Generator{
super(name); super(name);
outputOnly = true; outputOnly = true;
bars.add(new BlockBar(Color.GREEN, true, tile -> (float)tile.entity.getItem(generateItem) / itemCapacity)); bars.add(new BlockBar(Color.GREEN, true, tile -> (float)tile.entity.inventory.getItem(generateItem) / itemCapacity));
} }
@Override @Override
public void getStats(Array<String> list){ public void setStats(){
super.getStats(list); super.setStats();
list.add("[powerinfo]Item Capacity: " + itemCapacity); stats.add("powergenerationsecond", Strings.toFixed(powerOutput*60f, 2));
list.add("[powerinfo]Power Generation/second: " + Strings.toFixed(powerOutput*60f, 2)); stats.add("generationsecondsitem", Strings.toFixed(itemDuration/60f, 2));
list.add("[powerinfo]Generation Seconds/item: " + Strings.toFixed(itemDuration/60f, 2)); stats.add("input", generateItem);
list.add("[powerinfo]Input: " + generateItem);
} }
@Override @Override
@@ -45,7 +43,7 @@ public class ItemPowerGenerator extends Generator{
if(entity.time > 0){ if(entity.time > 0){
Draw.color(heatColor); Draw.color(heatColor);
float alpha = (entity.hasItem(generateItem) ? 1f : Mathf.clamp(entity.time)); float alpha = (entity.inventory.hasItem(generateItem) ? 1f : Mathf.clamp(entity.time));
alpha = alpha * 0.7f + Mathf.absin(Timers.time(), 12f, 0.3f) * alpha; alpha = alpha * 0.7f + Mathf.absin(Timers.time(), 12f, 0.3f) * alpha;
Draw.alpha(alpha); Draw.alpha(alpha);
Draw.rect(name + "-top", tile.worldx(), tile.worldy()); Draw.rect(name + "-top", tile.worldx(), tile.worldy());
@@ -55,25 +53,25 @@ public class ItemPowerGenerator extends Generator{
@Override @Override
public boolean acceptItem(Item item, Tile tile, Tile source){ public boolean acceptItem(Item item, Tile tile, Tile source){
return item == generateItem && tile.entity.getItem(generateItem) < itemCapacity; return item == generateItem && tile.entity.inventory.getItem(generateItem) < itemCapacity;
} }
@Override @Override
public void update(Tile tile){ public void update(Tile tile){
PowerEntity entity = tile.entity(); PowerEntity entity = tile.entity();
float maxPower = Math.min(powerCapacity - entity.power, powerOutput * Timers.delta()); float maxPower = Math.min(powerCapacity - entity.power.amount, powerOutput * Timers.delta());
float mfract = maxPower/(powerOutput); float mfract = maxPower/(powerOutput);
if(entity.time > 0f){ if(entity.time > 0f){
entity.time -= 1f/itemDuration*mfract; entity.time -= 1f/itemDuration*mfract;
entity.power += maxPower; entity.power.amount += maxPower;
entity.time = Mathf.clamp(entity.time); entity.time = Mathf.clamp(entity.time);
} }
if(entity.time <= 0f && entity.hasItem(generateItem)){ if(entity.time <= 0f && entity.inventory.hasItem(generateItem)){
Effects.effect(generateEffect, tile.worldx() + Mathf.range(3f), tile.worldy() + Mathf.range(3f)); Effects.effect(generateEffect, tile.worldx() + Mathf.range(3f), tile.worldy() + Mathf.range(3f));
entity.removeItem(generateItem, 1); entity.inventory.removeItem(generateItem, 1);
entity.time = 1f; entity.time = 1f;
} }

View File

@@ -1,11 +1,9 @@
package io.anuke.mindustry.world.blocks.types.generation; package io.anuke.mindustry.world.blocks.types.generation;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.graphics.Fx; import io.anuke.mindustry.graphics.Fx;
import io.anuke.mindustry.resource.Liquid; import io.anuke.mindustry.resource.Liquid;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.LiquidAcceptor;
import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Effects.Effect;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;
@@ -13,43 +11,39 @@ import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Strings; import io.anuke.ucore.util.Strings;
import java.io.DataInputStream; public class LiquidPowerGenerator extends Generator{
import java.io.DataOutputStream;
import java.io.IOException;
public class LiquidPowerGenerator extends Generator implements LiquidAcceptor{
public int generateTime = 15; public int generateTime = 15;
public Liquid generateLiquid; public Liquid generateLiquid;
public float powerPerLiquid = 0.13f; public float powerPerLiquid = 0.13f;
/**Maximum liquid used per frame.*/ /**Maximum liquid used per frame.*/
public float maxLiquidGenerate = 0.4f; public float maxLiquidGenerate = 0.4f;
public float liquidCapacity = 30f;
public Effect generateEffect = Fx.generatespark; public Effect generateEffect = Fx.generatespark;
public LiquidPowerGenerator(String name) { public LiquidPowerGenerator(String name) {
super(name); super(name);
outputOnly = true; outputOnly = true;
liquidCapacity = 30f;
} }
@Override @Override
public void getStats(Array<String> list){ public void setStats(){
super.getStats(list); super.setStats();
list.add("[liquidinfo]Liquid Capacity: " + (int)liquidCapacity); stats.add("liquidcapacity", (int)liquidCapacity);
list.add("[liquidinfo]Power/Liquid: " + Strings.toFixed(powerPerLiquid, 2) + " power/liquid"); stats.add("powerliquid", Strings.toFixed(powerPerLiquid, 2) + " power/liquid");
list.add("[liquidinfo]Max liquid/second: " + Strings.toFixed(maxLiquidGenerate*60f, 2) + " liquid/s"); stats.add("maxliquidsecond", Strings.toFixed(maxLiquidGenerate*60f, 2) + " liquid/s");
list.add("[liquidinfo]Input: " + generateLiquid); stats.add("input", generateLiquid);
} }
@Override @Override
public void draw(Tile tile){ public void draw(Tile tile){
super.draw(tile); super.draw(tile);
TileEntity entity = tile.entity();
LiquidPowerEntity entity = tile.entity(); if(entity.liquid.liquid == null) return;
if(entity.liquid == null) return; Draw.color(entity.liquid.liquid.color);
Draw.alpha(entity.liquid.amount / liquidCapacity);
Draw.color(entity.liquid.color);
Draw.alpha(entity.liquidAmount / liquidCapacity);
drawLiquidCenter(tile); drawLiquidCenter(tile);
Draw.color(); Draw.color();
} }
@@ -60,14 +54,14 @@ public class LiquidPowerGenerator extends Generator implements LiquidAcceptor{
@Override @Override
public void update(Tile tile){ public void update(Tile tile){
LiquidPowerEntity entity = tile.entity(); TileEntity entity = tile.entity();
if(entity.liquidAmount > 0){ if(entity.liquid.amount > 0){
float used = Math.min(entity.liquidAmount, maxLiquidGenerate * Timers.delta()); float used = Math.min(entity.liquid.amount, maxLiquidGenerate * Timers.delta());
used = Math.min(used, (powerCapacity - entity.power)/powerPerLiquid); used = Math.min(used, (powerCapacity - entity.power.amount)/powerPerLiquid);
entity.liquidAmount -= used; entity.liquid.amount -= used;
entity.power += used * powerPerLiquid; entity.power.amount += used * powerPerLiquid;
if(used > 0.001f && Mathf.chance(0.05 * Timers.delta())){ if(used > 0.001f && Mathf.chance(0.05 * Timers.delta())){
@@ -79,54 +73,8 @@ public class LiquidPowerGenerator extends Generator implements LiquidAcceptor{
} }
@Override
public TileEntity getEntity(){
return new LiquidPowerEntity();
}
@Override @Override
public boolean acceptLiquid(Tile tile, Tile source, Liquid liquid, float amount){ public boolean acceptLiquid(Tile tile, Tile source, Liquid liquid, float amount){
LiquidPowerEntity entity = tile.entity(); return liquid == generateLiquid && super.acceptLiquid(tile, source, liquid, amount);
return liquid == generateLiquid && entity.liquidAmount + amount < liquidCapacity && (entity.liquid == liquid || entity.liquidAmount <= 0.01f);
} }
@Override
public void handleLiquid(Tile tile, Tile source, Liquid liquid, float amount){
LiquidPowerEntity entity = tile.entity();
entity.liquid = liquid;
entity.liquidAmount += amount;
}
@Override
public float getLiquid(Tile tile){
LiquidPowerEntity entity = tile.entity();
return entity.liquidAmount;
}
@Override
public float getLiquidCapacity(Tile tile){
return liquidCapacity;
}
public static class LiquidPowerEntity extends GeneratorEntity{
public Liquid liquid;
public float liquidAmount;
@Override
public void write(DataOutputStream stream) throws IOException{
super.write(stream);
stream.writeByte(liquid == null ? -1 : liquid.id);
stream.writeByte((byte)(liquidAmount));
}
@Override
public void read(DataInputStream stream) throws IOException{
super.read(stream);
byte id = stream.readByte();
liquid = id == -1 ? null : Liquid.getByID(id);
liquidAmount = stream.readByte();
}
}
} }

View File

@@ -1,7 +1,6 @@
package io.anuke.mindustry.world.blocks.types.generation; package io.anuke.mindustry.world.blocks.types.generation;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.effect.DamageArea; import io.anuke.mindustry.entities.effect.DamageArea;
import io.anuke.mindustry.graphics.Fx; import io.anuke.mindustry.graphics.Fx;
@@ -28,7 +27,6 @@ public class NuclearReactor extends LiquidPowerGenerator{
protected final Translator tr = new Translator(); protected final Translator tr = new Translator();
protected Item generateItem; protected Item generateItem;
protected int itemCapacity = 30;
protected Color coolColor = new Color(1, 1, 1, 0f); protected Color coolColor = new Color(1, 1, 1, 0f);
protected Color hotColor = Color.valueOf("ff9575a3"); protected Color hotColor = Color.valueOf("ff9575a3");
protected int fuelUseTime = 130; //time to consume 1 fuel protected int fuelUseTime = 130; //time to consume 1 fuel
@@ -51,39 +49,40 @@ public class NuclearReactor extends LiquidPowerGenerator{
powerCapacity = 80f; powerCapacity = 80f;
powerSpeed = 0.5f; powerSpeed = 0.5f;
bars.add(new BlockBar(Color.GREEN, true, tile -> (float)tile.entity.getItem(generateItem) / itemCapacity)); bars.add(new BlockBar(Color.GREEN, true, tile -> (float)tile.entity.inventory.getItem(generateItem) / itemCapacity));
bars.add(new BlockBar(Color.ORANGE, true, tile -> tile.<NuclearReactorEntity>entity().heat)); bars.add(new BlockBar(Color.ORANGE, true, tile -> tile.<NuclearReactorEntity>entity().heat));
} }
@Override @Override
public void getStats(Array<String> list){ public void setStats(){
super.getStats(list); super.setStats();
list.add("[powerinfo]Input Item: " + generateItem); stats.add("inputitem", generateItem);
list.add("[powerinfo]Max Power Generation/second: " + Strings.toFixed(powerMultiplier*60f, 2)); stats.add("maxpowergenerationsecond", Strings.toFixed(powerMultiplier*60f, 2));
list.removeValue(list.select(s -> s.contains("Power/Liquid")).iterator().next(), true);
list.removeValue(list.select(s -> s.contains("Max liquid/second:")).iterator().next(), true); stats.remove("powerliquid");
stats.remove("maxliquidsecond");
} }
@Override @Override
public void update(Tile tile){ public void update(Tile tile){
NuclearReactorEntity entity = tile.entity(); NuclearReactorEntity entity = tile.entity();
int fuel = entity.getItem(generateItem); int fuel = entity.inventory.getItem(generateItem);
float fullness = (float)fuel / itemCapacity; float fullness = (float)fuel / itemCapacity;
if(fuel > 0){ if(fuel > 0){
entity.heat += fullness * heating * Math.min(Timers.delta(), 4f); entity.heat += fullness * heating * Math.min(Timers.delta(), 4f);
entity.power += powerMultiplier * fullness * Timers.delta(); entity.power.amount += powerMultiplier * fullness * Timers.delta();
entity.power = Mathf.clamp(entity.power, 0f, powerCapacity); entity.power.amount = Mathf.clamp(entity.power.amount, 0f, powerCapacity);
if(entity.timer.get(timerFuel, fuelUseTime)){ if(entity.timer.get(timerFuel, fuelUseTime)){
entity.removeItem(generateItem, 1); entity.inventory.removeItem(generateItem, 1);
} }
} }
if(entity.liquidAmount > 0){ if(entity.liquid.amount > 0){
float maxCool = Math.min(entity.liquidAmount * coolantPower, entity.heat); float maxCool = Math.min(entity.liquid.amount * coolantPower, entity.heat);
entity.heat -= maxCool; //TODO steam when cooling large amounts? entity.heat -= maxCool; //TODO steam when cooling large amounts?
entity.liquidAmount -= maxCool / coolantPower; entity.liquid.amount -= maxCool / coolantPower;
} }
if(entity.heat > smokeThreshold){ if(entity.heat > smokeThreshold){
@@ -114,7 +113,7 @@ public class NuclearReactor extends LiquidPowerGenerator{
NuclearReactorEntity entity = tile.entity(); NuclearReactorEntity entity = tile.entity();
int fuel = entity.getItem(generateItem); int fuel = entity.inventory.getItem(generateItem);
if(fuel < 5 && entity.heat < 0.5f) return; if(fuel < 5 && entity.heat < 0.5f) return;
@@ -131,7 +130,7 @@ public class NuclearReactor extends LiquidPowerGenerator{
Effects.shake(6f, 16f, tile.worldx(), tile.worldy()); Effects.shake(6f, 16f, tile.worldx(), tile.worldy());
Effects.effect(explosionEffect, tile.worldx(), tile.worldy()); Effects.effect(explosionEffect, tile.worldx(), tile.worldy());
for(int i = 0; i < 6; i ++){ for(int i = 0; i < 6; i ++){
Timers.run(Mathf.random(40), ()->{ Timers.run(Mathf.random(40), () -> {
Effects.effect(Fx.nuclearcloud, tile.worldx(), tile.worldy()); Effects.effect(Fx.nuclearcloud, tile.worldx(), tile.worldy());
}); });
} }
@@ -156,7 +155,7 @@ public class NuclearReactor extends LiquidPowerGenerator{
@Override @Override
public boolean acceptItem(Item item, Tile tile, Tile source){ public boolean acceptItem(Item item, Tile tile, Tile source){
return item == generateItem && tile.entity.getItem(generateItem) < itemCapacity; return item == generateItem && tile.entity.inventory.getItem(generateItem) < itemCapacity;
} }
@Override @Override
@@ -184,7 +183,7 @@ public class NuclearReactor extends LiquidPowerGenerator{
return new NuclearReactorEntity(); return new NuclearReactorEntity();
} }
public static class NuclearReactorEntity extends LiquidPowerEntity{ public static class NuclearReactorEntity extends PowerEntity{
public float heat; public float heat;
public float flash; public float flash;

View File

@@ -0,0 +1,68 @@
package io.anuke.mindustry.world.blocks.types.modules;
import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.world.blocks.types.BlockModule;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
public class InventoryModule extends BlockModule{
public int[] items = new int[Item.getAllItems().size];
public int totalItems(){
int sum = 0;
for(int i = 0; i < items.length; i ++){
sum += items[i];
}
return sum;
}
public int getItem(Item item){
return items[item.id];
}
public boolean hasItem(Item item){
return getItem(item) > 0;
}
public boolean hasItem(Item item, int amount){
return getItem(item) >= amount;
}
public void addItem(Item item, int amount){
items[item.id] += amount;
}
public void removeItem(Item item, int amount){
items[item.id] -= amount;
}
@Override
public void write(DataOutputStream stream) throws IOException {
byte amount = 0;
for(int i = 0; i < items.length; i ++){
if(items[i] > 0) amount ++;
}
stream.writeByte(amount); //amount of items
for(int i = 0; i < items.length; i ++){
if(items[i] > 0){
stream.writeByte(i); //item ID
stream.writeInt(items[i]); //item amount
}
}
}
@Override
public void read(DataInputStream stream) throws IOException {
byte count = stream.readByte();
for(int j = 0; j < count; j ++){
int itemid = stream.readByte();
int itemamount = stream.readInt();
items[itemid] = itemamount;
}
}
}

View File

@@ -0,0 +1,26 @@
package io.anuke.mindustry.world.blocks.types.modules;
import io.anuke.mindustry.resource.Liquid;
import io.anuke.mindustry.world.blocks.types.BlockModule;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
public class LiquidModule extends BlockModule {
public float amount;
public Liquid liquid = Liquid.none;
@Override
public void write(DataOutputStream stream) throws IOException {
stream.writeByte(liquid.id);
stream.writeByte((byte)(amount));
}
@Override
public void read(DataInputStream stream) throws IOException{
byte id = stream.readByte();
liquid = Liquid.getByID(id);
amount = stream.readByte();
}
}

View File

@@ -0,0 +1,39 @@
package io.anuke.mindustry.world.blocks.types.modules;
import io.anuke.mindustry.world.blocks.types.BlockModule;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
public class PowerModule extends BlockModule{
public float amount;
public float capacity = 10f;
public float voltage = 0.0001f;
public boolean acceptsPower(){
return amount + 0.001f <= capacity;
}
public float addPower(float add){
if(add < voltage){
return add;
}
float canAccept = Math.min(capacity - amount, add);
amount += canAccept;
return canAccept;
}
@Override
public void write(DataOutputStream stream) throws IOException {
stream.writeFloat(amount);
}
@Override
public void read(DataInputStream stream) throws IOException{
amount = stream.readFloat();
}
}

View File

@@ -22,7 +22,6 @@ public class Drill extends Block{
protected Block resource; protected Block resource;
protected Item result; protected Item result;
protected float time = 5; protected float time = 5;
protected int capacity = 5;
protected Effect drillEffect = Fx.spark; protected Effect drillEffect = Fx.spark;
public Drill(String name) { public Drill(String name) {
@@ -30,13 +29,13 @@ public class Drill extends Block{
update = true; update = true;
solid = true; solid = true;
layer = Layer.overlay; layer = Layer.overlay;
itemCapacity = 5;
} }
@Override @Override
public void getStats(Array<String> list){ public void setStats(){
super.getStats(list); super.setStats();
list.add("[iteminfo]Capacity: " + capacity); stats.add("secondsitem", time);
list.add("[iteminfo]Seconds/item: " + time);
} }
@Override @Override
@@ -55,7 +54,7 @@ public class Drill extends Block{
if(isValid(tile)) mines = 1; if(isValid(tile)) mines = 1;
} }
if(mines > 0 && entity.timer.get(timerDrill, 60 * time) && tile.entity.getItem(result) < capacity){ if(mines > 0 && entity.timer.get(timerDrill, 60 * time) && tile.entity.inventory.getItem(result) < itemCapacity){
for(int i = 0; i < mines; i ++) offloadNear(tile, result); for(int i = 0; i < mines; i ++) offloadNear(tile, result);
Effects.effect(drillEffect, tile.drawx(), tile.drawy()); Effects.effect(drillEffect, tile.drawx(), tile.drawy());
} }

View File

@@ -1,7 +1,6 @@
package io.anuke.mindustry.world.blocks.types.production; package io.anuke.mindustry.world.blocks.types.production;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.graphics.Fx; import io.anuke.mindustry.graphics.Fx;
import io.anuke.mindustry.resource.Item; import io.anuke.mindustry.resource.Item;
@@ -36,47 +35,44 @@ public class LiquidCrafter extends LiquidBlock{
health = 60; health = 60;
liquidCapacity = 21f; liquidCapacity = 21f;
bars.add(new BlockBar(Color.GREEN, true, tile -> input == null ? -1f : (float)tile.entity.getItem(input) / itemCapacity)); bars.add(new BlockBar(Color.GREEN, true, tile -> input == null ? -1f : (float)tile.entity.inventory.getItem(input) / itemCapacity));
} }
@Override @Override
public void getStats(Array<String> list){ public void setStats(){
super.getStats(list); super.setStats();
list.add("[liquidinfo]Max items/second: " + Strings.toFixed(60f/purifyTime, 1)); stats.add("maxitemssecond", Strings.toFixed(60f/purifyTime, 1));
list.add("[liquidinfo]Input liquid: " + inputLiquid + " x " + (int)liquidAmount); stats.add("inputliquid", inputLiquid + " x " + (int)liquidAmount);
if(input != null) list.add("[iteminfo]Item Capacity: " + itemCapacity); if(input != null) stats.add("itemcapacity", itemCapacity);
if(input != null) list.add("[iteminfo]Input item: " + input + " x " + inputAmount); if(input != null) stats.add("inputitem", input + " x " + inputAmount);
list.add("[iteminfo]Output: " + output); stats.add("output", output);
} }
@Override @Override
public void draw(Tile tile){ public void draw(Tile tile){
LiquidEntity entity = tile.entity();
Draw.rect(name(), tile.drawx(), tile.drawy()); Draw.rect(name(), tile.drawx(), tile.drawy());
if(entity.liquid == null) return; if(tile.entity.liquid.liquid == null) return;
Draw.color(entity.liquid.color); Draw.color(tile.entity.liquid.liquid.color);
Draw.alpha(entity.liquidAmount / liquidCapacity); Draw.alpha(tile.entity.liquid.amount / liquidCapacity);
Draw.rect("blank", tile.drawx(), tile.drawy(), 2, 2); Draw.rect("blank", tile.drawx(), tile.drawy(), 2, 2);
Draw.color(); Draw.color();
} }
@Override @Override
public void update(Tile tile){ public void update(Tile tile){
LiquidEntity entity = tile.entity(); if(tile.entity.timer.get(timerPurify, purifyTime) && tile.entity.liquid.amount >= liquidAmount &&
(input == null || tile.entity.inventory.hasItem(input, inputAmount))){
if(entity.timer.get(timerPurify, purifyTime) && entity.liquidAmount >= liquidAmount &&
(input == null || entity.hasItem(input, inputAmount))){
if(input != null) if(input != null)
entity.removeItem(input, inputAmount); tile.entity.inventory.removeItem(input, inputAmount);
entity.liquidAmount -= liquidAmount; tile.entity.liquid.amount -= liquidAmount;
offloadNear(tile, output); offloadNear(tile, output);
Effects.effect(craftEffect, tile.worldx(), tile.worldy()); Effects.effect(craftEffect, tile.worldx(), tile.worldy());
} }
if(entity.timer.get(timerDump, 15)){ if(tile.entity.timer.get(timerDump, 15)){
tryDump(tile, output); tryDump(tile, output);
} }
} }
@@ -89,7 +85,7 @@ public class LiquidCrafter extends LiquidBlock{
@Override @Override
public boolean acceptItem(Item item, Tile tile, Tile source){ public boolean acceptItem(Item item, Tile tile, Tile source){
TileEntity entity = tile.entity(); TileEntity entity = tile.entity();
return input != null && item == input && entity.getItem(input) < itemCapacity; return input != null && item == input && entity.inventory.getItem(input) < itemCapacity;
} }
} }

View File

@@ -1,18 +1,13 @@
package io.anuke.mindustry.world.blocks.types.production; package io.anuke.mindustry.world.blocks.types.production;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.resource.ItemStack; import io.anuke.mindustry.resource.ItemStack;
import io.anuke.mindustry.world.BlockBar;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.PowerAcceptor;
import io.anuke.mindustry.world.blocks.types.PowerBlock.PowerEntity; import io.anuke.mindustry.world.blocks.types.PowerBlock.PowerEntity;
import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;
public class PowerDrill extends Drill implements PowerAcceptor { public class PowerDrill extends Drill{
public float powerCapacity = 10f;
/**power use per frame.*/ /**power use per frame.*/
public float powerUse = 0.08f; public float powerUse = 0.08f;
@@ -21,7 +16,7 @@ public class PowerDrill extends Drill implements PowerAcceptor {
public PowerDrill(String name){ public PowerDrill(String name){
super(name); super(name);
bars.add(new BlockBar(Color.YELLOW, true, tile -> tile.<PowerEntity>entity().power / powerCapacity)); hasPower = true;
} }
@Override @Override
@@ -32,8 +27,8 @@ public class PowerDrill extends Drill implements PowerAcceptor {
float used = Math.min(powerUse * Timers.delta(), powerCapacity-0.1f); float used = Math.min(powerUse * Timers.delta(), powerCapacity-0.1f);
if(entity.power >= used){ if(entity.power.amount >= used){
entity.power -= used; entity.power.amount -= used;
} }
for(Tile other : tile.getLinkedTiles(tempTiles)){ for(Tile other : tile.getLinkedTiles(tempTiles)){
@@ -42,8 +37,8 @@ public class PowerDrill extends Drill implements PowerAcceptor {
} }
} }
if(toAdd.size > 0 && entity.power > powerUse && entity.timer.get(timerDrill, 60 * time) if(toAdd.size > 0 && entity.power.amount > powerUse && entity.timer.get(timerDrill, 60 * time)
&& tile.entity.totalItems() < capacity){ && tile.entity.inventory.totalItems() < itemCapacity){
for(ItemStack stack : toAdd) offloadNear(tile, stack.item); for(ItemStack stack : toAdd) offloadNear(tile, stack.item);
Effects.effect(drillEffect, tile.drawx(), tile.drawy()); Effects.effect(drillEffect, tile.drawx(), tile.drawy());
} }
@@ -53,35 +48,6 @@ public class PowerDrill extends Drill implements PowerAcceptor {
} }
} }
@Override
public boolean acceptsPower(Tile tile){
PowerEntity entity = tile.entity();
return entity.power + 0.001f <= powerCapacity;
}
@Override
public float addPower(Tile tile, float amount){
PowerEntity entity = tile.entity();
float canAccept = Math.min(powerCapacity - entity.power, amount);
entity.power += canAccept;
return canAccept;
}
@Override
public void setPower(Tile tile, float power){
PowerEntity entity = tile.entity();
entity.power = power;
}
@Override
public TileEntity getEntity() {
return new PowerEntity();
}
@Override @Override
protected boolean isValid(Tile tile){ protected boolean isValid(Tile tile){
return tile.floor().drops != null; return tile.floor().drops != null;

View File

@@ -1,7 +1,6 @@
package io.anuke.mindustry.world.blocks.types.production; package io.anuke.mindustry.world.blocks.types.production;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.graphics.Fx; import io.anuke.mindustry.graphics.Fx;
import io.anuke.mindustry.resource.Item; import io.anuke.mindustry.resource.Item;
@@ -45,35 +44,35 @@ public class PowerSmelter extends PowerBlock {
@Override @Override
public void init(){ public void init(){
for(ItemStack item : inputs){ for(ItemStack item : inputs){
bars.add(new BlockBar(Color.GREEN, true, tile -> (float)tile.entity.getItem(item.item)/capacity)); bars.add(new BlockBar(Color.GREEN, true, tile -> (float)tile.entity.inventory.getItem(item.item)/capacity));
} }
} }
@Override @Override
public void getStats(Array<String> list){ public void setStats(){
super.getStats(list); super.setStats();
list.add("[craftinfo]Input: " + Arrays.toString(inputs)); stats.add("input", Arrays.toString(inputs));
list.add("[craftinfo]Power drain/second: " + Strings.toFixed(powerDrain*60f, 2)); stats.add("powerdrainsecond", Strings.toFixed(powerDrain*60f, 2));
list.add("[craftinfo]Output: " + result); stats.add("output", result);
list.add("[craftinfo]Fuel Duration: " + Strings.toFixed(burnDuration/60f, 1)); stats.add("fuelduration", Strings.toFixed(burnDuration/60f, 1));
list.add("[craftinfo]Max output/second: " + Strings.toFixed(60f/craftTime, 1)); stats.add("maxoutputsecond", Strings.toFixed(60f/craftTime, 1));
list.add("[craftinfo]Input Capacity: " + capacity); stats.add("inputcapacity", capacity);
list.add("[craftinfo]Output Capacity: " + capacity); stats.add("outputcapacity", capacity);
} }
@Override @Override
public void update(Tile tile){ public void update(Tile tile){
PowerSmelterEntity entity = tile.entity(); PowerSmelterEntity entity = tile.entity();
if(entity.timer.get(timerDump, 5) && entity.hasItem(result)){ if(entity.timer.get(timerDump, 5) && entity.inventory.hasItem(result)){
tryDump(tile, result); tryDump(tile, result);
} }
float used = powerDrain * Timers.delta(); float used = powerDrain * Timers.delta();
//heat it up if there's enough power //heat it up if there's enough power
if(entity.power > used){ if(entity.power.amount > used){
entity.power -= used; entity.power.amount -= used;
entity.heat += 1f /heatUpTime; entity.heat += 1f /heatUpTime;
if(Mathf.chance(Timers.delta() * burnEffectChance)) Effects.effect(burnEffect, entity.x + Mathf.range(2f), entity.y + Mathf.range(2f)); if(Mathf.chance(Timers.delta() * burnEffectChance)) Effects.effect(burnEffect, entity.x + Mathf.range(2f), entity.y + Mathf.range(2f));
}else{ }else{
@@ -84,19 +83,19 @@ public class PowerSmelter extends PowerBlock {
//make sure it has all the items //make sure it has all the items
for(ItemStack item : inputs){ for(ItemStack item : inputs){
if(!entity.hasItem(item.item, item.amount)){ if(!entity.inventory.hasItem(item.item, item.amount)){
return; return;
} }
} }
if(entity.getItem(result) >= capacity //output full if(entity.inventory.getItem(result) >= capacity //output full
|| entity.heat <= minHeat //not burning || entity.heat <= minHeat //not burning
|| !entity.timer.get(timerCraft, craftTime)){ //not yet time || !entity.timer.get(timerCraft, craftTime)){ //not yet time
return; return;
} }
for(ItemStack item : inputs){ for(ItemStack item : inputs){
entity.removeItem(item.item, item.amount); entity.inventory.removeItem(item.item, item.amount);
} }
offloadNear(tile, result); offloadNear(tile, result);
@@ -114,7 +113,7 @@ public class PowerSmelter extends PowerBlock {
} }
} }
return (isInput && tile.entity.getItem(item) < capacity); return (isInput && tile.entity.inventory.getItem(item) < capacity);
} }
@Override @Override

View File

@@ -1,14 +1,12 @@
package io.anuke.mindustry.world.blocks.types.production; package io.anuke.mindustry.world.blocks.types.production;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.resource.Liquid; import io.anuke.mindustry.resource.Liquid;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Layer; import io.anuke.mindustry.world.Layer;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.LiquidBlock; import io.anuke.mindustry.world.blocks.types.LiquidBlock;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Strings; import io.anuke.ucore.util.Strings;
@@ -23,7 +21,7 @@ public class Pump extends LiquidBlock{
rotate = false; rotate = false;
solid = true; solid = true;
layer = Layer.overlay; layer = Layer.overlay;
flowfactor = 3f; liquidFlowFactor = 3f;
} }
@Override @Override
@@ -32,9 +30,9 @@ public class Pump extends LiquidBlock{
} }
@Override @Override
public void getStats(Array<String> list){ public void setStats(){
super.getStats(list); super.setStats();
list.add("[liquidinfo]Liquid/second: " + Strings.toFixed(60f*pumpAmount, 1)); stats.add("liquidsecond", Strings.toFixed(60f*pumpAmount, 1));
} }
@Override @Override
@@ -46,12 +44,8 @@ public class Pump extends LiquidBlock{
public void draw(Tile tile){ public void draw(Tile tile){
Draw.rect(name(), tile.worldx(), tile.worldy()); Draw.rect(name(), tile.worldx(), tile.worldy());
LiquidEntity entity = tile.entity(); Draw.color(tile.entity.liquid.liquid.color);
Draw.alpha(tile.entity.liquid.amount / liquidCapacity);
if(entity.liquid == null) return;
Draw.color(entity.liquid.color);
Draw.alpha(entity.liquidAmount / liquidCapacity);
Draw.rect("blank", tile.worldx(), tile.worldy(), 2, 2); Draw.rect("blank", tile.worldx(), tile.worldy(), 2, 2);
Draw.color(); Draw.color();
} }
@@ -70,15 +64,14 @@ public class Pump extends LiquidBlock{
@Override @Override
public void update(Tile tile){ public void update(Tile tile){
LiquidEntity entity = tile.entity();
if(tile.floor().liquidDrop != null){ if(tile.floor().liquidDrop != null){
float maxPump = Math.min(liquidCapacity - entity.liquidAmount, pumpAmount * Timers.delta()); float maxPump = Math.min(liquidCapacity - tile.entity.liquid.amount, pumpAmount * Timers.delta());
entity.liquid = tile.floor().liquidDrop; tile.entity.liquid.liquid = tile.floor().liquidDrop;
entity.liquidAmount += maxPump; tile.entity.liquid.amount += maxPump;
} }
if(entity.timer.get(timerDump, 1)){ if(tile.entity.timer.get(timerDump, 1)){
tryDumpLiquid(tile); tryDumpLiquid(tile);
} }
} }

View File

@@ -1,7 +1,6 @@
package io.anuke.mindustry.world.blocks.types.production; package io.anuke.mindustry.world.blocks.types.production;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.graphics.Fx; import io.anuke.mindustry.graphics.Fx;
import io.anuke.mindustry.resource.Item; import io.anuke.mindustry.resource.Item;
@@ -40,33 +39,33 @@ public class Smelter extends Block{
@Override @Override
public void init(){ public void init(){
for(Item item : inputs){ for(Item item : inputs){
bars.add(new BlockBar(Color.GREEN, true, tile -> (float)tile.entity.getItem(item)/capacity)); bars.add(new BlockBar(Color.GREEN, true, tile -> (float)tile.entity.inventory.getItem(item)/capacity));
} }
} }
@Override @Override
public void getStats(Array<String> list){ public void setStats(){
super.getStats(list); super.setStats();
list.add("[craftinfo]Input: " + Arrays.toString(inputs)); stats.add("input", Arrays.toString(inputs));
list.add("[craftinfo]Fuel: " + fuel); stats.add("fuel", fuel);
list.add("[craftinfo]Output: " + result); stats.add("output", result);
list.add("[craftinfo]Fuel Duration: " + Strings.toFixed(burnDuration/60f, 1)); stats.add("fuelduration", Strings.toFixed(burnDuration/60f, 1));
list.add("[craftinfo]Max output/second: " + Strings.toFixed(60f/craftTime, 1)); stats.add("maxoutputsecond", Strings.toFixed(60f/craftTime, 1));
list.add("[craftinfo]Input Capacity: " + capacity); stats.add("input capacity", capacity);
list.add("[craftinfo]Output Capacity: " + capacity); stats.add("outputcapacity", capacity);
} }
@Override @Override
public void update(Tile tile){ public void update(Tile tile){
CrafterEntity entity = tile.entity(); CrafterEntity entity = tile.entity();
if(entity.timer.get(timerDump, 5) && entity.hasItem(result)){ if(entity.timer.get(timerDump, 5) && entity.inventory.hasItem(result)){
tryDump(tile, result); tryDump(tile, result);
} }
//add fuel //add fuel
if(entity.getItem(fuel) > 0 && entity.burnTime <= 0f){ if(entity.inventory.getItem(fuel) > 0 && entity.burnTime <= 0f){
entity.removeItem(fuel, 1); entity.inventory.removeItem(fuel, 1);
entity.burnTime += burnDuration; entity.burnTime += burnDuration;
Effects.effect(burnEffect, entity.x + Mathf.range(2f), entity.y + Mathf.range(2f)); Effects.effect(burnEffect, entity.x + Mathf.range(2f), entity.y + Mathf.range(2f));
} }
@@ -78,19 +77,19 @@ public class Smelter extends Block{
//make sure it has all the items //make sure it has all the items
for(Item item : inputs){ for(Item item : inputs){
if(!entity.hasItem(item)){ if(!entity.inventory.hasItem(item)){
return; return;
} }
} }
if(entity.getItem(result) >= capacity //output full if(entity.inventory.getItem(result) >= capacity //output full
|| entity.burnTime <= 0 //not burning || entity.burnTime <= 0 //not burning
|| !entity.timer.get(timerCraft, craftTime)){ //not yet time || !entity.timer.get(timerCraft, craftTime)){ //not yet time
return; return;
} }
for(Item item : inputs){ for(Item item : inputs){
entity.removeItem(item, 1); entity.inventory.removeItem(item, 1);
} }
offloadNear(tile, result); offloadNear(tile, result);
@@ -108,7 +107,7 @@ public class Smelter extends Block{
} }
} }
return (isInput && tile.entity.getItem(item) < capacity) || (item == fuel && tile.entity.getItem(fuel) < capacity); return (isInput && tile.entity.inventory.getItem(item) < capacity) || (item == fuel && tile.entity.inventory.getItem(fuel) < capacity);
} }
@Override @Override

View File

@@ -31,6 +31,6 @@ public class CoreBlock extends StorageBlock {
@Override @Override
public boolean acceptItem(Item item, Tile tile, Tile source){ public boolean acceptItem(Item item, Tile tile, Tile source){
return item.material && tile.entity.getItem(item) < capacity; return item.material && tile.entity.inventory.getItem(item) < capacity;
} }
} }

View File

@@ -14,9 +14,9 @@ public abstract class StorageBlock extends Block {
/**Removes any one item and returns it. Returns null if no items are there.*/ /**Removes any one item and returns it. Returns null if no items are there.*/
public Item removeItem(Tile tile){ public Item removeItem(Tile tile){
TileEntity entity = tile.entity; TileEntity entity = tile.entity;
for(int i = 0; i < entity.items.length; i ++){ for(int i = 0; i < entity.inventory.items.length; i ++){
if(entity.items[i] > 0){ if(entity.inventory.items[i] > 0){
entity.items[i] --; entity.inventory.items[i] --;
return Item.getByID(i); return Item.getByID(i);
} }
} }

View File

@@ -16,16 +16,16 @@ public class Unloader extends Block {
@Override @Override
public void update(Tile tile){ public void update(Tile tile){
if(tile.entity.totalItems() == 0 && tile.entity.timer.get(timerUnload, 5)){ if(tile.entity.inventory.totalItems() == 0 && tile.entity.timer.get(timerUnload, 5)){
tile.allNearby(other -> { tile.allNearby(other -> {
if(tile.entity.totalItems() == 0 && other.block() instanceof StorageBlock && if(other.block() instanceof StorageBlock && tile.entity.inventory.totalItems() == 0 &&
other.entity.totalItems() > 0){ other.entity.inventory.totalItems() > 0){
offloadNear(tile, ((StorageBlock)other.block()).removeItem(other)); offloadNear(tile, ((StorageBlock)other.block()).removeItem(other));
} }
}); });
} }
if(tile.entity.totalItems() > 0){ if(tile.entity.inventory.totalItems() > 0){
tryDump(tile); tryDump(tile);
} }
} }

View File

@@ -1,7 +1,6 @@
package io.anuke.mindustry.world.blocks.types.storage; package io.anuke.mindustry.world.blocks.types.storage;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.resource.Item; import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.world.BlockBar; import io.anuke.mindustry.world.BlockBar;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
@@ -14,13 +13,7 @@ public class Vault extends StorageBlock {
super(name); super(name);
solid = true; solid = true;
update = true; update = true;
bars.add(new BlockBar(Color.GREEN, true, tile -> (float)tile.entity.totalItems()/capacity)); bars.add(new BlockBar(Color.GREEN, true, tile -> (float)tile.entity.inventory.totalItems()/capacity));
}
@Override
public void getStats(Array<String> list){
super.getStats(list);
list.add("[iteminfo]Capacity: " + capacity);
} }
@Override @Override
@@ -28,7 +21,7 @@ public class Vault extends StorageBlock {
int iterations = Math.max(1, (int) (Timers.delta() + 0.4f)); int iterations = Math.max(1, (int) (Timers.delta() + 0.4f));
for(int i = 0; i < iterations; i ++) { for(int i = 0; i < iterations; i ++) {
if (tile.entity.totalItems() > 0) { if (tile.entity.inventory.totalItems() > 0) {
tryDump(tile); tryDump(tile);
} }
} }
@@ -42,7 +35,7 @@ public class Vault extends StorageBlock {
@Override @Override
public boolean acceptItem(Item item, Tile tile, Tile source) { public boolean acceptItem(Item item, Tile tile, Tile source) {
return tile.entity.totalItems() < capacity; return tile.entity.inventory.totalItems() < capacity;
} }
@Override @Override