diff --git a/src/main/java/eu/mhsl/craftattack/loginServer/Dialog.java b/src/main/java/eu/mhsl/craftattack/loginServer/Dialog.java index c18fe60..db95682 100644 --- a/src/main/java/eu/mhsl/craftattack/loginServer/Dialog.java +++ b/src/main/java/eu/mhsl/craftattack/loginServer/Dialog.java @@ -92,7 +92,7 @@ public final class Dialog { inputs.add(text("phoneNumber", "Telefonnummer (optional)", state.phoneNumber, 30)); } case consent -> { - title = "Einverständnis"; + title = "Serverregeln"; body.add(plain(Component.text("Serverregeln", NamedTextColor.GOLD, TextDecoration.BOLD), rulesWidth)); body.add(plain(Component.text(rulesPreamble, NamedTextColor.GRAY), rulesWidth)); for (String rule : rules) { @@ -103,25 +103,30 @@ public final class Dialog { .append(Component.text(" | ")) .append(link("Vollständige Regeln", rulesUrl)) .build(), rulesWidth)); + } + case privacy -> { + title = "Einverständnis (1/3)"; body.add(plain(Component.text( - "Mit den drei Haken erklärst du: " + - "1) Ich bin mit der Speicherung meiner in der Anmeldung angegebenen, persönlichen Daten einverstanden. " + - "2) Ich bin mit der Speicherung in Form von Logs aller meiner, beim Spielen anfallenden, " + + "Ich bin mit der Speicherung meiner in der Anmeldung angegebenen, persönlichen Daten einverstanden.", + NamedTextColor.GRAY), rulesWidth)); + inputs.add(checkbox("privacy", "Ich stimme zu *", state.privacyAccepted)); + } + case logs -> { + title = "Einverständnis (2/3)"; + body.add(plain(Component.text( + "Ich bin mit der Speicherung in Form von Logs aller meiner, beim Spielen anfallenden, " + "persönlichen Daten durch den Server einverstanden. " + "Die Log-Speicherung betrifft jede Interaktion im Spiel und zugehörige Daten, " + - "z.B. Chatnachrichten, welche vom Minecraft-Client an den Server übermittelt werden. " + - "3) Ich bin mit den Regeln einverstanden und achte sie.", + "z.B. Chatnachrichten, welche vom Minecraft-Client an den Server übermittelt werden.", NamedTextColor.GRAY), rulesWidth)); - - inputs.add(checkbox("privacy", - "Ich stimme der Speicherung meiner\nAnmeldedaten zu. *", - state.privacyAccepted)); - inputs.add(checkbox("logs", - "Ich stimme der Speicherung meiner\nSpiel-Logs zu. *", - state.logsAccepted)); - inputs.add(checkbox("rules", - "Ich akzeptiere die Regeln\nund halte sie ein. *", - state.rulesAccepted)); + inputs.add(checkbox("logs", "Ich stimme zu *", state.logsAccepted)); + } + case rules -> { + title = "Einverständnis (3/3)"; + body.add(plain(Component.text( + "Ich bin mit den Regeln einverstanden und achte sie.", + NamedTextColor.GRAY), rulesWidth)); + inputs.add(checkbox("rules", "Ich stimme zu *", state.rulesAccepted)); } default -> throw new IllegalStateException(); } @@ -159,11 +164,10 @@ public final class Dialog { state.birthday = payload.getString("birthday", "").trim(); state.phoneNumber = payload.getString("phoneNumber", "").trim(); } - case consent -> { - state.privacyAccepted = payload.getBoolean("privacy", false); - state.logsAccepted = payload.getBoolean("logs", false); - state.rulesAccepted = payload.getBoolean("rules", false); - } + case consent -> {} + case privacy -> state.privacyAccepted = payload.getBoolean("privacy", false); + case logs -> state.logsAccepted = payload.getBoolean("logs", false); + case rules -> state.rulesAccepted = payload.getBoolean("rules", false); } } @@ -175,9 +179,15 @@ public final class Dialog { if (!isValidBirthday(state.birthday)) return error("Bitte gib ein richtiges Geburtsdatum an."); } - case consent -> { - if (!(state.privacyAccepted && state.logsAccepted && state.rulesAccepted)) - return error("Du musst allen drei Punkten zustimmen, um fortzufahren."); + case consent -> {} + case privacy -> { + if (!state.privacyAccepted) return error("Du musst zustimmen, um fortzufahren."); + } + case logs -> { + if (!state.logsAccepted) return error("Du musst zustimmen, um fortzufahren."); + } + case rules -> { + if (!state.rulesAccepted) return error("Du musst zustimmen, um fortzufahren."); } } return null; @@ -204,6 +214,11 @@ public final class Dialog { ); } + private static Component link(String text, String url) { + return Component.text(text, NamedTextColor.AQUA, TextDecoration.UNDERLINED) + .clickEvent(ClickEvent.openUrl(url)); + } + private static DialogInput text(String key, String label, String initial, int maxLength) { return new DialogInput.Text(key, 300, Component.text(label), true, initial, maxLength, null); } @@ -228,8 +243,4 @@ public final class Dialog { return Component.text(text, NamedTextColor.RED); } - private static Component link(String text, String url) { - return Component.text(text, NamedTextColor.AQUA, TextDecoration.UNDERLINED) - .clickEvent(ClickEvent.openUrl(url)); - } } \ No newline at end of file diff --git a/src/main/java/eu/mhsl/craftattack/loginServer/DialogState.java b/src/main/java/eu/mhsl/craftattack/loginServer/DialogState.java index 90a1a75..8128a92 100644 --- a/src/main/java/eu/mhsl/craftattack/loginServer/DialogState.java +++ b/src/main/java/eu/mhsl/craftattack/loginServer/DialogState.java @@ -3,9 +3,9 @@ package eu.mhsl.craftattack.loginServer; import java.util.List; public final class DialogState { - public enum Page { data, consent } + public enum Page { data, consent, privacy, logs, rules } - private static final List pages = List.of(Page.data, Page.consent); + private static final List pages = List.of(Page.data, Page.consent, Page.privacy, Page.logs, Page.rules); private int pageIndex = 0; String firstName = ""; diff --git a/src/main/java/eu/mhsl/craftattack/loginServer/PlayerHandler.java b/src/main/java/eu/mhsl/craftattack/loginServer/PlayerHandler.java index e9de0ba..daae728 100644 --- a/src/main/java/eu/mhsl/craftattack/loginServer/PlayerHandler.java +++ b/src/main/java/eu/mhsl/craftattack/loginServer/PlayerHandler.java @@ -19,6 +19,7 @@ import java.util.concurrent.ConcurrentHashMap; public final class PlayerHandler { private static final Map states = new ConcurrentHashMap<>(); + private static final Map lastLook = new ConcurrentHashMap<>(); private PlayerHandler() {} @@ -36,11 +37,26 @@ public final class PlayerHandler { DialogState state = states.computeIfAbsent(player.getUuid(), id -> DialogState.create()); MinecraftServer.getSchedulerManager() - .buildTask(() -> Dialog.open(player, state)) + .buildTask(() -> showDialog(player, state)) .delay(Duration.ofMillis(500)) .schedule(); } + public static void onMove(Player player, float newYaw, float newPitch) { + DialogState state = states.get(player.getUuid()); + if (state == null) return; + float[] last = lastLook.get(player.getUuid()); + if (last != null && last[0] == newYaw && last[1] == newPitch) return; + lastLook.put(player.getUuid(), new float[]{newYaw, newPitch}); + if (last == null) return; + showDialog(player, state); + } + + private static void showDialog(Player player, DialogState state) { + lastLook.put(player.getUuid(), new float[]{player.getPosition().yaw(), player.getPosition().pitch()}); + Dialog.open(player, state); + } + public static void handleDialogClick(PlayerCustomClickEvent event) { if (!Dialog.isDialogKey(event.getKey())) return; @@ -56,6 +72,7 @@ public final class PlayerHandler { private static void complete(Player player, DialogState state) { states.remove(player.getUuid()); + lastLook.remove(player.getUuid()); String birthdayIso; try { diff --git a/src/main/java/eu/mhsl/craftattack/loginServer/listeners/PlayerMoveListener.java b/src/main/java/eu/mhsl/craftattack/loginServer/listeners/PlayerMoveListener.java index c09dff2..d8408aa 100644 --- a/src/main/java/eu/mhsl/craftattack/loginServer/listeners/PlayerMoveListener.java +++ b/src/main/java/eu/mhsl/craftattack/loginServer/listeners/PlayerMoveListener.java @@ -1,5 +1,6 @@ package eu.mhsl.craftattack.loginServer.listeners; +import eu.mhsl.craftattack.loginServer.PlayerHandler; import net.minestom.server.event.Event; import net.minestom.server.event.EventNode; import net.minestom.server.event.player.PlayerMoveEvent; @@ -7,6 +8,9 @@ import net.minestom.server.event.player.PlayerMoveEvent; public class PlayerMoveListener implements Listener { @Override public void register(EventNode node) { - node.addListener(PlayerMoveEvent.class, event -> event.setCancelled(true)); + node.addListener(PlayerMoveEvent.class, event -> { + event.setCancelled(true); + PlayerHandler.onMove(event.getPlayer(), event.getNewPosition().yaw(), event.getNewPosition().pitch()); + }); } }