new gc-,gamemode- and tp-command, tab shows ram usage

This commit is contained in:
Martin Olischläger 2023-04-16 18:31:53 +02:00
parent 94d9ba1bae
commit dca9c7bfb6
8 changed files with 182 additions and 16 deletions

@ -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) {

@ -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<TickMonitor> lastTick = new AtomicReference<>();
@Override
public void run() {
Collection<Player> 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);
}
}

@ -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)
);
}
}

@ -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;
}
}

@ -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);
}
}

@ -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<PlayerChunkUnloadEvent> {
@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) {}
}
}
}

@ -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<PlayerUseItemEvent> {
@ -19,14 +14,6 @@ public class ClickListener implements Consumer<PlayerUseItemEvent> {
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);

@ -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 {