[ 編集このページを編集する ]

トップ > MAP作成 > Jass Script > ライブラリ集 > 偽回避


受けたダメージを0に軽減するライブラリ。どんなダメージでも軽減できる。ただしスキルの場合、ダメージは受けないがスタン等の効果は発生する。

ライブラリ

library PseudoEvasion requires Handles

    //
    //  オブジェクトエディタで、Item Life Bonus(AIlf) ベースのスキルを作成してください。
    //  作成したスキルの Max Life Gained(DataA1) を最大値(99999) に設定したあと、
    //  そのスキルコード(下の例では'A003')を記入してください。
    //
    private function HP_BOOST takes nothing returns integer
        return 'A003'
    endfunction


    private function LifeReset takes nothing returns nothing
        local timer ExpTimer    =   GetExpiredTimer()
        local unit  EvadeUnit   =   GetHandleUnit   (ExpTimer,  "EvadeUnit")
        local real  Oldlife     =   GetHandleReal   (ExpTimer,  "Oldlife")

		call UnitRemoveAbility  (EvadeUnit,HP_BOOST())
		call SetUnitState       (EvadeUnit,UNIT_STATE_LIFE,Oldlife)
        	call PauseTimer         (ExpTimer)
		call DestroyTimer       (ExpTimer)
		call FlushHandle        (ExpTimer)

        set ExpTimer    =   null
        set EvadeUnit   =   null
    endfunction
    
    //
    //  この関数を、EVENT_UNIT_DAMAGED から呼び出してください。
    //  詳しい使い方は、後述の使用例を参考に。
    //
    function Pseudo_Evasion takes unit EvadeUnit returns nothing
        local real  Damage  =   GetEventDamage()
        local real  Life    =   GetUnitState(EvadeUnit,UNIT_STATE_LIFE)
        local real  MaxLife =   GetUnitState(EvadeUnit,UNIT_STATE_MAX_LIFE)
        local timer PETimer =   null

        
        if Life>.0 then
            if(Life-Damage<.0)or(Life+Damage>MaxLife)then
                call SetUnitState   (EvadeUnit, UNIT_STATE_LIFE,    MaxLife)
                call UnitAddAbility (EvadeUnit, HP_BOOST())
                
                set PETimer =   CreateTimer()
                call SetHandleAgent (PETimer,   "EvadeUnit" ,   EvadeUnit)
                call SetHandleReal  (PETimer,   "Oldlife"   ,   Life)
                call TimerStart     (PETimer,   0   ,  false,  function LifeReset)
            else
                call SetUnitState   (EvadeUnit, UNIT_STATE_LIFE,    Life+Damage)
            endif
        endif
        
        set PETimer =   null
    endfunction

endlibrary

使い方のサンプル

gg_unit_H000_0000の受けたダメージ全てを軽減する例

function Trigger1_Actions takes nothing returns nothing
    call Pseudo_Evasion(gg_unit_H000_0000)
endfunction

//===========================================================================
function Trigger1 takes nothing returns nothing
    set TRIG = CreateTrigger(  )

    call TriggerRegisterUnitEvent(TRIG, gg_unit_H000_0000, EVENT_UNIT_DAMAGED )
    call TriggerAddAction        (TRIG, function Trigger1_Actions)

    set TRIG = null
endfunction

このように、EVENT_UNIT_DAMAGEDのイベントから呼び出す必要があります。

処理の説明

ダメージを受ける直前に、食らう分のダメージを瞬時に回復させる、という方法で、ダメージをうけてないかのように振舞っています。

ただしこの場合

  1. ダメージでライフが負の値になる時(HP10、ダメージ1000等、一撃で死ぬ場合)
  2. ダメージ+ライフが最大HPを超えるとき(HP10/100、ダメージ1000等)

以上の場合で、回復しすぎたりHPを回復できなかったりすることがあります。

そこで、1,2に該当する場合は、タイマーを使って以下の処理を行っています。

  1. 現在HPを記録
  2. HPを最大値まで回復させる
  3. HP最大値を激増させる(スキルA003[AIlf]を追加して、+99999)
  4. ダメージを食らう時点まで時間をすすめる(0秒のTimerを使っている)
  5. ダメージを食らった直後、HP最大値を元に戻す(スキルA003[AIlf]を削除)
  6. 現在HPを、1で記録した値に戻す

必要なライブラリ