From 701c7f6e78be78924c9c84b4c16820154cd91a67 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 31 Dec 2017 19:56:40 -0500 Subject: [PATCH 01/12] Implemented full multiplayer; block syncing still unfinished --- build.gradle | 2 +- core/assets/bundles/bundle.properties | 2 + core/assets/ui/uiskin.json | 2 +- core/src/io/anuke/mindustry/Mindustry.java | 19 +- core/src/io/anuke/mindustry/Vars.java | 2 +- core/src/io/anuke/mindustry/ai/Pathfind.java | 20 +- core/src/io/anuke/mindustry/core/Control.java | 13 +- .../io/anuke/mindustry/core/NetClient.java | 77 ++++- .../io/anuke/mindustry/core/NetServer.java | 74 ++++- core/src/io/anuke/mindustry/core/UI.java | 9 +- core/src/io/anuke/mindustry/core/World.java | 19 +- .../mindustry/entities/enemies/Enemy.java | 68 +++- .../entities/enemies/FortressEnemy.java | 9 +- core/src/io/anuke/mindustry/io/NetworkIO.java | 304 ++++++++++++++++++ core/src/io/anuke/mindustry/io/SaveIO.java | 27 +- core/src/io/anuke/mindustry/net/Packets.java | 32 ++ .../io/anuke/mindustry/net/Registrator.java | 20 +- core/src/io/anuke/mindustry/net/Syncable.java | 29 ++ .../src/io/anuke/mindustry/ui/MenuDialog.java | 12 +- .../mindustry/ui/fragments/HudFragment.java | 19 +- .../io/anuke/mindustry/world/Generator.java | 2 +- .../io/anuke/mindustry/world/SpawnPoint.java | 1 - core/src/io/anuke/mindustry/world/Tile.java | 9 +- .../anuke/mindustry/world/blocks/Blocks.java | 23 +- .../mindustry/world/blocks/types/Rock.java | 13 + .../blocks/types/production/Crafter.java | 13 +- .../types/production/LiquidCrafter.java | 2 +- 27 files changed, 688 insertions(+), 134 deletions(-) create mode 100644 core/src/io/anuke/mindustry/io/NetworkIO.java create mode 100644 core/src/io/anuke/mindustry/world/blocks/types/Rock.java diff --git a/build.gradle b/build.gradle index 7a96dfdab5..9e202046e3 100644 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,7 @@ allprojects { appName = "Mindustry" gdxVersion = '1.9.8' aiVersion = '1.8.1' - uCoreVersion = '4fb2c63'; + uCoreVersion = '59488d7'; } repositories { diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 009fc28948..291bf3401e 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -12,6 +12,8 @@ text.savegame=Save Game text.loadgame=Load Game text.joingame=Join Game text.quit=Quit +text.server.connected=A player has joined. +text.server.disconnected=A player has disconnected. text.hostserver=Host Server text.joingame.title=Join Game text.joingame.ip=IP: diff --git a/core/assets/ui/uiskin.json b/core/assets/ui/uiskin.json index 8c6e025c8f..ab6dec7b92 100644 --- a/core/assets/ui/uiskin.json +++ b/core/assets/ui/uiskin.json @@ -46,7 +46,7 @@ io.anuke.ucore.scene.ui.TextButton$TextButtonStyle: { toggle: {font: default-font, fontColor: white, checked: button-down, down: button-down, up: button, over: button-over, disabled: button, disabledFontColor: grey } }, io.anuke.ucore.scene.ui.ImageButton$ImageButtonStyle: { - default: {down: button-down, up: button, over: button-over }, + default: {down: button-down, up: button, over: button-over, imageDisabledColor: lightgray, imageUpColor: white }, empty: { imageDownColor: accent, imageUpColor: white}, emptytoggle: {imageCheckedColor: white, imageDownColor: white, imageUpColor: lightgray}, static: {up: button }, diff --git a/core/src/io/anuke/mindustry/Mindustry.java b/core/src/io/anuke/mindustry/Mindustry.java index 5c8a994b15..fe5f0e054e 100644 --- a/core/src/io/anuke/mindustry/Mindustry.java +++ b/core/src/io/anuke/mindustry/Mindustry.java @@ -1,16 +1,13 @@ package io.anuke.mindustry; -import java.util.Date; -import java.util.Locale; - import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.Array; - import com.badlogic.gdx.utils.I18NBundle; import io.anuke.mindustry.core.*; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.io.PlatformFunction; +import io.anuke.mindustry.net.Net; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.blocks.*; import io.anuke.ucore.UCore; @@ -21,6 +18,9 @@ import io.anuke.ucore.function.Callable; import io.anuke.ucore.modules.ModuleCore; import io.anuke.ucore.scene.ui.TextField; +import java.util.Date; +import java.util.Locale; + public class Mindustry extends ModuleCore { public static Callable donationsCallable; public static boolean hasDiscord = true; @@ -81,16 +81,9 @@ public class Mindustry extends ModuleCore { @Override public void render(){ + super.render(); - try{ - super.render(); - }catch (RuntimeException e){ - //TODO display error log - //Gdx.app.getClipboard().setContents(e.getMessage()); - throw e; - } - - if(!GameState.is(State.paused)){ + if(!GameState.is(State.paused) || Net.active()){ Timers.update(); } diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index fda0b73ec8..7358306aac 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -20,7 +20,7 @@ public class Vars{ //respawn time in frames public static final float respawnduration = 60*4; //time between waves in frames (on normal mode) - public static final float wavespace = 60*60*(android ? 1 : 1); + public static final float wavespace = 10*60*(android ? 1 : 1); //TODO revert //waves can last no longer than 3 minutes, otherwise the next one spawns public static final float maxwavespace = 60*60*4f; //advance time the pathfinding starts at diff --git a/core/src/io/anuke/mindustry/ai/Pathfind.java b/core/src/io/anuke/mindustry/ai/Pathfind.java index 63d64d9250..e89ef2ea99 100644 --- a/core/src/io/anuke/mindustry/ai/Pathfind.java +++ b/core/src/io/anuke/mindustry/ai/Pathfind.java @@ -8,6 +8,7 @@ import com.badlogic.gdx.math.Vector2; import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.enemies.Enemy; +import io.anuke.mindustry.net.Net; import io.anuke.mindustry.world.SpawnPoint; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.util.Angles; @@ -101,20 +102,28 @@ public class Pathfind{ } public void update(){ + int index = 0; + for(SpawnPoint point : Vars.control.getSpawnPoints()){ if(!point.request.pathFound){ try{ if(point.finder.search(point.request, ms)){ smoother.smoothPath(point.path); point.pathTiles = point.path.nodes.toArray(Tile.class); - point.tempTiles = point.path.nodes.toArray(Tile.class); + + if(Net.active() && Net.server()){ + Vars.netServer.handlePathFound(index, point.pathTiles); + } } }catch (ArrayIndexOutOfBoundsException e){ //no path point.request.pathFound = true; } } + + index ++; } + } public boolean finishedUpdating(){ @@ -133,7 +142,6 @@ public class Pathfind{ point.path.clear(); point.pathTiles = null; - point.tempTiles = null; point.request = new PathFinderRequest(point.start, Vars.control.getCore(), heuristic, point.path); point.request.statusChanged = true; //IMPORTANT! @@ -141,15 +149,15 @@ public class Pathfind{ } void findNode(Enemy enemy){ - if(enemy.spawn >= Vars.control.getSpawnPoints().size){ - enemy.spawn = 0; + if(enemy.lane >= Vars.control.getSpawnPoints().size){ + enemy.lane = 0; } - if(Vars.control.getSpawnPoints().get(enemy.spawn).pathTiles == null){ + if(Vars.control.getSpawnPoints().get(enemy.lane).pathTiles == null){ return; } - enemy.path = Vars.control.getSpawnPoints().get(enemy.spawn).pathTiles; + enemy.path = Vars.control.getSpawnPoints().get(enemy.lane).pathTiles; int closest = findClosest(enemy.path, enemy.x, enemy.y); diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index 91e5bb4ccc..1f935e08e3 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -48,7 +48,7 @@ public class Control extends Module{ final Array weapons = new Array<>(); final int[] items = new int[Item.getAllItems().size]; - public final EntityGroup enemyGroup = Entities.addGroup(Enemy.class); + public final EntityGroup enemyGroup = Entities.addGroup(Enemy.class).enableMapping(); public final EntityGroup tileGroup = Entities.addGroup(TileEntity.class, false); public final EntityGroup bulletGroup = Entities.addGroup(Bullet.class); public final EntityGroup shieldGroup = Entities.addGroup(Shield.class); @@ -348,10 +348,11 @@ public class Control extends Module{ try{ Enemy enemy = ClassReflection.newInstance(spawn.type); enemy.set(tile.worldx() + Mathf.range(range), tile.worldy() + Mathf.range(range)); - enemy.spawn = fl; + enemy.lane = fl; enemy.tier = spawn.tier(wave, fl); + enemy.add(); + Effects.effect(Fx.spawn, enemy); - enemy.add(enemyGroup); Vars.netServer.handleEnemySpawn(enemy); @@ -612,7 +613,7 @@ public class Control extends Module{ if(!GameState.is(State.menu)){ input.update(); - if(Inputs.keyTap("pause") && !ui.isGameOver() && (GameState.is(State.paused) || GameState.is(State.playing))){ + if(Inputs.keyTap("pause") && !ui.isGameOver() && !Net.active() && (GameState.is(State.paused) || GameState.is(State.playing))){ GameState.set(GameState.is(State.playing) ? State.paused : State.playing); } @@ -626,7 +627,7 @@ public class Control extends Module{ } } - if(!GameState.is(State.paused)){ + if(!GameState.is(State.paused) || Net.active()){ if(respawntime > 0){ @@ -650,7 +651,7 @@ public class Control extends Module{ if(enemies <= 0){ wavetime -= delta(); - if(lastUpdated < wave + 1 && wavetime < Vars.aheadPathfinding){ //start updatingbeforehand + if(lastUpdated < wave + 1 && wavetime < Vars.aheadPathfinding){ //start updating beforehand world.pathfinder().updatePath(); lastUpdated = wave + 1; } diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index 5f581b30ad..f3c9511571 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -1,17 +1,29 @@ package io.anuke.mindustry.core; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.utils.reflect.ClassReflection; +import com.badlogic.gdx.utils.reflect.ReflectionException; import io.anuke.mindustry.Vars; import io.anuke.mindustry.core.GameState.State; +import io.anuke.mindustry.entities.Bullet; +import io.anuke.mindustry.entities.BulletType; import io.anuke.mindustry.entities.Player; -import io.anuke.mindustry.io.SaveIO; +import io.anuke.mindustry.entities.enemies.Enemy; +import io.anuke.mindustry.graphics.Fx; +import io.anuke.mindustry.io.NetworkIO; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net.SendMode; import io.anuke.mindustry.net.Packets.*; +import io.anuke.mindustry.net.Syncable; +import io.anuke.mindustry.net.Syncable.Interpolator; import io.anuke.mindustry.resource.Weapon; import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.Tile; import io.anuke.ucore.UCore; +import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Timers; +import io.anuke.ucore.entities.BaseBulletType; +import io.anuke.ucore.entities.Entity; import io.anuke.ucore.modules.Module; import java.util.Arrays; @@ -46,7 +58,8 @@ public class NetClient extends Module { Net.handle(WorldData.class, data -> { Gdx.app.postRunnable(() -> { UCore.log("Recieved world data: " + data.stream.available() + " bytes."); - SaveIO.load(data.stream); + NetworkIO.load(data.stream); + Vars.player.set(Vars.control.core.worldx(), Vars.control.core.worldy() - Vars.tilesize*2); GameState.set(State.playing); connecting = false; @@ -76,11 +89,19 @@ public class NetClient extends Module { Net.handle(SyncPacket.class, packet -> { if(!gotEntities) return; + //TODO awful code for(int i = 0; i < packet.ids.length; i ++){ int id = packet.ids[i]; if(id != Vars.player.id){ - Player player = Vars.control.playerGroup.getByID(id); - player.getInterpolator().type.read(player, packet.data[i]); + Entity entity = null; + if(id >= packet.enemyStart){ + entity = Vars.control.enemyGroup.getByID(id); + }else { + entity = Vars.control.playerGroup.getByID(id); + } + + //augh + ((Interpolator)((Syncable)entity).getInterpolator()).type.read(entity, packet.data[i]); } } }); @@ -92,20 +113,62 @@ public class NetClient extends Module { weapon.shoot(player, packet.x, packet.y, packet.rotation); }); - Net.handleServer(PlacePacket.class, packet -> { + Net.handle(PlacePacket.class, packet -> { Vars.control.input.placeBlockInternal(packet.x, packet.y, Block.getByID(packet.block), packet.rotation, true, false); }); - Net.handleServer(BreakPacket.class, packet -> { + Net.handle(BreakPacket.class, packet -> { Vars.control.input.breakBlockInternal(packet.x, packet.y, false); }); - Net.handleServer(StateSyncPacket.class, packet -> { + Net.handle(StateSyncPacket.class, packet -> { //TODO replace with arraycopy() for(int i = 0; i < packet.items.length; i ++){ Vars.control.items[i] = packet.items[i]; } Vars.control.setWaveData(packet.enemies, packet.wave, packet.countdown); + + Gdx.app.postRunnable(() -> { + Vars.ui.updateItems(); + }); + }); + + Net.handle(EnemySpawnPacket.class, spawn -> { + Gdx.app.postRunnable(() -> { + try{ + Enemy enemy = ClassReflection.newInstance(spawn.type); + enemy.set(spawn.x, spawn.y); + enemy.tier = spawn.tier; + enemy.lane = spawn.lane; + enemy.id = spawn.id; + enemy.add(); + + Effects.effect(Fx.spawn, enemy); + }catch (ReflectionException e){ + throw new RuntimeException(e); + } + }); + }); + + Net.handle(EnemyDeathPacket.class, spawn -> { + Enemy enemy = Vars.control.enemyGroup.getByID(spawn.id); + if(enemy != null) enemy.onDeath(); + }); + + Net.handle(PathPacket.class, packet -> { + Tile[] tiles = new Tile[packet.path.length]; + for(int i = 0; i < tiles.length; i ++){ + int c = packet.path[i]; + tiles[i] = Vars.world.tile(c % Vars.world.width(), c / Vars.world.width()); + } + Vars.control.spawnpoints.get(packet.index).pathTiles = tiles; + }); + + Net.handle(BulletPacket.class, packet -> { + //TODO shoot effects for enemies, clientside as well as serverside + BulletType type = (BulletType) BaseBulletType.getByID(packet.type); + Entity owner = Vars.control.enemyGroup.getByID(packet.owner); + Bullet bullet = new Bullet(type, owner, packet.x, packet.y, packet.angle).add(); }); } diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index 00509eba94..6b1b87e349 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -5,9 +5,10 @@ import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.utils.IntMap; import io.anuke.mindustry.Vars; import io.anuke.mindustry.core.GameState.State; +import io.anuke.mindustry.entities.BulletType; import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.enemies.Enemy; -import io.anuke.mindustry.io.SaveIO; +import io.anuke.mindustry.io.NetworkIO; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net.SendMode; import io.anuke.mindustry.net.Packets.*; @@ -15,9 +16,11 @@ import io.anuke.mindustry.resource.ItemStack; import io.anuke.mindustry.resource.Recipe; import io.anuke.mindustry.resource.Weapon; import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.Tile; import io.anuke.ucore.UCore; import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Timers; +import io.anuke.ucore.entities.Entity; import io.anuke.ucore.modules.Module; import java.io.ByteArrayInputStream; @@ -27,7 +30,7 @@ import java.util.Arrays; public class NetServer extends Module{ IntMap connections = new IntMap<>(); - float serverSyncTime = 4, itemSyncTime = 20, blockSyncTime = 120; + float serverSyncTime = 4, itemSyncTime = 10, blockSyncTime = 120; public NetServer(){ @@ -36,7 +39,7 @@ public class NetServer extends Module{ WorldData data = new WorldData(); ByteArrayOutputStream stream = new ByteArrayOutputStream(); - SaveIO.write(stream); + NetworkIO.write(stream); UCore.log("Packed " + stream.size() + " uncompressed bytes of data."); @@ -46,6 +49,8 @@ public class NetServer extends Module{ Net.sendStream(packet.id, data); Gdx.app.postRunnable(() -> { + Vars.ui.showInfo("$text.server.connected"); + EntityDataPacket dp = new EntityDataPacket(); Player player = new Player(); @@ -60,10 +65,18 @@ public class NetServer extends Module{ UCore.log("Sending entities: " + Arrays.toString(dp.players)); + //TODO send pathfind positions + //TODO new denser format + //TODO save enemy nodes + Net.sendTo(packet.id, dp, SendMode.tcp); }); }); + Net.handleServer(Disconnect.class, packet -> { + Gdx.app.postRunnable(() -> Vars.ui.showInfo("$text.server.disconnected")); + }); + Net.handleServer(PositionPacket.class, pos -> { Player player = connections.get(Net.getLastConnection()); player.getInterpolator().type.read(player, pos.data); @@ -112,8 +125,45 @@ public class NetServer extends Module{ Net.send(packet, SendMode.udp); } - public void handleEnemySpawn(Enemy enemy){ + public void handleBullet(BulletType type, Entity owner, float x, float y, float angle, short damage){ + BulletPacket packet = new BulletPacket(); + packet.x = x; + packet.y = y; + packet.angle = angle; + packet.damage = damage; + packet.owner = owner.id; + packet.type = type.id; + Net.send(packet, SendMode.udp); + } + public void handlePathFound(int index, Tile[] tiles){ + PathPacket packet = new PathPacket(); + int[] out = new int[tiles.length]; + + for(int p = 0; p < out.length; p ++){ + out[p] = tiles[p].packedPosition(); + } + + packet.path = out; + packet.index = (byte)index; + Net.send(packet, SendMode.tcp); + } + + public void handleEnemySpawn(Enemy enemy){ + EnemySpawnPacket packet = new EnemySpawnPacket(); + packet.type = enemy.getClass(); + packet.lane = (byte)enemy.lane; + packet.tier = (byte)enemy.tier; + packet.x = enemy.x; + packet.y = enemy.y; + packet.id = enemy.id; + Net.send(packet, SendMode.tcp); + } + + public void handleEnemyDeath(Enemy enemy){ + EnemyDeathPacket packet = new EnemyDeathPacket(); + packet.id = enemy.id; + Net.send(packet, SendMode.tcp); } public void update(){ @@ -130,7 +180,7 @@ public class NetServer extends Module{ if(Timers.get("serverSync", serverSyncTime)){ SyncPacket packet = new SyncPacket(); - int amount = Vars.control.playerGroup.amount(); + int amount = Vars.control.playerGroup.amount() + Vars.control.enemyGroup.amount(); packet.ids = new int[amount]; packet.data = new float[amount][0]; @@ -144,6 +194,16 @@ public class NetServer extends Module{ index ++; } + packet.enemyStart = index; + + for(Enemy enemy : Vars.control.enemyGroup.all()){ + float[] out = enemy.getInterpolator().type.write(enemy); + packet.data[index] = out; + packet.ids[index] = enemy.id; + + index ++; + } + Net.send(packet, SendMode.udp); } @@ -160,7 +220,7 @@ public class NetServer extends Module{ if(Timers.get("serverBlockSync", blockSyncTime)){ BlockSyncPacket packet = new BlockSyncPacket(); - + //TODO } } @@ -170,7 +230,7 @@ public class NetServer extends Module{ ByteArrayOutputStream bs = new ByteArrayOutputStream(); DataOutputStream stream = new DataOutputStream(bs); - + //TODO packet.stream = new ByteArrayInputStream(bs.toByteArray()); } diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java index ed174a83fb..fb374ab12b 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/io/anuke/mindustry/core/UI.java @@ -24,6 +24,7 @@ import io.anuke.ucore.function.Listenable; import io.anuke.ucore.modules.SceneModule; import io.anuke.ucore.scene.Element; import io.anuke.ucore.scene.Skin; +import io.anuke.ucore.scene.actions.Actions; import io.anuke.ucore.scene.builders.build; import io.anuke.ucore.scene.builders.label; import io.anuke.ucore.scene.builders.table; @@ -258,7 +259,7 @@ public class UI extends SceneModule{ prefs.hidden(()->{ if(!GameState.is(State.menu)){ - if(!wasPaused) + if(!wasPaused || Net.active()) GameState.set(State.playing); } }); @@ -269,7 +270,7 @@ public class UI extends SceneModule{ if(menu.getScene() != null){ wasPaused = menu.wasPaused; } - GameState.set(State.paused); + if(!Net.active()) GameState.set(State.paused); menu.hide(); } }); @@ -467,6 +468,10 @@ public class UI extends SceneModule{ if(tooltip != null) tooltip.hide(); } + + public void showInfo(String info){ + scene.table().add(info).get().getParent().actions(Actions.fadeOut(4f), Actions.removeActor()); + } public void showAbout(){ about.show(); diff --git a/core/src/io/anuke/mindustry/core/World.java b/core/src/io/anuke/mindustry/core/World.java index 8c5cd7195f..1cff20a251 100644 --- a/core/src/io/anuke/mindustry/core/World.java +++ b/core/src/io/anuke/mindustry/core/World.java @@ -1,25 +1,31 @@ package io.anuke.mindustry.core; -import static io.anuke.mindustry.Vars.*; - import com.badlogic.gdx.math.GridPoint2; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Array; - import io.anuke.mindustry.Vars; import io.anuke.mindustry.ai.Pathfind; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.io.Maps; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; +import io.anuke.mindustry.net.Net; +import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.Generator; +import io.anuke.mindustry.world.Map; +import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.world.blocks.Blocks; +import io.anuke.mindustry.world.blocks.DistributionBlocks; +import io.anuke.mindustry.world.blocks.ProductionBlocks; +import io.anuke.mindustry.world.blocks.WeaponBlocks; import io.anuke.ucore.entities.Entities; import io.anuke.ucore.entities.Entity; import io.anuke.ucore.modules.Module; import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Tmp; +import static io.anuke.mindustry.Vars.*; + public class World extends Module{ private int seed; @@ -36,7 +42,8 @@ public class World extends Module{ @Override public void update(){ - pathfind.update(); + if(!(Net.active() && Net.client())) + pathfind.update(); } @Override diff --git a/core/src/io/anuke/mindustry/entities/enemies/Enemy.java b/core/src/io/anuke/mindustry/entities/enemies/Enemy.java index 60e901d038..95a0f13451 100644 --- a/core/src/io/anuke/mindustry/entities/enemies/Enemy.java +++ b/core/src/io/anuke/mindustry/entities/enemies/Enemy.java @@ -3,21 +3,32 @@ package io.anuke.mindustry.entities.enemies; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.reflect.ClassReflection; - import io.anuke.mindustry.Vars; -import io.anuke.mindustry.entities.*; +import io.anuke.mindustry.entities.Bullet; +import io.anuke.mindustry.entities.BulletType; +import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.graphics.Fx; import io.anuke.mindustry.graphics.Shaders; +import io.anuke.mindustry.net.Net; +import io.anuke.mindustry.net.Syncable; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.Blocks; -import io.anuke.ucore.UCore; -import io.anuke.ucore.core.*; -import io.anuke.ucore.entities.*; -import io.anuke.ucore.util.*; +import io.anuke.ucore.core.Draw; +import io.anuke.ucore.core.Effects; +import io.anuke.ucore.core.Graphics; +import io.anuke.ucore.core.Timers; +import io.anuke.ucore.entities.DestructibleEntity; +import io.anuke.ucore.entities.Entities; +import io.anuke.ucore.entities.Entity; +import io.anuke.ucore.entities.SolidEntity; +import io.anuke.ucore.util.Angles; +import io.anuke.ucore.util.Mathf; +import io.anuke.ucore.util.Timer; +import io.anuke.ucore.util.Tmp; import static io.anuke.mindustry.Vars.world; -public class Enemy extends DestructibleEntity{ +public class Enemy extends DestructibleEntity implements Syncable{ public final static Color[] tierColors = { Color.valueOf("ffe451"), Color.valueOf("f48e20"), Color.valueOf("ff6757"), Color.valueOf("ff2d86") }; public final static int maxtier = 4; public final static float maxIdle = 60*1.5f; @@ -37,17 +48,19 @@ public class Enemy extends DestructibleEntity{ protected int damage; protected Enemy spawner; protected int spawned = 0; - protected float angle; protected boolean targetCore = false; protected boolean stopNearCore = true; protected float mass = 1f; protected String className; - + + protected Interpolator inter = new Interpolator(SyncType.enemy); + public float idletime = 0f; - public int spawn; + public int lane; public int node = -1; public Tile[] path; + public float angle; public float xvelocity, yvelocity; public Entity target; public int tier = 1; @@ -65,11 +78,20 @@ public class Enemy extends DestructibleEntity{ className = ClassReflection.getSimpleName(getClass()).toLowerCase(); } + public Interpolator getInterpolator() { + return inter; + } + public float drawSize(){ return 12; } void move(){ + if(Net.client() && Net.active()){ + inter.update(this); + return; + } + Tile core = Vars.control.getCore(); if(idletime > maxIdleLife){ @@ -152,9 +174,21 @@ public class Enemy extends DestructibleEntity{ } void shoot(BulletType bullet, float rotation){ - Angles.translation(angle + rotation, length); - Bullet out = new Bullet(bullet, this, x + Angles.x(), y + Angles.y(), this.angle + rotation).add(); - out.damage = (int) (damage * Vars.multiplier); + + if(!(Net.active() && Net.client())) { + Angles.translation(angle + rotation, length); + Bullet out = new Bullet(bullet, this, x + Angles.x(), y + Angles.y(), this.angle + rotation).add(); + out.damage = (int) (damage * Vars.multiplier); + onShoot(bullet, rotation); + + if(Net.active() && Net.server()){ + Vars.netServer.handleBullet(bullet, this, x + Angles.x(), y + Angles.y(), this.angle + rotation, (short) (damage * Vars.multiplier)); + } + } + } + + void onShoot(BulletType type, float rotation){ + } @Override @@ -184,6 +218,10 @@ public class Enemy extends DestructibleEntity{ Effects.sound("bang2", this); remove(); dead = true; + + if(Net.active() && Net.server()){ + Vars.netServer.handleEnemyDeath(this); + } } @Override @@ -258,7 +296,7 @@ public class Enemy extends DestructibleEntity{ } @Override - public T add(){ - return (T) add(Vars.control.enemyGroup); + public Enemy add(){ + return add(Vars.control.enemyGroup); } } diff --git a/core/src/io/anuke/mindustry/entities/enemies/FortressEnemy.java b/core/src/io/anuke/mindustry/entities/enemies/FortressEnemy.java index 45c9a659fa..2407149fa5 100644 --- a/core/src/io/anuke/mindustry/entities/enemies/FortressEnemy.java +++ b/core/src/io/anuke/mindustry/entities/enemies/FortressEnemy.java @@ -38,7 +38,7 @@ public class FortressEnemy extends Enemy{ Angles.translation(angle, 20f); FastEnemy enemy = new FastEnemy(); - enemy.spawn = spawn; + enemy.lane = lane; enemy.tier = this.tier; enemy.spawner = this; enemy.set(x + Angles.x(), y + Angles.y()); @@ -52,10 +52,9 @@ public class FortressEnemy extends Enemy{ speed = 0.001f; } } - - @Override - public void shoot(BulletType type){ - super.shoot(bullet); + + + void onShoot(BulletType type, float rotation){ Effects.effect(Fx.largeCannonShot, x + Angles.x(), y + Angles.y(), angle); Effects.shake(3f, 3f, this); } diff --git a/core/src/io/anuke/mindustry/io/NetworkIO.java b/core/src/io/anuke/mindustry/io/NetworkIO.java new file mode 100644 index 0000000000..44f09db95a --- /dev/null +++ b/core/src/io/anuke/mindustry/io/NetworkIO.java @@ -0,0 +1,304 @@ +package io.anuke.mindustry.io; + +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.TimeUtils; +import com.badlogic.gdx.utils.reflect.ClassReflection; +import io.anuke.mindustry.Vars; +import io.anuke.mindustry.entities.enemies.Enemy; +import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.GameMode; +import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.world.blocks.Blocks; +import io.anuke.mindustry.world.blocks.types.BlockPart; +import io.anuke.mindustry.world.blocks.types.Rock; +import io.anuke.mindustry.world.blocks.types.production.Generator; +import io.anuke.ucore.UCore; +import io.anuke.ucore.core.Timers; +import io.anuke.ucore.entities.Entities; + +import java.io.*; + +import static io.anuke.mindustry.Vars.android; +import static io.anuke.mindustry.io.SaveIO.enemyIDs; +import static io.anuke.mindustry.io.SaveIO.idEnemies; + +public class NetworkIO { + private static final int fileVersionID = 13; + + public static void write(OutputStream os){ + + try(DataOutputStream stream = new DataOutputStream(os)){ + + //--META-- + stream.writeInt(fileVersionID); //version id + stream.writeFloat(Timers.time()); //timer time + stream.writeLong(TimeUtils.millis()); //timestamp + + //--GENERAL STATE-- + stream.writeByte(Vars.control.getMode().ordinal()); //gamemode + stream.writeByte(Vars.world.getMap().id); //map ID + + stream.writeInt(Vars.control.getWave()); //wave + stream.writeFloat(Vars.control.getWaveCountdown()); //wave countdown + + //--INVENTORY-- + + for(int i = 0; i < Vars.control.getItems().length; i ++){ + stream.writeInt(Vars.control.getItems()[i]); + } + + //--ENEMIES-- + + int totalEnemies = 0; + + for(Enemy entity : Vars.control.enemyGroup.all()){ + if(idEnemies.containsKey(entity.getClass())){ + totalEnemies ++; + } + } + + stream.writeInt(totalEnemies); //enemy amount + + for(Enemy enemy : Vars.control.enemyGroup.all()){ + if(idEnemies.containsKey(enemy.getClass())){ + stream.writeInt(enemy.id); + stream.writeByte(idEnemies.get(enemy.getClass())); //type + stream.writeByte(enemy.lane); //lane + stream.writeFloat(enemy.x); //x + stream.writeFloat(enemy.y); //y + stream.writeByte(enemy.tier); //tier + stream.writeShort(enemy.health); //health + stream.writeShort(enemy.node); //current node + } + } + + //--MAP DATA-- + + //seed + stream.writeInt(Vars.world.getSeed()); + + int totalblocks = 0; + int totalrocks = 0; + + for(int x = 0; x < Vars.world.width(); x ++){ + for(int y = 0; y < Vars.world.height(); y ++){ + Tile tile = Vars.world.tile(x, y); + + if(tile.breakable()){ + if(tile.block() instanceof Rock){ + totalrocks ++; + }else{ + totalblocks ++; + } + } + } + } + + //amount of rocks + stream.writeInt(totalrocks); + + //write all rocks + for(int x = 0; x < Vars.world.width(); x ++) { + for (int y = 0; y < Vars.world.height(); y++) { + Tile tile = Vars.world.tile(x, y); + + if (tile.block() instanceof Rock) { + stream.writeInt(tile.packedPosition()); + } + } + } + + //tile amount + stream.writeInt(totalblocks); + + for(int x = 0; x < Vars.world.width(); x ++){ + for(int y = 0; y < Vars.world.height(); y ++){ + Tile tile = Vars.world.tile(x, y); + + if(tile.breakable() && !(tile.block() instanceof Rock)){ + + stream.writeInt(x + y*Vars.world.width()); //tile pos + //TODO will break if block number gets over BYTE_MAX + stream.writeByte(tile.block().id); //block ID + + if(tile.block() instanceof BlockPart){ + stream.writeByte(tile.link); + } + + if(tile.entity != null){ + stream.writeByte(tile.getRotation()); //placerot + stream.writeShort(tile.entity.health); //health + + //items + for(int i = 0; i < tile.entity.items.length; i ++){ + stream.writeInt(tile.entity.items[i]); + } + + //timer data + + //amount of active timers + byte times = 0; + + for(; times < tile.entity.timer.getTimes().length; times ++){ + if(tile.entity.timer.getTimes()[times] > 0){ + break; + } + } + + stream.writeByte(times); + + for(int i = 0; i < times; i ++){ + stream.writeFloat(tile.entity.timer.getTimes()[times]); + } + + tile.entity.write(stream); + } + } + } + } + + }catch (IOException e){ + throw new RuntimeException(e); + } + } + + public static void load(FileHandle file){ + load(file.read()); + } + + //TODO GWT support + public static void load(InputStream is){ + + try(DataInputStream stream = new DataInputStream(is)){ + + int version = stream.readInt(); + float timerTime = stream.readFloat(); + long timestamp = stream.readLong(); + + Timers.resetTime(timerTime + (TimeUtils.timeSinceMillis(timestamp) / 1000f) * 60f); + + if(version != fileVersionID){ + throw new RuntimeException("Save file version mismatch!"); + } + + //general state + byte mode = stream.readByte(); + byte mapid = stream.readByte(); + + int wave = stream.readInt(); + float wavetime = stream.readFloat(); + + Vars.control.setMode(GameMode.values()[mode]); + + //inventory + for(int i = 0; i < Vars.control.getItems().length; i ++){ + Vars.control.getItems()[i] = stream.readInt(); + } + + Vars.ui.updateItems(); + + //enemies + + Entities.clear(); + + int enemies = stream.readInt(); + + Array enemiesToUpdate = new Array<>(); + + for(int i = 0; i < enemies; i ++){ + int id = stream.readInt(); + byte type = stream.readByte(); + int lane = stream.readByte(); + float x = stream.readFloat(); + float y = stream.readFloat(); + byte tier = stream.readByte(); + short health = stream.readShort(); + short node = stream.readShort(); + + try{ + Enemy enemy = ClassReflection.newInstance(enemyIDs.get(type)); + enemy.id = id; + enemy.lane = lane; + enemy.health = health; + enemy.x = x; + enemy.y = y; + enemy.tier = tier; + enemy.node = node; + enemy.add(Vars.control.enemyGroup); + enemiesToUpdate.add(enemy); + }catch (Exception e){ + throw new RuntimeException(e); + } + } + + Vars.control.setWaveData(enemies, wave, wavetime); + + if(!android) + Vars.player.add(); + + //map + + int seed = stream.readInt(); + + Vars.world.loadMap(Vars.world.maps().getMap(mapid), seed); + Vars.renderer.clearTiles(); + + for(int x = 0; x < Vars.world.width(); x ++){ + for(int y = 0; y < Vars.world.height(); y ++){ + Tile tile = Vars.world.tile(x, y); + + //remove breakables like rocks + if(tile.breakable()){ + Vars.world.tile(x, y).setBlock(Blocks.air); + } + } + } + + int rocks = stream.readInt(); + + for(int i = 0; i < rocks; i ++){ + int pos = stream.readInt(); + Tile tile = Vars.world.tile(pos % Vars.world.width(), pos / Vars.world.width()); + Block result = io.anuke.mindustry.world.Generator.rocks.get(tile.floor()); + if(result != null) tile.setBlock(result); + } + + int tiles = stream.readInt(); + + for(int i = 0; i < tiles; i ++){ + int pos = stream.readInt(); + byte blockid = stream.readByte(); + + Tile tile = Vars.world.tile(pos % Vars.world.width(), pos / Vars.world.width()); + tile.setBlock(Block.getByID(blockid)); + + if(tile.block() == Blocks.blockpart){ + tile.link = stream.readByte(); + } + + if(tile.entity != null){ + byte rotation = stream.readByte(); + short health = stream.readShort(); + + tile.entity.health = health; + tile.setRotation(rotation); + + for(int j = 0; j < tile.entity.items.length; j ++){ + tile.entity.items[j] = stream.readInt(); + } + + byte timers = stream.readByte(); + for(int time = 0; time < timers; time ++){ + tile.entity.timer.getTimes()[time] = stream.readFloat(); + } + + tile.entity.read(stream); + } + } + + }catch (IOException e){ + throw new RuntimeException(e); + } + } +} diff --git a/core/src/io/anuke/mindustry/io/SaveIO.java b/core/src/io/anuke/mindustry/io/SaveIO.java index 261226ea6f..f9c6567cbe 100644 --- a/core/src/io/anuke/mindustry/io/SaveIO.java +++ b/core/src/io/anuke/mindustry/io/SaveIO.java @@ -1,28 +1,29 @@ package io.anuke.mindustry.io; -import static io.anuke.mindustry.Vars.android; - -import java.io.*; -import java.util.Arrays; -import java.util.Date; - -import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.ObjectMap; import com.badlogic.gdx.utils.TimeUtils; import com.badlogic.gdx.utils.reflect.ClassReflection; - import io.anuke.mindustry.Mindustry; import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.enemies.*; import io.anuke.mindustry.resource.Item; import io.anuke.mindustry.resource.Weapon; -import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.GameMode; +import io.anuke.mindustry.world.Map; +import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.Blocks; import io.anuke.ucore.core.Core; import io.anuke.ucore.entities.Entities; +import java.io.*; +import java.util.Arrays; +import java.util.Date; + +import static io.anuke.mindustry.Vars.android; + /* * Save format: * @@ -84,7 +85,7 @@ public class SaveIO{ private static final int fileVersionID = 12; //TODO automatic registration of types? - private static final Array> enemyIDs = Array.with( + public static final Array> enemyIDs = Array.with( Enemy.class, FastEnemy.class, RapidEnemy.class, @@ -98,7 +99,7 @@ public class SaveIO{ EmpEnemy.class ); - private static final ObjectMap, Byte> idEnemies = new ObjectMap, Byte>(){{ + public static final ObjectMap, Byte> idEnemies = new ObjectMap, Byte>(){{ for(int i = 0; i < enemyIDs.size; i ++){ put(enemyIDs.get(i), (byte)i); } @@ -245,7 +246,7 @@ public class SaveIO{ for(Enemy enemy : Vars.control.enemyGroup.all()){ if(idEnemies.containsKey(enemy.getClass())){ stream.writeByte(idEnemies.get(enemy.getClass())); //type - stream.writeByte(enemy.spawn); //lane + stream.writeByte(enemy.lane); //lane stream.writeFloat(enemy.x); //x stream.writeFloat(enemy.y); //y stream.writeByte(enemy.tier); //tier @@ -391,7 +392,7 @@ public class SaveIO{ try{ Enemy enemy = ClassReflection.newInstance(enemyIDs.get(type)); - enemy.spawn = lane; + enemy.lane = lane; enemy.health = health; enemy.x = x; enemy.y = y; diff --git a/core/src/io/anuke/mindustry/net/Packets.java b/core/src/io/anuke/mindustry/net/Packets.java index 716cac8ed5..c0c9305976 100644 --- a/core/src/io/anuke/mindustry/net/Packets.java +++ b/core/src/io/anuke/mindustry/net/Packets.java @@ -1,6 +1,7 @@ package io.anuke.mindustry.net; import io.anuke.mindustry.entities.Player; +import io.anuke.mindustry.entities.enemies.Enemy; /**Class for storing all packets.*/ public class Packets { @@ -27,6 +28,7 @@ public class Packets { public static class SyncPacket{ public int[] ids; public float[][] data; + public int enemyStart = 0; } public static class BlockSyncPacket extends Streamable{ @@ -55,6 +57,12 @@ public class Packets { public int playerid; } + public static class BulletPacket{ + public int type, owner; + public float x, y, angle; + public short damage; + } + public static class PlacePacket{ public int playerid; public byte rotation; @@ -66,4 +74,28 @@ public class Packets { public int playerid; public short x, y; } + + public static class EnemySpawnPacket{ + public Class type; + public byte lane, tier; + public float x, y; + public int id; + } + + public static class EnemyDeathPacket{ + public int id; + } + + public static class PathPacket{ + public int[] path; + public byte index; + } + + public static class BlockDestroyPacket{ + public int position; + } + + public static class BlockUpdatePacket{ + public int health; + } } diff --git a/core/src/io/anuke/mindustry/net/Registrator.java b/core/src/io/anuke/mindustry/net/Registrator.java index 3555e95854..96cc6219d2 100644 --- a/core/src/io/anuke/mindustry/net/Registrator.java +++ b/core/src/io/anuke/mindustry/net/Registrator.java @@ -3,6 +3,7 @@ package io.anuke.mindustry.net; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Array; import io.anuke.mindustry.entities.Player; +import io.anuke.mindustry.entities.enemies.*; import io.anuke.mindustry.net.Packets.*; import io.anuke.mindustry.net.Streamable.StreamBegin; import io.anuke.mindustry.net.Streamable.StreamChunk; @@ -24,12 +25,17 @@ public class Registrator { BreakPacket.class, StateSyncPacket.class, BlockSyncPacket.class, + EnemySpawnPacket.class, + PathPacket.class, + BulletPacket.class, + EnemyDeathPacket.class, Class.class, byte[].class, float[].class, float[][].class, int[].class, + int[][].class, Entity[].class, Player[].class, Array.class, @@ -37,7 +43,19 @@ public class Registrator { Entity.class, Player.class, - Mech.class + Mech.class, + + Enemy.class, + FastEnemy.class, + RapidEnemy.class, + FlamerEnemy.class, + TankEnemy.class, + BlastEnemy.class, + MortarEnemy.class, + TestEnemy.class, + HealerEnemy.class, + TitanEnemy.class, + EmpEnemy.class }; } } diff --git a/core/src/io/anuke/mindustry/net/Syncable.java b/core/src/io/anuke/mindustry/net/Syncable.java index 6a31fa5e93..225c78d46d 100644 --- a/core/src/io/anuke/mindustry/net/Syncable.java +++ b/core/src/io/anuke/mindustry/net/Syncable.java @@ -2,9 +2,11 @@ package io.anuke.mindustry.net; import com.badlogic.gdx.math.Vector2; import io.anuke.mindustry.entities.Player; +import io.anuke.mindustry.entities.enemies.Enemy; import io.anuke.ucore.entities.Entity; import io.anuke.ucore.util.Mathf; +//TODO clean up this giant mess public interface Syncable { public Interpolator getInterpolator(); @@ -39,11 +41,38 @@ public interface Syncable { entity.angle = Mathf.lerpAngDelta(entity.angle, i.targetrot, 0.6f); } }; + + public static final SyncType enemy = new SyncType() { + @Override + public float[] write(Enemy entity) { + return new float[]{entity.x, entity.y, entity.angle, entity.health}; + } + + @Override + public void read(Enemy entity, float[] data) { + entity.getInterpolator().target.set(data[0], data[1]); + entity.getInterpolator().targetrot = data[2]; + entity.health = (int)data[3]; + } + + @Override + public void update(Enemy entity, Interpolator interpolator) { + Interpolator i = entity.getInterpolator(); + if(i.target.dst(entity.x, entity.y) > 16){ + entity.set(i.target.x, i.target.y); + } + + entity.x = Mathf.lerpDelta(entity.x, i.target.x, 0.4f); + entity.y = Mathf.lerpDelta(entity.y, i.target.y, 0.4f); + entity.angle = Mathf.lerpAngDelta(entity.angle, i.targetrot, 0.6f); + } + }; } public static class Interpolator { public SyncType type; public Vector2 target = new Vector2(); + public Vector2 last = new Vector2(); public float targetrot; public Interpolator(SyncType type){ diff --git a/core/src/io/anuke/mindustry/ui/MenuDialog.java b/core/src/io/anuke/mindustry/ui/MenuDialog.java index dd484104a5..ea5a67eccc 100644 --- a/core/src/io/anuke/mindustry/ui/MenuDialog.java +++ b/core/src/io/anuke/mindustry/ui/MenuDialog.java @@ -1,13 +1,10 @@ package io.anuke.mindustry.ui; -import static io.anuke.mindustry.Vars.ui; - import com.badlogic.gdx.utils.reflect.ClassReflection; import io.anuke.mindustry.Vars; import io.anuke.mindustry.core.GameState; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.net.Net; -import io.anuke.ucore.UCore; import io.anuke.ucore.core.Timers; import io.anuke.ucore.scene.Element; import io.anuke.ucore.scene.builders.build; @@ -19,20 +16,22 @@ import io.anuke.ucore.util.Strings; import java.io.IOException; +import static io.anuke.mindustry.Vars.ui; + public class MenuDialog extends FloatingDialog{ private SaveDialog save = new SaveDialog(); private LoadDialog load = new LoadDialog(); public boolean wasPaused = false; public MenuDialog() { - super("Paused"); + super("$text.menu"); setup(); } void setup(){ shown(() -> { wasPaused = GameState.is(State.paused); - GameState.set(State.paused); + if(!Net.active()) GameState.set(State.paused); }); if(!Vars.android){ @@ -40,7 +39,7 @@ public class MenuDialog extends FloatingDialog{ content().addButton("$text.back", () -> { hide(); - if(!wasPaused) + if(!wasPaused || Net.active()) GameState.set(State.playing); }); @@ -71,6 +70,7 @@ public class MenuDialog extends FloatingDialog{ }else{ try{ Net.host(result); + GameState.set(State.playing); }catch (IOException e){ Vars.ui.showError(Bundles.format("text.server.error", Strings.parseException(e, false))); } diff --git a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java index 3b655feac0..2b3f050554 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java @@ -1,34 +1,26 @@ package io.anuke.mindustry.ui.fragments; -import static io.anuke.mindustry.Vars.*; - -import com.badlogic.gdx.Game; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; - import com.badlogic.gdx.math.Interpolation; -import io.anuke.mindustry.Mindustry; import io.anuke.mindustry.Vars; import io.anuke.mindustry.core.GameState; import io.anuke.mindustry.core.GameState.State; -import io.anuke.mindustry.resource.Item; -import io.anuke.mindustry.world.GameMode; -import io.anuke.ucore.UCore; +import io.anuke.mindustry.net.Net; import io.anuke.ucore.core.Core; -import io.anuke.ucore.core.Draw; import io.anuke.ucore.core.Settings; import io.anuke.ucore.scene.actions.Actions; import io.anuke.ucore.scene.builders.imagebutton; import io.anuke.ucore.scene.builders.label; import io.anuke.ucore.scene.builders.table; import io.anuke.ucore.scene.event.Touchable; -import io.anuke.ucore.scene.ui.Image; import io.anuke.ucore.scene.ui.ImageButton; import io.anuke.ucore.scene.ui.Label; -import io.anuke.ucore.scene.ui.layout.Cell; import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.util.Bundles; +import static io.anuke.mindustry.Vars.*; + public class HudFragment implements Fragment{ private ImageButton menu, flip, pause; private Table respawntable; @@ -74,7 +66,8 @@ public class HudFragment implements Fragment{ pause = new imagebutton("icon-pause", isize, ()->{ GameState.set(GameState.is(State.paused) ? State.playing : State.paused); - }).update(i -> i.getStyle().imageUp = Core.skin.getDrawable(GameState.is(State.paused) ? "icon-play" : "icon-pause")).get(); + }).update(i -> i.getStyle().imageUp = Core.skin.getDrawable(GameState.is(State.paused) ? "icon-play" : "icon-pause")).cell + .disabled(b -> Net.active()).get(); }}.end(); @@ -105,7 +98,7 @@ public class HudFragment implements Fragment{ //paused table new table(){{ - visible(()->GameState.is(State.paused)); + visible(()->GameState.is(State.paused) && !Net.active()); atop(); new table("pane"){{ diff --git a/core/src/io/anuke/mindustry/world/Generator.java b/core/src/io/anuke/mindustry/world/Generator.java index 66444db661..693e4008d1 100644 --- a/core/src/io/anuke/mindustry/world/Generator.java +++ b/core/src/io/anuke/mindustry/world/Generator.java @@ -17,7 +17,7 @@ import io.anuke.ucore.noise.Noise; import io.anuke.ucore.util.Mathf; public class Generator{ - static final ObjectMap rocks = new ObjectMap(){{ + public static final ObjectMap rocks = new ObjectMap(){{ put(Blocks.stone, Blocks.rock); put(Blocks.snow, Blocks.icerock); put(Blocks.grass, Blocks.shrub); diff --git a/core/src/io/anuke/mindustry/world/SpawnPoint.java b/core/src/io/anuke/mindustry/world/SpawnPoint.java index 94a0293203..9735946ecd 100644 --- a/core/src/io/anuke/mindustry/world/SpawnPoint.java +++ b/core/src/io/anuke/mindustry/world/SpawnPoint.java @@ -8,7 +8,6 @@ import io.anuke.mindustry.ai.SmoothGraphPath; public class SpawnPoint{ public Tile start; public Tile[] pathTiles; - public Tile[] tempTiles; public PathFinder finder; public SmoothGraphPath path = new SmoothGraphPath(); public PathFinderRequest request; diff --git a/core/src/io/anuke/mindustry/world/Tile.java b/core/src/io/anuke/mindustry/world/Tile.java index 8fc45c73a7..52db18ee55 100644 --- a/core/src/io/anuke/mindustry/world/Tile.java +++ b/core/src/io/anuke/mindustry/world/Tile.java @@ -1,16 +1,15 @@ package io.anuke.mindustry.world; -import static io.anuke.mindustry.Vars.tilesize; - import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Array; - import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.world.blocks.Blocks; import io.anuke.ucore.util.Bits; import io.anuke.ucore.util.Mathf; +import static io.anuke.mindustry.Vars.tilesize; + public class Tile{ private static final Array tmpArray = new Array<>(); @@ -34,6 +33,10 @@ public class Tile{ this(x, y); iSetFloor(floor); } + + public int packedPosition(){ + return x + y * Vars.world.width(); + } private void iSetFloor(Block floor){ byte id = (byte)floor.id; diff --git a/core/src/io/anuke/mindustry/world/blocks/Blocks.java b/core/src/io/anuke/mindustry/world/blocks/Blocks.java index f8137dbde9..4e66ed2346 100644 --- a/core/src/io/anuke/mindustry/world/blocks/Blocks.java +++ b/core/src/io/anuke/mindustry/world/blocks/Blocks.java @@ -138,34 +138,23 @@ public class Blocks{ solid = true; }}, - shrub = new Block("shrub"){{ - shadow = "shrubshadow"; - breakable = true; - breaktime = 10; - }}, + shrub = new Rock("shrub"){ + + }, - rock = new Block("rock"){{ - shadow = "rockshadow"; - breakable = true; - breaktime = 15; + rock = new Rock("rock"){{ variants = 2; varyShadow = true; drops = new ItemStack(Item.stone, 3); }}, - icerock = new Block("icerock"){{ - shadow = "rockshadow"; - breakable = true; - breaktime = 15; + icerock = new Rock("icerock"){{ variants = 2; varyShadow = true; drops = new ItemStack(Item.stone, 3); }}, - blackrock = new Block("blackrock"){{ - shadow = "blackrockshadow"; - breakable = true; - breaktime = 15; + blackrock = new Rock("blackrock"){{ variants = 1; varyShadow = true; drops = new ItemStack(Item.stone, 3); diff --git a/core/src/io/anuke/mindustry/world/blocks/types/Rock.java b/core/src/io/anuke/mindustry/world/blocks/types/Rock.java new file mode 100644 index 0000000000..14a8681c3a --- /dev/null +++ b/core/src/io/anuke/mindustry/world/blocks/types/Rock.java @@ -0,0 +1,13 @@ +package io.anuke.mindustry.world.blocks.types; + +import io.anuke.mindustry.world.Block; + +public class Rock extends Block { + + public Rock(String name) { + super(name); + shadow = name+"shadow"; + breakable = true; + breaktime = 10; + } +} diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/Crafter.java b/core/src/io/anuke/mindustry/world/blocks/types/production/Crafter.java index ed34a4e14b..4d4da9bae5 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/Crafter.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/production/Crafter.java @@ -1,15 +1,14 @@ package io.anuke.mindustry.world.blocks.types.production; -import java.util.Arrays; - import com.badlogic.gdx.utils.Array; - import io.anuke.mindustry.graphics.Fx; import io.anuke.mindustry.resource.Item; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Effects; +import java.util.Arrays; + public class Crafter extends Block{ protected final int timerDump = timers++; @@ -32,7 +31,7 @@ public class Crafter extends Block{ @Override public void update(Tile tile){ - if(tile.entity.timer.get(timerDump, 20) && tile.entity.hasItem(result)){ + if(tile.entity.timer.get(timerDump, 15) && tile.entity.hasItem(result)){ tryDump(tile, -1, result); } @@ -52,13 +51,11 @@ public class Crafter extends Block{ @Override public boolean acceptItem(Item item, Tile dest, Tile source){ - boolean craft = false; for(Item req : requirements){ if(item == req){ - craft = true; - break; + return true; } } - return craft; + return false; } } diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/LiquidCrafter.java b/core/src/io/anuke/mindustry/world/blocks/types/production/LiquidCrafter.java index 6b7fde431b..2b82636b58 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/LiquidCrafter.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/production/LiquidCrafter.java @@ -75,7 +75,7 @@ public class LiquidCrafter extends LiquidBlock{ Effects.effect(craftEffect, tile.worldx(), tile.worldy()); } - if(entity.timer.get(timerDump, 30)){ + if(entity.timer.get(timerDump, 15)){ tryDump(tile, -1, output); } } From 62ae6dc1592c6760e2e2884027c6d34e01648f7c Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 31 Dec 2017 22:06:18 -0500 Subject: [PATCH 02/12] More multiplayer setup, possible android support --- core/assets/sprites/sprites.atlas | 343 +++++++++--------- core/assets/sprites/sprites.png | Bin 80557 -> 80835 bytes core/src/io/anuke/mindustry/core/Control.java | 5 +- .../io/anuke/mindustry/core/NetClient.java | 30 +- .../io/anuke/mindustry/core/NetServer.java | 69 +++- .../io/anuke/mindustry/entities/Player.java | 12 +- .../anuke/mindustry/entities/TileEntity.java | 40 +- .../anuke/mindustry/input/GestureHandler.java | 12 +- core/src/io/anuke/mindustry/net/Net.java | 8 + core/src/io/anuke/mindustry/net/Packets.java | 2 +- .../io/anuke/mindustry/net/Registrator.java | 2 + core/src/io/anuke/mindustry/net/Syncable.java | 10 + .../mindustry/desktop/DesktopLauncher.java | 27 +- 13 files changed, 354 insertions(+), 206 deletions(-) diff --git a/core/assets/sprites/sprites.atlas b/core/assets/sprites/sprites.atlas index 8828cba6e3..f1f4d17a0e 100644 --- a/core/assets/sprites/sprites.atlas +++ b/core/assets/sprites/sprites.atlas @@ -27,49 +27,49 @@ blocks/blackrock1 index: -1 blocks/blackrockshadow1 rotate: false - xy: 195, 75 + xy: 315, 91 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/blackstone1 rotate: false - xy: 205, 75 + xy: 315, 81 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/blackstone2 rotate: false - xy: 215, 75 + xy: 325, 91 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/blackstone3 rotate: false - xy: 225, 75 + xy: 325, 81 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/blackstoneblock1 rotate: false - xy: 235, 75 + xy: 335, 91 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/blackstoneblock2 rotate: false - xy: 245, 75 + xy: 335, 81 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/blackstoneblock3 rotate: false - xy: 255, 75 + xy: 345, 91 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -83,7 +83,7 @@ blocks/blackstoneedge index: -1 blocks/block rotate: false - xy: 275, 75 + xy: 355, 91 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -111,119 +111,119 @@ blocks/chainturret index: -1 blocks/chainturret-icon rotate: false - xy: 109, 65 + xy: 123, 79 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/coal1 rotate: false - xy: 295, 75 + xy: 193, 63 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/coal2 rotate: false - xy: 531, 136 + xy: 203, 63 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/coal3 rotate: false - xy: 527, 126 + xy: 213, 63 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/coaldrill rotate: false - xy: 524, 107 + xy: 223, 63 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/coalgenerator rotate: false - xy: 305, 79 + xy: 233, 63 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/coalgenerator-top rotate: false - xy: 315, 79 + xy: 243, 63 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/coalpurifier rotate: false - xy: 325, 79 + xy: 253, 63 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/combustiongenerator rotate: false - xy: 335, 79 + xy: 263, 63 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/compositewall rotate: false - xy: 345, 79 + xy: 273, 63 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/conduit rotate: false - xy: 355, 79 + xy: 283, 63 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/conduitbottom rotate: false - xy: 365, 83 + xy: 293, 63 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/conduitliquid rotate: false - xy: 375, 83 + xy: 303, 67 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/conduittop rotate: false - xy: 385, 83 + xy: 531, 136 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/conveyor rotate: false - xy: 395, 83 + xy: 527, 126 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/conveyormove rotate: false - xy: 405, 83 + xy: 365, 95 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/conveyortunnel rotate: false - xy: 415, 83 + xy: 365, 85 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -237,42 +237,42 @@ blocks/core index: -1 blocks/cross rotate: false - xy: 425, 83 + xy: 375, 95 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/crucible rotate: false - xy: 435, 83 + xy: 375, 85 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/deepwater rotate: false - xy: 445, 83 + xy: 385, 95 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/dirt1 rotate: false - xy: 455, 83 + xy: 385, 85 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/dirt2 rotate: false - xy: 465, 83 + xy: 395, 95 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/dirt3 rotate: false - xy: 475, 83 + xy: 395, 85 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -286,7 +286,7 @@ blocks/dirtedge index: -1 blocks/door rotate: false - xy: 786, 393 + xy: 405, 95 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -300,7 +300,7 @@ blocks/door-large index: -1 blocks/door-large-icon rotate: false - xy: 796, 393 + xy: 405, 85 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -314,21 +314,21 @@ blocks/door-large-open index: -1 blocks/door-open rotate: false - xy: 844, 485 + xy: 415, 95 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/doubleturret rotate: false - xy: 109, 53 + xy: 123, 67 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/duriumwall rotate: false - xy: 854, 485 + xy: 415, 85 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -342,14 +342,14 @@ blocks/duriumwall-large index: -1 blocks/duriumwall-large-icon rotate: false - xy: 864, 485 + xy: 425, 95 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/enemyspawn rotate: false - xy: 874, 485 + xy: 425, 85 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -363,42 +363,42 @@ blocks/flameturret index: -1 blocks/fluxpump rotate: false - xy: 894, 485 + xy: 435, 85 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/grass1 rotate: false - xy: 904, 485 + xy: 445, 95 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/grass2 rotate: false - xy: 914, 485 + xy: 445, 85 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/grass3 rotate: false - xy: 924, 485 + xy: 455, 95 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/grassblock1 rotate: false - xy: 934, 485 + xy: 455, 85 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/grassblock2 rotate: false - xy: 944, 485 + xy: 465, 95 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -412,21 +412,21 @@ blocks/grassedge index: -1 blocks/ice1 rotate: false - xy: 954, 485 + xy: 465, 85 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/ice2 rotate: false - xy: 964, 485 + xy: 475, 95 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/ice3 rotate: false - xy: 974, 485 + xy: 475, 85 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -440,98 +440,98 @@ blocks/iceedge index: -1 blocks/icerock1 rotate: false - xy: 984, 485 + xy: 524, 107 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/icerock2 rotate: false - xy: 994, 485 + xy: 786, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/icerockshadow1 rotate: false - xy: 1004, 485 + xy: 796, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/rockshadow1 rotate: false - xy: 1004, 485 + xy: 796, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/icerockshadow2 rotate: false - xy: 1014, 485 + xy: 844, 485 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/rockshadow2 rotate: false - xy: 1014, 485 + xy: 844, 485 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/iron1 rotate: false - xy: 861, 465 + xy: 924, 485 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/iron2 rotate: false - xy: 871, 475 + xy: 934, 485 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/iron3 rotate: false - xy: 861, 455 + xy: 944, 485 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/irondrill rotate: false - xy: 871, 465 + xy: 954, 485 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/ironwall rotate: false - xy: 881, 475 + xy: 964, 485 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/junction rotate: false - xy: 871, 455 + xy: 974, 485 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/laserturret rotate: false - xy: 351, 89 + xy: 243, 85 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/lava rotate: false - xy: 881, 465 + xy: 984, 485 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -545,63 +545,63 @@ blocks/lavaedge index: -1 blocks/lavasmelter rotate: false - xy: 891, 475 + xy: 994, 485 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/liquiditemjunction rotate: false - xy: 881, 455 + xy: 1004, 485 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/liquidjunction rotate: false - xy: 891, 465 + xy: 1014, 485 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/liquidrouter rotate: false - xy: 901, 475 + xy: 841, 475 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/machineturret rotate: false - xy: 363, 93 + xy: 243, 73 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/megarepairturret rotate: false - xy: 375, 93 + xy: 255, 85 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/mortarturret rotate: false - xy: 387, 93 + xy: 255, 73 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/mossblock rotate: false - xy: 901, 465 + xy: 851, 475 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/mossstone rotate: false - xy: 901, 465 + xy: 851, 475 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -622,7 +622,7 @@ blocks/nuclearreactor-center index: -1 blocks/nuclearreactor-icon rotate: false - xy: 901, 455 + xy: 851, 465 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -643,7 +643,7 @@ blocks/nuclearreactor-small index: -1 blocks/oil rotate: false - xy: 911, 465 + xy: 861, 475 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -657,182 +657,182 @@ blocks/oiledge index: -1 blocks/oilrefinery rotate: false - xy: 921, 475 + xy: 851, 455 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/omnidrill rotate: false - xy: 911, 455 + xy: 861, 465 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/plasmaturret rotate: false - xy: 399, 93 + xy: 267, 85 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/playerspawn rotate: false - xy: 921, 465 + xy: 871, 475 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/powerbooster rotate: false - xy: 931, 475 + xy: 861, 455 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/poweredconveyor rotate: false - xy: 921, 455 + xy: 871, 465 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/poweredconveyormove rotate: false - xy: 931, 465 + xy: 881, 475 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/powerlaser rotate: false - xy: 941, 475 + xy: 871, 455 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/powerlasercorner rotate: false - xy: 931, 455 + xy: 881, 465 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/powerlaserrouter rotate: false - xy: 941, 465 + xy: 891, 475 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/pulseconduit rotate: false - xy: 951, 475 + xy: 881, 455 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/pulseconduitbottom rotate: false - xy: 941, 455 + xy: 891, 465 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/pulseconduittop rotate: false - xy: 951, 465 + xy: 901, 475 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/pump rotate: false - xy: 961, 475 + xy: 891, 455 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/repairturret rotate: false - xy: 411, 93 + xy: 267, 73 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/rock1 rotate: false - xy: 961, 465 + xy: 911, 475 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/rock2 rotate: false - xy: 971, 475 + xy: 901, 455 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/router rotate: false - xy: 961, 455 + xy: 911, 465 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/rtgenerator rotate: false - xy: 971, 465 + xy: 921, 475 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/rtgenerator-top rotate: false - xy: 981, 475 + xy: 911, 455 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/sand1 rotate: false - xy: 971, 455 + xy: 921, 465 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/sand2 rotate: false - xy: 981, 465 + xy: 931, 475 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/sand3 rotate: false - xy: 991, 475 + xy: 921, 455 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/sandblock1 rotate: false - xy: 981, 455 + xy: 931, 465 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/sandblock2 rotate: false - xy: 991, 465 + xy: 941, 475 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/sandblock3 rotate: false - xy: 1001, 475 + xy: 931, 455 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -846,126 +846,126 @@ blocks/sandedge index: -1 blocks/shadow rotate: false - xy: 423, 93 + xy: 279, 85 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/shieldgenerator rotate: false - xy: 1001, 465 + xy: 951, 475 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/shotgunturret rotate: false - xy: 435, 93 + xy: 279, 73 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/shrub rotate: false - xy: 1011, 465 + xy: 961, 475 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/shrubshadow rotate: false - xy: 1011, 455 + xy: 951, 455 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/smelter rotate: false - xy: 315, 69 + xy: 961, 465 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/sniperturret rotate: false - xy: 447, 93 + xy: 291, 85 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/snow1 rotate: false - xy: 325, 69 + xy: 971, 475 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/snow2 rotate: false - xy: 335, 69 + xy: 961, 455 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/snow3 rotate: false - xy: 345, 69 + xy: 971, 465 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/snowblock1 rotate: false - xy: 355, 69 + xy: 981, 475 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/snowblock2 rotate: false - xy: 365, 73 + xy: 971, 455 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/snowblock3 rotate: false - xy: 375, 73 + xy: 981, 465 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/snowedge rotate: false - xy: 95, 33 + xy: 95, 19 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 blocks/sorter rotate: false - xy: 385, 73 + xy: 991, 475 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/steelconveyor rotate: false - xy: 395, 73 + xy: 981, 455 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/steelconveyormove rotate: false - xy: 405, 73 + xy: 991, 465 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/steelwall rotate: false - xy: 415, 73 + xy: 1001, 475 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -979,42 +979,42 @@ blocks/steelwall-large index: -1 blocks/steelwall-large-icon rotate: false - xy: 425, 73 + xy: 991, 455 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/stone1 rotate: false - xy: 435, 73 + xy: 1001, 465 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/stone2 rotate: false - xy: 445, 73 + xy: 1011, 475 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/stone3 rotate: false - xy: 455, 73 + xy: 1001, 455 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/stoneblock1 rotate: false - xy: 465, 73 + xy: 1011, 465 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/stoneblock2 rotate: false - xy: 475, 73 + xy: 1011, 455 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -1035,7 +1035,7 @@ blocks/stonedrill index: -1 blocks/stoneedge rotate: false - xy: 95, 19 + xy: 109, 77 size: 12, 12 orig: 12, 12 offset: 0, 0 @@ -1084,7 +1084,7 @@ blocks/titancannon index: -1 blocks/titancannon-icon rotate: false - xy: 459, 93 + xy: 291, 73 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -1154,7 +1154,7 @@ blocks/titaniumwall-large-icon index: -1 blocks/turret rotate: false - xy: 471, 93 + xy: 303, 89 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -1196,28 +1196,28 @@ blocks/water index: -1 blocks/wateredge rotate: false - xy: 109, 77 + xy: 109, 63 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 blocks/waveturret rotate: false - xy: 183, 73 + xy: 303, 77 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 bullet rotate: false - xy: 285, 75 + xy: 355, 81 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 chainbullet rotate: false - xy: 527, 117 + xy: 183, 64 size: 8, 7 orig: 8, 7 offset: 0, 0 @@ -1476,56 +1476,56 @@ enemies/titanenemy-t3 index: -1 enemyarrow rotate: false - xy: 305, 70 + xy: 527, 117 size: 8, 7 orig: 8, 7 offset: 0, 0 index: -1 icon-coal rotate: false - xy: 841, 475 + xy: 854, 485 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icon-dirium rotate: false - xy: 841, 465 + xy: 864, 485 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icon-iron rotate: false - xy: 851, 475 + xy: 874, 485 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icon-steel rotate: false - xy: 841, 455 + xy: 884, 485 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icon-stone rotate: false - xy: 851, 465 + xy: 894, 485 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icon-titanium rotate: false - xy: 861, 475 + xy: 904, 485 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icon-uranium rotate: false - xy: 851, 455 + xy: 914, 485 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -1558,23 +1558,30 @@ mechs/mech-standard orig: 12, 12 offset: 0, 0 index: -1 +mechs/ship-standard + rotate: false + xy: 95, 33 + size: 12, 12 + orig: 12, 12 + offset: 0, 0 + index: -1 shell rotate: false - xy: 991, 455 + xy: 941, 465 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 shot rotate: false - xy: 1011, 475 + xy: 941, 455 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 shot-long rotate: false - xy: 1001, 455 + xy: 951, 465 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -1680,7 +1687,7 @@ ui/check-over index: -1 ui/clear rotate: false - xy: 123, 79 + xy: 109, 51 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -1708,7 +1715,7 @@ ui/icons/icon-add index: -1 ui/icons/icon-areaDelete rotate: false - xy: 109, 41 + xy: 109, 39 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -1722,28 +1729,28 @@ ui/icons/icon-arrow index: -1 ui/icons/icon-arrow-down rotate: false - xy: 147, 79 + xy: 135, 67 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icons/icon-arrow-left rotate: false - xy: 109, 29 + xy: 147, 79 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icons/icon-arrow-right rotate: false - xy: 159, 79 + xy: 109, 27 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icons/icon-arrow-up rotate: false - xy: 95, 7 + xy: 147, 67 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -1792,21 +1799,21 @@ ui/icons/icon-close-over index: -1 ui/icons/icon-crafting rotate: false - xy: 109, 17 + xy: 159, 79 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icons/icon-cursor rotate: false - xy: 107, 5 + xy: 159, 67 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icons/icon-defense rotate: false - xy: 171, 79 + xy: 95, 7 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -1820,7 +1827,7 @@ ui/icons/icon-discord index: -1 ui/icons/icon-distribution rotate: false - xy: 183, 85 + xy: 109, 15 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -1890,14 +1897,14 @@ ui/icons/icon-grid index: -1 ui/icons/icon-hold rotate: false - xy: 195, 85 + xy: 171, 79 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icons/icon-holdDelete rotate: false - xy: 207, 85 + xy: 171, 67 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -1911,7 +1918,7 @@ ui/icons/icon-home index: -1 ui/icons/icon-info rotate: false - xy: 219, 85 + xy: 107, 3 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -1953,21 +1960,21 @@ ui/icons/icon-loading index: -1 ui/icons/icon-menu rotate: false - xy: 231, 85 + xy: 183, 85 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icons/icon-none rotate: false - xy: 243, 85 + xy: 183, 73 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icons/icon-pause rotate: false - xy: 255, 85 + xy: 195, 85 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -1988,7 +1995,7 @@ ui/icons/icon-pick index: -1 ui/icons/icon-play rotate: false - xy: 267, 85 + xy: 195, 73 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -2002,14 +2009,14 @@ ui/icons/icon-play-2 index: -1 ui/icons/icon-power rotate: false - xy: 279, 85 + xy: 207, 85 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icons/icon-production rotate: false - xy: 291, 85 + xy: 207, 73 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -2093,7 +2100,7 @@ ui/icons/icon-save-map index: -1 ui/icons/icon-settings rotate: false - xy: 303, 89 + xy: 219, 85 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -2114,14 +2121,14 @@ ui/icons/icon-tools index: -1 ui/icons/icon-touch rotate: false - xy: 315, 89 + xy: 219, 73 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icons/icon-touchDelete rotate: false - xy: 327, 89 + xy: 231, 85 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -2149,7 +2156,7 @@ ui/icons/icon-undo index: -1 ui/icons/icon-weapon rotate: false - xy: 339, 89 + xy: 231, 73 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -2329,35 +2336,35 @@ ui/window-empty index: -1 weapons/blaster rotate: false - xy: 265, 75 + xy: 345, 81 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 weapons/flamer rotate: false - xy: 884, 485 + xy: 435, 95 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 weapons/mortar rotate: false - xy: 891, 455 + xy: 841, 465 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 weapons/multigun rotate: false - xy: 911, 475 + xy: 841, 455 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 weapons/railgun rotate: false - xy: 951, 455 + xy: 901, 465 size: 8, 8 orig: 8, 8 offset: 0, 0 diff --git a/core/assets/sprites/sprites.png b/core/assets/sprites/sprites.png index 0847a11908db122c045595ea1e13b0f380eeef8a..62f0be40b92f41d04403af42e891a55b1fd0a084 100644 GIT binary patch delta 79044 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 p6b_I{^(zSclAloF6+r3)Guu^ zVdz?SInHI~?oIFVdv5&x{eShU`}#X;XR)xsA|3AHcL|*%Nd*|MsF1>yA`FJLUXXFvY#zEIyc z<4jpehG!y7w?!C){^_VyM7lB5KUsNs-uHi}fBlZQ_WAP5_qBijhhBRhe&t)LG(-B_ z(y%Fv3DI@^*VhKT4%aO+V_5ON?e(;W5cjQUW_+;NZ}%C-1mQ=Q7!m~akM0rq5qW!Z zUp`mIs#iI`S1o?~`_HQ&^}9>&uK66BD&%lGTPk?L3J=C}j0sW?UEiZ{%33GkN{xLqvdAoMqewPCs?XTrRR5BGeJ z7YuHzv9q6h@7?GB>y7I6Puiw`nL)uw$IXFTa`(0MA=|&N57qgycvWwK_1C4j;Iyl8 zkwIg#-|ilU2`P?#>w^x=PH~(MO2GB5k_@5khr>(jO1*DPU3RYgW-7z)cP}pcWKH); z=DM-X-%4F>rZF!=l)LihWe3zgo?o)<0)xf3`D_Q)v5UVfoz0iW^=!>-V~;<=Cj%zj zzI}@0(#M+&4+QIX`lvF+Dp%Cl%5!{QzwPex|M979zppEDCWtX7Jou&h>e;-hUVUFK zzpv-=zi0@af(JV@fSGy0nqRNgp4QY#=Pv!NGI^W(+yaC1e%bjs#GsybXZ)P!m#1S zbTx+cx6Sjr6g(gk#-0=L?>Dtp1tHpkt|Nr6KgZpuR+r<8hFgmn9I`jK#iq)b!t5XfIdcr;4B1yV+$9-| z=Gb?GnsyqS`br`_*RJy73H$m}wD9k%IX71KoEN|DcbTs9B_cLt=|Gi_STn=}IH(#~C2Jy7uzt_+^X*=PaLZ z>G{OZ!?WQ9|IHZjqT=tjuB0;jzP9dwd5|iD z+TvZoak6H@{Y|ecrhompNp8OItBH&bO>>X#*V*Y_duHc<8`*~61}9k*m>d4T*sdyA z|D<*Xo5S7x_V>T-k8Ltv*|bQSk3l+U@jsnzIT`=j~OGUxVi z-MFwf&h+2>QZt4X`PWOYL(9t*ml#%T^4n^{kP>Mh&BriXP=U8$#oN;orK^gboGu5I zn$y4ky1KV-`}_0LpZ~CFpa0)OeNw%o!}=7a4=?ulZZO{IBmY&s$fa?O(t$h!`jE+uWaAG zJ$&-~-zr6rImN65h7iGbSyBvYo<}x+n4aR?5I1?-d1bv@ieK)R%f8)oXzpjOj$QTb z-M@d;RQ8=`W9Wadx!`$eh|&c2555Qe+8TE5y~Dru`P*Ej_;>sd|NZNqy!B6}_5J&E zKm3`V$l&Q?w9V!VGEGf4Zi>G-MbJrhvux~eX>8A!TD&F z2}9Q^;kjS=eeRcD3G|j?xjWC^?}zyJKR4=qShUzRKC^z<^?Ud82U5)mvwavPjMI2J z|6gE85PmRKP}wB%&t_1Ub4}!BBUXoL%v0VkWpscHKeDko1kHV6Qo1bnv-j$CkMEo; z-S>LK|5fMLuPfbidtvOf7n{#s?9YCFq#^LONa)r@v9EVL{`a=$b@h`fkPxSFc`mg0|G1nH!E&#ms%NM9?L=?WNLYAMrr; z-Dj-6zuotL*Y!aCU%z#$Z@JE0He03h`;s!duxXZmOLzW%Wv6@K`{#=E0QuXo~%m?PMDQLR?@4OyU3_1-$e@ z+h@evu=$*o_t!69G7|Tv&9CDm%*rMcEh}JN`!q<-pF2bKvD=xSf#@GB+dqVcIN)b+@OR7G2>}t`2>( z|6S>o+WP(bURQ+Qo%iMEqGvx&x726eUhGmI_xSkpzu}>CtL{I4|NGy{s^6>L%io{B z-lv}V!5QQ8A>#2h8=pu<|4vWS4bHy4F7$d__1bfP{9|?$JY1m3 zUCA8Z*TWLbZE`|^*+oEN9*flB7bs*dCk}DQ1wD#mLe0?#ch{wS_k}Bz7JCKU>LOAmrGlS=Qxx-2V@>a*OF)_*-3F zE!tf#0V*FEK=runE0yrrcDt7nn`#!#WVo2xa^j9zuE?=~b;0w#|Jr`|@9WS1wzbxO zy#4I!?OUlK4k3CB(={5b?#I9VQ1dkRd+ncH@$+~6v-@Snu;R=8<@SFwElNQRO>c6k!&K~^!`C*Yx@Pp-o4wZ-h)yD5%b$j)?w!kA_Kkux+zu&&J z-rj!a|4FR#(UWF~UdHXfLJ!P`p{Qeae>xJGG1~WXmbylUZ(ud*x_4Tj5t(rXbn(e}s z@9)pwHGlrjwfW2mM>+&Ec^S@HeB@_dP<+(h2Q>fRz-P=*)7K*wn7;Sb#M?W{W^?p% zKin?K;K_6?UG{U?`ry223(h1h_+j^d)%^Y)-*y<)>%Cw6?4SEpGyUJcLjT_T{&({B zy&cbQKmThha!%iuui^Xu`1)y`+iI7J{_|vO&}9c5aU}4c5ws+v!OWcDl*~_!Rp+WC zm5nQJ`PM7ucm3b-_f+o8O!xJx*FBCcom+I7#bEvX_rF)aJMSK3-TiHaQA6O{Z7dCi zpZ}fySG#i8U9g2Kp5MOy*EZyw{;IWYYz~h^7%nqJY|D}S$B_N_VqGG`0Z{0@aA7{+ z9+4bazvrs%m-}0%#NYaSD(cv}S625*R|Lz2vu#+nu>OClt$gNlyV-0GF}u$icv$lu zxc+tZuD$OT{ts=tJpJeI;P0Qa)0rE588X>6Fm5P$8RW`hb&P=nyxWdPk$J(~R|oiy zK5kA>SLtAO+)%rW!DV7^!_jVWZKVrhYz|W3Gm$dNnHR{uGEo0&c>4L$waoD;vcER< z+h2KogTJ-j>Vw_-_1=>lB%jSUyBKeMW#{@||J`F^W%*)CWPk7Zt-rXhR`yWSYq_ww&wsgf{$DZS{~~+; zx$pW{y*@F$_WzYctEuN-$A5btJn!@OT!xetObd?nNG?{Z_nWig+uPgeqP@SrzYi~d zelAq!Um`<@+KahPUkzCq7#I>d+!(H`^eesf_x7n5J2^fqva7%KSiG>ddzJB9?K8X2 zSba;qo~ggs4?GUh`CmyXYt@`%0bl>VFLv48bAP^((z;bO|4#3*ua#!t-2_=Hz1Xcc zsGU!?OWHKdy}n;AG(5Icl&3+e<9`z`g9;-H1H+3H<^{2C=DAEZD|uoj-n@5NZhueC zgMFJ%USHc+JG1oG>UC~`u5(M|{+9Pjt@zEc`TghB#ak!s3R7O;edwH(i@k^NA|B=k zhq(27j2NeA{+r2}_*kI*tH6K9C}V}R`2znL7#QB>Foc*Eymn6bx~2yC@BY8)^^M=_F2Ae(ZFSwVU;AUaobmbRt2dpiz52cW-sjIhe}^6W`E%dD z(EoO+w*NQrH0akn17CM{c5{Hr39BOvD-NFsxc0$M^U%y? zKfYJKD?F~h>df5rL4}py z*!{NRN?h68cWX*t)LxzGx2vx3Z%TD6%tyPfdz$wjZEHBg+)(iURsB2u`}_0f%Djtj z|84SeM{WYc6+aEW(2K8ToRxQyV_;xlYlxrJ5wkhXx8UE;=h2?Iv9YlS@9nKN&5Ydl zytMGG=Wl&2p8c|(^Y`jq_m|?{XSe$N-)04lX=gX_FdTb#cXu);^8#HShT9?xE*YRR zUl}x(`x!|ym`uu1-gTz?_4oJMzpv{4Mc#g$#UP@3Gb@qzss-uX6d2YYm)kp{(UL@e{JQt>Z|9=@4mmkYXAIQbL*|$7&aWZzcpK2 zpWW#PyW8x|5B!DRxk@q^E`5DPz?>0WG8|x#h|7|#n$E!>v{)tR<<~El{jX1XJ?U1g z+lJHYm}A?m9v5*rOuc?StX|FVB!frs-%W4sr*G{pTk!t(=8oUjuXp6`w!iFziFr5YDNJ|q4P=c+a`Wc-^F!fMqR7Qf!7Mc3YQoPO!E^! zk+x+gV}RS-it92AmAnmGlyB^N?QnhRxgDz+AAJ6Glcg$X<`I+Y`ltWZ)@`qUo5T<@ zbBF%>&*7zWzwc5JTl4yF^w;mfUq1(iR7a*V@G>jh*p@pxYJXj=#=p#&*G{fznDWRl zsO2^fgBhcd6vIs62c=y%AOpHQMhvIcIDzN72l}6*0?TvZsB!J2D|n1btX!v zUichiKmD(GY~Px$q71uNJ>sSH^}lx2zYco7m+yS}TyOxdI)DHAZzJA@xz^>U3hH%# z&ClE-yj0Smc16A$vqFI>L(I2C%Y8T13w#@{doo$P{R%#t$)JUoLB90ZjWQN6s_c8c$&a)W0~9%Lxv_kLxwqv z6fSku&j96c=MxMkg4ql-nHn^m|NX2Ds=o9u_W6~xzjH#{nNNQzH@o)s*V3~Wv>tnzF-u~+S^58>%SNk#TD17YZEA>`=qyPFGh7+ZC z)~7Hlcw{oLcskj+{b3V)=6H*x<=ms484G1U*J^-US_TYWE1lm@Vpdq^R~!54#`TFd z$M*-XpMUzf^r`#x7q3SNU1wow_Y-ZHH&0IJ|3bzDHO3U?hF<~qr!ZNRaXHMpSpUD{ z;_rxuvoA4hn8gW7EKD|w87Ew8;CQr1Ex?t5fnmX69)|eRHK3q1W?j%>^=;qljNcNi zMVue?U;p~K;`3Xp)`jby$1k^f;pyZ&&A;c={0n`hS8hN3?OOf(ubp_|pG`as%YKAs zf6G)>Fqq6BG&^^eBrn6%gA5!&QVd$Y^+E@lcp09*V87>ns50G%?NS~ysHc$7A;C~N zxnO5kmx(3ACl$ssvya{@pPMINx-NF|pPxJGQm_2fJvd*xJ{>A@)YAl}d{nyi*`#P4C z*v)@$bZ-6S+qa*7w|xKcv2296l_|FUiyE>9C!bBe*E z+vh3|xDeqfWM0rCXa&l}tU0p;9~ixAm_GH*Dh=iZF9g3VdR4Pqiov!1|JyisyWFLG z(~Y`ZYwhk|-`|n_`twh{$A7H$?v1UR-)&Jhla1l9$bZj6_PvS^F6bBd#)&60SWIX1 z$z)j3Vo?9@fa09{vl%C(yJR})`+L#Fc9Hkm=8&1laHKB zWw{Y9`$6k97CWZL0Y_hfIKYwZ6uZ&PjW z?*j+$&+j`s9#2nY$Ve=|oI1DO&eDmuHb1oTjapWE=bbahuC#yWC$a>HrZA{< z{#eArpkD7d{}M|hcs`2xK>d!T*(?q*bARnAeRFnGTH4$ndrF^8-gdtF&yF&&6L#z4 z@3o{?zB8VF{<#$6gstalKp`M`YtB-hgnO^U+kOTf`S`l3j^n%j^WUpq{nRMye)GPdzT5rBbFWAj1OW273&`rFF7X*Dn)nYJx}b!LAzL&48~lZzy->^)Zz`+CCk(z;UnI`#CY<&}1? z>;8w{efRqF)I^3JdHcB9`r~&3{?w;0m;1|K_Ws^l&(mA_d>LMOPh@oE2w26W@DqG7 zfpBb~8|NM+o(7T2VtXVRB<+-YSQr=@$_`~NpDQMCdQG!ly)uIZvn{u;F}uS(t8an7 z(-lwWx^h3)um5@a;P-vs_ZHadUf#9h?W9|k`!mn0=k5Qr%Vn#3?0g;1FK2=#c$PkU ze9B{2-Tz7@hMMb~-@n%UT;&{BGWXlAc=`L^-R~ZH<~v#U<4Z@nQzxj<_4E#mQK+rvemc$EoGdb(sFsvrG0%emO@ANSKds}tuX^%FO=fd0XTQut5UaZ9M>B>#N==6JQ0^bL*8RUvKta{xdUjMb`=bZjG zoBgWquJ1qpdvVW_%FKQHx13ME`aRxSRafWHZ_UFDJ3gJ#j=XZ2qh14C9p2=5V0M|I zK<47MuHzPs@1u{1xAI)(c$LAxqB%)IX*vS~gTrnqhSV#LFKRqKS~u6zy+J#@f` zrDE#!2#ocr`w)pma9 zz52Hf^5?^+Fa{W0y~_P;<-dRb0{(pN_z&J&8;mwwWn4ozu)bX5SKXbOHEkm|E-r#?C*cRnuoce#U}Mv`b7WrI{#*FS{tc&z=Xjl z_2PCP#say6<}4+Fk$-}7qfI~6{Zmo`?Ja09Gh?W^T3Fu60P^*j-hJkx+5ZnF z*NpJ$dqpZKX}-0NX@@P|EfHA8~}$F+(3cpLod zK26qTV^IG;xsstG(vNwA1jEeb3>LE(R5w|D>Ry=MZWoCoZ}$toI*@L;Z#84`HAeHJ^`WKPVwW>qDA!$WsPdFy zMY8ONRrT)X)?53m*2&w|Ti>s*|9idu?Ns?+7uwle89bC7xc;|rG@S8dD3)TV4BWyv zA?u6H@|TPt-!T-JGkm&cSoXL1n3>c0r*C~2wQhfYb6<=xV7t|a)T;~qgc%dAG4y+1 z3ZJ&1z?bPns=!SagZ=+ky}s~!U2=Sh>^G%TbFRMpxw1Z5_V=RYst^8Ye*eC^3d$(x><+pEH4q-fD#Ja$Pc|nIJ!?xO0 zE1p#H9oNtCa_rJz@&Q#OFHD#Zq;D(Ud{<;aOxyW6i|4A|43lb%UT*av_1eO+UWN@* z8N9VFKi_?>Y?e_&{h!)m&tps8?>}YrrSzOyyvy9m`=wV-uekhfb6>6C_wc#KPqzR5 z3tE43+K8v2bFq6{(>(X@=6QD{xc)ucG)ehCvu(CBv%-0fqIoI}u2VK@Ut|c_mfJn! z@O!0y!C%~k92giH{LC0mNz5%2U0_sWpULGg?eF!Kd^Iyqu883kx?IoDp?x_#ZO6vd zj1#{7UcZU2_OADwr)N*RvtF5S)swq+esZ9wV8Q<%yUSAVHK$52%>QvjeF@_OpZ1`N ziAmOOHsVps?_K}%e+rw!k^=op3`tlsXMKVR$hjpuvoT>sQP{C9F+ zt>FFqYp0cH&(8_WmFEc+NfvS>)9oLYqxJ^ zJn-aV{ZBh@z7DNd7q(}=sE>S9zd6?Vf49~8J=f*G`+vz_aQc0J?-jYPyPw>ex8?s5 zqcxxb;N)XHE2lDkc%6SfFH!2xn?}{~;iH`a%nHtO%}%^xpmzPU6h{61+y36tjU`jFcJ|Nc1^XiT2>_xb$#xX&+_&-Zh^x9-(j&;cuX z`~QB6`l}nbg;BuWDQ@BXLku4#GB5C9Ua;X(d*xy)P&}9!fSMiYj9S8fJsG{$r?5S# zeEPRY)8ghiONLeJf@57}v&5N~b-a$Rf4bVFF6XUl?f=m0lIyEwzwMe|f3@`9>U;Zo zHq9-ywzK`MvrNAB%f*li|4Mhc$|chd-M`9lV|V#_HO^o2Wugy0vdaki z`(@$OS0veE0;*=-9wyQehQAw_Zjt1D;ye2f^R?g#43m$Zx7pQbT=x>|L;swKlE2^mmJ zgk6FmH6^)EXo1eV#XJofj``dl{i}SVPw(Tqd9Qm_Sp5VMMu+Q@*Jn=o(3h=meZ~HC z<&wYuKG)fot`Cm;ZuPdbe&4GPvfHzrPHyVYm16LG_#;g|_`vkNw$cnoR`D`uvMdIj ztm7id5cJ1glHn4|g0JoGVtpU&KgzJsEo{!>tLJ{(bZ-ADtM{RxgsJyj{OfOZ)*ZSs_s#O{y$(#@TN}&M@IJn@P~%@*?bpz+ zzpu}~D8lAYKj9jK!ou@x4LxiRzUr|taMu`LxnGlS%-JhNeZX&aZ=0jw z&%JLxe>$yS&DkHnzphp%_Q6et22PM;nGe+NwwkiAc<$s`Tl-AA|7uJVeJ7pHFeR{U z<2s+&1^TP{DuQI+uPHq?dE58O`YQ|lsw1EG7yLiR{r!9vL;Vex9g=PG>JLue+SkX{ zz{mXmslSP*=q(=xW5WeA|K2xY$T@w9VaNA(+3b=GMK^m`HuV0Q&30g$J73G<-^}H? zSDW^~zAwhkdl1wES$A_;<^R9m`HdLkDju?yzTf*jP3)uR?VYn2R3#V~dB6pe%hb{r zk6AM2IA}G+*~d54|Cm0JA@tgzzDGaJdGuTN?N5%sUoZQrY z!@lk7S2KRtU;qETuG7V%3=?kte=5R|$@XE>9Hs+TK_{q2t2j(zOlbMl{%C&O(@i}r z6D~7G?D_uXi%M7dyJX@2$G$b@T4w#`_&6`?m4g>E!&7F^u1e@BH`2zVr53 zTu~t$`_ATg3m=L<_HAw&gU3hz^*)&l24`&;0@)g3#HatXKg5tB_KX$Kbe)FlXbCxZX7i36{-M{Kv{FnFcfu4cgR(1DOI!iUL zKL7pQT8ndm<|g0CdYYZ_k+;h)i7-Sn9azD^5Uu3k&(<*S{duSPN9`x~Hm3PC)H@0? z*v@8i+IX(5QRG9B>{ru?<<-|;GFvVaOyB~QAL^h*cawFM8P3f5WW=-}uk=c6-$SW? z@~Zz-k?lYtts{Cmq?CS9)YI&n6|i`R`wcAN_aw$KMmbe}0zP-|;&7 z%KK{B{rgvNFx;-Gp1h7NF7kG{m(T$f=6Z)||GcvqPRKCm{EIDOaFJvHt;3v|!Z2aM zJJ}n{&F+@ucSp!aY;+QQ3fcg+l;iyFT2|;p@BxMb>4Osm8Dfsl^=a6_(NN|wOSEnu zkJ64;R<9x#NyNDSJZ->OlfGtsv~1yYj+sWQMX%KUPyJK(o*r~TSGhX;%zxmRB*-z6Lr?4?_S6^n?&{@BZ=fN!IhU-gDFdAfVF-S9b z1~Wv2iLf!Ql%SBtmFr~CG<+`c^b$;aKhcb~0c+$O`+_-6J+ zhK3*P3=A3JKh}Jf`FigRqk|fQp&rwMKIQECZRe+#ZQ1k6>eaJvk*#~UbLZcGej;A5 z^v>%j_c_H3KYrBgTOS|!`}^PDfk%G+?D0AE>5ur&zgHgq-n`XavSQhfv|Umask#0( zrLU$`J?d0{mC7K|WbgN9Hd}+{ucd+t#mpy8F_z@6G%5DwmBdil^h=y||h73LBn?aLlURB*n1yvb|r=A^FP; z3=DHq7=Emn{5Fbp!6~a(k@oeoEWc!);+%ClZMTVh&P9&E+x${@zv=utd;Wd)lMNcl z3)ht%iCyn~t@{4+uiDA~_qo68wz7{`ew^9Ux~TsC>o0$A-b$?(?cd^Qk$XN(^tS!i zE5WaxoSZyWnnC5&WF7{~_xIBn_WbRwUC5cx&0=sp@cuKiW*&yfcjwQrC%7@);AzlF zWmw9naMZlJ#JIg7XR=Za^r(Z42mEi%<7K+lwrwgKgS%df+rci;tm|8^xBWIN=C+Vx zIM)fv{-DNcL4Ck=ErwFQzx{t}G!Nasoc2h+%XNz3mrB0M{q2jKx?V@Q+pL?TZ0o%4 zZD`DXrEmGuicRe2XIEeO>UqoV<*#3Mb%D>PfB$##R@}Ak;zySRe&2DiBJ$|suD6{c z|NOr`U)?71eVM_O++{z~nID`zzAMUy!T9n1NJ)pT|IOdy?k6#9sNZ4k{6CkC;k)4^ zrd9uz^Jg3G&xRh2cYn@j`My8hc3~fNwK-16Fm3Yf`mk@`zJe+9TC4ATyVJgHVeZ-D zgvkfyI4PWE?c74x-HvDwuk87pFClj+UFg8VFn61k zMGir(jb(NFo^a${t3TiWc4O_lx0C<0e?3#R!?(>~I4^f|#jJ&Ybr;2}{N#Aa^)HGPY~W!~Iw*0M zUujyjo&S{=*4^dHc-~KEbMW`~fA%&r+G@UUboqi-vlOF)Ao zpaIAku}TcL_V#VnEQ@u%-+gMw`%CukepF8SEx3P2ZHd8W?a$83Oc`GVJm0gf^vGl( z_G79dDWI9%6YjD9_so~So&4M8w))@yrrFolB%GOHIBSc}{mBjIFZ<0g&!4yJ*{tlW zuiINzf0zzBSaH4FUb8tuA0E~Jja?{sAZK0n%iALVwX&AnpL&U5#@+ovyz+K2zB7$n zbz^oE1kA9Xd<(Sw`1dR}hSn$f`=81kWtuygy~xN>?8lY%U$Y{AZqL0f*7oZ3lV&4H z#qMgOrV8t5KE^(V36?A=EDX|8*5&Vx$b%O87%+6LRF(~I-`T;@u<3P#cx-*Tbv|FC z#m4uu7TUl1k!k#A_Fs=bm#vcKa0WcLdj2-R{Z6XM> zW=kD#x+n7C%dMQtwW)IT4Z6|WUVN?YtFe_ixIOoLZq1w(GE6$ZRL_>(ng^Ocr6^ z@z^a_y1aB#|IWAXn7?N;gYNjuIsg81Z87{W1;NY0d!0_k)o4wf=Qd3Ly zthA?l&E5ZV;v1__%jJIrgQwmKt9w!(v32#iZz?Mz0)sPMlSP_$_`0m~z1`tk{PLNS zf=O-jzKbzZ8JX|QGg(C5vN1Xfbh7XybgZZdSoGvY+vf9jIsRF5^L?&G^qKDaUN>|4 zSKGzeSLS5z`#ksa-1ob_e7AWo@woAzn;%2T!lOFM3_tp%l^ALS8ERielrP*ocQ;r3 zs(L<$m3Qj<7!p35kCtRLP@DUC;j50{hi3X3rD)z?FH|&JbzSb{!tTntFYf>6{8Kb# za9}9$X87|}QvJiKnsk-}udc36U-GyS1l2YgxDdiQihBUi|fH z`1xNG&O3bX%|9i0X(!LQo%Z|Zt@~mg9#?%>hH*labA3ZMM-xNC!2|;VhMQKG^kma^ zHaXSbxsk>2Wo2?~bo%WpahqSv@AT-{S!C z#(+n^1A~v-rThz?U%%on|Nkc+o;>Jgk6!+FV{iS^FZ^p61B_W4K3x&-WjIkNIPE?s zwRB0X)tP;wQ({(b z+*f)g`1x{{75u!H`*-fwl{#2jFU#uSx0NxcRnT`y!`ivW-@J}z+ELFJ=zb^6B_RHO zn2UkQBh~MpW0f}@4s9{~^0WQM|I_;Ql|`F>xvLzAIJSS%ul8#UD?(W|^h+@a<@o2> z8J$W#Saa&@ZZ!s0?m1+{&1%_x96i{rQvic-AOhXsURXt;BGGKW_iZ zjUqC00;K1&gPhB%#E^B0VOM=vfY(!*?@N>8f}J*mbUBEBpKjEkCfcx0mCt)mz4HaZ z@{=61IM{?41Du}Qmd-0KxmRn{qj=ta%fBs;>aS~;>nbz6_#ts@|D|8;E({w^PpGS# zd)aSa-rZf#emw4HXWWp$!XPemXHR9Z38R5}XvN>T#ilHIf8L}^f7&^V>2h&Sec~UU zH`Djn{(sf2H|y*2S}V6)1%?CziJV4`1_^^D|7Y~CWSp>=$w2JvryD<4&gFW*d?L2- z%RWyA;RA2I+T;E^u8;lq@JDxgUv})ji!YcAcBM6N9(dAc|NM7k(!Zkl^&WrM|GZ@C z_F=vkL(kiv$8Xp#VQb*#xMZpKz4m|R*Zt?~r5KoM{B7oWGqA+(&t^LCB|5f=;lVD( z;L?VZUv8}T`JVYZdlJKrSLfz$t$W(*f9~niVqQjHsWVpvX8d}3{eNxo(YNc*t#keN zSzq4No#DdYNY4gO7Bz+!F%mp%&AJ?n0-Kz6)&2c7Gg~0_wfrik04Mi7=f6$(Ss3fw zd^5&CCaS(-ecIW^8K1pH?0YKff7rfqYLENZ=uv-X|Gzh~YrT^i_DR>wIrls%!Hnqu z+caMWwemj;@1KwQJpK0{=a>Eu=Ko1Mz5j+t!$#Zx5x?87F>Gl4Asp!N{MNQVf1khK z{pa80{onV#&;9pm{XZ@i2N}i-D!V2#ObC=RyYN0UpPNZYV0pbvedLM$ZPn*37AsCa zzM~*sTT;Wp`scjpxXdz{AC8;f?h2 zYbJiqzP>K^F54n8S5}3mzrOIS`}y(ZirKf450<^DS<+M~UE#kraKf$oU;h+u|48ko>f&?2l8W#7xD!XdRzTkHdlgz`v zi`oav~-~IOa z{GrkRtRR0---PWjp9u;vT)g^f`o9j)O$T!sPHjtCr_3;e;esH8YUzXQ*Jq~Bn1AI8 zgLH&nXN1Seujf~~1|&_jfAZ7$o_t-u6UUku*+Ml2i97p09+UQ)K9PZi&4A>Ei+%P3$GP><^LX5VyH2yw_|G9_qarl zxn7M)!h~-H+kqDx4FTP%3>nq8`OoG5<&OVxXie|8pF31j7d*`RBb0D@LbYVo`3JKP z|K1*3C%^uIxH5x=?1MJj^sU#`e>z6{N@XoBh9u7384MkfckBCD12&&}%PGjP)9S<4 z(r4ah{Cj^fcv^jzefr|Lm|;(4-RP zpNl{F{QWBX<{HiqojeO3Z`$v}x!`lVQQepSWg)x_0t^o|8CBPri!e1X>}UD=X=^XT zgFW?}e{xs9o5YbI^x%+f{rxPJ8TWU*y{Iu=g<&G+lakm;a!Wj#H80GUK0QSuEDUeI z+tz)Fzh}RN&Ec#_!^A5L5fMxd&wqZ-+RyTT7R!R-5_`q<=D*K;?AqVMcHwxcZNvFF z_3_1bb}EI(WV1YW4mpCoGB#K6{kFhP0qoT-JJ3vQVH z*e=S*9m@FO8j0?Jdy)Bac3 zqwQeAhN+XoYi(Kk>z>$eojkMFs^0$n7vb5Tug&LRN@(P0I6K?iTi{!{CyA?Ur}78VnCar#zouUsv?wLt-||fkoAm_-gqRcI($)e;#&r zPgrfkl?lr%^y`5}-^SAqH4hE}jh{+Z*)C&OFIlb>um^=lnR!;Jcm z>7tu-OzPJ?|IWB3=K1&Y&#JEeU;2K&<<57FubWC9Y`?dq^jiP7Y#np## z!F8U0H&bgFW-=|{WVm;#gyD9!q#y$mD3%>;8B#)zet+5Und{WSX7*^Nh8TB-mYDi8 zZxyY+C<-#vR=)Y0d|v%R{hj9Q^nd?s<=<^_YtU{|4R`<3V|=b)GE=>)WYL35JC%Bc zew==6)OuL-U+tNj$Itw#&$_&PazeeP=KJ@1H|_kt%-fMcCqU34_-VZ-(~Mg&EDf5n z2c~_W@5P|g+x>*|wiUzW$(!m!S?2Gqub<4_AXjf-G~s#joxGyE?m|pFA70ohJ&+GR zGqHO|CWB6+LT%MQ=&PR9F^?&?ZT3^Xu8N(E38Mb%ob@Sfq zSHtsi9isb|b2q%tGC#XqjUnfL{69N`8{7Z>UsW&v!+J~k@5;0Ha-V;7V-V4K6uzY6 z!HrY~OIC;Q`rp?zHKJq>Ok+~`?yJ(^$6O%D!16AZ4;*M>I!p>r`TxuiVYnba-qPj2N0MUF57&!4CJeAqqq?&JK^zHh(Kfn~2ceseI) z?~zzvVmjrycIvJafo^JKVXJ~x@^-nP#s2foeC-tGS4=Q=yZ>&AkTpCWRZ9E271m=0Wd z_xs^~IRMbkd){GLIbG7z}+yAW^MHh4?GxzITMr_ zrtSH8Mssz$2g4LU&JAsU_$M-KV5o`zo%3~$;rd;IIK`SqJe2$aN+Wo@+jvd;d8bIG$@L54r>bJsCG*j0DpZ!$yu%j=3R9p3Ht zO8#E5{7`$1g+q}+;>YQ~lUNz+gYU)jCIpupk#so~nsO^W;U%}?w1@wTSm)e!3T6m8 zF8}E-kLN;t)!h`!ulI1twinIE@ z|4Y{X*EO=N6PW(RUiYu9e`$N_s^D{_B9>pN9`%(zf(~p4_b};YGyLdcc-CjHzG~T( zKRf5eGZ`^`*vQb=xL-x6M9@L4AVtvO=RZ&0@|CaOX)}35`!eV_UEDKu%h%famACfi zUY);Rf1Of8|DCO?e}2-nW^-l;@!{OS^v_V3!6>UCg~4*V{ZaeUWBXEB8Z__6?_R5* zAjn|-tv0t_^2h!U>95t7)e10x>QJZGix~o*)Q)5gpkl@+&fW@KjGzUX$>h5J+2O?^8EdM2cpL2da%O%5g;SV@1 zilpCuE}VaEuYdZT>-Ob;>Mie|7yA6XdY@j&o%O%399RFIV^wJ;{^j4vWXpYjr@b|1 zda$(m{G2~Y-wX49P4PIf*Ur}8+viPK+>2j3_TR3(&mZ4AVR!z%O^WP{7vvc~Ozf{& z68US5&gaeNtXA)Q(8MhjbyIzLt(Dq&%dc00XY)#%nXvr3xwN&Ze$!>U?+(Sk>W{Wd z1>du8tmgf9^Qq;g^L@G}12`}PK}Pc zY3sA+pxRNL^~NLyrAZHd#Xk3YXIYT>%NaCo2sPT`0+J7pN;W?GNVJTyKLzdnGNx~%W}C}-tYZ>@7YCn`P{$R z@xP;r>z~gpH``tIHtW3Q&nJ`9Sq@yfZ*`O9Kx_5Bt5qI1>OHIufVvsq-u<67k)h&a z?fYz576u-+=Cunr8ZIoV-&ZEdxS+e>=?aD^9?2(m)^&co%J-a~_58+%|2KZupIbNK z*PoqM--OPzulY4Q<%f^!yOh4&S9Yd1yw)~)_IkeczbPE`4U;~rhyQ!}`J?fv6H52e z8}z%GidyS`&idwDddKvJ{=_hs&&~}~JR8*Ot6o1@$i6=FphEA%bFa5;QJ8ojsYiH$ z>hgX6|K9UXWB9CH9&^zu-hRu9#C4zlR_1;E{ITMz@r&mhx8A<<{m-_arg!y^=RUsv zIC=U-jqUN(Va3n?^)@TkGlV4xI^@mwQHxyH_t}!V{eBl+=Cf^Ma6HqDCnbCT|9k5lwft{DD6oxR_xaC` zdH2ieE$jEaUcPPf>5qmVrbmBD-&f=Hxjer92MqA}@&-_c4BCJle+ur}rGoJcR+l?Wn^6_L1CJsg;rcud@9*H{}43WE3C>HHHP8VfS)*>qO%UC?v87KVba z=j&zbb6Wgf{+xXN_`?66wsL;RR$q{Bw27IFK{|9$JLAJYLgqf}|;GylJRU41M2U%&j_tG~Py7*rUOs_Jh4`E{WFgr(y3 z2nMEvpqs}X7wLge7l!xFskuvds91s zv%yTL;S%FAQ^ux0#?S9x|F-Z#J=1?(#)8Y2C!gy~W&BnA;qhnEa2&&=aWk_%)T zdFSt5_;&N-1Kwvvx9|VuE#%Nxy-VFy&8PSuTkTue^yRW#F*Yk>;=`06~^RF??aAmOh{#0y1(L^h@{*9m4cb~av z`v3U-yH|JZv1|Tv=YDvtpO2t}RCZR%^xT?-=g)tC|Lebeu%Lsl)5KuLo!n+$#Tf(Y z4WHOsswO0`G-w+oNHQLH5WjxI?r$e&vOK6_NMSjqX`4`0Q*_kw`Ig(+cAq8JsTv60 z-ns7*pN6KBI6DTZ6g91V7d{yH~Qo%^wiYvOv@L-t=p8f9dwg&Rske{L6K zxH6ql=dCwWgX6k;*R4LQ%`Lp?ZuR}VY`w;X`n9I@`<}mcI(|3gc zuGZIIebV*&`dNm=cYlg4EZ3R{|5*C^vYn@7Ta0~s%+&AZCqK;0(wXw-@3imBEmN5s z&gIYl|9^vzV(qmTe;=Hmd*}a?bo-k%pEe(FV2}`Fd~o)=`CR3&$Lagq_dHsE_}$aO zi)PFpg{B10s%QAF{BmEkpUp<%ah+V>d${J z8J~W>JUP~;{>6_Mo86-K{@>@jdRBk_-xC5H4N44l->VE+9Gc4A7(5o7SD4FSy>q3n zFz6hEdE7UrvmBUY9z6f+{q2Rx)$jUbt>;VxwMN*Y9a$XKuKI1orT_2n;SMHNpxpT%W zri~9jFMRlK=k@oyZNL0p!?}%J;{$R(g$lOMbn5XmciTQIUiplb=>OB3HIh}w1oYMNYt*LI; zhWYD0&Kk;Yr*3ByO-u}{=I^Fo6NJB){Kd1TrO!b<-mvb`g{B)khp@(My%a3)> z`5FI9Ef7+uf4lX1)O3cqw~Fod3o(5D+L`kp^uwIj(}TKCdM@^u8!ycmkW{nqvoa?` z)q2h!lP}lX)r-Bqy?^!2x4V257^>75&RIO}QPN^qCc+@ex*+_&uO`DRj|W%lBzY66 z-)eDmNP&_y$d7tq6(zh3N(@d}3>j;4d>ITl1G2xSnf>EPn7e41!8E1nTJewCbD0D_ z|1=FJ}gko)wjrAgerbF%gIT8sh7|9sA?H}22e&%$_M_3v#f zl;U^4-rmcoz*xfc?8z4Y<3ZsocFtwATdO7f;OT2&2ED?+QLF!3?ti#xJqqakcKHRXx)IHwFh*Q1?%44uePJPS1-wr?W6T|G#;57Q>Bo$5|RQxfIyu9I=ak zDf4;8>+5X4y1i6>T#*X0+i#UWSNqrOn0dmhlH;{l50w4A^YOLTOT+#Av1jC&>t;{) zVBFxzFlo06Q>{Y~vjfx1CoJbUIgA|6|NNV}Kwp`$qSf;IudVe#Y(-C^d^H7Z=G*Mw z@?Oco>+gSYYdf_CPyRitO*gr{K9ZlwA?E$v_jTpZSsKz?>xF{E53oM)HEQUa`ae~r z>CE@%AxyE%4wE_gKG+AEvN?b|brHIysmkh0jF+%Eoao}royn50y)|!I)xL-i`M0mH z{<|-G`MS2}*92Zzf3M%4mfJMv{CfSIyW;2GUEZi4%5nkhlcd=Yp9prwuuNdsUvt)# zA(zF$L(n0bmm%`Q`K#|HpM0!TAoS&PcHCUQzkh=2_u08K73{FIJR5)RtM{6&;|#xV zoM5)xUzArFzlvc=pMH8>&Ev;P4eIY~s!UiK*#4OLdvMN(t^eQu|3`oH`!0qB)khg> zXK#LKQ^)!(o#lYZ@p{RG?MoR>STSvy*Pzep&|I(Uxx$kHJmnz47+`fL@H)c1aNnHs>+`SP+B)kj!!*Y=_taGxIK3nvcy(IM_uIQ?S;@Y- zcRy;im(-q*U&pf`zrN0t@leD4DbL?$l`}ecG8ueOUjCf>Z*58FO!e#6r~Uk|%JuE3 z5Q8Zfe^!(0WNnlE3t1d`e}3%k{}cQCZ{+8P+WV|E>1X_jh%&G#pH*H@MNUhTAup z_k#CIhA+!5?>ThniTKs*S2I3)ZJoC5v*q{CFYo*=c~$$j`1thbR=e;2cK)5&kaE)D zo)P2A+40jDuT=gsyJ;U>ed2jH?KA}t#Zcn-{zw7i*)3^M!HS#~MuuFYn6ku?a z^I~`s^Z$GO|L>fC%H0?)>`glO&;Olu{oU96_xG&a`Q?&#?$5uuvpEY+i!jXnzrHi% z?lUjOgiuDNe?C$MoCdui42+;gd$$Y2lUFj6y({g`o#zL&TP4?rPQ6+B_d>zvg-_p1 zmy3V-;h)_l)*}1(Z35-GiQ=z{T4y`#xwbPsL4FbwsQ$LVQc;VtUv!sZ|?v0BYXSxs(t;nZ<5aj&bQ%WY1r{ktFOPdaZ+<`P{*~ADP4``T_;+djCC;Sv^FROGwDoq%JEyR%l1om>l&>sapUrZk z>&nkx&-?VB|Bg(mEBbvopXW4-(U0kZ4EuggUHEs|^XW$!V)y%-g57(xXZ@G=#W~gQ z{>#Vy|1bRW--Z8o_X;vNf3f3WD9ZG%-yboz;qU&smpN=dC$H46KKp#fx~GZ^X(|WS z)t|4s7UkV=%ZHWKl(9hsl)R%0m=-MQ+w8wgUxjHwibtyE+?P^QKW9HXRc^R%-(rrK z$J`S$)(GxYu-_m8}+jcvYFt;?Vhhdd=Bcre|MWUG2!gGlRjP_1pi)2Xl3A)PFoG z9-aO`Ki>a*_15QjXJ55e797-^d;AnVa|HYJ3K$cg})J?Za1d*FWvr>i_(n_@Z~O=UanQV*SsPZ{I5`)PD9ppK$u^^YpJ<%Rl}O z{q=qQ>k|$8!ted=vDvWKzE+UI+1!z#^XZkexbzXG>+mEfmv%Pp{ z?4H)oa6*yMCryE|hYvLKJaMM)@_koM9o=oWJ*$sp!F5AH2B8%*kBQ$}_uct_fpP5q zCs`$$7hy zy*%T~+4o=DeJy;wYTsIh1={cJ%bwb~r`w6`xYncdBI)V=^GOXmjXJjNt6jp-z`&u* zppx+aqH_4Q1@*h;Dl@44{}-QrVE%Vi#s$B{^xcdy^N zFS_eo7tEg<|N9@q^WyCFf4*scy)K>+r>V(O>%}sQVHM|+R|ch?3_D8RE%mcyu2~uU z9u$m0nhYzypMNVa#HjFm^5OrfTn+19ypQ_ozm|2vD(CoB_D=tQbN=P8Sods3a^FFD z17>5%U*{R(T7Ky(Gc1v=S7J!3WoH#K^E(oUAw+8ig5n9&p}SF2qn1vy9b)siEffw%lUYzfWG*gS#HjuU|I1 z{5px{z@_((&-{Pcxj%c~=c&=N>vyJRe?D&>cgg1S(bu!pff0XA3)vr`Mzu$R)bQZw#*AHjT0;lnrH0OTK99${eA0u{FiUH zKF^lA>+taZak=W83;#d9uX%30cVE!jFLyGS8V=U-F)jdw;|{I;D_-2+SC@2kl_aCX z?`6eHxEO90e*d5JOzePuZlv|s$qVMrIq>JZU47nX{p&e7j{DgDzq#V}{KC%qEAH{^ zAWw*LFhpCF=3HDc;lrCL91THMAM6^$Z`H4``o8n~`l<6SeEmFKD!%93_Vp*`vMdzx z+0}LDWM~#=T56wt_;>TCKW_he{n57kl;+!y?{#CRf2)1GS&%`oVcC;EQ)a}+n>4JP z$KcN3A++Fi!M7Vf<6p{I|6e)(ebDuC(fZUYrVKd;Oj#b>V#q)9Q}eszM3G^gru^M)TJIuH^RKn!jH4TPx>XwKBitTl_|uVat>G zA&eIu#Jez@nJX;CXmIxVd{+hmMh87*h9{P4Ob3{M<(gUlKbk&2Z(h}_m5W#ymNG*I zRh!%xG+0=U{`n{r%>3Yc-TUuR;OV)Nz?OAsybb%h|M2eZcp%Xwv#fz(ZL$7A<@PnV zS6x3Yz_902{drA>KUQrF6TYiG`2WG({?@Minw2aKY93x^{5yY^3UVyt;PPW!F!lcg zkp{h0H^0Xgz?uzf855Y6i7_o;-RhldY%a*4w&0BtLs7$@3mgoG@A$;9 zG<33DU}<3az2*EnFUASaXDnf~)nwRQ%k=mA{E{H&bAk-ZKC9F-PT=_W+@oRso)0CT z-~2TQ*GiYkh zR(-C%eZP<5g^4W7oSN#@m>k0X_OJake-X3%u1#-V?|-r0dmsDOAZ;ThcBvv^joPaF z6XQO-S7LB#D9Nz)K6+G$Au6ly)|ag*(XamIur&0tEZA8(QJ3XH{J!$TGK>fG9QVcj ze13hB%!JyR3=gt}6Yg)x3|?IP@9Fz_HM!ZzObzR&GX8t+VDa>m@r3Kzzv>lNhHc7^ zwtp~f?NLsK2`mN@JS+|ke!K2nU;Q-5{qFW#tCSfmxD;Gj71*b=_3RJn`yJp|9&Y)k z*1rDKkDx~JM(6m5Dvuqz)^jLKX3$~Q$Y%KQYxb>NO@?LvjF=S4o^E~ir{&vrQNb(M z%S9biF6d`7X58E#W%WUED?`>Y6`sBIdsm<6)>E>MVQJv}qs?@HKb`4Jkg&+pD=0=7WiK=1O878d$ zUvDVLu+{P9qV@~l|JFGBD|-B0JomuD{LoulqjV20&zsJ|Fqxrh{uG9qzs1MJXE7xx zGZej_fBU|wa)y#bj8Vs@pI*WY9N*7#uZ%x%p~FYZNWm`TyVVZb63c zZ>;tkYHm5QENbFpD~3u}rUWL?WNstFiwO)Jfs74@cYm8>e}PlsS;acPTF$xE)1NcV z*!TRnE5nQwiC7i}nS0IKO&MwwU(UNwrp%~dYj(tbIzz$T`9Aa4_j~et%69lp{jfBq zMSx+SQo}};`i3>X)^{?zRGZ|W#VEq@e?H^KcKN!BK86YVH*Vu#2wrvd3aH`<>1LQQ z!-HW0qk%+@t02SD(!0)C3^QWH8Q*Bnu_?FP6&Lyb)!)}zvJ0ntNj&%YYv9(HbrY7q zx-$L3PWe@RRh>UKE@hZ;qA7$aLG|^Oa?^eL=C5D>y*-toR|$i`e#4ST=n5 z9luH=A^iIJ-1k-glI-Vie0;vP-l<;x#Pv0im)FGYy)|pPob;`E+RPG83@1b@qoX;Q z9Qu!b?=f5{G_Q)=jmd%eUjUQCYNj1Z3_cI$9kk!wsbb*5(9_DmF-`T1DuYwK2ZQGc zkM@HJ8v>UzOt}_$U63J!!C)zy!-*elK`!gXcJS@2fBAj=lfS>$*$XH$-k8d_(_2kH zWVzk;{hSY;t=lmz%240ZUXhj6nRC*d@B3Z;&-uAF_U*pzk5~WITnpju_*r{_r9p+! zXTcRWCXWQ|@S``s6yDzVQp#$|ewW#qKI`fWfBpJcD9o6^^nYDt+GbaV6Klg*4MP8# ze=WSqV6c=SgXut+dcqPG2Vv%ax-18d1ad2^&||1yR`%w`MxH;H4f8-wKPbt#U|s2p zty~O(3@f!5G=wTbp1;5EHEX|J$%$N}O2ea*y3A-R6T<3{}=jO z{A_!D{)hPLe_8g)*N?JTvN|+HurnICGi{iz#89Jf$5rgbHX#;=6QH`sz+Bk2U++V{ z5`&NS|DvVw!VJrz7!*wzQXK6gANV)b^ZwBlWVo8e@I-*&{_lI=YaafeJR!6u{G+|I zNyBs&iyg_A-xP1ny}j+`Z^z#?bIvt_LfnmEN_`yfbU{$THI*TU<-mmS?%iEt5}!VQ zwcRImQLgsI1n-8~tAgX5p6_entLB~iYtm=slZ?}g8afqD*8cadsVjQ6eUo49S5Rn| zZQL|Jn&kpRO01pXk4>MI)8<1LgK zGWO4XztqeM)LwFPXSi|!lv-q1A9OKnh~2M!Au4-owT33w*09IkvFl&YV&M7r`-0+i z26NZtcH8S;bmhofeN}yST>RU6Z}tV{VEKPJTZ)rG_y)hF8YhD&Yd{E_f$7z*REFe+eZ3MN zTK=~$VLh|=x^8CC!IfwC$86a3^SiPAmYlqo5?e1?u3%?qKIrDkaD}OL7h6Nj-~N@1 z1|_o9EjRjq|9x5S-F}CyAi3mK@$dF$KL6W=^JaN|{%BX*p53%g==0-f(5#&YlfqX^ z@7lVodb{5o-}MdaV{OB)FZ{oe#X;i)D`P-f9><*hHSgKdMH<#HKCoUF{{QDK9tYn* zhRZc2$~WdeTdE)ZH@zWBfp@{%-)D2x&GqwteQ2>Uz1sEr|7p{D>23iAxdroG7$(%` zKfb?>r9tP2$M2G!TLA(BY|Xt!ObgoDS1?Rj!6;xQ_HF9AYJUFd3~OH6HApWCjt_o5 z@7A{b`}dgs)&BmrHG1d%^7r?Yw3tkvA73u>AXsF@&zgdY94>|&iEUrLcZYLL=%3BO zkoDP<;gYQn3&Zc!>9N;taJc$pO@3a*(V)iq=l_$H?X%z4{<|Z|=pZ*cOZE4qtwxK5 ziZ~dwITfDIQ)XE5h)JFqGzj7*%^0wmt>NVERg4bbE#4j6YCQS-5(O6Ha~6juOD|Qb z2kkoj!)Tnq^gy0JFMHX6TCqp|zwcL9+&7x(!1nWw+IjW)aoK$g7Zj#^=X~=1)>d!k zznrqOg&0o%+8|s0Uq8sR;pWf#^?z2M-TeLjl@IUN_popj+Rgu6|6F_fG&Ke_#)-@a zSq|)-ZDzLT(fR-KAMLg_f@aniD=}ofJThB}fn{F(zsku6mKxOO)xOzzEm@f%sPvNe zxqct<4{Lu-5A*D({ddXg`_Aj1L2Dr1uByNPcI9LB=~@gMio^ut^1hnK{muLQ`Mr$= z^Ba4+J*jRie|{`H{Va>caSV&Y>*+B?o|{WwhppDL-Fnf| zY;TnkgN{lAXN&atpVt=i*PHp<{Y*)Yy7+x*#K{iEkGrFv)Sgsekc#zgcwTpZoA<4z z_TUBf(~AsM*=`ksT6!A-T^XiCxn521c4H9uVPEs3V7I9&!;}j<&9@pe9yk#HZn_`) ziIc7G7k{d~zWSf@+SY(wx5`(X+sU$H<^4aN_jPV4jcF(^!Cn6Ip# zvV>I_)NtDtz~Z2_VUi#NJHOnVi40ctObgNkEkTod^S3*%WWV74^tYm@p-ixB!=$SR zww|l)@~icoTdl^R@?v^QLpQ?-)(X>S$EWipOlEwuOC$De^^>sO@zOqsJ#N0I@Ot~yyw&&culyiUI-kUp%(_e4#Kfd7;fAc{%M~0HE zvviahJQy217(PXaHVCmWFxT(Q-~IhU786gQY5j@E{x9cm-ZW!X@jAx5E^y07p7Fqf zcp(NOrUfm0)o*`J)MUBx?*_lz>^tAD)ULf;SMSy3vU2METUOs!&OfiGET8rL{chXj zKWn)d4%8SPxG&B4KDrZ6Sk-&eafzWA)^*?)h3&ps|+Z)08c zVD|k#X~nPCZfCTb{Cb5C+n4kFzIkDjZC4u9KWvj;v*7Q8zwNWv*Zh6?>|%PI&GV9; zTQv*hL5nh?12q{|F7R<@n6Urv+x-4MhJwbRSN^PjpG^B}JG*a2_1e85)%U;4SMAQP zD|)t`C3B+iuG!4zIAWf?y7K%Rzaqm7mJ7dC1W!CKGGTD%y)bRxW6OmXRiCvx{x^-^ zwd`xNzFd7ytT2NJXTWR*iKrd+PXF0ufAKRZ@PFyQ>A>dlLo__*Aj^T-FSEAad-X;2 zKz>QQ{X_78CP%{sDFzwV2f>UUJL~%9mt68(D_{9!V)41-#q0OKxOeo=$@4xZ&-;4` z9*~OqUb{Ox=a2i;vz;s-PO^M6wO5ZXDdPUcdFTF{pU>-+86JF?Cu7RMHtn>%iBrPT zdb6@OH!fOnfQB7Ut1tu|UL9-7;FHH(u<(0+c+>O-g;?#<*Gwy~OsoFudjHzI{Zr2S zdsR8kw|e>H_4W1hi#ctwU+>v{V7p4W$xY|_9M72!(u^0T_WgZ1eXiYebN4^ROBs3; zzwBAI%AxbyosZxD*8kc1KHs`Ml!4(_xXcT7Nr4yQu_b}8rOor^OxW$gApN6Xg%Mm1 z993pWDt!{0;O)-PvgX0DJN7LM2`?RQof2WW=ary5_n2Gmy4T*3&MONP`d`=m`nPFr z-^^d9um9oMB!7Q){ORW=bI%{I*t6~9i`S{Tf`uu#=T?ZBhONakmY=0G) zW$NDTd@l53z954S(~Lj6Zp#(a?^-Jl3hQkfSR6VRGd*8a6wb_~*jws!a7K>R@?DPC|a#c*x zo=>}~WUBsge6jy`uzZUiXM=M)-&qGc=D(ofqB5U%mutWNoW%3Nm0`&>rVicuSz$so z0tak3?5q2AUg;iA2D@Q3|93<(GF zlo?`?p&&!Du7!C^)}O8Wqqna9dVSvisUge^3-((ZF|atyX%}Ev$i)X* zPRPNuKwGvtmbu|zat`12xBt|b9M<>z4q{0PW{`+j%ywXRQ!qo(I{lN)SELve=id)f z+^t!ZrzUhDjD5khbGz5GHR!TBxG{JzIk+(#Ia4p+{Qbg)y2^E#e}wM*7GZs2xzUy3 z_m!FFYya=7hU|>36{oO!<=UVsI zg`f458B%6czT;Zw%NB5t*{GpgnfXO9*Y3eMRwt*{#;By;Lh+P>~HKvhK(!-CVYLG9AuyMWxeRHc&En2&;D|s zx$Gps!0=CjX_X*D`uy9Lj0L~v#&4)?TYEggKw^#fYhjgZmkO`5FpDq0%y99k9mDI_ z_GS7X|DD>x$9tju&(C^EDNX|u^$*?(_f$W-zpdZ&z5iD77S-jC_bkmm688G}XO17c zi%c{{54unDIHYiNp|kwINXbuodVko;mhv(%)C(|f{X6G;-MUh?|IhRH7Oh(m&&PP+ z`b42d_V@O8CP>?z-ge#sl)tadH`I7--B=`7c|v3 zsHFb$VPV)Be3soxE!)AsqyFzr>!@dU;dh0m56YW{iRrE zw`6n4(rFuH4*hxkF;gkw#QXa*LK!3({v3B_>G@b(cF%SCHopV&_p&h__&0UE{oTps z8?rb+YajOidbN7;%MEt?WuN7k{?8R;@V-~`R(_xSWV4N-^{3nCg#A?i;J^Cso>ZZR zZ9MnxS3K_3nXbZcH#%=7!;7N2tksMq3xnf}{;WwzRAMYj(ed6}zwF~qj)q(B{onjH z-^RhvP(Oho_P59%ePsr(tDxcCCx#Eem9Ml5SHqOY#f|#&d*VE*J^0GA1kH7gC1xc} z@M5?U_4T{0^7{G@#yg&`Rbj|^yET}hhQaoUlu@a&8PkII-du&MbH%Kbz^o*3+VOyq`*0>Kj(>2_mZO}h4V zp^Wx*>z<#h_o(+|+VJ}0)w+74b%qg43S|xK;c8dD-P3 zCnaCJUcvCMuI*g^`+qzC7T0q&>fPfnPy`ouz01~JEUJN3N{4AZWJPGA2s!ms+o^TVQ! z8-(u3i)VcN%jm3dTlMnu*YUgNHq`sn-~W-xS7OUp=bIaT_vhwo+he~wO{p*5f9Id_ zm8tSeelt{^eBGau#}>{E4x|Zo{nF>{rXTpD27{QzJO7^3Kl8Vi_oclA zk6FZNPIv#dT;zMb!D_gBAi}l5s_AlrCto^yGq}qX(Rr2qG#fmTN z_ucsx!?bJ)m&5fg22~FRChcGSlJ$SxJEy!fX3U8HzwdVKK{KZeQ?i@5$V14hozMw@>Y6xezkPKkUVHmWH+U z_uuaOXdG~vh2i}9!qq2_zotX$ud_Ns&0~I51{H_r*DvKhfAVen)5+5>ZG6A0 z-s9r#NssHhr@rjoyZ_~{jV#VDfA&lM7f@ng_?PIc#+bv>zVne%}b(+yR|36q)xS2G1L?Qjag!t2Ai4*gyNXkfk}lu4tZq@xQ8IMus2ly^Sm!o{R>KwUd7@Vw}NX zQS+nV#CPTt1|GI(872ic_PeeOPnhc0I?HoCDCMik>Z=stG-wcEkY^0o&9PuLn{%fW z!`ATk*-!r&|JdF*{en^z&y1)4W^^&!IwtSTFyqiq-^$-+pb)5E7ZSr`u>PWb2;2H= zKT>A1ypsC!{7!t_Y+KbL<>x<*?#+(_RWLUqJQ#!-6N)Eslu3?RMrYdrxo`%dHjFB=GMc1do>wig&7$BZ!nz5uzX%s zmI31fCB~Y+Gj`nDU%y|4VbL@20OMRHfneqX><@}cpA|FgVOg;0LVZHu+@Jdn)MuzP z{5l*_{qFbV-~XNp*d+7)Pj_%pxS=}vxpvBv*Z<$<*YEzCU-MWx@Z8^=zdtM9e%#Hl zNAH%nH$%%8`GxCjYGUqX@-j5k-?-t?&|m-O@!E1%hBeXK*Hu1fWS^t`ciRb2Z%|s4 zQDFBbso2GpvXdwcD-{ zFaG!UzJH6hm1{C{eBhT>=KQd{{?~HYN~+aiYqLPh_dp9Pb7ENP9dgzch|%Q1^5jkXZTfF#_umgW;@?yvc}_lx#b80A|U+(g+ zK2Nvt%D-)*j^}EpU#bW)>c8dlRia{kJCl4GV#2o*Yr#F-+wK9;vD~ZcJ<#GAIn`q4T)nuOg;zem$Mvbts$e)Ws@pxK7{KW0n^%4(Tjg4^rQ z7p%RrT(l;u{N$gD-~WoAm$}YV_p+qNgK3uX^wambUped5+gGT@d;k9#7b0&H;Gzu^TfCfq*t1~1Wo}K$vkzx0?zCAGq{S`H)G5Rna*Jk)*%;@mhqc||T z`on{RCm$YekN&=r;YWR!&9qYw-!Hy9jcG&S<71WwwB~X!#6PqPceIygOkn=JQj>w_ z*HUA~0}XM)3_>q9zfS%Vec)81l8gbnSKJpUd6nJ2e#x5z z`Sanc?L`@EzTHR`{KfCAb)bN=K>;+E<0#Cq(dyN@ZvqXm(eD5LR@=>~R}HpMW)PEk zb6tgj?%vf#WeDhyvv*~?FM{ZVs~VOdRG zu%H9yC)Er7noJ%J^QXwi)qcHta_@SXjJe-l&WO9Z-IBTP-@DIs8TDa&6R#&S9Z+F@ z5&gAamnq|PEr0HNt2_2(f3~iVude^sc5D8gCE#Eb^ke{KMxJSo3|A%ua5LUeO<@Rj z{?V+=5T@`$-<82&N4n4f7lsRVbEiu&8e9tnEgJ}6I+ z!-9`OAJnI7|Cw_=zu3;7`Nxfavm72wVVHho{+9sB1D77`$e#O4=<)j6zq3Bqn{WBI z6kOAGdog`+WypXG!n-qE(PMhCnsI_RXnNqmR6!QT342rv&bu^pf+~5Bbr%gDgx1S* z3V1X8xWwqA{l$#QQT*#?K@K%0hqiyOIT{p&81|Jk1V|p3RaCWg^rd0v8{3r^5E=KF96Cd$J`mNTyuQ>ZH5%X){-Z_41xXn9&Q3G4pVbia5aQ66bRaw zE{e?Bo%z(PjbVb~pDNY+At%nWJ@6I%doz}$NuRZ$!9MrtzX?GM721~>bJnN2FkENg z;PmvLx_I^4;Q7}7Ze4$$^pEY1eKae>1Nm(yR2<}4928!dyV)G5PcVqkXK~0qX?#;I zn0djpzCCOm%RW}7vP@(On99J>$uPmFL9c0fn2EQz7K0wsfiRW}VMqMiUN0B<_<85c zTkDh>SbjyaHhfPNJRlxlQy9iF;hV23L;c3;S8YlSRsVck8Ge3u7Gs>k0@`Uk<-0y- z!>yo#t);J=*T-}3xUR=mAMyKV*7x(O3m~e|v4su1W8;4!P%k`tB^m{^xh15`zzDKlO!r7Ki%}U#+zI%JE&k z?EfJa2A*vNfegxu3~Hdt{6?2DLyajzh3jO-eKAkJY@NP}F+o*en!^V#Rfe=c2FZ7q zGM4}RUfC(dkgUew^YH(rSeAy&)_7qCmQDG)-7cOo&Q~v z>A

1IJ_M%g3|UWi3Bn-{JFq;o3j71%eE_Ud#t4t_T+Xxy2QQ{%WB1pLQdQgag+B z6@yD`pz=;yoN>ac&2qua3hJx}*adPQ^LH`4n8@&BbN`!JmA&8A)$n0)tfOXY=2ezcGcgV-__&y*ZnlC`xf(h62k{k!7YLe ziiuZ!7z!r(|Es&L#Ne~~kCE(wFct%I9h+}Iy_lo!|9vTWeO>JBU205i0%7l^>)(F6 z^gf>x)cL*P)yee2o9%)StHH-5Yz#dI5;o-ZHn?-{+$518D#RGz#8$t-g_mJ97XwGb zISz)uKQFTcS3~E1O1R0jq)W2QU)L>5W>j7c%f3H z;pN|jQ|pVA7`(1Ctl0ZXem2tq2BkKJ3k(14(wP5JMxOD29^?L!@O%4Jz%xD$zDy0z z&%1muJgLsfAp7dPCZky?gFNE{<_EQ+cf0rQ?_@|2I^fFi#HPOf>`&>ci;liZYa%x< zi`-jf>hwR+gH=L+@x#Ubx-0De)EPj1xrZDL0Skn|$xgwH>AaY^>6GSrCv^;P_)#?;VnIOF>2e@0Rc^WS$dOkio~V<=e4u;kU6 z(;N)Jv-;H-Bpzhfe>ksq{vv2e%l+6jGS?$^rZF85VO?;4_Lb-Flm6}Mo73?!zxp2& zC|`aEWT+Kjur7P^q47Vb2ZIEU85fg+>hb+8Tn?Q|4TgdY%cNLquQR-m`orJE;^Coa zS@I&ln`H-w-0kO^^MekQ{uf)*<;ZR%8JFrAOSUw0Gduu~Wz=N| z9tfFRD#@6zirFD|--h~lD~Ha|w?f+YRm1+pemlJu5hl63|>9Y_2{<(EMZWmj_G)`v5fcY#ZJQX=T z8CQJ$sW&z0!LOQnA;yGaCB~Z7|JG$N_%i(X^was4k1NAWmJ7d2)zR%^rh0MCgvo46zTNqFlcPc4z*1!fi9e?~7$);9$iHeI#;Op^ZnwMs{`L1& zHA|n{m)ER(%&*JD@qs`3B&c2mwTb6EkOLRizFZD{eUqw_w=}`l~WnsEM{|vcV$WDWQgCf*E6kNzl~voD?^JAgXUvz zRR$kZhKjH8s~BdaFvKSQSCc#tW%Z#}l;_QEg+$JsduM%)->k53-!^@4)L-(1HrE6h zFKpL8eg7>-!b_z@9zFra3;tXUZ~rR(v{z&Fy3U}n_g4HWH3uHX1JROs`PH`DAHDNr zG`Pw!A;lqstKQ+&kEEy1oU#~ZD8XAV4jPUV7cs}Ls=t4Iz3skRpW~BiBp;WHF|sf+ zFf$rxFfq9PPcXQVB*y0!~^6&tA*cpfW*)F~N)7 z;OXDlpfvPh=ilG^>fU}ly5`h(!+O?Z_a`v_IqbmX;{aYZI-SMg?44J3@9&3#4r!_c z4_wyP+hs3XApp+NJ`A^6HkHoU+sj~ZlEF);;r!H0Wd}jttnr~#K5G` z%iq}V}TL143VFt`@n$^0Vg|3VgrQ$Kdh2d_o(Hd0*1){r?hei`!;F~%=14_r3A25BVh zVwkhE^iA@7`)|KCCf5I~?YG}L_s%jVh7bJFD^(6SC^PIi!pg(e%sY+Yg%r=%+WNhR zd{h`*nG~23B3Kw!GZ=6tbTM#Lp8vg$^}(+F>p2$mGZ;L*oNdmSBFwnp?h=Lt-3+rX zv8galu(At&=nyQ@_*N#Em!Xeo0!stvY>|};3pke?*AkVf{c_Qm$)SD{!?x`5&=P(1 z`FqRO)tu|9oBz1KG?;}U?0;eh(~Id0H#Q_TYyY`Fi;Y1EwDxg@NQ2=Oh6f@IQl<M?B~Z`W$935koc2Ta5j(W z#4e5nWxW4tkLS8F1RqcLg06?QVsdDz59Vc<`F{OD``tF~*BLzOuXd(`YWxeSjtAzP zXq@w0UvTDx>i>Gj=3m_B11e_POd1N97BsOp|K(i5m}qb#fTKY|_LJ0tbdT@Xwa?69 zVi0X$oWRf;%1~rKf9G4xC7@k|@ezCV@5F_Fzkcpg{lep=E{^Yhsd{3b+NJkao2G##HWeDh#{X{>QHQvphzbZO8MTi|qG`pY8Adn7-w_AVb98_C|&o z>fogV1`$bI2fR-I?Y}gWo$*4nh{H;b2F2(9+65TQ)P)XgU-d33w_lMV=iMuB6^C~} zVvL%W?P5}6a%lhW&2)16tM^@O6IdMHo!UKxQ6~6BefYyq3s--ySLXk24z9)yviUN& z^vbd|A7pc8(DAafulC|)h*aSbWH_wAl<_W=r6Gi&qnAPAb^0xlfB9alE3Urto_KQa zzO|e7Ycn}47ike-`1D)%`1@ksGqnz~amT|y?70ofV7!tn9vqj6XeyIPG|9_)ClfubF&}1s;K$hB!9mQ|!Kh&``JW*6>Sk2a8 zcwC0XA-|=e2h{2O^!MR+OVi`~OR741V?5RdKGbH4*d2SyK&arFQP0ln(~TMzx-zJq znEsMsn^J?BC_|;rG=>hwDN9S=dAIMKE*F0?rfOFGWG5$|i7xj)AGNDLo+)fB3aYSf z6fq^7{rx}qb*v!6`^x(3^UbE`THStmzUDP2X!IdRMw4Nu)vMa4;gD5fr#}?TK363U z$_!83876GzN$BEo5TAd3P89RD^Uno17;Yjg8Rqp^J|Mv zyQ`bl9*+P2K6lB%lgI1lIQ&cD`ldeZ?={9Bi3SnxkF9=EEAsJm6T^f+hCQhTFD^y8 zvmCHcVkin>_@&1*!)l+RE5iw!Us8e$c1#ZKzg{nDTvi+-$goR~L0DRSPJz?woh%OG zs~@YbemT8n-<;pCzlqGOKXR+}Z`KOQ8y-!j+1E@~hp#{O%AO~!lj+CBsq#u6;^#6f zsOBh;cLAR~cVmGv!!HIK)my174Qh-v4+7j6UR-r>Vc^kcQV3yPP+|_O^8R{$2Fv6c>i(`Z7<3l8r@i#!L1;`{8xxemFyYz+{F=3>?0h z9=&Tm#M*!Vnfn*il&oV);QF^)g+Yz+UIRzN!31tchAC0DYXgNH+!Q^xE%xCfF zWO(5{$!IH^qXy%JbU_ED=p7si6B(9qG(@>F)F%GlSHcj?!aTWV*I8GFABT4Dj+5+X zeYf>k_^W@4*C(hra2ZZEY7?s0l(hVO9Mp<8n9<7eqJyF0*(>2B4h9#d0|^@ng&A0! zR$Q2MXVd=l%Yw!0xAO1Zs|`v-cik9xR9o!B_Fa0yvLM$_VOQC1okJ%;LuMy-?pyOs zKlT*!F7QGFABGPVk}pnw%ufHHpUTiK^DCa~&$4gl_wJweb#hSs7uoOiTlp>T?7#45 zt1AP@-+zS|1P|QzU;!PTmBGQlb|SefYNN_^qoA5UOD6ke{XL=FKd0D^k7llq4?aj7sH#s`;9 z$Q_>M@b93z`sTGIY79B`G1HV79GKpm>H}p{D<*}qr+ZU)x&F=b;Pi@)YI^y5sp=c2 zxxYO>c}od>q?LYQoCPRVij~{mSI+r7gMfaco-hb#nzl;R~69e03K?eUfuUi-#xEOfYq)izG zq7&A$2;48b%RPDazCTq()#s*#|CYBbcsWOy(INLw`~JM;_I4|ISsdzH8rCr$Fls1j zop340>)C_j+fM%yRueiT8k)x6EGJRLoau}+PpsO!;HmL&^!zOC)IS7B0U zVK^aMpI5DWsIi;jUiJIE4F3&g^s@Z;CJQct&!h#h8L-`X!t~*?-k%`u4>yx*+YCC_Bw!Jn!^_b6$y}{d7MQp)?ciXT+%nfw>^w`s zNzN^=YULRnTDYEnoovkLaPGJ-gYUA7CrYI5O`phAqAxD^02J*Xwq~3@5G(h2>uiQJ zjvwoniV3V%zP~lf@yrizSB8?M+b$gatzLf{lGGJt0pCNK%?w0(MKce;c9Qdt%T zB?hNZhFwAPHfRQT2q{cs_|Uq0cFMaV4hFxq3Q7$J{%Mxy&(EoUIPcoe9lQ$+ITgMy z73NgvWVrQAh(Ysna1+CWtN#U7Zr|6%I8DlV`s4M2j2F~@te=?YpvmBUUtWO0U`8)P z{g3DR{8JemK>elYn=B6Vqdgfso{M@fVbFcaaDmVZU}-55@ANVDzOGxg!S zZP$yATAQ;bM7o@tUKX9ru!O-R)?C4qb-}eiElU_?eEJ)F_(OKXB`{k z#!#}+=zgi7!;}Aq6XscgR-qnD*kHnRVB4;p^&GAYoeUH7xS2n#TKsL2D+A+?%N`9= zI2vR;_r(Y~?Bf6P*;44itV4HwE8nU$L~rIu;B$Dqi}8u3D?|4A{`Ggmm>niF?bQCf z)2Lx*P(y9c{uCC6&J!JTzI9z^`_X=|M#X`hh2gF@!7{LKdw_Rdq$FcieWV_?*4}TQ);-y}^x$AcmsSElcgH)$R^{7_qQf@}Zz+W-4`e*WZM4jLJl$JrqN&R(sHVZlb-uG-&6 z-<#_HdvQEYs6p^;dEN8!XB-Xp|Gm9GZ!2dL!(`v<7WEGILkjwD)%<<>ccmDEAmgWh zD>WGwes*S<82%>p#y-z${rxvn{+HD6Dtq@nInTOx;WED3bFWG}W&Tfi&L27VeC@tl z;A-TsIzxz5!&UK%^ZuN(->!0i`~UOPEML@5MSs};uE%&*{NJnbbJzYmy&_tTY1t75 z9=6xB7&z8etmCY2xS|xb((3Kbw=&aWb=qZE4k&~&WYzC05@kusVwe%OF?C0^*FJTT*DVuOa`9+n)n0)6K{zA6ng8D{+1G$Z}>`}+O&-ukbJx*AjS z@#xu0|7+KN&%Iyq?&q_O^;Oe68aOQ(>+czH9{4tU|IgWPmDhvL!4Vc@2w`jH)nIjK zmh@wMP;tJpRKoZjVhd1 zl;w9bBnWA=FiiMAeS=f?v`ih@j}xQ=1C*2+ze5Y`&)@>Phv9<5y=Qt%4Gn)er`I3m z`nR(8oTL!rhpqKByDFc&OrN#B=JQF;$qb;Ko

Yrpg`Oi*E{=U|XnlUyvy_~k0Y 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 delta 78726 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℞FsZ@>Tiip>8@FICNo6t}vyuIEU2Tc&x~<3QwT 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 { - Enemy enemy = Vars.control.enemyGroup.getByID(spawn.id); - if(enemy != null) enemy.onDeath(); + Gdx.app.postRunnable(() -> { + Enemy enemy = Vars.control.enemyGroup.getByID(spawn.id); + if (enemy != null) enemy.onDeath(); + }); }); Net.handle(PathPacket.class, packet -> { @@ -170,6 +176,24 @@ public class NetClient extends Module { Entity owner = Vars.control.enemyGroup.getByID(packet.owner); Bullet bullet = 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.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.entity != null){ + tile.entity.health = packet.health; + } + }); + + Net.handle(BlockSyncPacket.class, packet -> { + //TODO implementation, load data... + }); } public void update(){ diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index 6b1b87e349..f1dac847e4 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -2,11 +2,13 @@ package io.anuke.mindustry.core; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.utils.IntArray; import com.badlogic.gdx.utils.IntMap; import io.anuke.mindustry.Vars; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.entities.BulletType; import io.anuke.mindustry.entities.Player; +import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.enemies.Enemy; import io.anuke.mindustry.io.NetworkIO; import io.anuke.mindustry.net.Net; @@ -22,10 +24,12 @@ import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Timers; import io.anuke.ucore.entities.Entity; import io.anuke.ucore.modules.Module; +import io.anuke.ucore.util.Mathf; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; +import java.io.IOException; import java.util.Arrays; public class NetServer extends Module{ @@ -66,7 +70,6 @@ public class NetServer extends Module{ UCore.log("Sending entities: " + Arrays.toString(dp.players)); //TODO send pathfind positions - //TODO new denser format //TODO save enemy nodes Net.sendTo(packet.id, dp, SendMode.tcp); @@ -166,6 +169,19 @@ public class NetServer extends Module{ Net.send(packet, SendMode.tcp); } + public void handleBlockDestroyed(TileEntity entity){ + BlockDestroyPacket packet = new BlockDestroyPacket(); + packet.position = entity.tile.packedPosition(); + Net.send(packet, SendMode.tcp); + } + + public void handleBlockDamaged(TileEntity entity){ + BlockUpdatePacket packet = new BlockUpdatePacket(); + packet.health = entity.health; + packet.position = entity.tile.packedPosition(); + Net.send(packet, SendMode.udp); + } + public void update(){ if(!Net.server()) return; @@ -220,18 +236,59 @@ public class NetServer extends Module{ if(Timers.get("serverBlockSync", blockSyncTime)){ BlockSyncPacket packet = new BlockSyncPacket(); - //TODO + IntArray connections = Net.getConnections(); + + for(int i = 0; i < connections.size; i ++){ + int id = connections.get(i); + Player player = this.connections.get(i); + int x = Mathf.scl2(player.x, Vars.tilesize); + int y = Mathf.scl2(player.y, Vars.tilesize); + } + + //TODO sync to each player entity } } - public void sendBlockSync(int client){ + public void sendBlockSync(int client, int x, int y, int viewx, int viewy){ BlockSyncPacket packet = new BlockSyncPacket(); - ByteArrayOutputStream bs = new ByteArrayOutputStream(); - DataOutputStream stream = new DataOutputStream(bs); - //TODO + try { + DataOutputStream stream = new DataOutputStream(bs); + + for (int rx = -viewx / 2; rx <= viewx / 2; rx++) { + for (int ry = -viewy / 2; ry <= viewy / 2; ry++) { + Tile tile = Vars.world.tile(x + rx, y + ry); + + if (tile == null || tile.entity == null) continue; + + stream.writeInt(tile.packedPosition()); + byte times = 0; + + for(; times < tile.entity.timer.getTimes().length; times ++){ + if(tile.entity.timer.getTimes()[times] > 0){ + break; + } + } + + stream.writeByte(times); + + for(int i = 0; i < times; i ++){ + stream.writeFloat(tile.entity.timer.getTimes()[times]); + } + + tile.entity.write(stream); + } + } + + }catch (IOException e){ + throw new RuntimeException(e); + } + + //TODO finish packet.stream = new ByteArrayInputStream(bs.toByteArray()); + + Net.sendStream(client, packet); } } diff --git a/core/src/io/anuke/mindustry/entities/Player.java b/core/src/io/anuke/mindustry/entities/Player.java index 8851e703e0..b4cba08ad4 100644 --- a/core/src/io/anuke/mindustry/entities/Player.java +++ b/core/src/io/anuke/mindustry/entities/Player.java @@ -79,20 +79,22 @@ public class Player extends DestructibleEntity implements Syncable{ @Override public void draw(){ - if(Vars.debug && (!Vars.showPlayer || !Vars.showUI)) return; + if((Vars.debug && (!Vars.showPlayer || !Vars.showUI)) || (Vars.android && isLocal)) return; + + String part = Vars.android ? "ship" : "mech"; if(Vars.snapCamera && Settings.getBool("smoothcam") && Settings.getBool("pixelate")){ - Draw.rect("mech-"+mech.name(), (int)x, (int)y, angle-90); + Draw.rect(part+"-"+mech.name(), (int)x, (int)y, angle-90); }else{ - Draw.rect("mech-"+mech.name(), x, y, angle-90); + Draw.rect(part+"-"+mech.name(), x, y, angle-90); } } @Override public void update(){ - if(!isLocal){ - if(!isDead()) inter.update(this); + if(!isLocal || android){ + if(!isDead() && !isLocal) inter.update(this); return; } diff --git a/core/src/io/anuke/mindustry/entities/TileEntity.java b/core/src/io/anuke/mindustry/entities/TileEntity.java index 071134313a..21ea1d52b1 100644 --- a/core/src/io/anuke/mindustry/entities/TileEntity.java +++ b/core/src/io/anuke/mindustry/entities/TileEntity.java @@ -1,12 +1,9 @@ package io.anuke.mindustry.entities; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; - import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.enemies.Enemy; import io.anuke.mindustry.graphics.Fx; +import io.anuke.mindustry.net.Net; import io.anuke.mindustry.resource.Item; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; @@ -18,6 +15,10 @@ import io.anuke.ucore.entities.Entity; import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Timer; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + public class TileEntity extends Entity{ public Tile tile; public int[] items = new int[Item.getAllItems().size]; @@ -54,19 +55,28 @@ public class TileEntity extends Entity{ } public void onDeath(){ - - if(tile.block() == ProductionBlocks.core){ - Vars.control.coreDestroyed(); + onDeath(false); + } + + public void onDeath(boolean force){ + if(Net.active() && Net.server()){ + Vars.netServer.handleBlockDestroyed(this); } - if(!dead) { - dead = true; - Block block = tile.block(); + if(!Net.active() || Net.server() || force){ + if(tile.block() == ProductionBlocks.core){ + Vars.control.coreDestroyed(); + } - block.onDestroyed(tile); + if(!dead) { + dead = true; + Block block = tile.block(); - Vars.world.removeBlock(tile); - remove(); + block.onDestroyed(tile); + + Vars.world.removeBlock(tile); + remove(); + } } } @@ -80,6 +90,10 @@ public class TileEntity extends Entity{ int amount = tile.block().handleDamage(tile, damage); health -= amount; if(health <= 0) onDeath(); + + if(Net.active() && Net.server()){ + Vars.netServer.handleBlockDamaged(this); + } } public boolean collide(Bullet other){ diff --git a/core/src/io/anuke/mindustry/input/GestureHandler.java b/core/src/io/anuke/mindustry/input/GestureHandler.java index 57eea040fb..94bc361802 100644 --- a/core/src/io/anuke/mindustry/input/GestureHandler.java +++ b/core/src/io/anuke/mindustry/input/GestureHandler.java @@ -1,15 +1,15 @@ package io.anuke.mindustry.input; -import static io.anuke.mindustry.Vars.*; - import com.badlogic.gdx.Gdx; import com.badlogic.gdx.input.GestureDetector.GestureAdapter; import com.badlogic.gdx.math.Vector2; - import io.anuke.mindustry.Vars; import io.anuke.ucore.core.Core; import io.anuke.ucore.core.Inputs; import io.anuke.ucore.scene.ui.layout.Unit; +import io.anuke.ucore.util.Mathf; + +import static io.anuke.mindustry.Vars.*; public class GestureHandler extends GestureAdapter{ AndroidInput input; @@ -49,8 +49,10 @@ public class GestureHandler extends GestureAdapter{ if(!Vars.control.showCursor() && !(player.recipe != null && Vars.control.hasItems(player.recipe.requirements) && player.placeMode.lockCamera) && !(player.recipe == null && player.breakMode.lockCamera)){ - player.x -= deltaX*Core.camera.zoom/Core.cameraScale; - player.y += deltaY*Core.camera.zoom/Core.cameraScale; + float dx = deltaX*Core.camera.zoom/Core.cameraScale, dy = deltaY*Core.camera.zoom/Core.cameraScale; + player.x -= dx; + player.y += dy; + player.angle = Mathf.lerpAngDelta(player.angle, Mathf.atan2(dx, dy), 0.5f); }else if(player.placeMode.lockCamera && (player.placeMode.pan && player.recipe != null)){ input.mousex += deltaX; input.mousey += deltaY; diff --git a/core/src/io/anuke/mindustry/net/Net.java b/core/src/io/anuke/mindustry/net/Net.java index af0d55c8c2..7c79dfe6cd 100644 --- a/core/src/io/anuke/mindustry/net/Net.java +++ b/core/src/io/anuke/mindustry/net/Net.java @@ -1,6 +1,7 @@ package io.anuke.mindustry.net; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.utils.IntArray; import com.badlogic.gdx.utils.IntMap; import com.badlogic.gdx.utils.ObjectMap; import io.anuke.mindustry.net.Streamable.StreamBegin; @@ -48,6 +49,11 @@ public class Net{ server = false; active = false; } + + /**Returns a list of all connections IDs.*/ + public static IntArray getConnections(){ + return serverProvider.getConnections(); + } /**Send an object to all connected clients, or to the server if this is a client.*/ public static void send(Object object, SendMode mode){ @@ -182,6 +188,8 @@ public class Net{ public void sendExcept(int id, Object object, SendMode mode); /**Close the server connection.*/ public void close(); + /**Return all connected users.*/ + public IntArray getConnections(); /**Register classes to be sent.*/ public void register(Class... types); } diff --git a/core/src/io/anuke/mindustry/net/Packets.java b/core/src/io/anuke/mindustry/net/Packets.java index c0c9305976..13fc79d516 100644 --- a/core/src/io/anuke/mindustry/net/Packets.java +++ b/core/src/io/anuke/mindustry/net/Packets.java @@ -96,6 +96,6 @@ public class Packets { } public static class BlockUpdatePacket{ - public int health; + public int health, position; } } diff --git a/core/src/io/anuke/mindustry/net/Registrator.java b/core/src/io/anuke/mindustry/net/Registrator.java index 96cc6219d2..a9f733317c 100644 --- a/core/src/io/anuke/mindustry/net/Registrator.java +++ b/core/src/io/anuke/mindustry/net/Registrator.java @@ -29,6 +29,8 @@ public class Registrator { PathPacket.class, BulletPacket.class, EnemyDeathPacket.class, + BlockUpdatePacket.class, + BlockDestroyPacket.class, Class.class, byte[].class, diff --git a/core/src/io/anuke/mindustry/net/Syncable.java b/core/src/io/anuke/mindustry/net/Syncable.java index 225c78d46d..6e31f342c3 100644 --- a/core/src/io/anuke/mindustry/net/Syncable.java +++ b/core/src/io/anuke/mindustry/net/Syncable.java @@ -1,9 +1,14 @@ package io.anuke.mindustry.net; import com.badlogic.gdx.math.Vector2; +import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.enemies.Enemy; +import io.anuke.mindustry.graphics.Fx; +import io.anuke.ucore.core.Effects; +import io.anuke.ucore.core.Timers; import io.anuke.ucore.entities.Entity; +import io.anuke.ucore.util.Angles; import io.anuke.ucore.util.Mathf; //TODO clean up this giant mess @@ -36,6 +41,11 @@ public interface Syncable { entity.set(i.target.x, i.target.y); } + if(Vars.android && i.target.dst(entity.x, entity.y) > 2f && Timers.get(entity, "dashfx", 3)){ + Angles.translation(entity.angle + 180, 3f); + Effects.effect(Fx.dashsmoke, entity.x + Angles.x(), entity.y + Angles.y()); + } + entity.x = Mathf.lerpDelta(entity.x, i.target.x, 0.4f); entity.y = Mathf.lerpDelta(entity.y, i.target.y, 0.4f); entity.angle = Mathf.lerpAngDelta(entity.angle, i.targetrot, 0.6f); diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java index a4e9551ae6..fc0ab1c8cb 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java @@ -1,8 +1,10 @@ package io.anuke.mindustry.desktop; +import com.badlogic.gdx.Gdx; import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application; import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration; import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.IntArray; import com.esotericsoftware.kryonet.*; import com.esotericsoftware.kryonet.util.InputStreamSender; import com.esotericsoftware.minlog.Log; @@ -98,7 +100,14 @@ public class DesktopLauncher { @Override public void received (Connection connection, Object object) { if(object instanceof FrameworkMessage) return; - Net.handleClientReceived(object); + + try{ + Net.handleClientReceived(object); + }catch (Exception e){ + Gdx.app.exit(); + throw new RuntimeException(e); + } + } }); @@ -144,6 +153,7 @@ public class DesktopLauncher { Net.setServerProvider(new ServerProvider() { Server server; + IntArray connections = new IntArray(); { server = new Server(); @@ -157,6 +167,7 @@ public class DesktopLauncher { c.id = connection.getID(); c.addressTCP = connection.getRemoteAddressTCP().toString(); Net.handleServerReceived(c, c.id); + connections.add(c.id); } @Override @@ -164,18 +175,30 @@ public class DesktopLauncher { Disconnect c = new Disconnect(); c.id = connection.getID(); Net.handleServerReceived(c, c.id); + connections.removeValue(c.id); } @Override public void received (Connection connection, Object object) { if(object instanceof FrameworkMessage) return; - Net.handleServerReceived(object, connection.getID()); + + try{ + Net.handleServerReceived(object, connection.getID()); + }catch (Exception e){ + Gdx.app.exit(); + throw new RuntimeException(e); + } } }); register(Registrator.getClasses()); } + @Override + public IntArray getConnections() { + return connections; + } + @Override public void host(int port) throws IOException { server.bind(port, port); From f13dc0c49da6e2247aef12d185ea24a47cd1b36b Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 31 Dec 2017 22:18:39 -0500 Subject: [PATCH 03/12] Basic android support --- .../io/anuke/mindustry/AndroidLauncher.java | 240 +++++++++++++++++- .../sprites/mechs/ship-standard.png | Bin 0 -> 309 bytes core/src/io/anuke/mindustry/Vars.java | 2 +- .../io/anuke/mindustry/core/NetClient.java | 21 ++ .../io/anuke/mindustry/core/NetServer.java | 5 + .../mindustry/ui/fragments/MenuFragment.java | 7 +- 6 files changed, 262 insertions(+), 13 deletions(-) create mode 100644 core/assets-raw/sprites/mechs/ship-standard.png diff --git a/android/src/io/anuke/mindustry/AndroidLauncher.java b/android/src/io/anuke/mindustry/AndroidLauncher.java index 80bddad31f..87364ac67c 100644 --- a/android/src/io/anuke/mindustry/AndroidLauncher.java +++ b/android/src/io/anuke/mindustry/AndroidLauncher.java @@ -1,24 +1,39 @@ package io.anuke.mindustry; -import java.text.DateFormat; -import java.text.NumberFormat; -import java.text.SimpleDateFormat; -import java.util.Date; - -import com.badlogic.gdx.backends.android.AndroidApplication; -import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration; - -import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.telephony.TelephonyManager; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.backends.android.AndroidApplication; +import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration; +import com.badlogic.gdx.utils.IntArray; +import com.esotericsoftware.kryonet.*; +import com.esotericsoftware.kryonet.util.InputStreamSender; import io.anuke.mindustry.io.PlatformFunction; +import io.anuke.mindustry.net.Net; +import io.anuke.mindustry.net.Net.ClientProvider; +import io.anuke.mindustry.net.Net.SendMode; +import io.anuke.mindustry.net.Net.ServerProvider; +import io.anuke.mindustry.net.Packets.Connect; +import io.anuke.mindustry.net.Packets.Disconnect; +import io.anuke.mindustry.net.Registrator; +import io.anuke.mindustry.net.Streamable; +import io.anuke.mindustry.net.Streamable.StreamBegin; +import io.anuke.mindustry.net.Streamable.StreamChunk; +import io.anuke.ucore.UCore; import io.anuke.ucore.function.Callable; import io.anuke.ucore.scene.ui.TextField; import io.anuke.ucore.scene.ui.layout.Unit; +import java.io.IOException; +import java.text.DateFormat; +import java.text.NumberFormat; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; + public class AndroidLauncher extends AndroidApplication{ boolean doubleScaleTablets = true; @@ -62,6 +77,213 @@ public class AndroidLauncher extends AndroidApplication{ } config.hideStatusBar = true; + + Net.setClientProvider(new ClientProvider() { + Client client; + + { + client = new Client(); + client.start(); + client.addListener(new Listener(){ + @Override + public void connected (Connection connection) { + Connect c = new Connect(); + c.id = connection.getID(); + c.addressTCP = connection.getRemoteAddressTCP().toString(); + Net.handleClientReceived(c); + } + + @Override + public void disconnected (Connection connection) { + Disconnect c = new Disconnect(); + Net.handleClientReceived(c); + } + + @Override + public void received (Connection connection, Object object) { + if(object instanceof FrameworkMessage) return; + + try{ + Net.handleClientReceived(object); + }catch (Exception e){ + Gdx.app.exit(); + throw new RuntimeException(e); + } + + } + }); + + register(Registrator.getClasses()); + } + + @Override + public void connect(String ip, int port) throws IOException { + client.connect(5000, ip, port, port); + } + + @Override + public void disconnect() { + client.close(); + } + + @Override + public void send(Object object, SendMode mode) { + if(mode == SendMode.tcp){ + client.sendTCP(object); + }else{ + client.sendUDP(object); + } + } + + @Override + public void updatePing() { + client.updateReturnTripTime(); + } + + @Override + public int getPing() { + return client.getReturnTripTime(); + } + + @Override + public void register(Class... types) { + for(Class c : types){ + client.getKryo().register(c); + } + } + }); + + Net.setServerProvider(new ServerProvider() { + Server server; + IntArray connections = new IntArray(); + + { + server = new Server(); + Thread thread = new Thread(server, "Kryonet Server"); + thread.setDaemon(true); + thread.start(); + server.addListener(new Listener(){ + @Override + public void connected (Connection connection) { + Connect c = new Connect(); + c.id = connection.getID(); + c.addressTCP = connection.getRemoteAddressTCP().toString(); + Net.handleServerReceived(c, c.id); + connections.add(c.id); + } + + @Override + public void disconnected (Connection connection) { + Disconnect c = new Disconnect(); + c.id = connection.getID(); + Net.handleServerReceived(c, c.id); + connections.removeValue(c.id); + } + + @Override + public void received (Connection connection, Object object) { + if(object instanceof FrameworkMessage) return; + + try{ + Net.handleServerReceived(object, connection.getID()); + }catch (Exception e){ + Gdx.app.exit(); + throw new RuntimeException(e); + } + } + }); + + register(Registrator.getClasses()); + } + + @Override + public IntArray getConnections() { + return connections; + } + + @Override + public void host(int port) throws IOException { + server.bind(port, port); + } + + @Override + public void close() { + server.close(); + } + + @Override + public void sendStream(int id, Streamable stream) { + Connection connection = getByID(id); + + connection.addListener(new InputStreamSender(stream.stream, 512) { + int id; + + protected void start () { + //send an object so the receiving side knows how to handle the following chunks + StreamBegin begin = new StreamBegin(); + begin.total = stream.stream.available(); + begin.type = stream.getClass(); + connection.sendTCP(begin); + id = begin.id; + UCore.log("Sending begin packet: " + begin); + } + + protected Object next (byte[] bytes) { + StreamChunk chunk = new StreamChunk(); + chunk.id = id; + chunk.data = bytes; + UCore.log("Sending chunk of size " + chunk.data.length); + return chunk; //wrap the byte[] with an object so the receiving side knows how to handle it. + } + }); + } + + @Override + public void send(Object object, SendMode mode) { + if(mode == SendMode.tcp){ + server.sendToAllTCP(object); + }else{ + server.sendToAllUDP(object); + } + } + + @Override + public void sendTo(int id, Object object, SendMode mode) { + if(mode == SendMode.tcp){ + server.sendToTCP(id, object); + }else{ + server.sendToUDP(id, object); + } + } + + @Override + public void sendExcept(int id, Object object, SendMode mode) { + if(mode == SendMode.tcp){ + server.sendToAllExceptTCP(id, object); + }else{ + server.sendToAllExceptUDP(id, object); + } + } + + @Override + public void register(Class... types) { + for(Class c : types){ + server.getKryo().register(c); + } + } + + Connection getByID(int id){ + for(Connection con : server.getConnections()){ + if(con.getID() == id){ + return con; + } + } + + throw new RuntimeException("Unable to find connection with ID " + id + "! Current connections: " + + Arrays.toString(server.getConnections())); + } + + }); initialize(new Mindustry(), config); } diff --git a/core/assets-raw/sprites/mechs/ship-standard.png b/core/assets-raw/sprites/mechs/ship-standard.png new file mode 100644 index 0000000000000000000000000000000000000000..d0d0dd52ecc5e7a6376e32c045ba8697d60f3f4f GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0y~yVBi5^4mJh`hOp9@=L`%CY)RhkE)4%caKYZ?lNlHo zI14-?iy0WWg+Z8+Vb&Z81_lQ95>H=O_D772OjahMvJ2uE7#Ji=Tq8=H^K)}k^GX<; zi&7IyQd1PlGfOfQ+&z5*!W;R-85kJmdb&7X^Ne5r(XZecEDu)majoxRw7!HRhCuS zeuzx8xVbR-<8LS1prCBk()+1tj2m>kuS6Z)`aO6LV_KrezwZaG`Z6#uFnGH9xvX { //TODO implementation, load data... + DataInputStream stream = new DataInputStream(packet.stream); + + try{ + while(stream.available() > 0){ + int pos = stream.readInt(); + + Tile tile = Vars.world.tile(pos % Vars.world.width(), pos / Vars.world.width()); + + byte times = stream.readByte(); + + for(int i = 0; i < times; i ++){ + tile.entity.timer.getTimes()[i] = stream.readFloat(); + } + + tile.entity.read(stream); + } + }catch (IOException e){ + e.printStackTrace(); + } }); } diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index f1dac847e4..d5eb2978c3 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -33,6 +33,7 @@ import java.io.IOException; import java.util.Arrays; public class NetServer extends Module{ + /**Maps connection IDs to players.*/ IntMap connections = new IntMap<>(); float serverSyncTime = 4, itemSyncTime = 10, blockSyncTime = 120; @@ -241,8 +242,12 @@ public class NetServer extends Module{ for(int i = 0; i < connections.size; i ++){ int id = connections.get(i); Player player = this.connections.get(i); + if(player == null) continue; int x = Mathf.scl2(player.x, Vars.tilesize); int y = Mathf.scl2(player.y, Vars.tilesize); + int w = 14; + int h = 10; + sendBlockSync(id, x, y, w, h); } //TODO sync to each player entity diff --git a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java index a7aeb3706e..7abea26796 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java @@ -1,9 +1,6 @@ package io.anuke.mindustry.ui.fragments; -import static io.anuke.mindustry.Vars.*; - import com.badlogic.gdx.Gdx; - import io.anuke.mindustry.Mindustry; import io.anuke.mindustry.core.GameState; import io.anuke.mindustry.core.GameState.State; @@ -12,6 +9,8 @@ import io.anuke.mindustry.ui.PressGroup; import io.anuke.ucore.scene.builders.imagebutton; import io.anuke.ucore.scene.builders.table; +import static io.anuke.mindustry.Vars.*; + public class MenuFragment implements Fragment{ public void build(){ @@ -72,6 +71,8 @@ public class MenuFragment implements Fragment{ new imagebutton("icon-editor", isize, () -> ui.showEditor()).text("$text.editor").padTop(4f); new imagebutton("icon-tools", isize, () -> ui.showPrefs()).text("$text.settings").padTop(4f); + + new imagebutton("icon-tools", isize, () -> ui.showJoinGame()).text("$text.joingame").padTop(4f); if(Mindustry.donationsCallable != null){ new imagebutton("icon-donate", isize, () -> { From 4bf78587db6518e2f64f447494612966dd9e35a8 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 31 Dec 2017 22:29:11 -0500 Subject: [PATCH 04/12] Fixed absolutely nothing --- core/src/io/anuke/mindustry/core/NetClient.java | 2 ++ core/src/io/anuke/mindustry/core/NetServer.java | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index 769c491c9a..1c4201d983 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -52,6 +52,8 @@ public class NetClient extends Module { Vars.ui.hideLoading(); }); + GameState.set(State.menu); + Vars.ui.showError("$text.disconnect"); connecting = false; }); diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index d5eb2978c3..016618912a 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -60,8 +60,7 @@ public class NetServer extends Module{ Player player = new Player(); player.clientid = packet.id; - player.set(Vars.player.x, Vars.player.y); - player.placerot = Vars.player.placerot; + player.set(Vars.control.core.worldx(), Vars.control.core.worldy() - Vars.tilesize*2); player.add(); connections.put(packet.id, player); From c7dbdd17735382a12198254cb24b4d8d87ed43aa Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 1 Jan 2018 13:32:18 -0500 Subject: [PATCH 05/12] Modularized Kryonet handler --- .../io/anuke/mindustry/AndroidLauncher.java | 226 +---------------- build.gradle | 13 +- .../io/anuke/mindustry/core/NetClient.java | 2 +- .../mindustry/desktop/DesktopLauncher.java | 229 +----------------- kryonet/build.gradle | 4 + kryonet/src/io/anuke/kryonet/KryoClient.java | 90 +++++++ kryonet/src/io/anuke/kryonet/KryoServer.java | 153 ++++++++++++ settings.gradle | 2 +- 8 files changed, 269 insertions(+), 450 deletions(-) create mode 100644 kryonet/build.gradle create mode 100644 kryonet/src/io/anuke/kryonet/KryoClient.java create mode 100644 kryonet/src/io/anuke/kryonet/KryoServer.java diff --git a/android/src/io/anuke/mindustry/AndroidLauncher.java b/android/src/io/anuke/mindustry/AndroidLauncher.java index 87364ac67c..ebd5f40d5f 100644 --- a/android/src/io/anuke/mindustry/AndroidLauncher.java +++ b/android/src/io/anuke/mindustry/AndroidLauncher.java @@ -5,33 +5,19 @@ import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.telephony.TelephonyManager; -import com.badlogic.gdx.Gdx; import com.badlogic.gdx.backends.android.AndroidApplication; import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration; -import com.badlogic.gdx.utils.IntArray; -import com.esotericsoftware.kryonet.*; -import com.esotericsoftware.kryonet.util.InputStreamSender; +import io.anuke.kryonet.KryoClient; +import io.anuke.kryonet.KryoServer; import io.anuke.mindustry.io.PlatformFunction; import io.anuke.mindustry.net.Net; -import io.anuke.mindustry.net.Net.ClientProvider; -import io.anuke.mindustry.net.Net.SendMode; -import io.anuke.mindustry.net.Net.ServerProvider; -import io.anuke.mindustry.net.Packets.Connect; -import io.anuke.mindustry.net.Packets.Disconnect; -import io.anuke.mindustry.net.Registrator; -import io.anuke.mindustry.net.Streamable; -import io.anuke.mindustry.net.Streamable.StreamBegin; -import io.anuke.mindustry.net.Streamable.StreamChunk; -import io.anuke.ucore.UCore; import io.anuke.ucore.function.Callable; import io.anuke.ucore.scene.ui.TextField; import io.anuke.ucore.scene.ui.layout.Unit; -import java.io.IOException; import java.text.DateFormat; import java.text.NumberFormat; import java.text.SimpleDateFormat; -import java.util.Arrays; import java.util.Date; public class AndroidLauncher extends AndroidApplication{ @@ -78,212 +64,8 @@ public class AndroidLauncher extends AndroidApplication{ config.hideStatusBar = true; - Net.setClientProvider(new ClientProvider() { - Client client; - - { - client = new Client(); - client.start(); - client.addListener(new Listener(){ - @Override - public void connected (Connection connection) { - Connect c = new Connect(); - c.id = connection.getID(); - c.addressTCP = connection.getRemoteAddressTCP().toString(); - Net.handleClientReceived(c); - } - - @Override - public void disconnected (Connection connection) { - Disconnect c = new Disconnect(); - Net.handleClientReceived(c); - } - - @Override - public void received (Connection connection, Object object) { - if(object instanceof FrameworkMessage) return; - - try{ - Net.handleClientReceived(object); - }catch (Exception e){ - Gdx.app.exit(); - throw new RuntimeException(e); - } - - } - }); - - register(Registrator.getClasses()); - } - - @Override - public void connect(String ip, int port) throws IOException { - client.connect(5000, ip, port, port); - } - - @Override - public void disconnect() { - client.close(); - } - - @Override - public void send(Object object, SendMode mode) { - if(mode == SendMode.tcp){ - client.sendTCP(object); - }else{ - client.sendUDP(object); - } - } - - @Override - public void updatePing() { - client.updateReturnTripTime(); - } - - @Override - public int getPing() { - return client.getReturnTripTime(); - } - - @Override - public void register(Class... types) { - for(Class c : types){ - client.getKryo().register(c); - } - } - }); - - Net.setServerProvider(new ServerProvider() { - Server server; - IntArray connections = new IntArray(); - - { - server = new Server(); - Thread thread = new Thread(server, "Kryonet Server"); - thread.setDaemon(true); - thread.start(); - server.addListener(new Listener(){ - @Override - public void connected (Connection connection) { - Connect c = new Connect(); - c.id = connection.getID(); - c.addressTCP = connection.getRemoteAddressTCP().toString(); - Net.handleServerReceived(c, c.id); - connections.add(c.id); - } - - @Override - public void disconnected (Connection connection) { - Disconnect c = new Disconnect(); - c.id = connection.getID(); - Net.handleServerReceived(c, c.id); - connections.removeValue(c.id); - } - - @Override - public void received (Connection connection, Object object) { - if(object instanceof FrameworkMessage) return; - - try{ - Net.handleServerReceived(object, connection.getID()); - }catch (Exception e){ - Gdx.app.exit(); - throw new RuntimeException(e); - } - } - }); - - register(Registrator.getClasses()); - } - - @Override - public IntArray getConnections() { - return connections; - } - - @Override - public void host(int port) throws IOException { - server.bind(port, port); - } - - @Override - public void close() { - server.close(); - } - - @Override - public void sendStream(int id, Streamable stream) { - Connection connection = getByID(id); - - connection.addListener(new InputStreamSender(stream.stream, 512) { - int id; - - protected void start () { - //send an object so the receiving side knows how to handle the following chunks - StreamBegin begin = new StreamBegin(); - begin.total = stream.stream.available(); - begin.type = stream.getClass(); - connection.sendTCP(begin); - id = begin.id; - UCore.log("Sending begin packet: " + begin); - } - - protected Object next (byte[] bytes) { - StreamChunk chunk = new StreamChunk(); - chunk.id = id; - chunk.data = bytes; - UCore.log("Sending chunk of size " + chunk.data.length); - return chunk; //wrap the byte[] with an object so the receiving side knows how to handle it. - } - }); - } - - @Override - public void send(Object object, SendMode mode) { - if(mode == SendMode.tcp){ - server.sendToAllTCP(object); - }else{ - server.sendToAllUDP(object); - } - } - - @Override - public void sendTo(int id, Object object, SendMode mode) { - if(mode == SendMode.tcp){ - server.sendToTCP(id, object); - }else{ - server.sendToUDP(id, object); - } - } - - @Override - public void sendExcept(int id, Object object, SendMode mode) { - if(mode == SendMode.tcp){ - server.sendToAllExceptTCP(id, object); - }else{ - server.sendToAllExceptUDP(id, object); - } - } - - @Override - public void register(Class... types) { - for(Class c : types){ - server.getKryo().register(c); - } - } - - Connection getByID(int id){ - for(Connection con : server.getConnections()){ - if(con.getID() == id){ - return con; - } - } - - throw new RuntimeException("Unable to find connection with ID " + id + "! Current connections: " - + Arrays.toString(server.getConnections())); - } - - }); + Net.setClientProvider(new KryoClient()); + Net.setServerProvider(new KryoServer()); initialize(new Mindustry(), config); } diff --git a/build.gradle b/build.gradle index 9e202046e3..e737d3b7cf 100644 --- a/build.gradle +++ b/build.gradle @@ -38,10 +38,10 @@ project(":desktop") { dependencies { compile project(":core") + compile project(":kryonet") compile "com.badlogicgames.gdx:gdx-backend-lwjgl3:$gdxVersion" compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop" compile "com.badlogicgames.gdx:gdx-controllers-lwjgl3:$gdxVersion" - compile "com.esotericsoftware:kryonet:2.22.0-RC1" } } @@ -70,6 +70,7 @@ project(":android") { dependencies { compile project(":core") + compile project(":kryonet") compile "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a" @@ -78,7 +79,6 @@ project(":android") { natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86_64" compile "com.badlogicgames.gdx:gdx-ai:$aiVersion" compile "com.badlogicgames.gdx:gdx-controllers-android:$gdxVersion" - compile "com.esotericsoftware:kryonet:2.22.0-RC1" } } @@ -109,6 +109,15 @@ project(":core") { } } +project(":kryonet") { + apply plugin: "java" + + dependencies { + compile project(":core") + compile "com.esotericsoftware:kryonet:2.22.0-RC1" + } +} + tasks.eclipse.doLast { delete ".project" } diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index 1c4201d983..f037d272f9 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -75,7 +75,7 @@ public class NetClient extends Module { Net.handle(EntityDataPacket.class, data -> { Gdx.app.postRunnable(() -> { - Timers.run(10f, () -> { //TODO hack + Timers.run(10f, () -> { //TODO hack. should only run once world data is recieved Vars.control.playerGroup.remap(Vars.player, data.playerid); for (Player player : data.players) { diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java index fc0ab1c8cb..36e76539c3 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java @@ -1,27 +1,15 @@ package io.anuke.mindustry.desktop; -import com.badlogic.gdx.Gdx; import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application; import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration; import com.badlogic.gdx.utils.Array; -import com.badlogic.gdx.utils.IntArray; -import com.esotericsoftware.kryonet.*; -import com.esotericsoftware.kryonet.util.InputStreamSender; import com.esotericsoftware.minlog.Log; +import io.anuke.kryonet.KryoClient; +import io.anuke.kryonet.KryoServer; import io.anuke.mindustry.Mindustry; import io.anuke.mindustry.Vars; import io.anuke.mindustry.io.PlatformFunction; import io.anuke.mindustry.net.Net; -import io.anuke.mindustry.net.Net.ClientProvider; -import io.anuke.mindustry.net.Net.SendMode; -import io.anuke.mindustry.net.Net.ServerProvider; -import io.anuke.mindustry.net.Packets.Connect; -import io.anuke.mindustry.net.Packets.Disconnect; -import io.anuke.mindustry.net.Registrator; -import io.anuke.mindustry.net.Streamable; -import io.anuke.mindustry.net.Streamable.StreamBegin; -import io.anuke.mindustry.net.Streamable.StreamChunk; -import io.anuke.ucore.UCore; import io.anuke.ucore.scene.ui.TextField; import java.awt.*; @@ -30,7 +18,6 @@ import java.net.URI; import java.text.DateFormat; import java.text.NumberFormat; import java.text.SimpleDateFormat; -import java.util.Arrays; import java.util.Date; public class DesktopLauncher { @@ -67,221 +54,15 @@ public class DesktopLauncher { } @Override - public void addDialog(TextField field){ - - } + public void addDialog(TextField field){ } }; Mindustry.args = Array.with(arg); Log.set(Log.LEVEL_DEBUG); - Net.setClientProvider(new ClientProvider() { - Client client; - - { - client = new Client(); - client.start(); - client.addListener(new Listener(){ - @Override - public void connected (Connection connection) { - Connect c = new Connect(); - c.id = connection.getID(); - c.addressTCP = connection.getRemoteAddressTCP().toString(); - Net.handleClientReceived(c); - } - - @Override - public void disconnected (Connection connection) { - Disconnect c = new Disconnect(); - Net.handleClientReceived(c); - } - - @Override - public void received (Connection connection, Object object) { - if(object instanceof FrameworkMessage) return; - - try{ - Net.handleClientReceived(object); - }catch (Exception e){ - Gdx.app.exit(); - throw new RuntimeException(e); - } - - } - }); - - register(Registrator.getClasses()); - } - - @Override - public void connect(String ip, int port) throws IOException { - client.connect(5000, ip, port, port); - } - - @Override - public void disconnect() { - client.close(); - } - - @Override - public void send(Object object, SendMode mode) { - if(mode == SendMode.tcp){ - client.sendTCP(object); - }else{ - client.sendUDP(object); - } - } - - @Override - public void updatePing() { - client.updateReturnTripTime(); - } - - @Override - public int getPing() { - return client.getReturnTripTime(); - } - - @Override - public void register(Class... types) { - for(Class c : types){ - client.getKryo().register(c); - } - } - }); - - Net.setServerProvider(new ServerProvider() { - Server server; - IntArray connections = new IntArray(); - - { - server = new Server(); - Thread thread = new Thread(server, "Kryonet Server"); - thread.setDaemon(true); - thread.start(); - server.addListener(new Listener(){ - @Override - public void connected (Connection connection) { - Connect c = new Connect(); - c.id = connection.getID(); - c.addressTCP = connection.getRemoteAddressTCP().toString(); - Net.handleServerReceived(c, c.id); - connections.add(c.id); - } - - @Override - public void disconnected (Connection connection) { - Disconnect c = new Disconnect(); - c.id = connection.getID(); - Net.handleServerReceived(c, c.id); - connections.removeValue(c.id); - } - - @Override - public void received (Connection connection, Object object) { - if(object instanceof FrameworkMessage) return; - - try{ - Net.handleServerReceived(object, connection.getID()); - }catch (Exception e){ - Gdx.app.exit(); - throw new RuntimeException(e); - } - } - }); - - register(Registrator.getClasses()); - } - - @Override - public IntArray getConnections() { - return connections; - } - - @Override - public void host(int port) throws IOException { - server.bind(port, port); - } - - @Override - public void close() { - server.close(); - } - - @Override - public void sendStream(int id, Streamable stream) { - Connection connection = getByID(id); - - connection.addListener(new InputStreamSender(stream.stream, 512) { - int id; - - protected void start () { - //send an object so the receiving side knows how to handle the following chunks - StreamBegin begin = new StreamBegin(); - begin.total = stream.stream.available(); - begin.type = stream.getClass(); - connection.sendTCP(begin); - id = begin.id; - UCore.log("Sending begin packet: " + begin); - } - - protected Object next (byte[] bytes) { - StreamChunk chunk = new StreamChunk(); - chunk.id = id; - chunk.data = bytes; - UCore.log("Sending chunk of size " + chunk.data.length); - return chunk; //wrap the byte[] with an object so the receiving side knows how to handle it. - } - }); - } - - @Override - public void send(Object object, SendMode mode) { - if(mode == SendMode.tcp){ - server.sendToAllTCP(object); - }else{ - server.sendToAllUDP(object); - } - } - - @Override - public void sendTo(int id, Object object, SendMode mode) { - if(mode == SendMode.tcp){ - server.sendToTCP(id, object); - }else{ - server.sendToUDP(id, object); - } - } - - @Override - public void sendExcept(int id, Object object, SendMode mode) { - if(mode == SendMode.tcp){ - server.sendToAllExceptTCP(id, object); - }else{ - server.sendToAllExceptUDP(id, object); - } - } - - @Override - public void register(Class... types) { - for(Class c : types){ - server.getKryo().register(c); - } - } - - Connection getByID(int id){ - for(Connection con : server.getConnections()){ - if(con.getID() == id){ - return con; - } - } - - throw new RuntimeException("Unable to find connection with ID " + id + "! Current connections: " - + Arrays.toString(server.getConnections())); - } - - }); + Net.setClientProvider(new KryoClient()); + Net.setServerProvider(new KryoServer()); new Lwjgl3Application(new Mindustry(), config); } diff --git a/kryonet/build.gradle b/kryonet/build.gradle new file mode 100644 index 0000000000..afd5e6ab73 --- /dev/null +++ b/kryonet/build.gradle @@ -0,0 +1,4 @@ +apply plugin: "java" + +sourceCompatibility = 1.8 +sourceSets.main.java.srcDirs = [ "src/" ] diff --git a/kryonet/src/io/anuke/kryonet/KryoClient.java b/kryonet/src/io/anuke/kryonet/KryoClient.java new file mode 100644 index 0000000000..13182c7d94 --- /dev/null +++ b/kryonet/src/io/anuke/kryonet/KryoClient.java @@ -0,0 +1,90 @@ +package io.anuke.kryonet; + +import com.badlogic.gdx.Gdx; +import com.esotericsoftware.kryonet.Client; +import com.esotericsoftware.kryonet.Connection; +import com.esotericsoftware.kryonet.FrameworkMessage; +import com.esotericsoftware.kryonet.Listener; +import io.anuke.mindustry.net.Net; +import io.anuke.mindustry.net.Net.ClientProvider; +import io.anuke.mindustry.net.Net.SendMode; +import io.anuke.mindustry.net.Packets.Connect; +import io.anuke.mindustry.net.Packets.Disconnect; +import io.anuke.mindustry.net.Registrator; + +import java.io.IOException; + +public class KryoClient implements ClientProvider{ + Client client; + + public KryoClient(){ + client = new Client(); + client.start(); + client.addListener(new Listener(){ + @Override + public void connected (Connection connection) { + Connect c = new Connect(); + c.id = connection.getID(); + c.addressTCP = connection.getRemoteAddressTCP().toString(); + Net.handleClientReceived(c); + } + + @Override + public void disconnected (Connection connection) { + Disconnect c = new Disconnect(); + Net.handleClientReceived(c); + } + + @Override + public void received (Connection connection, Object object) { + if(object instanceof FrameworkMessage) return; + + try{ + Net.handleClientReceived(object); + }catch (Exception e){ + Gdx.app.exit(); + throw new RuntimeException(e); + } + + } + }); + + register(Registrator.getClasses()); + } + + @Override + public void connect(String ip, int port) throws IOException { + client.connect(5000, ip, port, port); + } + + @Override + public void disconnect() { + client.close(); + } + + @Override + public void send(Object object, SendMode mode) { + if(mode == SendMode.tcp){ + client.sendTCP(object); + }else{ + client.sendUDP(object); + } + } + + @Override + public void updatePing() { + client.updateReturnTripTime(); + } + + @Override + public int getPing() { + return client.getReturnTripTime(); + } + + @Override + public void register(Class... types) { + for(Class c : types){ + client.getKryo().register(c); + } + } +} diff --git a/kryonet/src/io/anuke/kryonet/KryoServer.java b/kryonet/src/io/anuke/kryonet/KryoServer.java new file mode 100644 index 0000000000..c3cbfc8843 --- /dev/null +++ b/kryonet/src/io/anuke/kryonet/KryoServer.java @@ -0,0 +1,153 @@ +package io.anuke.kryonet; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.utils.IntArray; +import com.esotericsoftware.kryonet.Connection; +import com.esotericsoftware.kryonet.FrameworkMessage; +import com.esotericsoftware.kryonet.Listener; +import com.esotericsoftware.kryonet.Server; +import com.esotericsoftware.kryonet.util.InputStreamSender; +import io.anuke.mindustry.net.Net; +import io.anuke.mindustry.net.Net.SendMode; +import io.anuke.mindustry.net.Net.ServerProvider; +import io.anuke.mindustry.net.Packets.Connect; +import io.anuke.mindustry.net.Packets.Disconnect; +import io.anuke.mindustry.net.Registrator; +import io.anuke.mindustry.net.Streamable; +import io.anuke.mindustry.net.Streamable.StreamBegin; +import io.anuke.mindustry.net.Streamable.StreamChunk; +import io.anuke.ucore.UCore; + +import java.io.IOException; +import java.util.Arrays; + +public class KryoServer implements ServerProvider { + Server server; + IntArray connections = new IntArray(); + + public KryoServer(){ + server = new Server(); + Thread thread = new Thread(server, "Kryonet Server"); + thread.setDaemon(true); + thread.start(); + server.addListener(new Listener(){ + @Override + public void connected (Connection connection) { + Connect c = new Connect(); + c.id = connection.getID(); + c.addressTCP = connection.getRemoteAddressTCP().toString(); + Net.handleServerReceived(c, c.id); + connections.add(c.id); + } + + @Override + public void disconnected (Connection connection) { + Disconnect c = new Disconnect(); + c.id = connection.getID(); + Net.handleServerReceived(c, c.id); + connections.removeValue(c.id); + } + + @Override + public void received (Connection connection, Object object) { + if(object instanceof FrameworkMessage) return; + + try{ + Net.handleServerReceived(object, connection.getID()); + }catch (Exception e){ + Gdx.app.exit(); + throw new RuntimeException(e); + } + } + }); + + register(Registrator.getClasses()); + } + + @Override + public IntArray getConnections() { + return connections; + } + + @Override + public void host(int port) throws IOException { + server.bind(port, port); + } + + @Override + public void close() { + server.close(); + } + + @Override + public void sendStream(int id, Streamable stream) { + Connection connection = getByID(id); + + connection.addListener(new InputStreamSender(stream.stream, 512) { + int id; + + protected void start () { + //send an object so the receiving side knows how to handle the following chunks + StreamBegin begin = new StreamBegin(); + begin.total = stream.stream.available(); + begin.type = stream.getClass(); + connection.sendTCP(begin); + id = begin.id; + UCore.log("Sending begin packet: " + begin); + } + + protected Object next (byte[] bytes) { + StreamChunk chunk = new StreamChunk(); + chunk.id = id; + chunk.data = bytes; + UCore.log("Sending chunk of size " + chunk.data.length); + return chunk; //wrap the byte[] with an object so the receiving side knows how to handle it. + } + }); + } + + @Override + public void send(Object object, SendMode mode) { + if(mode == SendMode.tcp){ + server.sendToAllTCP(object); + }else{ + server.sendToAllUDP(object); + } + } + + @Override + public void sendTo(int id, Object object, SendMode mode) { + if(mode == SendMode.tcp){ + server.sendToTCP(id, object); + }else{ + server.sendToUDP(id, object); + } + } + + @Override + public void sendExcept(int id, Object object, SendMode mode) { + if(mode == SendMode.tcp){ + server.sendToAllExceptTCP(id, object); + }else{ + server.sendToAllExceptUDP(id, object); + } + } + + @Override + public void register(Class... types) { + for(Class c : types){ + server.getKryo().register(c); + } + } + + Connection getByID(int id){ + for(Connection con : server.getConnections()){ + if(con.getID() == id){ + return con; + } + } + + throw new RuntimeException("Unable to find connection with ID " + id + "! Current connections: " + + Arrays.toString(server.getConnections())); + } +} diff --git a/settings.gradle b/settings.gradle index 58324176eb..b0219d0817 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,4 @@ -include 'desktop', 'html', 'core', 'android' +include 'desktop', 'html', 'core', 'android', 'kryonet' if(System.properties["release"] == null || System.properties["release"].equals("false")){ if (new File(settingsDir, '../uCore').exists()) { From 20eea3b3856684879d48c23b839bf5d17936305f Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 1 Jan 2018 16:09:17 -0500 Subject: [PATCH 06/12] Switched to different Kryonet fork; full Android support --- .../io/anuke/mindustry/AndroidLauncher.java | 3 + build.gradle | 2 +- .../assets-raw/sprites/ui/icons/icon-host.png | Bin 0 -> 193 bytes core/assets/bundles/bundle.properties | 3 +- core/assets/sprites/sprites.atlas | 455 +++++++++--------- core/assets/sprites/sprites.png | Bin 80835 -> 81725 bytes core/src/io/anuke/mindustry/Vars.java | 1 + core/src/io/anuke/mindustry/core/Control.java | 5 + .../io/anuke/mindustry/core/NetClient.java | 31 +- .../io/anuke/mindustry/core/NetServer.java | 54 ++- .../src/io/anuke/mindustry/core/Renderer.java | 6 +- core/src/io/anuke/mindustry/core/UI.java | 21 +- .../io/anuke/mindustry/entities/Player.java | 31 +- .../anuke/mindustry/input/GestureHandler.java | 2 +- core/src/io/anuke/mindustry/io/NetworkIO.java | 13 +- core/src/io/anuke/mindustry/io/Saves.java | 6 +- core/src/io/anuke/mindustry/net/Net.java | 2 + core/src/io/anuke/mindustry/net/Packets.java | 16 +- .../io/anuke/mindustry/net/Registrator.java | 2 + core/src/io/anuke/mindustry/net/Syncable.java | 5 +- .../src/io/anuke/mindustry/ui/MenuDialog.java | 27 +- .../mindustry/ui/fragments/HudFragment.java | 8 + .../mindustry/ui/fragments/MenuFragment.java | 2 +- .../blocks/types/distribution/Conveyor.java | 24 +- kryonet/build/libs/kryonet-release.jar | Bin 0 -> 7637 bytes kryonet/build/tmp/jar/MANIFEST.MF | 2 + kryonet/src/io/anuke/kryonet/KryoServer.java | 5 + 27 files changed, 416 insertions(+), 310 deletions(-) create mode 100644 core/assets-raw/sprites/ui/icons/icon-host.png create mode 100644 kryonet/build/libs/kryonet-release.jar create mode 100644 kryonet/build/tmp/jar/MANIFEST.MF diff --git a/android/src/io/anuke/mindustry/AndroidLauncher.java b/android/src/io/anuke/mindustry/AndroidLauncher.java index ebd5f40d5f..660caabb4e 100644 --- a/android/src/io/anuke/mindustry/AndroidLauncher.java +++ b/android/src/io/anuke/mindustry/AndroidLauncher.java @@ -7,6 +7,7 @@ import android.os.Bundle; import android.telephony.TelephonyManager; import com.badlogic.gdx.backends.android.AndroidApplication; import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration; +import com.esotericsoftware.minlog.Log; import io.anuke.kryonet.KryoClient; import io.anuke.kryonet.KryoServer; import io.anuke.mindustry.io.PlatformFunction; @@ -64,6 +65,8 @@ public class AndroidLauncher extends AndroidApplication{ config.hideStatusBar = true; + Log.set(Log.LEVEL_DEBUG); + Net.setClientProvider(new KryoClient()); Net.setServerProvider(new KryoServer()); diff --git a/build.gradle b/build.gradle index e737d3b7cf..52d19a7b29 100644 --- a/build.gradle +++ b/build.gradle @@ -114,7 +114,7 @@ project(":kryonet") { dependencies { compile project(":core") - compile "com.esotericsoftware:kryonet:2.22.0-RC1" + compile 'com.github.crykn:kryonet:2.22.1' } } diff --git a/core/assets-raw/sprites/ui/icons/icon-host.png b/core/assets-raw/sprites/ui/icons/icon-host.png new file mode 100644 index 0000000000000000000000000000000000000000..82d5d2d1530a21f310f67abe1e93c4ac8e5cd363 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0y~yVBiB`4mJh`26+$Niwq15Y)RhkE)4%caKYZ?lNlHo zI14-?iy0WWg+Z8+Vb&Z81_lQ95>H=O_D772LR!Xm=eFEoU|{g`ba4#PIDd7bCl`YP z53})w|MffPtqQoK|7gw>w#zP84&Hq&`NGph>>b02LoVqFH*NFhKKq)-JW;IQWcuAX rfnie~w?DNxks-WYQ~vK`Q&y$F(kje+d;J+07#KWV{an^LB{Ts5*cv}K literal 0 HcmV?d00001 diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 291bf3401e..229b0e804c 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -13,8 +13,9 @@ text.loadgame=Load Game text.joingame=Join Game text.quit=Quit text.server.connected=A player has joined. -text.server.disconnected=A player has disconnected. +text.server.disconnected={0} has disconnected. text.hostserver=Host Server +text.host=Host text.joingame.title=Join Game text.joingame.ip=IP: text.disconnect=Disconnected. diff --git a/core/assets/sprites/sprites.atlas b/core/assets/sprites/sprites.atlas index f1f4d17a0e..8d8c150fcc 100644 --- a/core/assets/sprites/sprites.atlas +++ b/core/assets/sprites/sprites.atlas @@ -27,49 +27,49 @@ blocks/blackrock1 index: -1 blocks/blackrockshadow1 rotate: false - xy: 315, 91 + xy: 482, 95 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/blackstone1 rotate: false - xy: 315, 81 + xy: 988, 485 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/blackstone2 rotate: false - xy: 325, 91 + xy: 998, 485 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/blackstone3 rotate: false - xy: 325, 81 + xy: 1008, 485 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/blackstoneblock1 rotate: false - xy: 335, 91 + xy: 841, 473 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/blackstoneblock2 rotate: false - xy: 335, 81 + xy: 841, 463 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/blackstoneblock3 rotate: false - xy: 345, 91 + xy: 851, 473 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -83,7 +83,7 @@ blocks/blackstoneedge index: -1 blocks/block rotate: false - xy: 355, 91 + xy: 861, 473 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -111,119 +111,119 @@ blocks/chainturret index: -1 blocks/chainturret-icon rotate: false - xy: 123, 79 + xy: 109, 35 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/coal1 rotate: false - xy: 193, 63 + xy: 871, 473 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/coal2 rotate: false - xy: 203, 63 + xy: 871, 463 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/coal3 rotate: false - xy: 213, 63 + xy: 881, 473 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/coaldrill rotate: false - xy: 223, 63 + xy: 881, 463 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/coalgenerator rotate: false - xy: 233, 63 + xy: 891, 473 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/coalgenerator-top rotate: false - xy: 243, 63 + xy: 891, 463 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/coalpurifier rotate: false - xy: 253, 63 + xy: 901, 473 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/combustiongenerator rotate: false - xy: 263, 63 + xy: 901, 463 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/compositewall rotate: false - xy: 273, 63 + xy: 911, 473 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/conduit rotate: false - xy: 283, 63 + xy: 911, 463 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/conduitbottom rotate: false - xy: 293, 63 + xy: 921, 473 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/conduitliquid rotate: false - xy: 303, 67 + xy: 921, 463 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/conduittop rotate: false - xy: 531, 136 + xy: 931, 473 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/conveyor rotate: false - xy: 527, 126 + xy: 931, 463 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/conveyormove rotate: false - xy: 365, 95 + xy: 941, 473 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/conveyortunnel rotate: false - xy: 365, 85 + xy: 941, 463 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -237,42 +237,42 @@ blocks/core index: -1 blocks/cross rotate: false - xy: 375, 95 + xy: 951, 473 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/crucible rotate: false - xy: 375, 85 + xy: 951, 463 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/deepwater rotate: false - xy: 385, 95 + xy: 961, 473 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/dirt1 rotate: false - xy: 385, 85 + xy: 961, 463 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/dirt2 rotate: false - xy: 395, 95 + xy: 971, 473 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/dirt3 rotate: false - xy: 395, 85 + xy: 971, 463 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -286,7 +286,7 @@ blocks/dirtedge index: -1 blocks/door rotate: false - xy: 405, 95 + xy: 851, 453 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -300,7 +300,7 @@ blocks/door-large index: -1 blocks/door-large-icon rotate: false - xy: 405, 85 + xy: 861, 453 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -314,21 +314,21 @@ blocks/door-large-open index: -1 blocks/door-open rotate: false - xy: 415, 95 + xy: 871, 453 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/doubleturret rotate: false - xy: 123, 67 + xy: 95, 7 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/duriumwall rotate: false - xy: 415, 85 + xy: 881, 453 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -342,266 +342,266 @@ blocks/duriumwall-large index: -1 blocks/duriumwall-large-icon rotate: false - xy: 425, 95 + xy: 891, 453 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/enemyspawn rotate: false - xy: 425, 85 + xy: 901, 453 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/flameturret rotate: false - xy: 135, 79 + xy: 536, 181 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/fluxpump rotate: false - xy: 435, 85 + xy: 921, 453 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/grass1 rotate: false - xy: 445, 95 + xy: 931, 453 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/grass2 rotate: false - xy: 445, 85 + xy: 941, 453 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/grass3 rotate: false - xy: 455, 95 + xy: 951, 453 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/grassblock1 rotate: false - xy: 455, 85 + xy: 961, 453 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/grassblock2 rotate: false - xy: 465, 95 + xy: 971, 453 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/grassedge rotate: false - xy: 136, 91 + xy: 152, 91 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 blocks/ice1 rotate: false - xy: 465, 85 + xy: 981, 473 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/ice2 rotate: false - xy: 475, 95 + xy: 981, 463 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/ice3 rotate: false - xy: 475, 85 + xy: 981, 453 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/iceedge rotate: false - xy: 150, 91 + xy: 166, 91 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 blocks/icerock1 rotate: false - xy: 524, 107 + xy: 991, 475 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/icerock2 rotate: false - xy: 786, 393 + xy: 991, 465 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/icerockshadow1 rotate: false - xy: 796, 393 + xy: 1001, 475 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/rockshadow1 rotate: false - xy: 796, 393 + xy: 1001, 475 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/icerockshadow2 rotate: false - xy: 844, 485 + xy: 991, 455 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/rockshadow2 rotate: false - xy: 844, 485 + xy: 991, 455 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/iron1 rotate: false - xy: 924, 485 + xy: 512, 82 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/iron2 rotate: false - xy: 934, 485 + xy: 522, 82 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/iron3 rotate: false - xy: 944, 485 + xy: 801, 443 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/irondrill rotate: false - xy: 954, 485 + xy: 811, 445 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/ironwall rotate: false - xy: 964, 485 + xy: 821, 445 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/junction rotate: false - xy: 974, 485 + xy: 831, 445 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/laserturret rotate: false - xy: 243, 85 + xy: 844, 483 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/lava rotate: false - xy: 984, 485 + xy: 841, 444 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/lavaedge rotate: false - xy: 164, 91 + xy: 95, 75 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 blocks/lavasmelter rotate: false - xy: 994, 485 + xy: 851, 443 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/liquiditemjunction rotate: false - xy: 1004, 485 + xy: 861, 443 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/liquidjunction rotate: false - xy: 1014, 485 + xy: 871, 443 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/liquidrouter rotate: false - xy: 841, 475 + xy: 881, 443 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/machineturret rotate: false - xy: 243, 73 + xy: 856, 483 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/megarepairturret rotate: false - xy: 255, 85 + xy: 868, 483 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/mortarturret rotate: false - xy: 255, 73 + xy: 880, 483 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/mossblock rotate: false - xy: 851, 475 + xy: 901, 443 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/mossstone rotate: false - xy: 851, 475 + xy: 901, 443 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -622,7 +622,7 @@ blocks/nuclearreactor-center index: -1 blocks/nuclearreactor-icon rotate: false - xy: 851, 465 + xy: 921, 443 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -643,196 +643,196 @@ blocks/nuclearreactor-small index: -1 blocks/oil rotate: false - xy: 861, 475 + xy: 931, 443 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/oiledge rotate: false - xy: 95, 61 + xy: 109, 75 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 blocks/oilrefinery rotate: false - xy: 851, 455 + xy: 941, 443 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/omnidrill rotate: false - xy: 861, 465 + xy: 951, 443 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/plasmaturret rotate: false - xy: 267, 85 + xy: 892, 483 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/playerspawn rotate: false - xy: 871, 475 + xy: 961, 443 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/powerbooster rotate: false - xy: 861, 455 + xy: 971, 443 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/poweredconveyor rotate: false - xy: 871, 465 + xy: 981, 443 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/poweredconveyormove rotate: false - xy: 881, 475 + xy: 991, 445 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/powerlaser rotate: false - xy: 871, 455 + xy: 1001, 445 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/powerlasercorner rotate: false - xy: 881, 465 + xy: 1011, 445 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/powerlaserrouter rotate: false - xy: 891, 475 + xy: 109, 13 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/pulseconduit rotate: false - xy: 881, 455 + xy: 736, 381 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/pulseconduitbottom rotate: false - xy: 891, 465 + xy: 740, 371 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/pulseconduittop rotate: false - xy: 901, 475 + xy: 740, 361 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/pump rotate: false - xy: 891, 455 + xy: 740, 351 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/repairturret rotate: false - xy: 267, 73 + xy: 904, 483 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/rock1 rotate: false - xy: 911, 475 + xy: 740, 331 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/rock2 rotate: false - xy: 901, 455 + xy: 740, 321 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/router rotate: false - xy: 911, 465 + xy: 798, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/rtgenerator rotate: false - xy: 921, 475 + xy: 180, 87 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/rtgenerator-top rotate: false - xy: 911, 455 + xy: 190, 87 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/sand1 rotate: false - xy: 921, 465 + xy: 200, 87 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/sand2 rotate: false - xy: 931, 475 + xy: 210, 87 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/sand3 rotate: false - xy: 921, 455 + xy: 220, 87 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/sandblock1 rotate: false - xy: 931, 465 + xy: 230, 87 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/sandblock2 rotate: false - xy: 941, 475 + xy: 240, 87 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/sandblock3 rotate: false - xy: 931, 455 + xy: 250, 87 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -846,126 +846,126 @@ blocks/sandedge index: -1 blocks/shadow rotate: false - xy: 279, 85 + xy: 916, 483 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/shieldgenerator rotate: false - xy: 951, 475 + xy: 270, 87 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/shotgunturret rotate: false - xy: 279, 73 + xy: 928, 483 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/shrub rotate: false - xy: 961, 475 + xy: 527, 126 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/shrubshadow rotate: false - xy: 951, 455 + xy: 527, 116 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/smelter rotate: false - xy: 961, 465 + xy: 524, 106 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/sniperturret rotate: false - xy: 291, 85 + xy: 940, 483 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/snow1 rotate: false - xy: 971, 475 + xy: 362, 83 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/snow2 rotate: false - xy: 961, 455 + xy: 372, 83 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/snow3 rotate: false - xy: 971, 465 + xy: 382, 83 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/snowblock1 rotate: false - xy: 981, 475 + xy: 392, 83 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/snowblock2 rotate: false - xy: 971, 455 + xy: 402, 83 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/snowblock3 rotate: false - xy: 981, 465 + xy: 412, 83 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/snowedge rotate: false - xy: 95, 19 + xy: 95, 33 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 blocks/sorter rotate: false - xy: 991, 475 + xy: 422, 83 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/steelconveyor rotate: false - xy: 981, 455 + xy: 432, 83 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/steelconveyormove rotate: false - xy: 991, 465 + xy: 442, 83 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/steelwall rotate: false - xy: 1001, 475 + xy: 452, 83 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -979,98 +979,98 @@ blocks/steelwall-large index: -1 blocks/steelwall-large-icon rotate: false - xy: 991, 455 + xy: 462, 83 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/stone1 rotate: false - xy: 1001, 465 + xy: 472, 83 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/stone2 rotate: false - xy: 1011, 475 + xy: 482, 76 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/stone3 rotate: false - xy: 1001, 455 + xy: 492, 72 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/stoneblock1 rotate: false - xy: 1011, 465 + xy: 502, 72 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/stoneblock2 rotate: false - xy: 1011, 455 + xy: 512, 72 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/stoneblock3 rotate: false - xy: 533, 178 + xy: 522, 72 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/stonedrill rotate: false - xy: 537, 168 + xy: 107, 3 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/stoneedge rotate: false - xy: 109, 77 + xy: 109, 47 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 blocks/stoneformer rotate: false - xy: 537, 158 + xy: 746, 381 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/stonewall rotate: false - xy: 537, 148 + xy: 750, 371 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/teleporter rotate: false - xy: 801, 443 + xy: 750, 361 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/teleporter-top rotate: false - xy: 811, 445 + xy: 750, 351 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/thermalgenerator rotate: false - xy: 821, 445 + xy: 750, 341 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -1084,56 +1084,56 @@ blocks/titancannon index: -1 blocks/titancannon-icon rotate: false - xy: 291, 73 + xy: 952, 483 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/titanium1 rotate: false - xy: 831, 445 + xy: 750, 331 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/titanium2 rotate: false - xy: 841, 445 + xy: 750, 321 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/titanium3 rotate: false - xy: 851, 445 + xy: 740, 311 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/titaniumdrill rotate: false - xy: 861, 445 + xy: 750, 311 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/titaniumpurifier rotate: false - xy: 871, 445 + xy: 734, 301 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/titaniumshieldwall rotate: false - xy: 881, 445 + xy: 744, 301 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/titaniumwall rotate: false - xy: 891, 445 + xy: 754, 301 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -1147,77 +1147,77 @@ blocks/titaniumwall-large index: -1 blocks/titaniumwall-large-icon rotate: false - xy: 901, 445 + xy: 528, 96 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/turret rotate: false - xy: 303, 89 + xy: 964, 483 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/uranium1 rotate: false - xy: 931, 445 + xy: 532, 86 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/uranium2 rotate: false - xy: 941, 445 + xy: 532, 76 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/uranium3 rotate: false - xy: 951, 445 + xy: 542, 86 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/uraniumdrill rotate: false - xy: 961, 445 + xy: 542, 76 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/water rotate: false - xy: 971, 445 + xy: 756, 381 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/wateredge rotate: false - xy: 109, 63 + xy: 95, 19 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 blocks/waveturret rotate: false - xy: 303, 77 + xy: 976, 483 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 bullet rotate: false - xy: 355, 81 + xy: 861, 463 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 chainbullet rotate: false - xy: 183, 64 + xy: 841, 454 size: 8, 7 orig: 8, 7 offset: 0, 0 @@ -1294,14 +1294,14 @@ enemies/targetenemy-t1 index: -1 enemies/enemy-t2 rotate: false - xy: 108, 91 + xy: 124, 91 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 enemies/enemy-t3 rotate: false - xy: 122, 91 + xy: 138, 91 size: 12, 12 orig: 12, 12 offset: 0, 0 @@ -1392,63 +1392,63 @@ enemies/healerenemy-t3 index: -1 enemies/mortarenemy-t1 rotate: false - xy: 738, 412 + xy: 738, 396 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 enemies/mortarenemy-t2 rotate: false - xy: 738, 396 + xy: 754, 414 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 enemies/mortarenemy-t3 rotate: false - xy: 754, 414 + xy: 754, 398 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 enemies/rapidenemy-t1 rotate: false - xy: 754, 398 + xy: 770, 414 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 enemies/rapidenemy-t2 rotate: false - xy: 770, 414 + xy: 770, 398 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 enemies/rapidenemy-t3 rotate: false - xy: 770, 398 + xy: 786, 419 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 enemies/tankenemy-t1 rotate: false - xy: 786, 419 + xy: 786, 403 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 enemies/tankenemy-t2 rotate: false - xy: 786, 403 + xy: 92, 89 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 enemies/tankenemy-t3 rotate: false - xy: 92, 89 + xy: 108, 89 size: 14, 14 orig: 14, 14 offset: 0, 0 @@ -1476,63 +1476,63 @@ enemies/titanenemy-t3 index: -1 enemyarrow rotate: false - xy: 527, 117 + xy: 482, 86 size: 8, 7 orig: 8, 7 offset: 0, 0 index: -1 icon-coal rotate: false - xy: 854, 485 + xy: 1001, 465 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icon-dirium rotate: false - xy: 864, 485 + xy: 1001, 455 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icon-iron rotate: false - xy: 874, 485 + xy: 1011, 475 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icon-steel rotate: false - xy: 884, 485 + xy: 1011, 465 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icon-stone rotate: false - xy: 894, 485 + xy: 1011, 455 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icon-titanium rotate: false - xy: 904, 485 + xy: 492, 82 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icon-uranium rotate: false - xy: 914, 485 + xy: 502, 82 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 laser rotate: false - xy: 178, 91 + xy: 533, 178 size: 1, 12 orig: 1, 12 offset: 0, 0 @@ -1553,42 +1553,42 @@ laserfull index: -1 mechs/mech-standard rotate: false - xy: 95, 75 + xy: 95, 61 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 mechs/ship-standard rotate: false - xy: 95, 33 + xy: 109, 61 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 shell rotate: false - xy: 941, 465 + xy: 260, 87 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 shot rotate: false - xy: 941, 455 + xy: 280, 87 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 shot-long rotate: false - xy: 951, 465 + xy: 290, 87 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanshell rotate: false - xy: 911, 445 + xy: 534, 106 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -1687,14 +1687,14 @@ ui/check-over index: -1 ui/clear rotate: false - xy: 109, 51 + xy: 109, 23 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/cursor rotate: false - xy: 69, 3 + xy: 734, 311 size: 4, 4 orig: 4, 4 offset: 0, 0 @@ -1715,7 +1715,7 @@ ui/icons/icon-add index: -1 ui/icons/icon-areaDelete rotate: false - xy: 109, 39 + xy: 537, 169 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -1729,28 +1729,28 @@ ui/icons/icon-arrow index: -1 ui/icons/icon-arrow-down rotate: false - xy: 135, 67 + xy: 537, 157 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icons/icon-arrow-left rotate: false - xy: 147, 79 + xy: 537, 145 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icons/icon-arrow-right rotate: false - xy: 109, 27 + xy: 786, 391 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icons/icon-arrow-up rotate: false - xy: 147, 67 + xy: 302, 89 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -1799,21 +1799,21 @@ ui/icons/icon-close-over index: -1 ui/icons/icon-crafting rotate: false - xy: 159, 79 + xy: 314, 89 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icons/icon-cursor rotate: false - xy: 159, 67 + xy: 326, 89 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icons/icon-defense rotate: false - xy: 95, 7 + xy: 338, 89 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -1827,7 +1827,7 @@ ui/icons/icon-discord index: -1 ui/icons/icon-distribution rotate: false - xy: 109, 15 + xy: 350, 89 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -1897,14 +1897,14 @@ ui/icons/icon-grid index: -1 ui/icons/icon-hold rotate: false - xy: 171, 79 + xy: 362, 93 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icons/icon-holdDelete rotate: false - xy: 171, 67 + xy: 374, 93 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -1916,9 +1916,16 @@ ui/icons/icon-home orig: 14, 14 offset: 0, 0 index: -1 +ui/icons/icon-host + rotate: false + xy: 631, 204 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 ui/icons/icon-info rotate: false - xy: 107, 3 + xy: 386, 93 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -1932,7 +1939,7 @@ ui/icons/icon-line index: -1 ui/icons/icon-load rotate: false - xy: 631, 204 + xy: 647, 227 size: 14, 14 orig: 14, 14 offset: 0, 0 @@ -1960,21 +1967,21 @@ ui/icons/icon-loading index: -1 ui/icons/icon-menu rotate: false - xy: 183, 85 + xy: 398, 93 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icons/icon-none rotate: false - xy: 183, 73 + xy: 410, 93 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icons/icon-pause rotate: false - xy: 195, 85 + xy: 422, 93 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -1995,35 +2002,35 @@ ui/icons/icon-pick index: -1 ui/icons/icon-play rotate: false - xy: 195, 73 + xy: 434, 93 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icons/icon-play-2 rotate: false - xy: 647, 227 + xy: 647, 211 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 ui/icons/icon-power rotate: false - xy: 207, 85 + xy: 446, 93 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icons/icon-production rotate: false - xy: 207, 73 + xy: 458, 93 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icons/icon-quit rotate: false - xy: 647, 211 + xy: 647, 195 size: 14, 14 orig: 14, 14 offset: 0, 0 @@ -2037,7 +2044,7 @@ ui/icons/icon-redo index: -1 ui/icons/icon-rename rotate: false - xy: 647, 195 + xy: 631, 188 size: 14, 14 orig: 14, 14 offset: 0, 0 @@ -2051,35 +2058,35 @@ ui/icons/icon-resize index: -1 ui/icons/icon-rotate rotate: false - xy: 631, 188 + xy: 647, 179 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 ui/icons/icon-rotate-arrow rotate: false - xy: 647, 179 + xy: 722, 411 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 ui/icons/icon-rotate-left rotate: false - xy: 722, 411 + xy: 722, 395 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 ui/icons/icon-rotate-right rotate: false - xy: 722, 395 + xy: 724, 365 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 ui/icons/icon-save rotate: false - xy: 724, 365 + xy: 724, 349 size: 14, 14 orig: 14, 14 offset: 0, 0 @@ -2100,7 +2107,7 @@ ui/icons/icon-save-map index: -1 ui/icons/icon-settings rotate: false - xy: 219, 85 + xy: 470, 93 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -2114,35 +2121,35 @@ ui/icons/icon-terrain index: -1 ui/icons/icon-tools rotate: false - xy: 724, 349 + xy: 724, 333 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 ui/icons/icon-touch rotate: false - xy: 219, 73 + xy: 492, 92 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icons/icon-touchDelete rotate: false - xy: 231, 85 + xy: 504, 92 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icons/icon-trash rotate: false - xy: 724, 333 + xy: 724, 317 size: 14, 14 orig: 14, 14 offset: 0, 0 index: -1 ui/icons/icon-tutorial rotate: false - xy: 724, 317 + xy: 738, 412 size: 14, 14 orig: 14, 14 offset: 0, 0 @@ -2156,7 +2163,7 @@ ui/icons/icon-undo index: -1 ui/icons/icon-weapon rotate: false - xy: 231, 73 + xy: 516, 92 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -2234,7 +2241,7 @@ ui/scroll-knob-vertical-black index: -1 ui/selection rotate: false - xy: 524, 117 + xy: 592, 284 size: 1, 1 orig: 1, 1 offset: 0, 0 @@ -2313,7 +2320,7 @@ ui/textfield-over index: -1 ui/white rotate: false - xy: 535, 188 + xy: 738, 391 size: 3, 3 orig: 3, 3 offset: 0, 0 @@ -2336,42 +2343,42 @@ ui/window-empty index: -1 weapons/blaster rotate: false - xy: 345, 81 + xy: 851, 463 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 weapons/flamer rotate: false - xy: 435, 95 + xy: 911, 453 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 weapons/mortar rotate: false - xy: 841, 465 + xy: 891, 443 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 weapons/multigun rotate: false - xy: 841, 455 + xy: 911, 443 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 weapons/railgun rotate: false - xy: 901, 465 + xy: 740, 341 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 weapons/triblaster rotate: false - xy: 921, 445 + xy: 538, 96 size: 8, 8 orig: 8, 8 offset: 0, 0 diff --git a/core/assets/sprites/sprites.png b/core/assets/sprites/sprites.png index 62f0be40b92f41d04403af42e891a55b1fd0a084..c0118c8038984b37824f50caf93b9834f8faab0c 100644 GIT binary patch literal 81725 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

mIm!TyWdXz81Nu2 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�^ z3|Y!x|M#VTw|?EnZl+IiXIAF9yEL!_q#1@X7^GfwFY;k!2>n*A#js@S?4+F7R}q(G z7AGe4*+4;~=dI^|D~D8HlVK21V7Tz( zw+>Uo`{(QL-mbNk*K3IrkIujSE;^u~_3S_Hntj~D;Azz`<^K)(H4nQVaX+sMta&6n ze}zcz=X1Z?3QqjUZ~c7E+W*PfZ}UY}g&1nmexKK2;CWTQRl+jGRv@SF?T>UJQ0?u; ze_NxCXU{f2h8d;?LzNe4Jq9VrS+zyR6l5AWMVkI zwe-;+?K%xMemNbtcpLAM-aC=yI@e2V^%=g*(37s~mMFieRCt=r^Uu+j)788dMa|Z} z{`OAEOqIXFX}#jgVtnhZ)v9!wul0!D-%-J_eCkRjhPM@GQvK66iq-T5KObMi`bhuUpOSnfhAY#KHf_v4Dy#i$(bWBu1e3n*`RVcJX!!CRf0l+@ zn=OyRtpjKYn?6dsl7yuO%E$n$Fk%`^zWzp&=a6c8cBZn0~S4 zp$kdQ^IoSb8{Fh#aJ8v_d+%M+*X_Pt&u8`CH@&_8?7vu@f7^cRfB2~v!qB1QFej?> z53}9hm**LN>i4JwAE?{^>*{(|<^S=&Z(Uzfx`CO6Vcr*g{+H+H>Nog1tYEynt6tZ$ zY?96TT`|$>jlvUdu)EhdpKH94^k3?t@2!MMPwM`bKb7$?`{I1acbe<|rO8J+I@ymL znYdp4_u*tm$0nWAWiP60{Pl(Yo$7l2Zi>s-?fd_%WVleO!F8fG_lKgKf056Z2!{E8 zJ|55Q*w2-8#Zvxo_ToKu4atl5D?fMmFrD{~>T^?-g-oW34(sfVwlDW%cyYTp;+*#X z@83%o1{^P;IOq0wiH(kyCGJX2-Q$Od&&6^$Lyr*w#Y0~qy zhaN|?7Z$u+I(^yJ(|@(qRZggJTdJO1rSk(cL}6X3$RF5#XG{I%pRG3g!cH;@L@{J+ zE4Z}oe*WfGR_R7gZI&gR3?F}I)(IU5+qAEp$MeLdTJHOn7;ag;wM^P_I!I{4O~X%bCkY>LO*k}xVGUoxWM+j$ zKb|k5 zrN3hHpUbbCuXFsmW0=!S3}m9wAANYUlY|{)r{ev}LG}t-?{#`Ahq@o?=#b{qv^W{Poj!36#EyjoFeriDBBwTXI={78UcP<`3S10J zg+c8jg@yZzen@kEbUVafysIaU;llR(8*7eim0fdX%8f%t8%xx$)%Sd7FXH{%@Pj!) zlGFUl&WuleR*Ve&%*U6{-zcyC`vq&mwR%0S0!D^@&ij8%+AwH*P-W&cWS@2_D3^Of?sdjjXKrtK{p!l?clS%`-irO6f0bEbtw=}z`}J?$ z?)tqtwD0^@+xH)Da`>2~G97B}BnjTkjRxvCPWLzX5&{?l}qJA?g zgTnJb28~vR2P|3)3j0ngLU+cNC>;p3sj$wG<@>y^JQV{n+iyPQYR`3BuDQTfeM{hwkmT5^!8pWon3bQW3udr67F27U%!4$YUiHz`1y~U&(kL} zgkCYep?SV0j#1%IzC^=$8HVQVJo#D&LG83tUjJq?OlS~z?iA3#ARr_E`^NDjGt=j3 zPM9O!IEjm)RIFU(p9V`ox3wt4gatv|=Dua^att#v<=4D+*mUty-{~2R@lP2WQl@q> zsPQwr+cfVP;{t2B>oN>x*Pq`@WIlR~arLAp^*7jU8CHZhXt6h(V|GwyP4e*MGD@YUIM%J-gT~sM=xuAA>#uL6GhMN6hj0}?*lGfP9rg<{Fp7ejBK+CQIhFQ!E$=6oiw&!I( zFr#!9Gs9#Cp+oa^e)}-ZD68GT#o)`-vF?9K^Ug%0`*1wy`@JG83p&VO2;{XFv9&mYUmu7C6eds}`L-|n+NB3T+hvo1yd z|9;QDy^#0U52dzcA7gHxHZqS5zg*dB z`{(z+e(%4+>hqp@j_tp;{9Cr9M)9y{M~ zq2kLD-QxOXYX1$6UGZ$698|T3MZy0_`%;F5?++#ZKKgEA__c{KC;s${GETUYG}Ahc zEx>ih!rTjUUh+1v@VY*jUn$zKyuX|?Z>QU)sO-s-@B05Pnm=RP@_j-K90D2v3O~OG zvR!!g>w-~3b-JyBYs1^g{TvKB*RN@wW=K+Hkm7219ST}kY*GKuk#WJ3`QeNQUY}%T zsIsjTWr*(Hrzy{nfBlOoH-i=Tp01Y9I{#Od%}elq&bT1ET-M%O_G8-hiRCK~&zt_| zhR`8qc0LcIqX9B$vQdzk<8dX~yRi`v&~_*Gfr zS#u6^a{RmXkXDX&=gI`;Kuz_H(f+yM3TF4DzK%Zkukdy(Yk*(qg4F``WyA zfx|^n_S3%^o!uN`UN^Tkw)}3L&*S9iTNat1k?kEe^RF;7oU}i;v*JeH`TA)eYoq=< ztMQcF-GBZqw--}%mkg*Hdb0n_6Z>w41m}Xq3=h8llHk~@@@V$@eNhY=6Ss>pEckz{ zSNdhyr_U$n|4|WSNQk`3ZvXwu7Y{~;4W+Nc3Qy~9@0fR#-+L18=dFAHYfb;XZLg+W z-J{aNClik!ZQT7{e0TZ#yaTr1?4-kqYJcwU6NUz%2Jh*5Unemuyf${|w2#dT zb2?yDq5ac`y7ev#aI|Vuq?3TDp^sT zm;Lc|l!c1Vmbq!?=1A%kDho1f`EgiyyXt?}4Lz^x|F4c-b6)%9=i|yNuM2Zlgz?B) znKZ7-J<=g4w5qJ{a6A9%^W9OG3L{e+mlscEXUKp4_|r$XKKxqhuooA=gadmvi-?#3%?((loFT6dyW$t>j!#h{4^KIr> zu`9Y>F27Gj`!A!9Pj@ZY4iI^{nh&G@85FjG4#kILhJzjN6-zt54J8yp2 z@jV{haT?-}_B=jr)bO!b@)X0Oqw=l{?-&IxvEKXg`@!Sy%3HYW1ydPfSsN~>elPi* z+4}l*Mg5i*27%TFk3XlC7*=$wbYjR*_;1DN;5y|p3xl{)d>W&JI@61F#j_YTv%_^0?WHYyk$Xo-@(Cr>7^b0WDm9y?*~bCI>}^#*}=HB*wTwc_hKiR`5|K6S_?cCE|rpG+LlqbwA zcX8i`iOdI{-ZNKKG+8KIXYVxmd%%kc_diS%0u2$ItlvDr%}aiN=8B1b=35jxX*1jq z$h`ec>*bUaS_}`$I5Hk5U);9m_u}iE>pDGI8nS1rZDZINw%V~hht%Tl=cCzW)}3wP6xMQX=bPG)`YUppO<~UYVD^1Cr(L;l zKmKO&k=m`d1qxmVOb)X+8eHb?{AKWnymDt8Rd`N|1#vX=CI$uLL9GuQ|?mrcj z|B2y*wVpV`rB93jD}Ft?VS2sJ^Pl28dCvV@8cYYwB%BzgGBeoSxueU{pp*A9uD+hB zO+DpY?u4sF`I>S+zTCJ_Tb@HY6N*8SeT)>v*8U**Kd z&pm}WQe-`B&h+QMpSa+4%e zL#%s`_qICu$Dfzf+Ra~oAx_M4|Nd!W4B+m|MW%+6s&}t#jeTA<|LW2Ep$s0k?Vs6r zM7t*nTTL(xIi#{{h0)hyp+1$llS=)b1)pNBk}iM7`&pRL;pwCKY77bWdJGPhj(%S% z`55lSofe*;!ejIG!o@ZF=dM$^WO{BN&lCI0|BQEheEv~RLo2`8%BGQvVULfz>iIpf z;fws!8^7D`d;PDrg<*>6$@#B;xNW<{CTfy{69_bnNGewTk` z$oQ&KAL-2SDdq9^)Q9IM^=t^8=YJj2Ns*o;1}clX1sHgg8m4CN?rOOm#(3gY+5GKi z-53Ho1-CIZ_^xQte9|a1VU0k+?SsE3z2=I%HSx~j^r;F9PVqYkYAlO!mHFHws>O03JfivHX2k}E z2d|~9IAuzi7$&89U8wA|^}A525|aw?o3$b5g16mSfri$IhoW+eUT#VoLSm7FX{h2evgX2k7?o$~KoY)`45bz{AAno;Xz26)7Jgu6dK3DSWKgaCg z`few~0wK;9J3=4Dt23nVGA>|p5Ph_5ci+{@{243^q94OK820JB&7Agl&Er-9hMEe# zi2kLsOP){Kx<8%qz%T3d+RPm)k_U9ZtSa-{_i|431LvOiyXvFG?}d3>d3rl4G(^Zj zKJtO{?hV_klMbYDG5n}amONl%sqkq|eTNLg!aasHclTEw+phSe^7oB4o*BOa{97lS zch|^ow7D;z@L*Z@kq7%8=6c@(C&U#-4IXZxOQv))Xq`6O+I4wjXylKdo3eP`oqE66 zx6~)|c;>CXxcyUJ2M2cQ{;_)P#ZYvJuUL;kW7B`>Vulq?4400DswlltVLY%bewtw| zH-p`y$J$eQR5_zP7*5FDYFILZDc&k1cZ=-W4>H?s@9yE(f3WM@lDO?@f0p&K+#U(d?lJ$GHawT-;q_xBHSm5&@aE56mXl6y+ds>h!7>H_t83@=<5rnb(W923vf z(Al!QlXcJ8c7}w@$5j|soY?

au4jD}$%`)(^px*1ej%mCIok!-CaJ7Zep4B7ckM zGW_uCdmeOmfuz{qJDmTwFfr&ZZa*+xBvd-ry}XL=cG=}0yS}v?$Ue4xrL$b@#=9Ic z6DmT?CqB5`vwYdNMXwGVf4`?vtWG$FqatI*soy1s{yurs^`5(#jdzuEhWUS`y7-*` z`%C`UH*lNr3pa1$eJ>#-Zt%Iped0eqrGHwC4T3jKLPRoNOfNi>P@B7LtEB&SS#gG( zb-j5qS`0c-TUID0+i!nUd}+PrWB22$gc(C-{>!XrT*aa&$lx;3lVRtK-~u6s;Q3w0 zYWH=hG}vwaYaY$;!M05G{7w@N29rLywJ&#-#g^61dm4WovYzl&hxprf@g+YR&s)8- za{{eZO4%!y5c%5b+S~(QCe7P^C2FS8o9U|UF0+2uD1EZn@t}R)?05Hd+gZ@{U0}(DLGtw9ej=F_rjxWvtQ?HGt8LuA+fa~jf-K|@9^^aU3K=Z zck8#^ub+3LZn{B(%H;Z~FUrfyuQR$fm=s?4_G?F8Ka=tQ+KZhGf4*OS`d^Th!9iVk zw+5TbrT4)M8&r1&GJGh{4Ke)PFjYI8t9NPqw!+u;;tUKo`ujE}9p!qvzUrRpI)ygrNo%>@5tNR76wLLuF=fC^0 zIqFL;N4?nf|ANYH8mrcNg{)%zJ_y2)h47=T2o2L8n2)y}1laiMh4ROK*l6!-WY9|15nO9w;#|6fv#% z#9Z)+zasOt&c{FNQWrhaPmG`Uwo8biX2-?d|L(Q@xSJQ1;WC$D!R7<6Zvrc~Ng@>mt&+XiCVU5a!wR$o;+CbtfUYE~g zZP=vt^YdKx16zIKr-3&jGKezFn(1=+>37$sj1!*z7c|IuubTAY-NlIyc6Kr@y2@Fv z@;8tngIzG;8^0`~U5UcbNn zmY{<;Q$Wc{-|6?or?NX-`|mEm(Drt>iIC0zCI{n|MxWzi`_F4IY}u^d;3wdb?JeEy zG+E=q4L4Q>(G5-vPFLAm8G0TrS7P|+_CTp2rvGojZmA=|>i!)~9wjcb6+wHyJ3veD zz&k877`Dt{2x#5$Vw(oT7SDGL9zPZ{2&j7to#(8-mb-b;FT0>9Mh1bCIWBRG5B@XH YNtRwzF?pW=0|Nttr>mdKI;Vst01Kkn^8f$< literal 80835 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 p6b_I{^(zSclAlo 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 y-a_X&>#x;rUi8Z*D2kCm;AD { @@ -98,7 +104,7 @@ public class NetClient extends Module { int id = packet.ids[i]; if(id != Vars.player.id){ Entity entity = null; - if(id >= packet.enemyStart){ + if(i >= packet.enemyStart){ entity = Vars.control.enemyGroup.getByID(id); }else { entity = Vars.control.playerGroup.getByID(id); @@ -106,7 +112,10 @@ public class NetClient extends Module { Syncable sync = ((Syncable)entity); - if(sync == null) continue; + if(sync == null){ + Gdx.app.error("Mindustry", "Unknown entity ID: " + id + " " + (i >= packet.enemyStart ? "(enemy)" : "(player)")); + continue; + } //augh ((Interpolator)sync.getInterpolator()).type.read(entity, packet.data[i]); @@ -136,6 +145,8 @@ public class NetClient extends Module { } Vars.control.setWaveData(packet.enemies, packet.wave, packet.countdown); + Timers.resetTime(packet.time + (float)(TimeUtils.timeSinceMillis(packet.timestamp) / 1000.0 * 60.0)); + Gdx.app.postRunnable(() -> { Vars.ui.updateItems(); }); @@ -217,6 +228,18 @@ public class NetClient extends Module { e.printStackTrace(); } }); + + Net.handle(DisconnectPacket.class, packet -> { + Player player = Vars.control.playerGroup.getByID(packet.playerid); + + if(player != null){ + player.remove(); + } + }); + + Net.handle(Player.class, player -> { + player.add(); + }); } public void update(){ @@ -259,7 +282,7 @@ public class NetClient extends Module { if(Timers.get("syncPlayer", playerSyncTime)){ PositionPacket packet = new PositionPacket(); packet.data = Vars.player.getInterpolator().type.write(Vars.player); - Net.send(packet, SendMode.tcp); //TODO udp instead? + Net.send(packet, SendMode.udp); //TODO udp instead? } } } diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index 016618912a..a74777fff3 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -4,6 +4,7 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.utils.IntArray; import com.badlogic.gdx.utils.IntMap; +import com.badlogic.gdx.utils.TimeUtils; import io.anuke.mindustry.Vars; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.entities.BulletType; @@ -24,6 +25,7 @@ import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Timers; import io.anuke.ucore.entities.Entity; import io.anuke.ucore.modules.Module; +import io.anuke.ucore.util.Bundles; import io.anuke.ucore.util.Mathf; import java.io.ByteArrayInputStream; @@ -39,8 +41,14 @@ public class NetServer extends Module{ public NetServer(){ - Net.handleServer(Connect.class, packet -> { - UCore.log("Sending world data to client (ID="+packet.id+"/"+packet.addressTCP+")"); + Net.handleServer(Connect.class, connect -> { + UCore.log("Connection found: " + connect.addressTCP); + }); + + Net.handleServer(ConnectPacket.class, packet -> { + int id = Net.getLastConnection(); + + UCore.log("Sending world data to client (ID="+id+")"); WorldData data = new WorldData(); ByteArrayOutputStream stream = new ByteArrayOutputStream(); @@ -51,7 +59,7 @@ public class NetServer extends Module{ //TODO compress and uncompress when sending data.stream = new ByteArrayInputStream(stream.toByteArray()); - Net.sendStream(packet.id, data); + Net.sendStream(id, data); Gdx.app.postRunnable(() -> { Vars.ui.showInfo("$text.server.connected"); @@ -59,25 +67,38 @@ public class NetServer extends Module{ EntityDataPacket dp = new EntityDataPacket(); Player player = new Player(); - player.clientid = packet.id; + 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.add(); - connections.put(packet.id, player); + connections.put(id, player); dp.playerid = player.id; dp.players = Vars.control.playerGroup.all().toArray(Player.class); UCore.log("Sending entities: " + Arrays.toString(dp.players)); - //TODO send pathfind positions - //TODO save enemy nodes + Net.sendExcept(id, player, SendMode.tcp); - Net.sendTo(packet.id, dp, SendMode.tcp); + Net.sendTo(id, dp, SendMode.tcp); }); }); Net.handleServer(Disconnect.class, packet -> { - Gdx.app.postRunnable(() -> Vars.ui.showInfo("$text.server.disconnected")); + Player player = connections.get(packet.id); + + if(player == null) { + Gdx.app.postRunnable(() -> Vars.ui.showInfo(Bundles.format("text.server.disconnected", ""))); + return; + } + + Gdx.app.postRunnable(() -> Vars.ui.showInfo(Bundles.format("text.server.disconnected", player.name))); + + DisconnectPacket dc = new DisconnectPacket(); + dc.playerid = player.id; + + Net.send(dc, SendMode.tcp); }); Net.handleServer(PositionPacket.class, pos -> { @@ -200,7 +221,7 @@ public class NetServer extends Module{ packet.ids = new int[amount]; packet.data = new float[amount][0]; - int index = 0; + short index = 0; for(Player player : Vars.control.playerGroup.all()){ float[] out = player.getInterpolator().type.write(player); @@ -229,23 +250,24 @@ public class NetServer extends Module{ packet.countdown = Vars.control.getWaveCountdown(); packet.enemies = Vars.control.getEnemiesRemaining(); packet.wave = Vars.control.getWave(); + packet.time = Timers.time(); + packet.timestamp = TimeUtils.millis(); Net.send(packet, SendMode.udp); } if(Timers.get("serverBlockSync", blockSyncTime)){ - BlockSyncPacket packet = new BlockSyncPacket(); IntArray connections = Net.getConnections(); for(int i = 0; i < connections.size; i ++){ int id = connections.get(i); - Player player = this.connections.get(i); + Player player = this.connections.get(id); if(player == null) continue; int x = Mathf.scl2(player.x, Vars.tilesize); int y = Mathf.scl2(player.y, Vars.tilesize); - int w = 14; - int h = 10; + int w = 16; + int h = 12; sendBlockSync(id, x, y, w, h); } @@ -270,7 +292,7 @@ public class NetServer extends Module{ byte times = 0; for(; times < tile.entity.timer.getTimes().length; times ++){ - if(tile.entity.timer.getTimes()[times] > 0){ + if(tile.entity.timer.getTimes()[times] <= 1f){ break; } } @@ -278,7 +300,7 @@ public class NetServer extends Module{ stream.writeByte(times); for(int i = 0; i < times; i ++){ - stream.writeFloat(tile.entity.timer.getTimes()[times]); + stream.writeFloat(tile.entity.timer.getTimes()[i]); } tile.entity.write(stream); diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/io/anuke/mindustry/core/Renderer.java index 4d9afffd38..9236def916 100644 --- a/core/src/io/anuke/mindustry/core/Renderer.java +++ b/core/src/io/anuke/mindustry/core/Renderer.java @@ -418,10 +418,8 @@ public class Renderer extends RendererModule{ drawHealth(entity); } - if(!Vars.android && Vars.showPlayer) { - for(Player player : Vars.control.playerGroup.all()){ - if(!player.isDead()) drawHealth(player); - } + for(Player player : Vars.control.playerGroup.all()){ + if(!player.isDead() && !player.isAndroid) drawHealth(player); } } } diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java index fb374ab12b..fe12ea4369 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/io/anuke/mindustry/core/UI.java @@ -181,10 +181,12 @@ public class UI extends SceneModule{ join = new FloatingDialog("$text.joingame.title"); join.content().add("$text.joingame.ip").left(); - join.content().addField("localhost", text -> lastip = text).size(180f, 54f); + Mindustry.platforms.addDialog(join.content().addField("localhost", text -> lastip = text).size(180f, 54f).get()); join.content().row(); join.content().add("$text.server.port").left(); - join.content().addField(Vars.port + "", new DigitsOnlyFilter(), text -> lastport = Strings.parseInt(text)).size(180f, 54f); + Mindustry.platforms.addDialog(join.content() + .addField(Vars.port + "", new DigitsOnlyFilter(), text -> lastport = Strings.parseInt(text)) + .size(180f, 54f).get()); join.buttons().defaults().size(140f, 60f).pad(4f); join.buttons().addButton("$text.cancel", join::hide); join.buttons().addButton("$text.ok", () -> { @@ -472,6 +474,21 @@ public class UI extends SceneModule{ public void showInfo(String info){ scene.table().add(info).get().getParent().actions(Actions.fadeOut(4f), Actions.removeActor()); } + + public void showHostServer(){ + showTextInput("$text.hostserver", "$text.server.port", Vars.port + "", new DigitsOnlyFilter(), text -> { + int result = Strings.parseInt(text); + if(result == Integer.MIN_VALUE || result >= 65535){ + Vars.ui.showError("$text.server.invalidport"); + }else{ + try{ + Net.host(result); + }catch (IOException e){ + Vars.ui.showError(Bundles.format("text.server.error", Strings.parseException(e, false))); + } + } + }); + } public void showAbout(){ about.show(); diff --git a/core/src/io/anuke/mindustry/entities/Player.java b/core/src/io/anuke/mindustry/entities/Player.java index b4cba08ad4..10543d8e95 100644 --- a/core/src/io/anuke/mindustry/entities/Player.java +++ b/core/src/io/anuke/mindustry/entities/Player.java @@ -11,6 +11,7 @@ import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.Blocks; import io.anuke.ucore.core.*; import io.anuke.ucore.entities.DestructibleEntity; +import io.anuke.ucore.entities.SolidEntity; import io.anuke.ucore.util.Angles; import io.anuke.ucore.util.Mathf; @@ -19,10 +20,14 @@ import static io.anuke.mindustry.Vars.*; public class Player extends DestructibleEntity implements Syncable{ private static final float speed = 1.1f; private static final float dashSpeed = 1.8f; - + + public String name = "player name"; public transient Weapon weapon = Weapon.blaster; public Mech mech = Mech.standard; public float angle; + public boolean isAndroid; + + public transient float targetAngle = 0f; public transient int clientid; public transient boolean isLocal = false; @@ -43,15 +48,20 @@ public class Player extends DestructibleEntity implements Syncable{ } @Override - public Interpolator getInterpolator() { + public Interpolator getInterpolator() { return inter; } @Override public void damage(int amount){ - if(!Vars.debug && !Vars.android) + if(!Vars.debug) super.damage(amount); } + + @Override + public boolean collides(SolidEntity other){ + return super.collides(other) && !isAndroid; + } @Override public void onDeath(){ @@ -79,9 +89,13 @@ public class Player extends DestructibleEntity implements Syncable{ @Override public void draw(){ - if((Vars.debug && (!Vars.showPlayer || !Vars.showUI)) || (Vars.android && isLocal)) return; + if(isAndroid && isLocal){ + angle = Mathf.lerpAngDelta(angle, targetAngle, 0.2f); + } - String part = Vars.android ? "ship" : "mech"; + if((Vars.debug && (!Vars.showPlayer || !Vars.showUI)) || (isAndroid && isLocal)) return; + + String part = isAndroid ? "ship" : "mech"; if(Vars.snapCamera && Settings.getBool("smoothcam") && Settings.getBool("pixelate")){ Draw.rect(part+"-"+mech.name(), (int)x, (int)y, angle-90); @@ -93,7 +107,7 @@ public class Player extends DestructibleEntity implements Syncable{ @Override public void update(){ - if(!isLocal || android){ + if(!isLocal || isAndroid){ if(!isDead() && !isLocal) inter.update(this); return; } @@ -153,4 +167,9 @@ public class Player extends DestructibleEntity implements Syncable{ public Player add(){ return add(Vars.control.playerGroup); } + + @Override + public String toString() { + return "Player{" + id + ", android=" + isAndroid + ", local=" + isLocal + ", " + x + ", " + y + "}\n"; + } } diff --git a/core/src/io/anuke/mindustry/input/GestureHandler.java b/core/src/io/anuke/mindustry/input/GestureHandler.java index 94bc361802..1330783edb 100644 --- a/core/src/io/anuke/mindustry/input/GestureHandler.java +++ b/core/src/io/anuke/mindustry/input/GestureHandler.java @@ -52,7 +52,7 @@ public class GestureHandler extends GestureAdapter{ float dx = deltaX*Core.camera.zoom/Core.cameraScale, dy = deltaY*Core.camera.zoom/Core.cameraScale; player.x -= dx; player.y += dy; - player.angle = Mathf.lerpAngDelta(player.angle, Mathf.atan2(dx, dy), 0.5f); + player.targetAngle = Mathf.atan2(dx, -dy); }else if(player.placeMode.lockCamera && (player.placeMode.pan && player.recipe != null)){ input.mousex += deltaX; input.mousey += deltaY; diff --git a/core/src/io/anuke/mindustry/io/NetworkIO.java b/core/src/io/anuke/mindustry/io/NetworkIO.java index 44f09db95a..4b8c60bf95 100644 --- a/core/src/io/anuke/mindustry/io/NetworkIO.java +++ b/core/src/io/anuke/mindustry/io/NetworkIO.java @@ -1,7 +1,6 @@ package io.anuke.mindustry.io; import com.badlogic.gdx.files.FileHandle; -import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.TimeUtils; import com.badlogic.gdx.utils.reflect.ClassReflection; import io.anuke.mindustry.Vars; @@ -12,8 +11,6 @@ import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.Blocks; import io.anuke.mindustry.world.blocks.types.BlockPart; import io.anuke.mindustry.world.blocks.types.Rock; -import io.anuke.mindustry.world.blocks.types.production.Generator; -import io.anuke.ucore.UCore; import io.anuke.ucore.core.Timers; import io.anuke.ucore.entities.Entities; @@ -141,7 +138,7 @@ public class NetworkIO { byte times = 0; for(; times < tile.entity.timer.getTimes().length; times ++){ - if(tile.entity.timer.getTimes()[times] > 0){ + if(tile.entity.timer.getTimes()[times] <= 1){ break; } } @@ -149,7 +146,7 @@ public class NetworkIO { stream.writeByte(times); for(int i = 0; i < times; i ++){ - stream.writeFloat(tile.entity.timer.getTimes()[times]); + stream.writeFloat(tile.entity.timer.getTimes()[i]); } tile.entity.write(stream); @@ -204,8 +201,6 @@ public class NetworkIO { int enemies = stream.readInt(); - Array enemiesToUpdate = new Array<>(); - for(int i = 0; i < enemies; i ++){ int id = stream.readInt(); byte type = stream.readByte(); @@ -226,7 +221,6 @@ public class NetworkIO { enemy.tier = tier; enemy.node = node; enemy.add(Vars.control.enemyGroup); - enemiesToUpdate.add(enemy); }catch (Exception e){ throw new RuntimeException(e); } @@ -234,8 +228,7 @@ public class NetworkIO { Vars.control.setWaveData(enemies, wave, wavetime); - if(!android) - Vars.player.add(); + Vars.player.add(); //map diff --git a/core/src/io/anuke/mindustry/io/Saves.java b/core/src/io/anuke/mindustry/io/Saves.java index 140034b6e3..8e7fd21e54 100644 --- a/core/src/io/anuke/mindustry/io/Saves.java +++ b/core/src/io/anuke/mindustry/io/Saves.java @@ -2,12 +2,7 @@ package io.anuke.mindustry.io; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.Array; -import com.badlogic.gdx.utils.Timer; -import com.badlogic.gdx.utils.Timer.Task; import com.badlogic.gdx.utils.async.AsyncExecutor; -import com.badlogic.gdx.utils.reflect.ClassReflection; -import com.badlogic.gdx.utils.reflect.Field; -import com.badlogic.gdx.utils.reflect.ReflectionException; import io.anuke.mindustry.Vars; import io.anuke.mindustry.core.GameState; import io.anuke.mindustry.core.GameState.State; @@ -156,6 +151,7 @@ public class Saves { public void delete(){ SaveIO.fileFor(index).delete(); + saves.removeValue(this, true); if(this == current){ current = null; } diff --git a/core/src/io/anuke/mindustry/net/Net.java b/core/src/io/anuke/mindustry/net/Net.java index 7c79dfe6cd..66f24c47a4 100644 --- a/core/src/io/anuke/mindustry/net/Net.java +++ b/core/src/io/anuke/mindustry/net/Net.java @@ -192,6 +192,8 @@ public class Net{ public IntArray getConnections(); /**Register classes to be sent.*/ public void register(Class... types); + /**Returns the ping for a certain connection.*/ + public int getPingFor(int connection); } public enum SendMode{ diff --git a/core/src/io/anuke/mindustry/net/Packets.java b/core/src/io/anuke/mindustry/net/Packets.java index 13fc79d516..965ae42a9f 100644 --- a/core/src/io/anuke/mindustry/net/Packets.java +++ b/core/src/io/anuke/mindustry/net/Packets.java @@ -28,17 +28,27 @@ public class Packets { public static class SyncPacket{ public int[] ids; public float[][] data; - public int enemyStart = 0; + public short enemyStart; } public static class BlockSyncPacket extends Streamable{ } - public static class StateSyncPacket { + public static class ConnectPacket{ + public String name; + public boolean android; + } + + public static class DisconnectPacket{ + public int playerid; + } + + public static class StateSyncPacket{ public int[] items; - public float countdown; + public float countdown, time; public int enemies, wave; + public long timestamp; } public static class PositionPacket{ diff --git a/core/src/io/anuke/mindustry/net/Registrator.java b/core/src/io/anuke/mindustry/net/Registrator.java index a9f733317c..15537a7ada 100644 --- a/core/src/io/anuke/mindustry/net/Registrator.java +++ b/core/src/io/anuke/mindustry/net/Registrator.java @@ -31,6 +31,8 @@ public class Registrator { EnemyDeathPacket.class, BlockUpdatePacket.class, BlockDestroyPacket.class, + ConnectPacket.class, + DisconnectPacket.class, Class.class, byte[].class, diff --git a/core/src/io/anuke/mindustry/net/Syncable.java b/core/src/io/anuke/mindustry/net/Syncable.java index 6e31f342c3..a5fee2b06b 100644 --- a/core/src/io/anuke/mindustry/net/Syncable.java +++ b/core/src/io/anuke/mindustry/net/Syncable.java @@ -1,7 +1,6 @@ package io.anuke.mindustry.net; import com.badlogic.gdx.math.Vector2; -import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.enemies.Enemy; import io.anuke.mindustry.graphics.Fx; @@ -37,11 +36,11 @@ public interface Syncable { @Override public void update(Player entity, Interpolator interpolator) { Interpolator i = entity.getInterpolator(); - if(i.target.dst(entity.x, entity.y) > 16){ + if(i.target.dst(entity.x, entity.y) > 16 && !entity.isAndroid){ entity.set(i.target.x, i.target.y); } - if(Vars.android && i.target.dst(entity.x, entity.y) > 2f && Timers.get(entity, "dashfx", 3)){ + if(entity.isAndroid && i.target.dst(entity.x, entity.y) > 2f && Timers.get(entity, "dashfx", 2)){ Angles.translation(entity.angle + 180, 3f); Effects.effect(Fx.dashsmoke, entity.x + Angles.x(), entity.y + Angles.y()); } diff --git a/core/src/io/anuke/mindustry/ui/MenuDialog.java b/core/src/io/anuke/mindustry/ui/MenuDialog.java index ea5a67eccc..79a16e6826 100644 --- a/core/src/io/anuke/mindustry/ui/MenuDialog.java +++ b/core/src/io/anuke/mindustry/ui/MenuDialog.java @@ -10,11 +10,7 @@ import io.anuke.ucore.scene.Element; import io.anuke.ucore.scene.builders.build; import io.anuke.ucore.scene.builders.imagebutton; import io.anuke.ucore.scene.ui.ImageButton; -import io.anuke.ucore.scene.ui.TextField.TextFieldFilter.DigitsOnlyFilter; import io.anuke.ucore.util.Bundles; -import io.anuke.ucore.util.Strings; - -import java.io.IOException; import static io.anuke.mindustry.Vars.ui; @@ -62,26 +58,13 @@ public class MenuDialog extends FloatingDialog{ content().row(); - content().addButton("$text.hostserver", () -> { - Vars.ui.showTextInput("$text.hostserver", "$text.server.port", Vars.port + "", new DigitsOnlyFilter(), text -> { - int result = Strings.parseInt(text); - if(result == Integer.MIN_VALUE || result >= 65535){ - Vars.ui.showError("$text.server.invalidport"); - }else{ - try{ - Net.host(result); - GameState.set(State.playing); - }catch (IOException e){ - Vars.ui.showError(Bundles.format("text.server.error", Strings.parseException(e, false))); - } - } - }); - }).disabled(b -> Net.active() || (Net.active() && !Net.server())); + content().addButton("$text.hostserver", () -> ui.showHostServer()) + .disabled(b -> Net.active() || (Net.active() && !Net.server())); content().row(); content().addButton("$text.quit", () -> { - Vars.ui.showConfirm("$text.confirm", "$text.quit.confirm", () -> { + ui.showConfirm("$text.confirm", "$text.quit.confirm", () -> { runSave(); hide(); GameState.set(State.menu); @@ -105,8 +88,12 @@ public class MenuDialog extends FloatingDialog{ new imagebutton("icon-tools", isize, () -> ui.showPrefs()).text("$text.settings").padTop(4f); new imagebutton("icon-save", isize, ()-> save.show()).text("$text.save").padTop(4f); + + content().row(); new imagebutton("icon-load", isize, () -> load.show()).text("$text.load").padTop(4f); + + new imagebutton("icon-host", isize, () -> ui.showHostServer()).text("$text.host").padTop(4f); new imagebutton("icon-quit", isize, () -> { Vars.ui.showConfirm("$text.confirm", "$text.quit.confirm", () -> { diff --git a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java index 2b3f050554..8cf72e324f 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java @@ -150,6 +150,14 @@ public class HudFragment implements Fragment{ }}.end(); + if(Vars.debugNet) { + new table() {{ + new label(() -> "players: " + Vars.control.playerGroup.amount()); + row(); + new label(() -> "" + Vars.control.playerGroup.all()); + }}.end(); + } + blockfrag.build(); } diff --git a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java index 7abea26796..ffb946ea76 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java @@ -72,7 +72,7 @@ public class MenuFragment implements Fragment{ new imagebutton("icon-tools", isize, () -> ui.showPrefs()).text("$text.settings").padTop(4f); - new imagebutton("icon-tools", isize, () -> ui.showJoinGame()).text("$text.joingame").padTop(4f); + new imagebutton("icon-add", isize, () -> ui.showJoinGame()).text("$text.joingame").padTop(4f); if(Mindustry.donationsCallable != null){ new imagebutton("icon-donate", isize, () -> { diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Conveyor.java b/core/src/io/anuke/mindustry/world/blocks/types/distribution/Conveyor.java index 47cd9b0830..89e9def39e 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Conveyor.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/distribution/Conveyor.java @@ -1,15 +1,7 @@ package io.anuke.mindustry.world.blocks.types.distribution; -import static io.anuke.mindustry.Vars.tilesize; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.util.*; - import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.IntArray; - import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.resource.Item; import io.anuke.mindustry.world.Block; @@ -17,7 +9,20 @@ import io.anuke.mindustry.world.Layer; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Draw; import io.anuke.ucore.core.Timers; -import io.anuke.ucore.util.*; +import io.anuke.ucore.util.Bits; +import io.anuke.ucore.util.Mathf; +import io.anuke.ucore.util.Strings; +import io.anuke.ucore.util.Tmp; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.AbstractList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import static io.anuke.mindustry.Vars.tilesize; public class Conveyor extends Block{ private static ItemPos pos1 = new ItemPos(); @@ -182,6 +187,7 @@ public class Conveyor extends Block{ @Override public void read(DataInputStream stream) throws IOException{ + convey.clear(); int amount = stream.readInt(); convey.ensureCapacity(amount); diff --git a/kryonet/build/libs/kryonet-release.jar b/kryonet/build/libs/kryonet-release.jar new file mode 100644 index 0000000000000000000000000000000000000000..e2350720b9fe8d4f4152ac07bde317b9aecddff7 GIT binary patch literal 7637 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 literal 0 HcmV?d00001 diff --git a/kryonet/build/tmp/jar/MANIFEST.MF b/kryonet/build/tmp/jar/MANIFEST.MF new file mode 100644 index 0000000000..59499bce4a --- /dev/null +++ b/kryonet/build/tmp/jar/MANIFEST.MF @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 + diff --git a/kryonet/src/io/anuke/kryonet/KryoServer.java b/kryonet/src/io/anuke/kryonet/KryoServer.java index c3cbfc8843..7b697997ac 100644 --- a/kryonet/src/io/anuke/kryonet/KryoServer.java +++ b/kryonet/src/io/anuke/kryonet/KryoServer.java @@ -133,6 +133,11 @@ public class KryoServer implements ServerProvider { } } + @Override + public int getPingFor(int connection) { + return getByID(connection).getReturnTripTime(); + } + @Override public void register(Class... types) { for(Class c : types){ From c8e41c08ea65eae0099c01c1a40d9ad89a8806eb Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 1 Jan 2018 18:01:24 -0500 Subject: [PATCH 07/12] Fixed Kryo crash --- .../io/anuke/mindustry/AndroidLauncher.java | 3 --- .../io/anuke/mindustry/core/NetServer.java | 2 ++ .../mindustry/desktop/DesktopLauncher.java | 3 --- kryonet/build/libs/kryonet-release.jar | Bin 7637 -> 7759 bytes kryonet/src/io/anuke/kryonet/KryoClient.java | 16 ++++++++++++-- kryonet/src/io/anuke/kryonet/KryoServer.java | 20 +++++++++++++++--- 6 files changed, 33 insertions(+), 11 deletions(-) diff --git a/android/src/io/anuke/mindustry/AndroidLauncher.java b/android/src/io/anuke/mindustry/AndroidLauncher.java index 660caabb4e..ebd5f40d5f 100644 --- a/android/src/io/anuke/mindustry/AndroidLauncher.java +++ b/android/src/io/anuke/mindustry/AndroidLauncher.java @@ -7,7 +7,6 @@ import android.os.Bundle; import android.telephony.TelephonyManager; import com.badlogic.gdx.backends.android.AndroidApplication; import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration; -import com.esotericsoftware.minlog.Log; import io.anuke.kryonet.KryoClient; import io.anuke.kryonet.KryoServer; import io.anuke.mindustry.io.PlatformFunction; @@ -65,8 +64,6 @@ public class AndroidLauncher extends AndroidApplication{ config.hideStatusBar = true; - Log.set(Log.LEVEL_DEBUG); - Net.setClientProvider(new KryoClient()); Net.setServerProvider(new KryoServer()); diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index a74777fff3..f8f8829272 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -95,6 +95,8 @@ public class NetServer extends Module{ Gdx.app.postRunnable(() -> Vars.ui.showInfo(Bundles.format("text.server.disconnected", player.name))); + player.remove(); + DisconnectPacket dc = new DisconnectPacket(); dc.playerid = player.id; diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java index 36e76539c3..40efec90c8 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java @@ -3,7 +3,6 @@ package io.anuke.mindustry.desktop; import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application; import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration; import com.badlogic.gdx.utils.Array; -import com.esotericsoftware.minlog.Log; import io.anuke.kryonet.KryoClient; import io.anuke.kryonet.KryoServer; import io.anuke.mindustry.Mindustry; @@ -59,8 +58,6 @@ public class DesktopLauncher { Mindustry.args = Array.with(arg); - Log.set(Log.LEVEL_DEBUG); - Net.setClientProvider(new KryoClient()); Net.setServerProvider(new KryoServer()); diff --git a/kryonet/build/libs/kryonet-release.jar b/kryonet/build/libs/kryonet-release.jar index e2350720b9fe8d4f4152ac07bde317b9aecddff7..e60785629e468baa11f0c74559b1fbba6c3355fa 100644 GIT binary patch delta 6904 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 Ce)B5; delta 6777 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 Date: Mon, 1 Jan 2018 18:02:35 -0500 Subject: [PATCH 08/12] Updated uCore --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 52d19a7b29..4838a32975 100644 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,7 @@ allprojects { appName = "Mindustry" gdxVersion = '1.9.8' aiVersion = '1.8.1' - uCoreVersion = '59488d7'; + uCoreVersion = '8751c0a66c'; } repositories { From 1b55d002547e6a8c7844811b2560fb54f0dd67ec Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 1 Jan 2018 18:13:34 -0500 Subject: [PATCH 09/12] Commented out extra items --- core/src/io/anuke/mindustry/resource/Item.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/io/anuke/mindustry/resource/Item.java b/core/src/io/anuke/mindustry/resource/Item.java index d5ea87d2b1..4b1d81c249 100644 --- a/core/src/io/anuke/mindustry/resource/Item.java +++ b/core/src/io/anuke/mindustry/resource/Item.java @@ -13,10 +13,10 @@ public class Item{ steel = new Item("steel"), titanium = new Item("titanium"), dirium = new Item("dirium"), - uranium = new Item("uranium"), - sand = new Item("sand"), + uranium = new Item("uranium"); + /*sand = new Item("sand"), glass = new Item("glass"), - silicon = new Item("silicon"); + silicon = new Item("silicon");*/ public final int id; public final String name; From 24248df4af9cc470c7314847f6d19294ff3922ff Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 1 Jan 2018 21:33:51 -0500 Subject: [PATCH 10/12] Started working on discovery, implemented GWT saving --- core/src/io/anuke/mindustry/core/Control.java | 1 + .../io/anuke/mindustry/core/NetClient.java | 11 +- core/src/io/anuke/mindustry/io/SaveIO.java | 102 +++++++++--------- core/src/io/anuke/mindustry/io/SaveMeta.java | 24 +++++ core/src/io/anuke/mindustry/io/Saves.java | 16 ++- core/src/io/anuke/mindustry/net/Address.java | 11 ++ core/src/io/anuke/mindustry/net/Net.java | 27 +++++ .../src/io/anuke/mindustry/ui/JoinDialog.java | 12 +++ .../src/io/anuke/mindustry/ui/MenuDialog.java | 4 +- .../mindustry/ui/fragments/MenuFragment.java | 7 +- kryonet/build/libs/kryonet-release.jar | Bin 7759 -> 8017 bytes kryonet/src/io/anuke/kryonet/KryoClient.java | 27 +++++ kryonet/src/io/anuke/kryonet/KryoServer.java | 9 ++ 13 files changed, 190 insertions(+), 61 deletions(-) create mode 100644 core/src/io/anuke/mindustry/io/SaveMeta.java create mode 100644 core/src/io/anuke/mindustry/net/Address.java create mode 100644 core/src/io/anuke/mindustry/ui/JoinDialog.java diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index 949695e2bf..18e607defc 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -185,6 +185,7 @@ public class Control extends Module{ for(int i = 0; i < Vars.saveSlots; i ++){ Settings.defaults("save-" + i + "-autosave", true); Settings.defaults("save-" + i + "-name", "untitled"); + Settings.defaults("save-" + i + "-data", "empty"); } Settings.loadAll("io.anuke.moment"); diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index 34307b80a8..6cb6099246 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -35,6 +35,7 @@ public class NetClient extends Module { boolean connecting = false; boolean gotEntities = false; float playerSyncTime = 2; + float dataTimeout = 60*10; public NetClient(){ @@ -50,6 +51,14 @@ public class NetClient extends Module { c.name = UCore.getProperty("user.name"); c.android = Vars.android; Net.send(c, SendMode.tcp); + + Timers.runTask(dataTimeout, () -> { + if(!gotEntities){ + Gdx.app.error("Mindustry", "Failed to load data!"); + Vars.ui.hideLoading(); + Net.disconnect(); + } + }); }); Net.handle(Disconnect.class, packet -> { @@ -243,7 +252,7 @@ public class NetClient extends Module { } public void update(){ - if(!Net.client()) return; + if(!Net.client() || !Net.active()) return; if(!GameState.is(State.menu) && Net.active()){ sync(); diff --git a/core/src/io/anuke/mindustry/io/SaveIO.java b/core/src/io/anuke/mindustry/io/SaveIO.java index f9c6567cbe..d15770b443 100644 --- a/core/src/io/anuke/mindustry/io/SaveIO.java +++ b/core/src/io/anuke/mindustry/io/SaveIO.java @@ -2,6 +2,7 @@ package io.anuke.mindustry.io; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.Base64Coder; import com.badlogic.gdx.utils.ObjectMap; import com.badlogic.gdx.utils.TimeUtils; import com.badlogic.gdx.utils.reflect.ClassReflection; @@ -16,6 +17,7 @@ import io.anuke.mindustry.world.Map; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.Blocks; import io.anuke.ucore.core.Core; +import io.anuke.ucore.core.Settings; import io.anuke.ucore.entities.Entities; import java.io.*; @@ -106,71 +108,71 @@ public class SaveIO{ }}; public static void saveToSlot(int slot){ - write(fileFor(slot)); + if(Vars.gwt){ + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + write(stream); + Settings.putString("save-"+slot+"-data", new String(Base64Coder.encode(stream.toByteArray()))); + Settings.save(); + }else{ + write(fileFor(slot)); + } } public static void loadFromSlot(int slot){ - load(fileFor(slot)); + if(Vars.gwt){ + String string = Settings.getString("save-"+slot+"-data"); + ByteArrayInputStream stream = new ByteArrayInputStream(Base64Coder.decode(string)); + load(stream); + }else{ + load(fileFor(slot)); + } + } + + public static DataInputStream readSlotMeta(int slot){ + if(Vars.gwt){ + String string = Settings.getString("save-"+slot+"-data"); + byte[] bytes = Base64Coder.decode(string); + return new DataInputStream(new ByteArrayInputStream(bytes)); + }else{ + return new DataInputStream(fileFor(slot).read()); + } } public static boolean isSaveValid(int slot){ - return isSaveValid(fileFor(slot)); - } - - public static boolean isSaveValid(FileHandle file){ - try(DataInputStream stream = new DataInputStream(file.read())){ - int version = stream.readInt(); //read version - stream.readLong(); //read last saved time - stream.readByte(); //read the gamemode - byte map = stream.readByte(); //read the map - return version == fileVersionID && Vars.world.maps().getMap(map) != null; + try { + return isSaveValid(readSlotMeta(slot)); }catch (Exception e){ return false; } } - - public static String getTimeString(int slot){ - - try(DataInputStream stream = new DataInputStream(fileFor(slot).read())){ - stream.readInt(); - Date date = new Date(stream.readLong()); - return Mindustry.platforms.format(date); - }catch (IOException e){ - throw new RuntimeException(e); + + public static boolean isSaveValid(FileHandle file){ + return isSaveValid(new DataInputStream(file.read())); + } + + public static boolean isSaveValid(DataInputStream stream){ + + try{ + SaveMeta meta = getData(stream); + return meta.version == fileVersionID && meta.map != null; + }catch (Exception e){ + return false; } } - - public static int getWave(int slot){ - - try(DataInputStream stream = new DataInputStream(fileFor(slot).read())){ - stream.readInt(); //read version - stream.readLong(); //read last saved time - stream.readByte(); //read the gamemode - stream.readByte(); //read the map - return stream.readInt(); //read the wave - }catch (IOException e){ - throw new RuntimeException(e); - } + + public static SaveMeta getData(int slot){ + return getData(readSlotMeta(slot)); } - public static GameMode getMode(int slot){ + public static SaveMeta getData(DataInputStream stream){ - try(DataInputStream stream = new DataInputStream(fileFor(slot).read())){ - stream.readInt(); //read version - stream.readLong(); //read last saved time - return GameMode.values()[stream.readByte()]; //read the gamemode - }catch (IOException e){ - throw new RuntimeException(e); - } - } - - public static Map getMap(int slot){ - - try(DataInputStream stream = new DataInputStream(fileFor(slot).read())){ - stream.readInt(); //read version - stream.readLong(); //read last saved time - stream.readByte(); //read the gamemode - return Vars.world.maps().getMap(stream.readByte()); //read the map + try{ + int version = stream.readInt(); //read version + long time = stream.readLong(); //read last saved time + byte mode = stream.readByte(); //read the gamemode + byte map = stream.readByte(); //read the map + int wave = stream.readInt(); //read the wave + return new SaveMeta(version, time, mode, map, wave); }catch (IOException e){ throw new RuntimeException(e); } diff --git a/core/src/io/anuke/mindustry/io/SaveMeta.java b/core/src/io/anuke/mindustry/io/SaveMeta.java new file mode 100644 index 0000000000..1c2d03710c --- /dev/null +++ b/core/src/io/anuke/mindustry/io/SaveMeta.java @@ -0,0 +1,24 @@ +package io.anuke.mindustry.io; + +import io.anuke.mindustry.Mindustry; +import io.anuke.mindustry.Vars; +import io.anuke.mindustry.world.GameMode; +import io.anuke.mindustry.world.Map; + +import java.util.Date; + +public class SaveMeta { + public int version; + public String date; + public GameMode mode; + public Map map; + public int wave; + + public SaveMeta(int version, long date, int mode, int map, int wave){ + this.version = version; + this.date = Mindustry.platforms.format(new Date(date)); + this.mode = GameMode.values()[mode]; + this.map = Vars.world.maps().getMap(map); + this.wave = wave; + } +} diff --git a/core/src/io/anuke/mindustry/io/Saves.java b/core/src/io/anuke/mindustry/io/Saves.java index 8e7fd21e54..c1bd4e7cfc 100644 --- a/core/src/io/anuke/mindustry/io/Saves.java +++ b/core/src/io/anuke/mindustry/io/Saves.java @@ -26,7 +26,9 @@ public class Saves { saves.clear(); for(int i = 0; i < Vars.saveSlots; i ++){ if(SaveIO.isSaveValid(i)){ - saves.add(new SaveSlot(i)); + SaveSlot slot = new SaveSlot(i); + saves.add(slot); + slot.meta = SaveIO.getData(i); nextSlot = i + 1; } } @@ -73,6 +75,7 @@ public class Saves { slot.setName(name); saves.add(slot); SaveIO.saveToSlot(slot.index); + slot.meta = SaveIO.getData(slot.index); } public Array getSaveSlots(){ @@ -81,6 +84,7 @@ public class Saves { public class SaveSlot{ public final int index; + SaveMeta meta; public SaveSlot(int index){ this.index = index; @@ -89,19 +93,21 @@ public class Saves { public void load(){ current = this; SaveIO.loadFromSlot(index); + meta = SaveIO.getData(index); } public void save(){ current = this; SaveIO.saveToSlot(index); + meta = SaveIO.getData(index); } public String getDate(){ - return SaveIO.getTimeString(index); + return meta.date; } public Map getMap(){ - return SaveIO.getMap(index); + return meta.map; } public String getName(){ @@ -114,11 +120,11 @@ public class Saves { } public int getWave(){ - return SaveIO.getWave(index); + return meta.wave; } public GameMode getMode(){ - return SaveIO.getMode(index); + return meta.mode; } public boolean isAutosave(){ diff --git a/core/src/io/anuke/mindustry/net/Address.java b/core/src/io/anuke/mindustry/net/Address.java new file mode 100644 index 0000000000..57b20f1e16 --- /dev/null +++ b/core/src/io/anuke/mindustry/net/Address.java @@ -0,0 +1,11 @@ +package io.anuke.mindustry.net; + +public class Address { + public final String name; + public final String address; + + public Address(String name, String address){ + this.name = name; + this.address = address; + } +} diff --git a/core/src/io/anuke/mindustry/net/Net.java b/core/src/io/anuke/mindustry/net/Net.java index 66f24c47a4..9645b2d23e 100644 --- a/core/src/io/anuke/mindustry/net/Net.java +++ b/core/src/io/anuke/mindustry/net/Net.java @@ -1,9 +1,11 @@ package io.anuke.mindustry.net; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.IntArray; import com.badlogic.gdx.utils.IntMap; import com.badlogic.gdx.utils.ObjectMap; +import com.badlogic.gdx.utils.async.AsyncExecutor; import io.anuke.mindustry.net.Streamable.StreamBegin; import io.anuke.mindustry.net.Streamable.StreamBuilder; import io.anuke.mindustry.net.Streamable.StreamChunk; @@ -22,6 +24,7 @@ public class Net{ private static int lastConnection = -1; private static IntMap streams = new IntMap<>(); + private static AsyncExecutor executor = new AsyncExecutor(4); /**Connect to an address.*/ public static void connect(String ip, int port) throws IOException{ @@ -50,6 +53,18 @@ public class Net{ active = false; } + /**Starts discovering servers on a different thread. Does not work with GWT. + * Callback is run on the main libGDX thread.*/ + public void discoverServers(Consumer> cons){ + executor.submit(() -> { + Array
    arr = clientProvider.discover(); + Gdx.app.postRunnable(() -> { + cons.accept(arr); + }); + return false; + }); + } + /**Returns a list of all connections IDs.*/ public static IntArray getConnections(){ return serverProvider.getConnections(); @@ -152,6 +167,12 @@ public class Net{ return !server; } + public static void dispose(){ + clientProvider.dispose(); + serverProvider.dispose(); + executor.dispose(); + } + /**Register classes that will be sent. Must be done for all classes.*/ public static void registerClasses(Class... classes){ clientProvider.register(classes); @@ -170,8 +191,12 @@ public class Net{ public int getPing(); /**Disconnect from the server.*/ public void disconnect(); + /**Discover servers. This should block for a certain amount of time, and will most likely be run in a different thread.*/ + public Array
    discover(); /**Register classes to be sent.*/ public void register(Class... types); + /**Close all connections.*/ + public void dispose(); } /**Server implementation.*/ @@ -194,6 +219,8 @@ public class Net{ public void register(Class... types); /**Returns the ping for a certain connection.*/ public int getPingFor(int connection); + /**Close all connections.*/ + public void dispose(); } public enum SendMode{ diff --git a/core/src/io/anuke/mindustry/ui/JoinDialog.java b/core/src/io/anuke/mindustry/ui/JoinDialog.java new file mode 100644 index 0000000000..0b643ec4e1 --- /dev/null +++ b/core/src/io/anuke/mindustry/ui/JoinDialog.java @@ -0,0 +1,12 @@ +package io.anuke.mindustry.ui; + +public class JoinDialog extends FloatingDialog { + + public JoinDialog(){ + super("$text.joingame"); + } + + void setup(){ + content().clear(); + } +} diff --git a/core/src/io/anuke/mindustry/ui/MenuDialog.java b/core/src/io/anuke/mindustry/ui/MenuDialog.java index 79a16e6826..26129ea074 100644 --- a/core/src/io/anuke/mindustry/ui/MenuDialog.java +++ b/core/src/io/anuke/mindustry/ui/MenuDialog.java @@ -44,7 +44,7 @@ public class MenuDialog extends FloatingDialog{ ui.showPrefs(); }); - if(!Vars.gwt){ + //if(!Vars.gwt){ content().row(); content().addButton("$text.savegame", () -> { save.show(); @@ -54,7 +54,7 @@ public class MenuDialog extends FloatingDialog{ content().addButton("$text.loadgame", () -> { load.show(); }); - } + //} content().row(); diff --git a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java index ffb946ea76..d1db1965f3 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java @@ -34,10 +34,11 @@ public class MenuFragment implements Fragment{ add(new MenuButton("$text.tutorial", group, ()-> control.playMap(world.maps().getMap("tutorial")))); row(); - + + add(new MenuButton("$text.loadgame", group, ui::showLoadGame)); + row(); + if(!gwt){ - add(new MenuButton("$text.loadgame", group, ui::showLoadGame)); - row(); add(new MenuButton("$text.editor", group, ui::showEditor)); row(); diff --git a/kryonet/build/libs/kryonet-release.jar b/kryonet/build/libs/kryonet-release.jar index e60785629e468baa11f0c74559b1fbba6c3355fa..8c4aff25d044640020a5784fdec1d2fc76b8bba7 100644 GIT binary patch delta 3706 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 discover(){ + List list = client.discoverHosts(Vars.port, 5000); + Array
    result = new Array<>(); + + for(InetAddress a : list){ + result.add(new Address(a.getHostName(), a.getHostAddress())); + } + + return result; + } + @Override public void register(Class... types) { for(Class c : types){ client.getKryo().register(c); } } + + @Override + public void dispose(){ + try { + client.dispose(); + }catch (IOException e){ + throw new RuntimeException(e); + } + } + } diff --git a/kryonet/src/io/anuke/kryonet/KryoServer.java b/kryonet/src/io/anuke/kryonet/KryoServer.java index 4cc9fb95f7..93879acaf1 100644 --- a/kryonet/src/io/anuke/kryonet/KryoServer.java +++ b/kryonet/src/io/anuke/kryonet/KryoServer.java @@ -159,6 +159,15 @@ public class KryoServer implements ServerProvider { } } + @Override + public void dispose(){ + try { + server.dispose(); + }catch (IOException e){ + throw new RuntimeException(e); + } + } + Connection getByID(int id){ for(Connection con : server.getConnections()){ if(con.getID() == id){ From 8a38160124946ffe30effd1be8ce832278c7341a Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 1 Jan 2018 22:13:20 -0500 Subject: [PATCH 11/12] Implemented LAN discovery --- core/assets/bundles/bundle.properties | 3 + core/src/io/anuke/mindustry/core/Control.java | 5 + core/src/io/anuke/mindustry/core/UI.java | 25 +---- core/src/io/anuke/mindustry/net/Net.java | 2 +- .../src/io/anuke/mindustry/ui/JoinDialog.java | 91 ++++++++++++++++++ .../src/io/anuke/mindustry/ui/MenuDialog.java | 18 ++-- .../mindustry/ui/fragments/MenuFragment.java | 1 - kryonet/build/libs/kryonet-release.jar | Bin 8017 -> 8614 bytes kryonet/src/io/anuke/kryonet/KryoClient.java | 6 +- 9 files changed, 115 insertions(+), 36 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 229b0e804c..311df85b8d 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -16,6 +16,9 @@ text.server.connected=A player has joined. text.server.disconnected={0} has disconnected. text.hostserver=Host Server text.host=Host +text.hosts.discovering=Discovering LAN games +text.hosts.none=[lightgray]No hosts found! +text.joingame.byip=Join by IP... text.joingame.title=Join Game text.joingame.ip=IP: text.disconnect=Disconnected. diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index 18e607defc..b100dc629b 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -187,6 +187,11 @@ public class Control extends Module{ Settings.defaults("save-" + i + "-name", "untitled"); Settings.defaults("save-" + i + "-data", "empty"); } + + Settings.defaultList( + "ip", "localhost", + "port", Vars.port+"" + ); Settings.loadAll("io.anuke.moment"); diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java index fe12ea4369..28461457f8 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/io/anuke/mindustry/core/UI.java @@ -178,29 +178,6 @@ public class UI extends SceneModule{ editor = new MapEditor(); editorDialog = new MapEditorDialog(editor); } - - join = new FloatingDialog("$text.joingame.title"); - join.content().add("$text.joingame.ip").left(); - Mindustry.platforms.addDialog(join.content().addField("localhost", text -> lastip = text).size(180f, 54f).get()); - join.content().row(); - join.content().add("$text.server.port").left(); - Mindustry.platforms.addDialog(join.content() - .addField(Vars.port + "", new DigitsOnlyFilter(), text -> lastport = Strings.parseInt(text)) - .size(180f, 54f).get()); - join.buttons().defaults().size(140f, 60f).pad(4f); - join.buttons().addButton("$text.cancel", join::hide); - join.buttons().addButton("$text.ok", () -> { - showLoading("$text.connecting"); - - Timers.runTask(2f, () -> { - try{ - Net.connect(lastip, lastport); - }catch (IOException e) { - showError(Bundles.format("text.connectfail", Strings.parseException(e, false))); - hideLoading(); - } - }); - }).disabled(b -> lastip.isEmpty() || lastport == Integer.MIN_VALUE); settingserror = new Dialog("Warning", "dialog"); settingserror.content().add("[crimson]Failed to access local storage.\nSettings will not be saved."); @@ -210,6 +187,8 @@ public class UI extends SceneModule{ gameerror = new Dialog("$text.error.crashtitle", "dialog"); gameerror.content().labelWrap("$text.error.crashmessage").width(600f).pad(10f); gameerror.buttons().addButton("#text.ok", gameerror::hide).size(200f, 50); + + join = new JoinDialog(); discord = new Dialog("Discord", "dialog"); discord.content().margin(12f); diff --git a/core/src/io/anuke/mindustry/net/Net.java b/core/src/io/anuke/mindustry/net/Net.java index 9645b2d23e..c63addab63 100644 --- a/core/src/io/anuke/mindustry/net/Net.java +++ b/core/src/io/anuke/mindustry/net/Net.java @@ -55,7 +55,7 @@ public class Net{ /**Starts discovering servers on a different thread. Does not work with GWT. * Callback is run on the main libGDX thread.*/ - public void discoverServers(Consumer> cons){ + public static void discoverServers(Consumer> cons){ executor.submit(() -> { Array
    arr = clientProvider.discover(); Gdx.app.postRunnable(() -> { diff --git a/core/src/io/anuke/mindustry/ui/JoinDialog.java b/core/src/io/anuke/mindustry/ui/JoinDialog.java index 0b643ec4e1..f3d34b94df 100644 --- a/core/src/io/anuke/mindustry/ui/JoinDialog.java +++ b/core/src/io/anuke/mindustry/ui/JoinDialog.java @@ -1,12 +1,103 @@ package io.anuke.mindustry.ui; +import com.badlogic.gdx.utils.Array; +import io.anuke.mindustry.Mindustry; +import io.anuke.mindustry.Vars; +import io.anuke.mindustry.net.Address; +import io.anuke.mindustry.net.Net; +import io.anuke.ucore.core.Settings; +import io.anuke.ucore.core.Timers; +import io.anuke.ucore.scene.style.Drawable; +import io.anuke.ucore.scene.ui.Dialog; +import io.anuke.ucore.scene.ui.TextButton; +import io.anuke.ucore.scene.ui.TextField.TextFieldFilter.DigitsOnlyFilter; +import io.anuke.ucore.scene.ui.layout.Table; +import io.anuke.ucore.util.Bundles; +import io.anuke.ucore.util.Strings; + +import java.io.IOException; + public class JoinDialog extends FloatingDialog { + Dialog join; + Table hosts = new Table(); + float w = 400; public JoinDialog(){ super("$text.joingame"); + + addCloseButton(); + + join = new FloatingDialog("$text.joingame.title"); + join.content().add("$text.joingame.ip").left(); + Mindustry.platforms.addDialog(join.content().addField(Settings.getString("ip"),text ->{ + Settings.putString("ip", text); + Settings.save(); + }).size(180f, 54f).get()); + + join.content().row(); + join.content().add("$text.server.port").left(); + Mindustry.platforms.addDialog(join.content() + .addField(Settings.getString("port"), new DigitsOnlyFilter(), text ->{ + Settings.putString("port", text); + Settings.save(); + }) + .size(180f, 54f).get()); + join.buttons().defaults().size(140f, 60f).pad(4f); + join.buttons().addButton("$text.cancel", join::hide); + join.buttons().addButton("$text.ok", () -> + connect(Settings.getString("port"), Integer.parseInt(Settings.getString("port"))) + ).disabled(b -> Settings.getString("ip").isEmpty() || Integer.parseInt(Settings.getString("port")) == Integer.MIN_VALUE); + + setup(); + + shown(() -> { + hosts.clear(); + hosts.background("button"); + hosts.label(() -> "[accent]" + Bundles.get("text.hosts.discovering") + new String(new char[(int)(Timers.time() / 10) % 4]).replace("\0", ".")).pad(10f); + Net.discoverServers(list -> { + addHosts(list); + }); + }); } void setup(){ + hosts.background("button"); content().clear(); + content().add(hosts).width(w).pad(0); + content().row(); + content().addButton("$text.joingame.byip", "clear", join::show).width(w).height(80f); + } + + void addHosts(Array
    array){ + hosts.clear(); + + if(array.size == 0){ + hosts.add("$text.hosts.none").pad(20f); + }else { + for (Address a : array) { + TextButton button = hosts.addButton("[accent]"+a.name, "clear", () -> { + connect(a.address, Vars.port); + }).width(w).height(80f).pad(4f).get(); + button.left(); + button.row(); + button.add("[lightgray]" + a.address + " / " + Vars.port).pad(4).left(); + + hosts.row(); + hosts.background((Drawable) null); + } + } + } + + void connect(String ip, int port){ + Vars.ui.showLoading("$text.connecting"); + + Timers.runTask(2f, () -> { + try{ + Net.connect(ip, port); + }catch (IOException e) { + Vars.ui.showError(Bundles.format("text.connectfail", Strings.parseException(e, false))); + Vars.ui.hideLoading(); + } + }); } } diff --git a/core/src/io/anuke/mindustry/ui/MenuDialog.java b/core/src/io/anuke/mindustry/ui/MenuDialog.java index 26129ea074..9642a55741 100644 --- a/core/src/io/anuke/mindustry/ui/MenuDialog.java +++ b/core/src/io/anuke/mindustry/ui/MenuDialog.java @@ -44,17 +44,15 @@ public class MenuDialog extends FloatingDialog{ ui.showPrefs(); }); - //if(!Vars.gwt){ - content().row(); - content().addButton("$text.savegame", () -> { - save.show(); - }); + content().row(); + content().addButton("$text.savegame", () -> { + save.show(); + }); - content().row(); - content().addButton("$text.loadgame", () -> { - load.show(); - }); - //} + content().row(); + content().addButton("$text.loadgame", () -> { + load.show(); + }); content().row(); diff --git a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java index d1db1965f3..e3df7132c0 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java @@ -39,7 +39,6 @@ public class MenuFragment implements Fragment{ row(); if(!gwt){ - add(new MenuButton("$text.editor", group, ui::showEditor)); row(); } diff --git a/kryonet/build/libs/kryonet-release.jar b/kryonet/build/libs/kryonet-release.jar index 8c4aff25d044640020a5784fdec1d2fc76b8bba7..a669518e69cab0ca5cc5235f7c401b0b620db62d 100644 GIT binary patch delta 3283 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 delta 2692 zcmZ4He9?|4z?+$ci-CcIgQ0oZL>_e}!<>nx-l~Q^`|{K<1_ z7o>eItm){9(mS%TLzTBb=?BMY@%oR3a@i-26-rw2Y8R@A91-SSEoFCcgW3hLoZJ6i zEIHtCt&I2b&D&Ftt^0ndG$q02nQ`!zrNU<}ecbo<#=$uU0yZste#5x&TF>n1Om8D^ zPt>kns{1l`Mzm{`)#i1nV)JLtTYD`udG#WN1^U)~UyNKYe^;H}+`Fjfp5o#ePd~MY zo~YmBU^R2=ok@zd<`d@S{(Sd2;r^F%eQ8?jw!Lm)VLkjUrTmQevOtr$O&co`P8RLZ z7TBJ(k15&ru+SBu3#-H$t)_Zyn|%K>^ZTU>&#jqtZ5_{_i>uW6tTqbBF=I|b{q zejT%`T(`S=p6c|R&f&wCw#uS2ip?%=G!K)$$usOZuK`WZbxx_;{tm{h8Nq z%@e+%8d)6nr|gD+uXnwk!Nq`ws^@i1)?UAT*7LqO_m#{AiO0EB{%LMG(A%cCX`8%9 zoK|DBuUPbg{fwNA9zj?CMI{Te=!v9k*dwq@pL@#V% z)#F;aOBAMAuG!7C?3Gb<)YRhgo0l7R%T>HlX?z#FAYf5f=+{M&;%h$J)c5bJKbh`o z^z>cs<&)y6u8mu7vA*)0SFgWo>ZRzkeJ{jvPHQ~j?{WXhtd%(Jw2$fUWAAEq#%$5u z{EKhrt&I8Wy($wX2j$nk>CHWVH(Z~u?YO{xk-G}k9WG9>YIP1#Kks*M&wTqhhfntp z{mnjx}rVxK_3q>ur(GeyAa`iY)9PDs0X{I!m+IFJx9y3w|f*XOf=Pf9G04VwV>!$eb&UXU7NP86Mdi2 zcQQNQ_=%mt$xNf{Tass2t$F|W{*s&D7rro?c%?H`X=?3?+{~Ga(nO8C*Cj`_c1nJe zHt>G4_~C?_DLL&rM|&LJ{8GNFv2$7O#LE%)bbjwxxG6Ev%ct>#kY}+`$H%Dj&#U=8 zi<9QRY|DJAoqGM|NrU^*ZPq{PFBLU$w&rGj(9+~@`IGCx@4TK>{lc~b>!jLK z%Zh1^*F!}%E<6yFxOhpDjIdVQhLwj7dWxpb34gd~QBrq%?!D?3Z>_QqOPkh5{LdCO zzY+eOaU!S8ZU56rM~lw#9=1>UexE}o|4`tAdXHLOtsh|tJ3POJ>Wa%$pFUIkcgyvB zo;_|agCwWM_TGLUvMRIxv*`A$pEc7~UrqW^vg#-Em!RNT^XytqFVd-ZFV1!937r4q zeT;wBj|GR``JR>eaNvaaGFSamzqof<*_v|MOYD5fnz!Z{+jFxiQrp*0bo1XDEzY~D zNc;JWr80Nxm-w4p7ntE;YE~;8VIP0TZ%(h&>pRTH z?>*C-E@@x(UoIDTna;7s#`Qya%ccE_ zTiV6u%~RatwEUEu(o1`RyUsb&d6-!EnD{Q=a8@WRx$r)c$-RE%&1D8%t1W!hvqWW> zC6>&b7rDoC+M5bSU5-n4&goh0u9tZE{=V~TJEQ*rOxG{Eoju{PeAO*EA@6)e)r+?c zdrUI>C!9HWi+{|>*u*YGJ9`QFc)`!K6_;Rl}m zkHfF;elDN+OvhAWJ%Qv>adSrBOxs+0h{X$KjM_e0cC|Nqzt&R$}UF%unkUr;;8B3hP zqJ*f9`jz7APEJ^N`5~`;T=$%UyvLzkw*D8U)wUfubs|{iZ+5ub>VRL5?@d)-!r%SP zEc3dXw%3!p6KiIAYHz*U{=?(eQQLjuDsBm3ng@NRgruo<&$iIJt)(&fSbefcRobfl zZ`VF3$o!Q@E<87X<(bUF)VyqSmtYMCh~|)b4B}6ID`(1Nm@`>L-T_3V$?Jotw{kL* zH_J;hH7}cdPTrOiRQ7_KZj(h6JQP4Yl#&?Q{sU1<8a-Gi^E1j$o~a-N(!EwehG`1d zWPV2R$@)_4lV2(bgGB!+$S`U0Lq*vpTPlLp`YOsWEf discover(){ List list = client.discoverHosts(Vars.port, 5000); + ObjectSet hostnames = new ObjectSet<>(); Array
    result = new Array<>(); for(InetAddress a : list){ - result.add(new Address(a.getHostName(), a.getHostAddress())); + if(!hostnames.contains(a.getHostName())) + result.add(new Address(a.getCanonicalHostName(), a.getHostAddress())); + hostnames.add(a.getHostName()); } return result; From d5d03dd7591a4695531d70aa038c3734294feb8b Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 1 Jan 2018 22:50:56 -0500 Subject: [PATCH 12/12] Added a basic crash reporter --- .gitignore | 1 + .../mindustry/desktop/DesktopLauncher.java | 32 +++++++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index eef26a8b5e..c47b756d8a 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,7 @@ *.war *.ear hs_err_pid* +crash-report-* ## Robovm /ios/robovm-build/ diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java index 40efec90c8..8c6ebfd9c6 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java @@ -10,10 +10,15 @@ import io.anuke.mindustry.Vars; import io.anuke.mindustry.io.PlatformFunction; import io.anuke.mindustry.net.Net; import io.anuke.ucore.scene.ui.TextField; +import io.anuke.ucore.util.Strings; +import javax.swing.*; import java.awt.*; +import java.io.File; import java.io.IOException; import java.net.URI; +import java.nio.file.Files; +import java.nio.file.Paths; import java.text.DateFormat; import java.text.NumberFormat; import java.text.SimpleDateFormat; @@ -60,7 +65,30 @@ public class DesktopLauncher { Net.setClientProvider(new KryoClient()); Net.setServerProvider(new KryoServer()); - - new Lwjgl3Application(new Mindustry(), config); + + try { + new Lwjgl3Application(new Mindustry(), config); + }catch (Exception e){ + e.printStackTrace(); + + //don't create crash logs for me, as it's expected + if(System.getProperty("user.name").equals("anuke")) return; + + String result = Strings.parseException(e, true); + boolean failed = false; + + String filename = "crash-report-" + DateFormat.getDateTimeInstance().format(new Date()) + ".txt"; + + try{ + Files.write(Paths.get(filename), result.getBytes()); + }catch (IOException i){ + i.printStackTrace(); + failed = true; + } + + JOptionPane.showMessageDialog(null, "An error has occured: \n" + result + "\n\n" + + (!failed ? "A crash report has been written to " + new File(filename).getAbsolutePath() + ".\nPlease send this file to the developer!" + : "Failed to generate crash report.\nPlease send an image of this crash log to the developer!")); + } } }