Алгоритмы, Наработки и Способности
Способ реализации:
Jass
Тип:
Способность
Версия Warcraft:
1.26
Ursa Warrior прямо из доты 6.83d
Если нету JNGP, то надо использовать триггеры из карты где все написано на Jass.
+ после переноса способностей/бафов надо заново прописать всё что перенесли. Прописывать нужно в Init триггерах
+ способность Overpower AddBuff использует заклинание Overpower (нужно будет после переноса заново указать, вместо "Неизвестно B0CH")
+ способность Overpower Container использует способность Overpower FX (нужно будет после переноса заново указать, вместо "Неизвестно A1N5")
+ способность Earthshock не имеет никаких триггеров
Если есть JNGP, то можно сразу скопировать библиотеку со скиллами урсы и грамотно перенести все абилки и бафы, в слове "грамотно" я имел в виду перенести всё так чтобы равкоды не поменялись
+ если ошибки с равкодами всё же появились, то можно их заново прописать в константах библиотеки
vJass
globals
    hashtable udg_dotaHash  = InitHashtable()
    timer     udg_dotaTimer = CreateTimer()
endglobals

library DotA initializer DotaInit    

    private function DotaInit takes nothing returns nothing
        call TimerStart( udg_dotaTimer, 99999.00, false, null )
    endfunction
    
endlibrary
    
library UrsaWarrior initializer InitUrsa
    
    globals
        
        private integer array EnrageAddDamage
        private integer array FurySwipesAddDamage
        
        //Overpower
        private constant integer OverpowerAbility   = 'A1P9' //Основная способность Overpower
        private constant integer OverpowerSpeed     = 'A1N3' //Способность на увеличение скорости
        private constant integer OverpowerContainer = 'A1N6' //Контейнер
        private constant integer OverpowerAddBuff   = 'A1N7' //Способность добавляющая бафф
        private constant integer OverpowerBuff      = 'B0CH' //Бафф
        
        //FurySwipes
        private constant integer FurySwipesAbility  = 'A2X2' //Основная способность FurySwipes
        
        //Enrage
        private constant integer EnrageAbility      = 'A0LC' //Основная способность Enrage
        private constant integer EnrageBuff         = 'B02H' //Бафф
        
        //Marker
        private constant integer Marker             = 'A04R' //Некоторые Jass способности в доте игнорируют юнитов с этой способностью, обычно ее дают вардам        
        
    endglobals
    
    private function InitDamage takes nothing returns nothing
    
        set EnrageAddDamage[0] = 'A17F' // DamageBonusSystem - 1
        set EnrageAddDamage[1] = 'A17G' // DamageBonusSystem - 2
        set EnrageAddDamage[2] = 'A17H' // DamageBonusSystem - 4
        set EnrageAddDamage[3] = 'A17C' // DamageBonusSystem - 8
        set EnrageAddDamage[4] = 'A17D' // DamageBonusSystem - 16
        set EnrageAddDamage[5] = 'A17E' // DamageBonusSystem - 32
        set EnrageAddDamage[6] = 'A17J' // DamageBonusSystem - 64
        set EnrageAddDamage[7] = 'A17I' // DamageBonusSystem - 128
        set EnrageAddDamage[8] = 'A17L' // DamageBonusSystem - 256
      
        set FurySwipesAddDamage[0] = 'A2XY' // DamageBonusSystem 2 - 1
        set FurySwipesAddDamage[1] = 'A2XX' // DamageBonusSystem 2 - 2     
        set FurySwipesAddDamage[2] = 'A2XW' // DamageBonusSystem 2 - 4     
        set FurySwipesAddDamage[3] = 'A2XV' // DamageBonusSystem 2 - 8    
        set FurySwipesAddDamage[4] = 'A2Y2' // DamageBonusSystem 2 - 16 
        set FurySwipesAddDamage[5] = 'A2Y0' // DamageBonusSystem 2 - 32
        set FurySwipesAddDamage[6] = 'A2Y1' // DamageBonusSystem 2 - 64
        set FurySwipesAddDamage[7] = 'A2XZ' // DamageBonusSystem 2 - 128
        set FurySwipesAddDamage[8] = 'A2Y3' // DamageBonusSystem 2 - 256
        
    endfunction
    
    private function AnyUnitEvent takes trigger trg, playerunitevent whichEvent returns nothing

        local integer i = 0
    
        loop
            call TriggerRegisterPlayerUnitEvent( trg, Player(i), whichEvent, null )
            set i = i+1
            exitwhen i == 16
        endloop
    
    endfunction
    
    private function DestroyTriggerEx takes trigger trg returns nothing

        call DisableTrigger( trg )
        call TriggerClearActions( trg )
        call TriggerClearConditions( trg )
        call DestroyTrigger( trg )

    endfunction
    
    private function CheckAbility takes integer i returns boolean
    
        //Здесь нужно указывать любые способности которые могут сбить Enrage или подобные способности
        //Пример: 
        //return i = 'A000' or i = 'A001' or i = 'A002'
        return false
        
    endfunction
    
    //Overpower
        private function Overpower_AddAbility takes unit u, integer i returns nothing

            call UnitAddAbility( u, i )
            call UnitMakeAbilityPermanent( u, true, i )
    
        endfunction

        private function Overpower_Speed takes nothing returns boolean

            local trigger trg          = GetTriggeringTrigger()
            local integer trgH         = GetHandleId( trg )
            local unit    u            = LoadUnitHandle( udg_dotaHash, trgH, 2 )
            local integer i_abilityLvl = LoadInteger( udg_dotaHash, trgH, 5 )
            local integer i            = LoadInteger( udg_dotaHash, trgH, 34 )
            local integer i_2          = 2+i_abilityLvl
    
            if GetTriggerEventId() == EVENT_UNIT_DEATH then
                call UnitRemoveAbility( u, OverpowerSpeed )
                call UnitRemoveAbility( u, OverpowerContainer )
                call UnitRemoveAbility( u, OverpowerAddBuff )
                call UnitRemoveAbility( u, OverpowerBuff )
                call FlushChildHashtable( udg_dotaHash, trgH )
                call DestroyTriggerEx( trg )
            elseif GetTriggerEventId() == EVENT_PLAYER_UNIT_ATTACKED then
                if GetAttacker() == u then
                    set i = i+1
                    call SaveInteger( udg_dotaHash, trgH, 34, i )
                    if i >= i_2 then
                        call UnitRemoveAbility( u, OverpowerSpeed )
                        call UnitRemoveAbility( u, OverpowerContainer )
                        call UnitRemoveAbility( u, OverpowerAddBuff )
                        call UnitRemoveAbility( u, OverpowerBuff )
                        call FlushChildHashtable( udg_dotaHash, trgH )
                        call DestroyTriggerEx( trg )
                    endif
                endif
            elseif GetTriggerEventId() == EVENT_PLAYER_UNIT_SPELL_EFFECT then
                if GetTriggerUnit() == u and GetSpellAbilityId() == OverpowerAbility and TimerGetElapsed(udg_dotaTimer) > LoadReal( udg_dotaHash, trgH, 442 ) then
                    call FlushChildHashtable( udg_dotaHash, trgH )
                    call DestroyTriggerEx( trg )
                elseif CheckAbility( GetSpellAbilityId() )and u == GetSpellTargetUnit() then
                    call UnitRemoveAbility( u, OverpowerSpeed )
                    call UnitRemoveAbility( u, OverpowerContainer )
                    call UnitRemoveAbility( u, OverpowerAddBuff )
                    call UnitRemoveAbility( u, OverpowerBuff )
                    call FlushChildHashtable( udg_dotaHash, trgH )
                    call DestroyTriggerEx( trg )
                endif
            else
                call UnitRemoveAbility( u, OverpowerSpeed )
                call UnitRemoveAbility( u, OverpowerContainer )
                call UnitRemoveAbility( u, OverpowerAddBuff )
                call UnitRemoveAbility( u, OverpowerBuff )
                call FlushChildHashtable( udg_dotaHash, trgH )
                call DestroyTriggerEx( trg )
            endif
    
            set trg = null
            set u   = null
    
            return false
    
        endfunction

        private function Overpower_Actions takes nothing returns nothing

            local trigger trg          = CreateTrigger()
            local integer trgH         = GetHandleId( trg )
            local unit    u            = GetTriggerUnit()
            local integer i_abilityLvl = GetUnitAbilityLevel( u, OverpowerAbility )
    
            call Overpower_AddAbility( u, OverpowerSpeed )
            call Overpower_AddAbility( u, OverpowerContainer )
            call Overpower_AddAbility( u, OverpowerAddBuff )
            call SetPlayerAbilityAvailable( GetOwningPlayer( u ), OverpowerContainer, false )
            call TriggerRegisterTimerEvent( trg, 15, false )
            call AnyUnitEvent( trg, EVENT_PLAYER_UNIT_ATTACKED )
            call TriggerRegisterUnitEvent( trg, u, EVENT_UNIT_DEATH )
            call AnyUnitEvent( trg, EVENT_PLAYER_UNIT_SPELL_EFFECT )
            call TriggerAddCondition( trg, Condition( function Overpower_Speed ) )
            call SaveUnitHandle( udg_dotaHash, trgH, 2, u )
            call SaveInteger( udg_dotaHash, trgH, 34, 0 )
            call SaveInteger( udg_dotaHash, trgH, 5, i_abilityLvl )
            call SaveReal( udg_dotaHash, trgH, 442, ( TimerGetElapsed(udg_dotaTimer)+1 )*1.0 )
    
            set trg = null
            set u   = null
    
        endfunction

        private function Overpower_Conditions takes nothing returns boolean

            if GetSpellAbilityId() == OverpowerAbility then
                call Overpower_Actions()
            endif
            return false
    
        endfunction

        private function InitOverpower takes nothing returns nothing

            local trigger Overpower = CreateTrigger()
    
            call AnyUnitEvent( Overpower, EVENT_PLAYER_UNIT_SPELL_EFFECT )
            call TriggerAddCondition( Overpower, Condition( function Overpower_Conditions ) )
            
            set Overpower = null
  
        endfunction
    //Overpower end
    
    //FurySwipes
        private function BonusDamage_FurySwipes takes unit u, integer i_damage returns nothing

            local integer array arrayInt
            local integer       i_Convert1 = i_damage
            local integer       i_Convert2 = 1
            local integer       i          = 0
            local integer       i_End
    
            if i_damage < 1 then
                call UnitRemoveAbility( u, FurySwipesAddDamage[0] )
                call UnitRemoveAbility( u, FurySwipesAddDamage[1] )
                call UnitRemoveAbility( u, FurySwipesAddDamage[2] )
                call UnitRemoveAbility( u, FurySwipesAddDamage[3] )
                call UnitRemoveAbility( u, FurySwipesAddDamage[4] )
                call UnitRemoveAbility( u, FurySwipesAddDamage[5] )
                call UnitRemoveAbility( u, FurySwipesAddDamage[6] )
                call UnitRemoveAbility( u, FurySwipesAddDamage[7] )
                call UnitRemoveAbility( u, FurySwipesAddDamage[8] )
                return
            endif
    
            loop
                exitwhen i_Convert2 == 0
                set i_Convert2  = i_Convert1/2
                set arrayInt[i] = i_Convert1-i_Convert2*2
                set i_Convert1  = i_Convert2
                set i = i+1
            endloop
    
            set i_End = 8
            set i     = 0
            loop
                exitwhen i > i_End
                if arrayInt[i] == 1 then
                    call UnitAddAbility( u, FurySwipesAddDamage[i] )
                else
                    call UnitRemoveAbility( u,FurySwipesAddDamage[i] )
                endif
                set i = i+1
            endloop
    
        endfunction

        private function FurySwipes_Attack_Flag2 takes nothing returns boolean

            local trigger trg = GetTriggeringTrigger()
            local integer i   = GetHandleId( trg )
    
            call SaveInteger( udg_dotaHash, GetHandleId( LoadUnitHandle(udg_dotaHash, i, 14) ), LoadInteger( udg_dotaHash, i, 33 ), 2 )
            call FlushChildHashtable( udg_dotaHash, i )
            call DestroyTriggerEx( trg )
    
            set trg = null
    
            return false
    
        endfunction

        private function FurySwipes_Attack_Flag takes unit u, integer i, real r returns nothing

            local trigger trg = CreateTrigger()
    
            call TriggerAddCondition( trg, Condition( function FurySwipes_Attack_Flag2 ) )
            call TriggerRegisterTimerEvent( trg, r, false )
            call SaveInteger( udg_dotaHash, GetHandleId( u ), i, 1 )
            call SaveUnitHandle( udg_dotaHash, GetHandleId( trg ), 14, u )
            call SaveInteger( udg_dotaHash, GetHandleId( trg ), 33, i )
    
            set trg = null
    
        endfunction

        private function FurySwipes_AddDamage_Actions takes nothing returns boolean

            local trigger trg = GetTriggeringTrigger()
            local integer i   = GetHandleId( trg )
            local unit    u   = LoadUnitHandle( udg_dotaHash, i, 2 )
    
            call FlushChildHashtable( udg_dotaHash, i )
            call DestroyTriggerEx( trg )
            call BonusDamage_FurySwipes( u, 0 )
    
            set u = null
    
            return false
    
        endfunction

        private function FurySwipes_UnitAttacked_Actions takes nothing returns nothing

            local trigger trg          = GetTriggeringTrigger()
            local integer trgH         = GetHandleId( trg )
            local unit    trgAttacker  = LoadUnitHandle( udg_dotaHash, trgH, 2 )
            local unit    trgTarget    = LoadUnitHandle( udg_dotaHash, trgH, 17 )
            local integer i_Target     = LoadInteger( udg_dotaHash, GetHandleId( trgTarget ), 824 )
            local real    r_Target     = LoadReal( udg_dotaHash, GetHandleId( trgTarget ), 825 )
            local integer i_AbilityLvl = GetUnitAbilityLevel( trgAttacker, FurySwipesAbility )
    
            if GetTriggerEventId() == EVENT_WIDGET_DEATH or r_Target < TimerGetElapsed(udg_dotaTimer) then
                call SaveInteger( udg_dotaHash, GetHandleId( trgTarget ), 824, 0 )
                call DestroyEffect( LoadEffectHandle( udg_dotaHash, trgH, 175 ) )
                call FlushChildHashtable( udg_dotaHash, trgH )
                call DestroyTriggerEx( trg )
            elseif GetTriggerEventId() == EVENT_UNIT_ATTACKED then
                set trg  = CreateTrigger()
                set trgH = GetHandleId( trg )
                call TriggerRegisterTimerEvent( trg, 0.31, true )
                call TriggerAddCondition( trg, Condition( function FurySwipes_AddDamage_Actions ) )
                call SaveUnitHandle( udg_dotaHash, trgH, 2, trgAttacker )
                call BonusDamage_FurySwipes( trgAttacker, IMinBJ( (10+5*i_AbilityLvl)*i_Target, 500 ) )
            endif
    
            set trg         = null
            set trgAttacker = null
            set trgTarget   = null
    
        endfunction

        private function FurySwipes_UnitAttacked_Conditions takes nothing returns boolean

            if GetTriggerEventId()!= EVENT_UNIT_ATTACKED then
                call FurySwipes_UnitAttacked_Actions()
            endif
            if GetAttacker() == LoadUnitHandle( udg_dotaHash, GetHandleId( GetTriggeringTrigger() ), 2 ) then
                call FurySwipes_UnitAttacked_Actions()
            endif
            return false
    
        endfunction

        private function FurySwipes_UnitDamaged_Actions takes unit attacker, unit target returns nothing

            local trigger trg
            local integer trgH
            local integer i_Target   = LoadInteger( udg_dotaHash, GetHandleId( target ), 824 )
            local integer i_Attacker = GetUnitAbilityLevel( attacker, FurySwipesAbility )
    
            call SaveInteger( udg_dotaHash, GetHandleId( target ), 824, i_Target+1 )
            call SaveReal( udg_dotaHash, GetHandleId( target ), 825, ( TimerGetElapsed(udg_dotaTimer)+15 )*1.0 )
            if i_Target == 0 then
                set trg  = CreateTrigger()
                set trgH = GetHandleId( trg )
                call SaveEffectHandle( udg_dotaHash, trgH, 175, AddSpecialEffectTarget("Abilities\\Spells\\NightElf\\BattleRoar\\RoarTarget.mdl", target, "overhead") )
                call SaveUnitHandle( udg_dotaHash, trgH, 2, attacker )
                call SaveUnitHandle( udg_dotaHash, trgH, 17, target )
                call TriggerRegisterUnitEvent( trg, target, EVENT_UNIT_ATTACKED )
                call TriggerRegisterDeathEvent( trg, target )
                call TriggerRegisterTimerEvent( trg, 1, true )
                call TriggerAddCondition( trg, Condition( function FurySwipes_UnitAttacked_Conditions ) )
                call SaveInteger( udg_dotaHash, GetHandleId( target ), 824, 2 )
                set trg  = CreateTrigger()
                set trgH = GetHandleId( trg )
                call TriggerRegisterTimerEvent( trg, 0.31, true )
                call TriggerAddCondition( trg, Condition( function FurySwipes_AddDamage_Actions ) )
                call SaveUnitHandle( udg_dotaHash, trgH, 2, attacker )
                call BonusDamage_FurySwipes( attacker, IMinBJ( (10+5*i_Attacker), 500 ) )
            endif
    
            set trg=null
    
        endfunction

        private function FurySwipes_UnitDamaged_Conditions takes nothing returns boolean

            local trigger trg      = GetTriggeringTrigger()
            local integer trgH     = GetHandleId( trg )
            local unit    attacker = LoadUnitHandle( udg_dotaHash, trgH, 2 )
            local unit    target   = LoadUnitHandle( udg_dotaHash, trgH, 17 )
    
            if GetTriggerEventId() == EVENT_UNIT_DAMAGED then
                if GetEventDamageSource() == attacker then
                    call DisableTrigger( trg )
                    call FurySwipes_UnitDamaged_Actions( attacker, target )
                    call FlushChildHashtable( udg_dotaHash, trgH )
                    call DestroyTriggerEx( trg )
                endif
            else
                call FlushChildHashtable( udg_dotaHash, trgH )
                call DestroyTriggerEx( trg )
            endif
    
            set trg      = null
            set attacker = null
            set target   = null
    
            return false
    
        endfunction

        private function FurySwipes_UnitDamaged takes nothing returns nothing

            local trigger trg      = CreateTrigger()
            local unit    target   = GetTriggerUnit()
            local unit    attacker = GetAttacker()
            local integer trgH     = GetHandleId( trg )
    
            call TriggerRegisterUnitEvent( trg, target, EVENT_UNIT_DAMAGED )
            call TriggerRegisterTimerEvent( trg, 1, false )
            call TriggerAddCondition( trg, Condition( function FurySwipes_UnitDamaged_Conditions ) )
            call SaveUnitHandle( udg_dotaHash, trgH, 2, attacker )
            call SaveUnitHandle( udg_dotaHash, trgH, 17, target )
    
            set target   = null
            set attacker = null
            set trg      = null
    
        endfunction

        private function FurySwipes_Attack_Start takes nothing returns nothing

            local unit u = GetAttacker()
    
            if LoadInteger( udg_dotaHash, GetHandleId( u ), 4274 ) != 1 then
                call FurySwipes_Attack_Flag( u, 4274, 0.2 )
                call FurySwipes_UnitDamaged()
            endif
    
            set u = null
    
        endfunction

        private function FurySwipes_Attack_Condition takes nothing returns boolean
    
            if GetUnitAbilityLevel( GetAttacker(), FurySwipesAbility ) > 0 and IsUnitType( GetTriggerUnit(), UNIT_TYPE_STRUCTURE ) == false and GetAttacker() == LoadUnitHandle( udg_dotaHash, GetHandleId( GetTriggeringTrigger() ), 14 ) and IsUnitEnemy( GetTriggerUnit(), GetOwningPlayer( GetAttacker() ) ) then
                call FurySwipes_Attack_Start()
            endif
    
            return false
    
        endfunction

        private function FurySwipes_Attack takes nothing returns nothing
    
            local trigger trg = CreateTrigger()
    
            call AnyUnitEvent( trg, EVENT_PLAYER_UNIT_ATTACKED )
            call TriggerAddCondition( trg, Condition( function FurySwipes_Attack_Condition ) )
            call SaveUnitHandle( udg_dotaHash, GetHandleId( trg ), 14, GetTriggerUnit() )
    
            set trg = null
    
        endfunction

        private function FurySwipes_Conditions takes nothing returns boolean

            if GetLearnedSkill() == FurySwipesAbility and IsUnitIllusion( GetTriggerUnit() ) == false and GetUnitAbilityLevel( GetTriggerUnit(), FurySwipesAbility ) == 1 then
                call FurySwipes_Attack()
            endif
    
            return false
    
        endfunction

        //===========================================================================
        private function InitFurySwipes takes nothing returns nothing

            local trigger FurySwipes = CreateTrigger()
            
            call AnyUnitEvent( FurySwipes, EVENT_PLAYER_HERO_SKILL )
            call TriggerAddCondition( FurySwipes, Condition( function FurySwipes_Conditions ) )
            
            set FurySwipes = null

        endfunction
    //FurySwipes end

    //Enrage
        private function BonusDamage_Enrage takes unit u, integer i_damage returns nothing

            local integer array arrayInt
            local integer       i_Convert1 = i_damage
            local integer       i_Convert2 = 1
            local integer       i          = 0
            local integer       i_End
    
            if i_damage < 1 then
                call UnitRemoveAbility( u, EnrageAddDamage[0] )
                call UnitRemoveAbility( u, EnrageAddDamage[1] )
                call UnitRemoveAbility( u, EnrageAddDamage[2] )
                call UnitRemoveAbility( u, EnrageAddDamage[3] )
                call UnitRemoveAbility( u, EnrageAddDamage[4] )
                call UnitRemoveAbility( u, EnrageAddDamage[5] )
                call UnitRemoveAbility( u, EnrageAddDamage[6] )
                call UnitRemoveAbility( u, EnrageAddDamage[7] )
                call UnitRemoveAbility( u, EnrageAddDamage[8] )
                return
            endif
    
            loop
                exitwhen i_Convert2 == 0
                set i_Convert2  = i_Convert1/2
                set arrayInt[i] = i_Convert1-i_Convert2*2
                set i_Convert1  = i_Convert2
                set i = i+1
            endloop
    
            set i_End = 8
            set i     = 0
            loop
                exitwhen i > i_End
                if arrayInt[i] == 1 then
                    call UnitAddAbility( u, EnrageAddDamage[i] )
                else
                    call UnitRemoveAbility( u, EnrageAddDamage[i] )
                endif
                set i = i+1
            endloop
    
        endfunction

        private function Enrage_AddDamage takes nothing returns boolean

            local trigger trg          = GetTriggeringTrigger()
            local integer trgH         = GetHandleId( trg )
            local unit    u            = LoadUnitHandle( udg_dotaHash, trgH, 2 )
            local integer i_AbilityLvl = GetUnitAbilityLevel( u, EnrageAbility )
            local integer damageBonus
            local integer i_loadDamage
    
            if GetTriggerEventId() == EVENT_UNIT_DEATH or GetUnitAbilityLevel( u, EnrageBuff ) == 0 or( GetTriggerEventId() == EVENT_PLAYER_UNIT_SPELL_EFFECT and u == GetSpellTargetUnit() and CheckAbility( GetSpellAbilityId() ) ) then
                call FlushChildHashtable( udg_dotaHash, trgH )
                call DestroyTriggerEx( trg )
                call UnitRemoveAbility( u, EnrageBuff )
                call BonusDamage_Enrage( u, 0 )
            else
                set damageBonus  = R2I( GetUnitState( u, UNIT_STATE_LIFE )*(0.04+0.01*i_AbilityLvl) )
                set i_loadDamage = LoadInteger( udg_dotaHash, trgH, 238 )
                if damageBonus != i_loadDamage then
                    call SaveInteger( udg_dotaHash, trgH, 238, damageBonus )
                    call BonusDamage_Enrage( u, damageBonus )
                endif
            endif
    
            set trg = null
            set u   = null
    
            return false
    
        endfunction

        private function Enrage_Actions takes nothing returns nothing

            local trigger trg  = CreateTrigger()
            local integer trgH = GetHandleId( trg )
    
            call TriggerRegisterTimerEvent( trg, 0.25, true )
            call TriggerRegisterUnitEvent( trg, GetTriggerUnit(), EVENT_UNIT_DEATH )
            call AnyUnitEvent( trg, EVENT_PLAYER_UNIT_SPELL_EFFECT )
            call TriggerAddCondition( trg, Condition( function Enrage_AddDamage ) )
            call SaveUnitHandle( udg_dotaHash, trgH, 2, GetTriggerUnit() )
            call SaveInteger( udg_dotaHash, trgH, 238, 0 )
    
            set trg = null
    
        endfunction

        private function Enrage_Conditions takes nothing returns boolean

            if GetSpellAbilityId() == EnrageAbility then
                call Enrage_Actions()
            endif
            return false
    
        endfunction

        private function Enrage2_Conditions takes nothing returns boolean

            if GetUnitAbilityLevel( GetAttacker(), EnrageBuff ) > 0 and IsUnitType( GetTriggerUnit(), UNIT_TYPE_STRUCTURE ) == false and IsUnitAlly( GetTriggerUnit(), GetOwningPlayer( GetAttacker() ) ) == false and GetUnitAbilityLevel( GetTriggerUnit(), Marker ) == 0 then
            endif
    
            return false
    
        endfunction

        //===========================================================================
        private function InitEnrage takes nothing returns nothing

            local trigger trg = CreateTrigger() 
    
            call AnyUnitEvent( trg, EVENT_PLAYER_UNIT_SPELL_EFFECT )
            call TriggerAddCondition( trg, Condition( function Enrage_Conditions ) )
    
            set trg = CreateTrigger()
    
            call AnyUnitEvent( trg, EVENT_PLAYER_UNIT_ATTACKED )
            call TriggerAddCondition( trg, Condition( function Enrage2_Conditions ) )
    
            set trg = null
    
        endfunction
    //Enrage end
    
    private function InitUrsa takes nothing returns nothing
      
        call InitDamage()
        
        call InitOverpower()
        
        call InitFurySwipes()
        
        call InitEnrage()
        
    endfunction
    
    
endlibrary
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
28
6 лет назад
0
вынеси все равкоды в константы/дефайны в самое начало библиотеки и добавь комментарии к ним
0
18
6 лет назад
0
nvc123
сделал
3
32
6 лет назад
3
Триггеры лучше просто так не удалять, а с задержой как у фрога, я эту систему выкладывал.
Потом ClearAction и ClearConditions не удаляют сами хендлы условий и дейсвий, если с условием пофиг, т.к оно зависает в болекспре и не утекает, то TriggerAddAction( trg, function name) будет возвращать каждый раз новый хендл, что есть утечка, нужно сохранять экшены триггеров в переменную а затем удалять действием TriggerRemoveAction, иначе будут плодится утечки или как фрог все действия делать в кондишенах, там из отличий только лимит операций поменьше и вейты не работают с синками.
0
18
6 лет назад
Отредактирован Hodor
0
quq_CCCP:
Триггеры лучше просто так не удалять, а с задержой как у фрога, я эту систему выкладывал.
Потом ClearAction и ClearConditions не удаляют сами хендлы условий и дейсвий, если с условием пофиг, т.к оно зависает в болекспре и не утекает, то TriggerAddAction( trg, function name) будет возвращать каждый раз новый хендл, что есть утечка, нужно сохранять экшены триггеров в переменную а затем удалять действием TriggerRemoveAction, иначе будут плодится утечки или как фрог все действия делать в кондишенах, там из отличий только лимит операций поменьше и вейты не работают с синками.
Я когда увидел функцию на удаление триггера, сначала нифига не понял и сделал так.
Ладно, ща сделаю как у фрога. Я там код бары готовлю
1
18
5 лет назад
Отредактирован Hodor
1
Вот думаю, может быть ещё какого нибудь героя из доты сделать
Чтобы оставить комментарий, пожалуйста, войдите на сайт.