LastUchiha, у приказове есть целлочисленный id, который и использует игра. А есть представление в виде строки, которое используется в РО и гуймуй чтоб кожанным мешкам было удобней.
//if GetUnitCurrentOrder( Caster ) != 0xd0079 then - этот вариант работает быстрее, так как использует ид приказа без лишней возни со строками
Итерация (повторение) - повторение таймера или цикла (тут таймер повторяется раз в 1 секунду, то есть раз в 1 секунду происходит итерация таймера)
Этот коммент вообще не в том месте находится.
Когда копипастил забыл вкомментариях изменить ключи:
call SaveReal( HT, TimerId, 'cstX', GetSpellTargetX() ) //Сохраняется точка применения способности X по дочернему ключу 'cstr'
call SaveReal( HT, TimerId, 'cstY', GetSpellTargetY() ) //Сохраняется точка применения способности Y по дочернему ключу 'cstr'
group Group = CreateGroup() //Создаёт темповая группа
Это не темповая (слово "временна" видать запретили), а глобальная группа, которая используется для всех одноразовых переборов GroupEnum*.
LastUchiha, потому что так визуальней удобней смотреть, а не разгребать огромную моностроку. Ну и показать новичкам как можно использовать return в коллбэке.
Если код подразумевается как обучение новичков, то автора необходимо расстрелять за вредительство. Вместо тысячи слов я его переписал по человечески.
native UnitAlive takes unit id returns boolean
globals
hashtable HT = InitHashtable()
group Group = CreateGroup()
unit Caster
real CasterX
real CasterY
unit Target
timer Timer
integer TimerId
constant integer SpellBlizzardId = 'A000'
constant real SpellBlizzardRange = 300
constant real SpellBlizzardDamage = 300
endglobals
function SpellBlizzardEnum takes nothing returns nothing
set Target = GetEnumUnit()
if not UnitAlive(Target) then
return
endif
if not IsUnitEnemy(Target, GetOwningPlayer(Caster)) then
return
endif
if IsUnitType(Target, UNIT_TYPE_STRUCTURE) then
return
endif
call UnitDamageTarget(Caster, Target, SpellBlizzardDamage, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_UNKNOWN, WEAPON_TYPE_WHOKNOWS)
endfunction
function SpellBlizzardCallback takes nothing returns nothing
set Timer = GetExpiredTimer()
set TimerId = GetHandleId(Timer)
set Caster = LoadUnitHandle(HT, TimerId, 'cstr')
set CasterX = LoadReal(HT, TimerId, 'cstX')
set CasterY = LoadReal(HT, TimerId, 'cstY')
call GroupEnumUnitsInRange(Group, CasterX, CasterY, SpellBlizzardRange, null)
call ForGroup(Group, function SpellBlizzardEnum)
call GroupClear(Group)
if GetUnitCurrentOrder(Caster) != 0xd0079 then // blizzard
call PauseTimer(Timer)
call DestroyTimer(Timer)
call FlushChildHashtable(HT, TimerId)
endif
endfunction
function SpellBlizzardAction takes nothing returns nothing
if GetSpellAbilityId() != SpellBlizzardId then
return
endif
set Caster = GetTriggerUnit()
set CasterX = GetSpellTargetX()
set CasterY = GetSpellTargetY()
set Timer = CreateTimer()
set TimerId = GetHandleId(Timer)
call SaveUnitHandle(HT, TimerId, 'cstr', Caster)
call SaveReal(HT, TimerId, 'cstX', CasterX)
call SaveReal(HT, TimerId, 'cstY', CasterY)
call TimerStart(TimerId, 1.0, true, function SpellBlizzardCallback)
endfunction
function InitTrig_Blizzard takes nothing returns nothing
local trigger t = CreateTrigger()
local integer i = -1
loop
set i = i + 1
exitwhen i == bj_MAX_PLAYER_SLOTS
call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) //регистрирует событие применения способности для игрока i (изначально 0, 0 = 1 игрок, и так далее по порядку)
endloop
call TriggerAddAction(t, function SpellBlizzardAction)
set t = null
endfunction
P.S. Сюда бы по хорошему добавить уровней абилки и правильную работу с расстоянием до юнита, но в рамках пособия и так сойдёт.
Ужас. Три вызова функции GetFilterUnit и почему UnitAlive не в самом начале?
function Blizzard_Filter takes nothing returns boolean //функция фильтра (фильтруются юниты, в группе юнитов остаются только враги)
return IsUnitEnemy( GetFilterUnit(), GetOwningPlayer( uTemp ) ) and not IsUnitType( GetFilterUnit(), UNIT_TYPE_STRUCTURE ) and UnitAlive( GetFilterUnit() ) //сам фильтр
endfunction
» WarCraft 3 / [JASS] - Буран
Ред. nazarpunk
» WarCraft 3 / [JASS] - Буран
» WarCraft 3 / [JASS] - Буран
» WarCraft 3 / [JASS] - Буран
Ред. nazarpunk
» WarCraft 3 / [JASS] - Буран
Ред. nazarpunk
» WarCraft 3 / [JASS] - Буран
» WarCraft 3 / [JASS] - Буран
» WarCraft 3 / [JASS] - Буран
» WarCraft 3 / [JASS] - Буран
» WarCraft 3 / [JASS] - Буран
Ред. nazarpunk
» WarCraft 3 / [JASS] - Буран
» WarCraft 3 / [JASS] - Буран
» WarCraft 3 / [JASS] - Буран
» WarCraft 3 / [JASS] - Буран
Ред. nazarpunk
» WarCraft 3 / [JASS] - Буран
» WarCraft 3 / [JASS] - Буран
» WarCraft 3 / [JASS] - Буран
» WarCraft 3 / [JASS] - Буран
» WarCraft 3 / [JASS] - Буран
Ред. nazarpunk
» WarCraft 3 / [JASS] - Буран
Ужас
» WarCraft 3 / [JASS] - Буран
» WarCraft 3 / [JASS] - Буран
» WarCraft 3 / [JASS] - Буран
Ред. nazarpunk
» WarCraft 3 / Насколько быстро выполняется if ? - [Jass]
» Unryze Jass API / UjAPI