|
Модостроение. Спавн и логика
|
|
| 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 за это полезное сообщение: |
|
|
| NIV | Дата: Ср, 31.07.2013, 18:32 | Сообщение # 541 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 167
| FantomICW, а ссылочку дадите?
Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
|
| |
|
| Эти 0 пользователя(ей) поблагодарили NIV за это полезное сообщение: |
|
|
| denis2000 | Дата: Ср, 31.07.2013, 18:34 | Сообщение # 542 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| NIV, Указанная тобой функция помимо всего возвращает в качестве результата объект который создала, а ему можно задать угол. Для физического объекта: Код local se_obj = alife():create(***) se_obj:set_yaw(yaw * math.pi / 180) Для сталкера: Код se_obj:o_torso().yaw = yaw * math.pi / 180 где yaw - угол поворота объекта в градусах.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| NIV | Дата: Ср, 31.07.2013, 18:39 | Сообщение # 543 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 167
| denis2000, спасибо, счас попробуем. А вокруг какой оси этот угол? Их же 3.
Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
|
| |
|
| Эти 0 пользователя(ей) поблагодарили NIV за это полезное сообщение: |
|
|
| denis2000 | Дата: Ср, 31.07.2013, 18:41 | Сообщение # 544 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| NIV, Вокруг Y естественно, для вращения по другим осям нужно спавнить указанными FantomICW способами.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| FantomICW | Дата: Ср, 31.07.2013, 18:44 | Сообщение # 545 |
 Лидер «Свободы»
Свобода
Сообщений: 4438
| NIV, вот, например, пара статей с Инсайда: Ссылка 1 Ссылка 2 Еще нашел скрипт от antreg [cut=Скрипт спавна аномалий]Код function get_story_id_not_replay() local ST ST = xr_logic.pstor_retrieve(db.actor, "ScriptAnomId", 0) if type(ST) ~= "number" or ST == nil then ST = 9000 xr_logic.pstor_store(db.actor, "ScriptAnomId", ST) end if type(ST) == "number" or ST ~= nil then ST = ST + 1 xr_logic.pstor_store(db.actor, "ScriptAnomId", ST) end return tonumber(ST) end
function create_anom(name_anom, posit_anom, lvid_anom, gvid_anom, radius_anom, power_anom) local obj = alife():create(name_anom, posit_anom, lvid_anom, gvid_anom)
-----------------------write---------------------- local packet = net_packet() obj:STATE_Write(packet)
-----------------------load----------------------- -- cse_alife_object local game_vertex_id = packet:r_u16() local distance = packet:r_float() local direct_control = packet:r_u32() local level_vertex_id = packet:r_u32() local object_flags = packet:r_u32() local custom_data = packet:r_stringZ() local story_id = packet:r_u32() local spawn_story_id = packet:r_u32()
-- cse_shape local shape_count = packet:r_u8() for i=1,shape_count do local shape_type = packet:r_u8() if shape_type == 0 then -- sphere local center = packet:r_vec3() local radius = packet:r_float() else -- box local box = packet:r_matrix() end end
-- cse_alife_space_restrictor local restrictor_type = packet:r_u8()
-- cse_alife_custom_zone local max_power = packet:r_float() local owner_id = packet:r_u32() local enabled_time = packet:r_u32() local disabled_time = packet:r_u32() local start_time_shift = packet:r_u32()
-- cse_alife_anomalous_zone local offline_interactive_radius = packet:r_float() local artefact_spawn_count = packet:r_u16() local artefact_position_offset = packet:r_u32()
-- se_zone_anom local last_spawn_time_present = packet:r_u8()
if (string.find (name_anom, 'zone_zharka_static') ~= nil or string.find (name_anom, 'zone_witches_galantine') ~= nil or string.find (name_anom, 'zone_mosquito_bald') ~= nil or string.find (name_anom, 'zone_mincer') ~= nil or string.find (name_anom, 'zone_gravi_zone') ~= nil or string.find (name_anom, 'zone_buzz') ~= nil ) and packet:r_elapsed() ~= 0 then abort("left=%d", left) end
---------------------------save-------------------- -- cse_alife_object packet:w_begin(game_vertex_id) packet:w_float(distance) packet:w_u32(direct_control) packet:w_u32(level_vertex_id) object_flags = bit_not(193) packet:w_u32(object_flags) packet:w_stringZ(custom_data) packet:w_u32(get_story_id_not_replay()) packet:w_u32(get_story_id_not_replay())
-- cse_shape packet:w_u8(1) -- количество фигур packet:w_u8(0) -- тип фигуры: сфера packet:w_vec3(vector():set(0, 0, 0)) if radius_anom ~= nil then packet:w_float(radius_anom) else packet:w_float(1.0) end
-- cse_alife_space_restrictor packet:w_u8(restrictor_type)
-- cse_alife_custom_zone if power_anom ~= nil then packet:w_float(power_anom) else packet:w_float(max_power) end packet:w_u32(owner_id) packet:w_u32(enabled_time) packet:w_u32(disabled_time) packet:w_u32(start_time_shift)
-- cse_alife_anomalous_zone packet:w_float(offline_interactive_radius) packet:w_u16(artefact_spawn_count) packet:w_u32(artefact_position_offset)
-- se_zone_anom packet:w_u8(last_spawn_time_present)
------------------------read------------------------ packet:r_seek(0) obj:STATE_Read (packet, packet:w_tell())
end
-----------------------------------спавним аномалии-----------------------------------
function spawn_anom1() this.create_anom('zone_zharka_static', vector():set(-30.974,0.002,693.734),178968,2618, 3, 0.7) end
function spawn_anom2() this.create_anom('zone_witches_galantine_strong', vector():set(-20.851,0.000,693.588),178968,2618, 5, 0.8) end
function spawn_anom3() this.create_anom('zone_mincer_average', vector():set(-26.064,0.000,698.637),178968,2618, 4, 1) end [/cut]
|
| |
|
| Эти 0 пользователя(ей) поблагодарили FantomICW за это полезное сообщение: |
|
|
| NIV | Дата: Ср, 31.07.2013, 19:02 | Сообщение # 546 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 167
| denis2000, ваш первый способ работает. Для других интересующихся добавлю, что угол указывается в радианах, т.е. от +3.14 до -3.14. Или, как у denis2000, перевод из градусов. Во втором способе лог говорит, что не знает такого метода o_torso. Лично мне не нравятся скобки () после него. FantomICW, спасибо, будем смотреть.
Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
Сообщение отредактировал NIV - Ср, 31.07.2013, 19:02 |
| |
|
| Эти 0 пользователя(ей) поблагодарили NIV за это полезное сообщение: |
|
|
| denis2000 | Дата: Ср, 31.07.2013, 19:14 | Сообщение # 547 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата (NIV) Или, как у denis2000, перевод из градусов. Прошу прощения но не у меня, а у GSC. Цитата (NIV) Во втором способе лог говорит, что не знает такого метода o_torso. Метод можно вызвать для объектов только определенного класса! clsid.script_actor и clsid.script_stalker Цитата (NIV) Лично мне не нравятся скобки () после него. Курим функцию spawn_object из скрипта xr_effects.script
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| 9vova8 | Дата: Ср, 31.07.2013, 20:58 | Сообщение # 548 |
|
Новичок
Пользователи
Сообщений: 91
| FantomICW, [cut=way_zaton][zat_stalker_wait_smart_zat_stalker_wait_1_walk] points = p0 p0:name = wp00 |a=assault p0:flags = 0x1 p0:position = -178.46,8.93,80.57 p0:game_vertex_id = 246 p0:level_vertex_id = 584197[/cut]
|
| |
|
| Эти 0 пользователя(ей) поблагодарили 9vova8 за это полезное сообщение: |
|
|
| sergej5500 | Дата: Ср, 31.07.2013, 21:22 | Сообщение # 549 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| 9vova8, У Вас в логике сталкера секция называется path_walk = zat_stalker_wait_1_walk. В all.spawn прописана секция zat_stalker_wait_smart_zat_stalker_wait_1_walk. Вообще то, это разные секции. Естественно, что движок эту секцию не находит, и сталкеры попадают под симуляцию.
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| 9vova8 | Дата: Ср, 31.07.2013, 21:42 | Сообщение # 550 |
|
Новичок
Пользователи
Сообщений: 91
| sergej5500, у меня логика прописана екслюзивами, а там насколько я помню нужно писать так как у меня, вашым способом я попробывал - ноль реакции.
|
| |
|
| Эти 0 пользователя(ей) поблагодарили 9vova8 за это полезное сообщение: |
|
|
| sergej5500 | Дата: Ср, 31.07.2013, 21:54 | Сообщение # 551 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| 9vova8, Движок не принимает логику сталкеров. Где-то есть ошибка. Проверяйте или выложите все свои правки. Возможно, путь к файлам логики прописан неверно.
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| FantomICW | Дата: Ср, 31.07.2013, 22:00 | Сообщение # 552 |
 Лидер «Свободы»
Свобода
Сообщений: 4438
| 9vova8, в логике отсутствует параметр path_look и его секции в way_zaton.ltx. Пробуй добавить.
|
| |
|
| Эти 0 пользователя(ей) поблагодарили FantomICW за это полезное сообщение: |
|
|
| gamer | Дата: Ср, 31.07.2013, 23:52 | Сообщение # 553 |
|
Новичок
Пользователи
Сообщений: 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 | Сообщение # 554 |
 Рожденный в СССР
Разработчики
Сообщений: 1294
| gamer, spawn_num = 16 Это не количество НПС, а количество сквадов. Зачем Вам 16 сквадов по 16 НПС в каждом? Это же относится и к max_population = 16
Терпение...... И все получится!
Сообщение отредактировал makdm - Чт, 01.08.2013, 00:27 |
| |
|
| Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
| sergej5500 | Дата: Чт, 01.08.2013, 18:07 | Сообщение # 555 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 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 за это полезное сообщение: |
|
|
|