Fixed pluginloginpacket queue
This commit is contained in:
parent
2ee56603da
commit
08bdfe9b22
|
|
@ -5,7 +5,7 @@ plugins {
|
|||
}
|
||||
|
||||
group = "org.adde0109"
|
||||
version = "1.3.1-beta"
|
||||
version = "1.3.2-beta-rc8"
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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,15 +51,20 @@ 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);
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
@ -80,12 +87,17 @@ public class ForgeLoginSessionHandler implements MinecraftSessionHandler {
|
|||
|
||||
@Override
|
||||
public void disconnected() {
|
||||
if (!serverConnection.getPhase().consideredComplete()) {
|
||||
serverConnection.getPlayer().handleConnectionException(serverConnection.getServer(),
|
||||
Disconnect.create(Component.text("Ambassador: Backend server disconnected during handshake could be: " +
|
||||
"mismatched mods OR bad player-forwarding config"),
|
||||
serverConnection.getPlayer().getProtocolVersion()),false);
|
||||
return;
|
||||
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." +
|
||||
((protocolVersion <= ProtocolVersion.MINECRAFT_1_16_4.getProtocol()) ?
|
||||
"Could be mismatched mods." : "")),
|
||||
serverConnection.getPlayer().getProtocolVersion()),false);
|
||||
return;
|
||||
}
|
||||
}
|
||||
original.disconnected();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
try {
|
||||
encoder.write(ctx, msg, promise);
|
||||
} catch (EncoderException e) {
|
||||
if (e.getCause() instanceof IllegalArgumentException) {
|
||||
queue.add(msg,promise);
|
||||
MinecraftConnection connection = ctx.pipeline().get(MinecraftConnection.class);
|
||||
if (connection.getState() == StateRegistry.LOGIN && msg instanceof MinecraftPacket packet) {
|
||||
try {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user