From e545b7cca79227e99629e6c43856f65826cfd7a3 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 14 Jan 2018 11:37:23 -0500 Subject: [PATCH] Fixed disconnect with many enemies and editor redo/undo bug --- build.gradle | 2 +- core/assets-raw/sprites/icon-iron.png | Bin 238 -> 303 bytes core/assets/sprites/sprites.png | Bin 81418 -> 81433 bytes .../io/anuke/mindustry/core/NetClient.java | 25 ++++++++++++---- .../io/anuke/mindustry/core/NetServer.java | 4 ++- .../anuke/mindustry/entities/TileEntity.java | 4 +++ core/src/io/anuke/mindustry/io/NetworkIO.java | 8 +++--- .../mapeditor/MapGenerateDialog.java | 2 +- .../io/anuke/mindustry/mapeditor/MapView.java | 2 +- .../mindustry/ui/dialogs/JoinDialog.java | 1 + .../mindustry/ui/fragments/HudFragment.java | 3 ++ core/src/io/anuke/mindustry/world/Block.java | 2 +- core/src/io/anuke/mindustry/world/Tile.java | 8 ++++++ .../blocks/types/distribution/Conveyor.java | 14 +++++++-- kryonet/src/io/anuke/kryonet/KryoClient.java | 16 +++++++---- .../src/io/anuke/kryonet/KryoRegistrator.java | 3 ++ kryonet/src/io/anuke/kryonet/KryoServer.java | 27 +++++++++++------- 17 files changed, 88 insertions(+), 33 deletions(-) diff --git a/build.gradle b/build.gradle index 6f767c8370..095b0e129a 100644 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,7 @@ allprojects { appName = "Mindustry" gdxVersion = '1.9.8' aiVersion = '1.8.1' - uCoreVersion = '46c6564'; + uCoreVersion = '89fa665'; } repositories { diff --git a/core/assets-raw/sprites/icon-iron.png b/core/assets-raw/sprites/icon-iron.png index f9072d1348fa7a97900ed0b07fa355f95ffc4a84..50f34510aecd5a5777346f873737736b85ca7cf4 100644 GIT binary patch delta 213 zcmaFIxSnZ(3O`$tx4R3&e-K=-clqRrigH|!82JR0C3~2SswaAC)KB+xaSV~T?AvF^ zb;v=$_5M1!gKiTW6g0|`W_oknI}og6HtSe&1+(J^o+bswQYQu9Stg3hE+5)>E49x0 z{r^fg7lw*E>zD-c%h^O<_m_qSg{LyqvQ4Z>HJNvzT$iEt`lq~E!CPWf6BW+~E!$j~ z@ltiS|2a2jDHemcPenE@_jS9!vgzkA&M6j|AHU)J<|)5Fr!urv`8nIwUkS9|b5}L? RCIbTlgQu&X%Q~loCIC6aR`&n^ delta 173 zcmZ3_^p0_YiYjM;M`SSr1Gg{;GcwGYBf-GHz+U3%>&pI+OG1c2KBl^U@5E@0+6+$@ z#}J9jx&4l!u8JJ2?C1Rx8GMuFZ%Z8FX`8@s<-yty8-8qVVbpu{j^R$V?1JxlDs>l4 zHm|6hcIw{k&n+|e<}$E4gs$BBZ|W%t=S@>w89FEY49V{0h+%j(XHIdPL1^k))%V>B c-Ur#YaG7neU0b@Gfq{X+)78&qol`;+09@cgQ~&?~ diff --git a/core/assets/sprites/sprites.png b/core/assets/sprites/sprites.png index 54ab64069c7b0b648b2809a7b797d921749c58ba..33fc2eeb0cd26ea60dcc6f874b52625ef5822206 100644 GIT binary patch delta 15663 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 packet.enemyStart ? "(enemy)" : "(player)")); if(!requests.contains(id)){ requests.add(id); Gdx.app.error("Mindustry", "Sending entity request: " + id); @@ -150,7 +151,11 @@ public class NetClient extends Module { }); Net.handle(PlacePacket.class, packet -> { - Gdx.app.postRunnable(() -> Vars.control.input.placeBlockInternal(packet.x, packet.y, Block.getByID(packet.block), packet.rotation, true, false)); + Gdx.app.postRunnable(() ->{ + Recipe recipe = Recipes.getByResult(Block.getByID(packet.block)); + if(recipe != null) Vars.control.removeItems(recipe.requirements); + Vars.control.input.placeBlockInternal(packet.x, packet.y, Block.getByID(packet.block), packet.rotation, true, false); + }); }); Net.handle(BreakPacket.class, packet -> { @@ -229,8 +234,9 @@ public class NetClient extends Module { Gdx.app.postRunnable(() -> { try { - long timestamp = stream.readLong(); - float elapsed = TimeUtils.timeSinceMillis(timestamp) / 1000f * 60f; + + float time = stream.readFloat(); + float elapsed = Timers.time() - time; while (stream.available() > 0) { int pos = stream.readInt(); @@ -241,10 +247,13 @@ public class NetClient extends Module { byte times = stream.readByte(); for (int i = 0; i < times; i++) { - tile.entity.timer.getTimes()[i] = stream.readFloat() + elapsed; + tile.entity.timer.getTimes()[i] = stream.readFloat(); } - tile.entity.read(stream); + short data = stream.readShort(); + tile.setPackedData(data); + + tile.entity.readNetwork(stream, elapsed); } } catch (IOException e) { throw new RuntimeException(e); @@ -325,6 +334,10 @@ public class NetClient extends Module { } } + public void beginConnecting(){ + connecting = true; + } + public void disconnectQuietly(){ kicked = true; Net.disconnect(); diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index 436577b14b..b2c982a908 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -336,7 +336,7 @@ public class NetServer extends Module{ try { DataOutputStream stream = new DataOutputStream(bs); - stream.writeLong(TimeUtils.millis()); + stream.writeFloat(Timers.time()); for (int rx = -viewx / 2; rx <= viewx / 2; rx++) { for (int ry = -viewy / 2; ry <= viewy / 2; ry++) { @@ -359,6 +359,8 @@ public class NetServer extends Module{ stream.writeFloat(tile.entity.timer.getTimes()[i]); } + stream.writeShort(tile.getPackedData()); + tile.entity.write(stream); } } diff --git a/core/src/io/anuke/mindustry/entities/TileEntity.java b/core/src/io/anuke/mindustry/entities/TileEntity.java index 21ea1d52b1..9d755b3116 100644 --- a/core/src/io/anuke/mindustry/entities/TileEntity.java +++ b/core/src/io/anuke/mindustry/entities/TileEntity.java @@ -53,6 +53,10 @@ public class TileEntity extends Entity{ public void read(DataInputStream stream) throws IOException{ } + + public void readNetwork(DataInputStream stream, float elapsed) throws IOException{ + read(stream); + } public void onDeath(){ onDeath(false); diff --git a/core/src/io/anuke/mindustry/io/NetworkIO.java b/core/src/io/anuke/mindustry/io/NetworkIO.java index f2e097370a..b4bffa9650 100644 --- a/core/src/io/anuke/mindustry/io/NetworkIO.java +++ b/core/src/io/anuke/mindustry/io/NetworkIO.java @@ -19,7 +19,7 @@ import io.anuke.ucore.entities.Entities; import java.io.*; public class NetworkIO { - private static final int fileVersionID = 14; + private static final int fileVersionID = 15; public static void write(int playerID, ByteArray upgrades, OutputStream os){ @@ -106,7 +106,7 @@ public class NetworkIO { } if(tile.entity != null){ - stream.writeByte(tile.getRotation()); //placerot + stream.writeShort(tile.getPackedData()); stream.writeShort(tile.entity.health); //health //items @@ -240,11 +240,11 @@ public class NetworkIO { } if(tile.entity != null){ - byte rotation = stream.readByte(); + short data = stream.readShort(); short health = stream.readShort(); tile.entity.health = health; - tile.setRotation(rotation); + tile.setPackedData(data); for(int j = 0; j < tile.entity.items.length; j ++){ tile.entity.items[j] = stream.readInt(); diff --git a/core/src/io/anuke/mindustry/mapeditor/MapGenerateDialog.java b/core/src/io/anuke/mindustry/mapeditor/MapGenerateDialog.java index 430f5fd52f..330f70b7ee 100644 --- a/core/src/io/anuke/mindustry/mapeditor/MapGenerateDialog.java +++ b/core/src/io/anuke/mindustry/mapeditor/MapGenerateDialog.java @@ -24,7 +24,7 @@ public class MapGenerateDialog extends FloatingDialog{ private boolean loading; public MapGenerateDialog(MapEditor editor) { - super("$text.generate"); + super("$text.editor.generate"); this.editor = editor; Stack stack = new Stack(); diff --git a/core/src/io/anuke/mindustry/mapeditor/MapView.java b/core/src/io/anuke/mindustry/mapeditor/MapView.java index 92abf3543e..0cc7ddabc1 100644 --- a/core/src/io/anuke/mindustry/mapeditor/MapView.java +++ b/core/src/io/anuke/mindustry/mapeditor/MapView.java @@ -143,7 +143,7 @@ public class MapView extends Element implements GestureListener{ if(op == null) op = new DrawOperation(editor.pixmap()); Pixmap next = Pixmaps.copy(editor.pixmap()); op.add(current, next); - current = next; + current = null; stack.add(op); op = null; } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java index 83c600df15..1268a261d1 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java @@ -214,6 +214,7 @@ public class JoinDialog extends FloatingDialog { Timers.runTask(2f, () -> { try{ + Vars.netClient.beginConnecting(); Net.connect(ip, port); hide(); join.hide(); diff --git a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java index 57fdbd9e2b..235f3f31f0 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java @@ -9,6 +9,7 @@ import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.net.Net; import io.anuke.ucore.core.Core; import io.anuke.ucore.core.Settings; +import io.anuke.ucore.core.Timers; import io.anuke.ucore.scene.actions.Actions; import io.anuke.ucore.scene.builders.imagebutton; import io.anuke.ucore.scene.builders.label; @@ -155,6 +156,8 @@ public class HudFragment implements Fragment{ row(); new label(() -> "[orange]noclip: " + Vars.noclip).left(); row(); + new label(() -> "[purple]time: " + (int)(Timers.time() / 10f) % 50).left(); + row(); new label("[red]DEBUG MODE").scale(0.5f).left(); }}.end(); } diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index f05756cc06..b44f173cef 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -186,7 +186,7 @@ public class Block{ i++; i %= 4; } - tile.setDump((byte)pdump); + tile.setDump(pdump); handleItem(item, tile, tile); } diff --git a/core/src/io/anuke/mindustry/world/Tile.java b/core/src/io/anuke/mindustry/world/Tile.java index e2c7d49af6..89326ca590 100644 --- a/core/src/io/anuke/mindustry/world/Tile.java +++ b/core/src/io/anuke/mindustry/world/Tile.java @@ -154,6 +154,14 @@ public class Tile{ return Bits.getRightByte(Bits.getRightByte(data)); } + public short getPackedData(){ + return data; + } + + public void setPackedData(short data){ + this.data = data; + } + public boolean passable(){ Block block = block(); Block floor = floor(); 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 0b4648fa03..fb6c983217 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 @@ -92,6 +92,8 @@ public class Conveyor extends Block{ removals.clear(); + float shift = entity.elapsed * speed; + for(int i = 0; i < entity.convey.size; i ++){ int value = entity.convey.get(i); ItemPos pos = pos1.set(value); @@ -100,7 +102,7 @@ public class Conveyor extends Block{ !(pos2.set(entity.convey.get(i + 1)).y - pos.y < itemSpace * Timers.delta()); if(canmove){ - pos.y += Math.max(speed * Timers.delta(), 1f/252f); //TODO fix precision issues when at high FPS? + pos.y += Math.max(speed * Timers.delta() + shift, 1f/252f); //TODO fix precision issues when at high FPS? pos.x = Mathf.lerpDelta(pos.x, 0, 0.06f); }else{ pos.x = Mathf.lerpDelta(pos.x, pos.seed/offsetScl, 0.1f); @@ -119,6 +121,8 @@ public class Conveyor extends Block{ } } + + entity.elapsed = 0f; entity.convey.removeAll(removals); } @@ -174,7 +178,7 @@ public class Conveyor extends Block{ */ public static class ConveyorEntity extends TileEntity{ IntArray convey = new IntArray(); - float minitem = 1; + float minitem = 1, elapsed; @Override public void write(DataOutputStream stream) throws IOException{ @@ -197,6 +201,12 @@ public class Conveyor extends Block{ sort(convey.items, convey.size); } + + @Override + public void readNetwork(DataInputStream stream, float elapsed) throws IOException{ + read(stream); + this.elapsed = elapsed; + } } private static void sort(int[] elements, int length){ diff --git a/kryonet/src/io/anuke/kryonet/KryoClient.java b/kryonet/src/io/anuke/kryonet/KryoClient.java index cb40be6af1..c429873950 100644 --- a/kryonet/src/io/anuke/kryonet/KryoClient.java +++ b/kryonet/src/io/anuke/kryonet/KryoClient.java @@ -6,6 +6,7 @@ import com.badlogic.gdx.utils.ObjectMap; import com.badlogic.gdx.utils.ObjectSet; import com.esotericsoftware.kryonet.*; import com.esotericsoftware.kryonet.FrameworkMessage.DiscoverHost; +import com.esotericsoftware.kryonet.Listener.LagListener; import com.esotericsoftware.kryonet.serialization.Serialization; import io.anuke.mindustry.Vars; import io.anuke.mindustry.net.Host; @@ -51,15 +52,15 @@ public class KryoClient implements ClientProvider{ } }; - client = new Client(); + client = new Client(8192, 2048*2); client.setDiscoveryHandler(handler); - client.addListener(new Listener(){ + Listener listener = new Listener(){ @Override public void connected (Connection connection) { Connect c = new Connect(); c.id = connection.getID(); - c.addressTCP = connection.getRemoteAddressTCP().toString(); + if(connection.getRemoteAddressTCP() != null) c.addressTCP = connection.getRemoteAddressTCP().toString(); try{ Net.handleClientReceived(c); @@ -95,9 +96,14 @@ public class KryoClient implements ClientProvider{ }); } } - } - }); + }; + + if(KryoRegistrator.fakeLag){ + client.addListener(new LagListener(0, KryoRegistrator.fakeLagAmount, listener)); + }else{ + client.addListener(listener); + } register(Registrator.getClasses()); } diff --git a/kryonet/src/io/anuke/kryonet/KryoRegistrator.java b/kryonet/src/io/anuke/kryonet/KryoRegistrator.java index a104347e3e..15aebd8ae3 100644 --- a/kryonet/src/io/anuke/kryonet/KryoRegistrator.java +++ b/kryonet/src/io/anuke/kryonet/KryoRegistrator.java @@ -9,9 +9,12 @@ import java.net.InetAddress; import java.nio.ByteBuffer; public class KryoRegistrator { + public static boolean fakeLag = true; + public static final int fakeLagAmount = 500; public static void register(Kryo kryo){ //TODO register stuff? + //Log.set(Log.LEVEL_DEBUG); } public static ByteBuffer writeServerData(){ diff --git a/kryonet/src/io/anuke/kryonet/KryoServer.java b/kryonet/src/io/anuke/kryonet/KryoServer.java index e4640427af..b01b3c4e74 100644 --- a/kryonet/src/io/anuke/kryonet/KryoServer.java +++ b/kryonet/src/io/anuke/kryonet/KryoServer.java @@ -5,6 +5,7 @@ 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.Listener.LagListener; import com.esotericsoftware.kryonet.Server; import com.esotericsoftware.kryonet.util.InputStreamSender; import io.anuke.mindustry.net.Net; @@ -23,14 +24,13 @@ import io.anuke.ucore.core.Timers; import java.io.IOException; import java.nio.ByteBuffer; -import java.util.Arrays; public class KryoServer implements ServerProvider { Server server; IntArray connections = new IntArray(); public KryoServer(){ - server = new Server(4096*2, 2048); //TODO tweak + server = new Server(4096*2, 2048*2); //TODO tweak server.setDiscoveryHandler((datagramChannel, fromAddress) -> { ByteBuffer buffer = KryoRegistrator.writeServerData(); UCore.log("Replying to discover request with buffer of size " + buffer.capacity()); @@ -39,7 +39,7 @@ public class KryoServer implements ServerProvider { return true; }); - server.addListener(new Listener(){ + Listener listener = new Listener(){ @Override public void connected (Connection connection) { @@ -81,7 +81,13 @@ public class KryoServer implements ServerProvider { //Gdx.app.postRunnable(() -> {throw new RuntimeException(e);}); } } - }); + }; + + if(KryoRegistrator.fakeLag){ + server.addListener(new LagListener(0, KryoRegistrator.fakeLagAmount, listener)); + }else{ + server.addListener(listener); + } register(Registrator.getClasses()); } @@ -93,14 +99,13 @@ public class KryoServer implements ServerProvider { @Override public void kick(int connection) { - Connection conn; - try { - conn = getByID(connection); - }catch (Exception e){ - e.printStackTrace(); + Connection conn = getByID(connection); + + if(conn == null){ connections.removeValue(connection); return; } + KickPacket p = new KickPacket(); p.reason = (byte)KickReason.kick.ordinal(); @@ -137,6 +142,7 @@ public class KryoServer implements ServerProvider { @Override public void sendStream(int id, Streamable stream) { Connection connection = getByID(id); + if(connection == null) return; connection.addListener(new InputStreamSender(stream.stream, 512) { int id; @@ -219,7 +225,6 @@ public class KryoServer implements ServerProvider { } } - throw new RuntimeException("Unable to find connection with ID " + id + "! Current connections: " - + Arrays.toString(server.getConnections())); + return null; } }