mirror of
https://github.com/CarmJos/UserPrefix.git
synced 2026-06-05 09:01:39 +08:00
Compare commits
21 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e5013b76e0 | |||
| 6604cec136 | |||
| c7f3286d81 | |||
| 5ed6f1a301 | |||
| 9864d5a75e | |||
| 2b8a7e7545 | |||
| 25b961b913 | |||
| 8e8427a937 | |||
| 748335a962 | |||
| 1e0fd2bcd4 | |||
| 04caf2df73 | |||
| 0eba124f08 | |||
| d54349da98 | |||
| eab9b2385c | |||
| 003884d772 | |||
| 610242ff62 | |||
| 289ab87273 | |||
| 46c1c03113 | |||
| 5ddde2aa99 | |||
| 38a9b0866c | |||
| e7b5b78d66 |
@@ -47,7 +47,7 @@ jobs:
|
||||
run: |
|
||||
rm -rf docs
|
||||
mkdir -vp docs
|
||||
cp -vrf target/apidocs/* docs/
|
||||
cp -vrf target/reports/apidocs/* docs/
|
||||
cp -vrf .documentation/JAVADOC-README.md docs/README.md
|
||||
|
||||
- name: "Generate the Javadoc sitemap"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<properties>
|
||||
@@ -13,13 +13,13 @@
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
|
||||
|
||||
<deps.easyplugin.version>1.5.12</deps.easyplugin.version>
|
||||
<deps.mineconfig.version>2.9.3</deps.mineconfig.version>
|
||||
<deps.easyplugin.version>1.5.14</deps.easyplugin.version>
|
||||
<deps.mineconfig.version>3.1.3</deps.mineconfig.version>
|
||||
</properties>
|
||||
|
||||
<groupId>cc.carm.plugin</groupId>
|
||||
<artifactId>userprefix</artifactId>
|
||||
<version>3.2.6</version>
|
||||
<version>3.2.7</version>
|
||||
|
||||
<name>UserPrefix</name>
|
||||
<description>轻便、高效、实时的用户前缀系统。</description>
|
||||
@@ -173,7 +173,7 @@
|
||||
<dependency>
|
||||
<groupId>com.github.cryptomorin</groupId>
|
||||
<artifactId>XSeries</artifactId>
|
||||
<version>13.0.0</version>
|
||||
<version>13.3.3</version>
|
||||
<scope>compile</scope>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
@@ -202,7 +202,7 @@
|
||||
<dependency>
|
||||
<groupId>net.luckperms</groupId>
|
||||
<artifactId>api</artifactId>
|
||||
<version>5.4</version>
|
||||
<version>5.5</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
@@ -233,7 +233,7 @@
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-clean-plugin</artifactId>
|
||||
<version>3.4.0</version>
|
||||
<version>3.5.0</version>
|
||||
<configuration>
|
||||
<filesets>
|
||||
<fileset>
|
||||
@@ -256,7 +256,7 @@
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.13.0</version>
|
||||
<version>3.14.0</version>
|
||||
<configuration>
|
||||
<source>${project.jdk.version}</source>
|
||||
<target>${project.jdk.version}</target>
|
||||
@@ -358,7 +358,7 @@
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>3.5.2</version>
|
||||
<version>3.5.3</version>
|
||||
<configuration>
|
||||
<useSystemClassLoader>false</useSystemClassLoader>
|
||||
</configuration>
|
||||
|
||||
@@ -8,6 +8,7 @@ import cc.carm.lib.easyplugin.utils.MessageUtils;
|
||||
import cc.carm.plugin.userprefix.command.AdminCommand;
|
||||
import cc.carm.plugin.userprefix.command.UserCommand;
|
||||
import cc.carm.plugin.userprefix.conf.PluginConfig;
|
||||
import cc.carm.plugin.userprefix.folia.FoliaScheduler;
|
||||
import cc.carm.plugin.userprefix.hooker.UserPrefixExpansion;
|
||||
import cc.carm.plugin.userprefix.listener.ChatListener;
|
||||
import cc.carm.plugin.userprefix.listener.UserListener;
|
||||
@@ -28,6 +29,9 @@ public class Main extends EasyPlugin {
|
||||
|
||||
private static Main instance;
|
||||
|
||||
protected FoliaScheduler foliaScheduler;
|
||||
protected boolean onFolia;
|
||||
|
||||
protected ConfigManager configManager;
|
||||
protected PrefixManager prefixManager;
|
||||
protected UserManager userManager;
|
||||
@@ -36,6 +40,14 @@ public class Main extends EasyPlugin {
|
||||
protected boolean initialize() {
|
||||
instance = this;
|
||||
|
||||
try {
|
||||
Class.forName("io.papermc.paper.threadedregions.RegionizedServerInitEvent");
|
||||
this.onFolia = true;
|
||||
} catch (ClassNotFoundException e) {
|
||||
this.onFolia = false;
|
||||
}
|
||||
this.foliaScheduler = new FoliaScheduler(this, this.onFolia);
|
||||
|
||||
log("加载插件配置...");
|
||||
this.configManager = new ConfigManager(getDataFolder());
|
||||
this.prefixManager = new PrefixManager();
|
||||
@@ -87,11 +99,14 @@ public class Main extends EasyPlugin {
|
||||
|
||||
if (PluginConfig.CHECK_UPDATE.getNotNull()) {
|
||||
log("开始检查更新...");
|
||||
getScheduler().runAsync(GHUpdateChecker.runner(this));
|
||||
this.foliaScheduler.runAsync(GHUpdateChecker.runner(this));
|
||||
} else {
|
||||
log("已禁用检查更新,跳过。");
|
||||
}
|
||||
|
||||
if (PluginConfig.FUNCTIONS.NAME_PREFIX.ENABLE.getNotNull() && this.isOnFolia()) {
|
||||
log("插件正运行在 Folia 服务端上,头顶前缀功能不可用");
|
||||
}
|
||||
Bukkit.getOnlinePlayers().forEach(userManager::initPlayer); // 适配热重载
|
||||
|
||||
log("&7感谢您使用 &3&lUserPrefix " + getDescription().getVersion() + "&7!");
|
||||
@@ -113,6 +128,14 @@ public class Main extends EasyPlugin {
|
||||
log("&7本插件由 &b&lYourCraft &7提供长期支持与维护。");
|
||||
}
|
||||
|
||||
public boolean isOnFolia() {
|
||||
return this.onFolia;
|
||||
}
|
||||
|
||||
public FoliaScheduler getFoliaScheduler() {
|
||||
return this.foliaScheduler;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDebugging() {
|
||||
return PluginConfig.DEBUG.getNotNull();
|
||||
|
||||
@@ -26,12 +26,12 @@ public class AdminCommand extends CommandHandler {
|
||||
|
||||
@Override
|
||||
public Void noPermission(CommandSender sender) {
|
||||
PluginMessages.COMMAND_USAGE.NO_PERM.send(sender);
|
||||
PluginMessages.COMMAND_USAGE.NO_PERM.sendTo(sender);
|
||||
return null;
|
||||
}
|
||||
|
||||
public static Void help(CommandSender sender) {
|
||||
PluginMessages.COMMAND_USAGE.ADMIN.send(sender);
|
||||
PluginMessages.COMMAND_USAGE.ADMIN.sendTo(sender);
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ public class UserCommand implements CommandExecutor {
|
||||
PrefixSelectGUI.open((Player) sender);
|
||||
} else {
|
||||
if (strings.length != 1) {
|
||||
PluginMessages.COMMAND_USAGE.CONSOLE.send(sender);
|
||||
PluginMessages.COMMAND_USAGE.CONSOLE.sendTo(sender);
|
||||
} else {
|
||||
Player player = Bukkit.getPlayer(strings[0]);
|
||||
if (player != null) {
|
||||
|
||||
@@ -17,9 +17,9 @@ public class ListCommand extends SubCommand<AdminCommand> {
|
||||
|
||||
@Override
|
||||
public Void execute(JavaPlugin plugin, CommandSender sender, String[] args) {
|
||||
PluginMessages.LIST.HEADER.send(sender);
|
||||
PluginMessages.LIST.HEADER.sendTo(sender);
|
||||
for (PrefixConfig value : UserPrefixAPI.getPrefixManager().getPrefixes().values()) {
|
||||
PluginMessages.LIST.VALUE.send(sender,
|
||||
PluginMessages.LIST.VALUE.sendTo(sender,
|
||||
value.getWeight(), value.getIdentifier(),
|
||||
value.getName(), value.getPermission(),
|
||||
value.getContent(sender), sender.getName()
|
||||
|
||||
@@ -33,9 +33,9 @@ public class ReloadCommand extends SubCommand<AdminCommand> {
|
||||
*/
|
||||
UserPrefixAPI.getUserManager().updatePrefixView(onlinePlayer, false);
|
||||
}
|
||||
PluginMessages.RELOAD.SUCCESS.send(sender, System.currentTimeMillis() - s1, num);
|
||||
PluginMessages.RELOAD.SUCCESS.sendTo(sender, System.currentTimeMillis() - s1, num);
|
||||
} catch (Exception e) {
|
||||
PluginMessages.RELOAD.FAILED.send(sender, e.getMessage());
|
||||
PluginMessages.RELOAD.FAILED.sendTo(sender, e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
|
||||
@@ -23,7 +23,7 @@ public class SetCommand extends SubCommand<AdminCommand> {
|
||||
|
||||
Player target = Bukkit.getPlayer(args[0]);
|
||||
if (target == null) {
|
||||
PluginMessages.NOT_ONLINE.send(sender, args[0]);
|
||||
PluginMessages.NOT_ONLINE.sendTo(sender, args[0]);
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -37,17 +37,17 @@ public class SetCommand extends SubCommand<AdminCommand> {
|
||||
}
|
||||
|
||||
if (prefixConfig == null) {
|
||||
PluginMessages.SET.PREFIX_NOT_FOUND.send(sender, prefixInput);
|
||||
PluginMessages.SET.PREFIX_NOT_FOUND.sendTo(sender, prefixInput);
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!prefixConfig.checkPermission(target)) {
|
||||
PluginMessages.SET.NO_PERM.send(sender, target.getName(), prefixConfig.getName());
|
||||
PluginMessages.SET.NO_PERM.sendTo(sender, target.getName(), prefixConfig.getName());
|
||||
return null;
|
||||
}
|
||||
|
||||
UserPrefixAPI.getUserManager().setPrefix(target, prefixConfig, true);
|
||||
PluginMessages.SET.SUCCESS.send(sender, target.getName(), prefixConfig.getName());
|
||||
PluginMessages.SET.SUCCESS.sendTo(sender, target.getName(), prefixConfig.getName());
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,103 +1,102 @@
|
||||
package cc.carm.plugin.userprefix.conf;
|
||||
|
||||
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.configuration.Configuration;
|
||||
import cc.carm.lib.configuration.annotation.ConfigPath;
|
||||
import cc.carm.lib.configuration.annotation.HeaderComments;
|
||||
import cc.carm.lib.configuration.value.standard.ConfiguredList;
|
||||
import cc.carm.lib.configuration.value.standard.ConfiguredValue;
|
||||
import cc.carm.lib.mineconfiguration.bukkit.value.ConfiguredSound;
|
||||
import cc.carm.lib.mineconfiguration.bukkit.value.item.ConfiguredItem;
|
||||
import cc.carm.plugin.userprefix.conf.gui.GUIItems;
|
||||
import cc.carm.plugin.userprefix.folia.MajorUtil;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.inventory.ItemFlag;
|
||||
|
||||
public class PluginConfig extends ConfigurationRoot {
|
||||
public class PluginConfig implements Configuration {
|
||||
|
||||
@HeaderComment({"开发者查错模式"})
|
||||
public static final ConfigValue<Boolean> DEBUG = ConfiguredValue.of(Boolean.class, false);
|
||||
@HeaderComments({"开发者查错模式"})
|
||||
public static final ConfiguredValue<Boolean> DEBUG = ConfiguredValue.of(Boolean.class, false);
|
||||
|
||||
@HeaderComment({
|
||||
@HeaderComments({
|
||||
"统计数据设定",
|
||||
" 该选项用于帮助开发者统计插件版本与使用情况,且绝不会影响性能与使用体验。",
|
||||
" 当然,您也可以选择在这里关闭,或在plugins/bStats下的配置文件中关闭。"
|
||||
})
|
||||
public static final ConfigValue<Boolean> METRICS = ConfiguredValue.of(Boolean.class, true);
|
||||
public static final ConfiguredValue<Boolean> METRICS = ConfiguredValue.of(Boolean.class, true);
|
||||
|
||||
@HeaderComment({
|
||||
@HeaderComments({
|
||||
"检查更新设定",
|
||||
"该选项用于插件判断是否要检查更新,若您不希望插件检查更新并提示您,可以选择关闭。",
|
||||
"检查更新为异步操作,绝不会影响性能与使用体验。"
|
||||
})
|
||||
public static final ConfigValue<Boolean> CHECK_UPDATE = ConfiguredValue.of(Boolean.class, true);
|
||||
public static final ConfiguredValue<Boolean> CHECK_UPDATE = ConfiguredValue.of(Boolean.class, true);
|
||||
|
||||
@HeaderComment({"自定义存储位置设定", "可以规定到远程文件夹中去加载前缀配置"})
|
||||
public static final class CUSTOM_STORAGE extends ConfigurationRoot {
|
||||
@HeaderComments({"自定义存储位置设定", "可以规定到远程文件夹中去加载前缀配置"})
|
||||
public static final class CUSTOM_STORAGE implements Configuration {
|
||||
|
||||
@HeaderComment({"是否启用自定义存储位置"})
|
||||
public static final ConfigValue<Boolean> ENABLE = ConfiguredValue.of(Boolean.class, false);
|
||||
@HeaderComments({"是否启用自定义存储位置"})
|
||||
public static final ConfiguredValue<Boolean> ENABLE = ConfiguredValue.of(Boolean.class, false);
|
||||
|
||||
@HeaderComment({
|
||||
@HeaderComments({
|
||||
"目标存储路径,必须指向一个文件夹。",
|
||||
"默认存储位置为 “插件文件夹”/prefixes",
|
||||
"支持绝对文件路径,如 \"/etc/minecraft/configurations/prefixes/\""
|
||||
})
|
||||
public static final ConfigValue<String> PATH = ConfiguredValue.of(String.class, "prefixes/");
|
||||
public static final ConfiguredValue<String> PATH = ConfiguredValue.of(String.class, "prefixes/");
|
||||
|
||||
}
|
||||
|
||||
@HeaderComment("功能设定")
|
||||
public static class FUNCTIONS extends ConfigurationRoot {
|
||||
@HeaderComments("功能设定")
|
||||
public static class FUNCTIONS implements Configuration {
|
||||
|
||||
@ConfigPath("on-name-prefix")
|
||||
@HeaderComment({"头顶与TabList前缀功能,该方法用到了玩家名计分板接口,如有冲突请关掉哦~"})
|
||||
public static final class NAME_PREFIX extends ConfigurationRoot {
|
||||
@HeaderComments({"头顶与TabList前缀功能,该方法用到了玩家名计分板接口,如有冲突请关掉哦~"})
|
||||
public static final class NAME_PREFIX implements Configuration {
|
||||
|
||||
@HeaderComment("是否开启本功能")
|
||||
public static final ConfigValue<Boolean> ENABLE = ConfiguredValue.of(Boolean.class, true);
|
||||
@HeaderComments("是否开启本功能")
|
||||
public static final ConfiguredValue<Boolean> ENABLE = ConfiguredValue.of(Boolean.class, true);
|
||||
|
||||
@HeaderComment("是否按降序排列,即权重越高的前缀显示在越上面;若为false则按升序排列。")
|
||||
public static final ConfigValue<Boolean> ORDER_DESC = ConfiguredValue.of(Boolean.class, true);
|
||||
@HeaderComments("是否按降序排列,即权重越高的前缀显示在越上面;若为false则按升序排列。")
|
||||
public static final ConfiguredValue<Boolean> ORDER_DESC = ConfiguredValue.of(Boolean.class, true);
|
||||
|
||||
}
|
||||
|
||||
@ConfigPath("auto-prefix-use")
|
||||
@HeaderComment("自动使用前缀,即当玩家没有自己选择一个前缀的时候,会自动使用所拥有的的前缀中权重最高的那一个")
|
||||
public static final ConfigValue<Boolean> AUTO_USE = ConfiguredValue.of(Boolean.class, true);
|
||||
@HeaderComments("自动使用前缀,即当玩家没有自己选择一个前缀的时候,会自动使用所拥有的的前缀中权重最高的那一个")
|
||||
public static final ConfiguredValue<Boolean> AUTO_USE = ConfiguredValue.of(Boolean.class, true);
|
||||
|
||||
|
||||
@HeaderComment({
|
||||
@HeaderComments({
|
||||
"聊天功能设定",
|
||||
"- 我不推荐使用本插件的聊天功能,而是建议使用其他的聊天插件。",
|
||||
"- 本插件仅仅提供了**最基本**的格式变量支持,不包含其他任何功能。",
|
||||
"- 注意聊天格式需要遵守Bukkit原格式,即不得缺失 “%1$s” 和 “%2$s” 。",
|
||||
"- 本插件的聊天功能不影响其他插件对聊天事件的操作。"
|
||||
})
|
||||
public static final class CHAT extends ConfigurationRoot {
|
||||
public static final class CHAT implements Configuration {
|
||||
|
||||
@HeaderComment("是否开启本功能")
|
||||
public static final ConfigValue<Boolean> ENABLE = ConfiguredValue.of(Boolean.class, false);
|
||||
@HeaderComment({
|
||||
@HeaderComments("是否开启本功能")
|
||||
public static final ConfiguredValue<Boolean> ENABLE = ConfiguredValue.of(Boolean.class, false);
|
||||
@HeaderComments({
|
||||
"聊天的格式,注意 “%1$s” 和 “%2$s” 不可缺少。",
|
||||
"- %1$s -> 玩家名", "- %2$s -> 聊天内容"
|
||||
})
|
||||
public static final ConfigValue<String> FORMAT = ConfiguredValue.of(String.class, "<%1$s> %2$s");
|
||||
public static final ConfiguredValue<String> FORMAT = ConfiguredValue.of(String.class, "<%1$s> %2$s");
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@HeaderComment({"前缀GUI界面设定"})
|
||||
public static class GUI extends ConfigurationRoot {
|
||||
@HeaderComments({"前缀GUI界面设定"})
|
||||
public static class GUI implements Configuration {
|
||||
|
||||
@HeaderComment("GUI的标题")
|
||||
public static final ConfigValue<String> TITLE = ConfiguredValue.of(String.class, "&f&l我的前缀 &8| 列表");
|
||||
@HeaderComments("GUI的标题")
|
||||
public static final ConfiguredValue<String> TITLE = ConfiguredValue.of(String.class, "&f&l我的前缀 &8| 列表");
|
||||
|
||||
@HeaderComment("GUI中的基本按钮物品")
|
||||
public static final class BOTTOMS extends ConfigurationRoot {
|
||||
@HeaderComments("GUI中的基本按钮物品")
|
||||
public static final class BOTTOMS implements Configuration {
|
||||
|
||||
@HeaderComment("前往下一页的物品 (只有存在下一页时才会显示)")
|
||||
@HeaderComments("前往下一页的物品 (只有存在下一页时才会显示)")
|
||||
public static final ConfiguredItem NEXT_PAGE = ConfiguredItem.create()
|
||||
.defaultType(Material.ARROW)
|
||||
.defaultName("下一页")
|
||||
@@ -105,7 +104,7 @@ public class PluginConfig extends ConfigurationRoot {
|
||||
.build();
|
||||
|
||||
@ConfigPath("previous-page")
|
||||
@HeaderComment({"前往上一页时的物品 (只有当前页不是第一页时才会显示)"})
|
||||
@HeaderComments({"前往上一页时的物品 (只有当前页不是第一页时才会显示)"})
|
||||
public static final ConfiguredItem PREV_PAGE = ConfiguredItem.create()
|
||||
.defaultType(Material.ARROW)
|
||||
.defaultName("上一页")
|
||||
@@ -114,18 +113,18 @@ public class PluginConfig extends ConfigurationRoot {
|
||||
|
||||
}
|
||||
|
||||
@HeaderComment("GUI中的其他按钮物品 (若与现有物品位置冲突,将被覆盖)")
|
||||
public static final ConfigValue<GUIItems> ITEMS = ConfiguredValue
|
||||
@HeaderComments("GUI中的其他按钮物品 (若与现有物品位置冲突,将被覆盖)")
|
||||
public static final ConfiguredValue<GUIItems> ITEMS = ConfiguredValue
|
||||
.builderOf(GUIItems.class).fromSection()
|
||||
.defaults(GUIItems::defaults)
|
||||
.serializeValue(GUIItems::serialize)
|
||||
.parseValue((v, d) -> GUIItems.parse(v))
|
||||
.serialize(GUIItems::serialize)
|
||||
.parse(GUIItems::parse)
|
||||
.build();
|
||||
|
||||
}
|
||||
|
||||
@HeaderComment({"相关的声音,留空则不播放声音", "格式为 【声音名:音量:音调】 或 【声音名:音量】 或 【声音名】"})
|
||||
public static final class SOUNDS extends ConfigurationRoot {
|
||||
@HeaderComments({"相关的声音,留空则不播放声音", "格式为 【声音名:音量:音调】 或 【声音名:音量】 或 【声音名】"})
|
||||
public static final class SOUNDS implements Configuration {
|
||||
|
||||
public static final ConfiguredSound GUI_OPEN = ConfiguredSound.of("BLOCK_NOTE_BLOCK_PLING", 0.5F, 0.8F);
|
||||
public static final ConfiguredSound GUI_CLICK = ConfiguredSound.of("UI_BUTTON_CLICK");
|
||||
@@ -134,40 +133,45 @@ public class PluginConfig extends ConfigurationRoot {
|
||||
|
||||
}
|
||||
|
||||
@HeaderComment({"默认前缀配置"})
|
||||
public static final class DEFAULT_PREFIX extends ConfigurationRoot {
|
||||
@HeaderComments({"默认前缀配置"})
|
||||
public static final class DEFAULT_PREFIX implements Configuration {
|
||||
|
||||
@HeaderComment("默认前缀的显示名称,用于在消息提示中显示。")
|
||||
public static final ConfigValue<String> NAME = ConfiguredValue.of(String.class, "默认前缀");
|
||||
@HeaderComments("默认前缀的显示名称,用于在消息提示中显示。")
|
||||
public static final ConfiguredValue<String> NAME = ConfiguredValue.of(String.class, "默认前缀");
|
||||
|
||||
@HeaderComment({"默认前缀的权重,默认为0。"})
|
||||
public static final ConfigValue<Integer> WEIGHT = ConfiguredValue.of(Integer.class, 0);
|
||||
@HeaderComments({"默认前缀的描述信息。"})
|
||||
public static final ConfiguredList<String> DESCRIPTION = ConfiguredList.builderOf(String.class).fromString()
|
||||
.defaults("&7这是一个默认前缀", "&7您可以在前缀列表中选择其他前缀")
|
||||
.build();
|
||||
|
||||
@HeaderComment({"默认前缀的内容,即用于显示的实际前缀"})
|
||||
public static final ConfigValue<String> CONTENT = ConfiguredValue.of(String.class, "&r");
|
||||
@HeaderComments({"默认前缀的权重,默认为0。"})
|
||||
public static final ConfiguredValue<Integer> WEIGHT = ConfiguredValue.of(Integer.class, 0);
|
||||
|
||||
@HeaderComment({"选择默认前缀时执行的操作"})
|
||||
@HeaderComments({"默认前缀的内容,即用于显示的实际前缀"})
|
||||
public static final ConfiguredValue<String> CONTENT = ConfiguredValue.of(String.class, "&r");
|
||||
|
||||
@HeaderComments({"选择默认前缀时执行的操作"})
|
||||
public static final ConfiguredList<String> ACTIONS = ConfiguredList.builderOf(String.class).fromString()
|
||||
.defaults("[CONSOLE] " + "say %player_name% 选择了默认前缀")
|
||||
.build();
|
||||
|
||||
@HeaderComment({"默认前缀的显示物品"})
|
||||
public static final class ITEM extends ConfigurationRoot {
|
||||
@HeaderComments({"默认前缀的显示物品"})
|
||||
public static final class ITEM implements Configuration {
|
||||
|
||||
@HeaderComment({"当未选择默认前缀时显示的物品"})
|
||||
@HeaderComments({"当未选择默认前缀时显示的物品"})
|
||||
public static final ConfiguredItem NOT_USING = ConfiguredItem.create()
|
||||
.defaultType(Material.NAME_TAG)
|
||||
.defaultName("&f默认玩家前缀 &f(点击切换)")
|
||||
.defaultLore("", "&a➥ 点击切换到该前缀")
|
||||
.defaultLore("","{&f&o }#description#{1,1}", "&a➥ 点击切换到该前缀")
|
||||
.build();
|
||||
|
||||
@HeaderComment({"当选择了默认前缀时显示的物品"})
|
||||
@HeaderComments({"当选择了默认前缀时显示的物品"})
|
||||
public static final ConfiguredItem USING = ConfiguredItem.create()
|
||||
.defaultType(Material.NAME_TAG)
|
||||
.defaultEnchant(Enchantment.PROTECTION_ENVIRONMENTAL, 1)
|
||||
.defaultEnchant(MajorUtil.getEnchantProtection(), 1) // 附魔改过名
|
||||
.defaultFlags(ItemFlag.HIDE_ENCHANTS)
|
||||
.defaultName("&f默认玩家前缀")
|
||||
.defaultLore("", "&a✔ 您正在使用该前缀")
|
||||
.defaultLore("","{&f&o }#description#{1,1}", "&a✔ 您正在使用该前缀")
|
||||
.build();
|
||||
|
||||
}
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
package cc.carm.plugin.userprefix.conf;
|
||||
|
||||
import cc.carm.lib.configuration.core.ConfigurationRoot;
|
||||
import cc.carm.lib.configuration.core.annotation.HeaderComment;
|
||||
import cc.carm.lib.mineconfiguration.bukkit.value.ConfiguredMessageList;
|
||||
import cc.carm.lib.configuration.Configuration;
|
||||
import cc.carm.lib.configuration.annotation.HeaderComments;
|
||||
import cc.carm.lib.mineconfiguration.bukkit.value.ConfiguredMessage;
|
||||
|
||||
public class PluginMessages extends ConfigurationRoot {
|
||||
public class PluginMessages implements Configuration {
|
||||
|
||||
public static final class COMMAND_USAGE extends ConfigurationRoot {
|
||||
public static final class COMMAND_USAGE implements Configuration {
|
||||
|
||||
public static final ConfiguredMessageList<String> CONSOLE = ConfiguredMessageList.asStrings().defaults(
|
||||
public static final ConfiguredMessage<String> CONSOLE = ConfiguredMessage.asString().defaults(
|
||||
"&f请输入 &b/prefix <玩家ID> &f为指定玩家打开前缀GUI。"
|
||||
).build();
|
||||
|
||||
public static final ConfiguredMessageList<String> ADMIN = ConfiguredMessageList.asStrings().defaults(
|
||||
public static final ConfiguredMessage<String> ADMIN = ConfiguredMessage.asString().defaults(
|
||||
"&3&l用户前缀系统 &f帮助",
|
||||
"&8# &f/upa list",
|
||||
"&8- &7查看当前前缀列表。",
|
||||
@@ -23,52 +23,52 @@ public class PluginMessages extends ConfigurationRoot {
|
||||
"&8- &7重载前缀配置。"
|
||||
).build();
|
||||
|
||||
public static final ConfiguredMessageList<String> NO_PERM = ConfiguredMessageList.asStrings()
|
||||
public static final ConfiguredMessage<String> NO_PERM = ConfiguredMessage.asString()
|
||||
.defaults("&c&l抱歉!&f但您没有权限使用该指令。")
|
||||
.build();
|
||||
|
||||
}
|
||||
|
||||
public static final ConfiguredMessageList<String> NOT_ONLINE = ConfiguredMessageList.asStrings()
|
||||
public static final ConfiguredMessage<String> NOT_ONLINE = ConfiguredMessage.asString()
|
||||
.defaults("&7玩家 &b%(player) &7并不在线。")
|
||||
.params("player").build();
|
||||
|
||||
public static final ConfiguredMessageList<String> SELECTED = ConfiguredMessageList.asStrings()
|
||||
public static final ConfiguredMessage<String> SELECTED = ConfiguredMessage.asString()
|
||||
.defaults("&7您选择了 &f%(name) &7作为当前显示的前缀。")
|
||||
.params("name").build();
|
||||
|
||||
public static final ConfiguredMessageList<String> EXPIRED = ConfiguredMessageList.asStrings()
|
||||
public static final ConfiguredMessage<String> EXPIRED = ConfiguredMessage.asString()
|
||||
.defaults(
|
||||
"&7您先前使用的前缀 &f%(oldName) &7已到期。",
|
||||
"&7现在已为您重新调整为 &f%(newName) &7。"
|
||||
).params("oldName", "newName").build();
|
||||
|
||||
public static final ConfiguredMessageList<String> REMOVED = ConfiguredMessageList.asStrings()
|
||||
public static final ConfiguredMessage<String> REMOVED = ConfiguredMessage.asString()
|
||||
.defaults("&7您先前使用的前缀已被移除,现在已为您重新调整为 &f%(newName) &7。")
|
||||
.params("newName").build();
|
||||
|
||||
public static final class RELOAD extends ConfigurationRoot {
|
||||
public static final class RELOAD implements Configuration {
|
||||
|
||||
public static final ConfiguredMessageList<String> SUCCESS = ConfiguredMessageList.asStrings()
|
||||
public static final ConfiguredMessage<String> SUCCESS = ConfiguredMessage.asString()
|
||||
.defaults("&a&l重载完成!&7耗时 &f%(time)ms&7,共加载了 &b%(count) &7个前缀。")
|
||||
.params("time", "count").build();
|
||||
|
||||
public static final ConfiguredMessageList<String> FAILED = ConfiguredMessageList.asStrings()
|
||||
public static final ConfiguredMessage<String> FAILED = ConfiguredMessage.asString()
|
||||
.defaults("&c&l重载出错!&7错误提示为 &8“&r%(error)&8”。")
|
||||
.params("error").build();
|
||||
}
|
||||
|
||||
public static final class SET extends ConfigurationRoot {
|
||||
public static final class SET implements Configuration {
|
||||
|
||||
public static final ConfiguredMessageList<String> SUCCESS = ConfiguredMessageList.asStrings()
|
||||
public static final ConfiguredMessage<String> SUCCESS = ConfiguredMessage.asString()
|
||||
.defaults("&a&l设置成功!&7成功设定玩家 &b%(player) &f的前缀为 &r%(prefix) &f。")
|
||||
.params("player", "prefix").build();
|
||||
|
||||
public static final ConfiguredMessageList<String> PREFIX_NOT_FOUND = ConfiguredMessageList.asStrings()
|
||||
public static final ConfiguredMessage<String> PREFIX_NOT_FOUND = ConfiguredMessage.asString()
|
||||
.defaults("&c&l无法设置!&7不存在ID为 &b%(prefix) &7的前缀。")
|
||||
.params("prefix").build();
|
||||
|
||||
public static final ConfiguredMessageList<String> NO_PERM = ConfiguredMessageList.asStrings()
|
||||
public static final ConfiguredMessage<String> NO_PERM = ConfiguredMessage.asString()
|
||||
.defaults("&c&l无法设置!&7玩家 &b%(player) &7并没有前缀 &r%(prefix) &7的前缀。")
|
||||
.params("player", "prefix")
|
||||
.build();
|
||||
@@ -76,13 +76,13 @@ public class PluginMessages extends ConfigurationRoot {
|
||||
}
|
||||
|
||||
|
||||
@HeaderComment("管理员使用的 “/upa list” 指令的格式")
|
||||
public static final class LIST extends ConfigurationRoot {
|
||||
@HeaderComments("管理员使用的 “/upa list” 指令的格式")
|
||||
public static final class LIST implements Configuration {
|
||||
|
||||
public static final ConfiguredMessageList<String> HEADER = ConfiguredMessageList.asStrings()
|
||||
public static final ConfiguredMessage<String> HEADER = ConfiguredMessage.asString()
|
||||
.defaults("&3&l用户前缀系统 &f前缀列表").build();
|
||||
|
||||
public static final ConfiguredMessageList<String> VALUE = ConfiguredMessageList.asStrings().defaults(
|
||||
public static final ConfiguredMessage<String> VALUE = ConfiguredMessage.asString().defaults(
|
||||
"&8#%(weight) &f%(identifier)",
|
||||
"&8- &7显示名 &r%(name) &7权限 &r%(permission)",
|
||||
"&8- &7内容示例&r %(content) %(sender_name)"
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
package cc.carm.plugin.userprefix.conf.gui;
|
||||
|
||||
import cc.carm.lib.configuration.core.source.ConfigurationWrapper;
|
||||
import cc.carm.lib.configuration.source.section.ConfigureSection;
|
||||
import cc.carm.lib.easyplugin.gui.configuration.GUIActionConfiguration;
|
||||
import cc.carm.lib.easyplugin.gui.configuration.GUIActionType;
|
||||
import cc.carm.lib.easyplugin.gui.configuration.GUIConfiguration;
|
||||
import cc.carm.lib.easyplugin.gui.configuration.GUIItemConfiguration;
|
||||
import cc.carm.lib.mineconfiguration.bukkit.source.CraftSectionWrapper;
|
||||
import cc.carm.lib.mineconfiguration.bukkit.source.BukkitSection;
|
||||
import cc.carm.plugin.userprefix.Main;
|
||||
import org.bukkit.Material;
|
||||
|
||||
import java.util.Collections;
|
||||
@@ -33,10 +34,15 @@ public class GUIItems {
|
||||
));
|
||||
}
|
||||
|
||||
public static GUIItems parse(ConfigurationWrapper<?> section) {
|
||||
if (!(section instanceof CraftSectionWrapper)) return new GUIItems(new LinkedHashMap<>());
|
||||
CraftSectionWrapper craft = (CraftSectionWrapper) section;
|
||||
return new GUIItems(GUIConfiguration.readItems(craft.getSource()));
|
||||
public static GUIItems parse(ConfigureSection section) {
|
||||
if (!(section instanceof BukkitSection)) {
|
||||
Main.severe("Unknown configure source, it should never happened!");
|
||||
Main.severe("Required: " + BukkitSection.class.getSimpleName());
|
||||
Main.severe("Found: " + section.getClass().getSimpleName());
|
||||
return new GUIItems(new LinkedHashMap<>());
|
||||
}
|
||||
BukkitSection craft = (BukkitSection) section;
|
||||
return new GUIItems(GUIConfiguration.readItems(craft.data()));
|
||||
}
|
||||
|
||||
public static GUIItems defaults() {
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
package cc.carm.plugin.userprefix.conf.prefix;
|
||||
|
||||
import cc.carm.lib.easyplugin.gui.configuration.GUIActionConfiguration;
|
||||
import cc.carm.lib.easyplugin.gui.configuration.GUIActionType;
|
||||
import cc.carm.lib.easyplugin.utils.MessageUtils;
|
||||
import cc.carm.lib.mineconfiguration.bukkit.value.item.PreparedItem;
|
||||
import cc.carm.plugin.userprefix.Main;
|
||||
import cc.carm.plugin.userprefix.manager.ServiceManager;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
@@ -11,6 +13,7 @@ import org.jetbrains.annotations.Contract;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class PrefixConfig {
|
||||
@@ -19,6 +22,7 @@ public class PrefixConfig {
|
||||
|
||||
protected final @NotNull String name;
|
||||
protected final @NotNull String content;
|
||||
protected final @NotNull List<String> description;
|
||||
|
||||
protected final int weight;
|
||||
|
||||
@@ -36,8 +40,23 @@ public class PrefixConfig {
|
||||
@NotNull ItemStack itemHasPermission,
|
||||
@Nullable ItemStack itemWhenUsing,
|
||||
@Nullable ItemStack itemNoPermission) {
|
||||
this(
|
||||
identifier, name, new ArrayList<>(),
|
||||
content, weight, permission, actions,
|
||||
itemHasPermission, itemWhenUsing, itemNoPermission
|
||||
);
|
||||
}
|
||||
|
||||
public PrefixConfig(@NotNull String identifier,
|
||||
@NotNull String name, @NotNull List<String> description,
|
||||
@NotNull String content, int weight, @Nullable String permission,
|
||||
@NotNull List<GUIActionConfiguration> actions,
|
||||
@NotNull ItemStack itemHasPermission,
|
||||
@Nullable ItemStack itemWhenUsing,
|
||||
@Nullable ItemStack itemNoPermission) {
|
||||
this.identifier = identifier;
|
||||
this.name = name;
|
||||
this.description = description;
|
||||
this.content = content;
|
||||
this.weight = weight;
|
||||
this.permission = permission;
|
||||
@@ -57,6 +76,11 @@ public class PrefixConfig {
|
||||
return name;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public List<String> getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public String getContent(CommandSender viewer) {
|
||||
return MessageUtils.setPlaceholders(viewer, content);
|
||||
@@ -88,7 +112,23 @@ public class PrefixConfig {
|
||||
|
||||
@Contract("_,!null->!null")
|
||||
protected @Nullable ItemStack getItem(@Nullable Player player, @Nullable ItemStack item) {
|
||||
return PreparedItem.of(item).get(player);
|
||||
PreparedItem prepared = PreparedItem.of(item);
|
||||
|
||||
if (!getDescription().isEmpty()) {
|
||||
prepared.insert("description", getDescription());
|
||||
prepared.placeholder("description", String.join("\n", getDescription()));
|
||||
}
|
||||
|
||||
prepared.placeholder("name", getName());
|
||||
prepared.placeholder("identifier", getIdentifier());
|
||||
prepared.placeholder("content", getContent(player));
|
||||
prepared.placeholder("permission", getPermission());
|
||||
prepared.placeholder("weight", String.valueOf(getWeight()));
|
||||
prepared.placeholder("hasPermission", String.valueOf(checkPermission(player)));
|
||||
prepared.placeholder("public", String.valueOf(isPublic()));
|
||||
prepared.placeholder("visible", String.valueOf(isVisible(player)));
|
||||
|
||||
return prepared.get(player);
|
||||
}
|
||||
|
||||
|
||||
@@ -97,7 +137,13 @@ public class PrefixConfig {
|
||||
}
|
||||
|
||||
public void executeActions(@NotNull Player player) {
|
||||
this.actions.forEach(action -> action.executeAction(player));
|
||||
this.actions.forEach(action -> {
|
||||
if (action.getActionType() == GUIActionType.CONSOLE) { // 控制台执行命令必须在全局调度器中执行
|
||||
Main.getInstance().getFoliaScheduler().runGlobal(false, () -> action.executeAction(player));
|
||||
} else {
|
||||
action.executeAction(player);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public boolean isVisible(Player player) {
|
||||
|
||||
@@ -2,6 +2,7 @@ package cc.carm.plugin.userprefix.event;
|
||||
|
||||
import cc.carm.plugin.userprefix.Main;
|
||||
import cc.carm.plugin.userprefix.conf.prefix.PrefixConfig;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Cancellable;
|
||||
import org.bukkit.event.HandlerList;
|
||||
@@ -61,8 +62,11 @@ public class UserPrefixChangeEvent extends UserPrefixEvent implements Cancellabl
|
||||
@Nullable PrefixConfig before,
|
||||
@NotNull PrefixConfig after,
|
||||
@Nullable Consumer<@Nullable PrefixConfig> finish) {
|
||||
Main.getInstance().callSync(new UserPrefixChangeEvent(who, before, after))
|
||||
.thenAccept((e) -> Optional.ofNullable(finish).ifPresent(f -> f.accept(e.getAfter())));
|
||||
UserPrefixChangeEvent event = new UserPrefixChangeEvent(who, before, after);
|
||||
Main.getInstance().getFoliaScheduler().runGlobal(true, () -> {
|
||||
Bukkit.getPluginManager().callEvent(event);
|
||||
Optional.ofNullable(finish).ifPresent(f -> f.accept(event.getAfter()));
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package cc.carm.plugin.userprefix.event;
|
||||
|
||||
import cc.carm.plugin.userprefix.Main;
|
||||
import cc.carm.plugin.userprefix.conf.prefix.PrefixConfig;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -30,7 +31,7 @@ public class UserPrefixExpireEvent extends UserPrefixEvent {
|
||||
}
|
||||
|
||||
public static void call(@NotNull Player player, @NotNull PrefixConfig currentPrefix) {
|
||||
Main.getInstance().callSync(new UserPrefixExpireEvent(player, currentPrefix));
|
||||
Main.getInstance().getFoliaScheduler().runGlobal(true, () -> Bukkit.getPluginManager().callEvent(new UserPrefixExpireEvent(player, currentPrefix)));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
package cc.carm.plugin.userprefix.folia;
|
||||
|
||||
import cc.carm.plugin.userprefix.Main;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class FoliaScheduler {
|
||||
private final Main plugin;
|
||||
private final boolean folia;
|
||||
|
||||
public FoliaScheduler(Main plugin, boolean folia) {
|
||||
this.plugin = plugin;
|
||||
this.folia = folia;
|
||||
}
|
||||
|
||||
public void runAsync(Runnable task) {
|
||||
if (this.folia) {
|
||||
this.runAsyncFolia(task);
|
||||
} else {
|
||||
this.runAsyncBukkit(task);
|
||||
}
|
||||
}
|
||||
|
||||
private void runAsyncBukkit(Runnable task) {
|
||||
Bukkit.getScheduler().runTaskAsynchronously(this.plugin, task);
|
||||
}
|
||||
|
||||
private void runAsyncFolia(Runnable task) {
|
||||
// AsyncScheduler asyncScheduler = Bukkit.getAsyncScheduler();
|
||||
// asyncScheduler.runNow(this.plugin, t -> task.run());
|
||||
|
||||
try {
|
||||
Object asyncScheduler = Bukkit.class.getMethod("getAsyncScheduler")
|
||||
.invoke(null);
|
||||
asyncScheduler.getClass().getMethod("runNow", Plugin.class, Consumer.class)
|
||||
.invoke(asyncScheduler, this.plugin, (Consumer<?>) t -> task.run());
|
||||
} catch (IllegalAccessException | NoSuchMethodException e) {
|
||||
Main.severe("unexpected exception during reflection (#runAsyncFolia), it should never happen!");
|
||||
e.printStackTrace();
|
||||
} catch (InvocationTargetException e) {
|
||||
throw (RuntimeException) e.getTargetException();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Folia 上在实体所在的调度器上执行任务,或在 Bukkit 上同步执行任务
|
||||
*
|
||||
* @param entity 实体
|
||||
* @param forceSync 若为 true,Bukkit 下强制同步运行;若为 false,Bukkit 下直接执行
|
||||
* @param task 任务
|
||||
* @see FoliaScheduler#runBukkit(boolean, Runnable)
|
||||
* @see FoliaScheduler#runOnEntityFolia(Entity, Runnable)
|
||||
*/
|
||||
public void runOnEntity(Entity entity, boolean forceSync, Runnable task) {
|
||||
if (this.folia) {
|
||||
this.runOnEntityFolia(entity, task);
|
||||
} else {
|
||||
this.runBukkit(forceSync, task);
|
||||
}
|
||||
}
|
||||
|
||||
private void runOnEntityFolia(Entity entity, Runnable task) {
|
||||
// EntityScheduler entityScheduler = entity.getScheduler();
|
||||
// entityScheduler.run(this.plugin, t -> task.run(), null);
|
||||
try {
|
||||
Object entityScheduler = Entity.class.getMethod("getScheduler")
|
||||
.invoke(entity);
|
||||
entityScheduler.getClass().getMethod("run", Plugin.class, Consumer.class, Runnable.class)
|
||||
.invoke(entityScheduler, this.plugin, (Consumer<?>) t -> task.run(), null);
|
||||
} catch (IllegalAccessException | NoSuchMethodException e) {
|
||||
Main.severe("unexpected exception during reflection (#runOnEntityFolia), it should never happen!");
|
||||
e.printStackTrace();
|
||||
} catch (InvocationTargetException e) {
|
||||
throw (RuntimeException) e.getTargetException();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Folia 上在全局调度器上执行任务,或在 Bukkit 上同步执行任务
|
||||
*
|
||||
* @param forceSync 若为 true,Bukkit 下强制同步运行;若为 false,Bukkit 下直接执行
|
||||
* @param task 任务
|
||||
* @see FoliaScheduler#runBukkit(boolean, Runnable)
|
||||
* @see FoliaScheduler#runGlobalFolia(Runnable)
|
||||
*/
|
||||
public void runGlobal(boolean forceSync, Runnable task) {
|
||||
if (this.folia) {
|
||||
this.runGlobalFolia(task);
|
||||
} else {
|
||||
this.runBukkit(forceSync, task);
|
||||
}
|
||||
}
|
||||
|
||||
private void runGlobalFolia(Runnable task) {
|
||||
// GlobalRegionScheduler globalRegionScheduler = Bukkit.getGlobalRegionScheduler();
|
||||
// globalRegionScheduler.execute(this.plugin, task);
|
||||
try {
|
||||
Object globalRegionScheduler = Bukkit.class.getMethod("getGlobalRegionScheduler")
|
||||
.invoke(null);
|
||||
globalRegionScheduler.getClass().getMethod("execute", Plugin.class, Runnable.class)
|
||||
.invoke(globalRegionScheduler, this.plugin, task);
|
||||
} catch (IllegalAccessException | NoSuchMethodException e) {
|
||||
Main.severe("unexpected exception during reflection (#runGlobalFolia), it should never happen!");
|
||||
e.printStackTrace();
|
||||
} catch (InvocationTargetException e) {
|
||||
throw (RuntimeException) e.getTargetException();
|
||||
}
|
||||
}
|
||||
|
||||
private void runBukkit(boolean forceSync, Runnable task) {
|
||||
if (forceSync) {
|
||||
Bukkit.getScheduler().runTask(this.plugin, task);
|
||||
} else {
|
||||
task.run();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package cc.carm.plugin.userprefix.folia;
|
||||
|
||||
import cc.carm.plugin.userprefix.Main;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
|
||||
public interface MajorUtil {
|
||||
static Enchantment getEnchantProtection() {
|
||||
Class<Enchantment> enchantmentClass = Enchantment.class;
|
||||
try {
|
||||
return (Enchantment) enchantmentClass.getField("PROTECTION_ENVIRONMENTAL").get(null);
|
||||
} catch (NoSuchFieldException e1) {
|
||||
try {
|
||||
return (Enchantment) enchantmentClass.getField("PROTECTION").get(null);
|
||||
} catch (NoSuchFieldException | IllegalAccessException e2) {
|
||||
Main.severe("unexpected exception during reflection (#getEnchantProtection), it should never happen!");
|
||||
throw new RuntimeException(e2);
|
||||
}
|
||||
} catch (IllegalAccessException e) {
|
||||
Main.severe("unexpected exception during reflection (#getEnchantProtection), it should never happen!");
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -25,6 +25,7 @@ public class UserPrefixExpansion extends EasyPlaceholder {
|
||||
handle("identifier", handlePrefix(PrefixConfig::getIdentifier), "id");
|
||||
handle("prefix", handlePrefix(PrefixConfig::getContent));
|
||||
handle("name", handlePrefix(PrefixConfig::getName));
|
||||
handle("description", handlePrefix(p -> String.join("\n", p.getDescription())));
|
||||
handle("weight", handlePrefix(PrefixConfig::getWeight));
|
||||
handle("amount", handlePlayer(
|
||||
(player) -> UserPrefixAPI.getUserManager().getUsablePrefixes(player).size() + 1)
|
||||
|
||||
@@ -14,7 +14,7 @@ public class UserPermListener {
|
||||
if (player == null) return;
|
||||
UserPrefixAPI.getUserManager().checkPrefix(player, true);
|
||||
if (PrefixSelectGUI.openingUsers.contains(player)) {
|
||||
Main.getInstance().getScheduler().run(() -> {
|
||||
Main.getInstance().getFoliaScheduler().runOnEntity(player, true, () -> {
|
||||
// 玩家权限更新,同步关闭其GUI,以令其重新打开刷新自己的前缀。
|
||||
player.closeInventory();
|
||||
PrefixSelectGUI.removeOpening(player);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package cc.carm.plugin.userprefix.manager;
|
||||
|
||||
import cc.carm.lib.configuration.core.source.ConfigurationProvider;
|
||||
import cc.carm.lib.configuration.source.ConfigurationHolder;
|
||||
import cc.carm.lib.easyplugin.utils.JarResourceUtils;
|
||||
import cc.carm.lib.mineconfiguration.bukkit.MineConfiguration;
|
||||
import cc.carm.plugin.userprefix.conf.PluginConfig;
|
||||
@@ -11,13 +11,13 @@ import java.io.IOException;
|
||||
|
||||
public class ConfigManager {
|
||||
|
||||
private final ConfigurationProvider<?> configProvider;
|
||||
private final ConfigurationProvider<?> messageProvider;
|
||||
private final ConfigurationHolder<?> configProvider;
|
||||
private final ConfigurationHolder<?> messageProvider;
|
||||
|
||||
public ConfigManager(File dataFolder) {
|
||||
firstInitialize(dataFolder);
|
||||
this.configProvider = MineConfiguration.from(new File(dataFolder, "config.yml"));
|
||||
this.messageProvider = MineConfiguration.from(new File(dataFolder, "messages.yml"));
|
||||
this.configProvider = MineConfiguration.from(new File(dataFolder, "config.yml"), null);
|
||||
this.messageProvider = MineConfiguration.from(new File(dataFolder, "messages.yml"), null);
|
||||
this.configProvider.initialize(PluginConfig.class);
|
||||
this.messageProvider.initialize(PluginMessages.class);
|
||||
}
|
||||
@@ -35,11 +35,11 @@ public class ConfigManager {
|
||||
|
||||
}
|
||||
|
||||
public ConfigurationProvider<?> getConfigProvider() {
|
||||
public ConfigurationHolder<?> getConfigProvider() {
|
||||
return configProvider;
|
||||
}
|
||||
|
||||
public ConfigurationProvider<?> getMessageProvider() {
|
||||
public ConfigurationHolder<?> getMessageProvider() {
|
||||
return messageProvider;
|
||||
}
|
||||
|
||||
|
||||
@@ -77,6 +77,7 @@ public class PrefixManager {
|
||||
this.defaultPrefix = new PrefixConfig(
|
||||
"default",
|
||||
PluginConfig.DEFAULT_PREFIX.NAME.getNotNull(),
|
||||
PluginConfig.DEFAULT_PREFIX.DESCRIPTION.getNotNull(),
|
||||
PluginConfig.DEFAULT_PREFIX.CONTENT.getNotNull(),
|
||||
PluginConfig.DEFAULT_PREFIX.WEIGHT.getNotNull(),
|
||||
null,
|
||||
@@ -135,6 +136,7 @@ public class PrefixManager {
|
||||
|
||||
return new PrefixConfig(
|
||||
identifier, name,
|
||||
conf.getStringList("description"),
|
||||
conf.getString("content", "&r"),
|
||||
conf.getInt("weight", 1),
|
||||
conf.getString("permission"),
|
||||
|
||||
@@ -32,7 +32,7 @@ public class UserManager {
|
||||
|
||||
@Nullable
|
||||
public UserNameTag getNameTag(Player player) {
|
||||
if (PluginConfig.FUNCTIONS.NAME_PREFIX.ENABLE.getNotNull()) {
|
||||
if (this.isNamePrefixEnabled()) {
|
||||
if (nameTags.containsKey(player.getUniqueId())) {
|
||||
return nameTags.get(player.getUniqueId());
|
||||
} else {
|
||||
@@ -53,7 +53,7 @@ public class UserManager {
|
||||
|
||||
public void initPlayer(Player player) {
|
||||
checkPrefix(player, false);
|
||||
if (PluginConfig.FUNCTIONS.NAME_PREFIX.ENABLE.getNotNull()) {
|
||||
if (this.isNamePrefixEnabled()) {
|
||||
createNameTag(player);
|
||||
updatePrefixView(player, true);
|
||||
}
|
||||
@@ -73,7 +73,7 @@ public class UserManager {
|
||||
* @param loadOthers 是否为玩家更新其他人的前缀(一般用于加入游戏)
|
||||
*/
|
||||
public void updatePrefixView(Player player, boolean loadOthers) {
|
||||
if (!PluginConfig.FUNCTIONS.NAME_PREFIX.ENABLE.getNotNull()) return; //未启用的情况下,不需要进行任何操作。
|
||||
if (!this.isNamePrefixEnabled()) return; //未启用的情况下,不需要进行任何操作。
|
||||
UserNameTag tag = getNameTag(player);
|
||||
if (tag == null) return; //未启用的情况下,不需要进行任何操作。
|
||||
|
||||
@@ -131,13 +131,13 @@ public class UserManager {
|
||||
UserPrefixExpireEvent.call(player, currentPrefix);
|
||||
|
||||
// 发送消息
|
||||
PluginMessages.EXPIRED.send(player, currentPrefix.getName(), newPrefix.getName());
|
||||
PluginMessages.EXPIRED.sendTo(player, currentPrefix.getName(), newPrefix.getName());
|
||||
|
||||
// 播放声音
|
||||
PluginConfig.SOUNDS.PREFIX_EXPIRED.playTo(player);
|
||||
} else {
|
||||
// 当前前缀为空,则代表是旧的前缀不存在了,
|
||||
PluginMessages.REMOVED.send(player, newPrefix.getName());
|
||||
PluginMessages.REMOVED.sendTo(player, newPrefix.getName());
|
||||
}
|
||||
|
||||
UserPrefixChangeEvent.call(player, currentPrefix, newPrefix, (after) -> {
|
||||
@@ -273,4 +273,7 @@ public class UserManager {
|
||||
user.data().clear(NodeType.META.predicate(mn -> mn.getMetaKey().equals(META_KEY)));
|
||||
}
|
||||
|
||||
private boolean isNamePrefixEnabled() {
|
||||
return PluginConfig.FUNCTIONS.NAME_PREFIX.ENABLE.getNotNull() && !Main.getInstance().isOnFolia();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ public class PrefixSelectGUI extends AutoPagedGUI {
|
||||
|
||||
public static HashSet<Player> openingUsers = new HashSet<>();
|
||||
|
||||
Player player;
|
||||
protected final Player player;
|
||||
|
||||
public PrefixSelectGUI(Player player) {
|
||||
super(GUIType.SIX_BY_NINE, PluginConfig.GUI.TITLE.get(), 10, 43);
|
||||
@@ -65,7 +65,7 @@ public class PrefixSelectGUI extends AutoPagedGUI {
|
||||
|
||||
// 发送消息与提示
|
||||
PluginConfig.SOUNDS.PREFIX_CHANGE.playTo(player);
|
||||
PluginMessages.SELECTED.send(player, prefix.getName());
|
||||
PluginMessages.SELECTED.sendTo(player, prefix.getName());
|
||||
|
||||
UserPrefixChangeEvent.call(player, usingPrefix, prefix, config -> {
|
||||
if (config == null) return;
|
||||
|
||||
@@ -8,6 +8,7 @@ authors:
|
||||
website: ${project.url}
|
||||
description: ${project.description}
|
||||
api-version: 1.13
|
||||
folia-supported: true
|
||||
|
||||
depend:
|
||||
- LuckPerms
|
||||
|
||||
@@ -5,7 +5,7 @@ identifier: "pro"
|
||||
|
||||
# 名字 [必须]
|
||||
# 切换的时候左下角会弹提示 用的就是这个名字
|
||||
name: "&b&lPro&b"
|
||||
name: "&b&lPro &b会员"
|
||||
|
||||
# 内容 [必须]
|
||||
# 显示在名字前面的内容
|
||||
@@ -29,6 +29,11 @@ permission: "yc.pro"
|
||||
actions:
|
||||
- "[CONSOLE] say %player_name% 选择了 Pro会员前缀 !"
|
||||
|
||||
description: # 描述 [非必须]
|
||||
- "&f尊贵的Pro会员专属称号。"
|
||||
- "&f您将获得多种特权与更好的游戏体验。"
|
||||
- "&f您可以输入 &b/vip &f指令查看详细特权!"
|
||||
|
||||
# 该前缀的GUI物品配置
|
||||
# 物品配置方式详见 https://github.com/CryptoMorin/XSeries/wiki/XItemStack
|
||||
item:
|
||||
@@ -37,30 +42,24 @@ item:
|
||||
# 当用户有权限且未选中时,会显示该物品
|
||||
has-perm:
|
||||
material: DIAMOND
|
||||
name: "&b&lPro &b会员前缀"
|
||||
name: "%(name)"
|
||||
lore:
|
||||
- "&7Pro会员专属称号"
|
||||
- ""
|
||||
- "&f尊贵的Pro会员专属称号。"
|
||||
- "&f您将获得多种特权与更好的游戏体验。"
|
||||
- ""
|
||||
- "#desciption#{1,1}"
|
||||
- "&a➥ 点击切换到该前缀"
|
||||
|
||||
# 正在使用时显示的物品 [非必需]
|
||||
# 当用户正在使用时会显示这个物品,不配置即自动加载“itemHasPermission”
|
||||
using:
|
||||
material: DIAMOND
|
||||
name: "&b&lPro &b会员前缀"
|
||||
name: "%(name)"
|
||||
flags:
|
||||
- HIDE_ENCHANTS # 隐藏附魔显示
|
||||
enchants:
|
||||
PROTECTION_ENVIRONMENTAL: 1 #加一个附魔这样看上去就像是选中了的
|
||||
lore:
|
||||
- "&7Pro会员专属称号"
|
||||
- ""
|
||||
- "&f尊贵的Pro会员专属称号。"
|
||||
- "&f您将获得多种特权与更好的游戏体验。"
|
||||
- ""
|
||||
- "#desciption#{1,1}"
|
||||
- "&a✔ 您正在使用该前缀"
|
||||
|
||||
# 没有权限时显示的物品 [非必需]
|
||||
@@ -68,12 +67,8 @@ item:
|
||||
no-perm:
|
||||
material: INK_SACK
|
||||
data: 8
|
||||
name: "&b&lPro+ &b会员前缀 &c(未拥有)"
|
||||
name: "%(name) &c(未拥有)"
|
||||
lore:
|
||||
- "&7Pro+会员专属称号"
|
||||
- ""
|
||||
- "&f尊贵的Pro会员专属称号。"
|
||||
- "&f您将获得多种特权与更好的游戏体验。"
|
||||
- "&f您可以输入 &b/vip &f指令查看详细特权!"
|
||||
- ""
|
||||
- "&e✯ 加入Pro+会员以使用该前缀!"
|
||||
- "&7Pro 会员专属称号"
|
||||
- "#desciption#{1,1}"
|
||||
- "&e✯ 加入Pro会员以使用该前缀!"
|
||||
|
||||
Reference in New Issue
Block a user