Сповіщення
Очистити все

Створення нового торговця (SPR)


Ранг:
Майстер
Роль:
Гість
Записи:
752
Приєднався:
2 роки тому
 

Новий торговець

Болюча тема для багатьох модмейкерів-початківців. Для створення нового торогівця потрібно осягати навички роботи зі спавн-файлом. Для створення торговця доведеться запастися деякими утилітами:

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!


   
Цитата