From d9333f12f5a8e95a4c94bd04c0f1977c39a9810d Mon Sep 17 00:00:00 2001 From: Alex <106665507+TSERATO@users.noreply.github.com> Date: Sat, 8 Nov 2025 13:14:05 +0100 Subject: [PATCH] fancynpcs: Implemented inversed permission checks -> "!" prefix for perms (#139) * Implemented feature from here: https://github.com/FancyInnovations/FancyPlugins/issues/86 * Implemented feature from here: https://github.com/FancyInnovations/FancyPlugins/issues/50 --- .../actions/types/NeedPermissionAction.java | 8 +++- .../fancynpcs/api/events/NpcModifyEvent.java | 1 + .../commands/CloudCommandManager.java | 1 + .../fancynpcs/commands/npc/RotateCMD.java | 43 +++++++++++++++++++ .../src/main/resources/languages/default.yml | 5 +++ 5 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 plugins/fancynpcs/src/main/java/de/oliver/fancynpcs/commands/npc/RotateCMD.java diff --git a/plugins/fancynpcs/fn-api/src/main/java/de/oliver/fancynpcs/api/actions/types/NeedPermissionAction.java b/plugins/fancynpcs/fn-api/src/main/java/de/oliver/fancynpcs/api/actions/types/NeedPermissionAction.java index 1f57ffcb..0c3eaadb 100644 --- a/plugins/fancynpcs/fn-api/src/main/java/de/oliver/fancynpcs/api/actions/types/NeedPermissionAction.java +++ b/plugins/fancynpcs/fn-api/src/main/java/de/oliver/fancynpcs/api/actions/types/NeedPermissionAction.java @@ -20,7 +20,13 @@ public class NeedPermissionAction extends NpcAction { return; } - if (!context.getPlayer().hasPermission(value)) { + boolean invertCheck = value.startsWith("!"); + String permission = invertCheck ? value.substring(1) : value; + + boolean hasPermission = context.getPlayer().hasPermission(permission); + boolean passesCheck = invertCheck ? !hasPermission : hasPermission; + + if (!passesCheck) { FancyNpcsPlugin.get().getTranslator().translate("action_missing_permissions").send(context.getPlayer()); context.terminate(); } diff --git a/plugins/fancynpcs/fn-api/src/main/java/de/oliver/fancynpcs/api/events/NpcModifyEvent.java b/plugins/fancynpcs/fn-api/src/main/java/de/oliver/fancynpcs/api/events/NpcModifyEvent.java index 202916d3..2e94499c 100644 --- a/plugins/fancynpcs/fn-api/src/main/java/de/oliver/fancynpcs/api/events/NpcModifyEvent.java +++ b/plugins/fancynpcs/fn-api/src/main/java/de/oliver/fancynpcs/api/events/NpcModifyEvent.java @@ -90,6 +90,7 @@ public class NpcModifyEvent extends Event implements Cancellable { LOCATION, MIRROR_SKIN, PLAYER_COMMAND, + ROTATION, SERVER_COMMAND, SHOW_IN_TAB, SKIN, diff --git a/plugins/fancynpcs/src/main/java/de/oliver/fancynpcs/commands/CloudCommandManager.java b/plugins/fancynpcs/src/main/java/de/oliver/fancynpcs/commands/CloudCommandManager.java index 15fcfde9..9a98ca8d 100644 --- a/plugins/fancynpcs/src/main/java/de/oliver/fancynpcs/commands/CloudCommandManager.java +++ b/plugins/fancynpcs/src/main/java/de/oliver/fancynpcs/commands/CloudCommandManager.java @@ -184,6 +184,7 @@ public final class CloudCommandManager { annotationParser.parse(NearbyCMD.INSTANCE); annotationParser.parse(HelpCMD.INSTANCE); annotationParser.parse(RemoveCMD.INSTANCE); + annotationParser.parse(RotateCMD.INSTANCE); annotationParser.parse(ShowInTabCMD.INSTANCE); annotationParser.parse(SkinCMD.INSTANCE); annotationParser.parse(TeleportCMD.INSTANCE); diff --git a/plugins/fancynpcs/src/main/java/de/oliver/fancynpcs/commands/npc/RotateCMD.java b/plugins/fancynpcs/src/main/java/de/oliver/fancynpcs/commands/npc/RotateCMD.java new file mode 100644 index 00000000..31a804d5 --- /dev/null +++ b/plugins/fancynpcs/src/main/java/de/oliver/fancynpcs/commands/npc/RotateCMD.java @@ -0,0 +1,43 @@ +package de.oliver.fancynpcs.commands.npc; + +import de.oliver.fancylib.translations.Translator; +import de.oliver.fancynpcs.FancyNpcs; +import de.oliver.fancynpcs.api.Npc; +import de.oliver.fancynpcs.api.events.NpcModifyEvent; +import org.bukkit.Location; +import org.bukkit.command.CommandSender; +import org.incendo.cloud.annotations.Command; +import org.incendo.cloud.annotations.Permission; +import org.jetbrains.annotations.NotNull; + +public enum RotateCMD { + INSTANCE; + + private final Translator translator = FancyNpcs.getInstance().getTranslator(); + + @Command("npc rotate ") + @Permission("fancynpcs.command.npc.rotate") + public void onRotate( + final @NotNull CommandSender sender, + final @NotNull Npc npc, + final float yaw, + final float pitch + ) { + final Location currentLocation = npc.getData().getLocation(); + final Location newLocation = currentLocation.clone(); + newLocation.setYaw(yaw); + newLocation.setPitch(pitch); + + if (new NpcModifyEvent(npc, NpcModifyEvent.NpcModification.ROTATION, new float[]{yaw, pitch}, sender).callEvent()) { + npc.getData().setLocation(newLocation); + npc.updateForAll(); + translator.translate("npc_rotate_set_success") + .replace("npc", npc.getData().getName()) + .replace("yaw", String.valueOf(yaw)) + .replace("pitch", String.valueOf(pitch)) + .send(sender); + } else { + translator.translate("command_npc_modification_cancelled").send(sender); + } + } +} \ No newline at end of file diff --git a/plugins/fancynpcs/src/main/resources/languages/default.yml b/plugins/fancynpcs/src/main/resources/languages/default.yml index 2563765d..d3e217e1 100644 --- a/plugins/fancynpcs/src/main/resources/languages/default.yml +++ b/plugins/fancynpcs/src/main/resources/languages/default.yml @@ -123,6 +123,7 @@ messages: npc_move_to: "Syntax: {primaryColor}/npc move_to {secondaryColor}(npc) (x) (y) (z) [world]" npc_nearby: "Syntax: {primaryColor}/npc nearby {secondaryColor}[filters...]" npc_remove: "Syntax: {primaryColor}/npc remove {secondaryColor}(npc)" + npc_rotate: "Syntax: {primaryColor}/npc rotate {secondaryColor}(npc) (yaw) (pitch)" npc_show_in_tab: "Syntax: {primaryColor}/npc show_in_tab {secondaryColor}(npc) (state)" npc_skin: "Syntax: {primaryColor}/npc skin {secondaryColor}(npc) (@none | @mirror | name | uuid | placeholder | url | file name) [--slim]" npc_teleport: "Syntax: {primaryColor}/npc teleport {secondaryColor}(npc)" @@ -176,6 +177,7 @@ messages: - "Teleports NPC to specified location.'>{primaryColor}/npc move_to {secondaryColor}(npc) (x) (y) (z) [world]" - "Lists all NPCs in your world. Can be filtered and sorted.'>{primaryColor}/npc nearby {secondaryColor}[--radius] [--type] [--sort]" - "Removes (deletes) specified NPC.'>{primaryColor}/npc remove {secondaryColor}(npc)" + - "Changes the rotation (yaw and pitch) of the NPC.'>{primaryColor}/npc rotate {secondaryColor}(npc) (yaw) (pitch)" - "Changes the scale of the size of the NPC.'>{primaryColor}/npc scale {secondaryColor}(npc) (factor)" - "Changes whether the NPC is shown in the player-list. This works only on NPCs of PLAYER type.{errorColor}Re-connecting to the server might be required for changes to take effect.'>{primaryColor}/npc show_in_tab {secondaryColor}(npc) (state)" - "Changes skin of the NPC.Supports PlaceholderAPI and MiniPlaceholders.{warningColor}@none - removes the skin{warningColor}@mirror - mirrors player skin{warningColor}(name) - name of any player{warningColor}(url) - url of the skin texture'>{primaryColor}/npc skin {secondaryColor}(npc) (@none | @mirror | name | url) [--slim]" @@ -302,6 +304,9 @@ messages: # Commands (npc remove) npc_remove_success: "NPC {warningColor}{npc} has been removed." + # Commands (npc rotate) + npc_rotate_set_success: "NPC {warningColor}{npc} has been rotated to yaw {warningColor}{yaw} and pitch {warningColor}{pitch}." + # Commands (scale) npc_scale_set_success: "NPC {warningColor}{npc} has been scaled to {warningColor}{scale}."