16

» WarCraft 3 / [Jass] - Буран

KaneThaumaturge, я понял, у меня уже был случай перезаписи, но там в кастомной функции перезаписывало)
16

» WarCraft 3 / [Jass] - Буран

KaneThaumaturge, а, ну тут уже зависит от пользователя и того что он хочет реализовать.
16

» WarCraft 3 / [Jass] - Буран

KaneThaumaturge, при правильном использовании ведь не словить (ну только если действий не особо много)?
16

» WarCraft 3 / [Jass] - Буран

nazarpunk, ну тут у тебя в спелле моментальный эффект удара, а у меня пока долетит... Мне теперь что-ли 2 таймера запускать (один для эффекта, а другой для всего остального) ?
16

» WarCraft 3 / [Jass] - Буран

nazarpunk, так а про итерацию, вынести к комментам в начале триггера?
16

» WarCraft 3 / [Jass] - Буран

nazarpunk, вот, сделал всё максимально близко к твоему способу за исключением нескольких моментов:
  1. exitwhen внизу
  2. в функции каста в проверку на способность сразу вставил код вместо return
  3. не записываю в функции каста координаты каста в переменные CastX, CastY, а сразу записываю в хэш-таблицу
  4. с выгрузкой координат каста также, не записываю в переменные, а сразу выгружаю в GroupEnum
  5. OrderId( "blizzard" ) оставил для ясности (если бы код выходил за рамки пособия - то пожалуйста)
  6. все 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
16

» WarCraft 3 / [Jass] - Буран

IzobretatelBoom, ставить exitwhen в самом низу также норм идея. Читается - читается! Ищется - ищется! Не проводиться лишняя итерация цикла - не проводится!
16

» WarCraft 3 / [Jass] - Буран

nazarpunk, а это ну для чего ? Ну то есть почему exitwhen выше и i = -1? Лишний раз срабатывает i = i + 1!
Загруженные файлы
16

» WarCraft 3 / [Jass] - Буран

nazarpunk, понял, и почему бы не использовать фильтр как отдельную функцию которая будет проставлена в GroupEnum ? Лишняя функция чи шо ?
16

» WarCraft 3 / [Jass] - Буран

nazarpunk, почему 3 условия стоят отдельно друг от друга ?
Загруженные файлы
16

» WarCraft 3 / [Jass] - Буран

nazarpunk, да не боюсь я, мне просто не нравится когда что-то некрасиво в коде.