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

  • Автор темы Автор темы 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)\\.","");
}
 
Последнее редактирование:
Названия можно получить из регистра предметов, ссылка на который есть в классе Item. Добраться до него можно через NMS.
 
Названия можно получить из регистра предметов, ссылка на который есть в классе Item. Добраться до него можно через NMS.

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

Код:
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();}
 
Если что, с получением баннеров могут быть проблемы.
 
Если что, с получением баннеров могут быть проблемы.
Хм, и правда, в моем случае возникают проблемки. Спасибо, что упомянули.
Для себя решил таким боком
PHP:
public static String stackToName(ItemStack itemStack) {
    if(itemStack.getType() == Material.BANNER) {
        String color = DyeColor.getByWoolData((byte) itemStack.getDurability()).toString().toLowerCase();
        return "item.banner." + color + ".name";
    }
    return CraftItemStack.asNMSCopy(iStack).getItem().getName() + ".name";
}
Впрочем, это неважно для изначальной задачи.
 
Последнее редактирование:
Если кому-то *вдруг* понадобилось для перевода, как и мне когда-то - в Paper 1.16.2 добавили метод Material#getTranslationKey() (а также для блоков и сущностей)
Под компотом, очевидно, вызывается NMS, так что, если вам нужно для Spigot/CraftBukkit - использованные методы есть в этом же коммите.
Мой изначальный ответ довольно кривой, и до регистра я в итоге не добрался. 3 года прошло, брух.
 
В 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
 
@imDaniX ты методы с большой буквы называешь шоль?
3 года назад было, я тогда только изучал язык после прочтения книги - там ничего не было про стиль кода, лишь базовая информация про жабу, потому у меня всё было на уровне "и так сойдёт".
В 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
Не пробовал через Text Component API? Там перевод с клиента. В связке с методом, который я упомянул, должно работать нормально. Впрочем, фиг знает, я только начал плагин на чат заново писать.
 
Не пробовал через Text Component API? Там перевод с клиента. В связке с методом, который я упомянул, должно работать нормально. Впрочем, фиг знает, я только начал плагин на чат заново писать.
Я даже не знаю, как с ним работать :lol:

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