using System; using System.Linq; using Babushka.scripts.CSharp.Common.Util; using Godot; namespace Babushka.scripts.CSharp.Common.CharacterControls; public partial class InteractionArea2D : Node2D { [Export] private Area2D _area; [Export] private Label _label; [Export] private bool _active = true; [Export] private bool _useOutline = true; [Export] private ShaderMaterial _outlineMaterial; //[Export] private bool _useSprite = true; [Export(PropertyHint.ArrayType)] private CanvasItem[] _spriteToOutline = []; [Export] private bool _showLabel = true; [Export] private int _id = -1; // TODO: remove private Material[] _backupMaterial; [Signal] public delegate void InteractedToolEventHandler(int id); // TODO: remove [Signal] public delegate void InteractedEventHandler(); public bool IsActive { get => _active; set => _active = value; } public override void _Ready() { if (_useOutline) { try { _backupMaterial = _spriteToOutline.Select(s => s.Material).ToArray(); } catch (Exception exception) { GD.PrintErr($"No sprite to outline found on: {GetParent().Name}" + exception.Message); } } } public void OnPlayerEntered(Node2D player) { if (!_active) return; if (_showLabel) _label.Show(); if (!_useOutline) return; _spriteToOutline.ForEach(s => s.Material = _outlineMaterial); } public void OnPlayerExited(Node2D player) { if (!_active) return; _label.Hide(); if (!_useOutline) return; //_spriteToOutline.Material = _backupMaterial; for (var i = 0; i < _spriteToOutline.Length; i++) { _spriteToOutline[i].Material = _backupMaterial[i]; } } public override void _Input(InputEvent @event) { if (!_active) return; if (@event.IsAction("interact") && @event.IsPressed()) { if (_area.HasOverlappingBodies()) { _label.Hide(); if (_useOutline) { for (var i = 0; i < _spriteToOutline.Length; i++) { _spriteToOutline[i].Material = _backupMaterial[i]; } } EmitSignal(SignalName.InteractedTool, _id); EmitSignal(SignalName.Interacted); } } } public void SetSpriteActiveState(bool success, int id) // TODO: remove { GD.PrintErr("SetSpriteActiveState is being called."); if (!_active) return; } public void ToggleActive() { _active = !_active; _label.Hide(); } }