Создание объектов на локации и логика поведения этих объектов
Если у вас появились вопросы по созданию динамических объектов в игре (НПС, монстры, аномалии, и т.п.) и настройке их "поведения". Задавайте их в этой теме - умные головы, модосторители и просто разбирающиеся в программировании люди вам ответят.
Сборник модостроения ЗП v10.10.11 (автор: XOBAH): *.CHM, *.HTML [cut noguest=Если у вас не открывается файл CHM]Если у вас не открывается файл: 1. Запустите [Пуск]=>[Выполнить] (либо хот-кей [WIN]+[R]) 2. Введите команду (без кавычек) "regsvr32 %windir%\system32\hhctrl.ocx" 3. Если вылезло окно об успешном завершении вы все сделали правильно и можете перезагружать компьютер (а может и не надо) Также: файлы МОГУТ не открываться если в пути к файлу есть: символы кириллицы, "_", "#" Также: есть не стандартные программы-просмоторщики CHM файлов. Например: FBReader[/cut]
[cut=Где найти лог игры после вылета]Что такое LOG ошибки, и как мне его найти? Это система отладки происходивших вылетов, которая подается игрой в форме текста, хотя не всегда. Для того чтоб найти LOG необходимо зайти вот сюда:
В Win хр лог находится:
C:\Documents and Settings\All Users\Документы\S.T.A.L.K.E.R. - Зов Припяти\logs
Затем открываете первый файл в формате TXT, и в нем отбираете с низу 25 строчек. После кидаете эти 25 строчек в сообщение на форум.
В Win7 лог находится C:\Users\Public\Documents\S.T.A.L.K.E.R. - Зов Припяти\logs
Путь к папке с логом можно найти открыв файл fsgame.ltx который находится в корневой директории ЗП, за это отвечает строка: ... $app_data_root$ = true | false| $fs_root$| users\(тут мы указываем что папка пользователя, будет хранится рядом с Fsgame.ltx) ... $logs$ = true| false| $app_data_root$| logs\(а тут мы указываем что в папке пользователя, в подпапке Logs будут храниться наши логи) ... [/cut][cut=Получение более подробной информации о вылете (ХОВАН)] Открываем файл _g.script и ищем такую функцию: function abort(fmt, ...) Там есть заккомментированная строчка "--error_log(reason)", ее и надо расскомментировать, должно получиться вот так:
Code
function abort(fmt, ...) local reason = string.format(fmt, ...) error_log(reason) end
Вот для примера два одинаковых вылета, первый с функцией по умолчанию, второй - с поправленной функцией
Первый:
Code
Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : ....a.l.k.e.r. - Зов Припяти\gamedata\scripts\_g.script:478: bad argument #2 to 'format' (string expected, got nil)
Второй:
Code
Expression : 0 Function : ErrorLog File : D:\prog_repository\sources\trunk\xrServerEntities\script_engine_script.cpp Line : 49 Description : 'Attempt to read a non-existant string field 'path_walk' in section 'walker@mechanic'
[/cut]
Перед тем, как задать вопрос в этой теме, прочтите все предыдущие страницы, статьи в wiki по ссылке из шапки и соседнюю тему "Курс молодого бойца", возможно Ваш вопрос уже рассматривался.
Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки. Помните чем подробнее вопрос, тем точнее ответ.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение:
Добрый вечер. Можно ли решить такую задачу. Имеются НПС. Стори ИД (zat_b38_alfa1,zat_b38_alfa2,zat_b38_alfa3 и т.д.). Всего 30 НПС. Можно ли составить функцию для xr_conditions для подсчета кол-ва живых НПС из этого списка?
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение:
FantomICW, Я пытаюсь оптимизировать свое дополнение. 30 НПС - это Альфа на ВНЗ. Это индивидуальные НПС с кастом-датой. У каждого своя инфопорция смерти. Необходимо обеспечить респавн этих НПС. При каждом приближении ГГ к ВНЗ их должно быть 30 штук. Ранее использовал такую логику рестриктора спавна.
Теперь спавн происходит при приближении игрока на 280 к рестриктору. Одновременно сбрасываются все инфопорции смерти. При удалении на 350 метров от ВНЗ вся компания убирается с локации. При повторном приближении спавн повторяется. Теперь рестриктор отслеживает только дистанции до ГГ. Инфопорции смерти проверяются только при начале штурма по квесту. Собственно вопрос, можно ли подсчитать кол-во живых НПС из этой компании и отказаться от проверки инфопорций смерти.
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение:
sergej5500, если нужен счетчик, то нужно его для начала установить:
Код
%=set_counter(название_счетчика:30)%
Дальше, вот, можно попробовать такую функцию:
Код
function alfa_death_check() for i = 1,30 do if has_alife_info("zat_b38_alfa"..tostring(i).."_death") and not has_alife_info("zat_b38_alfa"..tostring(i).."_death_counted") then xr_effects.dec_counter(actor, nil, {"название_счетчика", 1}) give_info("zat_b38_alfa"..tostring(i).."_death_counted") end end end
А там уже делать проверку через функции из xr_conditions.script в роде counter_equal.
Добавлено (14.02.2014, 21:48) --------------------------------------------- Если делать по такому методу, то по идее с каждым убитым альфовцем счетчик будет уменьшаться на 1. Итого, можно сделать проверки на количество счетчика (=, >, < заданного числа). В конце, при респавне придется дизейблить инфопорции zat_b38_alpha#_death и zat_b38_alpha#_death_counted.
Эти 0 пользователя(ей) поблагодарили FantomICW за это полезное сообщение:
Недостаток в том, что после старта НИ и до начала штурма по квесту отслеживаются 30 инфопорций смерти
А зачем вы их отслеживаете до начала квеста? Пропишите в рестрикторе секцию, которая "ждёт" начала квеста. После начала квеста делаете спавн НПС и начинаете отслеживать их гибель.
Если необходимо, чтобы НПС присутствовали до начала квеста на локации, тогда вообще забудьте об отслеживании. А вот при выдаче квеста сделайте из рестриктора проверку на количество НПС и доспавните тех, кого не хватает и включите проверку на их гибель. Терпение...... И все получится!
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение:
function clean_zat_b38_alfa(actor,obj) release_items_by_name("zat_b38_alfa") end
При первом подходе к ВНЗ спавн проходил нормально. После удаления и очистки локации от НПС рестриктор переставал работать. Повторного спавна не было. Переделал функцию очистки так.
function clean_zat_b38_alfa(actor,obj) for i = 1,65534 do local object = alife():object(i) if object then if object:section_name() ~= nil then if string.find(object:section_name(),"zat_b38_alfa") then alife():release(alife():object(object.id),true) end end end end end
После этого повторный спавн заработал. Полагаю, что функция release_items_by_name убирала, помимо НПС, рестрикторы, в названиях которых было zat_b38_alfa.
-- 'Удалить все обьекты с указанным именем. function release_items_by_name(find_string) for a=1,65534 do local obj = alife():object(a) if obj then if obj:name()~=nil and string.find(obj:name(),find_string) then local sect=obj:name() remove_item_by_id(obj.id) end end end end
Верно ли это предположение? Если это так, то можно ли составить ф-ию удаления всех объектов, в названиях которых есть zat_b38_alfa, но исключить из удаления рестрикторы и инвентарные ящики с таким названием. Или переделать ф-ию так, чтобы она удаляла только НПС или конкретный объект с конкретным стори-ид.
Добавлено (16.02.2014, 22:26) --------------------------------------------- Добрый вечер. Дополню свой вопрос. Можно ли исправить ф-ию.
-- 'Удалить все обьекты с указанным именем. function release_items_by_name(find_string) for a=1,65534 do local obj = alife():object(a) if obj then if obj:name()~=nil and string.find(obj:name(),find_string) then local sect=obj:name() remove_item_by_id(obj.id) end end end end
При вызове через скрипт, например так, release_items_by_name("zat_b38_alfa"), ф-ия должна убирать не все предметы, в названии которых есть zat_b38_alfa, а только сталкеров, например, или только объекты типа inventory_box.
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение:
sergej5500, зачем изобретать велосипед? Не проще ли переименовать имя рестрикторов? Ну если не хочется, то тогда сделайте проверку является объект сталкером или нет. Функция IsStalker. И проверьте является ли объект ящиком по его clsid. Терпение...... И все получится!
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение:
makdm, Спасибо за совет. Пришел к выводу, что очищать локацию от НПС лучше всего кодом типа. remove_npc(nil,nil,{"zat_b38_alfa1"}) remove_npc(nil,nil,{"zat_b38_alfa2"})
И каждого прописывать индивидуально.
Еще один вопрос. Можно ли функцию destroy_object вызвать через скрипт. Например так. destroy_object("zat_b5_give_task_disel_generator").
Как правильно составить код. Обязательно ли у удаляемого объекта прописывать story_id.
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение:
По замыслу зомби не должны трогать двух конкретных НПС. Эти НПС в СГМ находятся к северу от лесопилки. Зомби убивают этих сталкеров. Почему запрет не действует?
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение:
Я сделал сквады зомби на лесопилке изначально нейтралами к ГГ. После первого выстрела или удаления от лесопилки на 400 метров лесопилка краснеет. Так же добавил еще один сквад и поменял пути зомби. Зомби ходят по новым путям. Думаю, что игра расставляет зомби по работам без ошибок.
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение:
sergej5500, Не работает потому что аргумент функции check_enemy_name, должен быть story_id, а не имя спавн-секции. "Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение:
Итак доброго времени суток форумчанам, У меня тупик при создании смарт_террейна, (если не по теме просьба модераторов поправить,спасибо) Создал smart_terrain для собачек, в количестве 6 шт, логика смарта такова: http://SSMaker.ru/b5e10999/ логика собачек следующая: http://SSMaker.ru/ecfa0d0e/ пути точки прописанны так: http://SSMaker.ru/3241a834/ так как лог звучит как ошибка луа, то есть смарта, вот и просьба моя будет у наших знатоков, подскажите пожалйуста , какая приставка к смарту должна быть для мутантов, на этом форуме уже для НПС подсказали приставка pri для НПс, а вот для мутантов какая приставка, или какая ошибка ?? Помогите пожалуйста понять?Да забыл прописать, для собачек создал вент_пойнт, то есть точки пути, и проложил для каждой собачки свой маршрут, тут: http://SSMaker.ru/1297a461/
Сообщение отредактировал alex_xp_77 - Ср, 05.03.2014, 22:09
Эти 0 пользователя(ей) поблагодарили alex_xp_77 за это полезное сообщение: