[Гайд] Как телепортировать героя из одной зоны, в другую?

  • Автор темы Автор темы Se7eN
  • Дата начала Дата начала

Se7eN

Друзья CG
22 Ноя 2014
334
18
Многие из вас захотят сделать кастомные телепорты в своей карте.
И сегодня вы получите это знание :)

В действительно сделать это очень просто, начнём :)

1. Создайте коробку, (Shift + B). - Эту будет наша область, войдя в которую герой будет телепортирован в другое место. Выглядеть должно так!

ab0b3bd49594c04c888b871073ca362f.jpg


Geometry type: Block
Active material: Trigger

2. Привяжите коробку к энтити. Для этого достаточно нажать Ctrl + T, выбрав коробку. Тип должен быть: trigger_hero.
bcfcec69c0c16e406a12b9a3c9fbe0f2.jpg


3. Теперь надо создать вторую коробку, это та область куда герой будет телепортирован.
Создайте ящик, привяжите к энтити и выберите тип: point_teleport

4. Дайте второму ящику имя. В свойствах name: дайте ему имя как на картинке.
c9603a4a8338b02b816b1cdcdec85579.jpg

Имя задается для того, чтобы редактор смог отличить один ящик телепорта, от другого. Оно очень важно.

5. Теперь сохраните карту, найдите папку своего аддона, где хранятся скрипты.
По умолчанию там есть скрипт addon_game_mode.lua, поэтому не ошибетесь.

Назовите файл: tp.lua
Внесите внутрь вот этот скрипт:
Код:
function tp1(event)
   local unit = event.activator
   local wws= "pnt1" -- вот та сама точка, куда мы будем телепортировать героя, мы её указали в скрипте

   local ent = Entities:FindByName( nil, wws) --строка ищет как раз таки нашу точку pnt1
   local point = ent:GetAbsOrigin() --эта строка выясняет где находится pnt1 и получает её координаты
   event.activator:SetAbsOrigin( point ) -- получили координаты, теперь меняем место героя на pnt1
   FindClearSpaceForUnit(event.activator, point, false) --нужно чтобы герой не застрял
   event.activator:Stop() --приказываем ему остановиться, иначе он побежит назад к предыдущей точке
end

6. Теперь идём к первому ящику. В поле скрипты вводим: tp.lua
Имя тоже выставьте tp_first.
7affe749e016507b271d2be7642e4b5a.jpg


7. Итак теперь программируем триггер: выделяем первую коробку и нажимаем alt + enter.
79ae24bff9c98dc641354f2623e8f805.jpg


Нажимаем кнопку add и выбираем событие OnStartTouch. Это значит, что когда герой наступит на эту коробку должно что-то произойти.
Теперь надо выбрать во втором пункте: tp_first. Мы можем выбрать, потому что указали раньше имя, помните?)

Здесь имеется в виду, когда герой наступает на ЛЮБОЙ ЯЩИК, и тут игра спрашивает себя: а на какой?
И мы ей говорим: на tp_first!

Третий пункт: CallScriptFunction - вызываем функцию из нашего скрипта!

Там всего одна функция и пишем её: tp_1

Вуаля! Теперь работает!
Включайте, тестируйте!)

Скоро обещаю запилить уроки по скриптингу.

Гайд обновлен: добавлено выделение жирным для важных пунктов
 
Последнее редактирование модератором:
  • Нравится
Реакции: Fanat2460 и almazist1
Админ, ты когда мета теги расставляешь, какими пользуешься?

Не забывай от этого зависит сколько юзеров придёт, так что обязательно ставь)

Если лень подбирать, могу набросать примерные слова для индексации)
 
Se7eN написал(а):
Админ, ты когда мета теги расставляешь, какими пользуешься?

Не забывай от этого зависит сколько юзеров придёт, так что обязательно ставь)

Если лень подбирать, могу набросать примерные слова для индексации)
На главной они генерируются автоматически, в зависимости от контента.
 
Последнее редактирование:
Сейчас сидели с doter.ua, разбирали, почему не работал скрипт.
Код:
   local point = ent:GetAbsOrigin() -- Тут мы берем значение в координатах x y z.
   event.activator:SetAbsOrigin( wws ) -- А тут ставим значение переменной wws, которое равно pnt1, т.е. это cstring, что не правильно. Должны быть координаты x y z, а значит переменная point.
doter.ua собственно и нашел в чем проблема.

Исправил на главной и здесь.
 
[quote author=-ExotiC- link=topic=149.msg676#msg676 date=1435700980]
Сейчас сидели с doter.ua, разбирали, почему не работал скрипт.
Код:
   local point = ent:GetAbsOrigin() -- Тут мы берем значение в координатах x y z.
   event.activator:SetAbsOrigin( wws ) -- А тут ставим значение переменной [b]wws[/b], которое равно [b]pnt1[/b] т.е. это [b]cstring[/b], что не правильно. Должны быть координаты x y z, а значит переменная [b]point[/b].
doter.ua собственно и нашел в чем проблема.

Исправил на главной и здесь.
[/quote]
В теге код не работают другие теги :)
 
Ошибку в коде исправил, извините, писал по памяти)
 
Можно еще добавить, чтобы камера за игроком после тп следовала что-то вроде
Код:
require('timers')
...  
PlayerResource:SetCameraTarget(event.activator:GetPlayerOwnerID(), event.activator)
  Timers:CreateTimer(0.1, function()
    PlayerResource:SetCameraTarget(event.activator:GetPlayerOwnerID(), nil) -- Чтобы камера разблочилась, т.к. она начинает следовать за игроком постоянно.
    return nil
  end)
 
Se7eN, ахах. Я оказывается у тебя же это и подсмотрел наmoddota.com :D
 
Как создать эффект при телепортации:
Результат: https://www.youtube.com/watch?v=-K_Do_1DC5s&feature=youtu.be
local wwe = "tp_first" -- Вбиваем в переменную имя нашего первого бокс, из которого мы будем телепортироваться
local ent2 = Entities:FindByName( nil, wwe) -- Находим первый бокс
local point2 = ent2:GetAbsOrigin() -- Находим координаты первого бокса
local particleName = "particles/items2_fx/teleport_end_g_b.vpcf" -- Название эффекта вбиваем в переменную
local particle1 = ParticleManager:CreateParticle( particleName, PATTACH_CUSTOMORIGIN, ent2 ) -- Через менеджер эффектов создаем эффект particleName, PATTACH_CUSTOMORIGIN значит, что его control points мы настроим позже, ent2 - привязываем эффект к нашему боксу.
ParticleManager:SetParticleControl( particle1, 3, point2 ) -- Управляем третьим контрол поинтом эффекта. Именно он в данном случае отвечает за положение в мире http://imgur.com/a/OGODI. Направляем поинт на нашу точку 'point2'.
 
Последнее редактирование модератором:
Спасибо, как будет свободное время, внесу в основной гайд. :) rep+
 
Мммм что не так я сделал всё как на писано становлюсь на точку тп куда я поставил и мне пишет:

...ota 2 beta\game\dota_addons\test\scripts\vscripts\tp.lua:7: SetAbsOrigin parameter 0: expected vector but got cstring.
stack traceback:
[C]: in function 'SetAbsOrigin'
...ota 2 beta\game\dota_addons\test\scripts\vscripts\tp.lua:7: in function <...ota 2 beta\game\dota_addons\test\scripts\vscripts\tp.lua:1>

Что делать?! :-*
 
Последнее редактирование модератором:
[quote author=SanyaDuizFX link=topic=149.msg1797#msg1797 date=1445253876]
Мммм что не так я сделал всё как на писано становлюсь на точку тп куда я поставил и мне пишет:

...ota 2 beta\game\dota_addons\test\scripts\vscripts\tp.lua:7: SetAbsOrigin parameter 0: expected vector but got cstring.
stack traceback:
[C]: in function 'SetAbsOrigin'
...ota 2 beta\game\dota_addons\test\scripts\vscripts\tp.lua:7: in function <...ota 2 beta\game\dota_addons\test\scripts\vscripts\tp.lua:1>

Что делать?! :-*
[/quote]

Учить английский или хотя бы залезть сюда

SetAbsOrigin parameter 0: expected vector but got cstring.

Тебе пишут, что нулевой параметр в функции "SetAbsOrigin" ты задал строкой, а ожидается вектор.


Прочитай комментарии к теме, а конкретно пятый пост: автор статьи допустил ошибку.
 
Последнее редактирование модератором:
Как переделать что б через телепорт проходили крипочки и тоже отправлялись на точку.
 
Как переделать что б через телепорт проходили крипочки и тоже отправлялись на точку.
Сменить тип триггера с trigger_hero на обычный, и там галочку поставить .
 
есть ли способ получить значение local unit = event.activator по другому? так как у меня к функции обращается джава скрипт, не могу использовать этот вариант.
 
Реклама: