Новий торговець
Болюча тема для багатьох модмейкерів-початківців. Для створення нового торогівця потрібно осягати навички роботи зі спавн-файлом. Для створення торговця доведеться запастися деякими утилітами:
acdc від bardak
ActivePerl 5.8.8 для роботи програми acdc
Практика
Створення непису та профілю
І так. Спершу ми створюємо профіль непису. Наприклад, у файлі character_desc_escape.xml на адресу gamedata\config\gameplay\ Можна створити окремий файл для наших неписів, це спрощує суміщення модів. У файлі character_desc_escape.xml , в самому низу, перед тегом </xml> пишемо профіль нового непису:
<specific_character id = "esc_dark_stalker_voron" no_random= "1" > ;важливо при створенні торговця, вказати параметр no_random = "1" <name > Ворон </name > <icon > ui_npc_dark_voron </icon > <map_icon x = "0" y = "0" > </map_icon > <bio > sim_stalker_novice_bio </bio > <class > esc_dark_stalker_01 </class > -- налаштовує респаунер на клас персонажа для спавна різних моделей. ;т.к. ми спавним унікального непису, клас можна скопіювати у будь-якого іншого непису чи написати новий, унікальний клас. <community > dark_stalker </community > <money min = "500000" max = "500000" infinitive = "1" > </money > ;у полі грошей, треба поставити нескінченні гроші - infinitive="1" інакше ви зможете продати непису товарів виключно на вказану суму. <rank > 1000 </rank > <reputation > -553 </reputation > <visual > actors\dark_stalker\dark_stalker_voron </visual > ;посилання на файл-модель персонажа без закінчення .ogf <snd_config > characters_voice \ human_01\monolith\ </snd_config > < crouch_type > -1 </crouch_type > < panic /panic_treshold > <supplies > [spawn] \n wpn_gauss \n ammo_gauss \n #include "gameplay\character_items.xml" \n #include "gameplay\character_drugs.xml" \n #include "gameplay\character_food.xml" </supplies > #include "gameplay\character_criticals_3.xml" <start_dialog > hello_dialog_dark_stalker </start_dialog > <actor_dialog > dm_cool_info_dialog </actor_dialog > < actor_dialog > dm_help_wounded_medkit_dialog </actor_dialog > <actor_dialog > join_dark </actor_dialog > </specific_
Профіль створений, пара стандартних діалогів, взятих у будь-якого іншого профілю, дописати не важко. Я нічого не змінював у своєму коді. Лезем у npc_profile.xml , який знаходиться у тій же папці. Де-нитку внизу робимо запис:
<character id = "esc_dark_stalker_voron" > <class > esc_dark_stalker_01 </class > -- налаштовує респаунер на клас персонажа для спавна різних моделей. ;т.к. ми спавним унікального непису, клас можна скопіювати у будь-якого іншого непису чи написати новий, унікальний клас. <specific_character > esc_dark_stalker_voron </specific_character > -- посилання на профіль нашого непису. </character >
Введення у симуляцію
Непис створено. Тепер треба вводити його у симуляцію. Відкриваємо файл gamedata\config\creatures\spawn_sections.ltx і прописуємо наприкінці:
[ esc_dark_stalker_voron ] :stalker_trader - дописати суфікс торговця... хоча у мене і без нього все працювало = ) $ spawn = "respawn\esc_dark_stalker_voron" - опція спавна для Левел Едитора character_profile = профільcspec_spec_x = regular community = dark_stalker - угруповання
Спавн торговця через all.spawn файл
Далі, найнудніше – спавн. Використовуючи прогу acdc від bardak'a декомпілим all.spawn, створивши батник розбору спавна (без active perl толку від проги бардаку нуль - просто не запуститься) і в місці, що сподобалося, робимо запис з унікальним номером. Я спав на Кордоні:
[ 8796 ] ; cse_abstract properties section_name = stalker_trader - мітка, що сталкер є торговцем name = dark_stalker_voron - ім'я будь-яке, начебто ; де воно використовується не знаю . .0144814234226942 _ _ _ _ _ _ _ _ _ ; cse_alife_trader_abstract properties character_profile = esc_dark_stalker_voron ; cse_alife_object properties game_vertex_id = 61 -- геймвертекс, без нього спавнер не буде знати, на якій саме карті і в якій її частині спавнити об'єкт distance = 3.5 level_vertex_id = 42599 -- левелвертекс, без нього спавнер не знатиме, в якій частині карти об'єкт object_flags = 0xfffffffb custom_data = <<END [ logic ] cfg = scripts \ esc_voron.ltx - конфіг з логікою [ smart_terrains ] none = true - смарт террейн ; якщо створюєте статичного торговця - краще не виставляти смарт террейн ; якщо хочете бродягу - пишіть за аналогією з іншими неписами або створюйте свій смарт террейн, куди і визначайте непися [ spawn ] wpn_gauss - спавним в інвентарі все, що хочемо, у продаж воно не піде END story_id = 9958 - унікальний сторі_ід для міток на карті ; cse_visual properties visual_name = actors\dark_stalker\dark_stalker_voron - зовнішній вигляд, вказати шлях до .ogf моделі, без закінчення формату файлу! ; cse_alife_creature_abstract properties g_team = 0 g_squad = 0 g_group = 0 health = 2 dynamic_out_restrictions = dynamic_in_restrictions = upd : health = 2 upd : timestamp = 0 upd : creature_flags = 0 upd: position = -215.67399597168 , -20.403390884355 , -151.03227233887 - ті ж координати : o_torso = 0 , 0 , 0 upd: g_team = 0 upd: g_squad = 0 upd: g_group = 0 ; cse_alife_monster_abstract properties upd: next_game_vertex_id = 65535 upd: prev_game_vertex_id = 65535 upd: distance_from_point = 0 upd: distance_to_point = 0 ; cse_alife_human_abstract properties predicate5 = 2 , 2 , 1 , 2 , 0 predicate4 = 2 , 2 , 1 , 2 ; cse_ph_skeleton properties upd: start_dialog = ; se_stalker properties
Спал файл ще рано збирати!
Логіка торговця
Далі, створюємо файл конфіг торговця, який вказали в спавне - gamedata\config\scripts\esc_voron.ltx і пишемо в ньому:
[ logic ] active = walker trade = misc\trade_voron.ltx -- файл торгівлі, що створюється за аналогією з існуючими trader_flags = 0 - прапор трейдера inv_max_weight = 10000 -- вага інвентаря торговця on_death = death [ walker ] path_walk = esc_sin_voron_walk -- прив'язка вейпоінта , щоб трейдер стояв на місці або рухався за певним курсом path_look = esc_sin_voron_look -- куди буде дивитися непис [ meet ] use = true use_wpn = true -- перезаряджає зброю meet_talk_enabled = true
Тепер ліземо за скриптом від бардаку і знімаємо координати розташування нашого непису. У кого немає скрипта, копіюємо в gamedata/scripts/ui_main_menu.script цей скрипт:
function main_menu:OnButton_credits_clicked ( ) local text local vid local gvid local a = vector ( ) local text a = db.actor:position ( ) vid = db.actor:level_vertex_id ( ) gvid = db.actor:game_vertex_id ( ) text = "Позиція: \\ nX= " ..ax. " \\ nY=" ..ay. " \ nZ=" ..az. \\ nlevel_vertex= " ..vid.. " \\ ngame_vertex_id = " ..gvid news_manager.send_tip ( db.actor, text, nil , nil , 30000 ) end
Заходимо в гру, шукаємо потрібне нам місце (ногами), тиснемо з меню кнопку CREDITS і ми почуємо звуковий сигнал, після чого виходимо в гру з меню, і в рядку повідомлень висвітиться вся інформація. Все - F12 або на папірець списуємо отримані координати.
Створюємо вейпоїнти та лукпоїнти
І так, ми зняли координати місць, де хочемо бачити торговця і де ми хочемо, щоб він ходив – тепер у розібраному all.spawn шукайте файл way_*левел*.ltx і туди пишемо дані. Я наведу свій приклад, знову таки. У файлі way_l01_escape.ltx пишемо:
[ esc_sin_voron_look ] - ім'я , яке ми записали в ' ' gamedata \ config \scripts \ esc_voron.ltx ' '- _ 150.415893554688 p0: game_vertex_id = 46 p0: level_vertex_id = 54218 p1 : name = wp01 p1 : flags = 0x1 p1 : position = -207.645278930664 , -20.2700958251953 , -146.980590820313 p1 : game_vertex_id = 64 [ esc_sin_voron_walk ] - ім'я , яке ми записали в ' ' gamedata \ config \ scripts \ esc_voron.ltx ' ' .03227233887 p0 _ : game_vertex_id = 47 p0: level_vertex_id = 37503
Якщо потрібно створити кілька вейпоінтів - дивіться за аналогією з існуючими.
Після всього цього збираємо all.spawn батником (що писати в батниках для збору та розбору спавна - у файлі help.txt' у папці з програмою), закидаємо новий файл спавна в gamedata/spawn і стартуємо нову гру.
Надаємо торгівлю вже наявному неписю
Можна й описаним способом, але іноді потрібно привласнити торгівлю вже наявним неписам. Робитимемо торговцем когось із тих, що вже є... Кого, кого, кого...
Як завжди Вовка (у мене два піддослідні "щури"-Сидорович і Вовк, а так як Сід вже ним є, вибір очевидний. Ну що ж приступимо. Необхідно створити "файл торгівлі" типу "trade_....ltx". Можна прописати його самому (як це робити я пояснювати не буду, тому що і до мене все це зроблено не один раз, можна скопіювати будь-який інший ... я скопіював "trade_freedom.ltx" і перейменував його в "trade_wolf" і видалив всі прикондишні з інформацією дозвіл торгівлі.
Тепер треба послатись на нього. Робиться це у файлі логіки, тобто в "gulag_escape.ltx" (чому в ескейп, думаю зрозуміло, наш Вовк знаходиться на Кордоні. Відкриваємо файл і шукаємо рядки:
;------------------------------------------------- ------------------------------------------------ ;- - ESCAPE LAGER ;---------------------------------------------- -------------------------------------------------- - ; Вовк [ logic@esc_lager_volk ] active = walker@esc_lager_volk_walker1 on_death = death@wolf [ walker@esc_lager_volk_walker1 ] path_walk = wolf_walk path_look = wolf_look meet = meet@wolf on_actor_dist_le = 23 | { +tutorial_wounded_start -esc_kill_bandits_quest_kill } remark@esc_lager_volk1 on_actor_dist_le_nvis = 5 | walker@esc_lager_volk_walker2 danger = danger_condition@shustryi [ remark@esc_lager_volk1 ] anim = hello_wpn snd = esc_wolf_say_thanks target = actor on_signal = sound_end | walker@esc_lager_volk_walker2 on_actor_dist_le_nvis = 5 | walker@esc_lager_volk_walker2 danger = danger_condition@shustryi </code> Тепер пошлемося на наш трад-в секцію "[logic@esc_lager_volk]" додамо рядки: <code> trade = misc\trade_wolf.ltx inv_max_weight = 10000
Тобто має вийде таке:
;------------------------------------------------- ------------------------------------------------ ;- - ESCAPE LAGER ;---------------------------------------------- -------------------------------------------------- - ; Вовк [ logic@esc_lager_volk ] active = walker@esc_lager_volk_walker1 on_death = death@wolf trade = misc\trade_wolf.ltx inv_max_weight = 10000
Традом ми посилаємося на наш "торгівельний файл", а ось наступним рядком збільшуємо вага, що переноситься, оскільки він і у неписів обмежений. Залишилося тільки дати нашому "новонародженому" торговцю-Вовку більше грошей. Робимо це точно так, як описано, але різниця в тому, що ми редагуємо секцію Вовка в "character_desc_escape.xml" . Я ще й видалив рядок "#include "gameplay\character_criticals_4.xml"" з обмеженням по вазі, але правда про всяк випадок, оскільки не перевіряв, чи працює з ним.
На цьому все заходимо в гру і насолоджуємося власним творінням.
PS-Упс працює, але якось неправильно, у торговця виявляється немає підтримки переміщення. Тому ГСЦ всіх торгошей і биндят не сталкером, а монстром запрацювало лише коли я в бінді сталкера прописав:
function actor_binder:reinit ( ) object_binder.reinit ( self ) local npc_id = self.object:id ( ) db.storage [ npc_id ] = { } self.st = db.storage [ npc_id ] self.st.pstor = nil self.next_restrictors_update_time = -10000 self.object:set_callback ( callback.inventory_info, self.info_callback, self ) self.object:set_callback ( callback.article_info, self.article_callback, self ) self.object :set_callback ( callback.on_item_take, self.on_item_tak object:set_callback ( callback.on_item_drop, self.on_item_drop, self ) self.object:set_callback ( callback.trade_sell_buy_item, self.on_trade, self ) -- for game stats --self.object:set_callback(callback. , self) self.object:set_callback ( callback.task_state , self.task_callback, self ) --self.object:set_callback(callback.map_location_added, self.map_location_added_callback, self) self.object:set_callback ( callback , self ) self.object:set_callback ( callback.level_border_exit, self.level_border_exit, self ) self.object:set_callback ( callback.take_item_from_box, self.take_item_from_box, self ) ;ось мої рядки if self.object:clsid ( ) ~= clsid.script_trader then self.object:set_patrol_extrapolate_callback ( bind_monster.generic_object_binder.extrapolate_callback, self ) end db.storage [ self.object:id ( ) ] = { } self.st = db.storage [ self.object:id ( ) ] self.object:set_callback ( callback.patrol_path_in_point, self.waypoint_callback, self ) self.object:set_callback ( callback.hit , self.hit_callback, self ) self.object:set_callback ( callback.death, self.death
Все буде працювати на УРА, з одним огріхом - Вовк не буде відзначатись як мета при завданні поговорити з Вовком перед АТП, але думаю це не так важливо. Ну і ще без ствола ходитиме, але якщо буде атакований, то гармата з'явиться "з широких штанин" Вовка і він з неї намагатиметься вас нашпигувати свинцем.
Пост скриптум, дубль два... Теоретично, якщо рядки з калбеками зі звичайної секції сталкера прописати в мою, то наш традер (в даному випадку Вовк) буде якимось гібридом, який поєднує властивості як і НПС, так і унікальних торговців, спробуйте, має працювати .
УВАГА!!! ЦЯ СТАТТЯ БУДЕ ПРАЦЮВАТИ ТІЛЬКИ З SPR MOD ВІД SPR MOD TEAM!