Нет, скорее всего будет десинх, попробуй лучше локально запускать его через TriggerExecute()
Это как?
Quote (FkoFF)
Вопрос в лоб - а зачем?
Есть у меня в карте спелл, который поднимает цель в воздух, а затем отпускает её, и та падая, получает урон. Урон так же наносится всем вражеским юнитам вокруг падения. Сама абилка сделана на основе Aerial Shackles, то что у расы Алльянса у наездниках на драконах, которая связывает сетью вражеского летучего юнита.
Вообщем абилка кастуется 2 секунды, это как раз то время что у меня герой должен поднимать цель ввоздух. Вообщем тут естественно событие SPELL_CAST а не SPELL_EFFECT. Оно то конечно же работает, но вчера тестил карту, и нашёл баг связанный со спеллом. Если во время того, или немного до того, как цель поднимается ввоздух, она уходит в инвиз, то сам триггер срабатывает 2 раза. Короче юнита 2 раза поднимает вверх и снова опускает. Я так понял дело в инвизе, потому что код уже давно прекрасно работает, но инвиз это инвиз, он тоже нужен.
Так вот нужно просто сделать так что бы триггер в течение нескольки секунд не срабатывал для данного игрока владельца кастера.
local boolean b = true If GetLocalPlayer() == GetOwningPlayer(GetSpellAbilityUnit()) then set b = false endif if(b == true) then DisableTrigger(GetTriggeringTrigger()) endif
Я не пойму, зачем выключать триггер для игрока, если можно поставить условие, что GetTriggerUnit() не находится в группе кастовавших в ближайшую секунду.
Глупости. SPELL_EFFECT можно использовать практически везде. И инвизом он сбиваться не должен.
Тут продолжительный каст, и триггер должен срабатывать когда каст начинается а не заканчивается. Юнита должно поднимать когда герой только начинает каст
Я не пойму, зачем выключать триггер для игрока, если можно поставить условие, что GetTriggerUnit() не находится в группе кастовавших в ближайшую секунду.
Тут продолжительный каст, и триггер должен срабатывать, когда каст начинается, а не заканчивается. Юнита должно поднимать, когда герой только начинает каст
Если во время того, или немного до того, как цель поднимается ввоздух, она уходит в инвиз, то сам триггер срабатывает 2 раза
с какого фига она будет кастоваться 2 раза? если юнит завершил преанимацию каста и спелл физически "был применён" то невидимая цель будет ВИДИМА игроку который поймал инвизера если юнит завершил преанимацию каста, но цели он не видит, то каст сработать не может и событие "юнит применил спел" не сработает!
только что тестил...
если у тебя идёт 1й каст а потом 2й, то у тебя в триггерах должна быть пробита работа с "юнит прекратил применение" в котором будет завершение действия и падение цели... И... в этот момент у тебя начинается новый каст и все данный должны работать с нуля... если канешно ты не берёшь за высоту юнита его "текущую высоту"...
а вообще я хз чё там можно было натворить... оп идее всё просто и реализуемо даж на гуи ._. а ты там в жассе ковыряешься не можешь решить
если у тебя идёт 1й каст а потом 2й, то у тебя в триггерах должна быть пробита работа с "юнит прекратил применение" в котором будет завершение действия и падение цели... И... в этот момент у тебя начинается новый каст и все данный должны работать с нуля... если канешно ты не берёшь за высоту юнита его "текущую высоту"...
У меня юнит поднимается на одну и ту же максимальную высоту и затем падает, даже если кастер прекратил приминение.
Про инвиз. Сначала, если на цель заюзан спелл, а сама цель сразу после этого уходит в инвиз, то цель всё ешё видна герою, и на неё срабатывает триггер, то есть поднимает ввоздух итд. Затем, после того как цель уже упала на землю, триггер срабатывает снова. Почему?
function TKFinish takes nothing returns nothing local timer t = GetExpiredTimer() local integer id = GetHandleId(t) local unit ud2 = LoadUnitHandle(udg_Hash, id, 0) call FlushChildHashtable(udg_Hash, id) call RemoveUnit(ud2) call DestroyTimer(t) set t = null set ud2 = null endfunction
function TKEnd takes nothing returns nothing local timer t = GetExpiredTimer() local integer id = GetHandleId(t) local timer t1 = CreateTimer() local integer id1 = GetHandleId(t1) local integer l = LoadInteger(udg_Hash, id, 0) local unit u1 = LoadUnitHandle(udg_Hash, id, 1) local unit u2 = LoadUnitHandle(udg_Hash, id, 2) local unit ud1 local unit ud2 local integer o1 = GetPlayerId(GetOwningPlayer(u1)) + 1 local real d = 60 local integer i = 1 call SetUnitFlyHeight( u2, 0.00, 0.00 )
loop exitwhen i > l set d = d + 7.5 * (l + 1) set i = i + 1 endloop
call UnitAddAbility( u1, 'A0FP' ) call FlushChildHashtable(udg_Hash, id) call SaveAgentHandle(udg_Hash, id1, 0, ud2) call RemoveUnit(ud1) call DestroyTimer(t) call TimerStart( t1, 1.00, true, function TKFinish ) set t = null set ud1 = null set ud2 = null set u1 = null set u2 = null endfunction
function TKFall takes nothing returns nothing local timer t1 = GetExpiredTimer() local integer id1 = GetHandleId(t1) local real h = LoadReal(udg_Hash, id1, 0) local unit u2 = LoadUnitHandle(udg_Hash, id1, 1) local real g = LoadReal(udg_Hash, id1, 2)
call SetUnitFlyHeight( u2, h, 0.00 ) call DestroyEffect( AddSpecialEffectTarget( "Objects\\Spawnmodels\\Undead\\ImpaleTargetDust\\ImpaleTargetDust.mdl", u2, "chest" ) ) set h = h - g set g = g + 1 call SaveReal(udg_Hash, id1, 0, h) call SaveReal(udg_Hash, id1, 2, g) if h <= 0 then call PauseTimer(t1) call FlushChildHashtable(udg_Hash, id1) call DestroyTimer(t1) endif set t1 = null set u2 = null endfunction
function TKStop takes nothing returns nothing local timer t = GetExpiredTimer() local integer id = GetHandleId(t) local integer l = LoadInteger(udg_Hash, id, 0) local unit u1 = LoadUnitHandle(udg_Hash, id, 2) local unit u2 = LoadUnitHandle(udg_Hash, id, 3) local timer t1 = CreateTimer() local integer id1 = GetHandleId(t1) local timer t2 = CreateTimer() local integer id2 = GetHandleId(t2) local real h = GetUnitFlyHeight(u2) local real g = 0.00 local force f = CreateForce()
call ForceAddPlayer( f, GetOwningPlayer(u1) ) call SetUnitInvulnerable( u1, false ) call PauseUnit( u2, false ) if IsPlayerInForce( GetLocalPlayer(), f ) then call EnableUserControl(true) endif
call FlushChildHashtable(udg_Hash, id) call DestroyTimer(t) call DestroyForce(f) call TimerStart( t1, 0.04, true, function TKFall ) call TimerStart( t2, 1.70, false, function TKEnd ) set t = null set f = null set t1 = null set t2 = null set u1 = null set u2 = null endfunction
function TKRaise takes nothing returns nothing local timer t1 = GetExpiredTimer() local integer id1 = GetHandleId(t1) local real h = LoadReal(udg_Hash, id1, 0) local unit u2 = LoadUnitHandle(udg_Hash, id1, 1)
call SetUnitFlyHeight( u2, h, 0.00 ) set h = h + 25.00 call SaveReal(udg_Hash, id1, 0, h) if h >= 1000 then call PauseTimer(t1) call FlushChildHashtable(udg_Hash, id1) call DestroyTimer(t1) endif set t1 = null set u2 = null endfunction
function TKStart takes nothing returns nothing local timer t = GetExpiredTimer() local integer id = GetHandleId(t) local timer t1 = CreateTimer() local integer id1 = GetHandleId(t1) local timer t2 = CreateTimer() local integer id2 = GetHandleId(t2) local integer l = LoadInteger(udg_Hash, id, 0) local unit u1 = LoadUnitHandle(udg_Hash, id, 1) local unit u2 = LoadUnitHandle(udg_Hash, id, 2) local real h = 25.00 local force f = CreateForce() call ForceAddPlayer( f, GetOwningPlayer(u1) )
if IsPlayerInForce( GetLocalPlayer(), f ) then call EnableUserControl(false) endif call PauseUnit( u2, true )
call TimerStart( t1, 0.05, true, function TKRaise ) call TimerStart( t2, 2.00, false, function TKStop ) set t = null set f = null set t1 = null set t2 = null set u1 = null set u2 = null endfunction
function Trig_Telekinesis_Actions takes nothing returns nothing local timer t = CreateTimer() local integer id = GetHandleId(t) local unit u1 = GetTriggerUnit() local unit u2 = GetSpellTargetUnit() local integer l = GetUnitAbilityLevel( u1, 'A0H4' )
call UnitRemoveAbility( u1, 'A0FP' ) call SetUnitInvulnerable( u1, true ) call SaveInteger(udg_Hash, id, 0, l) call SaveAgentHandle(udg_Hash, id, 1, u1) call SaveAgentHandle(udg_Hash, id, 2, u2) call TimerStart( t, 0.05, false, function TKStart ) set t = null set u1 = null set u2 = null endfunction
//=========================================================================== function InitTrig_Telekinesis takes nothing returns nothing set gg_trg_Telekinesis = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_Telekinesis, EVENT_PLAYER_UNIT_SPELL_EFFECT ) call TriggerAddCondition( gg_trg_Telekinesis, Condition( function Trig_Telekinesis_Conditions ) ) call TriggerAddAction( gg_trg_Telekinesis, function Trig_Telekinesis_Actions ) endfunction
Сообщение отредактировал FatalBlade - Суббота, 17 Декабря 2011, 15:32:27
local timer t1 = CreateTimer() //... local timer t2 = CreateTimer()
Вместо одного из них лучше использовать истекший таймер. В других функциях то же самое. Кстати, вместо того, чтобы отключать контроль игроку мог бы сделать заклинание на "Канале".
Добавлено (17 Декабрь 2011, 15:40:00) --------------------------------------------- А в остальном нормально.