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
Я же не могу сетнуть глобалку выше объявления локалок.
Правда? А ты моск для этого пытался использовать?
globals
hashtable HT // текущая таблица
integer HI // текуший главный ключ таблицы
endglobals
function GetInt takes integer k return integer
return GetSavedInteger(HT, HI, k)
endfunction
// ... пачка функций на каждый тип
function GetTimerId takes hashtable ht returns integer
set HT = ht
set HI = GetHandleInd(GetExpiredTimer())
return HI
endfunction
function callback takes nothing returns nothing
local integer id = GetTimerId(SomeHashtable)
local integer myInt = GetInt(1)
local string myStr = GetStr(22)
//...
endfunction
globals
hashtable HT // текущая таблица
integer HI // текуший главный ключ таблицы
endglobals
function GetInt takes integer k return integer
return GetSavedInteger(HT, HI, k)
endfunction
// ... пачка функций на каждый тип
function callback takes nothing returns nothing
set HT = SomeHashtable
set HI = GetHandleInd(GetExpiredTimer())
set myInt = GetInt(1)
set myStr = GetStr(22)
//...
endfunction
» 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
» WarCraft 3 / Насколько быстро выполняется if ? - [Jass]
Ред. nazarpunk
» WarCraft 3 / Насколько быстро выполняется if ? - [Jass]
» WarCraft 3 / Насколько быстро выполняется if ? - [Jass]
» WarCraft 3 / Насколько быстро выполняется if ? - [Jass]
Ред. nazarpunk
» WarCraft 3 / Насколько быстро выполняется if ? - [Jass]
Ред. nazarpunk
» WarCraft 3 / Насколько быстро выполняется if ? - [Jass]
» WarCraft 3 / Насколько быстро выполняется if ? - [Jass]
» WarCraft 3 / Чем можно редактировать слк?
» WarCraft 3 / Mdlvis выписывает ошибку на новых моделях
» WarCraft 3 / JNGP: Rebuild от PT153
» Game Dev / Entity Component System (ECS)