Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions CommunityBugFixCollection/BugFixOptions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
using MonkeyLoader.Configuration;
using System;
using System.Collections.Generic;
using System.Text;

namespace CommunityBugFixCollection
{
internal sealed class BugFixOptions : ConfigSection
{
private static readonly DefiningConfigKey<bool> _useIecByteFormat = new("UseIecByteFormat", "Whether to format bytes using IEC as opposed to decimal format when <i>LocalizedByteFormatting</i> is enabled.", () => true);

/// <inheritdoc/>
public override string Description => "Contains the settings for the few fixes that offer them.";

/// <inheritdoc/>
public override string Id => "Options";

/// <summary>
/// Gets whether <see cref="LocalizedByteFormatting"/> should format bytes using IEC or decimal format.
/// </summary>
public bool UseIecByteFormat => _useIecByteFormat.GetValue();

/// <inheritdoc/>
public override Version Version { get; } = new(1, 0, 0);
}
}
2 changes: 1 addition & 1 deletion CommunityBugFixCollection/CommunityBugFixCollection.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<PackageId>CommunityBugFixCollection</PackageId>
<Title>Community Bug-Fix Collection</Title>
<Authors>Banane9; Nytra; art0007i; LeCloutPanda; goat; __Choco__</Authors>
<Authors>Banane9; Nytra; art0007i; LeCloutPanda; goat; __Choco__; LJ</Authors>
<Version>0.5.0-beta</Version>
<Description>This MonkeyLoader mod for Resonite that fixes various small Resonite-issues that are still open.</Description>
<PackageReadmeFile>README.md</PackageReadmeFile>
Expand Down
12 changes: 6 additions & 6 deletions CommunityBugFixCollection/Contributors.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text;
using System.Diagnostics.CodeAnalysis;

namespace CommunityBugFixCollection
{
[SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "Usernames")]
internal static class Contributors
{
public static string[] __Choco__ { get; } = ["__Choco__"];

public static string[] Art0007i { get; } = ["art0007i"];

public static string[] Banane9 { get; } = ["Banane9"];
Expand All @@ -15,8 +15,8 @@ internal static class Contributors

public static string[] LeCloutPanda { get; } = ["LeCloutPanda"];

public static string[] Nytra { get; } = ["Nytra"];
public static string[] LJ { get; } = ["LJ"];

public static string[] __Choco__ { get; } = ["__Choco__"];
public static string[] Nytra { get; } = ["Nytra"];
}
}
9 changes: 7 additions & 2 deletions CommunityBugFixCollection/Locale/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
"CommunityBugFixCollection.ImportMultipleAudioFiles.Description": "Macht es möglich mehrere Audiodateien auf einmal zu importieren.",
"CommunityBugFixCollection.ImportWebFilesAsUrls.Description": "Sorgt dafür, dass URLs zu Textdateien oder Resonite Packages nicht importiert werden, statt als Hyperlink aufzutauchen.",
"CommunityBugFixCollection.IndependentlyScaleDirectCursor.Description": "Verhindert, dass der direkte Cursor sehr groß wird, wenn er an einem deutlich nährem Objekt hängt als der echte Cursor.",
"CommunityBugFixCollection.LocalizedByteFormatting.Description": "Lokalisiert die Speichereinheiten (MiB, GiB, etc.), inbsesondere bei der StorageUsageStatus Komponente.",
"CommunityBugFixCollection.LocalizedByteFormatting.Description": "Lokalisiert die Speichereinheiten (MiB, GiB, etc.), inbsesondere bei der StorageUsageStatus Komponente. Es gibt eine Einstellung dafür, die Bytes nach IEC (Faktor 1024) statt dezimal (Faktor 1000) zu formatieren.",
"CommunityBugFixCollection.LongerWorldLoadingFailIndication.Description": "Lässt den Welt-Ladefortschritts-Indikator frühestens nach 20s verschwinden, falls der Vorgang fehlgeschlagen ist.",
"CommunityBugFixCollection.NaNtEqual.Description": "Sorgt dafür, dass NaN float / double Werte sich bei den == und != ProtoFlux Nodes sowie bei der ValueEqualityDriver Komponente niemals gleichen.",
"CommunityBugFixCollection.NoLossOfColorProfile.Description": "Verhindert, dass Farbprofile nicht bei allen Berechnungen erhalten bleiben.",
Expand All @@ -44,6 +44,11 @@
"CommunityBugFixCollection.TiltedUIAlignment.Description": "Kippt die UI-fokussierte Kamera, um UIX-Renderprobleme zum umgehen.",
"CommunityBugFixCollection.StationaryGrabWorldActivation.Description": "Verhindert, dass die Welt-Greifen Fortbewegung den Spieler bei jeder Aktivierung bewegt.",
"CommunityBugFixCollection.ValidQuaternionInputs.Description": "Lässt das ProtoFlux-Tool valide float und double Quaternions spawnen.",
"CommunityBugFixCollection.UserInspectorAsNonHost.Description": "Sorgt dafür, dass Benutzer-Inspektoren bereits präsente Benutzer auch in Sessions anzeigen, in denen man nicht der Host ist."
"CommunityBugFixCollection.UserInspectorAsNonHost.Description": "Sorgt dafür, dass Benutzer-Inspektoren bereits präsente Benutzer auch in Sessions anzeigen, in denen man nicht der Host ist.",

"CommunityBugFixCollection.Config.Options.Name": "Optionen",
"CommunityBugFixCollection.Config.Options.Description": "Enthällt die Einstellungen für die wenigen Fixes die diese anbieten.",
"CommunityBugFixCollection.Config.Options.UseIecByteFormat.Name": "IEC Byte-Format Benutzen",
"CommunityBugFixCollection.Config.Options.UseIecByteFormat.Description": "Ob Bytes nach IEC (Faktor 1024) statt dezimal (Faktor 1000) formatiert werden sollen, wenn <i>LocalizedByteFormatting</i> aktiviert ist."
}
}
31 changes: 24 additions & 7 deletions CommunityBugFixCollection/Locale/en.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
{
"localeCode": "en",
"authors": [ "Banane9", "__Choco__", "Nytra" ],
"authors": [
"Banane9",
"__Choco__",
"Nytra",
"LJ"
],
"messages": {
"CommunityBugFixCollection.Name": "Community Bug-Fix Collection",
"CommunityBugFixCollection.Description": "This mod contains fixes for various small Resonite Issues that are still open.",
Expand Down Expand Up @@ -30,7 +35,7 @@
"CommunityBugFixCollection.ImportMultipleAudioFiles.Description": "Fixes it not being possible to import multiple audio clips at once.",
"CommunityBugFixCollection.ImportWebFilesAsUrls.Description": "Fixes URLs to text files or Resonite Packages failing to import instead of appearing as a hyperlink.",
"CommunityBugFixCollection.IndependentlyScaleDirectCursor.Description": "Fixes direct cursor size becoming very large when snapped to an object much closer than the true cursor.",
"CommunityBugFixCollection.LocalizedByteFormatting.Description": "Localizes the storage units (MiB, GiB, etc.), in particular for the StorageUsageStatus component.",
"CommunityBugFixCollection.LocalizedByteFormatting.Description": "Localizes the storage units (MiB, GiB, etc.), in particular for the StorageUsageStatus component. There's an option to use IEC format (factor 1024) over decimal (factor 1000).",
"CommunityBugFixCollection.LongerWorldLoadingFailIndication.Description": "Only lets the World Load Progress Indicator disappear after 20s or more if the process failed.",
"CommunityBugFixCollection.NaNtEqual.Description": "Makes NaN floats / doubles never equal to each other for the ProtoFlux == and != nodes, as well as the ValueEqualityDriver component.",
"CommunityBugFixCollection.NoLossOfColorProfile.Description": "Fixes Color Profile not being preserved on all operations.",
Expand All @@ -47,11 +52,23 @@
"CommunityBugFixCollection.ValidQuaternionInputs.Description": "Makes the ProtoFlux Tool spawn valid float and double quaternion inputs.",
"CommunityBugFixCollection.ValueModDecimal.Description": "Adds a zero check to the Decimal ValueMod ProtoFlux node to prevent DIV/0 crashes",

"CommunityBugFixCollection.Config.Options.Name": "Options",
"CommunityBugFixCollection.Config.Options.Description": "Contains the settings for the few fixes that offer them.",
"CommunityBugFixCollection.Config.Options.UseIecByteFormat.Name": "Use IEC Byte Format",
"CommunityBugFixCollection.Config.Options.UseIecByteFormat.Description": "Whether to format bytes using IEC (factor 1024) as opposed to decimal format (factor 1000) when <i>LocalizedByteFormatting</i> is enabled.",

"CommunityBugFixCollection.StorageUnits.Bi": "B",
"CommunityBugFixCollection.StorageUnits.kiB": "KiB",
"CommunityBugFixCollection.StorageUnits.MiB": "MiB",
"CommunityBugFixCollection.StorageUnits.GiB": "GiB",
"CommunityBugFixCollection.StorageUnits.TiB": "TiB",
"CommunityBugFixCollection.StorageUnits.PiB": "PiB",

"CommunityBugFixCollection.StorageUnits.B": "B",
"CommunityBugFixCollection.StorageUnits.kB": "KiB",
"CommunityBugFixCollection.StorageUnits.MB": "MiB",
"CommunityBugFixCollection.StorageUnits.GB": "GiB",
"CommunityBugFixCollection.StorageUnits.TB": "TiB",
"CommunityBugFixCollection.StorageUnits.PB": "PiB"
"CommunityBugFixCollection.StorageUnits.kB": "kB",
"CommunityBugFixCollection.StorageUnits.MB": "MB",
"CommunityBugFixCollection.StorageUnits.GB": "GB",
"CommunityBugFixCollection.StorageUnits.TB": "TB",
"CommunityBugFixCollection.StorageUnits.PB": "PB"
}
}
12 changes: 6 additions & 6 deletions CommunityBugFixCollection/Locale/fi.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
{
"localeCode": "fi",
"authors": [ "Banane9" ],
"authors": [ "LJ" ],
"messages": {
"CommunityBugFixCollection.StorageUnits.B": "t",
"CommunityBugFixCollection.StorageUnits.kB": "Kit",
"CommunityBugFixCollection.StorageUnits.MB": "Mit",
"CommunityBugFixCollection.StorageUnits.GB": "Git",
"CommunityBugFixCollection.StorageUnits.TB": "Tit",
"CommunityBugFixCollection.StorageUnits.PB": "Pit"
"CommunityBugFixCollection.StorageUnits.kB": "kt",
"CommunityBugFixCollection.StorageUnits.MB": "Mt",
"CommunityBugFixCollection.StorageUnits.GB": "Gt",
"CommunityBugFixCollection.StorageUnits.TB": "Tt",
"CommunityBugFixCollection.StorageUnits.PB": "Pt"
}
}
10 changes: 5 additions & 5 deletions CommunityBugFixCollection/Locale/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
"authors": [ "Banane9" ],
"messages": {
"CommunityBugFixCollection.StorageUnits.B": "o",
"CommunityBugFixCollection.StorageUnits.kB": "Kio",
"CommunityBugFixCollection.StorageUnits.MB": "Mio",
"CommunityBugFixCollection.StorageUnits.GB": "Gio",
"CommunityBugFixCollection.StorageUnits.TB": "Tio",
"CommunityBugFixCollection.StorageUnits.PB": "Pio"
"CommunityBugFixCollection.StorageUnits.kB": "Ko",
"CommunityBugFixCollection.StorageUnits.MB": "Mo",
"CommunityBugFixCollection.StorageUnits.GB": "Go",
"CommunityBugFixCollection.StorageUnits.TB": "To",
"CommunityBugFixCollection.StorageUnits.PB": "Po"
}
}
79 changes: 48 additions & 31 deletions CommunityBugFixCollection/LocalizedByteFormatting.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Elements.Core;
using FrooxEngine;
using HarmonyLib;
using MonkeyLoader.Configuration;
using MonkeyLoader.Resonite;
using MonkeyLoader.Resonite.Locale;
using System;
Expand All @@ -10,47 +11,41 @@
using System.Text;
using System.Threading.Tasks;

#pragma warning disable MHA008 // Assignment to non-ref patch method argument

namespace CommunityBugFixCollection
{
[HarmonyPatch]
[HarmonyPatchCategory(nameof(LocalizedByteFormatting))]
internal sealed class LocalizedByteFormatting : ResoniteAsyncEventHandlerMonkey<LocalizedByteFormatting, LocaleLoadingEvent>
internal sealed class LocalizedByteFormatting : ConfiguredResoniteAsyncEventHandlerMonkey<LocalizedByteFormatting, BugFixOptions, LocaleLoadingEvent>
{
public override IEnumerable<string> Authors => Contributors.Banane9;
private static readonly ConditionalWeakTable<StorageUsageStatus, CultureInfo> _lastCultureByStorageStatus = new();

public override IEnumerable<string> Authors { get; } = [.. Contributors.Banane9, .. Contributors.LJ];

public override bool CanBeDisabled => true;

public override int Priority => HarmonyLib.Priority.Last;

[HarmonyPrefix]
[HarmonyPatch(typeof(UnitFormatting), nameof(UnitFormatting.FormatBytes))]
private static bool UnitFormatBytesPrefix(double bytes, int decimalPlaces, ref string __result)
protected override Task Handle(LocaleLoadingEvent eventData)
{
if (!Enabled)
return true;
Engine.Current.GlobalCoroutineManager.RunInSeconds(2, _lastCultureByStorageStatus.Clear);

var format = $"F{decimalPlaces}";
var absoluteBytes = MathX.Abs(bytes);
var culture = Settings.GetActiveSetting<LocaleSettings>()?.ActiveCulture ?? CultureInfo.CurrentCulture;
return Task.CompletedTask;
}

foreach (var suffix in UnitFormatting.suffixes)
{
if (absoluteBytes < 1024.0 || suffix == UnitFormatting.suffixes[^1])
{
__result = $"{bytes.ToString(format, culture)} {Mod.GetMessageInCurrent($"StorageUnits.{suffix}")}";
return false;
}

bytes /= 1024;
absoluteBytes /= 1024;
}
protected override bool OnEngineReady()
{
ConfigSection.ItemChanged += ConfigSectionItemChanged;

return false;
return base.OnEngineReady();
}

private static readonly ConditionalWeakTable<StorageUsageStatus, CultureInfo> _lastCultureByStorageStatus = new();
protected override bool OnShutdown(bool applicationExiting)
{
if (!applicationExiting)
ConfigSection.ItemChanged -= ConfigSectionItemChanged;

return base.OnShutdown(applicationExiting);
}

[HarmonyPrefix]
[HarmonyPatch(typeof(StorageUsageStatus), nameof(StorageUsageStatus.OnCommonUpdate))]
Expand Down Expand Up @@ -128,13 +123,35 @@ private static bool StorageUsageStatusOnCommonUpdatePrefix(StorageUsageStatus __
return false;
}

protected override Task Handle(LocaleLoadingEvent eventData)
[HarmonyPrefix]
[HarmonyPatch(typeof(UnitFormatting), nameof(UnitFormatting.FormatBytes))]
private static bool UnitFormatBytesPrefix(double bytes, int decimalPlaces, ref string __result)
{
Engine.Current.GlobalCoroutineManager.RunInSeconds(2, _lastCultureByStorageStatus.Clear);
if (!Enabled)
return true;

return Task.CompletedTask;
var format = $"F{decimalPlaces}";
var culture = Settings.GetActiveSetting<LocaleSettings>()?.ActiveCulture ?? CultureInfo.CurrentCulture;

// Select base and divisor for suffix determination
var baseNum = ConfigSection.UseIecByteFormat ? 2 : 10;
var divNum = ConfigSection.UseIecByteFormat ? 10 : 3;

// Either `2^(10*n)` or `10^(3*n)`, but also limited to max unit index.
var index = MathX.Min(MathX.FloorToUInt(MathX.Log(MathX.Abs(bytes), baseNum) / divNum), (uint)(UnitFormatting.suffixes.Length - 1));
var suffix = UnitFormatting.suffixes[index];

if (ConfigSection.UseIecByteFormat)
suffix = suffix.Insert(suffix.Length - 1, "i");

// AKA scaled bytes in IEC/decimal format
var numToFormat = bytes / MathX.Pow(baseNum, divNum * index);
__result = $"{numToFormat.ToString(format, culture)} {Mod.GetMessageInCurrent($"StorageUnits.{suffix}")}";

return false;
}
}
}

#pragma warning restore MHA008 // Assignment to non-ref patch method argument
private void ConfigSectionItemChanged(object sender, IConfigKeyChangedEventArgs configKeyChangedEventArgs)
=> Engine.Current.GlobalCoroutineManager.RunInSeconds(0, _lastCultureByStorageStatus.Clear);
}
}