Merged current master to branch

This commit is contained in:
Timmeey86
2018-12-06 19:48:01 +01:00
69 changed files with 645 additions and 552 deletions

View File

@@ -51,8 +51,8 @@ public class BlockIndexer{
public BlockIndexer(){
Events.on(TileChangeEvent.class, event -> {
if(typeMap.get(event.tile.packedPosition()) != null){
TileIndex index = typeMap.get(event.tile.packedPosition());
if(typeMap.get(event.tile.pos()) != null){
TileIndex index = typeMap.get(event.tile.pos());
for(BlockFlag flag : index.flags){
getFlagged(index.team)[flag.ordinal()].remove(event.tile);
}
@@ -86,7 +86,7 @@ public class BlockIndexer{
process(tile);
if(tile.entity != null && tile.entity.healthf() < 0.9999f){
if(tile.entity != null && tile.entity.damaged()){
notifyTileDamaged(tile.entity);
}
}
@@ -116,7 +116,7 @@ public class BlockIndexer{
ObjectSet<Tile> set = damagedTiles[team.ordinal()];
for(Tile tile : set){
if(tile.entity == null || tile.entity.getTeam() != team || tile.entity.healthf() >= 0.9999f){
if(tile.entity == null || tile.entity.getTeam() != team || !tile.entity.damaged()){
returnArray.add(tile);
}
}
@@ -230,7 +230,7 @@ public class BlockIndexer{
map[flag.ordinal()] = arr;
}
typeMap.put(tile.packedPosition(), new TileIndex(tile.block().flags, tile.getTeam()));
typeMap.put(tile.pos(), new TileIndex(tile.block().flags, tile.getTeam()));
}
if(ores == null) return;

View File

@@ -21,7 +21,7 @@ import java.io.IOException;
import static io.anuke.mindustry.Vars.*;
public class WaveSpawner{
private static final int quadsize = 4;
private static final int quadsize = 6;
private GridBits quadrants;
@@ -164,7 +164,7 @@ public class WaveSpawner{
for(int y = quady * quadsize; y < world.height() && y < (quady + 1) * quadsize; y++){
Tile tile = world.tile(x, y);
if(tile == null || tile.solid() || world.pathfinder.getValueforTeam(Team.red, x, y) == Float.MAX_VALUE){
if(tile == null || tile.solid() || tile.getTeam() == defaultTeam || world.pathfinder.getValueforTeam(Team.red, x, y) == Float.MAX_VALUE || tile.floor().isLiquid){
setQuad(quadx, quady, false);
break outer;
}
@@ -217,8 +217,8 @@ public class WaveSpawner{
//TODO instead of randomly scattering locations around the map, find spawns close to each other
private void findLocation(GroundSpawn spawn){
spawn.x = -1;
spawn.y = -1;
spawn.x = Mathf.random(quadWidth()-1);
spawn.y = Mathf.random(quadHeight()-1);
int shellWidth = quadWidth() * 2 + quadHeight() * 2 * 6;
shellWidth = Math.min(quadWidth() * quadHeight() / 4, shellWidth);

View File

@@ -11,7 +11,7 @@ import io.anuke.ucore.core.Timers;
import io.anuke.ucore.util.Mathf;
public class StatusEffects implements ContentList{
public static StatusEffect none, burning, freezing, wet, melting, tarred, overdrive, shielded;
public static StatusEffect none, burning, freezing, wet, melting, tarred, overdrive, shielded, shocked;
@Override
public void load(){
@@ -47,7 +47,8 @@ public class StatusEffects implements ContentList{
freezing = new StatusEffect(5 * 60f){
{
oppositeScale = 0.4f;
speedMultiplier = 0.5f;
speedMultiplier = 0.6f;
armorMultiplier = 0.8f;
}
@Override
@@ -65,6 +66,17 @@ public class StatusEffects implements ContentList{
speedMultiplier = 0.9f;
}
@Override
public StatusEntry getTransition(Unit unit, StatusEffect to, float time, float newTime, StatusEntry result){
if(to == shocked){
//get shocked when wet
unit.damage(15f);
return result.set(this, time);
}
return super.getTransition(unit, to, time, newTime, result);
}
@Override
public void update(Unit unit, float time){
if(Mathf.chance(Timers.delta() * 0.15f)){
@@ -145,6 +157,13 @@ public class StatusEffects implements ContentList{
}
};
shocked = new StatusEffect(1f){
{
armorMultiplier = 3f;
}
};
wet.setOpposites(shocked);
melting.setOpposites(wet, freezing);
wet.setOpposites(burning);
freezing.setOpposites(burning, melting);

View File

@@ -39,6 +39,8 @@ public class TurretBullets extends BulletList implements ContentList{
lifetime = Lightning.lifetime;
hiteffect = BulletFx.hitLancer;
despawneffect = Fx.none;
status = StatusEffects.shocked;
statusIntensity = 1f;
}
};
@@ -71,7 +73,7 @@ public class TurretBullets extends BulletList implements ContentList{
super.hit(b);
tile = tile.target();
if(tile.getTeam() == b.getTeam() && !(tile.block() instanceof BuildBlock)){
if(tile != null && tile.getTeam() == b.getTeam() && !(tile.block() instanceof BuildBlock)){
Effects.effect(BlockFx.healBlockFull, Palette.heal, tile.drawx(), tile.drawy(), tile.block().size);
tile.entity.healBy(healPercent / 100f * tile.entity.maxHealth());
}

View File

@@ -26,7 +26,10 @@ import io.anuke.mindustry.ui.dialogs.FloatingDialog;
import io.anuke.ucore.core.*;
import io.anuke.ucore.entities.EntityQuery;
import io.anuke.ucore.modules.Module;
import io.anuke.ucore.util.*;
import io.anuke.ucore.util.Atlas;
import io.anuke.ucore.util.Bundles;
import io.anuke.ucore.util.Strings;
import io.anuke.ucore.util.Timer;
import java.io.IOException;

View File

@@ -127,7 +127,7 @@ public class NetServer extends Module{
return;
}
if(packet.versionType == null || ((packet.version == -1 || !packet.versionType.equals("official")) && Version.build != -1 && !admins.allowsCustomClients())){
if(packet.versionType == null || ((packet.version == -1 || !packet.versionType.equals(Version.type)) && Version.build != -1 && !admins.allowsCustomClients())){
kick(id, KickReason.customClient);
return;
}
@@ -281,6 +281,7 @@ public class NetServer extends Module{
}
player.remove();
netServer.connections.remove(player.con.id);
Log.info("&lc{0} has disconnected.", player.name);
}
private static float compound(float speed, float drag){
@@ -381,7 +382,7 @@ public class NetServer extends Module{
return;
}
if(other == null || (other.isAdmin && other != player)){ //fun fact: this means you can ban yourself
if(other == null || ((other.isAdmin && !player.isLocal) && other != player)){
Log.err("{0} attempted to perform admin action on nonexistant or admin player.", player.name);
return;
}
@@ -492,7 +493,7 @@ public class NetServer extends Module{
//write all core inventory data
for(Tile tile : cores){
dataStream.writeInt(tile.packedPosition());
dataStream.writeInt(tile.pos());
tile.entity.items.write(dataStream);
}

View File

@@ -152,7 +152,7 @@ public class Renderer extends RendererModule{
if(players[0].isDead()){
TileEntity core = players[0].getClosestCore();
if(core != null && players[0].spawner == -1){
if(core != null && players[0].spawner == Unit.noSpawner){
smoothCamera(core.x, core.y, 0.08f);
}else{
smoothCamera(position.x + 0.0001f, position.y + 0.0001f, 0.08f);
@@ -395,8 +395,8 @@ public class Renderer extends RendererModule{
Graphics.getEffectSurface().setSize(w, h, true);
Core.camera.viewportWidth = w;
Core.camera.viewportHeight = h;
Core.camera.position.x = w/2f;
Core.camera.position.y = h/2f;
Core.camera.position.x = w/2f + tilesize/2f;
Core.camera.position.y = h/2f + tilesize/2f;
draw();

View File

@@ -15,6 +15,7 @@ import io.anuke.mindustry.io.MapIO;
import io.anuke.mindustry.maps.*;
import io.anuke.mindustry.maps.generation.WorldGenerator;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Pos;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.OreBlock;
import io.anuke.ucore.core.Events;
@@ -103,12 +104,8 @@ public class World extends Module{
return tiles == null ? 0 : tiles[0].length;
}
public int toPacked(int x, int y){
return x + y * width();
}
public Tile tile(int packed){
return tiles == null ? null : tile(packed % width(), packed / width());
public Tile tile(int pos){
return tiles == null ? null : tile(Pos.x(pos), Pos.y(pos));
}
public Tile tile(int x, int y){

View File

@@ -567,16 +567,16 @@ public class MapEditorDialog extends Dialog implements Disposable{
button.getImage().remove();
button.update(() -> button.setChecked(editor.getDrawBlock() == block));
group.add(button);
content.add(button).size(60f);
content.add(button).size(50f);
if(i++ % 3 == 2){
if(++i % 4 == 0){
content.row();
}
}
group.getButtons().get(2).setChecked(true);
table.table("underline", extra -> extra.labelWrap(() -> editor.getDrawBlock().formalName).width(220f).center()).growX();
table.table("underline", extra -> extra.labelWrap(() -> editor.getDrawBlock().formalName).width(200f).center()).growX();
table.row();
table.add(pane).growY().fillX();
}

View File

@@ -58,7 +58,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
public boolean achievedFlight;
public Color color = new Color();
public Mech mech;
public int spawner = -1;
public int spawner = noSpawner;
public NetConnection con;
public int playerIndex = 0;
@@ -498,7 +498,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
updateRespawning();
return;
}else{
spawner = -1;
spawner = noSpawner;
}
avoidOthers(1f);
@@ -788,23 +788,23 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
public void updateRespawning(){
if(spawner != -1 && world.tile(spawner) != null && world.tile(spawner).entity instanceof SpawnerTrait){
if(spawner != noSpawner && world.tile(spawner) != null && world.tile(spawner).entity instanceof SpawnerTrait){
((SpawnerTrait) world.tile(spawner).entity).updateSpawning(this);
}else{
CoreEntity entity = (CoreEntity) getClosestCore();
if(entity != null && !netServer.isWaitingForPlayers()){
this.spawner = entity.tile.id();
this.spawner = entity.tile.pos();
}
}
}
public void beginRespawning(SpawnerTrait spawner){
this.spawner = spawner.getTile().packedPosition();
this.spawner = spawner.getTile().pos();
this.dead = true;
}
public void endRespawning(){
spawner = -1;
spawner = noSpawner;
}
//endregion
@@ -860,7 +860,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
buffer.writeByte(Bits.toByte(isAdmin) | (Bits.toByte(dead) << 1) | (Bits.toByte(isBoosting) << 2));
buffer.writeInt(Color.rgba8888(color));
buffer.writeByte(mech.id);
buffer.writeInt(mining == null ? -1 : mining.packedPosition());
buffer.writeInt(mining == null ? -1 : mining.pos());
buffer.writeInt(spawner);
buffer.writeShort((short) (baseRotation * 2));

View File

@@ -154,6 +154,10 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
}
}
public boolean damaged(){
return health < maxHealth() - 0.00001f;
}
public Tile getTile(){
return tile;
}

View File

@@ -12,6 +12,7 @@ import io.anuke.mindustry.net.Interpolator;
import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.type.StatusEffect;
import io.anuke.mindustry.type.Weapon;
import io.anuke.mindustry.world.Pos;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.Floor;
import io.anuke.ucore.core.Effects;
@@ -39,6 +40,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
public static final float velocityPercision = 8f;
/**Maximum absolute value of a velocity vector component.*/
public static final float maxAbsVelocity = 127f / velocityPercision;
public static final int noSpawner = Pos.get(-1, 1);
private static final Rectangle queryRect = new Rectangle();
private static final Vector2 moveVector = new Vector2();

View File

@@ -48,7 +48,7 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{
public static void create(Tile tile){
if(Net.client() || tile == null) return; //not clientside.
Fire fire = map.get(tile.packedPosition());
Fire fire = map.get(tile.pos());
if(fire == null){
fire = Pooling.obtain(Fire.class, Fire::new);
@@ -56,7 +56,7 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{
fire.lifetime = baseLifetime;
fire.set(tile.worldx(), tile.worldy());
fire.add();
map.put(tile.packedPosition(), fire);
map.put(tile.pos(), fire);
}else{
fire.lifetime = baseLifetime;
fire.time = 0f;
@@ -75,8 +75,8 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{
* Attempts to extinguish a fire by shortening its life. If there is no fire here, does nothing.
*/
public static void extinguish(Tile tile, float intensity){
if(tile != null && map.containsKey(tile.packedPosition())){
map.get(tile.packedPosition()).time += intensity * Timers.delta();
if(tile != null && map.containsKey(tile.pos())){
map.get(tile.pos()).time += intensity * Timers.delta();
}
}
@@ -157,7 +157,7 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{
@Override
public void writeSave(DataOutput stream) throws IOException{
stream.writeInt(tile.packedPosition());
stream.writeInt(tile.pos());
stream.writeFloat(lifetime);
stream.writeFloat(time);
}
@@ -202,7 +202,7 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait, Poolable{
@Override
public void removed(){
if(tile != null){
map.remove(tile.packedPosition());
map.remove(tile.pos());
}
reset();
}

View File

@@ -6,7 +6,7 @@ import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Effects.Effect;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.entities.impl.EffectEntity;
import io.anuke.ucore.function.EffectRenderer;
import io.anuke.ucore.core.Effects.EffectRenderer;
import io.anuke.ucore.util.Mathf;
/**

View File

@@ -91,7 +91,6 @@ public class Lightning extends TimedEntity implements DrawTrait, SyncTrait, Time
x += Angles.trnsx(rotation, hitRange/2f);
y += Angles.trnsy(rotation, hitRange/2f);
}
}
}

View File

@@ -73,7 +73,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
/**Returns the puddle on the specified tile. May return null.*/
public static Puddle getPuddle(Tile tile){
return map.get(tile.packedPosition());
return map.get(tile.pos());
}
private static void deposit(Tile tile, Tile source, Liquid liquid, float amount, int generation){
@@ -83,7 +83,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
reactPuddle(tile.floor().liquidDrop, liquid, amount, tile,
(tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f);
Puddle p = map.get(tile.packedPosition());
Puddle p = map.get(tile.pos());
if(generation == 0 && p != null && p.lastRipple <= Timers.time() - 40f){
Effects.effect(BlockFx.ripple, tile.floor().liquidDrop.color,
@@ -93,7 +93,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
return;
}
Puddle p = map.get(tile.packedPosition());
Puddle p = map.get(tile.pos());
if(p == null){
if(Net.client()) return; //not clientside.
@@ -104,7 +104,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
puddle.generation = (byte) generation;
puddle.set((tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f);
puddle.add();
map.put(tile.packedPosition(), puddle);
map.put(tile.pos(), puddle);
}else if(p.liquid == liquid){
p.accepting = Math.max(amount, p.accepting);
@@ -249,7 +249,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
@Override
public void writeSave(DataOutput stream) throws IOException{
stream.writeInt(tile.packedPosition());
stream.writeInt(tile.pos());
stream.writeFloat(x);
stream.writeFloat(y);
stream.writeByte(liquid.id);
@@ -288,7 +288,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
@Override
public void removed(){
map.remove(tile.packedPosition());
map.remove(tile.pos());
reset();
}
@@ -298,7 +298,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
data.writeFloat(y);
data.writeByte(liquid.id);
data.writeShort((short) (amount * 4));
data.writeInt(tile.packedPosition());
data.writeInt(tile.pos());
}
@Override
@@ -309,7 +309,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
targetAmount = data.readShort() / 4f;
tile = world.tile(data.readInt());
map.put(tile.packedPosition(), this);
map.put(tile.pos(), this);
}
@Override

View File

@@ -16,6 +16,7 @@ import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.Recipe;
import io.anuke.mindustry.world.Build;
import io.anuke.mindustry.world.Pos;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.BuildBlock;
import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity;
@@ -27,7 +28,10 @@ import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Fill;
import io.anuke.ucore.graphics.Lines;
import io.anuke.ucore.graphics.Shapes;
import io.anuke.ucore.util.*;
import io.anuke.ucore.util.Angles;
import io.anuke.ucore.util.Geometry;
import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Translator;
import java.io.DataInput;
import java.io.DataOutput;
@@ -72,7 +76,7 @@ public interface BuilderTrait extends Entity{
if(request != null){
output.writeByte(request.breaking ? 1 : 0);
output.writeInt(world.toPacked(request.x, request.y));
output.writeInt(Pos.get(request.x, request.y));
output.writeFloat(request.progress);
if(!request.breaking){
output.writeByte(request.recipe.id);
@@ -96,13 +100,13 @@ public interface BuilderTrait extends Entity{
float progress = input.readFloat();
BuildRequest request;
if(type == 1){ //remove
request = new BuildRequest(position % world.width(), position / world.width());
}else{ //place
byte recipe = input.readByte();
byte rotation = input.readByte();
request = new BuildRequest(position % world.width(), position / world.width(), rotation, content.recipe(recipe));
}
if(type == 1){ //remove
request = new BuildRequest(Pos.x(position), Pos.y(position));
}else{ //place
byte recipe = input.readByte();
byte rotation = input.readByte();
request = new BuildRequest(Pos.x(position), Pos.y(position), rotation, content.recipe(recipe));
}
request.progress = progress;

View File

@@ -52,7 +52,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
protected boolean isWave;
protected Squad squad;
protected int spawner = -1;
protected int spawner = noSpawner;
/**internal constructor used for deserialization, DO NOT USE*/
public BaseUnit(){
@@ -111,16 +111,8 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
return type;
}
public Tile getSpawner(){
return world.tile(spawner);
}
public void setSpawner(Tile tile){
this.spawner = tile.packedPosition();
}
public void setIntSpawner(int pos){
this.spawner = pos;
this.spawner = tile.pos();
}
/**Sets this to a 'wave' unit, which means it has slightly different AI and will not run out of ammo.*/
@@ -143,7 +135,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
}
public void updateRespawning(){
if(spawner == -1) return;
if(spawner == noSpawner) return;
Tile tile = world.tile(spawner);
if(tile != null && tile.entity != null){
@@ -151,7 +143,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
((SpawnerTrait) tile.entity).updateSpawning(this);
}
}else{
spawner = -1;
spawner = noSpawner;
}
}
@@ -305,7 +297,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
avoidOthers(1.25f);
if(spawner != -1 && (world.tile(spawner) == null || world.tile(spawner).entity == null)){
if(spawner != noSpawner && (world.tile(spawner) == null || world.tile(spawner).entity == null)){
damage(health);
}
@@ -336,7 +328,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
@Override
public void removed(){
spawner = -1;
spawner = noSpawner;
}
@Override

View File

@@ -358,8 +358,8 @@ public class Drone extends FlyingUnit implements BuilderTrait{
@Override
public void write(DataOutput data) throws IOException{
super.write(data);
data.writeInt(mineTile == null || !state.is(mine) ? -1 : mineTile.packedPosition());
data.writeInt(state.is(repair) && target instanceof TileEntity ? ((TileEntity)target).tile.packedPosition() : -1);
data.writeInt(mineTile == null || !state.is(mine) ? -1 : mineTile.pos());
data.writeInt(state.is(repair) && target instanceof TileEntity ? ((TileEntity)target).tile.pos() : -1);
writeBuilding(data);
}

View File

@@ -3,7 +3,7 @@ package io.anuke.mindustry.game;
import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.entities.traits.BuilderTrait;
import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.function.Event;
import io.anuke.ucore.core.Events.Event;
public class EventType{

View File

@@ -11,7 +11,7 @@ public enum GameMode{
freebuild{{
disableWaveTimer = true;
}},
noWaves{{
attack{{
disableWaves = true;
hidden = true;
enemyCheat = true;

View File

@@ -96,6 +96,14 @@ public class Waves{
max = 10;
}},
new SpawnGroup(UnitTypes.fortress){{
begin = 40;
spacing = 5;
unitAmount = 2;
unitScaling = 3;
max = 10;
}},
new SpawnGroup(UnitTypes.dagger){{
begin = 35;
spacing = 3;
@@ -134,6 +142,15 @@ public class Waves{
max = 8;
}},
new SpawnGroup(UnitTypes.revenant){{
begin = 50;
unitAmount = 4;
unitScaling = 3;
spacing = 5;
groupAmount = 2;
max = 8;
}},
new SpawnGroup(UnitTypes.ghoul){{
begin = 53;
unitAmount = 2;

View File

@@ -77,9 +77,11 @@ public class FogRenderer implements Disposable{
pixelBuffer.position(0);
for(int i = 0; i < world.width() * world.height(); i++){
int x = i % world.width();
int y = i / world.width();
byte r = pixelBuffer.get();
if(r != 0){
world.tile(i).setVisibility((byte)1);
world.tile(x, y).setVisibility((byte)1);
}
pixelBuffer.position(pixelBuffer.position() + 3);
}
@@ -128,10 +130,12 @@ public class FogRenderer implements Disposable{
changeQueue.clear();
if(dirty){
for(int i = 0; i < world.width() * world.height(); i++){
Tile tile = world.tile(i);
if(tile.discovered()){
Fill.rect(tile.worldx(), tile.worldy(), tilesize, tilesize);
for(int x = 0; x < world.width(); x++){
for(int y = 0; y < world.height(); y++){
Tile tile = world.tile(x, y);
if(tile.discovered()){
Fill.rect(tile.worldx(), tile.worldy(), tilesize, tilesize);
}
}
}
dirty = false;

View File

@@ -200,9 +200,10 @@ public class OverlayRenderer{
}
void drawBar(Color color, float x, float y, float finion){
if(finion > 0.9f) finion = 1f; //fixes precision errors
finion = Mathf.clamp(finion);
if(finion > 0) finion = Mathf.clamp(finion + 0.2f, 0.24f, 1f);
if(finion > 0) finion = Mathf.clamp(finion, 0.24f, 1f);
float len = 3;

View File

@@ -95,7 +95,7 @@ public abstract class InputHandler extends InputAdapter{
ItemTransfer.create(item,
player.x + Angles.trnsx(player.rotation + 180f, backTrns), player.y + Angles.trnsy(player.rotation + 180f, backTrns),
new Translator(tile.drawx() + stackTrns.x, tile.drawy() + stackTrns.y), () -> {
if(tile.block() != block || tile.entity == null) return;
if(tile.block() != block || tile.entity == null || tile.entity.items == null) return;
tile.block().handleStack(item, removed, tile, player);
remaining[1] -= removed;

View File

@@ -598,6 +598,10 @@ public class MobileInput extends InputHandler implements GestureListener{
showGuide("construction");
}
if(recipe == null && mode == placing){
mode = none;
}
//automatically switch to placing after a new recipe is selected
if(lastRecipe != recipe && mode == breaking && recipe != null){
mode = placing;

View File

@@ -50,7 +50,7 @@ public abstract class SaveFileVersion{
stream.writeShort(world.height());
for(int i = 0; i < world.width() * world.height(); i++){
Tile tile = world.tile(i);
Tile tile = world.tile(i % world.width(), i / world.width());
stream.writeByte(tile.getFloorID());
stream.writeByte(tile.getBlockID());
@@ -73,7 +73,7 @@ public abstract class SaveFileVersion{
int consecutives = 0;
for(int j = i + 1; j < world.width() * world.height() && consecutives < 255; j++){
Tile nextTile = world.tile(j);
Tile nextTile = world.tile(j % world.width(), j / world.width());
if(nextTile.getFloorID() != tile.getFloorID() || nextTile.block() != Blocks.air || nextTile.getElevation() != tile.getElevation()){
break;
@@ -89,13 +89,13 @@ public abstract class SaveFileVersion{
//write visibility, length-run encoded
for(int i = 0; i < world.width() * world.height(); i++){
Tile tile = world.tile(i);
Tile tile = world.tile(i % world.width(), i / world.width());
boolean discovered = tile.discovered();
int consecutives = 0;
for(int j = i + 1; j < world.width() * world.height() && consecutives < 32767*2-1; j++){
Tile nextTile = world.tile(j);
Tile nextTile = world.tile(j % world.width(), j / world.width());
if(nextTile.discovered() != discovered){
break;

View File

@@ -14,7 +14,7 @@ import java.util.zip.InflaterInputStream;
import static io.anuke.mindustry.Vars.*;
public class SaveIO{
public static final IntArray breakingVersions = IntArray.with(47, 48, 49, 50, 51, 52, 53, 54, 55, 56);
public static final IntArray breakingVersions = IntArray.with(47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58);
public static final IntMap<SaveFileVersion> versions = new IntMap<>();
public static final Array<SaveFileVersion> versionArray = Array.with(
new Save16()

View File

@@ -18,6 +18,7 @@ import io.anuke.mindustry.net.Packets.AdminAction;
import io.anuke.mindustry.net.Packets.KickReason;
import io.anuke.mindustry.type.*;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Pos;
import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Effects.Effect;
@@ -52,6 +53,10 @@ public class TypeIO{
@WriteClass(Unit.class)
public static void writeUnit(ByteBuffer buffer, Unit unit){
if(unit.getGroup() == null){
buffer.put((byte)-1);
return;
}
buffer.put((byte) unit.getGroup().getID());
buffer.putInt(unit.getID());
}
@@ -59,6 +64,7 @@ public class TypeIO{
@ReadClass(Unit.class)
public static Unit readUnit(ByteBuffer buffer){
byte gid = buffer.get();
if(gid == -1) return null;
int id = buffer.getInt();
return (Unit) Entities.getGroup(gid).getByID(id);
}
@@ -142,13 +148,12 @@ public class TypeIO{
@WriteClass(Tile.class)
public static void writeTile(ByteBuffer buffer, Tile tile){
buffer.putInt(tile == null ? -1 : tile.packedPosition());
buffer.putInt(tile == null ? Pos.get(-1, -1) : tile.pos());
}
@ReadClass(Tile.class)
public static Tile readTile(ByteBuffer buffer){
int position = buffer.getInt();
return position == -1 ? null : world.tile(position);
return world.tile(buffer.getInt());
}
@WriteClass(Block.class)
@@ -166,7 +171,7 @@ public class TypeIO{
buffer.putShort((short)requests.length);
for(BuildRequest request : requests){
buffer.put(request.breaking ? (byte) 1 : 0);
buffer.putInt(world.toPacked(request.x, request.y));
buffer.putInt(Pos.get(request.x, request.y));
if(!request.breaking){
buffer.put(request.recipe.id);
buffer.put((byte) request.rotation);
@@ -184,11 +189,11 @@ public class TypeIO{
BuildRequest currentRequest;
if(type == 1){ //remove
currentRequest = new BuildRequest(position % world.width(), position / world.width());
currentRequest = new BuildRequest(Pos.x(position), Pos.y(position));
}else{ //place
byte recipe = buffer.get();
byte rotation = buffer.get();
currentRequest = new BuildRequest(position % world.width(), position / world.width(), rotation, content.recipe(recipe));
currentRequest = new BuildRequest(Pos.x(position), Pos.y(position), rotation, content.recipe(recipe));
}
reqs[i] = (currentRequest);

View File

@@ -59,7 +59,7 @@ public class Save16 extends SaveFileVersion{
stream.writeLong(TimeUtils.millis()); //last saved
stream.writeLong(headless ? 0 : control.saves.getTotalPlaytime()); //playtime
stream.writeInt(Version.build); //build
stream.writeInt(world.getSector() == null ? invalidSector : world.getSector().packedPosition()); //sector ID
stream.writeInt(world.getSector() == null ? invalidSector : world.getSector().pos()); //sector ID
//--GENERAL STATE--
stream.writeByte(state.mode.ordinal()); //gamemode

View File

@@ -67,7 +67,7 @@ public class Sector{
return !headless && control.saves.getByID(saveID) != null;
}
public int packedPosition(){
public int pos(){
return Bits.packInt(x, y);
}
}

View File

@@ -53,7 +53,7 @@ public class Sectors{
world.loadSector(sector);
logic.play();
if(!headless){
sector.saveID = control.saves.addSave("sector-" + sector.packedPosition()).index;
sector.saveID = control.saves.addSave("sector-" + sector.pos()).index;
}
world.sectors.save();
world.setSector(sector);

View File

@@ -17,6 +17,7 @@ import io.anuke.mindustry.maps.Sector;
import io.anuke.mindustry.maps.missions.Mission;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Pos;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.Floor;
import io.anuke.mindustry.world.blocks.OreBlock;
@@ -86,7 +87,7 @@ public class WorldGenerator{
Tile tile = tiles[x][y];
if(tile.block().isMultiblock()){
multiblocks.add(tile.packedPosition());
multiblocks.add(tile.pos());
}
}
}
@@ -95,8 +96,8 @@ public class WorldGenerator{
for(int i = 0; i < multiblocks.size; i++){
int pos = multiblocks.get(i);
int x = pos % tiles.length;
int y = pos / tiles.length;
int x = Pos.x(pos);
int y = Pos.y(pos);
Block result = tiles[x][y].block();
Team team = tiles[x][y].getTeam();

View File

@@ -38,7 +38,7 @@ public class BattleMission extends MissionWithStartingCore{
@Override
public GameMode getMode(){
return GameMode.noWaves;
return GameMode.attack;
}
@Override

View File

@@ -2,10 +2,8 @@ package io.anuke.mindustry.maps.missions;
import com.badlogic.gdx.math.GridPoint2;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.content.blocks.StorageBlocks;
import io.anuke.mindustry.game.GameMode;
import io.anuke.mindustry.game.SpawnGroup;
import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.game.UnlockableContent;
import io.anuke.mindustry.maps.Sector;
import io.anuke.mindustry.maps.generation.Generation;
@@ -34,7 +32,7 @@ public abstract class Mission{
}
public GameMode getMode(){
return GameMode.noWaves;
return GameMode.attack;
}
/**Sets the message displayed on mission begin. Returns this mission for chaining.*/

View File

@@ -42,6 +42,13 @@ public abstract class MissionWithStartingCore extends Mission{
startingCoreTile.setBlock(StorageBlocks.core);
startingCoreTile.setTeam(team);
state.teams.get(team).cores.add(startingCoreTile);
//makes sure there's a flat area around core
for(int dx = -2; dx <= 2; dx++){
for(int dy = -2; dy <= 2; dy++){
gen.tiles[startingCoreTile.x + dx][startingCoreTile.y + dy].setElevation(startingCoreTile.getElevation());
}
}
}
/**

View File

@@ -74,7 +74,7 @@ public class WaveMission extends MissionWithStartingCore{
@Override
public void update(){
if(state.wave > target){
state.mode = GameMode.noWaves;
state.mode = GameMode.attack;
}
}

View File

@@ -1,5 +1,7 @@
package io.anuke.mindustry.net;
import io.anuke.mindustry.game.GameMode;
public class Host{
public final String name;
public final String address;
@@ -8,8 +10,9 @@ public class Host{
public final int players;
public final int version;
public final String versionType;
public final GameMode mode;
public Host(String name, String address, String mapname, int wave, int players, int version, String versionType){
public Host(String name, String address, String mapname, int wave, int players, int version, String versionType, GameMode mode){
this.name = name;
this.address = address;
this.players = players;
@@ -17,5 +20,6 @@ public class Host{
this.wave = wave;
this.version = version;
this.versionType = versionType;
this.mode = mode;
}
}

View File

@@ -21,6 +21,7 @@ import io.anuke.ucore.util.Bits;
import java.io.*;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import static io.anuke.mindustry.Vars.*;
@@ -32,7 +33,7 @@ public class NetworkIO{
//--GENERAL STATE--
stream.writeByte(state.mode.ordinal()); //gamemode
stream.writeUTF(world.getMap().name); //map name
stream.writeInt(world.getSector() == null ? invalidSector : world.getSector().packedPosition()); //sector ID
stream.writeInt(world.getSector() == null ? invalidSector : world.getSector().pos()); //sector ID
stream.writeInt(world.getSector() == null ? 0 : world.getSector().completedMissions);
//write tags
@@ -56,7 +57,7 @@ public class NetworkIO{
stream.writeShort(world.height());
for(int i = 0; i < world.width() * world.height(); i++){
Tile tile = world.tile(i);
Tile tile = world.tile(i % world.width(), i / world.width());
stream.writeByte(tile.getFloorID());
stream.writeByte(tile.getBlockID());
@@ -79,7 +80,7 @@ public class NetworkIO{
int consecutives = 0;
for(int j = i + 1; j < world.width() * world.height() && consecutives < 255; j++){
Tile nextTile = world.tile(j);
Tile nextTile = world.tile(j % world.width(), j / world.width());
if(nextTile.getFloorID() != tile.getFloorID() || nextTile.block() != Blocks.air || nextTile.getElevation() != tile.getElevation()){
break;
@@ -95,13 +96,13 @@ public class NetworkIO{
//write visibility, length-run encoded
for(int i = 0; i < world.width() * world.height(); i++){
Tile tile = world.tile(i);
Tile tile = world.tile(i % world.width(), i / world.width());;
boolean discovered = tile.discovered();
int consecutives = 0;
for(int j = i + 1; j < world.width() * world.height() && consecutives < 32767*2-1; j++){
Tile nextTile = world.tile(j);
Tile nextTile = world.tile(j % world.width(), j / world.width());;
if(nextTile.discovered() != discovered){
break;
@@ -129,7 +130,7 @@ public class NetworkIO{
stream.writeByte(data.cores.size);
for(Tile tile : data.cores){
stream.writeInt(tile.packedPosition());
stream.writeInt(tile.pos());
}
}
@@ -305,17 +306,18 @@ public class NetworkIO{
ByteBuffer buffer = ByteBuffer.allocate(128);
buffer.put((byte) host.getBytes().length);
buffer.put(host.getBytes());
buffer.put((byte) host.getBytes(StandardCharsets.UTF_8).length);
buffer.put(host.getBytes(StandardCharsets.UTF_8));
buffer.put((byte) map.getBytes().length);
buffer.put(map.getBytes());
buffer.put((byte) map.getBytes(StandardCharsets.UTF_8).length);
buffer.put(map.getBytes(StandardCharsets.UTF_8));
buffer.putInt(playerGroup.size());
buffer.putInt(state.wave);
buffer.putInt(Version.build);
buffer.put((byte)Version.type.getBytes().length);
buffer.put(Version.type.getBytes());
buffer.put((byte)Version.type.getBytes(StandardCharsets.UTF_8).length);
buffer.put(Version.type.getBytes(StandardCharsets.UTF_8));
buffer.put((byte)state.mode.ordinal());
return buffer;
}
@@ -328,8 +330,8 @@ public class NetworkIO{
byte[] mb = new byte[mlength];
buffer.get(mb);
String host = new String(hb);
String map = new String(mb);
String host = new String(hb, StandardCharsets.UTF_8);
String map = new String(mb, StandardCharsets.UTF_8);
int players = buffer.getInt();
int wave = buffer.getInt();
@@ -337,8 +339,9 @@ public class NetworkIO{
byte tlength = buffer.get();
byte[] tb = new byte[tlength];
buffer.get(tb);
String vertype = new String(tb);
String vertype = new String(tb, StandardCharsets.UTF_8);
GameMode mode = GameMode.values()[buffer.get()];
return new Host(host, hostAddress, map, wave, players, version, vertype);
return new Host(host, hostAddress, map, wave, players, version, vertype, mode);
}
}

View File

@@ -38,10 +38,6 @@ public class FileChooser extends FloatingDialog{
private Consumer<FileHandle> selectListener;
private boolean open;
public FileChooser(String title, boolean open, Consumer<FileHandle> result){
this(title, defaultFilter, open, result);
}
public FileChooser(String title, Predicate<FileHandle> filter, boolean open, Consumer<FileHandle> result){
super(title);
this.open = open;
@@ -127,7 +123,7 @@ public class FileChooser extends FloatingDialog{
updateFiles(true);
});
icontable.defaults().height(50).growX().uniform();
icontable.defaults().height(50).growX().padTop(5).uniform();
icontable.add(home);
icontable.add(back);
icontable.add(forward);
@@ -202,7 +198,7 @@ public class FileChooser extends FloatingDialog{
//macs are confined to the Downloads/ directory
if(!OS.isMac){
Image upimage = new Image("icon-folder-parent");
TextButton upbutton = new TextButton(".." + directory.toString());
TextButton upbutton = new TextButton(".." + directory.toString(), "clear");
upbutton.clicked(() -> {
directory = directory.parent();
updateFiles(true);
@@ -224,7 +220,7 @@ public class FileChooser extends FloatingDialog{
String filename = file.name();
TextButton button = new TextButton(shorten(filename), "toggle");
TextButton button = new TextButton(shorten(filename), "clear");
group.add(button);
button.clicked(() -> {

View File

@@ -268,6 +268,7 @@ public class JoinDialog extends FloatingDialog{
if(totalHosts == 0){
local.clear();
}
local.background((Drawable) null);
totalHosts ++;
float w = targetWidth();

View File

@@ -36,9 +36,11 @@ public class PlacementFragment extends Fragment{
Tile hoverTile;
Table blockTable, toggler, topTable;
boolean shown = true;
boolean lastGround;
public PlacementFragment(){
Events.on(WorldLoadGraphicsEvent.class, event -> {
currentCategory = Category.turret;
Group group = toggler.getParent();
toggler.remove();
build(group);
@@ -109,13 +111,14 @@ public class PlacementFragment extends Fragment{
frame.table("button-edge-2", top -> {
topTable = top;
top.add(new Table()).growX().update(topTable -> {
if((tileDisplayBlock() == null && lastDisplay == getSelected()) ||
(tileDisplayBlock() != null && lastDisplay == tileDisplayBlock())) return;
if((tileDisplayBlock() == null && lastDisplay == getSelected() && !lastGround) ||
(tileDisplayBlock() != null && lastDisplay == tileDisplayBlock() && lastGround)) return;
topTable.clear();
topTable.top().left().margin(5);
lastDisplay = getSelected();
lastGround = tileDisplayBlock() != null;
if(lastDisplay != null){ //show selected recipe
topTable.table(header -> {
@@ -181,7 +184,7 @@ public class PlacementFragment extends Fragment{
categories.addImageButton("icon-" + cat.name(), "clear-toggle", 16*2, () -> {
currentCategory = cat;
rebuildCategory.run();
}).group(group);
}).group(group).update(i -> i.setChecked(group.getChecked() == i));
if(cat.ordinal() %2 == 1) categories.row();
}

View File

@@ -116,7 +116,7 @@ public class PlayerListFragment extends Fragment{
t.row();
t.addImageButton("icon-admin", "clear-toggle", 14 * 2, () -> {
t.addImageButton("icon-admin", "clear-toggle-partial", 14 * 2, () -> {
if(Net.client()) return;
String id = player.uuid;

View File

@@ -165,7 +165,7 @@ public class Block extends BaseBlock {
for(int i = 0; i < tile.entity.power.links.size; i++){
Tile other = world.tile(tile.entity.power.links.get(i));
if(other != null && other.entity != null && other.entity.power != null){
other.entity.power.links.removeValue(tile.packedPosition());
other.entity.power.links.removeValue(tile.pos());
}
}
}
@@ -174,7 +174,7 @@ public class Block extends BaseBlock {
out.clear();
for(Tile other : tile.entity.proximity()){
if(other.entity.power != null && !(consumesPower && other.block().consumesPower && !outputsPower && !other.block().outputsPower)
&& !tile.entity.power.links.contains(other.packedPosition())){
&& !tile.entity.power.links.contains(other.pos())){
out.add(other);
}
}
@@ -345,12 +345,9 @@ public class Block extends BaseBlock {
}
public void setBars(){
if(consumes.has(ConsumePower.class))
bars.add(new BlockBar(BarType.power, true, tile -> tile.entity.power.satisfaction));
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));
if(consumes.has(ConsumePower.class)) bars.add(new BlockBar(BarType.power, true, tile -> tile.entity.power.satisfaction));
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(){
@@ -553,16 +550,16 @@ public class Block extends BaseBlock {
public Array<Object> getDebugInfo(Tile tile){
return Array.with(
"block", tile.block().name,
"floor", tile.floor().name,
"x", tile.x,
"y", tile.y,
"entity.name", tile.entity.getClass(),
"entity.x", tile.entity.x,
"entity.y", tile.entity.y,
"entity.id", tile.entity.id,
"entity.items.total", hasItems ? tile.entity.items.total() : null,
"entity.graph", tile.entity.power != null && tile.entity.power.graph != null ? tile.entity.power.graph.getID() : null
"block", tile.block().name,
"floor", tile.floor().name,
"x", tile.x,
"y", tile.y,
"entity.name", tile.entity.getClass(),
"entity.x", tile.entity.x,
"entity.y", tile.entity.y,
"entity.id", tile.entity.id,
"entity.items.total", hasItems ? tile.entity.items.total() : null,
"entity.graph", tile.entity.power != null && tile.entity.power.graph != null ? tile.entity.power.graph.getID() : null
);
}
}

View File

@@ -0,0 +1,20 @@
package io.anuke.mindustry.world;
/**Methods for a packed position 'struct', contained in an int.*/
public class Pos{
/**Returns packed position from an x/y position. The values must be within short limits.*/
public static int get(int x, int y){
return (((short)x) << 16) | (((short)y) & 0xFFFF);
}
/**Returns the x component of a position.*/
public static short x(int pos){
return (short) (pos >>> 16);
}
/**Returns the y component of a position.*/
public static short y(int pos){
return (short) (pos & 0xFFFF);
}
}

View File

@@ -71,8 +71,9 @@ public class Tile implements PosTrait, TargetTrait{
return visibility > 0;
}
public int packedPosition(){
return x + y * world.width();
/**Returns this tile's position as a {@link Pos}.*/
public int pos(){
return Pos.get(x, y);
}
public byte getBlockID(){
@@ -104,10 +105,6 @@ public class Tile implements PosTrait, TargetTrait{
return (T) entity;
}
public int id(){
return x + y * world.width();
}
public float worldx(){
return x * tilesize;
}

View File

@@ -130,16 +130,16 @@ public class Floor extends Block{
@Override
public void drawNonLayer(Tile tile){
MathUtils.random.setSeed(tile.id());
MathUtils.random.setSeed(tile.pos());
drawEdges(tile, true);
}
@Override
public void draw(Tile tile){
MathUtils.random.setSeed(tile.id());
MathUtils.random.setSeed(tile.pos());
Draw.rect(variantRegions[Mathf.randomSeed(tile.id(), 0, Math.max(0, variantRegions.length - 1))], tile.worldx(), tile.worldy());
Draw.rect(variantRegions[Mathf.randomSeed(tile.pos(), 0, Math.max(0, variantRegions.length - 1))], tile.worldx(), tile.worldy());
if(tile.hasCliffs() && cliffRegions != null){
for(int i = 0; i < 4; i++){

View File

@@ -39,14 +39,14 @@ public class OreBlock extends Floor{
@Override
public void draw(Tile tile){
Draw.rect(variantRegions[Mathf.randomSeed(tile.id(), 0, Math.max(0, variantRegions.length - 1))], tile.worldx(), tile.worldy());
Draw.rect(variantRegions[Mathf.randomSeed(tile.pos(), 0, Math.max(0, variantRegions.length - 1))], tile.worldx(), tile.worldy());
drawEdges(tile, false);
}
@Override
public void drawNonLayer(Tile tile){
MathUtils.random.setSeed(tile.id());
MathUtils.random.setSeed(tile.pos());
base.drawEdges(tile, true);
}

View File

@@ -19,7 +19,7 @@ public class Rock extends Block{
@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());
Draw.rect(regions[Mathf.randomSeed(tile.pos(), 0, Math.max(0, regions.length - 1))], tile.worldx(), tile.worldy());
}else{
Draw.rect(region, tile.worldx(), tile.worldy());
}
@@ -28,7 +28,7 @@ public class Rock extends Block{
@Override
public void drawShadow(Tile tile){
if(shadowRegions != null){
Draw.rect(shadowRegions[(Mathf.randomSeed(tile.id(), 0, variants - 1))], tile.worldx(), tile.worldy());
Draw.rect(shadowRegions[(Mathf.randomSeed(tile.pos(), 0, variants - 1))], tile.worldx(), tile.worldy());
}else if(shadowRegion != null){
Draw.rect(shadowRegion, tile.drawx(), tile.drawy());
}

View File

@@ -83,10 +83,10 @@ public class MendProjector extends Block{
if(other == null) continue;
other = other.target();
if(other.getTeamID() == tile.getTeamID() && !healed.contains(other.packedPosition()) && other.entity != null && other.entity.health < other.entity.maxHealth()){
if(other.getTeamID() == tile.getTeamID() && !healed.contains(other.pos()) && other.entity != null && other.entity.health < other.entity.maxHealth()){
other.entity.healBy(other.entity.maxHealth() * (healPercent + entity.phaseHeat*phaseBoost)/100f * entity.power.satisfaction);
Effects.effect(BlockFx.healBlockFull, Hue.mix(color, phase, entity.phaseHeat), other.drawx(), other.drawy(), other.block().size);
healed.add(other.packedPosition());
healed.add(other.pos());
}
}
}

View File

@@ -85,11 +85,11 @@ public class OverdriveProjector extends Block{
if(other == null) continue;
other = other.target();
if(other.getTeamID() == tile.getTeamID() && !healed.contains(other.packedPosition()) && other.entity != null){
if(other.getTeamID() == tile.getTeamID() && !healed.contains(other.pos()) && other.entity != null){
other.entity.timeScaleDuration = Math.max(other.entity.timeScaleDuration, reload + 1f);
other.entity.timeScale = Math.max(other.entity.timeScale, realBoost);
Effects.effect(BlockFx.overdriveBlockFull, Hue.mix(color, phase, entity.phaseHeat), other.drawx(), other.drawy(), other.block().size);
healed.add(other.packedPosition());
healed.add(other.pos());
}
}
}

View File

@@ -15,6 +15,7 @@ import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Edges;
import io.anuke.mindustry.world.Pos;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.meta.BlockGroup;
import io.anuke.ucore.core.Timers;
@@ -58,8 +59,8 @@ public class ItemBridge extends Block{
public static void linkItemBridge(Player player, Tile tile, Tile other){
ItemBridgeEntity entity = tile.entity();
ItemBridgeEntity oe = other.entity();
entity.link = other.packedPosition();
oe.incoming.add(tile.packedPosition());
entity.link = other.pos();
oe.incoming.add(tile.pos());
}
@Remote(targets = Loc.both, called = Loc.server, forward = true)
@@ -68,7 +69,7 @@ public class ItemBridge extends Block{
entity.link = -1;
if(other != null){
ItemBridgeEntity oe = other.entity();
oe.incoming.remove(tile.packedPosition());
oe.incoming.remove(tile.pos());
}
}
@@ -90,7 +91,7 @@ public class ItemBridge extends Block{
Call.linkItemBridge(null, last, tile);
}
}
lastPlaced = tile.packedPosition();
lastPlaced = tile.pos();
}
@Override
@@ -122,7 +123,7 @@ public class ItemBridge extends Block{
for(int j = 0; j < 4; j++){
Tile other = tile.getNearby(Geometry.d4[j].x * i, Geometry.d4[j].y * i);
if(linkValid(tile, other)){
boolean linked = other.packedPosition() == entity.link;
boolean linked = other.pos() == entity.link;
Draw.color(linked ? Palette.place : Palette.breakInvalid);
Lines.square(other.drawx(), other.drawy(),
@@ -139,7 +140,7 @@ public class ItemBridge extends Block{
ItemBridgeEntity entity = tile.entity();
if(linkValid(tile, other)){
if(entity.link == other.packedPosition()){
if(entity.link == other.pos()){
Call.unlinkItemBridge(null, tile, other);
}else{
Call.linkItemBridge(null, tile, other);
@@ -254,7 +255,7 @@ public class ItemBridge extends Block{
if(rel == rel2) return false;
}else{
return source.block() instanceof ItemBridge && source.<ItemBridgeEntity>entity().link == tile.packedPosition() && tile.entity.items.total() < itemCapacity;
return source.block() instanceof ItemBridge && source.<ItemBridgeEntity>entity().link == tile.pos() && tile.entity.items.total() < itemCapacity;
}
return tile.entity.items.total() < itemCapacity;
@@ -273,9 +274,7 @@ public class ItemBridge extends Block{
while(it.hasNext){
int v = it.next();
int x = v % world.width();
int y = v / world.width();
if(tile.absoluteRelativeTo(x, y) == i){
if(tile.absoluteRelativeTo(Pos.x(v), Pos.y(v)) == i){
return false;
}
}
@@ -315,7 +314,7 @@ public class ItemBridge extends Block{
return false;
}
return other.block() == this && (!checkDouble || other.<ItemBridgeEntity>entity().link != tile.packedPosition());
return other.block() == this && (!checkDouble || other.<ItemBridgeEntity>entity().link != tile.pos());
}
public static class ItemBridgeEntity extends TileEntity{

View File

@@ -3,6 +3,7 @@ package io.anuke.mindustry.world.blocks.distribution;
import com.badlogic.gdx.utils.IntSet.IntSetIterator;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.Pos;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.meta.BlockGroup;
import io.anuke.ucore.core.Timers;
@@ -65,9 +66,7 @@ public class LiquidExtendingBridge extends ExtendingItemBridge{
while(it.hasNext){
int v = it.next();
int x = v % world.width();
int y = v / world.width();
if(tile.absoluteRelativeTo(x, y) == i){
if(tile.absoluteRelativeTo(Pos.x(v), Pos.y(v)) == i){
return false;
}
}

View File

@@ -230,11 +230,11 @@ public class MassDriver extends Block{
MassDriverEntity entity = tile.entity();
if(entity.link == other.packedPosition()){
if(entity.link == other.pos()){
Call.linkMassDriver(null, tile, -1);
return false;
}else if(other.block() instanceof MassDriver && other.distanceTo(tile) <= range){
Call.linkMassDriver(null, tile, other.packedPosition());
Call.linkMassDriver(null, tile, other.pos());
return false;
}

View File

@@ -4,6 +4,7 @@ import io.anuke.annotations.Annotations.Loc;
import io.anuke.annotations.Annotations.Remote;
import io.anuke.mindustry.entities.Player;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile;
@@ -12,7 +13,6 @@ import io.anuke.mindustry.world.meta.BlockGroup;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.scene.ui.layout.Table;
import io.anuke.ucore.util.Mathf;
import io.anuke.mindustry.gen.Call;
import java.io.DataInput;
import java.io.DataOutput;

View File

@@ -197,9 +197,9 @@ public class PowerGraph{
child.entity.power.graph = this;
add(child);
for(Tile next : child.block().getPowerConnections(child, outArray2)){
if(next.entity.power != null && next.entity.power.graph == null && !closedSet.contains(next.packedPosition())){
if(next.entity.power != null && next.entity.power.graph == null && !closedSet.contains(next.pos())){
queue.addLast(next);
closedSet.add(next.packedPosition());
closedSet.add(next.pos());
}
}
}
@@ -219,9 +219,9 @@ public class PowerGraph{
child.entity.power.graph = graph;
graph.add(child);
for(Tile next : child.block().getPowerConnections(child, outArray2)){
if(next != tile && next.entity.power != null && next.entity.power.graph == null && !closedSet.contains(next.packedPosition())){
if(next != tile && next.entity.power != null && next.entity.power.graph == null && !closedSet.contains(next.pos())){
queue.addLast(next);
closedSet.add(next.packedPosition());
closedSet.add(next.pos());
}
}
}

View File

@@ -50,14 +50,14 @@ public class PowerNode extends PowerBlock{
TileEntity entity = tile.entity();
if(!entity.power.links.contains(other.packedPosition())){
entity.power.links.add(other.packedPosition());
if(!entity.power.links.contains(other.pos())){
entity.power.links.add(other.pos());
}
if(other.getTeamID() == tile.getTeamID()){
if(!other.entity.power.links.contains(tile.packedPosition())){
other.entity.power.links.add(tile.packedPosition());
if(!other.entity.power.links.contains(tile.pos())){
other.entity.power.links.add(tile.pos());
}
}
@@ -74,8 +74,8 @@ public class PowerNode extends PowerBlock{
PowerGraph tg = entity.power.graph;
tg.clear();
entity.power.links.removeValue(other.packedPosition());
other.entity.power.links.removeValue(tile.packedPosition());
entity.power.links.removeValue(other.pos());
other.entity.power.links.removeValue(tile.pos());
//reflow from this point, covering all tiles on this side
tg.reflow(tile);
@@ -98,14 +98,14 @@ public class PowerNode extends PowerBlock{
if(linkValid(tile, before) && before.block() instanceof PowerNode){
for(Tile near : before.entity.proximity()){
if(near.target() == tile){
lastPlaced = tile.packedPosition();
lastPlaced = tile.pos();
return;
}
}
Call.linkPowerNodes(null, tile, before);
}
lastPlaced = tile.packedPosition();
lastPlaced = tile.pos();
}
@Override
@@ -201,7 +201,7 @@ public class PowerNode extends PowerBlock{
for(int i = 0; i < entity.power.links.size; i++){
Tile link = world.tile(entity.power.links.get(i));
if(linkValid(tile, link) && (!(link.block() instanceof PowerNode)
|| ((tile.block().size > link.block().size) || (tile.block().size == link.block().size && tile.id() < link.id())))){
|| ((tile.block().size > link.block().size) || (tile.block().size == link.block().size && tile.pos() < link.pos())))){
drawLaser(tile, link);
}
}
@@ -210,7 +210,7 @@ public class PowerNode extends PowerBlock{
}
protected boolean linked(Tile tile, Tile other){
return tile.entity.power.links.contains(other.packedPosition());
return tile.entity.power.links.contains(other.pos());
}
protected boolean linkValid(Tile tile, Tile link){
@@ -226,7 +226,7 @@ public class PowerNode extends PowerBlock{
return Vector2.dst(tile.drawx(), tile.drawy(), link.drawx(), link.drawy()) <= Math.max(laserRange * tilesize,
((PowerNode) link.block()).laserRange * tilesize)
+ (link.block().size - 1) * tilesize / 2f + (tile.block().size - 1) * tilesize / 2f &&
(!checkMaxNodes || (oe.power.links.size < ((PowerNode) link.block()).maxNodes || oe.power.links.contains(tile.packedPosition())));
(!checkMaxNodes || (oe.power.links.size < ((PowerNode) link.block()).maxNodes || oe.power.links.contains(tile.pos())));
}else{
return Vector2.dst(tile.drawx(), tile.drawy(), link.drawx(), link.drawy())
<= laserRange * tilesize + (link.block().size - 1) * tilesize;
@@ -251,7 +251,6 @@ public class PowerNode extends PowerBlock{
Draw.color(Palette.powerLight, Palette.power, Mathf.absin(Timers.time(), 8f, 1f));
Lines.stroke(2f);
Lines.line(x1, y1, x2, y2);
}
}

View File

@@ -74,7 +74,7 @@ public class Cultivator extends Drill{
Draw.color(bottomColor, plantColorLight, entity.warmup);
random.setSeed(tile.packedPosition());
random.setSeed(tile.pos());
for(int i = 0; i < 12; i++){
float offset = random.nextFloat() * 999999f;
float x = random.range(4f), y = random.range(4f);

View File

@@ -17,15 +17,22 @@ import java.io.DataOutput;
import java.io.IOException;
import static io.anuke.mindustry.Vars.content;
import static io.anuke.mindustry.Vars.threads;
public class SortedUnloader extends Unloader implements SelectionTrait{
protected float speed = 1f;
private static Item lastItem;
public SortedUnloader(String name){
super(name);
configurable = true;
}
@Override
public void playerPlaced(Tile tile){
threads.runDelay(() -> Call.setSortedUnloaderItem(null, tile, lastItem));
}
@Remote(targets = Loc.both, called = Loc.both, forward = true)
public static void setSortedUnloaderItem(Player player, Tile tile, Item item){
SortedUnloaderEntity entity = tile.entity();
@@ -65,7 +72,10 @@ public class SortedUnloader extends Unloader implements SelectionTrait{
@Override
public void buildTable(Tile tile, Table table){
SortedUnloaderEntity entity = tile.entity();
buildItemTable(table, () -> entity.sortItem, item -> Call.setSortedUnloaderItem(null, tile, item));
buildItemTable(table, () -> entity.sortItem, item -> {
lastItem = item;
Call.setSortedUnloaderItem(null, tile, item);
});
}
@Override

View File

@@ -101,9 +101,9 @@ public class StorageGraph{
add(child);
for(Tile next : child.entity.proximity()){
if(next != base && next.block() instanceof StorageBlock && next.<StorageEntity>entity().graph == null && !closedSet.contains(next.packedPosition())){
if(next != base && next.block() instanceof StorageBlock && next.<StorageEntity>entity().graph == null && !closedSet.contains(next.pos())){
queue.addLast(next);
closedSet.add(next.packedPosition());
closedSet.add(next.pos());
}
}
}

View File

@@ -64,7 +64,7 @@ public class Reconstructor extends Block{
if(other != null && other.block() instanceof Reconstructor){
ReconstructorEntity oe = other.entity();
if(oe.link == entity.tile.packedPosition()){
if(oe.link == entity.tile.pos()){
oe.link = -1;
}
}
@@ -105,8 +105,8 @@ public class Reconstructor extends Block{
unlink(entity);
unlink(oe);
entity.link = other.packedPosition();
oe.link = tile.packedPosition();
entity.link = other.pos();
oe.link = tile.pos();
});
}
@@ -163,7 +163,7 @@ public class Reconstructor extends Block{
ReconstructorEntity entity = tile.entity();
if(entity.link == other.packedPosition()){
if(entity.link == other.pos()){
Call.unlinkReconstructor(null, tile, other);
return false;
}else if(other.block() instanceof Reconstructor){