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


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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
ДизельДата: Вт, 18.11.2014, 15:27 | Сообщение # 1051
Сталкер
Разработчики
Сообщений: 260
Награды: 1
Репутация: [ 136 ]

Цитата sergej5500 ()
path_walk = surge_czech_walk
path_look = surge_czech_look


Это всего лишь вей поинты, они могут быть различны в названиях, зависит от сборки локации, либо от внесения в аллспавн их. В логике они являются вектором.

Хотя я молчу, что там вы нагородили я не знаю, может вы и правы.

Если работаете в Зов Припяти, то на выброс, это легко сделать при помощи создания анипоинта в смарт кавере. Так будет работать точно - проверено, хотя если нет там аи сетки, то тоже не фига не получится.


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

Добрый день.

Сделал рестриктор радиоточки.

[cut=Логика][logic]
active = sr_idle@start

[sr_idle@start]
on_info = {=dist_to_actor_le(10)} sr_idle@stop %=play_sound(radio_music)%

[sr_idle@stop]
on_info = {=dist_to_actor_ge(25)} sr_idle@start %=stop_sound%[/cut]

[cut=script_sound][radio_music]
type = 3d
path = radio_music\radio_music_
shuffle = rnd
idle = 0,0,100[/cut]

В папке sounds\radio_music имеется 30 файлов radio_music_1, radio_music_2, radio_music_3 и т.д.

При подходе к приемнику (рестриктору) рандомно запускается одна из композиций. Если просто стоять и слушать, то после окончания трека музыка прекращается. Чтобы запустить музыку по новой, надо отойти на 25 метров. Потом вернуться к рестриктору.

Вопрос такой. Можно ли сделать так, чтобы после окончания ролика немедленно запускался следующий? Музыка должна звучать непрерывно. Что надо поправить?
 
makdmДата: Вт, 18.11.2014, 19:48 | Сообщение # 1053
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата sergej5500 ()
чтобы после окончания ролика немедленно запускался следующий?


[sr_idle@stop]
on_info = {=dist_to_actor_ge(25)} sr_idle@start %=stop_sound%
on_info2 = {!is_playing_sound()} sr_idle@start


Терпение......
И все получится!
 
ДизельДата: Ср, 19.11.2014, 03:11 | Сообщение # 1054
Сталкер
Разработчики
Сообщений: 260
Награды: 1
Репутация: [ 136 ]

Цитата makdm ()
Вопрос такой. Можно ли сделать так, чтобы после окончания ролика немедленно запускался следующий? Музыка должна звучать непрерывно. Что надо поправить?


Музыка должна играть, сменяясь сама. Значит неправильно создали логику.

Я свой пример приведу, а там разгребите попробуйте. Может работает, не ругайтесь если не пашет при выбросе, я давно её не включал.

[cut noguest]#include "dizel_sound_autostation.ltx" добавить в Z:\S.T.A.L.K.E.R. - Зов Припяти\gamedata\configs\misc\script_sound.ltx

Дописать в лист:
    : list_music_and_stories, list_script_sound_zaton, list_script_sound_jupiter, list_script_sound_pripyat, list_script_sound_underpass, list_dizel_sound_autostation

    Далее:

    Создать Z:\S.T.A.L.K.E.R. - Зов Припяти\gamedata\configs\misc\dizel_sound_autostation.ltx

    Написать в нём:

    [list_dizel_sound_autostation]
    avto_bar_ph_music
    avto_bar_ph_music_surge

    [avto_bar_ph_music]
    type = 3d
    path = avto_bar_ph_music\avto_bar_ph_music_
    shuffle = rnd
    idle = 1,2,10
    play_always = true
    npc_prefix = false

    [avto_bar_ph_music_surge]
    type = 3d
    path = avto_bar_ph_music\avto_bar_ph_music_surge_
    shuffle = rnd
    idle = 1,2,10
    play_always = true
    npc_prefix = false

    Создать файл avto_bar_ph_music.ltx в Z:\S.T.A.L.K.E.R. - Зов Припяти\gamedata\configs\scripts\avto_bar_ph_music\

    Написать в нём:

    [logic]
    active = ph_idle@wait

    [ph_idle@wait]
    on_info = {-avto_sr_light_off} ph_idle@ph_sound3000
    on_info2 = {+avto_sr_light_off} ph_idle@ph_sound
    on_info3 = { =surge_complete =actor_in_zone(avto_surge_hide_centr_krysha)} ph_idle@ph_sound3000_rupor

    [ph_idle@ph_sound3000]
    on_info = %=play_sound(avto_bar_ph_music)%
    on_game_timer = 10 | {=surge_complete =actor_in_zone(avto_surge_hide_centr_krysha)}ph_idle@ph_sound

    [ph_idle@ph_sound]
    on_game_timer = 10 | ph_idle@ph_sound3000_surge %=stop_sound(avto_bar_ph_music)%

    [ph_idle@ph_sound3000_surge]
    on_info = %=play_sound(avto_bar_ph_music_surge) %
    on_game_timer = 30 | ph_idle@ph_sound3000_wait

    [ph_idle@ph_sound3000_wait]
    on_info = {-avto_sr_light_off} ph_idle@ph_sound3000 %=stop_sound(avto_bar_ph_music_surge) %

    [ph_idle@ph_sound3000_rupor]
    on_info = {=actor_in_zone(avto_surge_hide_centr_krysha)} ph_idle@wait %=play_sound(avto_bar_ph_music)%

    Далее надо создать в аллспавне простой рестриктор у радиоточки и прописать в нём путь к файлу в конфигах avto_bar_ph_music.ltx

    Закинуть в звуки sounds\avto_bar_ph_music\avto_bar_ph_music_surge_1,2,3....ogg и avto_bar_ph_music_1,2,3...ogg

    Это возможно рабочая схема, к сожалению я давно её не проверял. Это всего лишь направление к вашему действию![/cut]

    andreyholkin

    Сообщение отредактировал Дизель - Вс, 23.11.2014, 14:28
 
СахарДата: Вс, 23.11.2014, 05:56 | Сообщение # 1055
Гражданский
Пользователи
Сообщений: 2
Награды: 4
Репутация: [ 69 ]

Доброго здравия сегодня ковырялся в xr_effects.script и наткнулся на функцию send_tip она служит для отправки сообщений и имеет такую структуру =send_tip(news_id:sender:sender_id) с news_id всё понятно это индфикатор текстовой строки, но вот как использовать sender и sender_id я так и не понял, пробовал так может, кто знает как этими двумя параметрами пользоваться с меня +

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

Сахар, Итак функция xr_effects.send_tip(actor, npc, p), это лишь обертка для функции news_manager.(actor, news_id, timeout, sender, showtime, sender_id), которой передаются еще и не все параметры, а только p[1]=news_id, p[2]=sender, p[3]=sender_id. Достаточно взгянуть на функцию news_manager.(actor, news_id, timeout, sender, showtime, sender_id), чтобы понять для чего нужны эти параметры:
news_id - идентификатор строки текста новости
sender - иконка новости из таблицы tips_icons (строго говоря может быть или строкой - имя иконки или объектом - указателем на НПС отправившего сообщение тогда иконка сообщения есть иконка этого НПС через xr_effects.send_tip естественно не применимо)
sender_id - story_id НПС отправителя используется только для того, чтобы определить не умер ли НПС или не тяжело ранен, если он мертв или ранен то сообщение не отправиться.


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

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

[cut=Логика непися][logic]
prior = 100
known_info = known_info

[known_info]
zat_b100_military_1_serchd[/cut]

Это логика одного из мертвых солдат у вертолета в Железном Лесу.

Согласно справочнику по логике:

Секция known_info

По обыску тела NPC выдает прописанные в секции инфопорции.

[known_info]
info1
info2


Есть два вопроса.

1. Трупы солдат в Железном Лесу "вечные". Они валяются и после осмотра вертолета. После визита в Припять. Уборщик их не берет. По крайней мере у меня. Данная особенность есть только у неписей с known_info. Связано ли это с known_info, или есть другая причина устойчивости трупов?

2. Можно ли из секции known_info запускать функции в xr_effects? Или можно выдать только инфопорцию?
 
makdmДата: Вт, 25.11.2014, 11:42 | Сообщение # 1058
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата sergej5500 ()
Связано ли это с known_info, или есть другая причина устойчивости трупов?

Связано напрямую.

Цитата sergej5500 ()
Можно ли из секции known_info запускать функции в xr_effects?

Только инфопорцию.


Терпение......
И все получится!
 
alex_xp_77Дата: Вт, 25.11.2014, 16:29 | Сообщение # 1059
Научный сотрудник.
Ученые сталкеры
Сообщений: 242
Награды: 6
Репутация: [ 41 ]

Доброго вечера всем !!!Не так давно спрашивал логику на спринт, получил логику данного формата
[logic]
active = walker

[walker]
path_walk = путь_бега
path_look = путь_взгляда
def_state_moving1 = sprint ;ГГ будет бежать из-за выставленной анимации "sprint"
def_state_moving2 = sprint
def_state_moving3 = sprint

Элементарно прописал согласно этой логику создал пути точки
но будьте добры поясните мне почему гг бежит ну вот так в развалку http://www.youtube.com/watch?v=MglmRGR_Vck&feature=youtu.be не подумайте это не реклама, просто мне нужно логику то ли паники то ли страха, что бы он бежал просто без оружия и не смотрел на мутантов, есть же такой бег, очень жаль, не могу доделать до конца видеоролик, правда он еще в плане теста, помгите прописать правильно,
тут логика нпс http://SSMaker.ru/efb591f0/ --- перепробовал все версии которые только возможны
тут логика вей путь http://SSMaker.ru/0c14b104/ ---видно весь путь
может кто то знает логику паники, или может какую мою ошибку покажет но по путям перепробовал тоже все позиции


 
denis2000Дата: Вт, 25.11.2014, 19:03 | Сообщение # 1060
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

alex_xp_77, sprint - это довольно медленный бег НПС (бег трусцой на уровне быстрого шага ГГ), пробуй другие анимационные состояния из файла state_lib.script, там должен быть и быстрее, вроде rush быстрее...

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
alex_xp_77Дата: Вт, 25.11.2014, 21:26 | Сообщение # 1061
Научный сотрудник.
Ученые сталкеры
Сообщений: 242
Награды: 6
Репутация: [ 41 ]

Цитата denis2000 ()
sprint - это довольно медленный бег НПС
Я тут порылся немного в анимках, получается вот такая картина ;
|a=rush бежит с оружием

|a=run Бежит с оружием в руках
|a=sprint быстро бежит (а-ля сталкер Вобла с артом) без оружия\не прицеливаясь
Он бежит при спринте спокойно потому что ему ничего не угрожает, мне нужна помощь, а именно в логике что бы прописать коэф. паники, прошу прощения, я логике нуб, и сам сочеинить не смогу , если есть соображения на сей счет прошу обьяснить


 
denis2000Дата: Вт, 25.11.2014, 22:45 | Сообщение # 1062
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

alex_xp_77, def_state_moving = sprint - означает, что НПС будет быстро бежать ДО ПЕРВОЙ ТОЧКИ СВОЙ РАБОТЫ (до первой точки пути), чтобы он бежал по всему пути, на всех точках этого самого пути должна стоять соответствующая анимация: wp00|a=sprint

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

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

Возникло несколько вопросов.

1. Увидел в консоли желтую надпись.

~ cannot remove restriction with id [9803][jup_b211_zone_mine_acidic_average] to the entity with id [17093][jup_b6_bloodsucker_117093], because it is not added

Чем то движку не приглянулась секция.

[cut=Секция][9762]

; cse_abstract properties
section_name = zone_mine_acidic_average
name = jup_b211_zone_mine_acidic_average
position = 259.21484375, -5.2786750793457, 436.170776367188
direction = 0, 0, 0
id = 65535
version = 128
script_version = 12
spawn_id = 7493

; cse_alife_object properties
game_vertex_id = 522
distance = 12.599999
level_vertex_id = 1150504
object_flags = 0xffffff3e

; cse_shape properties
shapes = 1
shape_0:type = sphere
shape_0:offset = 0,0,0
shape_0:radius = 2

; cse_alife_space_restrictor properties
restrictor_type = 0

; cse_alife_custom_zone properties

; cse_alife_anomalous_zone properties
offline_interactive_radius = 30
artefact_spawn_count = 32
artefact_position_offset = 0x3ca0

; se_zone_anom properties

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;[/cut]

В секции вроде ничего криминального нет. Кроме restrictor_type = 0. У большинства предметов restrictor_type = 3. Вопрос, чем нулевой тип отличается от третьего?

2. В консоли красные надписи типа

! ERROR: SV: can't find children [25040] of parent [-1782603936]
! ERROR: SV: can't find children [25041] of parent [-1782603440]

Что они могут означать?

3. Вопрос по учебнику Хована. Подключил к СГМ 2.1 локацию Кордон из ЧН. Обнаружил, что неписи не хотят открывать двери на базе сталкеров возле моста. Воспользовался советом Хована.

[cut=Совет]

61. NPC не открывают новые двери

Убедиться что двери заспавнены как physic_door

удалить в ph_door.script функции try_to_open_door и try_to_close_door строку

if true then return {} end
[/cut]

Двери на Кордоне пришли в норму. Зато на Юпитере вылез глюк.



Двери на Янове постоянно открыты. И не закрываются. Проблема в функции if true then return {} end. Если её восстановить, то двери на Янове работают нормально. Зато не работают двери на Кордоне.

4. Непись обшаривает погибшего.




Как называется эта анимация?
 
denis2000Дата: Сб, 29.11.2014, 23:31 | Сообщение # 1064
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

1. Не обращай внимания (обычные стенания движка, что где то что-то не так, но существенных проблем это не вызывает). Разные типы рестрикторов для разных задач, 0 обычно для аномалий, 2 для ограничителей неких областей, а 3 для рестрикторов с логикой.
2. Они значат, что некий объект является зависимым по отношению к некому родительскому объекту (например предмет в инвентаре НПС или в ящике или в трупе), но зависимый объект с ид таким то не найден. Это опасное состояние (так как может привести к вылету в дальнейшем) и нужно обратить внимание на скрипты удаляющие такие объекты.
3. Пропустили первый пункт совета: Убедиться, что двери заспавнены как physic_door.
4. Анимационное состояние называется search_corpse или тебе именно имя анимации? Имя анимации: dinamit_1


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

Цитата denis2000 ()
3. Пропустили первый пункт совета: Убедиться, что двери заспавнены как physic_door.


[cut=Секции дверей.]
[8373]

; cse_abstract properties
section_name = physic_door
name = jup_physic_door
position = -60.2000007629395, 3.90000009536743, 199.600006103516
direction = 0, -1.57079601287842, 0
id = 65535
version = 128
script_version = 12
spawn_id = 6104

; cse_alife_object properties
game_vertex_id = 317
level_vertex_id = 1231404
object_flags = 0xffffff3a
custom_data = <<END
[collide]
ignore_static
ignore_ragdoll

[logic]
cfg = scripts\jupiter\jup_a6_main_doors.ltx
END

; cse_visual properties
visual_name = dynamics\door\door_metal_220x260_01_l

; cse_ph_skeleton properties

; cse_alife_object_physic properties
physic_type = 0x3
mass = 10
fixed_bones = link
upd:num_items = 0x3f

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

[8374]

; cse_abstract properties
section_name = physic_door
name = jup_physic_door_0000
position = -60.2000007629395, 3.90000009536743, 197.399993896484
direction = 0, -1.57079601287842, 0
id = 65535
version = 128
script_version = 12
spawn_id = 6105

; cse_alife_object properties
game_vertex_id = 317
level_vertex_id = 1231404
object_flags = 0xffffff3a
custom_data = <<END
[collide]
ignore_static
ignore_ragdoll

[logic]
cfg = scripts\jupiter\jup_a6_main_doors.ltx
END

; cse_visual properties
visual_name = dynamics\door\door_metal_220x260_01_r

; cse_ph_skeleton properties

; cse_alife_object_physic properties
physic_type = 0x3
mass = 10
fixed_bones = link
upd:num_items = 0x3f

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

[8375]

; cse_abstract properties
section_name = physic_door
name = jup_physic_door_0001
position = -40.2900009155273, 3.90000009536743, 197.399993896484
direction = 0, 1.57081401348114, 0
id = 65535
version = 128
script_version = 12
spawn_id = 6106

; cse_alife_object properties
game_vertex_id = 317
level_vertex_id = 1231404
object_flags = 0xffffff3a
custom_data = <<END
[collide]
ignore_static
ignore_ragdoll

[logic]
cfg = scripts\jupiter\jup_a6_main_doors_2.ltx
END

; cse_visual properties
visual_name = dynamics\door\door_metal_220x260_01_l

; cse_ph_skeleton properties

; cse_alife_object_physic properties
physic_type = 0x3
mass = 10
fixed_bones = link
upd:num_items = 0x3f

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

[8376]

; cse_abstract properties
section_name = physic_door
name = jup_physic_door_0002
position = -40.2900009155273, 3.90000009536743, 199.600006103516
direction = 0, 1.57081401348114, 0
id = 65535
version = 128
script_version = 12
spawn_id = 6107

; cse_alife_object properties
game_vertex_id = 317
level_vertex_id = 1231404
object_flags = 0xffffff3a
custom_data = <<END
[collide]
ignore_static
ignore_ragdoll

[logic]
cfg = scripts\jupiter\jup_a6_main_doors_2.ltx
END

; cse_visual properties
visual_name = dynamics\door\door_metal_220x260_01_r

; cse_ph_skeleton properties

; cse_alife_object_physic properties
physic_type = 0x3
mass = 10
fixed_bones = link
upd:num_items = 0x3f

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;[/cut]

Как physic_door они прописаны разработчиками.

[cut=Логика двери.][logic]
active = ph_door@closed

[ph_door@closed]
closed = true
locked = false
on_use = ph_door@open %+jup_a6_main_door_open%
on_info = {+jup_a6_main_door_open !is_door_blocked_by_npc} ph_door@open
snd_open_start = trader_door_open_start
snd_close_start = trader_door_close_start
snd_close_stop = trader_door_close_stop

[ph_door@open]
closed = false
locked = false
on_use = ph_door@closed %-jup_a6_main_door_open%
on_info = {-jup_a6_main_door_open !is_door_blocked_by_npc} ph_door@closed
on_game_timer = 35 | {!is_door_blocked_by_npc} ph_door@closed %-jup_a6_main_door_open%
snd_open_start = trader_door_open_start
snd_close_start = trader_door_close_start
snd_close_stop = trader_door_close_stop

[ph_door@locked]
closed = true
locked = true
on_info = {=check_smart_alarm_status(jup_a6:normal)} ph_door@closed
snd_open_start = trader_door_locked
tip_open = tip_door_closed_hide_weapon

[ph_door@locked_alarm]
closed = true
locked = true
on_info = {=check_smart_alarm_status(jup_a6:normal)} ph_door@closed
snd_open_start = trader_door_locked
tip_open = tip_door_closed_base_alarm
[/cut]

Двери постоянно открыты. Каждые 5-6 секунд они пытаются закрыться. Поворачиваются на 15-20 градусов вокруг петель и снова принудительно открываются.
 
Поиск: