using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Text; using CLre.API.Characters; using CLre.API.Synergy; using CLre.API.Tools; using GameNetworkLayer.Shared; using HarmonyLib; using Svelto.ECS; using UnityEngine; namespace CLre { 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; } = "21Q3 " + Assembly.GetExecutingAssembly().GetName().Version.ToString(); internal static Harmony harmonyInstance = null; internal static bool _isInidicatorActive = true; internal static string _indicatorMsg = " CLre loading..."; // called when Cardlife shuts down public override void OnApplicationQuit() { harmonyInstance.UnpatchAll(); } // called when Cardlife starts up public override void OnApplicationStart() { #if DEBUG FileLog.Reset(); Harmony.DEBUG = true; // enable CLre debug functionality AccessToolsWarnings.Enable(); NetClientListener.Enable(); Stopwatch startup = Stopwatch.StartNew(); #endif // init all Harmony patches in project harmonyInstance = new Harmony(Name); harmonyInstance.PatchAll(); // patches for bugs Fixes.InitLogSooner.Init(); Fixes.MiniScreenHelper.Init(); Fixes.UnderStructureCollider.Init(); Fixes.TerrainModifyReset.Init(); //Fixes.FloatLanguageFix.Init(); // API init API.Synergy.ClientHandshakeEngine.Init(); // misc LogIPAPlugins(); Fixes.BugfixAttributeUtility.LogBugfixes(); BuildIndicatorMessage(); API.App.Client.MenuReady += (_, __) => { _isInidicatorActive = false; }; // dismiss CLre msg // Log info API.Utility.Logging.MetaLog($"{Name} init complete."); #if DEBUG // configure CLre debug functionality Type netData = AccessTools.TypeByName("Game.Handhelds.DrawingStateMessage"); NetClientSender.DebugSendMessage(netData, harmonyInstance, NetClientSender.GetLogMethod(netData)); API.Utility.Logging.MetaLog("Patched SendMessage"); netData = AccessTools.TypeByName("Shared.Inventory.HandheldEquipmentRequest"); NetClientSender.DebugSendMessage(netData, harmonyInstance, NetClientSender.GetLogMethod(netData)); API.Utility.Logging.MetaLog("Patched SendMessage"); netData = typeof(API.Synergy.SerializedCLreHandshake); NetClientSender.DebugSendMessage(netData, harmonyInstance, NetClientSender.GetLogMethod(netData)); API.Utility.Logging.MetaLog("Patched SendMessage"); NetClientListener.DebugReceiveMessage(NetworkDispatcherCode.EACMessageServerToClient, NetClientListener.Log); NetClientListener.DebugReceiveMessage(API.Synergy.ClientHandshakeEngine.CLre_HANDSHAKE_NETCODE, NetClientListener.Log); NetClientListener.DebugReceiveMessage(NetworkDispatcherCode.SendIsPvEToClient, NetClientListener.Log); API.Utility.Logging.MetaLog($"Highest NetworkDispatcherCode number is {(int) NetworkDispatcherCode.StructureDestroyed} damn it Photon"); // API debug and testing API.App.Client.InitComplete += (_, __) => { startup.Stop(); API.Utility.Logging.Log($"Startup took {startup.ElapsedMilliseconds}ms"); API.Utility.Logging.Log( $"EAC has detected code mods? {EasyAntiCheat.Client.Hydra.Runtime.Integrity.Violated}" + (EasyAntiCheat.Client.Hydra.Runtime.Integrity.Violated ? EasyAntiCheat.Client.Hydra.Runtime.Integrity.ViolationMessage : "")); }; API.App.Client.MenuReady += (_, __) => { API.Utility.Logging.MetaLog("Menu engine ready event fired!"); }; API.App.Client.GameReady += (_, __) => { API.Utility.Logging.MetaLog("Game engine ready event fired!"); }; API.App.Client.GameFrameworkReady += (_, __) => { API.Utility.Logging.MetaLog("Game framework ready event fired!"); API.Utility.Logging.MetaLog($"PhotonChat Connection Protocol: {PhotonChatUI.Chat.Instance.ConnectionProtocol}"); }; API.App.Client.GameFrameworkExit += (_, __) => { API.Utility.Logging.MetaLog("Game framework exit event fired!"); }; Character c = Character.Local(); c.Superuser = true; #endif } private static void LogIPAPlugins() { StringBuilder sb = new StringBuilder(); sb.AppendFormat("Running on Unity {0}\n", Application.unityVersion); sb.AppendFormat("Running on CardLife {0} (aka {1})\n", API.App.Client.Version, 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()); } private void BuildIndicatorMessage() { int fixCount = Fixes.BugfixAttributeUtility.Count; int modCount = IllusionInjector.PluginManager.Plugins.Count(); StringBuilder sb = new StringBuilder(); sb.AppendFormat(" {0} {1}\n", Name, Version); sb.AppendFormat(" {0} bugfixes, {1} plugins, no frills\n", fixCount, modCount); #if DEBUG sb.AppendFormat(" DEBUG version\n"); #endif #if RELEASE sb.AppendFormat(" RELEASE version\n"); #endif sb.AppendFormat(" Starting up...\n"); _indicatorMsg = sb.ToString(); } public override void OnGUI() { // CLre startup inidicator if (_isInidicatorActive) { GUILayout.BeginVertical(); GUILayout.Label(_indicatorMsg); if (GUILayout.Button("Hide")) { _isInidicatorActive = false; } GUILayout.EndVertical(); } } } }