Бывает что нужно заспавнить нейтралов, а точнее существ из npc_units_custom.txt, но они не умеют возвращаться на свое место(это если класс юнита npc_dota_creature, если класс npc_dota_neutral, такого не будет).
Если мы создаем npc_dota_neutral то "Creature" блок в datadriven будет недоступен
Что ж, для начала заспавним крипов.
Теперь мы должны сделать им возврат на их место если далеко ушли. Для этого делаем такой костыль с таймерами.
И при запуске игры запускаем функцию Ai_GetBack().
Все. Теперь крип заспавненный и добавленный в таблицу с точкой спавна будет возвращаться насильно на свой спавн если далеко убежал.
Если вы знаете способ лучше, говорите.
Если мы создаем npc_dota_neutral то "Creature" блок в datadriven будет недоступен
Что ж, для начала заспавним крипов.
Код:
_G.Units = {} -- глобальная таблица существ. Почему глобальная? Потому что иногда мне необходимо из других скриптов обращаться к Units. Но сделать локальным будет лучше, если вам не нужно вызывать извне. Быстрее будет работать же.
function Spawn()
{
local tpoint = Entities:FindByName( nil, "DIRE_SPAWNER"):GetAbsOrigin() -- в hammer editor сделать обязательно info_target с именем DIRE_SPAWNER
local current = CreateUnitByName("Demon_possessed", tpoint, true, nil, nil, DOTA_TEAM_NEUTRALS) -- создаем КАСТОМНОГО крипа.
print("Spawner: " .. current:GetUnitName()) -- просто тестовый вывод
InsertInUnitTable(current, tpoint)
}
function InsertInUnitTable(inserting_unit, inserting_point)
local inserting_data =
{
unit = inserting_unit,
point = inserting_point,
}
table.insert(Units, inserting_data)
end
Теперь мы должны сделать им возврат на их место если далеко ушли. Для этого делаем такой костыль с таймерами.
Код:
function Ai_GetBack()
Timers:CreateTimer("get_back_units", {
endTime = 5,
callback = function()
Ai_GetBack_Tick()
return 5
end })
end
function Ai_GetBack_Tick()
for _, un in pairs(Units) do
if un then
if (un.point - un.unit:GetAbsOrigin()):Length2D() >= 900 then -- высчитываем расстояние от точки спавна до нахождения юнита, и если больше 900 то отдаем юниту насильный приказ вернутся на точку спавна.
un.unit:MoveToPosition(un.point)
end
end
end
end
Все. Теперь крип заспавненный и добавленный в таблицу с точкой спавна будет возвращаться насильно на свой спавн если далеко убежал.
Если вы знаете способ лучше, говорите.
Последнее редактирование модератором: