Massive amount of bugfixes / Multi-liquid support / Broken build
This commit is contained in:
@@ -12,13 +12,6 @@ public class Liquids implements ContentList {
|
||||
@Override
|
||||
public void load() {
|
||||
|
||||
none = new Liquid("none", Color.CLEAR){
|
||||
@Override
|
||||
public boolean isHidden(){
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
water = new Liquid("water", Color.valueOf("486acd")) {
|
||||
{
|
||||
heatCapacity = 0.4f;
|
||||
|
||||
@@ -145,17 +145,14 @@ public class Blocks extends BlockList implements ContentList{
|
||||
|
||||
rock = new Rock("rock") {{
|
||||
variants = 2;
|
||||
varyShadow = true;
|
||||
}};
|
||||
|
||||
icerock = new Rock("icerock") {{
|
||||
variants = 2;
|
||||
varyShadow = true;
|
||||
}};
|
||||
|
||||
blackrock = new Rock("blackrock") {{
|
||||
variants = 1;
|
||||
varyShadow = true;
|
||||
}};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ public class DebugBlocks extends BlockList implements ContentList{
|
||||
@Override
|
||||
public void update(Tile tile) {
|
||||
SorterEntity entity = tile.entity();
|
||||
entity.items.items[entity.sortItem.id] = 1;
|
||||
entity.items.set(entity.sortItem, 1);
|
||||
tryDump(tile, entity.sortItem);
|
||||
}
|
||||
|
||||
@@ -79,9 +79,8 @@ public class DebugBlocks extends BlockList implements ContentList{
|
||||
public void update(Tile tile) {
|
||||
LiquidSourceEntity entity = tile.entity();
|
||||
|
||||
tile.entity.liquids.amount = liquidCapacity;
|
||||
tile.entity.liquids.liquid = entity.source;
|
||||
tryDumpLiquid(tile);
|
||||
tile.entity.liquids.add(entity.source, liquidCapacity);
|
||||
tryDumpLiquid(tile, entity.source);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -35,11 +35,11 @@ public class DefenseBlocks extends BlockList implements ContentList {
|
||||
}};
|
||||
|
||||
thoriumWall = new Wall("thorium-wall") {{
|
||||
health = 110 * wallHealthMultiplier;
|
||||
health = 200 * wallHealthMultiplier;
|
||||
}};
|
||||
|
||||
thoriumWallLarge = new Wall("thorium-wall-large") {{
|
||||
health = 110 * wallHealthMultiplier*4;
|
||||
health = 200 * wallHealthMultiplier*4;
|
||||
size = 2;
|
||||
}};
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@ public class StorageBlocks extends BlockList implements ContentList {
|
||||
vault = new Vault("vault") {{
|
||||
size = 3;
|
||||
health = 600;
|
||||
itemCapacity = 2000;
|
||||
}};
|
||||
|
||||
unloader = new Unloader("unloader") {{
|
||||
|
||||
@@ -73,10 +73,10 @@ public class TurretBlocks extends BlockList implements ContentList {
|
||||
health = 360;
|
||||
|
||||
drawer = (tile, entity) -> {
|
||||
Draw.rect(name, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90);
|
||||
Draw.rect(region, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90);
|
||||
|
||||
Draw.color(entity.liquids.liquid.color);
|
||||
Draw.alpha(entity.liquids.amount / liquidCapacity);
|
||||
Draw.color(entity.liquids.current().color);
|
||||
Draw.alpha(entity.liquids.total() / liquidCapacity);
|
||||
Draw.rect(name + "-liquid", tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90);
|
||||
Draw.color();
|
||||
};
|
||||
@@ -145,7 +145,7 @@ public class TurretBlocks extends BlockList implements ContentList {
|
||||
ammoUseEffect = ShootFx.shellEjectBig;
|
||||
|
||||
drawer = (tile, entity) -> {
|
||||
Draw.rect(name, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90);
|
||||
Draw.rect(region, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90);
|
||||
float offsetx = (int) (Mathf.abscurve(Mathf.curve(entity.reload / reload, 0.3f, 0.2f)) * 3f);
|
||||
float offsety = -(int) (Mathf.abscurve(Mathf.curve(entity.reload / reload, 0.3f, 0.2f)) * 2f);
|
||||
|
||||
|
||||
@@ -20,7 +20,6 @@ import io.anuke.mindustry.input.MobileInput;
|
||||
import io.anuke.mindustry.io.Map;
|
||||
import io.anuke.mindustry.io.Saves;
|
||||
import io.anuke.mindustry.net.Net;
|
||||
import io.anuke.mindustry.type.Item;
|
||||
import io.anuke.mindustry.type.Recipe;
|
||||
import io.anuke.mindustry.ui.dialogs.FloatingDialog;
|
||||
import io.anuke.ucore.core.*;
|
||||
@@ -264,11 +263,7 @@ public class Control extends Module{
|
||||
|
||||
if(entity == null) return;
|
||||
|
||||
for (int i = 0; i < entity.items.items.length; i++) {
|
||||
if(entity.items.items[i] <= 0) continue;
|
||||
Item item = Item.getByID(i);
|
||||
control.database().unlockContent(item);
|
||||
}
|
||||
entity.items.forEach((item, amount) -> control.database().unlockContent(item));
|
||||
|
||||
if(players[0].inventory.hasItem()){
|
||||
control.database().unlockContent(players[0].inventory.getItem().item);
|
||||
@@ -276,7 +271,7 @@ public class Control extends Module{
|
||||
|
||||
for(int i = 0 ; i < Recipe.all().size; i ++){
|
||||
Recipe recipe = Recipe.all().get(i);
|
||||
if(!recipe.debugOnly && entity.items.hasItems(recipe.requirements, 1.4f)){
|
||||
if(!recipe.debugOnly && entity.items.has(recipe.requirements, 1.4f)){
|
||||
if(control.database().unlockContent(recipe)){
|
||||
ui.hudfrag.showUnlock(recipe);
|
||||
}
|
||||
|
||||
@@ -54,12 +54,12 @@ public class Logic extends Module {
|
||||
if(debug) {
|
||||
for (Item item : Item.all()) {
|
||||
if (item.type == ItemType.material) {
|
||||
tile.entity.items.addItem(item, 1000);
|
||||
tile.entity.items.add(item, 1000);
|
||||
}
|
||||
}
|
||||
}else{
|
||||
tile.entity.items.addItem(Items.tungsten, 50);
|
||||
tile.entity.items.addItem(Items.lead, 20);
|
||||
tile.entity.items.add(Items.tungsten, 50);
|
||||
tile.entity.items.add(Items.lead, 20);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -158,13 +158,6 @@ public class Logic extends Module {
|
||||
for(EntityGroup group : unitGroups){
|
||||
if(!group.isEmpty()){
|
||||
EntityPhysics.collideGroups(bulletGroup, group);
|
||||
|
||||
/*
|
||||
for(EntityGroup other : unitGroups){
|
||||
if(!other.isEmpty()){
|
||||
EntityPhysics.collideGroups(group, other);
|
||||
}
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ import com.badlogic.gdx.utils.Queue;
|
||||
import io.anuke.annotations.Annotations.Loc;
|
||||
import io.anuke.annotations.Annotations.Remote;
|
||||
import io.anuke.mindustry.Vars;
|
||||
import io.anuke.mindustry.content.Mechs;
|
||||
import io.anuke.mindustry.entities.effect.ItemDrop;
|
||||
import io.anuke.mindustry.entities.effect.ScorchDecal;
|
||||
import io.anuke.mindustry.entities.traits.*;
|
||||
@@ -660,6 +661,8 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
|
||||
dead = true;
|
||||
trail.clear();
|
||||
health = maxHealth();
|
||||
mech = (mobile ? Mechs.starterMobile : Mechs.starterDesktop);
|
||||
placeQueue.clear();
|
||||
|
||||
add();
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package io.anuke.mindustry.entities;
|
||||
|
||||
import com.badlogic.gdx.math.Vector2;
|
||||
import com.badlogic.gdx.utils.Array;
|
||||
import io.anuke.annotations.Annotations.Loc;
|
||||
import io.anuke.annotations.Annotations.Remote;
|
||||
import io.anuke.mindustry.content.fx.Fx;
|
||||
@@ -10,11 +11,12 @@ import io.anuke.mindustry.game.Team;
|
||||
import io.anuke.mindustry.gen.CallBlocks;
|
||||
import io.anuke.mindustry.net.In;
|
||||
import io.anuke.mindustry.world.Block;
|
||||
import io.anuke.mindustry.world.consumers.Consume;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
import io.anuke.mindustry.world.blocks.Wall;
|
||||
import io.anuke.mindustry.world.blocks.modules.InventoryModule;
|
||||
import io.anuke.mindustry.world.blocks.modules.LiquidModule;
|
||||
import io.anuke.mindustry.world.blocks.modules.PowerModule;
|
||||
import io.anuke.mindustry.world.modules.InventoryModule;
|
||||
import io.anuke.mindustry.world.modules.LiquidModule;
|
||||
import io.anuke.mindustry.world.modules.PowerModule;
|
||||
import io.anuke.ucore.core.Effects;
|
||||
import io.anuke.ucore.core.Timers;
|
||||
import io.anuke.ucore.entities.EntityGroup;
|
||||
@@ -42,6 +44,8 @@ public class TileEntity extends BaseEntity implements TargetTrait {
|
||||
public InventoryModule items;
|
||||
public LiquidModule liquids;
|
||||
|
||||
public Array<Consume> consumers = new Array<>();
|
||||
|
||||
private boolean dead = false;
|
||||
private boolean sleeping;
|
||||
private float sleepTime;
|
||||
@@ -55,14 +59,10 @@ public class TileEntity extends BaseEntity implements TargetTrait {
|
||||
health = tile.block().health;
|
||||
|
||||
timer = new Timer(tile.block().timers);
|
||||
tile.block().setConsumers(consumers);
|
||||
|
||||
if(added){
|
||||
//if(!tile.block().autoSleep) { //TODO only autosleep when creating a fresh block!
|
||||
add();
|
||||
/*}else{
|
||||
sleeping = true;
|
||||
sleepingEntities ++;
|
||||
}*/
|
||||
add();
|
||||
}
|
||||
|
||||
return this;
|
||||
@@ -160,6 +160,9 @@ public class TileEntity extends BaseEntity implements TargetTrait {
|
||||
}
|
||||
|
||||
tile.block().update(tile);
|
||||
for(Consume cons : consumers){
|
||||
cons.update(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -197,6 +197,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
|
||||
}
|
||||
|
||||
public void avoidOthers(float avoidRange){
|
||||
if(Net.client()) return;
|
||||
|
||||
EntityPhysics.getNearby(getGroup(), x, y, avoidRange*2f, t -> {
|
||||
if(t == this || (t instanceof Unit && (((Unit) t).isDead() || (((Unit) t).isFlying() != isFlying()) || ((Unit) t).getCarrier() == this) || getCarrier() == t)) return;
|
||||
|
||||
@@ -57,7 +57,7 @@ public class ItemTransfer extends TimedEntity implements DrawTrait{
|
||||
for (int i = 0; i < Mathf.clamp(amount/3, 1, 8); i++) {
|
||||
Timers.run(i*3, () -> create(item, x, y, tile, () -> {}));
|
||||
}
|
||||
tile.entity.items.addItem(item, amount);
|
||||
tile.entity.items.add(item, amount);
|
||||
}
|
||||
|
||||
public static void create(Item item, float fromx, float fromy, PosTrait to, Runnable done){
|
||||
|
||||
@@ -181,7 +181,7 @@ public class Drone extends FlyingUnit implements BuilderTrait {
|
||||
if(entity == null){
|
||||
return;
|
||||
}
|
||||
targetItem = Mathf.findMin(toMine, (a, b) -> -Integer.compare(entity.items.getItem(a), entity.items.getItem(b)));
|
||||
targetItem = Mathf.findMin(toMine, (a, b) -> -Integer.compare(entity.items.get(a), entity.items.get(b)));
|
||||
}
|
||||
|
||||
protected boolean findItemDrop(){
|
||||
@@ -247,7 +247,7 @@ public class Drone extends FlyingUnit implements BuilderTrait {
|
||||
|
||||
//if it's missing requirements, try and mine them
|
||||
for(ItemStack stack : entity.recipe.requirements){
|
||||
if(!core.items.hasItem(stack.item, stack.amount) && toMine.contains(stack.item)){
|
||||
if(!core.items.has(stack.item, stack.amount) && toMine.contains(stack.item)){
|
||||
targetItem = stack.item;
|
||||
getPlaceQueue().clear();
|
||||
setState(mine);
|
||||
|
||||
@@ -32,7 +32,6 @@ public class DefaultKeybinds {
|
||||
"menu", Gdx.app.getType() == ApplicationType.Android ? Input.BACK : Input.ESCAPE,
|
||||
"pause", Input.SPACE,
|
||||
"toggle_menus", Input.C,
|
||||
"item_withdraw", Input.SHIFT_LEFT,
|
||||
new Category("Multiplayer"),
|
||||
"player_list", Input.TAB,
|
||||
"chat", Input.ENTER,
|
||||
|
||||
@@ -129,7 +129,7 @@ public abstract class InputHandler extends InputAdapter{
|
||||
//consume tap event if necessary
|
||||
if(tile.getTeam() == player.getTeam() && tile.block().consumesTap){
|
||||
consumed = true;
|
||||
}else if(tile.getTeam() == player.getTeam() && tile.block().synthetic() && tile.block().hasItems && !consumed){
|
||||
}else if(tile.getTeam() == player.getTeam() && tile.block().synthetic() && tile.block().hasItems && tile.entity.items.total() > 0 && !consumed){
|
||||
frag.inv.showFor(tile);
|
||||
consumed = true;
|
||||
showedInventory = true;
|
||||
|
||||
@@ -16,7 +16,6 @@ import io.anuke.mindustry.type.Item;
|
||||
import io.anuke.mindustry.ui.ItemImage;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
import io.anuke.ucore.core.Graphics;
|
||||
import io.anuke.ucore.core.Inputs;
|
||||
import io.anuke.ucore.core.Timers;
|
||||
import io.anuke.ucore.function.BooleanProvider;
|
||||
import io.anuke.ucore.scene.Group;
|
||||
@@ -29,9 +28,7 @@ import io.anuke.ucore.scene.ui.layout.Table;
|
||||
import io.anuke.ucore.util.Mathf;
|
||||
import io.anuke.ucore.util.Strings;
|
||||
|
||||
import static io.anuke.mindustry.Vars.mobile;
|
||||
import static io.anuke.mindustry.Vars.state;
|
||||
import static io.anuke.mindustry.Vars.tilesize;
|
||||
import static io.anuke.mindustry.Vars.*;
|
||||
|
||||
public class BlockInventoryFragment extends Fragment {
|
||||
private final static float holdWithdraw = 40f;
|
||||
@@ -58,7 +55,7 @@ public class BlockInventoryFragment extends Fragment {
|
||||
|
||||
public void showFor(Tile t){
|
||||
this.tile = t.target();
|
||||
if(tile == null || tile.entity == null || !tile.block().isAccessible() || tile.entity.items.totalItems() == 0) return;
|
||||
if(tile == null || tile.entity == null || !tile.block().isAccessible() || tile.entity.items.total() == 0) return;
|
||||
rebuild(true);
|
||||
}
|
||||
|
||||
@@ -80,14 +77,14 @@ public class BlockInventoryFragment extends Fragment {
|
||||
table.background("inventory");
|
||||
table.setTouchable(Touchable.enabled);
|
||||
table.update(() -> {
|
||||
if(tile == null || tile.entity == null || !tile.block().isAccessible() || tile.entity.items.totalItems() == 0){
|
||||
if(tile == null || tile.entity == null || !tile.block().isAccessible() || tile.entity.items.total() == 0){
|
||||
hide();
|
||||
}else{
|
||||
if(holding && lastItem != null){
|
||||
holdTime += Timers.delta();
|
||||
|
||||
if(holdTime >= holdWithdraw){
|
||||
int amount = Math.min(tile.entity.items.getItem(lastItem), player.inventory.itemCapacityUsed(lastItem));
|
||||
int amount = Math.min(tile.entity.items.get(lastItem), player.inventory.itemCapacityUsed(lastItem));
|
||||
CallBlocks.requestItem(player, tile, lastItem, amount);
|
||||
holding = false;
|
||||
holdTime = 0f;
|
||||
@@ -96,9 +93,8 @@ public class BlockInventoryFragment extends Fragment {
|
||||
|
||||
updateTablePosition();
|
||||
if(tile.block().hasItems) {
|
||||
int[] items = tile.entity.items.items;
|
||||
for (int i = 0; i < items.length; i++) {
|
||||
if ((items[i] == 0) == container.contains(i)) {
|
||||
for (int i = 0; i < Item.all().size; i++) {
|
||||
if ((tile.entity.items.has(Item.getByID(i))) == container.contains(i)) {
|
||||
rebuild(false);
|
||||
}
|
||||
}
|
||||
@@ -113,12 +109,10 @@ public class BlockInventoryFragment extends Fragment {
|
||||
table.defaults().size(mobile ? 16*3 : 16*2).space(6f);
|
||||
|
||||
if(tile.block().hasItems) {
|
||||
int[] items = tile.entity.items.items;
|
||||
|
||||
for (int i = 0; i < items.length; i++) {
|
||||
final int f = i;
|
||||
if (items[i] == 0) continue;
|
||||
for (int i = 0; i < Item.all().size; i++) {
|
||||
Item item = Item.getByID(i);
|
||||
if (!tile.entity.items.has(item)) continue;
|
||||
|
||||
container.add(i);
|
||||
|
||||
@@ -127,14 +121,14 @@ public class BlockInventoryFragment extends Fragment {
|
||||
HandCursorListener l = new HandCursorListener();
|
||||
l.setEnabled(canPick);
|
||||
|
||||
ItemImage image = new ItemImage(item.region, () -> round(items[f]));
|
||||
ItemImage image = new ItemImage(item.region, () -> round(tile.entity.items.get(item)));
|
||||
image.addListener(l);
|
||||
|
||||
image.addListener(new InputListener(){
|
||||
@Override
|
||||
public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
|
||||
if(!canPick.get() || items[f] == 0) return false;
|
||||
int amount = Math.min(Inputs.keyDown("item_withdraw") ? items[f] : 1, player.inventory.itemCapacityUsed(item));
|
||||
if(!canPick.get() || !tile.entity.items.has(item)) return false;
|
||||
int amount = Math.min(1, player.inventory.itemCapacityUsed(item));
|
||||
CallBlocks.requestItem(player, tile, item, amount);
|
||||
lastItem = item;
|
||||
holding = true;
|
||||
|
||||
@@ -244,7 +244,7 @@ public class BlocksFragment extends Fragment{
|
||||
if(entity == null) return;
|
||||
|
||||
for(ItemStack s : r.requirements){
|
||||
if(!entity.items.hasItem(s.item, Mathf.ceil(s.amount))){
|
||||
if(!entity.items.has(s.item, Mathf.ceil(s.amount))){
|
||||
istack.setColor(Color.GRAY);
|
||||
return;
|
||||
}
|
||||
@@ -328,7 +328,7 @@ public class BlocksFragment extends Fragment{
|
||||
TileEntity core = players[0].getClosestCore();
|
||||
if(core == null) return "*/*";
|
||||
|
||||
int amount = core.items.getItem(stack.item);
|
||||
int amount = core.items.get(stack.item);
|
||||
String color = (amount < stack.amount/2f ? "[red]" : amount < stack.amount ? "[orange]" : "[white]");
|
||||
|
||||
return color + format(amount) + "[white]/" + stack.amount;
|
||||
|
||||
@@ -31,20 +31,20 @@ public abstract class BaseBlock {
|
||||
}
|
||||
|
||||
public int getMaximumAccepted(Tile tile, Item item){
|
||||
return itemCapacity - tile.entity.items.totalItems();
|
||||
return itemCapacity - tile.entity.items.total();
|
||||
}
|
||||
|
||||
/**Remove a stack from this inventory, and return the amount removed.*/
|
||||
public int removeStack(Tile tile, Item item, int amount){
|
||||
tile.entity.wakeUp();
|
||||
tile.entity.items.removeItem(item, amount);
|
||||
tile.entity.items.remove(item, amount);
|
||||
return amount;
|
||||
}
|
||||
|
||||
/**Handle a stack input.*/
|
||||
public void handleStack(Item item, int amount, Tile tile, Unit source){
|
||||
tile.entity.wakeUp();
|
||||
tile.entity.items.addItem(item, amount);
|
||||
tile.entity.items.add(item, amount);
|
||||
}
|
||||
|
||||
/**Returns offset for stack placement.*/
|
||||
@@ -53,7 +53,7 @@ public abstract class BaseBlock {
|
||||
}
|
||||
|
||||
public void handleItem(Item item, Tile tile, Tile source){
|
||||
tile.entity.items.addItem(item, 1);
|
||||
tile.entity.items.add(item, 1);
|
||||
}
|
||||
|
||||
public boolean acceptItem(Item item, Tile tile, Tile source){
|
||||
@@ -61,17 +61,11 @@ public abstract class BaseBlock {
|
||||
}
|
||||
|
||||
public boolean acceptLiquid(Tile tile, Tile source, Liquid liquid, float amount){
|
||||
return tile.entity.liquids.amount + amount < liquidCapacity
|
||||
&& (tile.entity.liquids.liquid == liquid || tile.entity.liquids.amount <= 0.1f);
|
||||
}
|
||||
|
||||
public float handleAuxLiquid(Tile tile, Tile source, Liquid liquid, float amount){
|
||||
return 0f;
|
||||
return tile.entity.liquids.get(liquid) + amount < liquidCapacity;
|
||||
}
|
||||
|
||||
public void handleLiquid(Tile tile, Tile source, Liquid liquid, float amount){
|
||||
tile.entity.liquids.liquid = liquid;
|
||||
tile.entity.liquids.amount += amount;
|
||||
tile.entity.liquids.add(liquid, amount);
|
||||
}
|
||||
|
||||
public boolean acceptPower(Tile tile, Tile source, float amount){
|
||||
@@ -87,9 +81,7 @@ public abstract class BaseBlock {
|
||||
return canAccept;
|
||||
}
|
||||
|
||||
public void tryDumpLiquid(Tile tile){
|
||||
if(tile.entity.liquids.amount < 0.001f) return;
|
||||
|
||||
public void tryDumpLiquid(Tile tile, Liquid liquid){
|
||||
int size = tile.block().size;
|
||||
|
||||
GridPoint2[] nearby = Edges.getEdges(size);
|
||||
@@ -102,10 +94,10 @@ public abstract class BaseBlock {
|
||||
if(other != null) other = other.target();
|
||||
|
||||
if (other != null && other.block().hasLiquids) {
|
||||
float ofract = other.entity.liquids.amount / other.block().liquidCapacity;
|
||||
float fract = tile.entity.liquids.amount / liquidCapacity;
|
||||
float ofract = other.entity.liquids.get(liquid) / other.block().liquidCapacity;
|
||||
float fract = tile.entity.liquids.get(liquid) / liquidCapacity;
|
||||
|
||||
if(ofract < fract) tryMoveLiquid(tile, in, other, (fract - ofract) * liquidCapacity / 2f);
|
||||
if(ofract < fract) tryMoveLiquid(tile, in, other, (fract - ofract) * liquidCapacity / 2f, liquid);
|
||||
}
|
||||
|
||||
i = (byte) ((i + 1) % nearby.length);
|
||||
@@ -113,35 +105,34 @@ public abstract class BaseBlock {
|
||||
|
||||
}
|
||||
|
||||
public void tryMoveLiquid(Tile tile, Tile tileSource, Tile next, float amount){
|
||||
float flow = Math.min(next.block().liquidCapacity - next.entity.liquids.amount - 0.001f, amount);
|
||||
public void tryMoveLiquid(Tile tile, Tile tileSource, Tile next, float amount, Liquid liquid){
|
||||
float flow = Math.min(next.block().liquidCapacity - next.entity.liquids.get(liquid) - 0.001f, amount);
|
||||
|
||||
if(next.block().acceptLiquid(next, tileSource, tile.entity.liquids.liquid, flow)){
|
||||
next.block().handleLiquid(next, tileSource, tile.entity.liquids.liquid, flow);
|
||||
tile.entity.liquids.amount -= flow;
|
||||
if(next.block().acceptLiquid(next, tileSource, liquid, flow)){
|
||||
next.block().handleLiquid(next, tileSource, liquid, flow);
|
||||
tile.entity.liquids.remove(liquid, flow);
|
||||
}
|
||||
}
|
||||
|
||||
public float tryMoveLiquid(Tile tile, Tile next, boolean leak){
|
||||
public float tryMoveLiquid(Tile tile, Tile next, boolean leak, Liquid liquid){
|
||||
if(next == null) return 0;
|
||||
|
||||
next = next.target();
|
||||
|
||||
if(next.block().hasLiquids && tile.entity.liquids.amount > 0f){
|
||||
if(next.block().hasLiquids && tile.entity.liquids.get(liquid) > 0f){
|
||||
|
||||
if((next.entity.liquids.liquid == tile.entity.liquids.liquid || next.entity.liquids.amount <= 0.01f) &&
|
||||
next.block().acceptLiquid(next, tile, tile.entity.liquids.liquid, 0f)) {
|
||||
float ofract = next.entity.liquids.amount / next.block().liquidCapacity;
|
||||
float fract = tile.entity.liquids.amount / liquidCapacity;
|
||||
float flow = Math.min(Mathf.clamp((fract - ofract) * (1f)) * (liquidCapacity), tile.entity.liquids.amount);
|
||||
flow = Math.min(flow, next.block().liquidCapacity - next.entity.liquids.amount - 0.001f);
|
||||
if(next.block().acceptLiquid(next, tile, liquid, 0f)) {
|
||||
float ofract = next.entity.liquids.get(liquid) / next.block().liquidCapacity;
|
||||
float fract = tile.entity.liquids.get(liquid) / liquidCapacity;
|
||||
float flow = Math.min(Mathf.clamp((fract - ofract) * (1f)) * (liquidCapacity), tile.entity.liquids.get(liquid));
|
||||
flow = Math.min(flow, next.block().liquidCapacity - next.entity.liquids.get(liquid) - 0.001f);
|
||||
|
||||
if (flow > 0f && ofract <= fract && next.block().acceptLiquid(next, tile, tile.entity.liquids.liquid, flow)) {
|
||||
next.block().handleLiquid(next, tile, tile.entity.liquids.liquid, flow);
|
||||
tile.entity.liquids.amount -= flow;
|
||||
if (flow > 0f && ofract <= fract && next.block().acceptLiquid(next, tile, liquid, flow)) {
|
||||
next.block().handleLiquid(next, tile, liquid, flow);
|
||||
tile.entity.liquids.remove(liquid, flow);
|
||||
return flow;
|
||||
} else if (ofract > 0.1f && fract > 0.1f) {
|
||||
Liquid liquid = tile.entity.liquids.liquid, other = next.entity.liquids.liquid;
|
||||
Liquid other = next.entity.liquids.current();
|
||||
if ((other.flammability > 0.3f && liquid.temperature > 0.7f) ||
|
||||
(liquid.flammability > 0.3f && other.temperature > 0.7f)) {
|
||||
tile.entity.damage(1 * Timers.delta());
|
||||
@@ -151,20 +142,17 @@ public abstract class BaseBlock {
|
||||
}
|
||||
} else if ((liquid.temperature > 0.7f && other.temperature < 0.55f) ||
|
||||
(other.temperature > 0.7f && liquid.temperature < 0.55f)) {
|
||||
tile.entity.liquids.amount -= Math.min(tile.entity.liquids.amount, 0.7f * Timers.delta());
|
||||
tile.entity.liquids.remove(liquid, Math.min(tile.entity.liquids.get(liquid), 0.7f * Timers.delta()));
|
||||
if (Mathf.chance(0.2f * Timers.delta())) {
|
||||
Effects.effect(EnvironmentFx.steam, (tile.worldx() + next.worldx()) / 2f, (tile.worldy() + next.worldy()) / 2f);
|
||||
}
|
||||
}
|
||||
}
|
||||
}else{
|
||||
float accepted = next.block().handleAuxLiquid(next, tile, tile.entity.liquids.liquid, tile.entity.liquids.amount);
|
||||
tile.entity.liquids.amount -= accepted;
|
||||
}
|
||||
}else if(leak && !next.block().solid && !next.block().hasLiquids){
|
||||
float leakAmount = Math.min(tile.entity.liquids.amount, tile.entity.liquids.amount/1.5f);
|
||||
Puddle.deposit(next, tile, tile.entity.liquids.liquid, leakAmount);
|
||||
tile.entity.liquids.amount -= leakAmount;
|
||||
float leakAmount = tile.entity.liquids.get(liquid)/1.5f;
|
||||
Puddle.deposit(next, tile, liquid, leakAmount);
|
||||
tile.entity.liquids.remove(liquid, leakAmount);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -198,7 +186,7 @@ public abstract class BaseBlock {
|
||||
|
||||
/**Try dumping a specific item near the tile.*/
|
||||
public boolean tryDump(Tile tile, Item todump){
|
||||
if(tile.entity == null || !hasItems) return false;
|
||||
if(tile.entity == null || !hasItems || tile.entity.items.total() == 0) return false;
|
||||
|
||||
int size = tile.block().size;
|
||||
|
||||
@@ -216,9 +204,9 @@ public abstract class BaseBlock {
|
||||
|
||||
if(todump != null && item != todump) continue;
|
||||
|
||||
if(tile.entity.items.hasItem(item) && other != null && other.block().acceptItem(item, other, in) && canDump(tile, other, item)){
|
||||
if(tile.entity.items.has(item) && other != null && other.block().acceptItem(item, other, in) && canDump(tile, other, item)){
|
||||
other.block().handleItem(item, other, in);
|
||||
tile.entity.items.removeItem(item, 1);
|
||||
tile.entity.items.remove(item, 1);
|
||||
i = (byte)((i + 1) % nearby.length);
|
||||
tile.setDump(i);
|
||||
return true;
|
||||
|
||||
@@ -5,7 +5,6 @@ import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
||||
import com.badlogic.gdx.utils.Array;
|
||||
import com.badlogic.gdx.utils.ObjectMap;
|
||||
import com.badlogic.gdx.utils.reflect.ClassReflection;
|
||||
import io.anuke.mindustry.core.GameState.State;
|
||||
import io.anuke.mindustry.entities.Damage;
|
||||
import io.anuke.mindustry.entities.Player;
|
||||
import io.anuke.mindustry.entities.TileEntity;
|
||||
@@ -20,7 +19,7 @@ import io.anuke.mindustry.graphics.Palette;
|
||||
import io.anuke.mindustry.input.CursorType;
|
||||
import io.anuke.mindustry.type.Item;
|
||||
import io.anuke.mindustry.type.ItemStack;
|
||||
import io.anuke.mindustry.type.Liquid;
|
||||
import io.anuke.mindustry.world.consumers.Consume;
|
||||
import io.anuke.mindustry.world.meta.*;
|
||||
import io.anuke.ucore.core.Timers;
|
||||
import io.anuke.ucore.graphics.Draw;
|
||||
@@ -31,7 +30,8 @@ import io.anuke.ucore.util.Bundles;
|
||||
import io.anuke.ucore.util.EnumSet;
|
||||
import io.anuke.ucore.util.Mathf;
|
||||
|
||||
import static io.anuke.mindustry.Vars.*;
|
||||
import static io.anuke.mindustry.Vars.tilesize;
|
||||
import static io.anuke.mindustry.Vars.world;
|
||||
|
||||
public class Block extends BaseBlock implements Content{
|
||||
private static int lastid;
|
||||
@@ -46,6 +46,9 @@ public class Block extends BaseBlock implements Content{
|
||||
protected TextureRegion[] compactIcon;
|
||||
protected TextureRegion editorIcon;
|
||||
|
||||
protected TextureRegion shadowRegion;
|
||||
protected TextureRegion region;
|
||||
|
||||
/**internal name*/
|
||||
public final String name;
|
||||
/**internal ID*/
|
||||
@@ -72,12 +75,8 @@ public class Block extends BaseBlock implements Content{
|
||||
public int health = -1;
|
||||
/**base block explosiveness*/
|
||||
public float baseExplosiveness = 0f;
|
||||
/**whether to display a different shadow per variant*/
|
||||
public boolean varyShadow = false;
|
||||
/**whether this block can be placed on liquids.*/
|
||||
public boolean floating = true;
|
||||
/**number of block variants, 0 to disable*/
|
||||
public int variants = 0;
|
||||
/**stuff that drops when broken*/
|
||||
public ItemStack drops = null;
|
||||
/**multiblock size*/
|
||||
@@ -110,10 +109,6 @@ public class Block extends BaseBlock implements Content{
|
||||
public boolean autoSleep;
|
||||
/**Name of shadow region to load. Null to indicate normal shadow.*/
|
||||
public String shadow = null;
|
||||
/**Region used for drawing shadows.*/
|
||||
public TextureRegion shadowRegion;
|
||||
/**Texture region array for drawing multiple shadows.*/
|
||||
public TextureRegion[] shadowRegions;
|
||||
/**Whether the block can be tapped and selected to configure.*/
|
||||
public boolean configurable;
|
||||
/**Whether this block consumes touchDown events when tapped.*/
|
||||
@@ -138,6 +133,10 @@ public class Block extends BaseBlock implements Content{
|
||||
blocks.add(this);
|
||||
}
|
||||
|
||||
public void setConsumers(Array<Consume> consumers){
|
||||
|
||||
}
|
||||
|
||||
public boolean isLayer(Tile tile){return true;}
|
||||
public boolean isLayer2(Tile tile){return true;}
|
||||
public void drawLayer(Tile tile){}
|
||||
@@ -173,13 +172,7 @@ public class Block extends BaseBlock implements Content{
|
||||
@Override
|
||||
public void load() {
|
||||
shadowRegion = Draw.region(shadow == null ? "shadow-" + size : shadow);
|
||||
|
||||
if(varyShadow && variants > 0) {
|
||||
shadowRegions = new TextureRegion[variants];
|
||||
for(int i = 0; i < variants; i ++){
|
||||
shadowRegions[i] = Draw.region(name + "shadow" + (i + 1));
|
||||
}
|
||||
}
|
||||
region = Draw.region(name);
|
||||
}
|
||||
|
||||
/**Called when the block is tapped.*/
|
||||
@@ -236,8 +229,8 @@ public class Block extends BaseBlock implements Content{
|
||||
//TODO make this easier to config.
|
||||
public void setBars(){
|
||||
if(hasPower) bars.add(new BlockBar(BarType.power, true, tile -> tile.entity.power.amount / powerCapacity));
|
||||
if(hasLiquids) bars.add(new BlockBar(BarType.liquid, true, tile -> tile.entity.liquids.amount / liquidCapacity));
|
||||
if(hasItems) bars.add(new BlockBar(BarType.inventory, true, tile -> (float)tile.entity.items.totalItems() / itemCapacity));
|
||||
if(hasLiquids) bars.add(new BlockBar(BarType.liquid, true, tile -> tile.entity.liquids.total() / liquidCapacity));
|
||||
if(hasItems) bars.add(new BlockBar(BarType.inventory, true, tile -> (float)tile.entity.items.total() / itemCapacity));
|
||||
}
|
||||
|
||||
public String name(){
|
||||
@@ -276,14 +269,13 @@ public class Block extends BaseBlock implements Content{
|
||||
float x = tile.worldx(), y = tile.worldy();
|
||||
float explosiveness = baseExplosiveness;
|
||||
float flammability = 0f;
|
||||
float heat = 0f;
|
||||
float power = 0f;
|
||||
int units = 1;
|
||||
tempColor.set(Palette.darkFlame);
|
||||
|
||||
if(hasItems){
|
||||
for(Item item : Item.all()){
|
||||
int amount = tile.entity.items.getItem(item);
|
||||
int amount = tile.entity.items.get(item);
|
||||
explosiveness += item.explosiveness*amount;
|
||||
flammability += item.flammability*amount;
|
||||
|
||||
@@ -295,15 +287,8 @@ public class Block extends BaseBlock implements Content{
|
||||
}
|
||||
|
||||
if(hasLiquids){
|
||||
float amount = tile.entity.liquids.amount;
|
||||
explosiveness += tile.entity.liquids.liquid.explosiveness*amount/2f;
|
||||
flammability += tile.entity.liquids.liquid.flammability*amount/2f;
|
||||
heat += Mathf.clamp(tile.entity.liquids.liquid.temperature-0.5f)*amount/2f;
|
||||
|
||||
if(tile.entity.liquids.liquid.flammability*amount > 2f){
|
||||
units ++;
|
||||
Hue.addu(tempColor, tile.entity.liquids.liquid.flameColor);
|
||||
}
|
||||
flammability += tile.entity.liquids.sum((liquid, amount) -> liquid.explosiveness * amount/2f);
|
||||
explosiveness += tile.entity.liquids.sum((liquid, amount) -> liquid.flammability * amount/2f);
|
||||
}
|
||||
|
||||
if(hasPower){
|
||||
@@ -314,17 +299,18 @@ public class Block extends BaseBlock implements Content{
|
||||
|
||||
if(hasLiquids) {
|
||||
|
||||
Liquid liquid = tile.entity.liquids.liquid;
|
||||
float splash = Mathf.clamp(tile.entity.liquids.amount / 4f, 0f, 10f);
|
||||
tile.entity.liquids.forEach((liquid, amount) -> {
|
||||
float splash = Mathf.clamp(amount / 4f, 0f, 10f);
|
||||
|
||||
for (int i = 0; i < Mathf.clamp(tile.entity.liquids.amount / 5, 0, 30); i++) {
|
||||
Timers.run(i / 2, () -> {
|
||||
Tile other = world.tile(tile.x + Mathf.range(size / 2), tile.y + Mathf.range(size / 2));
|
||||
if (other != null) {
|
||||
Puddle.deposit(other, liquid, splash);
|
||||
}
|
||||
});
|
||||
}
|
||||
for (int i = 0; i < Mathf.clamp(amount / 5, 0, 30); i++) {
|
||||
Timers.run(i / 2, () -> {
|
||||
Tile other = world.tile(tile.x + Mathf.range(size / 2), tile.y + Mathf.range(size / 2));
|
||||
if (other != null) {
|
||||
Puddle.deposit(other, liquid, splash);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Damage.dynamicExplosion(x, y, flammability, explosiveness, power, tilesize * size/2f, tempColor);
|
||||
@@ -342,14 +328,12 @@ public class Block extends BaseBlock implements Content{
|
||||
}
|
||||
return 0;
|
||||
}else{
|
||||
float result = 0f;
|
||||
for (int i = 0; i < Item.all().size; i++) {
|
||||
int amount = tile.entity.items.items[i];
|
||||
result += Item.getByID(i).flammability*amount;
|
||||
}
|
||||
float result = tile.entity.items.sum((item, amount) -> item.flammability * amount);
|
||||
|
||||
if(hasLiquids){
|
||||
result += tile.entity.liquids.amount * tile.entity.liquids.liquid.flammability/3f;
|
||||
result += tile.entity.liquids.sum((liquid, amount) -> liquid.flammability * amount/3f);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -411,30 +395,13 @@ public class Block extends BaseBlock implements Content{
|
||||
}
|
||||
|
||||
public void draw(Tile tile){
|
||||
//note: multiblocks do not support rotation
|
||||
if(!isMultiblock()){
|
||||
Draw.rect(variants > 0 ? (name() + Mathf.randomSeed(tile.id(), 1, variants)) : name(),
|
||||
tile.worldx(), tile.worldy(), rotate ? tile.getRotation() * 90 : 0);
|
||||
}else{
|
||||
//if multiblock, make sure to draw even block sizes offset, since the core block is at the BOTTOM LEFT
|
||||
Draw.rect(name(), tile.drawx(), tile.drawy());
|
||||
}
|
||||
|
||||
//update the tile entity through the draw method, only if it's an entity without updating
|
||||
if(destructible && !update && !state.is(State.paused)){
|
||||
tile.entity.update();
|
||||
}
|
||||
Draw.rect(region, tile.drawx(), tile.drawy(), rotate ? tile.getRotation() * 90 : 0);
|
||||
}
|
||||
|
||||
public void drawNonLayer(Tile tile){}
|
||||
|
||||
public void drawShadow(Tile tile){
|
||||
|
||||
if(shadowRegions != null) {
|
||||
Draw.rect(shadowRegions[(Mathf.randomSeed(tile.id(), 0, variants - 1))], tile.worldx(), tile.worldy());
|
||||
}else if(shadowRegion != null){
|
||||
Draw.rect(shadowRegion, tile.drawx(), tile.drawy());
|
||||
}
|
||||
Draw.rect(shadowRegion, tile.drawx(), tile.drawy());
|
||||
}
|
||||
|
||||
/**Offset for placing and drawing multiblocks.*/
|
||||
@@ -456,7 +423,7 @@ public class Block extends BaseBlock implements Content{
|
||||
"entity.x", tile.entity.x,
|
||||
"entity.y", tile.entity.y,
|
||||
"entity.id", tile.entity.id,
|
||||
"entity.items.total", hasItems ? tile.entity.items.totalItems() : null
|
||||
"entity.items.total", hasItems ? tile.entity.items.total() : null
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
package io.anuke.mindustry.world;
|
||||
|
||||
public class Consumption {
|
||||
}
|
||||
@@ -10,9 +10,9 @@ import io.anuke.mindustry.entities.traits.TargetTrait;
|
||||
import io.anuke.mindustry.game.Team;
|
||||
import io.anuke.mindustry.type.Recipe;
|
||||
import io.anuke.mindustry.world.blocks.Floor;
|
||||
import io.anuke.mindustry.world.blocks.modules.InventoryModule;
|
||||
import io.anuke.mindustry.world.blocks.modules.LiquidModule;
|
||||
import io.anuke.mindustry.world.blocks.modules.PowerModule;
|
||||
import io.anuke.mindustry.world.modules.InventoryModule;
|
||||
import io.anuke.mindustry.world.modules.LiquidModule;
|
||||
import io.anuke.mindustry.world.modules.PowerModule;
|
||||
import io.anuke.ucore.entities.trait.PosTrait;
|
||||
import io.anuke.ucore.function.Consumer;
|
||||
import io.anuke.ucore.util.Bits;
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
package io.anuke.mindustry.world.blocks;
|
||||
|
||||
import io.anuke.mindustry.world.Block;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
import io.anuke.ucore.graphics.Draw;
|
||||
import io.anuke.ucore.function.Predicate;
|
||||
import io.anuke.ucore.util.Mathf;
|
||||
|
||||
public class BlendBlock extends Block{
|
||||
protected String edge;
|
||||
protected Predicate<Block> blend = block -> block == this;
|
||||
|
||||
public BlendBlock(String name) {
|
||||
super(name);
|
||||
edge = name + "-edge";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(Tile tile){
|
||||
Draw.rect(variants > 0 ? (name() + Mathf.randomSeed(tile.id(), 1, variants)) : name(),
|
||||
tile.worldx(), tile.worldy());
|
||||
|
||||
for(int i = 0; i < 4; i ++){
|
||||
Tile near = tile.getNearby(i);
|
||||
if(near != null && !blend.test(near.block())){
|
||||
Draw.rect(edge + "-" + i, tile.worldx(), tile.worldy());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -22,7 +22,7 @@ import io.anuke.mindustry.type.Recipe;
|
||||
import io.anuke.mindustry.world.BarType;
|
||||
import io.anuke.mindustry.world.Block;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
import io.anuke.mindustry.world.blocks.modules.InventoryModule;
|
||||
import io.anuke.mindustry.world.modules.InventoryModule;
|
||||
import io.anuke.mindustry.world.meta.BlockBar;
|
||||
import io.anuke.ucore.core.Effects;
|
||||
import io.anuke.ucore.core.Graphics;
|
||||
@@ -157,11 +157,10 @@ public class BuildBlock extends Block {
|
||||
}
|
||||
|
||||
@Remote(called = Loc.server, in = In.blocks)
|
||||
public static void onConstructFinish(Tile tile, Block block, int builderID, byte rotation){
|
||||
Team team = tile.getTeam();
|
||||
public static void onConstructFinish(Tile tile, Block block, int builderID, byte rotation, Team team){
|
||||
tile.setBlock(block);
|
||||
tile.setTeam(team);
|
||||
tile.setRotation(rotation);
|
||||
tile.setTeam(team);
|
||||
Effects.effect(Fx.placeBlock, tile.drawx(), tile.drawy(), block.size);
|
||||
|
||||
//last builder was this local client player, call placed()
|
||||
@@ -197,7 +196,7 @@ public class BuildBlock extends Block {
|
||||
progress = Mathf.clamp(progress + maxProgress);
|
||||
|
||||
if(progress >= 1f){
|
||||
CallBlocks.onConstructFinish(tile, recipe.result, builder.getID(), tile.getRotation());
|
||||
CallBlocks.onConstructFinish(tile, recipe.result, builder.getID(), tile.getRotation(), tile.getTeam());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -233,11 +232,11 @@ public class BuildBlock extends Block {
|
||||
for(int i = 0; i < recipe.requirements.length; i ++){
|
||||
int required = (int)(accumulator[i]); //calculate items that are required now
|
||||
|
||||
if(inventory.getItem(recipe.requirements[i].item) == 0){
|
||||
if(inventory.get(recipe.requirements[i].item) == 0){
|
||||
maxProgress = 0f;
|
||||
}else if(required > 0){ //if this amount is positive...
|
||||
//calculate how many items it can actually use
|
||||
int maxUse = Math.min(required, inventory.getItem(recipe.requirements[i].item));
|
||||
int maxUse = Math.min(required, inventory.get(recipe.requirements[i].item));
|
||||
//get this as a fraction
|
||||
float fraction = maxUse / (float)required;
|
||||
|
||||
@@ -248,7 +247,7 @@ public class BuildBlock extends Block {
|
||||
|
||||
//remove stuff that is actually used
|
||||
if(remove) {
|
||||
inventory.removeItem(recipe.requirements[i].item, maxUse);
|
||||
inventory.remove(recipe.requirements[i].item, maxUse);
|
||||
}
|
||||
}
|
||||
//else, no items are required yet, so just keep going
|
||||
|
||||
@@ -35,6 +35,8 @@ public class Floor extends Block{
|
||||
protected Predicate<Floor> blends = block -> block != this && !block.blendOverride(this);
|
||||
protected boolean blend = true;
|
||||
|
||||
/**number of different variant regions to use*/
|
||||
public int variants = 0;
|
||||
/**edge fallback, used mainly for ores*/
|
||||
public String edge = "stone";
|
||||
/**Multiplies unit velocity by this when walked on.*/
|
||||
|
||||
@@ -4,11 +4,11 @@ import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
||||
import io.anuke.mindustry.world.Block;
|
||||
import io.anuke.mindustry.world.meta.BlockGroup;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
import io.anuke.mindustry.world.blocks.modules.LiquidModule;
|
||||
import io.anuke.mindustry.world.modules.LiquidModule;
|
||||
import io.anuke.ucore.graphics.Draw;
|
||||
|
||||
public class LiquidBlock extends Block{
|
||||
protected String liquidRegion = name() + "-liquid";
|
||||
protected TextureRegion liquidRegion, bottomRegion, topRegion;
|
||||
|
||||
public LiquidBlock(String name) {
|
||||
super(name);
|
||||
@@ -18,6 +18,15 @@ public class LiquidBlock extends Block{
|
||||
group = BlockGroup.liquids;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void load() {
|
||||
super.load();
|
||||
|
||||
liquidRegion = Draw.region(name + "-liquid");
|
||||
topRegion = Draw.region(name + "-top");
|
||||
bottomRegion = Draw.region(name + "-bottom");
|
||||
}
|
||||
|
||||
@Override
|
||||
public TextureRegion[] getIcon(){
|
||||
return new TextureRegion[]{Draw.region(name() + "-bottom"), Draw.region(name() + "-top")};
|
||||
@@ -29,15 +38,15 @@ public class LiquidBlock extends Block{
|
||||
|
||||
int rotation = rotate ? tile.getRotation() * 90 : 0;
|
||||
|
||||
Draw.rect(name() + "-bottom", tile.drawx(), tile.drawy(), rotation);
|
||||
Draw.rect(bottomRegion, tile.drawx(), tile.drawy(), rotation);
|
||||
|
||||
if(mod.amount > 0.001f){
|
||||
Draw.color(mod.liquid.color);
|
||||
Draw.alpha(mod.amount / liquidCapacity);
|
||||
if(mod.total() > 0.001f){
|
||||
Draw.color(mod.current().color);
|
||||
Draw.alpha(mod.total() / liquidCapacity);
|
||||
Draw.rect(liquidRegion, tile.drawx(), tile.drawy(), rotation);
|
||||
Draw.color();
|
||||
}
|
||||
|
||||
Draw.rect(name() + "-top", tile.drawx(), tile.drawy(), rotation);
|
||||
Draw.rect(topRegion, tile.drawx(), tile.drawy(), rotation);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,51 @@
|
||||
package io.anuke.mindustry.world.blocks;
|
||||
|
||||
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
||||
import io.anuke.mindustry.world.Block;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
import io.anuke.ucore.graphics.Draw;
|
||||
import io.anuke.ucore.util.Mathf;
|
||||
|
||||
public class Rock extends Block {
|
||||
protected TextureRegion[] shadowRegions, regions;
|
||||
protected int variants;
|
||||
|
||||
public Rock(String name) {
|
||||
super(name);
|
||||
varyShadow = true;
|
||||
breakable = true;
|
||||
alwaysReplace = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(Tile tile) {
|
||||
if(variants > 0){
|
||||
Draw.rect(regions[Mathf.randomSeed(tile.id(), 0, Math.max(0, regions.length-1))], tile.worldx(), tile.worldy());
|
||||
}else{
|
||||
Draw.rect(region, tile.worldx(), tile.worldy());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawShadow(Tile tile) {
|
||||
if(shadowRegions != null) {
|
||||
Draw.rect(shadowRegions[(Mathf.randomSeed(tile.id(), 0, variants - 1))], tile.worldx(), tile.worldy());
|
||||
}else if(shadowRegion != null){
|
||||
Draw.rect(shadowRegion, tile.drawx(), tile.drawy());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void load() {
|
||||
super.load();
|
||||
|
||||
if(variants > 0){
|
||||
shadowRegions = new TextureRegion[variants];
|
||||
regions = new TextureRegion[variants];
|
||||
|
||||
for (int i = 0; i < variants; i++) {
|
||||
shadowRegions[i] = Draw.region(name + "-shadow" + (i+1));
|
||||
regions[i] = Draw.region(name + (i+1));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ public class Door extends Wall{
|
||||
DoorEntity entity = tile.entity();
|
||||
|
||||
if(!entity.open){
|
||||
Draw.rect(name, tile.drawx(), tile.drawy());
|
||||
Draw.rect(region, tile.drawx(), tile.drawy());
|
||||
}else{
|
||||
Draw.rect(openRegion, tile.drawx(), tile.drawy());
|
||||
}
|
||||
|
||||
@@ -38,17 +38,18 @@ public class CooledTurret extends Turret {
|
||||
super.updateShooting(tile);
|
||||
|
||||
TurretEntity entity = tile.entity();
|
||||
Liquid liquid = entity.liquids.current();
|
||||
|
||||
float used = Math.min(Math.min(entity.liquids.amount, maxUsed * Timers.delta()), Math.max(0, ((reload - entity.reload) / coolantMultiplier) / entity.liquids.liquid.heatCapacity));
|
||||
entity.reload += (used * entity.liquids.liquid.heatCapacity) / entity.liquids.liquid.heatCapacity;
|
||||
entity.liquids.amount -= used;
|
||||
float used = Math.min(Math.min(entity.liquids.get(liquid), maxUsed * Timers.delta()), Math.max(0, ((reload - entity.reload) / coolantMultiplier) / liquid.heatCapacity));
|
||||
entity.reload += (used * liquid.heatCapacity) / liquid.heatCapacity;
|
||||
entity.liquids.remove(liquid, used);
|
||||
|
||||
if(Mathf.chance(0.04 * used)){
|
||||
Effects.effect(coolEffect, tile.drawx() + Mathf.range(size * tilesize/2f), tile.drawy() + Mathf.range(size * tilesize/2f));
|
||||
}
|
||||
|
||||
//don't use oil as coolant, thanks
|
||||
if(Mathf.chance(entity.liquids.liquid.flammability / 10f * used)){
|
||||
if(Mathf.chance(liquid.flammability / 10f * used)){
|
||||
Fire.create(tile);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ public class ItemTurret extends CooledTurret {
|
||||
|
||||
AmmoType type = ammoMap.get(item);
|
||||
entity.totalAmmo += type.quantityMultiplier;
|
||||
entity.items.addItem(item, 1);
|
||||
entity.items.add(item, 1);
|
||||
|
||||
//find ammo entry by type
|
||||
for(int i = 0; i < entity.ammo.size; i ++){
|
||||
|
||||
@@ -27,7 +27,10 @@ import io.anuke.ucore.core.Timers;
|
||||
import io.anuke.ucore.function.BiConsumer;
|
||||
import io.anuke.ucore.graphics.Draw;
|
||||
import io.anuke.ucore.graphics.Lines;
|
||||
import io.anuke.ucore.util.*;
|
||||
import io.anuke.ucore.util.Angles;
|
||||
import io.anuke.ucore.util.Mathf;
|
||||
import io.anuke.ucore.util.ThreadArray;
|
||||
import io.anuke.ucore.util.Translator;
|
||||
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
@@ -66,8 +69,9 @@ public abstract class Turret extends Block{
|
||||
protected TextureRegion heatRegion;
|
||||
protected TextureRegion baseTopRegion;
|
||||
|
||||
protected BiConsumer<Tile, TurretEntity> drawer = (tile, entity) -> Draw.rect(name, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90);
|
||||
protected BiConsumer<Tile, TurretEntity> drawer = (tile, entity) -> Draw.rect(region, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90);
|
||||
protected BiConsumer<Tile, TurretEntity> heatDrawer = (tile, entity) ->{
|
||||
if(entity.heat <= 0.00001f) return;
|
||||
Graphics.setAdditiveBlending();
|
||||
Draw.color(heatColor);
|
||||
Draw.alpha(entity.heat);
|
||||
@@ -129,7 +133,7 @@ public abstract class Turret extends Block{
|
||||
|
||||
drawer.accept(tile, entity);
|
||||
|
||||
if(Draw.hasRegion(name + "-heat")){
|
||||
if(heatRegion != null){
|
||||
heatDrawer.accept(tile, entity);
|
||||
}
|
||||
|
||||
|
||||
@@ -26,8 +26,8 @@ public class BufferedItemBridge extends ExtendingItemBridge {
|
||||
public void updateTransport(Tile tile, Tile other){
|
||||
BufferedItemBridgeEntity entity = tile.entity();
|
||||
|
||||
if(entity.buffer.accepts() && entity.items.totalItems() > 0){
|
||||
entity.buffer.accept(entity.items.takeItem());
|
||||
if(entity.buffer.accepts() && entity.items.total() > 0){
|
||||
entity.buffer.accept(entity.items.take());
|
||||
}
|
||||
|
||||
Item item = entity.buffer.poll();
|
||||
|
||||
@@ -5,7 +5,7 @@ import io.anuke.mindustry.entities.TileEntity;
|
||||
import io.anuke.mindustry.type.Liquid;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
import io.anuke.mindustry.world.blocks.LiquidBlock;
|
||||
import io.anuke.mindustry.world.blocks.modules.LiquidModule;
|
||||
import io.anuke.mindustry.world.modules.LiquidModule;
|
||||
import io.anuke.ucore.graphics.Draw;
|
||||
import io.anuke.ucore.util.Mathf;
|
||||
|
||||
@@ -18,11 +18,17 @@ public class Conduit extends LiquidBlock {
|
||||
|
||||
public Conduit(String name) {
|
||||
super(name);
|
||||
liquidRegion = "conduit-liquid";
|
||||
rotate = true;
|
||||
solid = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void load() {
|
||||
super.load();
|
||||
|
||||
liquidRegion = Draw.region("conduit-liquid");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(Tile tile){
|
||||
ConduitEntity entity = tile.entity();
|
||||
@@ -30,23 +36,23 @@ public class Conduit extends LiquidBlock {
|
||||
|
||||
int rotation = rotate ? tile.getRotation() * 90 : 0;
|
||||
|
||||
Draw.rect(name() + "-bottom", tile.drawx(), tile.drawy(), rotation);
|
||||
Draw.rect(bottomRegion, tile.drawx(), tile.drawy(), rotation);
|
||||
|
||||
Draw.color(mod.liquid.color);
|
||||
Draw.color(mod.current().color);
|
||||
Draw.alpha(entity.smoothLiquid);
|
||||
Draw.rect(liquidRegion, tile.drawx(), tile.drawy(), rotation);
|
||||
Draw.color();
|
||||
|
||||
Draw.rect(name() + "-top", tile.drawx(), tile.drawy(), rotation);
|
||||
Draw.rect(topRegion, tile.drawx(), tile.drawy(), rotation);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(Tile tile){
|
||||
ConduitEntity entity = tile.entity();
|
||||
entity.smoothLiquid = Mathf.lerpDelta(entity.smoothLiquid, entity.liquids.amount/liquidCapacity, 0.05f);
|
||||
entity.smoothLiquid = Mathf.lerpDelta(entity.smoothLiquid, entity.liquids.total()/liquidCapacity, 0.05f);
|
||||
|
||||
if(tile.entity.liquids.amount > 0.001f && tile.entity.timer.get(timerFlow, 1)){
|
||||
tryMoveLiquid(tile, tile.getNearby(tile.getRotation()), true);
|
||||
if(tile.entity.liquids.total() > 0.001f && tile.entity.timer.get(timerFlow, 1)){
|
||||
tryMoveLiquid(tile, tile.getNearby(tile.getRotation()), true, tile.entity.liquids.current());
|
||||
entity.wakeUp();
|
||||
}else{
|
||||
entity.sleep();
|
||||
@@ -61,7 +67,8 @@ public class Conduit extends LiquidBlock {
|
||||
@Override
|
||||
public boolean acceptLiquid(Tile tile, Tile source, Liquid liquid, float amount) {
|
||||
tile.entity.wakeUp();
|
||||
return super.acceptLiquid(tile, source, liquid, amount) && ((2 + source.relativeTo(tile.x, tile.y)) % 4 != tile.getRotation());
|
||||
return super.acceptLiquid(tile, source, liquid, amount) && (tile.entity.liquids.current() == liquid || tile.entity.liquids.get(tile.entity.liquids.current()) < 0.01f) &&
|
||||
((2 + source.relativeTo(tile.x, tile.y)) % 4 != tile.getRotation());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -189,7 +189,7 @@ public class Conveyor extends Block{
|
||||
if (pos.y >= 0.9999f && offloadDir(tile, pos.item)) {
|
||||
minremove = Math.min(i, minremove);
|
||||
totalMoved = 1f;
|
||||
tile.entity.items.removeItem(pos.item, 1);
|
||||
tile.entity.items.remove(pos.item, 1);
|
||||
} else {
|
||||
value = pos.pack();
|
||||
|
||||
@@ -232,7 +232,7 @@ public class Conveyor extends Block{
|
||||
ItemPos pos = pos1.set(val, ItemPos.drawShorts);
|
||||
if(pos.item == item){
|
||||
entity.convey.removeValue(val);
|
||||
entity.items.removeItem(item, 1);
|
||||
entity.items.remove(item, 1);
|
||||
removed ++;
|
||||
break;
|
||||
}
|
||||
@@ -258,7 +258,7 @@ public class Conveyor extends Block{
|
||||
|
||||
long result = ItemPos.packItem(item, 0f, 0f, (byte)Mathf.random(255));
|
||||
entity.convey.insert(0, result);
|
||||
entity.items.addItem(item, 1);
|
||||
entity.items.add(item, 1);
|
||||
entity.wakeUp();
|
||||
}
|
||||
|
||||
@@ -285,7 +285,7 @@ public class Conveyor extends Block{
|
||||
long result = ItemPos.packItem(item, y*0.9f, pos, (byte)Mathf.random(255));
|
||||
boolean inserted = false;
|
||||
|
||||
tile.entity.items.addItem(item, 1);
|
||||
tile.entity.items.add(item, 1);
|
||||
|
||||
for(int i = 0; i < entity.convey.size; i ++){
|
||||
if(compareItems(result, entity.convey.get(i)) < 0){
|
||||
|
||||
@@ -33,14 +33,14 @@ public class ExtendingItemBridge extends ItemBridge {
|
||||
ey *= entity.uptime;
|
||||
|
||||
Lines.stroke(8f);
|
||||
Lines.line(Draw.region(name + "-bridge"),
|
||||
Lines.line(bridgeRegion,
|
||||
tile.worldx() + Geometry.d4[i].x*tilesize/2f,
|
||||
tile.worldy() + Geometry.d4[i].y*tilesize/2f,
|
||||
tile.worldx() + ex,
|
||||
tile.worldy() + ey, CapStyle.none, 0f);
|
||||
|
||||
Draw.rect(name + "-end", tile.drawx(), tile.drawy(), i*90 + 90);
|
||||
Draw.rect(name + "-end",
|
||||
Draw.rect(endRegion, tile.drawx(), tile.drawy(), i*90 + 90);
|
||||
Draw.rect(endRegion,
|
||||
tile.worldx() + ex + Geometry.d4[i].x*tilesize/2f,
|
||||
tile.worldy() + ey + Geometry.d4[i].y*tilesize/2f, i*90 + 270);
|
||||
|
||||
@@ -52,7 +52,7 @@ public class ExtendingItemBridge extends ItemBridge {
|
||||
|
||||
for(int a = 0; a < arrows; a ++){
|
||||
Draw.alpha(Mathf.absin(a/(float)arrows - entity.time/100f, 0.1f, 1f) * entity.uptime);
|
||||
Draw.rect(name + "-arrow",
|
||||
Draw.rect(arrowRegion,
|
||||
tile.worldx() + Geometry.d4[i].x*(tilesize/2f + a*6f + 2) * entity.uptime,
|
||||
tile.worldy() + Geometry.d4[i].y*(tilesize/2f + a*6f + 2) * entity.uptime,
|
||||
i*90f);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package io.anuke.mindustry.world.blocks.distribution;
|
||||
|
||||
import com.badlogic.gdx.graphics.Color;
|
||||
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
||||
import com.badlogic.gdx.utils.IntArray;
|
||||
import com.badlogic.gdx.utils.IntSet;
|
||||
import com.badlogic.gdx.utils.IntSet.IntSetIterator;
|
||||
@@ -38,6 +39,8 @@ public class ItemBridge extends Block {
|
||||
protected float transportTime = 2f;
|
||||
protected IntArray removals = new IntArray();
|
||||
|
||||
protected TextureRegion endRegion, bridgeRegion, arrowRegion;
|
||||
|
||||
public ItemBridge(String name) {
|
||||
super(name);
|
||||
update = true;
|
||||
@@ -50,6 +53,13 @@ public class ItemBridge extends Block {
|
||||
hasItems = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void load() {
|
||||
endRegion = Draw.region(name + "-end");
|
||||
bridgeRegion = Draw.region(name + "-bridge");
|
||||
arrowRegion = Draw.region(name + "-arrow");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void placed(Tile tile) {
|
||||
Tile last = world.tile(lastPlaced);
|
||||
@@ -162,13 +172,13 @@ public class ItemBridge extends Block {
|
||||
ItemBridgeEntity entity = tile.entity();
|
||||
|
||||
if(entity.uptime >= 0.5f && entity.timer.get(timerTransport, transportTime)){
|
||||
Item item = entity.items.takeItem();
|
||||
Item item = entity.items.take();
|
||||
if(item != null && other.block().acceptItem(item, other, tile)){
|
||||
other.block().handleItem(item, other, tile);
|
||||
entity.cycleSpeed = Mathf.lerpDelta(entity.cycleSpeed, 4f, 0.05f);
|
||||
}else{
|
||||
entity.cycleSpeed = Mathf.lerpDelta(entity.cycleSpeed, 1f, 0.01f);
|
||||
if(item != null) entity.items.addItem(item, 1);
|
||||
if(item != null) entity.items.add(item, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -185,11 +195,11 @@ public class ItemBridge extends Block {
|
||||
Draw.color(Color.WHITE, Color.BLACK, Mathf.absin(Timers.time(), 6f, 0.07f));
|
||||
Draw.alpha(Math.max(entity.uptime, 0.25f));
|
||||
|
||||
Draw.rect(name + "-end", tile.drawx(), tile.drawy(), i*90 + 90);
|
||||
Draw.rect(name + "-end", other.drawx(), other.drawy(), i*90 + 270);
|
||||
Draw.rect(endRegion, tile.drawx(), tile.drawy(), i*90 + 90);
|
||||
Draw.rect(endRegion, other.drawx(), other.drawy(), i*90 + 270);
|
||||
|
||||
Lines.stroke(8f);
|
||||
Lines.line(Draw.region(name + "-bridge"),
|
||||
Lines.line(bridgeRegion,
|
||||
tile.worldx(),
|
||||
tile.worldy(),
|
||||
other.worldx(),
|
||||
@@ -204,7 +214,7 @@ public class ItemBridge extends Block {
|
||||
|
||||
for(int a = 0; a < arrows; a ++){
|
||||
Draw.alpha(Mathf.absin(a/(float)arrows - entity.time/100f, 0.1f, 1f) * entity.uptime);
|
||||
Draw.rect(name + "-arrow",
|
||||
Draw.rect(arrowRegion,
|
||||
tile.worldx() + Geometry.d4[i].x*(tilesize/2f + a*4f + time % 4f),
|
||||
tile.worldy() + Geometry.d4[i].y*(tilesize/2f + a*4f + time % 4f),
|
||||
i*90f);
|
||||
@@ -214,7 +224,7 @@ public class ItemBridge extends Block {
|
||||
|
||||
@Override
|
||||
public boolean acceptItem(Item item, Tile tile, Tile source) {
|
||||
return tile.entity.items.totalItems() < itemCapacity;
|
||||
return tile.entity.items.total() < itemCapacity;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -64,7 +64,7 @@ public class MassDriver extends Block {
|
||||
|
||||
if(entity.isUnloading){
|
||||
tryDump(tile);
|
||||
if(entity.items.totalItems() <= 0){
|
||||
if(entity.items.total() <= 0){
|
||||
entity.isUnloading = false;
|
||||
}
|
||||
}
|
||||
@@ -79,10 +79,10 @@ public class MassDriver extends Block {
|
||||
Tile waiter = entity.waiting.first();
|
||||
|
||||
entity.rotation = Mathf.slerpDelta(entity.rotation, tile.angleTo(waiter), rotateSpeed);
|
||||
}else if (tile.entity.items.totalItems() >= minDistribute &&
|
||||
}else if (tile.entity.items.total() >= minDistribute &&
|
||||
linkValid(tile) && //only fire when at least at half-capacity and power
|
||||
tile.entity.power.amount >= powerCapacity &&
|
||||
link.block().itemCapacity - link.entity.items.totalItems() >= minDistribute && entity.reload <= 0.0001f) {
|
||||
link.block().itemCapacity - link.entity.items.total() >= minDistribute && entity.reload <= 0.0001f) {
|
||||
|
||||
MassDriverEntity other = link.entity();
|
||||
other.waiting.add(tile);
|
||||
@@ -150,7 +150,7 @@ public class MassDriver extends Block {
|
||||
|
||||
@Override
|
||||
public boolean acceptItem(Item item, Tile tile, Tile source) {
|
||||
return tile.entity.items.totalItems() < itemCapacity;
|
||||
return tile.entity.items.total() < itemCapacity;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -221,7 +221,7 @@ public class MassDriver extends Block {
|
||||
public float reload = 0f;
|
||||
|
||||
public void handlePayload(Bullet bullet, DriverBulletData data){
|
||||
int totalItems = items.totalItems();
|
||||
int totalItems = items.total();
|
||||
|
||||
//add all the items possible
|
||||
for(int i = 0; i < data.items.length; i ++){
|
||||
|
||||
@@ -21,10 +21,10 @@ public class Router extends Block{
|
||||
@Override
|
||||
public void update(Tile tile){
|
||||
int iterations = Math.max(1, (int) (Timers.delta() + 0.4f));
|
||||
boolean moved = tile.entity.items.totalItems() > 0;
|
||||
boolean moved = tile.entity.items.total() > 0;
|
||||
|
||||
for(int i = 0; i < iterations; i ++) {
|
||||
if (tile.entity.items.totalItems() > 0) {
|
||||
if (tile.entity.items.total() > 0) {
|
||||
tryDump(tile);
|
||||
moved = true;
|
||||
}
|
||||
@@ -37,7 +37,7 @@ public class Router extends Block{
|
||||
|
||||
@Override
|
||||
public boolean canDump(Tile tile, Tile to, Item item) {
|
||||
return !(to.block() instanceof Router) || ((float) to.target().entity.items.totalItems() / to.target().block().itemCapacity) < ((float) tile.entity.items.totalItems() / to.target().block().itemCapacity);
|
||||
return !(to.block() instanceof Router) || ((float) to.target().entity.items.total() / to.target().block().itemCapacity) < ((float) tile.entity.items.total() / to.target().block().itemCapacity);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -48,7 +48,7 @@ public class Router extends Block{
|
||||
|
||||
@Override
|
||||
public boolean acceptItem(Item item, Tile tile, Tile source){
|
||||
int items = tile.entity.items.totalItems();
|
||||
int items = tile.entity.items.total();
|
||||
return items < itemCapacity;
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ public class TunnelConduit extends LiquidBlock {
|
||||
|
||||
@Override
|
||||
public void draw(Tile tile){
|
||||
Draw.rect(name, tile.drawx(), tile.drawy(), tile.getRotation() * 90);
|
||||
Draw.rect(region, tile.drawx(), tile.drawy(), tile.getRotation() * 90);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -147,7 +147,7 @@ public class WarpGate extends PowerBlock{
|
||||
|
||||
teleporters[entity.color].add(tile);
|
||||
|
||||
if(entity.items.totalItems() > 0){
|
||||
if(entity.items.total() > 0){
|
||||
tryDump(tile);
|
||||
}
|
||||
|
||||
@@ -210,7 +210,7 @@ public class WarpGate extends PowerBlock{
|
||||
|
||||
entity.time += Timers.delta() * entity.speedScl;
|
||||
|
||||
if (!entity.teleporting && entity.items.totalItems() >= itemCapacity && entity.power.amount >= powerCapacity - 0.01f - powerUse &&
|
||||
if (!entity.teleporting && entity.items.total() >= itemCapacity && entity.power.amount >= powerCapacity - 0.01f - powerUse &&
|
||||
entity.timer.get(timerTeleport, teleportMax)) {
|
||||
Array<Tile> testLinks = findLinks(tile);
|
||||
|
||||
@@ -226,12 +226,12 @@ public class WarpGate extends PowerBlock{
|
||||
Array<Tile> links = findLinks(tile);
|
||||
|
||||
for (Tile other : links) {
|
||||
int canAccept = itemCapacity - other.entity.items.totalItems();
|
||||
int total = entity.items.totalItems();
|
||||
int canAccept = itemCapacity - other.entity.items.total();
|
||||
int total = entity.items.total();
|
||||
if (total == 0) break;
|
||||
Effects.effect(teleportOutEffect, resultColor, other.drawx(), other.drawy());
|
||||
for (int i = 0; i < canAccept && i < total; i++) {
|
||||
other.entity.items.addItem(entity.items.takeItem(), 1);
|
||||
other.entity.items.add(entity.items.take(), 1);
|
||||
}
|
||||
}
|
||||
Effects.effect(teleportOutEffect, resultColor, tile.drawx(), tile.drawy());
|
||||
@@ -271,7 +271,7 @@ public class WarpGate extends PowerBlock{
|
||||
@Override
|
||||
public boolean acceptItem(Item item, Tile tile, Tile source){
|
||||
TeleporterEntity entity = tile.entity();
|
||||
return entity.items.totalItems() < itemCapacity;
|
||||
return entity.items.total() < itemCapacity;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -323,7 +323,7 @@ public class WarpGate extends PowerBlock{
|
||||
if(!oe.active) continue;
|
||||
if(oe.color != entity.color){
|
||||
removal.add(other);
|
||||
}else if(other.entity.items.totalItems() == 0){
|
||||
}else if(other.entity.items.total() == 0){
|
||||
returns.add(other);
|
||||
}
|
||||
}else{
|
||||
|
||||
@@ -1,110 +0,0 @@
|
||||
package io.anuke.mindustry.world.blocks.modules;
|
||||
|
||||
import io.anuke.mindustry.type.Item;
|
||||
import io.anuke.mindustry.type.ItemStack;
|
||||
import io.anuke.mindustry.world.blocks.BlockModule;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.Arrays;
|
||||
|
||||
public class InventoryModule extends BlockModule{
|
||||
//TODO make private!
|
||||
public int[] items = new int[Item.all().size];
|
||||
|
||||
public boolean hasItems(ItemStack[] stacks){
|
||||
for(ItemStack stack : stacks){
|
||||
if(!hasItem(stack.item, stack.amount)) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean hasItems(ItemStack[] stacks, float amountScaling){
|
||||
for(ItemStack stack : stacks){
|
||||
if(!hasItem(stack.item, (int)(stack.amount * amountScaling))) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**Returns true if this entity has at least one of each item in each stack.*/
|
||||
public boolean hasAtLeastOneOfItems(ItemStack[] stacks){
|
||||
for(ItemStack stack : stacks){
|
||||
if(!hasItem(stack.item, 1)) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//TODO optimize!
|
||||
public int totalItems(){
|
||||
int sum = 0;
|
||||
for(int i = 0; i < items.length; i ++){
|
||||
sum += items[i];
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
public Item takeItem(){
|
||||
for(int i = 0; i < items.length; i ++){
|
||||
if(items[i] > 0){
|
||||
items[i] --;
|
||||
return Item.getByID(i);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
public void removeItem(ItemStack stack){
|
||||
items[stack.item.id] -= stack.amount;
|
||||
}
|
||||
|
||||
public void clear(){
|
||||
Arrays.fill(items, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(DataOutput 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(DataInput 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
package io.anuke.mindustry.world.blocks.modules;
|
||||
|
||||
import io.anuke.mindustry.content.Liquids;
|
||||
import io.anuke.mindustry.type.Liquid;
|
||||
import io.anuke.mindustry.world.blocks.BlockModule;
|
||||
|
||||
import java.io.DataInput;
|
||||
import java.io.DataOutput;
|
||||
import java.io.IOException;
|
||||
|
||||
public class LiquidModule extends BlockModule {
|
||||
public float amount;
|
||||
/**Should never be null.*/
|
||||
public Liquid liquid = Liquids.none;
|
||||
|
||||
@Override
|
||||
public void write(DataOutput stream) throws IOException {
|
||||
stream.writeByte(liquid.id);
|
||||
stream.writeFloat(amount);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(DataInput stream) throws IOException{
|
||||
byte id = stream.readByte();
|
||||
liquid = Liquid.getByID(id);
|
||||
amount = stream.readFloat();
|
||||
}
|
||||
}
|
||||
@@ -93,7 +93,7 @@ public class FusionReactor extends PowerGenerator {
|
||||
|
||||
Graphics.setNormalBlending();
|
||||
|
||||
Draw.rect(name, tile.drawx(), tile.drawy());
|
||||
Draw.rect(region, tile.drawx(), tile.drawy());
|
||||
|
||||
Draw.rect(name + "-top", tile.drawx(), tile.drawy());
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@ public abstract class ItemGenerator extends PowerGenerator {
|
||||
@Override
|
||||
public void setBars(){
|
||||
super.setBars();
|
||||
bars.replace(new BlockBar(BarType.inventory, true, tile -> (float)tile.entity.items.totalItems() / itemCapacity));
|
||||
bars.replace(new BlockBar(BarType.inventory, true, tile -> (float)tile.entity.items.total() / itemCapacity));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -66,7 +66,7 @@ public abstract class ItemGenerator extends PowerGenerator {
|
||||
|
||||
if(entity.generateTime > 0){
|
||||
Draw.color(heatColor);
|
||||
float alpha = (entity.items.totalItems() > 0 ? 1f : Mathf.clamp(entity.generateTime));
|
||||
float alpha = (entity.items.total() > 0 ? 1f : Mathf.clamp(entity.generateTime));
|
||||
alpha = alpha * 0.7f + Mathf.absin(Timers.time(), 12f, 0.3f) * alpha;
|
||||
Draw.alpha(alpha);
|
||||
Draw.rect(topRegion, tile.drawx(), tile.drawy());
|
||||
@@ -76,7 +76,7 @@ public abstract class ItemGenerator extends PowerGenerator {
|
||||
|
||||
@Override
|
||||
public boolean acceptItem(Item item, Tile tile, Tile source){
|
||||
return getItemEfficiency(item) >= minItemEfficiency && tile.entity.items.totalItems() < itemCapacity;
|
||||
return getItemEfficiency(item) >= minItemEfficiency && tile.entity.items.total() < itemCapacity;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -97,7 +97,7 @@ public abstract class ItemGenerator extends PowerGenerator {
|
||||
}
|
||||
}
|
||||
|
||||
if(entity.generateTime <= 0f && entity.items.totalItems() > 0){
|
||||
if(entity.generateTime <= 0f && entity.items.total() > 0){
|
||||
Effects.effect(generateEffect, tile.worldx() + Mathf.range(size * tilesize/2f), tile.worldy() + Mathf.range(size * tilesize/2f));
|
||||
for(int i = 0; i < entity.items.items.length; i ++){
|
||||
if(entity.items.items[i] > 0){
|
||||
|
||||
@@ -64,7 +64,7 @@ public abstract class ItemLiquidGenerator extends ItemGenerator {
|
||||
}
|
||||
}
|
||||
|
||||
if (entity.generateTime <= 0f && entity.items.totalItems() > 0) {
|
||||
if (entity.generateTime <= 0f && entity.items.total() > 0) {
|
||||
Effects.effect(generateEffect, tile.worldx() + Mathf.range(3f), tile.worldy() + Mathf.range(3f));
|
||||
for (int i = 0; i < entity.items.items.length; i++) {
|
||||
if (entity.items.items[i] > 0) {
|
||||
|
||||
@@ -57,7 +57,7 @@ public class NuclearReactor extends PowerGenerator {
|
||||
@Override
|
||||
public void setBars(){
|
||||
super.setBars();
|
||||
bars.replace(new BlockBar(BarType.inventory, true, tile -> (float)tile.entity.items.getItem(generateItem) / itemCapacity));
|
||||
bars.replace(new BlockBar(BarType.inventory, true, tile -> (float)tile.entity.items.get(generateItem) / itemCapacity));
|
||||
bars.add(new BlockBar(BarType.heat, true, tile -> tile.<NuclearReactorEntity>entity().heat));
|
||||
}
|
||||
|
||||
@@ -73,7 +73,7 @@ public class NuclearReactor extends PowerGenerator {
|
||||
public void update(Tile tile){
|
||||
NuclearReactorEntity entity = tile.entity();
|
||||
|
||||
int fuel = entity.items.getItem(generateItem);
|
||||
int fuel = entity.items.get(generateItem);
|
||||
float fullness = (float)fuel / itemCapacity;
|
||||
|
||||
if(fuel > 0){
|
||||
@@ -81,7 +81,7 @@ public class NuclearReactor extends PowerGenerator {
|
||||
entity.power.amount += powerMultiplier * fullness * Timers.delta();
|
||||
entity.power.amount = Mathf.clamp(entity.power.amount, 0f, powerCapacity);
|
||||
if(entity.timer.get(timerFuel, fuelUseTime)){
|
||||
entity.items.removeItem(generateItem, 1);
|
||||
entity.items.remove(generateItem, 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -123,7 +123,7 @@ public class NuclearReactor extends PowerGenerator {
|
||||
|
||||
NuclearReactorEntity entity = tile.entity();
|
||||
|
||||
int fuel = entity.items.getItem(generateItem);
|
||||
int fuel = entity.items.get(generateItem);
|
||||
|
||||
if(fuel < 5 && entity.heat < 0.5f) return;
|
||||
|
||||
@@ -155,7 +155,7 @@ public class NuclearReactor extends PowerGenerator {
|
||||
|
||||
@Override
|
||||
public boolean acceptItem(Item item, Tile tile, Tile source){
|
||||
return item == generateItem && tile.entity.items.getItem(generateItem) < itemCapacity;
|
||||
return item == generateItem && tile.entity.items.get(generateItem) < itemCapacity;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -23,14 +23,14 @@ public class Compressor extends PowerCrafter {
|
||||
float liquidAdded = Math.min(outputLiquidAmount * Timers.delta(), liquidCapacity - entity.liquids.amount);
|
||||
int itemsUsed = Mathf.ceil(1 + input.amount * entity.progress);
|
||||
|
||||
if(entity.power.amount > powerUsed && entity.items.hasItem(input.item, itemsUsed) && liquidAdded > 0.001f){
|
||||
if(entity.power.amount > powerUsed && entity.items.has(input.item, itemsUsed) && liquidAdded > 0.001f){
|
||||
entity.progress += 1f/craftTime;
|
||||
entity.totalProgress += Timers.delta();
|
||||
handleLiquid(tile, tile, outputLiquid, liquidAdded);
|
||||
}
|
||||
|
||||
if(entity.progress >= 1f){
|
||||
entity.items.removeItem(input);
|
||||
entity.items.remove(input);
|
||||
if(outputItem != null) offloadNear(tile, outputItem);
|
||||
entity.progress = 0f;
|
||||
}
|
||||
@@ -48,7 +48,7 @@ public class Compressor extends PowerCrafter {
|
||||
public void draw(Tile tile) {
|
||||
GenericCrafterEntity entity = tile.entity();
|
||||
|
||||
Draw.rect(name, tile.drawx(), tile.drawy());
|
||||
Draw.rect(region, tile.drawx(), tile.drawy());
|
||||
Draw.rect(name + "-frame" + (int) Mathf.absin(entity.totalProgress, 5f, 2.999f), tile.drawx(), tile.drawy());
|
||||
Draw.color(Color.CLEAR, tile.entity.liquids.liquid.color, tile.entity.liquids.amount / liquidCapacity);
|
||||
Draw.rect(name + "-liquid", tile.drawx(), tile.drawy());
|
||||
|
||||
@@ -57,7 +57,7 @@ public class Cultivator extends Drill {
|
||||
public void draw(Tile tile) {
|
||||
CultivatorEntity entity = tile.entity();
|
||||
|
||||
Draw.rect(name, tile.drawx(), tile.drawy());
|
||||
Draw.rect(region, tile.drawx(), tile.drawy());
|
||||
|
||||
Draw.color(plantColor);
|
||||
Draw.alpha(entity.warmup);
|
||||
|
||||
@@ -91,7 +91,7 @@ public class Drill extends Block{
|
||||
|
||||
DrillEntity entity = tile.entity();
|
||||
|
||||
Draw.rect(name, tile.drawx(), tile.drawy());
|
||||
Draw.rect(region, tile.drawx(), tile.drawy());
|
||||
|
||||
if(drawRim) {
|
||||
Graphics.setAdditiveBlending();
|
||||
@@ -178,7 +178,7 @@ public class Drill extends Block{
|
||||
float powerUsed = Math.min(powerCapacity, powerUse * Timers.delta());
|
||||
float liquidUsed = Math.min(liquidCapacity, liquidUse * Timers.delta());
|
||||
|
||||
if(entity.items.totalItems() < itemCapacity && toAdd.size > 0 &&
|
||||
if(entity.items.total() < itemCapacity && toAdd.size > 0 &&
|
||||
(!hasPower || entity.power.amount >= powerUsed) &&
|
||||
(!liquidRequired || entity.liquids.amount >= liquidUsed)){
|
||||
|
||||
@@ -203,7 +203,7 @@ public class Drill extends Block{
|
||||
}
|
||||
|
||||
if(toAdd.size > 0 && entity.progress >= drillTime + hardnessDrillMultiplier*Math.max(totalHardness, 1f)/multiplier
|
||||
&& tile.entity.items.totalItems() < itemCapacity){
|
||||
&& tile.entity.items.total() < itemCapacity){
|
||||
|
||||
int index = entity.index % toAdd.size;
|
||||
offloadNear(tile, toAdd.get(index));
|
||||
|
||||
@@ -10,7 +10,6 @@ import io.anuke.mindustry.world.meta.BlockStat;
|
||||
import io.anuke.mindustry.world.meta.StatUnit;
|
||||
import io.anuke.ucore.core.Timers;
|
||||
import io.anuke.ucore.graphics.Draw;
|
||||
import io.anuke.ucore.util.Log;
|
||||
|
||||
public class Fracker extends SolidPump {
|
||||
protected Liquid inputLiquid;
|
||||
@@ -51,7 +50,7 @@ public class Fracker extends SolidPump {
|
||||
public void draw(Tile tile) {
|
||||
FrackerEntity entity = tile.entity();
|
||||
|
||||
Draw.rect(name, tile.drawx(), tile.drawy());
|
||||
Draw.rect(region, tile.drawx(), tile.drawy());
|
||||
|
||||
Draw.color(tile.entity.liquids.liquid.color);
|
||||
Draw.alpha(tile.entity.liquids.amount/liquidCapacity);
|
||||
@@ -71,8 +70,8 @@ public class Fracker extends SolidPump {
|
||||
public void update(Tile tile) {
|
||||
FrackerEntity entity = tile.entity();
|
||||
|
||||
while(entity.accumulator > itemUseTime && entity.items.hasItem(inputItem, 1)){
|
||||
entity.items.removeItem(inputItem, 1);
|
||||
while(entity.accumulator > itemUseTime && entity.items.has(inputItem, 1)){
|
||||
entity.items.remove(inputItem, 1);
|
||||
entity.accumulator -= itemUseTime;
|
||||
}
|
||||
|
||||
@@ -87,7 +86,7 @@ public class Fracker extends SolidPump {
|
||||
|
||||
@Override
|
||||
public boolean acceptItem(Item item, Tile tile, Tile source) {
|
||||
return item == inputItem && tile.entity.items.totalItems() < itemCapacity;
|
||||
return item == inputItem && tile.entity.items.total() < itemCapacity;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -51,7 +51,7 @@ public class GenericCrafter extends Block{
|
||||
super.setBars();
|
||||
|
||||
if(inputItem != null) bars.replace(new BlockBar(BarType.inventory, true,
|
||||
tile -> (float)tile.entity.items.getItem(inputItem.item) / itemCapacity));
|
||||
tile -> (float)tile.entity.items.get(inputItem.item) / itemCapacity));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -93,7 +93,7 @@ public class GenericCrafter extends Block{
|
||||
|
||||
if((!hasLiquids || entity.liquids.amount >= liquidUsed) &&
|
||||
(!hasPower || entity.power.amount >= powerUsed) &&
|
||||
(inputItem == null || entity.items.hasItem(inputItem.item, itemsUsed))){
|
||||
(inputItem == null || entity.items.has(inputItem.item, itemsUsed))){
|
||||
|
||||
entity.progress += 1f / craftTime * Timers.delta();
|
||||
entity.totalProgress += Timers.delta();
|
||||
@@ -109,7 +109,7 @@ public class GenericCrafter extends Block{
|
||||
|
||||
if(entity.progress >= 1f){
|
||||
|
||||
if(inputItem != null) tile.entity.items.removeItem(inputItem);
|
||||
if(inputItem != null) tile.entity.items.remove(inputItem);
|
||||
offloadNear(tile, output);
|
||||
Effects.effect(craftEffect, tile.drawx(), tile.drawy());
|
||||
entity.progress = 0f;
|
||||
@@ -128,7 +128,7 @@ public class GenericCrafter extends Block{
|
||||
@Override
|
||||
public boolean acceptItem(Item item, Tile tile, Tile source){
|
||||
TileEntity entity = tile.entity();
|
||||
return inputItem != null && item == inputItem.item && entity.items.getItem(inputItem.item) < itemCapacity;
|
||||
return inputItem != null && item == inputItem.item && entity.items.get(inputItem.item) < itemCapacity;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -46,21 +46,21 @@ public class LiquidMixer extends LiquidBlock{
|
||||
|
||||
@Override
|
||||
public boolean acceptItem(Item item, Tile tile, Tile source) {
|
||||
return item == inputItem && tile.entity.items.getItem(item) < itemCapacity;
|
||||
return item == inputItem && tile.entity.items.get(item) < itemCapacity;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float handleAuxLiquid(Tile tile, Tile source, Liquid liquid, float amount) {
|
||||
LiquidMixerEntity entity = tile.entity();
|
||||
|
||||
if(liquid == inputLiquid && tile.entity.items.hasItem(inputItem, (int)((entity.accumulator + amount)/amount)) &&
|
||||
if(liquid == inputLiquid && tile.entity.items.has(inputItem, (int)((entity.accumulator + amount)/amount)) &&
|
||||
tile.entity.power.amount >= powerUse){
|
||||
|
||||
amount = Math.min(liquidCapacity - tile.entity.liquids.amount, amount);
|
||||
|
||||
entity.accumulator += amount;
|
||||
int items = (int)(entity.accumulator / liquidPerItem);
|
||||
entity.items.removeItem(inputItem, items);
|
||||
entity.items.remove(inputItem, items);
|
||||
entity.accumulator %= liquidPerItem;
|
||||
entity.liquids.liquid = outputLiquid;
|
||||
entity.liquids.amount += amount;
|
||||
|
||||
@@ -64,6 +64,6 @@ public class PhaseWeaver extends PowerSmelter{
|
||||
Draw.reset();
|
||||
}
|
||||
|
||||
Draw.rect(name, tile.drawx(), tile.drawy());
|
||||
Draw.rect(region, tile.drawx(), tile.drawy());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,13 +59,13 @@ public class PowerCrafter extends Block{
|
||||
float powerUsed = Math.min(Timers.delta() * powerUse, tile.entity.power.amount);
|
||||
int itemsUsed = Mathf.ceil(1 + input.amount * entity.progress);
|
||||
|
||||
if(entity.power.amount > powerUsed && entity.items.hasItem(input.item, itemsUsed)){
|
||||
if(entity.power.amount > powerUsed && entity.items.has(input.item, itemsUsed)){
|
||||
entity.progress += 1f/craftTime;
|
||||
entity.totalProgress += Timers.delta();
|
||||
}
|
||||
|
||||
if(entity.progress >= 1f){
|
||||
entity.items.removeItem(input);
|
||||
entity.items.remove(input);
|
||||
if(outputItem != null) offloadNear(tile, outputItem);
|
||||
if(outputLiquid != null) handleLiquid(tile, tile, outputLiquid, outputLiquidAmount);
|
||||
entity.progress = 0f;
|
||||
@@ -82,7 +82,7 @@ public class PowerCrafter extends Block{
|
||||
|
||||
@Override
|
||||
public boolean acceptItem(Item item, Tile tile, Tile source) {
|
||||
return item == input.item && tile.entity.items.getItem(input.item) < itemCapacity;
|
||||
return item == input.item && tile.entity.items.get(input.item) < itemCapacity;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -71,7 +71,7 @@ public class PowerSmelter extends PowerBlock {
|
||||
bars.remove(BarType.inventory);
|
||||
|
||||
for(ItemStack item : inputs){
|
||||
bars.add(new BlockBar(BarType.inventory, true, tile -> (float) tile.entity.items.getItem(item.item) / itemCapacity));
|
||||
bars.add(new BlockBar(BarType.inventory, true, tile -> (float) tile.entity.items.get(item.item) / itemCapacity));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -93,7 +93,7 @@ public class PowerSmelter extends PowerBlock {
|
||||
|
||||
PowerSmelterEntity entity = tile.entity();
|
||||
|
||||
if(entity.timer.get(timerDump, 5) && entity.items.hasItem(result)){
|
||||
if(entity.timer.get(timerDump, 5) && entity.items.has(result)){
|
||||
tryDump(tile, result);
|
||||
}
|
||||
|
||||
@@ -114,12 +114,12 @@ public class PowerSmelter extends PowerBlock {
|
||||
|
||||
//make sure it has all the items
|
||||
for(ItemStack item : inputs){
|
||||
if(!entity.items.hasItem(item.item, item.amount)){
|
||||
if(!entity.items.has(item.item, item.amount)){
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if(entity.items.getItem(result) >= itemCapacity //output full
|
||||
if(entity.items.get(result) >= itemCapacity //output full
|
||||
|| entity.heat <= minHeat //not burning
|
||||
|| !entity.timer.get(timerCraft, craftTime)){ //not yet time
|
||||
return;
|
||||
@@ -130,8 +130,8 @@ public class PowerSmelter extends PowerBlock {
|
||||
if(useFlux){
|
||||
//remove flux materials if present
|
||||
for(Item item : Item.all()){
|
||||
if(item.fluxiness >= minFlux && tile.entity.items.getItem(item) >= fluxNeeded){
|
||||
tile.entity.items.removeItem(item, fluxNeeded);
|
||||
if(item.fluxiness >= minFlux && tile.entity.items.get(item) >= fluxNeeded){
|
||||
tile.entity.items.remove(item, fluxNeeded);
|
||||
|
||||
//chance of not consuming inputs if flux material present
|
||||
consumeInputs = !Mathf.chance(item.fluxiness * baseFluxChance);
|
||||
@@ -142,7 +142,7 @@ public class PowerSmelter extends PowerBlock {
|
||||
|
||||
if(consumeInputs) {
|
||||
for (ItemStack item : inputs) {
|
||||
entity.items.removeItem(item.item, item.amount);
|
||||
entity.items.remove(item.item, item.amount);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -155,12 +155,12 @@ public class PowerSmelter extends PowerBlock {
|
||||
|
||||
for(ItemStack stack : inputs){
|
||||
if(stack.item == item){
|
||||
return tile.entity.items.getItem(item) < itemCapacity;
|
||||
return tile.entity.items.get(item) < itemCapacity;
|
||||
}
|
||||
}
|
||||
|
||||
if(useFlux && item.fluxiness >= minFlux){
|
||||
return tile.entity.items.getItem(item) < itemCapacity;
|
||||
return tile.entity.items.get(item) < itemCapacity;
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -168,7 +168,7 @@ public class PowerSmelter extends PowerBlock {
|
||||
|
||||
@Override
|
||||
public int getMaximumAccepted(Tile tile, Item item) {
|
||||
return itemCapacity - tile.entity.items.getItem(item);
|
||||
return itemCapacity - tile.entity.items.get(item);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -5,18 +5,26 @@ import io.anuke.mindustry.world.Tile;
|
||||
import io.anuke.ucore.graphics.Draw;
|
||||
|
||||
public class Pulverizer extends GenericCrafter {
|
||||
protected TextureRegion rotatorRegion;
|
||||
|
||||
public Pulverizer(String name) {
|
||||
super(name);
|
||||
hasItems = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void load() {
|
||||
super.load();
|
||||
|
||||
rotatorRegion = Draw.region(name + "-rotator");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(Tile tile) {
|
||||
GenericCrafterEntity entity = tile.entity();
|
||||
|
||||
Draw.rect(name, tile.drawx(), tile.drawy());
|
||||
Draw.rect(name + "-rotator", tile.drawx(), tile.drawy(), entity.totalProgress * 2f);
|
||||
Draw.rect(region, tile.drawx(), tile.drawy());
|
||||
Draw.rect(rotatorRegion, tile.drawx(), tile.drawy(), entity.totalProgress * 2f);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package io.anuke.mindustry.world.blocks.production;
|
||||
|
||||
import com.badlogic.gdx.graphics.Color;
|
||||
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
||||
import io.anuke.mindustry.entities.TileEntity;
|
||||
import io.anuke.mindustry.type.Item;
|
||||
import io.anuke.mindustry.type.Liquid;
|
||||
@@ -30,6 +31,9 @@ public class Separator extends Block {
|
||||
protected float spinnerThickness = 1f;
|
||||
protected float spinnerSpeed = 2f;
|
||||
|
||||
protected Color color = Color.valueOf("858585");
|
||||
protected TextureRegion liquidRegion;
|
||||
|
||||
protected boolean offloading = false;
|
||||
|
||||
public Separator(String name) {
|
||||
@@ -40,6 +44,13 @@ public class Separator extends Block {
|
||||
hasLiquids = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void load() {
|
||||
super.load();
|
||||
|
||||
liquidRegion = Draw.region(name + "-liquid");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setStats() {
|
||||
super.setStats();
|
||||
@@ -67,9 +78,9 @@ public class Separator extends Block {
|
||||
|
||||
Draw.color(tile.entity.liquids.liquid.color);
|
||||
Draw.alpha(tile.entity.liquids.amount / liquidCapacity);
|
||||
Draw.rect(name + "-liquid", tile.drawx(), tile.drawy());
|
||||
Draw.rect(liquidRegion, tile.drawx(), tile.drawy());
|
||||
|
||||
Draw.color(Color.valueOf("858585"));
|
||||
Draw.color(color);
|
||||
Lines.stroke(spinnerThickness);
|
||||
Lines.spikes(tile.drawx(), tile.drawy(), spinnerRadius, spinnerLength, 3, entity.totalProgress*spinnerSpeed);
|
||||
Draw.reset();
|
||||
@@ -84,7 +95,7 @@ public class Separator extends Block {
|
||||
|
||||
entity.totalProgress += entity.warmup*Timers.delta();
|
||||
|
||||
if(entity.liquids.amount >= liquidUsed && entity.items.hasItem(item) &&
|
||||
if(entity.liquids.amount >= liquidUsed && entity.items.has(item) &&
|
||||
(!hasPower || entity.power.amount >= powerUsed)){
|
||||
entity.progress += 1f/filterTime;
|
||||
entity.liquids.amount -= liquidUsed;
|
||||
@@ -98,7 +109,7 @@ public class Separator extends Block {
|
||||
if(entity.progress >= 1f){
|
||||
entity.progress = 0f;
|
||||
Item item = Mathf.select(results);
|
||||
entity.items.removeItem(this.item, 1);
|
||||
entity.items.remove(this.item, 1);
|
||||
if(item != null){
|
||||
offloading = true;
|
||||
offloadNear(tile, item);
|
||||
@@ -123,7 +134,7 @@ public class Separator extends Block {
|
||||
|
||||
@Override
|
||||
public boolean acceptItem(Item item, Tile tile, Tile source) {
|
||||
return this.item == item && tile.entity.items.getItem(item) < itemCapacity;
|
||||
return this.item == item && tile.entity.items.get(item) < itemCapacity;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -47,7 +47,7 @@ public class Smelter extends Block{
|
||||
@Override
|
||||
public void setBars(){
|
||||
for(ItemStack item : inputs){
|
||||
bars.add(new BlockBar(BarType.inventory, true, tile -> (float)tile.entity.items.getItem(item.item)/itemCapacity));
|
||||
bars.add(new BlockBar(BarType.inventory, true, tile -> (float)tile.entity.items.get(item.item)/itemCapacity));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -79,13 +79,13 @@ public class Smelter extends Block{
|
||||
public void update(Tile tile){
|
||||
SmelterEntity entity = tile.entity();
|
||||
|
||||
if(entity.timer.get(timerDump, 5) && entity.items.hasItem(result)){
|
||||
if(entity.timer.get(timerDump, 5) && entity.items.has(result)){
|
||||
tryDump(tile, result);
|
||||
}
|
||||
|
||||
//add fuel
|
||||
if(entity.items.getItem(fuel) > 0 && entity.burnTime <= 0f){
|
||||
entity.items.removeItem(fuel, 1);
|
||||
if(entity.items.get(fuel) > 0 && entity.burnTime <= 0f){
|
||||
entity.items.remove(fuel, 1);
|
||||
entity.burnTime += burnDuration;
|
||||
Effects.effect(burnEffect, entity.x + Mathf.range(2f), entity.y + Mathf.range(2f));
|
||||
}
|
||||
@@ -100,12 +100,12 @@ public class Smelter extends Block{
|
||||
|
||||
//make sure it has all the items
|
||||
for(ItemStack item : inputs){
|
||||
if(!entity.items.hasItem(item.item, item.amount)){
|
||||
if(!entity.items.has(item.item, item.amount)){
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if(entity.items.getItem(result) >= itemCapacity //output full
|
||||
if(entity.items.get(result) >= itemCapacity //output full
|
||||
|| entity.burnTime <= 0 //not burning
|
||||
|| !entity.timer.get(timerCraft, craftTime)){ //not yet time
|
||||
return;
|
||||
@@ -116,8 +116,8 @@ public class Smelter extends Block{
|
||||
if(useFlux){
|
||||
//remove flux materials if present
|
||||
for(Item item : Item.all()){
|
||||
if(item.fluxiness >= minFlux && tile.entity.items.getItem(item) > 0){
|
||||
tile.entity.items.removeItem(item, 1);
|
||||
if(item.fluxiness >= minFlux && tile.entity.items.get(item) > 0){
|
||||
tile.entity.items.remove(item, 1);
|
||||
|
||||
//chance of not consuming inputs if flux material present
|
||||
consumeInputs = !Mathf.chance(item.fluxiness * baseFluxChance);
|
||||
@@ -128,7 +128,7 @@ public class Smelter extends Block{
|
||||
|
||||
if(consumeInputs) {
|
||||
for (ItemStack item : inputs) {
|
||||
entity.items.removeItem(item.item, item.amount);
|
||||
entity.items.remove(item.item, item.amount);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -138,7 +138,7 @@ public class Smelter extends Block{
|
||||
|
||||
@Override
|
||||
public int getMaximumAccepted(Tile tile, Item item) {
|
||||
return itemCapacity - tile.entity.items.getItem(item);
|
||||
return itemCapacity - tile.entity.items.get(item);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -152,8 +152,8 @@ public class Smelter extends Block{
|
||||
}
|
||||
}
|
||||
|
||||
return (isInput && tile.entity.items.getItem(item) < itemCapacity) || (item == fuel && tile.entity.items.getItem(fuel) < itemCapacity) ||
|
||||
(useFlux && item.fluxiness >= minFlux && tile.entity.items.getItem(item) < itemCapacity);
|
||||
return (isInput && tile.entity.items.get(item) < itemCapacity) || (item == fuel && tile.entity.items.get(fuel) < itemCapacity) ||
|
||||
(useFlux && item.fluxiness >= minFlux && tile.entity.items.get(item) < itemCapacity);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -43,7 +43,7 @@ public class SolidPump extends Pump {
|
||||
public void draw(Tile tile) {
|
||||
SolidPumpEntity entity = tile.entity();
|
||||
|
||||
Draw.rect(name, tile.drawx(), tile.drawy());
|
||||
Draw.rect(region, tile.drawx(), tile.drawy());
|
||||
Draw.color(tile.entity.liquids.liquid.color);
|
||||
Draw.alpha(tile.entity.liquids.amount / liquidCapacity);
|
||||
Draw.rect(liquidRegion, tile.drawx(), tile.drawy());
|
||||
|
||||
@@ -133,7 +133,7 @@ public class CoreBlock extends StorageBlock {
|
||||
@Override
|
||||
public int acceptStack(Item item, int amount, Tile tile, Unit source){
|
||||
if(acceptItem(item, tile, tile) && hasItems && source.getTeam() == tile.getTeam()){
|
||||
return Math.min(itemCapacity - tile.entity.items.getItem(item), amount);
|
||||
return Math.min(itemCapacity - tile.entity.items.get(item), amount);
|
||||
}else{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -30,16 +30,16 @@ public class SortedUnloader extends Unloader implements SelectionTrait{
|
||||
public void update(Tile tile){
|
||||
SortedUnloaderEntity entity = tile.entity();
|
||||
|
||||
if(entity.items.totalItems() == 0 && entity.timer.get(timerUnload, speed)){
|
||||
if(entity.items.total() == 0 && entity.timer.get(timerUnload, speed)){
|
||||
tile.allNearby(other -> {
|
||||
if(other.block() instanceof StorageBlock && entity.items.totalItems() == 0 &&
|
||||
if(other.block() instanceof StorageBlock && entity.items.total() == 0 &&
|
||||
((StorageBlock)other.block()).hasItem(other, entity.sortItem)){
|
||||
offloadNear(tile, ((StorageBlock)other.block()).removeItem(other, entity.sortItem));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if(entity.items.totalItems() > 0){
|
||||
if(entity.items.total() > 0){
|
||||
tryDump(tile);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,16 +20,16 @@ public class Unloader extends Block {
|
||||
|
||||
@Override
|
||||
public void update(Tile tile){
|
||||
if(tile.entity.items.totalItems() == 0 && tile.entity.timer.get(timerUnload, speed)){
|
||||
if(tile.entity.items.total() == 0 && tile.entity.timer.get(timerUnload, speed)){
|
||||
tile.allNearby(other -> {
|
||||
if(other.block() instanceof StorageBlock && tile.entity.items.totalItems() == 0 &&
|
||||
if(other.block() instanceof StorageBlock && tile.entity.items.total() == 0 &&
|
||||
((StorageBlock)other.block()).hasItem(other, null)){
|
||||
offloadNear(tile, ((StorageBlock)other.block()).removeItem(other, null));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if(tile.entity.items.totalItems() > 0){
|
||||
if(tile.entity.items.total() > 0){
|
||||
tryDump(tile);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ public class Vault extends StorageBlock {
|
||||
int iterations = Math.max(1, (int) (Timers.delta() + 0.4f));
|
||||
|
||||
for(int i = 0; i < iterations; i ++) {
|
||||
if (tile.entity.items.totalItems() > 0) {
|
||||
if (tile.entity.items.total() > 0) {
|
||||
tryDump(tile);
|
||||
}
|
||||
}
|
||||
@@ -31,7 +31,7 @@ public class Vault extends StorageBlock {
|
||||
|
||||
@Override
|
||||
public boolean acceptItem(Item item, Tile tile, Tile source) {
|
||||
return tile.entity.items.totalItems() < itemCapacity;
|
||||
return tile.entity.items.total() < itemCapacity;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -39,7 +39,7 @@ public class Vault extends StorageBlock {
|
||||
to = to.target();
|
||||
if (!(to.block() instanceof StorageBlock)) return false;
|
||||
|
||||
return !(to.block() instanceof Vault) || (float) to.entity.items.totalItems() / to.block().itemCapacity < (float) tile.entity.items.totalItems() / itemCapacity;
|
||||
return !(to.block() instanceof Vault) || (float) to.entity.items.total() / to.block().itemCapacity < (float) tile.entity.items.total() / itemCapacity;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ public class DropPoint extends Block {
|
||||
|
||||
@Override
|
||||
public void update(Tile tile) {
|
||||
if (tile.entity.items.totalItems() > 0) {
|
||||
if (tile.entity.items.total() > 0) {
|
||||
tryDump(tile);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -112,7 +112,7 @@ public class Reconstructor extends Block{
|
||||
ReconstructorEntity entity = tile.entity();
|
||||
|
||||
if(entity.solid){
|
||||
Draw.rect(name, tile.drawx(), tile.drawy());
|
||||
Draw.rect(region, tile.drawx(), tile.drawy());
|
||||
}else{
|
||||
Draw.rect(openRegion, tile.drawx(), tile.drawy());
|
||||
}
|
||||
|
||||
@@ -118,7 +118,7 @@ public class ResupplyPoint extends Block{
|
||||
|
||||
@Override
|
||||
public boolean acceptItem(Item item, Tile tile, Tile source) {
|
||||
return tile.entity.items.totalItems() < itemCapacity;
|
||||
return tile.entity.items.total() < itemCapacity;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -19,7 +19,7 @@ import io.anuke.mindustry.type.ItemStack;
|
||||
import io.anuke.mindustry.world.BarType;
|
||||
import io.anuke.mindustry.world.Block;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
import io.anuke.mindustry.world.blocks.modules.InventoryModule;
|
||||
import io.anuke.mindustry.world.modules.InventoryModule;
|
||||
import io.anuke.mindustry.world.meta.BlockBar;
|
||||
import io.anuke.mindustry.world.meta.BlockStat;
|
||||
import io.anuke.mindustry.world.meta.StatUnit;
|
||||
@@ -154,7 +154,7 @@ public class UnitFactory extends Block {
|
||||
entity.openCountdown = openDuration;
|
||||
|
||||
for(ItemStack stack : requirements){
|
||||
entity.items.removeItem(stack.item, stack.amount);
|
||||
entity.items.remove(stack.item, stack.amount);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -162,7 +162,7 @@ public class UnitFactory extends Block {
|
||||
@Override
|
||||
public boolean acceptItem(Item item, Tile tile, Tile source) {
|
||||
for(ItemStack stack : requirements){
|
||||
if(item == stack.item && tile.entity.items.getItem(item) <= stack.amount*2){
|
||||
if(item == stack.item && tile.entity.items.get(item) <= stack.amount*2){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -176,7 +176,7 @@ public class UnitFactory extends Block {
|
||||
|
||||
protected boolean hasRequirements(InventoryModule inv, float fraction){
|
||||
for(ItemStack stack : requirements){
|
||||
if(!inv.hasItem(stack.item, (int)(fraction * stack.amount))){
|
||||
if(!inv.has(stack.item, (int)(fraction * stack.amount))){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
8
core/src/io/anuke/mindustry/world/consumers/Consume.java
Normal file
8
core/src/io/anuke/mindustry/world/consumers/Consume.java
Normal file
@@ -0,0 +1,8 @@
|
||||
package io.anuke.mindustry.world.consumers;
|
||||
|
||||
import io.anuke.mindustry.entities.TileEntity;
|
||||
|
||||
public interface Consume {
|
||||
void update(TileEntity entity);
|
||||
boolean valid();
|
||||
}
|
||||
145
core/src/io/anuke/mindustry/world/modules/InventoryModule.java
Normal file
145
core/src/io/anuke/mindustry/world/modules/InventoryModule.java
Normal file
@@ -0,0 +1,145 @@
|
||||
package io.anuke.mindustry.world.modules;
|
||||
|
||||
import io.anuke.mindustry.type.Item;
|
||||
import io.anuke.mindustry.type.ItemStack;
|
||||
import io.anuke.mindustry.world.blocks.BlockModule;
|
||||
|
||||
import java.io.DataInput;
|
||||
import java.io.DataOutput;
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
|
||||
public class InventoryModule extends BlockModule{
|
||||
private int[] items = new int[Item.all().size];
|
||||
private int total;
|
||||
|
||||
public void forEach(ItemConsumer cons){
|
||||
for (int i = 0; i < items.length; i++) {
|
||||
if(items[i] > 0){
|
||||
cons.accept(Item.getByID(i), items[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public float sum(ItemCalculator calc){
|
||||
float sum = 0f;
|
||||
for (int i = 0; i < items.length; i++) {
|
||||
if(items[i] > 0){
|
||||
sum += calc.get(Item.getByID(i), items[i]);
|
||||
}
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
public boolean has(Item item){
|
||||
return get(item) > 0;
|
||||
}
|
||||
|
||||
public boolean has(Item item, int amount){
|
||||
return get(item) >= amount;
|
||||
}
|
||||
|
||||
public boolean has(ItemStack[] stacks){
|
||||
for(ItemStack stack : stacks){
|
||||
if(!has(stack.item, stack.amount)) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean has(ItemStack[] stacks, float amountScaling){
|
||||
for(ItemStack stack : stacks){
|
||||
if(!has(stack.item, (int)(stack.amount * amountScaling))) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**Returns true if this entity has at least one of each item in each stack.*/
|
||||
public boolean hasOne(ItemStack[] stacks){
|
||||
for(ItemStack stack : stacks){
|
||||
if(!has(stack.item, 1)) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//TODO optimize!
|
||||
public int total(){
|
||||
return total;
|
||||
}
|
||||
|
||||
public Item take(){
|
||||
for(int i = 0; i < items.length; i ++){
|
||||
if(items[i] > 0){
|
||||
items[i] --;
|
||||
total --;
|
||||
return Item.getByID(i);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public int get(Item item){
|
||||
return items[item.id];
|
||||
}
|
||||
|
||||
public void set(Item item, int amount){
|
||||
total += (amount - items[item.id]);
|
||||
items[item.id] = amount;
|
||||
}
|
||||
|
||||
public void add(Item item, int amount){
|
||||
items[item.id] += amount;
|
||||
total += amount;
|
||||
}
|
||||
|
||||
public void remove(Item item, int amount){
|
||||
items[item.id] -= amount;
|
||||
total -= amount;
|
||||
}
|
||||
|
||||
public void remove(ItemStack stack){
|
||||
remove(stack.item, stack.amount);
|
||||
}
|
||||
|
||||
public void clear(){
|
||||
Arrays.fill(items, 0);
|
||||
total = 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(DataOutput stream) throws IOException {
|
||||
byte amount = 0;
|
||||
for (int item : items) {
|
||||
if (item > 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(DataInput stream) throws IOException {
|
||||
byte count = stream.readByte();
|
||||
total = 0;
|
||||
|
||||
for(int j = 0; j < count; j ++){
|
||||
int itemid = stream.readByte();
|
||||
int itemamount = stream.readInt();
|
||||
items[itemid] = itemamount;
|
||||
total += itemamount;
|
||||
}
|
||||
}
|
||||
|
||||
public interface ItemConsumer{
|
||||
void accept(Item item, float amount);
|
||||
}
|
||||
|
||||
public interface ItemCalculator{
|
||||
float get(Item item, int amount);
|
||||
}
|
||||
}
|
||||
95
core/src/io/anuke/mindustry/world/modules/LiquidModule.java
Normal file
95
core/src/io/anuke/mindustry/world/modules/LiquidModule.java
Normal file
@@ -0,0 +1,95 @@
|
||||
package io.anuke.mindustry.world.modules;
|
||||
|
||||
import io.anuke.mindustry.type.Liquid;
|
||||
import io.anuke.mindustry.world.blocks.BlockModule;
|
||||
|
||||
import java.io.DataInput;
|
||||
import java.io.DataOutput;
|
||||
import java.io.IOException;
|
||||
|
||||
public class LiquidModule extends BlockModule {
|
||||
private float[] liquids = new float[Liquid.all().size];
|
||||
private float total;
|
||||
private Liquid current = Liquid.getByID(0);
|
||||
|
||||
/**Returns total amount of liquids.*/
|
||||
public float total(){
|
||||
return total;
|
||||
}
|
||||
|
||||
/**Last recieved or loaded liquid. Only valid for liquid modules with 1 type of liquid.*/
|
||||
public Liquid current(){
|
||||
return current;
|
||||
}
|
||||
|
||||
public float get(Liquid liquid){
|
||||
return liquids[liquid.id];
|
||||
}
|
||||
|
||||
public void add(Liquid liquid, float amount){
|
||||
liquids[liquid.id] += amount;
|
||||
total += amount;
|
||||
}
|
||||
|
||||
public void remove(Liquid liquid, float amount){
|
||||
add(liquid, -amount);
|
||||
}
|
||||
|
||||
public void forEach(LiquidConsumer cons){
|
||||
for (int i = 0; i < liquids.length; i++) {
|
||||
if(liquids[i] > 0){
|
||||
cons.accept(Liquid.getByID(i), liquids[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public float sum(LiquidCalculator calc){
|
||||
float sum = 0f;
|
||||
for (int i = 0; i < liquids.length; i++) {
|
||||
if(liquids[i] > 0){
|
||||
sum += calc.get(Liquid.getByID(i), liquids[i]);
|
||||
}
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(DataOutput stream) throws IOException {
|
||||
byte amount = 0;
|
||||
for (float liquid : liquids) {
|
||||
if (liquid > 0) amount++;
|
||||
}
|
||||
|
||||
stream.writeByte(amount); //amount of liquids
|
||||
|
||||
for(int i = 0; i < liquids.length; i ++){
|
||||
if(liquids[i] > 0){
|
||||
stream.writeByte(i); //liquid ID
|
||||
stream.writeFloat(liquids[i]); //item amount
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(DataInput stream) throws IOException {
|
||||
byte count = stream.readByte();
|
||||
|
||||
for(int j = 0; j < count; j ++){
|
||||
int liquidid = stream.readByte();
|
||||
float amount = stream.readFloat();
|
||||
liquids[liquidid] = amount;
|
||||
if(amount > 0){
|
||||
current = Liquid.getByID(liquidid);
|
||||
}
|
||||
this.total += amount;
|
||||
}
|
||||
}
|
||||
|
||||
public interface LiquidConsumer{
|
||||
void accept(Liquid liquid, float amount);
|
||||
}
|
||||
|
||||
public interface LiquidCalculator{
|
||||
float get(Liquid liquid, float amount);
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package io.anuke.mindustry.world.blocks.modules;
|
||||
package io.anuke.mindustry.world.modules;
|
||||
|
||||
import io.anuke.mindustry.world.blocks.BlockModule;
|
||||
|
||||
Reference in New Issue
Block a user