Compare commits

...

10 Commits
non-api ... 1.4

Author SHA1 Message Date
ac891c1ef1 修复内容(FML2CRPMResetCompleteDecoder.java):
对于非 0x02 的数据包:直接释放缓冲区并返回。在重置阶段,唯一需要关注的是 0x02(Login Plugin Response)数据包。其他数据包(如延迟的 PLAY 状态数据包)无法被处于 LOGIN 状态的 MinecraftDecoder 解码,因此安全丢弃。

对于 0x02 + id=98 的数据包:在拦截后添加 buf.release() 来修复内存泄漏。
2026-06-06 03:31:17 +08:00
f8185ddb0d 尝试修复泄露到 BundleDelimiterPacket 的解码过程中的意外数据 2026-06-06 02:41:52 +08:00
Adrian Bergqvist
349ce41f5f
Bump version 2024-12-18 21:00:36 +01:00
Adrian Bergqvist
e7df1270e0
Merge pull request #67 from p0t4t0sandwich/fix/1.20.6
Fix/1.20.6 closes #61
2024-12-18 20:21:11 +01:00
p0t4t0sandwich
1567e538a0 Cleaned up imports 2024-12-16 22:06:44 -06:00
p0t4t0sandwich
e167a198ae Fixed argument registry for Velocity networks that have 1.20.5+ servers 2024-12-16 21:06:53 -06:00
Adrian Bergqvist
8ead34ca6a
Update min version checker to b330 2024-03-29 02:55:48 +01:00
Adrian Bergqvist
21d0c11159
Bump 2024-03-29 02:53:16 +01:00
Adrian Bergqvist
424c12aad4
Refactoring for velocity 2024-03-29 02:51:22 +01:00
Adrian Bergqvist
f1b8b7ead1
Updated submodule Velocity 2024-03-29 02:43:25 +01:00
16 changed files with 72 additions and 60 deletions

@ -1 +1 @@
Subproject commit eb594fc799281ff418dc2c161c2d8a8eb0c89a19 Subproject commit ecf936f35665f9fd0f65ee114062cfbda2b89bf6

View File

@ -5,7 +5,7 @@ plugins {
} }
group = "org.adde0109" group = "org.adde0109"
version = "1.4.3-beta" version = "1.4.5-fix2"
repositories { repositories {
mavenCentral() mavenCentral()

View File

@ -18,9 +18,7 @@ import java.util.Map;
import com.velocitypowered.api.proxy.server.RegisteredServer; import com.velocitypowered.api.proxy.server.RegisteredServer;
import com.velocitypowered.proxy.VelocityServer; import com.velocitypowered.proxy.VelocityServer;
import com.velocitypowered.proxy.connection.MinecraftConnection;
import com.velocitypowered.proxy.network.ConnectionManager; import com.velocitypowered.proxy.network.ConnectionManager;
import com.velocitypowered.proxy.protocol.StateRegistry;
import com.velocitypowered.proxy.protocol.packet.brigadier.ArgumentIdentifier; import com.velocitypowered.proxy.protocol.packet.brigadier.ArgumentIdentifier;
import com.velocitypowered.proxy.protocol.packet.brigadier.ArgumentPropertyRegistry; import com.velocitypowered.proxy.protocol.packet.brigadier.ArgumentPropertyRegistry;
import com.velocitypowered.proxy.protocol.packet.brigadier.ArgumentPropertySerializer; import com.velocitypowered.proxy.protocol.packet.brigadier.ArgumentPropertySerializer;
@ -42,11 +40,11 @@ import java.util.concurrent.TimeUnit;
import static com.velocitypowered.api.network.ProtocolVersion.MINECRAFT_1_19; import static com.velocitypowered.api.network.ProtocolVersion.MINECRAFT_1_19;
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.4.3-beta", authors = {"adde0109"}) @Plugin(id = "ambassador", name = "Ambassador", version = "1.4.5", authors = {"adde0109"})
public class Ambassador { public class Ambassador {
//Don't forget to update checkCompatibleVersion() when changing this value //Don't forget to update checkCompatibleVersion() when changing this value
private static final String minVelocityVersion = "velocity-3.2.0-SNAPSHOT-266"; private static final String minVelocityVersion = "velocity-3.2.0-SNAPSHOT-330";
public ProxyServer server; public ProxyServer server;
public final Logger logger; public final Logger logger;
@ -75,8 +73,8 @@ public class Ambassador {
boolean checkCompatibleVersion() { boolean checkCompatibleVersion() {
//Update this when changing minVelocityVersion //Update this when changing minVelocityVersion
try { try {
MinecraftConnection.class.getDeclaredMethod("setActiveSessionHandler", StateRegistry.class); Class.forName("com.velocitypowered.proxy.protocol.packet.DisconnectPacket");
} catch (NoSuchMethodException e) { } catch (ClassNotFoundException e) {
return false; return false;
} }
return true; return true;
@ -134,8 +132,8 @@ public class Ambassador {
Method argumentRegistry = ArgumentPropertyRegistry.class.getDeclaredMethod("register", ArgumentIdentifier.class, Class.class, ArgumentPropertySerializer.class); Method argumentRegistry = ArgumentPropertyRegistry.class.getDeclaredMethod("register", ArgumentIdentifier.class, Class.class, ArgumentPropertySerializer.class);
argumentRegistry.setAccessible(true); argumentRegistry.setAccessible(true);
argumentRegistry.invoke(null,ArgumentIdentifier.id("forge:enum", mapSet(MINECRAFT_1_19, 50)), EnumArgumentProperty.class, EnumArgumentPropertySerializer.ENUM); argumentRegistry.invoke(null,ArgumentIdentifier.id("forge:enum", mapSet(MINECRAFT_1_19, -255)), EnumArgumentProperty.class, EnumArgumentPropertySerializer.ENUM);
argumentRegistry.invoke(null,ArgumentIdentifier.id("forge:modid", mapSet(MINECRAFT_1_19, 51)), ModIdArgumentProperty.class, argumentRegistry.invoke(null,ArgumentIdentifier.id("forge:modid", mapSet(MINECRAFT_1_19, -254)), ModIdArgumentProperty.class,
new ArgumentPropertySerializer<>() { new ArgumentPropertySerializer<>() {
@Override @Override
public ModIdArgumentProperty deserialize(ByteBuf buf, ProtocolVersion protocolVersion) { public ModIdArgumentProperty deserialize(ByteBuf buf, ProtocolVersion protocolVersion) {

View File

@ -7,9 +7,9 @@ import com.velocitypowered.proxy.connection.client.ConnectedPlayer;
import com.velocitypowered.proxy.network.Connections; import com.velocitypowered.proxy.network.Connections;
import com.velocitypowered.proxy.protocol.ProtocolUtils; import com.velocitypowered.proxy.protocol.ProtocolUtils;
import com.velocitypowered.proxy.protocol.StateRegistry; import com.velocitypowered.proxy.protocol.StateRegistry;
import com.velocitypowered.proxy.protocol.packet.AvailableCommands; import com.velocitypowered.proxy.protocol.packet.AvailableCommandsPacket;
import com.velocitypowered.proxy.protocol.packet.LoginPluginMessage; import com.velocitypowered.proxy.protocol.packet.LoginPluginMessagePacket;
import com.velocitypowered.proxy.protocol.packet.PluginMessage; import com.velocitypowered.proxy.protocol.packet.PluginMessagePacket;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import org.adde0109.ambassador.forge.pipeline.CommandDecoderErrorCatcher; import org.adde0109.ambassador.forge.pipeline.CommandDecoderErrorCatcher;
import org.adde0109.ambassador.forge.pipeline.ForgeLoginWrapperDecoder; import org.adde0109.ambassador.forge.pipeline.ForgeLoginWrapperDecoder;
@ -59,7 +59,7 @@ public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhas
VelocityForgeBackendConnectionPhase() { VelocityForgeBackendConnectionPhase() {
} }
public void handle(VelocityServerConnection server, ConnectedPlayer player, LoginPluginMessage message) { public void handle(VelocityServerConnection server, ConnectedPlayer player, LoginPluginMessagePacket message) {
VelocityForgeBackendConnectionPhase newPhase = getNewPhase(server,message); VelocityForgeBackendConnectionPhase newPhase = getNewPhase(server,message);
@ -97,7 +97,7 @@ public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhas
} }
private VelocityForgeBackendConnectionPhase getNewPhase(VelocityServerConnection serverConnection, private VelocityForgeBackendConnectionPhase getNewPhase(VelocityServerConnection serverConnection,
LoginPluginMessage packet) { LoginPluginMessagePacket packet) {
VelocityForgeBackendConnectionPhase phaseToTransitionTo = nextPhase(); VelocityForgeBackendConnectionPhase phaseToTransitionTo = nextPhase();
if (phaseToTransitionTo != this) { if (phaseToTransitionTo != this) {
phaseToTransitionTo.onTransitionToNewPhase(serverConnection); phaseToTransitionTo.onTransitionToNewPhase(serverConnection);
@ -106,9 +106,9 @@ public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhas
} }
@Override @Override
public boolean handle(VelocityServerConnection server, ConnectedPlayer player, PluginMessage message) { public boolean handle(VelocityServerConnection server, ConnectedPlayer player, PluginMessagePacket message) {
if (message.getChannel().equals("ambassador:commands")) { if (message.getChannel().equals("ambassador:commands")) {
AvailableCommands packet = new AvailableCommands(); AvailableCommandsPacket packet = new AvailableCommandsPacket();
packet.decode(message.content(), ProtocolUtils.Direction.CLIENTBOUND,server.getConnection().getProtocolVersion()); packet.decode(message.content(), ProtocolUtils.Direction.CLIENTBOUND,server.getConnection().getProtocolVersion());
server.getConnection().getActiveSessionHandler().handle(packet); server.getConnection().getActiveSessionHandler().handle(packet);
return true; return true;

View File

@ -10,8 +10,8 @@ import com.velocitypowered.proxy.connection.client.ConnectedPlayer;
import com.velocitypowered.proxy.network.Connections; import com.velocitypowered.proxy.network.Connections;
import com.velocitypowered.proxy.protocol.ProtocolUtils; import com.velocitypowered.proxy.protocol.ProtocolUtils;
import com.velocitypowered.proxy.protocol.StateRegistry; import com.velocitypowered.proxy.protocol.StateRegistry;
import com.velocitypowered.proxy.protocol.packet.LoginPluginMessage; import com.velocitypowered.proxy.protocol.packet.LoginPluginMessagePacket;
import com.velocitypowered.proxy.protocol.packet.PluginMessage; import com.velocitypowered.proxy.protocol.packet.PluginMessagePacket;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled; import io.netty.buffer.Unpooled;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
@ -62,10 +62,10 @@ public enum VelocityForgeClientConnectionPhase implements ClientConnectionPhase
//player.getConnectionInFlight().getConnection().getChannel().config().setAutoRead(false); //player.getConnectionInFlight().getConnection().getChannel().config().setAutoRead(false);
if (connection.getState() == StateRegistry.PLAY || connection.getState() == StateRegistry.CONFIG) { if (connection.getState() == StateRegistry.PLAY || connection.getState() == StateRegistry.CONFIG) {
connection.write(new PluginMessage("fml:handshake", Unpooled.wrappedBuffer(ForgeHandshakeUtils.generatePluginResetPacket()))); connection.write(new PluginMessagePacket("fml:handshake", Unpooled.wrappedBuffer(ForgeHandshakeUtils.generatePluginResetPacket())));
connection.setState(StateRegistry.LOGIN); connection.setState(StateRegistry.LOGIN);
} else { } else {
connection.write(new LoginPluginMessage(98,"fml:loginwrapper", Unpooled.wrappedBuffer(ForgeHandshakeUtils.generateResetPacket()))); connection.write(new LoginPluginMessagePacket(98,"fml:loginwrapper", Unpooled.wrappedBuffer(ForgeHandshakeUtils.generateResetPacket())));
} }
//Prepare to receive reset ACK //Prepare to receive reset ACK
@ -135,7 +135,7 @@ public enum VelocityForgeClientConnectionPhase implements ClientConnectionPhase
ProtocolUtils.writeVarInt(buf, 0); ProtocolUtils.writeVarInt(buf, 0);
buf.writeBytes((player.getVirtualHost().get().getHostName() + ":" buf.writeBytes((player.getVirtualHost().get().getHostName() + ":"
+ player.getVirtualHost().get().getPort()).getBytes(StandardCharsets.UTF_8)); + player.getVirtualHost().get().getPort()).getBytes(StandardCharsets.UTF_8));
player.getConnection().write(new PluginMessage("srvredirect:red", buf)); player.getConnection().write(new PluginMessagePacket("srvredirect:red", buf));
} else { } else {
player.disconnect(Ambassador.getInstance().config.getDisconnectResetMessage()); player.disconnect(Ambassador.getInstance().config.getDisconnectResetMessage());
} }
@ -170,7 +170,7 @@ public enum VelocityForgeClientConnectionPhase implements ClientConnectionPhase
} }
public void sendVanillaModlist(ConnectedPlayer player) { public void sendVanillaModlist(ConnectedPlayer player) {
player.getConnection().write(new LoginPluginMessage(0, "fml:loginwrapper", player.getConnection().write(new LoginPluginMessagePacket(0, "fml:loginwrapper",
Unpooled.wrappedBuffer(player.getConnection().getType() == ForgeConstants.ForgeFML3 ? Unpooled.wrappedBuffer(player.getConnection().getType() == ForgeConstants.ForgeFML3 ?
ForgeHandshakeUtils.emptyModlistFML3 : ForgeHandshakeUtils.emptyModlistFML2))); ForgeHandshakeUtils.emptyModlistFML3 : ForgeHandshakeUtils.emptyModlistFML2)));

View File

@ -1,6 +1,6 @@
package org.adde0109.ambassador.forge.packet; package org.adde0109.ambassador.forge.packet;
import com.velocitypowered.proxy.protocol.packet.LoginPluginResponse; import com.velocitypowered.proxy.protocol.packet.LoginPluginResponsePacket;
import com.velocitypowered.proxy.protocol.util.DeferredByteBufHolder; import com.velocitypowered.proxy.protocol.util.DeferredByteBufHolder;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
@ -15,8 +15,8 @@ public class GenericForgeLoginWrapperPacket extends DeferredByteBufHolder implem
} }
@Override @Override
public LoginPluginResponse encode() { public LoginPluginResponsePacket encode() {
return new LoginPluginResponse(id, true, content()); return new LoginPluginResponsePacket(id, true, content());
} }
@Override @Override

View File

@ -1,9 +1,9 @@
package org.adde0109.ambassador.forge.packet; package org.adde0109.ambassador.forge.packet;
import com.velocitypowered.proxy.protocol.packet.LoginPluginResponse; import com.velocitypowered.proxy.protocol.packet.LoginPluginResponsePacket;
public interface IForgeLoginWrapperPacket { public interface IForgeLoginWrapperPacket {
public LoginPluginResponse encode(); public LoginPluginResponsePacket encode();
public int getId(); public int getId();
public boolean getSuccess(); public boolean getSuccess();

View File

@ -3,7 +3,7 @@ package org.adde0109.ambassador.forge.packet;
import com.velocitypowered.api.proxy.messages.ChannelIdentifier; import com.velocitypowered.api.proxy.messages.ChannelIdentifier;
import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier;
import com.velocitypowered.proxy.protocol.ProtocolUtils; import com.velocitypowered.proxy.protocol.ProtocolUtils;
import com.velocitypowered.proxy.protocol.packet.LoginPluginResponse; import com.velocitypowered.proxy.protocol.packet.LoginPluginResponsePacket;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled; import io.netty.buffer.Unpooled;
@ -31,7 +31,7 @@ public class ModListReplyPacket implements IForgeLoginWrapperPacket {
this.success = success; this.success = success;
} }
public static ModListReplyPacket read(LoginPluginResponse msg) { public static ModListReplyPacket read(LoginPluginResponsePacket msg) {
ByteBuf input = msg.content(); ByteBuf input = msg.content();
List<String> mods = new ArrayList<>(); List<String> mods = new ArrayList<>();
@ -54,7 +54,7 @@ public class ModListReplyPacket implements IForgeLoginWrapperPacket {
} }
@Override @Override
public LoginPluginResponse encode() { public LoginPluginResponsePacket encode() {
ByteBuf buf = Unpooled.buffer(); ByteBuf buf = Unpooled.buffer();
ProtocolUtils.writeVarInt(buf, 2); ProtocolUtils.writeVarInt(buf, 2);
@ -79,7 +79,7 @@ public class ModListReplyPacket implements IForgeLoginWrapperPacket {
ProtocolUtils.writeVarInt(output, buf.readableBytes()); ProtocolUtils.writeVarInt(output, buf.readableBytes());
output.writeBytes(buf); output.writeBytes(buf);
return new LoginPluginResponse(id, true, output); return new LoginPluginResponsePacket(id, true, output);
} }
@Override @Override

View File

@ -8,7 +8,7 @@ import com.velocitypowered.proxy.protocol.MinecraftPacket;
import com.velocitypowered.proxy.protocol.ProtocolUtils; import com.velocitypowered.proxy.protocol.ProtocolUtils;
import com.velocitypowered.proxy.protocol.StateRegistry; import com.velocitypowered.proxy.protocol.StateRegistry;
import com.velocitypowered.proxy.protocol.netty.MinecraftDecoder; import com.velocitypowered.proxy.protocol.netty.MinecraftDecoder;
import com.velocitypowered.proxy.protocol.packet.AvailableCommands; import com.velocitypowered.proxy.protocol.packet.AvailableCommandsPacket;
import com.velocitypowered.proxy.util.except.QuietRuntimeException; import com.velocitypowered.proxy.util.except.QuietRuntimeException;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
@ -43,7 +43,7 @@ public class CommandDecoderErrorCatcher extends ChannelInboundHandlerAdapter {
int packetId = ProtocolUtils.readVarInt(buf); int packetId = ProtocolUtils.readVarInt(buf);
MinecraftPacket packet = registry.createPacket(packetId); MinecraftPacket packet = registry.createPacket(packetId);
buf.readerIndex(originalReaderIndex); buf.readerIndex(originalReaderIndex);
if (packet instanceof AvailableCommands) { if (packet instanceof AvailableCommandsPacket) {
try { try {
((MinecraftDecoder) ctx.pipeline().get(Connections.MINECRAFT_DECODER)).channelRead(ctx, msg); ((MinecraftDecoder) ctx.pipeline().get(Connections.MINECRAFT_DECODER)).channelRead(ctx, msg);
} catch (QuietRuntimeException | CorruptedFrameException e) { } catch (QuietRuntimeException | CorruptedFrameException e) {

View File

@ -1,7 +1,7 @@
package org.adde0109.ambassador.forge.pipeline; package org.adde0109.ambassador.forge.pipeline;
import com.velocitypowered.proxy.protocol.ProtocolUtils; import com.velocitypowered.proxy.protocol.ProtocolUtils;
import com.velocitypowered.proxy.protocol.packet.LoginPluginResponse; import com.velocitypowered.proxy.protocol.packet.LoginPluginResponsePacket;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageDecoder; import io.netty.handler.codec.MessageToMessageDecoder;
@ -11,12 +11,12 @@ import org.adde0109.ambassador.forge.packet.ModListReplyPacket;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class ForgeLoginWrapperDecoder extends MessageToMessageDecoder<LoginPluginResponse> { public class ForgeLoginWrapperDecoder extends MessageToMessageDecoder<LoginPluginResponsePacket> {
private final List<Integer> loginWrapperIDs = new ArrayList<>(); private final List<Integer> loginWrapperIDs = new ArrayList<>();
@Override @Override
protected void decode(ChannelHandlerContext ctx, LoginPluginResponse msg, List<Object> out) throws Exception { protected void decode(ChannelHandlerContext ctx, LoginPluginResponsePacket msg, List<Object> out) throws Exception {
ByteBuf buf = msg.content(); ByteBuf buf = msg.content();
if (!loginWrapperIDs.remove((Integer) msg.getId())) { if (!loginWrapperIDs.remove((Integer) msg.getId())) {
out.add(msg.retain()); out.add(msg.retain());

View File

@ -6,7 +6,7 @@ import com.velocitypowered.proxy.connection.ConnectionTypes;
import com.velocitypowered.proxy.connection.MinecraftConnection; import com.velocitypowered.proxy.connection.MinecraftConnection;
import com.velocitypowered.proxy.connection.backend.VelocityServerConnection; import com.velocitypowered.proxy.connection.backend.VelocityServerConnection;
import com.velocitypowered.proxy.network.Connections; import com.velocitypowered.proxy.network.Connections;
import com.velocitypowered.proxy.protocol.packet.Handshake; import com.velocitypowered.proxy.protocol.packet.HandshakePacket;
import io.netty.channel.*; import io.netty.channel.*;
import io.netty.handler.codec.MessageToMessageEncoder; import io.netty.handler.codec.MessageToMessageEncoder;
import org.adde0109.ambassador.forge.ForgeConstants; import org.adde0109.ambassador.forge.ForgeConstants;
@ -16,17 +16,17 @@ import java.util.List;
import static com.velocitypowered.proxy.connection.forge.legacy.LegacyForgeConstants.HANDSHAKE_HOSTNAME_TOKEN; import static com.velocitypowered.proxy.connection.forge.legacy.LegacyForgeConstants.HANDSHAKE_HOSTNAME_TOKEN;
public class FMLMarkerAdder extends MessageToMessageEncoder<Handshake> { public class FMLMarkerAdder extends MessageToMessageEncoder<HandshakePacket> {
final VelocityServer server; final VelocityServer server;
public FMLMarkerAdder(VelocityServer server) { public FMLMarkerAdder(VelocityServer server) {
super(Handshake.class); super(HandshakePacket.class);
this.server = server; this.server = server;
} }
@Override @Override
protected void encode(ChannelHandlerContext ctx, Handshake msg, List<Object> out) { protected void encode(ChannelHandlerContext ctx, HandshakePacket msg, List<Object> out) {
MinecraftConnection connection = (MinecraftConnection) ctx.pipeline().get(Connections.HANDLER); MinecraftConnection connection = (MinecraftConnection) ctx.pipeline().get(Connections.HANDLER);
VelocityServerConnection serverConnection = (VelocityServerConnection) connection.getAssociation(); VelocityServerConnection serverConnection = (VelocityServerConnection) connection.getAssociation();
PlayerInfoForwarding forwardingMode = server.getConfiguration().getPlayerInfoForwardingMode(); PlayerInfoForwarding forwardingMode = server.getConfiguration().getPlayerInfoForwardingMode();

View File

@ -6,9 +6,9 @@ import com.velocitypowered.proxy.connection.MinecraftSessionHandler;
import com.velocitypowered.proxy.connection.backend.*; import com.velocitypowered.proxy.connection.backend.*;
import com.velocitypowered.proxy.connection.client.ConnectedPlayer; import com.velocitypowered.proxy.connection.client.ConnectedPlayer;
import com.velocitypowered.proxy.protocol.MinecraftPacket; import com.velocitypowered.proxy.protocol.MinecraftPacket;
import com.velocitypowered.proxy.protocol.packet.Disconnect; import com.velocitypowered.proxy.protocol.packet.DisconnectPacket;
import com.velocitypowered.proxy.protocol.packet.LoginPluginMessage; import com.velocitypowered.proxy.protocol.packet.LoginPluginMessagePacket;
import com.velocitypowered.proxy.protocol.packet.ServerLoginSuccess; import com.velocitypowered.proxy.protocol.packet.ServerLoginSuccessPacket;
import com.velocitypowered.proxy.util.except.QuietRuntimeException; import com.velocitypowered.proxy.util.except.QuietRuntimeException;
import io.netty.buffer.Unpooled; import io.netty.buffer.Unpooled;
import org.adde0109.ambassador.forge.*; import org.adde0109.ambassador.forge.*;
@ -26,7 +26,7 @@ public class ForgeLoginSessionHandler implements MinecraftSessionHandler {
} }
@Override @Override
public boolean handle(LoginPluginMessage packet) { public boolean handle(LoginPluginMessagePacket packet) {
if (packet.getChannel().equals("fml:loginwrapper")) { if (packet.getChannel().equals("fml:loginwrapper")) {
if (serverConnection.getPhase() == BackendConnectionPhases.UNKNOWN) { if (serverConnection.getPhase() == BackendConnectionPhases.UNKNOWN) {
VelocityForgeBackendConnectionPhase.NOT_STARTED.handle(serverConnection,serverConnection.getPlayer(),packet); VelocityForgeBackendConnectionPhase.NOT_STARTED.handle(serverConnection,serverConnection.getPlayer(),packet);
@ -39,7 +39,7 @@ public class ForgeLoginSessionHandler implements MinecraftSessionHandler {
} }
@Override @Override
public boolean handle(ServerLoginSuccess packet) { public boolean handle(ServerLoginSuccessPacket packet) {
if ((serverConnection.getPhase() instanceof VelocityForgeBackendConnectionPhase phase)) { if ((serverConnection.getPhase() instanceof VelocityForgeBackendConnectionPhase phase)) {
phase.onLoginSuccess(serverConnection,serverConnection.getPlayer()); phase.onLoginSuccess(serverConnection,serverConnection.getPlayer());
} }
@ -65,7 +65,7 @@ public class ForgeLoginSessionHandler implements MinecraftSessionHandler {
@Override @Override
public boolean handle(Disconnect packet) { public boolean handle(DisconnectPacket packet) {
if (!serverConnection.getPlayer().getPhase().consideredComplete()) { if (!serverConnection.getPlayer().getPhase().consideredComplete()) {
serverConnection.getPlayer().handleConnectionException(serverConnection.getServer(), packet, false); serverConnection.getPlayer().handleConnectionException(serverConnection.getServer(), packet, false);
return true; return true;

View File

@ -4,7 +4,7 @@ import com.velocitypowered.proxy.connection.MinecraftSessionHandler;
import com.velocitypowered.proxy.connection.backend.TransitionSessionHandler; import com.velocitypowered.proxy.connection.backend.TransitionSessionHandler;
import com.velocitypowered.proxy.connection.backend.VelocityServerConnection; import com.velocitypowered.proxy.connection.backend.VelocityServerConnection;
import com.velocitypowered.proxy.protocol.MinecraftPacket; import com.velocitypowered.proxy.protocol.MinecraftPacket;
import com.velocitypowered.proxy.protocol.packet.JoinGame; import com.velocitypowered.proxy.protocol.packet.JoinGamePacket;
import org.adde0109.ambassador.forge.VelocityForgeClientConnectionPhase; import org.adde0109.ambassador.forge.VelocityForgeClientConnectionPhase;
public class ForgePlaySessionHandler implements MinecraftSessionHandler { public class ForgePlaySessionHandler implements MinecraftSessionHandler {
@ -18,7 +18,7 @@ public class ForgePlaySessionHandler implements MinecraftSessionHandler {
} }
@Override @Override
public boolean handle(JoinGame packet) { public boolean handle(JoinGamePacket packet) {
if (serverConnection.getPlayer().getPhase() instanceof VelocityForgeClientConnectionPhase clientPhase) { if (serverConnection.getPlayer().getPhase() instanceof VelocityForgeClientConnectionPhase clientPhase) {
serverConnection.getPlayer().setPhase(VelocityForgeClientConnectionPhase.RESETTABLE); serverConnection.getPlayer().setPhase(VelocityForgeClientConnectionPhase.RESETTABLE);
} }

View File

@ -20,20 +20,34 @@ public class FML2CRPMResetCompleteDecoder extends ChannelInboundHandlerAdapter {
int originalReaderIndex = buf.readerIndex(); int originalReaderIndex = buf.readerIndex();
int packetId = ProtocolUtils.readVarInt(buf); int packetId = ProtocolUtils.readVarInt(buf);
if (packetId == 0x02 && buf.readableBytes() > 1) { if (packetId != 0x02) {
buf.release();
return;
}
if (buf.readableBytes() > 1) {
try { try {
int id = ProtocolUtils.readVarInt(buf); int id = ProtocolUtils.readVarInt(buf);
boolean success = buf.readBoolean(); boolean success = buf.readBoolean();
if (id == 98) { if (id == 98) {
try { try {
IForgeLoginWrapperPacket packet = new GenericForgeLoginWrapperPacket(Unpooled.EMPTY_BUFFER, id, success); int remainingBytes = buf.readableBytes();
ctx.fireChannelRead(packet); if (remainingBytes > 0) {
} finally { ByteBuf remainingData = Unpooled.buffer(remainingBytes);
buf.release(); remainingData.writeBytes(buf, remainingBytes);
IForgeLoginWrapperPacket packet = new GenericForgeLoginWrapperPacket(remainingData, id, success);
ctx.fireChannelRead(packet);
} else {
IForgeLoginWrapperPacket packet = new GenericForgeLoginWrapperPacket(Unpooled.EMPTY_BUFFER, id, success);
ctx.fireChannelRead(packet);
}
} catch (Exception e) {
System.err.println("[Ambassador] Error creating FML2CRPM packet: " + e.getMessage());
} }
buf.release();
return; return;
} }
} catch (Exception ignored) {} } catch (Exception ignored) {
}
} }
buf.readerIndex(originalReaderIndex); buf.readerIndex(originalReaderIndex);
} }

View File

@ -1,13 +1,13 @@
package org.adde0109.ambassador.velocity.client; package org.adde0109.ambassador.velocity.client;
import com.velocitypowered.proxy.protocol.packet.ServerLoginSuccess; import com.velocitypowered.proxy.protocol.packet.ServerLoginSuccessPacket;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelOutboundHandlerAdapter; import io.netty.channel.ChannelOutboundHandlerAdapter;
import io.netty.channel.ChannelPromise; import io.netty.channel.ChannelPromise;
public class OutboundSuccessHolder extends ChannelOutboundHandlerAdapter { public class OutboundSuccessHolder extends ChannelOutboundHandlerAdapter {
private ServerLoginSuccess packet; private ServerLoginSuccessPacket packet;
private ChannelHandlerContext ctx; private ChannelHandlerContext ctx;
@Override @Override
@ -17,7 +17,7 @@ public class OutboundSuccessHolder 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 {
if ((msg instanceof ServerLoginSuccess packet)) { if ((msg instanceof ServerLoginSuccessPacket packet)) {
this.packet = packet; this.packet = packet;
} else { } else {
ctx.write(msg, promise); ctx.write(msg, promise);

View File

@ -7,7 +7,7 @@ import com.velocitypowered.proxy.connection.client.HandshakeSessionHandler;
import com.velocitypowered.proxy.network.Connections; import com.velocitypowered.proxy.network.Connections;
import com.velocitypowered.proxy.protocol.MinecraftPacket; import com.velocitypowered.proxy.protocol.MinecraftPacket;
import com.velocitypowered.proxy.protocol.StateRegistry; import com.velocitypowered.proxy.protocol.StateRegistry;
import com.velocitypowered.proxy.protocol.packet.Handshake; import com.velocitypowered.proxy.protocol.packet.HandshakePacket;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import org.adde0109.ambassador.forge.ForgeConstants; import org.adde0109.ambassador.forge.ForgeConstants;
@ -22,7 +22,7 @@ public class VelocityHandshakeSessionHandler extends HandshakeSessionHandler {
} }
@Override @Override
public boolean handle(Handshake handshake) { public boolean handle(HandshakePacket handshake) {
handshake.handle(original); handshake.handle(original);
if (connection.getType() == ConnectionTypes.VANILLA) { if (connection.getType() == ConnectionTypes.VANILLA) {
final String[] markerSplit = handshake.getServerAddress().split("\0"); final String[] markerSplit = handshake.getServerAddress().split("\0");