diff --git a/.documentation/ACTIONS.md b/.documentation/ACTIONS.md new file mode 100644 index 0000000..47c3fad --- /dev/null +++ b/.documentation/ACTIONS.md @@ -0,0 +1,31 @@ +# UserPrefix Actions 操作 + +## 使用方式 + +在 `actions` 配置节点下,可以配置多个操作,格式为 `[操作类型] {操作参数}`,例如: + +- `[CHAT] HELLO %player_name%!` +- `[SOUND] ENTITY_PLAYER_LEVELUP` + +## 操作类型 + +目前支持以下操作类型: +- `CHAT` 以玩家聊天的形式发送,若需要发送指令则添加“/”前缀 +- `CONSOLE` 以后台的形式发送指令 +- `MESSAGE` 向玩家发送一条消息 +- `SOUND` 向玩家发送声音 +- `CLOSE` 关闭当前打开的GUI + +所有需要键入文本的类型均支持 [PlaceholderAPI](https://www.spigotmc.org/resources/6245/) 变量 。 + +## 限定点击类型 + +若您需要限定玩家点击的类型,如左键、右键等,则可以添加在操作类型后,以“`:`”分割,如: + +- `[CLOSE:LEFT]` 代表左键点击关闭 +- `[MESSAGE:MIDDLE] HELLO WORLD` 代表鼠标中间点击发送消息 + +详细点击类型见 [`org.bukkit.event.inventory.ClickType`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/event/inventory/ClickType.html) 。 + + + diff --git a/.documentation/README.md b/.documentation/README.md index 087f0d0..fa576f5 100644 --- a/.documentation/README.md +++ b/.documentation/README.md @@ -13,6 +13,7 @@ - 使用示例 - [前缀配置文件预设示例](../src/main/resources/prefixes/example-prefix.yml) +- [操作(Actions)配置](ACTIONS.md) ## [开发文档](JAVADOC-README.md) diff --git a/pom.xml b/pom.xml index cad98a7..f30de22 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ UTF-8 UTF-8 - 1.4.13 + 1.4.14 2.0.2 @@ -162,7 +162,7 @@ net.luckperms api - 5.3 + 5.4 provided @@ -220,7 +220,7 @@ javadoc - + https://javadoc.io/doc/org.jetbrains/annotations/ https://hub.spigotmc.org/javadocs/bukkit/ https://carmjos.github.io/EasyPlugin/ https://carmjos.github.io/MineConfiguration/ diff --git a/src/main/java/cc/carm/plugin/userprefix/command/AdminCommand.java b/src/main/java/cc/carm/plugin/userprefix/command/AdminCommand.java index 35ceba0..c245ae1 100644 --- a/src/main/java/cc/carm/plugin/userprefix/command/AdminCommand.java +++ b/src/main/java/cc/carm/plugin/userprefix/command/AdminCommand.java @@ -13,19 +13,20 @@ public class AdminCommand extends CommandHandler { public AdminCommand(@NotNull JavaPlugin plugin) { super(plugin); - registerSubCommand(new ListCommand("list", "l")); - registerSubCommand(new ReloadCommand("reload")); + registerSubCommand(new ListCommand(this, "list", "l")); + registerSubCommand(new ReloadCommand(this, "reload")); } @Override - public void noArgs(CommandSender sender) { - help(sender); + public Void noArgs(CommandSender sender) { + return help(sender); } @Override - public void noPermission(CommandSender sender) { + public Void noPermission(CommandSender sender) { PluginMessages.COMMAND_USAGE.NO_PERM.send(sender); + return null; } public static Void help(CommandSender sender) { diff --git a/src/main/java/cc/carm/plugin/userprefix/command/sub/ListCommand.java b/src/main/java/cc/carm/plugin/userprefix/command/sub/ListCommand.java index e720e8c..96092e8 100644 --- a/src/main/java/cc/carm/plugin/userprefix/command/sub/ListCommand.java +++ b/src/main/java/cc/carm/plugin/userprefix/command/sub/ListCommand.java @@ -2,15 +2,17 @@ package cc.carm.plugin.userprefix.command.sub; import cc.carm.lib.easyplugin.command.SubCommand; import cc.carm.plugin.userprefix.UserPrefixAPI; +import cc.carm.plugin.userprefix.command.AdminCommand; import cc.carm.plugin.userprefix.conf.PluginMessages; import cc.carm.plugin.userprefix.conf.prefix.PrefixConfig; import org.bukkit.command.CommandSender; import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; -public class ListCommand extends SubCommand { +public class ListCommand extends SubCommand { - public ListCommand(String name, String... aliases) { - super(name, aliases); + public ListCommand(@NotNull AdminCommand parent, String name, String... aliases) { + super(parent, name, aliases); } @Override diff --git a/src/main/java/cc/carm/plugin/userprefix/command/sub/ReloadCommand.java b/src/main/java/cc/carm/plugin/userprefix/command/sub/ReloadCommand.java index a69423f..3ef9d07 100644 --- a/src/main/java/cc/carm/plugin/userprefix/command/sub/ReloadCommand.java +++ b/src/main/java/cc/carm/plugin/userprefix/command/sub/ReloadCommand.java @@ -2,17 +2,19 @@ package cc.carm.plugin.userprefix.command.sub; import cc.carm.lib.easyplugin.command.SubCommand; import cc.carm.plugin.userprefix.UserPrefixAPI; +import cc.carm.plugin.userprefix.command.AdminCommand; import cc.carm.plugin.userprefix.conf.PluginMessages; import cc.carm.plugin.userprefix.ui.PrefixSelectGUI; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; -public class ReloadCommand extends SubCommand { +public class ReloadCommand extends SubCommand { - public ReloadCommand(String name, String... aliases) { - super(name, aliases); + public ReloadCommand(@NotNull AdminCommand parent, String name, String... aliases) { + super(parent, name, aliases); } @Override diff --git a/src/main/java/cc/carm/plugin/userprefix/conf/PluginConfig.java b/src/main/java/cc/carm/plugin/userprefix/conf/PluginConfig.java index 4fba1e9..5f10311 100644 --- a/src/main/java/cc/carm/plugin/userprefix/conf/PluginConfig.java +++ b/src/main/java/cc/carm/plugin/userprefix/conf/PluginConfig.java @@ -4,6 +4,7 @@ import cc.carm.lib.configuration.core.ConfigurationRoot; import cc.carm.lib.configuration.core.annotation.ConfigPath; import cc.carm.lib.configuration.core.annotation.HeaderComment; import cc.carm.lib.configuration.core.value.ConfigValue; +import cc.carm.lib.configuration.core.value.type.ConfiguredList; import cc.carm.lib.configuration.core.value.type.ConfiguredValue; import cc.carm.lib.easyplugin.gui.configuration.GUIActionConfiguration; import cc.carm.lib.easyplugin.gui.configuration.GUIActionType; @@ -154,6 +155,10 @@ public class PluginConfig extends ConfigurationRoot { @HeaderComment({"默认前缀的内容,即用于显示的实际前缀"}) public static final ConfigValue CONTENT = ConfiguredValue.of(String.class, "&r"); + @HeaderComment({"选择默认前缀时执行的操作"}) + public static final ConfiguredList ACTIONS = ConfiguredList.builder(String.class).fromString() + .defaults("[CONSOLE] " + "say %player_name% 选择了默认前缀") + .build(); @HeaderComment({"默认前缀的显示物品"}) public static final class ITEM { diff --git a/src/main/java/cc/carm/plugin/userprefix/conf/prefix/PrefixConfig.java b/src/main/java/cc/carm/plugin/userprefix/conf/prefix/PrefixConfig.java index a70549f..7019948 100644 --- a/src/main/java/cc/carm/plugin/userprefix/conf/prefix/PrefixConfig.java +++ b/src/main/java/cc/carm/plugin/userprefix/conf/prefix/PrefixConfig.java @@ -1,5 +1,6 @@ package cc.carm.plugin.userprefix.conf.prefix; +import cc.carm.lib.easyplugin.gui.configuration.GUIActionConfiguration; import cc.carm.lib.easyplugin.utils.ColorParser; import cc.carm.lib.mineconfiguration.bukkit.data.ItemConfig; import cc.carm.plugin.userprefix.manager.ServiceManager; @@ -8,6 +9,8 @@ import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; + public class PrefixConfig { protected final @NotNull String identifier; @@ -19,12 +22,15 @@ public class PrefixConfig { protected final @Nullable String permission; + protected final @NotNull List actions; + protected final @NotNull ItemConfig itemHasPermission; protected final @Nullable ItemConfig itemNoPermission; protected final @Nullable ItemConfig itemWhenUsing; public PrefixConfig(@NotNull String identifier, @NotNull String name, @NotNull String content, int weight, @Nullable String permission, + @NotNull List actions, @NotNull ItemConfig itemHasPermission, @Nullable ItemConfig itemWhenUsing, @Nullable ItemConfig itemNoPermission) { @@ -33,6 +39,7 @@ public class PrefixConfig { this.content = content; this.weight = weight; this.permission = permission; + this.actions = actions; this.itemHasPermission = itemHasPermission; this.itemNoPermission = itemNoPermission; this.itemWhenUsing = itemWhenUsing; @@ -83,6 +90,10 @@ public class PrefixConfig { return getPermission() == null; } + public void executeActions(@NotNull Player player) { + this.actions.forEach(action -> action.executeAction(player)); + } + public boolean isVisible(Player player) { return this.itemWhenUsing != null || checkPermission(player); } diff --git a/src/main/java/cc/carm/plugin/userprefix/manager/PrefixManager.java b/src/main/java/cc/carm/plugin/userprefix/manager/PrefixManager.java index 970d78d..c164dfc 100644 --- a/src/main/java/cc/carm/plugin/userprefix/manager/PrefixManager.java +++ b/src/main/java/cc/carm/plugin/userprefix/manager/PrefixManager.java @@ -1,5 +1,6 @@ package cc.carm.plugin.userprefix.manager; +import cc.carm.lib.easyplugin.gui.configuration.GUIActionConfiguration; import cc.carm.lib.mineconfiguration.bukkit.data.ItemConfig; import cc.carm.lib.mineconfiguration.bukkit.source.CraftSectionWrapper; import cc.carm.plugin.userprefix.Main; @@ -57,7 +58,7 @@ public class PrefixManager { if (files.size() > 0) { for (File file : files) { try { - PrefixConfig prefix = adPrefix(file); + PrefixConfig prefix = addPrefix(file); Main.debugging("完成前缀加载 " + prefix.getIdentifier() + " : " + prefix.getName()); loaded.put(prefix.getIdentifier(), prefix); } catch (Exception ex) { @@ -78,6 +79,7 @@ public class PrefixManager { PluginConfig.DEFAULT_PREFIX.CONTENT.getNotNull(), PluginConfig.DEFAULT_PREFIX.WEIGHT.getNotNull(), null, + readActions(PluginConfig.DEFAULT_PREFIX.ACTIONS.get()), PluginConfig.DEFAULT_PREFIX.ITEM.NOT_USING.getNotNull(), PluginConfig.DEFAULT_PREFIX.ITEM.USING.get(), null @@ -122,10 +124,11 @@ public class PrefixManager { } } - public static @NotNull PrefixConfig adPrefix(@NotNull File file) throws Exception { + public static @NotNull PrefixConfig addPrefix(@NotNull File file) throws Exception { FileConfiguration configuration = YamlConfiguration.loadConfiguration(file); String identifier = configuration.getString("identifier"); - if (identifier == null) throw new Exception("配置文件 " + file.getAbsolutePath() + " 中没有配置前缀的唯一标识。"); + if (identifier == null) + throw new Exception("配置文件 " + file.getAbsolutePath() + " 中没有配置前缀的唯一标识。"); String name = configuration.getString("name"); if (name == null) throw new Exception("配置文件 " + file.getAbsolutePath() + " 中没有配置前缀的显示名称。"); @@ -135,6 +138,7 @@ public class PrefixManager { configuration.getString("content", "&r"), configuration.getInt("weight", 1), configuration.getString("permission"), + readActions(configuration.getStringList("actions")), readItem( configuration.getConfigurationSection("item.has-perm"), new ItemConfig(Material.STONE, name, Arrays.asList(" ", "§a➥ 点击切换到该前缀")) @@ -151,5 +155,9 @@ public class PrefixManager { else return ItemConfig.deserialize(CraftSectionWrapper.of(section)); } + protected static List readActions(@NotNull List strings) { + return strings.stream().map(GUIActionConfiguration::deserialize).filter(Objects::nonNull).collect(Collectors.toList()); + } + } diff --git a/src/main/java/cc/carm/plugin/userprefix/manager/UserManager.java b/src/main/java/cc/carm/plugin/userprefix/manager/UserManager.java index c2bbad9..1b70622 100644 --- a/src/main/java/cc/carm/plugin/userprefix/manager/UserManager.java +++ b/src/main/java/cc/carm/plugin/userprefix/manager/UserManager.java @@ -141,9 +141,7 @@ public class UserManager { } UserPrefixChangeEvent.call(player, currentPrefix, newPrefix, (after) -> { - if (after != null) { - setPrefix(player, after, updateView); - } + if (after != null) setPrefix(player, after, updateView); checkingPlayers.remove(player.getUniqueId()); }); @@ -183,6 +181,7 @@ public class UserManager { */ public void setPrefix(Player player, PrefixConfig prefix, boolean updateView) { setPrefixData(player, prefix.getIdentifier()); + prefix.executeActions(player); if (updateView) updatePrefixView(player, false); } diff --git a/src/main/java/cc/carm/plugin/userprefix/ui/PrefixSelectGUI.java b/src/main/java/cc/carm/plugin/userprefix/ui/PrefixSelectGUI.java index e3071f1..1ce24f8 100644 --- a/src/main/java/cc/carm/plugin/userprefix/ui/PrefixSelectGUI.java +++ b/src/main/java/cc/carm/plugin/userprefix/ui/PrefixSelectGUI.java @@ -7,6 +7,7 @@ import cc.carm.plugin.userprefix.UserPrefixAPI; import cc.carm.plugin.userprefix.conf.PluginConfig; import cc.carm.plugin.userprefix.conf.PluginMessages; import cc.carm.plugin.userprefix.conf.prefix.PrefixConfig; +import cc.carm.plugin.userprefix.event.UserPrefixChangeEvent; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; @@ -51,15 +52,22 @@ public class PrefixSelectGUI extends AutoPagedGUI { addItem(new GUIItem(prefix.getItemWhenUsing(player) != null ? prefix.getItemWhenUsing(player) : prefix.getItemHasPermission(player))); } else if (prefix.checkPermission(player)) { addItem(new GUIItem(prefix.getItemHasPermission(player)) { + @Override - public void onClick(ClickType type) { + public void onClick(Player clicker, ClickType type) { player.closeInventory(); //再次检查,防止打开GUI后、选择前的时间段内权限消失 if (prefix.checkPermission(player)) { - UserPrefixAPI.getUserManager().setPrefix(player, prefix, true); + // 发送消息与提示 PluginConfig.SOUNDS.PREFIX_CHANGE.playTo(player); PluginMessages.SELECTED.send(player, prefix.getName()); + + UserPrefixChangeEvent.call(player, usingPrefix, prefix, config -> { + if (config == null) return; + UserPrefixAPI.getUserManager().setPrefix(player, config, true); + }); + } else { PluginConfig.SOUNDS.GUI_CLICK.playTo(player); } @@ -68,7 +76,7 @@ public class PrefixSelectGUI extends AutoPagedGUI { } else { addItem(new GUIItem(prefix.getItemNoPermission(player)) { @Override - public void onClick(ClickType type) { + public void onClick(Player clicker, ClickType type) { PluginConfig.SOUNDS.GUI_CLICK.playTo(player); } }); diff --git a/src/main/resources/en_US/example-prefix.yml b/src/main/resources/en_US/example-prefix.yml index c97f527..b148183 100644 --- a/src/main/resources/en_US/example-prefix.yml +++ b/src/main/resources/en_US/example-prefix.yml @@ -22,6 +22,11 @@ weight: 1 # (because it is impossible to display items without permission at all) permission: "yc.vip" +# Actions when select [Unnecessary] +# Please check https://github.com/CarmJos/UserPrefix/tree/master/.documentation/ACTIONS.md +actions: + - "[CONSOLE] say %player_name% selected PRO !" + item: # itemHasPermission [Necessary] # This Item will be displayed when player has permission diff --git a/src/main/resources/prefixes/example-prefix.yml b/src/main/resources/prefixes/example-prefix.yml index d3bcbec..197ea53 100644 --- a/src/main/resources/prefixes/example-prefix.yml +++ b/src/main/resources/prefixes/example-prefix.yml @@ -22,6 +22,12 @@ weight: 1 # 如果没有就是人人都能用,也代表不用配置“itemNoPermission”了(因为压根不可能显示没权限时候的物品) permission: "yc.pro" +# 选择这个前缀时执行的操作 [非必须] +# 用于在玩家选择/取消选择前缀时执行相应动作,以便于实现一些特殊的功能。 +# 具体操作类型详见: https://github.com/CarmJos/UserPrefix/tree/master/.documentation/ACTIONS.md +actions: + - "[CONSOLE] say %player_name% 选择了 Pro会员前缀 !" + # 该前缀的GUI物品配置 item: