Модостроение. Спавн и логика
|
|
denis2000 | Дата: Пн, 10.10.2011, 21:20 | Сообщение # 1 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Спавн и логика Создание объектов на локации и логика поведения этих объектов Если у вас появились вопросы по созданию динамических объектов в игре (НПС, монстры, аномалии, и т.п.) и настройке их "поведения". Задавайте их в этой теме - умные головы, модосторители и просто разбирающиеся в программировании люди вам ответят.
Много интересного материала здесь (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 по ссылке из шапки и соседнюю тему "Курс молодого бойца", возможно Ваш вопрос уже рассматривался.
Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки. Помните чем подробнее вопрос, тем точнее ответ.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
denis2000 | Дата: Сб, 04.02.2012, 11:38 | Сообщение # 76 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Quote (dmitry778) как это может повлиять на основной сюжет? Ты уже его убил спавном в Припяти, теперь переделывай весь сюжет.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
dmitry778 | Дата: Сб, 04.02.2012, 16:42 | Сообщение # 77 |
Советник «Свободы»
Свобода
Сообщений: 727
| denis2000, Quote (dmitry778) И как сделать так что-бы основной сюжет не испортить? Так я вот очем теперь беспакоюсь.
СОВСЕМ НЕ ВАЖНО ОТ ЧЕГО ПОМРЕШЬ - ГОРАЗДО ВАЖНЕЕ ДЛЯ ЧЕГО РОДИЛСЯ.
|
|
|
Эти 0 пользователя(ей) поблагодарили dmitry778 за это полезное сообщение: |
|
|
Romal | Дата: Вс, 12.02.2012, 20:47 | Сообщение # 78 |
Отмычка
Пользователи
Сообщений: 40
| С этим я сам разобрался. Я по вашим инструкциям создал НПС уникального. Прописал ему: [logic] active = move@trad
[move@trad] invulnerable = true combat_ignore_cond = true combat_ignore_keep_when_attacked = true meet = meet_sgm
[meet_sgm] abuse = false allow_break = false ;не разрешаем ему прерывать диалог meet_on_talking = false ; не разрешаем ему начинать разговор trade_enable = true ; разрешаем ему торговать с ГГ close_distance = 5 ; на расстоянии 5 метров от ГГ close_anim = guard_na ; должен встать в позу охранника close_victim = actor use = {=actor_has_weapon} false, true ; не откликнется, если у ГГ нет в руках ствола snd_on_use = {=actor_has_weapon} meet_hide_weapon, nil ; если у ГГ ствол - попросит убрать
Но почему-то он не бессмертный. С первого выстрела убили из СВД. Вроде же всё правильно, почему он ходит, а не стоит и смертным стал?
Возможно он просто не принял логику. XOBAH
|
|
|
Эти 0 пользователя(ей) поблагодарили Romal за это полезное сообщение: |
|
|
STALKER_2010 | Дата: Ср, 22.02.2012, 15:13 | Сообщение # 79 |
Гражданский
Пользователи
Сообщений: 12
| Всем мододелам привет, у меня вопрос насчет спавна. Функция SGM не работает. [cut=Цитата ui_main_menu.script] elseif dik==DIK_keys.DIK_F3 then self:deliver_mp3_and_bonus() elseif dik==DIK_keys.DIK_N then self:give_object_to_actor("nano_1") self:give_object_to_actor("nano_2") self:give_object_to_actor("nano_3") elseif dik==DIK_keys.DIK_P then self:set_rich_actor()[/cut] А зачем ещё 2 параметра? [cut noguest=Цитата FAQ]give_object_to_actor(section,count,news)[/cut] nano_1, nano_2 и nano_3 прописаны везде. Повелитель зоны спавнит без проблем.
1. self: писать не нужно. Функция give_object_to_actor является глобальной 2. give_object_to_actor(section[,count,news]) count - кол-во предметов, news - выводить новость о получении предмета, али нет (по-умолчанию false, т.е нет) XOBAH Спасибо ХОВАН, выручил!
Добавлено (22.02.2012, 15:13) --------------------------------------------- Ох, не работает. [cut noguest=Приведу-ка я всю функцию...]function main_menu:OnKeyboard(dik, keyboard_action) --virtual function CUIScriptWnd.OnKeyboard(self,dik,keyboard_action) local bind = dik_to_bind(dik) local console = get_console() if keyboard_action == ui_events.WINDOW_KEY_PRESSED then if dik == DIK_keys.DIK_ESCAPE then if level.present() and (((db.actor~=nil)and(db.actor:alive())) or (false==IsGameTypeSingle())) then self.OnButton_return_game() end end if dik==DIK_keys.DIK_Q then self:OnMessageQuitWin() elseif dik==DIK_keys.DIK_SUBTRACT then self:screenshot_mode_on() elseif dik==DIK_keys.DIK_ADD then self:screenshot_mode_off() elseif db.actor~=nil and dik==DIK_keys.DIK_F5 then self:mod_options() elseif db.actor~=nil and dik==DIK_keys.DIK_T then self.OnButton_return_game() run_choose_box("yes_or_no","remove_bad_outfit","Удалить текущий бронекостюм?") elseif db.actor~=nil and dik==DIK_keys.DIK_6 then self.OnButton_return_game() level.show_weapon(true) end if db.actor~=nil then if dik==DIK_keys.DIK_0 then self:set_0_factor() elseif dik==DIK_keys.DIK_1 then self:set_1_factor() elseif dik==DIK_keys.DIK_2 then self:set_2_factor() elseif dik==DIK_keys.DIK_3 then self:set_3_factor() elseif dik==DIK_keys.DIK_4 then self:set_4_factor() elseif dik==DIK_keys.DIK_5 then self:set_5_factor() elseif dik==DIK_keys.DIK_F1 then self:mod_modes() elseif dik==DIK_keys.DIK_F2 then if db.actor then self:OnButton_load_spawn() elseif dik==DIK_keys.DIK_F3 then self:deliver_mp3_and_bonus() elseif db.actor~=nil and dik==DIK_keys.DIK_F4 then give_object_to_actor("nano_1",1,true) give_object_to_actor("nano_2",1,true) give_object_to_actor("nano_3",1,true) elseif dik==DIK_keys.DIK_P then self:set_rich_actor() end end end --'Повелитель Зоны 5.0'-- god.key_binder(dik, keyboard_action, self) --'Повелитель Зоны 5.0'-- end return true end[/cut] Не спавнится, нет новости... Может где-то недостающий end?
А что-же вы сюда то вставили!? Инструкцию читали? От балды скрипт пишете, а потом заявления:"Функция SGM не работает." denis2000 КМБ? Читал. А по какой причине закидали тапками? Не от балды, а для наработки. Ну не сработала. У меня появляется вопрос: "Почему?". Причину не вижу.
Сообщение отредактировал STALKER_2010 - Ср, 22.02.2012, 17:44 |
|
|
Эти 0 пользователя(ей) поблагодарили STALKER_2010 за это полезное сообщение: |
|
|
denis2000 | Дата: Ср, 22.02.2012, 21:42 | Сообщение # 80 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| STALKER_2010, Почему закидали? Мои тапки на мне. Если для наработки, а не от балды объясните каким образом этот код вообще может сработать (ну по вашему не сработал так не сработал, но на что вы рассчитывали). В этом и причина - такой код никогда не сработает.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
Policai | Дата: Чт, 23.02.2012, 08:25 | Сообщение # 81 |
Удаленные
| Народ!!!! Нужна помощь гуру!
Анимация - дверь сдвигающаяся всторону, 1 кость, сдвиг вправо на 1.5 метра, 3 секунды пауза и сдвиг обратно на место.(Самодельный обьект, ставлю через спавн, в сдк анимация работает) В кустом дата прописана ссылка на логику, с текстом:
[cut noguest=Дверь][collide] ignore_static
[animated_object][/cut]
Пульт взят с лабы х-8 в припяти, с родной логикой, я просто изменил на своё название анимации, спейса и смарта:
[cut noguest=Пульт][logic] active = ph_button@no_card
[ph_button@no_card] anim = idle tooltip = tip_no_access_card on_info = {=actor_has_item(zat_a23_labx8_key)} ph_button@has_card
[ph_button@has_card] anim = idle tooltip = tip_need_access_card on_press = ph_button@unlocked on_info = {!actor_has_item(zat_a23_labx8_key)} ph_button@no_card
[ph_button@unlocked] anim = idle tooltip = st_lx8_button_press_true on_game_timer = 20 | {-lx8_door_open} %+lx8_door_open =anim_obj_forward(lim_door_laba_hide)% on_game_timer2 = 10 | {-lx8_green_on} %+lx8_green_on =turn_off(lx8_light_switch_1_red_id) =turn_on(lx8_light_switch_1_green_id)% on_info = {=actor_in_zone(lim_sr_actor_in_lab) -lim_actor_in_lab} %+lim_actor_in_lab =create_squad(lx8_polter_squad:lim_smart_terrain)%[/cut]
Всё проходит до запуска анимации, то есть без карты требует карту доступа, с картой появляется сообщение доступ разрешён, потом завис на 3-4 секунды, (в этот момент должна отработать анимация), и вылет с жалобой:
[cut noguest=Лог]FATAL ERROR [error]Expression : !m_error_code [error]Function : raii_guard::~raii_guard [error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp [error]Line : 748 [error]Description : ....r. - Зов Припяти\gamedata\scripts\xr_effects.script:1317: attempt to index field '?' (a nil value) stack trace:[/cut]
Понимаю что это всё туфта, просто я в скриптах ноль, и пытаюсь разобраться методом тыка.
xr_effects родной нетронутый. Подскажите куда ткнуться, или хотя бы где почитать тутор .....
|
|
|
Эти 0 пользователя(ей) поблагодарили Policai за это полезное сообщение: |
|
|
denis2000 | Дата: Чт, 23.02.2012, 11:29 | Сообщение # 82 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Policai, Движек не может найти объект к которому нужно применить функцию anim_forward() (Проверил эксперементально!)
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
Policai | Дата: Чт, 23.02.2012, 11:38 | Сообщение # 83 |
Удаленные
| Quote косяк в анимации двери, сверяй имя анимации и ее параметры.
Само собой это другая анимация, она и не может совпадать, ни по имени ни по костям, мне и нужно узнать как запустить некую анимацию по некой команде....
Хотелось бы увидеть содержимое all.spawn. denis2000
|
|
|
Эти 0 пользователя(ей) поблагодарили Policai за это полезное сообщение: |
|
|
denis2000 | Дата: Сб, 25.02.2012, 17:58 | Сообщение # 84 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Теган, В all.spawn посмотри [cut][107] ; cse_abstract properties section_name = helicopter name = esc_heli position = -317.183898925781,16.3679752349854,83.289665222168 direction = 0,-1.47526597976685,0
; cse_alife_object properties game_vertex_id = 0 distance = 0 level_vertex_id = 594270 object_flags = 0xfffffffa custom_data = <<END [logic] active = heli_move@idle
[heli_move@idle] path_move = heli_idle_move engine_sound = false on_info = {+esc_heli_go} heli_move@fly combat_safe_altitude = -50
[heli_move@fly] path_move = heli_fly on_signal = heli_radio| %+esc_heli_direct% on_signal2 = fly_end| heli_move@patrol combat_safe_altitude = -50
[heli_move@patrol] path_move = heli_sleep on_signal = heli_sig| heli_move@sleep combat_safe_altitude = -50 invulnerable = true mute = true
[heli_move@sleep] path_move = heli_sleep2 engine_sound = false combat_safe_altitude = -50 END story_id = 14
; cse_visual properties visual_name = physics\vehicles\mi24\veh_mi24_u_01
; cse_motion properties motion_name = helicopter\aaa.anm
; cse_ph_skeleton properties skeleton_name = idle
; cse_alife_helicopter properties cse_alife_helicopter__unk1_sz = idle engine_sound = alexmx\helicopter
[/cut]
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
denis2000 | Дата: Сб, 25.02.2012, 22:23 | Сообщение # 85 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Quote (Теган) не бьет никого и летит дальше Цель для вертолета задается параметром combat_enemy Quote (Теган) как надо настроить чтоб он просто перелетел с одного места в другое и остался там Путь должен быть не замкнутым. Quote (Теган) как сделать чтоб он все время был в универсальной боевой схеме и атаковал какого либо нпс См. первый ответ.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
Wall-e | Дата: Чт, 01.03.2012, 22:31 | Сообщение # 86 |
Гражданский
Пользователи
Сообщений: 14
| S.T.A.L.K.E.R. Call of Pripyat 1.6.02 + Sigerous Mod 2.1 Всем доброго времени суток. У нас проблема как сделать завербованного мутанта бессмертным, и его можно было уволить. А дикие оставались уязвимыми
Ничего не получается Помогите кто нибуть аааааааааа!
Сообщение отредактировал Wall-e - Вт, 06.03.2012, 23:13 |
|
|
Эти 0 пользователя(ей) поблагодарили Wall-e за это полезное сообщение: |
|
|
denis2000 | Дата: Чт, 01.03.2012, 23:13 | Сообщение # 87 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Wall-e, У завербованных мутантов есть общая секция [captured_monster] в файле m_addition_monsters.ltx можно попробовать создать там секцию имцнитетов (соответственно с нулевыми воздействиями), но возможно после того как их отпустишь они останутся неуязвимы.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
Тамерлан | Дата: Ср, 07.03.2012, 22:14 | Сообщение # 88 |
Удаленные
| Здравствуйте. Подскажите пожалуйста по логике рестрикторов. Хочется сделать выполнение своей функции при выходе ГГ из рестриктора и желательно через некоторое время (сек 10, на пример). Заранее благодарен.
|
|
|
Эти 0 пользователя(ей) поблагодарили Тамерлан за это полезное сообщение: |
|
|
denis2000 | Дата: Ср, 07.03.2012, 22:50 | Сообщение # 89 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Тамерлан, Пробуй нечто такое в логике рестриктора: Code [logic] active = sr_idle@start
[sr_idle@start] on_actor_inside = sr_idle@wait_out ; ожидаем вход ГГ в рестриктор
[sr_idle@wait_out] on_actor_outside = sr_idle@wait_function ; ожидаем выход ГГ из рестриктора
[sr_idle@wait_function] on_game_timer = 100 | sr_idle@end %=run_function% ; запускаем через 100 игровых секунд функцию run_function
[sr_idle@end] ;рестриктор более не активен
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
Тамерлан | Дата: Пт, 09.03.2012, 17:49 | Сообщение # 90 |
Удаленные
| denis2000, Спасибо. Примерно понял что к чему, но остался вопрос: как правильно написать Quote (denis2000) %=run_function% Если написать как %=имя_скрапта.имя_функции%, то вылет с ошибкой в xr_logic.script... Заранее благодарен.
run_function берется только из файла scripts\xr_effects.script XOBAHДобавлено (09.03.2012, 17:49) --------------------------------------------- XOBAH, понятно, вот Тут я спрашивал как раз о выполнении своей функции. Есть какой-нибудь способ это реализовать? з.ы. Попутный вопрос, а можно "изменить время"? т.е. на пример, было 9-30 утра, а стало 9-40. з.ы.ы. denis2000, Большое спасибо за логику рестриктора. Заранее благодарен.
|
|
|
Эти 0 пользователя(ей) поблагодарили Тамерлан за это полезное сообщение: |
|
|
|