Потому что локейшены нахрен не нужны, ибо тебе придется работать с координатами и делать кучу лишних днйствий, не говоря чтот локейшены - хендлы, и их использование без необходимости не желательно.
Вот так:
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
Собственно синусоеда по оси движения и все.
Ну код конечно у тебя не ахти, вот пример кода из доты:
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 которого мы можем записать остальные данные и получить их в другой функции.
Код тоже не идеален, но вполне удобен, юзаются триггеры вместо таймеров, т.к тут отслеживаются события.
ALEX 101 НЕ, надо не вставлять, а писать с нуля, глядя на этот код.
Вопрос был как сделать, я вам кинул пример как это в доте сделано, изучайте и пробуйте.
Там примитивный код, создается дамми юнит с моделью ледяного шара, и его двигают от лича к указанной цели, если дистанция между шаром и целью меньше 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
Вот как оно сделано у фрога, с небольшими доработками.
Отслеживать смерть техиники, и наносить урон. Вроде кстати у дирежаблей гоблинов была способность - парашутист, типа после крушения все получают головокружение и медленее двигаются некоторое время.
Как где, не видно? TriggerCondition, тут все в условиях написано.
Код Jass, собвственно все что надо таймер, дамми юнит с модлью кольца и группа, по малому периоду двигаем даммика за юнитом кастером и выбираем всех врагов вокруг, с каждым тиком таймера увеличиваем радиус поиска группы, тех кто уже попался отсеиваем, а тех кто попался впервые дамажим, замедление делается дамми юнитом кидающим ледяную звезду в себя, урон по площяди убран, только замедление.
Традиционные были без звука, это после добавили звук с цветом и прочее.
Пажитов насколько помню писал тетрис на компе где ни графики ни звука, разве что принтером шуршать можно. Так что музяку можно любую использовать, то что у нас в 90х китайцы продавали не есть каноничный вариант игры.
NTI - тупо CreateGroup, ну NSI - DestroyGroup
Если в карте нету GroupUtils (прекрасно гуглится на хайве).
Триггер меняем на таймер, но я скинул не для копипаста а для изучения, сложного в коде ничего нету.
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
» WarCraft 3 / Пропала новая сфера огня и способность слияние с тенью
» WarCraft 3 / Поджигание огненным дыханием без паров.
» WarCraft 3 / [JASS] Разница между location и x/y
» WarCraft 3 / Постоянно использует slam
» 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
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
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
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
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
if GetSpellAbilityId()=='A1RJ' then
call YP5()
endif
return false
endfunction
local trigger t=CreateTrigger()
call UMI(t,EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(t,Condition(function YQ5))
set t=null
endfunction
Собственно синусоеда по оси движения и все.
» WarCraft 3 / Первый скилл феникса ICARUS DIVE
Ред. quq_CCCP
» WarCraft 3 / Почему способность утекает?
используется так
Функция возвращает триггер, на ID которого мы можем записать остальные данные и получить их в другой функции.
Код тоже не идеален, но вполне удобен, юзаются триггеры вместо таймеров, т.к тут отслеживаются события.
» Unryze Jass API / UjAPI
» WarCraft 3 / Ловушка
» WarCraft 3 / Определение хоста карты
» WarCraft 3 / Id приказа "Похищение жизни"
» WarCraft 3 / Определение хоста карты
» WarCraft 3 / ии на карте дота
» WarCraft 3 / ии на карте дота
» WarCraft 3 / Ульт Лича из Доты
Вопрос был как сделать, я вам кинул пример как это в доте сделано, изучайте и пробуйте.
Ред. quq_CCCP
» WarCraft 3 / Ульт Лича из Доты
» WarCraft 3 / Возможно ли использовать более 16 разных тайлов на одной карте?
» WarCraft 3 / Транспорт наземный и урон
» WarCraft 3 / Как делать заклинание Arctic Blast из доты
Код Jass, собвственно все что надо таймер, дамми юнит с модлью кольца и группа, по малому периоду двигаем даммика за юнитом кастером и выбираем всех врагов вокруг, с каждым тиком таймера увеличиваем радиус поиска группы, тех кто уже попался отсеиваем, а тех кто попался впервые дамажим, замедление делается дамми юнитом кидающим ледяную звезду в себя, урон по площяди убран, только замедление.
» WarCraft 3 / FRAMETRIS (тетрис на фреймах)
Пажитов насколько помню писал тетрис на компе где ни графики ни звука, разве что принтером шуршать можно. Так что музяку можно любую использовать, то что у нас в 90х китайцы продавали не есть каноничный вариант игры.
» WarCraft 3 / Как делать заклинание Arctic Blast из доты
Если в карте нету GroupUtils (прекрасно гуглится на хайве).
Триггер меняем на таймер, но я скинул не для копипаста а для изучения, сложного в коде ничего нету.
» WarCraft 3 / Как делать заклинание Arctic Blast из доты
» WarCraft 3 / Как делать заклинание Arctic Blast из доты
Могу скинуть код, он там примитивный.
» WarCraft 3 / Циклы и их лимиты (+ способы обхода лимитов)
» WarCraft 3 / Циклы и их лимиты (+ способы обхода лимитов)