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

[Решено] Получение Minecraft-имен предметов

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

  1. Автор темы
    imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Здрасте!

    Появилась нужда в куске кода, который бы позволял взять не Bukkit-имя предмета, а Minecraft-имя.
    К примеру, у Bukkit предмет "порох" называется "sulphur", а в Minecraft'е - "gunpowder".
    Или же "жаренная свинина" - в Bukkit "grilled_pork", в MC "cooked_porkchop".

    Так вот, мне нужен именно MC-вариант названий этих предметов :0

    Заранее спасибо~

    UPD: Решено
    PHP:
    public static String stackToName(ItemStack itemStack) {
        
    net.minecraft.server.v1_11_R1.ItemStack nmsStack CraftItemStack.asNMSCopy(itemStack);
        
    net.minecraft.server.v1_11_R1.Item nmsItem nmsStack.getItem();
        return 
    nmsItem.getName().replaceFirst("(item|tile)\\.","");
    }
     
    Последнее редактирование: 4 май 2021
  2. gamerforEA

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

    Баллы:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
    Названия можно получить из регистра предметов, ссылка на который есть в классе Item. Добраться до него можно через NMS.
     
  3. Автор темы
    imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    О, спасибо, сам бы никогда не додумался.
    Кому нужно, оставлю тут пример своего кода

    Код:
    public String IStoName(ItemStack itemStack) {
        net.minecraft.server.v1_11_R1.ItemStack nmsIS = CraftItemStack.asNMSCopy(itemStack);
        net.minecraft.server.v1_11_R1.Item nmsItem=nmsIS.getItem();
        return nmsItem.getName();}
     
  4. Dereku

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

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Если что, с получением баннеров могут быть проблемы.
     
  5. Автор темы
    imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Хм, и правда, в моем случае возникают проблемки. Спасибо, что упомянули.
    Для себя решил таким боком
    PHP:
    public static String stackToName(ItemStack itemStack) {
        if(
    itemStack.getType() == Material.BANNER) {
            
    String color DyeColor.getByWoolData((byteitemStack.getDurability()).toString().toLowerCase();
            return 
    "item.banner." color ".name";
        }
        return 
    CraftItemStack.asNMSCopy(iStack).getItem().getName() + ".name";
    }
    Впрочем, это неважно для изначальной задачи.
     
    Последнее редактирование: 4 май 2021
  6. Автор темы
    imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Если кому-то *вдруг* понадобилось для перевода, как и мне когда-то - в Paper 1.16.2 добавили метод Material#getTranslationKey() (а также для блоков и сущностей)
    Под компотом, очевидно, вызывается NMS, так что, если вам нужно для Spigot/CraftBukkit - использованные методы есть в этом же коммите.
    Мой изначальный ответ довольно кривой, и до регистра я в итоге не добрался. 3 года прошло, брух.
     
  7. deadanykey

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

    Баллы:
    96
    В Paper есть метод для получения локализованного названия getI18NDisplayName().

    Однако, как оказалось, работает крайне хреново. Половину материалов не переводит, возвращая строку "Воздух".

    Поэтому пришлось использовать вот это:

    Код:
        public String getLocalizedName(Material material) {
            String material_name = material.name().toLowerCase();
            String name = LocaleLanguage.a().a(
                    (material.isBlock() ? "block" : "item")
                    + ".minecraft." + material_name);
            if (name.startsWith((material.isBlock() ? "block" : "item") + ".minecraft.")) {
                name = "n/a";
            }
            if (name.equalsIgnoreCase("n/a")) {
                switch (material.name().toLowerCase()) {
                    case "black_wall_banner":
                        name = "Чёрный настенный флаг";
                        break;
                    case "blue_wall_banner":
                        name = "Синий настенный флаг";
                        break;
                    case "brown_wall_banner":
                        name = "Коричневый настенный флаг";
                        break;
                    case "cyan_wall_banner":
                        name = "Бирюзовый настенный флаг";
                        break;
                    case "gray_wall_banner":
                        name = "Серый настенный флаг";
                        break;
                    case "green_wall_banner":
                        name = "Зелёный настенный флаг";
                        break;
                    case "light_blue_wall_banner":
                        name = "Голубой настенный флаг";
                        break;
                    case "light_gray_wall_banner":
                        name = "Светло-серый настенный флаг";
                        break;
                    case "lime_wall_banner":
                        name = "Лаймовый настенный флаг";
                        break;
                    case "magenta_wall_banner":
                        name = "Пурпурный настенный флаг";
                        break;
                    case "orange_wall_banner":
                        name = "Оранжевый настенный флаг";
                        break;
                    case "pink_wall_banner":
                        name = "Розовый настенный флаг";
                        break;
                    case "purple_wall_banner":
                        name = "Фиолетовый настенный флаг";
                        break;
                    case "red_wall_banner":
                        name = "Красный настенный флаг";
                        break;
                    case "white_wall_banner":
                        name = "Белый настенный флаг";
                        break;
                    case "yellow_wall_banner":
                        name = "Жёлтый настенный флаг";
                        break;
                }
            }
            return name;
        }
    
    Цветные флаги в 1.16.2 оказались без перевода, поэтому switch
     
  8. nutrolshok

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

    Баллы:
    76
    @imDaniX ты методы с большой буквы называешь шоль?
     
  9. Автор темы
    imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    3 года назад было, я тогда только изучал язык после прочтения книги - там ничего не было про стиль кода, лишь базовая информация про жабу, потому у меня всё было на уровне "и так сойдёт".
    Не пробовал через Text Component API? Там перевод с клиента. В связке с методом, который я упомянул, должно работать нормально. Впрочем, фиг знает, я только начал плагин на чат заново писать.
     
  10. deadanykey

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

    Баллы:
    96
    Я даже не знаю, как с ним работать :lol:

    Впрочем, это мне нужно на один раз, поэтому и так сойдёт.
     

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