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

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

Ответ
 
FEARSTARTER
desert eagle
offline
Опыт: 19,364
Активность:
Отлов нанесения урона юниту, но только не магией!
Извиняюсь что создаю похожую тему, просто та закрыта, а мне очень важно это узнать.

В той теме мне помогли найти карту с тригерами отлова всех юнитов при получении урона. Но вот проблема: Мне нужно чтобы тригер срабатывал только тогда когда юнита атакуют обычной атакой, но не магией! впринципе там тригеры так и сделаны, но они нестабильно работают, тригер слишком часто запускается при атаке магией, а не только при обычной атаке. Вот эта карта с тригерами. И да самое главное! - у меня много тригерной магии где урон наносится функцией "Damage target" - которая всегда определяется как обычная атака, а мне никак нельзя чтоб тригер отлавливал юнитов от этой функции.

Собственно ктонибудь сможет мне помоч исправить это? если это конечно возможно, заранее спасиба
Старый 23.09.2008, 18:29
Лось

offline
Опыт: 7,223
Активность:
Да, надо дать юниту способность сферы льда, в триггере с событием юнит дамагед, делать проверку на баф способности сферы льда, потом удалять его и делать свои действия..
» CODE
Код:
function trig_Conditions takes nothing returns boolean
    return GetUnitAbilityLevel(GetAttacker(),'Ability ID of sphere of frost') > 0
endfunction

function trig_Damaged takes nothing returns nothing
    local unit    DamageSource = GetEventDamageSource() 
    local real    Damage       = GetEventDamage()       
    local unit    Attacked     = GetTriggerUnit()
    local trigger trig = GetTriggeringTrigger ()
    if DamageSource == I2U(GetStoredInteger(udg_cache, I2S(H2I(trig)), "Attacking")) and GetUnitAbilityLevel(GetTriggerUnit(),'Buff ID of frost sphere') > 0 then
        call UnitRemoveAbility(Attacked,'Buff ID of frost sphere')
        //... 
        //ACTIONS
        //...  
                                      
        call TriggerRemoveCondition(trig, I2TrC(GetStoredInteger(udg_cache, I2S(H2I(trig)), "TrC")))
        call TriggerRemoveAction   (trig, I2TrA(GetStoredInteger(udg_cache, I2S(H2I(trig)), "TrA")))
        call FlushStoredMission(udg_cache, I2S(H2I(trig)))
        call DestroyTrigger(trig)
    endif
    set trig = null            
endfunction                                                             

function trig_Attacked takes nothing returns nothing
    local trigger trig      = CreateTrigger ()
    local unit    Attacking = GetAttacker()
    local unit    Attacked  = GetTriggerUnit()
    local triggeraction TrA = TriggerAddAction         (trig,           function trig_Damaged    )
    local triggeraction TrC = TriggerAddCondition      (trig, Condition(function trig_Conditions)) 
    call                      TriggerRegisterUnitEvent (trig, Attacked, EVENT_UNIT_DAMAGED       )
    call StoreInteger(udg_cache, I2S(H2I(trig)), "Attacking", H2I(Attacking))
    call StoreInteger(udg_cache, I2S(H2I(trig)), "TrC"      , H2I(TrC      ))
    call StoreInteger(udg_cache, I2S(H2I(trig)), "TrA"      , H2I(TrA      ))            
    call TriggerSleepAction(3)
    if IsTriggerEnabled (trig) then
         call FlushStoredMission(udg_cache, I2S(H2I(trig)))
         call TriggerRemoveCondition(trig, TrC)
         call TriggerRemoveAction   (trig, TrA)                               
         call DestroyTrigger        (trig)
    endif
    set trig= null
    set TrA = null
    set TrC = null
endfunction

//===========================================================================
function InitTrig_Attacked takes nothing returns nothing
    set gg_trg_Attacked = CreateTrigger() 
    call TriggerAddAction             ( gg_trg_Attacked,           function trig_Attacked   )
    call TriggerAddCondition          ( gg_trg_Attacked, Condition(function trig_Conditions))
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Attacked, EVENT_PLAYER_UNIT_ATTACKED         )
endfunction

Вроде правильно, не проверял.
Старый 23.09.2008, 19:05
FEARSTARTER
desert eagle
offline
Опыт: 19,364
Активность:
________________________________________________________________________________ _____________
Для начала обьясню что я собираюсь делать (может так проще будет). Короче у меня в карте есть ряд предметов котрые я класифицировал как "магические заряды". Впринципе это почти тоже самое что соски в игре Лайн эйдж. Суть в том что предмет имеет заряды и активируется при атаки. Эти предметы можно включать и выключать. Все имеют свои действия. Приведу простой пример непосредственно касающийся этой темы. Герой(а он может быть и воин дальнего боя) с таким предметом атакует врага, и непосредственно когда тот получает урон от него, вокруг жертвы появляется ледяной взрыв, ну типа "ледяная звезда". Поэтому некрасиво если герой например пустит волну силы на врагов, и каждый из них еще получит по ледяному взрыву.
________________________________________________________________________________ _____________
Лось я пробывал давать разные способности типа сферы льда самому предмету, когда один предмет то все работает, а когда есть другие подобные предметы, то дается бафф только одного из них! Со способностьмя думаю тоже самое, но я конечно проверю твое предложение, хз. Помойму ведь герой никак не сможет кинуть врагу сразу 6 разных баффов, у менято и два не получалось.
Старый 23.09.2008, 19:28
agentex

offline
Опыт: 34,834
Активность:
ппц.. тему с точно таким же содержанием я создал 5 дней назад.. поиск рулит!!!
вообще мне надо было по событию unit takes damage узнать что это именно урон от атаки.
короче я использовал SCV. на событии юнит атакован я присваивал ему значение булин = true.
Код:
call SetObjectBool(GetTriggerUnit(), ("AttackedBy"+I2S(GetConvertedPlayerId(GetOwningPlayer(GetAttacker())))), true)

ну а в нужном триггере с событием юнит получает урон, поставил проверку, true ли это значение
Код:
if GetObjectBool( GetTriggerUnit(), ("AttackedBy"+I2S(GetConvertedPlayerId(GetOwningPlayer(GetEventDamageSource())))) ) then

Также необходимо сбрасывать этот булин с 0.01 задержкой после юнит демежед...

agentex добавил:
з.ы. не смотрите на convertedplayerid, знаю что боян, просто я привык к такому отсчету
Старый 23.09.2008, 20:22
FEARSTARTER
desert eagle
offline
Опыт: 19,364
Активность:
agentex ты не могбы готовые тригеры из твоей мапы скинуть? В пустую карту закинуть и ее скинуть суда? а то я вот так со скриптами не очень доганяю.
Старый 23.09.2008, 21:13
agentex

offline
Опыт: 34,834
Активность:
ну я как бэ описал общую идею.. ладно, тогда уж пример сделаю.
Старый 23.09.2008, 22:09
FEARSTARTER
desert eagle
offline
Опыт: 19,364
Активность:
буду очень благодарен ;):
Старый 23.09.2008, 22:30
agentex

offline
Опыт: 34,834
Активность:
держи. сорри за коменты на транслите, генпак кириллицу ваще игнорит.
Прикрепленные файлы
Тип файла: w3x DamagedByAttack.w3x (9.9 Кбайт, 24 просмотров )
Старый 23.09.2008, 22:40
FEARSTARTER
desert eagle
offline
Опыт: 19,364
Активность:
agentex то что надо! спасибо, пока я так побыстрому проверил вроде все пашет, посже перенесу на свою мапу, но вроде пока все как надо.
Старый 23.09.2008, 22:57
agentex

offline
Опыт: 34,834
Активность:
там фишка в том что надо сперва просто атаковать юнита, событие зарегестрируется в др. тригере и тогда уже можно точно узнавать каким образом дамаг прошел. хотя это не является недоработкой - тебе ведь надо отлавливать только повреждения атакой, а на атаку сперва сработает OnAttack, так что все норм)
Старый 23.09.2008, 23:05
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
Мне нужно чтобы тригер срабатывал только тогда когда юнита атакуют обычной атакой, но не магией!


добавляешь всем юнитам орб еффект добавляющий цели бафф, и при получении урона проверяешь наличие баффа, если таковой имееться - снять его, и соответсвенно действия твои идут дальше...)
Старый 24.09.2008, 14:18
ScorpioT1000
Работаем
offline
Опыт: отключен
Лось, а че это код так колбасит, это ты сам так делал или скрипт виноват?

// скрипт ни при чем, автор исходного кода любит расставлять отступы таким образом. © swdn

Отредактировано ShadoW DaemoN, 24.09.2008 в 19:17.
Старый 24.09.2008, 19:04
Лось

offline
Опыт: 7,223
Активность:
Это код Jon'a, я только проверку на бафф зделал.
Старый 24.09.2008, 19:39
FEARSTARTER
desert eagle
offline
Опыт: 19,364
Активность:
Цитата:
добавляешь всем юнитам орб еффект добавляющий цели бафф, и при получении урона проверяешь наличие баффа, если таковой имееться - снять его, и соответсвенно действия твои идут дальше...)

Это работает, но пока герой не получит предмет с орб эфектом, а таких предметов у меня в мапе не мало.
Старый 24.09.2008, 19:48
Hanabishi
COOL STATUS
offline
Опыт: отключен
разнообразь эти способности! зажми shift и кликни по порядку строк в своей способности, потом напиши например DamOrb, AbilOrb1, AbilOrb2 и т.д. если порядок строк разный, то глючить не будет.
Старый 26.09.2008, 12:57
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
Это работает, но пока герой не получит предмет с орб эфектом, а таких предметов у меня в мапе не мало.


дык, делай только один орб еффект... а остальные при отловеу рона и провекрке есть у героя еффект накладывай тригером... будут 100% совместимы орбы %)

Цитата:
разнообразь эти способности! зажми shift и кликни по порядку строк в своей способности, потом напиши например DamOrb, AbilOrb1, AbilOrb2 и т.д. если порядок строк разный, то глючить не будет.


так и непонял что афтор хотел сказать...
Старый 26.09.2008, 16:40
FEARSTARTER
desert eagle
offline
Опыт: 19,364
Активность:
Цитата:
дык, делай только один орб еффект... а остальные при отловеу рона и провекрке есть у героя еффект накладывай тригером... будут 100% совместимы орбы %)

Ну если один то да работает, но у меня есть и другие предметы, типа сферы огня, сферы льда и сферы яда (ну тоесть сделаные на основе этого), а они будут блокировать этот бафф.
Старый 26.09.2008, 17:33
Лось

offline
Опыт: 7,223
Активность:
Ну сделай триггерные эффекты сферы огня, сферы льда и сферы яда..
Старый 26.09.2008, 17:44
FEARSTARTER
desert eagle
offline
Опыт: 19,364
Активность:
Лось нуда впринципе это несложно, но agentex уже дал вполне действующий вариант, токо вот не пойму в его карте проверяя функцию damage target урон от нее определялся как магия, а перенес в свою мапу - как атака, ыыы надо попроверять мне все лучше...

НО! кстати тригер от agentex всеравно иногда некорекно работает, но это редко довольно, когда атака и магия одновременно дамаджут....
Старый 26.09.2008, 18:00
Ответ

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

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

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

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



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