using System; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Text; using CLre_server.API.Config; using CLre_server.API.Tools; using CLre_server.WebStatus; using GameNetworkLayer.Shared; using HarmonyLib; using Svelto.ECS; using UnityEngine; namespace CLre_server { public class CLre : IllusionPlugin.IEnhancedPlugin // the Illusion Plugin Architecture (IPA) will ignore classes that don't implement IPlugin { public override string Name { get; } = Assembly.GetExecutingAssembly().GetName().Name; public override string Version { get; } = Assembly.GetExecutingAssembly().GetName().Version.ToString(); internal static Harmony harmonyInstance = null; public static CLreConfig Config = CLreConfig.Default(); // called when Cardlife shuts down public override void OnApplicationQuit() { WebServer.Deinit(); harmonyInstance.UnpatchAll(); } // called when Cardlife starts up public override void OnApplicationStart() { #if DEBUG FileLog.Reset(); Harmony.DEBUG = true; // enable CLre debug functionality AccessToolsWarnings.Enable(); NetServerListener.Enable(); #endif // init all Harmony patches in project harmonyInstance = new Harmony(Name); harmonyInstance.PatchAll(); // patches for bugs Fixes.InitLogSooner.Init(); // API init API.Synergy.ServerHandshakeEngine.Init(); // misc LogIPAPlugins(); // log plugins again so they show up in the log, and not just stdout Fixes.BugfixAttributeUtility.LogBugfixes(); // log bugfixes that are applied #if DEBUG // test CLre debug functionality Type netData = AccessTools.TypeByName("Game.Handhelds.DrawingStateMessage"); NetServerSender.DebugSendMessage(netData, harmonyInstance, NetServerSender.GetLogMethod(netData)); API.Utility.Logging.MetaLog("Patched SendMessage"); netData = AccessTools.TypeByName("Shared.Inventory.HandheldEquipmentRequest"); NetServerSender.DebugSendMessage(netData, harmonyInstance, NetServerSender.GetLogMethod(netData)); API.Utility.Logging.MetaLog("Patched SendMessage"); netData = typeof(API.Synergy.SerializedCLreHandshake); NetServerSender.DebugSendMessage(netData, harmonyInstance, NetServerSender.GetLogMethod(netData)); API.Utility.Logging.MetaLog("Patched SendMessage"); NetServerListener.DebugReceiveMessage(NetworkDispatcherCode.EACMessageServerToClient, NetServerListener.Log); NetServerListener.DebugReceiveMessage(NetworkDispatcherCode.SendIsPvEToClient, NetServerListener.Log); NetServerListener.DebugReceiveMessage(API.Synergy.ServerHandshakeEngine.CLre_HANDSHAKE_NETCODE, NetServerListener.Log); // API debug and testing API.MainServer.Server.Instance.FrameworkReady += (_, __) => API.Utility.Logging.MetaLog("(!) Server framework ready for business"); API.MainServer.Server.Instance.FrameworkExit += (_, __) => API.Utility.Logging.MetaLog("(!) Server framework shutting down"); // this seems to never happen API.MainServer.Server.Instance.InitStart += (_, __) => API.Utility.Logging.MetaLog("(!) Server initialising"); API.MainServer.Server.Instance.InitComplete += (_, __) => API.Utility.Logging.MetaLog("(!) Server successfully initialised"); #endif // try to load config file Config = CLreConfig.FromFileSafely("CLre_server.json"); // init config-dependent functionality WebServer.Init(); API.Synergy.CLreEnforcer.Init(); Tweaks.TerrainModificationExclusionZone.Init(); // Log info API.Utility.Logging.MetaLog($"{Name} init complete."); } private static void LogIPAPlugins() { StringBuilder sb = new StringBuilder(); sb.AppendFormat("Running on Unity {0}\n", Application.unityVersion); sb.AppendFormat("Running on CardLife Server {0} (aka {1})\n", Game.Utilities.VersionReader.GetVersion(), Application.version); sb.AppendFormat("-----------------------------\n"); sb.AppendFormat("Loading plugins from {0} and found {1}\n", System.IO.Path.Combine(Environment.CurrentDirectory, "Plugins"), IllusionInjector.PluginManager.Plugins.Count()); sb.AppendFormat("-----------------------------\n"); foreach (IllusionPlugin.IPlugin plugin in IllusionInjector.PluginManager.Plugins) { sb.AppendFormat(" {0}: {1}\n", plugin.Name, plugin.Version); } sb.AppendFormat("-----------------------------\n"); API.Utility.Logging.Log(sb.ToString()); } #if DEBUG public override void OnGUI() { if (GUI.Button(new Rect(10, 10, 50, 50), "QUIT")) { Application.Quit(); // yeet } } #endif } }