From 91dfeb14dc69997e62c96ddf9e4201daaecc7a47 Mon Sep 17 00:00:00 2001 From: Skunky Date: Sat, 8 Mar 2025 16:44:52 +0100 Subject: [PATCH 1/2] Fix errors when for some reason there is something other then a BeatmapObjectData in the list --- NoodleExtensions/Managers/NoodleObjectsCallbacksManager.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/NoodleExtensions/Managers/NoodleObjectsCallbacksManager.cs b/NoodleExtensions/Managers/NoodleObjectsCallbacksManager.cs index 029dcbef..594cf54a 100644 --- a/NoodleExtensions/Managers/NoodleObjectsCallbacksManager.cs +++ b/NoodleExtensions/Managers/NoodleObjectsCallbacksManager.cs @@ -77,7 +77,11 @@ internal void ManualUpdate(float songTime) linkedListNode != null; linkedListNode = linkedListNode.Next) { - BeatmapObjectData value2 = (BeatmapObjectData)linkedListNode.Value; + if (linkedListNode.Value is not BeatmapObjectData value2) + { + continue; + } + if (!_deserializedData.Resolve(value2, out NoodleObjectData? noodleData)) { throw new InvalidOperationException( From 274397e4e6c7a1d2274d989283a17c53c11eeac7 Mon Sep 17 00:00:00 2001 From: Skunky Date: Sat, 8 Mar 2025 18:34:25 +0100 Subject: [PATCH 2/2] Modify DeserializerManager to be public --- .../Deserialize/DeserializerManager.cs | 34 ++++++++++++------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/Heck/Services/Deserialize/DeserializerManager.cs b/Heck/Services/Deserialize/DeserializerManager.cs index 0eccfdb0..67f61baf 100644 --- a/Heck/Services/Deserialize/DeserializerManager.cs +++ b/Heck/Services/Deserialize/DeserializerManager.cs @@ -12,17 +12,19 @@ namespace Heck.Deserialize; [UsedImplicitly] -internal class DeserializerManager +public class DeserializerManager { private readonly HashSet _customDataDeserializers = []; private readonly SiraLog _log; + private TrackBuilder _trackManager = new(); + private Dictionary> _pointDefinitions = new(); private DeserializerManager(SiraLog log) { _log = log; } - internal void DeserializeBeatmapData( + public void DeserializeBeatmapData( #if !PRE_V1_37_1 BeatmapLevel beatmapLevel, #else @@ -32,7 +34,8 @@ internal void DeserializeBeatmapData( IReadonlyBeatmapData untransformedBeatmapData, bool leftHanded, out Dictionary beatmapTracks, - out HashSet<(object? Id, DeserializedData DeserializedData)> deserializedDatas) + out HashSet<(object? Id, DeserializedData DeserializedData)> deserializedDatas, + bool reusable = false) { _log.Trace("Deserializing BeatmapData"); @@ -44,7 +47,11 @@ internal void DeserializeBeatmapData( } // tracks are built based off the untransformed beatmapdata so modifiers like "no walls" do not prevent track creation - TrackBuilder trackManager = new(); + if (!reusable) + { + _trackManager = new(); + } + foreach (BeatmapObjectData beatmapObjectData in ((CustomBeatmapData)untransformedBeatmapData).beatmapObjectDatas) { @@ -69,12 +76,15 @@ internal void DeserializeBeatmapData( foreach (string trackName in trackNames) { - trackManager.AddTrack(trackName); + _trackManager.AddTrack(trackName); } } // Point definitions - Dictionary> pointDefinitions = new(); + if (!reusable) + { + _pointDefinitions = new(); + } if (v2) { @@ -139,7 +149,7 @@ internal void DeserializeBeatmapData( ////customBeatmapData.customData["eventDefinitions"] = eventDefinitions; // Currently used by Chroma.GameObjectTrackController - beatmapTracks = trackManager.Tracks; + beatmapTracks = _trackManager.Tracks; #if !PRE_V1_37_1 float bpm = beatmapLevel.beatsPerMinute; @@ -150,9 +160,9 @@ internal void DeserializeBeatmapData( object[] inputs = [ customBeatmapData, - trackManager, - pointDefinitions, // TODO: use a readonly implementation - trackManager.Tracks, + _trackManager, + _pointDefinitions, // TODO: use a readonly implementation + _trackManager.Tracks, leftHanded, bpm ]; @@ -176,9 +186,9 @@ internal void DeserializeBeatmapData( void AddPoint(string pointDataName, List pointData) { - if (!pointDefinitions.ContainsKey(pointDataName)) + if (!_pointDefinitions.ContainsKey(pointDataName)) { - pointDefinitions.Add(pointDataName, pointData); + _pointDefinitions.Add(pointDataName, pointData); } else {