У меня тут 2 проблемы. 1) Есть скилл на основе Slow Aura (как у торнадо), который триггерно даётся и удаляется. Я выставил ему вот такие возможные цели: enemies,ground,invulnerable,notself,vulnerable Но он почему то действует на союзников. Хотя в других случаях, с другими спеллами, такая же замедлялка с такими же параметрами действует только на врагов.
2) Обычный триггерный спелл, который при включение периодически замедляет и дамажть близжаших врагов, в течение 30 секунд. Но почему то, то ли юниты не пикаются, то ли урон не наносится, но факт в том, что урона нету ВООБЩЕ.
function SeismicDamagingFilter takes nothing returns boolean return GetOwningPlayer(GetFilterUnit()) != Player(PLAYER_NEUTRAL_PASSIVE) and GetWidgetLife(GetFilterUnit()) > .0 and IsUnitType( GetFilterUnit(), UNIT_TYPE_STRUCTURE ) == false endfunction
function BOLooping takes nothing returns nothing local timer t = GetExpiredTimer() local integer id = GetHandleId(t) local unit u = LoadUnitHandle(udg_Hash, id, 0) local unit ud = LoadUnitHandle(udg_Hash, id, 1) local integer c = LoadInteger(udg_Hash, id, 2) local real d = LoadReal(udg_Hash, id, 3) local group g = CreateGroup() local unit uc local player p1 = GetOwningPlayer(u) local player p2 local real x = GetWidgetX(u) local real y = GetWidgetY(u) local boolexpr bx = Filter(function SeismicDamagingFilter)
call SetUnitPosition( ud, x, y ) call GroupEnumUnitsInRange( g, x, y, 200., bx )
loop set uc = FirstOfGroup(g) exitwhen uc == null call GroupRemoveUnit(g, uc) set p2 = GetOwningPlayer(uc) if p2 != p1 and IsPlayerAlly( p1, p2 ) == false then call UnitDamageTarget( ud, uc, d, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_FORCE, WEAPON_TYPE_WHOKNOWS ) endif endloop
call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl", u, "origin" ) ) call SaveInteger(udg_Hash, id, 2, c + 1) call DestroyGroup(g) call DestroyBoolExpr(bx)
if c > 30 or GetWidgetLife(u) <= 0.0 then call UnitRemoveAbility( u, 'A04T' ) call RemoveUnit(ud) call PauseTimer(t) call DestroyTimer(t) call FlushChildHashtable(udg_Hash, id) endif
set bx = null set t = null set ud = null set u = null set uc = null set p1 = null set p2 = null set g = null endfunction
function BOBuff takes nothing returns nothing local timer t = GetExpiredTimer() local integer id = GetHandleId(t) local timer t1 = CreateTimer() local integer id1 = GetHandleId(t1) local unit u = LoadUnitHandle(udg_Hash, id, 0) local integer l = LoadInteger(udg_Hash, id, 1) local real d = LoadReal(udg_Hash, id, 2) local unit ud = CreateUnit( GetOwningPlayer(u), 'hkni', GetWidgetX(u), GetWidgetY(u), 0.0 )
call DestroyEffect( AddSpecialEffectTarget( "war3mapImported\\BattleCryCaster.mdx", u, "origin" ) ) call UnitAddAbility( u, 'A04T' )
call DestroyTimer(t) call FlushChildHashtable(udg_Hash, id) call SaveAgentHandle(udg_Hash, id1, 0, u) call SaveAgentHandle(udg_Hash, id1, 1, ud) call SaveInteger(udg_Hash, id1, 2, 1) call SaveReal(udg_Hash, id, 3, d) call TimerStart( t1, 1.00, true, function BOLooping ) set t = null set t1 = null set u = null set ud = null endfunction
function Trig_Battle_Orders_Actions takes nothing returns nothing local timer t = CreateTimer() local integer id = GetHandleId(t) local unit u = GetTriggerUnit() local integer l = GetUnitAbilityLevel( u, 'A0BE' ) local integer i = 1 local real d = 9.0
loop exitwhen i > l set d = d + 0.5 * (i + 1) set i = i + 1 endloop
call SaveAgentHandle(udg_Hash, id, 0, u) call SaveInteger(udg_Hash, id, 1, l) call SaveReal(udg_Hash, id, 2, d) call TimerStart( t, 0.30, false, function BOBuff ) set t = null set u = null endfunction
function InitTrig_Battle_Orders takes nothing returns nothing local trigger t = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT ) call TriggerAddCondition( t, Condition( function Trig_Battle_Orders_Conditions ) ) call TriggerAddAction( t, function Trig_Battle_Orders_Actions ) set t = null endfunction
function SeismicDamagingFilter takes nothing returns boolean return GetOwningPlayer(GetFilterUnit()) != Player(PLAYER_NEUTRAL_PASSIVE) and GetWidgetLife(GetFilterUnit()) > .405 and IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == false endfunction
function BOLooping takes nothing returns nothing local timer t = GetExpiredTimer() local integer id = GetHandleId(t) local unit u = LoadUnitHandle(udg_Hash, id, 0) local unit ud = LoadUnitHandle(udg_Hash, id, 1) local integer c = LoadInteger(udg_Hash, id, 2) local real d = LoadReal(udg_Hash, id, 3) local unit uc local player p1 = GetOwningPlayer(u) local player p2 local real x = GetWidgetX(u) local real y = GetWidgetY(u) call SetUnitPosition(ud, x, y) call GroupEnumUnitsInRange(udg_G, x, y, BattleOrder_Range(), Filter(function SeismicDamagingFilter)) loop set uc = FirstOfGroup(udg_G) exitwhen uc == null call GroupRemoveUnit(udg_G, uc) set p2 = GetOwningPlayer(uc) if p2 != p1 and IsPlayerEnemy(p1, p2) then call UnitDamageTarget(ud, uc, d, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_FORCE, null) endif endloop call DestroyEffect(AddSpecialEffectTarget(BattleOrder_LoopEffect(), u, "origin")) call SaveInteger(udg_Hash, id, 2, c + 1) if c > BattleOrder_Tacts() or GetWidgetLife(u) <= .405 then call UnitRemoveAbility(u, BattleOrder_Ability()) call RemoveUnit(ud) call PauseTimer(t) call DestroyTimer(t) call FlushChildHashtable(udg_Hash, id) endif set t = null set ud = null set u = null set p1 = null set p2 = null endfunction
function BOBuff takes nothing returns nothing local timer t = GetExpiredTimer() local integer id = GetHandleId(t) local unit u = LoadUnitHandle(udg_Hash, id, 0) local unit ud = CreateUnit(GetOwningPlayer(u), BattleOrder_DummyId(), GetWidgetX(u), GetWidgetY(u), .0) call DestroyEffect(AddSpecialEffectTarget(BattleOrder_Effect(), u, "origin")) call UnitAddAbility(u, BattleOrder_Ability()) call SaveAgentHandle(udg_Hash, id, 1, ud) call SaveInteger(udg_Hash, id, 2, 1) call TimerStart(t, BattleOrder_Period(), true, function BOLooping) set t = null set u = null set ud = null endfunction
function Trig_Battle_Orders_Actions takes nothing returns nothing local timer t = CreateTimer() local integer id = GetHandleId(t) local unit u = GetTriggerUnit() local integer l = GetUnitAbilityLevel(u, BattleOrder_Spell()) call SaveAgentHandle(udg_Hash, id, 0, u) call SaveReal(udg_Hash, id, 3, BattleOrder_Damage(l)) call TimerStart(t, BattleOrder_Delay(), false, function BOBuff) set t = null set u = null endfunction
function InitTrig_Battle_Orders takes nothing returns nothing local trigger t = CreateTrigger() local unit u = CreateUnit(Player(15), BattleOrder_DummyId(), .0, .0, .0) call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_EFFECT) call TriggerAddCondition(t, Condition(function Trig_Battle_Orders_Conditions)) call TriggerAddAction(t, function Trig_Battle_Orders_Actions) call Preload(BattleOrder_Effect()) call Preload(BattleOrder_LoopEffect()) call UnitAddAbility(u, BattleOrder_Ability()) call RemoveUnit(u) set t = null set u = null endfunction
Вот, немного поправил. Если не будет работать, расставь дебаги, выводи значения переменных.
всегда этого не понимал - зачем создавать лок триггер если глоб триггер сам по себе создается? Или ты используешь вжасс и удаляешь глоб триггеры?
Потому что нету этого глобального триггера. Нету у меня gg_trg_TriggerName. Триггер создаётся только в том случае, если выбран герой, который этот спелл использует, и выбран спелл (у меня спеллы героям выбираются), который запускает этот триггер. Это сделано для оптимизации. У меня так со всем Триггерными спеллами.
SirNikolas, А почему мой вариант не работал? У меня так добрая половина спелов сделана
Сообщение отредактировал FatalBlade - Пятница, 28 Декабря 2012, 19:20:00
Или ты используешь вжасс и удаляешь глоб триггеры?
cJass* Да и это, по идее, оптимизатор должен делать.
Цитата (FatalBlade)
Это будет работать в обычном ВЕ?
Будет. Надо только создать глобальную группу udg_G и закомментировать первые три строки (а, они уже закомментированы). Кстати, я тебе там формулу на урон вывел.
o_O действительно Я всегда ломал голову, как её записать НЕ циклом
А зачем все константные значения выводить в отдельные функции?
Но мне всё же интересно почему не работало? У меня вседь большая часть триггеров так сделана, и всё норм. Возможно из-за этого? call UnitDamageTarget(ud, uc, d, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_FORCE, null) Но у меня так же везде WEAPON_TYPE_WHOKNOWS, и всё норм.
Вообщем спс
Сообщение отредактировал FatalBlade - Пятница, 28 Декабря 2012, 19:39:05
SirNikolas, этот прирост я строил сам, знаю как работает. Просто я никак не мог придумать как её записать не циклом. Это называется Факториал, не?
Цитата (SirNikolas)
Ты там что-то с таймерами после задержки мудрил.
Ну я создал новый таймер, и не ре-юзал старый, потому что не уверен насчёт того, что НЕ периодический таймер можно реюзать как периодический. Да и периодическая функция то запускалась, эффект работал. Тут дело значит либо в пикание юнитов, либо в самом нанесение урона. Хотя я не понимаю почему, ведь всё тут так просто.
И
Цитата (FatalBlade)
1) Есть скилл на основе Slow Aura (как у торнадо), который триггерно даётся и удаляется. Я выставил ему вот такие возможные цели: enemies,ground,invulnerable,notself,vulnerable Но он почему то действует на союзников. Хотя в других случаях, с другими спеллами, такая же замедлялка с такими же параметрами действует только на врагов.
Не. n! = 1 * 2 * 3 * ... * n Либо рекуррентным соотношением: 0! = 1 n! = n * (n - 1)!
Код
function fact takes integer n returns integer local integer result = 1 loop exitwhen n <= 1 set result = result * n set n = n - 1 endloop return result endfunction
function fact_rcsv takes integer n returns integer if n <= 1 then return 1 endif return n * fact_rcsv(n - 1) endfunction
в арифмитической прогрессии разность как констанкта
Добавлено (28 Декабря 2012, 20:06:28) --------------------------------------------- или я лох
Цитата (H_A_PK)
Быдлокодер
FatalBlade, когда здоровье юнита становится равным или меньше .405, он объявляется как мертвый. Проигрывается анимация смерти, все такое, после чего жизнь ставится в ноль. В принципе, .405 - это лишняя защита от чьей-либо тупости. Вдруг кто-нибудь захочет мертвому юниту поставить жизнь в .1? На Хайве все сравнивают с .405.