Fixed saturn player tracking

This commit is contained in:
2026-03-21 20:40:20 +01:00
parent 9064238c3a
commit f1913de95c
3 changed files with 91 additions and 18 deletions
@@ -183,18 +183,18 @@ public class ServiceClient {
}); });
} }
public static void player(UUID uuid, String name) { public static SaturnPlayer getPlayer(UUID uuid, String name) {
try { try {
session.request(ServiceMethods.GetPlayer, uuid.toString()) ServiceMethods.Types.Player player = session.request(ServiceMethods.GetPlayer, uuid.toString()).join();
.whenComplete((user, throwable) -> {
if (throwable != null) { if (player == null)
throwable.printStackTrace(); return null;
} else if (user != null) {
SaturnPlayer.set(user.toSaturnPlayer(uuid, name)); return player.toSaturnPlayer(uuid, name);
}
});
} catch (Exception e) { } catch (Exception e) {
Providers.saturn.logError("Failed to get player", e); Providers.saturn.logError("Failed to get player", e);
} }
return null;
} }
} }
@@ -2,13 +2,23 @@ package org.saturnclient.client.player;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Queue;
import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import org.saturnclient.client.ServiceClient; import org.saturnclient.client.ServiceClient;
import org.saturnclient.common.provider.Providers;
public class SaturnPlayer { public class SaturnPlayer {
private static Map<UUID, SaturnPlayer> PLAYERS = new HashMap<>(); private static final Map<UUID, SaturnPlayer> PLAYERS = new HashMap<>();
private static Map<String, UUID> PLAYER_NAMES = new HashMap<>();
private static final Queue<UUID> QUEUE = new ConcurrentLinkedQueue<>();
private static final Set<UUID> QUEUED = ConcurrentHashMap.newKeySet();
private static volatile boolean RUNNING = false;
private static Thread WORKER;
public String cloak = ""; public String cloak = "";
public String hat = ""; public String hat = "";
@@ -29,19 +39,30 @@ public class SaturnPlayer {
return PLAYERS.get(ServiceClient.uuid); return PLAYERS.get(ServiceClient.uuid);
} }
public static SaturnPlayer get(String name, UUID uuid) {
if (uuid == null)
return null;
SaturnPlayer player = PLAYERS.get(uuid);
if (player == null && QUEUED.add(uuid)) {
PLAYERS.put(uuid, null);
QUEUE.add(uuid);
startPlayerThread();
}
return player;
}
public static SaturnPlayer get(UUID uuid) { public static SaturnPlayer get(UUID uuid) {
return PLAYERS.get(uuid); return get(Providers.saturn.getClient().getPlayerListEntry(uuid), uuid);
} }
public static SaturnPlayer get(String name) { public static SaturnPlayer get(String name) {
UUID uuid = PLAYER_NAMES.get(name); return get(name, Providers.saturn.getClient().getPlayerListEntryUUID(name));
if (uuid == null)
return null;
return PLAYERS.get(uuid);
} }
public static void set(SaturnPlayer player) { public static void set(SaturnPlayer player) {
PLAYER_NAMES.put(player.name, player.uuid);
PLAYERS.put(player.uuid, player); PLAYERS.put(player.uuid, player);
} }
@@ -51,4 +72,52 @@ public class SaturnPlayer {
.toArray(String[]::new); .toArray(String[]::new);
} }
public static synchronized void startPlayerThread() {
if (RUNNING)
return;
RUNNING = true;
WORKER = new Thread(() -> {
long lastWorkTime = System.currentTimeMillis();
while (true) {
UUID uuid = QUEUE.poll();
if (uuid != null) {
try {
String name = Providers.saturn.getClient().getPlayerListEntry(uuid);
SaturnPlayer player = ServiceClient.getPlayer(uuid, name);
// Apply on main thread
Providers.saturn.getClient().executeOnThread(() -> {
PLAYERS.put(uuid, player);
});
} catch (Exception e) {
Providers.saturn.logError("Failed to fetch player " + uuid, e);
} finally {
QUEUED.remove(uuid);
}
lastWorkTime = System.currentTimeMillis();
} else {
if (System.currentTimeMillis() - lastWorkTime > 5000) {
break;
}
try {
Thread.sleep(50);
} catch (InterruptedException ignored) {
}
}
}
RUNNING = false;
}, "SaturnPlayer-Worker");
WORKER.setDaemon(true);
WORKER.start();
}
} }
@@ -36,4 +36,8 @@ public interface MinecraftClientRef {
public void scheduleStop(); public void scheduleStop();
public void executeOnThread(Runnable runnable); public void executeOnThread(Runnable runnable);
public String getPlayerListEntry(UUID uuid);
public UUID getPlayerListEntryUUID(String name);
} }