Disabled multiplayer for HTML5, net bugfixes
This commit is contained in:
@@ -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" />
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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){
|
||||||
|
|||||||
@@ -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.*/
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user