using Godot; using System; using Cirno.Scripts; using Cirno.Scripts.Components.FSM._3DPlayer; using Godot.Collections; [Tool] public partial class TriggerArea : Area3D { [Export] public string Target { get; private set; } [Export] public string TargetFunc { get; private set; } [Export] public string TargetName { get; private set; } [Export] public ActivationType ActivationType { get; private set; } = ActivationType.Toggle; public enum TriggerStates { READY, USED } private TriggerStates _triggerState = TriggerStates.READY; private float _timeout = 0f; private Node _lastActivator; public void _func_godot_apply_properties(Dictionary props) { Target = props["target"]; TargetFunc = props["targetfunc"]; TargetName = props["targetname"]; if (props.TryGetValue("activationtype", out var type)) { var t = Enum.TryParse(type, true, out ActivationType activationType); if (t) { ActivationType = activationType; } } // TODO: Oneshot } public void _on_ent_entered(Node ent) { GD.Print($"Trigger entered by {ent.Name}"); if (_triggerState is TriggerStates.READY) { if (ent is IsoPlayerFSMProxy) { GD.Print($"Entity {ent} is player, trying to use"); Use(); } else { GD.Print($"{ent.Name} was not interaction controller"); } } else { GD.Print("Trigger was not ready"); } } public void Use() { if (_triggerState is TriggerStates.READY) { _triggerState = TriggerStates.USED; ToggleCollision(false); UseTargets(this, Target); } } 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.Activate(ActivationType); } } } private void ToggleCollision(bool toggle) { } // Called when the node enters the scene tree for the first time. public override void _Ready() { if (Engine.IsEditorHint()) return; //TBGAME.set_targetname(self, targetname) if (!string.IsNullOrEmpty(TargetName)) { this.AddToGroup(TargetName); } } public TriggerArea() { Monitoring = true; Monitorable = false; BodyEntered += _on_ent_entered; //AreaEntered += _on_ent_entered; } }