private static void FinalizeCustomObject(Dictionary <string, object?> dynData, NoodleObjectData noodleObjectData, Dictionary <string, PointDefinition> pointDefinitions, Dictionary <string, Track> beatmapTracks) { object?rotation = dynData.Get <object>(ROTATION); if (rotation != null) { if (rotation is List <object> list) { IEnumerable <float> rot = list.Select(n => Convert.ToSingle(n)); noodleObjectData.WorldRotationQuaternion = Quaternion.Euler(rot.ElementAt(0), rot.ElementAt(1), rot.ElementAt(2)); } else { noodleObjectData.WorldRotationQuaternion = Quaternion.Euler(0, Convert.ToSingle(rotation), 0); } } IEnumerable <float>?localrot = dynData.Get <List <object> >(LOCALROTATION)?.Select(n => Convert.ToSingle(n)); if (localrot != null) { noodleObjectData.LocalRotationQuaternion = Quaternion.Euler(localrot.ElementAt(0), localrot.ElementAt(1), localrot.ElementAt(2)); } noodleObjectData.Track = GetTrackArray(dynData, beatmapTracks); Dictionary <string, object?>?animationObjectDyn = dynData.Get <Dictionary <string, object?> >(ANIMATION); if (animationObjectDyn != null) { NoodleObjectData.AnimationObjectData animationObjectData = new NoodleObjectData.AnimationObjectData { LocalPosition = TryGetPointData(animationObjectDyn, POSITION, pointDefinitions), LocalRotation = TryGetPointData(animationObjectDyn, ROTATION, pointDefinitions), LocalScale = TryGetPointData(animationObjectDyn, SCALE, pointDefinitions), LocalLocalRotation = TryGetPointData(animationObjectDyn, LOCALROTATION, pointDefinitions), LocalDissolve = TryGetPointData(animationObjectDyn, DISSOLVE, pointDefinitions), LocalDissolveArrow = TryGetPointData(animationObjectDyn, DISSOLVEARROW, pointDefinitions), LocalCuttable = TryGetPointData(animationObjectDyn, CUTTABLE, pointDefinitions), LocalDefinitePosition = TryGetPointData(animationObjectDyn, DEFINITEPOSITION, pointDefinitions), }; noodleObjectData.AnimationObject = animationObjectData; } noodleObjectData.Cuttable = dynData.Get <bool?>(CUTTABLE); noodleObjectData.Fake = dynData.Get <bool?>(FAKENOTE); IEnumerable <float?>?position = dynData.GetNullableFloats(POSITION); noodleObjectData.StartX = position?.ElementAtOrDefault(0); noodleObjectData.StartY = position?.ElementAtOrDefault(1); noodleObjectData.NJS = dynData.Get <float?>(NOTEJUMPSPEED); noodleObjectData.SpawnOffset = dynData.Get <float?>(NOTESPAWNOFFSET); noodleObjectData.AheadTimeInternal = dynData.Get <float?>("aheadTime"); }
private static void FinalizeCustomObject(dynamic dynData, NoodleObjectData noodleObjectData, IReadonlyBeatmapData beatmapData) { dynamic rotation = Trees.at(dynData, ROTATION); if (rotation != null) { if (rotation is List <object> list) { IEnumerable <float> rot = list?.Select(n => Convert.ToSingle(n)); noodleObjectData.WorldRotationQuaternion = Quaternion.Euler(rot.ElementAt(0), rot.ElementAt(1), rot.ElementAt(2)); } else { noodleObjectData.WorldRotationQuaternion = Quaternion.Euler(0, (float)rotation, 0); } } IEnumerable <float> localrot = ((List <object>)Trees.at(dynData, LOCALROTATION))?.Select(n => Convert.ToSingle(n)); if (localrot != null) { noodleObjectData.LocalRotationQuaternion = Quaternion.Euler(localrot.ElementAt(0), localrot.ElementAt(1), localrot.ElementAt(2)); } noodleObjectData.Track = AnimationHelper.GetTrackPreload(dynData, beatmapData); dynamic animationObjectDyn = Trees.at(dynData, "_animation"); Dictionary <string, PointDefinition> pointDefinitions = Trees.at(((CustomBeatmapData)beatmapData).customData, "pointDefinitions"); AnimationHelper.GetAllPointData( animationObjectDyn, pointDefinitions, out PointDefinition localPosition, out PointDefinition localRotation, out PointDefinition localScale, out PointDefinition localLocalRotation, out PointDefinition localDissolve, out PointDefinition localDissolveArrow, out PointDefinition localCuttable, out PointDefinition localDefinitePosition); NoodleObjectData.AnimationObjectData animationObjectData = new NoodleObjectData.AnimationObjectData { LocalPosition = localPosition, LocalRotation = localRotation, LocalScale = localScale, LocalLocalRotation = localLocalRotation, LocalDissolve = localDissolve, LocalDissolveArrow = localDissolveArrow, LocalCuttable = localCuttable, LocalDefinitePosition = localDefinitePosition, }; noodleObjectData.AnimationObject = animationObjectData; noodleObjectData.Cuttable = Trees.at(dynData, CUTTABLE); noodleObjectData.Fake = Trees.at(dynData, FAKENOTE); IEnumerable <float?> position = ((List <object>)Trees.at(dynData, POSITION))?.Select(n => n.ToNullableFloat()); noodleObjectData.StartX = position?.ElementAtOrDefault(0); noodleObjectData.StartY = position?.ElementAtOrDefault(1); noodleObjectData.NJS = (float?)Trees.at(dynData, NOTEJUMPSPEED); noodleObjectData.SpawnOffset = (float?)Trees.at(dynData, NOTESPAWNOFFSET); noodleObjectData.AheadTimeInternal = (float?)Trees.at(dynData, "aheadTime"); }