Beispiel #1
0
 static void Postfix(ZEventListener __instance, IVisitor visitor)
 {
     if (!__instance.eventName_.StartsWith(CustomDataInfo.GetPrefix <MusicChoice>()))
     {
         return;
     }
     CachedMusicChoice.GetOr(__instance, () => MusicChoice.FromObject(__instance));
 }
Beispiel #2
0
        internal static void Postfix(ZEventListener __instance)
        {
            if (!__instance.eventName_.StartsWith(CustomDataInfo.GetPrefix <MusicChoice>()))
            {
                return;
            }

            Mod.Instance.Variables.CachedMusicChoice.GetOrCreate(__instance, () => MusicChoice.FromObject(__instance));
        }
Beispiel #3
0
            private void AddOrRemove(ReferenceMap.Handle <GameObject> beforeHandle, ref ReferenceMap.Handle <GameObject> afterHandle, bool add)
            {
                LevelEditor    editor     = G.Sys.LevelEditor_;
                GameObject     gameObject = beforeHandle.Get();
                ZEventListener comp       = (!add) ? addedComponentHandle.Get() : ((ZEventListener)((object)null));

                if (!gameObject.HasComponent <LevelSettings>())
                {
                    editor.RemoveGameObjectSilent(gameObject);
                }
                if (add)
                {
                    comp = gameObject.AddComponent <ZEventListener>();
                    var choice = new MusicChoice();
                    if (gameObject.HasComponent <LevelSettings>())
                    {
                        choice.Choices.Add("Level", new MusicChoiceEntry(""));
                    }
                    if (gameObject.HasComponent <MusicTrigger>())
                    {
                        choice.Choices.Add("Trigger", new MusicChoiceEntry(""));
                    }
                    if (gameObject.HasComponent <MusicZone>())
                    {
                        choice.Choices.Add("Zone", new MusicChoiceEntry(""));
                    }
                    choice.WriteObject(comp);
                    if (componentBytes != null)
                    {
                        Serializers.BinaryDeserializer.LoadComponentContentsFromBytes(comp, null, componentBytes);
                    }
                    comp.enabled = false;
                }
                else if (comp)
                {
                    comp.Destroy();
                }
                if (gameObject.HasComponent <LevelSettings>())
                {
                    EditorPatches.NeedsRefresh = true;
                }
                if (!gameObject.HasComponent <LevelSettings>())
                {
                    editor.AddGameObjectSilent(ref afterHandle, gameObject, editor.WorkingLevel_.GetLayerOfObject(gameObject));
                }
                addedComponentHandle = (!add) ? default(ReferenceMap.Handle <ZEventListener>) : editor.ReferenceMap_.GetHandleOrNull(comp);
                gameObject.ForEachILevelEditorListenerInChildren(listener => listener.OnLevelEditorToolFinish());
                Events.StaticEvent <ObjectHadComponentAddedOrRemoved.Data> .Broadcast(new ObjectHadComponentAddedOrRemoved.Data(gameObject));

                if (!gameObject.HasComponent <LevelSettings>())
                {
                    editor.SelectObject(gameObject);
                }
            }
        protected AddOrRemoveMusicChoiceAction(GameObject gameObject, ZEventListener comp)
        {
            ReferenceMap referenceMap_ = G.Sys.LevelEditor_.ReferenceMap_;

            originalHandle       = referenceMap_.GetHandleOrNull(gameObject);
            newHandle            = referenceMap_.GetHandleOrNull <GameObject>(null);
            addedComponentHandle = referenceMap_.GetHandleOrNull(comp);
            isAdd = (comp == null);
            if (!isAdd)
            {
                componentBytes = Serializers.BinarySerializer.SaveComponentToBytes(comp, null);
            }
        }
Beispiel #5
0
            static bool Prefix(ZEventListener __instance, IVisitor visitor, ISerializable prefabComp, int version)
            {
                if (!(visitor is NGUIComponentInspector))
                {
                    return(true);
                }
                if (!__instance.eventName_.StartsWith(CustomDataInfo.GetPrefix <MusicChoice>()))
                {
                    return(true);
                }
                visitor.Visit("eventName_", ref __instance.eventName_, false, null);
                visitor.Visit("delay_", ref __instance.delay_, false, null);
                var isEditing = (bool)typeof(NGUIComponentInspector).GetField("isEditing_", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(visitor);
                var data      = CachedMusicChoice.GetOr(__instance, () => new MusicChoice());

                if (data.LastWrittenData != __instance.eventName_)
                {
                    data.ReadObject(__instance);
                    data.LastWrittenData = __instance.eventName_;
                    data.LastWritten     = data.Clone();
                }
                else if (!isEditing)
                {
                    var anyChanges = false;
                    var old        = data.LastWritten;
                    if (data.Choices.Count != old.Choices.Count)
                    {
                        anyChanges = true;
                    }
                    foreach (var newChoice in data.Choices)
                    {
                        if (!old.Choices.ContainsKey(newChoice.Key) || old.Choices[newChoice.Key].Track != newChoice.Value.Track)
                        {
                            anyChanges = true;
                            break;
                        }
                    }
                    if (anyChanges)
                    {
                        data.WriteObject(__instance);
                        data.LastWrittenData = __instance.eventName_;
                        data.LastWritten     = data.Clone();
                    }
                }

                foreach (var choice in data.Choices)
                {
                    visitor.Visit($"{choice.Key} Track", ref choice.Value.Track, null);
                }
                return(false);
            }
Beispiel #6
0
 static bool Prefix(ZEventListener __instance, ref string __result)
 {
     if (__instance == null)
     {
         return(true);
     }
     if (__instance.eventName_.StartsWith(CustomDataInfo.GetPrefix <MusicChoice>()))
     {
         __result = "Custom music track choice";
         return(false);
     }
     else if (__instance.eventName_.StartsWith(CustomDataInfo.GetPrefix <MusicTrack>()))
     {
         __result = "Custom music track data";
         return(false);
     }
     return(true);
 }
Beispiel #7
0
        internal static bool Prefix(ZEventListener __instance, IVisitor visitor)
        {
            Mod mod = Mod.Instance;

            if (!(visitor is NGUIComponentInspector))
            {
                return(true);
            }

            NGUIComponentInspector inspector = visitor as NGUIComponentInspector;

            if (!__instance.eventName_.StartsWith(CustomDataInfo.GetPrefix <MusicChoice>()))
            {
                return(true);
            }

            visitor.Visit("eventName_", ref __instance.eventName_, false, null);
            visitor.Visit("delay_", ref __instance.delay_, false, null);

            var isEditing = inspector.isEditing_;

            var data = mod.Variables.CachedMusicChoice.GetOrCreate(__instance, () => new MusicChoice());

            if (data.LastWrittenData != __instance.eventName_)
            {
                data.ReadObject(__instance);
                data.LastWrittenData = __instance.eventName_;
                data.LastWritten     = data.Clone();
            }
            else if (!isEditing)
            {
                var anyChanges = false;
                var old        = data.LastWritten;

                if (data.Choices.Count != old.Choices.Count)
                {
                    anyChanges = true;
                }

                foreach (var newChoice in data.Choices)
                {
                    if (!old.Choices.ContainsKey(newChoice.Key) || old.Choices[newChoice.Key].Track != newChoice.Value.Track)
                    {
                        anyChanges = true;
                        break;
                    }
                }
                if (anyChanges)
                {
                    data.WriteObject(__instance);
                    data.LastWrittenData = __instance.eventName_;
                    data.LastWritten     = data.Clone();
                }
            }

            for (int index = 0; index < data.Choices.Count; index++)
            {
                string key   = data.Choices.Keys.ToArray()[index];
                var    track = data.Choices[key].Track;

                visitor.Visit($"{key} Track", ref track, null);
            }

            return(false);
        }
Beispiel #8
0
            static bool Prefix(ZEventListener __instance, IVisitor visitor, ISerializable prefabComp, int version)
            {
                if (!(visitor is NGUIComponentInspector))
                {
                    return(true);
                }
                if (!__instance.eventName_.StartsWith(CustomDataInfo.GetPrefix <MusicTrack>()))
                {
                    return(true);
                }
                visitor.Visit("eventName_", ref __instance.eventName_, false, null);
                visitor.Visit("delay_", ref __instance.delay_, false, null);
                var isEditing = (bool)typeof(NGUIComponentInspector).GetField("isEditing_", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(visitor);
                var data      = CachedMusicTrack.GetOr(__instance, () => new MusicTrack());

                if (data.LastWrittenData != __instance.eventName_)
                {
                    data.ReadObject(__instance);
                    data.LastWrittenData = __instance.eventName_;
                    data.EmbedFile       = (data.Embedded.Length > 0 ? "Embedded" : "");
                    data.LastWritten     = data.Clone();
                }
                else if (!isEditing)
                {
                    var anyChanges = false;
                    var old        = data.LastWritten;
                    if (data.Name != old.Name || data.DownloadUrl != old.DownloadUrl || data.FileType != old.FileType)
                    {
                        anyChanges = true;
                    }
                    if (data.EmbedFile != old.EmbedFile)
                    {
                        var newRef = data.EmbedFile;
                        if (newRef == "")
                        {
                            data.Embedded = new byte[0];
                            anyChanges    = true;
                        }
                        else
                        {
                            try
                            {
                                newRef = newRef.Trim('"', '\'');
                                var extension = Path.GetExtension(newRef);
                                var file      = FileEx.ReadAllBytes(newRef);
                                data.Embedded    = file ?? throw new Exception("Missing file");
                                data.FileType    = extension;
                                data.DownloadUrl = "";
                                anyChanges       = true;
                            }
                            catch (Exception e)
                            {
                                data.Embedded = new byte[0];
                                data.FileType = ".mp3";
                                anyChanges    = true;
                                // TODO: warn user
                                UnityEngine.Debug.Log($"Failed to embed {newRef} because {e}");
                            }
                        }
                    }
                    if (anyChanges)
                    {
                        data.FileLocation = null;
                        data.Attempted    = false;
                        data.EmbedFile    = (data.Embedded.Length > 0 ? "Embedded" : "");
                        data.NewVersion();
                        data.WriteObject(__instance);
                        data.LastWrittenData = __instance.eventName_;
                        data.LastWritten     = data.Clone();
                        var lastTrackName = CurrentTrackName;
                        if (lastTrackName == old.Name)
                        {
                            StopCustomMusic();
                        }
                        DownloadAllTracks();
                        if (lastTrackName == data.Name || GetMusicChoiceValue(G.Sys.LevelEditor_.WorkingSettings_.gameObject, "Level") == data.Name)
                        {
                            PlayTrack(data.Name, 0f);
                        }
                    }
                }

                visitor.Visit("Name", ref data.Name, null);
                visitor.Visit("Type", ref data.FileType, null);
                visitor.Visit("Embed File", ref data.EmbedFile, MusicTrackOptions);
                visitor.VisitAction("Select File", () =>
                {
                    var dlgOpen    = new System.Windows.Forms.OpenFileDialog();
                    dlgOpen.Filter = "Distance Music (*.mp3, *.wav, *.aiff)|*.mp3;*.wav;*.aiff|All Files (*.*)|*.*";
                    dlgOpen.SupportMultiDottedExtensions = true;
                    dlgOpen.RestoreDirectory             = true;
                    dlgOpen.Title           = "Pick Distance music file";
                    dlgOpen.CheckFileExists = true;
                    dlgOpen.CheckPathExists = true;
                    if (dlgOpen.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    {
                        data.EmbedFile = dlgOpen.FileName;
                    }
                }, MusicTrackButtonOptions);
                visitor.Visit("Download URL", ref data.DownloadUrl, null);
                var Error = data.GetError();

                if (Error == null)
                {
                    Error = "None";
                }
                visitor.Visit("Error", ref Error, null);
                return(false);
            }
 public RemoveMusicChoiceAction(GameObject obj, ZEventListener c) : base(obj, c)
 {
 }
        internal static bool Prefix(ZEventListener __instance, IVisitor visitor)
        {
            Mod mod = Mod.Instance;

            if (!(visitor is NGUIComponentInspector))
            {
                return(true);
            }

            NGUIComponentInspector inspector = visitor as NGUIComponentInspector;

            if (!__instance.eventName_.StartsWith(CustomDataInfo.GetPrefix <MusicTrack>()))
            {
                return(true);
            }

            visitor.Visit("eventName_", ref __instance.eventName_, false, null);
            visitor.Visit("delay_", ref __instance.delay_, false, null);

            var isEditing = inspector.isEditing_;

            var data = mod.Variables.CachedMusicTrack.GetOrCreate(__instance, () => new MusicTrack());

            if (data.LastWrittenData != __instance.eventName_)
            {
                data.ReadObject(__instance);
                data.LastWrittenData = __instance.eventName_;
                data.EmbedFile       = (data.Embedded.Length > 0 ? "Embedded" : "");
                data.LastWritten     = data.Clone();
            }
            else if (!isEditing)
            {
                var anyChanges = false;
                var old        = data.LastWritten;

                if (data.Name != old.Name || data.DownloadUrl != old.DownloadUrl || data.FileType != old.FileType)
                {
                    anyChanges = true;
                }

                if (data.EmbedFile != old.EmbedFile)
                {
                    var newRef = data.EmbedFile;
                    if (newRef?.Length == 0)
                    {
                        data.Embedded = new byte[0];
                        anyChanges    = true;
                    }
                    else
                    {
                        try
                        {
                            newRef = newRef.Trim('"', '\'');
                            var extension = Path.GetExtension(newRef);
                            var file      = FileEx.ReadAllBytes(newRef);
                            data.Embedded    = file ?? throw new Exception("Missing file");
                            data.FileType    = extension;
                            data.DownloadUrl = "";
                            anyChanges       = true;
                        }
                        catch (Exception e)
                        {
                            data.Embedded = new byte[0];
                            data.FileType = ".mp3";
                            anyChanges    = true;

                            MessageBox.Create($"Failed to embed {newRef} because {e}", "TRACK MUSIC ERROR")
                            .SetButtons(MessageButtons.Ok)
                            .Show();

                            Mod.Instance.Logger.Error($"Failed to embed {newRef} because {e}");
                        }
                    }
                }
                if (anyChanges)
                {
                    data.FileLocation = null;
                    data.Attempted    = false;
                    data.EmbedFile    = (data.Embedded.Length > 0 ? "Embedded" : "");
                    data.NewVersion();
                    data.WriteObject(__instance);
                    data.LastWrittenData = __instance.eventName_;
                    data.LastWritten     = data.Clone();
                    var lastTrackName = mod.Variables.CurrentTrackName;

                    if (lastTrackName == old.Name)
                    {
                        mod.SoundPlayer.StopCustomMusic();
                    }

                    mod.SoundPlayer.DownloadAllTracks();

                    if (lastTrackName == data.Name || mod.SoundPlayer.GetMusicChoiceValue(G.Sys.LevelEditor_.WorkingSettings_.gameObject, "Level") == data.Name)
                    {
                        mod.SoundPlayer.PlayTrack(data.Name, 0f);
                    }
                }
            }

            visitor.Visit("Name", ref data.Name, null);
            visitor.Visit("Type", ref data.FileType, null);
            visitor.Visit("Embed File", ref data.EmbedFile, mod.Variables.MusicTrackOptions);

            visitor.VisitAction("Select File", () =>
            {
                var dlgOpen = new System.Windows.Forms.OpenFileDialog
                {
                    Filter = "Music file (*.mp3, *.wav, *.aiff)|*.mp3;*.wav;*.aiff|All Files (*.*)|*.*",
                    SupportMultiDottedExtensions = true,
                    RestoreDirectory             = true,
                    Title           = "Select a music file",
                    CheckFileExists = true,
                    CheckPathExists = true
                };

                if (dlgOpen.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    data.EmbedFile = dlgOpen.FileName;
                }
            }, mod.Variables.MusicTrackButtonOptions);

            visitor.Visit("Download URL", ref data.DownloadUrl, null);

            var Error = data.GetError();

            if (Error == null)
            {
                Error = "None".Colorize(Colors.white);
            }
            else
            {
                Error = Error.Colorize(Colors.red);
            }
            //visitor.Visit("Error", ref Error, null);

            visitor.VisualLabel($"Error: {Error}".Colorize(Colors.white));

            return(false);
        }