using System; using System.Collections.Generic; using RPGCore.Core.Objects; using RPGCore.ObjectModules.EventObjectModule.Events; using RPGCoreCommon.Settings; using UnityEngine; namespace RPGCore.Core { /// /// This MonoBehaviour allow any to call and .
/// Setting 's to true is required!
///
public class Trigger : MonoBehaviour { private event Action OnEnterEvent; private event Action OnExitEvent; private readonly Dictionary _collisionCounter = new(); public static Trigger AddToGameObject(GameObject go, Action onEnter, Action onExit) { go.layer = SettingsManager.Get().triggerLayer; var interactTrigger = go.AddComponent(); interactTrigger.OnEnterEvent += onEnter; interactTrigger.OnExitEvent += onExit; return interactTrigger; } internal void OnEnter(BaseObject obj) { var alreadyTouching = _collisionCounter.ContainsKey(obj); if (!alreadyTouching) _collisionCounter.Add(obj, 0); _collisionCounter[obj]++; if (!alreadyTouching) { obj.events.Register(OnClear); OnEnterEvent?.Invoke(obj); } } internal void OnExit(BaseObject obj) { if (!_collisionCounter.ContainsKey(obj)) { Debug.LogError("Object tried to leave trigger, but never entered it!", obj); return; } _collisionCounter[obj]--; if (_collisionCounter[obj] == 0) Clear(obj); } private void OnClear(TriggerClearEvent ev) { Clear(ev.obj); } private void Clear(BaseObject obj) { obj.events.Unregister(OnClear); _collisionCounter.Remove(obj); OnExitEvent?.Invoke(obj); } } }