Disabled multiplayer for HTML5, net bugfixes

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