Иконка ресурса

Tooltip программируемый через lang-файл

Версия(и) Minecraft
1.7.10-1.12
Это скорее не туториал, а просто фишка, показавшаяся мне удобной.
Рассказывать буду на примере увлажняемых блоков из Misty World.
Методы, приведённые ниже, взяты из версии 1.12+, но сам принцип, думаю, будет работать во всех версиях.

Итак, во время работы над модом, появилась необходимость дать описание увлажняемым блокам. Описание состояло всего из одного слова: "Влажная" или "Сухая". И оно никак не смущало меня, до тех пор пока в моде увлажняемым блоком была только почва.
"Почва влажная" или "Почва сухая".
Однако потом задумал добавить песок, и уже стало как-то не очень.
Получалось следующее: "Песок влажная" или "Песок сухая".
Хочу заметить, что в обоих случаях английский вариант звучал хорошо: "Sand wet" или "Sand dry".
Но мы-то с вами говорим по русски.

Те, кто уже успел познакомиться с модом, могли заметить, что видов увлажняемых блоков там туева хуча, и давать отдельное описание каждому было бы глупо. Lang-файл, в этом случае, вырос бы раза в полтора... Что не очень удобно.

Вот и решил я немного поизвращаться )))

Не буду рассказывать, как давать описание предметам или блокам, считаю, что вы все это уже знаете. Просто скопирую сюда метод "нормального человека" или тот, который я применял изначально для блока земли:
Java:
@Override
@SideOnly(Side.CLIENT)
public void addInformation(ItemStack stack, @Nullable World player, List<String> tooltip, ITooltipFlag advanced) {
    boolean wet = getStateFromMeta(stack.getItemDamage()).state.getValue(WET);              // Узнаем нужный нам параметр, а именно влажность
    tooltip.add(I18n.format(wet ? "tile.block_wet.tooltip" : "tile.block_dry.tooltip"));    // Добавляем описание в зависимости от параметра
}

В lang-файле содержалось примерно следующее:
Код:
tile.dirt_f.name=Лесная почва
tile.dirt_s.name=Песчаная почва
tile.dirt_c.name=Глиняная почва
tile.dirt_r.name=Каменистая почва
tile.dirt_t.name=Тропическая почва

tile.block_wet.tooltip=Влажная
tile.block_dry.tooltip=Сухая

Всё вполне цивильно и пререканий нет.

Теперь добавляем песок и применяем к нему тот же tooltip:
Код:
tile.sand.name=Песок

tile.block_wet.tooltip=Влажная
tile.block_dry.tooltip=Сухая

Упс! Уже что-то не то. Нас это не устраивает.
Попробуем давать разные описания в зависимости от названия самого блока )

Немного модифицируем метод:
Java:
@Override
@SideOnly(Side.CLIENT)
public void addInformation(ItemStack stack, @Nullable World player, List<String> tooltip, ITooltipFlag advanced) {
    boolean wet = getStateFromMeta(stack.getItemDamage()).getValue(WET);                                               // Как и в прошлый раз, узнаём нужный нам параметр
    String gender = I18n.format(stack.getUnlocalizedName() + ".name");                                                 // Далее создаём спец-строчечку) Выясняем каким же будет финальное имя блока, уже переведённое на текущий язык. То есть то, что вы пишете в lang-файле после "="
    if (gender.substring(gender.length() - 2, gender.length() - 1).equals("_")) {                                      // Узнаём, является ли предпоследний символ строки нижним подчёркиванием "_"
        gender = gender.substring(gender.length() - 2, gender.length());                                               // Если да, берём последние два символа
    } else gender = "";                                                                                                // Если нет, превращаем строчку в пустую
    tooltip.add(I18n.format(wet ? "tile.block_wet" + gender + ".tooltip" : "tile.block_dry" + gender + ".tooltip"));   // Добавляем описание, но немного переделанное
}

Сам lang-файл, в этом случае, будет представлять из себя следующее:
Код:
tile.dirt_f.name=Лесная почва_0
tile.dirt_s.name=Песчаная почва_0
tile.dirt_c.name=Глиняная почва_0
tile.dirt_r.name=Каменистая почва_0
tile.dirt_t.name=Тропическая почва_0
tile.sand.name=Песок_1

tile.block_wet_0.tooltip=Влажная
tile.block_dry_0.tooltip=Сухая

tile.block_wet_1.tooltip=Влажный
tile.block_dry_1.tooltip=Сухой

Таким образом, описания фильтруются по двум последним символам названия.
Результатом будет "Почва влажная", но "Песок сухой"!

А если нам нужно добавит ещё один род: средний? Да, русский язык богатый )
Не вопрос:
Код:
tile.dirt_f.name=Лесная почва_0
tile.dirt_s.name=Песчаная почва_0
tile.dirt_c.name=Глиняная почва_0
tile.dirt_r.name=Каменистая почва_0
tile.dirt_t.name=Тропическая почва_0
tile.sand.name=Песок_1
tile.sand.name=Сено_2

tile.block_wet_0.tooltip=Влажная
tile.block_dry_0.tooltip=Сухая

tile.block_wet_1.tooltip=Влажный
tile.block_dry_1.tooltip=Сухой

tile.block_wet_2.tooltip=Влажное
tile.block_dry_2.tooltip=Сухое

При этом, нашим иностранным друзьям вообще не нужно будет заботится о родах ) Если они не пишут в конце "_x" или "_y", данная строка игнорируется и описание берётся стандартное.
Пример английский локализации:
Код:
tile.dirt_f.name=Forest Dirt
tile.dirt_s.name=Sandy Dirt
tile.dirt_c.name=Clay Dirt
tile.dirt_r.name=Rocky Dirt
tile.dirt_t.name=Tropical Dirt

tile.block_wet.tooltip=Wet
tile.block_dry.tooltip=Dry

Это удобно, но нужно позаботится и о названии самого блока...
Чтобы наши приписки в конце не были видны больше никому, в ItemBlock почвы пришлось добавить следующее:
Java:
@Override
public String getItemStackDisplayName(ItemStack stack) {
    String s = super.getItemStackDisplayName(stack);                  // Берём финальное имя блока
    if (s.substring(s.length() - 2, s.length() - 1).equals("_")) {    // Проверяем его на наличие "_" второго с конца
        return s.substring(0, s.length() - 2);                        // Если есть, обрезаем его нафик )
    }
    return s;
}

Благо, почти для всех увлажняемых блоков я применяю один этот ItemBlock.
Думаю, что данный принцип можно применить ещё много к чему. Главное подойти творчески )

На этом мой первый недотутор подошёл к концу. Прошу любить и жаловать )))
Автор
Liahim
Просмотры
1,185
Первый выпуск
Обновление
Оценка
5.00 звёзд 3 оценок

Другие ресурсы пользователя Liahim

Последние рецензии

Полезная концепция)
Логику addInformation стоило бы сделать без мутабельных переменных, так она будет понятнее
Думал чего я узнаю здесь нового? А, оказывается годнота, да ещё какая!
Liahim
Liahim
Сам не ожидал XD
Сверху