我正在开发bukkit插件,正在尝试将整个广告资源保存在文件中。所以我使用以下命令将文件保存在字符串中:
InventoriesData.set(player.getName(),ItemStack +“”);
但是现在将其另存为字符串,我不知道如何将其转换回ItemStack。
我知道我也可以单独保存所有数据,但是我想保存所有信息,并认为应该可以转换回去。那么,有人知道如何做到这一点吗?
它将返回此顺便说一句:
ItemStack {BLAZE_ROD x 1,UNSPECIFIC_META:{meta-type = UNSPECIFIC,display-name = Inventory Selector,Current:2,enchants = {THORNS = 3}}}
最佳答案
要制作物品堆,您需要拥有物料和数量:
String s = /* your material string */;
Material m = Material.matchMaterial(s);
ItemStack stack = new ItemStack(m, 1);
但是,请注意
ItemStack
是ConfigurationSerializable
,这意味着您可以直接将其直接保存到配置中:ItemStack is = /*...*/;
getConfig().set("example", is);
is = (ItemStack) getConfig().get("example");
库存是上下文相关的,因此无法序列化。如果愿意,可以创建一个帮助程序类来跟踪装甲,并将非空中(
null
)堆栈作为一个类,然后将该类本身设置为ConfigurationSerializable
:@SerializableAs("Inventory")
public class SInventory implements ConfigurationSerializable {
private final List<ItemStack> items = new ArrayList<>();
private ItemStack head;
private ItemStack chest;
private ItemStack legs;
private ItemStack boots;
/* Other fields */
public SInventory(Map<String, Object> config) {
List<ItemStack> items = (List<ItemStack>) config.get("inventory");
for (ItemStack item : items) {
if (item != null) {
this.items.add(item);
}
}
this.head = (ItemStack) config.get("head");
this.chest = (ItemStack) config.get("chest");
this.legs = (ItemStack) config.get("legs");
this.boots = (ItemStack) config.get("boots");
}
public static SInventory valueOf(Map<String, Object> config) {
return new SInventory(config);
}
public static SInventory deserialize(Map<String, Object> config) {
return new SInventory(config);
}
@Override
public Map<String, Object> serialize() {
Map<String, Object> back = new HashMap<>();
back.put("inventory", this.items);
back.put("head", this.head);
back.put("chest", this.chest);
back.put("legs", this.legs);
back.put("boots", this.boots);
return back;
}
Map<String, Object>
是代表此清单的部分。因此,如果通过List<ItemStack>
传递serialize
并将其保存在字符串“ Inventory”下,则可以从地图中检索它,如下所示:List<ItemStack> inv = (List<ItemStack>) map.get("Inventory");
这通常会导致一个更简单,更易于管理的系统。