feat: created character awareness node
This commit is contained in:
parent
ca53fb4ae1
commit
c689d16dfd
43
src/character_awareness.cpp
Normal file
43
src/character_awareness.cpp
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
25
src/character_awareness.hpp
Normal file
25
src/character_awareness.hpp
Normal 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
|
Loading…
Reference in a new issue