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


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


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

Цитата men_stalker ()
после добавления ещё нескольких переменных в [m_trader] при запуске получил вылет:


Значит, причина в этих переменных. Можно посоветовать только одно. Добавлять их по одной. Смотреть, после какой появится вылет.
 
denis2000Дата: Сб, 18.06.2016, 20:28 | Сообщение # 1292
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата men_stalker ()
всё нормально

Цитата men_stalker ()
при запуске получил вылет

Вы конечно в курсе, что это противоречивые заявления?
Выкладывайте правки будем анализировать.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
men_stalkerДата: Вс, 19.06.2016, 12:44 | Сообщение # 1293
Инженер «Свободы»
Свобода
Сообщений: 184
Награды: 5
Репутация: [ 40 ]

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
 
denis2000Дата: Вс, 19.06.2016, 19:39 | Сообщение # 1294
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Поясните вот эту странную конструкцию:
Цитата men_stalker ()
$prefetch = 5 cform = skeleton class = AI_TRADE_S
class = AI_TRD_S

Переменные не идут каждая в своей строке?


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
men_stalkerДата: Пн, 20.06.2016, 11:06 | Сообщение # 1295
Инженер «Свободы»
Свобода
Сообщений: 184
Награды: 5
Репутация: [ 40 ]

denis2000, спасибо за помощь сам не заметил. Всё встало на круги своя, снова жалуется на переменные:D

Добавлено (20.06.2016, 11:06)
---------------------------------------------
Здравствуйте, у меня возникла проблема уже поднимаемая на этом форуме, но решения я не нашёл.
Сидорович просто напросто ужасно перекручен и смещён по моим предположениям к блежайшей границе ai-сетки. Могут ли на это анимации влиять? Нужно ли их как-то переносить в зп (или они, как и модель, есть в оригинале?). И похоже он не видит логику(нету метки торговца и при торговле ничего нету, при попытке что либо продать - вылет)

Сообщение отредактировал men_stalker - Пн, 20.06.2016, 08:25
 
sergej5500Дата: Пн, 20.06.2016, 11:59 | Сообщение # 1296
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Цитата men_stalker ()
И похоже он не видит логику(нету метки торговца и при торговле ничего нету,


Каким образом прописана ссылка на файл логики?

Цитата men_stalker ()
при попытке что либо продать - вылет)


Какой лог вылета?
 
men_stalkerДата: Пн, 20.06.2016, 13:31 | Сообщение # 1297
Инженер «Свободы»
Свобода
Сообщений: 184
Награды: 5
Репутация: [ 40 ]

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:
 
denis2000Дата: Пн, 20.06.2016, 18:34 | Сообщение # 1298
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

men_stalker, В секции из all.spawn
Это лишнее:
story_id = 410
Этого не хватает:
character_profile = esc_sidor_trader
cse_alife_trader_abstract__unk1_u8 = 1


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
men_stalkerДата: Вт, 21.06.2016, 08:22 | Сообщение # 1299
Инженер «Свободы»
Свобода
Сообщений: 184
Награды: 5
Репутация: [ 40 ]

denis2000, исправил но не помогло. А ест ли какой нибудь альтернативный способ прописать логику? Теперь я уверен что он её не видит: прописал специально неправильное название: ровно ничего не изменилось. И ест ли вообще необходимые анимации в зп?
 
sergej5500Дата: Вт, 21.06.2016, 09:33 | Сообщение # 1300
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Цитата men_stalker ()
Теперь я уверен что он её не видит: прописал специально неправильное название: ровно ничего не изменилось.


Вы после правки алл.спавн и его сборки начинали новую игру?

Цитата men_stalker ()
А ест ли какой нибудь альтернативный способ прописать логику?


Можно добавить в спавн-секцию Сидоровичу ссылку на файл логики. Строка custom_data = ...

Можно сделать Сидоровича сквадом из одного НПС. Логику зарегистрировать в смарте, как эсклюзив. Разработчики Зова Припяти предпочитают этот способ.
 
denis2000Дата: Вт, 21.06.2016, 10:02 | Сообщение # 1301
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата men_stalker ()
А ест ли какой нибудь альтернативный способ прописать логику?

Что кастом дату делать в all.spawn, что в секции НПС ризницы нет. Логика не работает, проверяйте путь и имя файла логики, может там русские буквы есть.
Цитата men_stalker ()
И ест ли вообще необходимые анимации в зп?

Если бы не было был бы вылет с указанием какой анимации нет.
Цитата sergej5500 ()
Можно сделать Сидоровича сквадом из одного НПС. Логику зарегистрировать в смарте, как эсклюзив.

Это скорее всего сработает непредсказуемо, ведь схема mob_trader не рассчитана на сквад.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
men_stalkerДата: Вт, 21.06.2016, 10:57 | Сообщение # 1302
Инженер «Свободы»
Свобода
Сообщений: 184
Награды: 5
Репутация: [ 40 ]

А не могли бы вы пояснить за что отвечает строка on_actor_dist_ge_nvis2 = 11? А может быть что игра не видит скрипты bind_trader и mob_trader?, в уроке они по моему нигде не регистрировались.
 
denis2000Дата: Вт, 21.06.2016, 11:10 | Сообщение # 1303
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

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)


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
men_stalkerДата: Вт, 21.06.2016, 17:56 | Сообщение # 1304
Инженер «Свободы»
Свобода
Сообщений: 184
Награды: 5
Репутация: [ 40 ]

denis2000, спасибо.
sergej5500,
Цитата sergej5500 ()
Вы после правки алл.спавн и его сборки начинали новую игру?

Конечно!(тем более у меня сохранение в начале игры не включено biggrin )
Логика не видится абсолютно не в all.spawn"не не в m_sidor (пробывал даже проверенную логику сталкера, рестриктора, и пробывал вообще не прописывать). Также пробывал в m_sidor дефолтную логику из m_stalker комбинируя с логикой Сидоровича в спавне. Эфекта нету. Может ли быть что у [m_trader] вообще нету возможности прописывания логики?


Сообщение отредактировал men_stalker - Вт, 21.06.2016, 18:44
 
sergej5500Дата: Вт, 21.06.2016, 20:59 | Сообщение # 1305
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

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]

При удалении от спавн-пойнта непися принудительно телепортирует обратно. Минус в том, что он будет всё время стоять.
 
Поиск: