diff --git a/sources/src/main/java/io/akarin/server/core/NetworkCloseHandler.java b/sources/src/main/java/io/akarin/server/core/NetworkCloseHandler.java new file mode 100644 index 000000000..776123493 --- /dev/null +++ b/sources/src/main/java/io/akarin/server/core/NetworkCloseHandler.java @@ -0,0 +1,21 @@ +package io.akarin.server.core; + +import io.netty.util.concurrent.Future; +import io.netty.util.concurrent.GenericFutureListener; +import net.minecraft.server.ChatComponentText; +import net.minecraft.server.NetworkManager; + +public class NetworkCloseHandler implements GenericFutureListener> { + private final NetworkManager manager; + private final ChatComponentText message; + + public NetworkCloseHandler(NetworkManager instance, ChatComponentText text) { + manager = instance; + message = text; + } + + @Override + public void operationComplete(Future future) throws Exception { + manager.close(message); + } +} diff --git a/sources/src/main/java/io/akarin/server/mixin/nsc/NonblockingServerConnection.java b/sources/src/main/java/io/akarin/server/mixin/nsc/NonblockingServerConnection.java index af54f2f03..6d4948f1d 100644 --- a/sources/src/main/java/io/akarin/server/mixin/nsc/NonblockingServerConnection.java +++ b/sources/src/main/java/io/akarin/server/mixin/nsc/NonblockingServerConnection.java @@ -7,6 +7,7 @@ import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.spigotmc.SpigotConfig; @@ -20,6 +21,7 @@ import com.google.common.collect.Lists; import io.akarin.api.internal.LocalAddress; import io.akarin.server.core.AkarinGlobalConfig; import io.akarin.server.core.ChannelAdapter; +import io.akarin.server.core.NetworkCloseHandler; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.EventLoopGroup; @@ -27,7 +29,6 @@ import io.netty.channel.ServerChannel; import io.netty.channel.epoll.Epoll; import io.netty.channel.epoll.EpollServerSocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.util.concurrent.Future; import io.netty.util.concurrent.GenericFutureListener; import net.minecraft.server.ChatComponentText; import net.minecraft.server.MinecraftServer; @@ -110,15 +111,10 @@ public abstract class NonblockingServerConnection { try { manager.a(); // PAIL: NetworkManager::processReceivedPackets } catch (Exception ex) { - logger.warn("Failed to handle packet for {}", new Object[] { manager.getSocketAddress(), ex }); + logger.warn("Failed to handle packet for {}", manager.getSocketAddress(), ex); final ChatComponentText kick = new ChatComponentText("Internal server error"); - manager.sendPacket(new PacketPlayOutKickDisconnect(kick), new GenericFutureListener>() { - @Override - public void operationComplete(Future future) throws Exception { - manager.close(kick); - } - }, new GenericFutureListener[0]); + manager.sendPacket(new PacketPlayOutKickDisconnect(kick), new NetworkCloseHandler(manager, kick), new GenericFutureListener[0]); manager.stopReading(); } }