using System.Linq; using Godot; using Godot.Collections; namespace Cirno.Scripts.Interactables; [Tool] public partial class Switch3D : Interactable3D { [Export] public string TargetGroup { get; private set; } [Export] public Node Target { get; set; } [Export] public Array Targets { get; private set; } = []; [Export] public ActivationType ActivationType { get; set; } = ActivationType.Toggle; [Signal] public delegate void OnActivatedEventHandler(ActivationType activationType); private AudioStreamPlayer _activationSound; private readonly string _activationSoundName = "ActivationSound"; public override void _Ready() { if (Engine.IsEditorHint()) return; _activationSound = GetNodeOrNull(_activationSoundName); } public void _func_godot_apply_properties(Dictionary props) { TargetGroup = props["target"]; if (props.TryGetValue("key", out var prop)) { RequirementKeys = [prop]; } //TargetFunc = props["targetfunc"]; //TargetName = props["targetname"]; } public override bool Activate(ActivationType activationType = ActivationType.Toggle) { var activationTypeToUse = activationType is ActivationType.Use ? ActivationType : activationType; if (!MeetsRequirements()) return false; _activationSound?.Play(); EmitSignal(SignalName.OnActivated, (int)activationTypeToUse); // Compatibility for old single system bool success = ActivateTarget(Target, activationTypeToUse); if (!string.IsNullOrWhiteSpace(TargetGroup)) { UseTargets(this, TargetGroup); } return Targets.Aggregate(success, (current, target) => ActivateTarget(target, activationTypeToUse) | success); } private bool ActivateTarget(Node target, ActivationType activationType = ActivationType.Toggle) { if (target is not IActivable activable) return false; activable?.Activate(activationType); return true; } private void UseTargets(Node activator, string target) { GD.Print($"Trying to use targets called: {target}"); var targetList = GetTree().GetNodesInGroup(target); foreach (var t in targetList) { //string f; GD.Print($"Trying to use {t.Name}"); if (t is IActivable activable) { GD.Print($"Activating {t.Name}"); activable.Toggle(); } } } }