Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: denis2000, FantomICW  
Модостроение. Спавн и логика
denis2000Дата: Пн, 10.10.2011, 21:20 | Сообщение # 1
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Спавн и логика

Создание объектов на локации и логика поведения этих объектов

Если у вас появились вопросы по созданию динамических объектов в игре (НПС, монстры, аномалии, и т.п.) и настройке их "поведения". Задавайте их в этой теме - умные головы,
модосторители и просто разбирающиеся в программировании люди вам ответят.


Много интересного материала здесь (wiki), Lua_help.script, Help из SDK 0.7

Сборник модостроения ЗП 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 по ссылке из шапки и соседнюю тему "Курс молодого бойца",
возможно Ваш вопрос уже рассматривался.


Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки.
Помните чем подробнее вопрос, тем точнее ответ.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
sergej5500Дата: Пт, 14.02.2014, 19:59 | Сообщение # 826
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый вечер. Можно ли решить такую задачу.  Имеются НПС.  Стори ИД (zat_b38_alfa1,zat_b38_alfa2,zat_b38_alfa3 и т.д.). Всего 30 НПС.  Можно ли составить функцию для xr_conditions  для подсчета кол-ва живых НПС из этого списка?
 
FantomICWДата: Пт, 14.02.2014, 20:34 | Сообщение # 827
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

sergej5500, а у этих НПС есть своя логика или свой отдельный сквад?


 
sergej5500Дата: Пт, 14.02.2014, 20:49 | Сообщение # 828
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

FantomICW
Я пытаюсь оптимизировать свое дополнение.  30 НПС - это Альфа на ВНЗ.  Это индивидуальные НПС с кастом-датой. У каждого своя инфопорция смерти.  Необходимо обеспечить респавн этих НПС. При каждом приближении ГГ к ВНЗ их должно быть 30 штук.  Ранее использовал такую логику рестриктора спавна.


Недостаток в том, что после старта НИ и до начала штурма по квесту отслеживаются 30 инфопорций смерти.  Опробовал такой вариант рестриктора.


Теперь спавн происходит при приближении игрока на 280 к рестриктору. Одновременно сбрасываются все инфопорции смерти. При удалении на 350 метров от ВНЗ вся компания убирается с локации. При повторном приближении спавн повторяется. Теперь рестриктор отслеживает только дистанции до ГГ.  Инфопорции смерти проверяются только при начале штурма по квесту.  Собственно вопрос, можно ли подсчитать кол-во живых НПС из этой компании и отказаться от проверки инфопорций смерти.
 
FantomICWДата: Пт, 14.02.2014, 21:48 | Сообщение # 829
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

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.



 
makdmДата: Сб, 15.02.2014, 00:11 | Сообщение # 830
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата sergej5500 ()
Недостаток в том, что после старта НИ и до начала штурма по квесту отслеживаются 30 инфопорций смерти

А зачем вы их отслеживаете  до начала квеста? Пропишите в рестрикторе секцию, которая "ждёт" начала квеста. После начала квеста делаете спавн НПС и начинаете отслеживать их гибель.

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


Терпение......
И все получится!
 
sergej5500Дата: Вс, 16.02.2014, 22:26 | Сообщение # 831
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый день.  Возник следующий вопрос.  Создал рестриктор.



Функции в xr_effects



При первом подходе к ВНЗ спавн проходил нормально. После удаления и очистки локации от НПС рестриктор переставал работать.  Повторного спавна не было. Переделал функцию очистки так.


После этого повторный спавн заработал. Полагаю, что функция release_items_by_name  убирала, помимо НПС, рестрикторы, в названиях которых было zat_b38_alfa.


Верно ли это предположение?  Если это так, то можно ли составить ф-ию удаления всех объектов, в названиях которых есть zat_b38_alfa, но исключить из удаления рестрикторы и инвентарные ящики с таким названием. Или переделать ф-ию так, чтобы она удаляла только НПС или конкретный объект с конкретным стори-ид.

Добавлено (16.02.2014, 22:26)
---------------------------------------------
Добрый вечер. Дополню свой вопрос. Можно ли исправить ф-ию.


При вызове через скрипт, например так,  release_items_by_name("zat_b38_alfa"),  ф-ия должна убирать не все предметы, в названии которых есть zat_b38_alfa,  а только сталкеров, например, или только объекты типа inventory_box.
 
makdmДата: Вс, 16.02.2014, 22:35 | Сообщение # 832
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

sergej5500, зачем изобретать велосипед?
Не проще ли переименовать имя рестрикторов?
Ну если не хочется, то тогда сделайте проверку является объект сталкером или нет. Функция IsStalker.
И проверьте является ли объект ящиком по его clsid.


Терпение......
И все получится!
 
sergej5500Дата: Вс, 16.02.2014, 23:25 | Сообщение # 833
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

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.
 
makdmДата: Пн, 17.02.2014, 22:49 | Сообщение # 834
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата sergej5500 ()
Например так. destroy_object("zat_b5_give_task_disel_generator").
Так нельзя.
А вот так можно:

destroy_object( db.actor,  nil,  {"story", "zat_b5_give_task_disel_generator"} )

Цитата sergej5500 ()
Обязательно ли у удаляемого объекта прописывать story_id
Обязательно. Если не указать, то  функция не найдёт объект, который необходимо удалить.


Терпение......
И все получится!
 
sergej5500Дата: Вс, 02.03.2014, 01:28 | Сообщение # 835
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый вечер. Прописал зомби с лесопилки такую логику.

[cut=Логика][hit]
on_info = {=hit_by_actor -zat_b104_zombied_enemy} %+zat_b104_zombied_enemy =set_squad_goodwill(zat_b104_zombied_1:enemy) =set_squad_goodwill(zat_b104_zombied_2:enemy) =set_squad_goodwill(zat_b104_zombied_3:enemy) =set_squad_goodwill(zat_b104_zombied_4:enemy)%

[death]
on_info = {=killed_by_actor -zat_b104_zombied_enemy} %+zat_b104_zombied_enemy =set_squad_goodwill(zat_b104_zombied_1:enemy) =set_squad_goodwill(zat_b104_zombied_2:enemy) =set_squad_goodwill(zat_b104_zombied_3:enemy) =set_squad_goodwill(zat_b104_zombied_4:enemy)%

[logic@zat_b104_zombied_1_1]
active = walker@walker_1_1
suitable = {=target_squad_name(zat_b104_zombied_1)} true
prior = 200
on_hit = hit
on_death = death

[walker@walker_1_1]
path_walk = 1_roam_1_walk
path_look = 1_roam_1_look
def_state_moving = walk
def_state_standing = guard_chasovoy
combat_ignore_cond = {=check_enemy_name(zat_postman_stalker)} true, {=check_enemy_name(zat_accompany_stalker)} true, false[/cut]

По замыслу зомби не должны трогать двух конкретных НПС. Эти НПС в СГМ находятся к северу от лесопилки. Зомби убивают этих сталкеров. Почему запрет не действует?
 
FantomICWДата: Вс, 02.03.2014, 01:33 | Сообщение # 836
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

sergej5500, вечер добрый. А зомби логику саму принимают?


 
sergej5500Дата: Вс, 02.03.2014, 01:52 | Сообщение # 837
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

FantomICW,

Я сделал сквады зомби на лесопилке изначально нейтралами к ГГ. После первого выстрела или удаления от лесопилки на 400 метров лесопилка краснеет. Так же добавил еще один сквад и поменял пути зомби. Зомби ходят по новым путям. Думаю, что игра расставляет зомби по работам без ошибок.
 
denis2000Дата: Вс, 02.03.2014, 13:59 | Сообщение # 838
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, Не работает потому что аргумент функции check_enemy_name, должен быть story_id, а не имя спавн-секции.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
alex_xp_77Дата: Вс, 02.03.2014, 13:59 | Сообщение # 839
Научный сотрудник.
Ученые сталкеры
Сообщений: 242
Награды: 6
Репутация: [ 41 ]

Итак доброго времени суток форумчанам, У меня тупик при создании смарт_террейна, (если не по теме просьба модераторов поправить,спасибо) Создал 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
 
strelok200Дата: Чт, 06.03.2014, 13:01 | Сообщение # 840
Бывалый
Свобода
Сообщений: 126
Награды: 0
Репутация: [ 33 ]

Подскажите пожалуйста основную суть катсцен с участием ГГ и НПС, желательно на примере
 
Поиск: