feat: created character awareness node

This commit is contained in:
Sara 2024-05-02 15:05:08 +02:00
parent ca53fb4ae1
commit c689d16dfd
2 changed files with 68 additions and 0 deletions

View file

@ -0,0 +1,43 @@
#include "character_awareness.hpp"
#include "character_actor.hpp"
#include "utils/godot_macros.h"
#include <godot_cpp/variant/callable_method_pointer.hpp>
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<CharacterActor>(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<CharacterActor>(node);
if(actor) {
this->actor_awareness.erase(actor);
this->emit_signal("lose_actor", actor);
}
}
}

View file

@ -0,0 +1,25 @@
#ifndef CHARACTER_AWARENESS_HPP
#define CHARACTER_AWARENESS_HPP
#include "character_actor.hpp"
#include <godot_cpp/classes/area3d.hpp>
#include <godot_cpp/templates/hash_set.hpp>
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<CharacterActor*> actor_awareness{};
// not a character :( cringe
HashSet<Node*> node_awareness{};
};
}
#endif // !CHARACTER_AWARENESS_HPP