Mirror von
https://github.com/PaperMC/Velocity.git
synchronisiert 2024-12-24 23:30:26 +01:00
Handle disconnects more gracefully.
Dieser Commit ist enthalten in:
Ursprung
32772d1e9b
Commit
e01290d381
@ -31,7 +31,7 @@ public class MinecraftDecoder extends MessageToMessageDecoder<ByteBuf> {
|
|||||||
int packetId = ProtocolUtils.readVarInt(msg);
|
int packetId = ProtocolUtils.readVarInt(msg);
|
||||||
StateRegistry.ProtocolMappings mappings = direction == ProtocolConstants.Direction.TO_CLIENT ? state.TO_CLIENT : state.TO_SERVER;
|
StateRegistry.ProtocolMappings mappings = direction == ProtocolConstants.Direction.TO_CLIENT ? state.TO_CLIENT : state.TO_SERVER;
|
||||||
MinecraftPacket packet = mappings.createPacket(packetId);
|
MinecraftPacket packet = mappings.createPacket(packetId);
|
||||||
System.out.println(direction + " <- " + ByteBufUtil.hexDump(slice));
|
//System.out.println(direction + " <- " + ByteBufUtil.hexDump(slice));
|
||||||
if (packet == null) {
|
if (packet == null) {
|
||||||
msg.skipBytes(msg.readableBytes());
|
msg.skipBytes(msg.readableBytes());
|
||||||
out.add(new PacketWrapper(null, slice));
|
out.add(new PacketWrapper(null, slice));
|
||||||
|
@ -24,7 +24,7 @@ public class MinecraftEncoder extends MessageToByteEncoder<MinecraftPacket> {
|
|||||||
ProtocolUtils.writeVarInt(out, packetId);
|
ProtocolUtils.writeVarInt(out, packetId);
|
||||||
msg.encode(out, direction, protocolVersion);
|
msg.encode(out, direction, protocolVersion);
|
||||||
|
|
||||||
System.out.println(direction + " -> " + ByteBufUtil.hexDump(out));
|
//System.out.println(direction + " -> " + ByteBufUtil.hexDump(out));
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getProtocolVersion() {
|
public int getProtocolVersion() {
|
||||||
|
@ -50,4 +50,8 @@ public class ConnectedPlayer {
|
|||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setConnectedServer(ServerConnection serverConnection) {
|
||||||
|
this.connectedServer = serverConnection;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,11 +10,13 @@ import io.minimum.minecraft.velocity.protocol.packets.Handshake;
|
|||||||
import io.minimum.minecraft.velocity.protocol.packets.ServerLoginSuccess;
|
import io.minimum.minecraft.velocity.protocol.packets.ServerLoginSuccess;
|
||||||
import io.minimum.minecraft.velocity.proxy.handler.HandshakeSessionHandler;
|
import io.minimum.minecraft.velocity.proxy.handler.HandshakeSessionHandler;
|
||||||
import io.minimum.minecraft.velocity.proxy.handler.LoginSessionHandler;
|
import io.minimum.minecraft.velocity.proxy.handler.LoginSessionHandler;
|
||||||
|
import io.minimum.minecraft.velocity.proxy.handler.PlaySessionHandler;
|
||||||
import io.minimum.minecraft.velocity.proxy.handler.StatusSessionHandler;
|
import io.minimum.minecraft.velocity.proxy.handler.StatusSessionHandler;
|
||||||
import io.netty.channel.Channel;
|
import io.netty.channel.Channel;
|
||||||
import io.netty.channel.ChannelFuture;
|
import io.netty.channel.ChannelFuture;
|
||||||
import io.netty.channel.ChannelFutureListener;
|
import io.netty.channel.ChannelFutureListener;
|
||||||
import io.netty.util.AttributeKey;
|
import io.netty.util.AttributeKey;
|
||||||
|
import net.kyori.text.TextComponent;
|
||||||
|
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@ -43,7 +45,7 @@ public class InboundMinecraftConnection {
|
|||||||
|
|
||||||
public void closeWith(Object msg) {
|
public void closeWith(Object msg) {
|
||||||
ensureOpen();
|
ensureOpen();
|
||||||
closed = true;
|
teardown();
|
||||||
channel.writeAndFlush(msg).addListener(new ChannelFutureListener() {
|
channel.writeAndFlush(msg).addListener(new ChannelFutureListener() {
|
||||||
@Override
|
@Override
|
||||||
public void operationComplete(ChannelFuture future) throws Exception {
|
public void operationComplete(ChannelFuture future) throws Exception {
|
||||||
@ -54,8 +56,8 @@ public class InboundMinecraftConnection {
|
|||||||
|
|
||||||
public void close() {
|
public void close() {
|
||||||
ensureOpen();
|
ensureOpen();
|
||||||
|
teardown();
|
||||||
channel.close();
|
channel.close();
|
||||||
closed = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public MinecraftSessionHandler getSessionHandler() {
|
public MinecraftSessionHandler getSessionHandler() {
|
||||||
@ -95,6 +97,9 @@ public class InboundMinecraftConnection {
|
|||||||
|
|
||||||
public void teardown() {
|
public void teardown() {
|
||||||
closed = true;
|
closed = true;
|
||||||
|
if (connectedPlayer != null && connectedPlayer.getConnectedServer() != null) {
|
||||||
|
connectedPlayer.getConnectedServer().disconnect();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isClosed() {
|
public boolean isClosed() {
|
||||||
@ -114,6 +119,7 @@ public class InboundMinecraftConnection {
|
|||||||
ConnectedPlayer player = new ConnectedPlayer(success.getUsername(), success.getUuid(), this);
|
ConnectedPlayer player = new ConnectedPlayer(success.getUsername(), success.getUuid(), this);
|
||||||
ServerInfo info = new ServerInfo("test", new InetSocketAddress("127.0.0.1", 25565));
|
ServerInfo info = new ServerInfo("test", new InetSocketAddress("127.0.0.1", 25565));
|
||||||
ServerConnection connection = new ServerConnection(info, player, VelocityServer.getServer());
|
ServerConnection connection = new ServerConnection(info, player, VelocityServer.getServer());
|
||||||
|
sessionHandler = new PlaySessionHandler(player, connection);
|
||||||
connection.connect();
|
connection.connect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,9 @@ import io.minimum.minecraft.velocity.protocol.packets.Disconnect;
|
|||||||
import io.minimum.minecraft.velocity.protocol.packets.Handshake;
|
import io.minimum.minecraft.velocity.protocol.packets.Handshake;
|
||||||
import io.minimum.minecraft.velocity.protocol.packets.ServerLogin;
|
import io.minimum.minecraft.velocity.protocol.packets.ServerLogin;
|
||||||
import io.minimum.minecraft.velocity.protocol.packets.ServerLoginSuccess;
|
import io.minimum.minecraft.velocity.protocol.packets.ServerLoginSuccess;
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
import io.netty.channel.*;
|
import io.netty.channel.*;
|
||||||
|
import net.kyori.text.TextComponent;
|
||||||
|
|
||||||
public class ServerConnection {
|
public class ServerConnection {
|
||||||
private Channel channel;
|
private Channel channel;
|
||||||
@ -45,6 +47,18 @@ public class ServerConnection {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void disconnect() {
|
||||||
|
channel.close();
|
||||||
|
channel = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void forward(ByteBuf buf) {
|
||||||
|
if (registry != StateRegistry.PLAY) {
|
||||||
|
throw new IllegalStateException("Not accepting player information until PLAY state");
|
||||||
|
}
|
||||||
|
channel.writeAndFlush(buf.retain());
|
||||||
|
}
|
||||||
|
|
||||||
private class StateBasedInterceptor extends ChannelInboundHandlerAdapter {
|
private class StateBasedInterceptor extends ChannelInboundHandlerAdapter {
|
||||||
@Override
|
@Override
|
||||||
public void channelActive(ChannelHandlerContext ctx) throws Exception {
|
public void channelActive(ChannelHandlerContext ctx) throws Exception {
|
||||||
@ -66,6 +80,13 @@ public class ServerConnection {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
|
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
|
||||||
|
if (proxyPlayer.getConnection().isClosed()) {
|
||||||
|
// The upstream connection is closed, but we didn't forward that on for some reason. Close the connection
|
||||||
|
// here.
|
||||||
|
ctx.close();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (msg instanceof PacketWrapper) {
|
if (msg instanceof PacketWrapper) {
|
||||||
PacketWrapper pw = (PacketWrapper) msg;
|
PacketWrapper pw = (PacketWrapper) msg;
|
||||||
try {
|
try {
|
||||||
@ -102,6 +123,7 @@ public class ServerConnection {
|
|||||||
// the player has been logged on.
|
// the player has been logged on.
|
||||||
System.out.println("Player connected to remote server");
|
System.out.println("Player connected to remote server");
|
||||||
setRegistry(StateRegistry.PLAY);
|
setRegistry(StateRegistry.PLAY);
|
||||||
|
proxyPlayer.setConnectedServer(ServerConnection.this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,20 @@
|
|||||||
package io.minimum.minecraft.velocity.proxy.handler;
|
package io.minimum.minecraft.velocity.proxy.handler;
|
||||||
|
|
||||||
import io.minimum.minecraft.velocity.protocol.MinecraftPacket;
|
import io.minimum.minecraft.velocity.protocol.MinecraftPacket;
|
||||||
|
import io.minimum.minecraft.velocity.proxy.ConnectedPlayer;
|
||||||
import io.minimum.minecraft.velocity.proxy.MinecraftSessionHandler;
|
import io.minimum.minecraft.velocity.proxy.MinecraftSessionHandler;
|
||||||
|
import io.minimum.minecraft.velocity.proxy.ServerConnection;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
|
|
||||||
public class PlaySessionHandler implements MinecraftSessionHandler {
|
public class PlaySessionHandler implements MinecraftSessionHandler {
|
||||||
|
private final ConnectedPlayer player;
|
||||||
|
private final ServerConnection connection;
|
||||||
|
|
||||||
|
public PlaySessionHandler(ConnectedPlayer player, ServerConnection connection) {
|
||||||
|
this.player = player;
|
||||||
|
this.connection = connection;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handle(MinecraftPacket packet) {
|
public void handle(MinecraftPacket packet) {
|
||||||
|
|
||||||
@ -12,6 +22,6 @@ public class PlaySessionHandler implements MinecraftSessionHandler {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleUnknown(ByteBuf buf) {
|
public void handleUnknown(ByteBuf buf) {
|
||||||
|
connection.forward(buf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren