feat: implemented damage box
This commit is contained in:
parent
a734eb8b20
commit
2c59572e40
47
modules/wave_survival/damage_box.cpp
Normal file
47
modules/wave_survival/damage_box.cpp
Normal file
|
@ -0,0 +1,47 @@
|
|||
#include "damage_box.h"
|
||||
#include "health_status.h"
|
||||
#include "hitbox.h"
|
||||
|
||||
void DamageBox::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("attack_motion_begin"), &self_type::attack_motion_begin);
|
||||
ClassDB::bind_method(D_METHOD("attack_motion_end"), &self_type::attack_motion_end);
|
||||
}
|
||||
|
||||
void DamageBox::attack_motion_begin() {
|
||||
set_monitoring(true);
|
||||
}
|
||||
|
||||
void DamageBox::attack_motion_end() {
|
||||
this->already_hit.clear();
|
||||
set_monitoring(true);
|
||||
}
|
||||
|
||||
void DamageBox::on_body_entered(Node3D *node) {
|
||||
if (Hitbox * box{ cast_to<Hitbox>(node) }) {
|
||||
if (!this->already_hit.has(box->get_health())) {
|
||||
box->get_health()->damage(this->damage * box->get_damage_modifier());
|
||||
this->already_hit.insert(box->get_health());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DamageBox::_notification(int what) {
|
||||
if (Engine::get_singleton()->is_editor_hint()) {
|
||||
return;
|
||||
}
|
||||
switch (what) {
|
||||
default:
|
||||
return;
|
||||
case NOTIFICATION_ENTER_TREE:
|
||||
connect("body_entered", callable_mp(this, &self_type::on_body_entered));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void DamageBox::set_damage(int amount) {
|
||||
this->damage = amount;
|
||||
}
|
||||
|
||||
int DamageBox::get_damage() const {
|
||||
return this->damage;
|
||||
}
|
27
modules/wave_survival/damage_box.h
Normal file
27
modules/wave_survival/damage_box.h
Normal file
|
@ -0,0 +1,27 @@
|
|||
#ifndef DAMAGE_BOX_H
|
||||
#define DAMAGE_BOX_H
|
||||
|
||||
#include "core/templates/hash_set.h"
|
||||
#include "scene/3d/physics/area_3d.h"
|
||||
class HealthStatus;
|
||||
|
||||
class DamageBox : public Area3D {
|
||||
GDCLASS(DamageBox, Area3D);
|
||||
static void _bind_methods();
|
||||
void attack_motion_begin();
|
||||
void attack_motion_end();
|
||||
void on_body_entered(Node3D *body);
|
||||
|
||||
protected:
|
||||
void _notification(int what);
|
||||
|
||||
public:
|
||||
void set_damage(int amount);
|
||||
int get_damage() const;
|
||||
|
||||
private:
|
||||
int damage{ 1 };
|
||||
HashSet<HealthStatus *> already_hit{};
|
||||
};
|
||||
|
||||
#endif // !DAMAGE_BOX_H
|
|
@ -1,6 +1,7 @@
|
|||
#include "register_types.h"
|
||||
|
||||
#include "core/object/class_db.h"
|
||||
#include "wave_survival/damage_box.h"
|
||||
#include "wave_survival/enemies/enemy_wretched.h"
|
||||
#include "wave_survival/enemy_body.h"
|
||||
#include "wave_survival/health_status.h"
|
||||
|
@ -41,6 +42,7 @@ void initialize_wave_survival_module(ModuleInitializationLevel p_level) {
|
|||
GDREGISTER_CLASS(WretchedAttackState);
|
||||
GDREGISTER_CLASS(PlayerDetector);
|
||||
GDREGISTER_CLASS(Hitbox);
|
||||
GDREGISTER_CLASS(DamageBox);
|
||||
}
|
||||
|
||||
void uninitialize_wave_survival_module(ModuleInitializationLevel p_level) {
|
||||
|
|
Loading…
Reference in a new issue