Парсинг NBT

Версия Minecraft
1.12.2

will0376

Токсичная личность
2,174
56
651
Появилась потребность парсить json(т.е. строка) в nbt. Для 1.7.10 способ я нашел, а вот 1.12 - нет =0
Подскажет кто что?
 
Так. nbt то я получил, а как itemstack создать с ним? пытаюсь на стороне сервера new ItemStack(item, Count, Meta, JsonToNBT.getTagFromJson(NBT)) (NBT - не нул)
но выдаётся предмет без nbt вообще(например зелье.)
Java:
System.out.println(JsonToNBT.getTagFromJson(NBT));

System.out.println(it.getTagCompound());

[21:56:10] [Netty Server IO #1/INFO] [STDOUT]: [ru.will0376.Server:<init>:51]: {Potion:"minecraft:long_fire_resistance"}
[21:56:10] [Netty Server IO #1/INFO] [STDOUT]: [ru.will0376.Server:<init>:52]: null
Что не так делаю? =P
 
new ItemStack(nbt)
 
Если ты однажды создал итемстак, записал его нбт, а нбт перевел в json, то при обратном процессе получится тот же стак
 
создал итемстак
Сложно сказать "создал", ибо получаю нбт через
Minecraft.getMinecraft().player.getHeldItem(EnumHand.MAIN_HAND).getTagCompound().toString()
а потом просто из лога достаю саму строку...
{Potion:"minecraft:long_fire_resistance"}
 
Гений просто.. Сначала поставить "лучший ответ", а потом задать еще кучу вопросов по этой же теме..

Вроде так? Не проверял..
Код:
ItemStack stack = ItemStack.EMPTY;
NBTTagCompound tag = new NBTTagCompound();
stack.writeToNBT(tag);
String json = tag.toString();


tag = JsonToNBT.getTagFromJson(json);
stack = new ItemStack(tag);

Если будешь юзать пакеты, то можно так:
Код:
ItemStack stack = ItemStack.EMPTY;
NBTTagCompound tag = new NBTTagCompound();
stack.writeToNBT(tag);
ByteBufUtils.writeTag(buf, tag);


tag = ByteBufUtils.readTag(buf);
stack = new ItemStack(tag);

Но, лучше там еще добавить компрессию.
 
Гений просто.. Сначала поставить "лучший ответ", а потом задать еще кучу вопросов по этой же теме..
Сначала думал, что сработает xD
Нифига не понял с кодом. Зачем создавать пустой предмет, когда я знаю, что мне надо создать, просто тупо закинуть в этот предмет НБТ?
Я через EntityPlayerMP выдаю игроку предмет addItemStackToInventory(new ItemStack(item, Count, Meta, JsonToNBT.getTagFromJson(NBT)))
Но NBT самому предмету не присваивается вообще. получается: пустое зелье; пустое яйцо призыва...
Апд.
Попробовал записывать нбт после создания itemstack - не работает =P
1557266796308.png(получил нбт, записал в свой json, обновил списки, попробовал получить зелье с нбт)
 
Последнее редактирование:
Зачем создавать пустой предмет
Окей, так будет лучше? ItemStack stack = ...; Переводя "на простой язык" - получаем как-либо свой стак, в моем примере это пустой стак, его нужно заменить на твой, который нужен тебе ДЛЯ сохранения.

Код:
ItemStack stack = ...; 
NBTTagCompound tag = new NBTTagCompound();
stack.writeToNBT(tag);

Тут мы берем стак.
Делаем новый НБТ Tag.
Записываем в tag стак.
После .toString() для перевода в строку.

Потом как-либо его сохраняем. Куда тебе нужно..

Дальше мы с сохранения получим строку.
Код:
String json = ...;
NBTTagCompound tag = JsonToNBT.getTagFromJson(json);
ItemStack stack = new ItemStack(tag);
В итоге мы должны получить тот самый стак, который был изначально и можем юзать...

И это будет в json строке тоже, значит это сохранять отдельно не нужно.

~~~

@Agravaine Да, сжимается.
"Пример из зизни":
Когда юзал передачу стаков через пакеты, в том же chisel есть куча разного стекла, следовательно был большой пакет.
После юза компрессии, все стало нормально проходить, без Exception'ов.

Так же компрессия юзается в AE пакетах (смотрел в 1.12.2).
 
Записываем в tag стак.
Вот где моя ошибка была. Невнимательность как всегда играет злые шутки...
я то думал, что через writeToNBT мы записываем НБТ в предмет...Получил полный нбт({id:"minecraft:potion",Count:1b,tag:{Potion:"minecraft:long_water_breathing"},Damage:0s}), теперь есть с чем работать :D
 
Назад
Сверху