Главная » Статьи » Статьи » Моддинг

Спавн и удаление переходов между локациями скриптовым методом.
1) Спавн переходов: 
Создаём в папке \gamedata\scripts скриптовый файл с любым именем, например, y_level.script и вписываем в него следующее:

function create_level_changer( 
p_story_id, -- STORY_ID нового level_changer (понадобится нам позже) 
p_position, -- вектор, координаты точки, в которой будет располагаться центр нового level_changer 
p_lvertex_id, -- level_vertext_id - идентифицируют уровень, на котором будет создан level_changer 
p_gvertex_id, -- game_vertext_id

p_dest_lv, -- level_vertex_id - идентифицируют уровень, на который level_changer будет перебрасывать игрока 
p_dest_gv, -- game_vertex_id 
p_dest_pos, -- координаты точки, в которой на новом уровне окажется игрок 
p_dest_dir, -- направрение взгляда игрока 
p_dest_level, -- название уровня, например "L11_Pripyat" 
p_silent -- следует задать 1, чтобы подавить вопрос о смене уровня (автоматический переход) 

local obj = alife():create("level_changer", p_position, p_lvertex_id, p_gvertex_id)

level.map_add_object_spot(obj.id, "level_changer", "")

local packet = net_packet() 
obj:STATE_Write(packet)

-- свойства cse_alife_object 
local game_vertex_id = packet:r_u16() 
local cse_alife_object__unk1_f32 = packet:r_float() 
local cse_alife_object__unk2_u32 = packet:r_u32() 
local level_vertex_id = packet:r_u32() 
local object_flags = packet:r_u32() 
local custom_data = packet:r_stringZ() 
local story_id = packet:r_u32() 
local spawn_story_id = packet:r_u32()

-- свойства cse_shape 
local shape_count = packet:r_u8() 
for i=1,shape_count do 
local shape_type = packet:r_u8() 
if shape_type == 0 then 
-- sphere 
local center = packet:r_vec3() 
local radius = packet:r_float() 
else 
-- box 
local axis_x_x = packet:r_float() 
local axis_x_y = packet:r_float() 
local axis_x_z = packet:r_float() 
local axis_y_x = packet:r_float() 
local axis_y_y = packet:r_float() 
local axis_y_z = packet:r_float() 
local axis_z_x = packet:r_float() 
local axis_z_y = packet:r_float() 
local axis_z_z = packet:r_float() 
local offset_x = packet:r_float() 
local offset_y = packet:r_float() 
local offset_z = packet:r_float() 
end 
end

-- свойства cse_alife_space_restrictor 
local restrictor_type = packet:r_u8()

-- свойства cse_level_changer 
local dest_game_vertex_id = packet:r_u16() 
local dest_level_vertex_id = packet:r_u32() 
local dest_position = packet:r_vec3() 
local dest_direction = packet:r_vec3() 
local dest_level_name = packet:r_stringZ() 
local dest_graph_point = packet:r_stringZ() 
local silent_mode = packet:r_u8()

packet:w_begin(game_vertex_id) -- game_vertex_id 
packet:w_float(cse_alife_object__unk1_f32) 
packet:w_u32(cse_alife_object__unk2_u32) 
packet:w_u32(level_vertex_id) -- level_vertex_id 
packet:w_u32( bit_not(193) ) -- object_flags = -193 = 0xFFFFFF3E 
packet:w_stringZ(custom_data) 
packet:w_u32(p_story_id) -- story_id 
packet:w_u32(spawn_story_id)

packet:w_u8(1) -- количество фигур 
-- packet:w_u8(0) -- тип фигуры: сфера 
-- packet:w_vec3(vector():set(0, 0, 0)) -- sphere_center 
-- packet:w_float(3.0) 
packet:w_u8(1) -- тип фигуры: box 
packet:w_float(2) -- axis_x_x 
packet:w_float(0) -- axis_x_y 
packet:w_float(0) -- axis_x_z 
packet:w_float(0) -- axis_y_x 
packet:w_float(4) -- axis_y_y 
packet:w_float(0) -- axis_y_z 
packet:w_float(0) -- axis_z_x 
packet:w_float(0) -- axis_z_y 
packet:w_float(4) -- axis_z_z 
packet:w_float(0) -- offset_x 
packet:w_float(0) -- offset_y 
packet:w_float(0) -- offset_z

packet:w_u8(3) -- restrictor_type

packet:w_u16(p_dest_gv) -- destination game_vertex_id 
packet:w_s32(p_dest_lv) -- destination level_vertex_id 
packet:w_vec3(p_dest_pos) -- destination position 
packet:w_vec3(p_dest_dir) -- destination direction (направление взгляда) 
packet:w_stringZ(p_dest_level) -- destination level name 
packet:w_stringZ("start_actor_02") -- some string, always const 
packet:w_u8(p_silent) -- 1 for silent level changing

packet:r_seek(0) 
obj:STATE_Read(packet, packet:w_tell()) 
news_manager.send_tip(db.actor, "Новый путь", nil, nil, 20000) 
end 

2) Далее, в самый конец этого файла вписываем собственно функцию спавна перехода, которую потом надо будет вызвать либо из диалога либо из инфопоршня либо по какому-нибудь условию. Например, создадим двухсторонний переход в тайник Стрелка с Агропрома и обратно на Агропром: 

function create_agro_taynik() 
-- создается переход c АГРОПРОМА В ТАЙНИК СТРЕЛКА 
if (not has_alife_info( "teleport_to_taynik" )) then 
y_level.create_level_changer(20015, vector():set( -45.089,-0.637,-34.386 ),194126,654, 
3053, 
717, 
vector():set( -75.975,-6.726,-74.848 ), 
vector():set( 0.0,1.5,0.0 ),"l03u_agr_underground",0) 
db.actor:give_info_portion("teleport_to_taynik") 
end 
-- создается переход ИЗ ТАЙНИКА СТРЕЛКА НА АГРОПРОМ 
if (not has_alife_info( "teleport_from_taynik" )) then 
y_level.create_level_changer(20016, vector():set( -81.394,-4.946,-70.915 ),2709,717, 
194118, 
695, 
vector():set( -47.207,-0.364,-40.833 ), 
vector():set( 0.0,3.0,0.0 ),"l03_agroprom",0) 
db.actor:give_info_portion("teleport_from_taynik") 
end 
end 

--Обратите внимание, что название фашего скриптового файла необходимо ставить в функцию спавна. В представленном варианте - это y_level, у Вас может быть другое имя. 
--Обратите внимание, что каждомому создаваемому переходу необходимо присвоить свой уникальный story_id и зарегистрировать его в файле: game_story_ids.ltx (путь: \gamedata\config ). В примере заданы для каждого из двух новых переходов стори_айди 20015 и 20016 соответственно. Важно, чтобы создаваемые стори_айди не повторяли уже существующие, иначе будет вылет. Лучше брать значения больше 20000, а лучше внимательно просмотреть существующие номера стори_айди в файле: game_story_ids.ltx 
3) Кроме этого, чтобы переход отображался на карте и у него было название, необходимо прописать его в файл: level_tasks.script (путь: \gamedata\scripts) по аналогии с остальными и дать новому переходу название. 
Вот так: 
obj = sim:story_object(20015) 
if obj then 
level.map_add_object_spot(obj.id, "level_changer", "В Тайник Стрелка") 
end 
obj = sim:story_object(20016) 
if obj then 
level.map_add_object_spot(obj.id, "level_changer", "На Агропром") 
end 
Следите, чтобы в конце функции, в которую добавляете новые регистрации переходов (особенно, если добавляете в самый конец функции), обязательно было, как и изначально, три end 
4) В функции спавна переходов выдаются инфопоршни. По одному на каждый создаваемый переход. Эти инфопоршни необходимо прописать в вашем файле с инфопоршнями. В примере это два инфопоршня: teleport_to_taynik и teleport_from_taynik 
5) Чтобы заспавнить переход только в один конец, то действуем по аналогии, но сама функция спавна будет немного другой. Например, тайная тропа с Ростока на Армейские Склады: 


function tropa_rostok() 
-- создается переход c РОСТОКА НА АРМЕЙСКИЕ СКЛАДЫ 
if (not has_alife_info( "info_tropa_rostok" )) then 
y_level.create_level_changer(20017, vector():set( -289.735,0.099,192.842 ),295,1340, 
13812, 
1847, 
vector():set( -408.979,-13.798,400.699 ), 
vector():set( 0.0,2.0,0.0 ),"l07_military",0) 
db.actor:give_info_portion("info_tropa_rostok") 
end 
end 

6) В функции спавна переходов можно так же задать направление взгяда актёра, когда он оказывается в точке после перехода. Это задаётся в строке: vector():set( 0.0,2.0,0.0 ),"l07_military",0) 
Имеет значение только вторая координата. Она задаёт как раз ориентацию на местности. Показатели очень просты: 0.0 (по умолчанию) это смотреть на север. -1.5 - это 45 градусов вправо (на восток). 3.0 - это 90 градусов (смотреть будет строго на юг). 1.5 - это 45 градусов влево (на запад). 
7) Если нужно удалить какой-нибудь переход, то в том же файле вписывем функцию, где указываем стори_айди перехода, который нужно удалить. Пример: 

function delete_radar_mg() 
local sim = alife() 
local se_obj = sim:story_object(20044) 
if se_obj then 
sim:release(se_obj, true) 
end 
local actor = db.actor 
end 


Всё. Вызываем данную функцию из удобного для Вас места (диалог или инфопоршень) и переход исчезнет.



Источник: http://antreg.ucoz.ru/forum/5-10-1
Категория: Моддинг | Добавил: Hardtmuth (12.04.2012) | Автор: antreg
Просмотров: 3532 | Теги: Спавн и удаление переходов между ло, Спавн и удаление переходов между ло | Рейтинг: 3.5/2
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Меню сайта

Свежие прохождения






Категории раздела

Мини-чат

Наш опрос
Какое прохождение писать следующим?
Всего ответов: 2924

Поиск

Статистика

Онлайн всего: 59
Гостей: 58
Пользователей: 1
фримен







Тот самый S.T.A.L.K.E.R.







Форма входа

Войти Зарегистрироваться