Создание нового торговца — различия между версиями — S.T.A.L.K.E.R. Inside Wiki

Создание нового торговца — различия между версиями

Материал из S.T.A.L.K.E.R. Inside Wiki

Перейти к: навигация, поиск
(Авторы)
(оформление)
 
Строка 11: Строка 11:
 
===Создание непися и профиля===
 
===Создание непися и профиля===
  
И так. Сперва мы создаём профиль непися. Например, в файле ''character_desc_escape.xml'' по адресу ''gamedata\config\gameplay\''
+
И так. Сперва мы создаём профиль непися. Например, в файле '''character_desc_escape.xml''' по адресу '''gamedata\config\gameplay\'''
 
Можно создать отдельный файл для наших неписей, это упрощает совмещение модов.
 
Можно создать отдельный файл для наших неписей, это упрощает совмещение модов.
В файле ''character_desc_escape.xml'', в самом низу, '''перед''' тегом </xml> пишем профиль нового непися:
+
В файле '''character_desc_escape.xml''', в самом низу, '''перед''' тегом ''</xml>'' пишем профиль нового непися:
<pre><specific_character id="esc_dark_stalker_voron" no_random = "1">
+
<xml><specific_character id="esc_dark_stalker_voron" no_random = "1">
 
;важно при создании торговца, указать параметр no_random = "1"
 
;важно при создании торговца, указать параметр no_random = "1"
  
Строка 51: Строка 51:
 
<actor_dialog>dm_help_wounded_medkit_dialog</actor_dialog>
 
<actor_dialog>dm_help_wounded_medkit_dialog</actor_dialog>
 
<actor_dialog>join_dark</actor_dialog>
 
<actor_dialog>join_dark</actor_dialog>
</specific_character></pre>
+
</specific_character></xml>
  
Профиль создан, пара стандартных диалогов, взятых у любого другого профиля, дописать не составит труда. Я ничего не менял в своём коде. Лезем в ''npc_profile.xml'', который находится в той же папке. Где-нить внизу делаем запись:
+
Профиль создан, пара стандартных диалогов, взятых у любого другого профиля, дописать не составит труда. Я ничего не менял в своём коде. Лезем в '''npc_profile.xml''', который находится в той же папке. Где-нить внизу делаем запись:
  
<pre><character id="esc_dark_stalker_voron">
+
<xml><character id="esc_dark_stalker_voron">
 
<class>esc_dark_stalker_01</class> -- настраивает респавнер на класс персонажа для спавна разных моделей.
 
<class>esc_dark_stalker_01</class> -- настраивает респавнер на класс персонажа для спавна разных моделей.
 
;т.к. мы спавним уникального непися, класс можно скопировать у любого другого непися или написать новый, уникальный класс.
 
;т.к. мы спавним уникального непися, класс можно скопировать у любого другого непися или написать новый, уникальный класс.
 
<specific_character>esc_dark_stalker_voron</specific_character> -- ссылка на профиль нашего непися.
 
<specific_character>esc_dark_stalker_voron</specific_character> -- ссылка на профиль нашего непися.
</character></pre>
+
</character></xml>
  
 
===Ввод в симуляцию===
 
===Ввод в симуляцию===
  
Непись создан. Теперь надо вводить его в симуляцию. Открываем файл ''gamedata\config\creatures\spawn_sections.ltx'' и прописываем в конце:
+
Непись создан. Теперь надо вводить его в симуляцию. Открываем файл '''gamedata\config\creatures\spawn_sections.ltx''' и прописываем в конце:
  
<pre>[esc_dark_stalker_voron]:stalker_trader - дописать суффикс торговца... хотя у меня и без него всё работало =)
+
<ini>[esc_dark_stalker_voron]:stalker_trader - дописать суффикс торговца... хотя у меня и без него всё работало =)
 
$spawn                =  "respawn\esc_dark_stalker_voron" - опция спавна для Левел Едитора
 
$spawn                =  "respawn\esc_dark_stalker_voron" - опция спавна для Левел Едитора
 
character_profile    = esc_dark_stalker_voron - профиль непися, записанный в npc_profile.xml
 
character_profile    = esc_dark_stalker_voron - профиль непися, записанный в npc_profile.xml
 
spec_rank = regular
 
spec_rank = regular
community = dark_stalker - группировка</pre>
+
community = dark_stalker - группировка</ini>
  
 
==Спавн торговца через all.spawn файл==
 
==Спавн торговца через all.spawn файл==
Строка 75: Строка 75:
 
Дальше, самое нудное - спавн. Спасибо [[Участник:Arhet|Arhet]]'y за пример. Используя прогу '''acdc''' от bardak'a декомпилим all.spawn, создав батник разбора спавна (без active perl толку от проги бардака нуль - просто не запустится) и в понравившемся месте делаем запись с уникальным номером. Я заспавнил на Кордоне:
 
Дальше, самое нудное - спавн. Спасибо [[Участник:Arhet|Arhet]]'y за пример. Используя прогу '''acdc''' от bardak'a декомпилим all.spawn, создав батник разбора спавна (без active perl толку от проги бардака нуль - просто не запустится) и в понравившемся месте делаем запись с уникальным номером. Я заспавнил на Кордоне:
  
<pre>[8796]
+
<ini>[8796]
 
; cse_abstract properties
 
; cse_abstract properties
 
section_name = stalker_trader -- метка, что сталкер является торговцем
 
section_name = stalker_trader -- метка, что сталкер является торговцем
Строка 138: Строка 138:
 
upd:start_dialog =  
 
upd:start_dialog =  
  
; se_stalker properties</pre>
+
; se_stalker properties</ini>
  
 
'''Спавн файл еще рано собирать!'''
 
'''Спавн файл еще рано собирать!'''
Строка 144: Строка 144:
 
===Логика торговца===
 
===Логика торговца===
  
Далее, создаём файл конфиг торговца, который указали в спавне - ''gamedata\config\scripts\esc_voron.ltx'' и пишем в нём:
+
Далее, создаём файл конфиг торговца, который указали в спавне - '''gamedata\config\scripts\esc_voron.ltx''' и пишем в нём:
  
<pre>[logic]
+
<ini>[logic]
 
active = walker
 
active = walker
 
trade = misc\trade_voron.ltx -- файл торговли, создаётся по аналогии с существующими
 
trade = misc\trade_voron.ltx -- файл торговли, создаётся по аналогии с существующими
Строка 161: Строка 161:
 
use = true
 
use = true
 
use_wpn = true -- перезаряжает оружие
 
use_wpn = true -- перезаряжает оружие
meet_talk_enabled = true</pre>
+
meet_talk_enabled = true</ini>
  
Теперь лезем за скриптом от бардака и снимаем координаты местоположения нашего непися. У кого нету скрипта, копируем в ''gamedata/scripts/ui_main_menu.script'' этот скрипт:
+
Теперь лезем за скриптом от бардака и снимаем координаты местоположения нашего непися. У кого нету скрипта, копируем в '''gamedata/scripts/ui_main_menu.script''' этот скрипт:
  
<pre>function main_menu:OnButton_credits_clicked()  
+
<lua>function main_menu:OnButton_credits_clicked()  
 
local text  
 
local text  
 
local vid  
 
local vid  
Строка 176: Строка 176:
 
text = "Позиция:\\nX= "..a.x.."\\nY= "..a.y.."\\nZ= "..a.z.."\\nlevel_vertex= "..vid.."\\ngame_vertex_id= "..gvid  
 
text = "Позиция:\\nX= "..a.x.."\\nY= "..a.y.."\\nZ= "..a.z.."\\nlevel_vertex= "..vid.."\\ngame_vertex_id= "..gvid  
 
news_manager.send_tip(db.actor, text, nil, nil, 30000)  
 
news_manager.send_tip(db.actor, text, nil, nil, 30000)  
end</pre>
+
end</lua>
  
 
Заходим в игру, ищем нужное нам место (ногами), жмём из меню кнопку CREDITS и мы услышим звуковой сигнал, после чего выходим в игру из меню, и в строке сообщений высветиться вся инфа. Всё - F12 или на бумажку списываем полученные координаты.
 
Заходим в игру, ищем нужное нам место (ногами), жмём из меню кнопку CREDITS и мы услышим звуковой сигнал, после чего выходим в игру из меню, и в строке сообщений высветиться вся инфа. Всё - F12 или на бумажку списываем полученные координаты.
Строка 182: Строка 182:
 
===Создаём вейпоинты и лукпоинты===
 
===Создаём вейпоинты и лукпоинты===
  
И так, мы сняли координаты мест, где хотим видеть торговца и где мы хотим, чтобы он ходил - теперь в разобранном all.spawn ищите файл way_*левел*.ltx и туда пишем данные. Я приведу пример свой, опять таки. В файле ''way_l01_escape.ltx'' пишем:
+
И так, мы сняли координаты мест, где хотим видеть торговца и где мы хотим, чтобы он ходил - теперь в разобранном all.spawn ищите файл '''way_*левел*.ltx''' и туда пишем данные. Я приведу пример свой, опять таки. В файле '''way_l01_escape.ltx''' пишем:
  
<pre>[esc_sin_voron_look] -- имя, которые мы записали в ''gamedata\config\scripts\esc_voron.ltx''
+
<ini>[esc_sin_voron_look] -- имя, которые мы записали в ''gamedata\config\scripts\esc_voron.ltx''
 
points = p0,p1
 
points = p0,p1
 
p0:name = wp00
 
p0:name = wp00
Строка 205: Строка 205:
 
p0:position = -215.67399597168,-20.403390884355,-151.03227233887
 
p0:position = -215.67399597168,-20.403390884355,-151.03227233887
 
p0:game_vertex_id = 47
 
p0:game_vertex_id = 47
p0:level_vertex_id = 37503</pre>
+
p0:level_vertex_id = 37503</ini>
  
 
Если нужно создать несколько вейпоинтов - смотрите по аналогии с уже существующими.
 
Если нужно создать несколько вейпоинтов - смотрите по аналогии с уже существующими.
  
После всего этого собираем all.spawn батником (что писать в батниках для сбора и разбора спавна - в файле help.txt в папке с программой), закидываем новый файл спавна в ''gamedata/spawn'' и стартуем новую игру.
+
После всего этого собираем all.spawn батником (что писать в батниках для сбора и разбора спавна - в файле '''help.txt''' в папке с программой), закидываем новый файл спавна в '''gamedata/spawn'' и стартуем новую игру.
  
 
====Присваеваем торговлю уже имеющемуся неписю====
 
====Присваеваем торговлю уже имеющемуся неписю====
 
Можно и описанным способом, но иногда требуется присвоить торговлю к уже имеющимся неписям. Будем делать торговцем кого-нибудь из уже имеющихся... Кого, кого, кого...
 
Можно и описанным способом, но иногда требуется присвоить торговлю к уже имеющимся неписям. Будем делать торговцем кого-нибудь из уже имеющихся... Кого, кого, кого...
  
Как обычно Волка (у меня две подопытных "крысы"-Сидорович и Волк, а так как Сид уже им является, выбор очевиден. Ну чтож приступим. Необходимо создать "файл торговли" типа "trade_....ltx". Можно прописать его самому(как это делать я объяснять не буду, т.к. и до меня все это сделано не один раз, можно скопировать любой другой... я скопировал "trade_freedom.ltx" и переименовал его в "trade_wolf" и удалил все прикондишны с информацией на разрешение торговли.
+
Как обычно Волка (у меня две подопытных "крысы"-Сидорович и Волк, а так как Сид уже им является, выбор очевиден. Ну чтож приступим. Необходимо создать "файл торговли" типа '''"trade_....ltx"'''. Можно прописать его самому(как это делать я объяснять не буду, т.к. и до меня все это сделано не один раз, можно скопировать любой другой... я скопировал '''"trade_freedom.ltx"''' и переименовал его в '''"trade_wolf"''' и удалил все прикондишны с информацией на разрешение торговли.
  
Теперь нужно сослаться на него. Делается это в файле логики, то бишь в "gulag_escape.ltx" (почему в эскейп, думаю понятно, наш Волк находится на Кордоне. Открываем файл и ищем строки:
+
Теперь нужно сослаться на него. Делается это в файле логики, то бишь в '''"gulag_escape.ltx"''' (почему в эскейп, думаю понятно, наш Волк находится на Кордоне. Открываем файл и ищем строки:
<code>;-------------------------------------------------------------------------------------------------
+
<ini>;-------------------------------------------------------------------------------------------------
 
;-- ESCAPE LAGER
 
;-- ESCAPE LAGER
 
;-------------------------------------------------------------------------------------------------
 
;-------------------------------------------------------------------------------------------------
Строка 243: Строка 243:
 
Теперь сошлемся на наш трад-в секцию "[logic@esc_lager_volk]" добавим строки:
 
Теперь сошлемся на наш трад-в секцию "[logic@esc_lager_volk]" добавим строки:
 
<code>trade = misc\trade_wolf.ltx
 
<code>trade = misc\trade_wolf.ltx
inv_max_weight = 10000</code>
+
inv_max_weight = 10000</ini>
 
То есть должно получится следующее:
 
То есть должно получится следующее:
<code>
+
<ini>
 
;-------------------------------------------------------------------------------------------------
 
;-------------------------------------------------------------------------------------------------
 
;-- ESCAPE LAGER
 
;-- ESCAPE LAGER
Строка 255: Строка 255:
 
trade = misc\trade_wolf.ltx
 
trade = misc\trade_wolf.ltx
 
inv_max_weight = 10000
 
inv_max_weight = 10000
</code>
+
</ini>
Традом мы ссылаемся на наш "торговый файл", а вот следующей строкой увеличиваем переносимый вес, поскольку он и у неписей ограничен. Осталось только дать нашему "новорождённому" торговцу-Волку побольше денег. Делаем это точно также как описано, но различие в том, что мы редактируем секцию Волка в "character_desc_escape.xml". Я еще и удалил строку "#include "gameplay\character_criticals_4.xml"" с ограничением по весу, но правда на всякий случай, поскольку не проверял, работает ли с ним.
+
Традом мы ссылаемся на наш "торговый файл", а вот следующей строкой увеличиваем переносимый вес, поскольку он и у неписей ограничен. Осталось только дать нашему "новорождённому" торговцу-Волку побольше денег. Делаем это точно также как описано, но различие в том, что мы редактируем секцию Волка в '''"character_desc_escape.xml"'''. Я еще и удалил строку ''"#include "gameplay\character_criticals_4.xml""'' с ограничением по весу, но правда на всякий случай, поскольку не проверял, работает ли с ним.
  
 
На этом все, заходим в игру и наслаждаемся собственным творением.
 
На этом все, заходим в игру и наслаждаемся собственным творением.
  
P.S.-Упс, работает, но как-то неправильно, у торговца оказывается нет поддержки перемещения. Поэтому ГСЦ всех торгошей и биндят не сталкером, а монстром Заработало только когда я в бинде сталкера прописал:
+
P.S.-Упс, работает, но как-то неправильно, у торговца оказывается нет поддержки перемещения. Поэтому ГСЦ всех торгошей и биндят не сталкером, а монстром заработало только когда я в бинде сталкера прописал:
<code>
+
<lua>
 
function actor_binder:reinit()
 
function actor_binder:reinit()
 
object_binder.reinit(self)
 
object_binder.reinit(self)
Строка 298: Строка 298:
 
self.object:set_callback(callback.death, self.death_callback, self)
 
self.object:set_callback(callback.death, self.death_callback, self)
 
end
 
end
</code>
+
</lua>
 
Все будет работать на УРА, с одним огрехом - Волк не будет отмечатся как цель при задании поговорить с Волком перед АТП, но думаю это не столь важно. Ну и еще без ствола будет ходить, но если будет атакован, то пушка появится "из широких штанин" Волка и он будет из нее пытаться вас нашпиговать свинцом.
 
Все будет работать на УРА, с одним огрехом - Волк не будет отмечатся как цель при задании поговорить с Волком перед АТП, но думаю это не столь важно. Ну и еще без ствола будет ходить, но если будет атакован, то пушка появится "из широких штанин" Волка и он будет из нее пытаться вас нашпиговать свинцом.
  

Текущая версия на 10:41, 23 июля 2013

Новый торговец

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

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_treshold>0</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_character>

Профиль создан, пара стандартных диалогов, взятых у любого другого профиля, дописать не составит труда. Я ничего не менял в своём коде. Лезем в 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    = esc_dark_stalker_voron - профиль непися, записанный в npc_profile.xml
spec_rank = regular
community = dark_stalker - группировка

Спавн торговца через all.spawn файл

Дальше, самое нудное - спавн. Спасибо Arhet'y за пример. Используя прогу acdc от bardak'a декомпилим all.spawn, создав батник разбора спавна (без active perl толку от проги бардака нуль - просто не запустится) и в понравившемся месте делаем запись с уникальным номером. Я заспавнил на Кордоне:

[8796]
; cse_abstract properties
section_name = stalker_trader -- метка, что сталкер является торговцем
name = dark_stalker_voron -- имя любое, вроде бы; где оно используется не знаю
position = -215.67399597168,-20.403390884355,-151.03227233887 -- местоположение на игровой карте
direction = 0.0445535257458687,-0.000645029998850077,0.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 -- те же координаты, что и в секции position
upd:o_model = 0
upd: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 = meet -- параметры реакции непися на встречу с актором
 
[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= "..a.x.."\\nY= "..a.y.."\\nZ= "..a.z.."\\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''
points = p0,p1
p0:name = wp00
p0:flags = 0x1
p0:position = -205.306793212891,-20.4855155944824,-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 = 61
p1:level_vertex_id = 45276
 
 
[esc_sin_voron_walk] -- имя, которые мы записали в ''gamedata\config\scripts\esc_voron.ltx''
points = p0
p0:name = wp00
p0:flags = 0x1
p0:position = -215.67399597168,-20.403390884355,-151.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"" с ограничением по весу, но правда на всякий случай, поскольку не проверял, работает ли с ним.

На этом все, заходим в игру и наслаждаемся собственным творением.

P.S.-Упс, работает, но как-то неправильно, у торговца оказывается нет поддержки перемещения. Поэтому ГСЦ всех торгошей и биндят не сталкером, а монстром заработало только когда я в бинде сталкера прописал:

 
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_take, self)
	self.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.actor_sleep, self.sleep_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.level_border_enter, self.level_border_enter, 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_callback,	self)
end
 

Все будет работать на УРА, с одним огрехом - Волк не будет отмечатся как цель при задании поговорить с Волком перед АТП, но думаю это не столь важно. Ну и еще без ствола будет ходить, но если будет атакован, то пушка появится "из широких штанин" Волка и он будет из нее пытаться вас нашпиговать свинцом.

Пост скриптум, дубль два... Теоретически, если строки с калбеками из обычной секции сталкера прописать в мою, то наш традер (в данном случае Волк) будет неким гибридом, сочетающим свойства как и НПС, так и уникальных торговцев, попробуйте, должно работать.

ВНИМАНИЕ!!! ЭТА СТАТЬЯ БУДЕТ РАБОТАТЬ ТОЛЬКО С SPR MOD ОТ SPR MOD TEAM!!!

Авторы

Статья Орион.
При помощи (косвенной) Arhet.
Дополнение Костя.н.ы.ч. Доп.инфо CRAZY_STALKER

Другие места
LANGUAGE