@FunctionalInterface public static interface ServerLoginNetworking.LoginSynchronizer
waitFor(Future)
are completed.Modifier and Type | Method and Description |
---|---|
void |
waitFor(Future<?> future)
Allows blocking client log-in until the
future is done . |
void waitFor(Future<?> future)
future
is done
.
Since packet reception happens on netty's event loops, this allows handlers to perform logic on the Server Thread, etc. For instance, a handler can prepare an upcoming query request or check necessary login data on the server thread.
Here is an example where the player log-in is blocked so that a credential check and building of a followup query request can be performed properly on the logical server thread before the player successfully logs in:
ServerLoginNetworking.registerGlobalReceiver(CHECK_CHANNEL, (server, handler, understood, buf, synchronizer, responseSender) -> {
if (!understood) {
handler.disconnect(new LiteralText("Only accept clients that can check!"));
return;
}
String checkMessage = buf.readString(32767);
// Just send the CompletableFuture returned by the server's submit method
synchronizer.waitFor(server.submit(() -> {
LoginInfoChecker checker = LoginInfoChecker.get(server);
if (!checker.check(handler.getConnectionInfo(), checkMessage)) {
handler.disconnect(new LiteralText("Invalid credentials!"));
return;
}
responseSender.send(UPCOMING_CHECK, checker.buildSecondQueryPacket(handler, checkMessage));
}));
});
Usually it is enough to pass the return value for ThreadExecutor.submit(Runnable)
for future
.future
- the future that must be done before the player can log in