9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-31 12:56:28 +00:00

修复网络状态切换

This commit is contained in:
jhqwqmc
2025-12-29 22:03:13 +08:00
parent a4f184bd21
commit 90f264c9a2
11 changed files with 234 additions and 118 deletions

View File

@@ -10,8 +10,6 @@ repositories {
dependencies {
// Platform
compileOnly("io.papermc.paper:paper-api:1.20.1-R0.1-SNAPSHOT")
// authlib
compileOnly("com.mojang:authlib:6.0.58")
}
java {

View File

@@ -1,17 +0,0 @@
package net.momirealms.craftengine.bukkit.util;
import com.mojang.authlib.GameProfile;
import java.util.UUID;
public final class LegacyAuthLibUtils {
private LegacyAuthLibUtils() {}
public static String getName(GameProfile profile) {
return profile.getName();
}
public static UUID getId(GameProfile profile) {
return profile.getId();
}
}

View File

@@ -5,7 +5,6 @@ import com.google.common.collect.Sets;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.mojang.authlib.GameProfile;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.datafixers.util.Either;
import com.mojang.serialization.DataResult;
@@ -271,22 +270,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener {
private void registerByteBufferPacketListener(final ByteBufferPacketListener listener, int id, String name, ConnectionState state, PacketFlow direction) {
if (id == -1) return;
ByteBufferPacketListenerHolder[] listeners = switch (direction) {
case SERVERBOUND -> switch (state) {
case HANDSHAKING -> c2sHandshakingPacketListeners;
case STATUS -> c2sStatusPacketListeners;
case LOGIN -> c2sLoginPacketListeners;
case PLAY -> c2sPlayPacketListeners;
case CONFIGURATION -> c2sConfigurationPacketListeners;
};
case CLIENTBOUND -> switch (state) {
case HANDSHAKING -> s2cHandshakingPacketListeners;
case STATUS -> s2cStatusPacketListeners;
case LOGIN -> s2cLoginPacketListeners;
case PLAY -> s2cPlayPacketListeners;
case CONFIGURATION -> s2cConfigurationPacketListeners;
};
};
ByteBufferPacketListenerHolder[] listeners = direction == PacketFlow.SERVERBOUND ? c2sPacketListeners[state.ordinal()] : s2cPacketListeners[state.ordinal()];
if (id < 0 || id >= listeners.length) {
throw new IllegalArgumentException("Invalid packet id: " + id);
}
@@ -412,13 +396,14 @@ public class BukkitNetworkManager implements NetworkManager, Listener {
registerNMSPacketConsumer(new ServerDataListener(), NetworkReflections.clazz$ClientboundServerDataPacket);
registerNMSPacketConsumer(new ChatSessionUpdateListener(), NetworkReflections.clazz$ServerboundChatSessionUpdatePacket);
registerNMSPacketConsumer(new PlayerChatListener(), NetworkReflections.clazz$ClientboundPlayerChatPacket);
registerNMSPacketConsumer(new LoginAcknowledgedListener(), NetworkReflections.clazz$ServerboundLoginAcknowledgedPacket);
registerNMSPacketConsumer(new ConfigurationAcknowledgedListener(), NetworkReflections.clazz$ServerboundConfigurationAcknowledgedPacket);
registerNMSPacketConsumer(new C2SFinishConfigurationListener(), NetworkReflections.clazz$ServerboundFinishConfigurationPacket);
registerNMSPacketConsumer(new S2CFinishConfigurationListener(), NetworkReflections.clazz$ClientboundFinishConfigurationPacket);
registerNMSPacketConsumer(new LoginFinishedListener(), NetworkReflections.clazz$ClientboundLoginFinishedPacket);
registerNMSPacketConsumer(new StartConfigurationListener(), NetworkReflections.clazz$ClientboundStartConfigurationPacket);
registerByteBufferPacketListener(new IntentionListener(), this.packetIds.clientIntentionPacket(), "ClientIntentionPacket", ConnectionState.HANDSHAKING, PacketFlow.SERVERBOUND);
registerByteBufferPacketListener(new C2SFinishConfigurationListener(), this.packetIds.serverboundFinishConfigurationPacket(), "ServerboundFinishConfigurationPacket", ConnectionState.CONFIGURATION, PacketFlow.SERVERBOUND); // 1.20.2+ c2s to play (configuration)
registerByteBufferPacketListener(new ByteBufferLoginListener(), this.packetIds.clientboundLoginPacket(), "ClientboundLoginPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); // 1.20.2+ c2s to play (configuration -> play)
registerByteBufferPacketListener(new LoginAcknowledgedListener(), this.packetIds.serverboundLoginAcknowledgedPacket(), "ServerboundLoginAcknowledgedPacket", ConnectionState.LOGIN, PacketFlow.SERVERBOUND); // 1.20.2+ to configuration (login)
registerByteBufferPacketListener(new LoginFinishedListener(), this.packetIds.clientboundLoginFinishedPacket(), "ClientboundLoginFinishedPacket", ConnectionState.LOGIN, PacketFlow.CLIENTBOUND); // 1.20.1 to play (login)
registerByteBufferPacketListener(new StartConfigurationListener(), this.packetIds.clientboundStartConfigurationPacket(), "ClientboundStartConfigurationPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); // 1.20.2+ s2c to configuration (play)
registerByteBufferPacketListener(new ConfigurationAcknowledgedListener(), this.packetIds.serverboundConfigurationAcknowledgedPacket(), "ServerboundConfigurationAcknowledgedPacket", ConnectionState.PLAY, PacketFlow.SERVERBOUND); // 1.20.2+ c2s to configuration (play)
registerByteBufferPacketListener(new IntentionListener(), this.packetIds.clientIntentionPacket(), "ClientIntentionPacket", ConnectionState.HANDSHAKING, PacketFlow.SERVERBOUND); // to status or login (handshaking)
registerByteBufferPacketListener(new StatusResponseListener(), this.packetIds.clientboundStatusResponsePacket(), "ClientboundStatusResponsePacket", ConnectionState.STATUS, PacketFlow.CLIENTBOUND);
registerByteBufferPacketListener(new ForgetLevelChunkListener(), this.packetIds.clientboundForgetLevelChunkPacket(), "ClientboundForgetLevelChunkPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND);
registerByteBufferPacketListener(new SetScoreListener1_20_3(), VersionHelper.isOrAbove1_20_3() ? this.packetIds.clientboundSetScorePacket() : -1, "ClientboundSetScorePacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND);
@@ -1035,10 +1020,11 @@ public class BukkitNetworkManager implements NetworkManager, Listener {
}
}
// outbound(encode|s2c)
protected void handleS2CByteBufPacket(NetWorkUser user, ByteBufPacketEvent event) {
int packetID = event.packetID();
ByteBufferPacketListenerHolder[] listener = s2cPacketListeners[user.encoderState().ordinal()];
if (packetID >= listener.length) { // fixme 为什么会这样
if (packetID >= listener.length) {
this.plugin.logger().warn(
"Failed to map the Packet ID " + packetID + " to a PacketType constant. " +
"Bound: CLIENT, Connection state: " + user.encoderState() + ", " +
@@ -1057,13 +1043,14 @@ public class BukkitNetworkManager implements NetworkManager, Listener {
}
}
// inbound(decode|c2s)
protected void handleC2SByteBufPacket(NetWorkUser user, ByteBufPacketEvent event) {
int packetID = event.packetID();
ByteBufferPacketListenerHolder[] listener = c2sPacketListeners[user.decoderState().ordinal()];
if (packetID >= listener.length) { // fixme 为什么会这样
if (packetID >= listener.length) {
this.plugin.logger().warn(
"Failed to map the Packet ID " + packetID + " to a PacketType constant. " +
"Bound: SERVER, Connection state: " + user.encoderState() + ", " +
"Bound: SERVER, Connection state: " + user.decoderState() + ", " +
"Server version: " + VersionHelper.MINECRAFT_VERSION.version(),
new Throwable()
);
@@ -1965,17 +1952,14 @@ public class BukkitNetworkManager implements NetworkManager, Listener {
if (!VersionHelper.isOrAbove1_20_2() || !Config.sendPackOnJoin()) {
// 防止后期调试进配置阶段造成问题
user.setShouldProcessFinishConfiguration(false);
user.setEncoderState(ConnectionState.PLAY);
return;
}
if (!user.shouldProcessFinishConfiguration()) {
user.setEncoderState(ConnectionState.PLAY);
return;
}
Object packetListener = FastNMS.INSTANCE.method$Connection$getPacketListener(user.connection());
if (!CoreReflections.clazz$ServerConfigurationPacketListenerImpl.isInstance(packetListener)) {
user.setEncoderState(ConnectionState.PLAY);
return;
}
@@ -2014,55 +1998,50 @@ public class BukkitNetworkManager implements NetworkManager, Listener {
// 请求资源包
ResourcePackHost host = CraftEngine.instance().packManager().resourcePackHost();
host.requestResourcePackDownloadLink(user.uuid()).whenComplete((dataList, t) -> {
Queue<Object> configurationTasks;
try {
Queue<Object> configurationTasks;
try {
configurationTasks = (Queue<Object>) CoreReflections.methodHandle$ServerConfigurationPacketListenerImpl$configurationTasksGetter.invokeExact(packetListener);
} catch (Throwable e) {
CraftEngine.instance().logger().warn("Failed to get configuration tasks for player " + user.name(), e);
FastNMS.INSTANCE.method$ServerConfigurationPacketListenerImpl$returnToWorld(packetListener);
return;
}
if (t != null) {
CraftEngine.instance().logger().warn("Failed to get pack data for player " + user.name(), t);
returnToWorld(user, configurationTasks, packetListener);
return;
}
if (dataList.isEmpty()) {
returnToWorld(user, configurationTasks, packetListener);
return;
}
// 向配置阶段连接的任务重加入资源包的任务
for (ResourcePackDownloadData data : dataList) {
configurationTasks.add(FastNMS.INSTANCE.constructor$ServerResourcePackConfigurationTask(ResourcePackUtils.createServerResourcePackInfo(data.uuid(), data.url(), data.sha1())));
user.addResourcePackUUID(data.uuid());
}
// 最后再加入一个 JoinWorldTask 并开始资源包任务
returnToWorld(user, configurationTasks, packetListener);
} finally {
user.setEncoderState(ConnectionState.PLAY);
configurationTasks = (Queue<Object>) CoreReflections.methodHandle$ServerConfigurationPacketListenerImpl$configurationTasksGetter.invokeExact(packetListener);
} catch (Throwable e) {
CraftEngine.instance().logger().warn("Failed to get configuration tasks for player " + user.name(), e);
FastNMS.INSTANCE.method$ServerConfigurationPacketListenerImpl$returnToWorld(packetListener);
return;
}
if (t != null) {
CraftEngine.instance().logger().warn("Failed to get pack data for player " + user.name(), t);
returnToWorld(user, configurationTasks, packetListener);
return;
}
if (dataList.isEmpty()) {
returnToWorld(user, configurationTasks, packetListener);
return;
}
// 向配置阶段连接的任务重加入资源包的任务
for (ResourcePackDownloadData data : dataList) {
configurationTasks.add(FastNMS.INSTANCE.constructor$ServerResourcePackConfigurationTask(ResourcePackUtils.createServerResourcePackInfo(data.uuid(), data.url(), data.sha1())));
user.addResourcePackUUID(data.uuid());
}
// 最后再加入一个 JoinWorldTask 并开始资源包任务
returnToWorld(user, configurationTasks, packetListener);
});
}
}
public static class LoginFinishedListener implements NMSPacketListener {
public static class LoginFinishedListener implements ByteBufferPacketListener {
@Override
public void onPacketSend(NetWorkUser user, NMSPacketEvent event, Object packet) {
if (VersionHelper.isOrAbove1_20_2()) {
user.setEncoderState(ConnectionState.CONFIGURATION);
} else {
public void onPacketSend(NetWorkUser user, ByteBufPacketEvent event) {
if (!VersionHelper.isOrAbove1_20_2()) {
/*
发送这个包以后在1.20.1会从login切换到play
1. send ClientboundGameProfilePacket
2. placeNewPlayer 在 ServerLoginPacketListenerImpl
3. new ServerGamePacketListenerImpl 在 PlayerList 的 placeNewPlayer
*/
user.setConnectionState(ConnectionState.PLAY);
}
GameProfile gameProfile = FastNMS.INSTANCE.field$ClientboundLoginFinishedPacket$gameProfile(packet);
if (VersionHelper.isOrAbove1_21_9()) {
user.setVerifiedName(gameProfile.name());
user.setVerifiedUUID(gameProfile.id());
} else {
user.setVerifiedName(LegacyAuthLibUtils.getName(gameProfile));
user.setVerifiedUUID(LegacyAuthLibUtils.getId(gameProfile));
}
FriendlyByteBuf buffer = event.getBuffer();
user.setVerifiedUUID(buffer.readUUID());
user.setVerifiedName(buffer.readUtf(16));
}
}
@@ -2105,35 +2084,97 @@ public class BukkitNetworkManager implements NetworkManager, Listener {
}
}
public static class LoginAcknowledgedListener implements NMSPacketListener {
public static class LoginAcknowledgedListener implements ByteBufferPacketListener {
@Override
public void onPacketReceive(NetWorkUser user, NMSPacketEvent event, Object packet) {
user.setDecoderState(ConnectionState.CONFIGURATION);
public void onPacketReceive(NetWorkUser user, ByteBufPacketEvent event) {
/*
1.20.2+
1. receive ServerboundLoginAcknowledgedPacket
2. new ServerConfigurationPacketListenerImpl 然后直接 startConfiguration
3. send ClientboundCustomPayloadPacket(BrandPayload) to client
1.20.5+
1. receive ServerboundLoginAcknowledgedPacket
2. set outbound(encode|s2c) to configuration
3. set inbound(decode|c2s) to configuration
4. startConfiguration
5. send ClientboundCustomPayloadPacket(BrandPayload) to client
*/
user.setConnectionState(ConnectionState.CONFIGURATION);
}
}
public static class ConfigurationAcknowledgedListener implements NMSPacketListener {
public static class C2SFinishConfigurationListener implements ByteBufferPacketListener {
@Override
public void onPacketReceive(NetWorkUser user, NMSPacketEvent event, Object packet) {
user.setDecoderState(ConnectionState.CONFIGURATION);
public void onPacketReceive(NetWorkUser user, ByteBufPacketEvent event) {
/*
1.20.2+
1. receive ServerboundFinishConfigurationPacket
2. placeNewPlayer
3. new ServerGamePacketListenerImpl 在 PlayerList
4. send ClientboundLoginPacket to client
1.20.5+
1. receive ServerboundFinishConfigurationPacket
2. set outbound(encode|s2c) to play
3. placeNewPlayer
4. set inbound(decode|c2s) to play
5. send ClientboundLoginPacket to client
*/
user.setEncoderState(ConnectionState.PLAY);
}
}
public static class C2SFinishConfigurationListener implements NMSPacketListener {
public static class ByteBufferLoginListener implements ByteBufferPacketListener {
@Override
public void onPacketReceive(NetWorkUser user, NMSPacketEvent event, Object packet) {
user.setDecoderState(ConnectionState.PLAY);
public void onPacketSend(NetWorkUser user, ByteBufPacketEvent event) {
if (VersionHelper.isOrAbove1_20_2()) {
/*
1.20.2+
1. send ClientboundLoginPacket to client
1.20.5+
1. set inbound(decode|c2s) to play
2. send ClientboundLoginPacket to client
*/
user.setDecoderState(ConnectionState.PLAY);
}
}
}
public static class StartConfigurationListener implements NMSPacketListener {
public static class ConfigurationAcknowledgedListener implements ByteBufferPacketListener {
@Override
public void onPacketSend(NetWorkUser user, NMSPacketEvent event, Object packet) {
user.setEncoderState(ConnectionState.CONFIGURATION);
public void onPacketReceive(NetWorkUser user, ByteBufPacketEvent event) {
/*
1.20.2+
1. receive ServerboundConfigurationAcknowledgedPacket
2. setListener ServerConfigurationPacketListenerImpl
1.20.5+
1. receive ServerboundConfigurationAcknowledgedPacket
2. set inbound(decode|c2s) to configuration
*/
user.setDecoderState(ConnectionState.CONFIGURATION); // in
}
}
public static class StartConfigurationListener implements ByteBufferPacketListener {
@Override
public void onPacketSend(NetWorkUser user, ByteBufPacketEvent event) {
/*
1.20.2+
1. send ClientboundStartConfigurationPacket
1.20.5+
1. send ClientboundStartConfigurationPacket
2. set outbound(encode|s2c) to configuration
*/
user.setEncoderState(ConnectionState.CONFIGURATION); // out
}
}
@@ -2155,11 +2196,11 @@ public class BukkitNetworkManager implements NetworkManager, Listener {
};
} catch (Throwable e) { // 客户端乱发包
Debugger.COMMON.warn(() -> "Failed to read intention packet", e);
user.forceDisconnect();
user.kick(null);
return;
}
if (nextState == null) { // 如果乱发包直接强行断开连接
user.forceDisconnect();
user.kick(null);
return;
}
if (BukkitNetworkManager.instance.hasViaVersion) {
@@ -2169,6 +2210,9 @@ public class BukkitNetworkManager implements NetworkManager, Listener {
}
}
user.setProtocolVersion(ProtocolVersion.getById(protocolVersion));
/*
1.20+ 直接切换
*/
user.setConnectionState(nextState);
}
}

View File

@@ -81,4 +81,16 @@ public interface PacketIds {
int clientIntentionPacket();
int clientboundStatusResponsePacket();
int serverboundFinishConfigurationPacket();
int clientboundLoginPacket();
int clientboundLoginFinishedPacket();
int serverboundLoginAcknowledgedPacket();
int clientboundStartConfigurationPacket();
int serverboundConfigurationAcknowledgedPacket();
}

View File

@@ -28,6 +28,9 @@ public final class PacketIdHelper {
}
public static int byClazz(Class<?> clazz, PacketFlow direction, ConnectionState state) {
if (clazz == null) {
return -1;
}
return byClazz.getOrDefault(state, Map.of()).getOrDefault(direction, Map.of()).getOrDefault(clazz, -1);
}
}

View File

@@ -206,4 +206,34 @@ public class PacketIds1_20 implements PacketIds {
public int clientboundStatusResponsePacket() {
return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundStatusResponsePacket, PacketFlow.CLIENTBOUND, ConnectionState.STATUS);
}
@Override
public int serverboundFinishConfigurationPacket() {
return PacketIdHelper.byClazz(NetworkReflections.clazz$ServerboundFinishConfigurationPacket, PacketFlow.SERVERBOUND, ConnectionState.CONFIGURATION);
}
@Override
public int clientboundLoginPacket() {
return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundLoginPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY);
}
@Override
public int clientboundLoginFinishedPacket() {
return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundLoginFinishedPacket, PacketFlow.CLIENTBOUND, ConnectionState.LOGIN);
}
@Override
public int serverboundLoginAcknowledgedPacket() {
return PacketIdHelper.byClazz(NetworkReflections.clazz$ServerboundLoginAcknowledgedPacket, PacketFlow.SERVERBOUND, ConnectionState.LOGIN);
}
@Override
public int clientboundStartConfigurationPacket() {
return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundStartConfigurationPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY);
}
@Override
public int serverboundConfigurationAcknowledgedPacket() {
return PacketIdHelper.byClazz(NetworkReflections.clazz$ServerboundConfigurationAcknowledgedPacket, PacketFlow.SERVERBOUND, ConnectionState.PLAY);
}
}

View File

@@ -1,8 +1,10 @@
package net.momirealms.craftengine.bukkit.plugin.network.id;
import net.momirealms.craftengine.bukkit.plugin.network.PacketIds;
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.NetworkReflections;
import net.momirealms.craftengine.core.plugin.network.ConnectionState;
import net.momirealms.craftengine.core.plugin.network.PacketFlow;
import net.momirealms.craftengine.core.util.VersionHelper;
public class PacketIds1_20_5 implements PacketIds {
@@ -205,4 +207,34 @@ public class PacketIds1_20_5 implements PacketIds {
public int clientboundStatusResponsePacket() {
return PacketIdHelper.byName("minecraft:status_response", PacketFlow.CLIENTBOUND, ConnectionState.STATUS);
}
@Override
public int serverboundFinishConfigurationPacket() {
return PacketIdHelper.byName("minecraft:finish_configuration", PacketFlow.SERVERBOUND, ConnectionState.CONFIGURATION);
}
@Override
public int clientboundLoginPacket() {
return PacketIdHelper.byName("minecraft:login", PacketFlow.CLIENTBOUND, ConnectionState.PLAY);
}
@Override
public int clientboundLoginFinishedPacket() {
return PacketIdHelper.byName(VersionHelper.isOrAbove1_21_2() ? "minecraft:login_finished" : "minecraft:game_profile", PacketFlow.CLIENTBOUND, ConnectionState.LOGIN);
}
@Override
public int serverboundLoginAcknowledgedPacket() {
return PacketIdHelper.byName("minecraft:login_acknowledged", PacketFlow.SERVERBOUND, ConnectionState.LOGIN);
}
@Override
public int clientboundStartConfigurationPacket() {
return PacketIdHelper.byName("minecraft:start_configuration", PacketFlow.CLIENTBOUND, ConnectionState.PLAY);
}
@Override
public int serverboundConfigurationAcknowledgedPacket() {
return PacketIdHelper.byName("minecraft:configuration_acknowledged", PacketFlow.SERVERBOUND, ConnectionState.PLAY);
}
}

View File

@@ -1817,4 +1817,15 @@ public final class NetworkReflections {
),
VersionHelper.isOrAbove1_20_2()
);
public static final Class<?> clazz$ClientboundLoginDisconnectPacket = requireNonNull(
BukkitReflectionUtils.findReobfOrMojmapClass(
"network.protocol.login.PacketLoginOutDisconnect",
"network.protocol.login.ClientboundLoginDisconnectPacket"
)
);
public static final Constructor<?> constructor$ClientboundLoginDisconnectPacket = requireNonNull(
ReflectionUtils.getDeclaredConstructor(clazz$ClientboundLoginDisconnectPacket, CoreReflections.clazz$Component)
);
}

View File

@@ -41,6 +41,7 @@ import net.momirealms.craftengine.core.plugin.context.CooldownData;
import net.momirealms.craftengine.core.plugin.entityculling.CullingData;
import net.momirealms.craftengine.core.plugin.entityculling.EntityCulling;
import net.momirealms.craftengine.core.plugin.locale.TranslationManager;
import net.momirealms.craftengine.core.plugin.logger.Debugger;
import net.momirealms.craftengine.core.plugin.network.ConnectionState;
import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler;
import net.momirealms.craftengine.core.plugin.network.ProtocolVersion;
@@ -94,8 +95,8 @@ public class BukkitServerPlayer extends Player {
private UUID uuid;
private boolean isNameVerified;
private boolean isUUIDVerified;
private ConnectionState decoderState;
private ConnectionState encoderState;
private ConnectionState decoderState; // inbound(decode|c2s)
private ConnectionState encoderState; // outbound(encode|s2c)
private boolean shouldProcessFinishConfiguration = true;
private final Set<UUID> resourcePackUUID = Collections.synchronizedSet(new HashSet<>());
// some references
@@ -493,9 +494,18 @@ public class BukkitServerPlayer extends Player {
}
@Override
public void kick(Component message) {
public void kick(@Nullable Component message) {
Object reason = message != null ? ComponentUtils.adventureToMinecraft(message) : null;
if (this.encoderState == ConnectionState.HANDSHAKING || this.encoderState == ConnectionState.STATUS) {
FastNMS.INSTANCE.method$Connection$disconnect(this.connection(), reason);
return;
}
try {
Object reason = ComponentUtils.adventureToMinecraft(message);
if (this.encoderState == ConnectionState.LOGIN) {
this.sendPacket(NetworkReflections.constructor$ClientboundLoginDisconnectPacket.newInstance(reason), false);
FastNMS.INSTANCE.method$Connection$disconnect(this.connection(), reason);
return;
}
Object kickPacket = NetworkReflections.constructor$ClientboundDisconnectPacket.newInstance(reason);
this.sendPacket(kickPacket, false, () -> FastNMS.INSTANCE.method$Connection$disconnect(this.connection(), reason));
this.nettyChannel().config().setAutoRead(false);
@@ -506,11 +516,6 @@ public class BukkitServerPlayer extends Player {
}
}
@Override
public void forceDisconnect() {
this.nettyChannel().pipeline().disconnect();
}
@Override
public ConnectionState decoderState() {
return decoderState;
@@ -534,14 +539,17 @@ public class BukkitServerPlayer extends Player {
public void setConnectionState(ConnectionState connectionState) {
this.encoderState = connectionState;
this.decoderState = connectionState;
Debugger.COMMON.warn(() -> "Set connection state to " + connectionState, new Throwable());
}
public void setDecoderState(ConnectionState decoderState) {
this.decoderState = decoderState;
Debugger.COMMON.warn(() -> "Set decoder state to " + decoderState, new Throwable());
}
public void setEncoderState(ConnectionState encoderState) {
this.encoderState = encoderState;
Debugger.COMMON.warn(() -> "Set encoder state to " + encoderState, new Throwable());
}
@Override

View File

@@ -4,6 +4,7 @@ import io.netty.channel.Channel;
import io.netty.channel.ChannelHandler;
import net.kyori.adventure.text.Component;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import org.jetbrains.annotations.Nullable;
public class FakeBukkitServerPlayer extends BukkitServerPlayer {
@@ -22,11 +23,7 @@ public class FakeBukkitServerPlayer extends BukkitServerPlayer {
}
@Override
public void kick(Component message) {
}
@Override
public void forceDisconnect() {
public void kick(@Nullable Component message) {
}
@Override

View File

@@ -56,9 +56,7 @@ public interface NetWorkUser {
void sendCustomPayload(Key channel, byte[] data);
void kick(Component message);
void forceDisconnect();
void kick(@Nullable Component message);
void simulatePacket(Object packet);