1
mirror of https://github.com/CarmJos/ScriptItems synced 2026-07-15 07:21:23 +08:00

完成指令部分

This commit is contained in:
2022-03-13 17:31:20 +08:00
parent 19330f1bb5
commit 1a6f2071df
31 changed files with 391 additions and 244 deletions
@@ -0,0 +1,100 @@
package cc.carm.plugin.scriptitems.manager;
import cc.carm.lib.easyplugin.configuration.file.FileConfig;
import cc.carm.lib.easyplugin.configuration.language.MessagesConfig;
import cc.carm.lib.easyplugin.configuration.language.MessagesInitializer;
import cc.carm.plugin.scriptitems.configuration.PluginMessages;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
public class ConfigManager {
private final JavaPlugin plugin;
private FileConfig config;
private MessagesConfig messageConfig;
public ConfigManager(JavaPlugin plugin) {
this.plugin = plugin;
}
public boolean initConfig() {
try {
this.config = new FileConfig(plugin);
this.messageConfig = new MessagesConfig(plugin);
FileConfig.pluginConfiguration = () -> config;
FileConfig.messageConfiguration = () -> messageConfig;
MessagesInitializer.initialize(messageConfig, PluginMessages.class);
return true;
} catch (IOException e) {
return false;
}
}
public FileConfig getPluginConfig() {
return config;
}
public FileConfig getMessageConfig() {
return messageConfig;
}
public void reload() throws Exception {
getPluginConfig().reload();
getMessageConfig().reload();
}
public void saveConfig() throws Exception {
getPluginConfig().save();
getMessageConfig().save();
}
public static <V> Map<String, V> readStringMap(@Nullable ConfigurationSection section,
@NotNull Function<String, V> valueCast) {
if (section == null) return new LinkedHashMap<>();
Map<String, V> result = new LinkedHashMap<>();
for (String key : section.getKeys(false)) {
V finalValue = valueCast.apply(section.getString(key));
if (finalValue != null) result.put(key, finalValue);
}
return result;
}
public static <V> Map<String, V> readSectionMap(@Nullable ConfigurationSection section,
@NotNull Function<ConfigurationSection, V> valueCast) {
if (section == null) return new LinkedHashMap<>();
Map<String, V> result = new LinkedHashMap<>();
for (String key : section.getKeys(false)) {
if (!section.isConfigurationSection(key)) continue;
V finalValue = valueCast.apply(section.getConfigurationSection(key));
if (finalValue != null) result.put(key, finalValue);
}
return result;
}
public static <V> Map<String, V> readListMap(@Nullable ConfigurationSection section,
@NotNull Function<@NotNull List<String>, V> valueCast) {
if (section == null) return new LinkedHashMap<>();
Map<String, V> result = new LinkedHashMap<>();
for (String key : section.getKeys(false)) {
if (!section.isList(key)) continue;
V finalValue = valueCast.apply(section.getStringList(key));
if (finalValue != null) result.put(key, finalValue);
}
return result;
}
}
@@ -0,0 +1,128 @@
package cc.carm.plugin.scriptitems.manager;
import cc.carm.plugin.scriptitems.Main;
import cc.carm.plugin.scriptitems.item.ItemSettings;
import cc.carm.plugin.scriptitems.item.ScriptItem;
import cc.carm.plugin.scriptitems.util.JarResourceUtils;
import com.google.common.collect.ImmutableMap;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.tags.CustomItemTagContainer;
import org.bukkit.inventory.meta.tags.ItemTagType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.Unmodifiable;
import java.io.File;
import java.util.*;
import java.util.stream.Collectors;
public class ItemsManager {
private static final String FOLDER_NAME = "items";
public HashMap<String, ItemSettings> items = new HashMap<>();
protected NamespacedKey idKey;
protected NamespacedKey uuidKey;
public void initialize() {
this.idKey = new NamespacedKey(Main.getInstance(), "id");
this.uuidKey = new NamespacedKey(Main.getInstance(), "uuid");
loadItems();
Main.info("成功加载了 " + items.size() + " 个脚本物品。");
}
public void loadItems() {
File prefixDataFolder = getStorageFolder();
if (!prefixDataFolder.isDirectory() || !prefixDataFolder.exists()) {
try {
JarResourceUtils.copyFolderFromJar(
FOLDER_NAME, Main.getInstance().getDataFolder(),
JarResourceUtils.CopyOption.COPY_IF_NOT_EXIST
);
} catch (Exception ex) {
boolean success = prefixDataFolder.mkdirs();
}
}
String[] filesList = prefixDataFolder.list();
if (filesList == null || filesList.length < 1) {
Main.severe(" 配置文件夹中暂无任何物品,请检查。");
Main.severe(" There's no configured items.");
return;
}
List<File> files = Arrays.stream(filesList)
.map(s -> new File(prefixDataFolder, s))
.filter(File::isFile)
.collect(Collectors.toList());
HashMap<String, ItemSettings> dataItems = new HashMap<>();
if (files.size() > 0) {
for (File file : files) {
String fileName = file.getName();
if (fileName.startsWith(".")) continue;
try {
ItemSettings item = ItemSettings.load(file);
Main.info(" 完成物品加载 [#" + item.getIdentifier() + "] " + item.getName() + " (" + fileName + ")");
dataItems.put(item.getIdentifier(), item);
} catch (Exception ex) {
Main.severe("在加载物品 " + file.getAbsolutePath() + " 时出错,请检查配置!");
Main.severe("Error occurred when loading item #" + file.getAbsolutePath() + " !");
ex.printStackTrace();
}
}
}
items = dataItems;
}
private static File getStorageFolder() {
return new File(Main.getInstance().getDataFolder(), FOLDER_NAME);
}
@Unmodifiable
public Map<String, ItemSettings> listItemSettings() {
return ImmutableMap.copyOf(items);
}
public @Nullable ItemSettings getItemSettings(@NotNull String identifier) {
return items.get(identifier);
}
public ItemStack applyTag(@NotNull ItemStack originalItem, String identifier, UUID uuid) {
if (!originalItem.hasItemMeta()) return originalItem;
ItemMeta meta = originalItem.getItemMeta();
if (meta == null) return originalItem;
CustomItemTagContainer container = meta.getCustomTagContainer();
container.setCustomTag(idKey, ItemTagType.STRING, identifier);
container.setCustomTag(uuidKey, ItemTagType.STRING, uuid.toString());
originalItem.setItemMeta(meta);
return originalItem;
}
public @Nullable ScriptItem parseItem(@Nullable ItemStack item) {
if (item == null || item.getType() == Material.AIR) return null;
if (!item.hasItemMeta()) return null;
ItemMeta meta = item.getItemMeta();
if (meta == null) return null;
CustomItemTagContainer container = meta.getCustomTagContainer();
String settingsID = container.getCustomTag(this.idKey, ItemTagType.STRING);
String itemUUID = container.getCustomTag(this.uuidKey, ItemTagType.STRING);
if (settingsID == null || itemUUID == null) return null;
ItemSettings settings = getItemSettings(settingsID);
if (settings == null) return null;
return new ScriptItem(UUID.fromString(itemUUID), settings, item);
}
public boolean isScriptItem(ItemStack item) {
return item.hasItemMeta() && item.getItemMeta() != null
&& item.getItemMeta().getCustomTagContainer().hasCustomTag(idKey, ItemTagType.STRING);
}
}