Skip to content

Commit

Permalink
Forcibly disconnect players even if no server target was set in the J…
Browse files Browse the repository at this point in the history
…avaTransferEvent
  • Loading branch information
onebeastchris committed Apr 26, 2024
1 parent 91a7460 commit f67c131
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,26 +26,36 @@
package org.geysermc.geyser.api.event.java;

import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.common.value.qual.IntRange;
import org.geysermc.geyser.api.connection.GeyserConnection;
import org.geysermc.geyser.api.event.connection.ConnectionEvent;

import java.util.Map;

/**
* Fired when the Java server sends a transfer request to a different Java server.
* Geyser Extensions can listen to this event and set a target server ip/port for Bedrock players to be transferred to.
*/
public class ServerTransferEvent extends ConnectionEvent {

private final String host;
private final int port;
private String bedrockHost;
private int bedrockPort;
private final Map<String, byte[]> cookies;

public ServerTransferEvent(@NonNull GeyserConnection connection, String host, int port, Map<String, byte[]> cookies) {
super(connection);
this.host = host;
this.port = port;
this.cookies = cookies;
this.bedrockHost = null;
this.bedrockPort = -1;
}

/**
* The host that the Java server requests a transfer to.
*
* @return the host
*/
public String host() {
Expand All @@ -54,14 +64,56 @@ public String host() {

/**
* The port that the Java server requests a transfer to.
*
* @return the port
*/
public int port() {
return this.port;
}

/**
* The host that the Bedrock player should try and connect to.
* If this is not set, the Bedrock player will just be disconnected.
*
* @return the host where the Bedrock client will be transferred to, or null if not set.
*/
public String bedrockHost() {
return this.bedrockHost;
}

/**
* The port that the Bedrock player should try and connect to.
* If this is not set, the Bedrock player will just be disconnected.
*
* @return the port where the Bedrock client will be transferred to, or -1 if not set.
*/
public int bedrockPort() {
return this.bedrockPort;
}

/**
* Sets the host for the Bedrock player to be transferred to
*/
public void bedrockHost(@NonNull String host) {
if (host == null || host.isBlank()) {
throw new IllegalArgumentException("Server address cannot be null or blank");
}
this.bedrockHost = host;
}

/**
* Sets the port for the Bedrock player to be transferred to
*/
public void bedrockPort(@IntRange(from = 0, to = 65535) int port) {
if (port < 0 || port > 65535) {
throw new IllegalArgumentException("Server port must be between 0 and 65535, was " + port);
}
this.bedrockPort = port;
}

/**
* Gets a map of the sessions current cookies.
*
* @return the connections cookies
*/
public @NonNull Map<String, byte[]> cookies() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,11 @@

import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.translator.protocol.PacketTranslator;
import org.geysermc.geyser.translator.protocol.Translator;
import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ClientboundCookieRequestPacket;
import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ServerboundCookieResponsePacket;

@Translator(packet = ClientboundCookieRequestPacket.class)
public class JavaCookieRequestTranslator extends PacketTranslator<ClientboundCookieRequestPacket> {
@Override
public void translate(GeyserSession session, ClientboundCookieRequestPacket packet) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,10 @@

import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.translator.protocol.PacketTranslator;
import org.geysermc.geyser.translator.protocol.Translator;
import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ClientboundStoreCookiePacket;

@Translator(packet = ClientboundStoreCookiePacket.class)
public class JavaStoreCookieTranslator extends PacketTranslator<ClientboundStoreCookiePacket> {
@Override
public void translate(GeyserSession session, ClientboundStoreCookiePacket packet) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,27 @@
import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.api.event.java.ServerTransferEvent;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.text.MinecraftLocale;
import org.geysermc.geyser.translator.protocol.PacketTranslator;
import org.geysermc.geyser.translator.protocol.Translator;
import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ClientboundTransferPacket;

@Translator(packet = ClientboundTransferPacket.class)
public class JavaTransferPacketTranslator extends PacketTranslator<ClientboundTransferPacket> {
@Override
public void translate(GeyserSession session, ClientboundTransferPacket packet) {
GeyserImpl.getInstance().eventBus().fire(new ServerTransferEvent(
ServerTransferEvent event = new ServerTransferEvent(
session,
packet.getHost(),
packet.getPort(),
session.getCookies()));
session.getCookies());

GeyserImpl.getInstance().eventBus().fire(event);

if (event.bedrockHost() != null && !event.bedrockHost().isBlank() && event.bedrockPort() != -1) {
session.transfer(event.bedrockHost(), event.bedrockPort());
} else {
session.disconnect(MinecraftLocale.getLocaleString("disconnect.transfer", session.locale()));
}
}
}

0 comments on commit f67c131

Please sign in to comment.