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; // こちらもチャット