initial commit
This commit is contained in:
commit
9f63680d79
21 files changed
+929
No files matched your search
@@ -0,0 +1,83 @@
|
||||
package eu.mhsl.minenet.loginServer;
|
||||
|
||||
import net.kyori.adventure.key.Key;
|
||||
import net.kyori.adventure.nbt.CompoundBinaryTag;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.minestom.server.dialog.*;
|
||||
import net.minestom.server.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public final class Dialog {
|
||||
private static final Key submitKey = Key.key("profile", "submit");
|
||||
|
||||
public static void open(Player player) {
|
||||
List<DialogInput> inputs = new ArrayList<>();
|
||||
|
||||
boolean isAfterStart = Main.globalConfig
|
||||
.node("server", "is-after-start")
|
||||
.getBoolean(false);
|
||||
|
||||
if (isAfterStart) {
|
||||
inputs.add(new DialogInput.Text(
|
||||
"secret", 300,
|
||||
Component.text("Secret"),
|
||||
true, "", 50, null
|
||||
));
|
||||
}
|
||||
|
||||
inputs.add(new DialogInput.Text(
|
||||
"name", 300,
|
||||
Component.text("Vorname"),
|
||||
true, "", 50, null
|
||||
));
|
||||
|
||||
inputs.add(new DialogInput.Text(
|
||||
"secondName", 300,
|
||||
Component.text("Nachname"),
|
||||
true, "", 50, null
|
||||
));
|
||||
|
||||
inputs.add(new DialogInput.Text(
|
||||
"birthday", 300,
|
||||
Component.text("Geburtstag (TT.MM.JJJJ)"),
|
||||
true, "", 10, null
|
||||
));
|
||||
|
||||
inputs.add(new DialogInput.Text(
|
||||
"phoneNumber", 300,
|
||||
Component.text("Telefonnummer (optional)"),
|
||||
true, "", 30, null
|
||||
));
|
||||
|
||||
net.minestom.server.dialog.Dialog dialog = new net.minestom.server.dialog.Dialog.Notice(
|
||||
new DialogMetadata(
|
||||
Component.text("Spielerprofil erstellen"),
|
||||
null,
|
||||
true,
|
||||
false,
|
||||
DialogAfterAction.CLOSE,
|
||||
List.of(
|
||||
new DialogBody.PlainMessage(
|
||||
Component.text(
|
||||
"Bitte fülle deine Profildaten aus."
|
||||
),
|
||||
300
|
||||
)
|
||||
),
|
||||
inputs
|
||||
),
|
||||
new DialogActionButton(
|
||||
Component.text("Speichern"),
|
||||
null,
|
||||
200,
|
||||
new DialogAction.DynamicCustom(
|
||||
submitKey,
|
||||
CompoundBinaryTag.builder().build()
|
||||
)
|
||||
)
|
||||
);
|
||||
player.showDialog(dialog);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
package eu.mhsl.minenet.loginServer;
|
||||
|
||||
import eu.mhsl.minenet.loginServer.listeners.Listener;
|
||||
import net.minestom.server.Auth;
|
||||
import net.minestom.server.MinecraftServer;
|
||||
import net.minestom.server.extras.lan.OpenToLAN;
|
||||
import org.spongepowered.configurate.ConfigurationNode;
|
||||
import org.spongepowered.configurate.yaml.YamlConfigurationLoader;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
public class Main {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(Main.class.getName());
|
||||
|
||||
public static ConfigurationNode globalConfig;
|
||||
|
||||
static void main(String[] args) throws IOException {
|
||||
Path configPath = Path.of("resources", "config.yml");
|
||||
|
||||
if (Files.notExists(configPath)) {
|
||||
Files.createDirectories(configPath.getParent());
|
||||
try (InputStream in = Main.class.getResourceAsStream("/config.yml")) {
|
||||
if (in == null) {
|
||||
throw new IllegalStateException("config.yml fehlt in src/main/resources!");
|
||||
}
|
||||
Files.copy(in, configPath);
|
||||
}
|
||||
}
|
||||
|
||||
globalConfig = YamlConfigurationLoader.builder().path(configPath).build().load();
|
||||
|
||||
ConfigurationNode serverConfig = globalConfig.node("server");
|
||||
|
||||
int viewDistance = serverConfig.node("view-distance").getInt(12);
|
||||
if (viewDistance > 0) {
|
||||
System.setProperty("minestom.chunk-view-distance", String.valueOf(viewDistance));
|
||||
}
|
||||
|
||||
logger.info("Initialisiere Minecraft-Server ...");
|
||||
|
||||
Auth auth = new Auth.Online();
|
||||
if (globalConfig.node("bungeecord", "enabled").getBoolean(false)) {
|
||||
auth = new Auth.Bungee();
|
||||
} else if (globalConfig.node("velocity", "enabled").getBoolean(false)) {
|
||||
String secret = globalConfig.node("velocity", "secret").getString("");
|
||||
if (secret.isBlank()) {
|
||||
throw new IllegalStateException("Velocity ist aktiviert, aber das Secret fehlt!");
|
||||
}
|
||||
auth = new Auth.Velocity(secret);
|
||||
}
|
||||
|
||||
MinecraftServer server = MinecraftServer.init(auth);
|
||||
MinecraftServer.setCompressionThreshold(serverConfig.node("compression-threshold").getInt(0));
|
||||
|
||||
Listener.registerAll(
|
||||
MinecraftServer.getGlobalEventHandler(),
|
||||
MinecraftServer.getInstanceManager()
|
||||
);
|
||||
|
||||
if (serverConfig.node("open-to-lan").getBoolean(false)) {
|
||||
OpenToLAN.open();
|
||||
}
|
||||
|
||||
int port = serverConfig.node("port").getInt(25565);
|
||||
logger.info("Starte Minecraft-Server auf Port " + port + " ...");
|
||||
server.start("0.0.0.0", port);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package eu.mhsl.minenet.loginServer.listeners;
|
||||
|
||||
import net.minestom.server.event.Event;
|
||||
import net.minestom.server.event.EventNode;
|
||||
import net.minestom.server.instance.InstanceManager;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface Listener {
|
||||
void register(EventNode<Event> node);
|
||||
|
||||
static void registerAll(EventNode<Event> node, InstanceManager instanceManager) {
|
||||
List<Listener> listeners = List.of(
|
||||
new onPlayerJoin(instanceManager),
|
||||
new onPlayerMove(),
|
||||
new dialogOutput()
|
||||
);
|
||||
|
||||
listeners.forEach(listener -> listener.register(node));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
package eu.mhsl.minenet.loginServer.listeners;
|
||||
|
||||
import eu.mhsl.minenet.loginServer.Dialog;
|
||||
import eu.mhsl.minenet.loginServer.Main;
|
||||
import net.kyori.adventure.key.Key;
|
||||
import net.kyori.adventure.nbt.CompoundBinaryTag;
|
||||
import net.minestom.server.MinecraftServer;
|
||||
import net.minestom.server.entity.Player;
|
||||
import net.minestom.server.event.Event;
|
||||
import net.minestom.server.event.EventNode;
|
||||
import net.minestom.server.event.player.PlayerCustomClickEvent;
|
||||
import net.minestom.server.timer.SchedulerManager;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.time.LocalDate;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.time.format.DateTimeParseException;
|
||||
import java.time.format.ResolverStyle;
|
||||
import java.util.Locale;
|
||||
import java.util.UUID;
|
||||
|
||||
public class dialogOutput implements Listener {
|
||||
@Override
|
||||
public void register(EventNode<Event> node) {
|
||||
node.addListener(PlayerCustomClickEvent.class, event -> {
|
||||
Player player = event.getPlayer();
|
||||
SchedulerManager schedule = MinecraftServer.getSchedulerManager();
|
||||
boolean isAfterStart = Main.globalConfig.node("server", "is-after-start").getBoolean(false);
|
||||
if (!event.getKey().equals(
|
||||
Key.key("profile", "submit"))) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(event.getPayload() instanceof CompoundBinaryTag data)) {
|
||||
return;
|
||||
}
|
||||
|
||||
String requiredSecret = "test1234";
|
||||
|
||||
String secret = data.getString("secret");
|
||||
String name = data.getString("name");
|
||||
String secondName = data.getString("secondName");
|
||||
String birthday = data.getString("birthday");
|
||||
String phoneNumber = data.getString("phoneNumber");
|
||||
String playerName = event.getPlayer().getUsername();
|
||||
UUID playerUUID = event.getPlayer().getUuid();
|
||||
|
||||
if(isAfterStart && !secret.equals(requiredSecret)) {
|
||||
player.sendMessage("Bitte gebe das richtige Secret an.");
|
||||
schedule.buildTask(() -> {
|
||||
Dialog.open(player);
|
||||
}).delay(Duration.ofMillis(1500)).schedule();
|
||||
return;
|
||||
}
|
||||
if (name.isBlank() || secondName.isBlank() || birthday.isBlank()) {
|
||||
player.sendMessage("Bitte fülle alle Pflichtfelder aus.");
|
||||
schedule.buildTask(() -> {
|
||||
Dialog.open(player);
|
||||
}).delay(Duration.ofMillis(1500)).schedule();
|
||||
return;
|
||||
}
|
||||
|
||||
if(!isValidBirthday(birthday)) {
|
||||
player.sendMessage("Bitte gebe ein richtiges Geburtsdatum an.");
|
||||
schedule.buildTask(() -> {
|
||||
Dialog.open(player);
|
||||
}).delay(Duration.ofMillis(1500)).schedule();
|
||||
return;
|
||||
}
|
||||
|
||||
player.sendMessage("Danke für deine Anmeldung.");
|
||||
player.sendMessage("Du bist für das Projekt Craftattack 9 registriert!");
|
||||
|
||||
schedule.buildTask(() -> {
|
||||
player.kick("Anmeldung erfolgreich!");
|
||||
}).delay(Duration.ofMillis(1500)).schedule();
|
||||
|
||||
System.out.println("Vorname: " + name);
|
||||
System.out.println("Nachname: " + secondName);
|
||||
System.out.println("Geburtstag: " + birthday);
|
||||
System.out.println("Telefonnummer: " + phoneNumber);
|
||||
System.out.println("Spielername: " + playerName);
|
||||
System.out.println("Spieler UUID: " + playerUUID);
|
||||
});
|
||||
}
|
||||
|
||||
public static boolean isValidBirthday(String birthday) {
|
||||
DateTimeFormatter formatter = DateTimeFormatter
|
||||
.ofPattern("dd.MM.uuuu", Locale.GERMANY)
|
||||
.withResolverStyle(ResolverStyle.STRICT);
|
||||
try {
|
||||
LocalDate date = LocalDate.parse(birthday, formatter);
|
||||
return !date.isAfter(LocalDate.now());
|
||||
|
||||
} catch (DateTimeParseException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package eu.mhsl.minenet.loginServer.listeners;
|
||||
|
||||
import eu.mhsl.minenet.loginServer.Dialog;
|
||||
import net.minestom.server.MinecraftServer;
|
||||
import net.minestom.server.coordinate.Pos;
|
||||
import net.minestom.server.entity.Player;
|
||||
import net.minestom.server.event.Event;
|
||||
import net.minestom.server.event.EventNode;
|
||||
import net.minestom.server.event.player.AsyncPlayerConfigurationEvent;
|
||||
import net.minestom.server.instance.InstanceManager;
|
||||
|
||||
import java.time.Duration;
|
||||
|
||||
public class onPlayerJoin implements Listener {
|
||||
private final InstanceManager instanceManager;
|
||||
|
||||
public onPlayerJoin(InstanceManager instanceManager) {
|
||||
this.instanceManager = instanceManager;
|
||||
}
|
||||
@Override
|
||||
public void register(EventNode<Event> node) {
|
||||
node.addListener(AsyncPlayerConfigurationEvent.class, event ->{
|
||||
final Player player = event.getPlayer();
|
||||
event.setSpawningInstance(instanceManager.createInstanceContainer());
|
||||
player.setRespawnPoint(new Pos(0, 100, 0));
|
||||
MinecraftServer.getSchedulerManager().buildTask(() -> {
|
||||
Dialog.open(player);
|
||||
}).delay(Duration.ofMillis(500)).schedule();
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package eu.mhsl.minenet.loginServer.listeners;
|
||||
|
||||
import net.minestom.server.event.Event;
|
||||
import net.minestom.server.event.EventNode;
|
||||
import net.minestom.server.event.player.PlayerMoveEvent;
|
||||
|
||||
public class onPlayerMove implements Listener {
|
||||
@Override
|
||||
public void register(EventNode<Event> node) {
|
||||
node.addListener(PlayerMoveEvent.class, event -> {
|
||||
event.setCancelled(true);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
server:
|
||||
port: 25565
|
||||
view-distance: 12
|
||||
compression-threshold: 0
|
||||
open-to-lan: false
|
||||
is-after-start: false
|
||||
|
||||
bungeecord:
|
||||
enabled: false
|
||||
|
||||
velocity:
|
||||
enabled: false
|
||||
chat-via-proxy: false
|
||||
secret: ''
|
||||
Reference in new issue
Block a user