Преобразование строки в java bukkit ItemStack

Я работаю над плагином bukkit и пытаюсь сохранить весь инвентарь в файле. Поэтому я сохранил файл в строке, используя: InventoriesData.set(player.getName(), ItemStack + "");

но теперь он сохраняется как String, я не знаю, как преобразовать его обратно в ItemStack. Я знаю, что могу сохранить все данные отдельно, но я хочу сохранить всю информацию и думаю, что ее можно будет преобразовать обратно. Так кто-нибудь знает, как это сделать?

он вернет это кстати: ItemStack{BLAZE_ROD x 1, UNSPECIFIC_META:{meta-type=UNSPECIFIC, display-name=Inventory Selector, Current:2, enchants={THORNS=3}}}


person thegunmaster    schedule 03.06.2014    source источник


Ответы (1)


Чтобы сделать стопку предметов, вам нужно иметь материал и количество:

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> под строкой «Inventory» при передаче его через serialize, вы сможете получить его с карты следующим образом:

List<ItemStack> inv = (List<ItemStack>) map.get("Inventory");

Обычно это приводит к гораздо более простой и управляемой системе.

person Rogue    schedule 03.06.2014
comment
хорошо, эта информация помогает, но я до сих пор не знаю/понимаю, как я могу сериализовать ItemStack, не могли бы вы объяснить это подробнее? - person thegunmaster; 05.06.2014
comment
ItemStack уже сериализуем. Вы просто либо устанавливаете, либо извлекаете (через Configuration.get("key")) значение и приводите его. - person Rogue; 05.06.2014