找回密码
 点一下
查看: 1027|回复: 4

怎么模仿魔兽世界减伤效果?

[复制链接]
发表于 2013-3-15 21:06:10 | 显示全部楼层 |阅读模式
比如魔兽世界的战士防御姿态的减伤怎么模仿?
发表于 2013-3-16 08:24:52 | 显示全部楼层
减伤?
请搜索折射。

点评

搜索出来的都没看懂  详情 回复 发表于 2013-3-16 22:43
回复

使用道具 举报

 楼主| 发表于 2013-3-16 22:43:48 | 显示全部楼层
asd8645123123 发表于 2013-3-16 08:24
减伤?
请搜索折射。

搜索出来的都没看懂

点评

实际意思就是。 当受到伤害时恢复一定的生命。这样看起来就像是减少了伤害。  详情 回复 发表于 2013-3-17 08:43
回复

使用道具 举报

发表于 2013-3-17 08:43:41 | 显示全部楼层
704017380 发表于 2013-3-16 22:43
搜索出来的都没看懂

实际意思就是。
当受到伤害时恢复一定的生命。这样看起来就像是减少了伤害。
回复

使用道具 举报

发表于 2013-3-18 00:55:57 | 显示全部楼层
本帖最后由 黑色乂zero仔 于 2013-3-18 00:59 编辑

Defense.w3x (16.19 KB, 下载次数: 21)

有點煩,不過要有耐性就把它給看完就能學會了。

這是某手冊的教學,我那個是實際應用技能。
  1. constant function DamageModify_DeadFixerAbility takes nothing returns integer
  2.     return 'A000' //一個可以增加大量生命值上限的技能,可用增加生命上限的物品技能修改
  3. endfunction

  4. function DamageModify_Finish takes timer t returns nothing
  5.     local unit u = GetHandleUnit(t,"u")
  6.     if GetHandleBoolean(t,"fix") then
  7.         call UnitRemoveAbility( u, DamageModify_DeadFixerAbility() )
  8.     endif
  9.     call SetUnitState(u ,UNIT_STATE_LIFE, GetHandleReal(t,"finalhp") )
  10.     call SetHandleHandle(u,"#DamageModify:Timer",null)
  11.     call FlushHandleLocals(t)
  12.     call PauseTimer(t)
  13.     call DestroyTimer(t)
  14.     set u = null
  15. endfunction

  16. function DamageModify_Expire takes nothing returns nothing
  17.     call DamageModify_Finish(GetExpiredTimer())
  18. endfunction

  19. // 執行順序:傷害事件→DamageModify→真正受到傷害扣血→DamageModify_Expire→DamageModify_Finish
  20. function DamageModify takes real dmgnew returns nothing
  21.     local unit u = GetTriggerUnit()
  22.     local timer t = GetHandleTimer(u,"#DamageModify:Timer")
  23.     local real life
  24.     local real mlife
  25.     local real dmg
  26.     local real delta
  27.     if (t!=null) then
  28.         //如果此部隊正進行傷害修改,則先完成之前的設定以免造成衝突
  29.         //此舉是為了避免像Bash這種可能同時輸出2個傷害的情形
  30.         //雙傷害的執行順序:傷害事件(1)→DamageModify(1)→真正受到傷害扣血(1)→傷害事件(2)→DamageModify(2)
  31.         //                →DamageModify_Finish(1)→真正受到傷害扣血(2)→DamageModify_Expire(2)→DamageModify_Finish(2)
  32.         call DamageModify_Finish(t)
  33.     endif
  34.     set dmg = GetEventDamage()
  35.     if (dmg < 0.01) then
  36.         //忽略負數和過小的傷害。
  37.         //0傷害通常由buff造成,不是真正的傷害;另外,若是呼叫此函數的時機錯誤(不在傷害時件下呼叫),此值為0
  38.         //如有特殊需要也可把這個判斷刪掉。
  39.         return
  40.     endif
  41.     set life = GetUnitState(u, UNIT_STATE_LIFE)
  42.     set mlife = GetUnitState(u, UNIT_STATE_MAX_LIFE)
  43.     set delta = dmg - dmgnew
  44.     if (life-dmgnew < 0.0) then
  45.         //修改後如果會死,就把生命值降到底限,讓它受到傷害死亡。
  46.         //(0.41接近生命值最低極限,即使只是降到0.40也會使部隊死亡)
  47.         call SetUnitState(u, UNIT_STATE_LIFE, 0.41)
  48.         return
  49.     endif
  50.     if (life+delta > mlife) then
  51.         //這種情況下無法先加血再自然扣,所以只好另外設個計時器,等扣完再調整血量。
  52.         set t = CreateTimer()
  53.         if (dmg >= mlife) then
  54.             //傷害過大,足以致死,必須先調增最大生命值
  55.             call UnitAddAbility( u, DamageModify_DeadFixerAbility() )
  56.             set mlife = GetUnitState(u, UNIT_STATE_MAX_LIFE)
  57.             call SetHandleBoolean(t,"fix",true)
  58.         endif
  59.         call SetUnitState(u ,UNIT_STATE_LIFE, mlife )
  60.         call SetHandleHandle(u,"#DamageModify:Timer",t)
  61.         call SetHandleHandle(t,"u",u)
  62.         call SetHandleReal(t,"finalhp",life-dmgnew)
  63.         call TimerStart(t, 0, false, function DamageModify_Expire)
  64.         set t = null
  65.     else
  66.         //這種情況下可以直接加血讓它自然扣回
  67.         call SetUnitState(u ,UNIT_STATE_LIFE, life+delta )
  68.     endif
  69. endfunction
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-5-8 01:53 , Processed in 0.198028 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表