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.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);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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