using System.Globalization; using System.Reflection; using System.Text; using Game.UI.WorldMapScreen; using HarmonyLib; using Svelto.DataStructures; namespace CLre.Fixes { public class MapPinPointsFloatFix { } [Bugfix(name = "OfflineMapPointsFloatFix", description = "Make map pin points save properly for everyone, even when floats contain a comma", more = "https://trello.com/c/fEcNBLbZ/29-map-markers-reset-on-re-log", component = BugfixType.HarmonyPatch, id = 12)] [HarmonyPatch] class WorldMapPinPointsMessage_InjectValues_Patch { private static StringBuilder sb = new StringBuilder(); [HarmonyPrefix] public static bool BeforeMethodCall(WorldMapPinPointsMessage __instance, FasterList pinPositions) { #if DEBUG API.Utility.Logging.Log("Intercepting Game.UI.WorldMapScreen.WorldMapPinPointsMessage:InjectValues"); #endif sb.Length = 0; for (int i = 0; i < pinPositions.Count; i++) { if (pinPositions[i].IsOnMap) { // force culture invariant float format (with a . as decimal point) sb.AppendFormat("{0};{1};", pinPositions[i].PinPosition.x.ToString("0.0", CultureInfo.InvariantCulture), pinPositions[i].PinPosition.y.ToString("0.0", CultureInfo.InvariantCulture)); } else { sb.AppendFormat("{0};{1};", "x", "x"); } } __instance.pinPoints = sb.ToString(); #if DEBUG API.Utility.Logging.Log($"Corrected pin point string to culture invariant: {sb.ToString()}"); #endif return false; } [HarmonyTargetMethod] public static MethodBase Target() { return AccessTools.Method(typeof(WorldMapPinPointsMessage), "InjectValues"); } } }