Better vanilla handling
This commit is contained in:
parent
031d2b9225
commit
6276270a2c
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
8
src/main/java/org/adde0109/ambassador/PostSyncEvent.java
Normal file
8
src/main/java/org/adde0109/ambassador/PostSyncEvent.java
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
package org.adde0109.ambassador;
|
||||||
|
|
||||||
|
public class PostSyncEvent {
|
||||||
|
|
||||||
|
PostSyncEvent() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
32
src/main/java/org/adde0109/ambassador/PreSyncEvent.java
Normal file
32
src/main/java/org/adde0109/ambassador/PreSyncEvent.java
Normal 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) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user