function spell1_dmg takes nothing returns nothing
    local integer lhandle = GetHandleId(GetExpiredTimer())
    local integer tik_count = LoadIntegerBJ(lhandle, 2, udg_spells_hashtable)
    local unit target = LoadUnitHandleBJ(lhandle, 0, udg_spells_hashtable)
    local unit caster = LoadUnitHandleBJ(lhandle, 1, udg_spells_hashtable)
    local effect leffect = LoadEffectHandleBJ(lhandle, 3, udg_spells_hashtable)
    call DestroyEffectBJ( leffect )
    if ( tik_count > 0) then
        call UnitDamageTargetBJ( caster, target, udg_spell1_dmg_period_count, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC )
        call DisplayTextToForce( GetPlayersAll(), I2S(tik_count) )
        call SaveIntegerBJ( ( tik_count - 1 ), lhandle, 2, udg_spells_hashtable )
        call AddSpecialEffectTargetUnitBJ( "origin", target, "Abilities\\Spells\\Orc\\LightningBolt\\LightningBoltMissile.mdl" ) 
        set leffect = GetLastCreatedEffectBJ()
        call SaveEffectHandleBJ( leffect, lhandle, 3, udg_spells_hashtable )
    else
        set leffect = null
        call SaveEffectHandleBJ( leffect, lhandle, 3, udg_spells_hashtable )
    endif
endfunction

function Trig_spell1_cast_jass_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A000'
endfunction

function Trig_spell1_cast_jass_Actions takes nothing returns nothing
    local timer ltimer = CreateTimer()
    call TimerStart( ltimer, 0.05, true, function spell1_dmg)
    set udg_local_handle = GetHandleId(ltimer)
    call SaveUnitHandleBJ( GetSpellTargetUnit(), udg_local_handle, 0, udg_spells_hashtable )
    call SaveUnitHandleBJ( GetSpellAbilityUnit(), udg_local_handle, 1, udg_spells_hashtable )
    call SaveIntegerBJ( udg_spell1_time_period_count, udg_local_handle, 2, udg_spells_hashtable )
    call AddSpecialEffectTargetUnitBJ( "origin", GetSpellTargetUnit(), "Abilities\\Spells\\Orc\\LightningBolt\\LightningBoltMissile.mdl" ) 
    call SaveEffectHandleBJ( GetLastCreatedEffectBJ(), udg_local_handle, 3, udg_spells_hashtable )
endfunction

//===========================================================================
function InitTrig_spell1_cast_jass takes nothing returns nothing
    set gg_trg_spell1_cast_jass = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_spell1_cast_jass, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_spell1_cast_jass, Condition( function Trig_spell1_cast_jass_Conditions ) )
    call TriggerAddAction( gg_trg_spell1_cast_jass, function Trig_spell1_cast_jass_Actions )
endfunction
Где-то он там есть, но что-то не ищется...
Апд. Ну и просто советы по улучшению кода принимаются, да. Если вдруг кто захочет...

Принятый ответ

А что тут vJass требует? Глобалки?
Блок глобалок, что я объявил, и многострочные комментарии /*...*/.
PT153:
Переписал код, оставил кое-какие комментарии.
xD, я просто скопипастил создание эффекта, а ведь нужно было убрать под таймером GetSpellTargetUnit().
Вот так верно будет.
раскрыть
globals
    constant string Effect_A000 = "Abilities\\Spells\\Orc\\LightningBolt\\LightningBoltMissile.mdx"
    constant string AttEffect_A000 = "origin"
endglobals

function spell1_dmg takes nothing returns nothing
    local integer h = GetHandleId(GetExpiredTimer())
    local unit target = LoadInteger(udg_spells_hashtable, h, 0)
    local integer tik_count = LoadInteger(udg_spells_hashtable, h, 2)
    // Вместо определения локалки для кастера, сразу пихаем его в UnitDamageTargetBJ.
    // Локалку всё также можно определить, но после endif её нужно обнулить.
    // set caster = null
    call DestroyEffect(LoadEffectHandle(udg_spells_hashtable, h, 3))
    if tik_count > 0 then
        call UnitDamageTargetBJ(LoadUnitHandle(udg_spells_hashtable, h, 1),/*
                                              */ target, udg_spell1_dmg_period_count, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC)
        call DisplayTextToPlayer(GetLocalPlayer(), 0., 0., I2S(tik_count))  // асинхронно, работает по сети.
        call SaveInteger(udg_spells_hashtable, h, 2, tik_count - 1)
        call SaveEffectHandle(udg_spells_hashtable, h, 3, AddSpecialEffectTarget(Effect_A000, target, AttEffect_A000))
    else
        call FlushChildHashtable(udg_spells_hashtable, h)  // удаляет все записи с parent ключом h.
        call DestroyTimer(GetExpiredTimer())  // удаляет таймер.
    endif
    set target = null
endfunction

function Trig_spell1_cast_jass_Actions takes nothing returns nothing
    local timer t = CreateTimer()
    local integer h = GetHandleId(t)
    call TimerStart(t, 0.05, true, function spell1_dmg)
    call SaveUnitHandle(udg_spells_hashtable, h, 0, GetSpellTargetUnit())
    call SaveUnitHandle(udg_spells_hashtable, h, 1, GetSpellAbilityUnit())
    call SaveInteger(udg_spells_hashtable, h, 2, udg_spell1_time_period_count)
    call SaveEffectHandle(udg_spells_hashtable, h, 3, AddSpecialEffectTarget(Effect_A000, GetSpellTargetUnit(), AttEffect_A000))
    set t = null  // обнуление.
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
28
5 лет назад
Отредактирован PT153
0
Апд. Ну и просто советы по улучшению кода принимаются, да. Если вдруг кто захочет...
Все BJ функции на нативки замени. Некоторые просто превращаются в нативки удалением постфикса BJ.
Все локалки, что наследуются от handle, нужно обнулять в конце функции.
После окончания действия таймер нужно удалить, а хеш почистить.

Не понял изначальный вопрос.
0
10
5 лет назад
0
После окончания действия таймер нужно удалить, а хеш почистить.
Как это сделать?
PT153:
Не понял изначальный вопрос.
После того, как пройдёт основное время действия на целевом юните остаётся эффект. То ли не удалённый, то ли удаляемый и вновь создаваемый. Не понимаю.
0
28
5 лет назад
0
Не понимаю.
Так ты же таймер не паузишь и не уничтожаешь, вот он и продолжает тикать.
0
10
5 лет назад
0
Разобрался. Там отображалось уничтожение эффекта, а не сам эффект. Просто уничтожение эффекта как раз вызывалось кучу раз и каждый раз проигрывалась анимация смерти эффекта.
PT153:
Не понимаю.
Так ты же таймер не паузишь и не уничтожаешь, вот он и продолжает тикать.
А как уничтожить-то таймер?
Я просто недавно решил на jass переходить, раньше всё на триггерах сидел... Но всё чаще стал замечать, что желаемое либо нельзя сделать либо можно, но как-то не просто.
1
28
5 лет назад
Отредактирован PT153
1
Переписал код, оставил кое-какие комментарии.
Должен быть включён vJass в JNGP.
раскрыть
globals
    constant string Effect_A000 = "Abilities\\Spells\\Orc\\LightningBolt\\LightningBoltMissile.mdx"
    constant string AttEffect_A000 = "origin"
endglobals

function spell1_dmg takes nothing returns nothing
    local integer h = GetHandleId(GetExpiredTimer())
    local integer tik_count = LoadInteger(udg_spells_hashtable, h, 2)
    // Вместо определения локалок для юнитов, сразу их пихаем в UnitDamageTargetBJ.
    // Локалки всё также можно определить, но после endif их нужно обнулить.
    // set caster = null и set target = null
    call DestroyEffect(LoadEffectHandle(udg_spells_hashtable, h, 3))
    if tik_count > 0 then
        call UnitDamageTargetBJ(LoadUnitHandle(udg_spells_hashtable, h, 1),/*
                             */ LoadUnitHandle(udg_spells_hashtable, h, 0),/*
                             */ udg_spell1_dmg_period_count, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC)
        call DisplayTextToPlayer(GetLocalPlayer(), 0., 0., I2S(tik_count))  // асинхронно, работает по сети.
        call SaveInteger(udg_spells_hashtable, h, 2, tik_count - 1)
        call SaveEffectHandle(udg_spells_hashtable, h, 3, AddSpecialEffectTarget(Effect_A000, GetSpellTargetUnit(), AttEffect_A000))
    else
        call FlushChildHashtable(udg_spells_hashtable, h)  // удаляет все записи с parent ключом h.
        call DestroyTimer(GetExpiredTimer())  // удаляет таймер.
    endif
endfunction

function Trig_spell1_cast_jass_Actions takes nothing returns nothing
    local timer t = CreateTimer()
    local integer h = GetHandleId(t)
    call TimerStart(t, 0.05, true, function spell1_dmg)
    call SaveUnitHandle(udg_spells_hashtable, h, 0, GetSpellTargetUnit())
    call SaveUnitHandle(udg_spells_hashtable, h, 1, GetSpellAbilityUnit())
    call SaveInteger(udg_spells_hashtable, h, 2, udg_spell1_time_period_count)
    call SaveEffectHandle(udg_spells_hashtable, h, 3, AddSpecialEffectTarget(Effect_A000, GetSpellTargetUnit(), AttEffect_A000))
    set t = null
endfunction
0
10
5 лет назад
0
PT153, спасибо.
А что тут vJass требует? Глобалки?
0
28
5 лет назад
0
А что тут vJass требует? Глобалки?
Блок глобалок, что я объявил, и многострочные комментарии /*...*/.
PT153:
Переписал код, оставил кое-какие комментарии.
xD, я просто скопипастил создание эффекта, а ведь нужно было убрать под таймером GetSpellTargetUnit().
Вот так верно будет.
раскрыть
globals
    constant string Effect_A000 = "Abilities\\Spells\\Orc\\LightningBolt\\LightningBoltMissile.mdx"
    constant string AttEffect_A000 = "origin"
endglobals

function spell1_dmg takes nothing returns nothing
    local integer h = GetHandleId(GetExpiredTimer())
    local unit target = LoadInteger(udg_spells_hashtable, h, 0)
    local integer tik_count = LoadInteger(udg_spells_hashtable, h, 2)
    // Вместо определения локалки для кастера, сразу пихаем его в UnitDamageTargetBJ.
    // Локалку всё также можно определить, но после endif её нужно обнулить.
    // set caster = null
    call DestroyEffect(LoadEffectHandle(udg_spells_hashtable, h, 3))
    if tik_count > 0 then
        call UnitDamageTargetBJ(LoadUnitHandle(udg_spells_hashtable, h, 1),/*
                                              */ target, udg_spell1_dmg_period_count, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC)
        call DisplayTextToPlayer(GetLocalPlayer(), 0., 0., I2S(tik_count))  // асинхронно, работает по сети.
        call SaveInteger(udg_spells_hashtable, h, 2, tik_count - 1)
        call SaveEffectHandle(udg_spells_hashtable, h, 3, AddSpecialEffectTarget(Effect_A000, target, AttEffect_A000))
    else
        call FlushChildHashtable(udg_spells_hashtable, h)  // удаляет все записи с parent ключом h.
        call DestroyTimer(GetExpiredTimer())  // удаляет таймер.
    endif
    set target = null
endfunction

function Trig_spell1_cast_jass_Actions takes nothing returns nothing
    local timer t = CreateTimer()
    local integer h = GetHandleId(t)
    call TimerStart(t, 0.05, true, function spell1_dmg)
    call SaveUnitHandle(udg_spells_hashtable, h, 0, GetSpellTargetUnit())
    call SaveUnitHandle(udg_spells_hashtable, h, 1, GetSpellAbilityUnit())
    call SaveInteger(udg_spells_hashtable, h, 2, udg_spell1_time_period_count)
    call SaveEffectHandle(udg_spells_hashtable, h, 3, AddSpecialEffectTarget(Effect_A000, GetSpellTargetUnit(), AttEffect_A000))
    set t = null  // обнуление.
endfunction
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.