将String转换为ItemStack java bukkit

时间:2014-06-03 21:33:10

标签: java string casting bukkit

我正在研究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}}}

1 个答案:

答案 0 :(得分:4)

要制作商品货架,您需要有物料和金额:

String s = /* your material string */;
Material m = Material.matchMaterial(s);
ItemStack stack = new ItemStack(m, 1);

但请注意,ItemStackConfigurationSerializable,这意味着您只需将其直接保存到配置中即可:

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");

这通常会导致更简单,更易于管理的系统。