我正在研究bukkit插件,并尝试将整个广告资源保存在文件中。所以我使用以下命令将文件保存在String中: InventoriesData.set(player.getName(),ItemStack +"");
但现在它被保存为String,我不知道如何将其转换回ItemStack。 我知道我可以保存所有数据分开,但我想保存所有信息,并认为应该可以转换回来。那么有人知道如何做到这一点吗?
它会返回这个btw: ItemStack {BLAZE_ROD x 1,UNSPECIFIC_META:{meta-type = UNSPECIFIC,display-name =库存选择器,当前:2,附魔= {THORNS = 3}}}
答案 0 :(得分:4)
要制作商品货架,您需要有物料和金额:
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
,那么您可以从地图中检索它,如下所示:
List<ItemStack> inv = (List<ItemStack>) map.get("Inventory");
这通常会导致更简单,更易于管理的系统。