dirt-racer/src/damage_area.cpp

45 lines
1.4 KiB
C++

#include "damage_area.hpp"
#include "godot_cpp/classes/global_constants.hpp"
#include "utils/godot_macros.h"
namespace godot {
void DamageArea::_bind_methods() {
#define CLASSNAME DamageArea
GDPROPERTY_HINTED(target_classes, Variant::ARRAY, PROPERTY_HINT_ARRAY_TYPE, "StringName");
}
void DamageArea::_enter_tree() { GDGAMEONLY();
this->connect("body_entered", callable_mp(this, &DamageArea::body_entered));
if(this->has_node("AnimationPlayer"))
this->anim = this->get_node<AnimationPlayer>("AnimationPlayer");
this->car = Object::cast_to<EnemyCar>(this->get_parent());
}
void DamageArea::_process(double delta_time) {
if(this->anim && this->anim->get_current_animation_position() >= this->anim->get_current_animation_length())
this->queue_free();
}
void DamageArea::body_entered(Node3D *node) {
if(this->target_classes.has(node->get_class()) && (!this->car || this->car->get_current_speed() > 30)) {
node->call("damage");
}
}
void DamageArea::set_target_classes(Array array) {
this->target_classes.clear();
for(int i = 0; i < array.size(); ++i) {
if(array[i].get_type() == Variant::STRING_NAME && !this->target_classes.has(array[i]))
this->target_classes.push_back(array[i]);
else this->target_classes.push_back("");
}
}
Array DamageArea::get_target_classes() const {
Array a{};
for(StringName const &name : this->target_classes)
a.push_back(name);
return a;
}
}