Exemple #1
0
 protected List <NoteData> GetNoteData(IReadonlyBeatmapData data)
 {
     return(data
            .GetBeatmapDataItems <NoteData>()
            .Where(noteData => noteData.gameplayType != NoteData.GameplayType.Bomb && !ShouldIgnoreNote(noteData))
            .ToList());
 }
        private static IReadonlyBeatmapData ExcludeFakeNoteAndAllWalls(IReadonlyBeatmapData result)
        {
            foreach (BeatmapLineData b in result.beatmapLinesData)
            {
                BeatmapLineData refBeatmapLineData = b;
                _beatmapObjectsDataAccessor(ref refBeatmapLineData) = b.beatmapObjectsData.Where(n =>
                {
                    Dictionary <string, object?> dynData;

                    switch (n)
                    {
                    case CustomNoteData customNoteData:
                        dynData = customNoteData.customData;
                        break;

                    case CustomObstacleData customObstacleData:
                        return(false);

                    default:
                        return(true);
                    }

                    bool?fake = dynData.Get <bool?>(FAKENOTE);
                    if (fake.HasValue && fake.Value)
                    {
                        return(false);
                    }

                    return(true);
                }).ToList();
            }

            return(result);
        }
        internal static void DeserializeBeatmapData(IReadonlyBeatmapData beatmapData)
        {
            NoodleEventDatas = new Dictionary <CustomEventData, NoodleEventData>();
            foreach (CustomEventData customEventData in ((CustomBeatmapData)beatmapData).customEventsData)
            {
                NoodleEventData noodleEventData;

                switch (customEventData.type)
                {
                case ANIMATETRACK:
                case ASSIGNPATHANIMATION:
                    noodleEventData = ProcessCoroutineEvent(customEventData, beatmapData);
                    break;

                case ASSIGNPLAYERTOTRACK:
                    noodleEventData = new NoodlePlayerTrackEventData()
                    {
                        Track = GetTrackPreload(customEventData.data, beatmapData),
                    };
                    break;

                case ASSIGNTRACKPARENT:
                    noodleEventData = ProcessParentTrackEvent(customEventData.data, beatmapData);
                    break;

                default:
                    continue;
                }

                NoodleEventDatas.Add(customEventData, noodleEventData);
            }
        }
        internal static void DeserializeBeatmapData(IReadonlyBeatmapData beatmapData)
        {
            NoodleObjectDatas = new Dictionary <BeatmapObjectData, NoodleObjectData>();
            foreach (BeatmapObjectData beatmapObjectData in beatmapData.beatmapObjectsData)
            {
                NoodleObjectData noodleObjectData;

                dynamic customData;

                switch (beatmapObjectData)
                {
                case CustomNoteData customNoteData:
                    customData       = customNoteData.customData;
                    noodleObjectData = ProcessCustomNote(customData);
                    break;

                case CustomObstacleData customObstacleData:
                    customData       = customObstacleData.customData;
                    noodleObjectData = ProcessCustomObstacle(customData);
                    break;

                case CustomWaypointData customWaypointData:
                    customData       = customWaypointData.customData;
                    noodleObjectData = new NoodleObjectData();
                    break;

                default:
                    continue;
                }

                FinalizeCustomObject(customData, noodleObjectData, beatmapData);

                NoodleObjectDatas.Add(beatmapObjectData, noodleObjectData);
            }
        }
        static bool Prefix(IReadonlyBeatmapData beatmapData, ref IReadonlyBeatmapData __result)
        {
            if (!Configuration.PluginConfig.Instance.wallsInZenMode)
            {
                return(true);
            }

            BeatmapData copyWithoutBeatmapObjects = beatmapData.GetCopyWithoutBeatmapObjects();

            BeatmapData.CopyBeatmapObjectsWaypointsOnly(beatmapData, copyWithoutBeatmapObjects);

            foreach (BeatmapObjectData beatmapObjectData in beatmapData.beatmapObjectsData)
            {
                if (beatmapObjectData.beatmapObjectType != BeatmapObjectType.Obstacle)
                {
                    continue;
                }

                copyWithoutBeatmapObjects.AddBeatmapObjectData(beatmapObjectData.GetCopy());
            }

            __result = copyWithoutBeatmapObjects;

            return(false);
        }
        /*public static IEnumerable<Track> GetTrackArray(dynamic customData, string name = TRACK)
         * {
         *  IEnumerable<string> trackNames = ((List<object>)Trees.at(customData, name)).Cast<string>();
         *  if (trackNames == null)
         *  {
         *      return null;
         *  }
         *
         *  HashSet<Track> tracks = new HashSet<Track>();
         *  foreach (string trackName in trackNames)
         *  {
         *      if (Tracks.TryGetValue(trackName, out Track track))
         *      {
         *          tracks.Add(track);
         *      }
         *      else
         *      {
         *          NoodleLogger.Log($"Could not find track {trackName}!", IPA.Logging.Logger.Level.Error);
         *      }
         *  }
         *
         *  return tracks;
         * }*/

        public static IEnumerable <Track> GetTrackArrayPreload(dynamic customData, IReadonlyBeatmapData beatmapData, string name = TRACK)
        {
            IEnumerable <string> trackNames = ((List <object>)Trees.at(customData, name)).Cast <string>();

            if (trackNames == null)
            {
                return(null);
            }

            HashSet <Track> tracks = new HashSet <Track>();

            foreach (string trackName in trackNames)
            {
                if (((CustomBeatmapData)beatmapData).customData.tracks.TryGetValue(trackName, out Track track))
                {
                    tracks.Add(track);
                }
                else
                {
                    NoodleLogger.Log($"Could not find track {trackName}!", IPA.Logging.Logger.Level.Error);
                }
            }

            return(tracks);
        }
        internal static IEnumerator DelayedStart(BeatmapObjectSpawnController beatmapObjectSpawnController)
        {
            yield return(new WaitForEndOfFrame());

            BeatmapObjectSpawnController = beatmapObjectSpawnController;

            // prone to breaking if anything else implements these interfaces
            BeatmapObjectManager            beatmapObjectManager = _beatmapObjectSpawnAccessor(ref beatmapObjectSpawnController) as BeatmapObjectManager;
            BeatmapObjectCallbackController coreSetup            = _callbackControllerAccessor(ref beatmapObjectSpawnController) as BeatmapObjectCallbackController;

            IAudioTimeSource = _audioTimeSourceAccessor(ref coreSetup);
            IReadonlyBeatmapData beatmapData = _beatmapDataAccessor(ref coreSetup);

            beatmapObjectManager.noteWasCutEvent -= NoteColorizer.ColorizeSaber;
            beatmapObjectManager.noteWasCutEvent += NoteColorizer.ColorizeSaber;

            if (Harmony.HasAnyPatches(HARMONYID))
            {
                if (beatmapData is CustomBeatmapData customBeatmap)
                {
                    if (ChromaConfig.Instance.EnvironmentEnhancementsEnabled)
                    {
                        EnvironmentEnhancementManager.Init(customBeatmap, beatmapObjectSpawnController.noteLinesDistance);
                    }
                }

                // please let me kill legacy
                LegacyLightHelper.Activate(beatmapData.beatmapEventsData);
            }
        }
        // ReSharper disable once CognitiveComplexity
        private List <NpsInfo> GetNpsSections(IReadonlyBeatmapData beatmapData)
        {
            var npsSections = new List <NpsInfo>();

            var songDuration = _audioTimeSyncController.songLength;

            if (songDuration < 0)
            {
                return(npsSections);
            }

            var notes = beatmapData.GetBeatmapDataItems <NoteData>()
                        .Where(noteData => noteData.gameplayType != NoteData.GameplayType.Bomb)
                        .OrderBy(s => s.time)
                        .ToList();

            if (!notes.Any())
            {
                return(npsSections);
            }

            var tempNoteCount = 0;
            var startingTime  = notes[0].time;

            npsSections.Add(new NpsInfo(0, 0, startingTime));
            for (var i = 0; i < notes.Count; ++i)
            {
                tempNoteCount += 1;
                if (i <= 0 || (i % 25 != 0 && i + 1 != notes.Count))
                {
                    continue;
                }

                float nps;
                if (tempNoteCount >= 25)
                {
                    nps = tempNoteCount / (notes[i].time - startingTime);
                }
                else                 // end of a map or a map with notes.Count < 25
                {
                    // if total notes count < 25 - do the usual way
                    // if there are more than 25 notes - try to normalize nps with data from tempNoteCount and (25 - tempNoteCount) notes from a section before
                    nps = notes.Count < 25
                                                ? tempNoteCount / (notes[i].time - notes[0].time)
                                                : 25 / (notes[i].time - notes[i - 25].time);
                }

                if (!float.IsInfinity(nps))
                {
                    npsSections.Add(new NpsInfo(nps, startingTime, notes[i].time));
                }

                tempNoteCount = 0;
                startingTime  = notes[i].time;
            }

            npsSections.Add(new NpsInfo(0, startingTime, songDuration));

            return(npsSections);
        }
 internal static void PostfixHelper(ref IReadonlyBeatmapData __result, BeatmapData beatmapData)
 {
     if (beatmapData is CustomBeatmapData customBeatmapData)
     {
         __result = new CustomBeatmapData(beatmapData,
                                          customBeatmapData.customEventData, customBeatmapData.customData, customBeatmapData.beatmapCustomData, customBeatmapData.levelCustomData);
     }
 }
        public static bool CreateTransformedData(IReadonlyBeatmapData beatmapData, ref IReadonlyBeatmapData __result)
        {
            ;

            __result = beatmapData;

            return(false);
        }
Exemple #11
0
        internal static void DeserializeBeatmapData(IReadonlyBeatmapData beatmapData)
        {
            _chromaEventDatas = new Dictionary <BeatmapEventData, ChromaEventData>();
            foreach (BeatmapEventData beatmapEventData in beatmapData.beatmapEventsData)
            {
                try
                {
                    if (beatmapEventData is CustomBeatmapEventData customBeatmapEventData)
                    {
                        Dictionary <string, object?> customData = customBeatmapEventData.customData;
                        ChromaEventData chromaEventData         = new ChromaEventData(
                            customData.Get <object>(LIGHTID),
                            customData.Get <object>(PROPAGATIONID),
                            ChromaUtils.GetColorFromData(customData),
                            customData.Get <bool?>(LOCKPOSITION).GetValueOrDefault(false),
                            customData.Get <string>(NAMEFILTER),
                            customData.Get <int?>(DIRECTION),
                            customData.Get <bool?>(COUNTERSPIN),
                            customData.Get <bool?>(RESET),
                            customData.Get <float?>(STEP),
                            customData.Get <float?>(PROP),
                            customData.Get <float?>(SPEED) ?? customData.Get <float?>(PRECISESPEED),
                            customData.Get <float?>(ROTATION),
                            customData.Get <float?>(STEPMULT).GetValueOrDefault(1f),
                            customData.Get <float?>(PROPMULT).GetValueOrDefault(1f),
                            customData.Get <float?>(SPEEDMULT).GetValueOrDefault(1f));

                        Dictionary <string, object?>?gradientObject = customData.Get <Dictionary <string, object?> >(LIGHTGRADIENT);
                        if (gradientObject != null)
                        {
                            string?   easingstring = gradientObject.Get <string>(EASING);
                            Functions easing;
                            if (string.IsNullOrEmpty(easingstring))
                            {
                                easing = Functions.easeLinear;
                            }
                            else
                            {
                                easing = (Functions)Enum.Parse(typeof(Functions), easingstring);
                            }

                            chromaEventData.GradientObject = new ChromaEventData.GradientObjectData(
                                gradientObject.Get <float>(DURATION),
                                ChromaUtils.GetColorFromData(gradientObject, STARTCOLOR) ?? Color.white,
                                ChromaUtils.GetColorFromData(gradientObject, ENDCOLOR) ?? Color.white,
                                easing);
                        }

                        _chromaEventDatas.Add(beatmapEventData, chromaEventData);
                    }
                }
                catch (Exception e)
                {
                    Plugin.Logger.Log($"Could not create ChromaEventData for event {beatmapEventData.type} at {beatmapEventData.time}", IPA.Logging.Logger.Level.Error);
                    Plugin.Logger.Log(e, IPA.Logging.Logger.Level.Error);
                }
            }
        }
Exemple #12
0
        private static IReadonlyBeatmapData ReorderLineData(IReadonlyBeatmapData beatmapData)
        {
            if (beatmapData is CustomBeatmapData)
            {
                CustomBeatmapData customBeatmapData = (CustomBeatmapData)beatmapData.GetCopy();

                // there is some ambiguity with these variables but who frikkin cares
                float startHalfJumpDurationInBeats = 4;
                float maxHalfJumpDistance          = 18;
                float moveDuration = 0.5f;

                for (int i = 0; i < customBeatmapData.beatmapLinesData.Count; i++)
                {
                    BeatmapLineData beatmapLineData = customBeatmapData.beatmapLinesData[i] as BeatmapLineData;
                    foreach (BeatmapObjectData beatmapObjectData in beatmapLineData.beatmapObjectsData)
                    {
                        dynamic customData;
                        if (beatmapObjectData is CustomObstacleData || beatmapObjectData is CustomNoteData || beatmapObjectData is CustomWaypointData)
                        {
                            customData = beatmapObjectData;
                        }
                        else
                        {
                            NoodleLogger.Log("beatmapObjectData was not CustomObstacleData, CustomNoteData, or CustomWaypointData");
                            continue;
                        }

                        dynamic dynData = customData.customData;
                        float   noteJumpMovementSpeed   = (float?)Trees.at(dynData, NOTEJUMPSPEED) ?? GameplayCoreInstallerInstallBindings.CachedNoteJumpMovementSpeed;
                        float   noteJumpStartBeatOffset = (float?)Trees.at(dynData, NOTESPAWNOFFSET) ?? GameplayCoreInstallerInstallBindings.CachedNoteJumpStartBeatOffset;

                        // how do i not repeat this in a reasonable way
                        float num  = 60f / (float)Trees.at(dynData, "bpm");
                        float num2 = startHalfJumpDurationInBeats;
                        while (noteJumpMovementSpeed * num * num2 > maxHalfJumpDistance)
                        {
                            num2 /= 2f;
                        }

                        num2 += noteJumpStartBeatOffset;
                        if (num2 < 1f)
                        {
                            num2 = 1f;
                        }

                        float jumpDuration = num * num2 * 2f;
                        dynData.aheadTime = moveDuration + (jumpDuration * 0.5f);
                    }

                    _beatmapObjectsDataAccessor(ref beatmapLineData) = beatmapLineData.beatmapObjectsData.OrderBy(n => n.time - (float)((dynamic)n).customData.aheadTime).ToList();
                }

                return(customBeatmapData);
            }

            NoodleLogger.Log("beatmapData was not CustomBeatmapData", IPA.Logging.Logger.Level.Error);
            return(beatmapData);
        }
        private static void Postfix(IReadonlyBeatmapData __result)
        {
            // Skip if calling class is MultiplayerConnectPlayerInstaller
            StackTrace stackTrace = new StackTrace();

            if (!stackTrace.GetFrame(2).GetMethod().Name.Contains("MultiplayerConnectedPlayerInstaller"))
            {
                NoodleObjectDataManager.DeserializeBeatmapData(__result);
                Animation.NoodleEventDataManager.DeserializeBeatmapData(__result);
            }
        }
Exemple #14
0
 public BSEvents([InjectOptional] ILevelEndActions levelEndActions, IReadonlyBeatmapData beatmapData, ObstacleSaberSparkleEffectManager obstacleSaberSparkleEffectManager, ScoreController scoreController, BeatmapObjectManager beatmapObjectManager, BeatmapCallbacksController beatmapCallbacksController, ComboController comboController)
 {
     _levelEndActions = levelEndActions;
     _beatmapData     = beatmapData;
     _obstacleSaberSparkleEffectManager = obstacleSaberSparkleEffectManager;
     _scoreController            = scoreController;
     _beatmapObjectManager       = beatmapObjectManager;
     _beatmapCallbacksController = beatmapCallbacksController;
     _comboController            = comboController;
     _bombSubtypeIdentifier      = NoteData.SubtypeIdentifier(ColorType.None);
 }
        internal void Construct(SiraLog siraLog, PluginConfig config, ScvAssetLoader assetLoader, AudioTimeSyncController audioTimeSyncController,
                                IReadonlyBeatmapData beatmap, TimeTweeningManager timeTweeningManager)
        {
            _timeTweeningManager = timeTweeningManager;
            _assetLoader         = assetLoader;
            _siraLog             = siraLog;
            _config = config;
            _audioTimeSyncController = audioTimeSyncController;
            _beatmapData             = beatmap;

            name = $"{nameof(SongChartVisualizer)} View";
        }
        private static IReadonlyBeatmapData ReorderLineData(IReadonlyBeatmapData beatmapData, float defaultNoteJumpMovementSpeed, float defaultNoteJumpStartBeatOffset)
        {
            if (beatmapData is CustomBeatmapData customBeatmapData)
            {
                // there is some ambiguity with these variables but who frikkin cares
                float startHalfJumpDurationInBeats = 4;
                float maxHalfJumpDistance          = 18;
                float moveDuration = 0.5f;

                for (int i = 0; i < customBeatmapData.beatmapLinesData.Count; i++)
                {
                    BeatmapLineData beatmapLineData = customBeatmapData.beatmapLinesData[i] as BeatmapLineData;
                    foreach (BeatmapObjectData beatmapObjectData in beatmapLineData.beatmapObjectsData)
                    {
                        dynamic customData;
                        if (beatmapObjectData is CustomObstacleData || beatmapObjectData is CustomNoteData)
                        {
                            customData = beatmapObjectData;
                        }
                        else
                        {
                            throw new System.Exception("BeatmapObjectData was not CustomObstacleData or CustomNoteData");
                        }

                        dynamic dynData = customData.customData;
                        float   noteJumpMovementSpeed   = (float?)Trees.at(dynData, NOTEJUMPSPEED) ?? defaultNoteJumpMovementSpeed;
                        float   noteJumpStartBeatOffset = (float?)Trees.at(dynData, NOTESPAWNOFFSET) ?? defaultNoteJumpStartBeatOffset;

                        // how do i not repeat this in a reasonable way
                        float num  = 60f / (float)Trees.at(dynData, "bpm");
                        float num2 = startHalfJumpDurationInBeats;
                        while (noteJumpMovementSpeed * num * num2 > maxHalfJumpDistance)
                        {
                            num2 /= 2f;
                        }

                        num2 += noteJumpStartBeatOffset;
                        if (num2 < 1f)
                        {
                            num2 = 1f;
                        }

                        float jumpDuration = num * num2 * 2f;
                        dynData.aheadTime = moveDuration + (jumpDuration * 0.5f);
                    }

                    _beatmapObjectsDataAccessor(ref beatmapLineData) = beatmapLineData.beatmapObjectsData.OrderBy(n => n.time - (float)((dynamic)n).customData.aheadTime).ToList();
                }
            }

            return(beatmapData);
        }
 private static void Postfix(IReadonlyBeatmapData beatmapData, ref IReadonlyBeatmapData __result)
 {
     if (Settings.ChromaConfig.Instance.ForceZenWallsEnabled)
     {
         foreach (BeatmapObjectData beatmapObjectData in beatmapData.beatmapObjectsData)
         {
             if (beatmapObjectData is ObstacleData)
             {
                 ((BeatmapData)__result).AddBeatmapObjectData(beatmapObjectData.GetCopy());
             }
         }
     }
 }
Exemple #18
0
        private static IReadonlyBeatmapData ReorderLineData(IReadonlyBeatmapData beatmapData)
        {
            if (beatmapData is CustomBeatmapData)
            {
                CustomBeatmapData customBeatmapData = (CustomBeatmapData)beatmapData.GetCopy();

                // there is some ambiguity with these variables but who frikkin cares
                float startHalfJumpDurationInBeats = 4;
                float maxHalfJumpDistance          = 18;
                float moveDuration = 0.5f;

                for (int i = 0; i < customBeatmapData.beatmapLinesData.Count; i++)
                {
                    BeatmapLineData beatmapLineData = (BeatmapLineData)customBeatmapData.beatmapLinesData[i];
                    foreach (BeatmapObjectData beatmapObjectData in beatmapLineData.beatmapObjectsData)
                    {
                        Dictionary <string, object?> dynData = beatmapObjectData.GetDataForObject();

                        float noteJumpMovementSpeed   = dynData.Get <float?>(NOTEJUMPSPEED) ?? GameplayCoreInstallerInstallBindings.CachedNoteJumpMovementSpeed;
                        float noteJumpStartBeatOffset = dynData.Get <float?>(NOTESPAWNOFFSET) ?? GameplayCoreInstallerInstallBindings.CachedNoteJumpStartBeatOffset;

                        // how do i not repeat this in a reasonable way
                        float num  = 60f / dynData.Get <float>("bpm");
                        float num2 = startHalfJumpDurationInBeats;
                        while (noteJumpMovementSpeed * num * num2 > maxHalfJumpDistance)
                        {
                            num2 /= 2f;
                        }

                        num2 += noteJumpStartBeatOffset;
                        if (num2 < 1f)
                        {
                            num2 = 1f;
                        }

                        float jumpDuration = num * num2 * 2f;
                        dynData["aheadTime"] = moveDuration + (jumpDuration * 0.5f);
                    }

                    _beatmapObjectsDataAccessor(ref beatmapLineData) = beatmapLineData.beatmapObjectsData
                                                                       .OrderBy(n => n.time - (float)(n.GetDataForObject()["aheadTime"] ?? throw new System.InvalidOperationException($"Could not get aheadTime for [{n.GetType().FullName}] at time [{n.time}].")))
                                                                       .ToList();
                }

                return(customBeatmapData);
            }

            Logger.Log("beatmapData was not CustomBeatmapData", IPA.Logging.Logger.Level.Error);
            return(beatmapData);
        }
        private GameSaberSetup(PluginConfig config, SaberSet saberSet, MainAssetStore mainAssetStore,
                               IReadonlyBeatmapData beatmap, RandomUtil randomUtil)
        {
            _config         = config;
            _saberSet       = saberSet;
            _mainAssetStore = mainAssetStore;
            _beatmapData    = beatmap.CastChecked <BeatmapData>();
            _randomUtil     = randomUtil;

            _oldLeftSaberModel  = _saberSet.LeftSaber;
            _oldRightSaberModel = _saberSet.RightSaber;

            Setup();
        }
Exemple #20
0
        internal static void DeserializeBeatmapData(IReadonlyBeatmapData beatmapData)
        {
            ChromaObjectDatas = new Dictionary <BeatmapObjectData, ChromaObjectData>();
            if (NoodleExtensionsInstalled)
            {
                ChromaNoodleDatas = new Dictionary <BeatmapObjectData, ChromaNoodleData>();
            }

            foreach (BeatmapObjectData beatmapObjectData in beatmapData.beatmapObjectsData)
            {
                ChromaObjectData chromaObjectData;
                dynamic          customData;

                switch (beatmapObjectData)
                {
                case CustomNoteData customNoteData:
                    customData       = customNoteData.customData;
                    chromaObjectData = new ChromaNoteData()
                    {
                        Color = ChromaUtils.GetColorFromData(customData),
                        DisableSpawnEffect = Trees.at(customData, DISABLESPAWNEFFECT),
                    };
                    break;

                case CustomObstacleData customObstacleData:
                    customData       = customObstacleData.customData;
                    chromaObjectData = new ChromaObjectData()
                    {
                        Color = ChromaUtils.GetColorFromData(customData),
                    };
                    break;

                case CustomWaypointData customWaypointData:
                    customData       = customWaypointData.customData;
                    chromaObjectData = new ChromaObjectData();
                    break;

                default:
                    continue;
                }

                if (NoodleExtensionsInstalled)
                {
                    ApplyNoodleData(customData, beatmapObjectData, beatmapData);
                }

                ChromaObjectDatas.Add(beatmapObjectData, chromaObjectData);
            }
        }
        private static IReadonlyBeatmapData ExcludeFakeNote(IReadonlyBeatmapData result)
        {
            foreach (BeatmapLineData b in result.beatmapLinesData)
            {
                BeatmapLineData refBeatmapLineData = b;
                _beatmapObjectsDataAccessor(ref refBeatmapLineData) = b.beatmapObjectsData.Where(n =>
                {
                    dynamic dynData = null;

                    switch (n)
                    {
                    case CustomNoteData customNoteData:
                        dynData = customNoteData.customData;
                        break;

                    case CustomObstacleData customObstacleData:
                        return(false);

                    default:
                        return(true);
                    }

                    bool?fake = Trees.at(dynData, FAKENOTE);
                    if (fake.HasValue && fake.Value)
                    {
                        return(false);
                    }

                    return(true);
                }).ToList();
            }

            if (result is CustomBeatmapData customBeatmapData)
            {
                string[] excludedTypes = new string[]
                {
                    ANIMATETRACK,
                    ASSIGNPATHANIMATION,
                    ASSIGNPLAYERTOTRACK,
                    ASSIGNTRACKPARENT,
                };

                customBeatmapData.customEventsData.RemoveAll(n => excludedTypes.Contains(n.type));

                customBeatmapData.customData.isMultiplayer = true;
            }

            return(result);
        }
        internal static void HandleTrackData(
            GameObject gameObject,
            Dictionary <string, object?> gameObjectData,
            IReadonlyBeatmapData beatmapData,
            float noteLinesDistance,
            TrackLaneRing?trackLaneRing,
            ParametricBoxController?parametricBoxController,
            BeatmapObjectsAvoidance?beatmapObjectsAvoidance)
        {
            Track?track = GetTrack(gameObjectData, beatmapData);

            if (track != null)
            {
                GameObjectTrackController trackController = gameObject.AddComponent <GameObjectTrackController>();
                trackController.Init(track, noteLinesDistance, trackLaneRing, parametricBoxController, beatmapObjectsAvoidance);
            }
        }
        private static IReadonlyBeatmapData ExcludeFakeNoteAndAllWalls(IReadonlyBeatmapData result)
        {
            foreach (BeatmapLineData b in result.beatmapLinesData)
            {
                BeatmapLineData refBeatmapLineData = b;
                _beatmapObjectsDataAccessor(ref refBeatmapLineData) = b.beatmapObjectsData.Where(n =>
                {
                    Dictionary <string, object?> dynData;

                    switch (n)
                    {
                    case CustomNoteData customNoteData:
                        dynData = customNoteData.customData;
                        break;

                    case CustomObstacleData customObstacleData:
                        return(false);

                    default:
                        return(true);
                    }

                    bool?fake = dynData.Get <bool?>(FAKENOTE);
                    if (fake.HasValue && fake.Value)
                    {
                        return(false);
                    }

                    return(true);
                }).ToList();
            }

            if (result is CustomBeatmapData customBeatmapData)
            {
                string[] excludedTypes = new string[]
                {
                    ASSIGNPLAYERTOTRACK,
                    ASSIGNTRACKPARENT,
                };

                customBeatmapData.customEventsData.RemoveAll(n => excludedTypes.Contains(n.type));
            }

            return(result);
        }
Exemple #24
0
        static void Postfix(IReadonlyBeatmapData beatmapData, ref IReadonlyBeatmapData __result, bool leftHanded)
        {
            if (!BS_Utils.Plugin.LevelData.IsSet || BS_Utils.Plugin.LevelData.Mode != BS_Utils.Gameplay.Mode.Standard || !UI.ModifierUI.instance.modEnabled)
            {
                return;
            }

            BS_Utils.Gameplay.ScoreSubmission.DisableSubmission("DiffReducer");

            __result = beatmapData.GetFilteredCopy(x =>
            {
                if (x is BeatmapObjectData && !UI.ModifierUI.instance.simplifiedMap.Any(y => x.CompareTo(y) == 0))
                {
                    return(null);
                }
                return(x);
            });
        }
 internal static void HandleTrackData(
     GameObject gameObject,
     dynamic gameObjectData,
     IReadonlyBeatmapData beatmapData,
     float noteLinesDistance,
     TrackLaneRing trackLaneRing,
     ParametricBoxController parametricBoxController)
 {
     if (NoodleController.NoodleExtensionsActive)
     {
         Track track = NoodleExtensions.Animation.AnimationHelper.GetTrackPreload(gameObjectData, beatmapData);
         if (track != null)
         {
             GameObjectTrackController trackController = gameObject.AddComponent <GameObjectTrackController>();
             trackController.Init(track, noteLinesDistance, trackLaneRing, parametricBoxController);
         }
     }
 }
        /*public static Track GetTrack(dynamic customData, string name = TRACK)
         * {
         *  string trackName = Trees.at(customData, name);
         *  if (trackName == null)
         *  {
         *      return null;
         *  }
         *
         *  if (Tracks.TryGetValue(trackName, out Track track))
         *  {
         *      return track;
         *  }
         *  else
         *  {
         *      NoodleLogger.Log($"Could not find track {trackName}!", IPA.Logging.Logger.Level.Error);
         *      return null;
         *  }
         * }*/

        public static Track GetTrackPreload(dynamic customData, IReadonlyBeatmapData beatmapData, string name = TRACK)
        {
            string trackName = Trees.at(customData, name);

            if (trackName == null)
            {
                return(null);
            }

            if (((CustomBeatmapData)beatmapData).customData.tracks.TryGetValue(trackName, out Track track))
            {
                return(track);
            }
            else
            {
                NoodleLogger.Log($"Could not find track {trackName}!", IPA.Logging.Logger.Level.Error);
                return(null);
            }
        }
Exemple #27
0
        private static void Postfix(IReadonlyBeatmapData __result)
        {
            foreach (BeatmapEventData beatmapEventData in __result.beatmapEventsData)
            {
                if (beatmapEventData.type.IsRotationEvent())
                {
                    if (beatmapEventData is CustomBeatmapEventData customData)
                    {
                        dynamic dynData  = customData.customData;
                        float?  rotation = (float?)Trees.at(dynData, ROTATION);

                        if (rotation.HasValue)
                        {
                            dynData._rotation = rotation * -1;
                        }
                    }
                }
            }
        }
Exemple #28
0
        private static void Postfix(IReadonlyBeatmapData __result)
        {
            foreach (BeatmapEventData beatmapEventData in __result.beatmapEventsData)
            {
                if (beatmapEventData.type.IsRotationEvent())
                {
                    if (beatmapEventData is CustomBeatmapEventData customData)
                    {
                        Dictionary <string, object?> dynData = customData.customData;
                        float?rotation = dynData.Get <float?>(ROTATION);

                        if (rotation.HasValue)
                        {
                            dynData["_rotation"] = rotation * -1;
                        }
                    }
                }
            }
        }
Exemple #29
0
#pragma warning disable SA1313 // Parameter names should begin with lower-case letter
        private static void Postfix(IReadonlyBeatmapData __result)
#pragma warning restore SA1313 // Parameter names should begin with lower-case letter
        {
            foreach (BeatmapEventData beatmapEventData in __result.beatmapEventsData)
            {
                if (beatmapEventData.type.IsRotationEvent())
                {
                    if (beatmapEventData is CustomBeatmapEventData customData)
                    {
                        dynamic dynData  = customData.customData;
                        float?  rotation = (float?)Trees.at(dynData, ROTATION);

                        if (rotation.HasValue)
                        {
                            dynData._rotation = rotation * -1;
                        }
                    }
                }
            }
        }
        private static bool Prefix(IReadonlyBeatmapData beatmapData, ref IReadonlyBeatmapData __result)
        {
            if (Settings.ChromaConfig.Instance.ForceZenWallsEnabled)
            {
                BeatmapData copyWithoutBeatmapObjects = beatmapData.GetCopyWithoutBeatmapObjects();
                BeatmapData.CopyBeatmapObjectsWaypointsOnly(beatmapData, copyWithoutBeatmapObjects);
                foreach (BeatmapObjectData beatmapObjectData in beatmapData.beatmapObjectsData)
                {
                    if (beatmapObjectData is ObstacleData)
                    {
                        copyWithoutBeatmapObjects.AddBeatmapObjectData(beatmapObjectData.GetCopy());
                    }
                }

                __result = copyWithoutBeatmapObjects;

                return(false);
            }

            return(true);
        }