Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
vJass
Тип:
Способность
Версия Warcraft:
1.26+

Суккуленция

раскрыть
ну поняли да? типа связанное с кактусами, жижа в растении, прикольна же дададдад? нет, лучше б я сдох, жижа у меня в башке
Герой взращивает кактус вокруг себя, который начинает притягивать противников в радиусе досягаемости. Противники, касающиеся кактуса, получают урон и исцеляют владельца. Сам владелец в это время не досягаем и не может двигаться. По завершению кактус расцветает, пуская корни вокруг, которые единоразово наносят урон и опутывают противников.
код
library SucculentionLib
globals
    private constant hashtable H = InitHashtable( )
    private constant group TempGroup = CreateGroup( )
    private constant location LFZ = Location( 0.00, 0.00 )
    private constant integer SlowAbility = 'B000'   // дебаф сповільнюючої здібності, 0 - якщо нема
    private constant integer RootAbility = 'BEer'   // дебаф коренів, 0 - якщо нема
    private constant integer RootID        = 'u000' // корені
    private constant integer RootReverseID = 'u001' // реверснуті корені
    private constant integer FlowerID      = 'u002' // квітка
    private constant integer BirthID       = 'u003' // ефект появи
    private constant integer RootMineID    = 'u004' // масивні корені
    private constant integer OriginID      = 'u005' // ефект притягування
    private constant integer GreenSphereID = 'u006' // зелена кружлялка
    private constant real DamagePeriodic   = 0.50   // періодичність дамагу
    
    private unit TempUnit
    private group TempGroup1
    private integer TempS
    private integer TempInt
    private unit bj_lastFilterUnit = null
endglobals

native UnitAlive takes unit id returns boolean

private function GetLocZ takes real x, real y returns real
    call MoveLocation( LFZ, x, y )
    return GetLocationZ( LFZ )
endfunction

private struct SucculentionS
    unit caster
    player p
    group g
    
    real x
    real y
    real z
    real s
    real time
    real timeDamage
    real heal
    real damage
    real damageEnd
    boolexpr cond
    boolexpr cond1
endstruct

private function SucculentionDamage_1 takes nothing returns nothing
    local SucculentionS A = TempS
    local unit u = GetEnumUnit( )
    local real x
    local real y
    local real z
    local real x1
    local real y1
    local real z1
    local real a
    local real az
    local real d
    local lightning l = LoadLightningHandle( H, TempInt, GetHandleId( u ) )
    
    if not IsUnitInGroup( u, TempGroup ) or not UnitAlive( u ) or not IsUnitInRangeXY( u, A.x, A.y, 500.00 ) then
        if l != null then
            call DestroyLightning( l )
            call RemoveSavedHandle( H, TempInt, GetHandleId( u ) )
        endif
        
        if SlowAbility > 0 then
            call UnitRemoveAbility( u, SlowAbility )
        endif
        
        call GroupRemoveUnit( TempGroup1, u )
    else
        set x = GetUnitX( u )
        set y = GetUnitY( u )
        set z = GetLocZ( x, y ) + GetUnitFlyHeight( u ) + 50.00
        set a = Atan2( y - A.y, x - A.x )
        set az = Atan2( z - A.z, SquareRoot( ( x - A.x ) * ( x - A.x ) + ( y - A.y ) * ( y - A.y ) ) )
        
        set x1 = A.x + 100.00 * Cos( a ) * Cos( az )
        set y1 = A.y + 100.00 * Sin( a ) * Cos( az )
        set z1 = A.z + 100.00 * az
        
        if l == null then
            set l = AddLightningEx( "DRAL", false, x1, y1, z1, x, y, z )
            call SaveLightningHandle( H, TempInt, GetHandleId( u ), l )
        else
            call MoveLightningEx( l, false, x1, y1, z1, x, y, z )
        endif
        
        set d = SquareRoot( ( x - A.x ) * ( x - A.x ) + ( y - A.y ) * ( y - A.y ) + ( z - A.z ) * ( z - A.z ) ) - 100.00
        
        call SetLightningColor( l, 1.00, 1.00, 1.00, 0.10 + 0.90 * RMaxBJ( 0.00, ( 1.00 - RMaxBJ( 0.00, d - 200.00 ) / 300.00 ) ) )
        
        if IsUnitInRangeXY( u, A.x, A.y, 200.00 ) and A.timeDamage >= DamagePeriodic then
            if A.damage >= 0.00 then
                call UnitDamageTarget( A.caster, u, A.damage, false, false, null, null, null )
            else
                call SetWidgetLife( u, GetWidgetLife( u ) - A.damage )
            endif
            
            call SetWidgetLife( A.caster, GetWidgetLife( A.caster ) + A.heal )
            call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Weapons\\snapMissile\\snapMissile.mdl", u, "chest" ) )
        endif
        
        if IsUnitInRangeXY( u, A.x, A.y, 125.00 ) then
            call SetUnitX( u, x + 5.00 * Cos( a ) )
            call SetUnitY( u, y + 5.00 * Sin( a ) )
        else
            if A.s > 0.00 then
                call SetUnitX( u, x - ( 0.10 + A.s * RMaxBJ( 0.00, ( 1.00 - RMaxBJ( 0.00, d - 200.00 ) / 300.00 ) ) ) * Cos( a ) )
                call SetUnitY( u, y - ( 0.10 + A.s * RMaxBJ( 0.00, ( 1.00 - RMaxBJ( 0.00, d - 200.00 ) / 300.00 ) ) ) * Sin( a ) )
            else
                call SetUnitX( u, x - ( -0.10 + A.s * RMaxBJ( 0.00, ( 1.00 - RMaxBJ( 0.00, d - 200.00 ) / 300.00 ) ) ) * Cos( a ) )
                call SetUnitY( u, y - ( -0.10 + A.s * RMaxBJ( 0.00, ( 1.00 - RMaxBJ( 0.00, d - 200.00 ) / 300.00 ) ) ) * Sin( a ) )
            endif
        endif
    endif
    
    set l = null 
    set u = null
endfunction

private function SucculentionBloom takes nothing returns nothing
    local SucculentionS A = LoadInteger( H, GetHandleId( GetExpiredTimer( ) ), 0 )
    local unit u
    local real x
    local real y
    local real a = GetRandomReal( 0.00, 360.00 )
    local integer i = R2I( ( 2.00 * bj_PI * ( 120.00 + 280.00 * ( 1.00 - A.time / ( 0.20 * 6.00 ) ) ) ) / 96.00 + 0.50 )
    local integer i1 = i
    
    loop
        set x = A.x + ( 120.00 + 280.00 * ( 1.00 - A.time / ( 0.20 * 6.00 ) ) ) * Cos( a * bj_DEGTORAD )
        set y = A.y + ( 120.00 + 280.00 * ( 1.00 - A.time / ( 0.20 * 6.00 ) ) ) * Sin( a * bj_DEGTORAD )
        
        set udg_TempUnit = A.caster
        call GroupEnumUnitsInRange( TempGroup, x, y, 200.00, A.cond1 )
        
        loop
            set u = FirstOfGroup( TempGroup )
            exitwhen u == null
            call GroupRemoveUnit( TempGroup, u )
            
            if IsUnitInRangeXY( u, x, y, 50.00 ) then
                if RootAbility > 0 then
                    call UnitRemoveAbility( u, RootAbility )
                    call IssueTargetOrder( TempUnit, "entanglingroots", u )
                endif
                
                if not IsUnitInGroup( u, A.g ) then
                    call GroupAddUnit( A.g, u )
                    
                    if A.damageEnd >= 0.00 then
                        call UnitDamageTarget( A.caster, u, A.damageEnd, false, false, null, null, null )
                    else
                        call SetWidgetLife( u, GetWidgetLife( u ) - A.damageEnd )
                    endif
                endif
            endif
        endloop
        
        set bj_lastCreatedUnit = CreateUnit( A.p, RootID, x, y, a )
        call SetUnitX( bj_lastCreatedUnit, x )
        call SetUnitY( bj_lastCreatedUnit, y )
        call SetUnitAnimation( bj_lastCreatedUnit, "birth" )
        call QueueUnitAnimation( bj_lastCreatedUnit, "stand" )
        call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 2.50 )
    
        set i = i - 1
        exitwhen i <= 0
        set a = a + 360.00 / i1
    endloop
    
    set A.time = A.time - 0.20
    
    if A.time <= 0.00 then
        call PauseTimer( GetExpiredTimer( ) )
        call FlushChildHashtable( H, GetHandleId( GetExpiredTimer( ) ) )
        call DestroyTimer( GetExpiredTimer( ) )
        
        call DestroyGroup( A.g )
        
        set A.g = null
        set A.caster = null
        call A.destroy( )
    endif
endfunction

private function SucculentionDamage takes nothing returns nothing
    local SucculentionS A = LoadInteger( H, GetHandleId( GetExpiredTimer( ) ), 0 )
    local unit u
    local lightning l
    local integer i
    local real a
    
    set A.timeDamage = A.timeDamage + 0.01
    
    set TempS = A
    set TempInt = GetHandleId( GetExpiredTimer( ) )
    set TempGroup1 = A.g
    set udg_TempUnit = A.caster
    
    call GroupEnumUnitsInRange( TempGroup, A.x, A.y, 700.00, A.cond )
    
    set bj_groupAddGroupDest = A.g
    call ForGroup( TempGroup, function GroupAddGroupEnum )
    
    call ForGroup( A.g, function SucculentionDamage_1 )
    call GroupClear( TempGroup )
    
    set A.time = A.time - 0.01
    
    if A.time <= 0.00 then
        call PauseUnit( A.caster, false )
        call SetUnitInvulnerable( A.caster, false )
        
        set i = 3
        set a = GetRandomReal( 0.00, 360.00 )
        
        loop
            set bj_lastCreatedUnit = CreateUnit( A.p, BirthID, A.x, A.y, a )
            call SetUnitX( bj_lastCreatedUnit, A.x )
            call SetUnitY( bj_lastCreatedUnit, A.y )
            call SetUnitScale( bj_lastCreatedUnit, 3.00, 3.00, 3.00 )
            call KillUnit( bj_lastCreatedUnit )
            
            set i = i - 1
            exitwhen i <= 0
            set a = a + 360.00 / 3.00
        endloop
        
        loop
            set u = FirstOfGroup( A.g )
            exitwhen u == null
            call GroupRemoveUnit( A.g, u )
            
            set l = LoadLightningHandle( H, TempInt, GetHandleId( u ) )
            
            if l != null then
                call DestroyLightning( l )
                call RemoveSavedHandle( H, TempInt, GetHandleId( u ) )
            endif
            
            if SlowAbility > 0 then
                call UnitRemoveAbility( u, SlowAbility )
            endif
        endloop
        
        set l = null
        
        set A.time = 0.20 * 6.00
        
        call TimerStart( GetExpiredTimer( ), 0.20, true, function SucculentionBloom )
    elseif A.timeDamage >= DamagePeriodic then
        set A.timeDamage = A.timeDamage - DamagePeriodic
    endif
endfunction

private function Pause takes nothing returns nothing
    local timer t = GetExpiredTimer( )
    
    call PauseUnit( LoadUnitHandle( H, GetHandleId( t ), 0 ), true )
    
    call FlushChildHashtable( H, GetHandleId( t ) )
    call DestroyTimer( t )
    
    set t = null
endfunction

function Succulention_Actions takes unit caster, real damage, real damageEnd, real heal, real time, real s, boolexpr b, boolexpr b1 returns nothing
    local timer t = CreateTimer( )
    local SucculentionS A = SucculentionS.create( )
    local integer i = 6
    local real a = GetRandomReal( 0.00, 360.00 )
    
    set A.caster = caster
    set A.p = GetOwningPlayer( A.caster )
    set A.x = GetUnitX( A.caster )
    set A.y = GetUnitY( A.caster )
    set A.z = GetLocZ( A.x, A.y ) + 150.00
    set A.s = s
    set A.g = CreateGroup( )
    set A.time = RMaxBJ( 0.00, time )
    set A.timeDamage = DamagePeriodic
    set A.damage = damage
    set A.damageEnd = damageEnd
    set A.heal = heal
    set A.cond = b
    set A.cond1 = b1
    
    call SetUnitInvulnerable( A.caster, true )
    
    loop
        set bj_lastCreatedUnit = CreateUnit( A.p, RootID, A.x, A.y, a )
        call SetUnitX( bj_lastCreatedUnit, A.x )
        call SetUnitY( bj_lastCreatedUnit, A.y )
        call SetUnitScale( bj_lastCreatedUnit, 3.00, 3.00, 3.00 )
        call SetUnitAnimation( bj_lastCreatedUnit, "birth" )
        call QueueUnitAnimation( bj_lastCreatedUnit, "stand" )
        call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', A.time )
        
        set bj_lastCreatedUnit = CreateUnit( A.p, RootReverseID, A.x, A.y, a )
        call SetUnitX( bj_lastCreatedUnit, A.x )
        call SetUnitY( bj_lastCreatedUnit, A.y )
        call SetUnitFlyHeight( bj_lastCreatedUnit, 250.00, 0.00 )
        call SetUnitScale( bj_lastCreatedUnit, 3.00, 3.00, 3.00 )
        call SetUnitAnimation( bj_lastCreatedUnit, "birth" )
        call QueueUnitAnimation( bj_lastCreatedUnit, "stand" )
        call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', A.time )
        
        set i = i - 1
        exitwhen i <= 0
        set a = a + 360.00 / 6.00
    endloop
    
    set bj_lastCreatedUnit = CreateUnit( A.p, FlowerID, A.x, A.y, a )
    call UnitAddAbility( bj_lastCreatedUnit, 'Arav' )
    call SetUnitX( bj_lastCreatedUnit, A.x )
    call SetUnitY( bj_lastCreatedUnit, A.y )
    call SetUnitFlyHeight( bj_lastCreatedUnit, 225.00, 0.00 )
    call SetUnitScale( bj_lastCreatedUnit, 2.00, 2.00, 2.00 )
    call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', A.time )
    
    set i = 3
    set a = GetRandomReal( 0.00, 360.00 )
    
    loop
        set bj_lastCreatedUnit = CreateUnit( A.p, BirthID, A.x, A.y, a )
        call SetUnitX( bj_lastCreatedUnit, A.x )
        call SetUnitY( bj_lastCreatedUnit, A.y )
        call SetUnitScale( bj_lastCreatedUnit, 3.00, 3.00, 3.00 )
        call KillUnit( bj_lastCreatedUnit )
        
        set i = i - 1
        exitwhen i <= 0
        set a = a + 360.00 / 3.00
    endloop
    
    set bj_lastCreatedUnit = CreateUnit( A.p, RootMineID, A.x, A.y - 50.00, 5.00 )
    call UnitAddAbility( bj_lastCreatedUnit, 'Arav' )
    call SetUnitX( bj_lastCreatedUnit, A.x )
    call SetUnitY( bj_lastCreatedUnit, A.y - 50.00 )
    call SetUnitScale( bj_lastCreatedUnit, 1.50, 1.50, 1.50 )
    call SetUnitFlyHeight( bj_lastCreatedUnit, 75.00, 0.00 )
    call SetUnitAnimation( bj_lastCreatedUnit, "birth" )
    call QueueUnitAnimation( bj_lastCreatedUnit, "stand" )
    call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', A.time )
    
    set bj_lastCreatedUnit = CreateUnit( A.p, OriginID, A.x, A.y, a )
    call SetUnitX( bj_lastCreatedUnit, A.x )
    call SetUnitY( bj_lastCreatedUnit, A.y )
    call SetUnitAnimation( bj_lastCreatedUnit, "birth" )
    call QueueUnitAnimation( bj_lastCreatedUnit, "stand" )
    call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', A.time )
    
    set bj_lastCreatedUnit = CreateUnit( A.p, GreenSphereID, A.x, A.y, a )
    call SetUnitX( bj_lastCreatedUnit, A.x )
    call SetUnitY( bj_lastCreatedUnit, A.y )
    call SetUnitScale( bj_lastCreatedUnit, 2.00, 2.00, 2.00 )
    call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', A.time )
    
    call SaveInteger( H, GetHandleId( t ), 0, A )
    call TimerStart( t, 0.01, true, function SucculentionDamage )
    
    set t = CreateTimer( )
    
    call SaveUnitHandle( H, GetHandleId( t ), 0, A.caster )
    call TimerStart( t, 0.00, false, function Pause )
    
    set t = null
endfunction

//===========================================================================
function InitTrig_Succulention takes nothing returns nothing
    //set gg_trg_Succulention = CreateTrigger(  )
    
    // юніт з коренями
    if RootAbility > 0 then
        set TempUnit = CreateUnit( Player( PLAYER_NEUTRAL_PASSIVE ), 'u007', GetRectCenterX( bj_mapInitialPlayableArea ), GetRectCenterY( bj_mapInitialPlayableArea ), 0.00 )
    endif
endfunction
endlibrary

инструкция по импорту
  • скопировать триггер Succulention и вставить в карту
  • заполнить данные в коде Succulention, где имеются комментарии, в соответствии с объектами из ро
  • создать переменную с названием TempUnit для гуи пользования

отделённые комментарием триггеры не нужны, один для показа урона, другой для гуи примера
если нужна дополнительная помощь, а-ля изменить радиус притягивания, формулу, высоту молний, эффект при уроне, молнию в обратную сторону, убрать какие-то лишние элементы и т.п., без проблем сделаю или поясню как сделать самому


я не думаю что кто-то всерьёз (мб гуишники) будет этот спелл где-то использовать, так что просто демонстрирую идею
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
28
Атар, потому что спеллмейкерам код не нужен, только идея в виде кактусика с цветочком. Они пишут всё с нуля под собственные 999 систем в карте, а мне лайков с головой достаточно
25
Атар, потому что спеллмейкерам код не нужен, только идея в виде кактусика с цветочком. Они пишут всё с нуля под собственные 999 систем в карте, а мне лайков с головой достаточно
Все продумано, машина по сбору лайкосов)

Ну тогда держи еще парочку :D

И на комментик еще :D

А так забавный спелл и выглядит потрясающе, кайфовый видос
16
17 лайков и только скачивания от самого автора ресурса 😆 никто не спешит добавлять
Из спеллмейкерской солидарности
28
Все продумано, машина по сбору лайкосов)

Ну тогда держи еще парочку :D

И на комментик еще :D

А так забавный спелл и выглядит потрясающе, кайфовый видос

Из спеллмейкерской солидарности

я сейчас заплачу от счастья, можна вас обнять пж ♥
25
я сейчас заплачу от счастья, можна вас обнять пж ♥
Это прекрасно, когда есть мир, поддержка и обнимашки :D
8
Narberal Gamma -
Это тебе не спешить Шлятся по китайским сайтам
😡
36
Hardmell, на китайских сайтах годнота на фреймах имеется
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.