Emberveil sourcetests/ConcurrentLoginCheck.java
import com.rs2.game.players.*;
import java.util.*;
import java.util.concurrent.*;
public final class ConcurrentLoginCheck {
static int checks;
static void check(boolean b,String m){checks++;if(!b)throw new AssertionError(m);}
static Client client(String name){Client c=new Client(null,1);c.playerName=name;c.isBot=true;return c;}
public static void main(String[] args)throws Exception {
for(int round=0;round<10;round++) {
Arrays.fill(PlayerHandler.players,null);Arrays.fill(PlayerHandler.playersCurrentlyOn,null);
PlayerHandler handler=new PlayerHandler();Client pending=client("still-saving");pending.disconnected=true;PlayerHandler.players[1]=pending;
int count=64;ExecutorService pool=Executors.newFixedThreadPool(count);CountDownLatch ready=new CountDownLatch(count),start=new CountDownLatch(1);
List<Client> clients=new ArrayList<>();List<Future<Boolean>> results=new ArrayList<>();
for(int i=0;i<count;i++){Client c=client("concurrent"+i);clients.add(c);results.add(pool.submit(()->{ready.countDown();start.await();return handler.newPlayerClient(c);}));}
check(ready.await(10,TimeUnit.SECONDS),"login threads become ready");start.countDown();
Set<Integer> slots=new HashSet<>();for(int i=0;i<count;i++){check(results.get(i).get(10,TimeUnit.SECONDS),"simultaneous login admitted");Client c=clients.get(i);check(slots.add(c.playerId),"unique player slot");check(PlayerHandler.players[c.playerId]==c,"connection never overwritten");}
pool.shutdownNow();check(PlayerHandler.players[1]==pending,"disconnected player retained until save/cleanup");
check(PlayerHandler.isPlayerOn("CONCURRENT0"),"duplicate lookup sees reservation before next world tick");
check(!handler.newPlayerClient(client("Concurrent0")),"duplicate login refused atomically");
}
Arrays.fill(PlayerHandler.players,null);System.out.println("PASS "+checks+" concurrent login reservation, duplicate and pending-save checks");
}
}