mirror of
https://github.com/Minestom/Minestom.git
synced 2025-03-13 15:20:10 +01:00
ServerListPingEvent
An implementation of what could be done to make this event - not perfect in my opinion.
This commit is contained in:
parent
159ff3f646
commit
cd27d1d6c7
@ -1,50 +0,0 @@
|
||||
package net.minestom.server.event.server;
|
||||
|
||||
import net.minestom.server.event.Event;
|
||||
import net.minestom.server.network.player.PlayerConnection;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
|
||||
/**
|
||||
* Called by a HandshakePacket.
|
||||
*/
|
||||
public class HandshakeEvent extends Event {
|
||||
|
||||
private final String serverAddress;
|
||||
private final int serverPort;
|
||||
private final int protocolVersion;
|
||||
private final PlayerConnection connection;
|
||||
|
||||
public HandshakeEvent(@Nullable String serverAddress, int serverPort, int protocolVersion, @NotNull PlayerConnection connection) {
|
||||
this.serverAddress = serverAddress;
|
||||
this.serverPort = serverPort;
|
||||
this.protocolVersion = protocolVersion;
|
||||
this.connection = connection;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the server address a client used to connect to the server
|
||||
*/
|
||||
public @Nullable String getServerAddress() {
|
||||
return serverAddress;
|
||||
}
|
||||
/**
|
||||
* @return the server port a client used to connect to the server
|
||||
*/
|
||||
public int getServerPort() {
|
||||
return serverPort;
|
||||
}
|
||||
/**
|
||||
* @return the protocol version a client used when connecting to the server
|
||||
*/
|
||||
public int getProtocolVersion() {
|
||||
return protocolVersion;
|
||||
}
|
||||
/**
|
||||
* @return the player connection
|
||||
*/
|
||||
public @NotNull PlayerConnection getConnection() {
|
||||
return connection;
|
||||
}
|
||||
}
|
@ -1,29 +1,23 @@
|
||||
package net.minestom.server.event.server;
|
||||
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
|
||||
import net.minestom.server.entity.Player;
|
||||
import net.minestom.server.event.CancellableEvent;
|
||||
import net.minestom.server.event.Event;
|
||||
import net.minestom.server.network.player.PlayerConnection;
|
||||
import net.minestom.server.ping.HandshakeData;
|
||||
import net.minestom.server.ping.ResponseData;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
|
||||
/**
|
||||
* Called by a StatusRequestPacket.
|
||||
* Can be used to modify the {@link ResponseData} response data.
|
||||
*/
|
||||
public class StatusRequestEvent extends Event implements CancellableEvent {
|
||||
public class ServerListPingEvent extends Event implements CancellableEvent {
|
||||
private boolean cancelled = false;
|
||||
|
||||
private final ResponseData responseData;
|
||||
private final PlayerConnection connection;
|
||||
|
||||
private boolean cancelled;
|
||||
|
||||
public StatusRequestEvent(@NotNull ResponseData responseData, @NotNull PlayerConnection connection) {
|
||||
public ServerListPingEvent(ResponseData responseData, PlayerConnection connection) {
|
||||
this.responseData = responseData;
|
||||
this.connection = connection;
|
||||
}
|
||||
@ -37,6 +31,16 @@ public class StatusRequestEvent extends Event implements CancellableEvent {
|
||||
return responseData;
|
||||
}
|
||||
|
||||
/**
|
||||
* HandshakeData of previous handshake packet
|
||||
*
|
||||
* equivalent to {@link #getConnection()#getHandshakeData()}
|
||||
* @return
|
||||
*/
|
||||
public HandshakeData getHandshakeData() {
|
||||
return connection.getHandshakeData();
|
||||
}
|
||||
|
||||
/**
|
||||
* PlayerConnection of received packet.
|
||||
*
|
||||
@ -156,4 +160,6 @@ public class StatusRequestEvent extends Event implements CancellableEvent {
|
||||
public void setFavicon(String favicon) {
|
||||
responseData.setFavicon(favicon);
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -4,13 +4,13 @@ import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import net.minestom.server.MinecraftServer;
|
||||
import net.minestom.server.entity.PlayerSkin;
|
||||
import net.minestom.server.event.server.HandshakeEvent;
|
||||
import net.minestom.server.extras.bungee.BungeeCordProxy;
|
||||
import net.minestom.server.network.ConnectionState;
|
||||
import net.minestom.server.network.packet.client.ClientPreplayPacket;
|
||||
import net.minestom.server.network.packet.server.login.LoginDisconnectPacket;
|
||||
import net.minestom.server.network.player.NettyPlayerConnection;
|
||||
import net.minestom.server.network.player.PlayerConnection;
|
||||
import net.minestom.server.ping.HandshakeData;
|
||||
import net.minestom.server.utils.binary.BinaryReader;
|
||||
import net.minestom.server.utils.binary.BinaryWriter;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@ -88,15 +88,15 @@ public class HandshakePacket implements ClientPreplayPacket {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
// Happen when a client ping the server, trigger HandshakeEvent
|
||||
MinecraftServer.getGlobalEventHandler().callEvent(HandshakeEvent.class, new HandshakeEvent(null, serverPort, protocolVersion, connection));
|
||||
// Happen when a client ping the server, ignore
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
connection.setHandshakeData(new HandshakeData(
|
||||
serverAddress, serverPort, protocolVersion
|
||||
));
|
||||
switch (nextState) {
|
||||
case 1:
|
||||
MinecraftServer.getGlobalEventHandler().callEvent(HandshakeEvent.class, new HandshakeEvent(serverAddress, serverPort, protocolVersion, connection));
|
||||
connection.setConnectionState(ConnectionState.STATUS);
|
||||
break;
|
||||
case 2:
|
||||
|
@ -2,7 +2,7 @@ package net.minestom.server.network.packet.client.status;
|
||||
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.minestom.server.MinecraftServer;
|
||||
import net.minestom.server.event.server.StatusRequestEvent;
|
||||
import net.minestom.server.event.server.ServerListPingEvent;
|
||||
import net.minestom.server.network.packet.client.ClientPreplayPacket;
|
||||
import net.minestom.server.network.packet.server.handshake.ResponsePacket;
|
||||
import net.minestom.server.network.player.PlayerConnection;
|
||||
@ -31,8 +31,8 @@ public class StatusRequestPacket implements ClientPreplayPacket {
|
||||
consumer.accept(connection, responseData);
|
||||
|
||||
// Call event
|
||||
StatusRequestEvent statusRequestEvent = new StatusRequestEvent(responseData, connection);
|
||||
MinecraftServer.getGlobalEventHandler().callEvent(StatusRequestEvent.class, statusRequestEvent);
|
||||
ServerListPingEvent statusRequestEvent = new ServerListPingEvent(responseData, connection);
|
||||
MinecraftServer.getGlobalEventHandler().callEvent(ServerListPingEvent.class, statusRequestEvent);
|
||||
|
||||
// Send packet only if event has not been cancelled
|
||||
if (!statusRequestEvent.isCancelled()) {
|
||||
|
@ -9,6 +9,7 @@ import net.minestom.server.listener.manager.ServerPacketConsumer;
|
||||
import net.minestom.server.network.ConnectionManager;
|
||||
import net.minestom.server.network.ConnectionState;
|
||||
import net.minestom.server.network.packet.server.ServerPacket;
|
||||
import net.minestom.server.ping.HandshakeData;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
@ -26,6 +27,7 @@ public abstract class PlayerConnection {
|
||||
|
||||
private Player player;
|
||||
private volatile ConnectionState connectionState;
|
||||
private HandshakeData handshakeData;
|
||||
private boolean online;
|
||||
|
||||
// Text used to kick client sending too many packets
|
||||
@ -170,6 +172,23 @@ public abstract class PlayerConnection {
|
||||
return connectionState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the HandshakeData from the most recent HandshakePacket.
|
||||
*
|
||||
* @return the most recent HandshakeData
|
||||
*/
|
||||
@Nullable
|
||||
public HandshakeData getHandshakeData() {
|
||||
return handshakeData;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the HandshakeData - usually from a HandshakePacket
|
||||
*/
|
||||
public void setHandshakeData(HandshakeData handshakeData) {
|
||||
this.handshakeData = handshakeData;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the number of packet the client sent over the last second.
|
||||
*
|
||||
|
45
src/main/java/net/minestom/server/ping/HandshakeData.java
Normal file
45
src/main/java/net/minestom/server/ping/HandshakeData.java
Normal file
@ -0,0 +1,45 @@
|
||||
package net.minestom.server.ping;
|
||||
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public final class HandshakeData {
|
||||
private final @Nullable String serverAddress;
|
||||
private final int serverPort;
|
||||
private final int protocolVersion;
|
||||
|
||||
public HandshakeData(@Nullable String serverAddress, int serverPort, int protocolVersion) {
|
||||
this.serverAddress = serverAddress;
|
||||
this.serverPort = serverPort;
|
||||
this.protocolVersion = protocolVersion;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the server address a client used to connect.
|
||||
* may be null
|
||||
* @return the server address
|
||||
*/
|
||||
public @Nullable String getServerAddress() {
|
||||
return serverAddress;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the server port a client used to connect.
|
||||
*
|
||||
* @return the server port
|
||||
*/
|
||||
public int getServerPort() {
|
||||
return serverPort;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the protocol version a client used to connect.
|
||||
*
|
||||
* @return the protocol version
|
||||
*/
|
||||
public int getProtocolVersion() {
|
||||
return protocolVersion;
|
||||
}
|
||||
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user