Ну таймером двигать за юнитом, собственно там не сложная система получится, 2 массива, таймер и цикл. Ну и очистка, в случаи смерти юнита. Собственно если юнитов будет много, то лучше какую нить модельку с надписью крепить спецэффектом.
Зачем, там примитив, каждую секунду выбираем всех юнитов на карте с баффом ауры, (делаем ауру пустышку которая ничего не дает) и проверяем, если у юнита нет способности рунных браслетов, то её вручаем, и добавляем юнитов во вторую группу, Во второй группе перебираем всех юнитов раз в секунду и если юнит мертв или баффа ауры нету - удаляем способность рунных брасслетов.
Лучше по идеи использовать благословение элуны, т.к рунные браслеты не складываются.
Ну существуют специальные системы, которые все делают за тебя, тебе просто нужно заполнить таблицу, из чего что собирается, но для начала хватит того что предложили выше.
Системы сборных предметов выкладывали 100500 раз.
На атаку по площади оно не работает, нужно делать триггерный вариант этой способности.
Собственно банальный детект урона, т.к это всего лишь крип - создаем триггер который реагирует на урон по всем юнитам на карте, в условии проверяем что урон выше скажем 5, источник урона баллиста а цель её враг, у врага есть мана - тогда убавить маны, и нанести еще урона сколько было выжжено маны, урон наносит от лица даммика. Вот и все.
Потому что локейшены нахрен не нужны, ибо тебе придется работать с координатами и делать кучу лишних днйствий, не говоря чтот локейшены - хендлы, и их использование без необходимости не желательно.
Вот так:
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
Вот как оно сделано у фрога, с небольшими доработками.
» WarCraft 3 / Как привязать ТЕКСТАГ к юниту?
» WarCraft 3 / Аура на защиту от магии
Лучше по идеи использовать благословение элуны, т.к рунные браслеты не складываются.
» WarCraft 3 / Крафт из одинаковых предметов
Системы сборных предметов выкладывали 100500 раз.
» WarCraft 3 / Как добавить пассивное сожжение маны баллисте?
Собственно банальный детект урона, т.к это всего лишь крип - создаем триггер который реагирует на урон по всем юнитам на карте, в условии проверяем что урон выше скажем 5, источник урона баллиста а цель её враг, у врага есть мана - тогда убавить маны, и нанести еще урона сколько было выжжено маны, урон наносит от лица даммика. Вот и все.
» WarCraft 3 / локальная fogmodifier
» WarCraft 3 / Предмет с рандом шансом на яд
» WarCraft 3 / Спавн Рун
» WarCraft 3 / Помощь с депротектом
» 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 разных тайлов на одной карте?