From f8bec83268d79b6edf8cfbcdd4e1d31091615fb3 Mon Sep 17 00:00:00 2001 From: Kinsi Date: Sun, 6 Mar 2022 18:17:35 +0100 Subject: [PATCH] init --- .gitignore | 8 +++ Configuration/Config.cs | 35 +++++++++++ Directory.Build.targets | 101 ++++++++++++++++++++++++++++++ HitscoreCounter.cs | 123 +++++++++++++++++++++++++++++++++++++ HitscoreCounter.csproj | 126 ++++++++++++++++++++++++++++++++++++++ Images/icon.png | Bin 0 -> 14933 bytes Images/ss.jpg | Bin 0 -> 25240 bytes LICENSE | 21 +++++++ Plugin.cs | 20 ++++++ README.md | 19 ++++++ SettingsHandler.cs | 29 +++++++++ SuppressRefereces.targets | 11 ++++ manifest.json | 30 +++++++++ settings.bsml | 7 +++ 14 files changed, 530 insertions(+) create mode 100644 .gitignore create mode 100644 Configuration/Config.cs create mode 100644 Directory.Build.targets create mode 100644 HitscoreCounter.cs create mode 100644 HitscoreCounter.csproj create mode 100644 Images/icon.png create mode 100644 Images/ss.jpg create mode 100644 LICENSE create mode 100644 Plugin.cs create mode 100644 README.md create mode 100644 SettingsHandler.cs create mode 100644 SuppressRefereces.targets create mode 100644 manifest.json create mode 100644 settings.bsml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b46e503 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ + +bin/* +obj/* +*.user +*.xcf +HarmonyPatches/RemoveSplashscreen.cs +HarmonyPatchHelper.cs +Screenshots/SocialPreview.jpg diff --git a/Configuration/Config.cs b/Configuration/Config.cs new file mode 100644 index 0000000..09db3c5 --- /dev/null +++ b/Configuration/Config.cs @@ -0,0 +1,35 @@ + +using IPA.Config.Stores; +using IPA.Config.Stores.Attributes; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo(GeneratedStore.AssemblyVisibilityTarget)] +namespace HitscoreCounter { + internal class Config { + public static Config Instance { get; set; } + + + public virtual bool verticalLayout { get; set; } = true; + + [NonNullable, UseConverter] + public virtual List splits { get; set; } = new List() { 115, 114, 110, 100, 0 }; + + public static IEnumerable FilterSplitsList(IEnumerable splits) { + var x = splits.Where(x => x <= ScoreModel.kMaxCutRawScore && x >= 0).Distinct().OrderByDescending(x => x); + + if(!x.Any()) + return new[] { 115 }; + + return x; + } + + public virtual void Changed() { + var x = FilterSplitsList(splits); + + if(!x.SequenceEqual(splits)) + splits = x.ToList(); + } + } +} diff --git a/Directory.Build.targets b/Directory.Build.targets new file mode 100644 index 0000000..cf3ef17 --- /dev/null +++ b/Directory.Build.targets @@ -0,0 +1,101 @@ + + + + + 2.0 + + false + + $(OutputPath)$(AssemblyName) + + $(OutputPath)Final + True + + + + + + + + + + + + + + + + $(BasePluginVersion) + $(BasePluginVersion) + $(BasePluginVersion) + + + + + + + + + $(AssemblyName) + $(ArtifactName)-$(PluginVersion) + $(ArtifactName)-bs$(GameVersion) + $(ArtifactName)-$(CommitHash) + + + + + + + $(AssemblyName) + + + + + + + + + + + + + + $(AssemblyName) + $(OutDir)zip\ + + + + + + + + + + + + + $(BeatSaberDir)\Plugins + True + Unable to copy assembly to game folder, did you set 'BeatSaberDir' correctly in your 'csproj.user' file? Plugins folder doesn't exist: '$(PluginDir)'. + + Unable to copy to Plugins folder, '$(BeatSaberDir)' does not appear to be a Beat Saber game install. + + Unable to copy to Plugins folder, 'BeatSaberDir' has not been set in your 'csproj.user' file. + False + + + + + + + + $(BeatSaberDir)\IPA\Pending\Plugins + + + + + + + + \ No newline at end of file diff --git a/HitscoreCounter.cs b/HitscoreCounter.cs new file mode 100644 index 0000000..bd9fc56 --- /dev/null +++ b/HitscoreCounter.cs @@ -0,0 +1,123 @@ +using CountersPlus.Counters.Custom; +using CountersPlus.Counters.Interfaces; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using TMPro; +using UnityEngine; + +namespace HitscoreCounter { + public class HitscoreCounter : BasicCustomCounter, INoteEventHandler, ISaberSwingRatingCounterDidFinishReceiver { + TMP_Text[] hintLabels; + TMP_Text[] valueLabels; + int[] targets; + int[] values; + + public override void CounterInit() { + var label = CanvasUtility.CreateTextFromSettings(Settings); + label.text = "Hitscores"; + label.fontSize = 3; + + TMP_Text CreateLabel(TextAlignmentOptions align, Vector3 offset, float fontSize = 2.69f) { + var x = CanvasUtility.CreateTextFromSettings(Settings, offset); + x.text = "0"; + x.alignment = align; + x.fontSize = fontSize; + + return x; + } + + var countersCount = Config.Instance.splits.Count; + + hintLabels = new TMP_Text[countersCount]; + valueLabels = new TMP_Text[countersCount]; + values = new int[countersCount]; + targets = new int[countersCount]; + + var totalWidth = countersCount * 0.5f; + var halfWidth = totalWidth / 2f; + var labelStep = totalWidth / (countersCount - 1); + + if(Config.Instance.verticalLayout) { + for(var i = countersCount; i-- != 0;) { + hintLabels[i] = CreateLabel(TextAlignmentOptions.CaplineRight, new Vector3(-0.25f, -0.3f - (i * 0.25f))); + valueLabels[i] = CreateLabel(TextAlignmentOptions.CaplineLeft, new Vector3(0.25f, -0.3f - (i * 0.25f)), 3f); + } + } else { + if(countersCount == 1) { + labelStep = 0; + halfWidth = 0; + } + + for(var i = countersCount; i-- != 0;) { + hintLabels[i] = CreateLabel(TextAlignmentOptions.Center, new Vector3((i * labelStep) - halfWidth, -0.3f)); + valueLabels[i] = CreateLabel(TextAlignmentOptions.Center, new Vector3((i * labelStep) - halfWidth, -0.6f), 3f); + } + } + + var prevValue = ScoreModel.kMaxCutRawScore + 1; + for(var i = 0; i < countersCount; i++) { + if(!Config.Instance.verticalLayout) + hintLabels[i].fontStyle = FontStyles.Underline; + + if(i == countersCount - 1 && Config.Instance.splits[i] == 0) { + hintLabels[i].text = $"<{prevValue}"; + targets[i] = -1; + break; + } + + if(prevValue - Config.Instance.splits[i] > 1) { + if(i == 0) { + hintLabels[i].text = $">{Config.Instance.splits[i] - 1}"; + } else { + hintLabels[i].text = $"{prevValue - 1}-{Config.Instance.splits[i]}"; + + if(!Config.Instance.verticalLayout) + hintLabels[i].fontSize = 2.2f; + } + } else { + hintLabels[i].text = Config.Instance.splits[i].ToString(); + } + prevValue = Config.Instance.splits[i]; + targets[i] = Config.Instance.splits[i] - 1; + } + } + + public override void CounterDestroy() { + hintLabels = null; + valueLabels = null; + targets = null; + values = null; + } + + void IncrementValueLabelForHitscore(int hitscore) { + for(var i = 0; i < targets.Length; i++) { + if(hitscore > targets[i]) { + valueLabels[i].text = (++values[i]).ToString(); + return; + } + } + } + + private Dictionary noteCutAccs = new Dictionary(); + public void OnNoteCut(NoteData data, NoteCutInfo info) { + if(!info.allIsOK || data.colorType == ColorType.None) + return; + + noteCutAccs.Add(info.swingRatingCounter, info.cutDistanceToCenter); + info.swingRatingCounter.RegisterDidFinishReceiver(this); + } + + public void OnNoteMiss(NoteData data) { } + + public void HandleSaberSwingRatingCounterDidFinish(ISaberSwingRatingCounter saberSwingRatingCounter) { + if(!noteCutAccs.TryGetValue(saberSwingRatingCounter, out var nci)) + return; + + noteCutAccs.Remove(saberSwingRatingCounter); + + ScoreModel.RawScoreWithoutMultiplier(saberSwingRatingCounter, nci, out int beforeCut, out int afterCut, out int cutDistance); + + IncrementValueLabelForHitscore(beforeCut + afterCut + cutDistance); + } + } +} diff --git a/HitscoreCounter.csproj b/HitscoreCounter.csproj new file mode 100644 index 0000000..0786ab3 --- /dev/null +++ b/HitscoreCounter.csproj @@ -0,0 +1,126 @@ + + + net48 + Library + 8 + false + HitscoreCounter + ..\Refs + $(LocalRefsDir) + $(MSBuildProjectDirectory)\ + disable + HitscoreCounter + + Kinsi55 + Kinsi55 + + + + x64 + false + + + + + + DEBUG + true + portable + bin\Debug + + + + none + bin\ + + + + True + + + True + True + + + + + + + + + $(BeatSaberDir)\Libs\0Harmony.dll + + + $(BeatSaberDir)\Beat Saber_Data\Managed\BeatmapCore.dll + + + $(BeatSaberDir)\Plugins\Counters+.dll + + + $(BeatSaberDir)\Beat Saber_Data\Managed\GameplayCore.dll + + + + + + + + + $(BeatSaberDir)\Beat Saber_Data\Managed\Main.dll + + + $(BeatSaberDir)\Beat Saber_Data\Managed\HMLib.dll + + + $(BeatSaberDir)\Beat Saber_Data\Managed\HMUI.dll + + + $(BeatSaberDir)\Beat Saber_Data\Managed\IPA.Loader.dll + + + $(BeatSaberDir)\Beat Saber_Data\Managed\Unity.TextMeshPro.dll + + + $(BeatSaberDir)\Beat Saber_Data\Managed\UnityEngine.dll + + + $(BeatSaberDir)\Beat Saber_Data\Managed\UnityEngine.CoreModule.dll + + + $(BeatSaberDir)\Beat Saber_Data\Managed\UnityEngine.UI.dll + + + $(BeatSaberDir)\Beat Saber_Data\Managed\UnityEngine.UIElementsModule.dll + + + $(BeatSaberDir)\Beat Saber_Data\Managed\UnityEngine.UIModule.dll + + + $(BeatSaberDir)\Beat Saber_Data\Managed\UnityEngine.VRModule.dll + + + + + + + + + + 1.4.3 + build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Images/icon.png b/Images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4b36bec577fc5b654fbdaa01d2ef75d50c93cb17 GIT binary patch literal 14933 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 T+d&xk00000NkvXXu0mjfi;y@F literal 0 HcmV?d00001 diff --git a/Images/ss.jpg b/Images/ss.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7776b824a5bbae7e18906f9d1ae961c52fd0318a GIT binary patch literal 25240 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 literal 0 HcmV?d00001 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..cd106e6 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Kinsi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Plugin.cs b/Plugin.cs new file mode 100644 index 0000000..a753c34 --- /dev/null +++ b/Plugin.cs @@ -0,0 +1,20 @@ +using IPA; +using IPA.Config.Stores; +using IPALogger = IPA.Logging.Logger; + +namespace HitscoreCounter { + [Plugin(RuntimeOptions.SingleStartInit)] + public class Plugin { + internal static Plugin Instance { get; private set; } + internal static IPALogger Log { get; private set; } + + internal static string Name => "HitscoreCounter"; + + [Init] + public void Init(IPALogger logger, IPA.Config.Config config) { + Config.Instance = config.Generated(); + Instance = this; + Log = logger; + } + } +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..59692e8 --- /dev/null +++ b/README.md @@ -0,0 +1,19 @@ +# HitscoreCounter + +Counts the amoungts of cuts of a specific value. You can configure it to be vertical or Horizontal and can modify the ranges its split up into. + +By default the splits are `115,114,110,100,0` which thus counts 115s, 114s, 113-110, 109-100 and everything below 100 seperately + +--- + +The Game version(s) specific releases are compatible with are mentioned in the Release title (Its obviously possible latest is not supported assuming its been released recently). If you need the plugin for an older version - Grab an older release that fits 🤯 + +## Install + +#### You can always find the latest download in [The Releases](https://github.com/kinsi55/BeatSaber_HitscoreCounter/releases), simply drag the files into the respective folders + +### Requirements + +- [Counters+](https://github.com/Caeden117/CountersPlus) (Available in ModAssistant) + +![SS](Images/ss.jpg) \ No newline at end of file diff --git a/SettingsHandler.cs b/SettingsHandler.cs new file mode 100644 index 0000000..e17560f --- /dev/null +++ b/SettingsHandler.cs @@ -0,0 +1,29 @@ +using System.ComponentModel; +using System.Linq; +using System.Reflection; + +namespace HitscoreCounter { + class SettingsHandler : INotifyPropertyChanged { + Config config => Config.Instance; + + string splits { + get => string.Join(",", config.splits); + set { + config.splits = value + .Split(new[] { ",", ";", " " }, System.StringSplitOptions.RemoveEmptyEntries) + .Select(x => { + if(int.TryParse(x, out var l)) + return l; + + return -1; + }).ToList(); + + PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(splits))); + } + } + + private readonly string version = $"Version {Assembly.GetExecutingAssembly().GetName().Version.ToString(3)} by Kinsi55\nCommissioned by zachakaquack"; + + public event PropertyChangedEventHandler PropertyChanged; + } +} \ No newline at end of file diff --git a/SuppressRefereces.targets b/SuppressRefereces.targets new file mode 100644 index 0000000..c45bc3a --- /dev/null +++ b/SuppressRefereces.targets @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..92ec1a3 --- /dev/null +++ b/manifest.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://raw.githubusercontent.com/bsmg/BSIPA-MetadataFileSchema/master/Schema.json", + "id": "HitscoreCounter", + "name": "HitscoreCounter", + "author": "Kinsi55", + "version": "0.1.0", + "description": "Counter for Counters+ that counts the scores of your cuts grouped into configurable ranges", + "gameVersion": "1.18.3", + "dependsOn": { + "BSIPA": "^4.0.5", + "Counters+": "^2.2.0" + }, + "features": { + "CountersPlus.CustomCounter": { + "Name": "Hitscore Counter", + "Description": "Counts the scores of your cuts grouped into configurable ranges", + "CounterLocation": "HitscoreCounter.HitscoreCounter", + "ConfigDefaults": { + "Enabled": true, + "Position": "BelowEnergy", + "Distance": 2 + }, + "BSML": { + "Resource": "HitscoreCounter.settings.bsml", + "Host": "HitscoreCounter.SettingsHandler", + "Icon": "HitscoreCounter.Images.icon.png" + } + } + } +} \ No newline at end of file diff --git a/settings.bsml b/settings.bsml new file mode 100644 index 0000000..53f0aac --- /dev/null +++ b/settings.bsml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file