Новые монстры — различия между версиями — S.T.A.L.K.E.R. Inside Wiki

Новые монстры — различия между версиями

Материал из S.T.A.L.K.E.R. Inside Wiki

Перейти к: навигация, поиск
(начало)
 
м (грамматика)
Строка 1: Строка 1:
Многие часто сталкиваются с тем, что при попытке добавления монстров не попавшими в финальную версию игра может вылетать. Поробую рассказать, как это дело можно исправить.
+
== Введение ==
 +
 
 +
Многие часто сталкиваются с тем, что при попытке добавления монстров не попавшими в финальную версию игра может вылетать. Попробую рассказать, как это дело можно исправить.
  
 
Для примера возьму кошек (уж очень они мне нравятся)
 
Для примера возьму кошек (уж очень они мне нравятся)

Версия 22:18, 24 мая 2007

Введение

Многие часто сталкиваются с тем, что при попытке добавления монстров не попавшими в финальную версию игра может вылетать. Попробую рассказать, как это дело можно исправить.

Для примера возьму кошек (уж очень они мне нравятся)

Добавить их можно отредактировать файл all.spawn, либо динамически создать в игре через функцию alife:create().

Вылет при появлении

Обычно сопровождается сообщением в логе:

Arguments     : Can't open section 'cat_weak'

Это значит, что монстр у нас не до конца описан. В файле конфигурации идет секция

[m_cat_e]:monster_base

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

[cat_weak]:m_cat_e

то есть ссылка на основную конфигурацию, а потом указываются параметры, которые отличаются от нее. Например сила, здоровье, угол обзора и тд. Мы пока ограничимся просто добавлением этой секции. В файле config\creatures\m_cat.ltx в конце допишем [cat_weak]:m_cat_e. Запускаем, добавляем кошку, вылетаем с ошибкой:

Arguments     : Can't find variable smart_terrain_choose_interval in [cat_weak]

Что ж, добавим и этот параметр. Посмотрим, какой он у собак, и сделаем также:

smart_terrain_choose_interval	= 00:15:00

Запускаем, вылетаем с ошибкой:

Arguments     : Can't find variable satiety_threshold in [cat_weak]

Вобщем, добавляем параметры, по кошка не станет нормально появлятся. Такие ошибки легко локализуются и исправляются.

Ну, на всякий случай, нужно добавить еще две строчки:

critical_wound_threshold	= 0.4
critical_wound_decrease_quant	= 0.

После этого кошка появляется, бегает, с 30 метров бежит нас кушать. Мы этого не хотим, стреляем в нее, и у нас происходит

Вылет при убийстве

Это знаменитая ошибка:

Arguments     : LUA error: e:\stalker\gamedata\scripts\_g.script:20 ........

Самое просто и неправильное решение - закоментировать 20-ю строку скрипта _g.script, вылет исчезнет, но ошибка никуда не денется. Я не могу сказать с уверенностью, к чему игнорирование этого факта может привести, так как исправлял причину, а не следствие.

Путем нехитрых логических размышлений решение было найдено. Вернее тупым перебором всего, что относилось к делу, криками на форумах, битьем головой о стенку... Потом пришло озарение, вместе с сакраментальным вопросом "что происходит после смерти?" А происходит добавление в статистику убитого объекта (монстра, нпс-а). Поэтому лезем в скрипт xr_statistic.script. В самом начале видим объявление переменной

local killCountProps = {...}

в которой кошек нет. Поэтому добавляем их туда (например, в конец), для начисления очков опыта:

cat_weak = 1, cat_normal = 2, cat_strong = 3,

Хотя мы сделали только cat_weak, но на будущее добавим и остальных. Затем идет перечисление используемых классов монстров:

monster_classes = {

кошек нет и здесь, добавляем:

[clsid.cat_s] = "cat",

Смотрим дальше, видим функцию addKillCount(npc), которая определяет сообщество (community) убитого. Функция вызывает getNpcType(npc), которая находится в этом же скрипте. А там идет обращение к функции IsStalker(npc), и возвращает сообщество и ранг убиенного.

Но тут про мостров ни слова, а значит идем дальше. Функция IsStalker(npc) обнаруживается в скрипте _g.script. Просматривая его обнаруживаем следующие интересующие нас функции:

  • is_object_monster(obj)

кошек нет, добавляем рядом с собаками:

otype == clsid.cat or
  • IsMonster (object, class_id)

кошки есть, ничего не трогаем.

Для страховки проверим еще одни файл, class_registrator.script. Находим в нем строку

cs_register (object_factory, "CCat", "se_monster.se_monster", "SM_CAT_S", "cat_s")

и успокаиваемся на этом. Запускаем, убиваем, подходим, пытаемся обыскать - вылетаем. Потому что случился

Вылет при обыске

Ну тут уже проще. Вспоминаем, что у нас показывается в инвентаре убитого? Иконка растерзанного трупа. Проверяем m_cat.ltx - действительно, параметр icon отсутствует. Тут появляется два пути.

Первый - нарисовать новую иконку, вставить ее в файл ui_npc_monster.dds, определить координаты и добавить их в xml-описатель ui_npc_monster.xml. И так для каждого нового монстра.

Второй - использовать общую иконку для всех монстров, у которых отсутствует этот параметр. Мы им и воспользуемся, так как для тестовых целей сойдет, а для серьезного применения все равно необходимо иметь хоть какие-то художественные навыки (если кто видел мой тестовый мод "15 кошек", то помнят тот ужас вместо иконки кошки :) )

Для этого отредактируем файл defines.ltx , так как именно в нём содержится секция monster_base, общая для всех монстров. Открываем, ищем секцию, и вставляем

icon = ui_frame_error_sign_red

Это будет такой красный крест в круге. Запускаем, убиваем, обыскиваем и не вылетаем.

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

Внимание!!!

Огромный минус в том, что убитое животное не попадает в статистику, хотя мы вроде все для этого сделали. С этим предлагаю разобраться самим. Подсказка: в энциклопедии кошек тоже нет ;)

Другие места
LANGUAGE