@@ -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(); | |||
@@ -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 | |||
} | |||
@@ -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)}); | |||
} | |||
} | |||
} | |||
}*/ |
@@ -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<Flusher>(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<Flusher>(forceFlushMethod, null); | |||
//Flusher forceFlush = (Flusher) Delegate.CreateDelegate(typeof(Action), null, forceFlushMethod); | |||
Thread.MemoryBarrier(); | |||
IsLogStarted = true; | |||
@@ -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<ISQL>("sql").Value; | |||
Traverse dep = Traverse.Create(____dependency); | |||
// populate params | |||
FasterList<SQLParam> sqlParams = new FasterList<SQLParam>(); | |||
sqlParams.Add(new SQLParam("@GameId", dep.Field<long>("gameId").Value)); | |||
sqlParams.Add(new SQLParam("@GameTime", dep.Field<double>("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"); | |||
} | |||
} | |||
} |
@@ -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"); | |||