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


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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
makdmДата: Вт, 18.11.2014, 19:48 | Сообщение # 1036
Рожденный в СССР
Разработчики
Сообщений: 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 | Сообщение # 1037
Сталкер
Разработчики
Сообщений: 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 | Сообщение # 1038
Гражданский
Пользователи
Сообщений: 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 | Сообщение # 1039
Полевой исследователь
Ученые сталкеры
Сообщений: 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 | Сообщение # 1040
Полевой Исследователь
Ученые сталкеры
Сообщений: 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 | Сообщение # 1041
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

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

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

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

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


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

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

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

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

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


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

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

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
sergej5500Дата: Сб, 29.11.2014, 20:00 | Сообщение # 1045
Полевой Исследователь
Ученые сталкеры
Сообщений: 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 | Сообщение # 1046
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
sergej5500Дата: Вс, 30.11.2014, 01:35 | Сообщение # 1047
Полевой Исследователь
Ученые сталкеры
Сообщений: 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 градусов вокруг петель и снова принудительно открываются.
 
ДизельДата: Вс, 30.11.2014, 02:53 | Сообщение # 1048
Сталкер
Разработчики
Сообщений: 260
Награды: 1
Репутация: [ 136 ]

Цитата sergej5500 ()
%+jup_a6_main_door_open%
Может дело в этом? +- событие одинаковое на двери в логиках дверей. Одна логика на одной локации, заставляет меняться в логике у других дверей на другой локе. Короче, исполнение противоречит событию. Или я может туплю в очередной раз. Это догадки просто.


andreyholkin
 
СахарДата: Вс, 30.11.2014, 07:31 | Сообщение # 1049
Гражданский
Пользователи
Сообщений: 2
Награды: 4
Репутация: [ 69 ]

Доброго здравия всем написал такую логику.
Код
; Телепортируем ГГ чтобы он не ушёл за пределы локаций.
[logic]
active = sr_idle

[sr_idle]
on_actor_inside = %=teleport_actor(teleport_1_walk:teleport_1_look)%

Задумка такая ГГ попадает в рескриптов и его телепортирует на заданную точку.
Но когда я захожу в рескриптор нечего не происходит.




Сообщение отредактировал Сахар - Вс, 30.11.2014, 07:33
 
FantomICWДата: Вс, 30.11.2014, 09:36 | Сообщение # 1050
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

Сахар, приветствую.
1) Давай начнем с банального: спавн перепаковал/скопировал правильно?
2) Координаты точно верные?



 
Поиск: