Elite Games - Свобода среди звезд!
.
ВНИМАНИЕ!
Наша конференция посвящена космической тематике и компьютерным играм.
Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!

  » Маленькие хитрости | страница 1
Конференция предназначена для общения пилотов. Для удобства она разделена на каналы, каждый из которых посвящен определенной игре. Пожалуйста, открывайте темы только в соответствующих каналах и после того, как убедитесь, что данный вопрос не обсуждался ранее.

Поиск | Правила конференции | Фотоальбом | Регистрация | Список пилотов | Профиль | Войти и проверить личные сообщения | Вход

   Страница 1 из 1
 
Поиск в этой теме:
Канал X Rebirth » Модовый и скриптовый отсек X Rebirth: «Маленькие хитрости»
eliseeff
 268 EGP


Рейтинг канала: 6(316)
Репутация: 5
Сообщения: 932

Зарегистрирован: 07.03.2015
Здесь предлагаю описывать небольшие трики, которые могут быть полезны при создании модов.

Полагаю, что не стоит задавать здесь вопросы - для этого есть РМ и другие темы.


Универсальный текст для всех языков, для которых нет своего текстового файла. (честно потырено почерпнуто из чужих модов)

Допустим, я делаю мод на корабли. И хочу дать им названия (внезапное желание, да? Улыбка ) и сделать описания. Однако вот беда: с английским-то я справлюсь, с русским, если постараюсь - тоже, а с остальными - беда.

Но ведь если я не добавлю немецкий текстовик, то те, кто играет на немецком (а такие есть даже среди наших соотечественников, уж поверьте), вместо названий кораблей и их описаний увидят пресловутый "ReadText".

Можно, конечно, скопипастить английский текст во все остальные, но это же куча файлов.

Чтобы этого не делать, есть очень простой выход: сделать файл 0001.xml. Копипастим туда английский текст, а в ноде language не указываем id вообще. Тогда в том случае, если для языка, на котором играет плеернейм, не найден его родной текстовик, будет работать вот этот самый наш файл 0001.xml.

Использование оригинальных пейджей ванильной игры. (у других не встречал)

Опять же, допустим, что я добавил в игру корабль. Ему нужно имя и описание. Чем выдумывать какой-то новый пейдж, я могу использовать ванильный page id="20101", где все оригинальные корабли. Только t id ему проставить какой-нибудь запредельный, чтоб шанс совпасть с кем-нибудь другим таким же хитропопым был минимальный. Например, t id="123456XXX".

И вот я добавляю это дело:
Код:
  <add sel="//page[@id='20101']">
    <t id="123456301">Вундервафля</t>
    <t id="123456302">Вундервафля - это вундервафля. Этим все сказано.</t>
  </add>

...и сижу, довольный как курица. Текст добавился в самый конец ванильного пейджа, всё работает и все рады.

Но вся эта радость продолжается ровно до той поры, пока не находится еще один хитропопый гусар, который добавит свой корабль таим же макаром. И вот тут начинается самое интересное. Дело в том, что текстовики крайне не любят нарушения порядка следования id элементов. Т.е. если мод одного хитропопого товарища грузится позже другого такого же хитропопого, но его использованный id меньше, то работать он не будет, ибо большее значение следует перед меньшим.

Как этого избежать? Достаточно просто. Надо просто использовать очень полезную функцию XPath - last().

Делаем так:
Код:
  <add sel="(//page[@id='20101']/t[@id &lt; 123456301])[last()]" pos="after"]">
    <t id="123456301">Вундервафля</t>
    <t id="123456302">Вундервафля - это вундервафля. Этим все сказано.</t>
  </add>

Вот тогда наш текст добавится в точности после самого последнего t id, который меньше нашего.

В результате, если даже набралось достаточно много хитропопых гусаров, проблема возникнет только в том случае, если двоих из них угораздило использовать абсолютно одинаковые t id. Что, согласитесь, крайне маловероятно при использовании девятизначных чисел (в данном конкретном примере).

Последний раз редактировалось: eliseeff (20:16 26-02-2018), всего редактировалось 6 раз(а)
    Добавлено: 20:10 26-02-2018   
eliseeff
 268 EGP


Рейтинг канала: 6(316)
Репутация: 5
Сообщения: 932

Зарегистрирован: 07.03.2015
Создание в UI таблицы с кастомной шириной и высотой (у других не встречал).

Кто ковырялся с UI, наверное, в курсе, что при создании таблицы ванильный виджет черта с два даст вам создать таблицу с нужной вам шириной и высотой. Он все равно высчитает их исходя из оффсетов и стандартного размера, соответствующего вашему разрешению экрана.

А если мне не нужна такая широкая таблица? А смещать ее оффсетом от края экрана я не хочу? И начинаются пляски с бубном.

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

Есть более простой способ. Бэкапим значения, из которых ванилка высчитывает таблицу, вставляем вместо них нужные нам значения, создаем таблицу, а потом возвращаем значения обратно (иначе перекорячим к чертовой бабушке все остальные таблицы в игре):

Код:
   local backup_width, backup_height = Helper.pda_width, Helper.pda_height            -- бэкапим ванильные данные
   Helper.pda_width, Helper.pda_height = Helper.scaleX(630), Helper.scaleY(460) + 71   -- вставляем свои
   menu.selecttable = Helper.displayTableView(menu, selectdesc)                        -- создаем таблицу
   Helper.pda_width, Helper.pda_height = backup_width, backup_height                  -- возвращаем ванильные данные на место


Кратенько, простенько и со вкусом. Аж самому приятно...

*Трик использован мною в моде "Mods Options", так что если хотите исследовать контекст - вы можете найти эти строчки там...
    Добавлено: 10:54 27-05-2018   
eliseeff
 268 EGP


Рейтинг канала: 6(316)
Репутация: 5
Сообщения: 932

Зарегистрирован: 07.03.2015
Поддержка в Lua работы с разными версиями игры (у других не встречал).

Как вы понимаете, в разных версиях игры некоторые функции в Lua-скриптах изменяются разработчиками. Соответственно, содержание мода для разных версий игры в этом случае может требоваться разное. Чтобы не морочиться с каталогами вида "ext_v.XXX", что довольно неудобно и имеет массу сопутствующих минусов, можно сделать по-другому.

Например, в этом моде изменяется ванильная функция, которая для версий 4.00/4.10 должна иметь одну структуру, а для 4.30 - другую. И сделал я так:

Код:
if tonumber(GetVersionString():match("^(%d*%.%d+)%s.*$")) < 4.30 then

    patch.nosas_display = function(firsttime)           --  v4.00/4.10

    -- здесь прописана функция для 4.00/4.10

    end

else

    patch.nosas_display = function(firsttime)           --  v4.30

    -- здесь прописана функция для 4.30

    end

end


Кагбе и всё... Мод работает со всеми тремя версиями игры, все поют и пляшут...

Последний раз редактировалось: eliseeff (14:05 27-05-2018), всего редактировалось 1 раз
    Добавлено: 14:03 27-05-2018   
Канал X Rebirth -> Модовый и скриптовый отсек X Rebirth: «Маленькие хитрости»
 
  
Показать: 
Предыдущая тема | Следующая тема |
К списку каналов | Наверх страницы
Цитата не в тему: Жениться - это как захват Персея: знаешь, что нахрен не нужно, а все равно тянет! (мудрость от Змея)

  » Маленькие хитрости | страница 1
Каналы: Новости | Elite | Elite: Dangerous | Freelancer | Star Citizen | X-Tension/X-BTF | X2: The Threat | X3: Reunion | X3: Terran Conflict | X Rebirth | X4: Foundations | EVE Online | Orbiter | Kerbal Space Program | Evochron | VoidExpanse | Космические Миры | Онлайновые игры | Другие игры | Цифровая дистрибуция | play.elite-games.ru | ЗВ 2: Гражданская война | Творчество | Железо | Игра Мечты | Сайт
   Дизайн Elite Games V5 beta.18