From 42e5441d942a14168edcaa171f1daf74adc990b1 Mon Sep 17 00:00:00 2001 From: PotatoPresident Date: Wed, 10 Feb 2021 08:39:50 -0800 Subject: [PATCH] Renamed permissions Fixed offline players not working with luck perms --- build.gradle | 7 + gradle.properties | 2 +- .../java/us/potatoboy/invview/InvView.java | 18 +-- .../us/potatoboy/invview/ViewCommand.java | 120 ++++++++++-------- .../invview/gui/MountScreenHandler.java | 5 +- src/main/resources/fabric.mod.json | 10 +- src/main/resources/invview.accesswidener | 3 + 7 files changed, 99 insertions(+), 66 deletions(-) create mode 100644 src/main/resources/invview.accesswidener diff --git a/build.gradle b/build.gradle index cdf8197..a1c92fb 100644 --- a/build.gradle +++ b/build.gradle @@ -12,6 +12,7 @@ repositories { url = "https://maven.abusedmaster.xyz/" } maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } + mavenCentral() } sourceCompatibility = JavaVersion.VERSION_1_8 @@ -37,6 +38,8 @@ dependencies { modImplementation "me.lucko:fabric-permissions-api:0.1-SNAPSHOT" include "me.lucko:fabric-permissions-api:0.1-SNAPSHOT" + + compileOnly 'net.luckperms:api:5.2' } processResources { @@ -71,6 +74,10 @@ jar { from "LICENSE" } +loom { + accessWidener "src/main/resources/invview.accesswidener" +} + // configure the maven publication publishing { publications { diff --git a/gradle.properties b/gradle.properties index 3e9daa2..af4231b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ minecraft_version=1.16.4 yarn_mappings=1.16.4+build.7 loader_version=0.10.8 # Mod Properties -mod_version=1.3.0 +mod_version=1.4.0 maven_group=us.potatoboy archives_base_name=InvView # Dependencies diff --git a/src/main/java/us/potatoboy/invview/InvView.java b/src/main/java/us/potatoboy/invview/InvView.java index 77a7a2b..d66b934 100644 --- a/src/main/java/us/potatoboy/invview/InvView.java +++ b/src/main/java/us/potatoboy/invview/InvView.java @@ -21,38 +21,38 @@ public class InvView implements ModInitializer { private static MinecraftServer minecraftServer; - private static boolean isTrinkets = false; + public static boolean isTrinkets = false; + public static boolean isLuckPerms = false; @Override public void onInitialize() { - if (FabricLoader.getInstance().isModLoaded("trinkets")) { - isTrinkets = true; - } + isTrinkets = FabricLoader.getInstance().isModLoaded("trinkets"); + isLuckPerms = FabricLoader.getInstance().isModLoaded("luckperms"); CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> { LiteralCommandNode viewNode = CommandManager .literal("view") - .requires(Permissions.require("invview.view", 2)) + .requires(Permissions.require("invview.command.root", 2)) .build(); LiteralCommandNode invNode = CommandManager .literal("inv") - .requires(Permissions.require("invview.inv", 2)) + .requires(Permissions.require("invview.command.inv", 2)) .then(CommandManager.argument("target", GameProfileArgumentType.gameProfile()) .executes(ViewCommand::inv)) .build(); LiteralCommandNode echestNode = CommandManager .literal("echest") - .requires(Permissions.require("invview.echest", 2)) + .requires(Permissions.require("invview.command.echest", 2)) .then(CommandManager.argument("target", GameProfileArgumentType.gameProfile()) .executes(ViewCommand::eChest)) .build(); LiteralCommandNode trinketNode = CommandManager - .literal("trinkets") - .requires(Permissions.require("invview.trinket", 2)) + .literal("trinket") + .requires(Permissions.require("invview.command.trinket", 2)) .then(CommandManager.argument("target", GameProfileArgumentType.gameProfile()) .executes(ViewCommand::trinkets)) .build(); diff --git a/src/main/java/us/potatoboy/invview/ViewCommand.java b/src/main/java/us/potatoboy/invview/ViewCommand.java index f56e00d..2c2c2d3 100644 --- a/src/main/java/us/potatoboy/invview/ViewCommand.java +++ b/src/main/java/us/potatoboy/invview/ViewCommand.java @@ -3,34 +3,22 @@ import com.mojang.authlib.GameProfile; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; -import dev.emi.trinkets.api.TrinketComponent; -import dev.emi.trinkets.api.TrinketSlots; -import dev.emi.trinkets.api.TrinketsApi; -import me.lucko.fabric.api.permissions.v0.Permissions; +import net.luckperms.api.LuckPermsProvider; +import net.luckperms.api.cacheddata.CachedPermissionData; +import net.luckperms.api.util.Tristate; import net.minecraft.command.argument.GameProfileArgumentType; -import net.minecraft.entity.passive.AbstractDonkeyEntity; -import net.minecraft.entity.passive.HorseBaseEntity; import net.minecraft.inventory.EnderChestInventory; -import net.minecraft.inventory.SimpleInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket; -import net.minecraft.screen.GenericContainerScreenHandler; import net.minecraft.screen.NamedScreenHandlerFactory; -import net.minecraft.screen.ScreenHandlerType; import net.minecraft.screen.SimpleNamedScreenHandlerFactory; import net.minecraft.server.MinecraftServer; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.LiteralText; -import net.minecraft.text.TranslatableText; import us.potatoboy.invview.gui.EnderChestScreenHandler; import us.potatoboy.invview.gui.PlayerInventoryScreenHandler; import us.potatoboy.invview.gui.TrinketScreenHandler; -import us.potatoboy.invview.mixin.HorseInventoryAccess; -import java.util.ArrayList; -import java.util.List; +import java.util.concurrent.CompletableFuture; public class ViewCommand { private static MinecraftServer minecraftServer = InvView.getMinecraftServer(); @@ -39,17 +27,20 @@ public static int inv(CommandContext context) throws Comman ServerPlayerEntity player = context.getSource().getPlayer(); ServerPlayerEntity requestedPlayer = getRequestedPlayer(context); - if (isProtected(context, requestedPlayer)) { - return -1; - } - - NamedScreenHandlerFactory screenHandlerFactory = new SimpleNamedScreenHandlerFactory((syncId, inv, playerEntity) -> - new PlayerInventoryScreenHandler(syncId, player.inventory, requestedPlayer.inventory), - requestedPlayer.getDisplayName() - ); + isProtected(requestedPlayer).thenAcceptAsync(isProtected -> { + if (isProtected) { + context.getSource().sendError(new LiteralText("Requested inventory is protected")); + return; + } else { + NamedScreenHandlerFactory screenHandlerFactory = new SimpleNamedScreenHandlerFactory((syncId, inv, playerEntity) -> + new PlayerInventoryScreenHandler(syncId, player.inventory, requestedPlayer.inventory), + requestedPlayer.getDisplayName() + ); + + player.openHandledScreen(screenHandlerFactory); + } + }); - player.openHandledScreen(screenHandlerFactory); - return 1; } @@ -58,17 +49,21 @@ public static int eChest(CommandContext context) throws Com ServerPlayerEntity requestedPlayer = getRequestedPlayer(context); EnderChestInventory requestedEchest = requestedPlayer.getEnderChestInventory(); - if (isProtected(context, requestedPlayer)) { - return -1; - } - - player.openHandledScreen(new SimpleNamedScreenHandlerFactory((syncId, inv, playerEntity) -> - new EnderChestScreenHandler(syncId, player.inventory, requestedEchest, 3, requestedPlayer), - requestedPlayer.getDisplayName() - )); + isProtected(requestedPlayer).thenAcceptAsync(isProtected -> { + if (isProtected) { + context.getSource().sendError(new LiteralText("Requested inventory is protected")); + return; + } else { + player.openHandledScreen(new SimpleNamedScreenHandlerFactory((syncId, inv, playerEntity) -> + new EnderChestScreenHandler(syncId, player.inventory, requestedEchest, 3, requestedPlayer), + requestedPlayer.getDisplayName() + )); + } + }); return 1; } + /* public static int mountInv(CommandContext context) throws CommandSyntaxException { ServerPlayerEntity player = context.getSource().getPlayer(); @@ -77,32 +72,47 @@ public static int mountInv(CommandContext context) throws C if (requestedPlayer.getVehicle() != null && requestedPlayer.getVehicle() instanceof HorseBaseEntity) { HorseBaseEntity mount = (HorseBaseEntity) requestedPlayer.getVehicle(); - mount.openInventory(player); + //mount.openInventory(player); SimpleInventory inventory = ((HorseInventoryAccess)mount).getItems(); - player.openHorseInventory(mount, inventory); + //player.openHorseInventory(mount, inventory); + + if (player.currentScreenHandler != player.playerScreenHandler) { - player.closeCurrentScreen(); + player.closeHandledScreen(); } - //player.openHandledScreen(new CanOpenHorseScreenHandler(player.currentScreenHandler.syncId, player.inventory, inventory, mount)); + player.incrementScreenHandlerSyncId(); + player.networkHandler.sendPacket(new OpenHorseScreenS2CPacket(player.screenHandlerSyncId, inventory.size(), 8)); + player.currentScreenHandler = new MountScreenHandler(player.screenHandlerSyncId, player.inventory, inventory); + player.currentScreenHandler.addListener(player); + + + player.openHandledScreen(new SimpleNamedScreenHandlerFactory((syncId, inv, player1) -> + new MountScreenHandler(player.currentScreenHandler.syncId, player.inventory, inventory), + requestedPlayer.getDisplayName() + )); } return 1; } - */ + */ public static int trinkets(CommandContext context) throws CommandSyntaxException { ServerPlayerEntity player = context.getSource().getPlayer(); ServerPlayerEntity requestedPlayer = getRequestedPlayer(context); - if (isProtected(context, requestedPlayer)) { - return -1; - } + isProtected(requestedPlayer).thenAcceptAsync(isProtected -> { + if (isProtected) { + context.getSource().sendError(new LiteralText("Requested inventory is protected")); + return; + } else { + player.openHandledScreen(new SimpleNamedScreenHandlerFactory((syncId, inv, player1) -> + new TrinketScreenHandler(syncId, player.inventory, requestedPlayer), + requestedPlayer.getDisplayName() + )); + } + }); - player.openHandledScreen(new SimpleNamedScreenHandlerFactory((syncId, inv, player1) -> - new TrinketScreenHandler(syncId, player.inventory, requestedPlayer), - requestedPlayer.getDisplayName() - )); return 1; } @@ -118,12 +128,18 @@ private static ServerPlayerEntity getRequestedPlayer(CommandContext context, ServerPlayerEntity requested) throws CommandSyntaxException { - if (Permissions.check(requested, "invview.protected")) { - context.getSource().sendError(new LiteralText("Requested inventory is protected")); - return true; - } + private static CompletableFuture isProtected(ServerPlayerEntity playerEntity) { + if (!InvView.isLuckPerms) return CompletableFuture.completedFuture(playerEntity.hasPermissionLevel(3)); + + return LuckPermsProvider.get().getUserManager().loadUser(playerEntity.getUuid()) + .thenApplyAsync(user -> { + CachedPermissionData permissionData = user.getCachedData().getPermissionData(user.getQueryOptions()); + Tristate tristate = permissionData.checkPermission("invview.protected"); + if (tristate.equals(Tristate.UNDEFINED)) { + return playerEntity.hasPermissionLevel(3); + } - return false; + return tristate.asBoolean(); + }); } } diff --git a/src/main/java/us/potatoboy/invview/gui/MountScreenHandler.java b/src/main/java/us/potatoboy/invview/gui/MountScreenHandler.java index 42e19ed..635d804 100644 --- a/src/main/java/us/potatoboy/invview/gui/MountScreenHandler.java +++ b/src/main/java/us/potatoboy/invview/gui/MountScreenHandler.java @@ -1,14 +1,13 @@ package us.potatoboy.invview.gui; -import net.minecraft.entity.passive.HorseBaseEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.Inventory; import net.minecraft.screen.HorseScreenHandler; public class MountScreenHandler extends HorseScreenHandler { - public MountScreenHandler(int syncId, PlayerInventory playerInventory, Inventory inventory, HorseBaseEntity entity) { - super(syncId, playerInventory, inventory, entity); + public MountScreenHandler(int syncId, PlayerInventory playerInventory, Inventory inventory) { + super(syncId, playerInventory, inventory, null); } @Override diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 6d9397b..6439147 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -13,6 +13,13 @@ "issues": "https://github.com/PotatoPresident/InvView/issues", "homepage": "https://www.curseforge.com/minecraft/mc-mods/inv-view" }, + "custom": { + "modmenu": { + "links": { + "modmenu.discord": "https://discord.gg/ByaVuebAPb" + } + } + }, "license": "MIT", "icon": "logo.png", "environment": "*", @@ -28,5 +35,6 @@ "fabricloader": ">=0.7.2", "fabric": "*", "minecraft": ">=1.16.2" - } + }, + "accessWidener": "invview.accesswidener" } diff --git a/src/main/resources/invview.accesswidener b/src/main/resources/invview.accesswidener new file mode 100644 index 0000000..75c3ae9 --- /dev/null +++ b/src/main/resources/invview.accesswidener @@ -0,0 +1,3 @@ +accessWidener v1 named +accessible method net/minecraft/server/network/ServerPlayerEntity incrementScreenHandlerSyncId ()V +accessible field net/minecraft/server/network/ServerPlayerEntity screenHandlerSyncId I \ No newline at end of file