Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Jass
Тип:
Способность
Bloodrage сикера из доты 6.83с с восстановленными именами функций и переменных.
код скилла
function StopUnit takes unit whichUnit returns nothing //остановка юнита
    call PauseUnit( whichUnit, true )
    call IssueImmediateOrder( whichUnit, "stop" )
    call PauseUnit( whichUnit, false )
endfunction

function Error takes player p, string s returns nothing             //эмуляция игровой ошибки
    local sound m = CreateSoundFromLabel( "InterfaceError", false, false, false, 10, 10 )

    if ( GetLocalPlayer( ) == p ) then
        if ( s != "" ) and ( p != null ) then
            call ClearTextMessages( )
            call DisplayTimedTextToPlayer( p, 0.50, -1.00, 2.00, "|cffffcc00" + s + "|r" )
            call StartSound( m )
        endif
    endif
    call KillSoundWhenDone( m )

    set m = null
endfunction

function IsUnitDead takes unit u returns boolean
    return IsUnitType( u, UNIT_TYPE_DEAD ) or GetUnitTypeId( u ) < 1
endfunction

function BloodRage_Filter takes nothing returns boolean             // фильтр для группы, не здания, живые и без скилла 'A04R' (маркер курьера и осадных войск)
    return GetUnitAbilityLevel( GetFilterUnit( ), 'A04R' ) == 0 and IsUnitType( GetFilterUnit( ), UNIT_TYPE_STRUCTURE ) == false and IsUnitDead( GetFilterUnit( ) ) == false
endfunction 

function IsUnitHasNegation takes unit whichUnit returns boolean     // фунция проверки если у цели Linken Sphere или аналоги
    return GetUnitAbilityLevel( whichUnit, 'B0BI' ) > 0 or GetUnitAbilityLevel( whichUnit, 'BNss' ) > 0 or GetUnitAbilityLevel( whichUnit, 'B0EV' ) > 0
    // 'BNss' - Защита, бафф руны защиты из компании (аналог линки).
    // 'BOBI' - Linken Sphere, бафф линкен сферы.
    // 'B0EV'- Retaliation (в игре не встречается)
endfunction


function Trig_BloodRageEffect_Actions takes nothing returns boolean
    local trigger TempTrigger = GetTriggeringTrigger( )
    local integer id = GetHandleId( TempTrigger )
    local unit BloodSeeker = ( LoadUnitHandle( udg__htb_DATA, ( id ), ( 2 ) ) )
    local unit Target = ( LoadUnitHandle( udg__htb_DATA, ( id ), ( 17 ) ) )
    local integer RageLevel = GetUnitAbilityLevel( BloodSeeker, 'A311' )
    
    if GetTriggerEventId( ) == EVENT_UNIT_DAMAGED then
        if udg_IsDamaged and( Target == GetEventDamageSource( )or Target == GetTriggerUnit( ) ) then
            set udg_IsDamaged = false
            call P6I( GetEventDamageSource( ), GetTriggerUnit( ), 3, GetEventDamage( ) * ( 20 + 5 * RageLevel ) / 100 ) //P6I функция нанесения урона
            set udg_IsDamaged = true
        endif
    elseif GetTriggerEventId( ) == EVENT_UNIT_DEATH then
    
        if GetKillingUnit( ) == Target or GetTriggerUnit( ) == Target then
            call SetUnitState( GetKillingUnit( ), UNIT_STATE_LIFE, GetUnitState( GetTriggerUnit( ), UNIT_STATE_MAX_LIFE ) * 0.25 + GetUnitState( GetKillingUnit( ), UNIT_STATE_LIFE ) )
            call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Spells\\Undead\\VampiricAura\\VampiricAuraTarget.mdl", GetKillingUnit( ), "origin" ) )
        elseif GetOwningPlayer( GetKillingUnit( ) ) == GetOwningPlayer( Target )and GetUnitAbilityLevel( GetKillingUnit( ), 'A04R' ) > 0 then
            call SetUnitState( Target, UNIT_STATE_LIFE, GetUnitState( Target, UNIT_STATE_MAX_LIFE ) * 0.25 + GetUnitState( Target, UNIT_STATE_LIFE ) )
            call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Spells\\Undead\\VampiricAura\\VampiricAuraTarget.mdl", Target, "origin" ) )
        endif
        
        if GetTriggerUnit( ) == Target then
            call DestroyEffect( ( LoadEffectHandle( udg__htb_DATA, ( id ), ( 175 ) ) ) )
            call DestroyEffect( ( LoadEffectHandle( udg__htb_DATA, ( id ), ( 176 ) ) ) )
            call FlushChildHashtable( udg__htb_DATA, ( id ) )
            call DestroyTrigger( TempTrigger ) //в оригинале используется функция SOI(...) из отдельной системы удаления триггеров
        endif
    else
        call DestroyEffect( ( LoadEffectHandle( udg__htb_DATA, ( id ), ( 175 ) ) ) )
        call DestroyEffect( ( LoadEffectHandle( udg__htb_DATA, ( id ), ( 176 ) ) ) )
        call FlushChildHashtable( udg__htb_DATA, ( id ) )
        call DestroyTrigger( TempTrigger )
    endif
    set TempTrigger = null
    set BloodSeeker = null
    set Target = null
    return false
endfunction

function Trig_Bloodrage_Actions takes nothing returns nothing
    local unit BloodSeeker = GetTriggerUnit( )
    local unit Target = GetSpellTargetUnit( )
    local unit dummy = CreateUnit( GetOwningPlayer( Target ), 'e00E', GetUnitX( Target ), GetUnitY( Target ), 0 )
    local trigger TempTrigger = CreateTrigger( )
    local integer id = GetHandleId( TempTrigger )
    local group grp = CreateGroup() // в оригинале используется функция NTI(...) из отдельной системы создания и удаления групп
    local integer RageLevel = GetUnitAbilityLevel( BloodSeeker, 'A311' )
    local unit TempUnit
    call TriggerRegisterTimerEvent( TempTrigger, 8 + RageLevel, false )
    call TriggerAddCondition( TempTrigger, Condition( function Trig_BloodRageEffect_Actions ) )
    call SaveUnitHandle( udg__htb_DATA, ( id ), ( 2 ), ( BloodSeeker ) )
    call SaveUnitHandle( udg__htb_DATA, ( id ), ( 17 ), ( Target ) )
    call SaveEffectHandle( udg__htb_DATA, ( id ), ( 175 ), ( AddSpecialEffectTarget( "Abilities\\Spells\\Orc\\TrollBerserk\\HeadhunterWEAPONSLeft.mdl", Target, "hand,right" ) ) )
    call SaveEffectHandle( udg__htb_DATA, ( id ), ( 176 ), ( AddSpecialEffectTarget( "Abilities\\Spells\\Orc\\TrollBerserk\\HeadhunterWEAPONSLeft.mdl", Target, "hand,left" ) ) )
    call GroupEnumUnitsInRange( grp, 0, 0, 99999, Condition( function BloodRage_Filter ) )
    loop
        set TempUnit = FirstOfGroup( grp )
        exitwhen TempUnit == null
        call GroupRemoveUnit( grp, TempUnit )
        call TriggerRegisterUnitEvent( TempTrigger, TempUnit, EVENT_UNIT_DAMAGED )
        call TriggerRegisterUnitEvent( TempTrigger, TempUnit, EVENT_UNIT_DEATH )
    endloop
    
    call DestroyGroup( grp ) // в оригинале используется функция NTI(...) из отдельной системы создания и удаления групп
    
    set TempUnit = null
    set TempTrigger = null
    set BloodSeeker = null
    set Target = null
    set grp = null
endfunction

function Trig_Bloodrage_Conditions takes nothing returns boolean // проверка кастера и бафов цели

    if GetSpellAbilityId( ) == 'A311' and IsUnitType( GetTriggerUnit( ), UNIT_TYPE_HERO ) == true then
  
        if IsUnitEnemy( GetSpellTargetUnit( ), GetOwningPlayer( GetTriggerUnit( ) ) ) == false or IsUnitHasNegation( GetSpellTargetUnit( ) ) == false then
            call Trig_Bloodrage_Actions( ) 
        endif
        
    endif
    return false
endfunction

function Trig_Bloodrage_Cast_Conditions takes nothing returns boolean // проверка на -DisableHelp
    if GetSpellAbilityId( ) == 'A311' and IsUnitType( GetTriggerUnit( ), UNIT_TYPE_HERO ) == true and GetSpellTargetUnit( ) != GetTriggerUnit( )and IsUnitAlly( GetSpellTargetUnit( ), GetOwningPlayer( GetTriggerUnit( ) ) )and( LoadBoolean( udg__htb_DATA, ( GetHandleId( GetOwningPlayer( GetSpellTargetUnit( ) ) ) ), ( 139 ) ) ) then
        call StopUnit( GetTriggerUnit( ) )
        call Error( GetOwningPlayer( GetTriggerUnit( ) ), "Этот игрок не хочет быть целью способностей союзников" ) // в оригинале GetObjectName( 'n038' )
    endif
    return false
endfunction

function InitTrig_Bloodrage takes nothing returns nothing // инициализация триггера, эта функция вызовется после старта карты
    
    local trigger TempTrigger = CreateTrigger( )
    call TriggerRegisterAnyUnitEventBJ( TempTrigger, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( TempTrigger, Condition( function Trig_Bloodrage_Cast_Conditions ) )
  
    set TempTrigger = CreateTrigger( )
    call TriggerRegisterAnyUnitEventBJ( TempTrigger, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( TempTrigger, Condition( function Trig_Bloodrage_Conditions ) )
  
    set TempTrigger = null
endfunction
Повышает урон от цели и по цели на 25%, 30%, 35%, 40% - в зависимости от уровня, но только урон от лица цели заклинания. Скилл не работает на скиллы которые используют дамми юнитов или саммонов.

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
30
9 лет назад
0
Ну и хрен с ним. Во второй увеличивается.
И, пожалуйста, перестань писать вот так......
Это очень сложно, я знаю........
0
32
9 лет назад
0
Clamp, ну он, больше небуду если это тебе так ненравится.
В том то и загвоздка, в д2 работает а в варкравте нет, 1 условие Фрог забыл поставить.
0
28
9 лет назад
0
А что значит "эмуляция игровой ошибки"?
0
30
9 лет назад
0
0
15
9 лет назад
0
quq_CCCP, очень жду оригинал кода Omnislash, другие способности же будут выложены?.
2
32
9 лет назад
Отредактирован quq_CCCP
2
Если хочешь выложу и омнислешь.
0
28
9 лет назад
0
Audes, quq_CCCP, омнислеш?
разве его не 100500 на сайте и форуме?
0
32
9 лет назад
0
nvc123:
Audes, quq_CCCP, омнислеш?
разве его не 100500 на сайте и форуме?
Есть, древний на гуи с вейтами и локейшенами, а так же пару кастом версий, заметно отличающихся от фрога...
0
15
9 лет назад
0
quq_CCCP, было бы шикарно, спасибо!
nvc123, много видел всяких, но они обычно косячные или не совсем такие.
0
32
9 лет назад
0
Audes, щяс добавлю, почти доделал там код, щяс тест мап закончу потом проверите...
Audes, ну все иди смотри...
0
13
9 лет назад
0
quq_CCCP, можешь вытащить код Boots of Travel и Town portal?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.