Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
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% - в зависимости от уровня, но только урон от лица цели заклинания. Скилл не работает на скиллы которые используют дамми юнитов или саммонов.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
2
23
9 лет назад
2
Работает так-то
Как ты понял, о чем речь?
0
32
9 лет назад
Отредактирован quq_CCCP
0
Ну оформлять отдельно
 	call PauseUnit( whichUnit, true )
    call IssueImmediateOrder( whichUnit, "stop" ) 
    call PauseUnit( whichUnit, false )
Как то расточительно, SetUnitPosition( u, GetUnitX(u), GetUnitY(u) ) собьет все приказы и не надо паузы.
'B0EV' - нефига подобного, у рошана Spell Shield, без баффа, там баф с зеленой иконкой как у щита банши из кампании...
В коде есть проверка на то что урон нанесли цели или от цели, все, если урон нанес даммик (ульт зевса давным давно сделан на дамми касте цепи молний)
0
30
9 лет назад
0
quq_CCCP, а ты проверь с зевсом.
0
32
9 лет назад
Отредактирован quq_CCCP
0
Щяс спецом выколупал его код, конечно тут я пока ничего не привел в нормальный вид
ульт зевса из доты

function CD4 takes nothing returns boolean
  return IsUnitType(GetFilterUnit(),UNIT_TYPE_HERO)==true and V51(GetUnitTypeId(GetFilterUnit()))==false and IsUnitEnemy(GetFilterUnit(),GetOwningPlayer(unit321))==true
endfunction

function CE4 takes nothing returns nothing
  local real loc_real01=GetUnitX(GetEnumUnit())

  local real loc_real02=GetUnitY(GetEnumUnit())
  local unit loc_unit01=CreateUnit(GetOwningPlayer(unit321),'e039',loc_real01,loc_real02,0)
  call UnitAddAbility(loc_unit01,'A05S')
  call SetUnitAbilityLevel(loc_unit01,'A05S',integer496)
  call IssueTargetOrder(loc_unit01,"chainlightning",GetEnumUnit())
  call UnitApplyTimedLife(loc_unit01,'BTLF',3)
  call UnitAddAbility(loc_unit01,'Aloc')
  set loc_unit01=null
endfunction

function CF4 takes nothing returns nothing
  local group loc_group01=NTI()
  set unit321=GetTriggerUnit()
  if GetSpellAbilityId()=='A29G' then
    set integer496=GetUnitAbilityLevel(GetTriggerUnit(),'A29G')+4
  else
    set integer496=GetUnitAbilityLevel(GetTriggerUnit(),'A29H')+7
  endif
  call GroupEnumUnitsInRect(loc_group01,bj_mapInitialPlayableArea,Condition(function CD4))
  call ForGroup(loc_group01,function CE4)
  call NSI(loc_group01)
  set loc_group01=null
endfunction

function CG4 takes nothing returns boolean
  if GetSpellAbilityId()=='A29G' or GetSpellAbilityId()=='A29H' then
    call CF4()
  endif
  return false
endfunction

function JR1 takes nothing returns nothing
  local trigger loc_trigger01=CreateTrigger()
  call UMI(loc_trigger01,EVENT_PLAYER_UNIT_SPELL_EFFECT)
  call TriggerAddCondition(loc_trigger01,Condition(function CG4))
  set loc_trigger01=null
endfunction
Дамми каст, собственно скачай карту и запусти щяс, москиты неруба не будут наносить доп урон....
Хз конечно, мб фрог и сделал новый ульт зевсу?
в карте 4 ульты зевса 2 основаны на Ударе грома, а другие 2 на Реве медведя друида... На первые 2 в коде ниче нету, их ид не встречается в коде карты.
0
30
9 лет назад
0
quq_CCCP, ты в игре проверь.
0
32
9 лет назад
0
Clamp, не увеличивает! Сам проверь в сингле, на зевса Bloodrage и пусть ультанет, урон не увеличится...
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, другие способности же будут выложены?.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.