Добавлен , опубликован
» Способ реализации: Lua
» Тип: Способность, пак
» Версия Warcraft: 1.31+
» MUI: да
» Импорт: нет
Пак способностей Орна из лиги.
Вулканический разлом [Q]
Орн бьет по земле, создавая в ней трещину, которая наносит врагам физический урон и замедляет их. После небольшой задержки в области поражения поднимается столп магмы, который стоит стеной в течение нескольких секунд.
do

    local SPELL_ID      =   FourCC('A000') 
    local MDX           =   "Abilities\\Weapons\\LordofFlameMissile\\LordofFlameMissile.mdl"
    local SCALE         =   1.28 
    local DISTANCE      =   800.0
    local INTERVAL      =   0.03125
    local MOVE_TIME     =   1.5
    local DAMAGE        =   {20, 45, 70, 95, 120}
    local BONUS_DAMAGE  =   1.1
    local AOE           =   128.0
    --
    local WALL_ID       =   FourCC('h001')
    local WALL_DIST     =   160.0
    --
    local ATTACK_TYPE   =   ATTACK_TYPE_HERO
    local DAMAGE_TYPE   =   DAMAGE_TYPE_FIRE
    local WEAPON_TYPE   =   nil
    --
    local DUMMY_ID      =   FourCC('e000')
    --
    local GROUP         =   CreateGroup()

    local trg = CreateTrigger()
    for i = 0, bj_MAX_PLAYER_SLOTS do
        TriggerRegisterPlayerUnitEvent(trg, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
    end
    TriggerAddCondition(trg, Condition(function() return GetSpellAbilityId() == SPELL_ID end))
    TriggerAddAction(trg, function()
        local caster = GetTriggerUnit()
        local player = GetTriggerPlayer()
        local level = GetUnitAbilityLevel(caster, SPELL_ID)
        --
        local speed = 2 * DISTANCE / ((MOVE_TIME / INTERVAL) + 1)
        local now_distance = 0
        local x = GetUnitX(caster)
        local y = GetUnitY(caster)
        local angle = Atan2(GetSpellTargetY() - y, GetSpellTargetX() - x)
        --
        local effect = AddSpecialEffect(MDX, x, y)
        --
        local dmg = DAMAGE[level] + (BlzGetUnitBaseDamage(caster, 0) * BONUS_DAMAGE)
        --
        local gr = CreateGroup()
        local hit = false
        --
        TimerStart(CreateTimer(), INTERVAL, true, function()
            now_distance = now_distance + speed
            x = x + speed * Cos(angle)
            y = y + speed * Sin(angle)
            z = GetTerrainZ(x, y) + 8.0

            if(now_distance >= DISTANCE or hit or not InMap(x, y))then

                if(hit)then
                    x = x + WALL_DIST * Cos(angle)
                    y = y + WALL_DIST * Sin(angle)
                end
                
                bj_lastCreatedUnit = CreateUnit(player, WALL_ID, x, y, 90.0)
                DestroyGroup(gr)
                DestroyEffect(effect)
                DestroyTimer(GetExpiredTimer())
            else
                BlzSetSpecialEffectPosition(effect, x, y, z)
                BlzSetSpecialEffectScale(effect, SCALE)

                GroupEnumUnitsInRange(GROUP, x, y, AOE, nil)
                local target
                while true do
                    target = FirstOfGroup(GROUP)
                    if target == nil then break end
                    
                    if(Condition(target, player) and not IsUnitInGroup(target, gr))then
                        if(IsUnitType(target, UNIT_TYPE_HERO))then hit = true end
                        UnitDamageTarget(caster, target, dmg, true, false, ATTACK_TYPE, DAMAGE_TYPE, WEAPON_TYPE)
                        GroupAddUnit(gr, target)
                        bj_lastCreatedUnit = CreateUnit(player, DUMMY_ID, x, y, 0.0)
                        IssueTargetOrder(bj_lastCreatedUnit, "slow", target)
                    end

                    GroupRemoveUnit(GROUP, target)
                end

            end

        end)
    end)

end
Дыхание вулкана [W]
Орн становится неудержимым, закрывается щитом и извергает пламя. Пламя наносит магический урон, размер которого зависит от текущего запаса здоровья противника. Враги, объятые последней порцией пламени, становятся хрупкими. Автоатаки Орна отбрасывают хрупкие цели.
do

    local SPELL_ID      =   FourCC('A002')
    local ATTACK_ID     =   FourCC('Abun')
    local MDX           =   "Abilities\\Weapons\\LordofFlameMissile\\LordofFlameMissile.mdl"
    local SCALE         =   1.5
    local DURATION      =   0.75
    local INTERVAL      =   0.05
    local DAMAGE        =   {0.12, 0.13, 0.14, 0.15, 0.16}
    local AOE           =   200.0
    local STEP          =   15.0
    local RAGE          =   true
    --
    local ATTACK_TYPE   =   ATTACK_TYPE_MAGIC
    local DAMAGE_TYPE   =   DAMAGE_TYPE_FIRE
    local WEAPON_TYPE   =   nil
    --
    local BLOCK         =   CreateTrigger()
    local BLOCK_GROUP   =   CreateGroup()
    local SHIELD        =   {}
    --
    local BRITTLE_ID        = FourCC('A003')
    local BUFF_ID           = FourCC('B001')
    local BRITTLE           = CreateTrigger()
    local BRITTLE_GROUP     = CreateGroup()
    local BRITTLE_INTERVAL  = 0.03125
    local BRITTLE_DISTANCE  = 200.0
    local BRITTLE_TIME      = 1.0
    local BRITTLE_ARC       = 0.5
    --
    local DUMMY_ID      =   FourCC('e000')
    local GROUP = CreateGroup()

    local trg = CreateTrigger()
    for i = 0, bj_MAX_PLAYER_SLOTS do
        TriggerRegisterPlayerUnitEvent(trg, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
    end
    TriggerAddCondition(trg, Condition(function() return GetSpellAbilityId() == SPELL_ID end))
    TriggerAddAction(trg, function()
        local caster = GetTriggerUnit()
        local key = GetHandleId(caster)
        local player = GetTriggerPlayer()
        local level = GetUnitAbilityLevel(caster, SPELL_ID)
        --
        local x, y, angle
        local now_duration = 0.0
        local animation_speed = (STEP * 2) * INTERVAL
        --
        SHIELD[key] = GetUnitState(caster, UNIT_STATE_MAX_LIFE) * DAMAGE[level]
        if not IsUnitInGroup(caster, BLOCK_GROUP) then
            TriggerRegisterUnitEvent(BLOCK, caster, EVENT_UNIT_DAMAGING)
            GroupAddUnit(BLOCK_GROUP, caster)
        end
        --
        if(RAGE)then
            PauseUnit(caster, true)
            UnitAddAbility(caster, ATTACK_ID)
            SetUnitTimeScale(caster, animation_speed)
        end
        --
        TimerStart(CreateTimer(), INTERVAL, true, function()
            now_duration = now_duration + INTERVAL
            angle = GetUnitFacing(caster) * (bj_PI / 180)
            x = GetUnitX(caster) + STEP * Cos(angle)
            y = GetUnitY(caster) + STEP * Sin(angle)
            
            SetUnitPosition(caster, x, y)
            SetUnitAnimation(caster, "walk")

            local effect = AddSpecialEffect(MDX, x, y)
            BlzSetSpecialEffectScale(effect, SCALE)
            DestroyEffect(effect)

            GroupEnumUnitsInRange(GROUP, x, y, AOE, nil)
            local target
            while true do
                target = FirstOfGroup(GROUP)
                if target == nil then break end
                
                if(Condition(target, player))then
                    local dmg = DAMAGE[level] * GetUnitState(target, UNIT_STATE_MAX_LIFE) * INTERVAL
                    UnitDamageTarget(caster, target, dmg, true, false, ATTACK_TYPE, DAMAGE_TYPE, WEAPON_TYPE)
                end

                GroupRemoveUnit(GROUP, target)
            end
            --
            if(now_duration >= DURATION)then

                if(RAGE)then
                    PauseUnit(caster, false)
                    SetUnitAnimation(caster, "stand")
                    SetUnitTimeScale(caster, 1)
                    UnitRemoveAbility(caster, ATTACK_ID)
                end
                
                SHIELD[key] = 0.0

                GroupEnumUnitsInRange(GROUP, x, y, AOE, nil)
                local target
                while true do
                    target = FirstOfGroup(GROUP)
                    if target == nil then break end
                    
                    if(Condition(target, player))then
                        local dmg = DAMAGE[level] * GetUnitState(target, UNIT_STATE_MAX_LIFE) * INTERVAL
                        UnitDamageTarget(caster, target, dmg, true, false, ATTACK_TYPE, DAMAGE_TYPE, WEAPON_TYPE)
                        
                        bj_lastCreatedUnit = CreateUnit(player, DUMMY_ID, x, y, 0.0)
                        IssueTargetOrder(bj_lastCreatedUnit, "bloodlust", target)
                        if not IsUnitInGroup(target, BRITTLE_GROUP) then
                            TriggerRegisterUnitEvent(BRITTLE, target, EVENT_UNIT_DAMAGING)
                            GroupAddUnit(BRITTLE_GROUP, target)
                        end
                    end
    
                    GroupRemoveUnit(GROUP, target)
                end

                DestroyTimer(GetExpiredTimer())
            end
            --
        end)
    end)

    TriggerAddAction(BLOCK, function()
        local unit = GetTriggerUnit()
        local dmg = GetEventDamage()
        local key = GetHandleId(unit)

        SHIELD[key] = SHIELD[key] - dmg

        if(SHIELD[key] > 0.0)then
            BlzSetEventDamage(0)
        end
    end)

    local function BrittleFunc(target, speed, angle)
        local x = GetUnitX(target)
        local y = GetUnitY(target)
        local zs = GetTerrainZ(x, y)
        local xe = x + BRITTLE_DISTANCE * Cos(angle)
        local ye = y + BRITTLE_DISTANCE * Sin(angle)
        local ze = GetTerrainZ(xe, ye)
        local now_distance = BRITTLE_DISTANCE

        UnitAddAbility(target, FourCC('Arav'))
        PauseUnit(target, true)

        TimerStart(CreateTimer(), BRITTLE_INTERVAL, true, function()
            x = x + speed * Cos(angle)
            y = y + speed * Sin(angle)
            now_distance = now_distance - speed
            z = Parabola(zs, ze, BRITTLE_DISTANCE * BRITTLE_ARC, BRITTLE_DISTANCE, BRITTLE_DISTANCE - (BRITTLE_DISTANCE - now_distance))
            
            SetUnitX(target, x)
            SetUnitY(target, y)
            SetUnitFlyHeight(target, z, 0)

            if(now_distance <= 0)then
                UnitRemoveAbility(target, FourCC('Arav'))
                PauseUnit(target, false)
                SetUnitFlyHeight(target, 0, 0)
                DestroyTimer(GetExpiredTimer())
            end
        end)
    end

    TriggerAddAction(BRITTLE, function()
        local unit = GetTriggerUnit()
        local attacker = GetEventDamageSource()
        local speed = 2 * BRITTLE_DISTANCE / ((BRITTLE_TIME / BRITTLE_INTERVAL) + 1)

        if(GetUnitAbilityLevel(unit, BUFF_ID) > 0)then
            UnitRemoveAbility(unit, BUFF_ID)
            BrittleFunc(unit, speed, GetUnitFacing(attacker) * (bj_PI / 180))
        end
    end)

end
Обжигающий рывок [E]
Орн делает рывок и наносит урон всем врагам на своем пути. Если Орн сталкивается с препятствием, возникает ударная волна, которая наносит урон и подбрасывает врагов. Умение уничтожает препятствия, созданные игроками.
do

    local SPELL_ID      =   FourCC('A004')
    local WALL_ID       =   FourCC('h001')
    local MDX           =   "Abilities\\Weapons\\DemolisherFireMissile\\DemolisherFireMissile.mdl"
    local SCALE         =   0.5
    local DAMAGE        =   {80, 125, 170, 215, 260}
    local BONUS_DAMAGE  =   0.4
    local AOE           =   150.0
    local MOVE_TIME     =   1.25
    local DISTANCE      =   800.0
    local INTERVAL      =   0.03125
    --
    local ATTACK_TYPE   =   ATTACK_TYPE_HERO
    local DAMAGE_TYPE   =   DAMAGE_TYPE_FIRE
    local WEAPON_TYPE   =   nil
    --
    local DURATION      =   1.0
    local HEIGHT        =   400.0
    --
    local GROUP = CreateGroup()

    local function Fly(target)
        local now_duration = 0
        local now_height = 0
        local back = DURATION / 2
        local speed = 2 * HEIGHT / ((DURATION / INTERVAL) + 1)

        UnitAddAbility(target, FourCC('Arav'))
        PauseUnit(target, true)

        TimerStart(CreateTimer(), INTERVAL, true, function()
            now_duration = now_duration + INTERVAL

            if(now_duration >= DURATION)then
                SetUnitFlyHeight(target, 0, 0)
                UnitRemoveAbility(target, FourCC('Arav'))
                PauseUnit(target, false)
                DestroyTimer(GetExpiredTimer())
            else

                if(now_duration >= back)then
                    now_height = now_height - speed
                    SetUnitFlyHeight(target, now_height, 0)
                else
                    now_height = now_height + speed
                    SetUnitFlyHeight(target, now_height, 0)
                end

            end
        end)
    end

    local trg = CreateTrigger()
    for i = 0, bj_MAX_PLAYER_SLOTS do
        TriggerRegisterPlayerUnitEvent(trg, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
    end
    TriggerAddCondition(trg, Condition(function() return GetSpellAbilityId() == SPELL_ID end))
    TriggerAddAction(trg, function()
        local caster = GetTriggerUnit()
        local player = GetTriggerPlayer()
        local level  = GetUnitAbilityLevel(caster, SPELL_ID)
        local effect = AddSpecialEffectTarget(MDX, caster, "chset")
        --
        local x = GetUnitX(caster)
        local y = GetUnitY(caster)
        local angle = Atan2(GetSpellTargetY() - y, GetSpellTargetX() - x)
        local now_distance = 0
        local speed = 2 * DISTANCE / ((MOVE_TIME / INTERVAL) + 1)
        local dmg = DAMAGE[level] + BlzGetUnitArmor(caster) * BONUS_DAMAGE
        --
        local dash = false
        local gr = CreateGroup()
        --
        PauseUnit(caster, true)

        TimerStart(CreateTimer(), INTERVAL, true, function()
            x = x + speed * Cos(angle)
            y = y + speed * Sin(angle)
            now_distance = now_distance + speed

            if(now_distance >= DISTANCE or dash)then

                if(dash)then
                    local boom = AddSpecialEffect(MDX, x, y)
                    BlzSetSpecialEffectScale(boom, 3.0)
                    DestroyEffect(boom)

                    GroupEnumUnitsInRange(GROUP, x, y, AOE, nil)
                    local target
                    while true do
                        target = FirstOfGroup(GROUP)
                        if target == nil then break end
                        
                        if(Condition(target, player))then
                            Fly(target)
                        end
    
                        GroupRemoveUnit(GROUP, target)
                    end
                end

                DestroyGroup(gr)
                DestroyEffect(effect)
                PauseUnit(caster, false)
                DestroyTimer(GetExpiredTimer())
            else
                
                if(not IsTerrainPathable(x, y, PATHING_TYPE_WALKABILITY))then
                    SetUnitX(caster, x)
                    SetUnitY(caster, y)
                else
                    dash = true
                end

                GroupEnumUnitsInRange(GROUP, x, y, AOE, nil)
                local target
                while true do
                    target = FirstOfGroup(GROUP)
                    if target == nil then break end
                    
                    if(Condition(target, player) and not IsUnitInGroup(target, gr))then
                        UnitDamageTarget(caster, target, dmg, true, false, ATTACK_TYPE, DAMAGE_TYPE, WEAPON_TYPE)
                        GroupAddUnit(gr, target)
                    end

                    if(GetUnitTypeId(target) == WALL_ID)then
                        KillUnit(target)
                        dash = true
                    end
            
                    GroupRemoveUnit(GROUP, target)
                end

            end

        end)
    end)

end
Зов бога-кузнеца [R]
Орн призывает в выбранную точку огромного огненного элементаля, который движется к нему навстречу с нарастающей скоростью. Пораженные элементалем враги получают магический урон и становятся хрупкими.
Орн может применить умение повторно, чтобы сделать рывок вперед. Столкнувшись с элементалем во время рывка, он отправит его в другую сторону. На обратном пути элементаль наносит такой же урон, как и в первый раз, подбрасывает всех пораженных врагов и делает их хрупкими.
do

    local SPELL_ID      =   FourCC('A005')
    local SECOND_ID     =   FourCC('A006')
    local SLOW_ID       =   FourCC('A001')
    local GOD_DUMMY_ID  =   FourCC('h002')
    local SECOND_DUR    =   5.0
    local DISTANCE      =   1500.0
    local SECOND_DIST   =   250.0
    local AOE           =   375.0
    local MOVE_TIME     =   1.0
    local GOD_MOVE_TIME =   4.2
    local INTERVAL      =   0.03125
    local DAMAGE        =   {125, 175, 225}
    local BONUS_DAMAGE  =   0.2
    --
    local DURATION      =   1.5
    local HEIGHT        =   600.0
    --
    local ATTACK_TYPE   =   ATTACK_TYPE_MAGIC
    local DAMAGE_TYPE   =   DAMAGE_TYPE_FIRE
    local WEAPON_TYPE   =   nil
    --
    local DUMMY_ID      =   FourCC('e000')
    local GROUP         =   CreateGroup()
    --
    local GOD_DUMMY     =   {}
    local SHOOT         =   {}

    local trg = CreateTrigger()
    for i = 0, bj_MAX_PLAYER_SLOTS do
        TriggerRegisterPlayerUnitEvent(trg, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
    end
    TriggerAddCondition(trg, Condition(function() return GetSpellAbilityId() == SPELL_ID end))
    TriggerAddAction(trg, function()
        local caster = GetTriggerUnit()
        local player = GetTriggerPlayer()
        local key = GetHandleId(caster)
        local level = GetUnitAbilityLevel(caster, SPELL_ID)
        
        local dmg = DAMAGE[level] + BONUS_DAMAGE * BlzGetUnitBaseDamage(caster, 0)
        local speed = 2 * DISTANCE / ((GOD_MOVE_TIME / INTERVAL) + 1)
        local now_distance = DISTANCE
        local x = GetUnitX(caster)
        local y = GetUnitY(caster)
        local angle_create = Atan2(GetSpellTargetY() - y, GetSpellTargetX() - x)
        local angle = Atan2(y - GetSpellTargetY(), x - GetSpellTargetX())
        local xg = x + DISTANCE * Cos(angle_create)
        local yg = y + DISTANCE * Sin(angle_create)
        local dummy = CreateUnit(player, GOD_DUMMY_ID, xg, yg, angle * bj_RADTODEG)
        GOD_DUMMY[key] = dummy
        SHOOT[key] = false
        SetUnitTimeScale(dummy, 0.3)

        BlzUnitHideAbility(caster, SPELL_ID, true)
        UnitAddAbility(caster, SECOND_ID)
        SetUnitAbilityLevel(caster, SECOND_ID, level)

        local gr = CreateGroup()
        TimerStart(CreateTimer(), INTERVAL, true, function()
            now_distance = now_distance - speed
            xg = xg + speed * Cos(angle)
            yg = yg + speed * Sin(angle)

            GroupEnumUnitsInRange(GROUP, xg, yg, AOE, nil)
            local target
            while true do
                target = FirstOfGroup(GROUP)
                if target == nil then break end
                
                if(Condition(target, player) and not IsUnitInGroup(target, gr))then
                    UnitDamageTarget(caster, target, dmg, true, false, ATTACK_TYPE, DAMAGE_TYPE, WEAPON_TYPE)
                    GroupAddUnit(gr, target)
                    bj_lastCreatedUnit = CreateUnit(player, DUMMY_ID, x, y, 0.0)
                    SetUnitAbilityLevel(bj_lastCreatedUnit, SLOW_ID, level)
                    IssueTargetOrder(bj_lastCreatedUnit, "slow", target)
                end
        
                GroupRemoveUnit(GROUP, target)
            end

            if(now_distance <= -50.0)then
                if(GetUnitAbilityLevel(caster, SECOND_ID) > 0)then
                    UnitRemoveAbility(caster, SECOND_ID)
                    BlzUnitHideAbility(caster, SPELL_ID, false)
                end

                if(not SHOOT[key])then
                    RemoveUnit(dummy)
                end
                
                DestroyGroup(gr)
                DestroyTimer(GetExpiredTimer())
            else
                SetUnitX(dummy, xg)
                SetUnitY(dummy, yg)
            end
        end)
    end)

    local function Fly(target)
        local now_duration = 0
        local now_height = 0
        local back = DURATION / 2
        local speed = 2 * HEIGHT / ((DURATION / INTERVAL) + 1)

        UnitAddAbility(target, FourCC('Arav'))
        PauseUnit(target, true)

        TimerStart(CreateTimer(), INTERVAL, true, function()
            now_duration = now_duration + INTERVAL

            if(now_duration >= DURATION)then
                SetUnitFlyHeight(target, 0, 0)
                UnitRemoveAbility(target, FourCC('Arav'))
                PauseUnit(target, false)
                DestroyTimer(GetExpiredTimer())
            else

                if(now_duration >= back)then
                    now_height = now_height - speed
                    SetUnitFlyHeight(target, now_height, 0)
                else
                    now_height = now_height + speed
                    SetUnitFlyHeight(target, now_height, 0)
                end

            end
        end)
    end

    trg = CreateTrigger()
    for i = 0, bj_MAX_PLAYER_SLOTS do
        TriggerRegisterPlayerUnitEvent(trg, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
    end
    TriggerAddCondition(trg, Condition(function() return GetSpellAbilityId() == SECOND_ID end))
    TriggerAddAction(trg, function()
        local caster = GetTriggerUnit()
        local player = GetTriggerPlayer()
        local key = GetHandleId(caster)
        local level = GetUnitAbilityLevel(caster, SECOND_ID)

        local x = GetUnitX(caster)
        local y = GetUnitY(caster)
        local angle = GetUnitFacing(caster)
        
        GroupEnumUnitsInRange(GROUP, x, y, AOE, nil)
        local target
        while true do
            target = FirstOfGroup(GROUP)
            if target == nil then break end
            
            if(target == GOD_DUMMY[key])then
                local dummy = GOD_DUMMY[key]

                SHOOT[key] = true
                UnitRemoveAbility(caster, SECOND_ID)
                BlzUnitHideAbility(caster, SPELL_ID, false)

                local dmg = DAMAGE[level] + BONUS_DAMAGE * BlzGetUnitBaseDamage(caster, 0)
                local speed = 2 * DISTANCE / ((GOD_MOVE_TIME / INTERVAL) + 1)
                local now_distance = 0
                local xg = x + speed * Cos(angle * (bj_PI / 180))
                local yg = y + speed * Sin(angle * (bj_PI / 180))
                SetUnitFacing(dummy, angle)

                local gr = CreateGroup()
                TimerStart(CreateTimer(), INTERVAL, true, function()
                    now_distance = now_distance + speed
                    xg = xg + speed * Cos(angle * (bj_PI / 180))
                    yg = yg + speed * Sin(angle * (bj_PI / 180))

                    GroupEnumUnitsInRange(GROUP, xg, yg, AOE, nil)
                    local target
                    while true do
                        target = FirstOfGroup(GROUP)
                        if target == nil then break end
                        
                        if(Condition(target, player) and not IsUnitInGroup(target, gr))then
                            UnitDamageTarget(caster, target, dmg, true, false, ATTACK_TYPE, DAMAGE_TYPE, WEAPON_TYPE)
                            Fly(target)
                            GroupAddUnit(gr, target)
                        end
                
                        GroupRemoveUnit(GROUP, target)
                    end

                    if(now_distance >= DISTANCE or not InMap(xg, yg))then
                        DestroyGroup(gr)
                        RemoveUnit(dummy)
                        DestroyTimer(GetExpiredTimer())
                    else
                        SetUnitX(dummy, xg)
                        SetUnitY(dummy, yg)
                    end
                end)
            end
    
            GroupRemoveUnit(GROUP, target)
        end

    end)

end
Скришноты
Перенос в свою карту
Скопировать триггер: Function
Скопировать юнита: Dummy Caster
Скопировать способности: Slow, Brittle
Скопировать заклинание: Brittle
Вулканический разлом
Скопировать триггер: VOLCANIC RUPTURE
Скопировать способность: VOLCANIC RUPTURE
Скопировать юнита: Wall
Дыхание вулкана
Скопировать триггер: BELLOWS BREATH
Скопировать способность: BELLOWS BREATH
Обжигающий рывок
Скопировать триггер: SEARING CHARGE
Скопировать способность: SEARING CHARGE
Зов бога-кузнеца
Скопировать триггер: CALL OF THE FORGE GOD
Скопировать способности: CALL OF THE FORGE GOD(first call), CALL OF THE FORGE
GOD(second call)
Скопировать юнита: The Forge God
P.S
Не всё работает как в LoL'e.
Нет пассивной способности.
Во время W вы не можете двигаться.
Во время второго использования R вы не совершаете рывок.
`
ОЖИДАНИЕ РЕКЛАМЫ...
3
12
5 лет назад
3
Не все тут еще перешли на новые патчи.
Хотелось бы увидеть вариант спеллпака на джассе для патча 1.26
0
32
5 лет назад
0
Daro, без мемхака нет смысла сидеть на 126, надо брать по максимуму (и переходить на 131 имхо)
noyl отлично всё супер, а можно добавить описание способностей, я например в лол не играл и не понимаю, что должен делать герой
1
17
5 лет назад
1
Это описание умений из самой лиги легенд. Однако тут вроде как немного различается я не знаю
Q: ВУЛКАНИЧЕСКИЙ РАЗЛОМ
Орн бьет по земле, создавая в ней трещину, которая наносит врагам физический урон и замедляет их. После небольшой задержки в области поражения поднимается столп магмы, который стоит стеной в течение нескольких секунд.
W: ДЫХАНИЕ ВУЛКАНА
Орн становится неудержимым, получает щит и извергает пламя. Пламя наносит магический урон, размер которого зависит от текущего запаса здоровья противника. Враги, объятые последней порцией пламени, становятся хрупкими. Автоатаки Орна отбрасывают хрупкие цели.
ХРУПКОСТЬ
Попав под действие обездвиживающих эффектов, хрупкие враги получают дополнительный урон, размер которого зависит от их максимального запаса здоровья. Кроме того, на хрупких врагов эффекты обездвиживания действуют дольше.
E: ОБЖИГАЮЩИЙ РЫВОК
Орн делает рывок и наносит урон всем врагам на своем пути. Если Орн сталкивается с препятствием, возникает ударная волна, которая наносит урон и подбрасывает врагов. Умение уничтожает препятствия, созданные игроками.
R: ЗОВ БОГА-КУЗНЕЦА
Орн призывает в выбранную точку огромного огненного элементаля, который движется к нему навстречу с нарастающей скоростью. Пораженные элементалем враги получают магический урон и становятся хрупкими.
Орн может применить умение повторно, чтобы сделать рывок вперед. Столкнувшись с элементалем во время рывка, он отправит его в другую сторону. На обратном пути элементаль наносит такой же урон, как и в первый раз, подбрасывает всех пораженных врагов и делает их хрупкими.
Bergi_Bear:
Daro, без мемхака нет смысла сидеть на 126, надо брать по максимуму (и переходить на 131 имхо)
noyl отлично всё супер, а можно добавить описание способностей, я например в лол не играл и не понимаю, что должен делать герой
и да, там же написанно все
4
29
5 лет назад
4
Хотелось бы увидеть вариант спеллпака на джассе для патча 1.26
Человек старался, изучал новый удобный язык, а вы хотите ввергнуь его в пучину кривого jass и долбанных хэштаблиц?
1
28
5 лет назад
1
пучину кривого jass и долбанных хэштаблиц
Полегче, молодой человек.
3
10
5 лет назад
3
Мем хак не застал, а 1.31 куплен давно, так что выбор очевиден, не хочу снова на 1.26 возвращаться.
1
24
5 лет назад
1
Код не очень - создание объектов в верхнем потоке выполнения, до инициализации и полной загрузки карты. Злоупотребление анонимными функциями, которые несомненно удобны, но это дорогое удовольствие и лучше пользоваться ими только когда это реально нужно, а не ради "красивого кода".
0
29
5 лет назад
Отредактирован nazarpunk
0
Код не очень - создание объектов в верхнем потоке выполнения, до инициализации и полной загрузки карты.
Что не так с кодом до инициализации карты? Триггеры нормально создаются, а для прочего можно хукнуть InitGlobals.
0
24
5 лет назад
0
NazarPunk, проблема в том, что эта часть кода похоже выполняется в лобби при начальной загрузке карты, в отличии от жасса, который так не умел и код только загружал, но еще не выполнял на этом этапе.
0
32
5 лет назад
0
часть кода похоже выполняется в лобби при начальной загрузке карты
интересно интересно, тогда может стоит попробовать сделать анимацию из положения золотых шахт на миникарте?
3
24
5 лет назад
3
Bergi_Bear, миникарта для лобби запекается при сохранении карты, насколько я помню, так что ничего не выйдет.
0
29
5 лет назад
0
Злоупотребление анонимными функциями, которые несомненно удобны, но это дорогое удовольствие
Решил проверить, насколько оно дорогое
local InitGlobals_hook = InitGlobals
function InitGlobals()
	InitGlobals_hook()
	local group  = CreateGroup()
	local id     = FourCC('hfoo')
	local player = Player(PLAYER_NEUTRAL_PASSIVE)
	local count  = 5000
	
	local start  = os.clock()
	for i = 1, count do
		GroupAddUnit(group, CreateUnit(player, id, 0, 0, 0))
	end
	print('create ' .. count .. ' unit', os.clock() - start)
	print('-------------------------------')
	
	-- named
	local function hp()
		BlzSetUnitMaxHP(GetEnumUnit(), 1000)
	end
	start = os.clock()
	ForGroup(group, hp)
	print('named', os.clock() - start)
	
	-- anon
	start = os.clock()
	ForGroup(group, function()
		BlzSetUnitMaxHP(GetEnumUnit(), 5000)
	end)
	print('anon', os.clock() - start)
end
Загруженные файлы
1
24
5 лет назад
Отредактирован prog
1
NazarPunk, дело не в скорости - скорость хуже всего будет на именованных глобальных функциях и функциях в таблицах. Дороговизна анонимных функций и вложенных функций прежде всего в потреблении памяти.

Тем временем, случайно обнаружилась одна из проблем создания триггеров до инициализации - привязанные к ним события сжирает сборщик мусора, при том что тот же код перенесенный в хук InitGlobals работает исправно после сборки мусора.
0
29
5 лет назад
Отредактирован nazarpunk
0
привязанные к ним события сжирает сборщик мусора
Почему у меня не сжирает?
Дороговизна анонимных функций и вложенных функций прежде всего в потреблении памяти.
Не потребляет память тот, кто ничего не пишет))
0
24
5 лет назад
0
Почему у меня не сжирает?
Может потому что ты его не вызываешь вруную, а по дефолту он в варе то ли отключен то ли реагирует на очень высокие значения потребления памяти?
1
29
5 лет назад
1
Может потому что ты его не вызываешь вруную, а по дефолту он в варе то ли отключен то ли реагирует на очень высокие значения потребления памяти?
А нечего его вручную вызывать, он ещё и таймеры убивает
local InitGlobalsOrigin = InitGlobals
function InitGlobals()
	InitGlobalsOrigin()
	TimerStart(CreateTimer(), 1, true, function()
		collectgarbage() -- После вызова этот таймер больше никогда не сработает
		print('garbage')
	end)
end
1
24
5 лет назад
1
NazarPunk, нечего создавать анонимные таймеры. А сборщик мусора вызывать придется чтобы не погрязать в мусоре, либо он сам рано или поздно вызовется если у него настроены условия срабатывания и они выполнятся.

Это странно, кстати - нативные обьекты вроде не должны полностью убиваться сборщиком мусора, только ссылки на них... Что-то близы хитрое сделали.
0
28
5 лет назад
0
Тем временем, случайно обнаружилась одна из проблем создания триггеров до инициализации
А если не вызывать вручную, то события работают?
0
24
5 лет назад
Отредактирован prog
0
PT153, я ни разу не смог довести его до автоматического срабатывания на стандартных настройках, но я и не сильно старался - при автоматическом срабатывании тоже умрут с вероятностью 99%. А так - да, работают, почему бы им не работать, если их никто не пытается удалить как мусор.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.