From ade4a893388c968a4e7ea63b1ed0226d43c14cba Mon Sep 17 00:00:00 2001 From: pizzaboxer Date: Sat, 15 Jul 2023 00:05:49 +0100 Subject: [PATCH] Add option to use pre-2013 mouse cursor --- Bloxstrap/Bloxstrap.csproj | 8 +- Bloxstrap/Bootstrapper.cs | 37 ++++--- Bloxstrap/Enums/CursorType.cs | 9 ++ Bloxstrap/Extensions/CursorTypeEx.cs | 16 +++ Bloxstrap/Models/Settings.cs | 2 +- .../Mods/Cursor/From2006/ArrowCursor.png | Bin 0 -> 2065 bytes .../Mods/Cursor/From2006/ArrowFarCursor.png | Bin 0 -> 2169 bytes .../From2013/ArrowCursor.png} | Bin .../From2013/ArrowFarCursor.png} | Bin .../UI/Elements/Menu/Pages/ModsPage.xaml | 103 ++++++++---------- Bloxstrap/UI/ViewModels/Menu/ModsViewModel.cs | 8 +- 11 files changed, 101 insertions(+), 82 deletions(-) create mode 100644 Bloxstrap/Enums/CursorType.cs create mode 100644 Bloxstrap/Extensions/CursorTypeEx.cs create mode 100644 Bloxstrap/Resources/Mods/Cursor/From2006/ArrowCursor.png create mode 100644 Bloxstrap/Resources/Mods/Cursor/From2006/ArrowFarCursor.png rename Bloxstrap/Resources/Mods/{OldCursor.png => Cursor/From2013/ArrowCursor.png} (100%) rename Bloxstrap/Resources/Mods/{OldFarCursor.png => Cursor/From2013/ArrowFarCursor.png} (100%) diff --git a/Bloxstrap/Bloxstrap.csproj b/Bloxstrap/Bloxstrap.csproj index 11901f0..f1ce5f1 100644 --- a/Bloxstrap/Bloxstrap.csproj +++ b/Bloxstrap/Bloxstrap.csproj @@ -1,4 +1,4 @@ - + WinExe @@ -24,10 +24,12 @@ + + + + - - diff --git a/Bloxstrap/Bootstrapper.cs b/Bloxstrap/Bootstrapper.cs index 1f6e4d9..16059f8 100644 --- a/Bloxstrap/Bootstrapper.cs +++ b/Bloxstrap/Bootstrapper.cs @@ -998,15 +998,20 @@ namespace Bloxstrap if (!Directory.Exists(modFolder)) Directory.CreateDirectory(modFolder); - await CheckModPreset(App.Settings.Prop.UseOldDeathSound, @"content\sounds\ouch.ogg", "OldDeath.ogg"); - await CheckModPreset(App.Settings.Prop.UseOldMouseCursor, @"content\textures\Cursors\KeyboardMouse\ArrowCursor.png", "OldCursor.png"); - await CheckModPreset(App.Settings.Prop.UseOldMouseCursor, @"content\textures\Cursors\KeyboardMouse\ArrowFarCursor.png", "OldFarCursor.png"); + // cursors + await CheckModPreset(App.Settings.Prop.CursorType != CursorType.Default, @"content\textures\Cursors\KeyboardMouse\ArrowCursor.png", $"Cursor.{App.Settings.Prop.CursorType}.ArrowCursor.png"); + await CheckModPreset(App.Settings.Prop.CursorType != CursorType.Default, @"content\textures\Cursors\KeyboardMouse\ArrowFarCursor.png", $"Cursor.{App.Settings.Prop.CursorType}.ArrowFarCursor.png"); + + // character sounds await CheckModPreset(App.Settings.Prop.UseOldCharacterSounds, @"content\sounds\action_footsteps_plastic.mp3", "OldWalk.mp3"); await CheckModPreset(App.Settings.Prop.UseOldCharacterSounds, @"content\sounds\action_jump.mp3", "OldJump.mp3"); await CheckModPreset(App.Settings.Prop.UseOldCharacterSounds, @"content\sounds\action_falling.mp3", "Empty.mp3"); await CheckModPreset(App.Settings.Prop.UseOldCharacterSounds, @"content\sounds\action_jump_land.mp3", "Empty.mp3"); await CheckModPreset(App.Settings.Prop.UseOldCharacterSounds, @"content\sounds\action_swim.mp3", "Empty.mp3"); await CheckModPreset(App.Settings.Prop.UseOldCharacterSounds, @"content\sounds\impact_water.mp3", "Empty.mp3"); + await CheckModPreset(App.Settings.Prop.UseOldDeathSound, @"content\sounds\ouch.ogg", "OldDeath.ogg"); + + // misc await CheckModPreset(App.Settings.Prop.UseDisableAppPatch && !_launchCommandLine.Contains("--deeplink"), @"ExtraContent\places\Mobile.rbxl", ""); // emoji presets are downloaded remotely from github due to how large they are @@ -1104,26 +1109,22 @@ namespace Bloxstrap private static async Task CheckModPreset(bool condition, string location, string name) { - string modFolderLocation = Path.Combine(Directories.Modifications, location); - byte[] binaryData = string.IsNullOrEmpty(name) ? Array.Empty() : await Resource.Get(name); + string fullLocation = Path.Combine(Directories.Modifications, location); + byte[] embeddedData = string.IsNullOrEmpty(name) ? Array.Empty() : await Resource.Get(name); - if (condition) - { - if (!File.Exists(modFolderLocation)) - { - string? directory = Path.GetDirectoryName(modFolderLocation); + string fileHash = File.Exists(fullLocation) ? Utility.MD5Hash.FromFile(fullLocation) : ""; + string embeddedHash = Utility.MD5Hash.FromBytes(embeddedData); - if (directory is null) - return; + if (condition && fileHash != embeddedHash) + { + Directory.CreateDirectory(Path.GetDirectoryName(fullLocation)!); + File.Delete(fullLocation); - Directory.CreateDirectory(directory); - - await File.WriteAllBytesAsync(modFolderLocation, binaryData); - } + await File.WriteAllBytesAsync(fullLocation, embeddedData); } - else if (File.Exists(modFolderLocation) && Utility.MD5Hash.FromFile(modFolderLocation) == Utility.MD5Hash.FromBytes(binaryData)) + else if (!condition && fileHash != "") { - File.Delete(modFolderLocation); + File.Delete(fullLocation); } } diff --git a/Bloxstrap/Enums/CursorType.cs b/Bloxstrap/Enums/CursorType.cs new file mode 100644 index 0000000..98e8ec4 --- /dev/null +++ b/Bloxstrap/Enums/CursorType.cs @@ -0,0 +1,9 @@ +namespace Bloxstrap.Enums +{ + public enum CursorType + { + Default, + From2006, + From2013 + } +} diff --git a/Bloxstrap/Extensions/CursorTypeEx.cs b/Bloxstrap/Extensions/CursorTypeEx.cs new file mode 100644 index 0000000..3afe692 --- /dev/null +++ b/Bloxstrap/Extensions/CursorTypeEx.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; + +using Bloxstrap.Enums; + +namespace Bloxstrap.Extensions +{ + static class CursorTypeEx + { + public static IReadOnlyDictionary Selections => new Dictionary + { + { "Default", CursorType.Default }, + { "Before 2022", CursorType.From2013 }, + { "Before 2013", CursorType.From2006 }, + }; + } +} diff --git a/Bloxstrap/Models/Settings.cs b/Bloxstrap/Models/Settings.cs index 80e28c2..604e3c2 100644 --- a/Bloxstrap/Models/Settings.cs +++ b/Bloxstrap/Models/Settings.cs @@ -29,8 +29,8 @@ namespace Bloxstrap.Models // mod preset configuration public bool UseOldDeathSound { get; set; } = true; public bool UseOldCharacterSounds { get; set; } = false; - public bool UseOldMouseCursor { get; set; } = false; public bool UseDisableAppPatch { get; set; } = false; + public CursorType CursorType { get; set; } = CursorType.Default; public EmojiType EmojiType { get; set; } = EmojiType.Default; public bool DisableFullscreenOptimizations { get; set; } = false; } diff --git a/Bloxstrap/Resources/Mods/Cursor/From2006/ArrowCursor.png b/Bloxstrap/Resources/Mods/Cursor/From2006/ArrowCursor.png new file mode 100644 index 0000000000000000000000000000000000000000..85c463983a935de602927cec0f490c630091476c GIT binary patch literal 2065 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 literal 0 HcmV?d00001 diff --git a/Bloxstrap/Resources/Mods/Cursor/From2006/ArrowFarCursor.png b/Bloxstrap/Resources/Mods/Cursor/From2006/ArrowFarCursor.png new file mode 100644 index 0000000000000000000000000000000000000000..9a1954a334a7b330ad6beae16d11c14ef670f0a6 GIT binary patch literal 2169 zcmb7F`8yMiA9uDKi_8$JIaY3SPAILAOmY;V^wpp6eLv6Z{d%6)^Ss`#=Xw3|PDa^W0t!kCa&d71krt+Q2aNiM!-o!b z`q7Q*15zWIp-C4*ys;#F;0=faKERvH0T&9<)`r-72SK!9Fg=KtwxKS}PzMfChZ(?N zwQnsJ4}1U;(%K9#!Yw2r!{;Ec>Tw_m1X(x}xwuYr`~!Cv-ogGrSY16@LF+oaSgb4);Jk_6gkjP{!bg|pz%PGOkLPT40bMx1{hYxdyaHQFM zz}&blELQ+}mu^>8B1Kr{@Vm6|;A0*m&VHe0W@2)(vW`lhJZUoY=~HV>X=!)i5RNf1 zKE7go>Yj*KF%?A?201hM8NIJXv>*tL9d1x?x-Atp6Pu!>q9Qoa5HMkzm6f$n+xKvO zHY_a6XZwczs*!Nntr|k0IS^(1xMUrG8z#^vySg4vybSuY`?CU%$9E464K*eSAM12; zbyf3(DsL)MdlU3pp8LwGvP`9ZodpG_1x_(`FwV|nyztmxYct`E{$n9Z%E}ew$)@0K z27{qieYdZmtv#?EP7NX&(cz=)!k2-dUvOn?M;w1NtMclNv(0r)O=O~@ zfNEr9^bm~fOMEe6jsCL{E6DjJh)7&tE+p{lW}q|COW#Q zwY9bMzkA*%Fvb4MITFa=+Eo3^t5Tw(qFV+cXM$%{ni7| zElg{yiIQ93gD=4RAIdbeugLn@K04RGyu2JK4(LbMdnJ3~@n0z^DJcSUI(-rYlUo0I zHOK_bRp8kvwg;8%h`@kx(q}>xGg4Bd+4p30baZGNo11=+&nxruUSZC=a)KSYs5iU8 zJawkBXubw}d_A@+$qfpHo)c-o&h?~q%`7fZD3k|dIguRyAOn!edr-#%?IYbrA#-6V z?$*}UfnDJEmmoDwO}4_6ncVdr7Ml&w)7Q__%$hjCN9-VMiMx)BM`10Qi?=Ct`9w*Q zqVU-uZf(w0OF6I6TKgw9F%df(3uF8H`z=?tWVe6($d8`u0fzq=n6JE;d*@G1ZaM#> za@z(d|6Mvc{@Dde!5v>|^lZUF1C~A%Dpe}hYgEBP`<{xbYN(u?T=2&ywttTVd_pK~ z&?_rd*o%uk1pW%zW1iNeWIooCy^LRn)S41bSWs{lH6TxtIl>vK{#g9VFO*2sA?W7C za*XaKXJoirz*i?416M|>uT5l=Ed&+XrrwzP$IPN}s*tBUvMWL1;Y*e|8Vi2xntoRX zIan{oQQY&ywtbOrN^0snacO{tfJ=hG5nyrgwWA8=RB!yG*~h#JUbEyEy*nkcgzo9$ z=no}GS*-#8&=TFtV!EM4yEXhFW%uukr>ExEhku_MD9NQ#4GiVwI}4Sv_6vMG(hVS@ z{igb>4tcZn!|y(1-(s8;t+?=(F|0vSoQa{XO zq6%m-o+^Ax)LjH@#Zf*->$5lSE0-lI*#&_eH!r?RwR%Eg(QQe*J*)`HYZq#4%zP zbc&nUE=LG#c*d03E*^+aDy6mR_KSnW#3~)D&_x`TCeJtN=6$OxZB?&wetKH20Q0F9 zV%dcP)sW*N`3O7+tDJDcr6p!>D(n{_#G!+1H~NF)c5Et(k+c0cLCnoj=8yXtm91iEJ!q0h-!Jdv83NL%AI!Fotxi?28#5ZuS>pR=Ai z4cb~+F{+ztkXbu|CA`&?mDX*_cn8fY;_scVz1M4NVVhBUCB`A!B&PkhZWq-r z*)yIP0Pw_p`8 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + + + + + diff --git a/Bloxstrap/UI/ViewModels/Menu/ModsViewModel.cs b/Bloxstrap/UI/ViewModels/Menu/ModsViewModel.cs index 1f94b4c..86cac7e 100644 --- a/Bloxstrap/UI/ViewModels/Menu/ModsViewModel.cs +++ b/Bloxstrap/UI/ViewModels/Menu/ModsViewModel.cs @@ -28,10 +28,12 @@ namespace Bloxstrap.UI.ViewModels.Menu set => App.Settings.Prop.UseOldCharacterSounds = value; } - public bool OldMouseCursorEnabled + public IReadOnlyDictionary CursorTypes => CursorTypeEx.Selections; + + public string SelectedCursorType { - get => App.Settings.Prop.UseOldMouseCursor; - set => App.Settings.Prop.UseOldMouseCursor = value; + get => CursorTypes.FirstOrDefault(x => x.Value == App.Settings.Prop.CursorType).Key; + set => App.Settings.Prop.CursorType = CursorTypes[value]; } public bool DisableAppPatchEnabled