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

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

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

Статус темы:
Закрыта.
  1. Blc_Dragon

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

    Баллы:
    76
    Глаза разуй, тебе три человека об этом писали


    видимо имеется ввиду вывод тега в консоль\игроку
     
  2. Автор темы
    Exception_Prototype

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

    Баллы:
    96
    Окей.
    Представим что тэг teg мы получаем сразу с предмета.
    Далее на нужно в него поместить тэг под именем display, а потом уже на display цеплять Lore ?
     
  3. alexandrage

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

    Баллы:
    173
    Сперва проверяешь на наличие tag, если нет создаешь пустой тег, потом проверяешль display, та же операция что и с tag, дальше проверяешь наличие Lore, если есть, дописываешь-заменяешь, если нет, создаешь новый.
    Вот такую шапку делаешь короче.

    NBTTagCompound nbt = new NBTTagCompound();
    NBTTagCompound tag = new NBTTagCompound();
    NBTTagCompound display = new NBTTagCompound();
    NBTTagList Lore = new NBTTagList();
    CraftItemStack.asNMSCopy(e.getPlayer().getInventory().getItemInMainHand()).save(nbt);
    if(!nbt.hasKey("tag")) nbt.set("tag", tag);
    tag = (NBTTagCompound) nbt.get("tag");
    if(!tag.hasKey("display")) tag.set("display", display);
    display = (NBTTagCompound) tag.get("display");
    if(!display.hasKey("Lore")) display.set("Lore", Lore);
    Lore = (NBTTagList) display.get("Lore");

    Дальше уже работаешь с лором.
     
    Последнее редактирование: 10 фев 2017
  4. Автор темы
    Exception_Prototype

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

    Баллы:
    96
    Ураааа, заработало) Благодаря вам всем, теперь и мне известна это магия с тэгами)
    Всем спасибо за помощь. С новыми знаниями попробую решить старую проблему (тема Lore) которая.
    Вот если чё рабочий полный метод))
    Код:
        private void test(Player p) {
          
            NBTTagCompound nbt = new NBTTagCompound();
            NBTTagCompound tag = new NBTTagCompound();
            NBTTagCompound display = new NBTTagCompound();
            NBTTagList Lore = new NBTTagList();
            Lore.add(new NBTTagString("", "THIS TEST1"));
            Lore.add(new NBTTagString("", "THIS TEST2"));
            Lore.add(new NBTTagString("", "THIS TEST3"));
          
            CraftItemStack stack = this.getCraftVersion(p.getItemInHand());
            CraftItemStack.asNMSCopy(stack).save(nbt);
            //CraftItemStack.asNMSCopy(p.getItemInHand()).save(nbt);
    
            if (!nbt.hasKey("tag")) {
                nbt.set("tag", tag);
            }
          
            tag = (NBTTagCompound) nbt.get("tag");
            if (!tag.hasKey("display")) {
                tag.set("display", display);
            }
          
            display = (NBTTagCompound) tag.get("display");
            if (!display.hasKey("Lore")) {
                display.set("Lore", Lore);
            }
    
            //Lore = (NBTTagList) display.get("Lore");
            ItemStack i = CraftItemStack.asBukkitCopy(net.minecraft.server.v1_6_R3.ItemStack.createStack(nbt));
            p.getInventory().addItem(i);
        }
    

    Всё же мне пригодился вот такой способ, но при его тестировании оказалось, что он не работает.
    После первого hasTag(); == понятно что false, ладно. Создали. Но после вызова этой функции с тем же предметом в руке, он всё равно игнорит, что мгновение назад Tag был ему установлен. В чём ошибка?
    Код:
                net.minecraft.server.v1_6_R3.ItemStack stack = CraftItemStack.asNMSCopy(weapon);
    
                if (stack != null) {
                    if (stack.hasTag()) {
                        Bukkit.broadcastMessage("Есть ТАГ");
                    } else {
                        Bukkit.broadcastMessage("Нет ТАГа");
                        stack.setTag(new NBTTagCompound());
                        stack.getTag().setString("TEST", "PROST");
                    }
                }
    
     
  5. alexandrage

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

    Баллы:
    173
    Так ты его выдай в руку обратно.
     
  6. Автор темы
    Exception_Prototype

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

    Баллы:
    96
    А я по какой то причине подумал, что данный кусок кода может без перевыдачи заменять данные.
    Прост представьте случай, что игрок будет стрелять с прицелом, убьёт моба и прицел сам выключится.
    Или во время перестрелки убив одного игрока, то снова прицел вырубится из-за перевыдачи оружия.
    Ладно, пойду пробовать.
     
  7. AtomicInteger

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

    Баллы:
    76
    Особенность этого метода в том, что заменять предметы не нужно.Зная слот в инвентаре можно взаимодействовать с нбт тегами без замены предмета, напрямую.
     
  8. Автор темы
    Exception_Prototype

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

    Баллы:
    96
    Так почему же тогда не работает?
     
  9. AtomicInteger

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

    Баллы:
    76
    Что в ссылке weapon?
     
  10. Автор темы
    Exception_Prototype

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

    Баллы:
    96
    [​IMG]
     
  11. AtomicInteger

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

    Баллы:
    76
    Я же вроде ясно сказал, нужен СЛОТ в инвентаре.Ребят, ну хоть читайте то.
     
  12. Автор темы
    Exception_Prototype

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

    Баллы:
    96

     
  13. AtomicInteger

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

    Баллы:
    76
    Я подумал ты в общем, сможешь ли получить тег, получить сможешь да.Но способ работать не будет, я для этого специально и заметил, что нужен слот.Возможно, можно переделать и без слота, но я пока не пытался.
     
  14. Автор темы
    Exception_Prototype

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

    Баллы:
    96
    Окей, а не подскажите тогда способ, как можно получить слот предмета в руке?
     
  15. AtomicInteger

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

    Баллы:
    76
    Сходу не вспомню, но как минимум, банальным перебором и сравнением текущего предмета с уникальными атрибутами предмета в руке.Может кто штатный способ знает?
     
  16. Blc_Dragon

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

    Баллы:
    76
    player.getInventory().getHeldItemSlot()
     
  17. Автор темы
    Exception_Prototype

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

    Баллы:
    96
    Вот Blc_Dragon подсказал как и да, действительно, так установился. =)
    Пошёл делать дальше.
    Рабочий варик:
    Код:
    int slot = p.getInventory().getHeldItemSlot();
    net.minecraft.server.v1_6_R3.ItemStack stack = (((CraftPlayer) p).getHandle()).inventory.getItem(slot);
    
     
    Последнее редактирование: 11 фев 2017
  18. Blc_Dragon

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

    Баллы:
    76
    TRIGGERED

    Я BLC (сокращение от black)
     
  19. Автор темы
    Exception_Prototype

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

    Баллы:
    96
    Соре, с уважением
    Собственно проблема в следующем.
    Есть 2 метода. Как бы... всё работает и первый Lore успешно ставится. Никаких ошибок в консоль не кидает.
    Вместе с Lore я в tag записываю ещё кол-во убитых игроков и npc. Когда приходит время из tag взять данные по убийству игроков или npc, то он говорит что всё по нулям. В чём ошибка понять не могу...
    P.S. Если есть ошибки то поправьте пожалуйста, как вы поняли работаю с этим впервой)

    Изначально метод вызывается проверочной командой и переменная isPlayerKill = true;
    Компоненты tag, display и lore объявлены выше методов (забыл как правильно это называется).

    Код:
    public void addKillWeapon(Player killer, boolean isPlayerKill) {
    
            int slot = killer.getInventory().getHeldItemSlot();
            ItemStack weapon = killer.getItemInHand();
    
            if (weapon.getType() != AIR) {
    
                net.minecraft.server.v1_6_R3.ItemStack stack = (((CraftPlayer) killer).getHandle()).inventory.getItem(slot);
    
                if (stack != null) {
    
                    if (stack.hasTag()) {
    
                        Bukkit.broadcastMessage("Таг уже был!");
                        tag = stack.getTag();
    
                        if (tag.hasKey("display")) {
    
                            display = (NBTTagCompound) tag.get("display");
                            int playerkill = tag.getInt("PlayersKilled");
                            int npckill = tag.getInt("NpcKilled");
    
                            Bukkit.broadcastMessage("playerkill: " + playerkill);
                            Bukkit.broadcastMessage("npckill: " + npckill);
                            lore = new NBTTagList();
    
                            if (isPlayerKill) {
                                playerkill++;
                                lore.add(new NBTTagString("", LORE_KILL_PLAYER + playerkill));
                                lore.add(new NBTTagString("", LORE_KILL_NPC + npckill));
                                tag.setInt("PlayersKilled", playerkill);
                            } else {
                                npckill++;
                                lore.add(new NBTTagString("", LORE_KILL_PLAYER + playerkill));
                                lore.add(new NBTTagString("", LORE_KILL_NPC + npckill));
                                tag.setInt("NpcKilled", npckill);
                            }
    
                            display.set("Lore", lore);
                            stack.setTag(tag);
                        } else {
                            Bukkit.broadcastMessage("Таг был, но не полный!");
                            setFirstLore(false, isPlayerKill);
                            stack.setTag(tag);
                        }
    
                    } else {
                        Bukkit.broadcastMessage("Таг не было!");
                        setFirstLore(true, isPlayerKill);
                        stack.setTag(tag);
                    }
                }
            }
        }
    
        private void setFirstLore(boolean isNewTag, boolean isPlayerKill) {
            Bukkit.broadcastMessage("Ставлю первый ЛОРЕ");
    
            if (isNewTag) {
                tag = new NBTTagCompound();
            }
    
            if (!tag.hasKey("display")) {
                display = new NBTTagCompound();
                tag.set("display", display);
            }
    
            display = (NBTTagCompound) tag.get("display");
            if (!display.hasKey("Lore")) {
                lore = new NBTTagList();
                if (isPlayerKill) {
                    lore.add(new NBTTagString("", LORE_KILL_PLAYER + 1));
                    lore.add(new NBTTagString("", LORE_KILL_NPC + 0));
                    tag.setInt("PlayersKilled", 1);
                    tag.setInt("NpcKilled", 0);
                } else {
                    lore.add(new NBTTagString("", LORE_KILL_PLAYER + 0));
                    lore.add(new NBTTagString("", LORE_KILL_NPC + 1));
                    tag.setInt("PlayersKilled", 0);
                    tag.setInt("NpcKilled", 1);
                }
                display.set("Lore", lore);
            }
        }
    
     
  20. Blc_Dragon

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

    Баллы:
    76
    возможно ты двигаешь айтем в инвентаре в режиме креатива. в этом случае кастомные тэги стираются.
     
Статус темы:
Закрыта.

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