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"
version = "1.3.1-beta"
version = "1.3.2-beta-rc8"
repositories {
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.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 ProxyServer server;

View File

@ -60,6 +60,9 @@ public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhas
//Reset client if not ready to receive new handshake
VelocityForgeClientConnectionPhase clientPhase = (VelocityForgeClientConnectionPhase) player.getPhase();
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());
ForgeLoginWrapperDecoder decoder = (ForgeLoginWrapperDecoder) player.getConnection()

View File

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

View File

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

View File

@ -1,8 +1,14 @@
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.util.DeferredByteBufHolder;
import io.netty.channel.*;
import io.netty.handler.codec.EncoderException;
import io.netty.util.ReferenceCountUtil;
public class PluginLoginPacketQueue extends ChannelOutboundHandlerAdapter {
@ -16,13 +22,17 @@ public class PluginLoginPacketQueue extends ChannelOutboundHandlerAdapter {
@Override
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);
if (connection.getState() == StateRegistry.LOGIN && msg instanceof MinecraftPacket packet) {
try {
encoder.write(ctx, msg, promise);
} catch (EncoderException e) {
if (e.getCause() instanceof IllegalArgumentException) {
queue.add(msg,promise);
StateRegistry.LOGIN.getProtocolRegistry(ProtocolUtils.Direction.CLIENTBOUND ,
connection.getProtocolVersion()).getPacketId(packet);
ctx.write(msg,promise);
} catch (IllegalArgumentException e) {
queue.add(msg, promise);
}
} else {
ctx.write(msg,promise);
}
}