Перейти к содержанию
Авторизация  
Hardtmuth

[SoC] Урок по созданию respawn монстров

Рекомендуемые сообщения

 

[SoC] Урок по созданию respawn монстров

Автор: ins33

Рано или поздно, каждый модостроитель задаётся вопросом респавна. Как и все, я не исключение. Первые пробы, создать респавнер, увенчались частичным успехом. О не удаче, читайте в коце поста. Помучив респавнер пару дней, я отложил сие занятие, на дальнюю полку. И вот пришло время, но на сей раз, мне надо было заспавнить мобов. И это оказалось на порядок проще!

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

Для начала создадим смарт, с одной работай:
В папку ACDC\all создадим alife_l01_escape_test.ltx и way_l01_escape_test.ltx.
Сделаем это для удобства, при запаковке, всё добавленное окажется в файлах локации, куда это добавляется.

В acdc\all\all.ltx добавим alife_l01_escape_test.ltx, и way_l01_escape_test.ltx.

В alife_l01_escape_test.ltx добавим смарт:

Спойлер

[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 ; тут указывается условии существования смарта. {+info –info ! function =function}
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

; se_smart_terrain properties

 

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

Спойлер

[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_visual properties
visual_name = monsters\mutant_boar\mutant_boar

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

; cse_alife_monster_abstract properties

; cse_ph_skeleton properties

; cse_alife_monster_base properties

; 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

 

Зверушка есть, добавим пути.

Откроем way_l01_escape_test.ltx:

Спойлер

[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! Обратите внимание! Имя точки пути начинается с название смарта!

Теперь, нам надо создать логику, и условия работы. Для этого создадим gamedata\config\misc\gulag_escape_test.ltx.

В gulag_task.ltx зарегистрируем новый гулаг #include "gulag_escape_test.ltx" и напишем в gulag_escape_test.ltx простую логику:

Спойлер

[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}.

В gulag_escape_test.script пропишем:

Спойлер

local t = {}

function load_job(sj, gname, type, squad, groups)
--'--------------------------------------------------------------------------
--' ESCAPE
--'--------------------------------------------------------------------------
--' Кабаны не далеко от вагончика

if type == "esc_boar_weak_smart" then
t = { section = "logic@esc_boar_weak_smart_0000",
idle = 0,
prior = 5, state = {0},
in_rest = "", out_rest = ""
}
table.insert(sj, t)
end
end

function load_states(gname, type)

if type == "esc_boar_weak_smart" 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 == "esc_boar_weak_smart" then
return npc_community == "boar"
end

return false
end

 

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

В alife_l01_escape_test.ltx добавим:

Спойлер

[number]

; 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

; se_respawn properties

 

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

Рядом с входом в бункер Сидоровича, который и вызовет респавнер:

Спойлер

[number]

; 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 = {=gulag_empty(esc_boar_weak_smart)} 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

look_1


position = -47.987903594971,-10.038272857666,-63.149391174316
game_vertex_id = 77
level_vertex_id = 231168

 

way_2


position = -47.224723815918,-10.038061141968,-65.55248260498
game_vertex_id = 77
level_vertex_id = 232424

look_2


position = -47.987903594971,-10.038272857666,-63.149391174316
game_vertex_id = 77
level_vertex_id = 231168

 

way_3


position = -47.224723815918,-10.038061141968,-65.55248260498
game_vertex_id = 77
level_vertex_id = 232424

look_3


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

way_1_fire


position = -48.808933258057,-10.04080581665,-63.063709259033
game_vertex_id = 77
level_vertex_id = 230516

 

way_2_task


position = -47.224723815918,-10.038061141968,-65.55248260498
game_vertex_id = 77
level_vertex_id = 232424

way_2_fire


position = -48.808933258057,-10.04080581665,-63.063709259033
game_vertex_id = 77
level_vertex_id = 230516

 

way_3_task


position = -47.224723815918,-10.038061141968,-65.55248260498
p0:game_vertex_id = 77
p0:level_vertex_id = 232424

way_3_fire


position = -48.808933258057,-10.04080581665,-63.063709259033
game_vertex_id = 77
level_vertex_id = 230516

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

way_*_task -- место где будет сидеть нпс. Работает только под смартом.
way_*_fire -- куда будет смотреть.

Это используется, если нпс рассаживаются вокруг костра.

ЕСЛИ, ПОД КОСТРОМ НЕТ АИ СЕТКИ, ТО САМО СОБОЙ ВАЙПОИНТ ТУДА СТАВИТЬ НЕЛЬЗЯ!

В примере, под костром, нет АИ, по этому все fire заспавнены рядом с костром.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу