Помогите Как правильно записать информацию на предмет

Bezobrazie

Активный участник
Пользователь
Баллы
46
Имя в Minecraft
MySoulIsCry
Задумка такая, есть предметы в гуи, они могут распологатся по разному, и при клике на предмет с него нужно считать инфу которая не будет видна игрокам. Подумал флагами/нбт но не могу разобраться в этой теме. Есть какие-то варианты?
 
Я просто использую свой класс для скрытой информации, сам стак не имеет скрытых тегов.
 
Я просто использую свой класс для скрытой информации, сам стак не имеет скрытых тегов.
разве нбт теги свои нельзя спрятать?
Можно по подробнее про "свой класс"?
Код:
        net.minecraft.server.v1_12_R1.ItemStack nms = CraftItemStack.asNMSCopy(i);
        NBTTagCompound tag = nms.getTag();
        tag.setString("player", name);
        i = CraftItemStack.asCraftMirror(nms);
 
Какая версия? С, кажется, 1.14 есть persistent data.
 
Как вариант воспользоваться NBT API, у него большой функционал
 
разве нбт теги свои нельзя спрятать?
Зачем? Когда я просто получаю свой класс по индексу слота и там храню логику для менюшки. При этом предмет совершенно ванильный в меню без костылей с тегами.
 
Можно по подробнее про "свой класс"?
Код:
    @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
    public void onClick(InventoryClickEvent e) {
        Inventory inv = e.getClickedInventory();
        if (inv != null && inv.getHolder() instanceof Menu) {
            e.setCancelled(true);
            Player player = (Player) e.getWhoClicked();
            Menu menu = (Menu) inv.getHolder();
            Stack stack = menu.getStack(e.getSlot(), player);
            if (stack != null) {
                stack.runCommand(player);
            }
        }
    }
 
Как вариант - можно в Lore черным текстом написать нужную информацию и игроку ее не будет видно.
Я так реализовал систему сумок и рюкзаков на ванильном DayZ сервере.
 
Код:
    @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
    public void onClick(InventoryClickEvent e) {
        Inventory inv = e.getClickedInventory();
        if (inv != null && inv.getHolder() instanceof Menu) {
            e.setCancelled(true);
            Player player = (Player) e.getWhoClicked();
            Menu menu = (Menu) inv.getHolder();
            Stack stack = menu.getStack(e.getSlot(), player);
            if (stack != null) {
                stack.runCommand(player);
            }
        }
    }
Это не сработает для предметов, которые могут перемещаться в другие слоты игроком. Судя по первому посту, у ТС именно так. Можно отслеживать перемещения предметов при помощи InventoryClickEvent и InventoryDragEvent, но это для совсем извращенцев, поскольку не всю информацию можно получить из этих эвентов. Например, при перекидывании предмета в другой инвентарь с шифтом придётся самостоятельно считать номер целевого слота.

разве нбт теги свои нельзя спрятать?
Теоретически можно, но практически довольно сложно. Это придётся на уровне пакетов удалять ненужные теги из стаков.
Без этого все теги элементарно просматриваются любым модом.
Но ТС и не писал, что ему требуется скрыть теги
 
Последнее редактирование:
Это не сработает для предметов, которые могут перемещаться в другие слоты игроком.
С чего ты решил, что предметы будут перемещаться игроком? В поставленной задаче только меню с разным расположением предметов.
 
Последнее редактирование:
Зачем переизобретать велосипед?
Каждый хочет выделиться. Да и вообще... Если что-то придумали, это не значит, что нельзя больше ничего изобретать. Вдруг что-то лучше придумается. Поэтому все идеи хороши.
 
Каждый хочет выделиться. Да и вообще... Если что-то придумали, это не значит, что нельзя больше ничего изобретать. Вдруг что-то лучше придумается. Поэтому все идеи хороши.
Реально, я вот изобрел менюшки без кастомных тегов и без ненужных мне наворотов как в делюкс меню.
 
Если, конечно, ты не сделаешь remove(slot), put(newSlot, stack) при соответствующем действии
Чтобы сделать remove и put - нужно понимать, откуда и куда что переместилось. А с этим до сих пор в бакките сложности. Выше я об этом и написал.

С чего ты решил, что предметы будут перемещаться игроком? В поставленной задаче только меню с разным расположением предметов.
Ну ладно, может и так. Если игрок сам перемещать не может - то да, вариант удобный
 
Последнее редактирование:
Игрок не может перемещать предметы. Реализовано так что если у игрока есть определенные пермы которые соответствуют предметам то только эти предметы будут отображаться по порядку. То есть отртсовка предметов будет всегда для каждого игрока разная и нужно при клике понять какому перму соответствует предмет. Я хотел записывать название перма куда либо в мету предмета а после считывать ее.
 
Игрок не может перемещать предметы. Реализовано так что если у игрока есть определенные пермы которые соответствуют предметам то только эти предметы будут отображаться по порядку. То есть отртсовка предметов будет всегда для каждого игрока разная и нужно при клике понять какому перму соответствует предмет. Я хотел записывать название перма куда либо в мету предмета а после считывать ее.
Тогда мой вариант подходит точно. В примере не сортировка, но суть та же.
Код:
    public Inventory getInventory(Player player) {
        Inventory inventory = Bukkit.createInventory(this, 9 * this.line, this.title);
        for (int i = 0; i < this.stacks.size(); i++) {
            Stack stack = this.stacks.get(i);
            if (stack != null) {
                if (stack.getPermission() == null || player.hasPermission(stack.getPermission())) {
                    inventory.setItem(i, stack.getItemStack());
                }
            }
        }
        return inventory;
    }
 
Последнее редактирование:
Назад
Верх