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

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

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

offline
Опыт: 18,872
Активность:
Способность отразить удары
Вот код спелла:

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

function Effect takes nothing returns nothing
    local trigger t = GetTriggeringTrigger()
    local unit u = GetTriggerUnit()
    local real damage = GetEventDamage()  
    call BJDebugMsg("Beet!")
    call SetWidgetLife(u,GetWidgetLife(u)+damage) 
endfunction

function Actions takes nothing returns nothing
    local trigger t = CreateTrigger()
    local unit u = GetSpellTargetUnit()
    call TriggerRegisterUnitEvent (t, u, EVENT_UNIT_DAMAGED) 
    call TriggerAddAction (t, function Effect)
    set u = null
    set t= null
endfunction

//===========================================================================
function InitTrig_Armor takes nothing returns nothing
    set gg_trg_Armor = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Armor, EVENT_PLAYER_UNIT_SPELL_CHANNEL )
    call TriggerAddCondition( gg_trg_Armor, Condition( function Conditions ) )
    call TriggerAddAction( gg_trg_Armor, function Actions )
endfunction


Урон при атаке юнита, применившего спелл, поглощается. То есть юнит становится неуязвимым.

Вопрос: почему не поглощается первый удар? Защита начинает работать только со второго, иногда даже и с третьего.
Старый 16.07.2008, 13:27
__Dark Lord__

offline
Опыт: 5,262
Активность:
Мб событие EVENT_UNIT_DAMAGED срабатывает после получения урона юнитом.
Нужно использовать EVENT_UNIT_ATTACKED.
Старый 16.07.2008, 13:44
alexkill

offline
Опыт: 18,872
Активность:
Нет, конечно. Ничего вообще не произойдет. GetEventDamage() не отследится.
Старый 16.07.2008, 13:52
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Дело в том, что действие, указанное в триггере, выполняется немного раньше, чем собственно событие.
То есть мы сначала прибавляем кол-во здоровья равное величине урона, а затем наносится урон. Поэтому, если юнит полностью здоров, то спелл работает некорректно.
Старый 16.07.2008, 14:14
alexkill

offline
Опыт: 18,872
Активность:
Это я тоже заметил. Каков же выход? Создавать еще один динамический триггер с событием EVENT_UNIT_ATTACKED?

alexkill добавил:
Или делать проверку на процент здоровья героя?
Старый 16.07.2008, 14:26
S

offline
Опыт: 43,833
Активность:
возможно, перед добавлением жизни ставить небольшой вэйт, равный скорости атаки самого медлительного юнита? =)
Старый 16.07.2008, 16:36
w3soft
ТГБ тим
offline
Опыт: 1,769
Активность:
Поставить условие с проверкой хп и всего
Старый 17.07.2008, 09:05
Strayiker
Warcraft Forever
offline
Опыт: 3,406
Активность:
Если нужна именно способность отражать удары, юзай способность "Каменные доспехи" у эльфов. ;)
Когда юнит кастует 'A001' заменяй её на "Каменные доспехи" и всё.

Strayiker добавил:
В параметре "Отклонённый урон" поставь 100000000
Старый 17.07.2008, 14:03
agentex

offline
Опыт: 34,834
Активность:
реализовавывал тоже самое на ГУИ, все было норм... правда проверка у меня была не на каст способности, а на значение лог. переменной
Старый 17.07.2008, 17:30
Sebra

offline
Опыт: 5,603
Активность:
Проверяй, сколько смог добавить, добавку остального вешай на триггер по условию "жизнь юнита меньше... максимума".
Старый 17.07.2008, 18:33
alexkill

offline
Опыт: 18,872
Активность:
Цитата:
Сообщение от Strayiker
Если нужна именно способность отражать удары, юзай способность "Каменные доспехи" у эльфов. ;)


Strayiker, не только. Иначе бы не спрашивал. )

alexkill добавил:
Цитата:
Сообщение от Sasha
возможно, перед добавлением жизни ставить небольшой вэйт, равный скорости атаки самого медлительного юнита? =)


Не вариант. Тогда видно, как скачет хп!
Старый 18.07.2008, 10:54
Strayiker
Warcraft Forever
offline
Опыт: 3,406
Активность:
alexkill попробуй создавать глобалку и в неё записывать значение хп юнита на момент использования абилки, затем
событие: "у юнита хп < чем значение в глобалке"
действие: "установить хп = значению в глобалке"

событие: "у юнита хп > чем значение в глобалке"
действие: "установить глобалку = текущему значению хп юнита"

хз, так впринципе должно работать, хоть и неочень оптимально ;)
Старый 18.07.2008, 12:41
alexkill

offline
Опыт: 18,872
Активность:
Цитата:
Сообщение от Strayiker
alexkill попробуй создавать глобалку и в неё записывать значение хп юнита на момент использования абилки, затем
событие: "у юнита хп < чем значение в глобалке"
действие: "установить хп = значению в глобалке"

событие: "у юнита хп > чем значение в глобалке"
действие: "установить глобалку = текущему значению хп юнита"

хз, так впринципе должно работать, хоть и неочень оптимально ;)


глобалки не катят. это уже другая идея, да и не универсальная. даже если исполользовать вариант, что есть в статьях есть, глобалки-массивы присутствуют.
Старый 18.07.2008, 12:54
Strayiker
Warcraft Forever
offline
Опыт: 3,406
Активность:
Вот, так работает корректно
Прикрепленные файлы
Тип файла: w3x Armor.w3x (18.5 Кбайт, 36 просмотров )
Старый 18.07.2008, 14:25
alexkill

offline
Опыт: 18,872
Активность:
Мы с тобой мыслим параллельно). У меня только-только задумка о таймере с 0 возникла.
Только у тебя урон округляется до целого числа. И хп на единичку сбивается иногда. Но я разрешил.
Спасибо.
Старый 18.07.2008, 15:51
Закрытая тема

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

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

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

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



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