diff --git a/src/main/java/eu/mhsl/craftattack/worldmuseum/Main.java b/src/main/java/eu/mhsl/craftattack/worldmuseum/Main.java index 464ca41..dcb7f9f 100755 --- a/src/main/java/eu/mhsl/craftattack/worldmuseum/Main.java +++ b/src/main/java/eu/mhsl/craftattack/worldmuseum/Main.java @@ -1,5 +1,9 @@ package eu.mhsl.craftattack.worldmuseum; +import eu.mhsl.craftattack.worldmuseum.commands.GamemodeCommand; +import eu.mhsl.craftattack.worldmuseum.commands.GcCommand; +import eu.mhsl.craftattack.worldmuseum.commands.TeleportCommand; +import eu.mhsl.craftattack.worldmuseum.listener.ChunkUnloading; import eu.mhsl.craftattack.worldmuseum.listener.ClickListener; import eu.mhsl.craftattack.worldmuseum.worlds.WorldManager; import net.minestom.server.MinecraftServer; @@ -7,11 +11,13 @@ import net.minestom.server.coordinate.Pos; import net.minestom.server.entity.GameMode; import net.minestom.server.entity.Player; import net.minestom.server.event.GlobalEventHandler; +import net.minestom.server.event.player.PlayerChunkUnloadEvent; import net.minestom.server.event.player.PlayerLoginEvent; import net.minestom.server.event.player.PlayerUseItemEvent; import net.minestom.server.instance.InstanceContainer; import net.minestom.server.instance.InstanceManager; import net.minestom.server.instance.block.Block; +import net.minestom.server.timer.TaskSchedule; import java.util.ArrayList; @@ -28,11 +34,23 @@ public class Main { MinecraftServer minecraftServer = MinecraftServer.init(); InstanceManager instanceManager = MinecraftServer.getInstanceManager(); + + + + //temp + MinecraftServer.getSchedulerManager().scheduleTask(new TablistUpdateTask(), TaskSchedule.tick(20), TaskSchedule.tick(20)); + + + + + + + + + //load eu.mhsl.craftattack.worldmuseum.worlds / configExample file WorldManager.getInstance().loadWorlds(); - - // Create starting-instance / world InstanceContainer instanceContainer = instanceManager.createInstanceContainer(); instanceContainer.setBlock(0,0,0,Block.STONE); @@ -40,6 +58,16 @@ public class Main { // Add an event callback to specify the spawning instance (and the spawn position) GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler(); + + //listeners + globalEventHandler.addListener(PlayerUseItemEvent.class, new ClickListener()); + globalEventHandler.addListener(PlayerChunkUnloadEvent.class, new ChunkUnloading()); + + //commands + MinecraftServer.getCommandManager().register(new TeleportCommand()); + MinecraftServer.getCommandManager().register(new GcCommand()); + MinecraftServer.getCommandManager().register(new GamemodeCommand()); + globalEventHandler.addListener(PlayerLoginEvent.class, event -> { final Player player = event.getPlayer(); event.setSpawningInstance(instanceContainer); @@ -57,7 +85,7 @@ public class Main { } } }); - globalEventHandler.addListener(PlayerUseItemEvent.class, new ClickListener()); + try { PORT = Integer.parseInt(args[0]); } catch (Exception e) { diff --git a/src/main/java/eu/mhsl/craftattack/worldmuseum/TablistUpdateTask.java b/src/main/java/eu/mhsl/craftattack/worldmuseum/TablistUpdateTask.java new file mode 100644 index 0000000..e346ac1 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/worldmuseum/TablistUpdateTask.java @@ -0,0 +1,46 @@ +package eu.mhsl.craftattack.worldmuseum; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.minestom.server.MinecraftServer; +import net.minestom.server.adventure.audience.Audiences; +import net.minestom.server.entity.Player; +import net.minestom.server.monitoring.TickMonitor; + +import java.util.Collection; +import java.util.concurrent.atomic.AtomicReference; + +public class TablistUpdateTask implements Runnable { + private static final Runtime runtime = Runtime.getRuntime(); + private static final AtomicReference lastTick = new AtomicReference<>(); + + + @Override + public void run() { + Collection players = MinecraftServer.getConnectionManager().getOnlinePlayers(); + if (players.isEmpty()) return; + + final Component header = + Component.newline() + .append(Component.text("MineNet Network", NamedTextColor.GOLD)) + .append(Component.newline()).append(Component.text("Players: " + players.size())) + .append(Component.newline()) + .append(Component.newline()).append(Component.text("RAM: " + getRamUsage() + " MB", NamedTextColor.GRAY)) + .append(Component.newline()).append(Component.text("TICK: " + getTickMonitor().getTickTime() + "ms", NamedTextColor.GRAY)) + .append(Component.newline()); + + final Component footer = + Component.newline() + .append(Component.text("mhsl.eu")) + .append(Component.newline()); + + Audiences.players().sendPlayerListHeaderAndFooter(header, footer); + } + public static long getRamUsage() { + return (runtime.totalMemory() - runtime.freeMemory()) / 1024 / 1024; + } + public static TickMonitor getTickMonitor() { + return lastTick.get() != null ? lastTick.get() : new TickMonitor(0, 0); + } + +} diff --git a/src/main/java/eu/mhsl/craftattack/worldmuseum/commands/GamemodeCommand.java b/src/main/java/eu/mhsl/craftattack/worldmuseum/commands/GamemodeCommand.java new file mode 100644 index 0000000..1793686 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/worldmuseum/commands/GamemodeCommand.java @@ -0,0 +1,20 @@ +package eu.mhsl.craftattack.worldmuseum.commands; + +import net.minestom.server.command.builder.Command; +import net.minestom.server.command.builder.arguments.ArgumentEnum; +import net.minestom.server.command.builder.arguments.ArgumentType; +import net.minestom.server.entity.GameMode; +import net.minestom.server.entity.Player; + +public class GamemodeCommand extends Command { + public GamemodeCommand() { + super("gamemode", "gm"); + +// setCondition((sender, commandString) -> sender.hasPermission("admin")); + + addSyntax((sender, context) -> ((Player) sender).setGameMode( + context.get("target")), + ArgumentType.Enum("target", GameMode.class).setFormat(ArgumentEnum.Format.LOWER_CASED) + ); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/worldmuseum/commands/GcCommand.java b/src/main/java/eu/mhsl/craftattack/worldmuseum/commands/GcCommand.java new file mode 100644 index 0000000..641a22f --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/worldmuseum/commands/GcCommand.java @@ -0,0 +1,39 @@ +package eu.mhsl.craftattack.worldmuseum.commands; + +import net.minestom.server.command.builder.Command; + +public class GcCommand extends Command { + private static long lastRun = System.currentTimeMillis(); + private static final Runtime runtime = Runtime.getRuntime(); + + public GcCommand() { + super("gc"); + +// setCondition((sender, commandString) -> sender.hasPermission("admin")); + + setDefaultExecutor((sender, context) -> { + long nextRun = (lastRun - (System.currentTimeMillis() - 30*1000)) / 1000; + if(nextRun > 0) { + sender.sendMessage("pls wait"); + // new ChatMessage(Icon.ERROR).appendStatic("Please wait ").appendStatic(String.valueOf(nextRun)).appendStatic(" seconds before running GC again!").send(sender); + return; + } + + lastRun = System.currentTimeMillis(); + + long before = getRamUsage(); + System.gc(); + long after = getRamUsage(); + + sender.sendMessage("before: " + before + " now: " + after); +// new ChatMessage(Icon.SUCCESS).appendStatic("Garbage collector ran successfully!").indent(1).newLine() +// .appendStatic("before: ").appendStatic(String.valueOf(before)).appendStatic("MB").newLine() +// .appendStatic("now: ").appendStatic(String.valueOf(after)).appendStatic("MB").indent(1).newLine() +// .appendStatic("difference: ").appendStatic(String.valueOf(before-after)).appendStatic("MB") +// .send(sender); + }); + } + public static long getRamUsage() { + return (runtime.totalMemory() - runtime.freeMemory()) / 1024 / 1024; + } +} diff --git a/src/main/java/eu/mhsl/craftattack/worldmuseum/commands/TeleportCommand.java b/src/main/java/eu/mhsl/craftattack/worldmuseum/commands/TeleportCommand.java new file mode 100644 index 0000000..af513b8 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/worldmuseum/commands/TeleportCommand.java @@ -0,0 +1,24 @@ +package eu.mhsl.craftattack.worldmuseum.commands; + +import net.minestom.server.command.builder.Command; +import net.minestom.server.command.builder.arguments.ArgumentType; +import net.minestom.server.entity.Player; + +public class TeleportCommand extends Command { + + public TeleportCommand() { + super("tp","teleport"); + setDefaultExecutor(((sender, context) -> { + sender.sendMessage("test"); + })); + + var playerArgument = ArgumentType.Entity("Spieler").onlyPlayers(true); + var number = ArgumentType.Integer("Kordinaten"); + + addSyntax(((sender, context) -> { + Player targetPlayer = (Player) context.get(playerArgument).find(sender).get(0); + Player p = (Player) sender; + p.teleport(targetPlayer.getPosition()); + }), playerArgument); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/worldmuseum/listener/ChunkUnloading.java b/src/main/java/eu/mhsl/craftattack/worldmuseum/listener/ChunkUnloading.java new file mode 100644 index 0000000..e5a2d28 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/worldmuseum/listener/ChunkUnloading.java @@ -0,0 +1,20 @@ +package eu.mhsl.craftattack.worldmuseum.listener; + +import net.minestom.server.event.player.PlayerChunkUnloadEvent; + +import java.util.function.Consumer; + +public class ChunkUnloading implements Consumer { + @Override + public void accept(PlayerChunkUnloadEvent e) { + + var chunk = e.getInstance().getChunk(e.getChunkX(), e.getChunkZ()); + if (chunk == null) return; + + if (chunk.getViewers().size() == 0) { + try { + e.getInstance().unloadChunk(e.getChunkX(), e.getChunkZ()); + } catch (NullPointerException ignored) {} + } + } +} diff --git a/src/main/java/eu/mhsl/craftattack/worldmuseum/listener/ClickListener.java b/src/main/java/eu/mhsl/craftattack/worldmuseum/listener/ClickListener.java index e75a3e1..d4464b7 100755 --- a/src/main/java/eu/mhsl/craftattack/worldmuseum/listener/ClickListener.java +++ b/src/main/java/eu/mhsl/craftattack/worldmuseum/listener/ClickListener.java @@ -2,14 +2,9 @@ package eu.mhsl.craftattack.worldmuseum.listener; import eu.mhsl.craftattack.worldmuseum.worlds.World; import eu.mhsl.craftattack.worldmuseum.worlds.WorldManager; -import net.minestom.server.coordinate.Pos; import net.minestom.server.entity.Player; import net.minestom.server.event.player.PlayerUseItemEvent; -import net.minestom.server.inventory.Inventory; -import net.minestom.server.inventory.InventoryType; import net.minestom.server.item.ItemStack; -import net.minestom.server.item.Material; - import java.util.function.Consumer; public class ClickListener implements Consumer { @@ -19,14 +14,6 @@ public class ClickListener implements Consumer { Player p = playerUseItemEvent.getPlayer(); ItemStack usedItem = playerUseItemEvent.getItemStack(); - - - -// Inventory inventory = new Inventory(InventoryType.WINDOW_3X3, "asdasd"); -// inventory.setItemStack(0, ItemStack.builder(Material.GRASS_BLOCK).build()); -// p.openInventory(inventory); - - for (int i = 0; i < WorldManager.getInstance().getWorlds().size(); i++) { World world = WorldManager.getInstance().getWorlds().get(i); diff --git a/src/main/java/eu/mhsl/craftattack/worldmuseum/worlds/World.java b/src/main/java/eu/mhsl/craftattack/worldmuseum/worlds/World.java index 924415e..c84f789 100755 --- a/src/main/java/eu/mhsl/craftattack/worldmuseum/worlds/World.java +++ b/src/main/java/eu/mhsl/craftattack/worldmuseum/worlds/World.java @@ -40,9 +40,11 @@ public class World extends InstanceContainer { static { MinecraftServer.getDimensionTypeManager().addDimension(dimension); } + AnvilLoader anvilLoader; public World(File file) { super(UUID.randomUUID(), dimension, new AnvilLoader(file.getPath())); + this.anvilLoader = new AnvilLoader(file.getPath()); MinecraftServer.getInstanceManager().registerInstance(this); this.file = file; try {