Перейти к содержанию
Hardtmuth

[SoC] Телепортация через скрипт

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

 

[SoC] Телепортация через скрипт

Функция доступна только для Тень Чернобыля, в остальных сериях наблюдаются вылеты!

Создаем скрипт, в него вставляем:

Спойлер

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())
level.add_pp_effector ("teleport.ppe", 2006, false)
end

 

Телепортация:

Функция телепортации:

function poleteli()
create_level_changer(20101, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),
10193,
2437,
vector():set(66.210,15.040,4.250),
vector():set(0.0, 0.0, 0.0),
"l12u_sarcofag",
1)
end

Функция удаления:

function delete_poleteli() -- функция удаления(если нужно)
local sim = alife()
local se_obj = sim:story_object(20101)
if se_obj then
sim:release(se_obj, true)
end
local actor = db.actor
end

Информация:

20101 - STORY_ID нового level_changer
10193 - level_vertex_id
2437 - game_vertex_id
vector():set(66.210,15.040,4.250)
- координаты
vector():set(0.0, 0.0, 0.0) - направление взгляда актёра
"l12u_sarcofag" - название локации

Функцию телепортации, можно вызывать любым способом.


0D4KR0h.png

Хотите картинки знатных сисек? у меня их есть © Ранго
Поцелуй за шоколадку, и даже больше..."Альтернатива" © Wolfstalker
Люди, с зарплатой менее 300к в месяц - не люди © Вадим Драконин

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


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

А где взять STORY_ID нового level_changer? И как назвать скрипт? Функцию телепорта вставлять в созданный нами скрипт?

 

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


Ссылка на сообщение
Поделиться на другие сайты
 
В 21.07.2020 в 22:38, Hardtmuth сказал:

Функция доступна только для Тень Чернобыля

А что, в ЧН и ЗП телепорты делаются не скриптами, а как-то по-другому? Как?

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


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

 

9 минут назад, Stepan_sovok1917 сказал:

А что, в ЧН и ЗП телепорты делаются не скриптами, а как-то по-другому? Как?

через all.spawn.

В ТЧ все телепорты тоже там прописаны.

По моему мнению вся эта тягомотина со скриптами того не стоит. Легче всё делать через спавн, а ещё легче через СДК(кто умеет). А вообще, лучше всего, скачать правленныq exe-шник с включенной функцией jump_to_level.

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


Ссылка на сообщение
Поделиться на другие сайты
 
1 час назад, oleg19966 сказал:

через all.spawn.

Уффф... Понятия не имею, что это. Буду изучать.

 

1 час назад, oleg19966 сказал:

а ещё легче через СДК

А вот это уже звучит вкусно. Распишешь поподробнее?

 

1 час назад, oleg19966 сказал:

jump_to_level

Слышал про такую фишку в билдах. Но она же вроде о телепортах между локациями. А я говорю про телепорты в пределах одной локации

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


Ссылка на сообщение
Поделиться на другие сайты
 
1 час назад, Stepan_sovok1917 сказал:

А вот это уже звучит вкусно. Распишешь поподробнее?

Вбивай в гугле уроки по sdk и учись.

 

1 час назад, Stepan_sovok1917 сказал:

Слышал про такую фишку в билдах. Но она же вроде о телепортах между локациями. А я говорю про телепорты в пределах одной локации

Если нужно в пределах одной локации, то тогда разблокировать перемещение с помощью demo_record. В билдах с его помощью можно перемещаться в любую точку на карте, даже под карту можно)))

 

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


Ссылка на сообщение
Поделиться на другие сайты
 
12 часов назад, oleg19966 сказал:

Если нужно в пределах одной локации, то тогда разблокировать перемещение с помощью demo_record. В билдах с его помощью можно перемещаться в любую точку на карте, даже под карту можно)))

А, ну это телепорты во время игрового процесса. А я сейчас занят разработкой мода в специфическом жаре, где будет очень много телепортов во время диалога с персонажем, причём желательно без выкидывания из диалога. Такое можно сделать через сдк?

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


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

Stepan_sovok1917 тогда только через скрипт. Смотри скрипты проводников в ЧН и ЗП + моды для ТЧ.

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


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

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

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

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

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

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

Войти

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

Войти

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

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