private IEnumerator WaitToCheckDefault()
        {
            yield return(new WaitUntil(() => Resources.FindObjectsOfTypeAll <Saber>().Any()));

            bool hideOneSaber = false;

            Saber.SaberType hiddenSaberType = Saber.SaberType.SaberA;
            if (BS_Utils.Plugin.LevelData.GameplayCoreSceneSetupData.difficultyBeatmap.parentDifficultyBeatmapSet.beatmapCharacteristic.characteristicNameLocalizationKey.Contains("ONE_SABER"))
            {
                hideOneSaber    = true;
                hiddenSaberType = BS_Utils.Plugin.LevelData.GameplayCoreSceneSetupData.playerSpecificSettings.leftHanded ? Saber.SaberType.SaberB : Saber.SaberType.SaberA;
            }

            Logger.log.Debug("Default Sabers. Not Replacing");
            IEnumerable <Saber> defaultSabers = Resources.FindObjectsOfTypeAll <Saber>();

            foreach (Saber defaultSaber in defaultSabers)
            {
                bool activeState = !hideOneSaber ? true : defaultSaber.saberType != hiddenSaberType;
                defaultSaber.gameObject.SetActive(activeState);

                if (defaultSaber.saberType == hiddenSaberType)
                {
                    IEnumerable <MeshFilter> meshFilters = defaultSaber.transform.GetComponentsInChildren <MeshFilter>();
                    foreach (MeshFilter meshFilter in meshFilters)
                    {
                        meshFilter.gameObject.SetActive(!sabers);

                        MeshFilter filter = meshFilter.GetComponentInChildren <MeshFilter>();
                        filter?.gameObject.SetActive(!sabers);
                    }
                }
            }
        }
Exemplo n.º 2
0
        public static bool Prefix(ref Saber.SaberType type, ref Color __result)
        {
            if (ColourManager.TechnicolourSabers)
            {
                __result = ColourManager.GetTechnicolour(type == Saber.SaberType.SaberA, Time.time, ChromaConfig.TechnicolourSabersStyle);
                return(false);
            }

            if (type == Saber.SaberType.SaberA)
            {
                if (ColourManager.A != Color.clear)
                {
                    __result = ColourManager.A;
                    return(false);
                }
            }
            else
            {
                if (ColourManager.B != Color.clear)
                {
                    __result = ColourManager.B;
                    return(false);
                }
            }

            return(true);
        }
Exemplo n.º 3
0
 public override Color ColorForSaberType(Saber.SaberType type) //currently this doesnt work
 {
     if (type == Saber.SaberType.SaberB)
     {
         if (--idleB == 0)
         {
             idleB = skipCount;
             if (++counterB == colorsB.Count)
             {
                 counterB = 0;
             }
             //logger.Log(IPALogger.Level.Info, string.Format("Saber color B index = {0}", counterB));
             _saberBColor.SetColor(colorsB[counterB]);
             //logger.Log(IPALogger.Level.Info, _saberBColor.ToString());
         }
         return(_saberBColor);
     }
     else
     {
         if (--idleA == 0)
         {
             idleA = skipCount;
             if (++counterA == colorsA.Count)
             {
                 counterA = 0;
             }
             //logger.Log(IPALogger.Level.Info, string.Format("Saber color A index = {0}", counterA));
             _saberAColor.SetColor(colorsA[counterA]);
             //logger.Log(IPALogger.Level.Info, _saberAColor.ToString());
         }
         return(_saberAColor);
     }
 }
Exemplo n.º 4
0
        private static SaberType GetOpposite(SaberType saberType)
        {
            if (saberType == SaberType.SaberA)
            {
                return(SaberType.SaberB);
            }

            return(SaberType.SaberA);
        }
 private void SaberEndCollide(Saber.SaberType saber)
 {
     try
     {
         _EventManager.SaberStopColliding.Invoke();
     }
     catch (Exception e)
     {
         Console.WriteLine(e);
     }
 }
Exemplo n.º 6
0
 static bool Prefix(Saber.SaberType saberType)
 {
     if (PluginConfig.noteCut == false && PluginConfig.enabled)
     {
         return(false);
     }
     else
     {
         return(true);
     }
 }
Exemplo n.º 7
0
 private void SaberStartCollide(Saber.SaberType saberType)
 {
     if (saberType == Saber.SaberType.SaberA)
     {
         leftEventManager?.SaberStartColliding?.Invoke();
     }
     else if (saberType == Saber.SaberType.SaberB)
     {
         rightEventManager?.SaberStartColliding?.Invoke();
     }
 }
Exemplo n.º 8
0
 private void SaberEndCollide(Saber.SaberType saber)
 {
     if (saber == Saber.SaberType.SaberA)
     {
         _leftEventManager?.SaberStopColliding?.Invoke();
     }
     else if (saber == Saber.SaberType.SaberB)
     {
         _rightEventManager?.SaberStopColliding?.Invoke();
     }
 }
        private EventManager GetEventManagerByType(Saber.SaberType saberType)
        {
            EventManager eventManager = null;

            if (saberType == Saber.SaberType.SaberA)
            {
                eventManager = leftEventManager;
            }
            else if (saberType == Saber.SaberType.SaberB)
            {
                eventManager = rightEventManager;
            }

            return(eventManager);
        }
        private GameObject GetCustomSaberByType(Saber.SaberType saberType)
        {
            GameObject saber = null;

            if (saberType == Saber.SaberType.SaberA)
            {
                saber = leftSaber;
            }
            else if (saberType == Saber.SaberType.SaberB)
            {
                saber = rightSaber;
            }

            return(saber);
        }
Exemplo n.º 11
0
 public void onSparkleEffectEnd(Saber.SaberType type)
 {
     if (haptics != null)
     {
         // Robust against left being either A or B. Not robust against left and right being the same type.
         // This is because the effect manager's exposed events only tell us what type of saber stopped vibrating,
         // not whether it was left or right.
         if (type == left.saberType)
         {
             haptics.UpdateStartCount(XRNode.LeftHand,
                                      haptics.getPrivateField <int>("_leftControllerStartRumbleCount") * -1);
         }
         else
         {
             haptics.UpdateStartCount(XRNode.RightHand,
                                      haptics.getPrivateField <int>("_rightControllerStartRumbleCount") * -1);
         }
     }
 }
Exemplo n.º 12
0
 private void ActivateSaber(SaberType saberType)
 {
     if (saberType == SaberType.SaberA)
     {
         if (_player.rightSaber.gameObject.activeSelf)
         {
             _player.leftSaber.gameObject.SetActive(true);
             _player.rightSaber.gameObject.SetActive(false);
         }
     }
     else if (saberType == SaberType.SaberB)
     {
         if (_player.leftSaber.gameObject.activeSelf)
         {
             _player.rightSaber.gameObject.SetActive(true);
             _player.leftSaber.gameObject.SetActive(false);
         }
     }
 }
Exemplo n.º 13
0
        public virtual void HandleNoteWasCutEvent(BeatmapObjectSpawnController noteSpawnController, NoteController noteController, NoteCutInfo noteCutInfo)
        {
            try
            {
                Vector3 notePos = noteController.noteTransform.position;

                Vector3 leftPos = _playerController.leftSaber.transform.position;
                leftPos += _playerController.leftSaber.transform.forward * 0.5f;
                Vector3 rightPos = _playerController.rightSaber.transform.position;
                rightPos += _playerController.rightSaber.transform.forward * 0.5f;

                float leftDist  = Vector3.Distance(leftPos, notePos);
                float rightDist = Vector3.Distance(rightPos, notePos);

                _mainSettingsModel.controllersRumbleEnabled = true;
                Saber.SaberType targetType = (leftDist > rightDist) ? Saber.SaberType.SaberB : Saber.SaberType.SaberA;
                _noteCutHapticEffect.RumbleController(targetType);
                _mainSettingsModel.controllersRumbleEnabled = false;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message + "\n" + ex.StackTrace);
            }
        }
Exemplo n.º 14
0
        private void TransformToOneColor()
        {
            const string OneSaberModeName = "OneSaber";

            // Check for game mode and early exit on One Saber or NoArrows
            GameplayCoreSceneSetupData data = BS_Utils.Plugin.LevelData?.GameplayCoreSceneSetupData;
            var    beatmap        = data.difficultyBeatmap;
            string serializedName = beatmap.parentDifficultyBeatmapSet.beatmapCharacteristic.serializedName;

            if (serializedName == OneSaberModeName)
            {
                // Do not transform for One Saber or legitimate No Arrows mode
                Logging.Info($"No need to transform: {beatmap.level.songName} for spear as it is a One Saber map");
                return;
            }

            // Get the in memory beat map
            var gameplayCoreSceneSetup = Resources.FindObjectsOfTypeAll <GameplayCoreSceneSetup>().First();

            if (gameplayCoreSceneSetup == null)
            {
                return;
            }

            var dataModel   = gameplayCoreSceneSetup.GetField <BeatmapDataModel>("_beatmapDataModel");
            var beatmapData = dataModel.beatmapData;

            Logging.Info("Disabling submission on One Color No Arrows transformation");
            BS_Utils.Gameplay.ScoreSubmission.DisableSubmission(Plugin.assemblyName);

            // Transform the map to One Color and No Arrows
            NoteType undesiredNoteType = ConfigOptions.instance.LeftHanded ? NoteType.NoteB : NoteType.NoteA;

            foreach (BeatmapLineData line in beatmapData.beatmapLinesData)
            {
                var objects = line.beatmapObjectsData;
                foreach (BeatmapObjectData beatmapObject in objects)
                {
                    if (beatmapObject.beatmapObjectType == BeatmapObjectType.Note)
                    {
                        var note = beatmapObject as NoteData;
                        note.SetNoteToAnyCutDirection();

                        if (note.noteType == undesiredNoteType)
                        {
                            note.SwitchNoteType();
                        }
                    }
                }
            }

            // Change the other saber to desired type
            Saber.SaberType desiredSaberType = ConfigOptions.instance.LeftHanded ? Saber.SaberType.SaberA : Saber.SaberType.SaberB;
            var             saberObject      = new GameObject("SaberTypeObject").AddComponent <SaberTypeObject>();

            saberObject.SetField("_saberType", desiredSaberType);

            var   player      = Resources.FindObjectsOfTypeAll <PlayerController>().FirstOrDefault();
            Saber saberToSwap = ConfigOptions.instance.LeftHanded ? player.rightSaber : player.leftSaber;

            saberToSwap.SetField("_saberType", saberObject);
        }
Exemplo n.º 15
0
        private IEnumerator WaitForSabers(GameObject saberRoot)
        {
            yield return(new WaitUntil(() => Resources.FindObjectsOfTypeAll <Saber>().Any()));

            var sabers = Resources.FindObjectsOfTypeAll <Saber>();

            Saber.SaberType[] typeForHands = new Saber.SaberType[] { Saber.SaberType.SaberB, Saber.SaberType.SaberA };
            var playerDataModel            = Resources.FindObjectsOfTypeAll <PlayerDataModelSO>().FirstOrDefault();

            Console.WriteLine("DataModel");
            if (playerDataModel && playerDataModel.currentLocalPlayer.playerSpecificSettings.swapColors)
            {
                typeForHands = typeForHands.Reverse().ToArray();
            }

            foreach (var saber in sabers)
            {
                //Disappear default saber
                foreach (MeshFilter t in saber.transform.GetComponentsInChildren <MeshFilter>())
                {
                    t.gameObject.SetActive(saberRoot == null);
                    var filter = t.GetComponentInChildren <MeshFilter>();
                    if (filter)
                    {
                        filter.gameObject.SetActive(saberRoot == null);
                    }
                }
                Console.WriteLine("Replacing " + saber.saberType);
                CustomTrail[] trails;
                if (saber.saberType == typeForHands[0])
                {
                    if (saberRoot == null)
                    {
                    }
                    else
                    {
                        _rightSaber.transform.parent = saber.transform;
                    }
                    _rightSaber.transform.position = saber.transform.position;
                    _rightSaber.transform.rotation = saber.transform.rotation;

                    //    Console.WriteLine("PreTrail");
                    trails = _rightSaber.GetComponents <CustomTrail>();
                    foreach (CustomTrail trail in trails)
                    {
                        trail.Init(saber);
                    }
                }
                else if (saber.saberType == typeForHands[1])
                {
                    if (saberRoot == null)
                    {
                    }
                    else
                    {
                        _leftSaber.transform.parent = saber.transform;
                    }
                    _leftSaber.transform.position = saber.transform.position;
                    _leftSaber.transform.rotation = saber.transform.rotation;

                    //    Console.WriteLine("PreTrail");
                    trails = _leftSaber.GetComponents <CustomTrail>();
                    foreach (CustomTrail trail in trails)
                    {
                        trail.Init(saber);
                    }
                }
            }
        }
        private void SaberEndCollide(Saber.SaberType saberType)
        {
            EventManager eventManager = GetEventManagerByType(saberType);

            eventManager?.SaberStopColliding?.Invoke();
        }
Exemplo n.º 17
0
 private void SaberEndCollide(Saber.SaberType saber)
 {
     _EventManager.SaberStopColliding.Invoke();
 }
Exemplo n.º 18
0
        private IEnumerator WaitForSabers(GameObject saberRoot)
        {
            yield return(new WaitUntil(() => Resources.FindObjectsOfTypeAll <Saber>().Any()));

            var sabers          = Resources.FindObjectsOfTypeAll <Saber>();
            var typeForHands    = new Saber.SaberType[] { Saber.SaberType.SaberB, Saber.SaberType.SaberA };
            var playerDataModel = Resources.FindObjectsOfTypeAll <PlayerDataModelSO>().FirstOrDefault();

            Logger.Log("DataModel", LogLevel.Debug);

            foreach (var saber in sabers)
            {
                //Disappear default saber
                foreach (var t in saber.transform.GetComponentsInChildren <MeshFilter>())
                {
                    t.gameObject.SetActive(saberRoot == null);
                    var filter = t.GetComponentInChildren <MeshFilter>();
                    if (filter)
                    {
                        filter.gameObject.SetActive(saberRoot == null);//.sharedMesh = null;
                    }
                }

                Logger.Log($"Replacing {saber.saberType}");
                CustomTrail[] trails;
                if (saber.saberType == typeForHands[0])
                {
                    if (saberRoot != null)
                    {
                        _rightSaber.transform.parent = saber.transform;
                    }

                    _rightSaber.transform.position = saber.transform.position;
                    _rightSaber.transform.rotation = saber.transform.rotation;

                    //Logger.Log("PreTrail", LogLevel.Debug);
                    trails = _rightSaber.GetComponents <CustomTrail>();
                    foreach (var trail in trails)
                    {
                        trail.Init(saber);
                    }
                    ApplyColorsToSaber(_rightSaber, Plugin.colorManager.ColorForSaberType(Saber.SaberType.SaberB));
                }
                else if (saber.saberType == typeForHands[1])
                {
                    if (saberRoot != null)
                    {
                        _leftSaber.transform.parent = saber.transform;
                    }

                    _leftSaber.transform.position = saber.transform.position;
                    _leftSaber.transform.rotation = saber.transform.rotation;

                    //Logger.Log("PreTrail", LogLevel.Debug);
                    trails = _leftSaber.GetComponents <CustomTrail>();
                    foreach (var trail in trails)
                    {
                        trail.Init(saber);
                    }
                    ApplyColorsToSaber(_leftSaber, Plugin.colorManager.ColorForSaberType(Saber.SaberType.SaberA));
                }
            }
        }
 private void SaberStartCollide(Saber.SaberType saber)
 {
     _eventManager?.SaberStartColliding?.Invoke();
 }
        public void addSaber(string name, Vector3 eulerRotation, Vector3 offset, Saber.SaberType type, bool isLeftHand)
        {
            var oldSaber = isLeftHand ? Plugin.playerController.leftSaber : Plugin.playerController.rightSaber;

            /*
             * var oldBSMC = (oldSaber
             *  .GetComponent<SaberModelContainer>()
             *  .GetField<ISaberModelController>("_saberModelController")
             *  as BasicSaberModelController);
             * oldBSMC.gameObject.name = oldSaber.gameObject.name + " Model";
             */

            // disable the template saber so the new one will start out disabled
            oldSaber.gameObject.SetActive(false);

            var newSaber = GameObject.Instantiate(oldSaber.gameObject).GetComponent <Saber>();

            newSaber.name = name;

            // unfortunately, getting extra sabers working requires child sacrifice
            GameObject.Destroy(newSaber.GetComponentInChildren <SaberWeaponTrail>(true));

            // so what's actually going on here:
            // the saber's model is a separate GameObject that's a child of the saber, and gets instantiated by Zenject at runtime
            // instantiating the saber copies the model, which then SCREAMS AT YOU because its references weren't copied
            // so we kill the screaming malformed child, get Zenject to give us a new one, and pretend this never happened
            ISMCCContainer.InjectGameObject(newSaber.gameObject);

            var smc  = newSaber.GetComponent <SaberModelContainer>();
            var bsmc = smc.GetField <ISaberModelController>("_saberModelController")
                       as BasicSaberModelController;

            bsmc.gameObject.name = name + " Model";

            // it is now safe to turn on your old saber
            oldSaber.gameObject.SetActive(true);

            // set the saber's type
            var sto = newSaber.GetComponent <SaberTypeObject>();

            sto.SetField("_saberType", type);

            // not sure if these are actually necessary, but just in case
            newSaber.SetField("_saberType", sto);
            smc.SetField("_saberTypeObject", sto);

            // one could imagine a world in which the ColorManager is stored in a separate container from the saber model prefab
            // while this is not currently the case... best to be prepared
            if (!ISMCCContainer.HasBinding <ColorManager>())
            {
                colorManagerContainer.InjectGameObject(bsmc.gameObject);
            }
            var trail = bsmc.GetField <SaberWeaponTrail>("_saberWeaponTrail");

            if (!ISMCCContainer.HasBinding <ColorManager>())
            {
                colorManagerContainer.InjectGameObject(trail.gameObject);
            }

            // everything's set up; activate the new saber!
            newSaber.gameObject.SetActive(true);

            // record the info about how to rotate the new saber
            sabersByName.Add(name, new SaberInfo
            {
                eulerRotation = eulerRotation,
                offset        = offset,
                saber         = newSaber,
                isMainSaber   = false,
            });
        }
Exemplo n.º 21
0
        private void SpawnController_ScaleRemoveCut(BeatmapObjectSpawnController arg1, INoteController controller, NoteCutInfo arg3)
        {
            NoteData  note          = controller.noteData;
            Transform noteTransform = controller.noteTransform;

            //      Log("DESPAWN" + noteTransform.localScale.ToString());
            if (noteTransform.localScale.x != 1)
            {
                noteTransform.localScale = new Vector3(1f, 1f, 1f);
            }
            //          Log("DESPAWN" + noteTransform.localScale.ToString());



            //     if (modifiedNotes[note.id] != null)
            //          note = modifiedNotes[note.id];

            FloatBehavior behavior = noteTransform.gameObject.GetComponent <FloatBehavior>();

            if (behavior != null)
            {
                noteTransform.localPosition = new Vector3(behavior.originalX, behavior.originalY, noteTransform.localPosition.z);
                GameObject.Destroy(behavior);
            }


            if (GMPUI.oneColor)
            {
                if (!defaultRumble)
                {
                    return;
                }
                _noteCutEffectSpawner = UnityEngine.Object.FindObjectOfType <NoteCutEffectSpawner>();
                if (_noteCutEffectSpawner != null)
                {
                    _noteCutHapticEffect = ReflectionUtil.GetPrivateField <NoteCutHapticEffect>(_noteCutEffectSpawner, "_noteCutHapticEffect");
                }
                if (_noteCutHapticEffect != null)
                {
                    _hapticFeedbackController = ReflectionUtil.GetPrivateField <HapticFeedbackController>(_noteCutHapticEffect, "_hapticFeedbackController");
                }
                if (_hapticFeedbackController != null)
                {
                    _RumbleEnabledOneC = ReflectionUtil.GetPrivateField <BoolSO>(_hapticFeedbackController, "_controllersRumbleEnabled");
                }

                if (_RumbleEnabledOneC == null)
                {
                    return;
                }
                Vector3 notePos = controller.noteTransform.position;

                Vector3 leftPos = player.leftSaber.transform.position;
                leftPos += player.leftSaber.transform.forward * 0.5f;
                Vector3 rightPos = player.rightSaber.transform.position;
                rightPos += player.rightSaber.transform.forward * 0.5f;

                float leftDist  = Vector3.Distance(leftPos, notePos);
                float rightDist = Vector3.Distance(rightPos, notePos);
                // Log(leftDist.ToString() + "   " + rightDist.ToString());
                _RumbleEnabledOneC.value = true;
                Saber.SaberType targetType = (leftDist > rightDist) ? Saber.SaberType.SaberB : Saber.SaberType.SaberA;
                if (!(Mathf.Abs(leftDist - rightDist) <= 0.2f))
                {
                    _noteCutHapticEffect.HitNote(targetType);
                }
                else
                {
                    _noteCutHapticEffect.HitNote(Saber.SaberType.SaberA);
                    _noteCutHapticEffect.HitNote(Saber.SaberType.SaberB);
                }
                _RumbleEnabledOneC.value = false;
            }
        }
Exemplo n.º 22
0
        private IEnumerator TransformMap()
        {
            yield return(new WaitForSecondsRealtime(0.1f));

            // Set up for One Color
            if (ConfigOptions.instance.OneColor && !ConfigOptions.instance.NoArrowsRandom)
            {
                this.useLeft =
                    (ConfigOptions.instance.PlayMode == PlayMode.BeatSaber && ConfigOptions.instance.UseLeftSaber) ||
                    (ConfigOptions.instance.PlayMode == PlayMode.DarthMaul && ConfigOptions.instance.UseLeftController) ||
                    (ConfigOptions.instance.PlayMode == PlayMode.BeatSpear && ConfigOptions.instance.UseLeftSpear);

                this.undesiredNoteType = this.useLeft ? NoteType.NoteB : NoteType.NoteA;

                // Change the other saber to desired type
                Saber.SaberType desiredSaberType = this.useLeft ? Saber.SaberType.SaberA : Saber.SaberType.SaberB;
                var             saberObject      = new GameObject("SaberTypeObject").AddComponent <SaberTypeObject>();
                saberObject.SetField("_saberType", desiredSaberType);

                var   player      = Resources.FindObjectsOfTypeAll <PlayerController>().FirstOrDefault();
                Saber saberToSwap = this.useLeft ? player.rightSaber : player.leftSaber;
                saberToSwap.SetField("_saberType", saberObject);

                if (ConfigOptions.instance.RemoveOtherSaber && ConfigOptions.instance.PlayMode == PlayMode.BeatSaber)
                {
                    // Hide the off color saber
                    Saber saberToHide = ConfigOptions.instance.UseLeftSaber ? this.playerController.rightSaber : this.playerController.leftSaber;
                    saberToHide.gameObject.SetActive(false);
                }
            }

            // Get the in memory beat map
            BeatmapObjectCallbackController callbackController = Resources.FindObjectsOfTypeAll <BeatmapObjectCallbackController>().First();
            BeatmapData beatmapData = callbackController.GetField <BeatmapData>("_beatmapData");

            if (ConfigOptions.instance.NoArrowsRandom)
            {
                // Transform the map to No Arrows Random using the ingame algorithm first
                Logging.Info($"Transforming NoArrowsRandom for song: {this.currentBeatmap.level.songName}");
                var transformedBeatmap = BeatmapDataNoArrowsTransform.CreateTransformedData(beatmapData, true);
                callbackController.SetNewBeatmapData(transformedBeatmap);
            }

            // Transform every note
            var allNoteObjects = beatmapData.beatmapLinesData
                                 .SelectMany(line => line.beatmapObjectsData)
                                 .Where(objectData => objectData.beatmapObjectType == BeatmapObjectType.Note)
                                 .ToList();

            allNoteObjects.ForEach(beatmapObject =>
            {
                var note = beatmapObject as NoteData;

                // Transform for NoArrows or TouchNotes here but do not if NoArrowsRandom was already applied
                if ((ConfigOptions.instance.NoArrows || ConfigOptions.instance.TouchNotes) && !ConfigOptions.instance.NoArrowsRandom)
                {
                    note.SetNoteToAnyCutDirection();
                }

                // Transform for One Color if this is the other note type
                if (ConfigOptions.instance.OneColor && note.noteType == undesiredNoteType)
                {
                    note.SwitchNoteType();
                }
            });

            // Touch Notes speed detection is not handled here but in the HarmonyPatches
        }
Exemplo n.º 23
0
 public void onSparkleEffectStart(Saber.SaberType type)
 {
 }