diff --git a/API/src/main/java/xyz/kyngs/librelogin/api/server/ServerHandler.java b/API/src/main/java/xyz/kyngs/librelogin/api/server/ServerHandler.java
index 7bc363e6..e043ca8e 100644
--- a/API/src/main/java/xyz/kyngs/librelogin/api/server/ServerHandler.java
+++ b/API/src/main/java/xyz/kyngs/librelogin/api/server/ServerHandler.java
@@ -74,7 +74,7 @@ public interface ServerHandler
{
*
* @return The limbo servers
*/
- Collection getLimboServers();
+ Multimap getLimboServers();
/**
* Registers a new lobby server.
@@ -97,7 +97,8 @@ default void registerLobbyServer(S server) {
* Registers a new limbo server.
*
* @param server The server to register
+ * @param forcedHost The forced host
*/
- void registerLimboServer(S server);
+ void registerLimboServer(S server, String forcedHost);
}
diff --git a/Plugin/src/main/java/xyz/kyngs/librelogin/bungeecord/Blockers.java b/Plugin/src/main/java/xyz/kyngs/librelogin/bungeecord/Blockers.java
index f74ab78a..31ba3e87 100644
--- a/Plugin/src/main/java/xyz/kyngs/librelogin/bungeecord/Blockers.java
+++ b/Plugin/src/main/java/xyz/kyngs/librelogin/bungeecord/Blockers.java
@@ -65,7 +65,7 @@ public void onServerConnect(ServerConnectEvent event) {
if (!authorizationProvider.isAuthorized(event.getPlayer()) && event.getReason() != ServerConnectEvent.Reason.JOIN_PROXY) {
event.setCancelled(true);
} else if (authorizationProvider.isAwaiting2FA(event.getPlayer())) {
- if (!configuration.get(LIMBO).contains(event.getTarget().getName())) {
+ if (!configuration.get(LIMBO).containsValue(event.getTarget().getName())) {
event.setCancelled(true);
}
}
diff --git a/Plugin/src/main/java/xyz/kyngs/librelogin/bungeecord/BungeeCordPlatformHandle.java b/Plugin/src/main/java/xyz/kyngs/librelogin/bungeecord/BungeeCordPlatformHandle.java
index c1cd120f..95acacd8 100644
--- a/Plugin/src/main/java/xyz/kyngs/librelogin/bungeecord/BungeeCordPlatformHandle.java
+++ b/Plugin/src/main/java/xyz/kyngs/librelogin/bungeecord/BungeeCordPlatformHandle.java
@@ -166,7 +166,7 @@ public ProxyData getProxyData() {
.add("main", plugin.getDescription().getMain())
.toString()
).toList(),
- plugin.getServerHandler().getLimboServers().stream().map(this::fromServer).toList(),
+ plugin.getServerHandler().getLimboServers().values().stream().map(this::fromServer).toList(),
plugin.getServerHandler().getLobbyServers().values().stream().map(this::fromServer).toList()
);
}
diff --git a/Plugin/src/main/java/xyz/kyngs/librelogin/common/AuthenticLibreLogin.java b/Plugin/src/main/java/xyz/kyngs/librelogin/common/AuthenticLibreLogin.java
index 5c873072..85f0b5a8 100644
--- a/Plugin/src/main/java/xyz/kyngs/librelogin/common/AuthenticLibreLogin.java
+++ b/Plugin/src/main/java/xyz/kyngs/librelogin/common/AuthenticLibreLogin.java
@@ -253,7 +253,9 @@ protected void enable() {
}
if (platformHandle.getPlatformIdentifier().equals("paper")) {
- LIMBO.setDefault(List.of("limbo"));
+ var limbo = HashMultimap.create();
+ limbo.put("root", "limbo");
+ LIMBO.setDefault(limbo);
var lobby = HashMultimap.create();
lobby.put("root", "world");
@@ -442,7 +444,7 @@ private void loadConfigs() {
var lobby = configuration.get(LOBBY);
for (String value : lobby.values()) {
- if (limbos.contains(value)) {
+ if (limbos.containsValue(value)) {
throw new CorruptedConfigurationException("Lobby server/world %s is also a limbo server/world, this is not allowed".formatted(value));
}
}
@@ -791,7 +793,7 @@ public void onExit(P player) {
var server = platformHandle.getPlayersServerName(player);
if (server == null) return;
var user = databaseProvider.getByUUID(platformHandle.getUUIDForPlayer(player));
- if (user != null && !getConfiguration().get(LIMBO).contains(server)) {
+ if (user != null && !getConfiguration().get(LIMBO).containsValue(server)) {
user.setLastServer(server);
databaseProvider.updateUser(user);
}
diff --git a/Plugin/src/main/java/xyz/kyngs/librelogin/common/config/ConfigurationKeys.java b/Plugin/src/main/java/xyz/kyngs/librelogin/common/config/ConfigurationKeys.java
index 309aff98..bf0e5212 100644
--- a/Plugin/src/main/java/xyz/kyngs/librelogin/common/config/ConfigurationKeys.java
+++ b/Plugin/src/main/java/xyz/kyngs/librelogin/common/config/ConfigurationKeys.java
@@ -36,13 +36,19 @@ public class ConfigurationKeys {
ConfigurateHelper::getStringList
);
- public static final ConfigurationKey> LIMBO = new ConfigurationKey<>(
+ public static final Multimap LIMBO_DEFAULT = HashMultimap.create();
+ public static final ConfigurationKey> LIMBO = new ConfigurationKey<>(
"limbo",
- List.of("limbo0", "limbo1"),
+ LIMBO_DEFAULT,
"The authentication servers/worlds, players should be sent to, when not authenticated. On Paper, players will be spawned on the world spawn. THIS SERVERS MUST BE REGISTERED IN THE PROXY CONFIG. IN CASE OF PAPER, THE WORLDS MUST EXIST.",
- ConfigurateHelper::getStringList
+ ConfigurateHelper::getServerMap
);
+ static {
+ LIMBO_DEFAULT.put("root", "limbo0");
+ LIMBO_DEFAULT.put("root", "limbo1");
+ }
+
public static final Multimap LOBBY_DEFAULT = HashMultimap.create();
public static final ConfigurationKey> LOBBY = new ConfigurationKey<>(
"lobby",
diff --git a/Plugin/src/main/java/xyz/kyngs/librelogin/common/server/AuthenticServerHandler.java b/Plugin/src/main/java/xyz/kyngs/librelogin/common/server/AuthenticServerHandler.java
index d59bb736..86fa54cc 100644
--- a/Plugin/src/main/java/xyz/kyngs/librelogin/common/server/AuthenticServerHandler.java
+++ b/Plugin/src/main/java/xyz/kyngs/librelogin/common/server/AuthenticServerHandler.java
@@ -31,14 +31,14 @@ public class AuthenticServerHandler implements ServerHandler
{
private final LoadingCache> pingCache;
private final AuthenticLibreLogin
plugin;
- private final Collection limboServers;
+ private final Multimap limboServers;
private final Multimap lobbyServers;
public AuthenticServerHandler(AuthenticLibreLogin plugin) {
this.plugin = plugin;
this.lobbyServers = HashMultimap.create();
- this.limboServers = new ArrayList<>();
+ this.limboServers = HashMultimap.create();
this.pingCache = Caffeine.newBuilder()
.build(server -> {
@@ -59,14 +59,14 @@ public AuthenticServerHandler(AuthenticLibreLogin
plugin) {
if (plugin.getConfiguration().get(ConfigurationKeys.PING_SERVERS))
plugin.getLogger().info("Pinging servers...");
- for (String limbo : plugin.getConfiguration().get(LIMBO)) {
- var server = handle.getServer(limbo, true);
- if (server != null) {
- registerLimboServer(server);
+ plugin.getConfiguration().get(ConfigurationKeys.LIMBO).forEach((forced, server) -> {
+ var s = handle.getServer(server, true);
+ if (s != null) {
+ registerLimboServer(s, forced);
} else {
- plugin.getLogger().warn("Limbo server/world " + limbo + " not found!");
+ plugin.getLogger().warn("Limbo server/world " + server + " not found!");
}
- }
+ });
plugin.getConfiguration().get(ConfigurationKeys.LOBBY).forEach((forced, server) -> {
var s = handle.getServer(server, false);
@@ -143,15 +143,22 @@ public S chooseLobbyServer(@Nullable User user, P player, boolean remember) {
return chooseLobbyServerInternal(user, player, remember, null);
}
- @Override
- public S chooseLimboServer(User user, P player) {
+ public S chooseLimboServerInternal(@Nullable User user, P player) {
var event = new AuthenticLimboServerChooseEvent<>(user, player, plugin);
plugin.getEventProvider().fire(plugin.getEventTypes().limboServerChoose, event);
if (event.getServer() != null) return event.getServer();
- return limboServers.stream()
+ var virtual = plugin.getPlatformHandle().getPlayersVirtualHost(player);
+
+ plugin.getLogger().debug("Virtual host for player " + plugin.getPlatformHandle().getUsernameForPlayer(player) + ": " + virtual);
+
+ var servers = virtual == null ? limboServers.get("root") : limboServers.get(virtual);
+
+ if (servers.isEmpty()) servers = limboServers.get("root");
+
+ return servers.stream()
.filter(server -> {
var ping = getLatestPing(server);
@@ -161,13 +168,18 @@ public S chooseLimboServer(User user, P player) {
.orElse(null);
}
+ @Override
+ public S chooseLimboServer(User user, P player) {
+ return chooseLimboServerInternal(user, player);
+ }
+
@Override
public Multimap getLobbyServers() {
return lobbyServers;
}
@Override
- public Collection getLimboServers() {
+ public Multimap getLimboServers() {
return limboServers;
}
@@ -178,8 +190,8 @@ public void registerLobbyServer(S server, String forcedHost) {
}
@Override
- public void registerLimboServer(S server) {
+ public void registerLimboServer(S server, String forcedHost) {
getLatestPing(server);
- limboServers.add(server);
+ limboServers.put(forcedHost, server);
}
}
diff --git a/Plugin/src/main/java/xyz/kyngs/librelogin/paper/Blockers.java b/Plugin/src/main/java/xyz/kyngs/librelogin/paper/Blockers.java
index a9d83660..b9fb1042 100644
--- a/Plugin/src/main/java/xyz/kyngs/librelogin/paper/Blockers.java
+++ b/Plugin/src/main/java/xyz/kyngs/librelogin/paper/Blockers.java
@@ -58,7 +58,7 @@ public void onTeleport(PlayerTeleportEvent event) {
if (inLimbo(event.getPlayer())) {
event.setCancelled(true);
} else {
- if (serverHandler.getLimboServers().contains(event.getTo().getWorld()) && !event.getPlayer().hasPermission("librelogin.limbo.access")) {
+ if (serverHandler.getLimboServers().containsValue(event.getTo().getWorld()) && !event.getPlayer().hasPermission("librelogin.limbo.access")) {
event.setCancelled(true);
}
}
diff --git a/Plugin/src/main/java/xyz/kyngs/librelogin/paper/PaperListeners.java b/Plugin/src/main/java/xyz/kyngs/librelogin/paper/PaperListeners.java
index 02eeddbd..bfa3c56a 100644
--- a/Plugin/src/main/java/xyz/kyngs/librelogin/paper/PaperListeners.java
+++ b/Plugin/src/main/java/xyz/kyngs/librelogin/paper/PaperListeners.java
@@ -155,8 +155,8 @@ public void chooseWorld(PlayerSpawnLocationEvent event) {
event.setSpawnLocation(bed == null ? world.value().getSpawnLocation() : bed);
}
//This is terrible, but should work
- if (event.getPlayer().hasPlayedBefore() && !plugin.getConfiguration().get(ConfigurationKeys.LIMBO).contains(event.getSpawnLocation().getWorld().getName())) {
- if (plugin.getConfiguration().get(ConfigurationKeys.LIMBO).contains(world.value().getName())) {
+ if (event.getPlayer().hasPlayedBefore() && !plugin.getConfiguration().get(ConfigurationKeys.LIMBO).containsValue(event.getSpawnLocation().getWorld().getName())) {
+ if (plugin.getConfiguration().get(ConfigurationKeys.LIMBO).containsValue(world.value().getName())) {
spawnLocationCache.put(event.getPlayer(), event.getSpawnLocation());
} else {
return;
diff --git a/Plugin/src/main/java/xyz/kyngs/librelogin/paper/PaperPlatformHandle.java b/Plugin/src/main/java/xyz/kyngs/librelogin/paper/PaperPlatformHandle.java
index d28bdc9b..1bcb035d 100644
--- a/Plugin/src/main/java/xyz/kyngs/librelogin/paper/PaperPlatformHandle.java
+++ b/Plugin/src/main/java/xyz/kyngs/librelogin/paper/PaperPlatformHandle.java
@@ -149,7 +149,7 @@ public ProxyData getProxyData() {
.add("authors", plugin.getDescription().getAuthors())
.toString()
).toList(),
- plugin.getServerHandler().getLimboServers().stream().map(this::fromWorld).toList(),
+ plugin.getServerHandler().getLimboServers().values().stream().map(this::fromWorld).toList(),
plugin.getServerHandler().getLobbyServers().values().stream().map(this::fromWorld).toList()
);
}
diff --git a/Plugin/src/main/java/xyz/kyngs/librelogin/velocity/Blockers.java b/Plugin/src/main/java/xyz/kyngs/librelogin/velocity/Blockers.java
index a400e12f..dbcd4716 100644
--- a/Plugin/src/main/java/xyz/kyngs/librelogin/velocity/Blockers.java
+++ b/Plugin/src/main/java/xyz/kyngs/librelogin/velocity/Blockers.java
@@ -53,7 +53,7 @@ public void onCommand(CommandExecuteEvent event) {
@Subscribe(order = PostOrder.FIRST)
public void onServerConnect(ServerPreConnectEvent event) {
if (authorizationProvider.isAwaiting2FA(event.getPlayer())) {
- if (!configuration.get(ConfigurationKeys.LIMBO).contains(event.getOriginalServer().getServerInfo().getName())) {
+ if (!configuration.get(ConfigurationKeys.LIMBO).containsValue(event.getOriginalServer().getServerInfo().getName())) {
event.setResult(ServerPreConnectEvent.ServerResult.denied());
}
}
diff --git a/Plugin/src/main/java/xyz/kyngs/librelogin/velocity/VelocityPlatformHandle.java b/Plugin/src/main/java/xyz/kyngs/librelogin/velocity/VelocityPlatformHandle.java
index 449d1143..3a6b8e45 100644
--- a/Plugin/src/main/java/xyz/kyngs/librelogin/velocity/VelocityPlatformHandle.java
+++ b/Plugin/src/main/java/xyz/kyngs/librelogin/velocity/VelocityPlatformHandle.java
@@ -144,7 +144,7 @@ public ProxyData getProxyData() {
.add("desc", plugin.getDescription().toString())
.toString()
).toList(),
- plugin.getServerHandler().getLimboServers().stream().map(Object::toString).toList(),
+ plugin.getServerHandler().getLimboServers().values().stream().map(Object::toString).toList(),
plugin.getServerHandler().getLobbyServers().values().stream().map(Object::toString).toList()
);
}