From ca7ef6f59bbe027b7ba18d1448c8a8e020e5e33a Mon Sep 17 00:00:00 2001 From: iceBear67 Date: Wed, 18 Sep 2024 09:56:47 +0800 Subject: [PATCH] (update) add: permissions to use worldedit in playground --- .../server/fixes/ProjectileEntityMixin.java | 1 + .../module/room/CreativeRoomModule.java | 36 +++++++++++++++++++ .../java/io/ib67/sfcraft/util/SFConsts.java | 1 + 3 files changed, 38 insertions(+) diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/fixes/ProjectileEntityMixin.java b/src/main/java/io/ib67/sfcraft/mixin/server/fixes/ProjectileEntityMixin.java index 40c7677..947f44c 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/server/fixes/ProjectileEntityMixin.java +++ b/src/main/java/io/ib67/sfcraft/mixin/server/fixes/ProjectileEntityMixin.java @@ -33,6 +33,7 @@ public class ProjectileEntityMixin { /** * @reason Implement the logic correctly. + * @author icybear */ @Overwrite public @Nullable Entity getOwner() { diff --git a/src/main/java/io/ib67/sfcraft/module/room/CreativeRoomModule.java b/src/main/java/io/ib67/sfcraft/module/room/CreativeRoomModule.java index e8dce4b..5b33255 100644 --- a/src/main/java/io/ib67/sfcraft/module/room/CreativeRoomModule.java +++ b/src/main/java/io/ib67/sfcraft/module/room/CreativeRoomModule.java @@ -13,10 +13,13 @@ import io.ib67.sfcraft.room.RoomTeleporter; import io.ib67.sfcraft.room.create.CreativeSpaceFactory; import io.ib67.sfcraft.room.create.CreativeSpaceRoom; import io.ib67.sfcraft.util.SFConsts; +import me.lucko.fabric.api.permissions.v0.PermissionCheckEvent; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; +import net.fabricmc.fabric.api.util.TriState; import net.minecraft.command.CommandRegistryAccess; +import net.minecraft.command.CommandSource; import net.minecraft.network.packet.s2c.play.TeamS2CPacket; import net.minecraft.registry.RegistryKey; import net.minecraft.scoreboard.Team; @@ -28,8 +31,15 @@ import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.Text; import net.minecraft.util.Colors; import net.minecraft.world.chunk.ChunkStatus; +import org.jetbrains.annotations.NotNull; + +import java.util.Set; public class CreativeRoomModule extends ServerModule { + private static final Set ALLOWED_VANILLA_COMMANDS = Set.of( + "minecraft.command.weather", + "minecraft.command.time", + "minecraft.command.gamerule"); @Inject private RoomRegistry roomRegistry; @Inject @@ -47,12 +57,38 @@ public class CreativeRoomModule extends ServerModule { .register(this::registerCommand); ServerPlayConnectionEvents.JOIN.register(this::onJoin); ServerPlayConnectionEvents.DISCONNECT.register(this::onDisconnect); + PermissionCheckEvent.EVENT.register(this::onWorldEdit); + PermissionCheckEvent.EVENT.register(this::onVanillaCommands); SFCallbacks.PLAYER_AFK.register(this::onAFK); room = new CreativeSpaceRoom(); roomRegistry.registerRoomType(CreativeSpaceRoom.class, CreativeSpaceRoom.WORLD, new CreativeSpaceFactory(room)); roomRegistry.createRoomOf(CreativeSpaceRoom.class, CreativeSpaceRoom.IDENTIFIER, null, (String) null); roomModule.enqueuePregen(CreativeSpaceRoom.WORLD, CreativeSpaceRoom.SPAWN_POS); } + //todo: support for vanilla permissions + private @NotNull TriState onVanillaCommands(@NotNull CommandSource commandSource, @NotNull String s) { + if (commandSource instanceof ServerCommandSource source && source.getPlayer() != null) { + var p = source.getPlayer(); + if (p.getServerWorld().getRegistryKey().equals(CreativeSpaceRoom.WORLD)) { + if (ALLOWED_VANILLA_COMMANDS.contains(s)) { + return TriState.TRUE; + } + } + } + return TriState.DEFAULT; + } + + private @NotNull TriState onWorldEdit(@NotNull CommandSource commandSource, @NotNull String s) { + if (commandSource instanceof ServerCommandSource source && source.getPlayer() != null) { + var p = source.getPlayer(); + if (p.getServerWorld().getRegistryKey().equals(CreativeSpaceRoom.WORLD)) { + if (s.startsWith("worldedit") && SFConsts.WORLDEDIT_AT_PLAYGROUND.hasPermission(p)) { + return TriState.TRUE; + } + } + } + return TriState.DEFAULT; + } private void onAFK(ServerPlayerEntity player, boolean b) { if (!b) player.server.getPlayerManager().sendToAll(TeamS2CPacket.updateTeam(team, true)); diff --git a/src/main/java/io/ib67/sfcraft/util/SFConsts.java b/src/main/java/io/ib67/sfcraft/util/SFConsts.java index a04eaed..678157e 100644 --- a/src/main/java/io/ib67/sfcraft/util/SFConsts.java +++ b/src/main/java/io/ib67/sfcraft/util/SFConsts.java @@ -14,6 +14,7 @@ public class SFConsts { public static final Permission USE_BROADCAST_LOCATION = ofSFCPermission("chat.xyz", true); public static final Permission COMMAND_BACK = ofSFCPermission("command.back", true); public static final Permission UNLIMITED_COMMAND_BACK = ofSFCPermission("command.back.unlimited", false); + public static final Permission WORLDEDIT_AT_PLAYGROUND = ofSFCPermission("worldedit", true); public static final Permission COMMAND_ADDWL = ofSFCPermission("command.addwl", false); public static final Permission COMMAND_UNBLOCKSERVER = ofSFCPermission("command.unblockserver", false);