using Godot; namespace Babushka.scripts.CSharp.Common.CharacterControls; public partial class InteractionArea2D : Node2D { [Export] private Area2D _area; [Export] private Label _label; [Export] private bool _useOutline = true; [Export] private ShaderMaterial _outlineMaterial; [Export] private bool _useSprite = true; [Export] 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; set; } = true; public override void _Ready() { if(_useSprite && _useOutline) _backupMaterial = _spriteToOutline.Material; } public void OnPlayerEntered(Node2D player) { if (!IsActive) return; if(_showLabel) _label.Show(); if (!_useSprite || !_useOutline) return; _spriteToOutline.Material = _outlineMaterial; } public void OnPlayerExited(Node2D player) { if (!IsActive) return; _label.Hide(); if (!_useSprite || !_useOutline) return; _spriteToOutline.Material = _backupMaterial; } public override void _Input(InputEvent @event) { if (!IsActive) return; if (@event.IsAction("interact") && @event.IsPressed() && _area.HasOverlappingBodies()) { _label.Hide(); if (_useSprite && _useOutline) _spriteToOutline.Material = _backupMaterial; EmitSignal(SignalName.InteractedTool, _id); EmitSignal(SignalName.Interacted); } } public void SetSpriteActiveState(bool success, int id) // TODO: remove { GD.PrintErr("SetSpriteActiveState is being called."); if(!IsActive) return; } public void ToggleActive() { IsActive = !IsActive; _label.Hide(); } }