簡単にインベントリをファイルに保存する方法です。
拡張インベントリを作るときに便利だと思います!
組み込み型なので自作プラグインに埋め込んでください!
※お借りしたコード
https://jyn.jp/ – CustomConfig
1.完成例
完成して実際に動かしたものの動画があります!
VIDEO
2.制作環境について
IDE Eclipse
Java java7
Spigot 1.14.4
3.保存形式
YAMLにて保存しました
4.コード
とってもシンプルです。
※プラグインの無効化時にクリーン処理を挟んでください。 InventorySQL.clean();
※プレイヤーが退出したときにクリーン処理を挟んでください。 InventorySQL.clean(Player#getUniqueId());
※インベントリをそのまま保存しておくとメモリリークが心配なので毎回作成していますが、必要に応じて変更してください。
※ファイル名、フォルダを追加する場合は必要に応じて引数を変更してください。
import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.UUID; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import CustomConfig; public class InventorySQL{ private static HashMap<UUID, InventorySQL> datas = new HashMap<>(); public static InventorySQL getData(UUID key) { if (!datas.containsKey(key)) { return new InventorySQL(key); } return datas.get(key); } public static void clean() { for (UUID key : datas.keySet()) { clean(key); } } public static void clean(UUID key) { if (datas.containsKey(key)) { datas.get(key).save(); datas.remove(key); } } private UUID key; private ItemStack[] contents; public InventorySQL(UUID key) { this.key = key; reload(); datas.put(key, this); } public void reload() { contents = new ItemStack[9 * 6]; try { CustomConfig CC = new CustomConfig(key.toString() + ".inv.yml"); FileConfiguration config = CC.getConfig(); if (config.contains("inventory")) { List<?> list = config.getList("inventory"); int max = list.size(); for (int cur = 0; cur < max; cur++) { Object obj = list.get(cur); if (obj instanceof ItemStack) { contents[cur] = (ItemStack) obj; } } } } catch (Exception e) { e.printStackTrace(); } } public void open(Player p) { Inventory inv = Bukkit.createInventory(null, 9 * 6, "§eBackPack"); inv.setContents(contents); p.openInventory(inv); } public void closeInventory(Player p, Inventory inv) { contents = inv.getContents(); } public void save() { CustomConfig CC = new CustomConfig(key.toString() + ".inv.yml"); FileConfiguration config = CC.getConfig(); /** * Save as list type */ List<ItemStack> list = new ArrayList<>(Arrays.asList(contents)); config.set("inventory", list); CC.saveConfig(); } }
今回はやりませんでしたが、Blob形式に変換できればSQLにも保存できると思います。