Школa Моддингa
Участников: 4
:: Echo Team :: Echo Team Форум
Страница 2 из 2
Страница 2 из 2 • 1, 2
Спавн NPC
Эта часть статьи написана Arhet и создана на примере того, как в SRP Mod были созданы NPC группировки "Грех".
Задействуем файлы:
* gamedata\config\gameplay\character_desc_escape.xml
* gamedata\config\gameplay\npc_profile.ltx
* gamedata\config\creatures\spawn_sections.ltx
Начнем с character_desc_escape.xml. Описание что значит каждая строка Arhet писать не стал, а я не он мне не лень .
Тут создадим нового персонажа:
<specific_character id="esc_dark_stalker_1" team_default = "1">
<name>GENERATE_NAME_bandit</name> ;имя само генерируется (если нужен квестовый непись пишите англ. буквами его имя и сделайте ему на русском аналогично описанию предмета)
<icon>ui_npc_dark_1</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> <terrain_sect>stalker_terrain</terrain_sect>
<money min="200" max="600" infinitive="0"></money> ;кол-во денег у непися (здесь любое кол-во от 200 до 600 руб, если поставить infinitive="1" каждый раз при торговле с ним деньги будут востанавливаться
<rank>198</rank> ;ранг (то что мы видим в пда - 20 лучших сталкеров, чем выше ранг тем больше у непися шансов оказаться в этой двадцатке))
<reputation>-24</reputation> ;репутация отношение этого НПС к ГГ (если с минусом то плохое, если 5000 (макс) то он будет ГГ другом не смотря на то что весь клан враждует с ГГ)
<visual>actors\dark_stalker\dark_stalker_1</visual> ;визуал (текстура+модель)
<snd_config>characters_voice\human_01\monolith\</snd_config> ; звук голоса (монолит)
<crouch_type>-1</crouch_type>
<panic_treshold>0</panic_treshold> ; вероятность того что непись бросит оружие и будет убегать от вас в ужасе
<supplies>
[spawn] \n
wpn_dark_colt1911 \n
ammo_11.43x23_hydro \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>dm_hello_dialog</start_dialog>
<actor_dialog>dm_cool_info_dialog</actor_dialog> ;новый диалог
</specific_character>
Впишем наш код после какого-нибудь </specific_character>
Теперь идем в npc_profile.xml и туда вгоняем:
<character id="esc_dark_stalker_1">
<class>esc_dark_stalker_01</class>
<specific_character>esc_dark_stalker_1</specific_character>
</character>
Теперь надо заняться spawn_sections.ltx. Скрипт будет «брать NPC» как раз из этого файла. Пишем туда:
* [esc_dark_stalker_1]:stalker – имя секции для скрипта..
* $spawn = "respawn\esc_dark_stalker_1"
* character_profile = esc_dark_stalker_1 – ссылка на описание нашего NPC
* spec_rank = regular – спец ранг
* community = dark_stalker – группировка.
Теперь берем любой скрипт спавна NPC, вгоняем туда имя секции из spawn_sections.ltx и ву-а-ля.
Тока забыли что данному НПС будет присвоенная дефолтовая логика (т.е. тупо хожу куда сам не знаю) забыли упомянуть про (ххх - лока):
ххх gulag.script (действия НПС! Где можно: где можно присвоить статус кампера; волкера; и.д.т)
ххх gulag.ltx (дублер логики т.е. дублирует кратко действия НПС)
Задействуем файлы:
* gamedata\config\gameplay\character_desc_escape.xml
* gamedata\config\gameplay\npc_profile.ltx
* gamedata\config\creatures\spawn_sections.ltx
Начнем с character_desc_escape.xml. Описание что значит каждая строка Arhet писать не стал, а я не он мне не лень .
Тут создадим нового персонажа:
<specific_character id="esc_dark_stalker_1" team_default = "1">
<name>GENERATE_NAME_bandit</name> ;имя само генерируется (если нужен квестовый непись пишите англ. буквами его имя и сделайте ему на русском аналогично описанию предмета)
<icon>ui_npc_dark_1</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> <terrain_sect>stalker_terrain</terrain_sect>
<money min="200" max="600" infinitive="0"></money> ;кол-во денег у непися (здесь любое кол-во от 200 до 600 руб, если поставить infinitive="1" каждый раз при торговле с ним деньги будут востанавливаться
<rank>198</rank> ;ранг (то что мы видим в пда - 20 лучших сталкеров, чем выше ранг тем больше у непися шансов оказаться в этой двадцатке))
<reputation>-24</reputation> ;репутация отношение этого НПС к ГГ (если с минусом то плохое, если 5000 (макс) то он будет ГГ другом не смотря на то что весь клан враждует с ГГ)
<visual>actors\dark_stalker\dark_stalker_1</visual> ;визуал (текстура+модель)
<snd_config>characters_voice\human_01\monolith\</snd_config> ; звук голоса (монолит)
<crouch_type>-1</crouch_type>
<panic_treshold>0</panic_treshold> ; вероятность того что непись бросит оружие и будет убегать от вас в ужасе
<supplies>
[spawn] \n
wpn_dark_colt1911 \n
ammo_11.43x23_hydro \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>dm_hello_dialog</start_dialog>
<actor_dialog>dm_cool_info_dialog</actor_dialog> ;новый диалог
</specific_character>
Впишем наш код после какого-нибудь </specific_character>
Теперь идем в npc_profile.xml и туда вгоняем:
<character id="esc_dark_stalker_1">
<class>esc_dark_stalker_01</class>
<specific_character>esc_dark_stalker_1</specific_character>
</character>
Теперь надо заняться spawn_sections.ltx. Скрипт будет «брать NPC» как раз из этого файла. Пишем туда:
* [esc_dark_stalker_1]:stalker – имя секции для скрипта..
* $spawn = "respawn\esc_dark_stalker_1"
* character_profile = esc_dark_stalker_1 – ссылка на описание нашего NPC
* spec_rank = regular – спец ранг
* community = dark_stalker – группировка.
Теперь берем любой скрипт спавна NPC, вгоняем туда имя секции из spawn_sections.ltx и ву-а-ля.
Тока забыли что данному НПС будет присвоенная дефолтовая логика (т.е. тупо хожу куда сам не знаю) забыли упомянуть про (ххх - лока):
ххх gulag.script (действия НПС! Где можно: где можно присвоить статус кампера; волкера; и.д.т)
ххх gulag.ltx (дублер логики т.е. дублирует кратко действия НПС)
Dogfase- Группировка "Долг"
- Сообщения : 166
Дата регистрации : 2010-05-22
Возраст : 28
Откуда : Российская Федерация,Приморский край, Фокино
Re: Школa Моддингa
Есть определенный набор схем, которые описывают поведение персонажа. Они прописываются у него в custom_data или, в случае гулага, в соответствующих файлах, описывающих работы данного гулага. Ниже приведен перечень этих схем.
В файле \gamedata\scripts\modules.script указаны все загружаемые схемы.
Схема walker:
Схема sleeper:
Схема kamp:
Схема camper:
Схема sniper:
Схема follower:
Схема zoneguard:
Схема wounded (раненый):
Схема rest:
Схема heli_hunter:
Схема рatrol:
В файле \gamedata\scripts\modules.script указаны все загружаемые схемы.
Схема walker:
- Спойлер:
- Это базовая схема, в которой персонаж перемещается по патрульному пути (path_walk) и останавливается в определенных точках и выполняет соответствующие действия.
[walker]
* path_walk = имя пути - основной путь, по которому ходит NPC
* path_look = имя пути - путь, куда смотрит NPC
* team - команда для синхронизации
В точках path_walk, которым соответствуют точки пути path_look (стоят одинаковые флажки) персонаж останавливается и смотрит в определенную точку, при этом отыгрывая (или не отыгрывая) определенную анимацию.
* def_state_moving1 - состояние, в котором сталкер движется к первой точке пути, если она близко (patrol по умолчанию)
* def_state_moving2 - состояние, в котором сталкер движется к первой точке пути, если она не слишком далеко (rush по умолчанию)
* def_state_moving3 - состояние, в котором сталкер движется к первой точке пути, если она далеко (sprint по умолчанию)
* def_state_standing - дефолтное состояние в котором он стоит и смотрит на точку, если в этой точке не задана другое состояние.
Файл: \gamedata\scripts\xr_walker.script
- Спойлер:
- Схема используется для синхронизации\связки других схем.
[remark]
* snd_anim_synс = true/false - Указывает на то необходимо ли синхронизировать звук с анимацией либо нет
* snd - звук ремарка, по умолчанию nil
* anim - анимация ремарка, по умолчанию wait
* target - куда смотрит сталкер. Есть следующие варианты
o story_id – числовое значение
o actor – без комментариев
o nil – позиция вычисленная АИ автоматически
o <имя работы>,<имя гулага> смотреть на сталкера который находится на определенной работе под гулагом (второй параметр необязателен. В этом случае берется гулаг сталкера, для которого задана данная секция ремарка).
Пример:
target = logic@cit_killers_base_guard, cit_killers <path_name>, <point_number> - можно указывать смотреть в вершину патрульного пути (<имя пути>, <имя точки>).
Внимание, теперь если значение не задано, то оно равно nil а не actor, как было раньше. То есть если вы хотите чтобы персонаж в ремарке смотрел на актера - необходимо явно прописывать это. Если задано значение nil, то персонаж развернется в позицию, которую посчитает AI.
Стандартные сигналы для remark:
* sound_end – по окончании проигрывания звуковой схемы
* anim_end – по окончании проигрывания анимации
* action_end – по окончании проигрывания и того и другого, если они синхронизированы
Пример синхронизации анимации и звука в схеме remark:
[remark]
* anim - анимация
* snd - звук
* snd_anim_sync = true - синхронизация
* on_signal = action_end | следующая схема
Схема sleeper:
- Спойлер:
- Схема сидящего и спящего NPC. Необходимо поставить патрульный путь, минимум из одного поинта. Спящий будет садиться спать в нулевой точке пути, и разворачиваться при этом в сторону первой точки.
[sleeper]
* path_main = ... - имя пути
* wakeable = true – может ли проснуться быстро (если true, то спит на корточках и во сне бормочет)
Если путь состоит из двух точек, то связь нужно делать от первой точки к нулевой (либо двунаправленную).
Файл: \gamedata\scripts\xr_sleeper.script
Схема kamp:
- Спойлер:
- Схема сталкера, сидящего в определенном радиусе вокруг указанной точки (у костра), и располагающегося лицом к этой точке.
[kamp]
* center_point = kamp_center – имя точки вокруг которой NPC будет устраиваться.
* radius = 2 - насколько далеко сталкер будет сидеть от центра лагеря, 2 - по умолчанию.
* def_state_moving = run - дефолтное состояние, в котором сталкер будет идети к точке кампа.
Файл: \gamedata\scripts\xr_kamp.script
Если точка кампа находится в костре, то в оффлайне сталкера прийдут на нее, а когда они перейдут в онлайн, то окажуться внутри костра, где и получат хит. Чтобы этого не случалось в секции кемпа указывать path_walk из одной точке, название которой равно:
<path_kamp_name>_task
* path_walk = <path_kamp_name>_task
Если точка кемпа расположена в чистом поле то, path_walk прописывать не надо.
Схема camper:
- Спойлер:
- Свойства кемперов:
* Кемпер стоит на точке и смотрит в направлении, куда Вы его поставили в редакторе или передигается по патрульным путям
* Кемперы переключаются на универсальный комбат, только если видят врага ближе чем в 30 метрах. Если он выжил, он возращается в состояние кемпера.
* В любых других случаях действуют по собственной скриптовой схеме. Если видим врага - стреляем. Если слышим danger - то смотрим в направление в danger. Если видим гранату - убегаем от гранаты. Если видели врага, а враг исчез, то смотрим в точку, где видели последний раз врага.
* Кемперы не сражаются в движении. Если они видят врага - они останавливаются, стреляют, а потом продолжают движение.
[camper]
* path_walk = patrol_path
* path_look = patrol_path
* radius = ... – расстояние в метрах, если расстояние между кэмпером и противником меньше указанного, кэмпер уходит в универсальный комбат. По умолчанию этот радиус равен 20 метрам.
* no_retreat = true - персонаж при виде врага не будет ломиться на ближайшую точку path_walk, а сразу перейдет в режим убивания. Нужно это в том случае, если вы хотите сделать сценку, когда одни ребята наезжают на других. Ставите кемперов с вышеуказанным флажком. Они идут по своим патрульным путям и выносят врагов.
* def_state_moving = ... - (состояние из стейт менеджера), в котором мы движемся на ближайшую точку пути при враге.
* def_state_moving_fire = ... - (состояние из стейт менеджера (sneak_fire)), в котором мы отстреливаемся от врага, во время движения на ближайшую точку пути.
* def_state_campering = ... - (состояние из стейт менеджера (hide)), в котором мы ожидаем врага, находясь на пути.
* def_state_campering_fire = ... (состояние из стейт менеджера (hide_fire)), в котором мы отстреливаемся от врага, находясь на пути.
* attack_sound = имя_звуковой_темы - возможность переопределять снайперам/кемперам звук атаки. По дефолту он равен звуковой теме "fight_attack". Можно изменить на любое другое (для сценических потребностей) либо вообще отключить, прописав в секции кемпера пустой атрибут.
* shoot = ... - Задаем тип стрельбы. Возможные значения:
o always - значение по умолчанию, стреляет всегда, когда можно
o none - не стреляет вообще.
o terminal - стреляет только когда находится на последней точки патрульного пути. Это сделано для облегчения построение атакующих сцен.
У кемпера есть один большой минус – когда ему наносится хит и он не знает откуда хит наносится (не видит противника, не слышит выстрела), то он тупо продолжает стоять на старом месте и ждать следующей пули. Ввиду этого не стоит расставлять кемперов в случае, когда сталкеры должны защищаться и держать позицию в том случае, если есть несколько направлений, откуда игрок или стелкеры смогут атаковать поставленного кемпера. Используйте walkerов в таких случаях, а кемперов стоить ставить для атак по путям и как снайперов.
Схема sniper:
- Спойлер:
- Разновидность кемпера. Отличаются тем, что стреляют только одиночными выстрелами и не смотрят по точкам патрульного пути, а сканируют пространство между ними. Скорость сканирования от точки к точке фиксирована и равна 20сек. Внимание! Ставить снайперу только 2 точки look.
В кастом дате кемпера прописать:
sniper = true
Файл: \gamedata\scripts\xr_camper.script
Схема follower:
- Спойлер:
- В custom_data прописан как follower. NPC идет за NPC лидером. Если до лидера расстояние менее 5 метров, то он идет, если от 5 до 20 – бежит в режиме run, если свыше 20 – догоняет в режиме sprint. Пути не задаются.
[follower]
* leader = ... - story_id лидера из game.ltx (число!).
* formation_line = true - постарается идти сбоку от лидера, в противном случае будет идти сзади.
* distance = ... - расстояние в метрах, на котором будет идти от лидера attendant. По умолчанию – 1,5 метра, если идет цепью, то 5 метров.
* state_if_leader_in_meet - это есть строка с именем состояния из state_manager, которое будет назначено follower'ам, если командир пребывает в состоянии meet.
* anim_walk = state - состояние, в котором фолловер идет за лидером.
* anim_run = state - состояние, в котором фолловер бежит за лидером.
* anim_sprint = state - состояние, в котором фолловер спринтует за лидером.
Файл: \gamedata\scripts\xr_ attendant.script
Если все это происходит под гулагом, то вместо story_id лидера, мы прописываем его секцию логики в файле скрипта. Пример:
t = { section = "logic@bar_arena_follower_2",
idle = 0,
prior = 7, state = {0}, squad = squad, group = groups[0],
in_rest = "", out_rest = "",
dependent = "logic@bar_arena_leader",
predicate = function(obj)
return obj:character_community() == "dolg"
end
}
Схема zoneguard:
- Спойлер:
- NPC есть две зоны (может быть одна). Он ходит по путям, но когда игрок заходит в зону, отрывает от дел, подбегает к игроку, наставляет на игрока оружие (может кричать, может говорить), если игрок заходит во вторую зону – атакует игрока
[zoneguard]
* path_walk = ... - путь перемещения
* path_look = ... - путь обзора
* team = ... - имя команды синхронизированных zoneguard-ов (из всей команды только 1 будет реагировать на игрока)
* zone_guard = ... - имя зоны, в пределах которой игрок будет атакован
* zone_warn = ... - имя зоны, в пределах которой начинать разговор с игроком
* walker_team = ... - team для схемы перемещения его в состоянии walker (если не задан, используется значение из поля team)
* no_move = ... - если true, персонаж окликнет игрока с места и не будет подбегать к нему
* snd_greet = ... - имя звуковой схемы, из которой будет проигран звук при обнаружении персонажа
* ignore_friends = ... - true - будет игнорировать дружественных ему персонажей.
* ignore_cond = {+info -info =func !func} - условия, при которых NPC игнорирует игрока
* no_danger = ... - если true, то не отыгрывает угрожающую анимацию, нейтралам.
* anim = ... - какую отыгрывает анимацию, если игрок ему не враждебен.
* snd_anim_sync = ... - если true, то npc будет синхронизировать звук с анимацией
Файл: \gamedata\scripts\xr_zoneguard.script
Схема wounded (раненый):
- Спойлер:
- [logic]
wounded = wounded
[walker]
wounded = wounded
[wounded]
hp_state = HP|condstate@condsound|HP|condstate@condsound
hp_state_see = HP|condstate@condsound|HP|condstate@condsound
psy_state = PSY|condstate@condsound|PSY|condstate@condsound
hp_victim = HP|condvictim|HP|condvictim
hp_cover = HP|condbool|HP|condbool
hp_fight = HP|condbool|HP|condbool
syndata = state@sound|state@sound
help_dialog = story_id
help_start_dialog = story_id
Где:
* condstate – кондлист, возвращающий состояние персонажа, либо true. Если он возвращает true – нпс обидится на игрока
* condsound – кондлист, возвращающий саунд тему.
* HP – пороговые значение здоровья персонажа
* PSY – пороговые значения пси здоровья персонажа
* condvictim – кондлист, возвращающий направление куда смотреть. Возможные значения: nil, actor, number. В случае числа – будет смотреть на персонажа с указанными стори айди.
* condbool – кондлист, возвращаюзий true либо false.
Значения полей:
* hp_state – поведение персонажа когда он не видит игрока
* hp_state_see – поведение персонажа, когда он видит игрока
* psy_state – поведение персонажа при псиатаках
* hp_victim – куда смотреть, в зависимости от ХП
* hp_cover – идти в укрытие или нет, в зависимости от ХП
* hp_fight – разрешено воевать или нет, в зависимости от ХП
* syndata – синхропары для красоты.
* help_dialog – story_id диалога вместо дефолтного actor_help_wounded. Если вам по сюжету необходимо заменить диалог другим, то вы в этом поле прописываете id другого диалога.
Также мы вставляем стартовый диалог раненого. Если мы его прописываем, то все актёрские диалоги для раненых должны иметь такой precondition: dialogs.allow_wounded_dialog.
Пример. В качестве примера взята дефолтная настройка.
hp_state = 30|help_me@help|10|wounded_heavy@help_heavy
hp_state_see = 30|wounded@help_see|10|wounded_heavy@help_heavy
psy_state = 50|{=best_pistol}psy_armed,psy_pain@wounded_psy|20|
{=best_pistol}psy_shoot,psy_pain@{=best_pistol}wounded_psy_shoot,wounded_psy
hp_victim = 30|actor|10|nil
hp_cover = 30|true|10|false
hp_fight = 30|true|10|false
syndata = wounded@help
Где:
* best_pistol – проверка на то, что лучшее оружие НПС является пистолетом.
Файл: \gamedata\scripts\xr_wounded.script
Схема rest:
- Спойлер:
- Чувак гуляет, хавает, спит. Пока нормально не работает.
Файл: \gamedata\scripts\xr_rest.script
Схема heli_hunter:
- Спойлер:
- Может стрелять, либо не стрелять по вертолету в зависимости от условий. Делается это так:
[camper@bar_freedom_attack_sniper_1]
path_walk = camper_1_walk
path_look = camper_1_look
on_info = {+bar_freedom_attack_ecolog} camper1@bar_freedom_attack_sniper_1 %=bar_freedom_angry_actor%
meet_talk_enabled = true
meet_dialog = bar_svoboda_dialog
heli_hunter = {-bar_ecolog_crush_heli_down} true, false
Если раньше оверрайд хелихантера понимал только значения true либо false, то сейчас он понимает кондлист, который если возвращает true - то стрельба по вертолету в данной схеме разрешена.
Схема рatrol:
- Спойлер:
- Итак, есть предварительная система патруля. Представляет собой вариацию kamp только в состоянии ходьбы. Для ее работы прописываем в кустовой дате следующее:
[patrol]
path_walk = path_walk
path_look = path_look
formation = back
commander = true
move_type = ...
* formation - описывет способ построения и не является обязательным. Возможны следующие варианты:
o back - мужики идут чуть позади командира в два ряда (по умолчанию)
o line - шеренга
o around - вокруг командира
* commander = true - типа назначат командиром, желательно, чтобы такой красивый он был один.
* move_type = ... - задает изначальный режим перемещения, по умолчанию patrol. Вообще, значение этого поля есть название ходячей анимации из state_mgr_lib.
При остановке командора в meet мужики останавливаются.
Если командор помирает, то автоматически будет выбран другой. Командиром становится тот, кто первый попал под схему. Способы построения задаются в вейпоинтах следующим образом:
ret=0...2
* 0 - линия
* 1 – вокруг старшего
* 2 – по бокам
При движении командор работает как обычный walker и сопровождающие его кадры повторяют его действия. То есть, если в параметрах вейпоинта прописано a = assault, то командор помчится с орудием убийства на перевес, а остальные его откопируют.
Что еще не сделано или глючит:
* нет возможности автоматически перестроить команду
* все идут молча
* командор пока не отдает команд (нет озвучки)
* не рекомендуется включать спринт (глючит)
Dogfase- Группировка "Долг"
- Сообщения : 166
Дата регистрации : 2010-05-22
Возраст : 28
Откуда : Российская Федерация,Приморский край, Фокино
Re: Школa Моддингa
хорошо,допустим,как располагать точки?Я имею ввиду как их регистрировать и назыать,как снимать кординаты и спавнить я знаю
Bublik- Одиночка
- Сообщения : 70
Дата регистрации : 2010-08-26
Возраст : 31
Откуда : Украина
Re: Школa Моддингa
Нпс сам выбирает точки где ему садится иначе бы все сидели друг на друге
главное укажи радиус
главное укажи радиус
Dogfase- Группировка "Долг"
- Сообщения : 166
Дата регистрации : 2010-05-22
Возраст : 28
Откуда : Российская Федерация,Приморский край, Фокино
Страница 2 из 2 • 1, 2
:: Echo Team :: Echo Team Форум
Страница 2 из 2
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|