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(); })); }
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); }
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); }