プログラミング・動画編集 備忘録

プログラミングや動画編集についての備忘録です

Terrariaでゲーム内のログをフックする

もしかしたら自分が知らないだけかもしれないが、Terrariaでゲーム内のログをファイル出力する方法が存在しない。
以前はtModLoader自体を加工してTerrariaでのゲーム内ログの出力部分にフックを入れていたが、それも手間がかかるので次のような提案を行った。
Suggestion for hook addition to message log · Issue #361 · tModLoader/tModLoader · GitHub

結果、tModLoaderがv0.11.xになってからは、MonoMod というのを使用したフックができるようになっているらしい。
早速試してみた所、つぎのようにしてフックできるので、自分のModなりでログ処理すればよい。

class HogeMod : Mod
{
    public override void Load()
    {
        On.Terraria.Main.NewText_string_byte_byte_byte_bool += Main_NewText_string_byte_byte_byte_bool;
    }

    private void Main_NewText_string_byte_byte_byte_bool(On.Terraria.Main.orig_NewText_string_byte_byte_byte_bool orig, string newText, byte R, byte G, byte B, bool force)
    {
        OutputLog(newText);
        orig(newText, R, G, B, force);
    }

    // この辺は適当
    public static void OutputLog(string msg)
    {
        using (StreamWriter sw = new StreamWriter(new FileStream(LOGFILT_PATH, FileMode.Append, FileAccess.Write, FileShare.Read)))
        using (TextWriter tw = TextWriter.Synchronized(sw))
        {
            tw.WriteLine(msg);
        }
    }
}

それぞれ次のようなフックがあるが、一部はどのような場合に呼ばれるかよくわからない

On.Terraria.Main.NewText_string_Color_bool += Main_NewText_string_Color_bool;
On.Terraria.Main.NewText_string_byte_byte_byte_bool += Main_NewText_string_byte_byte_byte_bool; // システム的なメッセージなどはこれが呼ばれる模様
On.Terraria.Main.NewText_object_Color_bool += Main_NewText_object_Color_bool;
On.Terraria.Main.NewText_List1 += Main_NewText_List1;
On.Terraria.Main.NewTextMultiline += Main_NewTextMultiline; // チャットはこちらか
On.Terraria.Main.NewTextMultilineOld += Main_NewTextMultilineOld; // こちらもチャット