diff --git a/LSLib/LS/Matrix.cs b/LSLib/LS/Matrix.cs index f7204bf8..07e9cd41 100644 --- a/LSLib/LS/Matrix.cs +++ b/LSLib/LS/Matrix.cs @@ -37,6 +37,7 @@ OTHER DEALINGS IN THE SOFTWARE. namespace LSLib.LS; +using System.Globalization; public class Matrix { @@ -257,7 +258,7 @@ public static Matrix Parse(string ps) // Function parses for (int i = 0; i < rows.Length; i++) { nums = rows[i].Split(' '); - for (int j = 0; j < nums.Length; j++) matrix[i, j] = double.Parse(nums[j]); + for (int j = 0; j < nums.Length; j++) matrix[i, j] = double.Parse(nums[j], CultureInfo.InvariantCulture); } } catch (FormatException) { throw new MException("Wrong input format!"); } diff --git a/LSLib/LS/NodeAttribute.cs b/LSLib/LS/NodeAttribute.cs index 83780091..27be7be2 100644 --- a/LSLib/LS/NodeAttribute.cs +++ b/LSLib/LS/NodeAttribute.cs @@ -4,6 +4,8 @@ namespace LSLib.LS; +using System.Globalization; + public class TranslatedString { public UInt16 Version = 0; @@ -243,12 +245,12 @@ public string AsString(NodeSerializationSettings settings) case AttributeType.IVec2: case AttributeType.IVec3: case AttributeType.IVec4: - return String.Join(" ", new List((int[])value).ConvertAll(i => i.ToString()).ToArray()); + return String.Join(" ", new List((int[])value).ConvertAll(i => i.ToString(CultureInfo.InvariantCulture)).ToArray()); case AttributeType.Vec2: case AttributeType.Vec3: case AttributeType.Vec4: - return String.Join(" ", new List((float[])value).ConvertAll(i => i.ToString()).ToArray()); + return String.Join(" ", new List((float[])value).ConvertAll(i => i.ToString(CultureInfo.InvariantCulture)).ToArray()); case AttributeType.UUID: if (settings.ByteSwapGuids) @@ -260,6 +262,12 @@ public string AsString(NodeSerializationSettings settings) return value.ToString(); } + case AttributeType.Float: + return ((float) value).ToString(CultureInfo.InvariantCulture); + + case AttributeType.Double: + return ((double) value).ToString(CultureInfo.InvariantCulture); + default: return value.ToString(); } diff --git a/LSLib/LS/Resources/LSJ/LSJReader.cs b/LSLib/LS/Resources/LSJ/LSJReader.cs index 5e741f21..781f3ac2 100644 --- a/LSLib/LS/Resources/LSJ/LSJReader.cs +++ b/LSLib/LS/Resources/LSJ/LSJReader.cs @@ -2,6 +2,8 @@ namespace LSLib.LS; +using System.Globalization; + public class LSJReader(Stream stream) : IDisposable { private readonly Stream stream = stream; @@ -16,6 +18,7 @@ public Resource Read() { var settings = new JsonSerializerSettings(); settings.Converters.Add(new LSJResourceConverter(SerializationSettings)); + settings.Culture = CultureInfo.InvariantCulture; var serializer = JsonSerializer.Create(settings); using var streamReader = new StreamReader(stream); diff --git a/LSLib/LS/Resources/LSJ/LSJResourceConverter.cs b/LSLib/LS/Resources/LSJ/LSJResourceConverter.cs index 906fa891..dc164a43 100644 --- a/LSLib/LS/Resources/LSJ/LSJResourceConverter.cs +++ b/LSLib/LS/Resources/LSJ/LSJResourceConverter.cs @@ -4,6 +4,8 @@ namespace LSLib.LS; +using System.Globalization; + public class LSJResourceConverter(NodeSerializationSettings settings) : JsonConverter { private LSMetadata Metadata; @@ -200,11 +202,11 @@ private NodeAttribute ReadAttribute(JsonReader reader) break; case AttributeType.Float: - attribute.Value = Convert.ToSingle(reader.Value); + attribute.Value = Convert.ToSingle(reader.Value, CultureInfo.InvariantCulture); break; case AttributeType.Double: - attribute.Value = Convert.ToDouble(reader.Value); + attribute.Value = Convert.ToDouble(reader.Value, CultureInfo.InvariantCulture); break; case AttributeType.Bool: @@ -304,7 +306,7 @@ private NodeAttribute ReadAttribute(JsonReader reader) float[] vec = new float[length]; for (int i = 0; i < length; i++) - vec[i] = float.Parse(nums[i]); + vec[i] = float.Parse(nums[i], CultureInfo.InvariantCulture); attribute.Value = vec; break; diff --git a/LSLib/LS/Resources/LSJ/LSJWriter.cs b/LSLib/LS/Resources/LSJ/LSJWriter.cs index 3c600f4b..de2b679c 100644 --- a/LSLib/LS/Resources/LSJ/LSJWriter.cs +++ b/LSLib/LS/Resources/LSJ/LSJWriter.cs @@ -2,6 +2,8 @@ namespace LSLib.LS; +using System.Globalization; + public class LSJWriter(Stream stream) { private readonly Stream stream = stream; @@ -21,6 +23,7 @@ public void Write(Resource rsrc) using var writer = new JsonTextWriter(streamWriter); writer.IndentChar = '\t'; writer.Indentation = 1; + writer.Culture = CultureInfo.InvariantCulture; serializer.Serialize(writer, rsrc); } } diff --git a/LSLib/LS/Resources/LSX/LSXReader.cs b/LSLib/LS/Resources/LSX/LSXReader.cs index 1b7ed4f4..1fe8b0a3 100644 --- a/LSLib/LS/Resources/LSX/LSXReader.cs +++ b/LSLib/LS/Resources/LSX/LSXReader.cs @@ -4,6 +4,8 @@ namespace LSLib.LS; +using System.Globalization; + public class LSXReader(Stream stream) : IDisposable { private Stream stream = stream; @@ -215,27 +217,27 @@ private void ReadElement() case "float2": { var val = (float[])LastAttribute.Value; - val[ValueOffset++] = Single.Parse(reader["x"]); - val[ValueOffset++] = Single.Parse(reader["y"]); + val[ValueOffset++] = Single.Parse(reader["x"], CultureInfo.InvariantCulture); + val[ValueOffset++] = Single.Parse(reader["y"], CultureInfo.InvariantCulture); break; } case "float3": { var val = (float[])LastAttribute.Value; - val[ValueOffset++] = Single.Parse(reader["x"]); - val[ValueOffset++] = Single.Parse(reader["y"]); - val[ValueOffset++] = Single.Parse(reader["z"]); + val[ValueOffset++] = Single.Parse(reader["x"], CultureInfo.InvariantCulture); + val[ValueOffset++] = Single.Parse(reader["y"], CultureInfo.InvariantCulture); + val[ValueOffset++] = Single.Parse(reader["z"], CultureInfo.InvariantCulture); break; } case "float4": { var val = (float[])LastAttribute.Value; - val[ValueOffset++] = Single.Parse(reader["x"]); - val[ValueOffset++] = Single.Parse(reader["y"]); - val[ValueOffset++] = Single.Parse(reader["z"]); - val[ValueOffset++] = Single.Parse(reader["w"]); + val[ValueOffset++] = Single.Parse(reader["x"], CultureInfo.InvariantCulture); + val[ValueOffset++] = Single.Parse(reader["y"], CultureInfo.InvariantCulture); + val[ValueOffset++] = Single.Parse(reader["z"], CultureInfo.InvariantCulture); + val[ValueOffset++] = Single.Parse(reader["w"], CultureInfo.InvariantCulture); break; } diff --git a/LSLib/LS/Story/Database.cs b/LSLib/LS/Story/Database.cs index 71859882..956df5a6 100644 --- a/LSLib/LS/Story/Database.cs +++ b/LSLib/LS/Story/Database.cs @@ -2,6 +2,8 @@ namespace LSLib.LS.Story; +using System.Globalization; + public class Fact : OsirisSerializable { public List Columns; @@ -121,7 +123,7 @@ public override void SetValue(object component, object value) case Value.Type.Float: { - if (value is String) column.FloatValue = Single.Parse((String)value); + if (value is String) column.FloatValue = Single.Parse((String)value, CultureInfo.InvariantCulture); else if (value is Single) column.FloatValue = (Single)value; else throw new ArgumentException("Invalid float value"); break;