DBM修改教學 - WOW

Audriana avatar
By Audriana
at 2017-03-18T19:41

Table of Contents


身為手殘玩家&略懂程式工程師,可以交給電腦的事情當然要交給電腦處理;
以下分享一下最近修改DBM提高自己/團隊容錯率順便貢獻回 upstream 的過程

# 增加特定法術冷卻計時, 倒數音效以及特別警告 #

大約一個月前團內在拓荒提克的時候,腿短DK如我在 P2 的射線死亡率有點高,
而當時的DBM對於射線(腐肉夢魘)是沒有任何提示的

隔天分析了一下打那幾場的 wcl, 發現他的頻率很固定, 模式如下:

[wcl截圖](http://i.imgur.com/L034htH.png)

P2 進場後第4秒開始唱第一條射線, 施法2秒, 施法後過2秒會唱下一道,
直到唱完6次為止

所以這邊想到要做的事情如下

(1) 增加腐肉夢魘的冷卻計時以及倒數語音
(2) 施法開始時增加特別語音警告(快跑啊小女孩快跑兮兮兮)


## 我們先找到提克 DBM 的檔案 ##

打開 Interface/Addons/DBM-Nighthold/Tichondrius.lua

觀察了一下裡面完全沒有提到腐肉夢魘,所以第一要務是找出腐肉夢魘的 spell id

可以從腐肉夢魘=>Carrion Nightmare=>在 wowhead 找到 spell id: 215988

## 增加計時條/倒數語音/特殊警告 ##

(a) 為了讓 DBM 可以辨認並產生選項, 我們需要宣告兩個變數

```lua
local timerCarrionNightmare = mod:NewNextCountTimer(4, 215988, nil, nil,
nil, 2)

local countdownCarrionNightmare = mod:NewCountdown("Alt4", 215988, false, 2,
3)
```

主要是參考其他 timer 跟 countdown 去更改 spellid 就好, 其他參數可以先雷同


(b) 然後我們必要讓 DBM 知道我們想知道腐肉夢魘開始施法了 在事件註冊的地方

```lua
-- add spell event for carrion nightmare
mod:RegisterEventsInCombat(
"SPELL_CAST_START 212997 213238 212794 213531 206365 216034 216723 215988",
```

(c) 接著在施法事件處理加入計時條跟倒數啟動

```lua
function mod:SPELL_CAST_START(args)
local spellId = args.spellId
if spellId == 215988 then
self.vb.carrionNightmare = self.vb.carrionNightmare + 1
specWarnCarrionNightmare:Show()
voiceCarrionNightmare:Play("watchstep")
if self.vb.carrionNightmare < 6 then
timerCarrionNightmare:Start()
countdownCarrionNightmare:Start()
end
```

(d) 別忘了宣告施法次數跟歸零, 不過這段沒有很重要, 單純是告訴你這是第幾次
```lua
mod.vb.addsCount = 0
mod.vb.carrionNightmare = 0
mod.vb.batsKilled = 0
```


以上修改在 2/14 當天晚上 Raid 測試完畢正常運作後,

[當天寫的](https://gist.github.com/alivedise/add3dc7b8740d3756480178f0fe8b59a)

我就去 DBM forum 請作者考慮是否加入並給他我的參考程式

[論壇文章 - Feature request for Tich's Carrion Nightmare Warning]
(https://www.deadlybossmods.com/forum/viewtopic.php?f=5&t=188)

2/22後的 DBM 開始就有腐肉夢魘的警告了
(不過他 API 有點更動, 所以現在 DBM 的程式碼跟我當天寫得不盡相同)

# 增加資訊框架 #

最近古爾單拓荒到 P3, 一樣發現了靈魂之井相關的提示太少,
WeakAura 那邊有個靈魂之井的提示 (https://wago.io/V1agWHR8M) 實測後發現不合用,
而且對其他人來說要額外裝 WA 有點煩

所以我又把念頭動到比較熟悉的 DBM 身上

要顯示這類的資訊只能使用 DBM 的 InfoFrame 功能了

就是打眾星的時候會自動顯示找惡魔提示出來的小框框

參考了幾個有使用這個功能的副本 boss 後整理出一個流程如下

## 一樣先找到古爾丹檔案 ##

打開 Interface/Addons/DBM-Nighthold/Guldan.lua

這時候會發現裡面已經有一個 InfoFrame 的提示叫 TimeStop

不過基於這不是主要困擾我的事

而 DBM 又似乎不支援多重 InfoFrame, 我們就先把這段複寫成靈魂之井

## 找到關鍵法術 ID ##

參考上面的 WeakAura 字串 跟 Guldan.lua 後

很快地抓出相關的 ID 如下

(1) 靈魂之井 Well of Soul: 206939
(2) 靈魂虹吸 Soul Siphon: 221891
(3) 靈魂腐敗: 208802

它們之間的關係如下

(a) 當古爾單施放 221891 時, 井內多一個靈魂
(b) 當任何玩家獲得 208802 時, 井內少一個靈魂
(c) 當黑暗收穫施放時, 井內靈魂數量影響黑暗收穫傷害

所以我們藉此去維護一個 soulCount 然後用 update/sort InfoFrame 來顯示

a. 目前井內靈魂數量
b. 目前有腐敗 debuff 的人的列表, 從小到大

## 實作流程 ##

1. 宣告 InfoFrame 使用

```lua
mod:AddInfoFrameOption(206939)
```

2. 戰鬥開始或進入p3後顯示 InfoFrame

```lua
if self.Options.InfoFrame then
DBM.InfoFrame:SetHeader(GetSpellInfo(208536))
DBM.InfoFrame:Show(31, "function", updateInfoFrame, sortInfoFrame)
end
```

3. 實作 update & sort

```lua
local updateInfoFrame, sortInfoFrame
do
local playerName = UnitName("player")
local lines = {}
local soaking = GetSpellInfo(221891)
local spellid = "<|cff00ffff"..soak..">|r"
sortInfoFrame = function(a, b)
if a == spellid then return true end
if b == spellid then return false end
local a = lines[a]
local b = lines[b]
if not tonumber(a) then a = -1 end
if not tonumber(b) then b = -1 end
if a < b then return true else return false end
end
updateInfoFrame = function()
table.wipe(lines)
lines[spellid] = mod.vb.soulCount
for uId in DBM:GetGroupMembers() do
local _, _, _, count, _, _, _ = UnitDebuff(uId, soaking)
lines[UnitName(uId)] = count
end
return lines
end
end
```

update 是告訴 DBM 如何更新內容
sort 是告訴 DBM 內容要怎麼排序

[Screenshot](http://i.imgur.com/PMWL7Ov.png)

4. 維護靈魂數量

```lua
elseif spellId == 221891 then
local now = GetTime()
if (now - self.vb.lastSiphonTime) >= 2 then
self.vb.soulCount = self.vb.soulCount + 1
self.vb.lastSiphonTime = now
end
warnSoulSiphon:CombinedShow(0.3, args.destName)
elseif spellId == 208802 then
local now = GetTime()
if (now - self.vb.lastSoakingTime) >= 2 then
self.vb.soulCount = self.vb.soulCount - 1
self.vb.lastSoakingTime = now
end
local amount = args.amount or 1
if args:IsPlayer() and amount >= 3 then
specWarnSoulCorrosion:Show(amount)
end
```

P.S. 此功能還在測試中, 所以暫不提供完整檔案,
等完成後會向 DBM 作者提案

以上


by 聖光之願聯盟/人類死亡騎士/伊芙蕾娜

--
Tags: WOW

All Comments

Suhail Hany avatar
By Suhail Hany
at 2017-03-22T12:59
未看 先推
Isla avatar
By Isla
at 2017-03-23T16:14
快推不然別人以為我看不懂
Yedda avatar
By Yedda
at 2017-03-28T14:50
靠北 怎麼會在這裡看到程式碼 想說來錯版了XDDDD
Lily avatar
By Lily
at 2017-04-01T16:08
太牛啦!!!
Lydia avatar
By Lydia
at 2017-04-01T23:07
請收下膝蓋
Eden avatar
By Eden
at 2017-04-03T01:59
高手在民間,不過說真的計時條BW比較好用
Frederica avatar
By Frederica
at 2017-04-06T20:11
滿滿的聖人光環啊(膜拜
Necoo avatar
By Necoo
at 2017-04-09T07:15
不要跟我說這些 告訴我解壓縮檔要放哪就好
Olivia avatar
By Olivia
at 2017-04-14T00:27
推分享 但古爾丹不是放靈魂太近的人也會疊腐敗 這樣會不
會失準?
Joe avatar
By Joe
at 2017-04-15T08:30
有針對時間過短的db不處理
Victoria avatar
By Victoria
at 2017-04-16T05:57
高手在民間
Selena avatar
By Selena
at 2017-04-20T14:02
手殘 但會寫程式幫助自己 /膜拜
Hedwig avatar
By Hedwig
at 2017-04-25T13:03
古爾丹有吃才有層數啊
Annie avatar
By Annie
at 2017-04-30T11:31
有用
Kumar avatar
By Kumar
at 2017-05-01T22:20
先推了,不然別人以為我看不懂
Edwina avatar
By Edwina
at 2017-05-04T10:53
只好推一下歐洲傲嬌DK惹 XD
Selena avatar
By Selena
at 2017-05-06T06:55
專業幫推
Daph Bay avatar
By Daph Bay
at 2017-05-09T06:11
媽 我在這 我跟這DK同團(揮手)
Noah avatar
By Noah
at 2017-05-13T14:54
同是資訊人推~
Lucy avatar
By Lucy
at 2017-05-18T14:49
原來提克之後DBM有是你的功勞,謝謝你
Delia avatar
By Delia
at 2017-05-19T13:16
看不懂推
Hazel avatar
By Hazel
at 2017-05-23T07:22
推,真的看不懂 orz
Ethan avatar
By Ethan
at 2017-05-26T03:58
先推不然別人以為我看不懂
Puput avatar
By Puput
at 2017-05-30T17:25
推個艾雷XD
Andy avatar
By Andy
at 2017-06-02T22:32
好心推推
Suhail Hany avatar
By Suhail Hany
at 2017-06-04T10:16
不推不行
Hamiltion avatar
By Hamiltion
at 2017-06-06T02:48
推 我一直都想學寫lua 但是好懶 QQ
Jack avatar
By Jack
at 2017-06-10T01:34
工蝦小? 推
Dora avatar
By Dora
at 2017-06-14T05:38
看都無
Quintina avatar
By Quintina
at 2017-06-16T16:06
所以 快告訴我要放在哪個資料夾好嗎?
Carol avatar
By Carol
at 2017-06-20T21:23
推推
Kumar avatar
By Kumar
at 2017-06-24T10:10
看不懂推 QQ
Oscar avatar
By Oscar
at 2017-06-27T12:47
快推快推,以免....
Kama avatar
By Kama
at 2017-06-27T16:01
先推
Frederica avatar
By Frederica
at 2017-07-01T10:24
不明覺厲!
Suhail Hany avatar
By Suhail Hany
at 2017-07-02T04:43
太強惹
Michael avatar
By Michael
at 2017-07-03T19:54
超實用
Ursula avatar
By Ursula
at 2017-07-03T22:01
寫完這篇後歐丁給我第六橘冰龍腿啦 轉專精囉
Lily avatar
By Lily
at 2017-07-06T00:18
除了先跪之外沒什麼可以說的了
Faithe avatar
By Faithe
at 2017-07-10T20:55
樓主是剛剛Google團的嗎wwww
Kristin avatar
By Kristin
at 2017-07-13T19:20
對喔
Yedda avatar
By Yedda
at 2017-07-17T14:24
其實你去twitter @一下dbm跟他說你要什麼 很快就會加了
Sarah avatar
By Sarah
at 2017-07-18T02:05
其實我建議做個Table來存放法術ID
Irma avatar
By Irma
at 2017-07-18T16:47
開源精神給推~~
Lily avatar
By Lily
at 2017-07-22T20:40
推艾雷 wwwwwwwwwwwwww
Andy avatar
By Andy
at 2017-07-23T12:20
哩勒公蝦餃…

日屠部落的艾斯然是不是很難排

Tracy avatar
By Tracy
at 2017-03-18T13:22
其實是為了解剝皮三星任務啦 週五晚上一直排不到今天也排了一個上午 是不是比較沒有人打了? 這任務實在很悲劇 有其他時段比較容易排的到嗎?? - ...

關於增強薩的裂地浩劫天賦

Brianna avatar
By Brianna
at 2017-03-18T12:51
由於本週壞死,ae天賦選閃電轟擊根本沒傷害。 最近在嘗試改成裂地浩劫,一攤小怪噴一次還有位移斷法效果。 但是這技能註解上傷害明明是51萬,實際造成的傷害卻只有35萬,不管多目標和單目標測試後都是這個結果。 這是bug嗎?還是說有什麼特殊的算法? - ...

伊利達瑞的靈魂稜石 任務串

Hedy avatar
By Hedy
at 2017-03-18T12:38
※ 引述《kungen (DK imba)》之銘言: : 看了好多人都有接到這任務 : 找了半天在大廳裡都沒有 印象中有看過伊利丹的動畫 : 大廳裡也有聖光之心 才上來發問是哪裡出了問題atat : 直覺有任務沒解 但任務分類也沒有薩滿戰役這條 : 有人可以遇到同樣狀況能幫解答嗎 謝謝 啊...忘了把推 ...

冰DK手法問題請益

Bethany avatar
By Bethany
at 2017-03-18T10:52
※ 引述《bear26 (熊二六)》之銘言: : 我的實裝898 : 橘裝能給冰DK用的是 : 披風 好朋友戒指 核心戒指 主要裝雙戒指 : 天賦是龍噴流 : 3121332 : 點兇惡是比較好觸發賽佛斯 : 有四件T裝 宿命交會 : 然後致命35 加速20 精通30 屬性到底是?? 之前聽人說 致命25+ ...

日屠聯盟公會傳奇團招生7/10M

William avatar
By William
at 2017-03-18T10:51
伺服器: 日落沼澤+屠魔山谷 陣營 : 聯盟 招收目標 : 傳奇難度 分裝方式 : Call loot(隊長分配) 公會: Play for Uber 目前進度: 7/10 M 暗夜堡 出團時間: 四,五,日,一 四天 晚上 9:00 ~ 11:30-12:00(拓荒期間 到12:00) 職 ...