diff --git a/core/gen/com/riiablo/net/packet/d2gs/Ping.java b/core/gen/com/riiablo/net/packet/d2gs/Ping.java index 1bf7cf17..84a94d11 100644 --- a/core/gen/com/riiablo/net/packet/d2gs/Ping.java +++ b/core/gen/com/riiablo/net/packet/d2gs/Ping.java @@ -17,22 +17,26 @@ public final class Ping extends Table { public int tickCount() { int o = __offset(4); return o != 0 ? bb.getInt(o + bb_pos) : 0; } public long sendTime() { int o = __offset(6); return o != 0 ? bb.getLong(o + bb_pos) : 0L; } public long processTime() { int o = __offset(8); return o != 0 ? bb.getLong(o + bb_pos) : 0L; } + public boolean ack() { int o = __offset(10); return o != 0 ? 0!=bb.get(o + bb_pos) : false; } public static int createPing(FlatBufferBuilder builder, int tickCount, long sendTime, - long processTime) { - builder.startObject(3); + long processTime, + boolean ack) { + builder.startObject(4); Ping.addProcessTime(builder, processTime); Ping.addSendTime(builder, sendTime); Ping.addTickCount(builder, tickCount); + Ping.addAck(builder, ack); return Ping.endPing(builder); } - public static void startPing(FlatBufferBuilder builder) { builder.startObject(3); } + public static void startPing(FlatBufferBuilder builder) { builder.startObject(4); } public static void addTickCount(FlatBufferBuilder builder, int tickCount) { builder.addInt(0, tickCount, 0); } public static void addSendTime(FlatBufferBuilder builder, long sendTime) { builder.addLong(1, sendTime, 0L); } public static void addProcessTime(FlatBufferBuilder builder, long processTime) { builder.addLong(2, processTime, 0L); } + public static void addAck(FlatBufferBuilder builder, boolean ack) { builder.addBoolean(3, ack, false); } public static int endPing(FlatBufferBuilder builder) { int o = builder.endObject(); return o; diff --git a/core/src/com/riiablo/engine/client/NetworkProfiler.java b/core/src/com/riiablo/engine/client/NetworkProfiler.java index 088fffef..360068e3 100644 --- a/core/src/com/riiablo/engine/client/NetworkProfiler.java +++ b/core/src/com/riiablo/engine/client/NetworkProfiler.java @@ -49,8 +49,11 @@ public class NetworkProfiler extends IntervalBaseSystem implements Pinger.Packet } @Override - public void onPingResponse(Pinger pinger, Ping packet, long ping, long rtt) { - this.ping = ping; - this.rtt = rtt; + public void onPingResponse(Pinger pinger, Ping packet, long ping, long rtt, boolean ack) { + if (ack){ + this.ping = ping; + } else { + this.rtt = rtt; + } } } diff --git a/core/src/com/riiablo/engine/client/Pinger.java b/core/src/com/riiablo/engine/client/Pinger.java index 8b79d933..220fb366 100644 --- a/core/src/com/riiablo/engine/client/Pinger.java +++ b/core/src/com/riiablo/engine/client/Pinger.java @@ -30,8 +30,8 @@ public class Pinger extends IntervalBaseSystem { // it may be possible to use Gdx.graphics.getFrameId() -- but that isn't related to engine tick private int tick; - public long ping; - public long rtt; + private long ping; + private long rtt; public Pinger() { super(1.0f); @@ -40,7 +40,7 @@ public class Pinger extends IntervalBaseSystem { @Override protected void processSystem() { FlatBufferBuilder builder = new FlatBufferBuilder(0); - int dataOffset = Ping.createPing(builder, tick++, TimeUtils.millis(), 0); + int dataOffset = Ping.createPing(builder, tick++, TimeUtils.millis(), 0, false); int root = D2GS.createD2GS(builder, D2GSData.Ping, dataOffset); D2GS.finishSizePrefixedD2GSBuffer(builder, root); @@ -65,10 +65,11 @@ public class Pinger extends IntervalBaseSystem { } private void notifyPing(Ping packet, long ping, long rtt) { - for (PacketListener l : packetListeners) l.onPingResponse(this, packet, ping, rtt); + boolean ack = packet.ack(); + for (PacketListener l : packetListeners) l.onPingResponse(this, packet, ping, rtt, ack); } public interface PacketListener { - void onPingResponse(Pinger pinger, Ping packet, long ping, long rtt); + void onPingResponse(Pinger pinger, Ping packet, long ping, long rtt, boolean ack); } } diff --git a/core/src/com/riiablo/net/d2gs/Networking.fbs b/core/src/com/riiablo/net/d2gs/Networking.fbs index 9c37bbde..49b0e608 100644 --- a/core/src/com/riiablo/net/d2gs/Networking.fbs +++ b/core/src/com/riiablo/net/d2gs/Networking.fbs @@ -27,4 +27,5 @@ table Ping { processTime:int64; // response + ack:bool; } \ No newline at end of file diff --git a/server/d2gs/src/com/riiablo/server/d2gs/D2GS.java b/server/d2gs/src/com/riiablo/server/d2gs/D2GS.java index 3831351a..7782501f 100644 --- a/server/d2gs/src/com/riiablo/server/d2gs/D2GS.java +++ b/server/d2gs/src/com/riiablo/server/d2gs/D2GS.java @@ -537,7 +537,7 @@ public class D2GS extends ApplicationAdapter { private void Ping(Packet packet) { Ping ping = (Ping) packet.data.data(new Ping()); FlatBufferBuilder builder = new FlatBufferBuilder(0); - int dataOffset = Ping.createPing(builder, ping.tickCount(), ping.sendTime(), TimeUtils.millis() - packet.time); + int dataOffset = Ping.createPing(builder, ping.tickCount(), ping.sendTime(), TimeUtils.millis() - packet.time, false); int root = com.riiablo.net.packet.d2gs.D2GS.createD2GS(builder, D2GSData.Ping, dataOffset); com.riiablo.net.packet.d2gs.D2GS.finishSizePrefixedD2GSBuffer(builder, root); Packet response = Packet.obtain(1 << packet.id, builder.dataBuffer()); @@ -706,6 +706,19 @@ public class D2GS extends ApplicationAdapter { if (!success) { Gdx.app.log(TAG, "failed to add to queue -- closing " + socket.getRemoteAddress()); kill = true; + } else if (packet.data.dataType() == D2GSData.Ping) { + try { + Ping ping = (Ping) packet.data.data(new Ping()); + FlatBufferBuilder builder = new FlatBufferBuilder(0); + int dataOffset = Ping.createPing(builder, ping.tickCount(), ping.sendTime(), 0, true); + int root = com.riiablo.net.packet.d2gs.D2GS.createD2GS(builder, D2GSData.Ping, dataOffset); + com.riiablo.net.packet.d2gs.D2GS.finishSizePrefixedD2GSBuffer(builder, root); + Packet response = Packet.obtain(1 << packet.id, builder.dataBuffer()); + if (DEBUG_SENT_PACKETS && !ignoredPackets.get(packet.data.dataType())) Gdx.app.log(TAG, "dispatching " + D2GSData.name(packet.data.dataType()) + " ACK packet to " + String.format("0x%08X", packet.id)); + send(response); + } catch (Throwable t) { + Gdx.app.log(TAG, t.getMessage(), t); + } } } catch (Throwable t) { Gdx.app.log(TAG, t.getMessage(), t);