Добавлен VovkaShyt
Вот мой изначальный код без неудачных попыток решения проблемы:
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
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован MpW