Fixed pluginloginpacket queue

This commit is contained in:
Adrian Bergqvist 2023-04-13 20:21:36 +02:00
parent 2ee56603da
commit 08bdfe9b22
No known key found for this signature in database
GPG Key ID: 3B3DA43224B79417
6 changed files with 44 additions and 18 deletions

View File

@ -5,7 +5,7 @@ plugins {
} }
group = "org.adde0109" group = "org.adde0109"
version = "1.3.1-beta" version = "1.3.2-beta-rc8"
repositories { repositories {
mavenCentral() mavenCentral()

View File

@ -40,7 +40,7 @@ import static com.velocitypowered.api.network.ProtocolVersion.MINECRAFT_1_19;
import static com.velocitypowered.api.network.ProtocolVersion.MINECRAFT_1_19_3; import static com.velocitypowered.api.network.ProtocolVersion.MINECRAFT_1_19_3;
import static com.velocitypowered.proxy.protocol.packet.brigadier.ArgumentIdentifier.mapSet; import static com.velocitypowered.proxy.protocol.packet.brigadier.ArgumentIdentifier.mapSet;
@Plugin(id = "ambassador", name = "Ambassador", version = "1.3.1-beta", authors = {"adde0109"}) @Plugin(id = "ambassador", name = "Ambassador", version = "1.3.2-beta-rc4", authors = {"adde0109"})
public class Ambassador { public class Ambassador {
public ProxyServer server; public ProxyServer server;

View File

@ -60,6 +60,9 @@ public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhas
//Reset client if not ready to receive new handshake //Reset client if not ready to receive new handshake
VelocityForgeClientConnectionPhase clientPhase = (VelocityForgeClientConnectionPhase) player.getPhase(); VelocityForgeClientConnectionPhase clientPhase = (VelocityForgeClientConnectionPhase) player.getPhase();
clientPhase.resetConnectionPhase(player); clientPhase.resetConnectionPhase(player);
//Forge server
//To avoid unnecessary resets, we wait until we get the handshake even if we know that we should
//reset because that the previous server was Forge.
player.getConnection().write(message.retain()); player.getConnection().write(message.retain());
ForgeLoginWrapperDecoder decoder = (ForgeLoginWrapperDecoder) player.getConnection() ForgeLoginWrapperDecoder decoder = (ForgeLoginWrapperDecoder) player.getConnection()

View File

@ -89,6 +89,7 @@ public enum VelocityForgeClientConnectionPhase implements ClientConnectionPhase
player.getConnectionInFlight().getConnection().getChannel().config().setAutoRead(true); player.getConnectionInFlight().getConnection().getChannel().config().setAutoRead(true);
if (!(server.getConnection().getType() instanceof ForgeFMLConnectionType)) { if (!(server.getConnection().getType() instanceof ForgeFMLConnectionType)) {
//Forge -> Vanilla
MinecraftConnection connection = player.getConnection(); MinecraftConnection connection = player.getConnection();
((OutboundSuccessHolder) connection.getChannel().pipeline().get(ForgeConstants.SERVER_SUCCESS_LISTENER)) ((OutboundSuccessHolder) connection.getChannel().pipeline().get(ForgeConstants.SERVER_SUCCESS_LISTENER))
.sendPacket(); .sendPacket();

View File

@ -1,5 +1,6 @@
package org.adde0109.ambassador.velocity.backend; package org.adde0109.ambassador.velocity.backend;
import com.velocitypowered.api.network.ProtocolVersion;
import com.velocitypowered.proxy.VelocityServer; import com.velocitypowered.proxy.VelocityServer;
import com.velocitypowered.proxy.connection.MinecraftConnection; import com.velocitypowered.proxy.connection.MinecraftConnection;
import com.velocitypowered.proxy.connection.MinecraftSessionHandler; import com.velocitypowered.proxy.connection.MinecraftSessionHandler;
@ -15,6 +16,7 @@ import org.adde0109.ambassador.Ambassador;
import org.adde0109.ambassador.forge.ForgeConstants; import org.adde0109.ambassador.forge.ForgeConstants;
import org.adde0109.ambassador.forge.ForgeFMLConnectionType; import org.adde0109.ambassador.forge.ForgeFMLConnectionType;
import org.adde0109.ambassador.forge.VelocityForgeBackendConnectionPhase; import org.adde0109.ambassador.forge.VelocityForgeBackendConnectionPhase;
import org.adde0109.ambassador.forge.VelocityForgeClientConnectionPhase;
import org.adde0109.ambassador.velocity.client.OutboundSuccessHolder; import org.adde0109.ambassador.velocity.client.OutboundSuccessHolder;
public class ForgeLoginSessionHandler implements MinecraftSessionHandler { public class ForgeLoginSessionHandler implements MinecraftSessionHandler {
@ -49,15 +51,20 @@ public class ForgeLoginSessionHandler implements MinecraftSessionHandler {
} }
ConnectedPlayer player = serverConnection.getPlayer(); ConnectedPlayer player = serverConnection.getPlayer();
if (!(serverConnection.getConnection().getType() instanceof ForgeFMLConnectionType) && player.getConnectedServer() != null && if (player.getConnectedServer() != null && player.getConnectedServer().getConnection().getType() instanceof ForgeFMLConnectionType) {
player.getConnectedServer().getConnection().getType() instanceof ForgeFMLConnectionType) { //Forge -> vanilla
//Has not already been reset
//Not for Vanilla -> Vanilla
player.getPhase().resetConnectionPhase(player); player.getPhase().resetConnectionPhase(player);
} else if (player.getConnectedServer() == null) { } else if (player.getConnection().getState() == StateRegistry.LOGIN) {
//Initial vanilla
//Vanilla -> Forge
MinecraftConnection connection = player.getConnection(); MinecraftConnection connection = player.getConnection();
((OutboundSuccessHolder) connection.getChannel().pipeline().get(ForgeConstants.SERVER_SUCCESS_LISTENER)) ((OutboundSuccessHolder) connection.getChannel().pipeline().get(ForgeConstants.SERVER_SUCCESS_LISTENER))
.sendPacket(); .sendPacket();
connection.setState(StateRegistry.PLAY); connection.setState(StateRegistry.PLAY);
connection.getChannel().pipeline().remove(ForgeConstants.PLUGIN_PACKET_QUEUE); if (connection.getChannel().pipeline().toMap().containsKey(ForgeConstants.PLUGIN_PACKET_QUEUE))
connection.getChannel().pipeline().remove(ForgeConstants.PLUGIN_PACKET_QUEUE);
((VelocityServer) Ambassador.getInstance().server).registerConnection(player); ((VelocityServer) Ambassador.getInstance().server).registerConnection(player);
} }
@ -80,12 +87,17 @@ public class ForgeLoginSessionHandler implements MinecraftSessionHandler {
@Override @Override
public void disconnected() { public void disconnected() {
if (!serverConnection.getPhase().consideredComplete()) { if (!serverConnection.getPhase().consideredComplete()
serverConnection.getPlayer().handleConnectionException(serverConnection.getServer(), && serverConnection.getPlayer().getPhase() != VelocityForgeClientConnectionPhase.NOT_STARTED) {
Disconnect.create(Component.text("Ambassador: Backend server disconnected during handshake could be: " + int protocolVersion = serverConnection.getConnection().getProtocolVersion().getProtocol();
"mismatched mods OR bad player-forwarding config"), if (protocolVersion <= ProtocolVersion.MINECRAFT_1_16_4.getProtocol()) {
serverConnection.getPlayer().getProtocolVersion()),false); serverConnection.getPlayer().handleConnectionException(serverConnection.getServer(),
return; Disconnect.create(Component.text("Ambassador: Backend server disconnected during handshake." +
((protocolVersion <= ProtocolVersion.MINECRAFT_1_16_4.getProtocol()) ?
"Could be mismatched mods." : "")),
serverConnection.getPlayer().getProtocolVersion()),false);
return;
}
} }
original.disconnected(); original.disconnected();
} }

View File

@ -1,8 +1,14 @@
package org.adde0109.ambassador.velocity.client; package org.adde0109.ambassador.velocity.client;
import com.velocitypowered.proxy.connection.MinecraftConnection;
import com.velocitypowered.proxy.protocol.MinecraftPacket;
import com.velocitypowered.proxy.protocol.ProtocolUtils;
import com.velocitypowered.proxy.protocol.StateRegistry;
import com.velocitypowered.proxy.protocol.netty.MinecraftEncoder; import com.velocitypowered.proxy.protocol.netty.MinecraftEncoder;
import com.velocitypowered.proxy.protocol.util.DeferredByteBufHolder;
import io.netty.channel.*; import io.netty.channel.*;
import io.netty.handler.codec.EncoderException; import io.netty.handler.codec.EncoderException;
import io.netty.util.ReferenceCountUtil;
public class PluginLoginPacketQueue extends ChannelOutboundHandlerAdapter { public class PluginLoginPacketQueue extends ChannelOutboundHandlerAdapter {
@ -16,13 +22,17 @@ public class PluginLoginPacketQueue extends ChannelOutboundHandlerAdapter {
@Override @Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
MinecraftEncoder encoder = ctx.pipeline().get(MinecraftEncoder.class); MinecraftConnection connection = ctx.pipeline().get(MinecraftConnection.class);
try { if (connection.getState() == StateRegistry.LOGIN && msg instanceof MinecraftPacket packet) {
encoder.write(ctx, msg, promise); try {
} catch (EncoderException e) { StateRegistry.LOGIN.getProtocolRegistry(ProtocolUtils.Direction.CLIENTBOUND ,
if (e.getCause() instanceof IllegalArgumentException) { connection.getProtocolVersion()).getPacketId(packet);
queue.add(msg,promise); ctx.write(msg,promise);
} catch (IllegalArgumentException e) {
queue.add(msg, promise);
} }
} else {
ctx.write(msg,promise);
} }
} }