diff --git a/core/src/io/anuke/mindustry/ai/Pathfinder.java b/core/src/io/anuke/mindustry/ai/Pathfinder.java index 7710c48588..8ee044e32b 100644 --- a/core/src/io/anuke/mindustry/ai/Pathfinder.java +++ b/core/src/io/anuke/mindustry/ai/Pathfinder.java @@ -66,7 +66,7 @@ public class Pathfinder{ if(other == null) continue; if(values[dx][dy] < value && (target == null || values[dx][dy] < tl) && - !other.solid() && + !other.solid() && other.floor().drownTime <= 0 && !(point.x != 0 && point.y != 0 && (world.solid(tile.x + point.x, tile.y) || world.solid(tile.x, tile.y + point.y)))){ //diagonal corner trap target = other; tl = values[dx][dy]; diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index 534d98093c..2cdd52ad3b 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -7,7 +7,7 @@ import io.anuke.arc.collection.IntSet; import io.anuke.arc.graphics.Color; import io.anuke.arc.math.RandomXS128; import io.anuke.arc.util.*; -import io.anuke.arc.util.io.ReusableByteArrayInputStream; +import io.anuke.arc.util.io.ReusableByteInStream; import io.anuke.arc.util.serialization.Base64Coder; import io.anuke.mindustry.Vars; import io.anuke.mindustry.core.GameState.State; @@ -50,7 +50,7 @@ public class NetClient implements ApplicationListener{ /** List of entities that were removed, and need not be added while syncing. */ private IntSet removed = new IntSet(); /** Byte stream for reading in snapshots. */ - private ReusableByteArrayInputStream byteStream = new ReusableByteArrayInputStream(); + private ReusableByteInStream byteStream = new ReusableByteInStream(); private DataInputStream dataStream = new DataInputStream(byteStream); public NetClient(){ diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index 9c5f6ed830..605dce9128 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -13,7 +13,7 @@ import io.anuke.arc.math.geom.Rectangle; import io.anuke.arc.math.geom.Vector2; import io.anuke.arc.util.*; import io.anuke.arc.util.io.ByteBufferOutput; -import io.anuke.arc.util.io.CountableByteArrayOutputStream; +import io.anuke.arc.util.io.ReusableByteOutStream; import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.entities.Entities; @@ -56,7 +56,7 @@ public class NetServer implements ApplicationListener{ private ByteBufferOutput outputBuffer = new ByteBufferOutput(writeBuffer); /** Stream for writing player sync data to. */ - private CountableByteArrayOutputStream syncStream = new CountableByteArrayOutputStream(); + private ReusableByteOutStream syncStream = new ReusableByteOutStream(); /** Data stream for writing player sync data to. */ private DataOutputStream dataStream = new DataOutputStream(syncStream); diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index 60cc34dc89..c3aa1ec35e 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -433,15 +433,17 @@ public class Block extends BlockStorage{ }else{ current = entity -> entity.liquids.current(); } - bars.add("liquid", entity -> new Bar(() -> entity.liquids.get(current.get(entity)) <= 0.001f ? Core.bundle.get("bar.liquid") : current.get(entity).localizedName(), () -> current.get(entity).color, () -> entity.liquids.get(current.get(entity)) / liquidCapacity)); + bars.add("liquid", entity -> new Bar(() -> entity.liquids.get(current.get(entity)) <= 0.001f ? Core.bundle.get("bar.liquid") : current.get(entity).localizedName(), + () -> current.get(entity).color, () -> entity.liquids.get(current.get(entity)) / liquidCapacity)); } if(hasPower && consumes.hasPower()){ - boolean buffered = consumes.getPower().buffered; - float capacity = consumes.getPower().capacity; + ConsumePower cons = consumes.getPower(); + boolean buffered = cons.buffered; + float capacity = cons.capacity; bars.add("power", entity -> new Bar(() -> buffered ? Core.bundle.format("bar.poweramount", Float.isNaN(entity.power.satisfaction * capacity) ? "" : (int)(entity.power.satisfaction * capacity)) : - Core.bundle.get("bar.power"), () -> Pal.powerBar, () -> entity.power.satisfaction)); + Core.bundle.get("bar.power"), () -> Pal.powerBar, () -> Mathf.isZero(cons.requestedPower(entity)) && entity.power.graph.getPowerProduced() + entity.power.graph.getBatteryStored() > 0f ? 1f : entity.power.satisfaction)); } if(hasItems && configurable){ diff --git a/core/src/io/anuke/mindustry/world/Tile.java b/core/src/io/anuke/mindustry/world/Tile.java index 8b418769dd..3bb1503058 100644 --- a/core/src/io/anuke/mindustry/world/Tile.java +++ b/core/src/io/anuke/mindustry/world/Tile.java @@ -382,7 +382,7 @@ public class Tile implements Position, TargetTrait{ Point2 point = Geometry.d8[i]; Tile tile = world.tile(x + point.x, y + point.y); if(tile != null && tile.floor.isLiquid){ - cost += 3; + cost += 4; } if(tile != null && tile.solid()){ occluded = true; @@ -390,17 +390,35 @@ public class Tile implements Position, TargetTrait{ } } + //+24 + if(occluded){ cost += 2; } + //+26 + if(target().synthetic()){ cost += Mathf.clamp(target().block().health / 10f, 0, 20); } + //+46 + if(floor.isLiquid){ cost += 10; } + + //+56 + + if(floor.drownTime > 0){ + cost += 70; + } + + //+126 + + if(cost < 0){ + cost = Byte.MAX_VALUE; + } } protected void preChanged(){ diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/PowerTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/PowerTurret.java index d48777f128..1c11cd3da2 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/PowerTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/PowerTurret.java @@ -26,8 +26,8 @@ public abstract class PowerTurret extends CooledTurret{ @Override public boolean hasAmmo(Tile tile){ - //only shoot if there's power - return tile.entity.cons.valid(); + //you can always rotate, but never shoot if there's no power + return true; } @Override @@ -37,6 +37,6 @@ public abstract class PowerTurret extends CooledTurret{ @Override protected float baseReloadSpeed(Tile tile){ - return tile.entity.power.satisfaction; + return tile.isEnemyCheat() ? 1f : tile.entity.power.satisfaction; } } diff --git a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java index 6a17d50abb..7d7077a371 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java @@ -172,7 +172,6 @@ public class UnitFactory extends Block{ entity.cons.trigger(); } } - @Override public int getMaximumAccepted(Tile tile, Item item){ return capacities[item.id]; @@ -198,6 +197,7 @@ public class UnitFactory extends Block{ @Override public void write(DataOutput stream) throws IOException{ stream.writeFloat(buildTime); + stream.writeFloat(0f); stream.writeInt(spawned); }