diff --git a/build.gradle b/build.gradle index a46764c..2a6aa33 100644 --- a/build.gradle +++ b/build.gradle @@ -12,6 +12,10 @@ group = project.maven_group repositories { mavenCentral() + maven { + name = 'Fabric-Permission-API' + url 'https://oss.sonatype.org/content/repositories/snapshots' + } } dependencies { @@ -26,6 +30,7 @@ dependencies { compile group: 'org.yaml', name: 'snakeyaml', version: '1.25' include group: 'org.yaml', name: 'snakeyaml', version: '1.25' + modImplementation 'me.lucko:fabric-permissions-api:0.1-SNAPSHOT' // PSA: Some older mods, compiled on Loom 0.2.1, might have outdated Maven POMs. // You may need to force-disable transitiveness on them. } diff --git a/src/main/java/com/flemmli97/flan/Flan.java b/src/main/java/com/flemmli97/flan/Flan.java index fdfe170..89cfe6d 100644 --- a/src/main/java/com/flemmli97/flan/Flan.java +++ b/src/main/java/com/flemmli97/flan/Flan.java @@ -15,6 +15,7 @@ import net.fabricmc.fabric.api.event.player.PlayerBlockBreakEvents; import net.fabricmc.fabric.api.event.player.UseBlockCallback; import net.fabricmc.fabric.api.event.player.UseEntityCallback; import net.fabricmc.fabric.api.event.player.UseItemCallback; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.server.MinecraftServer; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -23,6 +24,8 @@ public class Flan implements ModInitializer { public static final Logger logger = LogManager.getLogger("flan"); + public static boolean permissionAPI; + @Override public void onInitialize() { PlayerBlockBreakEvents.BEFORE.register(BlockInteractEvents::breakBlocks); @@ -35,6 +38,8 @@ public class Flan implements ModInitializer { ServerLifecycleEvents.SERVER_STARTING.register(this::lockRegistry); CommandRegistrationCallback.EVENT.register(CommandClaim::register); + + permissionAPI = FabricLoader.getInstance().isModLoaded("fabric-permissions-api-v0"); } public void lockRegistry(MinecraftServer server) { diff --git a/src/main/java/com/flemmli97/flan/api/ClaimPermissionEvent.java b/src/main/java/com/flemmli97/flan/api/ClaimPermissionEvent.java index 049a338..46fbd0e 100644 --- a/src/main/java/com/flemmli97/flan/api/ClaimPermissionEvent.java +++ b/src/main/java/com/flemmli97/flan/api/ClaimPermissionEvent.java @@ -25,9 +25,10 @@ public interface ClaimPermissionEvent { /** * Callback for when permissions are checked - * @param player The corresponding player. Can be null if the check is e.g. caused by tnt explosions + * + * @param player The corresponding player. Can be null if the check is e.g. caused by tnt explosions * @param permission The permission to check - * @param pos The block pos where the action is occuring + * @param pos The block pos where the action is occuring * @return ActionResult#PASS to do nothing. ActionResult#FAIL to prevent the action. Else to allow the action */ ActionResult check(@Nullable ServerPlayerEntity player, ClaimPermission permission, BlockPos pos); diff --git a/src/main/java/com/flemmli97/flan/commands/CommandClaim.java b/src/main/java/com/flemmli97/flan/commands/CommandClaim.java index 390bfaf..4e8363f 100644 --- a/src/main/java/com/flemmli97/flan/commands/CommandClaim.java +++ b/src/main/java/com/flemmli97/flan/commands/CommandClaim.java @@ -47,28 +47,28 @@ public class CommandClaim { public static void register(CommandDispatcher dispatcher, boolean dedicated) { dispatcher.register(CommandManager.literal("flan") - .then(CommandManager.literal("reload").requires(src -> src.hasPermissionLevel(ConfigHandler.config.permissionLevel)).executes(CommandClaim::reloadConfig)) - .then(CommandManager.literal("addClaim").then(CommandManager.argument("from", BlockPosArgumentType.blockPos()).then(CommandManager.argument("to", BlockPosArgumentType.blockPos()).executes(CommandClaim::addClaim)))) - .then(CommandManager.literal("menu").executes(CommandClaim::openMenu)) - .then(CommandManager.literal("claimInfo").executes(CommandClaim::claimInfo)) - .then(CommandManager.literal("transferClaim").then(CommandManager.argument("player", GameProfileArgumentType.gameProfile()).executes(CommandClaim::transferClaim))) - .then(CommandManager.literal("delete").executes(CommandClaim::deleteClaim)) - .then(CommandManager.literal("deleteAll").executes(CommandClaim::deleteAllClaim)) - .then(CommandManager.literal("deleteSubClaim").executes(CommandClaim::deleteSubClaim)) - .then(CommandManager.literal("deleteAllSubClaims").executes(CommandClaim::deleteAllSubClaim)) - .then(CommandManager.literal("list").executes(CommandClaim::listClaims).then(CommandManager.argument("player", GameProfileArgumentType.gameProfile()).requires(src -> src.hasPermissionLevel(ConfigHandler.config.permissionLevel)) + .then(CommandManager.literal("reload").requires(src -> CommandPermission.perm(src, CommandPermission.cmdReload, true)).executes(CommandClaim::reloadConfig)) + .then(CommandManager.literal("addClaim").requires(src -> CommandPermission.perm(src, CommandPermission.claimCreate)).then(CommandManager.argument("from", BlockPosArgumentType.blockPos()).then(CommandManager.argument("to", BlockPosArgumentType.blockPos()).executes(CommandClaim::addClaim)))) + .then(CommandManager.literal("menu").requires(src -> CommandPermission.perm(src, CommandPermission.cmdMenu)).executes(CommandClaim::openMenu)) + .then(CommandManager.literal("claimInfo").requires(src -> CommandPermission.perm(src, CommandPermission.cmdInfo)).executes(CommandClaim::claimInfo)) + .then(CommandManager.literal("transferClaim").requires(src -> CommandPermission.perm(src, CommandPermission.cmdTransfer)).then(CommandManager.argument("player", GameProfileArgumentType.gameProfile()).executes(CommandClaim::transferClaim))) + .then(CommandManager.literal("delete").requires(src -> CommandPermission.perm(src, CommandPermission.cmdTransfer)).executes(CommandClaim::deleteClaim)) + .then(CommandManager.literal("deleteAll").requires(src -> CommandPermission.perm(src, CommandPermission.cmdTransfer)).executes(CommandClaim::deleteAllClaim)) + .then(CommandManager.literal("deleteSubClaim").requires(src -> CommandPermission.perm(src, CommandPermission.cmdTransfer)).executes(CommandClaim::deleteSubClaim)) + .then(CommandManager.literal("deleteAllSubClaims").requires(src -> CommandPermission.perm(src, CommandPermission.cmdTransfer)).executes(CommandClaim::deleteAllSubClaim)) + .then(CommandManager.literal("list").requires(src -> CommandPermission.perm(src, CommandPermission.cmdList)).executes(CommandClaim::listClaims).then(CommandManager.argument("player", GameProfileArgumentType.gameProfile()).requires(src -> CommandPermission.perm(src, CommandPermission.cmdListAll, true)) .executes(cmd -> listClaims(cmd, GameProfileArgumentType.getProfileArgument(cmd, "player"))))) - .then(CommandManager.literal("switchMode").executes(CommandClaim::switchClaimMode)) - .then(CommandManager.literal("adminMode").requires(src -> src.hasPermissionLevel(ConfigHandler.config.permissionLevel)).executes(CommandClaim::switchAdminMode)) - .then(CommandManager.literal("readGriefPrevention").requires(src -> src.hasPermissionLevel(ConfigHandler.config.permissionLevel)).executes(CommandClaim::readGriefPreventionData)) - .then(CommandManager.literal("setAdminClaim").requires(src -> src.hasPermissionLevel(ConfigHandler.config.permissionLevel)).then(CommandManager.argument("toggle", BoolArgumentType.bool()).executes(CommandClaim::toggleAdminClaim))) - .then(CommandManager.literal("listAdminClaims").requires(src -> src.hasPermissionLevel(ConfigHandler.config.permissionLevel)).executes(CommandClaim::listAdminClaims)) - .then(CommandManager.literal("adminDelete").requires(src -> src.hasPermissionLevel(ConfigHandler.config.permissionLevel)).executes(CommandClaim::adminDelete) + .then(CommandManager.literal("switchMode").requires(src -> CommandPermission.perm(src, CommandPermission.cmdClaimMode)).executes(CommandClaim::switchClaimMode)) + .then(CommandManager.literal("adminMode").requires(src -> CommandPermission.perm(src, CommandPermission.cmdAdminMode, true)).executes(CommandClaim::switchAdminMode)) + .then(CommandManager.literal("readGriefPrevention").requires(src -> CommandPermission.perm(src, CommandPermission.cmdGriefPrevention, true)).executes(CommandClaim::readGriefPreventionData)) + .then(CommandManager.literal("setAdminClaim").requires(src -> CommandPermission.perm(src, CommandPermission.cmdAdminSet, true)).then(CommandManager.argument("toggle", BoolArgumentType.bool()).executes(CommandClaim::toggleAdminClaim))) + .then(CommandManager.literal("listAdminClaims").requires(src -> CommandPermission.perm(src, CommandPermission.cmdAdminList, true)).executes(CommandClaim::listAdminClaims)) + .then(CommandManager.literal("adminDelete").requires(src -> CommandPermission.perm(src, CommandPermission.cmdAdminDelete, true)).executes(CommandClaim::adminDelete) .then(CommandManager.literal("all").then(CommandManager.argument("players", GameProfileArgumentType.gameProfile()) .executes(CommandClaim::adminDeleteAll)))) - .then(CommandManager.literal("giveClaimBlocks").requires(src -> src.hasPermissionLevel(ConfigHandler.config.permissionLevel)).then(CommandManager.argument("players", GameProfileArgumentType.gameProfile()) + .then(CommandManager.literal("giveClaimBlocks").requires(src -> CommandPermission.perm(src, CommandPermission.cmdAdminGive, true)).then(CommandManager.argument("players", GameProfileArgumentType.gameProfile()) .then(CommandManager.argument("amount", IntegerArgumentType.integer()).executes(CommandClaim::giveClaimBlocks)))) - .then(CommandManager.literal("group") + .then(CommandManager.literal("group").requires(src -> CommandPermission.perm(src, CommandPermission.cmdGroup)) .then(CommandManager.literal("add").then(CommandManager.argument("group", StringArgumentType.string()).executes(CommandClaim::addGroup))) .then(CommandManager.literal("remove").then(CommandManager.argument("group", StringArgumentType.string()) .suggests(CommandClaim::groupSuggestion).executes(CommandClaim::removeGroup))) @@ -88,7 +88,7 @@ public class CommandClaim { } return CommandSource.suggestMatching(list, build); }).executes(CommandClaim::removePlayer)))))) - .then(CommandManager.literal("permission") + .then(CommandManager.literal("permission").requires(src -> CommandPermission.perm(src, CommandPermission.cmdPermission)) .then(CommandManager.literal("global").then(CommandManager.argument("permission", StringArgumentType.word()).suggests((ctx, b) -> permSuggestions(ctx, b, false)) .then(CommandManager.argument("toggle", StringArgumentType.word()).suggests((ctx, b) -> CommandSource.suggestMatching(new String[]{"default", "true", "false"}, b)).executes(CommandClaim::editGlobalPerm)))) .then(CommandManager.literal("group").then(CommandManager.argument("group", StringArgumentType.string()).suggests(CommandClaim::groupSuggestion) diff --git a/src/main/java/com/flemmli97/flan/commands/CommandPermission.java b/src/main/java/com/flemmli97/flan/commands/CommandPermission.java new file mode 100644 index 0000000..99021da --- /dev/null +++ b/src/main/java/com/flemmli97/flan/commands/CommandPermission.java @@ -0,0 +1,57 @@ +package com.flemmli97.flan.commands; + +import com.flemmli97.flan.Flan; +import com.flemmli97.flan.config.ConfigHandler; +import me.lucko.fabric.api.permissions.v0.Permissions; +import net.minecraft.server.command.CommandSource; +import net.minecraft.server.network.ServerPlayerEntity; + +public class CommandPermission { + + public static final String cmdReload = "flan.command.reload"; + public static final String cmdGriefPrevention = "flan.command.read.griefprevention"; + + public static final String claimCreate = "flan.claim.create"; + + public static final String cmdMenu = "flan.command.menu"; + public static final String cmdInfo = "flan.command.info"; + public static final String cmdTransfer = "flan.command.transfer"; + + public static final String cmdDelete = "flan.command.delete"; + public static final String cmdDeleteAll = "flan.command.delete.all"; + public static final String cmdDeleteSub = "flan.command.delete.sub"; + public static final String cmdDeleteSubAll = "flan.command.delete.sub.all"; + + public static final String cmdList = "flan.command.list"; + public static final String cmdListAll = "flan.command.list.all"; + + public static final String cmdClaimMode = "flan.command.claim.mode"; + public static final String cmdAdminMode = "flan.command.admin.mode"; + public static final String cmdAdminSet = "flan.command.admin.claim"; + public static final String cmdAdminList = "flan.command.admin.list"; + public static final String cmdAdminDelete = "flan.command.admin.delete"; + public static final String cmdAdminGive = "flan.command.admin.give"; + + public static final String cmdGroup = "flan.command.group"; + public static final String cmdPermission = "flan.command.permission"; + + public static boolean perm(CommandSource src, String perm) { + return perm(src, perm, false); + } + + public static boolean perm(CommandSource src, String perm, boolean adminCmd) { + if (!Flan.permissionAPI) + return !adminCmd || src.hasPermissionLevel(ConfigHandler.config.permissionLevel); + if (adminCmd) + return Permissions.check(src, perm, ConfigHandler.config.permissionLevel); + return Permissions.check(src, perm, true); + } + + public static boolean perm(ServerPlayerEntity src, String perm, boolean adminCmd) { + if (!Flan.permissionAPI) + return !adminCmd || src.hasPermissionLevel(ConfigHandler.config.permissionLevel); + if (adminCmd) + return Permissions.check(src, perm, ConfigHandler.config.permissionLevel); + return Permissions.check(src, perm, true); + } +} \ No newline at end of file diff --git a/src/main/java/com/flemmli97/flan/event/ItemInteractEvents.java b/src/main/java/com/flemmli97/flan/event/ItemInteractEvents.java index f10dce3..7ced3bc 100644 --- a/src/main/java/com/flemmli97/flan/event/ItemInteractEvents.java +++ b/src/main/java/com/flemmli97/flan/event/ItemInteractEvents.java @@ -5,6 +5,7 @@ import com.flemmli97.flan.claim.Claim; import com.flemmli97.flan.claim.ClaimStorage; import com.flemmli97.flan.claim.IPermissionContainer; import com.flemmli97.flan.claim.PermHelper; +import com.flemmli97.flan.commands.CommandPermission; import com.flemmli97.flan.config.ConfigHandler; import com.flemmli97.flan.player.EnumDisplayType; import com.flemmli97.flan.player.EnumEditMode; @@ -118,6 +119,10 @@ public class ItemInteractEvents { } public static void claimLandHandling(ServerPlayerEntity player, BlockPos target) { + if (!CommandPermission.perm(player, CommandPermission.claimCreate, false)) { + player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermission, Formatting.DARK_RED), true); + return; + } if (ConfigHandler.config.worldWhitelist) { if (!cantClaimInWorld(player.getServerWorld())) { player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.landClaimDisabledWorld, Formatting.DARK_RED), false); diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 705a621..ba3bc8e 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -2,7 +2,6 @@ "schemaVersion": 1, "id": "flan", "version": "${version}", - "name": "Flan", "description": "A claiming mod for fabric", "authors": [ @@ -12,10 +11,8 @@ "homepage": "", "sources": "https://github.com/Flemmli97/Flan" }, - "license": "ARR", "icon": "assets/modid/icon.png", - "environment": "*", "entrypoints": { "main": [ @@ -25,7 +22,6 @@ "mixins": [ "flan.mixins.json" ], - "depends": { "fabricloader": ">=0.7.4", "fabric": ">=0.19.0"