XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
alexkill

offline
Опыт: 18,872
Активность:
Отмена действия способности
Сделал заклинание, действующее по принципу "Покоя", "Звездопада"... (когда герой опредленное время кастует, не может двигаться, атаковать и т.п.)

Все работает, но вот вопрос: как правильно отменяется действие спелла подобного рода?
Это в моменты, когда прекращается действие способности, либо героя оглушают.

Вот собственно сам спелл:

Код:
function Element_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A002' 
endfunction

function EnemyFilter takes nothing returns boolean
  local timer s = GetExpiredTimer()
  local unit c = I2U(get_object_iparam(s, "caster"))
  return IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == false and IsUnitType(GetFilterUnit(), UNIT_TYPE_MAGIC_IMMUNE) == false and IsUnitType(GetFilterUnit(), UNIT_TYPE_MECHANICAL) == false and IsUnitType(GetFilterUnit(), UNIT_TYPE_ANCIENT) == false and IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(c)) == true and GetWidgetLife(GetFilterUnit()) > 0.405 
endfunction

function Element_Attack takes nothing returns nothing
  local timer s = GetExpiredTimer()
  local unit c = I2U(get_object_iparam(s, "caster"))
  local unit sphere = I2U(get_object_iparam(s, "sphere"))
  local real X = GetUnitX(c) 
  local real Y = GetUnitY(c)
  local group gr = CreateGroup()
  local unit first
  local real dur = get_object_rparam(s, "dur")
  local filterfunc ff = Filter(function EnemyFilter)
  call GroupEnumUnitsInRange(gr,X, Y,750,ff)
  call DestroyFilter(ff)
   if dur <= 9 then
    loop
      set first = GroupPickRandomUnit(gr)
    exitwhen first==null 
      call IssueTargetOrderById( sphere, OrderId("chainlightning"), first )
      call UnitResetCooldown( sphere )
       //  call AddSpecialEffectTarget( "Objects\\Spawnmodels\\Undead\\UndeadDissipate\\UndeadDissipate.mdl", first, "origin")
       //  call DestroyEffect(AddSpecialEffectTarget( "Objects\\Spawnmodels\\Undead\\UndeadDissipate\\UndeadDissipate.mdl", first, "origin"))
      call GroupRemoveUnit(gr, first)
      
    endloop    
      call set_object_rparam(s, "dur", dur+1)
       call BJDebugMsg("i_my "+R2S(dur))
   else
      call KillUnit(sphere)
      call DestroyTimer(s)
      call flush_object(s)
   endif
  call DestroyGroup(gr)
  set gr = null
  set first = null
endfunction

function Element_Actions takes nothing returns nothing
 local timer s = CreateTimer()
 local unit c = GetTriggerUnit()
 local unit sphere = CreateUnit(GetOwningPlayer(c),'u000',GetUnitX(c),GetUnitY(c),bj_UNIT_FACING)
 call set_object_iparam (s, "sphere", H2I(sphere))
 call set_object_iparam (s, "caster", H2I(c))
 call set_object_rparam(s, "dur", 0.)
 call TimerStart(s, 1.8, true, function Element_Attack)
 set c = null
 set sphere = null
 set s = null
endfunction

function InitTrig_Element takes nothing returns nothing
  local trigger Element
  set Element = CreateTrigger(  )
  call TriggerRegisterAnyUnitEventBJ( Element, EVENT_PLAYER_UNIT_SPELL_EFFECT )
  call TriggerAddCondition( Element, Condition( function Element_Conditions ) )
  call TriggerAddAction( Element, function Element_Actions )
endfunction
Старый 04.07.2008, 14:53
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
alexkill
Order stop?
Старый 04.07.2008, 15:26
J
expert
offline
Опыт: 48,447
Активность:
атачи на юнита хендл таймера
когда с юнит происходит чтото что должно остановить способность, то вытаскивай из него таймер а из таймера все остальное, очищяй и удаляй
Старый 04.07.2008, 15:31
alexkill

offline
Опыт: 18,872
Активность:
Цитата:
Сообщение от Hellfim
alexkill
Order stop?


Неа. Способность-то приостановится, но дамми все равно будет атаковать врага.

alexkill добавил:
Цитата:
Сообщение от Jon
атачи на юнита хендл таймера
когда с юнит происходит чтото что должно остановить способность, то вытаскивай из него таймер а из таймера все остальное, очищяй и удаляй


Jon, таймер приаттачен.

Ты имеешь ввиду проверять условием жив ли юнит, либо у него есть бафф "Оглушение"?

Вот здесь?
Код:
..if dur <= 9 and IsUnitDead(...)... and UnitHasBuffBJ (...)... then...
Старый 04.07.2008, 15:41
J
expert
offline
Опыт: 48,447
Активность:
вообщето я сказал несколько другое... но можно и так)
Старый 04.07.2008, 15:49
alexkill

offline
Опыт: 18,872
Активность:
Скажи, как хотел ты (а лучше покажи). Может, у тебя оптимальнее вариант )
Я, кстати, еще видал в наработке LordOfChaos, что выполняется проверка булевким оператором. В принципе, наверное, любой способ хорош, лишь бы правильно и рационально применялси. Поэтому оптимальность сложно уловить. Мб, я ошибаюсь...
Старый 04.07.2008, 15:58
J
expert
offline
Опыт: 48,447
Активность:
я сказал приатачить на самого юнита таймер его спела
создать еще один тригер, например с событием юнит умирает, в услових проверяй есть ли у юнита эта спообность, в действиях достовай из юнита таймер, если его нет значит прекращай действия, если есть то доставай из таймера дами, удаляй его, очищай кещ на таймере, удаля сам таймер, очищай кеш на самом юните
Старый 04.07.2008, 16:02
alexkill

offline
Опыт: 18,872
Активность:
Цитата:
Сообщение от Jon
я сказал приатачить на самого юнита таймер его спела
создать еще один тригер, например с событием юнит умирает....


Как вариант... Попробую. Спасибо, Jon, как всегда помог.
Старый 04.07.2008, 16:06
Toadcop

offline
Опыт: 54,313
Активность:
блин есть евент. стоп кастинг или чё то вроде... сейчас.
call TriggerRegisterUnitEvent(t , u , EVENT_UNIT_SPELL_EFFECT) - начал кастить
call TriggerRegisterUnitEvent(t , u , EVENT_UNIT_SPELL_ENDCAST) - "закончил" кастить конец ЛЮБОГО рода. т.е. просто "всё конец".
вот и всё создавай триггеры на эти события.
никакие таймеры и т.п. не нужны.
а да это персональные евенты есть и глобальные такие же.
Старый 04.07.2008, 16:11
J
expert
offline
Опыт: 48,447
Активность:
alexkill если у тебя задержа юнита указано в ро а не осуществена тригерно, как я вижу, то тогда используй то событие что сказал тоадкоп, хотя я не понял почему сдесь без таймеров можно обойтись
Старый 04.07.2008, 16:15
Toadcop

offline
Опыт: 54,313
Активность:
я не про саму конструкцыю спелла... а про евенты начала и конца каста. ну на евенте тупо паузить таймер и всё... ну или старт с 0 без действия.
ну а вообщем такие вопросы простые и не интересные =)
Старый 04.07.2008, 16:36
J
expert
offline
Опыт: 48,447
Активность:
Toadcop неговори, я даже удивался когда ты ответил на него ^^
Старый 04.07.2008, 16:54
alexkill

offline
Опыт: 18,872
Активность:
Собственно это больше размышления, чем вопрос. Всем спасибо, закрыто!
когда будет закрыто решаем мы :Р ну это тока. т.е. смысла с закрытых тем нету. их имеет закрывать тогда когда они перестают что то что совсем не связано с темой =) (и когда эта тема являетьса популряной для такого рода срачя)

Отредактировано Toadcop, 04.07.2008 в 17:45.
Старый 04.07.2008, 17:01
ScorpioT1000
Работаем
offline
Опыт: отключен
Цитата:
call TriggerRegisterUnitEvent(t , u , EVENT_UNIT_SPELL_EFFECT) - начал кастить

False, сам попробуй

У мня срабатывал када тока уже прошло "Время подготовки заклинания". Ведь время подготовки по сути и есть начала каста(напр. тот же WoW)
Старый 05.07.2008, 00:06
Toadcop

offline
Опыт: 54,313
Активность:
ScorpioT1000 афаик нет. ну эт оне есеншиал =) моя задачя была расказать о конечном евенте т.е. который срабатывает при прекращение каста.
Старый 05.07.2008, 00:36
ScorpioT1000
Работаем
offline
Опыт: отключен
Даж прально переведено: "Приводит способность в действие" =)

Создавай тогда отдельно триггер с эвентом, но тогда его дестроить придется отдельным потоком.. либо создать триггер прямо в we а это уже аж2 трига на 1 спелл тт
Попробуй сначало таймерами

(и зачем я в этот срач влез^^)
Старый 05.07.2008, 00:54
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 11:38.