Помогите Как работать с классом -> NBTTagCompound [Решено]

Статус
Закрыто для дальнейших ответов.

Exception_Prototype

Активный участник
Пользователь
Баллы
96
Не умею работать с NBTTagCompound, можете показать установку и получения тэгов, со всеми
(CraftItemStack) item или как его там. Ибо примеры вижу, но не пойму какие правильные.
 
Спасибо, ознакомился. Сейчас буду пробовать.
Я вот пока рылся в гугле, видел что как то получали название предмета с помощь nbt.get("display.name") или как то так. Где можно посмотреть полный список, чего можно получить? И как всё же пишется правильное получение имени предмета)
 
Спасибо, ознакомился. Сейчас буду пробовать.
Я вот пока рылся в гугле, видел что как то получали название предмета с помощь nbt.get("display.name") или как то так. Где можно посмотреть полный список, чего можно получить? И как всё же пишется правильное получение имени предмета)
Спринти nbt, там все будет. И поймешь от куда дергать.
 
Спринти nbt, там все будет. И поймешь от куда дергать.
Чёт всё равно не нашёл(
Java:
    private void test(Player p) {

        CraftItemStack stack = this.getCraftVersion(p.getItemInHand());
        NBTTagCompound nbt = new NBTTagCompound();
        CraftItemStack.asNMSCopy(stack).save(nbt);
        NBTTagList l = new NBTTagList();
        l.add(new NBTTagString("", "THIS TEST"));
        nbt.set("Lore", l);
        ItemStack i = CraftItemStack.asBukkitCopy(net.minecraft.server.v1_6_R3.ItemStack.createStack(nbt));
        p.setItemInHand(i);

    }
По моей логике, этот метод должен установить Lore предмету в руке "THIS TEST".
Но как вы поняли, этого не происходит. Что не правильно?
1.6.4.
 
Чёт всё равно не нашёл(
Java:
    private void test(Player p) {

        CraftItemStack stack = this.getCraftVersion(p.getItemInHand());
        NBTTagCompound nbt = new NBTTagCompound();
        CraftItemStack.asNMSCopy(stack).save(nbt);
        NBTTagList l = new NBTTagList();
        l.add(new NBTTagString("", "THIS TEST"));
        nbt.set("Lore", l);
        ItemStack i = CraftItemStack.asBukkitCopy(net.minecraft.server.v1_6_R3.ItemStack.createStack(nbt));
        p.setItemInHand(i);

    }
По моей логике, этот метод должен установить Lore предмету в руке "THIS TEST".
Но как вы поняли, этого не происходит. Что не правильно?
1.6.4.
Ну nbt ты организовал, а в item его запихивать уже не надо?

Все равно что написать
Java:
ItemMeta im = item.getItemMeta();
im.setlore(Lore);
а потом недоумевать где лор у айтема
 
Ну nbt ты организовал, а в item его запихивать уже не надо?

Все равно что написать
Java:
ItemMeta im = item.getItemMeta();
im.setlore(Lore);
а потом недоумевать где лор у айтема
А я чёт не понял как это сделать
Разве это строка
Java:
     ItemStack i = CraftItemStack.asBukkitCopy(net.minecraft.server.v1_6_R3.ItemStack.createStack(nbt));
Не создаёт предмет по тэгу? Ведь новый Lore записан в тэг
 
Создаем nms копию предмета:
Java:
net.minecraft.server.v1_7_R4.ItemStack itemStackCopy = CraftItemStack.asNMSCopy(event.getItem().getItemStack());
Получаем теги копии(Если их нет, то создаем пустую ноду):
Java:
NBTTagCompound itemTags = (itemStackCopy.hasTag() ? itemStackCopy.getTag() : new NBTTagCompound());
Записываем в тег что нужно:
Java:
itemTags.setString("Key", "Value");
Записываем в копию тег:
Java:
itemStackCopy.setTag(itemTags);
Создаем bukkit предмет, на основе nms копии:
Java:
org.*********ventory.ItemStack newItem = CraftItemStack.asBukkitCopy(itemStackCopy);
Дальше удаляем старый предмет и выдаем новый.
 
Java:
net.minecraft.server.v1_10_R1.ItemStack stack = CraftItemStack.asNMSCopy(item);
NBTTagCompound tag =stack.hasTag()?  stack.getTag() : new NBTTagCompound(); //Делаем так, иначе просрешь уже имеющиестя тэги
tag.setInt("HideFlags", 1); //вертим таг на чем хотим и как хотим
stack.setTag(tag); //пихаем таг обратно в вещь
org.*********ventory.ItemStack item = CraftItemStack.asCraftMirror(stack); //делаем вещь приличный и порядочным айтемстаком, который не жалко дать игроку
 
А вот запись тега(Ключ = Произвольная строка, Значение = Ник игрока) без замены предмета, но нужен слот инвентаря:
Java:
    public static void setTag(Player player, int slot, String tag) {
        if (player instanceof CraftPlayer) {
            net.minecraft.server.v1_7_R4.ItemStack nmsStack = (((CraftPlayer) player).getHandle()).inventory.getItem(slot);
            if (nmsStack != null)
                if (nmsStack.hasTag()) {
                    nmsStack.getTag().setString(tag, player.getName());
                } else {
                    nmsStack.setTag(new NBTTagCompound());
                    nmsStack.getTag().setString(tag, player.getName());
                }
        }
    }
 
Я же скинул как получить nbt с итемстака и как обратно создать его из nbt.
 
А вот запись тега(Ключ = Произвольная строка, Значение = Ник игрока) без замены предмета, но нужен слот инвентаря:
Java:
    public static void setTag(Player player, int slot, String tag) {
        if (player instanceof CraftPlayer) {
            net.minecraft.server.v1_7_R4.ItemStack nmsStack = (((CraftPlayer) player).getHandle()).inventory.getItem(slot);
            if (nmsStack != null)
                if (nmsStack.hasTag()) {
                    nmsStack.getTag().setString(tag, player.getName());
                } else {
                    nmsStack.setTag(new NBTTagCompound());
                    nmsStack.getTag().setString(tag, player.getName());
                }
        }
    }
А если я предмет получу таким образом, то прокатит?
Java:
net.minecraft.server.v1_6_R3.ItemStack itemStackCopy = CraftItemStack.asNMSCopy(p.getItemInHand());
 
CraftItemStack.asBukkitCopy(net.minecraft.server.v1_7_R4.ItemStack.createStack(Твой nbt))
Вот так возвращается стак из nbt.
 
CraftItemStack.asBukkitCopy(net.minecraft.server.v1_7_R4.ItemStack.createStack(Твой nbt))
Вот так возвращается стак из nbt.
Да я так и делал, но предмет появлялся, но Lore на нём не было. http://rubukkit.org/threads/nbttagcompound.132298/#post-1426152
Я сделал дроп вещей с инвентаря, чтобы проверить, что именно новый предмет появляется.
 
Да я так и делал, но предмет появлялся, но Lore на нём не было. http://rubukkit.org/threads/nbttagcompound.132298/#post-1426152
Я сделал дроп вещей с инвентаря, чтобы проверить, что именно новый предмет появляется.
Короче твой касяк в том, что сперва идет tag в нем display и потом уже Lore tag:{display:{Lore:[0:"test"]}}
 
Java:
    private void test(Player p) {

        net.minecraft.server.v1_6_R3.ItemStack itemStackCopy = CraftItemStack.asNMSCopy(p.getItemInHand());
        NBTTagCompound itemTags = (itemStackCopy.hasTag() ? itemStackCopy.getTag() : new NBTTagCompound());
        NBTTagList l = new NBTTagList();
        l.add(new NBTTagString("", "THIS TEST1"));
        l.add(new NBTTagString("", "THIS TEST2"));
        l.add(new NBTTagString("", "THIS TEST3"));
        itemTags.set("Lore", l);
        itemStackCopy.setTag(itemTags);
        ItemStack i = CraftItemStack.asBukkitCopy(itemStackCopy);
        p.getInventory().clear();
        p.setItemInHand(i);
    }
Угадайте что? Правильно! Не работает.
Короче твой касяк в том, что сперва идет tag в нем display и потом уже Lore tag:{display:{Lore:[0:"test"]}}
Ах вот как, значит это было не просто так...
https://bukkit.org/threads/nbt-tags.110447/#post-1426301
 
Java:
    private void test(Player p) {

        net.minecraft.server.v1_6_R3.ItemStack itemStackCopy = CraftItemStack.asNMSCopy(p.getItemInHand());
        NBTTagCompound itemTags = (itemStackCopy.hasTag() ? itemStackCopy.getTag() : new NBTTagCompound());
        NBTTagList l = new NBTTagList();
        l.add(new NBTTagString("", "THIS TEST1"));
        l.add(new NBTTagString("", "THIS TEST2"));
        l.add(new NBTTagString("", "THIS TEST3"));
        itemTags.set("Lore", l);
        itemStackCopy.setTag(itemTags);
        ItemStack i = CraftItemStack.asBukkitCopy(itemStackCopy);
        p.getInventory().clear();
        p.setItemInHand(i);
    }
Угадайте что? Правильно! Не работает.

Ах вот как, значит это было не просто так...
https://bukkit.org/threads/nbt-tags.110447/#post-1426301
А я тебе говорил, спринти и посмотри.


NBTTagCompound nbt = new NBTTagCompound();
CraftItemStack.asNMSCopy(e.getPlayer().getInventory().getItemInMainHand()).save(nbt);
System.out.println(nbt);
 
Последнее редактирование:
А я тебе говорил, спринти и посмотри.


NBTTagCompound nbt = new NBTTagCompound();
CraftItemStack.asNMSCopy(e.getPlayer().getInventory().getItemInMainHand()).save(nbt);
System.out.println(nbt);
1. Я не понял что такое спринти))
2.
Создал тэг.
Получил CraftItemStack версию предмета.
Записал... что ? куда? Дальше что?
Как бы мы таким образом записывает на предмет craft тэг nbt, а далее можем способом выше сделать из него обычный предмет и дать игроку?

Спринти... Так что всё же, что я должен был найти?
 
1. Я не понял что такое спринти))
2.
Создал тэг.
Получил CraftItemStack версию предмета.
Записал... что ? куда? Дальше что?
Как бы мы таким образом записывает на предмет craft тэг nbt, а далее можем способом выше сделать из него обычный предмет и дать игроку?

Спринти... Так что всё же, что я должен был найти?
Вот эти 2 строчки дают тебе nbt
NBTTagCompound nbt = new NBTTagCompound();
CraftItemStack.asNMSCopy(e.getPlayer().getInventory().getItemInMainHand()).save(nbt);
Делай с ними что хочешь, и потом воссоздаешь обратно стак и даешь игроку.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх