Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: 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Дата: Вт, 19.11.2013, 00:31 | Сообщение # 691
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый вечер. Хочу вернуться к вопросу о сейфе. Переделал логику сейфа.

[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". Тут их нет.
Можно ли их как-то вернуть?
 
denis2000Дата: Вт, 19.11.2013, 01:27 | Сообщение # 692
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500,
Код
news_manager.relocate_item(db.actor, "out", Имя секции удаляемого предмета)


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

Добрый день. Возник вопрос по этому посту. Я сделал квест для СГМ. Чтобы повысить сложность, сделал Альфе переключение на логику враждебности к ГГ, когда игрок с пленником удалятся от ВНЗ на 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.
 
FantomICWДата: Вт, 19.11.2013, 17:40 | Сообщение # 694
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

sergej5500, проверки по инфопорциям обычно делаем через on_info. Не забывай, что проверок on_info может быть несколько. В ТЧ максимально 8, в ЗП этот недочет исправили. Можно задать номера, хоть 2, хоть 22:
Код
on_info2 = ...
on_info22 = ...

То есть в секцию [move@logic1] добавляем:
Код
on_info2 = {+zat_b38_alfa_plennic_in_zone} переключение_на_секцию



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

FantomICW,
Глеб, спасибо, но это не то. Вопрос, как заставить НПС работать по этому скрипту. К примеру,
записи типа
move_state_when_center = guard
move_state_when_move = walk

означают, что НПС стоит с оружием и смотрит в определенную точку. Как поставить НПС под
управление скрипта, предложенного Дмитрием?


Сообщение отредактировал sergej5500 - Вт, 19.11.2013, 21:41
 
makdmДата: Ср, 20.11.2013, 00:28 | Сообщение # 696
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

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
 
sergej5500Дата: Сб, 23.11.2013, 02:01 | Сообщение # 697
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый вечер.
Попробовал извлечь из аддона Гладиатор функцию 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]? Заранее благодарен за советы.
 
NIVДата: Сб, 23.11.2013, 10:39 | Сообщение # 698
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

Здравствуйте, возник вопрос: в оригинале ЗП возможно нанять разные сквады (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"
 
makdmДата: Сб, 23.11.2013, 12:25 | Сообщение # 699
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

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
 
sergej5500Дата: Сб, 23.11.2013, 14:50 | Сообщение # 700
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

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.
 
makdmДата: Сб, 23.11.2013, 15:02 | Сообщение # 701
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

sergej5500, синтаксическая ошибка в файле xr_conditions.script

Моя ошибка.

Ошибся, когда набирал функцию, вместо

obj:weapon_is_silencer(}

нужно писать

obj:weapon_is_silencer()

Теперь всё должно работать правильно.


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


Сообщение отредактировал makdm - Сб, 23.11.2013, 15:07
 
NIVДата: Сб, 23.11.2013, 19:12 | Сообщение # 702
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

Решил проблему, но всё равно ничего не понимаю...

Создал новый сквад, прописал каждому его члену работу (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
 
sergej5500Дата: Вс, 24.11.2013, 12:53 | Сообщение # 703
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый день. Возникли вопросы.
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
 
denis2000Дата: Вс, 24.11.2013, 15:36 | Сообщение # 704
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата sergej5500 ()
Будет ли функция враждебности сквадов ... нормально работать, если один из сквадов в оффлайне?

Нет, она не сможет посорить НПС которые в офлайне.

Цитата sergej5500 ()
Для нормальной работы функции, предложенной denis2000, нужен онлайн-радиус 250-270 метров.

За основу предложенной функции я как раз и взял функцию set_squads_enemies
Там либо get_story_object(***) возвращает nil или :set_relation() не работает для обектов в офлайне.

Цитата sergej5500 ()
Еще один вопрос. Можно ли схему, описанную тут, применить для сквада НПС?

Нет, для сквадов она не применима.
Для реализации скорее всего потребуется существенно переписать скрипт sim_squad_scripted.script


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

Доброй ночи. Интересует такой вопрос. В логике работ смартов имеется такой код.
prior = 100

Будет ли он работать, если его добавить в логику несквадовых НПС из СГМ?

Зачем этот параметр несквадовым НПС? denis2000

Добавлено (26.11.2013, 10:49)
---------------------------------------------

Цитата sergej5500 ()
Зачем этот параметр несквадовым НПС? denis2000


Иногда на базе Рассвета, где все НПС несквадовые после квеста на защиту базы от зверья наблюдал такую картину. Мутанты уничтожены, почти все НПС разошлись по своим местам. Один или 2 остаются на огневом рубеже, оружие на изготовку и кричат "Быть наготове". "Всем осмотреться" и т.д.
 
Поиск: