Not usual концовка

Jendos

Новичок
24 Мар 2020
7
1
Проект
Roshdef but You are gay
Победа сил света! Довольно посредственная концовка, хотелось бы как нибудь поинтересней закончить. И в данном гайде я вам расскажу как можно сделать свою собственную сценку.


Для примера я возьму простенькую новогоднюю концовку из своей кастомки, где все жители деревни собираются в середину карты и ждут Главного, который в определённое время телепортируется впереди всех и все жители начинают смотреть на него. Все сопровождается музыкой и голосом Путина, как без этого. И на курантах заканчивается игра.

Перед этим всем, вам надо будет зайти на свою карту и назвать юнитов, которые будут использоваться в концовке. Делается это в Хамере, нажимаете 2 раза на юнита а в строчке Name пишите имя. Если же у вас много юнитов одного типа, как у меня пингвины, можно назвать их одиним именем, но потом в коде нужно это правильно обыграть.
Screenshot_1.pngScreenshot_2.pngScreenshot_3.png
Дальше создаем точки, куда будут двигаться наши персонажи. Для этого нажимаем на лампочку, создаем человечка, кликаем по нему 2 раза и в строку Class пишем info_target. И так же как и с юнитами называем эту точку. После того как вы назвали все точки и всех юнитов, тогда переходим к коду.
Screenshot_4.pngScreenshot_5.pngScreenshot_6.pngScreenshot_7.png

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
Сама концовка будет у нас функцией, которую можно вызывать после убийства босса. Поэтому пишем function ChristmasEnd(). Начинается у меня концовка с фразочки и песни. Дальше идет перечисление точек и персонажей, вставляете туда свои точки, персонажей и идем дальше. После у меня идет присваивание модификатора персонажам, у которых еще нет неуязвимости. Делаю я это через AddNewModifier, модификатор оставлю здесь.
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,
})
Функция StartGestureWithPlaybackRate заставляет использовать какую-либо анимацию, в данном случае это анимация победы. Такой функции как MoveToPoint не существуют в доте, поэтому мы должны сами ее прописать.


Спустя 90 секунд я меняю время дня на ночь и убираю анимацию с персонажей. Также заставляю использовать скилл, скилл так же будет here. И по аналогии с MoveToPoint - CastPointSkill нету в доте, поэтому прописываем сами. PuitnThink перемещает персонажа с 1 точки на другую.

Код:
    "intro_rotate_christmas"
    {
        "BaseClass"                     "ability_datadriven"
        "AbilityBehavior"               "DOTA_ABILITY_BEHAVIOR_POINT"       
        "IsOnCastBar"                   "0"   
    }

С обычными персонажеми разобрались, теперь перейдем к тем, кто имеет одинаковые имена. Хотя здесь нечего объяснять в коде все будет понятно))

Ну и под конец пишем победу и все! Вот так легко и просто можно сделать довольно прикольную концовку, надеюсь сегодня вы узнали что-то новое.
 
  • Нравится
Реакции: -ExotiC-

vulkantsk

Супермодератор
Команда форума
21 Июн 2017
820
133
www.dotabuff.com
Проект
Roshan defense
Вставил бы видос, как это выглядит в игре. А то нифига не понятно )
 
Реклама: