diff --git a/CLre/CLre.cs b/CLre/CLre.cs index 5aede5f..2df63d9 100644 --- a/CLre/CLre.cs +++ b/CLre/CLre.cs @@ -25,7 +25,7 @@ namespace CLre internal static bool _isInidicatorActive = true; internal static string _indicatorMsg = " CLre loading..."; - + // called when Cardlife shuts down public override void OnApplicationQuit() { @@ -52,7 +52,7 @@ namespace CLre Fixes.MiniScreenHelper.Init(); Fixes.UnderStructureCollider.Init(); Fixes.TerrainModifyReset.Init(); - Fixes.FloatLanguageFix.Init(); + //Fixes.FloatLanguageFix.Init(); // API init API.Synergy.ClientHandshakeEngine.Init(); diff --git a/CLre/Fixes/EnchantmentTableFloatParseFix.cs b/CLre/Fixes/EnchantmentTableFloatParseFix.cs index 6cfffb2..c51a5c9 100644 --- a/CLre/Fixes/EnchantmentTableFloatParseFix.cs +++ b/CLre/Fixes/EnchantmentTableFloatParseFix.cs @@ -30,7 +30,7 @@ namespace CLre.Fixes NumberFormatInfo.InvariantInfo, out result); #if DEBUG - API.Utility.Logging.Log($"Parsed \"{s}\" into {result}"); + API.Utility.Logging.Log($"Parsed \"{s}\" into {result} (successfully? {__result})\n{Environment.StackTrace}"); #endif } diff --git a/CLre/Fixes/FloatLanguageFix.cs b/CLre/Fixes/FloatLanguageFix.cs index 0c45fe6..1980bec 100644 --- a/CLre/Fixes/FloatLanguageFix.cs +++ b/CLre/Fixes/FloatLanguageFix.cs @@ -1,7 +1,8 @@ -using System; +/*using System; using System.Globalization; using System.IO; using System.Linq; +using System.Reflection; using HarmonyLib; namespace CLre.Fixes @@ -22,6 +23,8 @@ namespace CLre.Fixes || File.Exists("whateverFloatsYourBoat")) { Enabled = true; + API.Utility.Logging.LogWarning("AntiStupidFloats fix enabled, this may cause issues"); + API.Utility.Logging.MetaLog(args.ToString()); } else { @@ -41,30 +44,48 @@ namespace CLre.Fixes [Bugfix(name = "AntiStupidFloats", description = "Force language-agnostic float->string behaviour internally, like all programs should (DISABLED BY DEFAULT)", component = BugfixType.HarmonyPatch, id = 10)] - [HarmonyPatch(typeof(float), "ToString", new Type[] { })] + [HarmonyPatch] class Float_ToString0_Patch { [HarmonyPostfix] // prefix causes a crash for some reason... - public static void AfterMethodCall(float __instance, ref string __result) + public static void AfterMethodCall(ref float __instance, ref string __result) { +#if DEBUG + API.Utility.Logging.MetaLog("Float_ToString0_Patch"); +#endif if (!FloatLanguageFix.Enabled) return; API.Utility.Logging.LogWarning($"Intercepting float.ToString() to InvariantCulture equivalent\nStackTrace: {Environment.StackTrace}"); __result = __instance.ToString(CultureInfo.InvariantCulture); } + [HarmonyTargetMethod] + public static MethodBase Target() + { + return AccessTools.Method(typeof(float), "ToString"); + } + } - [Bugfix(name = "EnchantmentTableFloatParseFix", - description = "Make all float parsing culture-invariant", - component = BugfixType.HarmonyPatch, id = 1)] - [HarmonyPatch(typeof(float), "ToString", new Type[] { typeof(string)})] + [Bugfix(name = "AntiStupidFloats", + description = "Force language-agnostic float->string behaviour internally, like all programs should (DISABLED BY DEFAULT)", + component = BugfixType.HarmonyPatch, id = 10)] + [HarmonyPatch] class Float_ToString1_Patch { [HarmonyPostfix] - public static void AfterMethodCall(string format, float __instance, ref string __result) + public static void AfterMethodCall(ref string format, ref float __instance, ref string __result) { +#if DEBUG + API.Utility.Logging.MetaLog("Float_ToString1_Patch"); +#endif if (!FloatLanguageFix.Enabled) return; API.Utility.Logging.LogWarning($"Intercepting float.ToString(\"{format}\") to InvariantCulture equivalent\nStackTrace: {Environment.StackTrace}"); __result = __instance.ToString(format, CultureInfo.InvariantCulture); } + + [HarmonyTargetMethod] + public static MethodBase Target() + { + return AccessTools.Method(typeof(float), "ToString", new[] {typeof(string)}); + } } -} \ No newline at end of file +}*/ \ No newline at end of file diff --git a/CLre/Fixes/InitLogSooner.cs b/CLre/Fixes/InitLogSooner.cs index b6c3b44..2c56939 100644 --- a/CLre/Fixes/InitLogSooner.cs +++ b/CLre/Fixes/InitLogSooner.cs @@ -22,7 +22,7 @@ namespace CLre.Fixes CustomLoggerThread_CreateGameObject_Patch.allowed = true; CustomLoggerThread.CreateGameObject(); CustomLoggerThread_CreateGameObject_Patch.allowed = false; - API.Utility.Logging.Log($"Completed early log init"); + API.Utility.Logging.Log("Completed early log init"); //System.IO.File.WriteAllText("InitLogSooner.log", $"Done at " + System.DateTime.Now.ToString()); } catch (Exception e) @@ -65,10 +65,12 @@ namespace CLre.Fixes FieldInfo quitThreadField = AccessTools.Field(typeof(CustomLoggerThread), "_quitThread"); MethodInfo flushLoggerMethod = AccessTools.Method(typeof(CustomLoggerThread), "FlushLogger"); - Flusher flushLogger = (Flusher) Delegate.CreateDelegate(typeof(Action), null, flushLoggerMethod); + Flusher flushLogger = API.Utility.Reflection.BuildDelegate(flushLoggerMethod, null); + //Flusher flushLogger = (Flusher) Delegate.CreateDelegate(typeof(Action), null, flushLoggerMethod); MethodInfo forceFlushMethod = AccessTools.Method("CustomLogger:ForceFlush"); - Flusher forceFlush = (Flusher) Delegate.CreateDelegate(typeof(Action), null, forceFlushMethod); + Flusher forceFlush = API.Utility.Reflection.BuildDelegate(forceFlushMethod, null); + //Flusher forceFlush = (Flusher) Delegate.CreateDelegate(typeof(Action), null, forceFlushMethod); Thread.MemoryBarrier(); IsLogStarted = true; diff --git a/CLre/Fixes/OfflineGameTimeSavingFloatFix.cs b/CLre/Fixes/OfflineGameTimeSavingFloatFix.cs new file mode 100644 index 0000000..72a9b55 --- /dev/null +++ b/CLre/Fixes/OfflineGameTimeSavingFloatFix.cs @@ -0,0 +1,69 @@ +using System; +using System.Reflection; +using HarmonyLib; +using SQL; +using Svelto.DataStructures; + +namespace CLre.Fixes +{ + public class OfflineGameTimeSavingFloatFix + { + + } + + [Bugfix(name = "OfflineGameTimeSavingFloatFix", + description = "Make game time save properly for everyone, even when floats contain a comma", + component = BugfixType.HarmonyPatch, id = 11)] + [HarmonyPatch] + class OfflineSaveServerGameTimeRequest_DoRequest_Patch + { + private const string QUERY = "INSERT OR REPLACE INTO gametime (gameId, gameTime) VALUES (@GameId, @GameTime)"; + + [HarmonyPrefix] + public static bool BeforeMethodCall(object __instance, ref object ____dependency) + { + //API.Utility.Logging.Log("Intercepting OfflineSaveServerGameTimeRequest.DoRequest"); + //if (____dependency == null) return true; +#if DEBUG + API.Utility.Logging.Log( + "Replacing OfflineSaveServerGameTimeRequest.DoRequest SQL query with safer alternative"); +#endif + // TODO optimise + ISQL sql = Traverse.Create(__instance).Property("sql").Value; + Traverse dep = Traverse.Create(____dependency); + // populate params + FasterList sqlParams = new FasterList(); + sqlParams.Add(new SQLParam("@GameId", dep.Field("gameId").Value)); + sqlParams.Add(new SQLParam("@GameTime", dep.Field("gameTime").Value)); + // actually perform query + sql.ExecuteSaveQuery(QUERY, OnComplete, OnError, sqlParams); +#if DEBUG + API.Utility.Logging.Log("Executed corrected game time saving SQL query"); +#endif + return false; + } + + private static void OnComplete(int numberRowsEdited) + { +#if DEBUG + API.Utility.Logging.Log( + $"Completed OfflineSaveServerGameTimeRequest_DoRequest_Patch SQL Query ({numberRowsEdited} rows)"); +#endif + } + + private static void OnError(Exception e) + { +#if DEBUG + API.Utility.Logging.LogError( + $"Error in OfflineSaveServerGameTimeRequest_DoRequest_Patch SQL Query: {e}\n{e.StackTrace}"); +#endif + } + + [HarmonyTargetMethod] + public static MethodBase Target() + { + return AccessTools.Method( + "Requests.ServerSaving.ServerLoginTime.OfflineSaveServerGameTimeRequest:DoRequest"); + } + } +} \ No newline at end of file diff --git a/CLre/Fixes/OfflineSpawnpointSavingFloatFix.cs b/CLre/Fixes/OfflineSpawnpointSavingFloatFix.cs index 2bfe890..2daeb7e 100644 --- a/CLre/Fixes/OfflineSpawnpointSavingFloatFix.cs +++ b/CLre/Fixes/OfflineSpawnpointSavingFloatFix.cs @@ -23,7 +23,7 @@ namespace CLre.Fixes [HarmonyPrefix] public static bool BeforeMethodCall(object __instance, object ____dependency) { - API.Utility.Logging.Log("Intercepting OfflineSavePlayerSpawnPointRequest.DoRequest"); + //API.Utility.Logging.Log("Intercepting OfflineSavePlayerSpawnPointRequest.DoRequest"); if (____dependency == null) return true; #if DEBUG API.Utility.Logging.Log("Replacing OfflineSavePlayerSpawnPointRequest.DoRequest SQL squery with safer alternative");