internal static void OnBuildTracks(CustomDataDeserializer.DeserializeBeatmapEventArgs eventArgs) { TrackBuilder trackBuilder = eventArgs.TrackBuilder; foreach (CustomEventData customEventData in eventArgs.CustomEventDatas) { try { switch (customEventData.type) { case ASSIGNPLAYERTOTRACK: trackBuilder.AddTrack(customEventData.data.Get <string>(TRACK) ?? throw new InvalidOperationException("Track was not defined.")); break; case ASSIGNTRACKPARENT: trackBuilder.AddTrack(customEventData.data.Get <string>(PARENTTRACK) ?? throw new InvalidOperationException("Parent track was not defined.")); break; default: continue; } } catch (Exception e) { CustomDataDeserializer.LogFailure(Plugin.Logger, e, customEventData); } } }
internal static void OnDeserializeBeatmapData(CustomDataDeserializer.DeserializeBeatmapEventArgs eventArgs) { if (eventArgs.IsMultiplayer) { return; } CustomBeatmapData beatmapData = eventArgs.BeatmapData; _noodleObjectDatas = new Dictionary <BeatmapObjectData, IBeatmapObjectDataCustomData>(); Dictionary <string, PointDefinition> pointDefinitions = beatmapData.GetBeatmapPointDefinitions(); Dictionary <string, Track> beatmapTracks = beatmapData.GetBeatmapTracks(); foreach (BeatmapObjectData beatmapObjectData in eventArgs.BeatmapObjectDatas) { try { NoodleObjectData noodleObjectData; Dictionary <string, object?> customData; switch (beatmapObjectData) { case CustomObstacleData customObstacleData: customData = customObstacleData.customData; noodleObjectData = ProcessCustomObstacle(customData); break; case CustomNoteData customNoteData: customData = customNoteData.customData; noodleObjectData = ProcessCustomNote(customData); break; case CustomWaypointData customWaypointData: customData = customWaypointData.customData; noodleObjectData = new NoodleObjectData(); break; default: continue; } FinalizeCustomObject(customData, noodleObjectData, pointDefinitions, beatmapTracks); _noodleObjectDatas.Add(beatmapObjectData, noodleObjectData); } catch (Exception e) { CustomDataDeserializer.LogFailure(Plugin.Logger, e, beatmapObjectData); } } _noodleEventDatas = new Dictionary <CustomEventData, ICustomEventCustomData>(); foreach (CustomEventData customEventData in eventArgs.CustomEventDatas) { try { ICustomEventCustomData noodleEventData; Dictionary <string, object?> data = customEventData.data; switch (customEventData.type) { case ASSIGNPLAYERTOTRACK: noodleEventData = new NoodlePlayerTrackEventData(GetTrack(customEventData.data, beatmapTracks) ?? throw new InvalidOperationException("Track was not defined.")); break; case ASSIGNTRACKPARENT: noodleEventData = ProcessParentTrackEvent(data, beatmapTracks); break; default: continue; } _noodleEventDatas.Add(customEventData, noodleEventData); } catch (Exception e) { CustomDataDeserializer.LogFailure(Plugin.Logger, e, customEventData); } } }