Модостроение. Спавн и логика
|
|
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 | Дата: Сб, 14.06.2014, 09:42 | Сообщение # 931 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата sergej5500 ( ) В порядке гипотезы. Возможно, сквады респятся, но куда-то исчезают А мне кажется вообще не спавняться несмотря на вызов соответствующей функции. В любом случае стоит поставить метки на отряды и включить подробное логирование используемых функций (вполне возможно что там не выполняется какое-то условие и спавн не проходит).
И ли просто пробовать отказаться от точек спавна, тогда спавн будет происходить в районе самого смарта (расстояние от которого вы и измеряете), или измерять расстояния для спавна от точек респавна индивидуально для каждого сквада.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
sergej5500 | Дата: Сб, 14.06.2014, 11:00 | Сообщение # 932 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| makdm, denis2000,
Попробовал поставить метки. Получилось следующее.
[cut=Скрины]1. Спавн еще не произошел.
2. Сквады отреспились. Все хорошо.
3. Прошел мимо ВНЗ. Маркеры чуть поменяли положение. Видимо, из-за расстановки неписей по работам. Все хорошо.
4. Отхожу от ВНЗ. Удаления сквадов пока не было.
5. Сквады удалились.
6. Возвращаюсь к ВНЗ, Респятся только два сквада.
[/cut]Добавлено (14.06.2014, 11:00) --------------------------------------------- Пока вижу 2 направления решения проблемы.
1. Спавнить неписей одним сквадом в 30 НПС или двумя по 15 НПС.
2. Попробовать сделать для каждого сквада отдельный рестриктор в точке спавн-пойнта этого сквада. Каждый сквад спавнить и убирать индивидуально из своего рестриктора.
P.S. Просто интересно, в чем "затык". Почему движок прекрасно спавнит сквады в первый раз и "капризничает" во второй раз.
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
makdm | Дата: Сб, 14.06.2014, 11:32 | Сообщение # 933 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата sergej5500 ( ) Почему движок прекрасно спавнит сквады в первый раз и "капризничает" во второй раз Возможно потому, что считает, что количество НПС в смарте уже достигло максимально разрешённого количества. Т.е. удаление сквадов из смарта происходит некорректно. Попробуйте заменить функцию удаления сквадов на такую
function zat_b38_alfa_base_clean() xr_effects.clear_smart_terrain(db.actor, nil, {"zat_b38"}) end
Если не поможет, то попробуйте сделать количество НПС меньше 30, например по 5 НПС в скваде.
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
sergej5500 | Дата: Сб, 14.06.2014, 13:36 | Сообщение # 934 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| makdm,
Функцию clear_smart_terrain(db.actor, nil, {"zat_b38"}) попробовал. Результат нулевой. Все 5 сквадов удаляются. При повторном приближении к смарту респятся два сквада.
Уменьшение чмсла НПС в скваде так же не дает результата. Уменьшил число ботов в скваде до 3. При первом проходе. как и ожидалось, были 15 НПС. При втором приближении 6 НПС (два сквада). То есть ограничение действует по числу сквадов. (Не больше 2). Это ограничение не действует, если дистанция до точки спавна менее 150 метров (примерно). Но это уже на глазах игрока.
Спавн всех неписей одним сквадом дает заметное подвисание игры при входе смарта в онлайн. При пяти сквадах тормозов заметно меньше.
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Сб, 14.06.2014, 19:02 | Сообщение # 935 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата sergej5500 ( ) Это ограничение не действует, если дистанция до точки спавна менее 150 метров (примерно). Но это уже на глазах игрока. Да все выпрыгивает из офлайна на расстоянии 150 метров, респавн на смартах обычно происходит на этой дистанции, многие скрипты заточены именно под эту дистанцию.
Выход один: подробно логировать процесс спавна сквадов и анализировать, где происходит затык.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
sergej5500 | Дата: Вс, 15.06.2014, 21:34 | Сообщение # 936 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый вечер.
Сделал НПС с логикой.
[cut=Логика][logic@zat_b38_alfa_plennic3] active = remark@zat_b38_alfa_plennic3 suitable = {=check_npc_name(zat_b38_alfa_plennic4)} true prior = 300 post_combat_time = 0,0
[remark@zat_b38_alfa_plennic3]:remark@zat_b38_alfa_plennic on_info2 = {!is_squad_friend_to_actor(zat_b38_alfa_plennic4_squad)} %=set_squad_goodwill(zat_b38_alfa_plennic4_squad:friend)% on_info3 = {+petrusha_money_quests_reward =dist_to_actor_ge(225)} %=remove_squad(zat_b38_alfa_plennic4_squad) =create_squad(zat_b38_alfa_plennic5_squad:zat_b38)%
[remark@zat_b38_alfa_plennic] gather_items_enabled = false help_wounded_enabled = false corpse_detection_enabled = false combat_ignore_cond = true combat_ignore_keep_when_attacked = true target = story | actor anim = ward_noweap meet = meet invulnerable = true on_info = %=control_npc_position(zat_b38_alfa_plennic_spawn_point_2:0.3)%[/cut]
Схема remark для НПС использована потому, что там, где стоит непись, нет сетки. Чтобы НПС смотрел на игрока, в логике есть строка target = story | actor.
Непись неплохо поворачивается. [cut=Скрины] [/cut]
Собственно, вопрос. На какой дистанции действует этот эффект? Если игрок дальше 10 метров, то поворачивать непися смысла нет. Пусть смотрит куда хочет. Можно ли в строку добавить поддержку дистанции и как это правильно сделать?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
makdm | Дата: Вс, 15.06.2014, 22:06 | Сообщение # 937 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| sergej5500, для этого нужно править файл xr_remark.script Попробуйте сделать так:
[cut noguest]В методе UPDATE в файле прописано
local target = self:get_target()
Вот ниже этого пропишите if target then if self.st.target_id == db.actor:id() then if self.object:position():distance_to( db.actor:position() ) > 10 then target = nil end end end
Если всё получится, то в схему можно ввести параметр, например look_actor_distance Тогда в файл xr_remark.script нужно после строчки st.snd_anim_sync = utils.cfg_get_bool(ini, section, "snd_anim_sync", npc, false) написать st.distance_actor = utils.cfg_get_number( ini, section, "look_actor_distance", npc, false, 10 )
А проверку сделать так
if target then if self.st.target_id == db.actor:id() then if self.object:position():distance_to( db.actor:position() ) > self.st.distance_actor then target = nil end end end
А в логику remark ввести параметр look_actor_distance = 10 Ну или другая цифра.[/cut]
Терпение...... И все получится!
Сообщение отредактировал makdm - Вс, 15.06.2014, 22:26 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
sergej5500 | Дата: Ср, 18.06.2014, 21:05 | Сообщение # 938 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый вечер.
Функции в xr_conditions.
[cut=Код]function distance_to_obj_ge(actor, npc, p) local npc_id = get_story_object_id(p[1]) local npc1 = npc_id and alife():object(npc_id) if npc1 then return db.actor:position():distance_to_sqr(npc1.position) >= p[2]*p[2] end return false end
function distance_to_obj_le(actor, npc, p) local npc_id = get_story_object_id(p[1]) local npc1 = npc_id and alife():object(npc_id) if npc1 then return db.actor:position():distance_to_sqr(npc1.position) < p[2]*p[2] end return false end[/cut]
Можно ли применить эти функции для измерения дистанции до объекта (не НПС)? Объект имеет стори-ид. [cut=Объект] [zat_b38_firepos_spot]:default_spot story_id = zat_b38_firepos_spot[/cut]
Если эти ф-ии пригодны только для НПС, то какие функции подойдут для данной задачи?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
FantomICW | Дата: Ср, 18.06.2014, 21:21 | Сообщение # 939 |
Лидер «Свободы»
Свобода
Сообщений: 4438
| sergej5500, эти проверки подходят и для объектов (не НПС). И оно и так и так проверяет конкретный story_id: Цитата sergej5500 ( ) local npc_id = get_story_object_id(p[1]) Вот, к примеру, в оригинале ЗП используется эта функция в файле configs\scripts\jupiter\jup_a6_help_counter.ltx: Код =distance_to_obj_ge(jup_b202_actor_treasure:100)
|
|
|
Эти 0 пользователя(ей) поблагодарили FantomICW за это полезное сообщение: |
|
|
sergej5500 | Дата: Сб, 21.06.2014, 23:10 | Сообщение # 940 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый вечер.
Заинтересовал один вопрос. Имеется эксклюзивный сквад. Для сквада есть персональные работы на смарте. Одному из НПС требуется заспавнить в рюкзак квестовый предмет. Можно ли это сделать в секции логики работы на смарте? Какой функцией можно воспользоваться? Профиль НПС значения не имеет. Нужно только взять у него предмет.
Или для данной задачи обязательно нужен эксклюзивный НПС? С прописыванием предмета в character_descr_...
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
makdm | Дата: Вс, 22.06.2014, 01:12 | Сообщение # 941 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| sergej5500, в одной из активных секций логики прописать
on_info = {-поршень} %+поршень =give_item( Секция предмета )%
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
sergej5500 | Дата: Сб, 28.06.2014, 22:50 | Сообщение # 942 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый вечер. Интересует такой вопрос.
Имеется сквад из 30 НПС. [cut=Сквад] [zat_b38_alfa_squad]:online_offline_group faction = alfa_force npc = respawn_easy_alfa_force, respawn_normal_alfa_force, respawn_heavy_alfa_force, respawn_easy_alfa_force, respawn_normal_alfa_force, respawn_heavy_alfa_force, respawn_easy_alfa_force, respawn_normal_alfa_force, respawn_heavy_alfa_force, respawn_easy_alfa_force, respawn_normal_alfa_force, respawn_heavy_alfa_force, respawn_easy_alfa_force, respawn_normal_alfa_force, respawn_heavy_alfa_force, respawn_easy_alfa_force, respawn_normal_alfa_force, respawn_heavy_alfa_force, respawn_easy_alfa_force, respawn_normal_alfa_force, respawn_heavy_alfa_force, respawn_easy_alfa_force, respawn_normal_alfa_force, respawn_heavy_alfa_force, respawn_easy_alfa_force, respawn_normal_alfa_force, respawn_heavy_alfa_force, respawn_easy_alfa_force, respawn_normal_alfa_force, respawn_heavy_alfa_force story_id = zat_b38_alfa_squad spawn_point = zat_b38_respawn_point target_smart = zat_b38 always_arrived = true[/cut]
Допустим, что один из неписей погиб. Затоптали кабаны, например. В скваде осталось 29 ботов.
Возможно ли в логике рестриктора проверить число живых неписей в скваде? Какой функцией можно воспользоваться?
Так же интересует вопрос. Можно ли сравнить кол-во живых НПС с каким-то определенным числом. Если неписей меньше 15, то сквад убрать и отреспить по новой.
Сообщение отредактировал sergej5500 - Сб, 28.06.2014, 22:59 |
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Вс, 29.06.2014, 11:24 | Сообщение # 943 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| sergej5500, Добавить НПС в сквад можно функцией function create_squad_member(actor, obj, p) р[1] - Имя секции НПС p[2] - Имя секции сквада p[3] - Точка спавна (может не задаваться) Пример:Код %=create_squad_member(pri_a17_military_captain_tarasov_strong:pri_a16_military_squad)%
Проверка на число НПС в скваде function squad_npc_count_ge(actor, npc, p) р[1] - Имя секции сквада p[2] - число НПС Если число НПС больше проверяемого функция выдаст true Пример:Код {=squad_npc_count_ge(pri_a16_military_squad:4)}
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
Shram22 | Дата: Вс, 29.06.2014, 17:20 | Сообщение # 944 |
Удаленные
| Помогите переношу спавн перенесённой локации кордон из чн в зп. И когда добавляю эти секцию [cut noguest=секция][14140] ; cse_abstract properties section_name = physic_destroyable_object name = shkaf_work_01_door_0004 position = -122.860298156738,-29.9799995422363,-371.085906982422 direction = 0,-4.71236276626587,0
; cse_alife_object properties game_vertex_id = 1179 distance = 0 level_vertex_id = 2383 object_flags = 0xffffff3a custom_data = <<END [collide] ignore_static
[logic] cfg = scripts\door_metal_small_unlocked.ltx END
; cse_visual properties visual_name = dynamics\door\shkaf_work_01_door visual_flags = 0x1
; cse_ph_skeleton properties
; cse_alife_object_physic properties physic_type = 0x3 mass = 10 fixed_bones = link
upd:num_items = 0xc7
upd:position = 0,7,0 upd:cse_alife_object_physic__unk1 = 46015152,0,7 upd:cse_alife_object_physic__unk2 = 0,46015536,0 upd:cse_alife_object_physic__unk3 = 0,7,0,46016304
[14233] ; cse_abstract properties section_name = komp_monitor name = esc_komp_monitor position = -244.919998168945,-23.9468040466309,-132.896026611328 direction = 0,0.6875,0
; cse_alife_object properties game_vertex_id = 1179 distance = 0 level_vertex_id = 2383 object_flags = 0xffffff3a
; cse_visual properties visual_name = dynamics\el_tehnika\komp_monitor_screen_1
; cse_ph_skeleton properties
; cse_alife_object_physic properties physic_type = 0x3 mass = 10 fixed_bones = link
upd:num_items = 0xc7
upd:position = 0,7,0 upd:cse_alife_object_physic__unk1 = 46238288,0,7 upd:cse_alife_object_physic__unk2 = 0,46237008,0 upd:cse_alife_object_physic__unk3 = 0,7,0,46239760
[14234] ; cse_abstract properties section_name = komp_klava name = esc_komp_klava position = -244.745483398438,-23.9441795349121,-133.606979370117 direction = 0,1.04124999046326,0
; cse_alife_object properties game_vertex_id = 1179 distance = 0 level_vertex_id = 2383 object_flags = 0xffffff3a
; cse_visual properties visual_name = dynamics\el_tehnika\komp_klava
; cse_ph_skeleton properties
; cse_alife_object_physic properties physic_type = 0x3 mass = 10 fixed_bones = link
upd:num_items = 0xc7
upd:position = 0,7,0 upd:cse_alife_object_physic__unk1 = 46378240,0,7 upd:cse_alife_object_physic__unk2 = 0,46378624,0 upd:cse_alife_object_physic__unk3 = 0,7,0,46379392
[14235] ; cse_abstract properties section_name = bottle_3l name = esc_bottle_3l_0000 position = 12.071647644043,1.75919198989868,259.709533691406 direction = 0,0,0
; cse_alife_object properties game_vertex_id = 1179 distance = 0 level_vertex_id = 2383 object_flags = 0xffffff3a
; cse_visual properties visual_name = dynamics\kitchen_room\bottle_3l
; cse_ph_skeleton properties
; cse_alife_object_physic properties physic_type = 0x3 mass = 10
upd:num_items = 0xc7
upd:position = 0,7,0 upd:cse_alife_object_physic__unk1 = 46407744,0,7 upd:cse_alife_object_physic__unk2 = 0,46410560,0 upd:cse_alife_object_physic__unk3 = 0,7,0,46409920
[/cut]
аль спавн не запаковывается
Сообщение отредактировал Shram22 - Вс, 29.06.2014, 19:17 |
|
|
Эти 0 пользователя(ей) поблагодарили Shram22 за это полезное сообщение: |
|
|
denis2000 | Дата: Вс, 29.06.2014, 23:57 | Сообщение # 945 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Shram22, Или формат секций не соответствует вашему компилятору для ЗП или одно из двух.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
|