Better vanilla handling

This commit is contained in:
Adrian Bergqvist 2022-06-24 02:41:13 +02:00
parent 031d2b9225
commit 6276270a2c
No known key found for this signature in database
GPG Key ID: FAE7D8EDE225E686
4 changed files with 83 additions and 15 deletions

View File

@ -35,7 +35,7 @@ public class Ambassador {
public void onProxyInitialization(ProxyInitializeEvent event) { public void onProxyInitialization(ProxyInitializeEvent event) {
config = AmbassadorConfig.readOrCreateConfig(dataDirectory,server,logger); config = AmbassadorConfig.readOrCreateConfig(dataDirectory,server,logger);
if(config != null) { if(config != null) {
forgeHandshakeDataHandler = new ForgeHandshakeDataHandler(config,logger); forgeHandshakeDataHandler = new ForgeHandshakeDataHandler(config,logger,server);
server.getEventManager().register(this, forgeHandshakeDataHandler); server.getEventManager().register(this, forgeHandshakeDataHandler);
} }
else { else {

View File

@ -9,6 +9,7 @@ import com.velocitypowered.api.event.player.ServerPostConnectEvent;
import com.velocitypowered.api.proxy.InboundConnection; import com.velocitypowered.api.proxy.InboundConnection;
import com.velocitypowered.api.proxy.LoginPhaseConnection; import com.velocitypowered.api.proxy.LoginPhaseConnection;
import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.ProxyServer;
import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier;
import com.velocitypowered.api.proxy.server.RegisteredServer; import com.velocitypowered.api.proxy.server.RegisteredServer;
import com.velocitypowered.api.proxy.server.ServerPing; import com.velocitypowered.api.proxy.server.ServerPing;
@ -16,6 +17,7 @@ import com.velocitypowered.api.util.ModInfo;
import java.io.EOFException; import java.io.EOFException;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.util.*; import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -36,10 +38,12 @@ public class ForgeHandshakeDataHandler {
private final AmbassadorConfig config; private final AmbassadorConfig config;
private final Logger logger; private final Logger logger;
private final ProxyServer server;
public ForgeHandshakeDataHandler(AmbassadorConfig config,Logger logger) { public ForgeHandshakeDataHandler(AmbassadorConfig config, Logger logger, ProxyServer server) {
this.config = config; this.config = config;
this.logger = logger; this.logger = logger;
this.server = server;
} }
@Subscribe @Subscribe
@ -49,18 +53,29 @@ public class ForgeHandshakeDataHandler {
return; return;
} }
RegisteredServer server = config.getServer(event.getConnection().getProtocolVersion().getProtocol()); RegisteredServer server = config.getServer(event.getConnection().getProtocolVersion().getProtocol());
getHandshake(server).whenComplete((msg,ex) -> {
if (ex != null) { this.server.getEventManager().fire(new PreSyncEvent(event.getUsername(),event.getConnection(), server))
logger.warn("Could not sync player '" + event.getUsername() + "' to server '" .thenAccept((e) -> {
+ server.getServerInfo().getName() +"' Cause: " + ex.getMessage()); if (!e.getResult().getServer().isPresent()) {
} else { //Do not sync
sendModlist(msg.modListPacket, (LoginPhaseConnection) event.getConnection(), server); return;
sendOther(msg.otherPackets, (LoginPhaseConnection) event.getConnection(), server); }
} getHandshake(server).whenComplete((msg,ex) -> {
continuation.resume(); if (ex != null) {
}); logger.warn("Could not sync player '" + event.getUsername() + "' to server '"
+ server.getServerInfo().getName() +"' Cause: " + ex.getMessage());
} else {
AtomicBoolean isForge = new AtomicBoolean(false);
sendModlist(msg.modListPacket, (LoginPhaseConnection) event.getConnection(), server).thenAccept(isForge::set);
sendOther(msg.otherPackets, (LoginPhaseConnection) event.getConnection(), server).thenAccept((ignored) -> {});
}
//Writes the messages
continuation.resume();
});
});
} }
@Subscribe @Subscribe
public void onServerPostConnectEvent(ServerPostConnectEvent event) { public void onServerPostConnectEvent(ServerPostConnectEvent event) {
RegisteredServer server = getSyncedServer(event.getPlayer()).orElse(null); RegisteredServer server = getSyncedServer(event.getPlayer()).orElse(null);
@ -123,18 +138,31 @@ public class ForgeHandshakeDataHandler {
} }
} }
private void sendModlist(byte[] modListPacket, LoginPhaseConnection connection, RegisteredServer server) { //Should return ForgePlayer instead of Boolean in the future...
connection.sendLoginPluginMessage(MinecraftChannelIdentifier.create("fml","loginwrapper"), modListPacket, responseBody -> recivedClientModlist.put(server,responseBody)); private CompletableFuture<Boolean> sendModlist(byte[] modListPacket, LoginPhaseConnection connection, RegisteredServer server) {
CompletableFuture<Boolean> future = new CompletableFuture<Boolean>();
connection.sendLoginPluginMessage(MinecraftChannelIdentifier.create("fml","loginwrapper"), modListPacket, responseBody -> {
if (responseBody != null) {
recivedClientModlist.put(server,responseBody);
future.complete(true);
} else {
future.complete(false);
}
});
return future;
} }
private void sendOther(List<byte[]> otherPackets, LoginPhaseConnection connection, RegisteredServer server) { private CompletableFuture<Void> sendOther(List<byte[]> otherPackets, LoginPhaseConnection connection, RegisteredServer server) {
CompletableFuture<Void> future = new CompletableFuture<Void>();
for (int i = 0;i<otherPackets.size();i++) { for (int i = 0;i<otherPackets.size();i++) {
connection.sendLoginPluginMessage(MinecraftChannelIdentifier.create("fml","loginwrapper"), otherPackets.get(i), connection.sendLoginPluginMessage(MinecraftChannelIdentifier.create("fml","loginwrapper"), otherPackets.get(i),
(i<(otherPackets.size()-1)) ? responseBody -> recivedClientACK = responseBody : responseBody -> { (i<(otherPackets.size()-1)) ? responseBody -> recivedClientACK = responseBody : responseBody -> {
syncedConnections.put(connection,server); syncedConnections.put(connection,server);
syncedConnections.keySet().removeIf(c -> !c.isActive()); syncedConnections.keySet().removeIf(c -> !c.isActive());
future.complete(null);
}); });
} }
return future;
} }
public static int readVarInt(ByteArrayDataInput stream) { public static int readVarInt(ByteArrayDataInput stream) {

View File

@ -0,0 +1,8 @@
package org.adde0109.ambassador;
public class PostSyncEvent {
PostSyncEvent() {
}
}

View File

@ -0,0 +1,32 @@
package org.adde0109.ambassador;
import com.velocitypowered.api.event.ResultedEvent;
import com.velocitypowered.api.event.player.ServerPreConnectEvent;
import com.velocitypowered.api.proxy.InboundConnection;
import com.velocitypowered.api.proxy.server.RegisteredServer;
public class PreSyncEvent implements ResultedEvent<ServerPreConnectEvent.ServerResult> {
private final String username;
private final InboundConnection connection;
private final RegisteredServer originalServer;
private ServerPreConnectEvent.ServerResult result;
public PreSyncEvent(String username, InboundConnection connection,
RegisteredServer originalServer) {
this.username = username;
this.connection = connection;
this.originalServer = originalServer;
this.result = ServerPreConnectEvent.ServerResult.allowed(originalServer);
}
@Override
public ServerPreConnectEvent.ServerResult getResult() {
return result;
}
@Override
public void setResult(ServerPreConnectEvent.ServerResult result) {
}
}