-
Notifications
You must be signed in to change notification settings - Fork 0
/
Plugin.cs
163 lines (138 loc) · 5.85 KB
/
Plugin.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
using System;
using System.Collections.Generic;
using System.Reflection;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Logging;
using HarmonyLib;
using UnityEngine;
using Logger = HarmonyLib.Tools.Logger;
namespace ManagerDetector
{
[HarmonyPatch]
[BepInPlugin(ModGUID, ModName, ModVersion)]
public class ManagerDetectorPlugin : BaseUnityPlugin
{
internal const string ModName = "ManagerDetector";
internal const string ModVersion = "1.0.4";
internal const string Author = "Azumatt";
private const string ModGUID = Author + "." + ModName;
private static readonly ManualLogSource ManagerDetectorLogger = BepInEx.Logging.Logger.CreateLogSource(ModName);
private readonly Harmony _harmony = new(ModGUID);
private static readonly List<ManagerInfo> Managers = new()
{
new ManagerInfo { NamespaceName = "PieceManager", ClassName = "BuildPiece", List = new List<string>(), ConsoleColor = ConsoleColor.DarkGreen },
new ManagerInfo { NamespaceName = "ItemManager", ClassName = "Item", List = new List<string>(), ConsoleColor = ConsoleColor.DarkYellow },
new ManagerInfo { NamespaceName = "ItemDataManager", ClassName = "ItemInfo", List = new List<string>(), ConsoleColor = ConsoleColor.Blue },
new ManagerInfo { NamespaceName = "SkillManager", ClassName = "Skill", List = new List<string>(), ConsoleColor = ConsoleColor.Cyan },
new ManagerInfo { NamespaceName = "LocationManager", ClassName = "Location", List = new List<string>(), ConsoleColor = ConsoleColor.DarkCyan },
new ManagerInfo { NamespaceName = "CreatureManager", ClassName = "Creature", List = new List<string>(), ConsoleColor = ConsoleColor.DarkMagenta },
};
public void Awake()
{
_harmony.PatchAll();
}
[HarmonyPatch(typeof(ZNet), nameof(ZNet.Awake)), HarmonyPostfix, HarmonyPriority(Priority.Last)]
private static void LogBeforeConnect()
{
LogTheManagers();
}
private static bool Patched;
[HarmonyPatch(typeof(FejdStartup), nameof(FejdStartup.Awake)), HarmonyPostfix, HarmonyPriority(Priority.Last)]
private static void DoPatch()
{
ManagerDetectorLogger.LogWarning($"Checking for managers.");
if (Patched) return;
Patched = true;
LogTheManagers();
}
private static Type? GetManagerType(Assembly assembly, string? namespaceName, string? className)
{
foreach (Type type in assembly.GetTypes())
{
if (type.Namespace == namespaceName && type.Name == className)
{
return type;
}
}
return null;
}
private static void CheckManagers(Assembly assembly, PluginInfo info)
{
foreach (ManagerInfo? managerInfo in Managers)
{
if (GetManagerType(assembly, managerInfo.NamespaceName, managerInfo.ClassName) != null)
{
managerInfo.List?.Add($"{info.Metadata.Name} [{info.Metadata.GUID} {info.Metadata.Version}]");
}
}
}
private static void LogTheManagers()
{
foreach (ManagerInfo? managerInfo in Managers)
{
managerInfo.List?.Clear();
}
foreach (PluginInfo? info in Chainloader.PluginInfos.Values)
{
Assembly assembly = info.Instance.GetType().Assembly;
CheckManagers(assembly, info);
}
foreach (ManagerInfo? managerInfo in Managers)
{
if (managerInfo.List is { Count: <= 0 }) continue;
if (Application.platform == RuntimePlatform.WindowsPlayer)
{
HandleWindowsPlatform(managerInfo);
}
else
{
HandleOtherPlatforms(managerInfo);
}
}
}
private static void HandleWindowsPlatform(ManagerInfo managerInfo)
{
ConsoleManager.SetConsoleColor(managerInfo.ConsoleColor);
string headerMessage = $"{Environment.NewLine}[Debug :{ModName}] The following mods have {managerInfo.NamespaceName}:";
ConsoleManager.ConsoleStream.WriteLine(headerMessage);
if (managerInfo.List == null) return;
foreach (string? mod in managerInfo.List)
{
ConsoleManager.StandardOutStream.WriteLine($"[Debug :{ModName}] {mod}");
}
ConsoleManager.SetConsoleColor(ConsoleColor.White);
LogToDisk(headerMessage);
foreach (string? mod in managerInfo.List)
{
LogToDisk($"[Debug :{ModName}] {mod}");
}
}
private static void HandleOtherPlatforms(ManagerInfo managerInfo)
{
ManagerDetectorLogger.LogInfo($"{Environment.NewLine}The following mods have {managerInfo.NamespaceName}:");
if (managerInfo.List == null) return;
foreach (string? mod in managerInfo.List)
{
ManagerDetectorLogger.LogInfo($"{mod}");
}
}
private static void LogToDisk(string message)
{
foreach (ILogListener logListener in BepInEx.Logging.Logger.Listeners)
{
if (logListener is DiskLogListener { LogWriter: not null } bepinexlog)
{
bepinexlog.LogWriter.WriteLine(message);
}
}
}
}
public class ManagerInfo
{
public string? NamespaceName { get; set; }
public string? ClassName { get; set; }
public List<string>? List { get; set; }
public ConsoleColor ConsoleColor { get; set; }
}
}