using System.Collections.Generic; using Godot; using Rokojori; namespace Rokojori { [Tool] [GlobalClass, Icon("res://addons/rokojori_action_library/Icons/OnEvent.svg") ] public partial class OnCollision:Node { [Export] public Area3D area; [Export] public Selector selector; [Export] public Action onEntered; [Export] public Action onInside; [Export] public Action onExit; Dictionary _inside = new Dictionary(); public override void _Ready() { if ( area == null ) { return; } area.AreaEntered += TriggerOnEnter; area.BodyEntered += TriggerOnEnter; area.AreaExited += TriggerOnExited; area.BodyExited += TriggerOnExited; } void TriggerOnEnter( Node n ) { if ( ! Selector.IsSelecting( selector, n ) ) { return; } Action.Trigger( onEntered ); if ( onInside == null ) { return; } var tm = Unique.Get(); if ( tm == null ) { return; } var callback = ()=>{ Action.Trigger( onInside ); }; _inside[ n ] = callback; tm.AddProcessCallback( callback ); } void TriggerOnExited( Node n ) { if ( ! Selector.IsSelecting( selector, n ) ) { return; } Action.Trigger( onExit ); if ( ! _inside.ContainsKey( n ) ) { return; } var tm = Unique.Get(); if ( tm == null ) { return; } var callback = _inside[ n ]; tm.RemoveProcessCallback( callback ); _inside.Remove( n ); } } }