1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Exception_Prototype, 9 фев 2017.

Статус темы:
Закрыта.
  1. Автор темы
    Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Баллы:
    96
    Не умею работать с NBTTagCompound, можете показать установку и получения тэгов, со всеми
    (CraftItemStack) item или как его там. Ибо примеры вижу, но не пойму какие правильные.
     
  2. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
  3. Автор темы
    Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Баллы:
    96
    Спасибо, ознакомился. Сейчас буду пробовать.
    Я вот пока рылся в гугле, видел что как то получали название предмета с помощь nbt.get("display.name") или как то так. Где можно посмотреть полный список, чего можно получить? И как всё же пишется правильное получение имени предмета)
     
  4. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Спринти nbt, там все будет. И поймешь от куда дергать.
     
  5. Автор темы
    Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Баллы:
    96
    Чёт всё равно не нашёл(
    Код:
        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.
     
  6. Blc_Dragon

    Blc_Dragon Активный участник Пользователь

    Баллы:
    76
    Ну nbt ты организовал, а в item его запихивать уже не надо?

    Все равно что написать
    Код:
    ItemMeta im = item.getItemMeta();
    im.setlore(Lore); 
    а потом недоумевать где лор у айтема
     
  7. Автор темы
    Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Баллы:
    96
    А я чёт не понял как это сделать
    Разве это строка
    Код:
         ItemStack i = CraftItemStack.asBukkitCopy(net.minecraft.server.v1_6_R3.ItemStack.createStack(nbt));
    
    Не создаёт предмет по тэгу? Ведь новый Lore записан в тэг
     
  8. AtomicInteger

    AtomicInteger Активный участник Пользователь

    Баллы:
    76
    Создаем nms копию предмета:
    Код:
    net.minecraft.server.v1_7_R4.ItemStack itemStackCopy = CraftItemStack.asNMSCopy(event.getItem().getItemStack());
    Получаем теги копии(Если их нет, то создаем пустую ноду):
    Код:
    NBTTagCompound itemTags = (itemStackCopy.hasTag() ? itemStackCopy.getTag() : new NBTTagCompound());
    Записываем в тег что нужно:
    Код:
    itemTags.setString("Key", "Value");
    Записываем в копию тег:
    Код:
    itemStackCopy.setTag(itemTags);
    Создаем bukkit предмет, на основе nms копии:
    Код:
    org.*********ventory.ItemStack newItem = CraftItemStack.asBukkitCopy(itemStackCopy);
    Дальше удаляем старый предмет и выдаем новый.
     
  9. Blc_Dragon

    Blc_Dragon Активный участник Пользователь

    Баллы:
    76
    Код:
    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); //делаем вещь приличный и порядочным айтемстаком, который не жалко дать игроку
    
     
  10. AtomicInteger

    AtomicInteger Активный участник Пользователь

    Баллы:
    76
    А вот запись тега(Ключ = Произвольная строка, Значение = Ник игрока) без замены предмета, но нужен слот инвентаря:
    Код:
        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());
                    }
            }
        }
     
  11. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Я же скинул как получить nbt с итемстака и как обратно создать его из nbt.
     
  12. Автор темы
    Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Баллы:
    96
    А если я предмет получу таким образом, то прокатит?
    Код:
    net.minecraft.server.v1_6_R3.ItemStack itemStackCopy = CraftItemStack.asNMSCopy(p.getItemInHand());
    
     
  13. AtomicInteger

    AtomicInteger Активный участник Пользователь

    Баллы:
    76
    Да.Почему бы и нет?
     
  14. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    CraftItemStack.asBukkitCopy(net.minecraft.server.v1_7_R4.ItemStack.createStack(Твой nbt))
    Вот так возвращается стак из nbt.
     
  15. Автор темы
    Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Баллы:
    96
    Да я так и делал, но предмет появлялся, но Lore на нём не было. http://rubukkit.org/threads/nbttagcompound.132298/#post-1426152
    Я сделал дроп вещей с инвентаря, чтобы проверить, что именно новый предмет появляется.
     
  16. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Короче твой касяк в том, что сперва идет tag в нем display и потом уже Lore tag:{display:{Lore:[0:"test"]}}
     
  17. Автор темы
    Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Баллы:
    96
    Код:
        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
     
  18. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    А я тебе говорил, спринти и посмотри.


    NBTTagCompound nbt = new NBTTagCompound();
    CraftItemStack.asNMSCopy(e.getPlayer().getInventory().getItemInMainHand()).save(nbt);
    System.out.println(nbt);
     
    Последнее редактирование: 9 фев 2017
  19. Автор темы
    Exception_Prototype

    Exception_Prototype Активный участник Пользователь

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

    Спринти... Так что всё же, что я должен был найти?
     
  20. alexandrage

    alexandrage Старожил Пользователь

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

Поделиться этой страницей