2020年2月8日土曜日

GearSwap の add_to_chat は shift_jis への変換を自動的に行う

GearSwap のユーザーファイルの中では「Windower.」をつけずに add_to_chat() 関数が利用可能です。このadd_to_chat() 関数は、自動的にシフトJISへ文字コードを変換してくれる仕様となっています。

ユーザーファイルの中のLuaの環境は、以前の記事の通り、user_env 変数で定義されたものが利用可能です。user_env は refresh.lua で定義されていますが、その中には add_to_chat も含まれています。

具体的には、add_to_chat=add_to_chat_user と定義されていおり、add_to_chat を動作させると実際には add_to_char_user 関数が動きます。この関数は、user_functions.lua の中で記述されています。

function add_to_chat_user(num,str)
    local backup_str
    if type(num) == 'string' then
        -- It was passed a string as the first argument.
        str = not tonumber(str) and str or num
        num = 8
    elseif not num and str and type(str) == 'string' then
        -- It only needs the number.
        num=8
    end

    if language == 'japanese' then
        msg.add_to_chat(num,windower.to_shift_jis(str))
    else
        msg.add_to_chat(num,str)
    end
end
上記の通り、to_shift_jis しています。日本語文字を出力させる場合は注意が必要です。

2020年2月7日金曜日

GearSwapで/ma "magic-name" <me> <st>が正常動作しない件

「/ma ケアル <me> <st>」を実行すると、通常はユーザーの入力を待ってからケアル詠唱を行います。しかし、GearSwap を使っているとユーザーの入力を待たずに瞬時にケアル詠唱が行われてしまいます。

これは、GearSwap が3つ目までの入力引数しかチェックしないためです。なので4つ目の入力値(<st>)を確認するように GearSwap を修正することで、正常動作するようになります。

以下、修正方法です。

・flow.lua

(1) 78行目から85行目までをコメントアウト
--[[ if val2 then
        if type(val2) == 'table' and val2.type then logit(' : '..val2.type)
        else
            logit(' : Unknown type val2- '..tostring(val2))
        end
    else
        logit(' : nil-or-false')
    end]]

(2) 214行目:4つ目の引数を追加
return equip_sets_exit(swap_type,ts,val1,val2)

(3) 229行目:4つ目の引数を追加
function equip_sets_exit(swap_type,ts,val1,val2)

(4) 282行目:4つ目の引数を見て st_flag = true を動作させるように変更
if st_targs[val1.target.raw] or st_targs[val2] then
    -- st targets
    st_flag = true




・triggers.lua

(1) 56行目:変数 val2 を追加
local abil, temptarg, temp_mob_arr, val2

(2) 73行目 :4つ目の引数を val2 に代入する処理を追加
    temptarg, temp_mob_arr = valid_target(splitline[3])
    val2 = splitline[4]
elseif validabils[language][unified_prefix] then
    temptarg, temp_mob_arr = valid_target(splitline[2])
    val2 = splitline[3]
end
※ val2 = splitline[3] の方は、例えば「/ra <t> <st> 」のような場合

(3) 157行目:4つ目の引数を追加
return equip_sets('pretarget',-1,spell,val2)

上記の修正で<me> <st>が正常動作するようになると思います。




2020年2月6日木曜日

GearSwapの処理軽量化

モーグリやサクラなどのスフィアを展開するフェイスを出していると、棒立ちの状態でも息継ぎをするように十数秒おきに重くなると思います。当方の環境では定期的に29fpsから27fpsに落ちて、処理がカクつきます。いわゆるプチフリ状態です。このプチフリはGearSwapをアンロードすると起こらなくなります。
どの処理が重いのか調査したところ、packet_parsing.lua の 518 行目あたりの処理が関係していることがわかりました。518行目からの4行をコメントアウトすると処理落ちが軽減されました。下記の4行です。これはバフ情報更新のパケットが飛んでくると動く処理です。

if not gearswap_disabled then
    refresh_globals()
    equip_sets('buff_refresh',nil,buff_name,new)
end

上記の refresh_globals() 関数はけっこう重い処理で、プレイヤーの状態や、かばんの中身など、膨大な量のデータをすべて再精査する処理が行われています。たまに動く程度ならば問題ないのですが、スフィアを展開するフェイスを出していると3秒おきにバフ情報更新のパケットが飛んできてそのたびに処理が実行され、継続的に大量のデータが更新され続けることでLuaの内部でガーベジコレクションなどの処理が動き、プチフリみたいなことになっているのかなと考えています。

で、3秒おきに飛んでくるスフィアのバフ情報更新のパケットですが、そのバフの持続時間(duration)はだいたい5~8秒に設定されています。なので、フェイスをしまうと数秒後にバフが消えるという仕掛けです。

この5~8秒という数値を利用して、duration が10秒以上の場合にのみrefresh_globals() 関数を実行するように変更することで、3秒おきにくるスフィア用のパケットを無視できます。

if not gearswap_disabled and new.duration > 10 then
    refresh_globals()
    equip_sets('buff_refresh',nil,buff_name,new)
end

上記のように変更すると、プチフリが軽減されました。スフィアのバフはIDが通常のバフとは違っているため、duration ではなくバフのIDでフィルタリングしても良いのですが、Allied ManteletやMirthful Mandragoraのリフレシュスフィアのようにバフによっては通常のバフと同じIDを使用している場合もあるため、duration の方が確実だと思います。