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

Добрый вечер. Можно ли решить такую задачу?
Есть несколько несквадовых НПС со стори ид: jup_a9_stalker1, jup_a9_stalker2 и т.д. У каждого свой файл логики. Есть сквады НПС со стори ид: jup_a9_alfa_squad1,jup_a9_alfa_squad2 и т.д. Несквадовые НПС относятся к группировке сталкер алиес, сквады к группировке альфа. Группировки взаимно нейтральны друг к другу. Нужно поссорить их друг с другом после выдачи определенной инфопорции. Сталкеры выступят с одной стороны, альфа с другой. Можно ли это сделать и как? Правку отношений группировок делать нежелательно. Нужно, чтобы конкретные сталкеры поссорились с конкретной альфой.
Заранее благодарен за советы.
 
makdmДата: Пт, 08.11.2013, 11:04 | Сообщение # 677
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

sergej5500, в файле xr_effects.script есть готовая функция, которая вызывается из логики НПС и ссорит его с конкретным сквадом.

set_squad_goodwill_to_npc

Срабатывание по поршню выглядит примерно так

on_info = {+поршень_смены_отношений -поршень} %+поршень =set_squad_goodwill_to_npc(jup_a9_alfa_squad1:enemy)%


Терпение......
И все получится!
 
sergej5500Дата: Пт, 08.11.2013, 11:34 | Сообщение # 678
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

makdm,
Спасибо за совет. Ещё один вопрос. Можно ли поссорить конкретный сквад с конкретным НПС? По Вашей формуле НПС ссорится со сквадом. Хотелось бы поссорить их взаимно и одновременно.
 
makdmДата: Пт, 08.11.2013, 12:09 | Сообщение # 679
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

sergej5500, эта функция именно это и делает.
Ссорит одновременно и НПС со сквадом и всех членов сквада с НПС.


Терпение......
И все получится!
 
sergej5500Дата: Вс, 10.11.2013, 10:49 | Сообщение # 680
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый День. Интересует такой момент. В теме "Идеи и предложения для СГМ" неоднократно предлагались идеи квестов по "тихому" устранению враждебных НПС на вражеской базе. Поэтому есть вопросы. Есть ли возможность отследить, от какого оружия получен хит? Выделяются ли отдельно хиты от ножа и оружия с глушителем? Можно ли в логике НПС прописать что-то типа: если НПС завалили с ножа, то всё спокойно, если с СВД, то вся база нападёт на ГГ?
 
denis2000Дата: Ср, 13.11.2013, 16:33 | Сообщение # 681
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, Косвенным путем определить оружие из которого завалил НПС ГГ можно: в колбеке на хит НПС определять если хит нанес ГГ, то считать активный слот и соответственно активное оружие - если это слот ножа, то оружие соответственно нож. Тихая миссия с ножа на базе есть в моде "Время Альянса", там реализация очень хорошая (естественно в пределах возможностей движка)

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
makdmДата: Ср, 13.11.2013, 17:16 | Сообщение # 682
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

sergej5500, без лишней скромности, дополню ответ Дениса, что схема, когда отслеживается выстрел из оружия с глушителем или без него , также реализована в аддоне "Время Альянса". В случае выстрела без глушака поднимается тревога.
Всё можно посмотреть, скачав аддон " Время Альянса". Схема с глушителем в файле xr_conditions.script
Функция wpn_has_silencer


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


Сообщение отредактировал makdm - Ср, 13.11.2013, 17:20
 
sergej5500Дата: Пн, 18.11.2013, 20:14 | Сообщение # 683
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый вечер. Я сделал квестовый сейф, для открытия которого нужны три ключа. №1, №2 и №3. При тестировании обнаружил следующее.
1. Если ГГ пытается открыть сейф за три попытки, используя каждый раз один ключ, то все нормально. Порядок использования ключей любой. Все работает.
2. Если игрок пытается открыть сейф за две попытки, имея первый раз один ключ, второй раз два оставшихся ключа, то все нормально. Порядок использования ключей любой. Все работает.
3. Если игрок имеет сразу три ключа, то все нормально.
4. Если игрок имеет в первый заход ключи №1 и №2, то процесс зависает. Висит надпись "Использовать ключи", но действия нет. Если у игрока в первый заход ключи №1 и №3, или №2 и №3, то процесс срабатывает. При втором заходе с третьим ключом в этих случаях сейф открывается.

[cut=Логика сейфа][logic]
active = ph_idle@zapert

[ph_idle@zapert]
nonscript_usable = false
tips = rasvet_addon_inventory_box_zapert
on_info = {=actor_has_item(way_jup_pripyat_box_key_1)} ph_idle@has_one_key, {=actor_has_item(way_jup_pripyat_box_key_2)} ph_idle@has_one_key, {=actor_has_item(way_jup_pripyat_box_key_3)} ph_idle@has_one_key

[ph_idle@has_one_key]
nonscript_usable = false
tips = rasvet_addon_inventory_box_key
on_use = {=actor_has_item(way_jup_pripyat_box_key_1)} ph_idle@first_key %=remove_item(way_jup_pripyat_box_key_1)%, {=actor_has_item(way_jup_pripyat_box_key_2)} ph_idle@first_key %=remove_item(way_jup_pripyat_box_key_2)%, {=actor_has_item(way_jup_pripyat_box_key_3)} ph_idle@first_key %=remove_item(way_jup_pripyat_box_key_3)%
on_info = {=actor_has_item(way_jup_pripyat_box_key_1) =actor_has_item(way_jup_pripyat_box_key_2)} ph_idle@has_two_key, {=actor_has_item(way_jup_pripyat_box_key_1) =actor_has_item(way_jup_pripyat_box_key_3)} ph_idle@has_two_key, {=actor_has_item(way_jup_pripyat_box_key_2) =actor_has_item(way_jup_pripyat_box_key_3)} ph_idle@has_two_key

[ph_idle@has_two_key]
nonscript_usable = false
tips = rasvet_addon_inventory_box_two_key
on_use = {=actor_has_item(way_jup_pripyat_box_key_1) =actor_has_item(way_jup_pripyat_box_key_2)} ph_idle@second_key %=remove_item(way_jup_pripyat_box_key_1) =remove_item(way_jup_pripyat_box_key_2)%, {=actor_has_item(way_jup_pripyat_box_key_1) =actor_has_item(way_jup_pripyat_box_key_3)} ph_idle@second_key %=remove_item(way_jup_pripyat_box_key_1) =remove_item(way_jup_pripyat_box_key_3)%, {=actor_has_item(way_jup_pripyat_box_key_2) =actor_has_item(way_jup_pripyat_box_key_3)} ph_idle@second_key %=remove_item(way_jup_pripyat_box_key_2) =remove_item(way_jup_pripyat_box_key_3)%
on_info = {=actor_has_item(way_jup_pripyat_box_key_1) =actor_has_item(way_jup_pripyat_box_key_2) =actor_has_item(way_jup_pripyat_box_key_2)} ph_idle@has_tru_key

[ph_idle@has_tru_key]
nonscript_usable = false
tips = rasvet_addon_inventory_box_two_key
on_use = {=actor_has_item(way_jup_pripyat_box_key_1) =actor_has_item(way_jup_pripyat_box_key_2) =actor_has_item(way_jup_pripyat_box_key_3)} ph_idle@open %=remove_item(way_jup_pripyat_box_key_1) =remove_item(way_jup_pripyat_box_key_2) =remove_item(way_jup_pripyat_box_key_3)%

[ph_idle@first_key]
nonscript_usable = false
tips = rasvet_addon_inventory_box_zapert
on_info = {=actor_has_item(way_jup_pripyat_box_key_1)} ph_idle@first_one_key, {=actor_has_item(way_jup_pripyat_box_key_2)} ph_idle@first_one_key, {=actor_has_item(way_jup_pripyat_box_key_3)} ph_idle@first_one_key

[ph_idle@first_one_key]
nonscript_usable = false
tips = rasvet_addon_inventory_box_key
on_use = {=actor_has_item(way_jup_pripyat_box_key_1)} ph_idle@second_key %=remove_item(way_jup_pripyat_box_key_1)%, {=actor_has_item(way_jup_pripyat_box_key_2)} ph_idle@second_key %=remove_item(way_jup_pripyat_box_key_2)%, {=actor_has_item(way_jup_pripyat_box_key_3)} ph_idle@second_key %=remove_item(way_jup_pripyat_box_key_3)%
on_info = {=actor_has_item(way_jup_pripyat_box_key_1) =actor_has_item(way_jup_pripyat_box_key_2)} ph_idle@first_two_key, {=actor_has_item(way_jup_pripyat_box_key_1) =actor_has_item(way_jup_pripyat_box_key_3)} ph_idle@first_two_key, {=actor_has_item(way_jup_pripyat_box_key_2) =actor_has_item(way_jup_pripyat_box_key_3)} ph_idle@first_two_key

[ph_idle@first_two_key]
nonscript_usable = false
tips = rasvet_addon_inventory_box_two_key
on_use = {=actor_has_item(way_jup_pripyat_box_key_1) =actor_has_item(way_jup_pripyat_box_key_2)} ph_idle@open %=remove_item(way_jup_pripyat_box_key_1) =remove_item(way_jup_pripyat_box_key_2)%, {=actor_has_item(way_jup_pripyat_box_key_1) =actor_has_item(way_jup_pripyat_box_key_3)} ph_idle@open %=remove_item(way_jup_pripyat_box_key_1) =remove_item(way_jup_pripyat_box_key_3)%, {=actor_has_item(way_jup_pripyat_box_key_2) =actor_has_item(way_jup_pripyat_box_key_3)} ph_idle@open %=remove_item(way_jup_pripyat_box_key_2) =remove_item(way_jup_pripyat_box_key_3)%

[ph_idle@second_key]
nonscript_usable = false
tips = rasvet_addon_inventory_box_zapert
on_info = {=actor_has_item(way_jup_pripyat_box_key_1)} ph_idle@second_one_key, {=actor_has_item(way_jup_pripyat_box_key_2)} ph_idle@second_one_key, {=actor_has_item(way_jup_pripyat_box_key_3)} ph_idle@second_one_key

[ph_idle@second_one_key]
nonscript_usable = false
tips = rasvet_addon_inventory_box_key
on_use = {=actor_has_item(way_jup_pripyat_box_key_1)} ph_idle@open %=remove_item(way_jup_pripyat_box_key_1)%, {=actor_has_item(way_jup_pripyat_box_key_2)} ph_idle@open %=remove_item(way_jup_pripyat_box_key_2)%, {=actor_has_item(way_jup_pripyat_box_key_3)} ph_idle@open %=remove_item(way_jup_pripyat_box_key_3)%

[ph_idle@open]
nonscript_usable = true
tips = rasvet_addon_inventory_box_open[/cut]

Проблема, полагаю в секции has_two_key. Но я не вижу тут ошибки. Может, кто-нибудь увидит её "свежим" взглядом. Заранее благодарен за советы.
 
makdmДата: Пн, 18.11.2013, 21:06 | Сообщение # 684
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

sergej5500, секция

[ph_idle@has_two_key]

вот это посмотрите

on_info = {=actor_has_item(way_jup_pripyat_box_key_1) =actor_has_item(way_jup_pripyat_box_key_2) =actor_has_item(way_jup_pripyat_box_key_2)}


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


Сообщение отредактировал makdm - Пн, 18.11.2013, 21:06
 
sergej5500Дата: Пн, 18.11.2013, 23:09 | Сообщение # 685
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

makdm,
Спасибо за совет. Помогло. Я попробовал переделать логику и обобщить её для произвольного числа ключей.
Уже для трех ключей логика довольно сложная. В xr_conditions добавил код

[cut=Функция]function way_jup_pripyat_box_key_has_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[/cut]

Если найден один ключ (любой), то функция должна вызывать true. Получил

[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 : ...files 1\Зов Припяти\gamedata\scripts\xr_logic.script:477: attempt to index global 'xr_conditions' (a nil value)


stack trace:[/cut]

Вопрос, как правильно в xr_conditions составить функцию подсчета кол-ва инфопорций?
 
makdmДата: Пн, 18.11.2013, 23:18 | Сообщение # 686
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

sergej5500, лог говорит о том, что у Вас синтаксическая ошибка в файле xr_conditions
У Вас не хватает либо end, либо if, либо then и т.д.

Можно написать проще

function way_jup_pripyat_box_key_has_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"
}

for k,v in pairs (info_table) do
if has_alife_info(v) then
return true
end
end
return false
end

Что Вы имеете ввиду, когда пишите про подсчета кол-ва инфопорций?


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


Сообщение отредактировал makdm - Пн, 18.11.2013, 23:50
 
FantomICWДата: Вт, 19.11.2013, 00:03 | Сообщение # 687
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

sergej5500, если не ошибаюсь, то сама ошибка была в следующем:
Код
if count = 1 then

Должно быть:
Код
if count == 1 then

То есть, был не поставлен второй знак =.





Сообщение отредактировал FantomICW - Вт, 19.11.2013, 00:04
 
sergej5500Дата: Вт, 19.11.2013, 00:31 | Сообщение # 688
Полевой Исследователь
Ученые сталкеры
Сообщений: 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 | Сообщение # 689
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
sergej5500Дата: Вт, 19.11.2013, 13:26 | Сообщение # 690
Полевой Исследователь
Ученые сталкеры
Сообщений: 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.
 
Поиск: