Добавлен 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% - в зависимости от уровня, но только урон от лица цели заклинания. Скилл не работает на скиллы которые используют дамми юнитов или саммонов.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
В том то и загвоздка, в д2 работает а в варкравте нет, 1 условие Фрог забыл поставить.
Отредактирован quq_CCCP
разве его не 100500 на сайте и форуме?
nvc123, много видел всяких, но они обычно косячные или не совсем такие.
Audes, ну все иди смотри...