using Godot; using System.Collections.Generic; namespace Rokojori { [Tool] [GlobalClass,Icon("res://addons/rokojori_action_library/Icons/RJSensor.svg")] public partial class SensorManager: Node { [Export] public bool initializeOnReady = true; [Export] public Sensor[] sensors; [Export] public SensorGroup[] sensorGroups; [Export] public bool processSensors = false; List runners = new List(); Dictionary sensorToRunner = new Dictionary(); public override void _Ready() { if ( ! initializeOnReady ) { return; } CreateRunners(); } public override void _Process( double delta ) { if ( Engine.IsEditorHint() || ! processSensors ) { return; } runners.ForEach( r => r.Update( (float) delta ) ); } public void Register( Sensor s, SensorInputHandler sih ) { var sensorRunner = sensorToRunner[ s ]; if ( sensorRunner.listeners.Contains( sih ) ) { return; } sensorRunner.listeners.Add( sih ); } public void Unregister( Sensor s, SensorInputHandler sih ) { var sensorRunner = sensorToRunner[ s ]; sensorRunner.listeners.Remove( sih ); } public static void Register( SensorInputHandler handler, params Sensor[] sensors ) { var sm = Unique.Get(); foreach ( var s in sensors ) { if ( s == null ) { continue; } ( handler as Node ).LogInfo( "Registrating" ); sm.Register( s, handler ); } } public static void Unregister( SensorInputHandler handler, params Sensor[] sensors ) { var sm = Unique.Get(); foreach ( var s in sensors ) { if ( s == null ) { continue; } ( handler as Node ).LogInfo( "Unregistrating" ); sm.Unregister( s, handler ); } } void CreateRunners() { if ( sensors == null ) { sensors = new Sensor[]{}; } if ( sensorGroups == null ) { sensorGroups = new SensorGroup[]{}; } foreach ( var s in sensors ) { runners.Add( new SensorRunner( s ) ); } foreach ( var g in sensorGroups ) { foreach ( var s in g.sensors ) { runners.Add( new SensorRunner( s ) ); } } runners.ForEach( r => sensorToRunner[ r.sensor ] = r ); this.LogInfo( "Created runners:", runners.Count ); } } }