Победа сил света! Довольно посредственная концовка, хотелось бы как нибудь поинтересней закончить. И в данном гайде я вам расскажу как можно сделать свою собственную сценку.
Для примера я возьму простенькую новогоднюю концовку из своей кастомки, где все жители деревни собираются в середину карты и ждут Главного, который в определённое время телепортируется впереди всех и все жители начинают смотреть на него. Все сопровождается музыкой и голосом Путина, как без этого. И на курантах заканчивается игра.
Перед этим всем, вам надо будет зайти на свою карту и назвать юнитов, которые будут использоваться в концовке. Делается это в Хамере, нажимаете 2 раза на юнита а в строчке Name пишите имя. Если же у вас много юнитов одного типа, как у меня пингвины, можно назвать их одиним именем, но потом в коде нужно это правильно обыграть.
Дальше создаем точки, куда будут двигаться наши персонажи. Для этого нажимаем на лампочку, создаем человечка, кликаем по нему 2 раза и в строку Class пишем info_target. И так же как и с юнитами называем эту точку. После того как вы назвали все точки и всех юнитов, тогда переходим к коду.
Сама концовка будет у нас функцией, которую можно вызывать после убийства босса. Поэтому пишем function ChristmasEnd(). Начинается у меня концовка с фразочки и песни. Дальше идет перечисление точек и персонажей, вставляете туда свои точки, персонажей и идем дальше. После у меня идет присваивание модификатора персонажам, у которых еще нет неуязвимости. Делаю я это через AddNewModifier, модификатор оставлю здесь.
Функция StartGestureWithPlaybackRate заставляет использовать какую-либо анимацию, в данном случае это анимация победы. Такой функции как MoveToPoint не существуют в доте, поэтому мы должны сами ее прописать.
Спустя 90 секунд я меняю время дня на ночь и убираю анимацию с персонажей. Также заставляю использовать скилл, скилл так же будет here. И по аналогии с MoveToPoint - CastPointSkill нету в доте, поэтому прописываем сами. PuitnThink перемещает персонажа с 1 точки на другую.
С обычными персонажеми разобрались, теперь перейдем к тем, кто имеет одинаковые имена. Хотя здесь нечего объяснять в коде все будет понятно))
Ну и под конец пишем победу и все! Вот так легко и просто можно сделать довольно прикольную концовку, надеюсь сегодня вы узнали что-то новое.
Для примера я возьму простенькую новогоднюю концовку из своей кастомки, где все жители деревни собираются в середину карты и ждут Главного, который в определённое время телепортируется впереди всех и все жители начинают смотреть на него. Все сопровождается музыкой и голосом Путина, как без этого. И на курантах заканчивается игра.
Перед этим всем, вам надо будет зайти на свою карту и назвать юнитов, которые будут использоваться в концовке. Делается это в Хамере, нажимаете 2 раза на юнита а в строчке Name пишите имя. Если же у вас много юнитов одного типа, как у меня пингвины, можно назвать их одиним именем, но потом в коде нужно это правильно обыграть.
Дальше создаем точки, куда будут двигаться наши персонажи. Для этого нажимаем на лампочку, создаем человечка, кликаем по нему 2 раза и в строку Class пишем info_target. И так же как и с юнитами называем эту точку. После того как вы назвали все точки и всех юнитов, тогда переходим к коду.
Lua:
function ChristmasEnd()
Timers:CreateTimer(0,function()
GameRules:SendCustomMessage("#christmas_1",0,0) --Фразочка
end)
Timers:CreateTimer(2,function()
EmitGlobalSound("christmas_Bydet") -- Музыка
GameRules:SendCustomMessage("<font color='#58ACFA'>Стекловата - Новый год</font>",0,0) -- Её название
end)
LinkLuaModifier("modifier_intro_rotate_christmas_passive", "abilities/endgame/intro_rotate_christmas", 0) -- Link нужен чтобы модификатор сработал
--***************************** Перечисление точек, куда будут двигаться наши персонажи *****************************
local point_for_kunkka = Entities:FindByName(nil, "for_kunkka"):GetAbsOrigin() -- там где написано "for_kunkka" вставляете свою точку
local point_for_crystal = Entities:FindByName(nil, "for_crystal"):GetAbsOrigin()
local for_brodyagi = Entities:FindByName(nil, "for_brodyagi"):GetAbsOrigin()
local point_for_penguins_1 = Entities:FindByName(nil, "for_penguins_1"):GetAbsOrigin()
local point_for_penguins_2 = Entities:FindByName(nil, "for_penguins_2"):GetAbsOrigin()
local point_for_putin = Entities:FindByName(nil, "putin"):GetAbsOrigin()
local point_for_rotate = Entities:FindByName(nil, "pudge_end_point") -- Точка, куда будут все поворачиваться
--***************************** Перечисление персонажей *****************************
local crystalka = Entities:FindByName(nil, 'crystalka') -- там где написано 'crystalka' вставляете своего персонажа
local brodyaga = Entities:FindByName(nil, 'brodyaga')
local kunkka = Entities:FindByName(nil, 'kunkka')
local putin = Entities:FindByName(nil, 'NPC_base')
local penguin = Entities:FindAllByName('penguin') -- Обратите внимание, тут FindALL используется, а не как в предыдущих. Потому что их много
local penguin_2 = Entities:FindAllByName('penguin_2')
Timers:CreateTimer(0, function()
kunkka:AddNewModifier(kunkka, nil, "modifier_intro_rotate_christmas_passive", {}) -- Присваиваю персонажам неуязвимость
crystalka:AddNewModifier(crystalka, nil, "modifier_intro_rotate_christmas_passive", {})
brodyaga:AddNewModifier(brodyaga, nil, "modifier_intro_rotate_christmas_passive", {})
putin:AddNewModifier(putin, nil, "modifier_intro_rotate_christmas_passive", {})
kunkka:StartGestureWithPlaybackRate(ACT_DOTA_VICTORY, 1.0) -- Анимация
brodyaga:StartGestureWithPlaybackRate(ACT_DOTA_VICTORY, 1.0)
crystalka:StartGestureWithPlaybackRate(ACT_DOTA_VICTORY, 1.0)
MoveToPoint(kunkka, point_for_kunkka) --Заставляет персонажей двигаться к определённой точке (1 персонаж, 2 точка куда надо двигаться)
MoveToPoint(brodyaga, for_brodyagi)
MoveToPoint(crystalka, point_for_crystal)
end)
Timers:CreateTimer(90, function() -- Спустя 90 секунд
GameRules:SetTimeOfDay(0.75) -- Меняет день на ночь
kunkka:RemoveGesture(ACT_DOTA_VICTORY) -- Убирает анимацию персонажей
brodyaga:RemoveGesture(ACT_DOTA_VICTORY)
crystalka:RemoveGesture(ACT_DOTA_VICTORY)
kunkka:CastPointSkill("intro_rotate_christmas",point_for_rotate:GetAbsOrigin())
brodyaga:CastPointSkill("intro_rotate_christmas",point_for_rotate:GetAbsOrigin())
crystalka:CastPointSkill("intro_rotate_christmas",point_for_rotate:GetAbsOrigin())
PuitnThink(putin) -- Перемещает персонажа
end)
for i = 1, #penguin do -- Смотрит сколько вообще таких есть
local pingin = penguin[i] -- Нужно для того, чтобы каждый пингвин с таким именем делал то, что ему скажет
Timers:CreateTimer(0, function()
MoveToPoint(pingin, point_for_penguins_1) -- Обратите внимание тут PINGIN а не PENGUIN и во всех остальных тоже
pingin:AddAbility("intro_rotate_christmas")
end)
Timers:CreateTimer(90, function()
pingin:CastPointSkill("intro_rotate_christmas",point_for_rotate:GetAbsOrigin())
end)
end
for i = 1, #penguin_2 do -- Смотрит сколько вообще таких есть
local pingin_2 = penguin_2[i] -- Нужно для того, чтобы каждый пингвин с таким именем делал то, что ему скажет
Timers:CreateTimer(0, function()
MoveToPoint(pingin_2, point_for_penguins_2) -- Обратите внимание тут PINGIN_2 а не PENGUIN_2 и во всех остальных тоже
pingin_2:AddAbility("intro_rotate_christmas")
end)
Timers:CreateTimer(90, function()
pingin_2:CastPointSkill("intro_rotate_christmas",point_for_rotate:GetAbsOrigin())
end)
end
Timers:CreateTimer(134, function()
GameRules:SetGameWinner(DOTA_TEAM_GOODGUYS) --Вот и сама победа
end)
end
function PuitnThink(npc)
Timers:CreateTimer(0, function()
if ( not npc:IsAlive() ) then --если юнит мертв
return -1
end
if npc.stop then --если игра приостановлена
return 1
end
local point = Entities:FindByName(nil, "putin"):GetAbsOrigin() -- Точка куда переместиться
local blink_point = point
local effect = "models/heroes/antimage_female/debut/particles/blink/antimage_debut_blink_sparkles.vpcf" -- Эффект какой будет
local pfx = ParticleManager:CreateParticle(effect, PATTACH_WORLDORIGIN, npc)
ParticleManager:SetParticleControl(pfx, 0, npc:GetAbsOrigin())
ParticleManager:ReleaseParticleIndex(pfx)
npc:SetAbsOrigin(blink_point)
npc:StartGestureWithPlaybackRate(ACT_DOTA_CAST_ABILITY_2, 1) -- Анимация ( лично у моего персонажа не было анимаций, поэтому он ниче не делает )
npc:EmitSound("Hero_Antimage.Blink_out") -- Звук блинка
end)
end
function MoveToPoint(unit, point) -- Функция MoveToPoint, нет блять PuitnThink
Timers:CreateTimer(0.1, function()
ExecuteOrderFromTable({
UnitIndex = unit:entindex(), -- индекс кастера
OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, -- тип приказа
Position = point, -- положение врага
Queue = false, -- ждать очереди ?
})
end)
end
function CDOTA_BaseNPC:CastPointSkill(skill_name, point) -- хммм
local ability = self:FindAbilityByName(skill_name)
if ability then
ExecuteOrderFromTable({
UnitIndex = self:entindex(), -- индекс кастера
OrderType = DOTA_UNIT_ORDER_CAST_POSITION, -- тип приказа
AbilityIndex = ability:entindex(), -- индекс способности
Position = point, -- положение врага
Queue = false, -- ждать очереди ?
})
else
print("ability "..skill_name.." not found !!!")
end
end
-- Lox 4mo net dryzei
Lua:
LinkLuaModifier("modifier_intro_rotate_christmas_passive", "abilities/endgame/intro_rotate_christmas", 0) -- Пишите сюда свой путь
modifier_intro_rotate_christmas_passive = class({
IsHidden = function() return true end,
CheckState = function() return {
[MODIFIER_STATE_INVULNERABLE] = true, -- Неуязвимость
[MODIFIER_STATE_NO_HEALTH_BAR] = true, -- Без хелт бара(сверху такая штука)
[MODIFIER_STATE_DISARMED] = true, -- Не может бить
}end,
})
Спустя 90 секунд я меняю время дня на ночь и убираю анимацию с персонажей. Также заставляю использовать скилл, скилл так же будет here. И по аналогии с MoveToPoint - CastPointSkill нету в доте, поэтому прописываем сами. PuitnThink перемещает персонажа с 1 точки на другую.
Код:
"intro_rotate_christmas"
{
"BaseClass" "ability_datadriven"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT"
"IsOnCastBar" "0"
}
С обычными персонажеми разобрались, теперь перейдем к тем, кто имеет одинаковые имена. Хотя здесь нечего объяснять в коде все будет понятно))
Ну и под конец пишем победу и все! Вот так легко и просто можно сделать довольно прикольную концовку, надеюсь сегодня вы узнали что-то новое.