Добавлен quq_CCCP,
опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
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% - в зависимости от уровня, но только урон от лица цели заклинания. Скилл не работает на скиллы которые используют дамми юнитов или саммонов.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Clamp
ты искренне считаешь, что подобные комментарии нужны? цель комментов - помочь понять код, и смысл в комментарии на строке с функцией IsUnitDead - немножечко кретинизм
Отредактирован quq_CCCP
'B0EV' - нефига подобного, у рошана Spell Shield, без баффа, там баф с зеленой иконкой как у щита банши из кампании...
В коде есть проверка на то что урон нанесли цели или от цели, все, если урон нанес даммик (ульт зевса давным давно сделан на дамми касте цепи молний)
Отредактирован quq_CCCP
Хз конечно, мб фрог и сделал новый ульт зевсу?
в карте 4 ульты зевса 2 основаны на Ударе грома, а другие 2 на Реве медведя друида... На первые 2 в коде ниче нету, их ид не встречается в коде карты.
И, пожалуйста, перестань писать вот так......
Это очень сложно, я знаю........
В том то и загвоздка, в д2 работает а в варкравте нет, 1 условие Фрог забыл поставить.