Added Server Redirect support

This commit is contained in:
Adrian Bergqvist 2023-05-12 19:25:25 +02:00
parent b8c905e619
commit 1b59fbae1a
No known key found for this signature in database
GPG Key ID: 3B3DA43224B79417
3 changed files with 18 additions and 6 deletions

View File

@ -5,7 +5,7 @@ plugins {
} }
group = "org.adde0109" group = "org.adde0109"
version = "1.4.0-beta-rc1" version = "1.4.0-beta-rc2"
repositories { repositories {
mavenCentral() mavenCentral()

View File

@ -8,9 +8,11 @@ import com.velocitypowered.proxy.connection.backend.VelocityServerConnection;
import com.velocitypowered.proxy.connection.client.ClientConnectionPhase; import com.velocitypowered.proxy.connection.client.ClientConnectionPhase;
import com.velocitypowered.proxy.connection.client.ConnectedPlayer; 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.StateRegistry; import com.velocitypowered.proxy.protocol.StateRegistry;
import com.velocitypowered.proxy.protocol.packet.LoginPluginMessage; import com.velocitypowered.proxy.protocol.packet.LoginPluginMessage;
import com.velocitypowered.proxy.protocol.packet.PluginMessage; import com.velocitypowered.proxy.protocol.packet.PluginMessage;
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;
import org.adde0109.ambassador.Ambassador; import org.adde0109.ambassador.Ambassador;
@ -21,6 +23,7 @@ import org.adde0109.ambassador.velocity.client.FML2CRPMResetCompleteDecoder;
import org.adde0109.ambassador.velocity.client.OutboundSuccessHolder; import org.adde0109.ambassador.velocity.client.OutboundSuccessHolder;
import org.adde0109.ambassador.velocity.client.ClientPacketQueue; import org.adde0109.ambassador.velocity.client.ClientPacketQueue;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
public enum VelocityForgeClientConnectionPhase implements ClientConnectionPhase { public enum VelocityForgeClientConnectionPhase implements ClientConnectionPhase {
@ -118,8 +121,17 @@ public enum VelocityForgeClientConnectionPhase implements ClientConnectionPhase
public void resetConnectionPhase(ConnectedPlayer player) { public void resetConnectionPhase(ConnectedPlayer player) {
Ambassador.getTemporaryForced().put(player.getUsername(), player.getConnectionInFlight().getServer(), Ambassador.getTemporaryForced().put(player.getUsername(), player.getConnectionInFlight().getServer(),
Ambassador.getInstance().config.getServerSwitchCancellationTime(), TimeUnit.SECONDS); Ambassador.getInstance().config.getServerSwitchCancellationTime(), TimeUnit.SECONDS);
//Disconnect - Reset Timeout //Disconnect - Reset
player.disconnect(Ambassador.getInstance().config.getDisconnectResetMessage()); if(player.getKnownChannels().contains("srvredirect:red") && player.getVirtualHost().isPresent()) {
ByteBuf buf = Unpooled.buffer();
ProtocolUtils.writeVarInt(buf, 0);
buf.writeBytes((player.getVirtualHost().get().getHostName() + ":"
+ player.getVirtualHost().get().getPort()).getBytes(StandardCharsets.UTF_8));
player.getConnection().write(new PluginMessage("srvredirect:red", buf));
player.getConnection().close();
} else {
player.disconnect(Ambassador.getInstance().config.getDisconnectResetMessage());
}
} }
@Override @Override

View File

@ -51,9 +51,9 @@ public class ForgeLoginSessionHandler implements MinecraftSessionHandler {
if (player.getConnectedServer() == null) { if (player.getConnectedServer() == null) {
//Initial Vanilla //Initial Vanilla
//Send empty mod list in order to get client mod list //Send empty mod list in order to get client mod list
((VelocityForgeClientConnectionPhase) player.getPhase()).sendVanillaModlist(player); //((VelocityForgeClientConnectionPhase) player.getPhase()).sendVanillaModlist(player);
player.getConnectionInFlight().getConnection().getChannel().config().setAutoRead(false); //player.getConnectionInFlight().getConnection().getChannel().config().setAutoRead(false);
//((VelocityForgeClientConnectionPhase) player.getPhase()).complete(player); ((VelocityForgeClientConnectionPhase) player.getPhase()).complete(player);
} else if (player.getConnectedServer().getConnection().getType() instanceof ForgeFMLConnectionType) { } else if (player.getConnectedServer().getConnection().getType() instanceof ForgeFMLConnectionType) {
//Forge -> vanilla //Forge -> vanilla
player.getPhase().resetConnectionPhase(player); player.getPhase().resetConnectionPhase(player);