Модостроение. Спавн и логика
|
|
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 за это полезное сообщение: |
|
|
flame4 | Дата: Ср, 19.08.2015, 23:25 | Сообщение # 1216 |
Отмычка
Пользователи
Сообщений: 43
| Однако в оригинале все было, и как то прятались и выживали
|
|
|
Эти 0 пользователя(ей) поблагодарили flame4 за это полезное сообщение: |
|
|
denis2000 | Дата: Чт, 20.08.2015, 09:30 | Сообщение # 1217 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата 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 ;По окончании выброса переключиться на секцию в которой НПС займет обычное место
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
STALKER_ICEBERG | Дата: Чт, 20.08.2015, 12:44 | Сообщение # 1218 |
Сталкер
Пользователи
Сообщений: 180
| В том то и проблема, что по приходу в укрытие НПС не увидит там места под лагерь. Вот, спрашивается, почему все сталкеры бегут в одно и тоже укрытие раз за разом (Затон - Скадовск, Янов - Янов, Припять - Прачечная)? Потому, что для них в других местах не прописано, что они будут делать по приходу туда (стоять за столами? лежать на полу? сидеть на ящиках?). Именно поэтому они и бегут в специально обставленные разработчиками лагеря, коих на Кордоне, Болотах, Агропроме и так далее не было потому, что в тех версиях НПС не были столь продуманы. Да и лагерей крупных тогда там не было (назовите хоть один безопасный лагерь, на который стоит иммунитет от нападений мутантов, других людей и так далее).
Сообщение отредактировал STALKER_ICEBERG - Чт, 20.08.2015, 12:44 |
|
|
Эти 0 пользователя(ей) поблагодарили STALKER_ICEBERG за это полезное сообщение: |
|
|
denis2000 | Дата: Чт, 20.08.2015, 13:30 | Сообщение # 1219 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| 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, укрытие от выброса на одного НПС. А на новых локациях каждому НПС индивидуально разъясните куда бежать и что делать во время выброса или тому подобного.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
flame4 | Дата: Пт, 21.08.2015, 23:38 | Сообщение # 1220 |
Отмычка
Пользователи
Сообщений: 43
| Я так понял это придется все прописывать на каждой локации? И получается в самом начале такого прописания как: [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]
|
|
|
Эти 0 пользователя(ей) поблагодарили flame4 за это полезное сообщение: |
|
|
denis2000 | Дата: Вт, 25.08.2015, 08:38 | Сообщение # 1221 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата flame4 ( ) Я так понял это придется все прописывать на каждой локации? Вы же сами этого хотели. Цитата flame4 ( ) самом вверху есть такие прописания как Это определены дефолтные настройки различных симуляционных объектов.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
СерёгаПепел | Дата: Вс, 27.09.2015, 12:15 | Сообщение # 1222 |
Гражданский
Пользователи
Сообщений: 17
| Всем привет! Я в своём моде на ЗП заспавнил рюкзак с вещами рядом с Ноем. Какую сделать логику, чтобы при открытии рюкзака Ной становился врагом?
Вступи в Смерть, объедини Зону!
|
|
|
Эти 0 пользователя(ей) поблагодарили СерёгаПепел за это полезное сообщение: |
|
|
makdm | Дата: Вс, 27.09.2015, 12:38 | Сообщение # 1223 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| СерёгаПепел, логика 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
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
СерёгаПепел | Дата: Вс, 27.09.2015, 13:14 | Сообщение # 1224 |
Гражданский
Пользователи
Сообщений: 17
| makdm, а эту логику приделать к рюкзаку?
Вступи в Смерть, объедини Зону!
|
|
|
Эти 0 пользователя(ей) поблагодарили СерёгаПепел за это полезное сообщение: |
|
|
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 |
|
|
Эти 0 пользователя(ей) поблагодарили OtamanUa за это полезное сообщение: |
|
|
denis2000 | Дата: Сб, 17.10.2015, 16:53 | Сообщение # 1226 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата OtamanUa ( ) И получаю вылет с отсылкой на скрипты... Не подскажете а чем проблема? Выкладываем лог. И подробно правки. А по первой части вопроса - по моему есть несколько модов в которых захват баз противника реализован не хотите поковырять их?
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
sergej5500 | Дата: Сб, 31.10.2015, 11:29 | Сообщение # 1227 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый день.
В аддоне Время Альянса есть кодовые рюкзаки. При неверном коде они взрываются.
Попробовал сделать на их базе персональные рюкзаки неписей. Код разминирования у непися в квестовой записке. Записку можно снять с трупа. Или получить как награду за квест. Недостаток этого способа очевиден. Зная код, например, запомнив с прошлого прохождения, можно разминировать рюкзак до получения записки. Я попробовал сделать так.
[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.
Как это правильно сделать?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
makdm | Дата: Сб, 31.10.2015, 12:40 | Сообщение # 1228 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата sergej5500 ( ) Зная код, например, запомнив с прошлого прохождения, можно разминировать рюкзак до получения записки
sergej5500, мод "Время Альянса" морально устарел в плане скриптов. Смотреть нужно мод "Припять. Точка Отсчёта" Там эта проблема решена. Т.е. мало знать код от тайника. Нужно ещё этот код получить честным путём. В логику тайника добавлены параметры и изменена функция открытия рюкзака. Если просто тупо ввести даже правильный код, то рюкзак взорвётся, если код ещё не получен по игре.
Возьмите готовое решение и не мучайтесь.
Терпение...... И все получится!
Сообщение отредактировал makdm - Сб, 31.10.2015, 12:49 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
sergej5500 | Дата: Вт, 17.11.2015, 23:17 | Сообщение # 1229 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый вечер.
Адаптировал на чистый Зов Припяти схему 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 |
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Ср, 18.11.2015, 11:46 | Сообщение # 1230 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| sergej5500, Ни в схеме ни в логике не видно предпосылок к такому поведению. Единственное что смущает, пояснение в заголовке: Схема Компаньон для связки Актор - Монстр. Но насколько я вижу, она довольно универсальна. Для проверки попробуйте использовать стандартную схему companion.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
|