Автор |
Сообщение |
Alex39 ®
  Стаж: 11 лет Сообщений: 402 Откуда: Украина, Одесса
Как создать в сталкере нового монстраНовые монстрыНовые монстры Введение Многие часто сталкиваются с тем, что при попытке добавления монстров не попавшими в финальную версию игра может вылетать. Попробую рассказать, как это дело можно исправить. Для примера возьму кошек (уж очень они мне нравятся) Добавить их можно отредактировать файл 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 Это будет такой красный крест в круге. Запускаем, убиваем, обыскиваем и не вылетаем. Итак, свежедобавленный монстр бегает, живет, нападает. Однако та же кошка по умолчанию невероятно сильна, убивает с одного удара, поэтому для нормальной жизни необходимо подредактировать секцию атаки. Внимание!!! Огромный минус в том, что убитое животное не попадает в статистику, хотя мы вроде все для этого сделали. С этим предлагаю разобраться самим. Подсказка: в энциклопедии кошек тоже нет
|
|
|
Alex39 ®
  Стаж: 11 лет Сообщений: 402 Откуда: Украина, Одесса
Вот нашел как добавлять монстров в статистику. Все работает!Урок "Как добавить нового монстра в статистику"На примере зомби. Понадобятся следующие файлы из распакованной оригинальной игры: Код gamedata\scripts\_g.script gamedata\scripts\class_registrator.script gamedata\scripts\lua_help.s cript gamedata\scripts\pda.script gamedata\scripts\xr_conditions.script gamedata\scripts\xr_sta tistic.script gamedata\configs\ui\textures_descr\ui_monsters_pda.xml gamedata\textures\ui\ui_actor_monsters_pd a_1.dds gamedata\textures\ui\ui_actor_monsters_pda_1.thm В файле _g.script раскоментировать строку: Код [clsid.zombie_s] = true, после строки Код [clsid.gigant_s] = true, Убедиться в наличии строки в файле class_registrator.script Код cs_register(object_factory, "CZombie", "se_monster.se_monster", "SM_ZOMBI", "zombie_s") после Код cs_register(object_factory, "CPseudoGigant", "se_monster.se_monster", "SM_GIANT", "gigant_s") В файле pda.script после строки Код tushkano = {back = "ui_inGame2_Tushkan", icon = ""}, вставить строку Код zombie = {back = "ui_inGame2_Zombie", icon = ""}, В файл xr_conditions.script вставить функцию Код function is_monster_zombie(actor, npc) return npc:clsid() == clsid.zombie_s end В файл xr_statistic.script после строки Код [clsid.snork_s ] = "snork", вставить Код [clsid.zombie_s ] = "zombie", В файл ui_monsters_pda.xml в секцию Код <file name="ui\ui_actor_monsters_PDA_1"> ... </file> вставить строку Код <texture id="ui_inGame2_Zombie" x="0" y="800" width="393" height="200" /> Отредактировать текстуру ui_actor_monsters_pda_1.dds вставив картинку монстра в соответствующее место указанное в файле ui_monsters_pda.xml Для того, чтобы зомби отличались по ранжиру, нужно ввести ранг для каждого вида зомби описанного в файле m_zombie.ltx, затем проверять ранг зомби в файле xr_statistic.script в функции function set_best_monster(obj) кодом типа Код elseif(community=="zombie") then if(rank==6) then community = community.."_strong" else community = community.."_weak" end Соответственно для каждого из видов зомби можно сделать свою картинку в файле pda.script добавив Код zombie_strong = {back = "ui_inGame2_Zombie_1", icon = ""}, zombie_weak = {back = "ui_inGame2_Zombie_2", icon = ""}, и определив картинки для них в файле ui_monsters_pda.xml и отредактировав сами файлы текстур.
|
|
|
Текущее время: Сегодня 21:19
Часовой пояс: GMT + 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете прикреплять файлы к сообщениям Вы не можете скачивать файлы
|
|