Модостроение. Спавн и логика
|
|
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 | Дата: Вт, 19.11.2013, 00:31 | Сообщение # 691 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый вечер. Хочу вернуться к вопросу о сейфе. Переделал логику сейфа.
[cut=Логика сейфа][logic] active = ph_idle@zapert
[ph_idle@zapert] nonscript_usable = false tips = rasvet_addon_inventory_box_zapert on_info = {=way_jup_pripyat_box_key_item_1} ph_idle@has_one_key
[ph_idle@has_one_key] nonscript_usable = false tips = rasvet_addon_inventory_box_key on_use = ph_idle@first_key %=way_jup_pripyat_box_key_deleted% on_info = {=way_jup_pripyat_box_key_item_2} ph_idle@has_two_key
[ph_idle@has_two_key] nonscript_usable = false tips = rasvet_addon_inventory_box_two_key on_use = ph_idle@second_key %=way_jup_pripyat_box_key_deleted% on_info = {=way_jup_pripyat_box_key_item_3} ph_idle@has_tru_key
[ph_idle@has_tru_key] nonscript_usable = false tips = rasvet_addon_inventory_box_two_key on_use = ph_idle@open %=way_jup_pripyat_box_key_deleted%
[ph_idle@first_key] nonscript_usable = false tips = rasvet_addon_inventory_box_zapert on_info = {=way_jup_pripyat_box_key_item_1} ph_idle@first_one_key
[ph_idle@first_one_key] nonscript_usable = false tips = rasvet_addon_inventory_box_key on_use = ph_idle@second_key %=way_jup_pripyat_box_key_deleted% on_info = {=way_jup_pripyat_box_key_item_2} ph_idle@first_two_key
[ph_idle@first_two_key] nonscript_usable = false tips = rasvet_addon_inventory_box_two_key on_use = ph_idle@open %=way_jup_pripyat_box_key_deleted%
[ph_idle@second_key] nonscript_usable = false tips = rasvet_addon_inventory_box_zapert on_info = {=way_jup_pripyat_box_key_item_1} ph_idle@second_one_key
[ph_idle@second_one_key] nonscript_usable = false tips = rasvet_addon_inventory_box_key on_use = ph_idle@open %=way_jup_pripyat_box_key_deleted%
[ph_idle@open] nonscript_usable = true tips = rasvet_addon_inventory_box_open[/cut]
Функции подсчета кол-ва имеющихся у ГГ ключей.
[cut=xr_conditions]function way_jup_pripyat_box_key_item_1(actor, npc) local info_table = { [1] = "way_jup_pripyat_box_key_1_naiden", [2] = "way_jup_pripyat_box_key_2_naiden", [3] = "way_jup_pripyat_box_key_3_naiden" } local count = 0 for k,v in pairs (info_table) do if has_alife_info(v) then count = count + 1 end end if count == 1 then return true else return false end end function way_jup_pripyat_box_key_item_2(actor, npc) local info_table = { [1] = "way_jup_pripyat_box_key_1_naiden", [2] = "way_jup_pripyat_box_key_2_naiden", [3] = "way_jup_pripyat_box_key_3_naiden" } local count = 0 for k,v in pairs (info_table) do if has_alife_info(v) then count = count + 1 end end if count == 2 then return true else return false end end function way_jup_pripyat_box_key_item_3(actor, npc) local info_table = { [1] = "way_jup_pripyat_box_key_1_naiden", [2] = "way_jup_pripyat_box_key_2_naiden", [3] = "way_jup_pripyat_box_key_3_naiden" } local count = 0 for k,v in pairs (info_table) do if has_alife_info(v) then count = count + 1 end end if count == 3 then return true else return false end end[/cut] Удаление ключей из инвентаря.
[cut=xr_effects]function way_jup_pripyat_box_key_deleted(actor, npc) check_actor_item_to_remove("way_jup_pripyat_box_key_1") check_actor_item_to_remove("way_jup_pripyat_box_key_2") check_actor_item_to_remove("way_jup_pripyat_box_key_3") disable_info("way_jup_pripyat_box_key_1_naiden") disable_info("way_jup_pripyat_box_key_2_naiden") disable_info("way_jup_pripyat_box_key_3_naiden") end[/cut]
Все работает отлично. Данную схему легко можно расширить на любое кол-во ключей. Но есть небольшой минус. При использовании remove_item были сообщения типа "Потерян ключ 1". Тут их нет. Можно ли их как-то вернуть?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Вт, 19.11.2013, 01:27 | Сообщение # 692 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| sergej5500, Код news_manager.relocate_item(db.actor, "out", Имя секции удаляемого предмета)
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
sergej5500 | Дата: Вт, 19.11.2013, 13:26 | Сообщение # 693 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый день. Возник вопрос по этому посту. Я сделал квест для СГМ. Чтобы повысить сложность, сделал Альфе переключение на логику враждебности к ГГ, когда игрок с пленником удалятся от ВНЗ на 100 метров. Замысел был, что Альфа кинется в погоню за игроком. Они кидаются, но как-то вяло. В основном забрасывают гранатами друг друга. Возникла мысль сделать спецотряд для преследования ГГ. Типовая логика преследователя.
[cut=Логика][logic] active = move@logic1 on_death = death
[death] on_info ={-zat_b38_alfa_plennic_quests_fail -zat_b38_alfa_plennic_in_zone =killed_by_actor} %+zat_b38_alfa_plennic_quests_fail%
[move@logic1] move_dest_number = 206665 move_state_when_center = guard move_state_when_move = walk move_look_vertex = 246485 on_info = {-zat_b38_alfa_plennic_quests_fail} %=actor_neutral%, %=actor_enemy%[/cut]
Каким образом составить вторую секцию логики и переключить на нее НПС после выдачи инфопорции zat_b38_alfa_plennic_in_zone.
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
FantomICW | Дата: Вт, 19.11.2013, 17:40 | Сообщение # 694 |
Лидер «Свободы»
Свобода
Сообщений: 4438
| sergej5500, проверки по инфопорциям обычно делаем через on_info. Не забывай, что проверок on_info может быть несколько. В ТЧ максимально 8, в ЗП этот недочет исправили. Можно задать номера, хоть 2, хоть 22: Код on_info2 = ... on_info22 = ... То есть в секцию [move@logic1] добавляем: Код on_info2 = {+zat_b38_alfa_plennic_in_zone} переключение_на_секцию
|
|
|
Эти 0 пользователя(ей) поблагодарили FantomICW за это полезное сообщение: |
|
|
sergej5500 | Дата: Вт, 19.11.2013, 17:47 | Сообщение # 695 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| FantomICW, Глеб, спасибо, но это не то. Вопрос, как заставить НПС работать по этому скрипту. К примеру, записи типа move_state_when_center = guard move_state_when_move = walk означают, что НПС стоит с оружием и смотрит в определенную точку. Как поставить НПС под управление скрипта, предложенного Дмитрием?
Сообщение отредактировал sergej5500 - Вт, 19.11.2013, 21:41 |
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
makdm | Дата: Ср, 20.11.2013, 00:28 | Сообщение # 696 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| sergej5500, могу предложить следующий вариант.
[cut noguest=Логика и скрипты]Берём файл gamedata\scripts\xr_companion.script В конце файла в функции function set_scheme(object, ini, scheme, section) пишем st.sprint = utils.cfg_get_bool(ini, section, "sprint",npc, false, false)
Дальше, в методе action_companion_activity:beh_walk_simple() после строчек
else new_state = "assault" end end end
пишем
if self.st.sprint then new_state = "sprint" end
Теперь сама логика. Возьмём за основу walker
[logic] active = walker@wait
[walker@wait] path_walk = walker_6_walk path_look = walker_6_look on_info = {+zat_b38_alfa_plennic_in_zone} companion@1
[companion@1] gather_items_enabled = false help_wounded_enabled = false corpse_detection_enabled = false combat_ignore_cond = {=fighting_dist_ge(30)} true sprint = true on_info = {=dist_to_actor_le(30)} companion@10
[companion@10] gather_items_enabled = false help_wounded_enabled = false corpse_detection_enabled = false combat_ignore_cond = {=fighting_dist_ge(50)} true sprint = true on_info = {=dist_to_actor_ge(50)} companion@1
Здесь получается так, что если дистанция между преследователем и ГГ больше 50 метров, то он догоняет ГГ. Когда дистанция сокращается до 30 метров - он начинает атаковать ГГ. И так до бесконечности пока либо ГГ его не угрохает, либо он ГГ.[/cut]
Терпение...... И все получится!
Сообщение отредактировал makdm - Ср, 20.11.2013, 00:29 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
sergej5500 | Дата: Сб, 23.11.2013, 02:01 | Сообщение # 697 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый вечер. Попробовал извлечь из аддона Гладиатор функцию wpn_has_silencer. [cut=Текущий код функции]function wpn_has_silencer_active( actor, obj ) local object = db.actor: active_item () ---Если это пушка Гаусса, то сразу TRUE if object then --'Затычка, когда предыдущее оружие убрано из слота, а следующее ещё не вставлено в слот if object:section() == "wpn_gauss" then ammo_in_magazine = 0 ammo_now = 0 clsid = 0 return true end else return true end if isWeapon( object ) then ---Запоминаем активное оружие ( считаем, что глушитель установлен ) if clsid == 0 then clsid = object:clsid() return true end ---Смена активного оружия ( у нового оружия патронов в магазине может быть меньше ) if clsid ~= object:clsid() then clsid = 0 ammo_in_magazine = 0 return true end else return true end ---Инициализация или пустой магазин ( считаем, что глушитель установлен ) if ammo_in_magazine == 0 then local object = db.actor: active_item () if object and isWeapon( object ) then ammo_in_magazine = object:get_ammo_in_magazine() return true end end ---Выстрел ( проверка на наличие глушителя ) local object = db.actor: active_item () if object and isWeapon( object ) then ammo_now = object:get_ammo_in_magazine() end if ammo_now < ammo_in_magazine then ammo_in_magazine = ammo_now local silencer = object:weapon_is_silencer() return silencer end ---Перезарядка ( считаем, что глушитель установлен ) if ammo_now > ammo_in_magazine then ammo_in_magazine = ammo_now end return true end[/cut]
Создал для тестов 2 НПС с логикой. [cut=Пример логики][logic] active = move@test on_death = death
[death] on_info = {=killed_by_actor !wpn_has_silencer_active -rasvet_addon_test_stalker_enemy} %+rasvet_addon_test_stalker_enemy%
[move@test] move_dest_number = 356678 move_look_vertex = 483888 move_state_when_center = sit_ass move_state_when_move = walk move_combat_disable = true move_home_teleport = true meet = meet combat_ignore_cond = true combat_ignore_keep_when_attacked = true on_info = {+rasvet_addon_test_stalker_enemy} %=actor_enemy%, %=actor_neutral%
[meet] abuse = false use = {!actor_enemy} true, false allow_break = false meet_on_talking = false trade_enable = false[/cut]
У второго логика отличается только координатами. По замыслу, если одного НПС уничтожить из шумного оружия, то второй покраснеет. При попытке завалить тестового НПС из любого оружия получаю разнообразные логи.
[cut=Лог]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 : ... 1\Зов Припяти\gamedata\scripts\xr_conditions.script:1270: attempt to index global 'clsid' (a number value)
stack trace:
0023:69737365 atiumdag.dll[/cut]
Вылет связан именно с функцией wpn_has_silencer_active. В чем может быть проблема? Моя функция отличается от функции в Гладиаторе только названием. Индекс clsid в xr_conditions у меня и файле Гладиатора одинаков. Или эту функцию нельзя вызывать из обработчика смерти? Если это так, то можно ли отредактировать функцию так, чтобы она вызывалась из секции [death]? Заранее благодарен за советы.
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
NIV | Дата: Сб, 23.11.2013, 10:39 | Сообщение # 698 |
Полевой исследователь
Ученые сталкеры
Сообщений: 167
| Здравствуйте, возник вопрос: в оригинале ЗП возможно нанять разные сквады (jup_b47_bunker_guard_lost_merc, jup_b47_bunker_guard_freedom, jup_b47_bunker_guard_duty, jup_b47_bunker_guard_stalker_leader) для охраны научного бункера. В логике (jup_b47_bunker_guard.ltx) написано: Код suitable = {=target_squad_name(jup_b47_bunker_guard)} true, {=target_squad_name(jup_b47_merc_guard_squad) =check_npc_name(jup_b47_merc_01)} true
Действительно ли =target_squad_name(jup_b47_bunker_guard) выбирает любой сквад, имя которого начинается с jup_b47_bunker_guard? И не надо указывать имя НПС, как это сделано во второй части (=check_npc_name(jup_b47_merc_01)?
Вопрос возник в связи с тем, что сначала мне удавалось заспанить сквад jup_b47_bunker_guard_lost_merc, а после каких-то изменений, не связанных с указанными файлами, возникает безлоговый вылет, похожий на ошибку в скриптах lua. Если же спанить на этом смарте сквад, для которого не прописана эксклюзивная логика, то он спанится нормально. Возникла мысль, что сквад jup_b47_bunker_guard_lost_merc вступает в конфликт с логикой.
Что можете сказать?
Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
|
|
|
Эти 0 пользователя(ей) поблагодарили NIV за это полезное сообщение: |
|
|
makdm | Дата: Сб, 23.11.2013, 12:25 | Сообщение # 699 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| sergej5500, вылет связан с тем, что Вы не объявили локальные переменные. Перед самой функцией они объявляются так local ammo_in_magazine = 0 local ammo_now = 0 local clsid = 0
Но В Вашем случае, функция не будет работать правильно, т.к. предназначена для работы на постоянном апдейте. У Вас же она поставлена в секцию [death]. А секция выполняется только один раз при смерти НПС.
Предлагаю Вам другую функцию для проверки на on_death
[cut noguest=Функция]function actor_has_silencer(actor, npc) local t = db.storage[npc:id()].death local killed_by_actor = t ~= nil and t.killer == actor:id() if killed_by_actor then local obj = actor:active_item () if obj ~= nil then if isWeapon (obj) then if string.find( obj:name(), "knife" ) ~= nil or obj:weapon_is_silencer(} then return true end end end end return false end[/cut]Добавлено (23.11.2013, 12:25) --------------------------------------------- NIV, функция target_squad_name(jup_b47_bunker_guard) работает так
Функция проверяет целевой смарт сквада . В секции сквада он прописан как target_smart = jup_b41. А раз проверка идёт из работы смарта jup_b41, то устанавливается значение true и значит сквад может выполнять работу на смарте.
Отвечая на Ваш вопрос, то мало того, чтобы сквад начинался на jup_b47_bunker_guard, второе необходимое условие, чтобы в секции сквада было указано target_smart = jup_b41. И только тогда сквад начнёт выполнять работу на смарте.
А условие check_npc_name распредедяет работу на смарте уже среди членов сквада.
Терпение...... И все получится!
Сообщение отредактировал makdm - Сб, 23.11.2013, 12:00 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
sergej5500 | Дата: Сб, 23.11.2013, 14:50 | Сообщение # 700 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| makdm, Предложенная Вами функция
[cut=Функция]function actor_has_silencer(actor, npc) local t = db.storage[npc:id()].death local killed_by_actor = t ~= nil and t.killer == actor:id() if killed_by_actor then local obj = actor:active_item () if obj ~= nil then if isWeapon (obj) then if string.find( obj:name(), "knife" ) ~= nil or obj:weapon_is_silencer(} then return true end end end end return false end [/cut]
после подстановки в xr_conditions дает вылет еще до завершения загрузки сейва.
[cut=Лог]Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : ...files 1\Зов Припяти\gamedata\scripts\xr_logic.script:477: attempt to index global 'xr_conditions' (a nil value) [/cut]
На всякий случай функция в xr_logic, на которую ругается лог:
[cut=Функция]function pick_section_from_condlist(actor, npc, condlist) local rval = nil -- math.random(100) local newsect = nil local infop_conditions_met if condlist~=nil then for n, cond in pairs(condlist) do infop_conditions_met = true -- изначально считаем, что все условия переключения удовлетворены for inum, infop in pairs(cond.infop_check) do if infop.prob then if not rval then rval = math.random(100) end if infop.prob < rval then infop_conditions_met = false -- инфопоршен есть, но он не должен присутствовать break end elseif infop.func then --printf("_bp: infop.func = %s", infop.func) if not xr_conditions[infop.func] then if type(npc.name) == "function" then abort("object '%s': pick_section_from_condlist: function '%s' is " .. "not defined in xr_conditions.script", npc:name(), infop.func) else abort("object '%s': pick_section_from_condlist: function '%s' is " .. "not defined in xr_conditions.script", tostring(npc.name), infop.func) end end --if xr_conditions[infop.func](actor, npc) then if infop.params then if xr_conditions[infop.func](actor, npc, infop.params) then if not infop.expected then infop_conditions_met = false -- инфопоршен есть, но не должен присутствовать break end else if infop.expected then infop_conditions_met = false -- инфопоршен есть, но не должен присутствовать break end end else if xr_conditions[infop.func](actor, npc) then if not infop.expected then infop_conditions_met = false -- инфопоршен есть, но не должен присутствовать break end else if infop.expected then infop_conditions_met = false -- инфопоршен есть, но не должен присутствовать break end end end elseif has_alife_info(infop.name) then if not infop.required then --'printf("FAILED: actor has infop '%s', which is NOT needed [%s]", infop.name, tostring(has_alife_info(infop.name))) infop_conditions_met = false -- инфопоршен есть, но он не должен присутствовать break else --'printf("PASSED: actor has infop '%s', which is needed [%s]", infop.name, tostring(has_alife_info(infop.name))) end else if infop.required then --'printf("FAILED: actor has NO infop '%s', which is needed [%s]", infop.name, tostring(has_alife_info(infop.name))) infop_conditions_met = false -- инфопоршена нет, но он нужен break else --'printf("PASSED: actor has NO infop '%s', which is not needed [%s]", infop.name, tostring(has_alife_info(infop.name))) end end end --printf("_bp: infop_cond_met = %s", utils.to_str(infop_conditions_met)) if infop_conditions_met then -- Условия выполнены. Независимо от того, задана ли секция, нужно проставить требуемые -- infoportions: for inum, infop in pairs(cond.infop_set) do if db.actor == nil then abort("TRYING TO SET INFOS THEN ACTOR IS NIL") end if infop.func then if not xr_effects[infop.func] then abort("object '%s': pick_section_from_condlist: function '%s' is " .. "not defined in xr_effects.script", if_then_else(npc, npc:name(), "nil"), infop.func) end if infop.params then xr_effects[infop.func](actor, npc, infop.params) else xr_effects[infop.func](actor, npc) end elseif infop.required then if dont_has_alife_info(infop.name) then db.actor:give_info_portion(infop.name) end else if has_alife_info(infop.name) then db.actor:disable_info_portion(infop.name) end end end if cond.section == "never" then return nil else return cond.section end end end end return nil end[/cut]
477 строка if not xr_conditions[infop.func] then.
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
makdm | Дата: Сб, 23.11.2013, 15:02 | Сообщение # 701 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| sergej5500, синтаксическая ошибка в файле xr_conditions.script
Моя ошибка.
Ошибся, когда набирал функцию, вместо
obj:weapon_is_silencer(}
нужно писать
obj:weapon_is_silencer()
Теперь всё должно работать правильно.
Терпение...... И все получится!
Сообщение отредактировал makdm - Сб, 23.11.2013, 15:07 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
NIV | Дата: Сб, 23.11.2013, 19:12 | Сообщение # 702 |
Полевой исследователь
Ученые сталкеры
Сообщений: 167
| Решил проблему, но всё равно ничего не понимаю...
Создал новый сквад, прописал каждому его члену работу (check_npc_name), получил вылет. Подключая НПС по одному, нашёл, что вылет происходит на работе jup_b47_bunker_guard_04. Это walker, но для него отсутствовал path_look. Распаковал спаун из оригинала, но как ни странно, он отсутствовал и там. Поскольку для волкера path_look не обязателен, закомментировал его. После этого всё заработало.
Вот чего я не пойму - как это раньше работало в оригинале???
Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
Сообщение отредактировал NIV - Сб, 23.11.2013, 19:12 |
|
|
Эти 0 пользователя(ей) поблагодарили NIV за это полезное сообщение: |
|
|
sergej5500 | Дата: Вс, 24.11.2013, 12:53 | Сообщение # 703 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый день. Возникли вопросы. 1. Будет ли функция враждебности сквадов, пример: =set_squads_enemies(zat_b7_stalkers_raiders:zat_b7_stalkers_victims_1) нормально работать, если один из сквадов в оффлайне? Допустим, один сквад на лесопилке, второй на ВНЗ. 2. Сквады взаимно ссорятся этой командой, или один из них будет оставаться нейтрален, пока в него не начнут стрелять?
Просто по квесту с ВНЗ, который я делал, возникли некоторые трудности. Для нормальной работы функции, предложенной denis2000, нужен онлайн-радиус 250-270 метров. При таком радиусе заметно возросла нагрузка на движок. При уменьшении дистанции часть Альфы в бою не участвует. Поэтому, прежде чем начинать работы по переделке квеста под сквады, надо определиться, делать ли один большой сквад на 30 НПС или можно сделать несколько мелких.
Добавлено (24.11.2013, 12:53) --------------------------------------------- Еще один вопрос. Можно ли схему, описанную тут, применить для сквада НПС? Есть ли возможность заставить сквад преследовать ГГ?
Сообщение отредактировал sergej5500 - Вс, 24.11.2013, 13:03 |
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Вс, 24.11.2013, 15:36 | Сообщение # 704 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата sergej5500 ( ) Будет ли функция враждебности сквадов ... нормально работать, если один из сквадов в оффлайне? Нет, она не сможет посорить НПС которые в офлайне.
Цитата sergej5500 ( ) Для нормальной работы функции, предложенной denis2000, нужен онлайн-радиус 250-270 метров. За основу предложенной функции я как раз и взял функцию set_squads_enemies Там либо get_story_object(***) возвращает nil или :set_relation() не работает для обектов в офлайне.
Цитата sergej5500 ( ) Еще один вопрос. Можно ли схему, описанную тут, применить для сквада НПС? Нет, для сквадов она не применима. Для реализации скорее всего потребуется существенно переписать скрипт sim_squad_scripted.script
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
sergej5500 | Дата: Вт, 26.11.2013, 10:49 | Сообщение # 705 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Доброй ночи. Интересует такой вопрос. В логике работ смартов имеется такой код. prior = 100
Будет ли он работать, если его добавить в логику несквадовых НПС из СГМ?
Зачем этот параметр несквадовым НПС? denis2000Добавлено (26.11.2013, 10:49) ---------------------------------------------
Цитата sergej5500 ( ) Зачем этот параметр несквадовым НПС? denis2000
Иногда на базе Рассвета, где все НПС несквадовые после квеста на защиту базы от зверья наблюдал такую картину. Мутанты уничтожены, почти все НПС разошлись по своим местам. Один или 2 остаются на огневом рубеже, оружие на изготовку и кричат "Быть наготове". "Всем осмотреться" и т.д.
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
|