diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 5bc801cacf..20eb73e3a7 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="57" + android:versionName="3.3b8" > diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index 0b770c7051..6fa0b5b5bb 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -49,7 +49,7 @@ public class NetClient extends Module { IntSet requests = new IntSet(); IntSet recieved = new IntSet(); float playerSyncTime = 2; - float dataTimeout = 60*15; //13 seconds timeout + float dataTimeout = 60*18; //18 seconds timeout public NetClient(){ @@ -61,20 +61,18 @@ public class NetClient extends Module { gotData = false; kicked = false; - Gdx.app.postRunnable(() -> { - Vars.ui.loadfrag.hide(); - Vars.ui.loadfrag.show("$text.connecting.data"); + Vars.ui.loadfrag.hide(); + Vars.ui.loadfrag.show("$text.connecting.data"); - Entities.clear(); + Entities.clear(); - ConnectPacket c = new ConnectPacket(); - c.name = Vars.player.name; - c.android = Vars.android; - Net.send(c, SendMode.tcp); - }); + ConnectPacket c = new ConnectPacket(); + c.name = Vars.player.name; + c.android = Vars.android; + Net.send(c, SendMode.tcp); Timers.runTask(dataTimeout, () -> { - if(!gotData){ + if (!gotData) { Gdx.app.error("Mindustry", "Failed to load data!"); Vars.ui.loadfrag.hide(); Net.disconnect(); @@ -83,37 +81,33 @@ public class NetClient extends Module { }); Net.handle(Disconnect.class, packet -> { - if(kicked) return; + if (kicked) return; - Gdx.app.postRunnable(() -> { - Timers.runFor(3f, Vars.ui.loadfrag::hide); + Timers.runFor(3f, Vars.ui.loadfrag::hide); - GameState.set(State.menu); + GameState.set(State.menu); - Vars.ui.showError("$text.disconnect"); - connecting = false; - }); + Vars.ui.showError("$text.disconnect"); + connecting = false; }); Net.handle(WorldData.class, data -> { - Gdx.app.postRunnable(() -> { - UCore.log("Recieved world data: " + data.stream.available() + " bytes."); - NetworkIO.load(data.stream); - Vars.player.set(Vars.control.core.worldx(), Vars.control.core.worldy() - Vars.tilesize*2); + UCore.log("Recieved world data: " + data.stream.available() + " bytes."); + NetworkIO.load(data.stream); + Vars.player.set(Vars.control.core.worldx(), Vars.control.core.worldy() - Vars.tilesize * 2); - connecting = false; - Vars.ui.loadfrag.hide(); - Vars.ui.join.hide(); - gotData = true; + connecting = false; + Vars.ui.loadfrag.hide(); + Vars.ui.join.hide(); + gotData = true; - Net.send(new ConnectConfirmPacket(), SendMode.tcp); - GameState.set(State.playing); - Net.setClientLoaded(true); - }); + Net.send(new ConnectConfirmPacket(), SendMode.tcp); + GameState.set(State.playing); + Net.setClientLoaded(true); }); Net.handle(SyncPacket.class, packet -> { - if(!gotData) return; + if (!gotData) return; ByteBuffer data = ByteBuffer.wrap(packet.data); @@ -121,7 +115,7 @@ public class NetClient extends Module { EntityGroup group = Entities.getGroup(groupid); - while(data.position() < data.capacity()){ + while (data.position() < data.capacity()) { int id = data.getInt(); SyncEntity entity = (SyncEntity) group.getByID(id); @@ -146,192 +140,174 @@ public class NetClient extends Module { Player player = Vars.control.playerGroup.getByID(packet.playerid); Weapon weapon = (Weapon) Upgrade.getByID(packet.weaponid); - Gdx.app.postRunnable(() -> weapon.shoot(player, packet.x, packet.y, packet.rotation)); + weapon.shoot(player, packet.x, packet.y, packet.rotation); }); Net.handle(PlacePacket.class, packet -> { - Gdx.app.postRunnable(() ->{ - Recipe recipe = Recipes.getByResult(Block.getByID(packet.block)); - if(recipe != null) Vars.control.removeItems(recipe.requirements); - Vars.control.input.placeBlockInternal(packet.x, packet.y, Block.getByID(packet.block), packet.rotation, true, false); - }); + Recipe recipe = Recipes.getByResult(Block.getByID(packet.block)); + if (recipe != null) Vars.control.removeItems(recipe.requirements); + Vars.control.input.placeBlockInternal(packet.x, packet.y, Block.getByID(packet.block), packet.rotation, true, false); }); Net.handle(BreakPacket.class, packet -> { - Gdx.app.postRunnable(() -> Vars.control.input.breakBlockInternal(packet.x, packet.y, false)); + Vars.control.input.breakBlockInternal(packet.x, packet.y, false); }); Net.handle(StateSyncPacket.class, packet -> { - Gdx.app.postRunnable(() -> { - System.arraycopy(packet.items, 0, Vars.control.items, 0, packet.items.length); + System.arraycopy(packet.items, 0, Vars.control.items, 0, packet.items.length); - Vars.control.setWaveData(packet.enemies, packet.wave, packet.countdown); + Vars.control.setWaveData(packet.enemies, packet.wave, packet.countdown); - Timers.resetTime(packet.time + (float) (TimeUtils.timeSinceMillis(packet.timestamp) / 1000.0 * 60.0)); + Timers.resetTime(packet.time + (float) (TimeUtils.timeSinceMillis(packet.timestamp) / 1000.0 * 60.0)); - Gdx.app.postRunnable(Vars.ui.hudfrag::updateItems); - }); + Vars.ui.hudfrag.updateItems(); }); Net.handle(EnemySpawnPacket.class, spawn -> { - Gdx.app.postRunnable(() -> { - //duplicates. - if(Vars.control.enemyGroup.getByID(spawn.id) != null || - recieved.contains(spawn.id)) return; + //duplicates. + if (Vars.control.enemyGroup.getByID(spawn.id) != null || + recieved.contains(spawn.id)) return; - recieved.add(spawn.id); + recieved.add(spawn.id); - Enemy enemy = new Enemy(EnemyType.getByID(spawn.type)); - enemy.set(spawn.x, spawn.y); - enemy.tier = spawn.tier; - enemy.lane = spawn.lane; - enemy.id = spawn.id; - enemy.health = spawn.health; - enemy.add(); + Enemy enemy = new Enemy(EnemyType.getByID(spawn.type)); + enemy.set(spawn.x, spawn.y); + enemy.tier = spawn.tier; + enemy.lane = spawn.lane; + enemy.id = spawn.id; + enemy.health = spawn.health; + enemy.add(); - Effects.effect(Fx.spawn, enemy); - }); + Effects.effect(Fx.spawn, enemy); }); Net.handle(EnemyDeathPacket.class, spawn -> { - Gdx.app.postRunnable(() -> { - Enemy enemy = Vars.control.enemyGroup.getByID(spawn.id); - if (enemy != null) enemy.onDeath(); - }); + Enemy enemy = Vars.control.enemyGroup.getByID(spawn.id); + if (enemy != null) enemy.onDeath(); }); Net.handle(BulletPacket.class, packet -> { //TODO shoot effects for enemies, clientside as well as serverside BulletType type = (BulletType) BaseBulletType.getByID(packet.type); - Gdx.app.postRunnable(() -> { - Entity owner = Vars.control.enemyGroup.getByID(packet.owner); - new Bullet(type, owner, packet.x, packet.y, packet.angle).add(); - }); + Entity owner = Vars.control.enemyGroup.getByID(packet.owner); + new Bullet(type, owner, packet.x, packet.y, packet.angle).add(); }); Net.handle(BlockDestroyPacket.class, packet -> { Tile tile = Vars.world.tile(packet.position % Vars.world.width(), packet.position / Vars.world.width()); - if(tile != null && tile.entity != null){ - Gdx.app.postRunnable(() ->{ - if(tile.entity != null) tile.entity.onDeath(true); - }); + if (tile != null && tile.entity != null) { + if (tile.entity != null) tile.entity.onDeath(true); } }); Net.handle(BlockUpdatePacket.class, packet -> { Tile tile = Vars.world.tile(packet.position % Vars.world.width(), packet.position / Vars.world.width()); - if(tile != null && tile.entity != null){ + if (tile != null && tile.entity != null) { tile.entity.health = packet.health; } }); Net.handle(BlockSyncPacket.class, packet -> { - if(!gotData) return; + if (!gotData) return; DataInputStream stream = new DataInputStream(packet.stream); - Gdx.app.postRunnable(() -> { - try { + try { - float time = stream.readFloat(); - float elapsed = Timers.time() - time; + float time = stream.readFloat(); + float elapsed = Timers.time() - time; - while (stream.available() > 0) { - int pos = stream.readInt(); + while (stream.available() > 0) { + int pos = stream.readInt(); - //TODO what if there's no entity? new code - Tile tile = Vars.world.tile(pos % Vars.world.width(), pos / Vars.world.width()); + //TODO what if there's no entity? new code + Tile tile = Vars.world.tile(pos % Vars.world.width(), pos / Vars.world.width()); - byte times = stream.readByte(); + byte times = stream.readByte(); - for (int i = 0; i < times; i++) { - tile.entity.timer.getTimes()[i] = stream.readFloat(); - } - - short data = stream.readShort(); - tile.setPackedData(data); - - tile.entity.readNetwork(stream, elapsed); + for (int i = 0; i < times; i++) { + tile.entity.timer.getTimes()[i] = stream.readFloat(); } - } catch (IOException e) { - throw new RuntimeException(e); - } catch (Exception e){ - e.printStackTrace(); - //do nothing else... - //TODO fix + + short data = stream.readShort(); + tile.setPackedData(data); + + tile.entity.readNetwork(stream, elapsed); } - }); + } catch (IOException e) { + throw new RuntimeException(e); + } catch (Exception e) { + e.printStackTrace(); + //do nothing else... + //TODO fix + } }); Net.handle(DisconnectPacket.class, packet -> { Player player = Vars.control.playerGroup.getByID(packet.playerid); - if(player != null){ - Gdx.app.postRunnable(player::remove); + if (player != null) { + player.remove(); } Mindustry.platforms.updateRPC(); }); Net.handle(PlayerSpawnPacket.class, packet -> { - Gdx.app.postRunnable(() -> { - //duplicates. - if(Vars.control.enemyGroup.getByID(packet.id) != null || - recieved.contains(packet.id)) return; - recieved.add(packet.id); + //duplicates. + if (Vars.control.enemyGroup.getByID(packet.id) != null || + recieved.contains(packet.id)) return; + recieved.add(packet.id); - Player player = new Player(); - player.x = packet.x; - player.y = packet.y; - player.isAndroid = packet.android; - player.name = packet.name; - player.id = packet.id; - player.weaponLeft = (Weapon) Upgrade.getByID(packet.weaponleft); - player.weaponRight = (Weapon) Upgrade.getByID(packet.weaponright); + Player player = new Player(); + player.x = packet.x; + player.y = packet.y; + player.isAndroid = packet.android; + player.name = packet.name; + player.id = packet.id; + player.weaponLeft = (Weapon) Upgrade.getByID(packet.weaponleft); + player.weaponRight = (Weapon) Upgrade.getByID(packet.weaponright); - player.interpolator.last.set(player.x, player.y); - player.interpolator.target.set(player.x, player.y); - player.add(); + player.interpolator.last.set(player.x, player.y); + player.interpolator.target.set(player.x, player.y); + player.add(); - Mindustry.platforms.updateRPC(); - }); + Mindustry.platforms.updateRPC(); }); - Net.handle(ChatPacket.class, packet -> Gdx.app.postRunnable(() -> Vars.ui.chatfrag.addMessage(packet.text, Vars.netClient.colorizeName(packet.id, packet.name)))); + Net.handle(ChatPacket.class, packet -> Vars.ui.chatfrag.addMessage(packet.text, Vars.netClient.colorizeName(packet.id, packet.name))); Net.handle(KickPacket.class, packet -> { kicked = true; Net.disconnect(); GameState.set(State.menu); - Gdx.app.postRunnable(() -> Vars.ui.showError("$text.server.kicked." + packet.reason.name())); + Vars.ui.showError("$text.server.kicked." + packet.reason.name()); }); Net.handle(WeaponSwitchPacket.class, packet -> { - Gdx.app.postRunnable(() -> { - Player player = Vars.control.playerGroup.getByID(packet.playerid); + Player player = Vars.control.playerGroup.getByID(packet.playerid); - if(player == null) return; + if (player == null) return; - player.weaponLeft = (Weapon)Upgrade.getByID(packet.left); - player.weaponRight = (Weapon)Upgrade.getByID(packet.right); - }); + player.weaponLeft = (Weapon) Upgrade.getByID(packet.left); + player.weaponRight = (Weapon) Upgrade.getByID(packet.right); }); Net.handle(BlockTapPacket.class, packet -> { Tile tile = Vars.world.tile(packet.position); - if(tile != null) tile.block().tapped(tile); + if (tile != null) tile.block().tapped(tile); }); Net.handle(BlockConfigPacket.class, packet -> { Tile tile = Vars.world.tile(packet.position); - if(tile != null) tile.block().configure(tile, packet.data); + if (tile != null) tile.block().configure(tile, packet.data); }); Net.handle(GameOverPacket.class, packet -> { kicked = true; - Gdx.app.postRunnable(ui.restart::show); + ui.restart.show(); }); Net.handle(FriendlyFireChangePacket.class, packet -> Vars.control.setFriendlyFire(packet.enabled)); @@ -404,6 +380,7 @@ public class NetClient extends Module { packet.x = x; packet.y = y; packet.rotation = angle; + packet.playerid = Vars.player.id; Net.send(packet, SendMode.udp); } diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index 218fb0fa5e..7458ff75be 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -46,56 +46,53 @@ public class NetServer extends Module{ Net.handleServer(ConnectPacket.class, packet -> { int id = Net.getLastConnection(); - UCore.log("Sending world data to client (ID="+id+")"); + UCore.log("Sending world data to client (ID=" + id + ")"); - Gdx.app.postRunnable(() -> { - Player player = new Player(); - player.clientid = id; - player.name = packet.name; - player.isAndroid = packet.android; - player.set(Vars.control.core.worldx(), Vars.control.core.worldy() - Vars.tilesize*2); - player.interpolator.last.set(player.x, player.y); - player.interpolator.target.set(player.x, player.y); - connections.put(id, player); + Player player = new Player(); + player.clientid = id; + player.name = packet.name; + player.isAndroid = packet.android; + player.set(Vars.control.core.worldx(), Vars.control.core.worldy() - Vars.tilesize * 2); + player.interpolator.last.set(player.x, player.y); + player.interpolator.target.set(player.x, player.y); + connections.put(id, player); - ByteArrayOutputStream stream = new ByteArrayOutputStream(); - NetworkIO.write(player.id, weapons.get(packet.name, new ByteArray()), stream); + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + NetworkIO.write(player.id, weapons.get(packet.name, new ByteArray()), stream); - UCore.log("Packed " + stream.size() + " uncompressed bytes of data."); + UCore.log("Packed " + stream.size() + " uncompressed bytes of data."); - WorldData data = new WorldData(); - data.stream = new ByteArrayInputStream(stream.toByteArray()); + WorldData data = new WorldData(); + data.stream = new ByteArrayInputStream(stream.toByteArray()); + + Net.sendStream(id, data); - Net.sendStream(id, data); - }); }); Net.handleServer(ConnectConfirmPacket.class, packet -> { Player player = connections.get(Net.getLastConnection()); - if(player == null) return; + if (player == null) return; - Gdx.app.postRunnable(player::add); - sendMessage("[accent]"+Bundles.format("text.server.connected", player.name)); + player.add(); + sendMessage("[accent]" + Bundles.format("text.server.connected", player.name)); }); Net.handleServer(Disconnect.class, packet -> { Player player = connections.get(packet.id); - if(player == null) { - sendMessage("[accent]"+Bundles.format("text.server.disconnected", "")); + if (player == null) { + sendMessage("[accent]" + Bundles.format("text.server.disconnected", "")); return; } - sendMessage("[accent]"+Bundles.format("text.server.disconnected", player.name)); - Gdx.app.postRunnable(() -> { - player.remove(); + sendMessage("[accent]" + Bundles.format("text.server.disconnected", player.name)); + player.remove(); - DisconnectPacket dc = new DisconnectPacket(); - dc.playerid = player.id; + DisconnectPacket dc = new DisconnectPacket(); + dc.playerid = player.id; - Net.send(dc, SendMode.tcp); - }); + Net.send(dc, SendMode.tcp); }); Net.handleServer(PositionPacket.class, pos -> { @@ -106,7 +103,7 @@ public class NetServer extends Module{ Net.handleServer(ShootPacket.class, packet -> { Player player = connections.get(Net.getLastConnection()); - Weapon weapon = (Weapon)Upgrade.getByID(packet.weaponid); + Weapon weapon = (Weapon) Upgrade.getByID(packet.weaponid); weapon.shoot(player, packet.x, packet.y, packet.rotation); packet.playerid = player.id; @@ -114,12 +111,12 @@ public class NetServer extends Module{ }); Net.handleServer(PlacePacket.class, packet -> { - Gdx.app.postRunnable(() -> Vars.control.input.placeBlockInternal(packet.x, packet.y, Block.getByID(packet.block), packet.rotation, true, false)); + Vars.control.input.placeBlockInternal(packet.x, packet.y, Block.getByID(packet.block), packet.rotation, true, false); packet.playerid = connections.get(Net.getLastConnection()).id; Recipe recipe = Recipes.getByResult(Block.getByID(packet.block)); - if(recipe != null){ - for(ItemStack stack : recipe.requirements){ + if (recipe != null) { + for (ItemStack stack : recipe.requirements) { Vars.control.removeItem(stack); } } @@ -128,7 +125,7 @@ public class NetServer extends Module{ }); Net.handleServer(BreakPacket.class, packet -> { - Gdx.app.postRunnable(() -> Vars.control.input.breakBlockInternal(packet.x, packet.y, false)); + Vars.control.input.breakBlockInternal(packet.x, packet.y, false); packet.playerid = connections.get(Net.getLastConnection()).id; Net.sendExcept(Net.getLastConnection(), packet, SendMode.tcp); @@ -137,7 +134,7 @@ public class NetServer extends Module{ Net.handleServer(ChatPacket.class, packet -> { Player player = connections.get(Net.getLastConnection()); - if(player == null){ + if (player == null) { Gdx.app.error("Mindustry", "Could not find player for chat: " + Net.getLastConnection()); return; //GHOSTS AAAA } @@ -145,16 +142,16 @@ public class NetServer extends Module{ packet.name = player.name; packet.id = player.id; Net.sendExcept(player.clientid, packet, SendMode.tcp); - Gdx.app.postRunnable(() -> Vars.ui.chatfrag.addMessage(packet.text, Vars.netClient.colorizeName(packet.id, packet.name))); + Vars.ui.chatfrag.addMessage(packet.text, Vars.netClient.colorizeName(packet.id, packet.name)); }); Net.handleServer(UpgradePacket.class, packet -> { Player player = connections.get(Net.getLastConnection()); - Weapon weapon = (Weapon)Upgrade.getByID(packet.id); + Weapon weapon = (Weapon) Upgrade.getByID(packet.id); - if(!weapons.containsKey(player.name)) weapons.put(player.name, new ByteArray()); - if(!weapons.get(player.name).contains(weapon.id)) weapons.get(player.name).add(weapon.id); + if (!weapons.containsKey(player.name)) weapons.put(player.name, new ByteArray()); + if (!weapons.get(player.name).contains(weapon.id)) weapons.get(player.name).add(weapon.id); Vars.control.removeItems(UpgradeRecipes.get(weapon)); }); @@ -162,12 +159,12 @@ public class NetServer extends Module{ Net.handleServer(WeaponSwitchPacket.class, packet -> { Player player = connections.get(Net.getLastConnection()); - if(player == null) return; + if (player == null) return; packet.playerid = player.id; - player.weaponLeft = (Weapon)Upgrade.getByID(packet.left); - player.weaponRight = (Weapon)Upgrade.getByID(packet.right); + player.weaponLeft = (Weapon) Upgrade.getByID(packet.left); + player.weaponRight = (Weapon) Upgrade.getByID(packet.right); Net.sendExcept(player.clientid, packet, SendMode.tcp); }); @@ -181,7 +178,7 @@ public class NetServer extends Module{ Net.handleServer(BlockConfigPacket.class, packet -> { Tile tile = Vars.world.tile(packet.position); - if(tile != null) tile.block().configure(tile, packet.data); + if (tile != null) tile.block().configure(tile, packet.data); Net.sendExcept(Net.getLastConnection(), packet, SendMode.tcp); }); @@ -189,35 +186,33 @@ public class NetServer extends Module{ Net.handleServer(EntityRequestPacket.class, packet -> { int id = packet.id; int dest = Net.getLastConnection(); - Gdx.app.postRunnable(() -> { - if(Vars.control.playerGroup.getByID(id) != null){ - Player player = Vars.control.playerGroup.getByID(id); - PlayerSpawnPacket p = new PlayerSpawnPacket(); - p.x = player.x; - p.y = player.y; - p.id = player.id; - p.name = player.name; - p.weaponleft = player.weaponLeft.id; - p.weaponright = player.weaponRight.id; - p.android = player.isAndroid; - Net.sendTo(dest, p, SendMode.tcp); - Gdx.app.error("Mindustry", "Replying to entity request ("+Net.getLastConnection()+"): player, " + id); - }else if (Vars.control.enemyGroup.getByID(id) != null){ - Enemy enemy = Vars.control.enemyGroup.getByID(id); - EnemySpawnPacket e = new EnemySpawnPacket(); - e.x = enemy.x; - e.y = enemy.y; - e.id = enemy.id; - e.tier = (byte)enemy.tier; - e.lane = (byte)enemy.lane; - e.type = enemy.type.id; - e.health = (short)enemy.health; - Net.sendTo(dest, e, SendMode.tcp); - Gdx.app.error("Mindustry", "Replying to entity request("+Net.getLastConnection()+"): enemy, " + id); - }else{ - Gdx.app.error("Mindustry", "Entity request target not found!"); - } - }); + if (Vars.control.playerGroup.getByID(id) != null) { + Player player = Vars.control.playerGroup.getByID(id); + PlayerSpawnPacket p = new PlayerSpawnPacket(); + p.x = player.x; + p.y = player.y; + p.id = player.id; + p.name = player.name; + p.weaponleft = player.weaponLeft.id; + p.weaponright = player.weaponRight.id; + p.android = player.isAndroid; + Net.sendTo(dest, p, SendMode.tcp); + Gdx.app.error("Mindustry", "Replying to entity request (" + Net.getLastConnection() + "): player, " + id); + } else if (Vars.control.enemyGroup.getByID(id) != null) { + Enemy enemy = Vars.control.enemyGroup.getByID(id); + EnemySpawnPacket e = new EnemySpawnPacket(); + e.x = enemy.x; + e.y = enemy.y; + e.id = enemy.id; + e.tier = (byte) enemy.tier; + e.lane = (byte) enemy.lane; + e.type = enemy.type.id; + e.health = (short) enemy.health; + Net.sendTo(dest, e, SendMode.tcp); + Gdx.app.error("Mindustry", "Replying to entity request(" + Net.getLastConnection() + "): enemy, " + id); + } else { + Gdx.app.error("Mindustry", "Entity request target not found!"); + } }); } @@ -226,8 +221,6 @@ public class NetServer extends Module{ packet.name = null; packet.text = message; Net.send(packet, SendMode.tcp); - - Gdx.app.postRunnable(() -> Vars.ui.chatfrag.addMessage(message, null)); } public void handleFriendlyFireChange(boolean enabled){ diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/io/anuke/mindustry/core/Renderer.java index 23e540dc39..f898e9aa17 100644 --- a/core/src/io/anuke/mindustry/core/Renderer.java +++ b/core/src/io/anuke/mindustry/core/Renderer.java @@ -422,6 +422,7 @@ public class Renderer extends RendererModule{ //TODO optimize! public void drawBar(Color color, float x, float y, float fraction){ + fraction = Mathf.clamp(fraction); float len = 3; float w = (int) (len * 2 * fraction) + 0.5f; diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java index f2c7da2742..7fc80d5cf4 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/io/anuke/mindustry/core/UI.java @@ -109,7 +109,7 @@ public class UI extends SceneModule{ font.getData().setScale(Vars.fontscale); font.getData().down += Unit.dp.scl(4f); font.getData().lineHeight -= Unit.dp.scl(2f); - }, skin.font(), skin.getFont("default-font-chat")); + }, skin.font(), skin.getFont("default-font-chat"), skin.getFont("korean")); } @Override diff --git a/core/src/io/anuke/mindustry/entities/effect/DamageArea.java b/core/src/io/anuke/mindustry/entities/effect/DamageArea.java index 1e9d6a6416..538f68ccb5 100644 --- a/core/src/io/anuke/mindustry/entities/effect/DamageArea.java +++ b/core/src/io/anuke/mindustry/entities/effect/DamageArea.java @@ -60,7 +60,7 @@ public class DamageArea{ }; Entities.getNearby(Vars.control.enemyGroup, rect, cons); - if(!Vars.control.isFriendlyFire()) Entities.getNearby(Vars.control.playerGroup, rect, cons); + if(Vars.control.isFriendlyFire()) Entities.getNearby(Vars.control.playerGroup, rect, cons); } public static void damageEntities(float x, float y, float radius, int damage){ diff --git a/core/src/io/anuke/mindustry/net/Net.java b/core/src/io/anuke/mindustry/net/Net.java index ee997018ef..c44ff0b342 100644 --- a/core/src/io/anuke/mindustry/net/Net.java +++ b/core/src/io/anuke/mindustry/net/Net.java @@ -181,7 +181,7 @@ public class Net{ /**Get the client ping. Only valid after updatePing().*/ public static int getPing(){ - return clientProvider.getPing(); + return server() ? 0 : clientProvider.getPing(); } /**Returns the last connection that sent a packet to this server.*/ diff --git a/core/src/io/anuke/mindustry/net/Packets.java b/core/src/io/anuke/mindustry/net/Packets.java index b0db9dba22..395b198f16 100644 --- a/core/src/io/anuke/mindustry/net/Packets.java +++ b/core/src/io/anuke/mindustry/net/Packets.java @@ -49,7 +49,7 @@ public class Packets { @Override public void write(ByteBuffer buffer) { - buffer.put((byte)name.length()); + buffer.put((byte)name.getBytes().length); buffer.put(name.getBytes()); buffer.put(android ? (byte)1 : 0); } @@ -275,7 +275,7 @@ public class Packets { @Override public void write(ByteBuffer buffer) { - buffer.put((byte)name.length()); + buffer.put((byte)name.getBytes().length); buffer.put(name.getBytes()); buffer.put(weaponleft); buffer.put(weaponright); @@ -352,12 +352,12 @@ public class Packets { @Override public void write(ByteBuffer buffer) { if(name != null) { - buffer.putShort((short) name.length()); + buffer.putShort((short) name.getBytes().length); buffer.put(name.getBytes()); }else{ buffer.putShort((short)-1); } - buffer.putShort((short)text.length()); + buffer.putShort((short)text.getBytes().length); buffer.put(text.getBytes()); buffer.putInt(id); } diff --git a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java index 57a051dc44..2ea09efec2 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java @@ -28,9 +28,10 @@ public class MenuFragment implements Fragment{ add(new MenuButton("$text.play", group, ui.levels::show)); row(); - add(new MenuButton("$text.joingame", group, ui.join::show)); - row(); - + if(!Vars.gwt) { + add(new MenuButton("$text.joingame", group, ui.join::show)); + row(); + } add(new MenuButton("$text.tutorial", group, ()-> control.playMap(world.maps().getMap("tutorial")))); row(); diff --git a/kryonet/src/io/anuke/kryonet/KryoClient.java b/kryonet/src/io/anuke/kryonet/KryoClient.java index 3a4bc0dd50..17d22931d6 100644 --- a/kryonet/src/io/anuke/kryonet/KryoClient.java +++ b/kryonet/src/io/anuke/kryonet/KryoClient.java @@ -62,40 +62,33 @@ public class KryoClient implements ClientProvider{ c.id = connection.getID(); if(connection.getRemoteAddressTCP() != null) c.addressTCP = connection.getRemoteAddressTCP().toString(); - try{ - Net.handleClientReceived(c); - }catch (Exception e){ - Gdx.app.postRunnable(() -> {throw new RuntimeException(e);}); - } + Gdx.app.postRunnable(() -> Net.handleClientReceived(c)); } @Override public void disconnected (Connection connection) { Disconnect c = new Disconnect(); - try{ - Net.handleClientReceived(c); - }catch (Exception e){ - Gdx.app.postRunnable(() -> {throw new RuntimeException(e);}); - } + Gdx.app.postRunnable(() -> Net.handleClientReceived(c)); } @Override public void received (Connection connection, Object object) { if(object instanceof FrameworkMessage) return; - try{ - Net.handleClientReceived(object); - }catch (Exception e){ - if(e instanceof KryoNetException && e.getMessage() != null && e.getMessage().toLowerCase().contains("incorrect")) { - Gdx.app.postRunnable(() -> Vars.ui.showError("$text.server.mismatch")); - Vars.netClient.disconnectQuietly(); - }else{ - Gdx.app.postRunnable(() -> { + Gdx.app.postRunnable(() -> { + try{ + Net.handleClientReceived(object); + }catch (Exception e){ + if(e instanceof KryoNetException && e.getMessage() != null && e.getMessage().toLowerCase().contains("incorrect")) { + Vars.ui.showError("$text.server.mismatch"); + Vars.netClient.disconnectQuietly(); + }else{ throw new RuntimeException(e); - }); + } } - } + }); + } }; diff --git a/kryonet/src/io/anuke/kryonet/KryoServer.java b/kryonet/src/io/anuke/kryonet/KryoServer.java index 2ee5cf6266..6fd7338f43 100644 --- a/kryonet/src/io/anuke/kryonet/KryoServer.java +++ b/kryonet/src/io/anuke/kryonet/KryoServer.java @@ -66,12 +66,8 @@ public class KryoServer implements ServerProvider { c.id = kn.id; c.addressTCP = connection.getRemoteAddressTCP().toString(); - try { - Net.handleServerReceived(c, kn.id); - connections.add(kn); - }catch (Exception e){ - Gdx.app.postRunnable(() -> {throw new RuntimeException(e);}); - } + connections.add(kn); + Gdx.app.postRunnable(() -> Net.handleServerReceived(c, kn.id)); } @Override @@ -83,11 +79,7 @@ public class KryoServer implements ServerProvider { Disconnect c = new Disconnect(); c.id = k.id; - try{ - Net.handleServerReceived(c, c.id); - }catch (Exception e){ - Gdx.app.postRunnable(() -> {throw new RuntimeException(e);}); - } + Gdx.app.postRunnable(() -> Net.handleServerReceived(c, c.id)); } @Override @@ -95,11 +87,13 @@ public class KryoServer implements ServerProvider { KryoConnection k = getByKryoID(connection.getID()); if(object instanceof FrameworkMessage || k == null) return; - try{ - Net.handleServerReceived(object, k.id); - }catch (Exception e){ - e.printStackTrace(); - } + Gdx.app.postRunnable(() -> { + try{ + Net.handleServerReceived(object, k.id); + }catch (Exception e){ + e.printStackTrace(); + } + }); } };