Browse Source

Fix some more float parsing bugs

tags/v0.0.3
NGnius (Graham) 2 years ago
parent
commit
175a569ea4
6 changed files with 108 additions and 16 deletions
  1. +2
    -2
      CLre/CLre.cs
  2. +1
    -1
      CLre/Fixes/EnchantmentTableFloatParseFix.cs
  3. +30
    -9
      CLre/Fixes/FloatLanguageFix.cs
  4. +5
    -3
      CLre/Fixes/InitLogSooner.cs
  5. +69
    -0
      CLre/Fixes/OfflineGameTimeSavingFloatFix.cs
  6. +1
    -1
      CLre/Fixes/OfflineSpawnpointSavingFloatFix.cs

+ 2
- 2
CLre/CLre.cs View File

@@ -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();


+ 1
- 1
CLre/Fixes/EnchantmentTableFloatParseFix.cs View File

@@ -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
}


+ 30
- 9
CLre/Fixes/FloatLanguageFix.cs View File

@@ -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)});
}
}
}
}*/

+ 5
- 3
CLre/Fixes/InitLogSooner.cs View File

@@ -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;


+ 69
- 0
CLre/Fixes/OfflineGameTimeSavingFloatFix.cs View File

@@ -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");
}
}
}

+ 1
- 1
CLre/Fixes/OfflineSpawnpointSavingFloatFix.cs View File

@@ -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");


Loading…
Cancel
Save