feat: enemy death and damage effects

This commit is contained in:
Sara 2025-07-23 00:24:52 +02:00
parent 2134fcae92
commit 1a8c64806d
13 changed files with 96 additions and 7 deletions

View file

@ -2,7 +2,9 @@
#include "macros.h"
#include "npc_unit.h"
void EnemyBody::_bind_methods() {}
void EnemyBody::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_movement_direction", "direction"), &self_type::set_movement_direction);
}
void EnemyBody::ready() {
this->fsm = cast_to<StateMachine>(get_node(NodePath("%StateMachine")));

View file

@ -5,6 +5,7 @@
void Hitbox::_bind_methods() {
BIND_HPROPERTY(Variant::OBJECT, health, PROPERTY_HINT_NODE_TYPE, "HealthStatus");
BIND_PROPERTY(Variant::FLOAT, damage_modifier);
BIND_HPROPERTY(Variant::OBJECT, impact_effect, PROPERTY_HINT_RESOURCE_TYPE, "PackedScene");
}
void Hitbox::set_health(HealthStatus *value) {
@ -22,3 +23,11 @@ void Hitbox::set_damage_modifier(float value) {
float Hitbox::get_damage_modifier() const {
return this->damage_modifier;
}
void Hitbox::set_impact_effect(Ref<PackedScene> effect) {
this->impact_effect = effect;
}
Ref<PackedScene> Hitbox::get_impact_effect() const {
return this->impact_effect;
}

View file

@ -2,6 +2,7 @@
#define HITBOX_H
#include "scene/3d/physics/area_3d.h"
#include "scene/resources/packed_scene.h"
class HealthStatus;
class Hitbox : public Area3D {
@ -14,9 +15,13 @@ public:
void set_damage_modifier(float value);
float get_damage_modifier() const;
void set_impact_effect(Ref<PackedScene> scene);
Ref<PackedScene> get_impact_effect() const;
private:
HealthStatus *health{ nullptr };
float damage_modifier{ 1.f };
Ref<PackedScene> impact_effect{};
};
#endif // !HITBOX_H

View file

@ -14,9 +14,13 @@ void HitscanMuzzle::instantiate_impact_effect() {
if (get_collider() == nullptr) {
return;
}
Node *effect_as_node{ this->impact_effect->instantiate() };
Ref<PackedScene> effect_scene{ get_collider()->call("get_impact_effect") };
if (!effect_scene.is_valid()) {
effect_scene = this->impact_effect;
}
Node *effect_as_node{ effect_scene->instantiate() };
if (Node3D * effect{ cast_to<Node3D>(effect_as_node) }) {
get_tree()->get_current_scene()->add_child(effect);
cast_to<Node>(get_collider())->add_child(effect);
Vector3 const point{ get_collision_point() };
Vector3 const normal{ get_collision_normal() };
Vector3 const position{ get_global_position() };