Как сделать так чтобы нпс стоял на месте сталкер тч

Обновлено: 02.07.2024

И так, приступим:
Первое, что необходимо запомнить:
Респавнер срабатывает, при условиях:
1) Есть свободная работа в смарте.
2) Секции респавнера, совпадают с секциями смарта.
3) Соблюдены условия работы респавнера: conditions

[ number ]
; cse_abstract properties
section_name = smart_terrain
name = esc_boar_weak_smart ; имя смарта
position = -132.06704711914,-3.5775165557861,-79.952697753906 ; X,Y,Z
direction = 0,0,0
version = 118
script_version = 6

; cse_alife_object properties
game_vertex_id = 72 ; GV
distance = 3
level_vertex_id = 119229 ; LV
object_flags = 0xffffff3e
custom_data = <<END
[smart_terrain]
type = esc_boar_weak_smart ; имя смарта
cond = 100 ; тут указывается условии существования смарта.
capacity = 3 ; население смарта
END

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

; cse_alife_space_restrictor properties
restrictor_type = 0

Смарттерей, мы создали, добавим моба для этого смарта:

[ number ]
; cse_abstract properties
section_name = boar_weak
name = esc_boar_weak_test_0000
position = -126.9560546875,-4.6784887313843,-95.063812255859
direction = 0,0,0
version = 118
script_version = 6

; cse_alife_object properties
game_vertex_id = 72
distance = 3
level_vertex_id = 125542
object_flags = 0xffffffbf
custom_data = <<END
[smart_terrains]
esc_boar_weak_smart = true ; тут укажем к какому смрту принадлежит эта зверушка.
END

; cse_alife_creature_abstract properties
g_team = 0
g_squad = 0
g_group = 0
health = 2
dynamic_out_restrictions =
dynamic_in_restrictions =

; se_monster properties
upd:health = 2
upd:timestamp = 0
upd:creature_flags = 0
upd:position = -126.9560546875,-4.6784887313843,-95.063812255859
upd:o_torso = 0,0,0

[ esc_boar_weak_smart _ home ]
points = p0
p0:name = wp00
p0:position = -123.97886657715,-4.0969734191895,-92.151412963867
p0:game_vertex_id = 72
p0:level_vertex_id = 128790
N.B! Обратите внимание! Имя точки пути начинается с название смарта.

[logic@esc_boar_weak_smart_0000]
active = mob_home@esc_boar_weak_smart_0000

[mob_home@esc_boar_weak_smart_0000]
path_home = home ; ТУТ МЫ УКАЗЫВАЕМ ИМЯ ПУТИ, БЕЗ ИМЕНИ СМААРТА. esc_boar_weak_smart_ home
home_min_radius = 20
home_max_radius = 30

Логику, написали, теперь добавим условие. Создадим скрипт gulag_escape_test.script, зарегистрируем его в xr_gulag.script добавив в level_gulags =
В gulag_escape_test.script пропишем:

if type = then
t = < section ,
idle = 0,
prior = 5, state = ,
in_rest = "", out_rest = ""
>
table.insert(sj, t)
end
end

function load_states(gname, type)

if type = then
return function(gulag)
return 0
end
end
end

function load_ltx(gname, type)
return nil
end

function checkStalker(npc_community, gulag_type, npc_rank, se_obj)
end

function checkMonster(npc_community, gulag_type)

if gulag_type = then
return npc_community == "boar"
end

return false
end

Сделали. Тепрь у нас есть смарт с одной зверушкой. Давайте проверим, работате ли наш смарт?
Загрузим игру, и прогуляемся в сторону вагончика на предбаннике, рядом с раненым.
С кабанчиком познакомились, давайте добавим респавнер.
В alife_l01_escape_test.ltx
Добавим:

; cse_abstract properties
section_name = respawn
name = esc_boar_weak_respawner ; имя респавнера
position = -146.0726776123,-3.4645113945007,-73.943954467773
direction = 0,0,0

version = 118
script_version = 6

; cse_alife_object properties
game_vertex_id = 70
level_vertex_id = 104106
object_flags = 0xffffff3e
custom_data = <<END
[respawn]
respawn_section = boar_weak ; секции респавна
max_spawn = 1 ; Максимальное количиство мобов за один респавн.
idle_spawn = often ; тип респавнера, имеется в виду скорость срабатывания.
END

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

; cse_alife_space_restrictor properties
restrictor_type = 0

Респавнер, сделали. Теперь, было бы здорово, не ждать когда он сам сработает, а заставить сработать его, когда нам это надо. Для этого сделаем спейсрестриктор? Рядом с входом в бункер Сидоровича, который и вызовет респавнер:

; cse_abstract properties
section_name = space_restrictor
name = esc_boar_weak_restrictor
position = -250.60289001465,-19.588600158691,-127.29279327393
direction = 0,0,0
version = 118
script_version = 6

; cse_alife_object properties
game_vertex_id = 8
level_vertex_id = 9843
object_flags = 0xffffff3e
custom_data = <<END
[logic]
active = sr_idle@esc_boar_weak_restrictor_start

[sr_idle@esc_boar_weak_restrictor_start]
on_actor_inside = sr_idle@esc_boar_weak_restrictor_out %=respawner_spawn(esc_boar_weak_respawner)%
; ф-ия =gulag_empty(name_smart) проверяет, пуст ли смарт.
; ф-ия =respawner_spawn(name_smart) вызывает принудительный респавн

[sr_idle@esc_boar_weak_restrictor_out]
on_actor_outside = sr_idle@esc_boar_weak_restrictor_start
END

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

; cse_alife_space_restrictor properties
restrictor_type = 3

Собираем all.spawn начинаем НИ, идём убиваем кабана, возвращаемся к входу в бункер, спускаемся по лестнице, и идём обратно, к смарту кабана.
Поздравляю, вы сделали респавнер.

Сделайте смарт для 3 кабанов, и респавнер для этого смарта.

И заспавнить 3 нпс, под мостом, рядом с вагончиком.
Координаты:

character_profile = sim_stalker_master
position = -35.753692626953,-10.425220489502,-72.881172180176
direction = 0,0,0
game_vertex_id = 111
distance = 3
level_vertex_id = 242232 character_profile = sim_stalker_veteran
position = -41.189788818359,-10.432260513306,-77.327095031738
direction = 0,0,0
game_vertex_id = 77
distance = 3
level_vertex_id = 237361 character_profile = sim_stalker_master
position = -41.189788818359,-10.432260513306,-77.327095031738
direction = 0,0,0
game_vertex_id = 77
distance = 3
level_vertex_id = 237361

Создать для этих нпс три логики walker. Имена путей, давайте, с учётом того, что потом эти нпс будут под смартом. Повторюсь:
N.B! Имя точки пути должны начинаться с название смарта.
Координаты:
way_1

position = -48.911376953125,-10.037826538086,-66.358123779297
game_vertex_id = 77
level_vertex_id = 230506 position = -47.987903594971,-10.038272857666,-63.149391174316
game_vertex_id = 77
level_vertex_id = 231168 position = -47.224723815918,-10.038061141968,-65.55248260498
game_vertex_id = 77
level_vertex_id = 232424 position = -47.987903594971,-10.038272857666,-63.149391174316
game_vertex_id = 77
level_vertex_id = 231168 position = -47.224723815918,-10.038061141968,-65.55248260498
game_vertex_id = 77
level_vertex_id = 232424 position = -50.319923400879,-10.042634963989,-63.688987731934
game_vertex_id = 77
level_vertex_id = 229168

и три kmap
координаты:
way_1_task

position = -48.911376953125,-10.037826538086,-66.358123779297
game_vertex_id = 77
level_vertex_id = 230506 position = -48.808933258057,-10.04080581665,-63.063709259033
game_vertex_id = 77
level_vertex_id = 230516 position = -47.224723815918,-10.038061141968,-65.55248260498
game_vertex_id = 77
level_vertex_id = 232424 position = -48.808933258057,-10.04080581665,-63.063709259033
game_vertex_id = 77
level_vertex_id = 230516 position = -47.224723815918,-10.038061141968,-65.55248260498
p0:game_vertex_id = 77
p0:level_vertex_id = 232424 position = -48.808933258057,-10.04080581665,-63.063709259033
game_vertex_id = 77
level_vertex_id = 230516

Протестируйте работу логики, на созданных нпс. Это поможет избежать ошибок в следующем уроке.

way_*_task -- место где будет сидеть нпс. Работает только под смартом.
way_*_fire -- куда будет смотреть.
Это используется, если нпс рассаживаются вокруг костра.
ЕСЛИ, ПОД КОСТРОМ НЕТ АИ СЕТКИ, ТО САМО СОБОЙ ВАЙПОИНТ ТУДА СТАВИТЬ НЕЛЬЗЯ!
В примере, под костром, нет АИ, по этому все fire заспавнены рядом с костром.

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


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

У меня своя система респавнеров уникальных гулагов, а так же система "псведосмартов", которая работает на одном таймере. Функции сами понимают куда и кого и в каком количестве им нужно доспавнить. Функционал в целом нормальный у моей функции, можно указывать логику, аут и ин рестрикторы, свои списки секций чуваков/зверей(если нужно). Получение количества для доспавнивания в смарт/псведосмарт по трем параметрам. В зависимости от уровня выбираются секции, если брать оригинал то это weak normal strong. На паре локаций довел жизнь до типа ЧН. Так же сейчас в доработке система контроля за всем живым в зоне, она обеспечивает нормальное наполнение локаций => геймплей.

В твоем подходе куча подводных камней, и слишком долгая реализация. В целом не советовал бы такое использовать.

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

Все профили НПС прописываются в файлах 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

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

Создание нового нпс в игру

вот расскажу как создать новых неписей в игру
Документ создал для: Военый СТАЛККЕР
Для того, чтобы создать нового НПС нам понадобятся координаты нужного места, где и будет заспаунен наш NPC. Возьмём Кордон, лагерь новичков. Можете снять координаты сами, а можете взять мною уже снятые: (-218.20,-20.2,-145.63),35362,47). Далее. Создаём файл в папке gamedata/scripts файл, скажем esc_unik_npc.script. В нём создаём функцию. Код: function esc_unik_npc () alife():create("esc_unik_npc",vector():set(-218.20,-20.2,-145.63),35362,47) end

Теперь мы в файле npc_profile.xml (в папке gameplay) добавляем нашего НПС. Код: Trader escape_trader

Копируем или создаём по образцу только нижний блок Второго торговца нам ненадо. Теперь создадим секцию нашего персонажа. В файле spawn_section.ltx (gamedata/config/creatures) в блоке:

Создаём секцию. Код: [esc_unik_npc]:stalker $spawn = "respawn\esc_unik_npc" character_profile = esc_unik_npc spec_rank = regular community = dolg

В строке community можете вместо долга вписать другую группировку. Однако если мы хотим, чтоба наш персонаж не гулял по Зоне, пока не наткнётся на первую аномалию, то пропишем чтобы он стоял на месте. Для этого под community вставляем: custom_data = scripts\esc_unik_npc.ltx Далее создаём в gamedata/config папку scripts в в папке создаём файл esc_unik_npc.ltx В наш созданный файл вставляем: Код: [logic] active = remark1 danger = danger_ignore

[danger_ignore] ignore_distance = 5

[remark1] no_move = true

Всё наш НПС будет стоять на месте своего спауна. Едем дальше. Нам надо активировать нашего персоонажа. для этого мы должны вставить строку: esc_unik_npc.esc_unik_npc Либо в диалог, либо в какой-нибудь квест. Давайте вставим строку в файл info_portions.xml (gamedata/gameplay) под Код:

Выглядеть это будет так:

Однако мы не прописали самого НПС, как личность В файле character_desc_escape.xml (gamedata/gameplay) добавляем: Код: GENERATE_NAME_bandit ui_npc_u_stalker_bandit_3 esc_wolf_bio

esc_otbrosi_1 dolg stalker_terrain

actors\bandit\stalker_bandit_3 [spawn] \n

1. include "gameplay\character_items.xml" \n
2. include "gameplay\character_food.xml"

1. include "gameplay\character_criticals_3.xml"

1. include "gameplay\character_dialogs.xml"

Правда тут получится у нас долговец в одежде бандита и говорящего голосом монолитовца xD Всё сохроняем. НПС готов.

Подробный разбор файла 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 (первый) параметр. Чем меньше, тем лучше.

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