1
mirror of https://github.com/CarmJos/ScriptItems synced 2026-06-04 20:37:33 +08:00
Files
ScriptItems/src/main/java/cc/carm/plugin/scriptitems/manager/ItemsManager.java
T
2022-03-13 18:29:17 +08:00

129 lines
5.0 KiB
Java

package cc.carm.plugin.scriptitems.manager;
import cc.carm.plugin.scriptitems.Main;
import cc.carm.plugin.scriptitems.item.ScriptConfiguration;
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, ScriptConfiguration> 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, ScriptConfiguration> dataItems = new HashMap<>();
if (files.size() > 0) {
for (File file : files) {
String fileName = file.getName();
if (fileName.startsWith(".")) continue;
try {
ScriptConfiguration item = ScriptConfiguration.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, ScriptConfiguration> listItemSettings() {
return ImmutableMap.copyOf(items);
}
public @Nullable ScriptConfiguration 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;
ScriptConfiguration 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);
}
}