Перейти к содержанию

Иконки и текстуры модов в Build 42

Сравните расположение иконок, моделей, одежды и интерфейсных изображений; изучите варианты состояний, маски цвета и диагностику текстур.

Иконки, текстуры и варианты состояния в Build 42

Руководство описывает иконки инвентаря, текстуры моделей, одежды и интерфейса, а также варианты состояния и цветовые маски. Страница адресована Build 42, но поведение и форматы нужно проверять на целевой версии игры.

Четыре типа изображений

ТипРасположениеИмяТипичный формат в источникеЧто указывает на изображение
Иконка предметаmedia/textures/Item_<Icon>.png32×32, RGBA с прозрачностьюIcon = <Icon> в скрипте предмета
Текстура моделиmedia/textures/ или подкаталогиЛюбое512×512 или 256×256, RGBtexture = <имя> в model скрипта
Текстура одеждыmedia/textures/...ЛюбоеЗависит от UV телаXML-файл предмета одежды (модуль 05)
Изображение интерфейсаmedia/ui/ЛюбоеЛюбоеLua: getTexture("media/ui/...png")

В качестве примеров собственных модов автор приводит Tocomples Food: 161 текстура, иконки Item_*.png размером 32×32 RGBA и текстуры моделей 512×512 RGB; Catimbas хранит иконки в Contents/mods/Catimbas/common/media/textures/ и использует common/ для ресурсов; Emote Bubbles загружает кадры анимации из media/ui/EmoteBubbles/<id>_<n>.png через Lua. Это примеры из описания автора, а не независимый аудит.

Имена иконок и варианты состояния

При Icon = CompletoItaliano движок ищет текстуру Item_CompletoItaliano. По источнику, без префикса Item_ появится иконка со знаком вопроса.

Для еды, как утверждает автор, движок ищет варианты по суффиксу без отдельного объявления в скрипте:

СостояниеИскомая иконкаПример из статьи
ОбычноеItem_X.pngItem_BarrosJarpa.png
ИспорченноеItem_XRotten.pngItem_BarrosJarpaRotten.png
ПриготовленноеItem_XCooked.pngItem_HamburguesaCooked.png
ПодгоревшееItem_XBurnt.pngItem_HamburguesaBurnt.png

В руководстве описан похожий шаблон для моделей: файл Tocomples Food CompletoItaliano.txt задаёт model CompletoItaliano и model CompletoItalianoRotten с texture = CompletoItalianoRotten; игра, согласно статье, выбирает испорченную модель, когда нужно.

Информация
Источник отсылает к упражнению 8.4, чтобы найти в .jar формирование имени. Там сказано об альтернативных суффиксах вроде Spoiled и Overdone и поиске только у предметов типа Food. Это утверждения автора, которые нужно отдельно проверить в целевой сборке.

Варианты без новых текстур

Поле предметаОписанное действиеПример из статьи
IconsForTexture = A;B;CОтдельная иконка для каждого варианта текстуры одежды; индекс соответствует textureChoices в .xml.Glasses_Normal: GlassesBlack;GlassesBlue;GlassesRed
IconColorMask = XОкрашивает маску в цвет предмета.Lipstick: IconColorMask = Lipstick_Mask
IconFluidMask = XОкрашивает маску в цвет жидкости внутри.Бутылки и вёдра
ColorRed/Green/BlueОкрашивает предмет.В источнике указано 131 предмет

С IconColorMask статья предлагает использовать одну серую иконку и маску, чтобы получать разные цвета без отдельных изображений для каждого варианта.

Текстуры игры в архивах .pack

Автор утверждает, что базовые текстуры игры находятся в упакованных атласах media/texturepacks/*.pack, а не в отдельных PNG-файлах; поэтому Item_Apple.png нельзя найти в обычном каталоге.

Чтобы посмотреть текстуру без распаковки, источник указывает на TextureViewer в режиме отладки (lua/client/DebugUIs/TextureViewer.lua). В Lua-консоли можно запросить getTexture("Item_Apple"): по описанию статьи, вернётся объект, если текстура есть, иначе nil. Для отдельного файла пример такой: getTexture("media/ui/TargetPos.png").

Если использовать текстуру игры на своей модели, автор советует ссылаться на неё по имени, а не копировать. Изменённую текстуру следует включать в мод под другим именем.

Правила, помогающие избежать проблем

  • Используйте PNG. Автор отмечает, что в отдельных случаях игра читает другие форматы, но его моды используют PNG.
  • Для текстур моделей выбирайте степени двойки, например 256, 512 или 1024; источник объясняет это ожиданиями GPU и практикой игры.
  • Для иконок нужна прозрачность в альфа-канале, а не белый фон.
  • Используйте уникальные имена с префиксом мода, например Catimbas_... . По статье, игра и все моды используют общее пространство имён; при двух файлах Item_Pan.png выигрывает загруженный последним.
  • У игры есть кэш текстур: после изменения PNG перезапустите игру.

Упражнения

Упражнение 4.1 · Иконки состояний

Создайте для Sopaipilla обычную и испорченную иконки. Если предмет можно готовить с помощью IsCookable = true, MinutesToCook и MinutesToBurn, добавьте варианты приготовленного и подгоревшего состояния. Ускорьте время и используйте плиту, чтобы проверить все четыре вида.

Упражнение 4.2 · Существует ли текстура?

В Lua-консоли напишите CursoLab.tex(nombre), чтобы выводить наличие текстуры и её размер через getWidth() и getHeight(). Проверьте Item_Apple, Item_Sopaipilla и несуществующее имя. В упражнении нужно различить все три случая и сохранить функцию в CursoLab_Core.lua для отладки.

Решение из статьи приведено без изменений. Оно зависит от CursoLab и не запускалось:

function CursoLab.tex(name) local t = getTexture(name) if not t then CursoLab.log("NO existe:", name) else CursoLab.log(name, t:getWidth() .. "x" .. t:getHeight()) end return t end

Упражнение 4.3 · Одна иконка — много цветов

Создайте CursoLab.Pañuelo с серой иконкой, маской IconColorMask и тремя цветовыми вариантами. Критерий — три платка выглядят по-разному, используя одну пару PNG.

Упражнение 4.4 · Перекрыть текстуру и отменить изменение

  1. Добавьте в CursoLab собственный Item_Apple.png с синей яблоком.
  2. Проверьте результат в игре и объясните, почему он работает, хотя исходная текстура игры упакована в .pack.
  3. Удалите файл и запишите, когда мод должен намеренно поступать так.

Задача со звёздочкой 4

Напишите pzicons.py, который перебирает скрипты мода и сообщает об Icon = X без соответствующего Item_X.png, еде без иконки Rotten и PNG в textures/, который нигде не используется. Проверьте его на Tocomples Food и Catimbas.

Информация
Имена, суффиксы, размеры, альфа-канал, кэш, порядок загрузки и работа масок описаны по утверждениям автора; размеры приведены как примеры, а не универсальные требования. Текстуры не создавались, игра и упражнения не запускались. Исходный блок кода сохранён буквально. В выбранной статье нет обучающих изображений; рекламные скриншоты вне её текста исключены.