[Решено] Как изменить название предмета в результате наковальни

  • Автор темы Автор темы imDaniX
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

imDaniX

Активный участник
Пользователь
Баллы
96
Имя в Minecraft
imDaniX
Здрасте!

Нужна помощь: не могу никак изменить результат предмета в наковальне.
Пытаюсь сделать так, чтобы итоговый предмет не изменял своего имени, если оно окрашено в зеленый.

Вот часть кода:
Код:
    @EventHandler
    public void onInventoryClick(InventoryClickEvent e){
        if ((e.getInventory() instanceof AnvilInventory)) {
            if (e.getRawSlot()==e.getView().convertSlot(e.getRawSlot())) return;
            if (e.getSlotType()==InventoryType.SlotType.RESULT) return;
            if (e.getRawSlot()==2) return;
            ItemStack item = e.getInventory().getItem(0);
            ItemStack item2 = e.getCursor();
            if (item2!=null && item!=null && item.getItemMeta()!=null && item.getItemMeta().hasDisplayName()){
                if (item.getItemMeta().getDisplayName().startsWith("§a"))
                    item2.getItemMeta().setDisplayName(item.getItemMeta().getDisplayName());
            } else return;
        }
    }

Иии... Ничего. Предмет спокойно переименовывается. Уж не знаю что сделать. Также менял e.getCursor() на e.getCurrentItem(), результат такой-же.
Помогите нубу ;-; Заранее спасибо
 
Код:
int slot = e.getView().convertSlot(e.getRawSlot());
Слот, по которому кликаем, если инвентарь - Наковальня.
Дальше, 0 - первый слот, 1 - второй, 2 - результат
Получить предмет по слоту e.getInventory().getItem(slot);
Чтобы переименовать имя результата, такой код:
Код:
String name = originalItem.getItemMeta().getDisplayName();
ItemMeta meta = resultItem.getItemMeta();
meta.setDisplayName(name);
resultItem.setItemMeta(meta);
Тоесть переименовываешь предмет в третьем слоте.
Теперь про то, что ты получал предметы с курсора. Когда вызывается событие на клик инвентаря, то считай, что оно еще не произошло, это только событие перед тем, как ты кликнул. Тоесть если ты кликаешь по предмету пустым курсором, то на момент ивента курсор пуст, а предмет на своем же месте.
И да
item.getItemMeta().setDisplayName("Name") не проканает.
Тоесть ты должен установить на предмет уже новую мету с новым именем.
 
Код:
int slot = e.getView().convertSlot(e.getRawSlot());
Слот, по которому кликаем, если инвентарь - Наковальня.
Дальше, 0 - первый слот, 1 - второй, 2 - результат
Получить предмет по слоту e.getInventory().getItem(slot);
Чтобы переименовать имя результата, такой код:
Код:
String name = originalItem.getItemMeta().getDisplayName();
ItemMeta meta = resultItem.getItemMeta();
meta.setDisplayName(name);
resultItem.setItemMeta(meta);
Тоесть переименовываешь предмет в третьем слоте.
Теперь про то, что ты получал предметы с курсора. Когда вызывается событие на клик инвентаря, то считай, что оно еще не произошло, это только событие перед тем, как ты кликнул. Тоесть если ты кликаешь по предмету пустым курсором, то на момент ивента курсор пуст, а предмет на своем же месте.
И да
item.getItemMeta().setDisplayName("Name") не проканает.
Тоесть ты должен установить на предмет уже новую мету с новым именем.
Есть же PrepareAnvilEvent.
 
Код:
int slot = e.getView().convertSlot(e.getRawSlot());
Слот, по которому кликаем, если инвентарь - Наковальня.
Дальше, 0 - первый слот, 1 - второй, 2 - результат
Получить предмет по слоту e.getInventory().getItem(slot);
Чтобы переименовать имя результата, такой код:
Код:
String name = originalItem.getItemMeta().getDisplayName();
ItemMeta meta = resultItem.getItemMeta();
meta.setDisplayName(name);
resultItem.setItemMeta(meta);
Тоесть переименовываешь предмет в третьем слоте.
Теперь про то, что ты получал предметы с курсора. Когда вызывается событие на клик инвентаря, то считай, что оно еще не произошло, это только событие перед тем, как ты кликнул. Тоесть если ты кликаешь по предмету пустым курсором, то на момент ивента курсор пуст, а предмет на своем же месте.
И да
item.getItemMeta().setDisplayName("Name") не проканает.
Тоесть ты должен установить на предмет уже новую мету с новым именем.

Большое спасибо за помощь с метой :)

Есть же PrepareAnvilEvent.

Спасибо за наводку - не знал про этот ивент.

*вдруг кому пригодится*


Код:
    @EventHandler
    public void onInventoryClick(InventoryClickEvent e){
        if ((e.getInventory() instanceof AnvilInventory)) {
            if (e.getSlotType()!=InventoryType.SlotType.RESULT) return;
            if (e.getView().convertSlot(e.getRawSlot())!=2) return;
            ItemStack item = e.getInventory().getItem(0);
            ItemStack item2 = e.getInventory().getItem(2);
            if (item2!=null && item!=null && item.getItemMeta()!=null && item.getItemMeta().hasDisplayName()){
                if (item.getItemMeta().getDisplayName().startsWith("§a")){
                String name = item.getItemMeta().getDisplayName();
                ItemMeta meta = item2.getItemMeta();
                meta.setDisplayName(name);
                item2.setItemMeta(meta);}
            } else return;
        }
    }

Код:
    @EventHandler
    public void onAnvilResult(PrepareAnvilEvent e){
        ItemStack item = e.getInventory().getItem(0);
        ItemStack item2 = e.getResult();
        if (item2!=null && item!=null && item.getItemMeta()!=null && item.getItemMeta().hasDisplayName()){
            if (item.getItemMeta().getDisplayName().startsWith("§a")){
            String name = item.getItemMeta().getDisplayName();
            ItemMeta meta = item2.getItemMeta();
            meta.setDisplayName(name);
            item2.setItemMeta(meta);}
        } else return;
    }
 
Вот вам с анвил ивентом.

Java:
    @EventHandler
    public void on(PrepareAnvilEvent e) {
        ItemStack item = e.getInventory().getItem(0);
        ItemStack result = e.getResult();
        if(item != null && item.hasItemMeta() && item.getItemMeta().hasDisplayName() && result.getType()!=Material.AIR && e.getInventory().getRenameText()!=null) {
            String name = item.getItemMeta().getDisplayName();
            if(name.contains("§a")) {
                ItemMeta meta = result.getItemMeta();
                meta.setDisplayName(name);
                result.setItemMeta(meta);
            }
        }
    }
 
Вот вам с анвил ивентом.

Java:
    @EventHandler
    public void on(PrepareAnvilEvent e) {
        ItemStack item = e.getInventory().getItem(0);
        ItemStack result = e.getResult();
        if(item != null && item.hasItemMeta() && item.getItemMeta().hasDisplayName() && result.getType()!=Material.AIR && e.getInventory().getRenameText()!=null) {
            String name = item.getItemMeta().getDisplayName();
            if(name.contains("§a")) {
                ItemMeta meta = result.getItemMeta();
                meta.setDisplayName(name);
                result.setItemMeta(meta);
            }
        }
    }
И когда меняешь каждую букву при переименовании, то каждый раз ивент идет?
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх