nazarpunk, ну тут у тебя в спелле моментальный эффект удара, а у меня пока долетит... Мне теперь что-ли 2 таймера запускать (один для эффекта, а другой для всего остального) ?
nazarpunk, вот, сделал всё максимально близко к твоему способу за исключением нескольких моментов:
exitwhen внизу
в функции каста в проверку на способность сразу вставил код вместо return
не записываю в функции каста координаты каста в переменные CastX, CastY, а сразу записываю в хэш-таблицу
с выгрузкой координат каста также, не записываю в переменные, а сразу выгружаю в GroupEnum
OrderId( "blizzard" ) оставил для ясности (если бы код выходил за рамки пособия - то пожалуйста)
все 3 if-а собрал в один if, имхо это правильный вариант (моя задача показать новичкам как правильно сделать, а не как улучшить читаемость кода до небес), насчёт читаемости безспорно твой вариант лучше.
globals
hashtable HT = InitHashtable()
group Group = CreateGroup()
unit Caster
unit Target
timer Timer
integer TimerId
constant integer Blizzard_Id = 'A000'
constant real Blizzard_Range = 300
constant real Blizzard_Damage = 300
endglobals
native UnitAlive takes unit id returns boolean
function Blizzard_Group takes nothing returns nothing
set Target = GetEnumUnit()
if UnitAlive( Target ) and IsUnitEnemy( Target, GetOwningPlayer( Caster ) ) and not IsUnitType( Target, UNIT_TYPE_STRUCTURE ) then
call UnitDamageTarget( Caster, Target, Blizzard_Damage, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_UNKNOWN, WEAPON_TYPE_WHOKNOWS )
endif
endfunction
function Blizzard_Timer takes nothing returns nothing
set Timer = GetExpiredTimer()
set TimerId = GetHandleId( Timer )
set Caster = LoadUnitHandle( HT, TimerId, 'cstr' )
call GroupEnumUnitsInRange( Group, LoadReal( HT, TimerId, 'cstX' ), LoadReal( HT, TimerId, 'cstY' ), Blizzard_Range, null )
call ForGroup( Group, function Blizzard_Group )
call GroupClear( Group )
if GetUnitCurrentOrder( Caster ) != OrderId( "blizzard" ) then
call PauseTimer( Timer )
call DestroyTimer( Timer )
call FlushChildHashtable( HT, TimerId )
endif
endfunction
function Blizzard_Actions takes nothing returns nothing
if GetSpellAbilityId() == Blizzard_Id then
set Timer = CreateTimer()
set TimerId = GetHandleId( Timer )
call SaveUnitHandle( HT, TimerId, 'cstr', GetTriggerUnit() )
call SaveReal( HT, TimerId, 'cstX', GetSpellTargetX() )
call SaveReal( HT, TimerId, 'cstY', GetSpellTargetY() )
call TimerStart( Timer, 1, true, function Blizzard_Timer )
endif
endfunction
function InitTrig_Blizzard takes nothing returns nothing
local trigger t = CreateTrigger()
local integer i = 0
loop
call TriggerRegisterPlayerUnitEvent( t, Player( i ), EVENT_PLAYER_UNIT_SPELL_EFFECT, null )
set i = i + 1
exitwhen i == bj_MAX_PLAYER_SLOTS
endloop
call TriggerAddAction( t, function Blizzard_Actions )
set t = null
endfunction
IzobretatelBoom, ставить exitwhen в самом низу также норм идея. Читается - читается! Ищется - ищется! Не проводиться лишняя итерация цикла - не проводится!
» WarCraft 3 / [Jass] - Буран
Ред. LastUchiha
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
Ред. LastUchiha
» WarCraft 3 / [Jass] - Буран
Ред. LastUchiha
» WarCraft 3 / [Jass] - Буран
Ред. LastUchiha
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
Ред. LastUchiha
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
Ред. LastUchiha
» WarCraft 3 / [Jass] - Буран
Ред. LastUchiha
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
Ред. LastUchiha
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
Ред. LastUchiha
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран