|
Модостроение. Спавн и логика
|
|
| 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 за это полезное сообщение: |
|
|
| sergej5500 | Дата: Сб, 18.06.2016, 20:10 | Сообщение # 1291 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Цитата men_stalker (  ) после добавления ещё нескольких переменных в [m_trader] при запуске получил вылет:
Значит, причина в этих переменных. Можно посоветовать только одно. Добавлять их по одной. Смотреть, после какой появится вылет.
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| denis2000 | Дата: Сб, 18.06.2016, 20:28 | Сообщение # 1292 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата men_stalker (  ) всё нормально
Цитата men_stalker (  ) при запуске получил вылет Вы конечно в курсе, что это противоречивые заявления? Выкладывайте правки будем анализировать.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| men_stalker | Дата: Вс, 19.06.2016, 12:44 | Сообщение # 1293 |
 Инженер «Свободы»
Свобода
Сообщений: 184
| sergej5500, вылет происходит после добавления переменной eye_range и равна она100. Если добавлять по одиночке просто жалуется на нехватку этих переменных.
denis2000, creatures: [cut=m_sidor] ;----------------------------------------------------------------------------------- ;Trader ;----------------------------------------------------------------------------------- [m_trader] GroupControlSection = spawn_group $spawn = "monsters\trader" ; option for Level Editor $prefetch = 5 cform = skeleton class = AI_TRADE_S class = AI_TRD_S visual = actors\stalker_trader\stalker_trader_1.ogf terrain = 255,255,255,255,0,1 ; ДОБАВЛЕННЫЕ ПЕРЕМЕННЫЕ eye_range = 100 ; ДОБАВЛЕННЫЕ ПЕРЕМЕННЫЕ rank = 1 script_binding = bind_trader.bind ;format section{,section},count,min_factor,max_factor, ... ;supplies = m_bread,50,0.5,1.5, CANNED,30,0.5,1.5, MEDI_KIT,7,0,0.7, DETECTOR_SIMPLE,3,0,0.6, WPN_BINOC,1,0,0.70, WPN_FORT,WPN_PM,3,0.3,0.8, WPN_LR300,WPN_AK47,2,0.3,0.65, WPN_SVD,1,0,0.53, WPN_RPG7,1,0,0.53, grenade_f1,15,0,1.0, ammo_5.45x39_ap,ammo_5.45x39_fmj,50,0,1.0, ammo_5.56x45_ap,ammo_5.56х45_ss190,50,0,1.0, ammo_9x19_fmj,50,0,1.0, ammo_7.62х54_fmj,10,0,1.0, ammo_og-7b,10,0,1.0 supplies = grenade_f1,15,0,1.0, ammo_5.45x39_ap,ammo_5.45x39_fmj,50,0,1.0, ammo_5.56x45_ap,ammo_5.56х45_ss190,50,0,1.0, ammo_9x19_fmj,50,0,1.0, ammo_7.62x54_ap,10,0,1.0, ammo_og-7b,10,0,1.0 max_item_mass = 10000.0 ;---EVALUATION FUNCTIONS---------------------------------------------- ef_creature_type = 1 ; option for evaluation functions ef_weapon_type = 1
scheduled = on ; option for ALife Simulator Human = off ; option for ALife Simulator Health = 40 ; option for ALife Simulator MinSpeed = 1.0 ; option for ALife Simulator MaxSpeed = 1.5 ; option for ALife Simulator going_speed = 1.0 ; option for ALife Simulator MaxHealthValue = 100 ; option for ALife Simulator ; ДОБАВЛЕННЫЕ ПЕРЕМЕННЫЕ smart_terrain_choose_interval = 00:15:00 ph_box0_center = 0.0, 0.9, 0.0 ph_box0_size = 0.35, 0.9, 0.35 ph_box1_center = 0.0, 0.6, 0.0 ph_box1_size = 0.40, 0.6, 0.40 ph_crash_speed_min = 8;16 ph_crash_speed_max = 16;30 ph_mass = 170. cost = 1
Health = 100.0 money = 1000000 immunities_sect = trader_immunities condition_sect = trader_condition
;attach params attachable_items =
;species of monster species = human
[trader_foot_bones] front_left = bip01_l_foot front_right = bip01_r_foot
[trader_step_manager] ;order: left, right ;-------------------------------------------------------------------------- ;animation Cycles | time1 | power1 | time2 | power2 | ;-------------------------------------------------------------------------- [barman_movement_speeds] ;barman can't crouch or run ; danger ;; crouch ;;; walk danger_crouch_walk_forward = 0.8 danger_crouch_walk_backward = 0.575 danger_crouch_walk_left = 0.8 danger_crouch_walk_right = 0.8 ;;; run danger_crouch_run_forward = 2.0 danger_crouch_run_backward = 1.1 danger_crouch_run_left = 2.0 danger_crouch_run_right = 2.0 ;; stand ;;; walk danger_stand_walk_forward = 1.2 danger_stand_walk_backward = 1.2 danger_stand_walk_left = 1.2 danger_stand_walk_right = 1.2 ;;; run danger_stand_run_forward = 5.0 danger_stand_run_backward = 1.5 danger_stand_run_left = 5.0 danger_stand_run_right = 5.0 ; free ;; stand ;;; forward free_stand_walk_forward = 0.85 free_stand_run_forward = 2.5 ; panic ;; stand ;;; run ;;;; forward panic_stand_run_forward = 6.5 [/cut]
[cut=stalkers]#include "m_stalker.ltx" #include "immunities.ltx" #include "damages.ltx" #include "m_stalker_zombied.ltx" #include "m_stalker_monolith.ltx" #include "m_sidor.ltx" [/cut]
Логика:
[cut=esc_space_restrictor_wait_trader][logic] active = sr_idle
[sr_idle] on_actor_inside = sr_idle@minus %+esc_actor_come_first%
[sr_idle@minus] on_info = {+esc_trader_hello_first_played} sr_idle@last
[sr_idle@last] on_actor_in_zone = esc_space_restrictor_wait_trader | {-esc_player_sleeps} sr_idle@timer
[sr_idle@timer] on_game_timer = 150 | sr_idle@check on_actor_not_in_zone = esc_space_restrictor_wait_trader | sr_idle@last on_info = {+esc_skip_angry} sr_idle@last %-esc_skip_angry -esc_player_sleeps%
[sr_idle@check] on_actor_in_zone = esc_space_restrictor_wait_trader | sr_idle@last %+esc_player_sleeps% [/cut]
[cut=esc_trader][logic] active = mob_trader@new_idle1 trade = misc\trade\trade_barmen_all.ltx level_spot = trader
;-------------------------- ;---First Meet------------- ;-------------------------- [mob_trader@hello_first] anim_global = hello anim_head = normal sound_phrase = trader_greet_first on_signal = animation_end | mob_trader@new_idle2
;------------------------------ ;---------Wait player---------- ;------------------------------
[mob_trader@angry_1] anim_global = desk_idle anim_head = normal sound_phrase = trader_wait on_signal = sound_phrase_end | {~25} mob_trader@new_idle1_to_idle3, {~50} mob_trader@new_idle1_to_idle5, {~75} mob_trader@new_idle1_to_idle2, mob_trader@new_idle1_to_idle1
[mob_trader@angry_2] anim_global = diagonal_idle anim_head = normal sound_phrase = trader_wait on_signal = sound_phrase_end | {~25} mob_trader@new_idle2_to_idle3, {~50} mob_trader@new_idle2_to_idle4, {~75} mob_trader@new_idle2_to_idle1, mob_trader@new_idle2_to_idle2
[mob_trader@angry_3] anim_global = chair_hack_idle anim_head = normal sound_phrase = trader_wait on_signal = sound_phrase_end | {~30} mob_trader@new_idle3_to_idle2, {~70} mob_trader@new_idle3_to_idle1, mob_trader@new_idle3_to_idle3
[mob_trader@angry_4] anim_global = compute_idle anim_head = normal sound_phrase = trader_wait on_signal = sound_phrase_end | {~40} mob_trader@new_idle4_to_idle2, mob_trader@new_idle4_to_idle4 ;---------------------------------- ;------------- Idle --------------- ;----------------------------------
;Основной idle (1) - за столом [mob_trader@new_idle1] anim_global = desk_idle on_signal = animation_end | {~25} mob_trader@new_idle1_to_idle3, {~50} mob_trader@new_idle1_to_idle5, {~75} mob_trader@new_idle1_to_idle2, mob_trader@new_idle1_to_idle1 on_info = {=talking} mob_trader@new_idle1_to_idle3 %+esc_skip_angry% on_actor_dist_le_nvis = 5 | {+esc_player_sleeps} mob_trader@angry_1 %-esc_player_sleeps% on_actor_dist_ge_nvis = 5 | {-esc_trader_bye_played +esc_trader_hello_played -esc_actor_inside_traders_dung} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_played +esc_trader_hello_played +esc_bring_habar_complete} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_search_played +esc_trader_hello_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played%, {+esc_actor_inside_traders_dung -esc_trader_bye_search_played -esc_trader_bye_first_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played +esc_trader_bye_first_search_played%, {-esc_trader_bye_garbage_played +esc_trader_hello_return_played +esc_bring_habar_complete} mob_trader@bye_garbage %+esc_trader_bye_garbage_played% on_actor_dist_ge_nvis2 = 11 | mob_trader@new_wait
; Idle (2) - по диагонали [mob_trader@new_idle2] anim_global = diagonal_idle on_signal = animation_end | {~25} mob_trader@new_idle2_to_idle3, {~50} mob_trader@new_idle2_to_idle4, {~75} mob_trader@new_idle2_to_idle1, mob_trader@new_idle2_to_idle2 on_info = {=talking} mob_trader@new_idle2_to_idle3 %+esc_skip_angry% on_actor_dist_le_nvis = 5 | {+esc_player_sleeps} mob_trader@angry_2 %-esc_player_sleeps% on_actor_dist_ge_nvis = 5 | {-esc_trader_bye_played +esc_trader_hello_played -esc_actor_inside_traders_dung} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_played +esc_trader_hello_played +esc_bring_habar_complete} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_search_played +esc_trader_hello_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played%, {+esc_actor_inside_traders_dung -esc_trader_bye_search_played -esc_trader_bye_first_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played +esc_trader_bye_first_search_played%, {-esc_trader_bye_garbage_played +esc_trader_hello_return_played +esc_bring_habar_complete} mob_trader@bye_garbage %+esc_trader_bye_garbage_played% on_actor_dist_ge_nvis2 = 11 | mob_trader@new_wait
; Idle (3) - откинувшись на спинку [mob_trader@new_idle3] anim_global = chair_hack_idle on_signal = animation_end | {~30} mob_trader@new_idle3_to_idle2, {~70} mob_trader@new_idle3_to_idle1, mob_trader@new_idle3_to_idle3 on_info = {=talking} mob_trader@new_talking %+esc_skip_angry% on_actor_dist_le_nvis = 5 | {+esc_player_sleeps} mob_trader@angry_3 %-esc_player_sleeps% on_actor_dist_ge_nvis = 5 | {-esc_trader_bye_played +esc_trader_hello_played -esc_actor_inside_traders_dung} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_played +esc_trader_hello_played +esc_bring_habar_complete} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_search_played +esc_trader_hello_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played%, {+esc_actor_inside_traders_dung -esc_trader_bye_search_played -esc_trader_bye_first_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played +esc_trader_bye_first_search_played%, {-esc_trader_bye_garbage_played +esc_trader_hello_return_played +esc_bring_habar_complete} mob_trader@bye_garbage %+esc_trader_bye_garbage_played% on_actor_dist_ge_nvis2 = 11 | mob_trader@new_wait
; Idle (4) - за компьютером [mob_trader@new_idle4] anim_global = compute_idle on_signal = animation_end | {~40} mob_trader@new_idle4_to_idle2, mob_trader@new_idle4_to_idle4 on_info = {=talking} mob_trader@new_idle4_to_idle2 %+esc_skip_angry% on_actor_dist_le_nvis = 5 | {+esc_player_sleeps} mob_trader@angry_4 %-esc_player_sleeps% on_actor_dist_ge_nvis = 5 | {-esc_trader_bye_played +esc_trader_hello_played -esc_actor_inside_traders_dung} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_played +esc_trader_hello_played +esc_bring_habar_complete} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_search_played +esc_trader_hello_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played%, {+esc_actor_inside_traders_dung -esc_trader_bye_search_played -esc_trader_bye_first_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played +esc_trader_bye_first_search_played%, {-esc_trader_bye_garbage_played +esc_trader_hello_return_played +esc_bring_habar_complete} mob_trader@bye_garbage %+esc_trader_bye_garbage_played% on_actor_dist_ge_nvis2 = 11 | mob_trader@new_wait
; Idle (5) - читает [mob_trader@new_idle5] anim_global = listen_idle on_signal = animation_end | {~45} mob_trader@new_idle5_to_idle1, mob_trader@new_idle5_to_idle5 on_info = {=talking} mob_trader@new_idle5_to_idle1 %+esc_skip_angry% on_actor_dist_ge_nvis = 5 | {-esc_trader_bye_played +esc_trader_hello_played -esc_actor_inside_traders_dung} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_played +esc_trader_hello_played +esc_bring_habar_complete} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_search_played +esc_trader_hello_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played%, {+esc_actor_inside_traders_dung -esc_trader_bye_search_played -esc_trader_bye_first_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played +esc_trader_bye_first_search_played%, {-esc_trader_bye_garbage_played +esc_trader_hello_return_played +esc_bring_habar_complete} mob_trader@bye_garbage %+esc_trader_bye_garbage_played% on_actor_dist_ge_nvis2 = 11 | mob_trader@new_wait
;---------------------------------- ;-------- Автопереходы -------- ;----------------------------------
; Стол - стол (промежуточная) [mob_trader@new_idle1_to_idle1] anim_global = desk_idle on_signal = animation_end| mob_trader@new_idle1 on_actor_dist_ge_nvis = 5 | {-esc_trader_bye_played +esc_trader_hello_played -esc_actor_inside_traders_dung} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_played +esc_trader_hello_played +esc_bring_habar_complete} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_search_played +esc_trader_hello_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played%, {+esc_actor_inside_traders_dung -esc_trader_bye_search_played -esc_trader_bye_first_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played +esc_trader_bye_first_search_played%, {-esc_trader_bye_garbage_played +esc_trader_hello_return_played +esc_bring_habar_complete} mob_trader@bye_garbage %+esc_trader_bye_garbage_played% on_actor_dist_ge_nvis2 = 11 | mob_trader@new_wait
; Диагональ - диагональ (промежуточная) [mob_trader@new_idle2_to_idle2] anim_global = diagonal_idle on_signal = animation_end | mob_trader@new_idle2 on_actor_dist_ge_nvis = 5 | {-esc_trader_bye_played +esc_trader_hello_played -esc_actor_inside_traders_dung} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_played +esc_trader_hello_played +esc_bring_habar_complete} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_search_played +esc_trader_hello_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played%, {+esc_actor_inside_traders_dung -esc_trader_bye_search_played -esc_trader_bye_first_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played +esc_trader_bye_first_search_played%, {-esc_trader_bye_garbage_played +esc_trader_hello_return_played +esc_bring_habar_complete} mob_trader@bye_garbage %+esc_trader_bye_garbage_played% on_actor_dist_ge_nvis2 = 11 | mob_trader@new_wait
; Спинка - спинка (промежуточная) [mob_trader@new_idle3_to_idle3] anim_global = chair_hack_idle on_signal = animation_end | mob_trader@new_idle3 on_actor_dist_ge_nvis = 5 | {-esc_trader_bye_played +esc_trader_hello_played -esc_actor_inside_traders_dung} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_played +esc_trader_hello_played +esc_bring_habar_complete} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_search_played +esc_trader_hello_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played%, {+esc_actor_inside_traders_dung -esc_trader_bye_search_played -esc_trader_bye_first_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played +esc_trader_bye_first_search_played%, {-esc_trader_bye_garbage_played +esc_trader_hello_return_played +esc_bring_habar_complete} mob_trader@bye_garbage %+esc_trader_bye_garbage_played% on_actor_dist_ge_nvis2 = 11 | mob_trader@new_wait
; Компьютер - компьютер (промежуточная) [mob_trader@new_idle4_to_idle4] anim_global = compute_idle on_signal = animation_end | mob_trader@new_idle4 on_actor_dist_ge_nvis = 5 | {-esc_trader_bye_played +esc_trader_hello_played -esc_actor_inside_traders_dung} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_played +esc_trader_hello_played +esc_bring_habar_complete} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_search_played +esc_trader_hello_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played%, {+esc_actor_inside_traders_dung -esc_trader_bye_search_played -esc_trader_bye_first_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played +esc_trader_bye_first_search_played%, {-esc_trader_bye_garbage_played +esc_trader_hello_return_played +esc_bring_habar_complete} mob_trader@bye_garbage %+esc_trader_bye_garbage_played% on_actor_dist_ge_nvis2 = 11 | mob_trader@new_wait
; Читает - читает (промежуточная) [mob_trader@new_idle5_to_idle5] anim_global = listen_idle on_signal = animation_end | mob_trader@new_idle5 on_actor_dist_ge_nvis = 5 | {-esc_trader_bye_played +esc_trader_hello_played -esc_actor_inside_traders_dung} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_played +esc_trader_hello_played +esc_bring_habar_complete} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_search_played +esc_trader_hello_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played%, {+esc_actor_inside_traders_dung -esc_trader_bye_search_played -esc_trader_bye_first_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played +esc_trader_bye_first_search_played%, {-esc_trader_bye_garbage_played +esc_trader_hello_return_played +esc_bring_habar_complete} mob_trader@bye_garbage %+esc_trader_bye_garbage_played% on_actor_dist_ge_nvis2 = 11 | mob_trader@new_wait
;---------------------------------- ;----- Переходы между idle-ми ---- ;----------------------------------
; Диагональ - компьютер [mob_trader@new_idle2_to_idle4] anim_global = diagonal_to_compute on_signal = animation_end | mob_trader@new_idle4 on_actor_dist_ge_nvis = 5 | {-esc_trader_bye_played +esc_trader_hello_played -esc_actor_inside_traders_dung} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_played +esc_trader_hello_played +esc_bring_habar_complete} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_search_played +esc_trader_hello_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played%, {+esc_actor_inside_traders_dung -esc_trader_bye_search_played -esc_trader_bye_first_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played +esc_trader_bye_first_search_played%, {-esc_trader_bye_garbage_played +esc_trader_hello_return_played +esc_bring_habar_complete} mob_trader@bye_garbage %+esc_trader_bye_garbage_played% on_actor_dist_ge_nvis2 = 11 | mob_trader@new_wait
; Компьютер - диагональ [mob_trader@new_idle4_to_idle2] anim_global = compute_idle_to_diagonal on_signal = animation_end| mob_trader@new_idle2 ;on_info = {+esc_player_sleeps} mob_trader@angry %-esc_player_sleeps% on_actor_dist_le_nvis = 5 | {+esc_player_sleeps} mob_trader@angry_2 %-esc_player_sleeps% on_actor_dist_ge_nvis = 5 | {-esc_trader_bye_played +esc_trader_hello_played -esc_actor_inside_traders_dung} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_played +esc_trader_hello_played +esc_bring_habar_complete} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_search_played +esc_trader_hello_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played%, {+esc_actor_inside_traders_dung -esc_trader_bye_search_played -esc_trader_bye_first_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played +esc_trader_bye_first_search_played%, {-esc_trader_bye_garbage_played +esc_trader_hello_return_played +esc_bring_habar_complete} mob_trader@bye_garbage %+esc_trader_bye_garbage_played% on_actor_dist_ge_nvis2 = 11 | mob_trader@new_wait
; Диагональ - спинка [mob_trader@new_idle2_to_idle3] anim_global = diagonal_to_chair_hack on_signal = animation_end| {=talking} mob_trader@new_talking %+esc_skip_angry%, mob_trader@new_idle3 on_actor_dist_ge_nvis = 5 | {-esc_trader_bye_played +esc_trader_hello_played -esc_actor_inside_traders_dung} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_played +esc_trader_hello_played +esc_bring_habar_complete} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_search_played +esc_trader_hello_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played%, {+esc_actor_inside_traders_dung -esc_trader_bye_search_played -esc_trader_bye_first_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played +esc_trader_bye_first_search_played%, {-esc_trader_bye_garbage_played +esc_trader_hello_return_played +esc_bring_habar_complete} mob_trader@bye_garbage %+esc_trader_bye_garbage_played% on_actor_dist_ge_nvis2 = 11 | mob_trader@new_wait
; Спинка - диагональ [mob_trader@new_idle3_to_idle2] anim_global = chair_hack_to_diagonal on_signal = animation_end| mob_trader@new_idle2 on_actor_dist_ge_nvis = 5 | {-esc_trader_bye_played +esc_trader_hello_played -esc_actor_inside_traders_dung} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_played +esc_trader_hello_played +esc_bring_habar_complete} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_search_played +esc_trader_hello_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played%, {+esc_actor_inside_traders_dung -esc_trader_bye_search_played -esc_trader_bye_first_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played +esc_trader_bye_first_search_played%, {-esc_trader_bye_garbage_played +esc_trader_hello_return_played +esc_bring_habar_complete} mob_trader@bye_garbage %+esc_trader_bye_garbage_played% on_actor_dist_ge_nvis2 = 11 | mob_trader@new_wait
; Стол - спинка [mob_trader@new_idle1_to_idle3] anim_global = desk_to_chair_hack on_signal = animation_end|{=talking} mob_trader@new_talking %+esc_skip_angry%, mob_trader@new_idle3 on_actor_dist_ge_nvis = 5 | {-esc_trader_bye_played +esc_trader_hello_played -esc_actor_inside_traders_dung} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_played +esc_trader_hello_played +esc_bring_habar_complete} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_search_played +esc_trader_hello_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played%, {+esc_actor_inside_traders_dung -esc_trader_bye_search_played -esc_trader_bye_first_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played +esc_trader_bye_first_search_played%, {-esc_trader_bye_garbage_played +esc_trader_hello_return_played +esc_bring_habar_complete} mob_trader@bye_garbage %+esc_trader_bye_garbage_played% on_actor_dist_ge_nvis2 = 11 | mob_trader@new_wait
; Спинка - стол [mob_trader@new_idle3_to_idle1] anim_global = chair_hack_to_desk on_signal = animation_end| mob_trader@new_idle1 on_actor_dist_ge_nvis = 5 | {-esc_trader_bye_played +esc_trader_hello_played -esc_actor_inside_traders_dung} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_played +esc_trader_hello_played +esc_bring_habar_complete} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_search_played +esc_trader_hello_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played%, {+esc_actor_inside_traders_dung -esc_trader_bye_search_played -esc_trader_bye_first_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played +esc_trader_bye_first_search_played%, {-esc_trader_bye_garbage_played +esc_trader_hello_return_played +esc_bring_habar_complete} mob_trader@bye_garbage %+esc_trader_bye_garbage_played% on_actor_dist_ge_nvis2 = 11 | mob_trader@new_wait
; Стол - диагональ [mob_trader@new_idle1_to_idle2] anim_global = desk_to_diagonal on_signal = animation_end| mob_trader@new_idle2 on_actor_dist_ge_nvis = 5 | {-esc_trader_bye_played +esc_trader_hello_played -esc_actor_inside_traders_dung} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_played +esc_trader_hello_played +esc_bring_habar_complete} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_search_played +esc_trader_hello_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played%, {+esc_actor_inside_traders_dung -esc_trader_bye_search_played -esc_trader_bye_first_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played +esc_trader_bye_first_search_played%, {-esc_trader_bye_garbage_played +esc_trader_hello_return_played +esc_bring_habar_complete} mob_trader@bye_garbage %+esc_trader_bye_garbage_played% on_actor_dist_ge_nvis2 = 11 | mob_trader@new_wait
; Диагональ - стол [mob_trader@new_idle2_to_idle1] anim_global = diagonal_to_desk on_signal = animation_end| mob_trader@new_idle1 on_actor_dist_ge_nvis = 5 | {-esc_trader_bye_played +esc_trader_hello_played -esc_actor_inside_traders_dung} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_played +esc_trader_hello_played +esc_bring_habar_complete} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_search_played +esc_trader_hello_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played%, {+esc_actor_inside_traders_dung -esc_trader_bye_search_played -esc_trader_bye_first_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played +esc_trader_bye_first_search_played%, {-esc_trader_bye_garbage_played +esc_trader_hello_return_played +esc_bring_habar_complete} mob_trader@bye_garbage %+esc_trader_bye_garbage_played% on_actor_dist_ge_nvis2 = 11 | mob_trader@new_wait
; Стол - читает [mob_trader@new_idle1_to_idle5] anim_global = desk_to_listen on_signal = animation_end| mob_trader@new_idle5 on_actor_dist_ge_nvis = 5 | {-esc_trader_bye_played +esc_trader_hello_played -esc_actor_inside_traders_dung} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_played +esc_trader_hello_played +esc_bring_habar_complete} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_search_played +esc_trader_hello_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played%, {+esc_actor_inside_traders_dung -esc_trader_bye_search_played -esc_trader_bye_first_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played +esc_trader_bye_first_search_played%, {-esc_trader_bye_garbage_played +esc_trader_hello_return_played +esc_bring_habar_complete} mob_trader@bye_garbage %+esc_trader_bye_garbage_played% on_actor_dist_ge_nvis2 = 11 | mob_trader@new_wait
; Читает - стол [mob_trader@new_idle5_to_idle1] anim_global = listen_to_desk on_signal = animation_end| mob_trader@new_idle1 on_actor_dist_ge_nvis = 5 | {-esc_trader_bye_played +esc_trader_hello_played -esc_actor_inside_traders_dung} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_played +esc_trader_hello_played +esc_bring_habar_complete} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_search_played +esc_trader_hello_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played%, {+esc_actor_inside_traders_dung -esc_trader_bye_search_played -esc_trader_bye_first_search_played -esc_take_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played +esc_trader_bye_first_search_played%, {-esc_trader_bye_garbage_played +esc_trader_hello_return_played +esc_bring_habar_complete} mob_trader@bye_garbage %+esc_trader_bye_garbage_played% on_actor_dist_ge_nvis2 = 11 | mob_trader@new_wait
;-------------------------------------- ;------------- Разговор --------------- ;--------------------------------------
[mob_trader@new_talking] anim_global = chair_hack_talk anim_head = normal on_info = {!talking} mob_trader@new_idle3 %+esc_skip_angry%
;-------------------------------------- ;------------ Торговля ---------------- ;--------------------------------------
[mob_trade@new] anim_global = chair_hack_idle on_info = {=trading =trade_exchanged} mob_trader@new_trade_exchanged on_info2 = {!trading =trade_exchanged} mob_trader@new_trade_good on_info3 = {!trading !trade_exchanged} mob_trader@new_trade_bad
[mob_trader@new_trade_bad] anim_global = diagonal_talk anim_global = chair_hack_idle anim_head = angry ;sound_phrase = trader_bad_trade on_signal = sound_phrase_end | mob_trader@new_idle2 on_actor_dist_ge_nvis = 11 | mob_trader@new_wait
[mob_trader@new_trade_exchanged] anim_global = diagonal_talk anim_global = chair_hack_idle anim_head = normal ;sound_phrase = trader_exchanged on_signal = sound_phrase_end | mob_trader@new_idle2 on_actor_dist_ge_nvis = 11 | mob_trader@new_wait
[mob_trader@new_trade_good] anim_global = diagonal_talk anim_global = chair_hack_idle anim_head = good ;sound_phrase = trader_good_trade on_signal = sound_phrase_end | mob_trader@new_idle2 on_actor_dist_ge_nvis = 11 | mob_trader@new_wait
;------------------------------------- ;---------- Приветствия -------------- ;-------------------------------------
[mob_trader@new_hello] anim_global = hello anim_head = normal sound_phrase = trader_hello_what_have_you_got on_signal = animation_end | mob_trader@new_idle2
[mob_trader@hello_search] anim_global = hello anim_head = normal sound_phrase = trader_wait_habar_greet on_signal = animation_end | mob_trader@new_idle2
[mob_trader@hello_return] anim_global = hello anim_head = normal sound_phrase = trader_greet_habar on_signal = animation_end | mob_trader@new_idle2
[mob_trader@new_bye] on_actor_dist_ge_nvis = 11| mob_trader@new_wait anim_global = hello anim_head = normal ;sound_phrase = trader_bye on_signal = animation_end | mob_trader@new_idle2
[mob_trader@bye_search] on_actor_dist_ge_nvis = 11 | mob_trader@new_idle2 anim_global = hello anim_head = normal sound_phrase = trader_wait_habar_bye on_signal = animation_end | mob_trader@new_idle1
[mob_trader@bye_garbage] on_actor_dist_ge_nvis = 11 | mob_trader@new_wait anim_global = hello anim_head = normal sound_phrase = trader_bye_garbage on_signal = animation_end | mob_trader@new_idle2
[mob_trader@new_wait] anim_global = diagonal_idle_short on_actor_dist_le_nvis = 3 | {-esc_trader_hello_played +esc_actor_inside_traders_dung +esc_bring_habar_complete +esc_trader_hello_first_played} mob_trader@new_hello %+esc_trader_hello_played%, {-esc_trader_hello_played -esc_actor_inside_traders_dung -esc_take_habar_complete +esc_trader_hello_first_played} mob_trader@new_hello %+esc_trader_hello_played%, {-esc_trader_hello_first_played +esc_actor_come_first} mob_trader@hello_first %+esc_trader_hello_first_played +esc_trader_hello_played%, {-esc_trader_hello_search_played +esc_actor_inside_traders_dung +esc_trader_hello_first_played -esc_take_habar_complete} mob_trader@hello_search %+esc_trader_hello_search_played%, {-esc_trader_hello_return_played +esc_take_habar_complete} mob_trader@hello_return %+esc_trader_hello_return_played% on_actor_dist_ge_nvis = 7 | {-esc_trader_bye_played +esc_trader_hello_played +esc_actor_inside_traders_dung +esc_bring_habar_complete +esc_trader_hello_first_played} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_played +esc_trader_hello_played -esc_actor_inside_traders_dung -esc_take_habar_complete +esc_trader_hello_first_played} mob_trader@new_bye %+esc_trader_bye_played%, {-esc_trader_bye_search_played +esc_trader_hello_search_played +esc_trader_hello_first_played +esc_actor_inside_traders_dung -esc_bring_habar_complete} mob_trader@bye_search %+esc_trader_bye_search_played%, {-esc_trader_bye_garbage_played +esc_trader_hello_return_played +esc_bring_habar_complete} mob_trader@bye_garbage %+esc_trader_bye_garbage_played% on_actor_dist_ge_nvis2 = 11 | %-esc_trader_hello_played -esc_trader_bye_played -esc_trader_hello_search_played -esc_trader_bye_search_played% [/cut]Добавлено (19.06.2016, 12:44) --------------------------------------------- all.spawn:
[cut=alife_escape][215]
; cse_abstract properties section_name = m_trader name = esc_m_trader position = -246.400009155273, -24.7744331359863, -134.399993896484 direction = -0.0576599985361099, 1.72324705123901, 0.00393099989742041 id = 65535 version = 124 script_version = 8 spawn_id = 395
; cse_alife_object properties game_vertex_id = 3 level_vertex_id = 14374 object_flags = 0xffffff3f custom_data = <<END [logic] cfg = scripts\escape\esc_trader.ltx END story_id = 410
; cse_visual properties visual_name = actors\stalker_trader\stalker_trader_1
; cse_alife_trader_abstract properties money = 1000000 trader_flags = 0 character_profile = esc_sidor_trader
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[308]
; cse_abstract properties section_name = space_restrictor name = esc_space_restrictor_wait_trader position position = -246.880004882813, -24.8099994659424, -134.589996337891 direction = -0.0034178423229605, 5.05854368384462e-005, 0.0147993508726358 id = 65535 version = 128 script_version = 12 spawn_id = 307
; cse_alife_object properties game_vertex_id = 0 level_vertex_id = 97812 object_flags = 0xffffff3e custom_data = <<END [story_object] story_id = esc_space_restrictor_wait_trader [logic] cfg = scripts\escape\esc_space_restrictor_wait_trader.ltx END
; cse_shape properties shapes = 1 shape_0:type = sphere shape_0:offset = 0,0,0 shape_0:radius = 1
; cse_alife_space_restrictor properties restrictor_type = 3[/cut]
gameplay:
[cut=character_desc_escape]<specific_character id="esc_sidor_trader" team_default = "1"> <name>esc_c2_wolf</name> <icon>ui_inGame2_wolf</icon> <map_icon x="1" y="0"></map_icon> <bio>ќпытный сталкер. ƒетальна¤ информаци¤ отсутствует.</bio>
<class>esc_sidor_trader</class> <community>stalker</community> <terrain_sect>stalker_terrain</terrain_sect> <snd_config>characters_voice\human_03\stalker\</snd_config>
<rank>60</rank> <reputation>300</reputation> <money min="500000" max="500000" infinitive="1" /> <visual>actors\stalker_trader\stalker_trader_1</visual> <supplies>
[spawn] \n </supplies> #include "gameplay\character_criticals_4.xml" <start_dialog>esc_sidor_start_dialog</start_dialog> <actor_dialog>actor_break_dialog</actor_dialog> </specific_character> [/cut]
[cut=npc_profile]<character id="esc_sidor_trader"> <class>esc_sidor_trader</class> <specific_character>esc_sidor_trader</specific_character> </character>[/cut]
[cut=dialogs_escape]<dialog id="esc_sidor_start_dialog"> <phrase_list> <phrase id="0"> <text>esc_sidor_start_dialog</text> </phrase> </phrase_list> </dialog>[/cut]
В info_escape не придумал ничего лучше чем временно перенести этот файл из чн и добавить свои инфопоршни.
scripts: свои правки не вносил, но всё таки
[cut=mob_trader]-- mob_trader global_animations = { desk_idle = {"idle","idle_1","palci","zatylok"}, desk_talk = {"idle"}, desk_to_chair_hack = {"idle_spinka"}, desk_to_listen = {"idle_chitaet"}, desk_to_diagonal = {"perehod_0"}, chair_hack_idle = {"idle_2","idle_2_def_0"}, chair_hack_talk = {"idle_2_talk_0","idle_2_talk_1","idle_2_talk_2","idle_2_talk_3"}, chair_hack_to_diagonal = {"idle_2_to_idle_0"}, chair_hack_to_desk = {"spinka_idle"}, compute_idle = {"idle_1_spec_think_0","idle_1_spec_think_1"}, compute_idle_to_diagonal = {"idle_1_to_idle_0"}, diagonal_idle = {"idle_0_def_0","idle_0_spec_click_0","idle_0_spec_scratch_0"}, diagonal_idle_short = {"idle_0_def_0"}, diagonal_talk = {"idle_0_talk_0","idle_0_talk_1","idle_0_talk_2","idle_0_talk_3"}, diagonal_to_chair_hack = {"idle_0_to_idle_2"}, diagonal_to_compute = {"idle_0_to_idle_1"}, diagonal_to_desk = {"perehod_1"}, first_phrase = {"vstuplenie"}, listen_idle = {"chitaet"}, listen_to_desk = {"chitaet_idle"}, hello = {"hello"}, forester_sit = {"sit"}, forester_beard = {"beard_in","beard","beard_out"}, forester_reaction = {"reaction_in","reaction","reaction_out"}, forester_see = {"see_in","see","see_out"}, forester_talk_1 = {"sit_talk_1_in","sit_talk_1","sit_talk_1_out"}, forester_talk_2 = {"sit_talk_2_in","sit_talk_2","sit_talk_2_out"}, forester_talk_3 = {"sit_talk_3_in","sit_talk_3","sit_talk_3_out"}
} head_animations = { forester_talk_1 = {"sit_talk_1_in","sit_talk_1","sit_talk_1_out"}, forester_talk_2 = {"sit_talk_2_in","sit_talk_2","sit_talk_2_out"}, forester_talk_3 = {"sit_talk_3_in","sit_talk_3","sit_talk_3_out"}, forester_reaction = {"reaction_in","reaction","reaction_out"}, normal = {"talk_0","talk_1","talk_4"}, angry = {"talk_3","talk_2","talk_1"}, good = {"talk_glad_0"}, first_phrase = {"vstuplenie_head"} } function on_start_tutorial_item_1() if db.trader == nil then return end db.trader:external_sound_start("characters_voice\\scenario\\trader\\trader_tutorial_pda_12") end function on_stop_tutorial_item() if db.trader == nil then return end db.trader:external_sound_stop() end class "mob_trader" function mob_trader:__init(obj, storage) self.object = obj self.st = storage end function mob_trader:reset_scheme() trader_obj = self.object self.st.signals = {} self.object:set_callback(callback.trader_global_anim_request, self.on_global_anim_request, self ) self.object:set_callback(callback.trader_head_anim_request, self.on_head_anim_request, self ) self.object:set_callback(callback.trader_sound_end, self.on_sound_end, self ) self.object:set_callback(callback.use_object, self.use_callback, self) -- start global animation self.object:set_trader_global_anim(self:select_global_animation()) -- start sound and head animation if (self.st.sound_phrase) then local snd = mob_sound.pick_sound_from_set(self.object, self.st.sound_phrase, {}) self.object:set_trader_sound(snd, self:select_head_animation()); end if self.st.anim_head == nil then self.st.anim_head = "normal" end db.trader = self.object end function mob_trader:use_callback() -- dialog_manager.restore_npc_disabled_phrases(self.object:id()) end function mob_trader:update(delta) if xr_logic.try_switch_to_another_section(self.object, self.st, db.actor) then return end end function mob_trader:select_global_animation() local anim_set = global_animations[self.st.anim_global] local r = math.random(1, #anim_set) return anim_set[r] end function mob_trader:select_head_animation() -- random select local anim_set = head_animations[self.st.anim_head] local r = math.random(1, #anim_set) return anim_set[r] end function mob_trader:on_global_anim_request() self.st.signals["animation_end"] = true if (not self.st.play_once) then self.object:set_trader_global_anim(self:select_global_animation()) end end function mob_trader:on_head_anim_request() if self.st.anim_head == nil then return end self.object:set_trader_head_anim(self:select_head_animation()); end function mob_trader:on_sound_end() self.st.signals["sound_phrase_end"] = true end function mob_trader:deactivate() self.object:set_callback(callback.trader_global_anim_request, nil ) self.object:set_callback(callback.trader_head_anim_request, nil ) self.object:set_callback(callback.trader_sound_end, nil ) self.object:set_callback(callback.use_object, nil ) self.st.signals = {} db.trader = nil end function add_to_binder(npc, ini, scheme, section, storage) printf("DEBUG: add_to_binder: npc:name()='%s', scheme='%s', section='%s'", npc:name(), scheme, section) local new_action = mob_trader(npc, storage) -- Зарегистрировать все actions, в которых должен быть вызван метод reset_scheme при изменении настроек схемы: xr_logic.subscribe_action_for_events(npc, storage, new_action) end function set_scheme(npc, ini, scheme, section, gulag_name) local st = xr_logic.assign_storage_and_bind(npc, ini, scheme, section) st.logic = xr_logic.cfg_get_switch_conditions(ini, section, npc) st.anim_global = utils.cfg_get_string(ini, section, "anim_global", npc, true, "") st.can_talk = utils.cfg_get_bool(ini, section, "can_talk", npc, false, true) st.tip_text = utils.cfg_get_string(ini, section, "tip_text", npc, false, "", "character_use") if st.tip_text == nil then st.tip_text = "" end npc:set_tip_text(st.tip_text) if (ini:line_exist( section, "sound_phrase")) then st.anim_head = utils.cfg_get_string(ini, section, "anim_head", npc, false, "") st.sound_phrase = utils.cfg_get_string(ini, section, "sound_phrase", npc, false, "") else st.anim_head = nil st.sound_phrase = nil end
--' check if play once animation st.play_once = false if (ini:line_exist( section, "on_signal")) then local str = utils.cfg_get_string(ini, section, "on_signal", npc, false, "") local par = utils.parse_params(str) if par[1] == "animation_end" then st.play_once = true end end if st.can_talk == true then npc:enable_talk() else npc:disable_talk() end end[/cut]
[cut=bind_trader]-- Sidor etc binding function bind(obj) local new_binder = trader_object_binder(obj) obj:bind_object(new_binder) end class "trader_object_binder" (object_binder) function trader_object_binder:__init(obj) super(obj) self.loaded = false end
function trader_object_binder:reload(section) object_binder.reload(self, section) end function trader_object_binder:reinit() object_binder.reinit(self) db.storage[self.object:id()] = { } self.st = db.storage[self.object:id()] end function trader_object_binder:update(delta) object_binder.update(self, delta) -- јпдейт торговли if self.object:clsid() == clsid.script_trader then trade_manager.update(self.object) end local st = db.storage[self.object:id()] if st ~= nil and st.active_scheme ~= nil then xr_logic.try_switch_to_another_section(self.object, st[st.active_scheme], db.actor) end if self.st.active_section ~= nil then xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "update", delta) end end function trader_object_binder:net_spawn(sobject) if not object_binder.net_spawn(self, sobject) then return false end local on_offline_condlist = db.storage[self.object:id()] and db.storage[self.object:id()].overrides and db.storage[self.object:id()].overrides.on_offline_condlist if on_offline_condlist ~= nil then xr_logic.pick_section_from_condlist(db.actor, self.object, on_offline_condlist) end if not self.object:alive() then return true end if alife():object(self.object:id()) == nil then return false end db.add_obj(self.object) if self.object:clsid() == clsid.script_trader then self.object:set_trader_global_anim("idle_spinka") smart_terrain.setup_gulag_and_logic_on_spawn( self.object, self.st, sobject, modules.stype_trader, self.loaded) end return true end function trader_object_binder:net_destroy() xr_sound.stop_sounds_by_id(self.object:id()) local st = db.storage[self.object:id()] if st and st.active_scheme then xr_logic.issue_event(self.object, st[st.active_scheme], "net_destroy") end if db.offline_objects[self.object:id()] then db.offline_objects[self.object:id()].level_vertex_id = self.object:level_vertex_id() db.offline_objects[self.object:id()].active_section = db.storage[self.object:id()].active_section end db.del_obj(self.object) db.storage[self.object:id()] = nil object_binder.net_destroy(self) end function trader_object_binder:net_save_relevant() return true end function trader_object_binder:save(packet) set_save_marker(packet, "save", false, "trader_object_binder") object_binder.save(self, packet) xr_logic.save_obj(self.object, packet) if self.object:clsid() == clsid.script_trader then trade_manager.save(self.object, packet) end set_save_marker(packet, "save", true, "trader_object_binder") end function trader_object_binder:load(reader) self.loaded = true set_save_marker(reader, "load", false, "trader_object_binder") object_binder.load(self, reader) xr_logic.load_obj(self.object, reader) if self.object:clsid() == clsid.script_trader then trade_manager.load(self.object, reader) end set_save_marker(reader, "load", true, "trader_object_binder") end[/cut]
Сообщение отредактировал men_stalker - Вс, 19.06.2016, 12:44 |
| |
|
| Эти 0 пользователя(ей) поблагодарили men_stalker за это полезное сообщение: |
|
|
| denis2000 | Дата: Вс, 19.06.2016, 19:39 | Сообщение # 1294 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Поясните вот эту странную конструкцию:
Цитата men_stalker (  ) $prefetch = 5 cform = skeleton class = AI_TRADE_S class = AI_TRD_S Переменные не идут каждая в своей строке?
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| men_stalker | Дата: Пн, 20.06.2016, 11:06 | Сообщение # 1295 |
 Инженер «Свободы»
Свобода
Сообщений: 184
| denis2000, спасибо за помощь сам не заметил. Всё встало на круги своя, снова жалуется на переменные:D Добавлено (20.06.2016, 11:06) --------------------------------------------- Здравствуйте, у меня возникла проблема уже поднимаемая на этом форуме, но решения я не нашёл. Сидорович просто напросто ужасно перекручен и смещён по моим предположениям к блежайшей границе ai-сетки. Могут ли на это анимации влиять? Нужно ли их как-то переносить в зп (или они, как и модель, есть в оригинале?). И похоже он не видит логику(нету метки торговца и при торговле ничего нету, при попытке что либо продать - вылет)
Сообщение отредактировал men_stalker - Пн, 20.06.2016, 08:25 |
| |
|
| Эти 0 пользователя(ей) поблагодарили men_stalker за это полезное сообщение: |
|
|
| sergej5500 | Дата: Пн, 20.06.2016, 11:59 | Сообщение # 1296 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Цитата men_stalker (  ) И похоже он не видит логику(нету метки торговца и при торговле ничего нету,
Каким образом прописана ссылка на файл логики?
Цитата men_stalker (  ) при попытке что либо продать - вылет)
Какой лог вылета?
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| men_stalker | Дата: Пн, 20.06.2016, 13:31 | Сообщение # 1297 |
 Инженер «Свободы»
Свобода
Сообщений: 184
| sergej5500, Цитата sergej5500 (  ) Каким образом прописана ссылка на файл логики? в all.spawn
Код custom_data = <<END [logic] cfg = scripts\escape\esc_trader.ltx END
Всё проверил, пути и названия сответствуют.
[/cut]Цитата sergej5500 (  ) Какой лог вылета? [cut=лог]FATAL ERROR [error]Expression : !m_error_code [error]Function : raii_guard::~raii_guard [error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp [error]Line : 748 [error]Description : ... - Зов Припяти\gamedata\scripts\trade_manager.script:211: attempt to index field '?' (a nil value)
stack trace:
|
| |
|
| Эти 0 пользователя(ей) поблагодарили men_stalker за это полезное сообщение: |
|
|
| denis2000 | Дата: Пн, 20.06.2016, 18:34 | Сообщение # 1298 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| men_stalker, В секции из all.spawn Это лишнее: story_id = 410 Этого не хватает: character_profile = esc_sidor_trader cse_alife_trader_abstract__unk1_u8 = 1
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| men_stalker | Дата: Вт, 21.06.2016, 08:22 | Сообщение # 1299 |
 Инженер «Свободы»
Свобода
Сообщений: 184
| denis2000, исправил но не помогло. А ест ли какой нибудь альтернативный способ прописать логику? Теперь я уверен что он её не видит: прописал специально неправильное название: ровно ничего не изменилось. И ест ли вообще необходимые анимации в зп?
|
| |
|
| Эти 0 пользователя(ей) поблагодарили men_stalker за это полезное сообщение: |
|
|
| sergej5500 | Дата: Вт, 21.06.2016, 09:33 | Сообщение # 1300 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Цитата men_stalker (  ) Теперь я уверен что он её не видит: прописал специально неправильное название: ровно ничего не изменилось.
Вы после правки алл.спавн и его сборки начинали новую игру?
Цитата men_stalker (  ) А ест ли какой нибудь альтернативный способ прописать логику?
Можно добавить в спавн-секцию Сидоровичу ссылку на файл логики. Строка custom_data = ...
Можно сделать Сидоровича сквадом из одного НПС. Логику зарегистрировать в смарте, как эсклюзив. Разработчики Зова Припяти предпочитают этот способ.
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| denis2000 | Дата: Вт, 21.06.2016, 10:02 | Сообщение # 1301 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата men_stalker (  ) А ест ли какой нибудь альтернативный способ прописать логику? Что кастом дату делать в all.spawn, что в секции НПС ризницы нет. Логика не работает, проверяйте путь и имя файла логики, может там русские буквы есть.
Цитата men_stalker (  ) И ест ли вообще необходимые анимации в зп? Если бы не было был бы вылет с указанием какой анимации нет.
Цитата sergej5500 (  ) Можно сделать Сидоровича сквадом из одного НПС. Логику зарегистрировать в смарте, как эсклюзив. Это скорее всего сработает непредсказуемо, ведь схема mob_trader не рассчитана на сквад.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| men_stalker | Дата: Вт, 21.06.2016, 10:57 | Сообщение # 1302 |
 Инженер «Свободы»
Свобода
Сообщений: 184
| А не могли бы вы пояснить за что отвечает строка on_actor_dist_ge_nvis2 = 11? А может быть что игра не видит скрипты bind_trader и mob_trader?, в уроке они по моему нигде не регистрировались.
|
| |
|
| Эти 0 пользователя(ей) поблагодарили men_stalker за это полезное сообщение: |
|
|
| denis2000 | Дата: Вт, 21.06.2016, 11:10 | Сообщение # 1303 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| bind_trader.script регистрируется здесь: m_sidor.ltx
Код [m_trader] ... script_binding = bind_trader.bind mob_trader.script как схема поведения регистрируется здесь: modules.script
Код --]] ----------------------------------------------------------------------------------------------- --/ Variables --]] ----------------------------------------------------------------------------------------------- -- Типы схем: stype_stalker = 0 stype_mobile = 1 stype_item = 2 stype_heli = 3 stype_restrictor = 4 stype_trader = 5 ....
load_scheme("mob_trader", "mob_trader", stype_trader)
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| men_stalker | Дата: Вт, 21.06.2016, 17:56 | Сообщение # 1304 |
 Инженер «Свободы»
Свобода
Сообщений: 184
| denis2000, спасибо. sergej5500,
Цитата sergej5500 (  ) Вы после правки алл.спавн и его сборки начинали новую игру? Конечно!(тем более у меня сохранение в начале игры не включено ) Логика не видится абсолютно не в all.spawn"не не в m_sidor (пробывал даже проверенную логику сталкера, рестриктора, и пробывал вообще не прописывать). Также пробывал в m_sidor дефолтную логику из m_stalker комбинируя с логикой Сидоровича в спавне. Эфекта нету. Может ли быть что у [m_trader] вообще нету возможности прописывания логики?
Сообщение отредактировал men_stalker - Вт, 21.06.2016, 18:44 |
| |
|
| Эти 0 пользователя(ей) поблагодарили men_stalker за это полезное сообщение: |
|
|
| sergej5500 | Дата: Вт, 21.06.2016, 20:59 | Сообщение # 1305 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| men_stalker,
Если вас устроит, то предлагаю такой вариант. Берёте адаптированного Сидоровича.
https://yadi.sk/d/3dSlj5PWWjZ5K
Ставите в бункере на точке, где Сидорович должен стоять, спавн-пойнт.
Задаёте Сидору логику такого типа.
[cut=Логика][logic@esc_b2_trader_1] active = remark@esc_b2_trader_1 suitable = {=check_npc_name(esc_b2_trader)} true prior = 300 level_spot = trader post_combat_time = 0,0 can_select_weapon = false trade = misc\trade\order_traders\esc_b2_trader.ltx
[remark@esc_b2_trader_1] gather_items_enabled = false help_wounded_enabled = false corpse_detection_enabled = false combat_ignore_cond = true combat_ignore_keep_when_attacked = true invulnerable = true anim = ward_noweap meet = meet@trader_1 target = story | actor on_info = %=control_npc_position(esc_b2_trader_spawn_point:1)%
[meet@trader_1] close_snd_hello = esc_b2_sidor_hello close_snd_bye = esc_b2_sidor_exit use = {!actor_enemy !actor_has_weapon !has_enemy} true, false allow_break = false trade_enable = true[/cut]
В xr_effects добавьте функцию
[cut=Функция]function control_npc_position(actor,npc,p) if p then local patrol_point = p[1] local distance = tonumber(p[2]) or 1 local point_position = patrol(patrol_point):point(0) if npc:position():distance_to_sqr(point_position) > (distance * distance) then reset_animation(npc) npc:set_npc_position(point_position) end end end[/cut]
При удалении от спавн-пойнта непися принудительно телепортирует обратно. Минус в том, что он будет всё время стоять.
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
|