function Trig_cast_Timer takes nothing returns nothing local timer ta = GetExpiredTimer() local integer i = GetHandleId(ta) local unit t = LoadUnitHandle(udg_Hash, i, 1) local unit u = LoadUnitHandle(udg_Hash, i, 0) local location p = LoadLocationHandle(udg_Hash, i, 2) call DestroyEffect(AddSpecialEffectTarget("Abilities\\Weapons\\Bolt\\BoltImpact.mdl", t, "chest")) call UnitDamageTarget(u, t, 300., true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS) call SetUnitPositionLoc(t, p) call DestroyTimer(ta) call RemoveLocation(p) call FlushChildHashtable(udg_Hash, i) set t=null set u=null endfunction
function Trig_cast_Actions takes nothing returns nothing local timer ta local integer i set ta = CreateTimer() set i = GetHandleId(ta) if GetSpellAbilityId() == 'A000' then call SaveUnitHandle(udg_Hash, i, 0, GetTriggerUnit()) call SaveUnitHandle(udg_Hash, i, 1, GetSpellTargetUnit()) call SaveLocationHandle(udg_Hash, i, 2, GetUnitLoc(GetSpellTargetUnit())) call TimerStart(ta, 5., true, function Trig_cast_Timer) set ta = null endif endfunction
//=========================================================================== function InitTrig_cast takes nothing returns nothing local trigger trig=CreateTrigger( ) local integer index=0 loop call TriggerRegisterPlayerUnitEvent(trig, Player(index), EVENT_PLAYER_UNIT_SPELL_CAST , null) set index = index + 1 exitwhen index == bj_MAX_PLAYER_SLOTS endloop call TriggerAddAction( trig, function Trig_cast_Actions ) set trig=null endfunction
Во-первых, нужно писать не EVENT_PLAYER_UNIT_SPELL_CAST (Начинает применять способность), а EVENT_PLAYER_UNIT_SPELL_EFFECT (Приводит способность в действие). Во-вторых, в функции Trig_cast_Actions ты сначала создаешь таймер, а потом проверяешь способность, а нужно наоборот. В-третьих, лучше работать не с точками, а с координатами.
Добавлено (26-12-2010, 20:37) --------------------------------------------- Вот, с х и у. Что еще оптимизировать?
Code
function Trig_cast_Timer takes nothing returns nothing local timer ta = GetExpiredTimer() local integer i = GetHandleId(ta) local unit t = LoadUnitHandle(udg_Hash, i, 1) local unit u = LoadUnitHandle(udg_Hash, i, 0) local real x = LoadReal(udg_Hash, i, 2) local real y = LoadReal(udg_Hash, i, 3) call DestroyEffect(AddSpecialEffectTarget("Abilities\\Weapons\\Bolt\\BoltImpact.mdl", t, "chest")) call UnitDamageTarget(u, t, 300., true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS) call SetUnitPosition(t,x,y) call PauseTimer(ta) call DestroyTimer(ta) call FlushChildHashtable(udg_Hash, i) set t=null set u=null endfunction
function Trig_cast_Actions takes nothing returns nothing local timer ta local integer i if GetSpellAbilityId() == 'A000' then set ta = CreateTimer() set i = GetHandleId(ta) call SaveUnitHandle(udg_Hash, i, 0, GetTriggerUnit()) call SaveUnitHandle(udg_Hash, i, 1, GetSpellTargetUnit()) call SaveReal(udg_Hash, i, 2, GetWidgetX(GetSpellTargetUnit())) call SaveReal(udg_Hash, i, 3, GetWidgetY(GetSpellTargetUnit())) call TimerStart(ta, 5., true, function Trig_cast_Timer) set ta = null endif endfunction
//=========================================================================== function InitTrig_cast takes nothing returns nothing local trigger trig=CreateTrigger( ) local integer index=0 loop call TriggerRegisterPlayerUnitEvent(trig, Player(index), EVENT_PLAYER_UNIT_SPELL_EFFECT , null) set index = index + 1 exitwhen index == bj_MAX_PLAYER_SLOTS endloop call TriggerAddAction( trig, function Trig_cast_Actions ) set trig=null endfunction
function Trig_cast_Timer takes nothing returns nothing local timer ta = GetExpiredTimer() local integer i = GetHandleId(ta) local unit t = LoadUnitHandle(udg_Hash, i, 1) local unit u = LoadUnitHandle(udg_Hash, i, 0) local real x = LoadReal(udg_Hash, i, 2) используется 1 раз в коде - незачем подргружать в переменную local real y = LoadReal(udg_Hash, i, 3) аналогично с предыдущим действием call DestroyEffect(AddSpecialEffectTarget("Abilities\\Weapons\\Bolt\\BoltImpact.mdl", t, "chest")) call UnitDamageTarget(u, t, 300., true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS) call SetUnitPosition(t,x,y) call PauseTimer(ta) ненужное действие call DestroyTimer(ta) call FlushChildHashtable(udg_Hash, i) set t=null set u=null А таймер и не обнулил - утечка endfunction
function Trig_cast_Actions takes nothing returns nothing local timer ta здесь должно быть создание таймера, смотри мой вариант. local integer i устанавливай значение переменных при инициализации if GetSpellAbilityId() == 'A000' then вообще это должно быть условием триггера а не кода. Ибо поток и память выделяются. собсна - бред set ta = CreateTimer() ненужное действие set i = GetHandleId(ta) ненужное действие call SaveUnitHandle(udg_Hash, i, 0, GetTriggerUnit()) call SaveUnitHandle(udg_Hash, i, 1, GetSpellTargetUnit()) этот юнит должен быть впеременной call SaveReal(udg_Hash, i, 2, GetWidgetX(GetSpellTargetUnit())) call SaveReal(udg_Hash, i, 3, GetWidgetY(GetSpellTargetUnit())) call TimerStart(ta, 5., true, function Trig_cast_Timer) true здесь точно не нужен set ta = null при твоей конструкции - конечно можно, однако по нормальному при присвоении переменной в ините - обнуление переменной тоже должно быть в ините endif endfunction
function Trig_cast_Timer takes nothing returns nothing local timer ta = GetExpiredTimer() local integer i = GetHandleId(ta) local unit t = LoadUnitHandle(udg_Hash, i, 1) local unit u = LoadUnitHandle(udg_Hash, i, 0) call DestroyEffect(AddSpecialEffectTarget("Abilities\\Weapons\\Bolt\\BoltImpact.mdl", t, "chest")) call UnitDamageTarget(u, t, 300., true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS) call SetUnitPosition(t,LoadReal(udg_Hash, i, 2) ,LoadReal(udg_Hash, i, 3) ) call DestroyTimer(ta) call FlushChildHashtable(udg_Hash, i) set t=null set u=null set ta = null endfunction
function Trig_cast_Actions takes nothing returns nothing local timer ta = CreateTimer() local unit u = GetSpellTargetUnit() local integer i = GetHandleId(ta)
call SaveUnitHandle(udg_Hash, i, 0, GetTriggerUnit()) call SaveUnitHandle(udg_Hash, i, 1, u) call SaveReal(udg_Hash, i, 2, GetWidgetX(u)) call SaveReal(udg_Hash, i, 3, GetWidgetY(u)) call TimerStart(ta, 5., false, function Trig_cast_Timer)
set ta = null set u = null endfunction
function InitTrig_cast takes nothing returns nothing local trigger trig=CreateTrigger( ) local integer index=0 loop call TriggerRegisterPlayerUnitEvent(trig, Player(index), EVENT_PLAYER_UNIT_SPELL_EFFECT , null) set index = index + 1 exitwhen index == bj_MAX_PLAYER_SLOTS endloop call TriggerAddAction( trig, function Trig_cast_Actions ) call TriggerAddCondition(trig, Condition(function Pew_pew_cond)) set trig=null endfunction