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


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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
flame4Дата: Ср, 19.08.2015, 23:25 | Сообщение # 1216
Отмычка
Пользователи
Сообщений: 43
Награды: 0
Репутация: [ 0 ]

Однако в оригинале все было, и как то прятались и выживали dry
 
denis2000Дата: Чт, 20.08.2015, 09:30 | Сообщение # 1217
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата STALKER_ICEBERG ()
Чиво? Я ж не продвинутый, не умею такого.

Учитесь модостроению, не хотите учиться? Тогда никто вам помочь не сможет.
Цитата STALKER_ICEBERG ()
я имею ввиду скопировать текст оттуда (с Земснаряда), изменить колличество сталкеров и маршрут и все.

Если бы просто нужно было скопировть текст, я так бы и сказал - скопируйте текст.
Цитата STALKER_ICEBERG ()
В 6м уроке описаны сквады и создание клана отдельного.

Ине только это, но и многое многое другое, например создание симуляционного сквада, создание симуляционного смарта.
Цитата STALKER_ICEBERG ()
На стандартных локациях прячутся и умирают. Что касается Кордона, Агропрома, Болот и так далее - там у них смерть от выброса не заскриптована, ровно также, как и не сделаны укрытия.

Цитата flame4 ()
Однако в оригинале все было, и как то прятались и выживали

Ок расскажу просто:
1. В оригинале два типа сквадов: статические и симуляционные (динамические). Статические стоят в укрытиях изначально и никуда оттуда не уходят (а если уходят, то выброс их все равно не убивает поскольку у сквада прописан стори_ид). Симуляционные (не имеют стори_ид) ходят по смартам в дневное время, во время выброса идут на ближайщий свободный смарт помеченный как имеющий укрытие от выброса и имеющий работы для НПС во время выброса.
НПС из статического сквада имеют индивидуальную (эксклюзивную логику). НПС из симуляционного сквада не имеют индивидуальной логики и им на смартах она назначается динамически из имеющегося списка работ.
2. НПС добавленные в моде в принципе не состоят в сквадах (в подавляющем большинстве) и обладают индивидуальной логикой.
Соответственно:
1. Статическим сквадам из оригинала не нужно идти в укрытия - они и так в нем.
2. Симуляционные сквады автоматически идут на смарт с укрытием (если на локации конечно организованы таковые)
3. КАЖДОМУ НПС добавленному модом и не состоящему в скваде (никаком) нужно индивидуально во всех рабочих секциях логики прописывать реакцию на выброс типа:
Код

[walker@jup_a10_bandit_guard_1]
path_walk = jup_a10_bandit_guard_1_walk
path_look  = jup_a10_bandit_guard_1_look
on_info = {=surge_started} walker@surge ;В случае выброса переключиться на секцию в которой НПС займет место в укрытиии

[walker@surge]
path_walk = bodyguard_1_walk
path_look  = bodyguard_1_look
on_info = {=surge_complete} walker@jup_a10_bandit_guard_1 ;По окончании выброса переключиться на секцию в которой НПС займет обычное место


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
STALKER_ICEBERGДата: Чт, 20.08.2015, 12:44 | Сообщение # 1218
Сталкер
Пользователи
Сообщений: 180
Награды: 1
Репутация: [ 24 ]

В том то и проблема, что по приходу в укрытие НПС не увидит там места под лагерь. Вот, спрашивается, почему все сталкеры бегут в одно и тоже укрытие раз за разом (Затон - Скадовск, Янов - Янов, Припять - Прачечная)? Потому, что для них в других местах не прописано, что они будут делать по приходу туда (стоять за столами? лежать на полу? сидеть на ящиках?). Именно поэтому они и бегут в специально обставленные разработчиками лагеря, коих на Кордоне, Болотах, Агропроме и так далее не было потому, что в тех версиях НПС не были столь продуманы. Да и лагерей крупных тогда там не было (назовите хоть один безопасный лагерь, на который стоит иммунитет от нападений мутантов, других людей и так далее).

Сообщение отредактировал STALKER_ICEBERG - Чт, 20.08.2015, 12:44
 
denis2000Дата: Чт, 20.08.2015, 13:30 | Сообщение # 1219
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

STALKER_ICEBERG, Нет укрытий - пропишите. Создайте смарт, впишите в файл simulation_objects_props.ltx секцию смарта и поставьте в ней:
Код
surge = 1
sim_avail = true

Что и будет означать, что смарт доступен симуляционным отрядам и там есть убежище от выброса. Создайте работы на смарте типа:
Код
[zat_b100_surge_1_look]
points = p0
p0:name = wp00
p0:flags = 0x1
p0:position = -426.207611083984,39.8848838806152,-396.382263183594
p0:game_vertex_id = 306
p0:level_vertex_id = 139078

[zat_b100_surge_1_walk]
points = p0
p0:name = wp00
p0:flags = 0x1
p0:position = -430.798126220703,38.0370330810547,-396.254180908203
p0:game_vertex_id = 306
p0:level_vertex_id = 133533

Это для смарта zat_b100, укрытие от выброса на одного НПС.
А на новых локациях каждому НПС индивидуально разъясните куда бежать и что делать во время выброса или тому подобного.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
flame4Дата: Пт, 21.08.2015, 23:38 | Сообщение # 1220
Отмычка
Пользователи
Сообщений: 43
Награды: 0
Репутация: [ 0 ]

Я так понял это придется все прописывать на каждой локации?
И получается в самом начале такого прописания как:
[cut noguest=Пример];--------- ZATON UNIQUE SQUADS --------
[zat_b38_bloodsucker_simulation]:default_squad
sim_avail = false

[zat_b38_bloodsucker_1_lair]:default_squad
sim_avail = false

[zat_b38_bloodsucker_2_lair]:default_squad
sim_avail = false

[zat_b38_bloodsuckers_sleepers]:default_squad
sim_avail = false[/cut]
Если не ошибаюсь? И причем в каждой локации.
Но в самом вверху есть такие прописания как:
[cut noguest][default]
base = 0
resource = 0 ; артефакты
surge = 0 ; укрытие
lair = 0 ; логово монстров
territory = 0
actor = 0
squad = 0

[default_resource]:default
resource = 2
territory = 1

[default_base]:default
base = 2
territory = 0

[default_lair]:default
lair = 2
territory = 1

[default_squad]:default
squad = 2

[default_territory]:default
territory = 1[/cut]
 
denis2000Дата: Вт, 25.08.2015, 08:38 | Сообщение # 1221
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата flame4 ()
Я так понял это придется все прописывать на каждой локации?

Вы же сами этого хотели.
Цитата flame4 ()
самом вверху есть такие прописания как

Это определены дефолтные настройки различных симуляционных объектов.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
СерёгаПепелДата: Вс, 27.09.2015, 12:15 | Сообщение # 1222
Гражданский
Пользователи
Сообщений: 17
Награды: 0
Репутация: [ 8 ]

Всем привет! Я в своём моде на ЗП заспавнил рюкзак с вещами рядом с Ноем. Какую сделать логику, чтобы при открытии рюкзака Ной становился врагом?

Вступи в Смерть, объедини Зону!
 
makdmДата: Вс, 27.09.2015, 12:38 | Сообщение # 1223
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

СерёгаПепел, логика ph_idle

Код
[logic]
active = ph_idle@enable

[ph_idle@enable]
nonscript_usable = true
tips = st_search_treasure
on_use = ph_idle@enable_1 %+zat_b18_actor_enemy%

[ph_idle@enable_1]
nonscript_usable = true
tips = st_search_treasure


Терпение......
И все получится!
 
СерёгаПепелДата: Вс, 27.09.2015, 13:14 | Сообщение # 1224
Гражданский
Пользователи
Сообщений: 17
Награды: 0
Репутация: [ 8 ]

makdm, а эту логику приделать к рюкзаку?

Вступи в Смерть, объедини Зону!
 
OtamanUaДата: Сб, 17.10.2015, 12:26 | Сообщение # 1225
Удаленные



Здравствуйте, вообщем надоело, что на Болотах ЧН остаются ренегаты, на северном хуторе, дороге в Агропром и т.д. В файле faction_csky.ltx изменил уровни экспансии, теперь все захватывают кроме Северного хутора. Уже специально прописал отдельный уровень экспансии для этого:

[expansion_3]
base_squad_number = 20
respawn_idle_time = 10; 20
respawn_hours = 6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21
precondition_target_order = order
precondition_target = mar_smart_terrain_12_2

Теперь задание появляется его захватить и отряды выдвигаются на его захват, но вот беда, они идут ровно до ближайшего свободного смарта по пути на северный хутор, занимают его и ВСЁ! И не идут дальше, а новые отряды не появляются для его захвата... Помогите решить проблему пожалуйста.

===

И еще, что то не раздуплюсь как спавнить сквады. В ЗП спавнил все было нормально, а в ЧН что-то не выходит. Вобщем первым делом создаем НПЦ, или берем уже готовые (сим_дефолт_сталкер_0). Потом создаем сквад в сквад_дескр_локация как-то так:
[лока_сквад_кек]
auto_id = true
faction = групировка
npc = сим_дефолт_сталкер_0, сим_дефолт_сталкер_0

Дальше как я понял надо вказать его в файле группировки: faction_групировка.лтх, после [start_position] написать:
лока_сквад_кек = смарт_терейн

И получаю вылет с отсылкой на скрипты... Не подскажете а чем проблема? Может его нужно еще где-то регистрировать, этот сквад?


Сообщение отредактировал OtamanUa - Сб, 17.10.2015, 12:26
 
denis2000Дата: Сб, 17.10.2015, 16:53 | Сообщение # 1226
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата OtamanUa ()
И получаю вылет с отсылкой на скрипты... Не подскажете а чем проблема?

Выкладываем лог. И подробно правки.
А по первой части вопроса - по моему есть несколько модов в которых захват баз противника реализован не хотите поковырять их?


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

Добрый день.

В аддоне Время Альянса есть кодовые рюкзаки. При неверном коде они взрываются.

Попробовал сделать на их базе персональные рюкзаки неписей. Код разминирования у непися в квестовой записке. Записку можно снять с трупа. Или получить как награду за квест. Недостаток этого способа очевиден. Зная код, например, запомнив с прошлого прохождения, можно разминировать рюкзак до получения записки. Я попробовал сделать так.

[cut=Тестовый рюкзак][logic]
active = ph_idle

[ph_idle]
on_info = {+test_open} ph_idle@open

[ph_idle@notes]
on_info = {=actor_has_item(test_open_notes)} ph_code@open, ph_idle@random

[ph_idle@random]
on_info = {~50} ph_idle@1, ph_idle@2

[ph_idle@1]
on_info = {~50} ph_code@default_1, ph_code@default_2

[ph_idle@2]
on_info = {~50} ph_code@default_3, ph_code@default_4

[ph_code@default_1]
code = 111
on_code = ph_idle@open %+test_open =destroy_object(story:test_open_notes)%
on_info = {+test_open} ph_idle@open
on_info2 = {=actor_has_item(test_open_notes)} ph_code@open
tips = st_mine_treasure_open
explode = true

[ph_code@default_2]
code = 222
on_code = ph_idle@open %+test_open =destroy_object(story:test_open_notes)%
on_info = {+test_open} ph_idle@open
on_info2 = {=actor_has_item(test_open_notes)} ph_code@open
tips = st_mine_treasure_open
explode = true

[ph_code@default_3]
code = 333
on_code = ph_idle@open %+test_open =destroy_object(story:test_open_notes)%
on_info = {+test_open} ph_idle@open
on_info2 = {=actor_has_item(test_open_notes)} ph_code@open
tips = st_mine_treasure_open
explode = true

[ph_code@default_4]
code = 444
on_code = ph_idle@open %+test_open =destroy_object(story:test_open_notes)%
on_info = {+test_open} ph_idle@open
on_info2 = {=actor_has_item(test_open_notes)} ph_code@open
tips = st_mine_treasure_open
explode = true

[ph_code@open]
code = 9211
on_code = ph_idle@open %+test_open =remove_item(test_open_notes)%
on_info = {+test_open} ph_idle@open
tips = st_mine_treasure_open
explode = true

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

test_open -- инфопорция открытия
test_open_notes -- записка с кодом

При данной схеме до получения записки выбирается один код из четырех. Разминировать рюкзак можно, но сложно. Тем более, что выбор кода производится при каждом входе рюкзака в онлайн. Число кодов можно увеличить.

Возник вопрос. Можно ли сгенерировать случайное число? Например, от 001 до 999. И использовать его для кодового рюкзака. И отобразить это число в записке. В записке будет строка вида. Код разминирования - 377.

Как это правильно сделать?
 
makdmДата: Сб, 31.10.2015, 12:40 | Сообщение # 1228
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата sergej5500 ()
Зная код, например, запомнив с прошлого прохождения, можно разминировать рюкзак до получения записки


sergej5500, мод "Время Альянса" морально устарел в плане скриптов.
Смотреть нужно мод "Припять. Точка Отсчёта"
Там эта проблема решена.
Т.е. мало знать код от тайника. Нужно ещё этот код получить честным путём.
В логику тайника добавлены параметры и изменена функция открытия рюкзака.
Если просто тупо ввести даже правильный код, то рюкзак взорвётся, если код ещё не получен по игре.

Возьмите готовое решение и не мучайтесь.


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


Сообщение отредактировал makdm - Сб, 31.10.2015, 12:49
 
sergej5500Дата: Вт, 17.11.2015, 23:17 | Сообщение # 1229
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый вечер.

Адаптировал на чистый Зов Припяти схему mob_companion из мода Припять - Точка Отсчёта.

[cut=mob_companion.script]--[[ Схема Компаньон для связки Актор - Монстр
makdm, 2014 для COP 1.6.0.2.
]]--

class "mob_companion"

function mob_companion:__init( obj, storage )
self.object = obj
self.st = storage
self.opened_doors = {}
end

function mob_companion:reset_scheme()
mob_state_mgr.set_state( self.object, db.actor, self.st.state )
xr_logic.mob_capture( self.object, true )
self.assist_point = nil
self.object:disable_talk()
end

function mob_companion:update(delta)

if not xr_logic.mob_captured( self.object ) then
self:reset_scheme()
return
end
if self.object:alive() and self.st.can_open_door then

local opened_doors = self:try_to_open_door()
utils.copy_table( self.opened_doors, opened_doors )

local closed_doors = self:try_to_close_door()
for id,v in pairs( closed_doors ) do
self.opened_doors[ id ] = nil
end

end
self:mob_move_to_actor()
end

function mob_companion:mob_move_to_actor()
local select_new_pt = false
local actor_position = db.actor:position()
local dist_from_self_to_actor = self.object:position():distance_to( actor_position )
local dist_from_assist_pt_to_actor = nil

if self.assist_point then
dist_from_assist_pt_to_actor = level.vertex_position( self.assist_point ):distance_to( actor_position )
end
if dist_from_self_to_actor >= self.st.desired_distance and
( not dist_from_assist_pt_to_actor or dist_from_assist_pt_to_actor >= self.st.desired_distance * 2 ) then
select_new_pt = true
end

if select_new_pt then
self.assist_point = self:select_position()
end
if not self.assist_point then
return
end

if self.object:level_vertex_id() ~= self.assist_point then
action( self.object, move( move.run_fwd, level.vertex_position( self.assist_point ) ) )
return
end

if self.st.target and self.st.target == "actor" then
local look_pt = utils.vector_copy_by_val( actor_position ):sub( self.object:position() )
look_pt:normalize()
action( self.object, look( look.direction, look_pt ), cond( cond.look_end ) )
end
action( self.object, anim( self.st.cur_anim_set, 0 ) )
end

function mob_companion:select_position()
local node_1_vertex_id = nil
local node_1_distance = nil
local node_2_vertex_id = nil
local node_2_distance = nil
local actor = db.actor
local desired_direction = nil

desired_direction = vector_rotate_y( actor:direction(), math.random( 50, 60 ) )
node_1_vertex_id = level.vertex_in_direction(actor:level_vertex_id(),desired_direction, self.st.desired_distance)
if self.object:accessible(node_1_vertex_id) ~= true or node_1_vertex_id == actor:level_vertex_id() then
node_1_vertex_id = nil
end
desired_direction = vector_rotate_y( actor:direction(), -math.random( 50, 60 ) )
node_2_vertex_id = level.vertex_in_direction( actor:level_vertex_id(), desired_direction, self.st.desired_distance )

if self.object:accessible(node_2_vertex_id) ~= true or node_2_vertex_id == actor:level_vertex_id() then
node_2_vertex_id = nil
end
if node_1_vertex_id ~= nil then
node_1_distance = self.object:position():distance_to_sqr( level.vertex_position( node_1_vertex_id ) )
else
node_1_distance = -1
end
if node_2_vertex_id ~= nil then
node_2_distance = self.object:position():distance_to_sqr( level.vertex_position( node_2_vertex_id ) )
else
node_2_distance = -1
end
if node_1_distance == -1 and node_2_distance == -1 then
return nil
end
if node_1_distance == -1 then
return node_2_vertex_id
end
if node_2_distance == -1 then
return node_1_vertex_id
end
if node_1_distance < node_2_distance then
return node_1_vertex_id
else
return node_2_vertex_id
end
end

function mob_companion:try_to_open_door()
local opened_doors = {}
local npc_position = self.object:position()
for id,position in pairs( db.level_doors ) do
if npc_position:distance_to_sqr( position ) <= 4 then
if db.storage[id].ph_door ~= nil then
local action = db.storage[ id ].ph_door.door_action
if action.st.not_for_npc == false and action.st.closed == true then
action:use_callback()
opened_doors[ id ] = true
end
end
end
end
return opened_doors
end

function mob_companion:try_to_close_door()
local npc_position = self.object:position()
local closed_doors = {}
for id, v in pairs( self.opened_doors ) do
if npc_position:distance_to_sqr( db.level_doors[ id ] ) > 4 then
if db.storage[id].ph_door ~= nil then
local action = db.storage[ id ].ph_door.door_action
if action.st.not_for_npc == false and action.st.closed ~= true then
action:use_callback()
closed_doors[ id ] = true
end
end
end
end
return closed_doors
end
----------------------------------------------------------------------------------------------------------------------------------------------
--binder
----------------------------------------------------------------------------------------------------------------------------------------------
function add_to_binder( npc, ini, scheme, section, storage )
local new_action = mob_companion( npc, storage )
xr_logic.subscribe_action_for_events( npc, storage, new_action )
end

function set_scheme( npc, ini, scheme, section, gulag_name )
local storage = xr_logic.assign_storage_and_bind( npc, ini, scheme, section )
storage.logic = xr_logic.cfg_get_switch_conditions( ini, section, npc )
storage.state = mob_state_mgr.get_state( ini, section, npc )
-- расстояние следования рядом с actor, если не указывать, то 2 метра
storage.desired_distance = utils.cfg_get_number( ini, section, "desired_distance", npc, false, 2 )
-- направление взгляда, когда рядом с actor, если не указывать, то куда смотрел, туда и будет смотреть
storage.target = utils.cfg_get_string( ini, section, "target", npc, false, "", nil )
-- может ли монстр сам открывать двери, если не указывать, то не может
storage.can_open_door = utils.cfg_get_bool( ini, section, "can_open_door", npc, false, false )
-- анимация, когда рядом со стоящим actor, если не указывать, то просто стоит рядом
local suggested_anim_set = utils.cfg_get_string( ini, section, "animation", npc, false, "", "stand_idle" )
storage.cur_anim_set = anim[ suggested_anim_set ]

--[[ --Возможные анмации
const attack = 7;
const capture_prepare = 1;
const danger = 0;
const eat = 4;
const free = 1;
const lie_idle = 3;
const look_around = 8;
const panic = 2;
const rest = 6;
const sit_idle = 2;
const sleep = 5;
const stand_idle = 0;
const turn = 9;
]]--
end[/cut]

Для проверки заспавнил непися с кастом-датой.

[cut=Логика][logic]
active = walker

[walker]
path_walk = esc_test_npc_walk
path_look = esc_test_npc_look
def_state_standing = sit_ass
def_state_moving = walk
gather_items_enabled = false
help_wounded_enabled = false
corpse_detection_enabled = false
combat_ignore_cond = true
combat_ignore_keep_when_attacked = true
meet = no_meet
invulnerable = true
on_info = {+addon_test_info} companion

[companion]
combat_ignore_cond = {=fighting_dist_ge(30)} true, false
gather_items_enabled = false
help_wounded_enabled = false
corpse_detection_enabled = false
def_state_moving = assault
def_state_moving1 = assault
def_state_standing = hide_na
post_combat_time = 0,0
meet = no_meet
invulnerable = true[/cut]

Обнаружил такую вещь. Тест проводился на смарте, занятом нейтральными сквадами сталкеров.

[cut=Скрины]





[/cut]

Тестовый непись атаковал нейтралов, перебил сквад, охраняющий лагерь и долго пытался убить бессмертных неписей: торговца, техника и т.д.

Далее я заспавнил тестовый сквад из одного непися и поставил его под схему companion на этом же смарте. Непись повел себя аналогично.

[cut=Скрины]




[/cut]

На скринах видно, как тестовый непись (сквад) пытается убить бессмертного сталкера.

В обоих случаях тестовые неписи принадлежали группировке stalker_alies. Прочие неписи - обычные сталкеры. Между группировками прописан взаимный нейтралитет.

Вопрос такой. Почему неписи нападают на сталкеров, нейтральных к игроку.


Сообщение отредактировал sergej5500 - Вт, 17.11.2015, 23:19
 
denis2000Дата: Ср, 18.11.2015, 11:46 | Сообщение # 1230
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, Ни в схеме ни в логике не видно предпосылок к такому поведению. Единственное что смущает, пояснение в заголовке: Схема Компаньон для связки Актор - Монстр. Но насколько я вижу, она довольно универсальна. Для проверки попробуйте использовать стандартную схему companion.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
Поиск: