Вот мой изначальный код без неудачных попыток решения проблемы:
function Trig_Hishenie_Conditions takes nothing returns boolean
    return GetUnitTypeId(GetSpellAbilityUnit()) == 'H01G' and GetSpellAbilityId() == 'A03O'
endfunction

function Hishenie_timer takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local unit cast = LoadUnitHandle(udg_Hash[11],GetHandleId(t),1)
    local integer i = LoadInteger(udg_Hash[11],GetHandleId(t),2)
    if i == 15 then
    call SetUnitAbilityLevelSwapped( 'A03Q', cast, 1 )
    call SetUnitAbilityLevelSwapped( 'A03P', cast, 1 )
    call FlushChildHashtable(udg_Hash[11],GetHandleId(t))
    call DestroyTimer(t)
    set cast = null
    set t = null
    else
    set i = i + 1
    call SaveInteger(udg_Hash[11],GetHandleId(t),2,i)
    endif
endfunction

function Trig_Hishenie_Actions takes nothing returns nothing
    local timer t = CreateTimer()
    local unit cast = GetSpellAbilityUnit()
    local unit target = GetSpellTargetUnit()
    local integer i = 0
    local integer at = GetUnitAbilityLevelSwapped('A03P', cast) + 1
    local integer df = GetUnitAbilityLevelSwapped('A03Q', cast) + 1
    if GetHeroStatBJ(bj_HEROSTAT_STR, cast, false) > GetHeroStatBJ(bj_HEROSTAT_AGI, cast, false) then
        if df <= GetUnitAbilityLevelSwapped('A03O', cast) + 6 then
        call SetUnitAbilityLevelSwapped( 'A03Q', cast, df )
        endif
        call UnitDamageTargetBJ( cast, target, ( I2R(GetHeroStatBJ(bj_HEROSTAT_STR, cast, true)) * 2.50 ), ATTACK_TYPE_MELEE, DAMAGE_TYPE_NORMAL )
        call IssueTargetOrder( target, "attack", cast )
    endif
    if GetHeroStatBJ(bj_HEROSTAT_STR, cast, false) < GetHeroStatBJ(bj_HEROSTAT_AGI, cast, false) then
        if at <= GetUnitAbilityLevelSwapped('A03O', cast) + 6 then
        call SetUnitAbilityLevelSwapped( 'A03P', cast, at )
        endif
        call UnitDamageTargetBJ( cast, target, ( I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, cast, true)) * 5.00 ), ATTACK_TYPE_MELEE, DAMAGE_TYPE_NORMAL )
        call SetUnitInvulnerable( cast, true )
        call TriggerSleepAction( 0.50 )
        call SetUnitInvulnerable( cast, false )
    endif
    call SaveUnitHandle(udg_Hash[11],GetHandleId(t),1,cast)
    call SaveInteger(udg_Hash[11],GetHandleId(t),2,i)
    call TimerStart(t,1.00,true,function Hishenie_timer)
endfunction

//===========================================================================
function InitTrig_Hishenie takes nothing returns nothing
    set gg_trg_Hishenie = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Hishenie, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Hishenie, Condition( function Trig_Hishenie_Conditions ) )
    call TriggerAddAction( gg_trg_Hishenie, function Trig_Hishenie_Actions )
endfunction
Мне нужно чтоб после каждого применения способности таймер обновлялся, отсчёт начинался с нуля. Знаю можно заменить local integer i на глобальную переменную. Но тогда разве оно не будет создавать кучу таймеров? Или единственный выход взять глобальную переменную таймера?
Помогите пожалуйста!

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

вот у нас есть кастер caster, по хэндлу кастера id мы загружаем таймер t, короче значение из хэша записываем в локалку t. И проверяем t. Если переменная t пуста, значит создать заново.
local unit caster = GetSpellAbilityUnit() 
local integer id = GetHandleId(u)
local timer t = LoadTimerHandle(udg_Hash,id,0) //если ничего не сохраняли, то вернет null
if t == null then //переменная t пуста, значит создать новый таймер и запустить
	set t = CreateTimer()
	call LoadTimerHandle(udg_Hash, id, 0, t) //сохранить таймер в хэш по хэндлу кастера
	call TimerStart(t,1.00,true,function Hishenie_timer) //запустить периодический таймер
else
	//иначе если таймер создан, то нужно обнулить счетчики
	//все значения (типа счетчики), которые были ранее сохранены в хэш-таблице, можно обнулить	 
endif
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
19
7 лет назад
0
Похожие вопросы:

ответ
Ige, да о чем вы говорите. ИМХО, самое оптимальное предложение содержится в 3 комментарии.
И еще тут много лишних функций. Да и просто первый признак jass - отсутствие бж за исключением дебага( хоть мои слова кажется трепом и выпендрежем, но без чистого скрипта на нативах.... )

4
27
7 лет назад
Отредактирован MpW
4
вот у нас есть кастер caster, по хэндлу кастера id мы загружаем таймер t, короче значение из хэша записываем в локалку t. И проверяем t. Если переменная t пуста, значит создать заново.
local unit caster = GetSpellAbilityUnit() 
local integer id = GetHandleId(u)
local timer t = LoadTimerHandle(udg_Hash,id,0) //если ничего не сохраняли, то вернет null
if t == null then //переменная t пуста, значит создать новый таймер и запустить
	set t = CreateTimer()
	call LoadTimerHandle(udg_Hash, id, 0, t) //сохранить таймер в хэш по хэндлу кастера
	call TimerStart(t,1.00,true,function Hishenie_timer) //запустить периодический таймер
else
	//иначе если таймер создан, то нужно обнулить счетчики
	//все значения (типа счетчики), которые были ранее сохранены в хэш-таблице, можно обнулить	 
endif
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.