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