public static IDisposable AddActionIcon(int mapNo, Vector3 position, Texture icon, Color color, string popupText, Action onOpen, Action <TriggerEnterExitEvent> onCreated = null, bool delayed = true, bool immediate = false)
        {
            if (icon == null)
            {
                throw new ArgumentNullException(nameof(icon));
            }
            if (popupText == null)
            {
                throw new ArgumentNullException(nameof(popupText));
            }
            if (onOpen == null)
            {
                throw new ArgumentNullException(nameof(onOpen));
            }

            Object.DontDestroyOnLoad(icon);

            var entry = new ActionIconEntry(mapNo, position, icon, color, popupText, onOpen, onCreated);

            if (delayed)
            {
                _entries.Add(entry);
            }

            if (immediate && ActionScene.initialized && ActionScene.instance.Player?.mapNo == mapNo)
            {
                SpawnActionPoint(entry, 100);
            }

            return(Disposable.Create(() =>
            {
                _entries.Remove(entry);
                entry.Dispose();
            }));
        }
Example #2
0
        public static IDisposable AddActionIcon(int mapNo, Vector3 position, Sprite iconOn, Sprite iconOff, Action onOpen, Action <TriggerEnterExitEvent> onCreated = null, bool delayed = true, bool immediate = false)
        {
            if (iconOn == null)
            {
                throw new ArgumentNullException(nameof(iconOn));
            }
            if (iconOff == null)
            {
                throw new ArgumentNullException(nameof(iconOff));
            }
            if (onOpen == null)
            {
                throw new ArgumentNullException(nameof(onOpen));
            }

            Object.DontDestroyOnLoad(iconOn);
            Object.DontDestroyOnLoad(iconOff);

            var entry = new ActionIconEntry(mapNo, position, iconOn, iconOff, onOpen, onCreated);

            if (delayed)
            {
                _entries.Add(entry);
            }

            if (immediate && Game.IsInstance() && Game.Instance.actScene != null && mapNo == Game.Instance.actScene.Player?.mapNo)
            {
                SpawnActionPoint(entry, 100);
            }

            return(Disposable.Create(() =>
            {
                _entries.Remove(entry);
                entry.Dispose();
            }));
        }
        private static void SpawnActionPoint(ActionIconEntry iconEntry, int created)
        {
            var inst = CommonLib.LoadAsset <GameObject>("map/playeractionpoint/00.unity3d", "PlayerActionPoint_05", true);

            inst.gameObject.name = "CustomActionPoint_" + created;
            var parent = GameObject.Find("Map/ActionPoints");

            inst.transform.SetParent(parent.transform, true);

            var pap            = inst.GetComponentInChildren <PlayerActionPoint>();
            var iconRootObject = pap.gameObject;

            pap.gameObject.name = inst.name;
            var iconRootTransform = pap.transform;

            var rendererIcon = pap.renderers.Reverse().First(x =>
            {
                var tex = x.material.mainTexture;
                return(tex.width == 256 && tex.height == 256);
            });
            var animator = pap.animator;

            var renderers = pap.renderers;       //iconRootTransform.GetComponentsInChildren<MeshRenderer>();
            var particles = pap.particleSystems; //iconRootTransform.GetComponentsInChildren<ParticleSystem>();

            KoikatuAPI.Assert(particles.Length == 3, "SpawnActionPoint particles.Length == 3 failed");

            pap.gameObject.layer = LayerMask.NameToLayer("Action/ActionPoint");

            foreach (Transform child in pap.transform.parent)
            {
                if (child != pap.transform)
                {
                    Object.Destroy(child.gameObject);
                }
            }
            Object.DestroyImmediate(pap, false);

            iconRootTransform.position = iconEntry.Position;

            // Set color to pink
            var pointColor = iconEntry.Color;

            foreach (var rend in renderers)
            {
                rend.material.color = pointColor;
            }
#pragma warning disable 618
            foreach (var rend in particles)
            {
                rend.startColor = pointColor;
            }
#pragma warning restore 618

            // Initial animation state
            particles[0].Play();
            particles[1].Stop();
            particles[2].Stop();

            // Hook up event/anim logic
            var evt = iconRootObject.AddComponent <TriggerEnterExitEvent>();
            rendererIcon.material.mainTexture = iconEntry.Icon;
            var playerInRange = false;
            evt.onTriggerEnter += c =>
            {
                if (!c.CompareTag("Player"))
                {
                    return;
                }
                playerInRange = true;
                animator.Play(PAP.Assist.Animation.SpinState);
                Utils.Sound.Play(Manager.Sound.Type.GameSE2D, Utils.Sound.SEClipTable[0x38], 0f);
                c.GetComponent <Player>().actionPointList.Add(evt);
                ActionScene.instance.actionChangeUI.Set(ActionChangeUI.ActionType.Shop);
                ActionScene.instance.actionChangeUI._text.text = iconEntry.PopupText;
                particles[0].Stop();
                particles[1].Play();
                particles[2].Play();
            };
            evt.onTriggerExit += c =>
            {
                if (!c.CompareTag("Player"))
                {
                    return;
                }
                playerInRange = false;
                animator.Play(PAP.Assist.Animation.IdleState);
                c.GetComponent <Player>().actionPointList.Remove(evt);
                ActionScene.instance.actionChangeUI.Remove(ActionChangeUI.ActionType.Shop);
                particles[0].Play();
                particles[1].Stop();
                particles[2].Stop();
            };

            evt.UpdateAsObservable()
            .Subscribe(_ =>
            {
                // Hide in H scenes and other places
                var isVisible = !Game.IsRegulate(true) && ActionScene.initialized;

                if (isVisible)
                {
                    var asi   = ActionScene.instance;
                    isVisible = asi.regulate == 0 && (asi.AdvScene == null || !asi.AdvScene.gameObject.activeSelf) && !TalkScene.isPaly;
                }

                if (renderers[0].enabled != isVisible)
                {
                    foreach (var renderer in renderers)
                    {
                        renderer.enabled = isVisible;
                    }

                    if (!isVisible)
                    {
                        particles[0].Stop();
                        particles[1].Stop();
                        particles[2].Stop();
                    }
                    else
                    {
                        particles[0].Play();
                        particles[1].Stop();
                        particles[2].Stop();
                    }
                }

                // Check if player clicked this point
                if (isVisible && playerInRange && ActionInput.isAction && !ActionScene.instance.Player.isActionNow)
                {
                    iconEntry.OnOpen();
                }
            })
            .AddTo(evt);

            iconEntry.Instance = inst;

            iconEntry.OnCreated?.Invoke(evt);
        }
Example #4
0
        private static void SpawnActionPoint(ActionIconEntry iconEntry, int created)
        {
            var inst = CommonLib.LoadAsset <GameObject>("map/playeractionpoint/00.unity3d", "PlayerActionPoint_05", true);

            inst.gameObject.name = "CustomActionPoint_" + created;
            var parent = GameObject.Find("Map/ActionPoints");

            inst.transform.SetParent(parent.transform, true);

            var pap               = inst.GetComponentInChildren <PlayerActionPoint>();
            var iconRootObject    = pap.gameObject;
            var iconRootTransform = pap.transform;

            Object.DestroyImmediate(pap, false);

            iconRootTransform.position = iconEntry.Position;

            var evt          = iconRootObject.AddComponent <TriggerEnterExitEvent>();
            var animator     = iconRootObject.GetComponentInChildren <Animator>();
            var rendererIcon = iconRootObject.GetComponentInChildren <SpriteRenderer>();

            rendererIcon.sprite = iconEntry.IconOff;
            rendererIcon.flipX  = true; // Needed to fix images being flipped
            var playerInRange = false;

            evt.onTriggerEnter += c =>
            {
                if (!c.CompareTag("Player"))
                {
                    return;
                }
                playerInRange = true;
                animator.Play("icon_action");
                rendererIcon.sprite = iconEntry.IconOn;
                c.GetComponent <Player>().actionPointList.Add(evt);
            };
            evt.onTriggerExit += c =>
            {
                if (!c.CompareTag("Player"))
                {
                    return;
                }
                playerInRange = false;
                animator.Play("icon_stop");
                rendererIcon.sprite = iconEntry.IconOff;
                c.GetComponent <Player>().actionPointList.Remove(evt);
            };

            var game   = Singleton <Game> .Instance;
            var player = game.actScene.Player;

            evt.UpdateAsObservable()
            .Subscribe(_ =>
            {
                // Hide in H scenes and other places
                var isVisible = !game.IsRegulate(true) && !game.actScene.isEventNow;
                if (rendererIcon.enabled != isVisible)
                {
                    rendererIcon.enabled = isVisible;
                }

                // Check if player clicked this point
                if (isVisible && playerInRange && ActionInput.isAction && !player.isActionNow)
                {
                    iconEntry.OnOpen();
                }
            })
            .AddTo(evt);

            iconEntry.Instance = inst;

            iconEntry.OnCreated?.Invoke(evt);
        }