Рассмотрим что нам из этого можно менять для создания своего телепорта:
1. [1] номер секции. номера в alif_локация должны идти строго по порядку
2. name = moy_teleport_0001 здесь пишется имя телепорта(любое), единственно на что надо обратить внимание – это то, что если вам лень менять имена, то номер телепорта менять придется обязательно т.е. создадим несколько телепортов с одним именем, это будут такие телепорты: name = moy_teleport_0001 name = moy_teleport_0002 name = moy_teleport_0003 …………………………… name = moy_teleport_xxxx
3. position = 118.185966491699,8.19023418426514,-49.18896484375 это точка, на которой появится наш телепорт
4. direction = 0,0,0 это «направление взгляда» нашего телепорта (0,0,0, - на север)
5. game_vertex_id = 979 и level_vertex_id = 314612 гейм- и левел-вертексы
point1 = moy_teleport_walk_polet1 это ссылка на секцию в way_локация (точка телепортации)
look1 = moy_teleport_look_polet1 это ссылка на секцию в way_локация (направление взгляда ГГ при телепортации)
Одно замечание: если вам не важно, куда будет смотреть ГГ после «перелета», то строку look1 = moy_teleport_look_polet1 можно вырезать, тогда отпадает необходимость создания секции [moy_teleport_look_polet1] в way-локация.
7. shape0:radius = 2.5 это радиус «захвата» нашего телепорта, чем меньше радиус – тем меньше телепорт и соответсвенно чем больше радиус – тем больше телепорт.
гейм- и левел-вертексы соответственно «точки приземления» и направления взгляда.
Одно важное замечание! 1. Если вы создавая телепорт в его секции напишете только ссылку на «путь»(walk) к точке переноса, но не напишете ссылку на «взгляд»(look), а в way_локация создадите обе секции «путь» и «взгляд»(walk и look), ничего страшного не случится, но если наоборот, в секции телепорта напишете ссылки и на «путь» и на «взгляд»(walk и look) а в way_локации создадите только одну секцию( или «путь» или «взгляд»), то ждите вылетов или как минимум некорректной работы вашего телепорта. 2. Этот телепорт "работает только в пределах одной локации.
Вот и весь урок. Надеюсь теперь вы сможете без проблем создавать свои телепорты в игре.
Телепорт через скрипт
Внимание!Данный телепорт действует только в пределах одной локации!!!
Итак, создадим телепорт для ТЧ через скрипт. Что для этого надо? Немногое:
1. По пути gamedata\scripts\ создадим скриптовый файл с именем bind_mteleport.script и в этот файл помещаем следующее:
function actor_update(delta) local i,v,acter_poz,s
-- Получим позицию актера (что-бы каждый раз не запрашивать) acter_poz = db.actor:position()
-- Проверяем наши телепорты for i, v in pairs(teleport_binders) do s = v.parametrs
local obj = level.object_by_id( i ) if obj ~= nil then -- Наш телепорт в онлайне проверяем дальше if s.teleporte ~= nil and s.teleporte ~= false then -- Телепорт запущен if ( time_global() <= s.time ) then -- Если время отведенное на показ спецэфектов -- прошло, производим телепортацию teleportate(s.poz_x,s.poz_y,s.poz_z) if s.rotate ~= nil then db.actor:set_actor_direction(s.rotate) end s.teleporte = false end return end
-- Пороверим не забрел-ли актер в наш телепорт if (abs_comp(s.x, acter_poz.x)< v.parametrs.radius and abs_comp(s.z, acter_poz.z)< v.parametrs.radius and abs_comp(s.y, acter_poz.y)< v.parametrs.z_radius) then -- Актер в зоне действия телепорта, запустим телепорт s["teleporte"] = true s["time"] = time_global() + 500
-- Запускаем спецэфекты телепортации level.add_pp_effector ("teleport.ppe", 2006, false) end end end end
function bind( obj ) obj:bind_object( restrictor_teleport( obj ) ) end
---------------------------------------------------------------------------------------------------- class "restrictor_teleport" ( object_binder )
function restrictor_teleport:__init(obj, char_ini) super(obj) end
function restrictor_teleport:net_spawn(data) local char_ini = system_ini()
-- Если это телепорт то занесем его в специальный список телепортов if self.teleport == true then teleport_binders[self.object:id()] = self
-- Заполним таблицу параметров self["parametrs"] = {} if char_ini:line_exist(self.section, "radius") then self.parametrs["radius"] = tonumber(char_ini:r_string(self.section, "radius")) else self.parametrs["radius"] = 2 -- Дефолтный радиус по xy end if char_ini:line_exist(self.section, "z_radius") then self.parametrs["z_radius"] = tonumber(char_ini:r_string(self.section, "z_radius")) else self.parametrs["z_radius"] = self.parametrs["radius"] -- если радиус высоты не задан то задаем равным радиусу xy end
-- Запомним позицию что-бы каждый раз не считать local s_obj = alife():object(self.object:id()) self.parametrs["x"] = tonumber(s_obj.position.x); self.parametrs["y"] = tonumber(s_obj.position.y); self.parametrs["z"] = tonumber(s_obj.position.z);
if char_ini:line_exist(self.section, "rotate") then self.parametrs["rotate"] = tonumber(char_ini:r_string(self.section, "rotate")) end end return true end
function restrictor_teleport:net_destroy() -- Удаляем наш телепорт teleport_binders[self.object:id()] = nil self.parametrs = nil object_binder.net_destroy(self) end
function restrictor_teleport:reload(section) local char_ini = system_ini()
self.section = section -- Если это телепорт то if char_ini ~= nil and char_ini:line_exist(self.section, "teleport") then self["teleport"] = true end end
2. Чтобы наш телепорт работал необходимо прицепить функцию actor_update() к биндеру актера, для чего в файле bind_stalker.script найдем функцию: function actor_binder:update(delta) В ней найдем вызов обновления рестрикторов bind_restrictor.actor_update(delta) под которым вставим строку с вызовом нашей функции обновления: bind_mteleport.actor_update(delta)
Оригинальный биндер актора выглядит так:
нужная нам часть:
-- обновление рестрикторов, которые под логикой, срабатывает через интервалы времени if self.next_restrictors_update_time < time then bind_restrictor.actor_update(delta)
self.next_restrictors_update_time = time + 200
task_manager.actor_update() end
А так должен выглядеть правленый:
Код
-- обновление рестрикторов, которые под логикой, срабатывает через интервалы времени if self.next_restrictors_update_time < time then bind_restrictor.actor_update(delta) bind_mteleport.actor_update(delta) --наша строчка self.next_restrictors_update_time = time + 200
task_manager.actor_update() end
3. Далее, открываем файл zone_teleport.ltx по пути gamedata\config\misc и в самый конец его вставляем:
[m_teleport_1]:zone_teleport teleport = standart script_binding = bind_mteleport.bind ;Параметры нашего телепорта radius = 1 ;Высота захвата телепорта z_radius = 1
;Куда телепортируемся (телепортация всегда идет в пределах карты) poz_x = 106.72 poz_y = 18.09 poz_z = 169.16 ; Угол зрения при появлении. Если параметра нет то не меняется rotate = 3.8
Это секция нашего телепорта
[m_teleport_1] - имя нашего телепорта(для каждого создаваемого телепорта должно быть свое)
Код
poz_x = 106.72 poz_y = 18.09 poz_z = 169.16 --координаты куда происходит телепортация
4. Далее создадим любой скриптовый файл, ну например ddd.script и в этот файл помещаем функцию спавна нашего телепорта:
Код
function spawn_perebros() alife():create("m_teleport_1",vector():set(-90.52,1.23,-37.37),119023,321) end
Где: spawn_perebros название функции(для каждого создаваемого телепорта свое) m_teleport_1 имя телепорта в файле zone_teleport.ltx (-90.52,1.23,-37.37),119023,321) координаты,левел и гейм вертексы точки спавна нашего телепорта
5. Ну и последнее. Надо как-то вызвать наш телепорт. Для этого можно такую конструкцию:
Код
<action>ddd.spawn_perebros</action>
Где ddd - имя скриптового файла с нашей функцией спавна телепорта spawn_perebros - имя нашей функции
Например, вставить в любой диалог, любому НПС и после диалога с ним появится наш телепорт по заданным координатам (-90.52,1.23,-37.37),119023,321)