Добавлен , опубликован
фигнёй страдал и снова какой-то кал высрал, доделывать возможно не буду
код
library SpellLib
globals
    private constant timer TempTimer = CreateTimer( )
    private constant real timerPeriodic = 0.01
    private integer max = 0

    private unit array dummy
    
    private real array startx
    private real array starty
    private real array startz
    private real array midx
    private real array midy
    private real array midz
    private real array endx
    private real array endy
    private real array endz
    
    private real array time
    private real array maxTime
    
    constant location LFZ = Location( 0.00, 0.00 )
endglobals

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

function move takes nothing returns nothing
    local real x
    local real y
    local real z
    local integer i
    
    set i = 1
    loop
        set x = startx[i] + ( ( 2.00 * ( midx[i] - startx[i] ) ) + ( startx[i] - 2.00 * midx[i] + endx[i] ) * time[i] ) * time[i]
        set y = starty[i] + ( ( 2.00 * ( midy[i] - starty[i] ) ) + ( starty[i] - 2.00 * midy[i] + endy[i] ) * time[i] ) * time[i]
        set z = startz[i] + ( ( 2.00 * ( midz[i] - startz[i] ) ) + ( startz[i] - 2.00 * midz[i] + endz[i] ) * time[i] ) * time[i]
        
        call SetUnitX( dummy[i], x )
        call SetUnitY( dummy[i], y )
        call SetUnitFlyHeight( dummy[i], z - GetLocZ( x, y ), 0.00 )
        
        set time[i] = time[i] + timerPeriodic / maxTime[i]
        
        if time[i] >= 1.00 then
            call KillUnit( dummy[i] )
            set dummy[i] = dummy[max]
            
            set startx[i] = startx[max]
            set starty[i] = starty[max]
            set startz[i] = startz[max]

            set endx[i] = endx[max]
            set endy[i] = endy[max]
            set endz[i] = endz[max]
            
            set midx[i] = midx[max]
            set midy[i] = midy[max]
            set midz[i] = midz[max]
            
            set time[i] = time[max]
            set maxTime[i] = maxTime[max]
            
            set i = i - 1
            set max = max - 1
            
            if max <= 0 then
                call PauseTimer( TempTimer )
            endif
        endif
        
        set i = i + 1
        exitwhen i > max
    endloop
endfunction

function Spell_Actions takes nothing returns nothing
    local unit u  = GetTriggerUnit( )
    local real x  = GetUnitX( u )
    local real y  = GetUnitY( u )
    local real x1 = GetSpellTargetX( )
    local real y1 = GetSpellTargetY( )
    local real a  = Atan2( y1 - y, x1 - x )
    local real d  = 150.00
    local real angle
    local real distance = 800.00
    local integer i  = 5
    local integer i1 = 8
    local boolean b = GetRandomInt( 0, 1 ) == 0
    
    set bj_groupEnumOwningPlayer = GetOwningPlayer( u )
    
    loop
        set x1 = x + d * Cos( a )
        set y1 = y + d * Sin( a )
        set d  = d + 150.00
        
        set bj_lastCreatedUnit = CreateUnit( bj_groupEnumOwningPlayer, 'u000', x, y, GetRandomReal( 0.00, 360.00 ) )
        call SetUnitPathing( bj_lastCreatedUnit, false )
        call SetUnitX( bj_lastCreatedUnit, x1 )
        call SetUnitY( bj_lastCreatedUnit, y1 )
        call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 3.00 )
        
        if i == 1 then
            call SetUnitScale( bj_lastCreatedUnit, 1.5, 1.5, 1.5 )
        endif
        
        if i == 5 then
            loop
                set max = max + 1
                
                set startx[max] = x1
                set starty[max] = y1
                set startz[max] = GetLocZ( startx[max], starty[max] ) + 50.00
                set dummy[max]  = CreateUnit( bj_groupEnumOwningPlayer, 'u001', startx[max], starty[max], GetRandomReal( 0.00, 360.00 ) )
                
                call UnitAddAbility( dummy[max], 'Arav' )
                call SetUnitPathing( dummy[max], false )
                call SetUnitX( dummy[max], startx[max] )
                call SetUnitY( dummy[max], starty[max] )
                call SetUnitFlyHeight( dummy[max], startz[max], 0.00 )
                
                set endx[max] = x + 800.00 * Cos( a )
                set endy[max] = y + 800.00 * Sin( a )
                set endz[max] = GetLocZ( endx[max], endy[max] )
                set angle     = Atan2( endy[max] - starty[max], endx[max] - startx[max] )
                
                if b then
                    set midx[max] = startx[max] + distance * Cos( angle - 90 * bj_DEGTORAD )
                    set midy[max] = starty[max] + distance * Sin( angle - 90 * bj_DEGTORAD )
                    set b = false
                else
                    set midx[max] = startx[max] + distance * Cos( angle + 90 * bj_DEGTORAD )
                    set midy[max] = starty[max] + distance * Sin( angle + 90 * bj_DEGTORAD )
                    set b = true
                endif
                
                set midz[max] = GetLocZ( midx[max], midy[max] )
                
                if startz[max] < endz[max] then
                    set midz[max] = midz[max] + endz[max]
                else
                    set midz[max] = midz[max] + startz[max]
                endif
                
                set midz[max] = midz[max] + ( 800.00 - ( distance - 50 ) )
                
                set time[max] = 0.00
                set maxTime[max] = SquareRoot( ( endx[max] - startx[max] ) * ( endx[max] - startx[max] ) + ( endy[max] - starty[max] ) * ( endy[max] - starty[max] ) ) / 750
                
                if maxTime[max] <= 0.00 then
                    set maxTime[max] = 0.01
                endif
                
                if max == 1 then
                    call TimerStart( TempTimer, timerPeriodic, true, function move )
                endif
                
                set i1 = i1 - 1
                exitwhen i1 <= 0
                
                set distance = distance - 75.00
            endloop
        endif
        
        set i = i - 1
        exitwhen i <= 0
        call TriggerSleepAction( 0.10 )
    endloop
endfunction
endlibrary

//===========================================================================
function InitTrig_Spell takes nothing returns nothing
    //set gg_trg_Spell = CreateTrigger(  )
endfunction

`
ОЖИДАНИЕ РЕКЛАМЫ...
2
19
2 года назад
2
Ля, прикольно
0
12
2 года назад
0
Красиво , вот если еще приложить немного усилий, чтоб доделать и добавить нанесение урона по прямой или в конечной точке, то получится аниме-стрелялка
2
22
2 года назад
2
Ну а чего калл, вышло классно, правда не понял как определяется нанесение урона.
0
27
2 года назад
0
Maxlaid, урона нет вообще, это просто движение даммиков с эффектами, я не захотел доделывать
это не кал только для тех, кто в первые это увидел
2
22
2 года назад
2
rsfghd, как скажешь
Чтобы оставить комментарий, пожалуйста, войдите на сайт.