Fixed some things
This commit is contained in:
parent
57282b69ab
commit
c3ae255be6
|
|
@ -9,6 +9,8 @@ import com.velocitypowered.proxy.protocol.ProtocolUtils;
|
|||
import com.velocitypowered.proxy.protocol.packet.AvailableCommands;
|
||||
import com.velocitypowered.proxy.protocol.packet.LoginPluginMessage;
|
||||
import com.velocitypowered.proxy.protocol.packet.PluginMessage;
|
||||
import org.adde0109.ambassador.forge.packet.Context;
|
||||
import org.adde0109.ambassador.forge.packet.IForgeLoginWrapperPacket;
|
||||
import org.adde0109.ambassador.forge.pipeline.CommandDecoderErrorCatcher;
|
||||
import org.adde0109.ambassador.forge.pipeline.ForgeLoginWrapperCodec;
|
||||
|
||||
|
|
@ -57,8 +59,7 @@ public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhas
|
|||
VelocityForgeBackendConnectionPhase() {
|
||||
}
|
||||
|
||||
public void handle(VelocityServerConnection server, ConnectedPlayer player, LoginPluginMessage message) {
|
||||
|
||||
public void handle(VelocityServerConnection server, ConnectedPlayer player, IForgeLoginWrapperPacket message) {
|
||||
VelocityForgeBackendConnectionPhase newPhase = getNewPhase(server,message);
|
||||
|
||||
server.setConnectionPhase(newPhase);
|
||||
|
|
@ -75,7 +76,6 @@ public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhas
|
|||
return;
|
||||
}
|
||||
}
|
||||
message.retain();
|
||||
player.getConnection().write(message);
|
||||
//Forge server
|
||||
//To avoid unnecessary resets, we wait until we get the handshake even if we know that we should
|
||||
|
|
@ -93,7 +93,7 @@ public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhas
|
|||
}
|
||||
|
||||
private VelocityForgeBackendConnectionPhase getNewPhase(VelocityServerConnection serverConnection,
|
||||
LoginPluginMessage packet) {
|
||||
IForgeLoginWrapperPacket<Context> packet) {
|
||||
VelocityForgeBackendConnectionPhase phaseToTransitionTo = nextPhase();
|
||||
if (phaseToTransitionTo != this) {
|
||||
phaseToTransitionTo.onTransitionToNewPhase(serverConnection);
|
||||
|
|
|
|||
|
|
@ -148,7 +148,7 @@ public enum VelocityForgeClientConnectionPhase implements ClientConnectionPhase
|
|||
|
||||
public ModListReplyPacket clientModList;
|
||||
|
||||
public boolean handle(ConnectedPlayer player, IForgeLoginWrapperPacket msg, VelocityServerConnection server) {
|
||||
public boolean handle(ConnectedPlayer player, IForgeLoginWrapperPacket<Context.ClientContext> msg, VelocityServerConnection server) {
|
||||
player.setPhase(nextPhase());
|
||||
|
||||
if (msg instanceof ModListReplyPacket replyPacket) {
|
||||
|
|
@ -164,7 +164,7 @@ public enum VelocityForgeClientConnectionPhase implements ClientConnectionPhase
|
|||
replyPacket.getChannels().put(MinecraftChannelIdentifier.from("ambassador:commands"),"1");
|
||||
}
|
||||
|
||||
player.getConnectionInFlight().getConnection().write(msg.encode());
|
||||
player.getConnectionInFlight().getConnection().write(msg);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ public class GenericForgeLoginWrapperPacket<T extends Context> extends DeferredB
|
|||
|
||||
|
||||
static public GenericForgeLoginWrapperPacket<Context> create(ByteBuf input, Context context) {
|
||||
return new GenericForgeLoginWrapperPacket<>(input, context);
|
||||
return new GenericForgeLoginWrapperPacket<>(input.retain(), context);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ public class ModListPacket implements IForgeLoginWrapperPacket<Context> {
|
|||
this.dataPackRegistries = dataPackRegistries;
|
||||
}
|
||||
|
||||
public static ModListPacket read(ByteBuf input, Context context) {
|
||||
public static ModListPacket read(ByteBuf input, Context context, boolean FML3) {
|
||||
|
||||
List<String> mods = new ArrayList<>();
|
||||
int len = ProtocolUtils.readVarInt(input);
|
||||
|
|
@ -45,8 +45,9 @@ public class ModListPacket implements IForgeLoginWrapperPacket<Context> {
|
|||
for (int x = 0; x < len; x++)
|
||||
registries.add(ProtocolUtils.readString(input, 32767));
|
||||
|
||||
List<String> dataPackRegistries = new ArrayList<>();
|
||||
if (input.isReadable()) {
|
||||
List<String> dataPackRegistries = null;
|
||||
if (FML3) {
|
||||
dataPackRegistries = new ArrayList<>();
|
||||
len = ProtocolUtils.readVarInt(input);
|
||||
for (int x = 0; x < len; x++)
|
||||
dataPackRegistries.add(ProtocolUtils.readString(input, 0x100));
|
||||
|
|
@ -74,8 +75,8 @@ public class ModListPacket implements IForgeLoginWrapperPacket<Context> {
|
|||
registries.forEach(k -> ProtocolUtils.writeString(buf, k));
|
||||
|
||||
if (dataPackRegistries != null) {
|
||||
ProtocolUtils.writeVarInt(buf, registries.size());
|
||||
registries.forEach(k -> ProtocolUtils.writeString(buf, k));
|
||||
ProtocolUtils.writeVarInt(buf, dataPackRegistries.size());
|
||||
dataPackRegistries.forEach(k -> ProtocolUtils.writeString(buf, k));
|
||||
}
|
||||
|
||||
ByteBuf output = Unpooled.buffer();
|
||||
|
|
|
|||
|
|
@ -15,8 +15,13 @@ import java.util.List;
|
|||
|
||||
public class ForgeLoginWrapperCodec extends MessageToMessageCodec<DeferredByteBufHolder, IForgeLoginWrapperPacket<?>> {
|
||||
|
||||
private final boolean FML3;
|
||||
private final List<Integer> loginWrapperIDs = new ArrayList<>();
|
||||
|
||||
public ForgeLoginWrapperCodec(boolean fml3) {
|
||||
FML3 = fml3;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void decode(ChannelHandlerContext ctx, DeferredByteBufHolder in, List<Object> out) throws Exception {
|
||||
ByteBuf buf = in.content();
|
||||
|
|
@ -51,7 +56,7 @@ public class ForgeLoginWrapperCodec extends MessageToMessageCodec<DeferredByteBu
|
|||
} else {
|
||||
switch (packetID) {
|
||||
case 1:
|
||||
out.add(ModListPacket.read(buf, context));
|
||||
out.add(ModListPacket.read(buf, context, FML3));
|
||||
break;
|
||||
case 3:
|
||||
out.add(new RegistryPacket(context));
|
||||
|
|
|
|||
|
|
@ -1,25 +1,42 @@
|
|||
package org.adde0109.ambassador.forge.pipeline;
|
||||
|
||||
import com.velocitypowered.proxy.connection.MinecraftConnectionAssociation;
|
||||
import com.velocitypowered.proxy.connection.backend.VelocityServerConnection;
|
||||
import com.velocitypowered.proxy.connection.client.ConnectedPlayer;
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.channel.SimpleChannelInboundHandler;
|
||||
import io.netty.util.ReferenceCountUtil;
|
||||
import org.adde0109.ambassador.forge.ForgeConstants;
|
||||
import org.adde0109.ambassador.forge.ForgeFMLConnectionType;
|
||||
import org.adde0109.ambassador.forge.VelocityForgeBackendConnectionPhase;
|
||||
import org.adde0109.ambassador.forge.packet.Context;
|
||||
import org.adde0109.ambassador.forge.packet.IForgeLoginWrapperPacket;
|
||||
import org.adde0109.ambassador.forge.VelocityForgeClientConnectionPhase;
|
||||
|
||||
public class ForgeLoginWrapperHandler extends SimpleChannelInboundHandler<IForgeLoginWrapperPacket> {
|
||||
public class ForgeLoginWrapperHandler extends SimpleChannelInboundHandler<IForgeLoginWrapperPacket<?>> {
|
||||
|
||||
private final ConnectedPlayer player;
|
||||
private final MinecraftConnectionAssociation connection;
|
||||
|
||||
|
||||
public ForgeLoginWrapperHandler(ConnectedPlayer player) {
|
||||
public ForgeLoginWrapperHandler(MinecraftConnectionAssociation connection) {
|
||||
super(false);
|
||||
this.player = player;
|
||||
this.connection = connection;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void channelRead0(ChannelHandlerContext ctx, IForgeLoginWrapperPacket msg) throws Exception {
|
||||
if (connection instanceof ConnectedPlayer player) {
|
||||
VelocityForgeClientConnectionPhase phase = (VelocityForgeClientConnectionPhase) player.getPhase();
|
||||
phase.handle(player,msg,player.getConnectionInFlight());
|
||||
} else if (connection instanceof VelocityServerConnection serverConnection){
|
||||
if (!(serverConnection.getConnection().getType() instanceof ForgeFMLConnectionType)) {
|
||||
serverConnection.getConnection().setType(serverConnection.getPlayer().getConnection().getType());
|
||||
serverConnection.setConnectionPhase(serverConnection.getConnection().getType().getInitialBackendPhase());
|
||||
}
|
||||
|
||||
VelocityForgeBackendConnectionPhase phase =
|
||||
(VelocityForgeBackendConnectionPhase) serverConnection.getPhase();
|
||||
phase.handle(serverConnection, serverConnection.getPlayer(), msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,7 +37,8 @@ public class VelocityEventHandler {
|
|||
|
||||
player.getConnection().getChannel().pipeline().addBefore(
|
||||
Connections.HANDLER,
|
||||
ForgeConstants.FORGE_HANDSHAKE_DECODER, new ForgeLoginWrapperCodec());
|
||||
ForgeConstants.FORGE_HANDSHAKE_DECODER, new ForgeLoginWrapperCodec(
|
||||
player.getConnection().getType() == ForgeConstants.ForgeFML3));
|
||||
player.getConnection().getChannel().pipeline().addAfter(
|
||||
ForgeConstants.FORGE_HANDSHAKE_DECODER,
|
||||
ForgeConstants.FORGE_HANDSHAKE_HANDLER, new ForgeLoginWrapperHandler(player));
|
||||
|
|
|
|||
|
|
@ -25,19 +25,6 @@ public class ForgeLoginSessionHandler implements MinecraftSessionHandler {
|
|||
this.server = server;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean handle(LoginPluginMessage packet) {
|
||||
if (packet.getChannel().equals("fml:loginwrapper")) {
|
||||
if (serverConnection.getPhase() == BackendConnectionPhases.UNKNOWN) {
|
||||
VelocityForgeBackendConnectionPhase.NOT_STARTED.handle(serverConnection,serverConnection.getPlayer(),packet);
|
||||
} else if (serverConnection.getPhase() instanceof VelocityForgeBackendConnectionPhase phase1) {
|
||||
phase1.handle(serverConnection,serverConnection.getPlayer(),packet);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return original.handle(packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean handle(ServerLoginSuccess packet) {
|
||||
if ((serverConnection.getPhase() instanceof VelocityForgeBackendConnectionPhase phase)) {
|
||||
|
|
|
|||
|
|
@ -34,12 +34,13 @@ public class VelocityForgeBackendHandshakeHandler extends ChannelInboundHandlerA
|
|||
ForgeLoginSessionHandler forgeLoginSessionHandler = new ForgeLoginSessionHandler((LoginSessionHandler) connection.getActiveSessionHandler(), serverConnection,server);
|
||||
connection.setActiveSessionHandler(StateRegistry.LOGIN, forgeLoginSessionHandler);
|
||||
|
||||
player.getConnection().getChannel().pipeline().addBefore(
|
||||
serverConnection.getConnection().getChannel().pipeline().addBefore(
|
||||
Connections.HANDLER,
|
||||
ForgeConstants.FORGE_HANDSHAKE_DECODER, new ForgeLoginWrapperCodec());
|
||||
player.getConnection().getChannel().pipeline().addAfter(
|
||||
ForgeConstants.FORGE_HANDSHAKE_DECODER, new ForgeLoginWrapperCodec(
|
||||
player.getConnection().getType() == ForgeConstants.ForgeFML3));
|
||||
serverConnection.getConnection().getChannel().pipeline().addAfter(
|
||||
ForgeConstants.FORGE_HANDSHAKE_DECODER,
|
||||
ForgeConstants.FORGE_HANDSHAKE_HANDLER, new ForgeLoginWrapperHandler(player));
|
||||
ForgeConstants.FORGE_HANDSHAKE_HANDLER, new ForgeLoginWrapperHandler(serverConnection));
|
||||
}
|
||||
|
||||
ctx.pipeline().fireChannelActive();
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user