Как изменить нпс в сталкер зов припяти

Обновлено: 19.05.2024

Мод предназначенный для замены всех текстур NPC в S.T.A.L.K.E.R. Call of Pripyat 1.6.02.

Что было сделано во втором билде:
Были добавлены экзоскелеты долгу, свободе и наёмникам, были добавлены зомби версии сталкера в заре и экзоскелете, был добавлен бандит, были вырезаны по возможности лишние файлы.

От автора:
Автор проекта взял модели из разных компьютерных игр таких как Escape From Tarkov, BATTLEFIELD, PASSION LEADS ARMY the Glorious Mission, Call Of Duty, Arctic Combat и т.д, пересобрает между собой и получает виды уникальных персонажей для разных группировок.

Создание и редактирование НПС

Все профили НПС прописываются в файлах character_desc_локация.
Для раскладывания по полочкам, возьмем профиль Волка:
И разложим все по полочкам.

Внутри этой конструкции располагается все остальное. id - идентификатор Волка, team_default не изменяйте.

Имя НПС, которое будет отображаться в игре. Здесь содержится ссылка на текст, но можно писать имя прямо здесь (если вы хотите, чтобы это был обычный непись с рандомным именем, то прописываете здесь: "GENERATE_NAME_нужная-группировка" (без кавычек).

Здесь указывается иконка НПС, которая будет отображаться в диалоге.

На сколько я знаю, разрабы планировали кажому неписю сделать биографию, но так и не реализовали. Так что можете скопировать с любого профиля.

Класс НПС. Используется для респавна НПС. Для того, чтобы у нас не создавалось куча наших "уникальных" НПС, то мы создадим свой класс.

Группировка (stalker - одиночки, bandit - бандит, dolg - Долг и т.д.)

Ранг НПС (новичок, опытный и т.д.)

Количество денег, которое может быть у НПС. Соотвественно минимальное значение и максимальное. Если поставить infinitive="1", то у НПС будут бесконечные деньги (как у торговца).

Ссылка на папку с голосом и фразами НПС.

На сколько знаю, этот параметр отвечает за тип приседания. Ни разу не использовал, поэтому ничего советовать не буду.

Ссылка на визуальную модель НПС. Но если указать к примеру визуал экзоскелета, то и защитными характеристиками НПС будет обладать, как у экзоскелета.

Здесь указывается список предметов, которые будут появлятся у НПС.

Ну а далее идут диалоги.
Используется, если нужно, чтобы диалог начинал НПС, а
если нужно, чтобы диалог начинал ГГ.

Итак, приступим к практике.

Откроем файл character_desc_escape и создадим профиль нашему НПС. Назовем его Викинг, id у него будет escape_viking, оденем в экзоскелет, группировка - одиночка, оружие - Винторез, класс - esc_viking, а так же пропишем диалоговую иконку НПС в экзоскелете:
Теперь нужно прописать нашего НПС в файле config/gameplay/npc_profile.xml:
Класс ОБЯЗАТЕЛЬНО должен совпадать с тем, который прописан в character_desc_escape, а specific_character должен совпадать с id нашего НПС в character_desc_escape.

Далее происываем нашего НПС в файле config/creatures/spawn_sections.ltx:
В квадратных скобках прописываете любое свое название, spawn ставите от любого НПС, с character_profile все понятно, spec_rank оставляйте regular, community тоже все ясно.

Задам вопрос - я сделал всё по инструкции, только спавнил не через ацдц и не через скрипт, а напрямую через СДК. Скомпилил, перенёс все необходимые файлы - игра вылетает и жалуется на отсутствие необходимой секции. Разберитесь пожалуйста

Эээ.
Ну статья и проверялась через скрипт и АСДС.
Можно поподробней как "напрямую через СДК" это делается, и непомешало бы название секции, а еще лучше - лог. Ибо по одному описанию я вряд ли чем то помогу (тебе ли модеру это не знать).

____________________
Я вроде как лог попросил.
Ну нет так нет.

Именно поэтому я не занимался пока сюжетом над модом. Но через СДК всё вроде нормально добавляется - при заполнении секции по инструкции появляется вещь в списке спавн-элементов. А вот в игре.

Ошибки которые нашел:
- У ворона была прописана группировка dark_stalker, хотя ты ее НЕ создал, так что пока заменил ее на одиночку.
- Если уж создал свой файл Character_desc_локация, то это еще не значит, что игра его прочитает. Его нужно прописывать в system.ltx, что я и сделал.
- Ты в spawn_sections прописал респавн у ворона свой, а не как в уроке от стандартного НПС. Я не знаю каким ты АСДС компилил спавн, поэтому не смог посмотреть создал ли ты респавнер, и прописал ли туда Ворона. Поэтому я заменил строчку респавнера, на ту, что из урока, ибо она от стандартного непися, то бишь рабочая.

ЗЫ: Без обид, но мне сейчас не для придумывания сюжета и квестов, уж звиняй. Работы и так хватает.
ЗЗЫ: давай все таки на "ты")))

Спасибо за разъяснение. Если что то я буду отписываться здесь, чтобы не отходя от кассы исправлять.
Помоему я итак с тобой на ты
Причин может быть много, и возможно много и сразу.
Получается гадаем.

Размышляющий над сущим

Такие вопросы:
1: Как сделать,так чтоб НПС смотрел/стоял лицом в нужном мне направлении? После прописывания мной координат спавна, НПС всё время смотрит/стоит лицом в одном и том же направлении. Какие строки за это отвечают?

2. Как сделать чтоб НПС стоял на месте в любом случае и вел огонь со своего места спавна (хочу сделать часового, как на вышках). Я, ПЫСУ прописал эти строки:

[logic]
active = remark1
danger = danger_ignore

[danger_ignore]
ignore_distance = 5

[remark1]
no_move = true,

Но, во время атаки этот НПС сходит с места и ломится всех врагов отстреливать.

3: Как прописать НПС путь по которому я хочу чтоб он ходил (рейд, как у военных между блок постом и деревней новичков)?

У меня такой вопрос: После спауна, непись стоит по умолчанию с оружием за спиной. А можно ли как нибудь сделать так, чтобы он стоял с оружием в руках?

Только сейчас заметил проблему. Если сохраниться после того как НПС заспавнится, а потом загрузить это сохранение, игра вылетает со странным логом

J-DOG
Не находит файл . ltx. логики для НПС
Larry76,
1.Через аллспавн как правило спавнят уникальных НПС у которых квесты и т д
Пример в секции alife_zaton.ltx прописывается сам НПС

[593]
; cse_abstract properties
section_name = smart_cover
name = zat_a2_sc_zat_b7_sultan -- это Султан
position = 139.320007324219,-7.34000015258789,178.610000610352
direction = 0,-1.57079601287842,0

; cse_alife_object properties
game_vertex_id = 296
distance = 16.1000003814697
level_vertex_id = 1204862
object_flags = 0xffffffbf

; cse_shape properties
shapes = shape0
shape0:type = sphere
shape0:offset = 0,0,0
shape0:radius = 2

; cse_smart_cover properties
cse_smart_cover__unk1_sz = animpoint_sit_normal
cse_smart_cover__unk2_f32 = 0
enter_min_enemy_distance = 15
exit_min_enemy_distance = 10

; se_smart_cover properties
last_description = animpoint_sit_normal
loopholes = animpoint_sit_normal,1

в секции way_zaton.ltx прописывются пути хождения смотрения и другие действия

[zat_a1_a_look]
points = p0,p1
p0:name = wp00|a=threat|t=1000 - тут будет целится 1000 милисекунд
p0:flags = 0x1p0:position = 256.240051269531,19.8124237060547,550.824279785156 --первая точка куда будет смотреть НПС
p0:game_vertex_id = 292
p0:level_vertex_id = 1405060
p0:links = p1(1)
p1:name = wp01|a=threat|t=1000 -тут будет целится 1000 милисекунд
p1:flags = 0x1
p1:position = 125.961219787598,-7.31970977783203,178.054428100586 --вторая точка куда будет смотреть НПС
p1:game_vertex_id = 297
p1:level_vertex_id = 1182877
p1:links = p0(1)

[zat_a1_a_walk] тут одна точка движения,т е стоит на месте и целится смотрит в двух направлениях через определённое время
points = p0
p0:name = wp00
p0:flags = 0x1
p0:position = 356.438110351563,-1.82260000705719,296.487701416016
p0:game_vertex_id = 67
p0:level_vertex_id = 1558980

<actor_dialog>zat_b7_bandit_boss_sultan_b7_give_task_dialog</actor_dialog>
<actor_dialog>zat_b7_bandit_boss_sultan_b30_start_actor_dialog</actor_dialog>
<actor_dialog>zat_b7_bandit_boss_sultan_b30_detectors_actor_dialog</actor_dialog>
<actor_dialog>zat_b7_bandit_boss_sultan_b30_compass_actor_dialog</actor_dialog>
<actor_dialog>zat_b7_bandit_boss_sultan_b30_compass_give_actor_dialog</actor_dialog>
<actor_dialog>zat_b7_bandit_boss_sultan_b30_compass_revert_actor_dialog</actor_dialog>
<actor_dialog>zat_b7_bandit_boss_sultan_b30_ruin_actor_dialog</actor_dialog>
<actor_dialog>zat_b7_bandit_boss_sultan_b30_barmen_under_actor_dialog</actor_dialog>
<actor_dialog>zat_b7_bandit_boss_sultan_b52_about_snag</actor_dialog>
<actor_dialog>zat_b7_bandit_boss_sultan_b52_about_nimble</actor_dialog>
<actor_dialog>zat_b7_bandit_boss_sultan_about</actor_dialog>

<character /> <class>zat_b7_bandit_boss_sultan</class>
</character>
[zat_b7_bandit_boss_sultan_squad]:online_offline_group --это сквад Султана
faction = bandit
npc = zat_b7_bandit_boss_sultan
target_smart = zat_stalker_base_smart-- работа на Скадовске
story_id = zat_b7_bandit_boss_sultan_squad [zat_b7_bandit_boss_sultan_squad]:default_squad
sim_avail = false Приписываем сквад НПС к месту где он должен появится сразу или с каким то условием
;;;;;;;;;;;;;;;;;;;;;; FINAL ZATON ;;;;;;;;;;;;;;;;;;;;;;;;;
zat_b7_bandit_boss_sultan_squad = zat_stalker_base_smart --тут Скадовск

[animpoint@base]
use_camp = false
avail_animations = animpoint_sit_normal
cover_name = zat_a2_sc_zat_b7_sultan
;reach_distance = 1.5
meet = meet@base
combat_ignore_cond = true
combat_ignore_keep_when_attacked = true
invulnerable = true
out_restr = zat_a2_sr_noweap
gather_items_enabled = false
help_wounded_enabled = false
corpse_detection_enabled = false

[meet@base]
close_snd_hello = zat_b7_bandit_boss_sultan_greeting
close_snd_bye = zat_b7_bandit_boss_sultan_farewell
close_anim = nil
close_victim = nil
far_anim = nil
far_victim = nil
close_distance = 0
far_distance = 0
use = false, true
trade_enable = false
allow_break = false
close_snd_distance = 3
meet_dialog = zat_b7_bandit_boss_sultan_intro, zat_b7_bandit_boss_sultan_b30_refuse_af_dialog, zat_b7_bandit_boss_sultan_b30_refuse_af_dialog, zat_b7_bandit_boss_sultan_b5_give_task_dialog
meet_on_talking = false

Далее топаем обратно в аллспавн
Создаём smart_terrain для сквада НПС в секциях алл.

[578]
; cse_abstract properties
section_name = smart_terrain
name = zat_stalker_base_smart--Это Скадовск
position = 123.900001525879,-7.34000015258789,183.559997558594
direction = 0,0,0

; cse_alife_object properties
game_vertex_id = 297
distance = 7
level_vertex_id = 1179320
object_flags = 0xffffff3e
custom_data = <<END
[story_object]
story_id = zat_stalker_base_smart

; cse_shape properties
shapes = shape0
shape0:type = sphere
shape0:offset = 0,0,0
shape0:radius = 2.50760293006897

; cse_alife_space_restrictor properties
restrictor_type = 3

Фсякченские модЫфикации смАтреть тута пАд сполером

slayer_kch, Спасибо,но опять-таки ты привёл пример уже на действующем персонаже.
Напримере моего случая можно.
Условие: Имеем голую новую локацию escape( кордон)
1.В точке возле самого входа на локацию надо создать бойца(который просто встречает ГГ)

никуда ходить он не будет,будет просто тупо стоять на одном месте.
Итого файл alife_escape.ltx у нас естесственно есть

[593]
; cse_abstract properties
section_name = smart_cover что означает эта строка?
name = можно ли взять из файла припяти? pri_a17_military_sergeant_morozov или же придётся создать файл character_desc_escape где скопировать pri_a17_military_sergeant_morozov но назвать его esc_a17_military_sergeant_morozov .
position = 139.320007324219,-7.34000015258789,178.610000610352
direction = 0,-1.57079601287842,0

; cse_alife_object properties
game_vertex_id = 296
distance = 16.1000003814697
level_vertex_id = 1204862
object_flags = 0xffffffbf - это пока ясно координаты,направление взгляда и вертексы

; cse_shape properties - за что отвечает эта секция??
shapes = shape0
shape0:type = sphere
shape0:offset = 0,0,0
shape0:radius = 2

; cse_smart_cover properties
cse_smart_cover__unk1_sz = animpoint_sit_normal тут вроде понятно,что перс сидячий, а если он стоит??
cse_smart_cover__unk2_f32 = 0
enter_min_enemy_distance = 15
exit_min_enemy_distance = 10

; se_smart_cover properties
last_description = animpoint_sit_normal
loopholes = animpoint_sit_normal,1

[zat_a1_a_look]
points = p0,p1
p0:name = wp00|a=threat|t=1000 - тут будет целится 1000 милисекунд
p0:flags = 0x1p0:position = 256.240051269531,19.8124237060547,550.824279785156 --первая точка куда будет смотреть НПС
p0:game_vertex_id = 292
p0:level_vertex_id = 1405060
p0:links = p1(1)
p1:name = wp01|a=threat|t=1000 -тут будет целится 1000 милисекунд
p1:flags = 0x1
p1:position = 125.961219787598,-7.31970977783203,178.054428100586 --вторая точка куда будет смотреть НПС
p1:game_vertex_id = 297
p1:level_vertex_id = 1182877
p1:links = p0(1)

[zat_a1_a_walk] тут одна точка движения,т е стоит на месте и целится смотрит в двух направлениях через определённое время
points = p0
p0:name = wp00
p0:flags = 0x1
p0:position = 356.438110351563,-1.82260000705719,296.487701416016
p0:game_vertex_id = 67
p0:level_vertex_id = 1558980
Тут вроде тоже ясно,обзовём только секции esc_a1_a_look и esc_a1_a_walk ну и пропишем свои координаты и куда башкой крутить.
А вот из какого файла к этим секциям путь указать??

далее создаём файл spawn_sections_escape.ltx в нём пишем:
далее создаём файл character_desc_escape.xml и в нём пишем(тупо копируем всё из файлика припяти про этого вояку заменяя только название локации)

<actor_dialog>actor_break_dialog</actor_dialog> это понятно. диалог стандартный- привет-пока

<character /> <class>esc_a17_military_sergeant_morozov</class>
</character> Larry76,
Бысрее скриптом распаунить твоего НПС

if мой_spawn_nps.load_variable("мой_spawn_nps_p_",false)==false then
мой_spawn_nps.start_мой_spawn_nps()
мой_spawn_nps.save_variable("мой_spawn_nps_p_",true)
end
==================================================================================
Далее создаём в папке scripts создаём свой скрипт спавна НПС мой_spawn_nps.script
==================================================================================
Далее в мой_spawn_nps.script пишем функцию спавна
function start_мой_spawn_nps()
swm_spawn_nps_01()
end
function мой_spawn_nps_01()
alife():create("esc_a17_military_sergeant_morozov",vector():set(516.90234375,13.481066703796,589.25476074219),1797242,28)--тут позиция спавна НПС,левел-вертекс и гаме-вертекс спавна НПС
end

function save_variable(variable_name, value)
xr_logic.pstor_store(db.actor, variable_name, value)
end

[walker@esc_a17_military_sergeant_morozov]
path_walk = esc_a1_a_walk-путь брожения
path_look = esc_a1_a_look-куда смотрит
combat_ignore_cond = false
combat_ignore_keep_when_attacked = false
meet = meet
gather_items_enabled = false
help_wounded_enabled = false
corpse_detection_enabled = false
use_camp = false
def_state_standing = ward_noweap
def_state_moving1 = patrol
no_retreat = true
target = story | actor
wounded = wounded
danger = danger


[meet]
close_snd_hello = = nil
close_snd_bye = = nil
close_anim = guard_na
close_victim = actor
far_anim = nil
far_victim = nil
close_distance = 2
far_distance = 0
close_snd_distance = 3
abuse = false
use = false, true
allow_break = false
meet_on_talking = false

[wounded]
hp_state = 0|wounded_heavy@help_heavy
hp_state_see = 0|wounded_heavy@help_heavy
hp_victim = 0|nil
hp_fight = 0|false
hp_cover = 0|false

[danger]
ignore_distance = 0
ignore_distance_grenade = 0
ignore_distance_corpse = 0
ignore_distance_hit = 0
ignore_distance_sound = 0

Фсякченские модЫфикации смАтреть тута пАд сполером

Подробный разбор файла actor.ltx

max_item_mass = 999 ; Стоит указывать значения меньше параметра max_walk_weight (см.выше).
jump_speed = 60 ; Высота прыжка. Не указывайте астрономические значения. Гл. герой всё равно не улетит в космос ))
crouch_coef = 1 ; Скорость ползагия "очень сидя" (Ctrl + Shift по умолчанию)
climb_coef = 2 ; Вроде присев (Ctrl)
run_coef = 3 ; Обычный бег с параметром консоли "g_always_run" равным 1
sprint_koef = 4 ; спринт
run_back_coef = 3 ; бег назад
walk_back_coef = 2 ; ходьба назад с клавишей Shift
air_control_param = 1 ; контроль полёта. Выгоден при высоких значениях jump_speed, т.к. можно быстро перемещаться по карте
walk_accel = 17 ; неизвестный параметр
pickup_info_radius = 5 ;радиус, в котором над предметами выводятся их названия при нажатии клавиши "F".

Далее параметры 3d и т.п. смотрим поэтому дальше.

camera_height_factor = 0.85 ; определяет высоту взгляда. Увеличиваем и игрок станет зрительно выше

disp_base = 0 ;угол (в градусах) разлета пуль, когда актер стоит на месте
disp_aim = 0
disp_vel_factor = 0 ;на сколько увеличится дисперсия при скорости в 10 м/с (не обязательно при беге)
disp_accel_factor = 0 ;еще на сколько увеличится, если актер бежит (+ скорость)
disp_crouch_factor = 0 ;уменьшение если актер сидит
disp_crouch_no_acc_factor = 0 ;уменьшение если актер сидит + no acceleration

Чтобы уменьшить размер прицела можно сделать так.

Дальше увидим секцию [actor_immunities_gd_***] (вместо *** нужный ранг)

Чтобы увеличить живучесть - меняем значение ниже.

burn_immunity = 0.0
strike_immunity = 0.0
shock_immunity = 0.0
wound_immunity = 0.0
radiation_immunity = 0.0
telepatic_immunity = 0.0
chemical_burn_immunity = 0.0
explosion_immunity = 0.0
fire_wound_immunity = 0.0

Дальше видим [actor_condition]

И настройка в лучшую сторону будет таковой:

satiety_v = 0 ;скорость уменьшения сытости со временем
radiation_v = 1 ;скорость уменьшения радиации
satiety_power_v = 1 ;увеличение силы при уменьшении сытости
satiety_health_v = 1 ;увеличение здоровья при уменьшении сытости
satiety_critical = 0 ;критическое значения сытости (в процентах от 0..1) когда здоровье начинает уменьшаться
radiation_health_v = 0 ;уменьшение здоровья при воздействии радиации
morale_v = 1 ;скорость восстановления морали
psy_health_v = 1 ;скорость восстановления psy-здоровья
alcohol_v = -1
health_hit_part = 0 ;процент хита, уходящий на отнимание здоровья
power_hit_part = 0 ;процент хита, уходящий на отнимание силы
max_power_leak_speed = 0 ;накопление усталости (макс граница, до которой восстанавливается сила) в секунду игрового времени
max_walk_weight = 1000 ; Вес, при котором игрок не может двигаться. Указать можно любое значение.

bleeding_v = 0 ;потеря крови при номинальной ране в секунду
wound_incarnation_v = 1 ;скорость заживления раны
min_wound_size = 0 ;минимальный размер раны, после которого она считается зажившей

min_wound_size,satiety_v,satiety_power,satiety_health,satiety_critical,alcohol_v можно было и не настраивать, если вам нужно бессмертие

Будем настраивать выносливость.

Назодим строку "jump_power"

Меняем так, чтобы игрок никогда не уставал, разве что если нацепит на себя 5 огненных шаров ))

jump_power = 0 ;умешьшение силы с прыжком без учета веса ноши
jump_weight_power = 0 ;умешьшение силы с прыжком с учетом веса ноши, для максимального допустимого веса
overweight_jump_k = 1 ;коэффициент влияние перегрузки прыжок с весом (умножается на jump_weight_power)

stand_power = 0
walk_power = 0 ;умешьшение силы за секнду во время ходьбы без учета веса ноши
walk_weight_power = 0 ;умешьшение силы за секнду во время ходьбы с учетом веса ноши, для максимального допустимого веса
overweight_walk_k = 1 ;коэффициент влияние перегрузки ноши (умножается на walk_weight_power)
accel_k = 1;коэффициент на бег (умножается walk_power, walk_weight_power)
sprint_k = 1 ;коэффициент на "sprint" бег (умножается walk_power, walk_weight_power)

Значения с комментом "коофициент" и значениями более 1 (необязательно) рекомендую менять на 1.

limping_health_begin = 0 ;порог здоровья меньше которого актер начинает хромать
limping_health_end = 0;порог здоровья больше которого актер перестает хромать
limping_power_begin = 0 ;порог силы меньше которого актер начинает хромать
limping_power_end = 0 ;порог силы больше которого актер перестает хромать

cant_walk_power_begin = 0 ;порог силы меньше которого актер не может двигаться
cant_walk_power_end = 0 ;порог силы больше которого актер сможет двигаться

cant_sprint_power_begin = 0 ;порог силы меньше которого актер не может бежать в спринте
cant_sprint_power_end = 0 ;порог силы больше которого актер сможет бежать в спринте

Дальше идут кости, работающие в 3d, и их тоже можно менять, чтобы уменьшить уязвимость, но пока их настройка не столь нужна. Я лишь скажу, что нужно настраивать 1 (первый) параметр. Чем меньше, тем лучше.

Изменение отношения NPC к ГГ


Я решил поэксперементировать с разными модами и добился весьма неожиданного (к сожалению неприятно-неожиданного) результата. Вдруг все свободные сталкеры стали ко мне враждебны :( .
Я ессно их всех валю (а что делать - жить то хочецца), но есть проблемы - теперь мне недоступны многие миссии, которые давались сталкерами :( .

Собственно вопрос: Есть ли возможность (и если есть, то как?) изменить отношение к ГГ других NPC?

Читайте также: