Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
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
7
9 лет назад
0
Хорошая штуковина!
0
30
9 лет назад
Отредактирован Clamp
0
мне больше нравится юзать SetUnitPosition( )
да и отдельная функция ради этого как то расточительно
ну да, вызывать перемещение куда как менее расточительно, нежели запаузить юнита...

функция проверки жив ли юнит, стара как говно мамонтов
ты искренне считаешь, что подобные комментарии нужны? цель комментов - помочь понять код, и смысл в комментарии на строке с функцией IsUnitDead - немножечко кретинизм

складывается впечатление что фрог незнает что ==false заменяется на not
если мыслить твоими категориями, то ==false оптимальнее и легче читается

'B0EV'- Retaliation (тоже бафф, в этот раз хз чего, некий аналог линки но в игре не встречается)
Рошан

Скилл не работает на скилл которые используют дамми юнитов или саммонов, ну например ульт зевса
Работает так-то.
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
А что значит "эмуляция игровой ошибки"?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.