diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin index 9a7d97f..0a4cc28 100644 Binary files a/build/tmp/compileJava/previous-compilation-data.bin and b/build/tmp/compileJava/previous-compilation-data.bin differ diff --git a/src/main/java/eu/mhsl/minenet/minigames/Api.java b/src/main/java/eu/mhsl/minenet/minigames/Api.java new file mode 100644 index 0000000..17e9481 --- /dev/null +++ b/src/main/java/eu/mhsl/minenet/minigames/Api.java @@ -0,0 +1,4 @@ +package eu.mhsl.minenet.minigames; + +public class Api { +} diff --git a/src/main/java/eu/mhsl/minenet/minigames/command/Commands.java b/src/main/java/eu/mhsl/minenet/minigames/command/Commands.java index 29398c9..ec15e96 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/command/Commands.java +++ b/src/main/java/eu/mhsl/minenet/minigames/command/Commands.java @@ -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); diff --git a/src/main/java/eu/mhsl/minenet/minigames/command/PrivilegedCommand.java b/src/main/java/eu/mhsl/minenet/minigames/command/PrivilegedCommand.java new file mode 100644 index 0000000..13294f6 --- /dev/null +++ b/src/main/java/eu/mhsl/minenet/minigames/command/PrivilegedCommand.java @@ -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 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); + } +} diff --git a/src/main/java/eu/mhsl/minenet/minigames/command/privileged/DebugCommand.java b/src/main/java/eu/mhsl/minenet/minigames/command/privileged/DebugCommand.java index 6a41503..cb5e9b8 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/command/privileged/DebugCommand.java +++ b/src/main/java/eu/mhsl/minenet/minigames/command/privileged/DebugCommand.java @@ -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); diff --git a/src/main/java/eu/mhsl/minenet/minigames/command/privileged/FakeplayerCommand.java b/src/main/java/eu/mhsl/minenet/minigames/command/privileged/FakeplayerCommand.java index b8c0ed0..2d0ef53 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/command/privileged/FakeplayerCommand.java +++ b/src/main/java/eu/mhsl/minenet/minigames/command/privileged/FakeplayerCommand.java @@ -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"); diff --git a/src/main/java/eu/mhsl/minenet/minigames/command/privileged/FlyCommand.java b/src/main/java/eu/mhsl/minenet/minigames/command/privileged/FlyCommand.java index c294850..f5e3dac 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/command/privileged/FlyCommand.java +++ b/src/main/java/eu/mhsl/minenet/minigames/command/privileged/FlyCommand.java @@ -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)); diff --git a/src/main/java/eu/mhsl/minenet/minigames/command/privileged/GamemodeCommand.java b/src/main/java/eu/mhsl/minenet/minigames/command/privileged/GamemodeCommand.java index 88e6eda..68fe523 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/command/privileged/GamemodeCommand.java +++ b/src/main/java/eu/mhsl/minenet/minigames/command/privileged/GamemodeCommand.java @@ -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")), diff --git a/src/main/java/eu/mhsl/minenet/minigames/command/privileged/GcCommand.java b/src/main/java/eu/mhsl/minenet/minigames/command/privileged/GcCommand.java index 39c8197..e332b8e 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/command/privileged/GcCommand.java +++ b/src/main/java/eu/mhsl/minenet/minigames/command/privileged/GcCommand.java @@ -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) { diff --git a/src/main/java/eu/mhsl/minenet/minigames/command/privileged/KickCommand.java b/src/main/java/eu/mhsl/minenet/minigames/command/privileged/KickCommand.java new file mode 100644 index 0000000..d4c6e16 --- /dev/null +++ b/src/main/java/eu/mhsl/minenet/minigames/command/privileged/KickCommand.java @@ -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); + } +} diff --git a/src/main/java/eu/mhsl/minenet/minigames/command/privileged/LangTestCommand.java b/src/main/java/eu/mhsl/minenet/minigames/command/privileged/LangTestCommand.java index cf3b80d..e9f98ae 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/command/privileged/LangTestCommand.java +++ b/src/main/java/eu/mhsl/minenet/minigames/command/privileged/LangTestCommand.java @@ -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"); diff --git a/src/main/java/eu/mhsl/minenet/minigames/command/privileged/OpCommand.java b/src/main/java/eu/mhsl/minenet/minigames/command/privileged/OpCommand.java index 5fe9e73..4546f81 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/command/privileged/OpCommand.java +++ b/src/main/java/eu/mhsl/minenet/minigames/command/privileged/OpCommand.java @@ -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) { diff --git a/src/main/java/eu/mhsl/minenet/minigames/command/privileged/UpdateCommand.java b/src/main/java/eu/mhsl/minenet/minigames/command/privileged/RefreshCommandsCommand.java similarity index 51% rename from src/main/java/eu/mhsl/minenet/minigames/command/privileged/UpdateCommand.java rename to src/main/java/eu/mhsl/minenet/minigames/command/privileged/RefreshCommandsCommand.java index cbc1cd5..d0e5b36 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/command/privileged/UpdateCommand.java +++ b/src/main/java/eu/mhsl/minenet/minigames/command/privileged/RefreshCommandsCommand.java @@ -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); }); } diff --git a/src/main/java/eu/mhsl/minenet/minigames/command/privileged/RoomCommand.java b/src/main/java/eu/mhsl/minenet/minigames/command/privileged/RoomCommand.java index 8443760..845cf8a 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/command/privileged/RoomCommand.java +++ b/src/main/java/eu/mhsl/minenet/minigames/command/privileged/RoomCommand.java @@ -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(); diff --git a/src/main/java/eu/mhsl/minenet/minigames/command/privileged/SetRoomOwnerCommand.java b/src/main/java/eu/mhsl/minenet/minigames/command/privileged/SetRoomOwnerCommand.java new file mode 100644 index 0000000..45f1e87 --- /dev/null +++ b/src/main/java/eu/mhsl/minenet/minigames/command/privileged/SetRoomOwnerCommand.java @@ -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; + } +} diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/room/Room.java b/src/main/java/eu/mhsl/minenet/minigames/instance/room/Room.java index 73e02a9..8b1c069 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/room/Room.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/room/Room.java @@ -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) { diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/virtualRoom/VirtualRoom.java b/src/main/java/eu/mhsl/minenet/minigames/instance/virtualRoom/VirtualRoom.java new file mode 100644 index 0000000..b65e11a --- /dev/null +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/virtualRoom/VirtualRoom.java @@ -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; + } +} diff --git a/src/main/java/eu/mhsl/minenet/minigames/score/Score.java b/src/main/java/eu/mhsl/minenet/minigames/score/Score.java index 82d6294..225fc29 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/score/Score.java +++ b/src/main/java/eu/mhsl/minenet/minigames/score/Score.java @@ -30,6 +30,7 @@ public abstract class Score { } public void setDone() { + if(isDone) return; isDone = true; new ChatMessage(Icon.STAR, true) .appendTranslated("score#result")