Рано или поздно, каждый модостроитель задаётся вопросом респавна. Как и все, я не исключение. Первые пробы, создать респавнер, увенчались частичным успехом. О не удаче, читайте в коце поста. Помучив респавнер пару дней, я отложил сие занятие, на дальнюю полку. И вот пришло время, но на сей раз, мне надо было заспавнить мобов. И это оказалось на порядок проще!
И так, приступим: Первое, что необходимо запомнить: Респавнер срабатывает, при условиях: 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
[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
Респавнер, сделали. Теперь, было бы здорово, не ждать когда он сам сработает, а заставить сработать его, когда нам это надо. Для этого сделаем спейсрестриктор? Рядом с входом в бункер Сидоровича, который и вызовет респавнер:
[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
Собираем 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 заспавнены рядом с костром.
П.С. Следующий урок выложу через пару дней, что бы хватило время на "домашнее задание", если конечно он нужен. Предпологается, что если вы задались вопросом о респавне, то вы уже имеете представление о работе смартов и логики. И знакомы с структурой папок и файлов.
Сообщение отредактировал ins33 - Понедельник, 02.06.2014, 05:38
Твоя система провальна, причем очень. Нужно создавать очень много рестрикторов, если ты очень много таких гулагов делать будешь. И не факт что респавн будет срабатывать, т.к. куда пойдет игрок предугадать невозможно.
У меня своя система респавнеров уникальных гулагов, а так же система "псведосмартов", которая работает на одном таймере. Функции сами понимают куда и кого и в каком количестве им нужно доспавнить. Функционал в целом нормальный у моей функции, можно указывать логику, аут и ин рестрикторы, свои списки секций чуваков/зверей(если нужно). Получение количества для доспавнивания в смарт/псведосмарт по трем параметрам. В зависимости от уровня выбираются секции, если брать оригинал то это weak normal strong. На паре локаций довел жизнь до типа ЧН. Так же сейчас в доработке система контроля за всем живым в зоне, она обеспечивает нормальное наполнение локаций => геймплей.
В твоем подходе куча подводных камней, и слишком долгая реализация. В целом не советовал бы такое использовать.
Ты хотя бы сначала пойми о чем речь идет, потом выводы пиши. Тут вся система респавнера завязана на рестриктор, при заходе в который и происходит событие, если туда актор не зайдет кабаны и не появятся, пока не сработает обычный респавнер. Для тесты работоспособности? Ну раз ты такой тут провидец мыслей покажи мне эту систему БЕЗ рестриктора(и без проверки расстояния до точки(что в этом способе было бы оптимальней)).
покажи мне эту систему БЕЗ рестриктора(и без проверки расстояния до точки
я делал респавнеры подобным способом, без рестрикторов. Респавн обычно срабатывает когда я перехожу на другую локу, может еще как то,я особо не проверял, но то что всё норм работает это да...
Добавлено (11.07.2014, 09:52) --------------------------------------------- написал такое в респавнерах:
conditions =Условие респавна. Можно установить проверку условий (инфопоршень), где респавн будет происходить только при выполнении условия. Номер означает общий процент выполнения респавна. Например так:
conditions = {+инфо} 100, 0 где, респавн будет происходить со сто-процентной вероятностью, только при наличии установленного инфопоршна.
без кондишинов до этого всё работало. Что не так? А то выдает ошибку:
[error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: ...of chernobyl_0004\gamedata\scripts\se_respawn.script:289: attempt to compare number with nil
Сообщение отредактировал BeeRsek - Пятница, 11.07.2014, 09:52