diff --git a/src/character_awareness.cpp b/src/character_awareness.cpp new file mode 100644 index 0000000..ab8faac --- /dev/null +++ b/src/character_awareness.cpp @@ -0,0 +1,43 @@ +#include "character_awareness.hpp" +#include "character_actor.hpp" +#include "utils/godot_macros.h" +#include + +namespace godot { +void CharacterAwareness::_bind_methods() { +#define CLASSNAME CharacterAwareness + GDSIGNAL("detect_actor", PropertyInfo(Variant::OBJECT, "character", PROPERTY_HINT_NODE_TYPE, "CharacterActor")); + GDSIGNAL("lose_actor", PropertyInfo(Variant::OBJECT, "character", PROPERTY_HINT_NODE_TYPE, "CharacterActor")); + GDSIGNAL("detect_node", PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_NODE_TYPE, "Node")); + GDSIGNAL("lose_node", PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_NODE_TYPE, "Node")); +} + +void CharacterAwareness::_enter_tree() { + this->set_collision_mask(0x2); +} + +void CharacterAwareness::_ready() { + this->connect("body_entered", callable_mp(this, &CharacterAwareness::on_body_entered)); + this->connect("body_exited", callable_mp(this, &CharacterAwareness::on_body_exited)); +} + +void CharacterAwareness::on_body_entered(Node *node) { + this->node_awareness.insert(node); + this->emit_signal("detect_node", node); + CharacterActor *actor = Object::cast_to(node); + if(actor) { + this->actor_awareness.insert(actor); + this->emit_signal("detect_actor", actor); + } +} + +void CharacterAwareness::on_body_exited(Node *node) { + this->node_awareness.erase(node); + this->emit_signal("lose_node", node); + CharacterActor *actor = Object::cast_to(node); + if(actor) { + this->actor_awareness.erase(actor); + this->emit_signal("lose_actor", actor); + } +} +} diff --git a/src/character_awareness.hpp b/src/character_awareness.hpp new file mode 100644 index 0000000..3440fd6 --- /dev/null +++ b/src/character_awareness.hpp @@ -0,0 +1,25 @@ +#ifndef CHARACTER_AWARENESS_HPP +#define CHARACTER_AWARENESS_HPP + +#include "character_actor.hpp" +#include +#include + +namespace godot { +class CharacterAwareness : public Area3D { + GDCLASS(CharacterAwareness, Area3D); + static void _bind_methods(); +public: + virtual void _enter_tree() override; + virtual void _ready() override; + void on_body_entered(Node *node); + void on_body_exited(Node *node); +private: + // awareness of characters specifically + HashSet actor_awareness{}; + // not a character :( cringe + HashSet node_awareness{}; +}; +} + +#endif // !CHARACTER_AWARENESS_HPP