Модостроение. Спавн и логика
|
|
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 за это полезное сообщение: |
|
|
sergej5500 | Дата: Пт, 06.09.2013, 17:03 | Сообщение # 631 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый День. Интересует такой момент. В логике рестриктора имеется строка: on_info4 = {+zat_b38_alfa1_death =dist_to_actor_ge(300)} %-zat_b38_alfa1_death =spawn_object(zat_b38_alfa1:zat_b38_alfa1_look:0:0)% Если НПС убит, а дистанция до ГГ более 300 метров, то инфопорция смерти сбрасывается, а НПС спавнится повторно. Здесь, как я полагаю, измеряется дистанция от ГГ до точки рестриктора, прописанной в all.spawn. Вопрос такой. Можно ли применить данную схему для измерения дистанции от ГГ до произвольной точки, координаты которой не совпадают с координатами рестриктора? Какой функцией можно воспользоваться и как она выглядит в логике? Как эту точку зарегистрировать в all.spawn? Мне для квеста нужно по этой схеме спавнить враждебных ГГ НПС в разных местах локации на больших расстояниях друг от друга. Спавн должен происходить, когда ГГ удалится от точки спавна НПС на 300 метров. Можно ли организовать спавн через один рестриктор, или каждому НПС надо делать свой собственный?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Пт, 06.09.2013, 17:43 | Сообщение # 632 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата (9vova8) ...уборка не помогла...особо не повлияло...target_smart тоже ничего не дал Раз прямой метод не помогает идите от обратного: ставьте ловушки в скриптах для отслеживания причин глюка.
Цитата (strelok200) Может из-за новых локаций? Хотя все правильно зарегистрировано Раз прямой метод не помогает идите от обратного: отслеживайте состояние своего сквада и его перемещения (например включив отображения всех сквадов на карте или отслеживая удаление сквадов выводя инфу какой сквад и почему удаляется).
sergej5500, Все можно сделать (естественно в пределах движковых и скриптовых возможностей). Хотите сделайте скрипт вы дающий true при расстоянии более заданного от конкретного объекта или даже просто от конкретной точки заданной вектором координат. Хотите отслеживайте расстояние от нескольких точек. Я например писал логику рестриктора в котоом отслеживается респавн 4-х сквадов причем ГГ должен в этот момент находиться на расстоянии не менее 150 метров от ВСЕХ смартов на которых могут заспавниться эти сквады. [cut]Код -- Расстояние до группы объектов p[1]-расстояние p[2]..p[n]-стори-ид объектов function dist_to_objs_ge(actor, npc, p) for i=2, #p do local story_id = p[i] local story_obj_id = get_story_object_id(story_id) if story_obj_id ~= nil then local se_obj = alife():object(story_obj_id) if se_obj.position:distance_to_sqr(db.actor:position()) < p[1] * p[1] then return false end end end return true end Код -- Расстояние просто от точки с координатами function dist_to_point_ge(actor, npc, p) local d = p[1] local pos = vector():set(-123.25936889648,-26.306539535522,-475.29595947266) return d and pos:distance_to_sqr(actor:position()) > d * d end [/cut]
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
Korvo | Дата: Пт, 06.09.2013, 21:44 | Сообщение # 633 |
Тихий Малый
Пользователи
Сообщений: 356
| Добрый вечер. Я возможно обращаюсь не в ту тему. Я просто не знаю, куда с этим идти. Из-за чего происходит вот этот вылет: [cut]FATAL ERROR [error]Expression : ai().level_graph().valid_vertex_id(vertex->data().level_vertex_id()) [error]Function : CPatrolPathManager::select_point [error]File : E:\stalker\patch_1_0004\xr_3da\xrGame\patrol_path_manager.cpp [error]Line : 164 [error]Description : patrol path[gar_seriywff_walk], point on path [name00],object [gar_seriywff]
stack trace:[/cut]
При свете дня, во тьме ночной, Темный сталкер следит за тобой.
|
|
|
Эти 0 пользователя(ей) поблагодарили Korvo за это полезное сообщение: |
|
|
strelok200 | Дата: Сб, 07.09.2013, 13:44 | Сообщение # 634 |
Бывалый
Свобода
Сообщений: 126
| Цитата (denis2000) отслеживая удаление сквадов выводя инфу какой сквад и почему удаляется). Можно подробнее пожалуйста, я по специальности не скриптер, я с заселением локаций работаюДобавлено (07.09.2013, 13:44) --------------------------------------------- Да и еще подскажите пожалуйста как такую проблему решить: враждебные неписи плохо реагируют на ГГ, только если близко на 10 метров подойти, а со спины вообще не заметят. Что в логике прописать?
|
|
|
Эти 0 пользователя(ей) поблагодарили strelok200 за это полезное сообщение: |
|
|
denis2000 | Дата: Сб, 07.09.2013, 14:59 | Сообщение # 635 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Korvo, Точка пути не находиться на аи-сетке или неверный левел вертекс ид.
strelok200, Удаление происходит здесь: sim_squad_scripted.script функция: [cut]Код function sim_squad_scripted:remove_squad() local squad_npcs = {} for k in self:squad_members() do squad_npcs[k.id] = true end -- for j,v in pairs(squad_npcs) do local obj = alife():object(j) if obj ~= nil then self:unregister_member(j) alife():release(obj, true) end end self:hide() -- alife():release(self, true) end [/cut] Эта функция вызывается уже после деригистрации сквада с симборда, здесь происходит удаление НПС сквада и уборка метки сквада. Можно добавить в самый верх этой функции код: [cut]Код news_manager.send_tip(db.actor, "Sqad deleted!!! = "..tostring(self:name()), nil, "recent_surge", nil, nil) [/cut] В результате при удалении сквада получите сообщение типа: "Sqad deleted!!! = my_squad_13544, где my_squad - имя секции, 13544 - id.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
strelok200 | Дата: Сб, 07.09.2013, 20:09 | Сообщение # 636 |
Бывалый
Свобода
Сообщений: 126
| Denis2000, а может быть нпс по каким-то причинам в оффлайн уходят. Да и чем поможет ваш метод, мне же надо знать причину?
Добавлено (07.09.2013, 20:09) --------------------------------------------- Да и еще заметил, что специально заспавненные трупы тоже могут исчезнуть, хотя никаких уборщиков не стоит
Не нравиться метод? Ну давайте подождем более другой. Прошу откликнуться всех, кто знает причину такого поведения сквада. denis2000
|
|
|
Эти 0 пользователя(ей) поблагодарили strelok200 за это полезное сообщение: |
|
|
makdm | Дата: Сб, 07.09.2013, 21:59 | Сообщение # 637 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| strelok200, Цитата (strelok200) враждебные неписи плохо реагируют на ГГ, только если близко на 10 метров подойти, а со спины вообще не заметят. Увеличьте им параметры eye_fov и eye_range. Чтобы реагировали со спины, в логике дайте им хита от ГГ при достижении ГГ определённого расстояния до НПС, или активируйте и используйте движковую функцию make_object_visible_somewhen из функции make_actor_visible_to_npc в файле xr_effects.script
Цитата (strelok200) специально заспавненные трупы тоже могут исчезнуть Пропишите им в логике known_info - будут вечными трупами.
Терпение...... И все получится!
Сообщение отредактировал makdm - Вс, 08.09.2013, 02:36 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
strelok200 | Дата: Вс, 08.09.2013, 12:13 | Сообщение # 638 |
Бывалый
Свобода
Сообщений: 126
| Цитата (strelok200) Не нравиться метод? Ну давайте подождем более другой. Прошу откликнуться всех, кто знает причину такого поведения сквада. denis2000 Ну почему не нравится? Чем он поможет, кроме того как выведет информацию какой сквад был удален и его id. Но все равно спасибо, хоть как-то пытаетесь помочьДобавлено (08.09.2013, 12:13) --------------------------------------------- а может быть отследить удаление и произвести респавн? Только как отследить удаление?
|
|
|
Эти 0 пользователя(ей) поблагодарили strelok200 за это полезное сообщение: |
|
|
makdm | Дата: Вс, 08.09.2013, 14:40 | Сообщение # 639 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата (strelok200) а может быть отследить удаление и произвести респавн? Элементарно. Например, из логики рестриктора. Сделайте проверку ( функция squad_exist из файла xr_conditions.script ) и если сквада нет, то вызываем функцию create_squad из файла xr_effects.script
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
strelok200 | Дата: Вс, 08.09.2013, 16:39 | Сообщение # 640 |
Бывалый
Свобода
Сообщений: 126
| Цитата (makdm) Элементарно. Например, из логики рестриктора. Сделайте проверку ( функция squad_exist из файла xr_conditions.script ) и если сквада нет, то вызываем функцию create_squad из файла xr_effects.script Не совсем думаю подойдет, ибо у меня там больше 400 сквадовДобавлено (08.09.2013, 16:32) --------------------------------------------- Кому интересно я могу дать ссылку на мод Добавлено (08.09.2013, 16:39) --------------------------------------------- Да и подскажите: как в скваде назначить командиром определенного НПС, то есть чтобы на нем звездочка висела на карте
|
|
|
Эти 0 пользователя(ей) поблагодарили strelok200 за это полезное сообщение: |
|
|
sergej5500 | Дата: Вс, 08.09.2013, 16:46 | Сообщение # 641 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| strelok200, В сборнике Хована по этой проблеме написано следующее:
[cut=Код] Первый член сквада - Лидер Файл sim_squad_scripted.script ~580 строка Замени: for i = 1,random_count do local random_id = math.random(1, #random_spawn) self:add_squad_member(random_spawn[random_id], base_spawn_position, base_lvi, base_gvi,random_id) end
на self:add_squad_member(random_spawn[1], base_spawn_position, base_lvi, base_gvi,random_id) for i = 2,random_count do local random_id = math.random(2, #random_spawn) self:add_squad_member(random_spawn[random_id], base_spawn_position, base_lvi, base_gvi,random_id) end[/cut]
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
makdm | Дата: Вс, 08.09.2013, 16:46 | Сообщение # 642 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата (strelok200) Не совсем думаю подойдет, ибо у меня там больше 400 сквадов Скажу вам так: Движку вообще по-барабану 400 у Вас там сквадов или 1000. Сквадов, вообще может быть 65535 штук. Он проверит каждый сквад, если ему дать задание на их проверку.
А у Вас, что, все 400 сквадов пропадают разом со всех локаций? Странно. Первый раз слышу о таком феномене.
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
strelok200 | Дата: Вс, 08.09.2013, 16:54 | Сообщение # 643 |
Бывалый
Свобода
Сообщений: 126
| Цитата (makdm) А у Вас, что, все 400 сквадов пропадают разом со всех локаций? Странно. Первый раз слышу о таком феномене. Нет, разумеется. Пропасть может несколько сквадов
|
|
|
Эти 0 пользователя(ей) поблагодарили strelok200 за это полезное сообщение: |
|
|
makdm | Дата: Вс, 08.09.2013, 17:00 | Сообщение # 644 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| strelok200, сквады пропадать не могут. Сквад -это серверный объект, который просто так не исчезает. Могут пропасть члены сквада, если сквад "разорвать". Например у вас сквад из 6 НПС под эксклюзивом. ГГ подходит к командиру и после диалога 3 члена сквада вместе с ГГ перемещаются в какую-ту точку локации. Причём остаток сквада ( 3 НПС ) переходит в офф-лайн. Вот тогда, при возвращении ГГ в точку, где находился сквад будет видно, что оставшиеся 3 члена сквада исчезли с локации навсегда. Возможно у Вас эта ситуация?
Терпение...... И все получится!
Сообщение отредактировал makdm - Вс, 08.09.2013, 17:01 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
strelok200 | Дата: Вс, 08.09.2013, 17:09 | Сообщение # 645 |
Бывалый
Свобода
Сообщений: 126
| Думаю да. Но никто никуда не телепортируется и сквады вряд ли будут разрываться. Все НПС находятся на одном и том же месте
Сообщение отредактировал strelok200 - Вс, 08.09.2013, 17:14 |
|
|
Эти 0 пользователя(ей) поблагодарили strelok200 за это полезное сообщение: |
|
|
|