|
发表于 2013-3-18 00:55:57
|
显示全部楼层
本帖最后由 黑色乂zero仔 于 2013-3-18 00:59 编辑
Defense.w3x
(16.19 KB, 下载次数: 21)
有點煩,不過要有耐性就把它給看完就能學會了。
這是某手冊的教學,我那個是實際應用技能。- constant function DamageModify_DeadFixerAbility takes nothing returns integer
- return 'A000' //一個可以增加大量生命值上限的技能,可用增加生命上限的物品技能修改
- endfunction
- function DamageModify_Finish takes timer t returns nothing
- local unit u = GetHandleUnit(t,"u")
- if GetHandleBoolean(t,"fix") then
- call UnitRemoveAbility( u, DamageModify_DeadFixerAbility() )
- endif
- call SetUnitState(u ,UNIT_STATE_LIFE, GetHandleReal(t,"finalhp") )
- call SetHandleHandle(u,"#DamageModify:Timer",null)
- call FlushHandleLocals(t)
- call PauseTimer(t)
- call DestroyTimer(t)
- set u = null
- endfunction
- function DamageModify_Expire takes nothing returns nothing
- call DamageModify_Finish(GetExpiredTimer())
- endfunction
- // 執行順序:傷害事件→DamageModify→真正受到傷害扣血→DamageModify_Expire→DamageModify_Finish
- function DamageModify takes real dmgnew returns nothing
- local unit u = GetTriggerUnit()
- local timer t = GetHandleTimer(u,"#DamageModify:Timer")
- local real life
- local real mlife
- local real dmg
- local real delta
- if (t!=null) then
- //如果此部隊正進行傷害修改,則先完成之前的設定以免造成衝突
- //此舉是為了避免像Bash這種可能同時輸出2個傷害的情形
- //雙傷害的執行順序:傷害事件(1)→DamageModify(1)→真正受到傷害扣血(1)→傷害事件(2)→DamageModify(2)
- // →DamageModify_Finish(1)→真正受到傷害扣血(2)→DamageModify_Expire(2)→DamageModify_Finish(2)
- call DamageModify_Finish(t)
- endif
- set dmg = GetEventDamage()
- if (dmg < 0.01) then
- //忽略負數和過小的傷害。
- //0傷害通常由buff造成,不是真正的傷害;另外,若是呼叫此函數的時機錯誤(不在傷害時件下呼叫),此值為0
- //如有特殊需要也可把這個判斷刪掉。
- return
- endif
- set life = GetUnitState(u, UNIT_STATE_LIFE)
- set mlife = GetUnitState(u, UNIT_STATE_MAX_LIFE)
- set delta = dmg - dmgnew
- if (life-dmgnew < 0.0) then
- //修改後如果會死,就把生命值降到底限,讓它受到傷害死亡。
- //(0.41接近生命值最低極限,即使只是降到0.40也會使部隊死亡)
- call SetUnitState(u, UNIT_STATE_LIFE, 0.41)
- return
- endif
- if (life+delta > mlife) then
- //這種情況下無法先加血再自然扣,所以只好另外設個計時器,等扣完再調整血量。
- set t = CreateTimer()
- if (dmg >= mlife) then
- //傷害過大,足以致死,必須先調增最大生命值
- call UnitAddAbility( u, DamageModify_DeadFixerAbility() )
- set mlife = GetUnitState(u, UNIT_STATE_MAX_LIFE)
- call SetHandleBoolean(t,"fix",true)
- endif
- call SetUnitState(u ,UNIT_STATE_LIFE, mlife )
- call SetHandleHandle(u,"#DamageModify:Timer",t)
- call SetHandleHandle(t,"u",u)
- call SetHandleReal(t,"finalhp",life-dmgnew)
- call TimerStart(t, 0, false, function DamageModify_Expire)
- set t = null
- else
- //這種情況下可以直接加血讓它自然扣回
- call SetUnitState(u ,UNIT_STATE_LIFE, life+delta )
- endif
- endfunction
复制代码 |
|