32

» WarCraft 3 / Поджигание огненным дыханием без паров.

Да у нейтралов, там так горят юниты, без паров. Ну либо сделай кастом, способность то примитивная.
32

» WarCraft 3 / [JASS] Разница между location и x/y

Потому что локейшены нахрен не нужны, ибо тебе придется работать с координатами и делать кучу лишних днйствий, не говоря чтот локейшены - хендлы, и их использование без необходимости не желательно.
32

» WarCraft 3 / Постоянно использует slam

Такая механика у этих спеллов, если анимации нету - они берут дефолт, тоесть slam, введи туда spell, или attack
32

» WarCraft 3 / Первый скилл феникса ICARUS DIVE

Вот так:
function YK5 takes nothing returns boolean
local trigger t=GetTriggeringTrigger()
local integer S5I=GetHandleId(t)
local unit P7I=(LoadUnitHandle(HashData,(S5I),(2)))
local unit P8I=(LoadUnitHandle(HashData,(S5I),(17)))
local integer SUI=(LoadInteger(HashData,(S5I),(5)))
if GetTriggerEventId()==EVENT_WIDGET_DEATH or GetTriggerEvalCount(t)==4 or RKI(P8I)then
call DestroyEffect((LoadEffectHandle(HashData,(S5I),(32))))
call UnitRemoveAbility(P8I,'A2O7')
call UnitRemoveAbility(P8I,'B0GC')
call FlushChildHashtable(HashData,(S5I))
call S0I(t)
endif
if GetTriggerEventId()!=EVENT_WIDGET_DEATH then
call DamageTarget(P7I,P8I,1,20*SUI-10)
endif
set t=null
set P7I=null
set P8I=null
return false
endfunction
function YL5 takes unit P7I,unit P8I,integer SUI returns nothing
local trigger t=CreateTrigger()
local integer S5I=GetHandleId(t)
call AddPermanentAbility(P8I,'A2O7')
call TriggerRegisterTimerEvent(t,1,true)
call TriggerRegisterDeathEvent(t,P8I)
call TriggerAddCondition(t,Condition(function YK5))
call SaveUnitHandle(HashData,(S5I),(2),(P7I))
call SaveUnitHandle(HashData,(S5I),(17),(P8I))
call SaveInteger(HashData,(S5I),(5),(SUI))
call SaveEffectHandle(HashData,(S5I),(32),(AddSpecialEffectTarget("Environment\\LargeBuildingFire\\LargeBuildingFire1.mdl",P8I,"chest")))
set t=null
endfunction
function YM5 takes nothing returns boolean
if IsUnitInGroup(GetEnumUnit(),WKI)==false and RKI(GetEnumUnit())==false then
call GroupAddUnit(WKI,GetEnumUnit())
call DestroyEffect(AddSpecialEffectTarget("war3mapImported\\FireBlast.mdx",GetEnumUnit(),"chest"))
call YL5(WMI,GetEnumUnit(),WLI)
endif
return false
endfunction
function YN5 takes nothing returns boolean
local trigger t=GetTriggeringTrigger()
local integer S5I=GetHandleId(t)
local integer NPI=(LoadInteger(HashData,(S5I),(34)))
local unit P7I=(LoadUnitHandle(HashData,(S5I),(2)))
local real QXI=(LoadReal(HashData,(S5I),(189)))
local real QYI=(LoadReal(HashData,(S5I),(190)))
local real QJI=(LoadReal(HashData,(S5I),(47)))
local real QKI=(LoadReal(HashData,(S5I),(48)))
local real a=(LoadReal(HashData,(S5I),(13)))
local real YS5=(1-I2R(NPI)/50)*bj_PI
local real YT5=1400/2*Cos(YS5)
local real YR5=500/2*Sin(YS5)
local real x=PTI(QJI+YT5*Cos(a)-YR5*Sin(a))
local real y=PUI(QKI+YT5*Sin(a)+YR5*Cos(a))
local group JAO=(LoadGroupHandle(HashData,(S5I),(133)))
local group g
local integer SUI=GetUnitAbilityLevel(P7I,'A1RJ')
if GetTriggerEventId()==EVENT_UNIT_DEATH or(GetTriggerEventId()==EVENT_UNIT_SPELL_EFFECT and NPI>0 and(GetSpellAbilityId()=='A20N' or GetSpellAbilityId()=='A1RK'))or NPI>100 or BH1(P7I)then
call UPI(x,y,300)
call SetUnitVertexColor(P7I,255,255,255,255)
if(LoadInteger(HashData,(GetHandleId(P7I)),(704)))==0 or(LoadInteger(HashData,(GetHandleId(P7I)),(704)))=='A1RJ' then
call SetPlayerAbilityAvailable(GetOwningPlayer(P7I),'A1RJ',true)
endif
call SetPlayerAbilityAvailable(GetOwningPlayer(P7I),'A20N',false)
call SetUnitPathing(P7I,true)
call NSI(JAO)
call FlushChildHashtable(HashData,(S5I))
call S0I(t)
else
if ModuloInteger(NPI,10)==0 then
call UPI(x,y,200)
endif
call SaveInteger(HashData,(S5I),(34),(NPI+1))
call SetUnitX(P7I,x)
call SetUnitY(P7I,y)
call SetUnitFacing(P7I,(a+YS5-bj_PI/2)*bj_RADTODEG)
set g=NTI()
set WKI=JAO
set GK=P7I
set WMI=P7I
set WLI=GetUnitAbilityLevel(P7I,'A1RJ')
call GroupEnumUnitsInRange(g,x,y,225,Condition(function CE1))
call ForGroup(g,function YM5)
call NSI(g)
endif
set t=null
set P7I=null
set g=null
set JAO=null
return false
endfunction
function YP5 takes nothing returns nothing
local trigger t=CreateTrigger()
local integer S5I=GetHandleId(t)
local unit P7I=GetTriggerUnit()
local real QXI=GetUnitX(P7I)
local real QYI=GetUnitY(P7I)
local real a=UEI(QXI,QYI,GetSpellTargetX(),GetSpellTargetY())*bj_DEGTORAD
local real QJI=QXI+1400/2*Cos(a)
local real QKI=QYI+1400/2*Sin(a)
call SetUnitState(P7I,UNIT_STATE_LIFE,GetUnitState(P7I,UNIT_STATE_LIFE)-GetUnitState(P7I,UNIT_STATE_LIFE)*0.15)
call SCI(P7I,4301,2)
call SCI(P7I,4415,2)
call TriggerRegisterTimerEvent(t,0.02,true)
call TriggerRegisterUnitEvent(t,P7I,EVENT_UNIT_DEATH)
call TriggerRegisterUnitEvent(t,P7I,EVENT_UNIT_SPELL_EFFECT)
call TriggerAddCondition(t,Condition(function YN5))
call SaveUnitHandle(HashData,(S5I),(2),(P7I))
call SaveReal(HashData,(S5I),(189),((QXI)*1.0))
call SaveReal(HashData,(S5I),(190),((QYI)*1.0))
call SaveReal(HashData,(S5I),(47),((QJI)*1.0))
call SaveReal(HashData,(S5I),(48),((QKI)*1.0))
call SaveReal(HashData,(S5I),(13),((a)*1.0))
call SaveGroupHandle(HashData,(S5I),(133),(NTI()))
call SetUnitPathing(P7I,false)
call SetUnitVertexColor(P7I,255,255,255,50)
call AddPermanentAbility(P7I,'A20N')
call SetPlayerAbilityAvailable(GetOwningPlayer(P7I),'A1RJ',false)
call SetPlayerAbilityAvailable(GetOwningPlayer(P7I),'A20N',true)
set t=null
set P7I=null
endfunction
function YQ5 takes nothing returns boolean
if GetSpellAbilityId()=='A1RJ' then
call YP5()
endif
return false
endfunction
function RC1 takes nothing returns nothing
local trigger t=CreateTrigger()
call UMI(t,EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(t,Condition(function YQ5))
set t=null
endfunction
Собственно синусоеда по оси движения и все.
32

» WarCraft 3 / Почему способность утекает?

Ну код конечно у тебя не ахти, вот пример кода из доты:

function IsUnitDead takes unit u returns boolean
  return GetUnitTypeId(u)<1 or IsUnitType(u,UNIT_TYPE_DEAD)==true
endfunction

function ID1 takes nothing returns boolean
  local trigger t=GetTriggeringTrigger()
  local integer S5I=GetHandleId(t)
  local integer PCI=(LoadInteger(HashData,(S5I),(30)))
  local unit P8I=NYI(PCI)
  local integer IE1=(LoadInteger(HashData,(S5I),(43)))
  local unit P7I=NYI(IE1)
  local real IF1=(LoadReal(HashData,(S5I),(44)))
  local unit IG1=(LoadUnitHandle(HashData,(S5I),(45)))
  local real x=GetUnitX(IG1)
  local real y=GetUnitY(IG1)
  local real QJI=GetUnitX(P8I)
  local real QKI=GetUnitY(P8I)
  local real IH1=IF1*0.03
  local real IZ1=UEI(x,y,QJI,QKI)
  local real IV1=x+IH1*Cos(IZ1*bj_DEGTORAD)
  local real IW1=y+IH1*Sin(IZ1*bj_DEGTORAD)
  local boolean IX1=(LoadBoolean(HashData,(S5I),(698)))
  local boolean IY1=(LoadBoolean(HashData,(S5I),(818)))
  call SetUnitX(IG1,IV1)
  call SetUnitY(IG1,IW1)
  call SetUnitFacing(IG1,IZ1)
  if IsUnitDead(P8I)and IX1==false or(((LoadInteger(HashData,(GetHandleId((P8I))),((4422))))==1)==true and IY1==true)then
    call KillUnit(IG1)
    call NXI(PCI)
    call FlushChildHashtable(HashData,(S5I))
    call S0I(t)
  elseif UTI(QJI,QKI,IV1,IW1)<=IH1 then
    call KillUnit(IG1)
    set GK=P7I
    set HK=P8I
    call ExecuteFunc((LoadStr(HashData,(S5I),(46))))
    call NXI(PCI)
    call FlushChildHashtable(HashData,(S5I))
    call S0I(t)
  endif
  set t=null
  set P8I=null
  set P7I=null
  set IG1=null
  return false
endfunction

function IJ1 takes unit P7I,unit P8I,integer IK1,string IL1,real IF1,boolean IM1 returns trigger
  local trigger t=CreateTrigger()
  local integer S5I=GetHandleId(t)
  local real QXI=GetUnitX(P7I)
  local real QYI=GetUnitY(P7I)
  local real IN1=GetUnitFacing(P7I)
  call TriggerRegisterTimerEvent(t,0.03,true)
  call TriggerAddCondition(t,Condition(function ID1))
  call SaveReal(HashData,(S5I),(44),((IF1)*1.0))
  call SaveInteger(HashData,(S5I),(30),(NKI(P8I)))
  call SaveStr(HashData,(S5I),(46),(IL1))
  call SaveInteger(HashData,(S5I),(43),(NKI(P7I)))
  call SaveUnitHandle(HashData,(S5I),(45),(CreateUnit(GetOwningPlayer(P7I),IK1,QXI,QYI,IN1)))
  call SaveBoolean(HashData,(S5I),(698),(false))
  call SaveBoolean(HashData,(S5I),(818),(IM1))
  set WK=t
  set t=null
  return WK
endfunction
Это готовая наработка для создание снарядов из юнитов,
используется так
  local trigger t=IJ1(DKI,GetEnumUnit(),'h0D8',"MT3",400,false)
кто кастер, кто цель, ид юнита снаряда, имя функции которая вызывается при попадании, скорость в секунду, уничтожаем снаряд если цель подохла или недосигаем.
Функция возвращает триггер, на ID которого мы можем записать остальные данные и получить их в другой функции.
Код тоже не идеален, но вполне удобен, юзаются триггеры вместо таймеров, т.к тут отслеживаются события.
32

» Unryze Jass API / UjAPI

Ух ты наконец то, можно создавать баффы, и ненужно возится с аурой торнадо.
32

» WarCraft 3 / Ловушка

Super cool, это очень сложно, вам нужно много изучать прежде чем пытаться что то такое делать в редакторе.
32

» WarCraft 3 / Определение хоста карты

IceFog, типа у кого меньше всех задержка - тот и хост, но это не надежный метод.
32

» WarCraft 3 / Id приказа "Похищение жизни"

Принятый ответ
"lifedrain", но канал это пустышка, реверс ты таким образом не сделаешь.
32

» WarCraft 3 / Определение хоста карты

nazarpunk, насколько помню, по геймкешу и зажержке синха, без мемхака, способ не очень надежный.
32

» WarCraft 3 / ии на карте дота

Глянул карту, ууу, человеку нечем занятся, свою доту на гуи лепит...
32

» WarCraft 3 / ии на карте дота

Ну им штука сложная, + нужно сперва составить чёткую тактику.
32

» WarCraft 3 / Ульт Лича из Доты

ALEX 101 НЕ, надо не вставлять, а писать с нуля, глядя на этот код.
Вопрос был как сделать, я вам кинул пример как это в доте сделано, изучайте и пробуйте.
32

» WarCraft 3 / Ульт Лича из Доты

Там примитивный код, создается дамми юнит с моделью ледяного шара, и его двигают от лича к указанной цели, если дистанция между шаром и целью меньше N, то наносят урон цели (дамми каст ледяной звезды, урон по цели убран, оставлен только урон по области) ну и ищем в радиусе 500 еще одну цель, которой не является юнит которого мы ударили, ну и летим дальше.

function SH4 takes nothing returns boolean
    local trigger t = GetTriggeringTrigger( )
    local integer S5I = GetHandleId( t )
    local unit P7I = ( LoadUnitHandle( HashData, ( S5I ), ( 2 ) ) )
    local unit P8I = ( LoadUnitHandle( HashData, ( S5I ), ( 17 ) ) )
    local unit WF3 = ( LoadUnitHandle( HashData, ( S5I ), ( 374 ) ) )
    local integer SUI = ( LoadInteger( HashData, ( S5I ), ( 5 ) ) )
    local integer SZ4 = ( LoadInteger( HashData, ( S5I ), ( 233 ) ) )
    local integer MKO = ( LoadInteger( HashData, ( S5I ), ( 12 ) ) )
    local real x = GetUnitX( WF3 )
    local real y = GetUnitY( WF3 )
    local real tx = GetUnitX( P8I )
    local real ty = GetUnitY( P8I )
    local real a = AngleBetweenCords( x,y,tx,ty )
    local integer DT1 = ( LoadInteger( HashData, ( S5I ), ( 720 ) ) )

    if DT1 > 0 then
        call SaveInteger( HashData, ( S5I ), ( 720 ), DT1 - 1 )
        set t = null
        set P7I = null
        set P8I = null
        set WF3 = null
        return false
    endif

    if DistBetweenCods( x, y, tx, ty ) > 20.00 then
        call SetUnitFacing( WF3, a )
        set x = PTI( x + 18.0 * Cos( a * bj_DEGTORAD ) )
        set y = PUI( y + 18.0 * Sin( a * bj_DEGTORAD ) )
        call SetUnitX( WF3, x )
        call SetUnitY( WF3, y )
    else
        if not( IsUnitDead( P8I ) or IsUnitType( P8I, UNIT_TYPE_MAGIC_IMMUNE ) ) then
            set tx = GetUnitX( P8I )
            set ty = GetUnitY( P8I )
            set bj_lastCreatedUnit = CreateUnit( GetOwningPlayer( P7I ), DUMMY, tx, ty, a ) 
            call SetUnitPathing( bj_lastCreatedUnit, false )
            call SetUnitX( bj_lastCreatedUnit, tx )
            call SetUnitY( bj_lastCreatedUnit, ty )
            call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 2.00 )
            call UnitAddAbility( bj_lastCreatedUnit, 'A091' )
            call SetUnitAbilityLevel( bj_lastCreatedUnit, 'A091', SUI )
            if not IsUnitHasNegation(P8I) and IssueTargetOrder( bj_lastCreatedUnit, "frostnova", P8I ) then
                call UnitDamageTarget( P7I, P8I, LoadReal( HashData, S5I, 3 ), false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_FIRE, WEAPON_TYPE_WHOKNOWS )
            else 
                call KillUnit( bj_lastCreatedUnit )
            endif
        endif
        if SZ4 > MKO then
            call RemoveUnit( WF3 )
            call FlushChildHashtable( HashData, ( S5I ) )
            call S0I( t )
        else
            call GroupClear( bj_TempGroup )
            set bj_groupEnumOwningPlayer = GetOwningPlayer( P7I )
            call GroupEnumUnitsInRange( bj_TempGroup, tx, ty, 625.00, Condition( function Cond_EnemyVisibleNoVardVulAlive ) )
            call GroupRemoveUnit( bj_TempGroup, P8I )
            set P8I = GroupPickRandomUnit( bj_TempGroup )
            
            if P8I == null then
                call RemoveUnit( WF3 )
                call FlushChildHashtable( HashData, ( S5I ) )
                call S0I( t )
            else
                call SaveInteger( HashData, ( S5I ), ( 720 ), ( 10 ) )
                call SaveInteger( HashData, ( S5I ), ( 233 ), ( SZ4 + 1 ) )
                call SaveUnitHandle( HashData, ( S5I ), ( 17 ), ( P8I ) )
            endif
        endif
    endif

    set t = null
    set P7I = null
    set P8I = null
    set WF3 = null
    return false
endfunction

function Trig_ChainFrost_Actions takes nothing returns nothing
    local unit P7I = GetTriggerUnit( )
    local unit P8I = GetSpellTargetUnit( )
    local integer SUI = GetUnitAbilityLevel( P7I, 'A05T' )
    local integer MKO = 10
    local trigger t = CreateTrigger( )
    local integer S5I = GetHandleId( t )
    local unit dummy= CreateUnit( GetOwningPlayer( P7I ), 'e009', GetUnitX( P7I ), GetUnitY( P7I ), GetUnitFacing( P7I )  )
    
    call SetUnitPathing( dummy, false )
    
    if GetSpellAbilityId( ) == 'A08H' then
        set SUI = GetUnitAbilityLevel( P7I, 'A08H' ) + 1
        set MKO = 100000
    endif
    
    call SaveUnitHandle( HashData,  S5I ,  2,  P7I )
    call SaveUnitHandle( HashData,  S5I ,  17,  P8I )
    call SaveUnitHandle( HashData,  S5I ,  374, dummy )
    call SaveInteger( HashData, S5I ,  5, ( SUI ) )
    call SaveInteger( HashData, S5I ,  233, ( 1 ) )
    call SaveInteger( HashData, S5I ,  12, ( MKO ) )
    call SaveInteger( HashData, S5I ,  720, ( 0 ) )
    call SaveReal( HashData, S5I, 3, 190.00 + 90.00 * SUI )
    
    call TriggerRegisterTimerEvent( t, 0.02, true )
    call TriggerAddCondition( t, Condition( function SH4 ) )
    
    set P7I = null
    set P8I = null
    set dummy = null
    set t = null
endfunction

function Trig_ChainFrost_Conditions takes nothing returns boolean
    if ( GetSpellAbilityId() == 'A05T' or GetSpellAbilityId()=='A08H' ) and not IsUnitHasNegation(GetSpellTargetUnit()) then
        call  Trig_ChainFrost_Actions( )
    endif
    return false
endfunction

function Register_ChainFrost takes nothing returns nothing
    local trigger trg = CreateTrigger()
    local integer nIndex = 1
    
    call TriggerAddCondition( trg, Condition( function Trig_ChainFrost_Conditions ) )
    
    loop
        exitwhen nIndex > 11
            if IsSlotPlayer(Player(nIndex))then
                call TriggerRegisterPlayerUnitEvent( trg, Player(nIndex), EVENT_PLAYER_UNIT_SPELL_EFFECT, OnlyHero )
            endif
        set nIndex = nIndex + 1
    endloop
    
    set trg = null
endfunction
Вот как оно сделано у фрога, с небольшими доработками.
32

» WarCraft 3 / Возможно ли использовать более 16 разных тайлов на одной карте?

Там увы проблема, формат самого файла ландшавта не поддерживает больше число тайлов. + там 2 заняты водой, которые анимированые тайлы.
32

» WarCraft 3 / Транспорт наземный и урон

Отслеживать смерть техиники, и наносить урон. Вроде кстати у дирежаблей гоблинов была способность - парашутист, типа после крушения все получают головокружение и медленее двигаются некоторое время.
32

» WarCraft 3 / Как делать заклинание Arctic Blast из доты

Как где, не видно? TriggerCondition, тут все в условиях написано.
Код Jass, собвственно все что надо таймер, дамми юнит с модлью кольца и группа, по малому периоду двигаем даммика за юнитом кастером и выбираем всех врагов вокруг, с каждым тиком таймера увеличиваем радиус поиска группы, тех кто уже попался отсеиваем, а тех кто попался впервые дамажим, замедление делается дамми юнитом кидающим ледяную звезду в себя, урон по площяди убран, только замедление.
32

» WarCraft 3 / FRAMETRIS (тетрис на фреймах)

Традиционные были без звука, это после добавили звук с цветом и прочее.
Пажитов насколько помню писал тетрис на компе где ни графики ни звука, разве что принтером шуршать можно. Так что музяку можно любую использовать, то что у нас в 90х китайцы продавали не есть каноничный вариант игры.
32

» WarCraft 3 / Как делать заклинание Arctic Blast из доты

NTI - тупо CreateGroup, ну NSI - DestroyGroup
Если в карте нету GroupUtils (прекрасно гуглится на хайве).
Триггер меняем на таймер, но я скинул не для копипаста а для изучения, сложного в коде ничего нету.
32

» WarCraft 3 / Как делать заклинание Arctic Blast из доты

Принятый ответ
function J9O takes nothing returns nothing
  local unit P8I=GetEnumUnit()
  local group JAO=ND0
  local unit P7I=NE0
  if IsUnitInGroup(P8I,JAO)==false then
    call GroupAddUnit(JAO,P8I)
    call IssueTargetOrder(NF0,"slow",P8I)
    set JJI=true
    call DamageTarget(P7I,P8I,1,200)
    set JJI=false
    call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Undead\\FrostNova\\FrostNovaTarget.mdl",P8I,"origin"))
  endif
  set P8I=null
  set JAO=null
  set P7I=null
endfunction

function JBO takes nothing returns boolean
  local trigger t=GetTriggeringTrigger()
  local integer S5I=GetHandleId(t)
  local unit P7I=(LoadUnitHandle(HashData,(S5I),(2)))
  local unit I01=(LoadUnitHandle(HashData,(S5I),(19)))
  local group JAO=(LoadGroupHandle(HashData,(S5I),(133)))
  local real d
  local real x
  local real x0=GetUnitX(P7I)
  local real y
  local real y0=GetUnitY(P7I)
  local group g=NTI()
  local integer NPI=GetTriggerEvalCount(t)
  local integer i
  call SetUnitX(I01,GetUnitX(P7I))
  call SetUnitY(I01,GetUnitY(P7I))
  set ND0=JAO
  set NE0=P7I
  set NF0=(LoadUnitHandle(HashData,(S5I),(132)))
  if GetTriggerEvalCount(t)>37 then
    call KillUnit(I01)
    call NSI(JAO)
    call FlushChildHashtable(HashData,(S5I))
    call S0I(t)
  else
    set d=NPI*21
    set i=0
    loop
      exitwhen i>36
      set x=x0+d*Cos(360*i/36*bj_DEGTORAD)
      set y=y0+d*Sin(360*i/36*bj_DEGTORAD)
      set GK=P7I
      call GroupEnumUnitsInRange(g,x,y,150,Condition(function C81))
      call ForGroup(g,function J9O)
      set i=i+1
    endloop
  endif
  call NSI(g)
  set t=null
  set I01=null
  set JAO=null
  set P7I=null
  set g=null
  return false
endfunction

function JCO takes nothing returns nothing
  local unit SFI=GetTriggerUnit()
  local real x=GetUnitX(SFI)
  local real y=GetUnitY(SFI)
  local group JAO=NTI()
  local trigger t=CreateTrigger()
  local integer S5I=GetHandleId(t)
  local unit I01=CreateUnit(GetOwningPlayer(SFI),'h091',x,y,0)
  local unit JDO=CreateUnit(GetOwningPlayer(SFI),'e00E',GetUnitX(SFI),GetUnitY(SFI),0)
  call UnitAddAbility(JDO,'A0T0')
  call SaveGroupHandle(HashData,(S5I),(133),(JAO))
  call SaveUnitHandle(HashData,(S5I),(19),(I01))
  call SaveUnitHandle(HashData,(S5I),(132),(JDO))
  call SaveUnitHandle(HashData,(S5I),(2),(SFI))
  call TriggerRegisterTimerEvent(t,0.06,true)
  call TriggerAddCondition(t,Condition(function JBO))
  set t=null
  set JAO=null
  set I01=null
  set JDO=null
  set SFI=null
endfunction

function JEO takes nothing returns nothing
  if GetSpellAbilityId()=='A0T9' then
    call JCO()
  endif
endfunction
32

» WarCraft 3 / Как делать заклинание Arctic Blast из доты

Extremator, там кастомная модель, разлета снарядов.
Могу скинуть код, он там примитивный.