mirror of https://github.com/Minestom/Minestom.git
Implemented some packets + the keepalive system so the client doesn't timeout after 20 seconds
This commit is contained in:
parent
076f4d558b
commit
7f83aacdf8
|
@ -7,6 +7,7 @@ import fr.adamaq01.ozao.net.server.ServerHandler;
|
||||||
import fr.adamaq01.ozao.net.server.backend.tcp.TCPServer;
|
import fr.adamaq01.ozao.net.server.backend.tcp.TCPServer;
|
||||||
import fr.themode.minestom.net.ConnectionManager;
|
import fr.themode.minestom.net.ConnectionManager;
|
||||||
import fr.themode.minestom.net.PacketProcessor;
|
import fr.themode.minestom.net.PacketProcessor;
|
||||||
|
import fr.themode.minestom.net.packet.server.play.KeepAlivePacket;
|
||||||
import fr.themode.minestom.net.protocol.MinecraftProtocol;
|
import fr.themode.minestom.net.protocol.MinecraftProtocol;
|
||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
@ -56,6 +57,20 @@ public class Main {
|
||||||
server.bind(25565);
|
server.bind(25565);
|
||||||
System.out.println("Server started");
|
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);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,9 +7,14 @@ public class Player {
|
||||||
private double x, y, z;
|
private double x, y, z;
|
||||||
private float yaw, pitch;
|
private float yaw, pitch;
|
||||||
private boolean onGround;
|
private boolean onGround;
|
||||||
|
private long lastKeepAlive;
|
||||||
|
|
||||||
private PlayerConnection playerConnection;
|
private PlayerConnection playerConnection;
|
||||||
|
|
||||||
|
public Player(PlayerConnection playerConnection) {
|
||||||
|
this.playerConnection = playerConnection;
|
||||||
|
}
|
||||||
|
|
||||||
public PlayerConnection getPlayerConnection() {
|
public PlayerConnection getPlayerConnection() {
|
||||||
return playerConnection;
|
return playerConnection;
|
||||||
}
|
}
|
||||||
|
@ -29,4 +34,11 @@ public class Player {
|
||||||
this.onGround = onGround;
|
this.onGround = onGround;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void refreshKeepAlive(long lastKeepAlive) {
|
||||||
|
this.lastKeepAlive = lastKeepAlive;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getLastKeepAlive() {
|
||||||
|
return lastKeepAlive;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,6 @@ public class ConnectionManager {
|
||||||
|
|
||||||
// Is only used at LoginStartPacket#process
|
// Is only used at LoginStartPacket#process
|
||||||
public void createPlayer(PlayerConnection connection) {
|
public void createPlayer(PlayerConnection connection) {
|
||||||
this.connectionPlayerMap.put(connection, new Player());
|
this.connectionPlayerMap.put(connection, new Player(connection));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,4 +77,12 @@ public class PacketProcessor {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public PlayerConnection getPlayerConnection(Connection connection) {
|
||||||
|
return connectionPlayerConnectionMap.get(connection);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasPlayerConnection(Connection connection) {
|
||||||
|
return connectionPlayerConnectionMap.containsKey(connection);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,9 @@ public class ClientPlayPacketsHandler extends ClientPacketsHandler {
|
||||||
register(0x11, ClientPlayerPositionPacket.class);
|
register(0x11, ClientPlayerPositionPacket.class);
|
||||||
register(0x12, ClientPlayerPositionAndLookPacket.class);
|
register(0x12, ClientPlayerPositionAndLookPacket.class);
|
||||||
register(0x00, ClientTeleportConfirmPacket.class);
|
register(0x00, ClientTeleportConfirmPacket.class);
|
||||||
|
register(0x0F, ClientKeepAlivePacket.class);
|
||||||
|
register(0x19, ClientPlayerAbilitiesPacket.class);
|
||||||
|
register(0x13, ClientPlayerLookPacket.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue