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

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

Закрытая тема
 
Korneliy
DMF
offline
Опыт: 23,443
Активность:
Юнит получает урон. Вопрос к Джассерам.
Как в джасс выглядит событие "юнит получает урон"? Подскажите, плиз, а то "атакован" не катит.
Старый 04.09.2006, 08:03
WARVOVA

offline
Опыт: 2,011
Активность:
Сделай в триге и переведи.Но это событие имеет недостаток. Его можно использовать только для одного юнита.Если хочешь узнать как я это обошел могу потом написать.
Старый 04.09.2006, 08:40
J
expert
offline
Опыт: 48,447
Активность:
Вообщето тема для раздела джаза...



WARVOVA, Korneliy кокраз и просит сказать как это действие (для всех юнитов) выглядит на джаз, но его вроде нет и на джазе...
если хош можеш сделсть на тригах как я уже предлогал сдесь, ели же нужен более совершенный способ то можно принцепи использовать событие - "юнит атакован", и в функции этого трига создавать другой триггер... который отлавливает "получение урона" к конкретному юниту, т.е. к тому кого атоковали... при выполнении этого триггера его потом уничтожать, а также всем известно что событие "юнит атакован" не значит что юнит получит урон, т.е. юнит может замахнутся а потом отменить приказ... тригер на атаку сработает, и создасца тригер на получение урона, и потому при слудующей атаке сработает новый тригер, и старый который не удалился... потому в тригере на проверку атаки нужно через 3 сек. проверять жив ли тригер который был создан, если жив - удалить, если нет - нет.



Вот как это примерно должно выглядеть:

Код:
globals
    gamecache udg_cache = null
endglobals

constant function H2I takes handle h returns integer
    return h
    return 0
endfunction

constant function I2U takes integer H returns unit
    return H
    return null
endfunction

constant function I2TrA takes integer i returns triggeraction
    return i
    return null
endfunction    

constant function I2TrC takes integer i returns triggercondition
    return i
    return null
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")) then
    
        //... 
        //ТВОИ ДЕЙСТВИЯ ПРИ ПОЛУЧЕНИИ УРОНА
        //...  
                                      
        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_Conditions takes nothing returns boolean
    return true // поставить свои условия
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

незабывайте инициализировать кеш...

Отредактировано J, 06.05.2009 в 13:41.
Старый 04.09.2006, 10:44
CMAK

offline
Опыт: 702
Активность:
ну хоть кто-то тут дает развернутые ответы... а то блин в жизни не сышишь как и что сделать. спасибо за пример.
Старый 04.09.2006, 14:24
DioD

offline
Опыт: 45,134
Активность:
Промолчу про утечки...
ClearActions предназначена для удаления ссылок из тригера и не самых действий.
Старый 04.09.2006, 15:12
p01nTT

offline
Опыт: 11,160
Активность:
тока смотри для юнита который наносит урон, нельзя применять действие Unit - Damage Target , не знаю как насчет после call PolledWait(n) или после call TriggerSleepAction (n) - не пробовал
Старый 04.09.2006, 21:09
free0n
Бумбарявка
offline
Опыт: 4,736
Активность:
Цитата:
Промолчу про утечки...


DioD ты воистину спамобот :) Напиши где утечки. Мне очень интерестно, а то я в джасе слабовато пока.
Старый 05.09.2006, 15:27
DioD

offline
Опыт: 45,134
Активность:
call TriggerClearActions (trig)
не удаляет действия
Старый 05.09.2006, 16:15
exploder
iOS zealot
offline
Опыт: 19,394
Активность:
Цитата:
не удаляет действия

Ага... на сохранять ссылки на сами акшены и удалять вручную...
Старый 05.09.2006, 19:44
agentex

offline
Опыт: 34,834
Активность:
Цитата:
call TriggerClearActions (trig)
не удаляет действия

а как его удалить?
Старый 30.10.2008, 15:58
J
expert
offline
Опыт: 48,447
Активность:
функцией TriggerRemoveAction
Старый 30.10.2008, 16:57
agentex

offline
Опыт: 34,834
Активность:
спс еще вопрос: DestroyTrigger() не подразумевает уничтожение экшенов и условий с ним связанных?
Старый 30.10.2008, 18:34
J
expert
offline
Опыт: 48,447
Активность:
неподразумевает
Старый 30.10.2008, 18:41
Лось

offline
Опыт: 7,223
Активность:
А как проверить что действия и условия неудаляются?
Старый 30.10.2008, 19:49
J
expert
offline
Опыт: 48,447
Активность:
легко, если ты их неудаляеш значит они неудаляются oO
Старый 30.10.2008, 20:27
adic3x

offline
Опыт: 108,439
Активность:
делать кондишинами
Старый 31.10.2008, 13:30
LordSerga

offline
Опыт: 3,809
Активность:
Напишите кто нибудь условия! Их забыли написать, а если сам делаешь, то фигня какаято получается. И конешно хотелось бы увидеть другой код на получение урона юниту, и без условий :)
Старый 06.05.2009, 10:14
J
expert
offline
Опыт: 48,447
Активность:
нету там условий, или стери строчку где на тригер вешается условие, или добавь функцию
Код:
function trig_Conditions takes nothing returns boolean
    return true // поставь твое условие
endfunction
Старый 06.05.2009, 13:39
ELDAR
НИИ 4А-ВО кафедра SPELLS
offline
Опыт: 8,394
Активность:
Цитата:
тока смотри для юнита который наносит урон, нельзя применять действие Unit - Damage Target ,
впринципи если предворительно уничтожить триг то можно
Старый 06.05.2009, 13:59
J
expert
offline
Опыт: 48,447
Активность:
не рациональнее ли его при этом просто не создавать?)

J добавил:
но такого не случится, незнаю юнита которому монжо приказать атаковать сибя и он атакует
Старый 06.05.2009, 14:05
Закрытая тема

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

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

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

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



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