Refactored Command structure, began support for API driven Rooms

This commit is contained in:
Elias Müller 2023-10-01 19:32:14 +02:00
parent 8fddabe00f
commit 61448e77f2
18 changed files with 167 additions and 49 deletions

View File

@ -0,0 +1,4 @@
package eu.mhsl.minenet.minigames;
public class Api {
}

View File

@ -18,9 +18,11 @@ public enum Commands {
GC(new GcCommand()),
LANGTEST(new LangTestCommand()),
ROOM(new RoomCommand()),
UPDATE(new UpdateCommand()),
UPDATE(new RefreshCommandsCommand()),
OP(new OpCommand()),
FAKEPLAYER(new FakeplayerCommand());
FAKEPLAYER(new FakeplayerCommand()),
KICK(new KickCommand()),
SETOWNER(new SetRoomOwnerCommand());
Commands(Command handler) {
MinecraftServer.getCommandManager().register(handler);

View File

@ -0,0 +1,36 @@
package eu.mhsl.minenet.minigames.command;
import net.minestom.server.command.builder.Command;
import net.minestom.server.command.builder.condition.CommandCondition;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
public class PrivilegedCommand extends Command {
private final List<CommandCondition> conditions = new ArrayList<>();
public PrivilegedCommand(@NotNull String name, @Nullable String... aliases) {
super(name, aliases);
construct();
}
public PrivilegedCommand(@NotNull String name) {
super(name);
construct();
}
private void construct() {
addCondition(isPrivileged());
setCondition((sender, commandString) -> conditions.parallelStream().allMatch(condition -> condition.canUse(sender, commandString)));
}
protected CommandCondition isPrivileged() {
return (sender, commandString) -> sender.hasPermission("admin");
}
protected void addCondition(CommandCondition condition) {
conditions.add(condition);
}
}

View File

@ -1,20 +1,18 @@
package eu.mhsl.minenet.minigames.command.privileged;
import eu.mhsl.minenet.minigames.command.PrivilegedCommand;
import eu.mhsl.minenet.minigames.message.Icon;
import eu.mhsl.minenet.minigames.message.type.ActionBarMessage;
import eu.mhsl.minenet.minigames.message.type.ChatMessage;
import eu.mhsl.minenet.minigames.message.type.TitleMessage;
import net.minestom.server.command.builder.Command;
import java.util.ArrayList;
import java.util.List;
public class DebugCommand extends Command {
public class DebugCommand extends PrivilegedCommand {
public DebugCommand() {
super("debug");
setCondition((sender, commandString) -> sender.hasPermission("admin"));
setDefaultExecutor((sender, args) -> {
new ChatMessage(Icon.CHAT).appendTranslated("sample").send(sender);
new ActionBarMessage().appendTranslated("sample").send(sender);

View File

@ -1,9 +1,9 @@
package eu.mhsl.minenet.minigames.command.privileged;
import eu.mhsl.minenet.minigames.command.PrivilegedCommand;
import eu.mhsl.minenet.minigames.instance.room.Room;
import eu.mhsl.minenet.minigames.message.Icon;
import eu.mhsl.minenet.minigames.message.type.ChatMessage;
import net.minestom.server.command.builder.Command;
import net.minestom.server.command.builder.arguments.ArgumentType;
import net.minestom.server.entity.Player;
import net.minestom.server.entity.fakeplayer.FakePlayer;
@ -11,7 +11,7 @@ import net.minestom.server.entity.fakeplayer.FakePlayerOption;
import java.util.UUID;
public class FakeplayerCommand extends Command {
public class FakeplayerCommand extends PrivilegedCommand {
public FakeplayerCommand() {
super("fakeplayer");

View File

@ -1,15 +1,13 @@
package eu.mhsl.minenet.minigames.command.privileged;
import net.minestom.server.command.builder.Command;
import eu.mhsl.minenet.minigames.command.PrivilegedCommand;
import net.minestom.server.coordinate.Vec;
import net.minestom.server.entity.Player;
public class FlyCommand extends Command {
public class FlyCommand extends PrivilegedCommand {
public FlyCommand() {
super("fly");
setCondition((sender, commandString) -> sender.hasPermission("admin"));
setDefaultExecutor((sender, context) -> {
Player p = (Player) sender;
p.setVelocity(new Vec(0, 5, 0));

View File

@ -1,16 +1,15 @@
package eu.mhsl.minenet.minigames.command.privileged;
import net.minestom.server.command.builder.Command;
import eu.mhsl.minenet.minigames.command.PrivilegedCommand;
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 class GamemodeCommand extends PrivilegedCommand {
public GamemodeCommand() {
super("gamemode", "gm");
setCondition((sender, commandString) -> sender.hasPermission("admin"));
addSyntax((sender, context) -> ((Player) sender).setGameMode(
context.get("target")),

View File

@ -1,17 +1,15 @@
package eu.mhsl.minenet.minigames.command.privileged;
import eu.mhsl.minenet.minigames.command.PrivilegedCommand;
import eu.mhsl.minenet.minigames.message.type.ChatMessage;
import eu.mhsl.minenet.minigames.message.Icon;
import eu.mhsl.minenet.minigames.util.Monitoring;
import net.minestom.server.command.builder.Command;
public class GcCommand extends Command {
public class GcCommand extends PrivilegedCommand {
private static long lastRun = System.currentTimeMillis();
public GcCommand() {
super("gc");
setCondition((sender, commandString) -> sender.hasPermission("admin"));
setDefaultExecutor((sender, context) -> {
long nextRun = (lastRun - (System.currentTimeMillis() - 30*1000)) / 1000;
if(nextRun > 0) {

View File

@ -0,0 +1,32 @@
package eu.mhsl.minenet.minigames.command.privileged;
import eu.mhsl.minenet.minigames.command.PrivilegedCommand;
import net.minestom.server.MinecraftServer;
import net.minestom.server.command.builder.arguments.ArgumentType;
import net.minestom.server.entity.Player;
import java.util.Objects;
public class KickCommand extends PrivilegedCommand {
public KickCommand() {
super("kick");
addSyntax(
(sender, context) ->
kick(context.getRaw("player"), ""),
ArgumentType.Entity("player").onlyPlayers(true)
);
addSyntax(
(sender, context) ->
kick(context.getRaw("player"), context.getRaw("reason")),
ArgumentType.Entity("player").onlyPlayers(true),
ArgumentType.String("reason")
);
}
private void kick(String playername, String reason) {
Player playerToKick = MinecraftServer.getConnectionManager().findPlayer(playername);
Objects.requireNonNull(playerToKick).kick(reason);
}
}

View File

@ -1,20 +1,18 @@
package eu.mhsl.minenet.minigames.command.privileged;
import eu.mhsl.minenet.minigames.command.PrivilegedCommand;
import eu.mhsl.minenet.minigames.lang.Languages;
import eu.mhsl.minenet.minigames.lang.Lang;
import eu.mhsl.minenet.minigames.message.Icon;
import eu.mhsl.minenet.minigames.message.TranslatableMessage;
import eu.mhsl.minenet.minigames.message.type.ChatMessage;
import net.minestom.server.command.builder.Command;
import net.minestom.server.command.builder.arguments.ArgumentType;
import net.minestom.server.entity.Player;
public class LangTestCommand extends Command {
public class LangTestCommand extends PrivilegedCommand {
public LangTestCommand() {
super("langtest");
setCondition((sender, commandString) -> sender.hasPermission("admin"));
setDefaultExecutor((sender, context) -> sendMessage(Languages.getInstance().getLanguage((Player) sender), "sample").send(sender));
var targetString = ArgumentType.String("mapId");

View File

@ -1,19 +1,17 @@
package eu.mhsl.minenet.minigames.command.privileged;
import eu.mhsl.minenet.minigames.command.PrivilegedCommand;
import eu.mhsl.minenet.minigames.message.Icon;
import eu.mhsl.minenet.minigames.message.type.ChatMessage;
import net.minestom.server.MinecraftServer;
import net.minestom.server.command.builder.Command;
import net.minestom.server.command.builder.arguments.ArgumentType;
import net.minestom.server.entity.Player;
import net.minestom.server.permission.Permission;
public class OpCommand extends Command {
public class OpCommand extends PrivilegedCommand {
public OpCommand() {
super("op");
setCondition((sender, commandString) -> sender.hasPermission("admin"));
addSyntax((sender, context) -> {
Player target = MinecraftServer.getConnectionManager().getPlayer(context.getRaw("target"));
if(target != null) {

View File

@ -1,18 +1,17 @@
package eu.mhsl.minenet.minigames.command.privileged;
import eu.mhsl.minenet.minigames.command.PrivilegedCommand;
import eu.mhsl.minenet.minigames.message.type.ChatMessage;
import eu.mhsl.minenet.minigames.message.Icon;
import net.minestom.server.command.builder.Command;
import net.minestom.server.MinecraftServer;
import net.minestom.server.entity.Player;
public class UpdateCommand extends Command {
public UpdateCommand() {
super("update");
setCondition((sender, commandString) -> sender.hasPermission("admin"));
public class RefreshCommandsCommand extends PrivilegedCommand {
public RefreshCommandsCommand() {
super("refreshCommands");
setDefaultExecutor((sender, context) -> {
((Player) sender).refreshCommands();
MinecraftServer.getConnectionManager().getOnlinePlayers().forEach(Player::refreshCommands);
new ChatMessage(Icon.SUCCESS).appendStatic("Updated command syntax!").send(sender);
});
}

View File

@ -1,20 +1,18 @@
package eu.mhsl.minenet.minigames.command.privileged;
import eu.mhsl.minenet.minigames.command.PrivilegedCommand;
import eu.mhsl.minenet.minigames.message.Icon;
import eu.mhsl.minenet.minigames.message.TranslatableMessage;
import eu.mhsl.minenet.minigames.message.type.ChatMessage;
import eu.mhsl.minenet.minigames.instance.room.Room;
import net.minestom.server.command.builder.Command;
import net.minestom.server.entity.Player;
import java.util.stream.Collectors;
public class RoomCommand extends Command {
public class RoomCommand extends PrivilegedCommand {
public RoomCommand() {
super("room");
setCondition((sender, commandString) -> sender.hasPermission("admin"));
setDefaultExecutor((sender, context) -> {
TranslatableMessage out = new ChatMessage(Icon.SCIENCE).appendStatic("Rooms:").newLine();

View File

@ -0,0 +1,41 @@
package eu.mhsl.minenet.minigames.command.privileged;
import eu.mhsl.minenet.minigames.command.PrivilegedCommand;
import eu.mhsl.minenet.minigames.instance.room.Room;
import eu.mhsl.minenet.minigames.message.Icon;
import eu.mhsl.minenet.minigames.message.type.ChatMessage;
import net.minestom.server.MinecraftServer;
import net.minestom.server.command.builder.arguments.ArgumentType;
import net.minestom.server.command.builder.condition.CommandCondition;
import net.minestom.server.entity.Player;
import java.util.Objects;
public class SetRoomOwnerCommand extends PrivilegedCommand {
public SetRoomOwnerCommand() {
super("setRoomOwner");
addCondition((sender, commandString) -> ((Player) sender).getInstance() instanceof Room);
setDefaultExecutor((sender, context) -> {
if(sender instanceof Player p) {
Room.getRoom(p).setOwner(p);
new ChatMessage(Icon.SUCCESS).appendStatic("You are now the owner of this room!").send(sender);
}
});
addSyntax((sender, context) -> {
System.out.println("Test");
if(sender instanceof Player p) {
Player newOwner = MinecraftServer.getConnectionManager().getPlayer(context.getRaw("player"));
Room.getRoom(p).setOwner(Objects.requireNonNull(newOwner));
new ChatMessage(Icon.SUCCESS).appendStatic("The new owner has been set!").send(sender);
}
}, ArgumentType.Entity("player").onlyPlayers(true));
}
@Override
protected CommandCondition isPrivileged() {
return (sender, commandString) -> super.isPrivileged().canUse(sender, commandString) || Room.getRoom(((Player) sender)).getOwner() == sender;
}
}

View File

@ -70,24 +70,28 @@ public class Room extends MineNetInstance implements Spawnable {
private Player owner;
private Room(Player owner) {
super(Dimension.THE_END.DIMENSION);
construct();
setOwner(owner);
new GameSelector().setInstance(this, new Pos(0.5, 16, 9.5));
}
protected Room() {
super(Dimension.THE_END.DIMENSION);
}
private void construct() {
MinecraftServer.getInstanceManager().registerInstance(this);
setChunkLoader(new AnvilLoader(Resource.LOBBY_MAP.getPath()));
eventNode().addListener(PlayerBlockBreakEvent.class, CommonEventHandles::cancel);
eventNode().addListener(PlayerDisconnectEvent.class, playerDisconnectEvent -> unsetRoom(playerDisconnectEvent.getPlayer()));
setOwner(owner);
new GameSelector().setInstance(this, new Pos(0.5, 16, 9.5));
}
public Player getOwner() {
return owner;
}
private void setOwner(Player newOwner) {
public void setOwner(Player newOwner) {
this.owner = newOwner;
this.owner.eventNode().addListener(PlayerDisconnectEvent.class, playerDisconnectEvent -> {
@ -97,7 +101,7 @@ public class Room extends MineNetInstance implements Spawnable {
getAllMembers().stream()
.filter(player -> player != p) // exclude the current leaving owner
.findFirst() // find first user meeting the requirement
.findFirst() // find the first user meeting the requirement
.ifPresentOrElse(
this::setOwner, // set the new owner
() -> Room.deleteRoom(Room.getRoom(p)) // or else delete the room (no players in the room)
@ -108,10 +112,7 @@ public class Room extends MineNetInstance implements Spawnable {
new ChatMessage(Icon.ERROR).appendStatic("The room leader left!").send(getAllMembers());
new ChatMessage(Icon.SCIENCE).appendStatic(this.owner.getUsername()).appendStatic(" is the new Leader!").send(getAllMembers().stream().filter(player -> player != this.owner).collect(Collectors.toSet()));
new ChatMessage(Icon.SUCCESS).appendStatic("You are now the leader.").send(this.owner);
logger.info("Room owner changed from " + p.getUsername() + " to " + owner.getUsername());
});
}
public void moveMembersToGame(Game game) {

View File

@ -0,0 +1,15 @@
package eu.mhsl.minenet.minigames.instance.virtualRoom;
import eu.mhsl.minenet.minigames.instance.room.Room;
import net.minestom.server.coordinate.Pos;
public class VirtualRoom extends Room {
public VirtualRoom() {
}
@Override
public Pos getSpawn() {
return null;
}
}

View File

@ -30,6 +30,7 @@ public abstract class Score {
}
public void setDone() {
if(isDone) return;
isDone = true;
new ChatMessage(Icon.STAR, true)
.appendTranslated("score#result")