簡単にインベントリをファイルに保存する方法です。
拡張インベントリを作るときに便利だと思います!
組み込み型なので自作プラグインに埋め込んでください!
※お借りしたコード
https://jyn.jp/ – CustomConfig
1.完成例
完成して実際に動かしたものの動画があります!
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にも保存できると思います。