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

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

Друзья CG
22 Ноя 2014
334
18
Админ, ты когда мета теги расставляешь, какими пользуешься?

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

Если лень подбирать, могу набросать примерные слова для индексации)
 

-ExotiC-

Какой-то ноунэйм
Команда форума
11 Авг 2014
498
56
customgames.ru
Se7eN написал(а):
Админ, ты когда мета теги расставляешь, какими пользуешься?

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

Если лень подбирать, могу набросать примерные слова для индексации)
На главной они генерируются автоматически, в зависимости от контента.
 
Последнее редактирование:

-ExotiC-

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

Исправил на главной и здесь.
 

doter.ua

Продвинутый
17 Авг 2014
280
5
[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]
В теге код не работают другие теги :)
 

Se7eN

Друзья CG
22 Ноя 2014
334
18
Ошибку в коде исправил, извините, писал по памяти)
 

Slavko

Продвинутый
22 Июн 2015
224
4
Можно еще добавить, чтобы камера за игроком после тп следовала что-то вроде
Код:
require('timers')
...  
PlayerResource:SetCameraTarget(event.activator:GetPlayerOwnerID(), event.activator)
  Timers:CreateTimer(0.1, function()
    PlayerResource:SetCameraTarget(event.activator:GetPlayerOwnerID(), nil) -- Чтобы камера разблочилась, т.к. она начинает следовать за игроком постоянно.
    return nil
  end)
 

Slavko

Продвинутый
22 Июн 2015
224
4
Se7eN, ахах. Я оказывается у тебя же это и подсмотрел наmoddota.com :D
 

Slavko

Продвинутый
22 Июн 2015
224
4
Как создать эффект при телепортации:
Результат: 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'.
 
Последнее редактирование модератором:

Se7eN

Друзья CG
22 Ноя 2014
334
18
Спасибо, как будет свободное время, внесу в основной гайд. :) rep+
 

SanyaDuizFX

Пользователь
18 Окт 2015
37
0
Мммм что не так я сделал всё как на писано становлюсь на точку тп куда я поставил и мне пишет:

...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>

Что делать?! :-*
 
Последнее редактирование модератором:

Илья

Друзья CG
25 Сен 2015
2,348
41
[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" ты задал строкой, а ожидается вектор.


Прочитай комментарии к теме, а конкретно пятый пост: автор статьи допустил ошибку.
 
Последнее редактирование модератором:

logica

Пользователь
27 Июн 2021
56
7
Проект
DotaRoyale
Как переделать что б через телепорт проходили крипочки и тоже отправлялись на точку.
 

vulkantsk

Супермодератор
Команда форума
21 Июн 2017
1,137
196
www.dotabuff.com
Проект
Roshan defense
Как переделать что б через телепорт проходили крипочки и тоже отправлялись на точку.
Сменить тип триггера с trigger_hero на обычный, и там галочку поставить .
 

fabio_longo

Продвинутый
13 Июн 2021
152
18
steamcommunity.com
Проект
Chen's Training, Creep Stacking Training
есть ли способ получить значение local unit = event.activator по другому? так как у меня к функции обращается джава скрипт, не могу использовать этот вариант.
 
Реклама: