Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
vJass
Тип:
Способность
Хоть и не успел сделать на конкурс, но решил немного поиграться и сделать Исазама.

Способности

[Пассивно] - Ужас
Когда Исазам атакует он получает заряд Ужаса. Атака, после накопления 20 зарядов, лишит противников в 300 АоЕ возможности атаковать и использовать способности на 1,5 секунды.
Код
library Horror requires MemoryHackDamageEventHook, EcstasyOfHorror

    function AddHorrorEffect takes nothing returns nothing
        if IsazamHorror >= 20 then
            set IsazamHorrorEffect = AddSpecialEffectTarget("Burning Rage Red.mdl", Isazam, "overhead")
        endif
    endfunction

    function Damaged_Handler takes unit source, unit target, real dmg returns nothing
        local integer evnt  = GetDamageEventESPData()
        local integer data  = ReadRealMemory(evnt + 0x00)
        local real init_dmg = CleanReal(IndexToReal(ReadRealMemory(evnt + 0x04)))
        local integer flags = ReadRealMemory(data + 0x0C)
        local integer atk_t = ReadRealMemory(data + 0x20)
        local unit dummy
        local group g
        
        if GetUnitTypeId(source) == 'U005' and ( IsFlagBitSet( flags, 0x100 ) or IsFlagBitSet( flags, 0x101 ) ) and atk_t != 0 then // Ставим свой ID Исазама
            if Isazam == null then
                set Isazam = source
            endif
            
            if IsazamHorror < 20 then 
                set IsazamHorror = IsazamHorror + 1
                call AddHorrorEffect()
            else
                set dummy = CreateUnit(GetOwningPlayer(Isazam), 'h000', GetUnitX(Isazam), GetUnitY(Isazam), 0)
                call UnitAddAbility(dummy, 'A00C')
                call IssuePointOrder(dummy, "silence", GetUnitX(Isazam), GetUnitY(Isazam))
                call UnitApplyTimedLife(dummy, 'BTLF', 3.0)
                set IsazamHorror = 0
                call DestroyEffect(IsazamHorrorEffect)
                set IsazamHorrorEffect = null
                if GetUnitAbilityLevel(Isazam, 'A001') > 0 then
                    set g = CreateGroup()
                    call GroupEnumUnitsInRange(g, GetUnitX(Isazam), GetUnitY(Isazam), 300.0, function EcstasyOfHorror_Start)
                    call DestroyGroup(g)
                endif
            endif
        endif
        
        set dummy = null
        set g = null
    endfunction

    function Damage_Event takes nothing returns nothing
        call DisableTrigger( GetTriggeringTrigger( ) )
        call Damaged_Handler( GetEventDamageSource( ), GetTriggerUnit( ), GetEventDamage( ) )
        call EnableTrigger( GetTriggeringTrigger( ) )
    endfunction
endlibrary

function InitTrig_Horror takes nothing returns nothing
    local group gMain = CreateGroup()
    local unit uTemp 
    local trigger trTemp = CreateTrigger()
    
    if true then
        call GroupEnumUnitsInRect( gMain, bj_mapInitialPlayableArea, null )
        loop
            set uTemp = FirstOfGroup( gMain )
            exitwhen uTemp == null
            call TriggerRegisterUnitEvent( trTemp, uTemp, EVENT_UNIT_DAMAGED )
            call GroupRemoveUnit( gMain, uTemp )
        endloop
        call TriggerAddAction( trTemp, function Damage_Event )
    endif
    
    call DestroyGroup(gMain)
    
    set gMain = null
    set trTemp = null
endfunction
[Q] - Тёмная стая
После паузы в 1 секунду Исазам обращается в стаю летучих мышей, становясь неуязвимым, и движется в выбранную точку. Всем противникам на его пути наносится 200 - 600 урона, а сам Исазам получает 5 зарядов Ужаса.
Код
function CarroinSwarm_Move takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer id = GetHandleId(t)
    local real time = LoadReal(H, id, 'time') - 0.02
    local integer stop = LoadInteger(H, id, 'stop')
    local unit caster = LoadUnitHandle(H, id, 'cast')
    local unit casw = LoadUnitHandle(H, id, 'CaSw')
    local real x0 = GetUnitX(casw)
    local real y0 = GetUnitY(casw)
    local real x1 = LoadReal(H, id, 'EndX')
    local real y1 = LoadReal(H, id, 'EndY')
    local real d = SquareRoot( (x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0) )
    local real a = bj_RADTODEG * Atan2(y1 - y0, x1 - x0)
    local group g = CreateGroup()
    local unit target
    local item test
    
    if GetUnitCurrentOrder(caster) != OrderId("AImove") and time > 0.0 then
        call PauseTimer(t)
        call DestroyTimer(t)
        call FlushChildHashtable(H, id)
        call RemoveUnit(casw)
    endif
    
    call SaveReal(H, id, 'time', time)
    
    if time == 0.0 then
        call ShowUnit(casw, true)
        call ShowUnit(caster, false)
        call PauseUnit(caster, true)
        call UnitRemoveAbility(casw, 'Aloc')
        call UnitAddAbility(casw, 'Aloc')
    endif
    
    if time < 0.0 then
        if d < 11.0 then
            call PauseTimer(t)
            call DestroyTimer(t)
            call FlushChildHashtable(H, id)
            call RemoveUnit(casw)
            call ShowUnit(caster, true)
            call PauseUnit(caster, false)
            call SetUnitPosition(caster, x0, y0)
            call SelectUnit(caster, true)
            set IsazamHorror = IsazamHorror + 5
            call AddHorrorEffect()
        else
            if stop == 0 then
                call SetUnitX(casw, x0 + 10.0 * Cos(bj_DEGTORAD * a))
                call SetUnitY(casw, y0 + 10.0 * Sin(bj_DEGTORAD * a))
                call SetUnitFacing(casw, a)
            else
                set test = CreateItem('spsh', x0 + 10.0 * Cos(bj_DEGTORAD * a), y0 + 10.0 * Sin(bj_DEGTORAD * a))
                call SetItemPosition(test, x0 + 10.0 * Cos(bj_DEGTORAD * a), y0 + 10.0 * Sin(bj_DEGTORAD * a))
                
                if GetItemX(test) == x0 + 10.0 * Cos(bj_DEGTORAD * a) and GetItemY(test) == y0 + 10.0 * Sin(bj_DEGTORAD * a) then
                    call SetUnitX(casw, x0 + 10.0 * Cos(bj_DEGTORAD * a))
                    call SetUnitY(casw, y0 + 10.0 * Sin(bj_DEGTORAD * a))
                else
                    call PauseTimer(t)
                    call DestroyTimer(t)
                    call FlushChildHashtable(H, id)
                    call RemoveUnit(casw)
                    call ShowUnit(caster, true)
                    call PauseUnit(caster, false)
                    call SetUnitPosition(caster, x0, y0)
                    call SelectUnit(caster, true)
                    set IsazamHorror = IsazamHorror + 5
                    call AddHorrorEffect()
                endif
                
                call RemoveItem(test)
            endif
        endif
    endif
    
    call SaveUnitHandle(H, 'Unit', 'Unit', caster)
    call GroupEnumUnitsInRange(g, x0, y0, 100.0, function Enemy)
    
        loop
            set target = FirstOfGroup(g)
        exitwhen target == null
            call UnitDamageTarget(caster, target, 5.0 * GetUnitAbilityLevel(caster, 'A00B'), true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS )
            call GroupRemoveUnit(g, target)
        endloop
        
    call GroupClear(g)
    call DestroyGroup(g)
    
    set t = null
    set caster = null
    set casw = null
    set g = null
    set target = null
    set test = null
endfunction

function Trig_CarroinSwarm_Actions takes nothing returns nothing
    local unit Caster = GetTriggerUnit()
    local real x0 = GetUnitX(Caster)
    local real y0 = GetUnitY(Caster)
    local real x1 = GetSpellTargetX()
    local real y1 = GetSpellTargetY()
    local item test = CreateItem('spsh', x1, y1)
    local unit CaSw = CreateUnit(GetOwningPlayer(Caster), 'u007', x0, y0, GetUnitFacing(Caster))
    local timer t = CreateTimer()
    local integer id = GetHandleId(t)
    
    call SetItemPosition(test, x1, y1)
    
    if GetItemX(test) == x1 and GetItemY(test) == y1 then
        call SaveInteger(H, id, 'stop', 0)
    else
        call SaveInteger(H, id, 'stop', 1)
    endif
    
    if IsTerrainPathable(x1, y1, PATHING_TYPE_WALKABILITY) == true then
        call SaveInteger(H, id, 'stop', 1)
    endif
    
    call ShowUnit(CaSw, false)
    
    call TimerStart(t, 0.02, true, function CarroinSwarm_Move)
    call SaveReal(H, id, 'time', 1.0)
    call SaveUnitHandle(H, id, 'cast', Caster)
    call SaveUnitHandle(H, id, 'CaSw', CaSw)
    call SaveReal(H, id, 'EndX', x1)
    call SaveReal(H, id, 'EndY', y1)
    
    call RemoveItem(test)
    
    set IsazamHorror = IsazamHorror + 5
    
    set Caster = null
    set test = null
    set CaSw = null
    set t = null
endfunction

function Trig_CarroinSwarm_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A00B'
endfunction

//===========================================================================
function InitTrig_CarroinSwarm takes nothing returns nothing
    set gg_trg_CarroinSwarm = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_CarroinSwarm, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_CarroinSwarm, Condition( function Trig_CarroinSwarm_Conditions ) )
    call TriggerAddAction( gg_trg_CarroinSwarm, function Trig_CarroinSwarm_Actions )
endfunction
[W] - Кромсание
Исазам наносит 2 - 6 быстрых ударов по противнику, каждый из которых наносит 75% урона от его силы атаки. Если Исазам имеет 20 зарядов Ужаса, то урон от удара увеличивается до 100%.
Код
((код
function Trig_Shredding_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local unit target = GetSpellTargetUnit()
local integer L_count = 2 * GetUnitAbilityLevel(caster, 'A008')
local integer side = 1
local effect Shredding = null

call PauseUnit(target, true)

loop
call SetUnitAnimation(caster, "stand")
if side == 1 then
call DestroyEffect(Shredding)
set Shredding = AddSpecialEffectTarget("Reaper's Claws Red.mdl", caster, "chest")
call SetUnitAnimation(caster, "Attack - 1")
set side = 2
else
call DestroyEffect(Shredding)
set Shredding = AddSpecialEffectTarget("Reaper's Claws Red.mdl", caster, "chest")
call SetUnitAnimation(caster, "Attack - 2")
set side = 1
endif

set L_count = L_count - 1

if IsazamHorror > 20 then
call UnitDamageTarget(caster, target, (GetUnitBaseDamage(caster) + GetUnitBonusDamage(caster)) * 0.75 * 0.5, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
else
call UnitDamageTarget(caster, target, (GetUnitBaseDamage(caster) + GetUnitBonusDamage(caster)) * 0.75, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
endif

call TriggerSleepAction(0.550)

if IsDead(target) or IsDead(caster) or GetUnitCurrentOrder(caster) != OrderId("absorb") then
call IssueImmediateOrder(caster, "stop")
call PauseUnit(target, false)
set caster = null
set target = null
set Shredding = null
return
endif
exitwhen L_count == 0
endloop

call IssueImmediateOrder(caster, "stop")
call PauseUnit(target, false)

set caster = null
set target = null
set Shredding = null
endfunction
function Trig_Shredding_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A008'
endfunction
===========================================================================
function InitTrig_Shredding takes nothing returns nothing
set gg_trg_Shredding = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Shredding, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Shredding, Condition( function Trig_Shredding_Conditions ) )
call TriggerAddAction( gg_trg_Shredding, function Trig_Shredding_Actions )
endfunction))
[E] - Упоение ужасом пассивно
После срабатывания Ужаса Исазам в течении трёх секунд высасывает из противников, охваченных ужасом, 50 - 150 здоровья.
Код
library EcstasyOfHorror requires SecondaryFunction

function EcstasyOfHorror_Timer takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer id = GetHandleId(t)
    local unit target = LoadUnitHandle(H, id, 'targ')
    local lightning EOH_Lightning = LoadLightningHandle(H, id, 'ligh')
    local real time = LoadReal(H, id, 'time') - 0.02
    
    call SaveReal(H, id, 'time', time)
    
    call MoveLightningEx(EOH_Lightning, true, GetUnitX(Isazam), GetUnitY(Isazam), GetLocalZ(GetUnitX(Isazam), GetUnitY(Isazam)), GetUnitX(target), GetUnitY(target), GetLocalZ(GetUnitX(target), GetUnitY(target)))
    
    call SetUnitState(Isazam, UNIT_STATE_LIFE, GetUnitState(Isazam, UNIT_STATE_LIFE) + (50.0 * GetUnitAbilityLevel(Isazam, 'A001')) / 150.0)
    call SetUnitState(target, UNIT_STATE_LIFE, GetUnitState(target, UNIT_STATE_LIFE) - (50.0 * GetUnitAbilityLevel(Isazam, 'A001')) / 150.0)
    
    if IsDead(target) or time < 0.0 or IsDead(Isazam) then
        call PauseTimer(t)
        call DestroyTimer(t)
        call DestroyLightning(EOH_Lightning)
        call FlushChildHashtable(H, id)
    endif
    
    set target = null
    set EOH_Lightning = null
    set t = null
endfunction

function EcstasyOfHorror_Start takes nothing returns nothing
    local unit target = GetFilterUnit()
    local lightning EOH_Lightning
    local timer t
    local integer id
    
    if IsUnitEnemy(target, GetOwningPlayer(Isazam)) and not IsUnitType(target, UNIT_TYPE_MECHANICAL) and not IsUnitType(target, UNIT_TYPE_STRUCTURE) and not IsDead(target) then
        set EOH_Lightning = AddLightningEx("AFOD", true, GetUnitX(Isazam), GetUnitY(Isazam), GetLocalZ(GetUnitX(Isazam), GetUnitY(Isazam)), GetUnitX(target), GetUnitY(target), GetLocalZ(GetUnitX(target), GetUnitY(target)))
        set t = CreateTimer()
        set id = GetHandleId(t)
        call TimerStart(t, 0.02, true, function EcstasyOfHorror_Timer)
        call SaveLightningHandle(H, id, 'ligh', EOH_Lightning)
        call SaveUnitHandle(H, id, 'targ', target)
        call SaveReal(H, id, 'time', 3.0)
    endif
    
    set target = null
    set EOH_Lightning = null
    set t = null
endfunction

endlibrary
[R] - Кошмар воплоти
Исазам становится недосягаемым на 10 секунд, а всех вражеских героев начинают атаковать кошмары, видимые только им и Исазаму. Кошмары наносят 50% от его силы атаки.
Код
function Nightmare_Timer takes nothing returns nothing
    call PauseUnit(Isazam, false)
    
    call SetUnitAnimation(Isazam, "Stand")
    
    call ShowUnit(Isazam, true)
    
    call DisplayCineFilter(false)
    
    call SelectUnit(Isazam, true)
    
    if (GetLocalPlayer() == GetOwningPlayer(Isazam)) then
        call PanCameraToTimed(GetUnitX(Isazam), GetUnitY(Isazam), 0.00)
    endif
endfunction

function Nightmare_Group takes nothing returns nothing
    local unit target = GetFilterUnit()
    local integer count = 6
    local real RanRan
    local real RanAng
    local unit u
    
    if IsUnitEnemy(target, GetOwningPlayer(Isazam)) and not IsDead(target) and IsUnitType(target, UNIT_TYPE_HERO) then
        loop
            set RanRan = 150.0
            set RanAng = 60.0 * count
            set u = CreateUnit(GetOwningPlayer(Isazam), 'u009', GetUnitX(target) + RanRan * Cos(RanAng * bj_DEGTORAD), GetUnitY(target) + RanRan * Sin(RanAng * bj_DEGTORAD), RanAng)
            call SetUnitBaseDamage(u, ( ( GetUnitBaseDamage(Isazam) + GetUnitBonusDamage(Isazam)) * 50) / 100 )
            call IssueTargetOrder(u, "attack", target)
            call UnitApplyTimedLife(u, 'BTLF', 10.0)
            call SetUnitVertexColor(u, 255, 255, 255, 0)
            if GetLocalPlayer() == GetOwningPlayer(Isazam) or GetLocalPlayer() == GetOwningPlayer(target) then
                call SetUnitVertexColor(u, 128, 128, 128, 255)
            endif
            set count = count - 1
            exitwhen count == 0
        endloop
    endif
    
    set target = null
    set u = null
endfunction

function Trig_Nightmare_Actions takes nothing returns nothing
    local unit caster = GetTriggerUnit()
    local group g
    local timer t = CreateTimer()
    
    call PauseUnit(caster, true)
    
    call SetUnitAnimation(caster, "Death")
    
    call TriggerSleepAction(1.5)
    
    if not IsDead(caster) then
        call ShowUnit(caster, false)
        
        set g = CreateGroup()
        call GroupEnumUnitsInRange(g, GetUnitX(Isazam), GetUnitY(Isazam), 99999.0, function Nightmare_Group)
        call DestroyGroup(g)
    endif
    
    call TimerStart(t,10.0, false, function Nightmare_Timer)
    
    call CinematicFadeBJ( bj_CINEFADETYPE_FADEOUT, 0.00, "ReplaceableTextures\\CameraMasks\\DreamFilter_Mask.blp", 0.00, 0, 0, 0 )
    
    set caster = null
    set g = null
    set t = null
endfunction

function Trig_Nightmare_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A00D'
endfunction

//===========================================================================
function InitTrig_Nightmare takes nothing returns nothing
    set gg_trg_Nightmare = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Nightmare, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Nightmare, Condition( function Trig_Nightmare_Conditions ) )
    call TriggerAddAction( gg_trg_Nightmare, function Trig_Nightmare_Actions )
endfunction

Видео

`
ОЖИДАНИЕ РЕКЛАМЫ...
0
11
2 года назад
0
Позже добавлю видео для способностей
0
32
2 года назад
0
ArhiMEN, Ты всё таки его доделал, какая красота
0
14
2 года назад
0
Спобности интересно сделанный, кампанию за такого персонажа бы :)
0
11
2 года назад
0
Bergi_Bear, кекв)

Kirka_Karma, мне вотульта не нравится, потом переделаю. А компания хз, это делать ландшафт.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.