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

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

Ответ
 
FKoFF
Venomancer 89lvl. Europe
offline
Опыт: 5,975
Активность:
Spy_:
срабатывает в момент получения урона, но в этот момент здоровье еще не отнимается.
Если бы так...
Старый 20.12.2010, 05:41
_Red

offline
Опыт: 4,095
Активность:
FKoFF:
Если бы так...
если сделать действия в условии то вроде так
Старый 20.12.2010, 05:51
spellwerk

offline
Опыт: 4,869
Активность:
Цитата:
Сообщение от ConstantinGhost
как это работает и что в итоге получается

есть триггер, который отслеживает получение юнитом урона (каждого юнита нужно регистрировать в событиях). затем он проверяет, уклонился ли воин
Код:
if ( GetRandomReal(1.,100.) > 20.-(max_distance-distance)/100. )

если нет, то проверяет возможность критического удара
Код:
if( GetRandomReal(1.,100.) <= 25.-distance/100. )

и увеличивает урон, если выпал крит
Код:
set damage = damage * ( 1.2 + distance/1000. )

ну и наносит урон
Код:
call UnitDamageTarget(attacker,victim,damage,true,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE  _NORMAL,WEAPON_TYPE_WHOKNOWS)


ну и показывает урон в качестве всплывающего текстага
Старый 20.12.2010, 10:07
ConstantinGhost

offline
Опыт: 3,916
Активность:
Spy_, ок, ясно спасибо, пока буду этим пользоваться
Старый 20.12.2010, 11:28
FKoFF
Venomancer 89lvl. Europe
offline
Опыт: 5,975
Активность:
Очень важно в данном случае сохранять хэндл юнита, что бы крит не мог критануть, и в условие вписать что GetEventDamageSource() != LoadUnitHandle(udg_Hash, GetHandleId(GetTriggerUnit()), 1)
Старый 20.12.2010, 15:08
NoSilence
Случайный прохожий
offline
Опыт: 1,927
Активность:
function Trig_unitdamaged_Actions takes nothing returns nothing
    local unit attacker = GetEventDamageSource()
    local unit victim = GetTriggerUnit()
    local real dx = GetUnitX(attacker)-GetUnitX(victim)
    local real dy = GetUnitY(attacker)-GetUnitY(victim)
    local real distance = SquareRoot(dx*dx+dy*dy)
    local real max_distance = 1500.
    local real damage = GetEventDamage() // Ага
    local texttag tt
    if ( GetRandomReal(1.,100.) > 20.-(max_distance-distance)/100. ) then
        if( GetRandomReal(1.,100.) <= 25.-distance/100. ) then
            set damage = damage * ( 0.2 + distance/1000. )
            set tt = CreateTextTagUnitBJ(I2S(R2I(damage))+"!",attacker,50.,10.,100.,0.,0.,0.) // Ага
            // Здесь я не уверен, что при смерти от SetUnitState при нанесении ей урона, атакующему засчитают кил.
            // Поэтому можно добавить проверку на [ХП]-[Урон] и если <0, то убивать цель UnitDamageTarget'ом
            // Опять же таки, если будут всяческие заклинания "Абсорб дамаги", то урон стоило бы сделать триггерным.
            call SetUnitState(victim, UNIT_STATE_LIFE, GetUnitState(victim, UNIT_STATE_LIFE) - damage)
        endif
    else
        set tt = CreateTextTagUnitBJ("Промах",attacker,50.,10.,100.,0.,0.,0.) // Ага
        // Примеров куча даже в гугле.
        // Триггер вызавается перед нанесением урона. Т.е. чтобы свести его (урон) в ноль нам необходимо
        // добавить такое же количество здоровья (урон, который нам передают, уже просчитан с учетом дефа и т.д.).
        // но если хп ~полные, то наша прибавка к хп будет бесполезна. Поэтому мы ждем нанесения урона и 
        // только тогда повышаем его.
        if GetUnitState(victim, UNIT_STATE_LIFE) + damage > GetUnitState(victim, UNIT_STATE_MAX_LIFE) then
       	  call TriggerSleepAction(.01)
        endif
        call SetUnitState(victim, UNIT_STATE_LIFE, GetUnitState(victim, UNIT_STATE_LIFE) + damage)
    endif
    call SetTextTagVelocityBJ(tt,64.,90.)
    call SetTextTagLifespan(tt,1.5)
    call SetTextTagFadepoint(tt,.5)
    call SetTextTagPermanent(tt,false)
    set victim = null
    set attacker = null
    set tt = null
endfunction

//===========================================================================
function InitTrig_unitdamaged takes nothing returns nothing
    set gg_trg_unitdamaged = CreateTrigger(  )
    call TriggerAddAction( gg_trg_unitdamaged, function Trig_unitdamaged_Actions )
endfunction
Те же яйца, только без триггерных атак.
Старый 20.12.2010, 16:53
JimALIEN
вдупляет sc2 editor
offline
Опыт: 7,176
Активность:
раз уж вы в любом случае наносите итоговый дамаг через действие, то луше всем юнитам предварительно раздать способность горного гиганта с полным поглощением ранжед дамага. И ненад высчитывать сколько там хп восстанавливать в случае промаха. Вобщем один фиг нужна сносная система отлова дамага, их вроде уже несколько выкладывали.
Старый 22.12.2010, 06:31
Ответ

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

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

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

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



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