From 58096591552370fc9d104efdfbdaee8d5fcc2ce1 Mon Sep 17 00:00:00 2001 From: Carm Date: Sun, 3 Aug 2025 07:58:53 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9Eprefix=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E8=BD=AE=E6=8D=A2=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../plugin/userprefix/conf/PluginConfig.java | 36 +++++++++++++++-- .../userprefix/conf/prefix/PrefixConfig.java | 40 ++++++++++++++++++- .../userprefix/manager/PrefixManager.java | 6 ++- .../resources/prefixes/example-prefix.yml | 8 ++++ 5 files changed, 84 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 78065cd..b6f8f88 100644 --- a/pom.xml +++ b/pom.xml @@ -19,7 +19,7 @@ cc.carm.plugin userprefix - 3.2.7 + 3.3.0 UserPrefix 轻便、高效、实时的用户前缀系统。 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 c1355aa..0b750f7 100644 --- a/src/main/java/cc/carm/plugin/userprefix/conf/PluginConfig.java +++ b/src/main/java/cc/carm/plugin/userprefix/conf/PluginConfig.java @@ -1,6 +1,7 @@ package cc.carm.plugin.userprefix.conf; import cc.carm.lib.configuration.Configuration; +import cc.carm.lib.configuration.adapter.ValueType; import cc.carm.lib.configuration.annotation.ConfigPath; import cc.carm.lib.configuration.annotation.HeaderComments; import cc.carm.lib.configuration.value.standard.ConfiguredList; @@ -12,6 +13,10 @@ import cc.carm.plugin.userprefix.folia.MajorUtil; import org.bukkit.Material; import org.bukkit.inventory.ItemFlag; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + public class PluginConfig implements Configuration { @HeaderComments({"开发者查错模式"}) @@ -148,7 +153,32 @@ public class PluginConfig implements Configuration { public static final ConfiguredValue WEIGHT = ConfiguredValue.of(Integer.class, 0); @HeaderComments({"默认前缀的内容,即用于显示的实际前缀"}) - public static final ConfiguredValue CONTENT = ConfiguredValue.of(String.class, "&r"); + public static final ConfiguredValue> CONTENT = ConfiguredValue + .builderOf(ValueType.ofList(String.class)) + .from(Object.class) + .parse(obj -> { + if (obj instanceof List) { + List list = (List) obj; + return list.stream() + .map(Object::toString) + .collect(Collectors.toList()); + } else return Collections.singletonList(String.valueOf(obj)); + }) + .serialize(list -> { + if (list.isEmpty()) { + return ""; + } else if (list.size() == 1) { + return list.get(0); + } else { + return list; + } + }) + .defaults(Collections.singletonList("&r")) + .build(); + + + @HeaderComments({"默认前缀的切换周期,单位为毫秒。(小于0则表示不进行切换,等于0则代表所及选取)"}) + public static final ConfiguredValue PERIOD = ConfiguredValue.of(-1L); @HeaderComments({"选择默认前缀时执行的操作"}) public static final ConfiguredList ACTIONS = ConfiguredList.builderOf(String.class).fromString() @@ -162,7 +192,7 @@ public class PluginConfig implements Configuration { public static final ConfiguredItem NOT_USING = ConfiguredItem.create() .defaultType(Material.NAME_TAG) .defaultName("&f默认玩家前缀 &f(点击切换)") - .defaultLore("","{&f&o }#description#{1,1}", "&a➥ 点击切换到该前缀") + .defaultLore("", "{&f&o }#description#{1,1}", "&a➥ 点击切换到该前缀") .build(); @HeaderComments({"当选择了默认前缀时显示的物品"}) @@ -171,7 +201,7 @@ public class PluginConfig implements Configuration { .defaultEnchant(MajorUtil.getEnchantProtection(), 1) // 附魔改过名 .defaultFlags(ItemFlag.HIDE_ENCHANTS) .defaultName("&f默认玩家前缀") - .defaultLore("","{&f&o }#description#{1,1}", "&a✔ 您正在使用该前缀") + .defaultLore("", "{&f&o }#description#{1,1}", "&a✔ 您正在使用该前缀") .build(); } 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 f36a2c4..0af3d21 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 @@ -14,16 +14,22 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.Random; public class PrefixConfig { + static final Random RANDOM = new Random(); + protected final @NotNull String identifier; protected final @NotNull String name; - protected final @NotNull String content; + protected final @NotNull List content; protected final @NotNull List description; + protected final long period; // 内容变更周期,单位为毫秒 + protected final int weight; protected final @Nullable String permission; @@ -54,10 +60,26 @@ public class PrefixConfig { @NotNull ItemStack itemHasPermission, @Nullable ItemStack itemWhenUsing, @Nullable ItemStack itemNoPermission) { + this( + identifier, name, description, + Collections.singletonList(content), 0, weight, permission, actions, + itemHasPermission, itemWhenUsing, itemNoPermission + ); + } + + public PrefixConfig(@NotNull String identifier, + @NotNull String name, @NotNull List description, + @NotNull List content, long period, + int weight, @Nullable String permission, + @NotNull List actions, + @NotNull ItemStack itemHasPermission, + @Nullable ItemStack itemWhenUsing, + @Nullable ItemStack itemNoPermission) { this.identifier = identifier; this.name = name; this.description = description; this.content = content; + this.period = period; this.weight = weight; this.permission = permission; this.actions = actions; @@ -83,7 +105,21 @@ public class PrefixConfig { @NotNull public String getContent(CommandSender viewer) { - return MessageUtils.setPlaceholders(viewer, content); + if (content.isEmpty()) return "?"; + if (period < 0 || content.size() == 1) { + return MessageUtils.setPlaceholders(viewer, content.get(0)); + } + if (period == 0) { + // PERIOD 为0时,随机返回一个内容 + int index = RANDOM.nextInt(content.size()); + return MessageUtils.setPlaceholders(viewer, content.get(index)); + } else { + // 可变化的内容,则基于偏移量与时间戳计算目标index + long curr = System.currentTimeMillis(); + long offset = curr % period; // 计算偏移量 + int index = (int) (offset / (period / content.size())); // 计算索引 + return MessageUtils.setPlaceholders(viewer, content.get(index)); + } } public int getWeight() { 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 872d9ff..7eac62e 100644 --- a/src/main/java/cc/carm/plugin/userprefix/manager/PrefixManager.java +++ b/src/main/java/cc/carm/plugin/userprefix/manager/PrefixManager.java @@ -78,7 +78,8 @@ public class PrefixManager { "default", PluginConfig.DEFAULT_PREFIX.NAME.getNotNull(), PluginConfig.DEFAULT_PREFIX.DESCRIPTION.getNotNull(), - PluginConfig.DEFAULT_PREFIX.CONTENT.getNotNull(), + PluginConfig.DEFAULT_PREFIX.CONTENT.resolve(), + PluginConfig.DEFAULT_PREFIX.PERIOD.resolve(), PluginConfig.DEFAULT_PREFIX.WEIGHT.getNotNull(), null, readActions(PluginConfig.DEFAULT_PREFIX.ACTIONS.get()), @@ -137,7 +138,8 @@ public class PrefixManager { return new PrefixConfig( identifier, name, conf.getStringList("description"), - conf.getString("content", "&r"), + conf.getStringList("content"), + conf.getLong("period", -1L), conf.getInt("weight", 1), conf.getString("permission"), readActions(conf.getStringList("actions")), diff --git a/src/main/resources/prefixes/example-prefix.yml b/src/main/resources/prefixes/example-prefix.yml index 7940548..e479393 100644 --- a/src/main/resources/prefixes/example-prefix.yml +++ b/src/main/resources/prefixes/example-prefix.yml @@ -9,8 +9,16 @@ name: "&b&lPro &b会员" # 内容 [必须] # 显示在名字前面的内容 +# 支持多行内容以实现前缀内容的轮换 content: "&b&lPro &b" +# 轮换周期 [非必须] +# 设置前缀内容的轮换周期,单位为毫秒。 +# 若数值为-1,则表示不轮换。 +# 若数值为0,则每次获取前缀时都会随机选择一行内容。 +# 若数值大于0,则表示每隔指定毫秒数轮换一次内容 +period: -1 + # 权重 [必须] # 用于GUI、TabList的排序和自动前缀显示 # 在GUI中,权重越高的会显示在越后面