看板WOW
身為手殘玩家&略懂程式工程師,可以交給電腦的事情當然要交給電腦處理;
以下分享一下最近修改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
specWarnCarrionNightmare:Show()
voiceCarrionNightmare:Play("watchstep")
if self.vb.carrionNightmare < 6 then
timerCarrionNightmare:Start()
countdownCarrionNightmare:Start()
end
```
(d) 別忘了宣告施法次數跟歸零, 不過這段沒有很重要, 單純是告訴你這是第幾次
```lua
mod.vb.addsCount = 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 聖光之願聯盟/人類死亡騎士/伊芙蕾娜
--
※ 批踢踢實業坊(ptt.cc), 來自: 36.231.154.101※ 文章網址: https://www.ptt.cc/bbs/WOW/M.1489837308.A.D8A.html
推 x18999zero: 未看 先推 03/18 19:44
推 wind8905: 快推不然別人以為我看不懂 03/18 19:44
推 victor21813: 靠北 怎麼會在這裡看到程式碼 想說來錯版了XDDDD 03/18 19:44
推 incKevin: 太牛啦!!! 03/18 19:46
推 chaby19913: 請收下膝蓋 03/18 19:49
推 sssyoyo: 高手在民間,不過說真的計時條BW比較好用 03/18 19:49
推 invander: 滿滿的聖人光環啊(膜拜 03/18 19:53
推 ttn851227: 不要跟我說這些 告訴我解壓縮檔要放哪就好 03/18 19:56
推 sheepko: 推分享 但古爾丹不是放靈魂太近的人也會疊腐敗 這樣會不 03/18 19:58
→ sheepko: 會失準? 03/18 19:58
→ davidsky: 有針對時間過短的db不處理 03/18 20:00
推 cd12631: 高手在民間 03/18 20:01
推 becca945: 手殘 但會寫程式幫助自己 /膜拜 03/18 20:05
推 Domobear: 古爾丹有吃才有層數啊 03/18 20:18
推 aegius1r: 有用 03/18 20:25
推 kim03191230: 先推了,不然別人以為我看不懂 03/18 20:29
推 moonevil: 只好推一下歐洲傲嬌DK惹 XD 03/18 20:49
推 ab784533: 專業幫推 03/18 20:51
推 gossipking: 媽 我在這 我跟這DK同團(揮手) 03/18 20:58
推 av8d2124: 同是資訊人推~ 03/18 21:11
推 aresa: 原來提克之後DBM有是你的功勞,謝謝你 03/18 22:05
推 wq: 看不懂推 03/18 22:07
推 jeneaqa1: 推,真的看不懂 orz 03/18 22:50
推 luis0624: 先推不然別人以為我看不懂 03/18 23:12
推 windtemple: 推個艾雷XD 03/18 23:24
推 blacksam0525: 好心推推 03/19 00:05
推 goodjop: 不推不行 03/19 00:08
推 usoko: 推 我一直都想學寫lua 但是好懶 QQ 03/19 00:08
推 tkplay: 工蝦小? 推 03/19 00:22
推 arnold3: 看都無 03/19 00:56
推 willie7878: 所以 快告訴我要放在哪個資料夾好嗎? 03/19 00:59
推 pipper123456: 推推 03/19 01:07
推 anadabaga: 看不懂推 QQ 03/19 01:50
推 jiaxie: 快推快推,以免.... 03/19 02:00
推 OscarShih: 先推 03/19 02:40
推 b127313324: 不明覺厲! 03/19 06:10
推 maelbex: 太強惹 03/19 07:47
推 somethingmor: 超實用 03/19 10:16
→ davidsky: 寫完這篇後歐丁給我第六橘冰龍腿啦 轉專精囉 03/19 15:16
推 acer3905: 除了先跪之外沒什麼可以說的了 03/19 15:39
→ acer3905: 樓主是剛剛Google團的嗎wwww 03/19 15:40
→ davidsky: 對喔 03/19 16:13
推 ekrik: 其實你去twitter @一下dbm跟他說你要什麼 很快就會加了 03/19 19:55
推 wa007123456: 其實我建議做個Table來存放法術ID 03/19 20:00
推 jerry92277: 開源精神給推~~ 03/20 00:23
推 moonislost: 推艾雷 wwwwwwwwwwwwww 03/20 11:57
推 linci: 哩勒公蝦餃… 03/20 16:00