Модостроение. Спавн и логика
|
|
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 за это полезное сообщение: |
|
|
gamer | Дата: Ср, 31.07.2013, 23:52 | Сообщение # 556 |
Новичок
Пользователи
Сообщений: 82
| Пробую заспавнить монстров другим способ,не получатса ,подскажите кте косяк
[cut noguest=all.spawn][20000] ; cse_abstract properties section_name = smart_terrain name = zat_b216_mon position = 247.16491699219,18.105577468872,527.29174804688 direction = -0.61985343694687,0,-0.7847176194191
; cse_alife_object properties game_vertex_id = 292 distance = 0.699999988079071 level_vertex_id = 1388877 object_flags = 0xffffff3e custom_data = <<END [smart_terrain] cfg = scripts\zaton\smart\zat_b216_mon.ltx
END
; cse_shape properties shapes = shape0 shape0:type = sphere shape0:offset = 0,0,0 shape0:radius = 2
; cse_alife_space_restrictor properties restrictor_type = 3
; se_smart_terrain properties
[/cut]
[cut noguest=zat_b216_mon][smart_terrain];zat_b216_mon squad_id = 16 max_population = 16 respawn_params = respawn@zat_b216_mon
[respawn@zat_b216_mon] spawn_tushkano
[spawn_tushkano] spawn_squads = zat_m1_squad spawn_num = 16 [/cut]
[cut noguest=squad_descr_zaton] [zat_m1_squad]:online_offline_group faction = monster npc = rat_normal, rat_normal, rat_normal, rat_normal, rat_normal, rat_normal, rat_normal, karlik_normal, karlik_normal, karlik_normal, karlik_normal, karlik_normal, tushkano_normal, tushkano_normal, tushkano_normal, tushkano_normal target_smart = zat_b216_mon spawn_point = zat_b216_mon_1_spawn story_id = zat_m1_squad[/cut]
[cut noguest=simulation_objects_props][zat_m1_squad]:default_squad sim_avail = true[/cut]
[cut noguest=simulation] zat_m1_squad = zat_b216_mon[/cut]
|
|
|
Эти 0 пользователя(ей) поблагодарили gamer за это полезное сообщение: |
|
|
makdm | Дата: Чт, 01.08.2013, 00:25 | Сообщение # 557 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| gamer, spawn_num = 16 Это не количество НПС, а количество сквадов. Зачем Вам 16 сквадов по 16 НПС в каждом? Это же относится и к max_population = 16
Терпение...... И все получится!
Сообщение отредактировал makdm - Чт, 01.08.2013, 00:27 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
sergej5500 | Дата: Чт, 01.08.2013, 18:07 | Сообщение # 558 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый День. Делаю квест для СГМ 2.1 на зачистку ВНЗ Круг от Альфы. [cut=Типовая логика альфовца.][logic] active = move@walking on_death = death
[death] on_info = %+zat_b38_alfa1_death%
[move@walking] move_dest_number = 206665 move_state_when_center = guard move_state_when_move = walk move_look_vertex = 246485 meet = meet
[meet] abuse = true use = {!actor_enemy} true, false allow_break = true meet_on_talking = false[/cut] Всего там этих альфовцев 30. Их ID: zat_b38_alfa1, zat_b38_alfa2 и т.д. Хочу сделать квест на зачистку ВНЗ при помощи группы сталкеров по типу квестов на зачистку баз Чапая и Киборга. ID сталкеров штурмовой группы zat_b38_stalker1, zat_b38_stalker2 и т.д. Всего 12. В СГМ 2.1 сталкеры и альфа изначально нейтральны друг другу. Автор мода для этих квестов использовал специальные группировки сталкеров: army_alies и stalker_alies, которые враждебны бойцам Чапая и Киборга. Вопрос: можно ли в логике или через скрипт прописать взаимную враждебность носителей определённого ID (zat_b38_alfa** и zat_b38_stalker**) после прихода определенной инфопорции. Про настройку отношений группировок через скрипт я знаю. Этот метод полностью ссорит группировки, что нежелательно. Здесь нужна именно враждебность двух групп при общей нейтральности отношений между группировками. Новую группировку добавлять пока не хочется. Можно ли решить эту задачу? Заранее благодарен за советы.
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
FantomICW | Дата: Чт, 01.08.2013, 18:53 | Сообщение # 559 |
Лидер «Свободы»
Свобода
Сообщений: 4438
| sergej5500, я бы пробовал использовать функции из game_relations.script. В частности, set_npcs_relation, set_squad_goodwill_to_npc, set_squad_community_goodwill
Сообщение отредактировал FantomICW - Чт, 01.08.2013, 18:53 |
|
|
Эти 0 пользователя(ей) поблагодарили FantomICW за это полезное сообщение: |
|
|
sergej5500 | Дата: Чт, 01.08.2013, 20:11 | Сообщение # 560 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| FantomICW, Спасибо за подсказку. Нашел для данной цели более-менее подходящую функцию: set_relation_between(obj1,obj2,type). Сделал для тестов двух сталкеров. [cut=Спавн-секция.][zat_test_stalker1]:stalker $spawn = "respawn\zat_test_stalker1" character_profile = respawn_easy_stalker spec_rank = master community = stalker story_id = zat_test_stalker1 can_be_wounded = false custom_data = scripts\zat_test_stalker1.ltx [zat_test_stalker2]:stalker $spawn = "respawn\zat_test_stalker2" character_profile = respawn_easy_stalker spec_rank = master community = stalker story_id = zat_test_stalker2 can_be_wounded = false custom_data = scripts\zat_test_stalker2.ltx[/cut] [cut=Логика] 1 сталкер. [logic] active = move@walking on_death = death
[move@walking] move_dest_number = 370626 move_state_when_center = guard move_state_when_move = walk move_look_vertex = 336453 meet = meet
[meet] abuse = true use = {!actor_enemy} true, false allow_break = true meet_on_talking = false
2 сталкер. [logic] active = move@walking on_death = death
[move@walking] move_dest_number = 336453 move_state_when_center = guard move_state_when_move = walk move_look_vertex = 370626 meet = meet
[meet] abuse = true use = {!actor_enemy} true, false allow_break = true meet_on_talking = false[/cut]
[cut=ui_main_menu.scripts]elseif db.actor~=nil and dik==DIK_keys.DIK_V then create("zat_test_stalker1",-287.97134399414,13.446946144104,622.3046875,370626,33) create("zat_test_stalker2",-306.00772094727,17.248880386353,621.38940429688,336453,33) elseif db.actor~=nil and dik==DIK_keys.DIK_B then set_relation_between("zat_test_stalker1","zat_test_stalker2","e")[/cut] При нажатии на клавишу V сталкеры спавнятся и смотрят друг на друга. После нажатия на B следует [cut=FATAL ERROR]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 : ...ogram files 1\Зов Припяти\gamedata\scripts\_g.script:2890: attempt to call method 'set_relation' (a nil value)[/cut] [cut=Функция из g_scripts] -- 'Установка отношений одного обьекта к другому. function set_relation_between(obj1,obj2,type) if type==nil or type=="enemy" or type=="e" then obj1:set_relation(game_object.enemy,obj2) elseif type=="friend" or type=="f" then obj1:set_relation(game_object.friend,obj2) elseif type=="neutral" or type=="n" then obj1:set_relation(game_object.neutral,obj2) end end[/cut] Как надо прописывать функцию, чтобы не вылетало? Как прописать одной функцией изменение отношений группы сталкеров с однотипными ID: конкретно zat_b38_alfa** и zat_b38_stalker**. Заранее благодарен за советы.
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
makdm | Дата: Чт, 01.08.2013, 20:28 | Сообщение # 561 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| sergej5500, поссорьте их между собой. Попробуйте сделать так:
в логике
zat_b38_alfa_1 сталкера пропишите
on_info = %=make_enemy(zat_b38_stalker_1)%
а в логике zat_b38_stalker_1 сталкера пропишите
on_info = %=make_enemy(zat_b38_alfa_1)%
Аналогично можно перессорить всех НПС в сквадах.
Можно использовать также функцию hit_obj из файле xr_effects.script
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
strelok200 | Дата: Чт, 01.08.2013, 22:09 | Сообщение # 562 |
Бывалый
Свобода
Сообщений: 126
| Народ, у меня сквад без причины удалился, первый раз такое, ничего не редактировал
|
|
|
Эти 0 пользователя(ей) поблагодарили strelok200 за это полезное сообщение: |
|
|
sergej5500 | Дата: Чт, 01.08.2013, 23:31 | Сообщение # 563 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| makdm, Попробовал Ваше предложение на тестовых сталкерах. Вписал им в логику соответственно: 1-му on_info = %=make_enemy(zat_test_stalker2)% 2-му on_info = %=make_enemy(zat_test_stalker1)%
Результат нулевой. Стоят, смотрят друг на друга, драться не хотят. Со второй функцией та же история. Для пробы заспавнил рядом с ними бандита. Общими усилиями сталкеры его завалили.
strelok200, О каком скваде идёт речь?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
makdm | Дата: Пт, 02.08.2013, 00:45 | Сообщение # 564 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| sergej5500, тогда на время зачистки сделайте их группировки врагами, а после зачистки, снова восстановите нейтралитет.
Функция для смены отношений есть в файле game_relations.script Сама функция set_factions_community
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
denis2000 | Дата: Пт, 02.08.2013, 09:24 | Сообщение # 565 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| sergej5500, Сделать сквады врагами set_squads_enemies из xr_effects, в качестве аргумента стори_ид двух сквадов.
strelok200, С чего вы взяли, что без причины?
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
sergej5500 | Дата: Пт, 02.08.2013, 17:55 | Сообщение # 566 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| denis2000, Спасибо за подсказку. Команда set_squads_enemies работает неплохо. Но её можно применять только к сквадам. Вопрос, есть ли эквивалентная функция для несквадовых НПС. Пробовал использовать функцию: -- 'Установка отношений одного обьекта к другому. function set_relation_between(obj1,obj2,type). Если написать код типа: elseif db.actor~=nil and dik==DIK_keys.DIK_B then set_relation_between("zat_test_stalker1","zat_test_stalker2","e") то следует вылет. Функция есть в СГМ и упоминается в сборнике Хована. Вопрос, как её правильно применять к конкретным НПС в файле логики или скрипте? Можно ли показать пример кода с этой функцией?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Пт, 02.08.2013, 18:54 | Сообщение # 567 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| sergej5500, Там-же make_enemy, применение из рестриктора: Код %=make_enemy(NPC_1:NPC_2)% NPC_1 становиться врагом NPC_2 Или при вызове из логики НПС: NPC становиться врагом, тому НПС из логики которого вызвана функция
Естественно NPC_1, NPC_2, NPC - это стори-ид персонажей.
[off]PS: Изучайте xr_effects.script и xr_conditions.script, там очень много полезных функций в том числе закоментированных![/off]
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
sergej5500 | Дата: Пт, 02.08.2013, 19:03 | Сообщение # 568 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| denis2000, Есть ли возможность обобщить функцию? Для конкретного квеста придётся в логику каждому сталкеру писать код типа: on_info = %=make_enemy(zat_b38_stalker1:zat_b38_alfa1) =make_enemy(zat_b38_stalker1:zat_b38_alfa2) =make_enemy(zat_b38_stalker1:zat_b38_alfa3) ... % Можно ли написать обобщение кода для 12-сталкеров и 30 альфовцев?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Пт, 02.08.2013, 19:12 | Сообщение # 569 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| sergej5500, Проще сделать их конечно сквадами и поссорить, но можно и свою функцию написать, какую угодно.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
makdm | Дата: Сб, 03.08.2013, 00:08 | Сообщение # 570 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата (sergej5500) Есть ли возможность обобщить функцию? Можно обобщить, как я и советовал, через вражду группировок. Например начинаем воевать, когда сталкеры сблизились на расстояние 50 метров. В логике одного из альфовцев пишем on_info = {-поршень =dist_between_npc_and_obj_le(zat_b38_stalker_1:50)} %+поршень =set_faction_enemy_to_faction(army_alies:stalker_alies)%
После того, как война закончится и сталкеры победят с помощью ГГ нужно восстановить нейтралитет. Для этого найдите активную секцию любого рестриктора и в ней напишите
on_info = {-поршень =all_zat_b38_alfa_dead} %+поршень =set_faction_neutral_to_faction(army_alies:stalker_alies)%
Теперь сами функции
[cut noguest=Функции]В xr_effects пишем
function set_faction_neutral_to_faction(actor, npc, p) local faction = p[1] local faction_to = p[2] local neutral = 0 if faction_to and faction then relation_registry.set_community_relation( faction, faction_to, neutral ) else abort("Wrong parameters in function 'set_faction_neutral_to_faction'") end end function set_faction_enemy_to_faction(actor, npc, p) local faction = p[1] local faction_to = p[2] local enemy = -5000 if faction_to and faction then relation_registry.set_community_relation( faction, faction_to, enemy ) else abort("Wrong parameters in function 'set_faction_enemy_to_faction'") end end
В xr_conditions пишем Надеюсь, что при гибели альфовцев выдаются однотипные инфопоршни zat_b38_alfa1_death, zat_b38_alfa2_death и т.д.
function all_zat_b38_alfa_dead(actor, obj) for i = 1,30 do local infopor = "zat_b38_alfa"..i.."_death" if not has_alife_info(infopor) then return false end end return true end
function dist_between_npc_and_obj_le(actor, npc, p) local npc1 = get_story_object( p[1] ) local d = p[2] if npc1 then return d and npc:position():distance_to_sqr(npc1:position()) <= d * d end end [/cut]
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
|