PartyBuffsをごにょごにょしてみる[FF11]

PartyBuffsというPTメンバーのバフ, デバフを常時表示するWindowerアドオンがあります。

  • PartyBuffs

github.com

2019/05/30 追記
最新のPartyBuffs(version 3.0)ではバフ/デバフのフィルター機能が追加されているようです。
(使用していないため、詳しくはわかりませんがホワイトリスト/ブラックリストでフィルターできるようです。)

2020/01/24 追記
Ver.3.0でのフィルター設定についての記事を書きました。
yyoshisaur.hatenablog.com


このアドオンを有効にするとPTリストの横にアイコンがずらりと並びます。
(バフを取得できるのはプレイヤーのみでフェイスには表示されません)
アイコンのサイズは10x10, 20x20の2種類が選択できます。
アイコンはFF11オリジナルのものではなく、
FFXIViewのアイコン?が使われているため、慣れないかもしれません。
このアイコンのサイズが絶妙で10x10では小さすぎで、20x20では大きすぎだと感じます。
10x10では何のアイコンなのか分かりづらいため、20x20にして使用していますが、
バフの数が多くなってくると画面の半分以上をアイコンが占めてしまします。

そこでバフ, デバフをすべて表示するのではなく、
自分が監視したいバフやデバフのみを表示できるように変更してみます。


Windowerアドオンを1から書いたこともない初心者なので、
PartyBuffsがアドオン内で行っていることは詳しくは分りません。
PartyBuffs.lua内のregister_eventのコールバック処理("incoming chunk"のイベント)とUpdateの処理に注目します。

ざっくり処理の内容を書くと以下のようになっていると思います。

  • register_event

パケットが入ってきたとき("incoming chunk")に呼び出す処理を登録している。
パケットにバフ, デバフの情報が含まれていて、変数buffsに保存している。
Events · Windower/Lua Wiki · GitHub
Packets Library · Windower/Lua Wiki · GitHub

  • Update

アイコンを表示する処理(表示アイコンの位置調整、描画)


そこでregister_event内で必要な情報のみを保存するようにフィルターすれば、うまくいくような気がします。

-- PartyBuffs.lua
-- グローバル変数
-- 表示したいバフ, デバフのID
enable_buffs=S{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,28,29,30,31,33,40,41,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,144,145,146,147,148,149,156,167,168,174,175,177,186,192,193,194,223,404,540,557,558,559,560,561,562,563,564,565,566,567,572}

-- 87行目辺り(register_eventのコールバック関数)
                    local buff = data:byte(k*48+5+16+i-1) + 256*( math.floor( data:byte(k*48+5+8+ math.floor((i-1)/4)) / 4^((i-1)%4) )%4) -- Credit: Byrth, GearSwap
                    if enable_buffs:contains(buff) then --追加
                        if buffs[id][i] ~= buff then
                            buffs[id][i] = buff
                        end
                    end -- 追加


必要な情報のみ取得するようにすれば、
期待通りenable_buffsで定義したアイコンのみ表示されるようになります。
しかし、表示に問題があり、
表示していないアイコンが空白になってしまい、不自然な空白ができてしまいます。
表示しているアイコンのみ右詰めで表示させたいので、
アイコンの位置調整をしているUpdate関数も変更します。

    for k = 1, 5 do
        local member = party[key_indices[k]]
        j = 1 -- 追加 (jは表示したアイコン数)
        for image, i in party_buffs[k]:it() do
            if member then
                if buffs[member_table[member.name]] and buffs[member_table[member.name]][i] then
                    if zoning_bool then
                        buffs[member_table[member.name]][i] = 0
                        image:clear()
                        image:hide()
                    elseif member.zone ~= zone then
                        buffs[member_table[member.name]][i] = 0
                        image:clear()
                        image:hide()
                    elseif buffs[member_table[member.name]][i] == 255 or buffs[member_table[member.name]][i] == 0 then
                        image:clear()
                        image:hide()
                    else
                        image:path(windower.windower_path .. 'addons/PartyBuffs/icons/' .. buffs[member_table[member.name]][i] .. '.png')
                        image:transparency(0)
                        image:size(icon_size, icon_size)
                        -- Adjust position for party member count
                        if party_info.party1_count > 1 then
                            local pt_y_pos = party_buffs_y_pos[party_info.party1_count] 
                            local x = (icon_size == 20 and x_pos - (j*20)) or (j <= 16 and x_pos - (j*10)) or x_pos - ((j-16)*10) -- iからjに変更
                            local y = (icon_size == 20 and pt_y_pos + ((k-1)*20)) or (j <= 16 and pt_y_pos + ((k-1)*20)) or  pt_y_pos + (((k-1)*20)+10) -- iからjに変更
                            image:pos_x(x)
                            image:pos_y(y)
                        end
                        image:show()
                        j = j + 1 -- 追加
                    end
                else
                    -- アイコンが減少した際、左端のアイコンがクリアされないため、追加
                    image:clear() 
                    image:hide()
                end
            else
                image:clear()
                image:hide()
            end
            image:update()
        end
    end  


デバフを沢山くれるエスカ-ジタのブリタリスに動作確認に行ってみました。
アイコンが表示されているPTメンバーは魔導剣士なので多くのバフが付与されていましたが、
定義したバフ, デバフのみ表示されており、うまく動作しているように見えます。
f:id:yyoshisaur:20181201233124p:plain


以下は今回enable_buffsで定義しているID

  • バフ
ID 名称
33 ヘイスト
40 プロテス
41 シェル
  • デバフ
ID 名称
1 衰弱
2 睡眠
3
4 麻痺
5 暗闇
6 静寂
7 石化
8 病気
9 呪い
10 スタン
11 バインド
12 ヘヴィ
13 スロウ
14 魅了
15 死の宣告
16 アムネジア
17 魅了
18 徐々に石化
19 睡眠
20 呪い
21 アドル
22 ひるみ
23 メルトン
28 テラー
29 沈黙
30 呪詛
31 悪疫
128 バーン
129 フロスト
130 チョーク
131 ラスプ
132 ショック
133 ドラウン
134 ディア
135 バイオ
136 STRダウン
137 DEXダウン
138 VITダウン
139 AGIダウン
140 INTダウン
141 MNDダウン
142 CHRダウン
144 HPmaxダウン
145 MPmaxダウン
146 命中率ダウン
147 攻撃力ダウン
148 回避率ダウン
156 フラッシュ
167 魔法防御ダウン
168 インヒビットTP
174 魔法命中率ダウン
175 魔法攻撃力ダウン
177 装備変更不可
186 計略
192 レクエム
193 ララバイ
194 エレジー
223 ノクターン
404 魔法回避率ダウン
540 ポイズン
557 攻撃力ダウン
558 防御力ダウン
559 魔法攻撃力ダウン
560 魔法防御力ダウン
561 命中率ダウン
562 回避率ダウン
563 魔法命中率ダウン
564 魔法回避率ダウン
565 スロウ
566 麻痺
567 ヘヴィ
572 回避能力ダウン