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 { 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(