Восстанавливаем Сидоровича в ЗП
Материал из S.T.A.L.K.E.R. Inside Wiki
Итак, допустим, вы делаете мод на ЗП, и вам нужно восстановить Сидоровича со всеми его анимациями и фразами. В этой статье я расскажу и опишу этот процесс. 1. Для начала откроем папку creatures и создадим там файл с расширение ltx Назовем его, скажем, 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 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
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
Это мы создали спавн секцию торговца. Еще нужно в stalkers.ltx, который находится в той же папке, добавить инклуд
- include "m_sidor.ltx"
2. В спавн секции указан биндер bind_trader Нужно его создать. В папке создаем файл с расширением script и называем его 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
3. В той же папке scripts создадим файл mob_trader.script и в него пишем
-- 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
4. Создаем профиль торговцу (подробно на этом останавливаться не буду) В character_desc_ пишем <specific_character id="esc_sidor_trader" team_default="1"> <name>Сидорович</name> <icon>ui_inGame2_Sidor</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_02\stalker\</snd_config> <rank>65</rank> <reputation>0</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>
В npc_profile
<character id="esc_sidor_trader"> <class>esc_sidor_trader</class> <specific_character>esc_sidor_trader</specific_character> </character>
Еще нужно прописать Сидору стартовый диалог
<dialog id="esc_sidor_start_dialog"> <phrase_list> <phrase id="0">
esc_sidor_start_dialog_text
</phrase> </phrase_list> </dialog>
5. Далее нужно заспавнить Сидора. Это можно сделать через Perl, редактирую all.spawn, либо через СДК, что намного удобнне. Если вы решили делать через Perl, то вставляем в alife_ это (координаты спавна Сидоровича на Кордоне ЧН; вертексы меняйте на свои) [482]
- cse_abstract properties
section_name = m_trader name = esc_m_trader position = -244.299667358398,-24.803882598877,-133.839172363281 direction = -0.000105999999505002,1.46652603149414,0.000314000004436821
- cse_alife_object properties
game_vertex_id = 168 distance = 0 level_vertex_id = 132406 object_flags = 0xffffff3f custom_data = <<END [logic] cfg = scripts\escape\esc_sidor_trader.ltx END
- 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 cse_alife_trader_abstract__unk1_u8 = 1
Еще надо сделать рестриктор esc_space_restrictor_wait_trader, вот координаты [481]
- cse_abstract properties
section_name = space_restrictor name = esc_space_restrictor_wait_trader position = -246.889709472656,-24.8104095458984,-134.595703125 direction = 1.59999999596039e-005,0,-0.00445500016212463
- cse_alife_object properties
game_vertex_id = 168 distance = 0 level_vertex_id = 132406 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 = shape0 shape0:type = box shape0:axis_x = 2.68119788169861,0,0 shape0:axis_y = 0,7.55560111999512,0 shape0:axis_z = 0,0,4.42359781265259 shape0:offset = 0,0,0
- cse_alife_space_restrictor properties
restrictor_type = 3
Нужно прописать логику рестриктора. В папке scripts\escape создаем файл esc_space_restrictor_wait_trader.ltx и в него пишем
[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%
Не забываем про логику Сидора, которую указали. Создаем там же файл esc_sidor_trader.ltx и в него вставляем
[logic] active = mob_trader@new_idle1 trade = misc\trade\trade_sidor.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%
Не забудьте создать файл торговли Сидора trade_sidor, который указали в логике, иначе вылет. Вот и все. Сидор должен занять свое место и все должно работать. P.S. Все скрипты и логику Сидора можно взять и в ЧН. Удачи в моддинге. Автор: !SkIF!