Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: denis2000, FantomICW  
Модостроение. Спавн и логика
denis2000Дата: Пн, 10.10.2011, 21:20 | Сообщение # 1
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Спавн и логика

Создание объектов на локации и логика поведения этих объектов

Если у вас появились вопросы по созданию динамических объектов в игре (НПС, монстры, аномалии, и т.п.) и настройке их "поведения". Задавайте их в этой теме - умные головы,
модосторители и просто разбирающиеся в программировании люди вам ответят.


Много интересного материала здесь (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 по ссылке из шапки и соседнюю тему "Курс молодого бойца",
возможно Ваш вопрос уже рассматривался.


Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки.
Помните чем подробнее вопрос, тем точнее ответ.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
sergej5500Дата: Пт, 06.09.2013, 17:03 | Сообщение # 631
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый День. Интересует такой момент. В логике рестриктора имеется строка:
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 метров. Можно ли организовать спавн через один рестриктор, или каждому НПС надо делать свой собственный?
 
denis2000Дата: Пт, 06.09.2013, 17:43 | Сообщение # 632
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата (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]


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
KorvoДата: Пт, 06.09.2013, 21:44 | Сообщение # 633
Тихий Малый
Пользователи
Сообщений: 356
Награды: 5
Репутация: [ 191 ]

Добрый вечер. Я возможно обращаюсь не в ту тему. Я просто не знаю, куда с этим идти. Из-за чего происходит вот этот вылет:
[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]


При свете дня, во тьме ночной,
Темный сталкер следит за тобой.

 
strelok200Дата: Сб, 07.09.2013, 13:44 | Сообщение # 634
Бывалый
Свобода
Сообщений: 126
Награды: 0
Репутация: [ 33 ]

Цитата (denis2000)
отслеживая удаление сквадов выводя инфу какой сквад и почему удаляется).

Можно подробнее пожалуйста, я по специальности не скриптер, я с заселением локаций работаю

Добавлено (07.09.2013, 13:44)
---------------------------------------------
Да и еще подскажите пожалуйста как такую проблему решить: враждебные неписи плохо реагируют на ГГ, только если близко на 10 метров подойти, а со спины вообще не заметят. Что в логике прописать?

 
denis2000Дата: Сб, 07.09.2013, 14:59 | Сообщение # 635
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

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.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
strelok200Дата: Сб, 07.09.2013, 20:09 | Сообщение # 636
Бывалый
Свобода
Сообщений: 126
Награды: 0
Репутация: [ 33 ]

Denis2000, а может быть нпс по каким-то причинам в оффлайн уходят. Да и чем поможет ваш метод, мне же надо знать причину?

Добавлено (07.09.2013, 20:09)
---------------------------------------------
Да и еще заметил, что специально заспавненные трупы тоже могут исчезнуть, хотя никаких уборщиков не стоит

Не нравиться метод? Ну давайте подождем более другой. Прошу откликнуться всех, кто знает причину такого поведения сквада. denis2000
 
makdmДата: Сб, 07.09.2013, 21:59 | Сообщение # 637
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

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
 
strelok200Дата: Вс, 08.09.2013, 12:13 | Сообщение # 638
Бывалый
Свобода
Сообщений: 126
Награды: 0
Репутация: [ 33 ]

Цитата (strelok200)
Не нравиться метод? Ну давайте подождем более другой. Прошу откликнуться всех, кто знает причину такого поведения сквада. denis2000

Ну почему не нравится? Чем он поможет, кроме того как выведет информацию какой сквад был удален и его id. Но все равно спасибо, хоть как-то пытаетесь помочь

Добавлено (08.09.2013, 12:13)
---------------------------------------------
а может быть отследить удаление и произвести респавн?
Только как отследить удаление?

 
makdmДата: Вс, 08.09.2013, 14:40 | Сообщение # 639
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата (strelok200)
а может быть отследить удаление и произвести респавн?

Элементарно.
Например, из логики рестриктора.
Сделайте проверку ( функция squad_exist из файла xr_conditions.script ) и если сквада нет, то вызываем функцию create_squad из файла xr_effects.script


Терпение......
И все получится!
 
strelok200Дата: Вс, 08.09.2013, 16:39 | Сообщение # 640
Бывалый
Свобода
Сообщений: 126
Награды: 0
Репутация: [ 33 ]

Цитата (makdm)
Элементарно.
Например, из логики рестриктора.
Сделайте проверку ( функция squad_exist из файла xr_conditions.script ) и если сквада нет, то вызываем функцию create_squad из файла xr_effects.script

Не совсем думаю подойдет, ибо у меня там больше 400 сквадов

Добавлено (08.09.2013, 16:32)
---------------------------------------------
Кому интересно я могу дать ссылку на мод

Добавлено (08.09.2013, 16:39)
---------------------------------------------
Да и подскажите: как в скваде назначить командиром определенного НПС, то есть чтобы на нем звездочка висела на карте

 
sergej5500Дата: Вс, 08.09.2013, 16:46 | Сообщение # 641
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

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]
 
makdmДата: Вс, 08.09.2013, 16:46 | Сообщение # 642
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата (strelok200)
Не совсем думаю подойдет, ибо у меня там больше 400 сквадов

Скажу вам так: Движку вообще по-барабану 400 у Вас там сквадов или 1000. Сквадов, вообще может быть 65535 штук. Он проверит каждый сквад, если ему дать задание на их проверку.

А у Вас, что, все 400 сквадов пропадают разом со всех локаций?
Странно. Первый раз слышу о таком феномене.


Терпение......
И все получится!
 
strelok200Дата: Вс, 08.09.2013, 16:54 | Сообщение # 643
Бывалый
Свобода
Сообщений: 126
Награды: 0
Репутация: [ 33 ]

Цитата (makdm)
А у Вас, что, все 400 сквадов пропадают разом со всех локаций?
Странно. Первый раз слышу о таком феномене.

Нет, разумеется. Пропасть может несколько сквадов
 
makdmДата: Вс, 08.09.2013, 17:00 | Сообщение # 644
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

strelok200, сквады пропадать не могут. Сквад -это серверный объект, который просто так не исчезает.
Могут пропасть члены сквада, если сквад "разорвать".
Например у вас сквад из 6 НПС под эксклюзивом. ГГ подходит к командиру и после диалога 3 члена сквада вместе с ГГ перемещаются в какую-ту точку локации. Причём остаток сквада ( 3 НПС ) переходит в офф-лайн. Вот тогда, при возвращении ГГ в точку, где находился сквад будет видно, что оставшиеся 3 члена сквада исчезли с локации навсегда.
Возможно у Вас эта ситуация?


Терпение......
И все получится!


Сообщение отредактировал makdm - Вс, 08.09.2013, 17:01
 
strelok200Дата: Вс, 08.09.2013, 17:09 | Сообщение # 645
Бывалый
Свобода
Сообщений: 126
Награды: 0
Репутация: [ 33 ]

Думаю да. Но никто никуда не телепортируется и сквады вряд ли будут разрываться. Все НПС находятся на одном и том же месте

Сообщение отредактировал strelok200 - Вс, 08.09.2013, 17:14
 
Поиск: