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中,权重越高的会显示在越后面