#ifndef TURRET_HPP #define TURRET_HPP #include #include #include #include #include namespace godot { enum class TurretState { WAITING = 0x0, LOCKING = 0x1, CHARGING, FIRING }; class Turret : public StaticBody3D { GDCLASS(Turret, StaticBody3D); static void _bind_methods(); public: virtual void _enter_tree() override; virtual void _process(double delta_time) override; void awareness_changed(); Node3D *select_target(); void lead_target(double delta_time); void detect_node(Node3D *node); void lose_node(Node3D *node); void try_next_state(); void create_beam(); void beam_ended(); void set_attack_classes(Array array); Array get_attack_classes() const; void set_beam_scene(Ref scene); Ref get_beam_scene() const; private: Node3D *current_target{nullptr}; bool invert_attack_classes{false}; Vector3 aim_position{0.f, 0.f, 0.f}; Vector3 last_target_position{0.f, 0.f, 0.f}; float last_state_switch{0.f}; float lead_distance{1.5f}; Node3D *gun_node{nullptr}; TurretState state{TurretState::LOCKING}; Vector attack_classes{}; HashSet awareness{}; Ref beam_scene{}; float fire_time{2.0f}; float charge_time{0.3f}; float lock_time{2.0f}; }; } #endif // !TURRET_HPP