Implemented some packets + the keepalive system so the client doesn't timeout after 20 seconds

This commit is contained in:
Adamaq01 2019-08-10 03:47:19 +01:00
parent 076f4d558b
commit 7f83aacdf8
9 changed files with 135 additions and 2 deletions

View File

@ -7,6 +7,7 @@ import fr.adamaq01.ozao.net.server.ServerHandler;
import fr.adamaq01.ozao.net.server.backend.tcp.TCPServer;
import fr.themode.minestom.net.ConnectionManager;
import fr.themode.minestom.net.PacketProcessor;
import fr.themode.minestom.net.packet.server.play.KeepAlivePacket;
import fr.themode.minestom.net.protocol.MinecraftProtocol;
import java.lang.reflect.InvocationTargetException;
@ -56,6 +57,20 @@ public class Main {
server.bind(25565);
System.out.println("Server started");
}
long lastTime = System.currentTimeMillis();
while (true) {
if (System.currentTimeMillis() - lastTime >= 50) {
lastTime = System.currentTimeMillis();
// Tick
// Keep Alive Handling
server.getConnections().stream().filter(connection -> packetProcessor.hasPlayerConnection(connection) && connectionManager.getPlayer(packetProcessor.getPlayerConnection(connection)) != null && System.currentTimeMillis() - connectionManager.getPlayer(packetProcessor.getPlayerConnection(connection)).getLastKeepAlive() > 20000).map(connection -> connectionManager.getPlayer(packetProcessor.getPlayerConnection(connection))).forEach(player -> {
long id = System.currentTimeMillis();
player.refreshKeepAlive(id);
KeepAlivePacket keepAlivePacket = new KeepAlivePacket(id);
player.getPlayerConnection().sendPacket(keepAlivePacket);
});
}
}
}
}

View File

@ -7,9 +7,14 @@ public class Player {
private double x, y, z;
private float yaw, pitch;
private boolean onGround;
private long lastKeepAlive;
private PlayerConnection playerConnection;
public Player(PlayerConnection playerConnection) {
this.playerConnection = playerConnection;
}
public PlayerConnection getPlayerConnection() {
return playerConnection;
}
@ -29,4 +34,11 @@ public class Player {
this.onGround = onGround;
}
public void refreshKeepAlive(long lastKeepAlive) {
this.lastKeepAlive = lastKeepAlive;
}
public long getLastKeepAlive() {
return lastKeepAlive;
}
}

View File

@ -19,6 +19,6 @@ public class ConnectionManager {
// Is only used at LoginStartPacket#process
public void createPlayer(PlayerConnection connection) {
this.connectionPlayerMap.put(connection, new Player());
this.connectionPlayerMap.put(connection, new Player(connection));
}
}

View File

@ -77,4 +77,12 @@ public class PacketProcessor {
break;
}
}
public PlayerConnection getPlayerConnection(Connection connection) {
return connectionPlayerConnectionMap.get(connection);
}
public boolean hasPlayerConnection(Connection connection) {
return connectionPlayerConnectionMap.containsKey(connection);
}
}

View File

@ -10,6 +10,9 @@ public class ClientPlayPacketsHandler extends ClientPacketsHandler {
register(0x11, ClientPlayerPositionPacket.class);
register(0x12, ClientPlayerPositionAndLookPacket.class);
register(0x00, ClientTeleportConfirmPacket.class);
register(0x0F, ClientKeepAlivePacket.class);
register(0x19, ClientPlayerAbilitiesPacket.class);
register(0x13, ClientPlayerLookPacket.class);
}
}

View File

@ -0,0 +1,24 @@
package fr.themode.minestom.net.packet.client.play;
import fr.adamaq01.ozao.net.Buffer;
import fr.themode.minestom.entity.Player;
import fr.themode.minestom.net.packet.client.ClientPlayPacket;
import fr.themode.minestom.net.packet.server.play.DisconnectPacket;
public class ClientKeepAlivePacket implements ClientPlayPacket {
private long id;
@Override
public void process(Player player) {
if (id != player.getLastKeepAlive()) {
player.getPlayerConnection().sendPacket(new DisconnectPacket("{\"text\": \"Bad Keep Alive packet\"}"));
player.getPlayerConnection().getConnection().close();
}
}
@Override
public void read(Buffer buffer) {
this.id = buffer.getLong();
}
}

View File

@ -0,0 +1,24 @@
package fr.themode.minestom.net.packet.client.play;
import fr.adamaq01.ozao.net.Buffer;
import fr.themode.minestom.entity.Player;
import fr.themode.minestom.net.packet.client.ClientPlayPacket;
public class ClientPlayerAbilitiesPacket implements ClientPlayPacket {
private byte flags;
private float flyingSpeed;
private float walkingSpeed;
@Override
public void process(Player player) {
}
@Override
public void read(Buffer buffer) {
this.flags = buffer.getByte();
this.flyingSpeed = buffer.getFloat();
this.walkingSpeed = buffer.getFloat();
}
}

View File

@ -0,0 +1,24 @@
package fr.themode.minestom.net.packet.server.play;
import fr.adamaq01.ozao.net.Buffer;
import fr.themode.minestom.net.packet.server.ServerPacket;
import fr.themode.minestom.utils.Utils;
public class DisconnectPacket implements ServerPacket {
private String message;
public DisconnectPacket(String message) {
this.message = message;
}
@Override
public void write(Buffer buffer) {
Utils.writeString(buffer, this.message);
}
@Override
public int getId() {
return 0x1A;
}
}

View File

@ -0,0 +1,23 @@
package fr.themode.minestom.net.packet.server.play;
import fr.adamaq01.ozao.net.Buffer;
import fr.themode.minestom.net.packet.server.ServerPacket;
public class KeepAlivePacket implements ServerPacket {
private long id;
public KeepAlivePacket(long id) {
this.id = id;
}
@Override
public void write(Buffer buffer) {
buffer.putLong(id);
}
@Override
public int getId() {
return 0x20;
}
}