1
mirror of https://github.com/CarmJos/UserPrefix.git synced 2026-07-16 08:51:09 +08:00
1. 修复低版本可能无法读取物品的bug。
2. 分离配置文件,消息配置文件改为`messages.yml`,前缀配置文件改为`prefixes/*.yml`,便于配置和管理。
3. 允许配置GUI中上一页和下一页的物品。
4. 补全帮助文档,在插件首次加载将提供一份英文版的配置,以便使用。
This commit is contained in:
carm
2021-09-18 13:19:06 +08:00
parent 3a457082b1
commit 9cff1c03dc
23 changed files with 875 additions and 431 deletions
@@ -42,8 +42,8 @@ public class UserPrefixAdminCommand implements CommandExecutor {
} else if (aim.equalsIgnoreCase("reload")) {
long s1 = System.currentTimeMillis();
PrefixSelectGUI.closeAll(); // 关掉所有正在显示的前缀列表
ConfigManager.reloadConfig(); // 重载配置文件
PrefixManager.loadConfiguredPrefixes(); //加载重载后了的配置文件
ConfigManager.reload(); // 重载配置文件
PrefixManager.loadPrefixes(); //加载重载后了的前缀配置
for (Player onlinePlayer : Bukkit.getOnlinePlayers()) {
UserManager.checkPrefix(onlinePlayer, false);
/*
@@ -1,8 +1,11 @@
package cc.carm.plugin.userprefix.configuration;
import cc.carm.plugin.userprefix.configuration.message.ConfigMessageList;
import cc.carm.plugin.userprefix.configuration.values.ConfigSound;
import cc.carm.plugin.userprefix.configuration.values.ConfigValue;
import cc.carm.plugin.userprefix.configuration.values.ConfigValueList;
import cc.carm.plugin.userprefix.util.ItemStackFactory;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
public class PrefixConfig {
@@ -19,18 +22,35 @@ public class PrefixConfig {
public static ConfigValue<String> TITLE = new ConfigValue<>("GUI.title", String.class, "&f&l我的前缀 &8| 列表");
public static class Items {
public static ConfigValue<ItemStack> NEXT_PAGE = new ConfigValue<>("GUI.items.next-page", ItemStack.class,
new ItemStackFactory(Material.ARROW)
.setDisplayName("下一页")
.addLore("&7&o右键可前往最后一页哦")
.toItemStack()
);
public static ConfigValue<ItemStack> PREVIOUS_PAGE = new ConfigValue<>("GUI.items.previous-page", ItemStack.class,
new ItemStackFactory(Material.ARROW)
.setDisplayName("上一页")
.addLore("&7&o右键可前往第一页哦")
.toItemStack()
);
}
}
public static class Messages {
public static ConfigValueList<String> SELECTED = new ConfigValueList<>("messages.selected", String.class);
public static ConfigValueList<String> EXPIRED = new ConfigValueList<>("messages.expired", String.class);
public static ConfigMessageList SELECTED = new ConfigMessageList("selected");
public static ConfigMessageList EXPIRED = new ConfigMessageList("expired");
public static ConfigValueList<String> RELOAD = new ConfigValueList<>("messages.reload", String.class);
public static ConfigValueList<String> HELP = new ConfigValueList<>("messages.help", String.class);
public static ConfigMessageList RELOAD = new ConfigMessageList("reload");
public static ConfigMessageList HELP = new ConfigMessageList("help");
public static ConfigValueList<String> LIST_TITLE = new ConfigValueList<>("messages.list-title", String.class);
public static ConfigValueList<String> LIST_VALUE = new ConfigValueList<>("messages.list-value", String.class);
public static ConfigMessageList LIST_TITLE = new ConfigMessageList("list-title");
public static ConfigMessageList LIST_VALUE = new ConfigMessageList("list-value");
}
public static class Sounds {
@@ -0,0 +1,64 @@
package cc.carm.plugin.userprefix.configuration.file;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
import java.io.IOException;
public class FileConfig {
private final JavaPlugin plugin;
private final String fileName;
private File file;
private FileConfiguration config;
public FileConfig(final JavaPlugin plugin) {
this(plugin, "config.yml");
}
public FileConfig(final JavaPlugin plugin, final String name) {
this.plugin = plugin;
this.fileName = name;
initFile();
}
private void initFile() {
this.file = new File(plugin.getDataFolder(), fileName);
if (!this.file.exists()) {
if (!this.file.getParentFile().exists()) {
this.file.getParentFile().mkdirs();
}
plugin.saveResource(fileName, true);
}
this.config = YamlConfiguration.loadConfiguration(this.file);
}
public File getFile() {
return file;
}
public FileConfiguration getConfig() {
return config;
}
public void save() {
try {
getConfig().save(getFile());
} catch (IOException e) {
e.printStackTrace();
}
}
public void reload() {
if (getFile().exists()) {
this.config = YamlConfiguration.loadConfiguration(getFile());
} else {
initFile();
}
}
}
@@ -0,0 +1,32 @@
package cc.carm.plugin.userprefix.configuration.message;
import cc.carm.plugin.userprefix.configuration.values.ConfigValue;
import cc.carm.plugin.userprefix.manager.ConfigManager;
import cc.carm.plugin.userprefix.util.MessageUtil;
import org.bukkit.command.CommandSender;
import java.util.Arrays;
public class ConfigMessage extends ConfigValue<String> {
public ConfigMessage(String configSection) {
this(configSection, null);
}
public ConfigMessage(String configSection, String defaultValue) {
super(ConfigManager.getMessageConfig(), configSection, String.class, defaultValue);
}
public void send(CommandSender sender) {
MessageUtil.send(sender, get());
}
public void sendWithPlaceholders(CommandSender sender) {
MessageUtil.sendWithPlaceholders(sender, get());
}
public void sendWithPlaceholders(CommandSender sender, String[] params, Object[] values) {
MessageUtil.sendWithPlaceholders(sender, Arrays.asList(get()), params, values);
}
}
@@ -0,0 +1,29 @@
package cc.carm.plugin.userprefix.configuration.message;
import cc.carm.plugin.userprefix.configuration.values.ConfigValueList;
import cc.carm.plugin.userprefix.manager.ConfigManager;
import cc.carm.plugin.userprefix.util.MessageUtil;
import org.bukkit.command.CommandSender;
public class ConfigMessageList extends ConfigValueList<String> {
public ConfigMessageList(String configSection) {
super(ConfigManager.getMessageConfig(), configSection, String.class);
}
public ConfigMessageList(String configSection, String[] defaultValue) {
super(ConfigManager.getMessageConfig(), configSection, String.class, defaultValue);
}
public void send(CommandSender sender) {
MessageUtil.send(sender, get());
}
public void sendWithPlaceholders(CommandSender sender) {
MessageUtil.sendWithPlaceholders(sender, get());
}
public void sendWithPlaceholders(CommandSender sender, String[] params, Object[] values) {
MessageUtil.sendWithPlaceholders(sender, get(), params, values);
}
}
@@ -1,13 +1,16 @@
package cc.carm.plugin.userprefix.configuration.values;
import cc.carm.plugin.userprefix.Main;
import cc.carm.plugin.userprefix.configuration.file.FileConfig;
import cc.carm.plugin.userprefix.manager.ConfigManager;
import org.bukkit.Sound;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
public class ConfigSound {
FileConfiguration source;
FileConfig source;
String configSection;
Sound defaultValue;
@@ -17,18 +20,26 @@ public class ConfigSound {
}
public ConfigSound(String configSection, Sound defaultValue) {
this.source = ConfigManager.getConfig();
this(ConfigManager.getPluginConfig(), configSection, defaultValue);
}
public ConfigSound(FileConfig source, String configSection, Sound defaultValue) {
this.source = source;
this.configSection = configSection;
this.defaultValue = defaultValue;
}
public FileConfiguration getConfiguration() {
return this.source.getConfig();
}
public void set(Sound value, float volume) {
this.source.set(this.configSection, value.name() + ":" + volume);
getConfiguration().set(this.configSection, value.name() + ":" + volume);
this.save();
}
public void set(Sound value, float volume, float pitch) {
this.source.set(this.configSection, value.name() + ":" + volume + ":" + pitch);
getConfiguration().set(this.configSection, value.name() + ":" + volume + ":" + pitch);
this.save();
}
@@ -36,7 +47,7 @@ public class ConfigSound {
Sound finalSound = defaultValue;
float pitch = 1;
float volume = 1;
String soundString = this.source.getString(this.configSection);
String soundString = getConfiguration().getString(this.configSection);
if (soundString != null) {
String[] args = soundString.contains(":") ? soundString.split(":") : new String[]{soundString};
try {
@@ -54,7 +65,7 @@ public class ConfigSound {
}
public void save() {
ConfigManager.saveConfig();
this.source.save();
}
}
@@ -1,10 +1,13 @@
package cc.carm.plugin.userprefix.configuration.values;
import cc.carm.plugin.userprefix.configuration.file.FileConfig;
import cc.carm.plugin.userprefix.manager.ConfigManager;
import org.bukkit.configuration.file.FileConfiguration;
public class ConfigValue<V> {
FileConfiguration source;
FileConfig source;
String configSection;
Class<V> clazz;
V defaultValue;
@@ -14,24 +17,32 @@ public class ConfigValue<V> {
}
public ConfigValue(String configSection, Class<V> clazz, V defaultValue) {
this.source = ConfigManager.getConfig();
this(ConfigManager.getPluginConfig(), configSection, clazz, defaultValue);
}
public ConfigValue(FileConfig source, String configSection, Class<V> clazz, V defaultValue) {
this.source = source;
this.configSection = configSection;
this.clazz = clazz;
this.defaultValue = defaultValue;
}
public FileConfiguration getConfiguration() {
return this.source.getConfig();
}
public V get() {
Object val = this.source.get(this.configSection, this.defaultValue);
Object val = getConfiguration().get(this.configSection, this.defaultValue);
return this.clazz.isInstance(val) ? this.clazz.cast(val) : this.defaultValue;
}
public void set(V value) {
this.source.set(this.configSection, value);
getConfiguration().set(this.configSection, value);
this.save();
}
public void save() {
ConfigManager.saveConfig();
this.source.save();
}
}
@@ -1,26 +1,52 @@
package cc.carm.plugin.userprefix.configuration.values;
import cc.carm.plugin.userprefix.configuration.file.FileConfig;
import cc.carm.plugin.userprefix.manager.ConfigManager;
import org.bukkit.configuration.file.FileConfiguration;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ConfigValueList<V> {
FileConfiguration source;
FileConfig source;
String configSection;
Class<V> clazz;
V[] defaultValue;
public ConfigValueList(String configSection, Class<V> clazz) {
this.source = ConfigManager.getConfig();
this.configSection = configSection;
this.clazz = clazz;
this(ConfigManager.getPluginConfig(), configSection, clazz);
}
public ConfigValueList(String configSection, Class<V> clazz, V[] defaultValue) {
this(ConfigManager.getPluginConfig(), configSection, clazz, defaultValue);
}
public ConfigValueList(FileConfig configuration, String configSection, Class<V> clazz) {
this(configuration, configSection, clazz, null);
}
public ConfigValueList(FileConfig configuration, String configSection, Class<V> clazz, V[] defaultValue) {
this.source = configuration;
this.configSection = configSection;
this.clazz = clazz;
this.defaultValue = defaultValue;
}
public FileConfiguration getConfiguration() {
return this.source.getConfig();
}
public ArrayList<V> get() {
List<?> list = this.source.getList(this.configSection);
List<?> list = getConfiguration().getList(this.configSection);
if (list == null) {
return new ArrayList(0);
if (defaultValue != null) {
return new ArrayList<>(Arrays.asList(defaultValue));
} else {
return new ArrayList(0);
}
} else {
ArrayList<V> result = new ArrayList();
@@ -29,17 +55,17 @@ public class ConfigValueList<V> {
result.add(this.clazz.cast(object));
}
}
return result;
}
}
public void set(ArrayList<V> value) {
this.source.set(this.configSection, value);
getConfiguration().set(this.configSection, value);
this.save();
}
public void save() {
ConfigManager.saveConfig();
this.source.save();
}
}
@@ -1,30 +1,47 @@
package cc.carm.plugin.userprefix.manager;
import cc.carm.plugin.userprefix.Main;
import org.bukkit.configuration.file.FileConfiguration;
import cc.carm.plugin.userprefix.configuration.file.FileConfig;
import java.io.File;
public class ConfigManager {
private static FileConfiguration config;
private static FileConfig config;
private static FileConfig messageConfig;
public static void initConfig() {
Main.getInstance().saveDefaultConfig();
Main.getInstance().reloadConfig();
File configFile = new File(Main.getInstance().getDataFolder(), "config.yml");
if (!configFile.exists()) {
//没找到配置文件,可能是第一次加载此插件
//把一些英文版的东西复制出来,方便英文用户使用。
Main.getInstance().saveResource("prefixes/example-prefix.yml", false);
Main.getInstance().saveResource("en_US/config.yml", false);
Main.getInstance().saveResource("en_US/messages.yml", false);
Main.getInstance().saveResource("en_US/example-prefix.yml", false);
}
config = Main.getInstance().getConfig();
ConfigManager.config = new FileConfig(Main.getInstance(), "config.yml");
ConfigManager.messageConfig = new FileConfig(Main.getInstance(), "messages.yml");
}
public static FileConfiguration getConfig() {
public static FileConfig getPluginConfig() {
return config;
}
public static void reloadConfig() {
Main.getInstance().reloadConfig();
config = Main.getInstance().getConfig();
public static FileConfig getMessageConfig() {
return messageConfig;
}
public static void reload() {
getPluginConfig().reload();
getMessageConfig().reload();
}
public static void saveConfig() {
Main.getInstance().saveConfig();
getPluginConfig().save();
getMessageConfig().save();
}
@@ -11,6 +11,8 @@ import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
@@ -21,45 +23,48 @@ public class PrefixManager {
public static ConfiguredPrefix defaultPrefix;
public static HashMap<String, ConfiguredPrefix> prefixes = new HashMap<>();
private static final String FOLDER_NAME = "prefixes";
public static void init() {
loadConfiguredPrefixes();
loadPrefixes();
Main.log("共加载了 " + prefixes.size() + " 个前缀。");
}
public static void loadConfiguredPrefixes() {
public static void loadPrefixes() {
loadDefaultPrefix();
loadConfiguredPrefixes();
}
ConfigurationSection prefixesSection = ConfigManager.getConfig().getConfigurationSection("prefixes");
if (prefixesSection == null || prefixesSection.getKeys(false).isEmpty()) {
public static void loadConfiguredPrefixes() {
File prefixDataFolder = new File(Main.getInstance().getDataFolder() + File.separator + FOLDER_NAME);
if (!prefixDataFolder.isDirectory() || !prefixDataFolder.exists()) {
prefixDataFolder.mkdir();
}
String[] filesList = prefixDataFolder.list();
if (filesList == null || filesList.length < 1) {
Main.log("配置文件中暂无任何前缀配置,请检查。");
Main.log("There's no configured prefix.");
return;
}
List<File> files = Arrays.stream(filesList)
.map(s -> new File(prefixDataFolder, s))
.filter(File::isFile)
.collect(Collectors.toList());
HashMap<String, ConfiguredPrefix> dataPrefixes = new HashMap<>();
for (String prefixIdentifier : prefixesSection.getKeys(false)) {
ConfigurationSection configuredPrefixSection = prefixesSection.getConfigurationSection(prefixIdentifier);
if (configuredPrefixSection == null) continue;
try {
String name = configuredPrefixSection.getString("name", "ERROR");
String content = configuredPrefixSection.getString("content", "&r");
String permission = configuredPrefixSection.getString("permission");
int weight = configuredPrefixSection.getInt("weight", 1);
ItemStack itemHasPermission = configuredPrefixSection.getItemStack("itemHasPermission",
new ItemStackFactory(Material.STONE).setDisplayName(name).addLore(" ").addLore("§a➥ 点击切换到该前缀").toItemStack()
);
ItemStack itemNoPermission = configuredPrefixSection.getItemStack("itemNoPermission", itemHasPermission);
ItemStack itemUsing = configuredPrefixSection.getItemStack("itemUsing", itemHasPermission);
Main.log("完成前缀加载 " + prefixIdentifier + " : " + name);
dataPrefixes.put(prefixIdentifier, new ConfiguredPrefix(prefixIdentifier, name, content, weight, permission, itemHasPermission, itemNoPermission, itemUsing));
} catch (Exception exception) {
Main.log("Error occurred when loading prefix #" + prefixIdentifier + " !");
exception.printStackTrace();
if (files.size() > 0) {
for (File file : files) {
try {
ConfiguredPrefix prefix = new ConfiguredPrefix(file);
Main.log("完成前缀加载 " + prefix.getIdentifier() + " : " + prefix.getName());
dataPrefixes.put(prefix.getIdentifier(), prefix);
} catch (Exception ex) {
Main.log("Error occurred when loading prefix #" + file.getAbsolutePath() + " !");
ex.printStackTrace();
}
}
}
@@ -69,7 +74,7 @@ public class PrefixManager {
public static void loadDefaultPrefix() {
PrefixManager.defaultPrefix = null;
ConfigurationSection defaultPrefixSection = ConfigManager.getConfig().getConfigurationSection("defaultPrefix");
ConfigurationSection defaultPrefixSection = ConfigManager.getPluginConfig().getConfig().getConfigurationSection("defaultPrefix");
if (defaultPrefixSection != null) {
try {
String name = defaultPrefixSection.getString("name", "默认前缀");
@@ -1,12 +1,23 @@
package cc.carm.plugin.userprefix.model;
import cc.carm.plugin.userprefix.util.ColorParser;
import cc.carm.plugin.userprefix.util.ItemStackFactory;
import org.bukkit.Material;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
public class ConfiguredPrefix {
@Nullable
private File dataFile;
@Nullable
private FileConfiguration configuration;
String identifier;
String name;
@@ -20,6 +31,25 @@ public class ConfiguredPrefix {
ItemStack itemNoPermission;
ItemStack itemWhenUsing;
public ConfiguredPrefix(@NotNull File dataFile) {
this.dataFile = dataFile;
this.configuration = YamlConfiguration.loadConfiguration(dataFile);
if (getConfiguration() != null) {
this.identifier = getConfiguration().getString("identifier", "ERROR");
this.name = getConfiguration().getString("name", "ERROR");
this.content = getConfiguration().getString("content", "&r");
this.permission = getConfiguration().getString("permission");
this.weight = getConfiguration().getInt("weight", 1);
this.itemHasPermission = (ItemStack) getConfiguration().get("itemHasPermission",
new ItemStackFactory(Material.STONE).setDisplayName(name).addLore(" ").addLore("§a➥ 点击切换到该前缀").toItemStack()
);
this.itemNoPermission = (ItemStack) getConfiguration().get("itemNoPermission", itemHasPermission);
this.itemWhenUsing = (ItemStack) getConfiguration().get("itemUsing", itemHasPermission);
}
}
public ConfiguredPrefix(@NotNull String identifier,
@NotNull String name,
@NotNull String content,
@@ -37,6 +67,11 @@ public class ConfiguredPrefix {
this.itemWhenUsing = itemWhenUsing;
}
@Nullable
public FileConfiguration getConfiguration() {
return configuration;
}
@NotNull
public String getIdentifier() {
return identifier;
@@ -1,8 +1,6 @@
package cc.carm.plugin.userprefix.util.gui;
import cc.carm.plugin.userprefix.configuration.PrefixConfig;
import cc.carm.plugin.userprefix.util.ItemStackFactory;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
import org.bukkit.inventory.ItemStack;
@@ -53,10 +51,7 @@ public class AutoPagedGUI extends CommonPagedGUI {
public void openGUI(Player user) {
if (previousPageSlot >= 0)
if (hasPreviousPage()) {
setItem(previousPageSlot, new GUIItem(previousPageUI == null ? new ItemStackFactory(Material.ARROW)
.setDisplayName("&f上一页")
.addLore("&7&o右键可前往第一页哦")
.toItemStack() : previousPageUI) {
setItem(previousPageSlot, new GUIItem(previousPageUI == null ? PrefixConfig.GUI.Items.PREVIOUS_PAGE.get() : previousPageUI) {
@Override
public void onClick(ClickType type) {
if (type == ClickType.RIGHT) {
@@ -70,12 +65,9 @@ public class AutoPagedGUI extends CommonPagedGUI {
});
}
if (previousPageSlot >= 0)
if (nextPageSlot >= 0)
if (hasNextPage()) {
setItem(nextPageSlot, new GUIItem(nextPageUI == null ? new ItemStackFactory(Material.ARROW)
.setDisplayName("下一页")
.addLore("&7&o右键可前往最后一页哦")
.toItemStack() : nextPageUI) {
setItem(nextPageSlot, new GUIItem(nextPageUI == null ? PrefixConfig.GUI.Items.NEXT_PAGE.get() : nextPageUI) {
@Override
public void onClick(ClickType type) {
if (type == ClickType.RIGHT) {