Идём в
gamedata/configs/creatures/spawn_sections_наименованиеИ создаём там секцию с вашим неписем:
Код
[id_your_npc]:stalker
$spawn = "respawn\id_your_npc"
character_profile = id_your_npc
community = stalker
story_id = id_your_npc
Везде ставим одинаковое наименование в первую очередь для вашего удобства. Забудьте про числа в story_id непися. Вообще он нужен для того, чтобы разместить на нём к примеру метку в КПК.
Затем продолжаем регистрацию необходимых данных в
gamedata/configs/gameplayНам нужен файл
npc_profile_наименование (если инклуднули), либо просто
npc_profile.
Его вы можете инклуднуть в файле system, для этого под секцией [profiles] после
npc_profile, отделяя запятой пишем наименование собственного файла.
Копипастим в наш
npc_profile необходимые данные. Здесь пояснение не нужны.
<character id="id_your_npc">
<class>id_your_npc</class>
<specific_character>id_your_npc</specific_character>
</character>Теперь окончим оформление нашего НПС в
gamedata/configs/gameplay/character_desc_наименованиеИнклудится в system под секцией
[profiles], напротив
specific_characters_files так же через запятую.
Код
<specific_character id="id_your_npc" team_default="1"> - [color=orange]те данные, которые мы записывали выше[/color]
<name>Произвольное наименование вашего непися</name> - [color=orange]здесь можно вписывать сразу русские буквы, ничего страшного.[/color]
<icon>ui_inGame2_Freedom_3</icon>
<map_icon x="1" y="0"></map_icon>
<bio>Детальная информация отсутствует.</bio>
<class>id_your_npc</class> - [color=orange]те данные, которые мы записывали выше[/color]
<community>freedom</community> - [color=orange]группировка, в которой он состоит, все известные берём из configs/creatures/game_relations. В данном случае это "Свобода".[/color]
<terrain_sect>stalker_terrain</terrain_sect>
<mechanic_mode>1</mechanic_mode> - [color=orange]опционально мы можем сделать его механиком. Если не хотим, просто стираем эту строку[/color]
<snd_config>characters_voice\human_03\stalker\</snd_config> - [color=orange]набор звуков, которые будет издавать непись, существующие можно прослушать в папке sounds/characters_voice/ и выбрать нужную вам по образцу
[/color]
<rank>800</rank> - [color=orange]ранг непися имеет значение в коке. Подробнее в configs/creatures/game_relations, строка rating[/color]
<money min="0" max="0" infinitive="0"/>
<reputation>1200</reputation> - [color=orange]репутация непися имеет значение в коке. Подробнее в configs/creatures/game_relations, строка reputation[/color]
<visual>actors\stalker_freedom\stalker_freedom_3</visual> - [color=orange]визуал непися. То, как он будет выглядеть в игре. Просмотреть можно в папке meshes, либо взять образец из character_desc_general и character_desc_simulation (в коке там находятся ещё секции симуляционных нпс)[/color]
<supplies>
[spawn] \n -[color=orange]секция предметов непися. Большинство, за исключением оружия исчезнет после его смерти. Чтобы этого не произошло, нужно прописать их в configs/misc/death_generic, под секцией [keep_items], так: наименование предмета = true. Прописывайте сюда только квестовые. [/color]
wpn_g36 \n
ammo_5.56x45_ss190 = 4 \n - [color=orange]где = 4, это количество предметов. В случае с патронами это не играет никакой роли, так как спаун боеприпаса в количестве от минимального до максимального задаётся в death_generic, а самим неписям достаточно иметь лишь один патрон для ведения бесконечной стрельбы.[/color]
#include "gameplay\character_items.xml"
#include "gameplay\character_food.xml"
#include "gameplay\character_drugs.xml"
</supplies>
#include "gameplay\character_criticals_4.xml"
<actor_dialog>наименование диалога</actor_dialog> - [color=orange]диалоги, которые мы можем прописать нашему неписю. Если стоит actor_dialog, значит диалог начинаете вы, а если start_dialog, то непись.[/color]
<actor_dialog>actor_break_dialog</actor_dialog> - [color=orange]обязательно должен наличествовать диалог на выход из диалогового окна, если с ним можно торговать/вести беседу. Наименование всегда неизменно.[/color]
</specific_character>
Ну а теперь создадим для нашего непися квад. Идём в
configs/misc/squad_descr_наименование, вам же файл инклудится в
squad_descr.
Копипастим:
Код
[id_your_npc_squad] <img src="/.s/sm/23/surprised.gif" border="0" align="absmiddle" alt="surprised" /> nline_offline_group
faction = freedom
npc = id_your_npc
npc_in_squad = 1, 1
target_smart = mil_smart_terrain_7_7
Разберём здесь всё.
faction = freedom - влияет лишь на отображение группировки квада в дебаге и по видимому в оффлайне.
npc = id_your_npc - вместо
npc можно написать
npc_random. Если ваш квад будет насчитывать нескольно профилей, тогда они будут рандомно стоять в иерархии квада и лидером будет кто угодно. При npc лидером будет только первый стоящий профиль. После знака "
=" можно записать через запятую и другие профили. Например рандомных нпс. Их список вы можете найти в файле
squad_descr. Ну к примеру сделаем нашему свободовцу-унику охрану из парочки симуляционных свободовцев. Тогда наша строка будет выглядеть так:
npc = id_your_npc, sim_default_freedom_1, sim_default_freedom_0И в ней
id_your_npc всегда будет лидером (то есть только с ним можно будет говорить), ибо стоит
npc, а не
npc_random.
target_smart = mil_smart_terrain_7_7 -
mil_smart_terrain_7_7, это смарт, в котором всегда будет находиться наш квад. Он сразу же пойдёт занимать смарт-коверы и точки именно этого смарта. Если в логике нашего непися прописан тот или иной смарт-ковер/way и look путь, то он займёт именно его.
Сюда же можно выдать инфопоршень или функцию проверки:
target_smart = {+your_infoportion} bar_zastava, mil_smart_terrain_7_7Что же это означает? А то, что после получения инфопоршня your_infoportion наш непись пойдёт с со смарта
mil_smart_terrain_7_7 на смарт
bar_zastava и будет тусоваться уже там. Можно написать
nil вместо смарта и непись просто будет бродить по локации.
Функция проверки выглядит так:
target_smart = {=is_night} bar_zastava, mil_smart_terrain_7_7, то есть ночью квад переместится в другой смарт.
Теперь рассмотрим другие функции, которые можно применить для нашего квада:
invulnerability = true - неуязвимость квада.
true, либо
false, сюда так же можно выдать инфопоршень.
on_death =
%+your_infoportion% - после смерти квада можно выдать инфопоршень, либо функцию (не проверял), например:
%=give_task(your_task)%, то есть после смерти данного квада вам выдадут квест
your_task.
spawn_point = имя way точки - если мы спауним квад через рестриктор, то он появляется не в центре смарта, а именно в данной точке. Подробнее о way точках и рестрикторах в уроках по СДК Андрея Непряхина.
story_id = your_id - аналогично айди непися можно будет поставить отметку в КПК на квад.
relationship = friend/enemy/neutral- отношение данного квада к главному герою, то есть дружеские, вражеские, либо нейтральные.
Остальные функции либо забыл, либо они незначительны. Поехали дальше!
Теперь нам нужно, чтобы наш квад появился со старта игры (на момент CoC 1.4+). Идём в
configs/misc/simulation и ищем там смарт, в котором должен появиться наш квад. Так как
target_smart = mil_smart_terrain_7_7, то логичнее будет найти именно его (если указать другой, то они появятся там, но всё равно пойдут в
mil_smart_terrain_7_7. Под секцией смарта
[mil_smart_terrain_7_7] копипастим название нашего квада:
id_your_npc_squad. Вот и всё! Наш квад появится на базе "Свободы" в милитари.
Но я расскажу вам ещё и про логику.
Теперь зайдём в
configs/scripts/military/smart/mil_smart_terrain_7_7Есть пару способов, как узнать смарт, в котором вы хотите поместить вашего нпс:
1) Посмотреть в дебаге
2) Посмотреть в СДК
3) Пошариться по
configs/scripts/локация/smart/список смартов и определить по респауну в смарте, либо по наличию под секцией
[exclusive] логики узнаваемых персонажей. Так например по строке
mil_smart_terrain_7_7_freedom_leader = military\mil_smart_terrain_7_7_smart_logic.ltx (Лукаш) я определил, что это центральный смарт базы "Свободы".
Здесь нам необходимо прописать файл с логикой к нашему персонаже. Заглянем под секцию эксклюзивной логики:
[exclusive] и напишем:
id_your_npc = military\id_your_npc_logic.ltx - все наименования, как и путь (начиная с папки
configs/scripts) к файлу сугубо произвольны, но для удобства используйте имя смарта/непися.
Теперь создаём свой ltx файл. В данном случае это
id_your_npc_logicв папке
military.
Заходим в него и наконец разбираем по частям мною написанное:
[logic@id_your_npc] -
название, указанное до знака "=" в эксклюзивной логике, в нашем случае это id_your_npcsuitable = {=check_npc_name(id_your_npc)} true -
в круглых скобочках указано имя нашего непися. То есть логика составлена сугубо для него, остальные будут юзать дефолтные way пути и смарт-коверы.prior = 200 -
лучше не ниже приоритетов дефолтных смарт-коверов смартаactive = animpoint@base -
animpoint значит, что он будет использовать смарт-ковер, walker - юзает way пути. Со схемами guard, camper и т.д. не пробовал. После собаки произвольное наименование.can_select_weapon = false -
может ли он доставать оружие и вообще использоватьlevel_spot = mechanic -
спот в кпк (ещё есть medic, либо trader, либо quest_npc)dont_keep_items = true -
подбирает ли он предметы[animpoint@base]
cover_name = your_animpoint -
имя смарт-ковера. Если юзаем схему walker, тогда:
path_walk = guarder_2_walk
path_look = guarder_2_lookТочки волк и лук в
way_локация all.spawn. Обязательно перед
guarder_2_walk в аллспавне должно быть наименование смарта, но сюда его не пишем!
guarder_2 - произвольное наименование, только в случае с важным нпс. Для остальных есть схемы camper, walker, guard и sniper с соотв. поведением.
avail_animations = animpoint_sit_low -
анимации для смарт-ковераuse_camp = false -
юзает ли он байки и шуткиmeet = meet
combat_ignore_cond = {=actor_enemy =check_enemy_name(actor)} false, true -
проверка на актора, "=" означает действие в данный момент, а "!" - то, что происходит после окончания действия. То есть он не ввязывает в бои до тех пор, пока гг не враг ему.combat_ignore_keep_when_attacked = true
invulnerable = {!actor_enemy} true, false -
бессмертен, если актор не врагНе помогает сталкерам, не реагирует на трупы:gather_items_enabled = false
help_wounded_enabled = false
corpse_detection_enabled = false
[meet]
close_anim = nil
close_victim = nil
far_anim = nil
far_victim = nil
close_distance = 0
far_distance = 0
close_snd_distance = 3
abuse = false
use = {=actor_enemy} false, true -
разговаривает только, если гг не враг ему.allow_break = false
meet_on_talking = false
Так же под секцию
[animpoint@base] можно вписать:
on_info = {=surge_started} walker@surgeПри начале выброса переключает на следующую логику.
on_info = {!surge_started} animpoint@base, при окончании на обратную.
on_info2 = {=is_night} sleeper@sleeper_1При наступлении ночи переключает на след. логику. В данном случае спящий. Такое наименование хорошо тем, что требуется лишь одна way точка и он сразу принимает анимацию сна:
[sleeper@sleeper_1]
combat_ignore_cond = {=actor_enemy =check_enemy_name(actor)} false, true
combat_ignore_keep_when_attacked = true
gather_items_enabled = false
help_wounded_enabled = false
corpse_detection_enabled = false
invulnerable = {!actor_enemy} true, false
path_main = npc_sleeper -
вот онаmeet = no_meet -
не говорим, пока спим, секцию no_meet создавать не надоon_info = {!is_night} animpoint@base
- конец ночи, идём обратноЕсть проверки на:
is_dark_night, is_day, is_rain, is_heavy_rain. Можно воспользоваться поиском через noterpad++ и понять принцип действия данных функций.
Можно юзать и инфопоршень:
on_info = {+your_infoportion} animpoint@base1То есть после получения
your_infoportionон переключит на схему
animpoint@base1Осталось лишь создать обозначенный анимпоинт. Как? Смотрите урок Непряхина, либо будете мучиться вместе со мной. Сейчас напишу, как.
Вам понадобится замерщик координат: рекомендую
http://ap-pro.ru/forum/119-23343-612#904367 и распакованный all.spawn