diff --git a/modules/wave_survival/enemy_body.cpp b/modules/wave_survival/enemy_body.cpp index b1005b5b..d8bccc89 100644 --- a/modules/wave_survival/enemy_body.cpp +++ b/modules/wave_survival/enemy_body.cpp @@ -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(get_node(NodePath("%StateMachine"))); diff --git a/modules/wave_survival/hitbox.cpp b/modules/wave_survival/hitbox.cpp index 8dc826da..eb2e37a8 100644 --- a/modules/wave_survival/hitbox.cpp +++ b/modules/wave_survival/hitbox.cpp @@ -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 effect) { + this->impact_effect = effect; +} + +Ref Hitbox::get_impact_effect() const { + return this->impact_effect; +} diff --git a/modules/wave_survival/hitbox.h b/modules/wave_survival/hitbox.h index b87bddf3..1035832f 100644 --- a/modules/wave_survival/hitbox.h +++ b/modules/wave_survival/hitbox.h @@ -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 scene); + Ref get_impact_effect() const; + private: HealthStatus *health{ nullptr }; float damage_modifier{ 1.f }; + Ref impact_effect{}; }; #endif // !HITBOX_H diff --git a/modules/wave_survival/hitscan_muzzle.cpp b/modules/wave_survival/hitscan_muzzle.cpp index 74eae655..d08e09c1 100644 --- a/modules/wave_survival/hitscan_muzzle.cpp +++ b/modules/wave_survival/hitscan_muzzle.cpp @@ -14,9 +14,13 @@ void HitscanMuzzle::instantiate_impact_effect() { if (get_collider() == nullptr) { return; } - Node *effect_as_node{ this->impact_effect->instantiate() }; + Ref 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(effect_as_node) }) { - get_tree()->get_current_scene()->add_child(effect); + cast_to(get_collider())->add_child(effect); Vector3 const point{ get_collision_point() }; Vector3 const normal{ get_collision_normal() }; Vector3 const position{ get_global_position() }; diff --git a/project/assets/animations/enemies/wretched/RESET.res b/project/assets/animations/enemies/wretched/RESET.res index 8b490f8d..6fc4b591 100644 Binary files a/project/assets/animations/enemies/wretched/RESET.res and b/project/assets/animations/enemies/wretched/RESET.res differ diff --git a/project/assets/animations/enemies/wretched/attack.res b/project/assets/animations/enemies/wretched/attack.res index 0e7540b0..93dcb311 100644 Binary files a/project/assets/animations/enemies/wretched/attack.res and b/project/assets/animations/enemies/wretched/attack.res differ diff --git a/project/assets/animations/enemies/wretched/ready.res b/project/assets/animations/enemies/wretched/ready.res index 31f7808a..2f6a67c9 100644 Binary files a/project/assets/animations/enemies/wretched/ready.res and b/project/assets/animations/enemies/wretched/ready.res differ diff --git a/project/assets/models/enemies/model_scenes/wretched.tscn b/project/assets/models/enemies/model_scenes/wretched.tscn index ecd3a187..03900125 100644 --- a/project/assets/models/enemies/model_scenes/wretched.tscn +++ b/project/assets/models/enemies/model_scenes/wretched.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=6 format=3 uid="uid://crtgy2rph5to2"] +[gd_scene load_steps=7 format=3 uid="uid://crtgy2rph5to2"] [ext_resource type="PackedScene" uid="uid://ho7wwawj6s65" path="res://assets/models/enemies/wretched.blend" id="1_w0sx6"] +[ext_resource type="PackedScene" uid="uid://clbq43giddldc" path="res://objects/effects/blood_effect.tscn" id="2_a12c4"] [sub_resource type="BoxShape3D" id="BoxShape3D_w0sx6"] size = Vector3(0.35351563, 0.8721161, 0.29003906) @@ -21,6 +22,7 @@ transform = Transform3D(1, 2.1910389e-16, -2.2202524e-16, -2.2202514e-16, 0.9999 collision_layer = 6 collision_mask = 0 monitoring = false +impact_effect = ExtResource("2_a12c4") [node name="CollisionShape3D2" type="CollisionShape3D" parent="Character/Skeleton3D/Hitbox" index="0"] transform = Transform3D(1, 5.875464e-21, 0, 6.2038546e-25, 1.0000037, 0, 0, 0, 1.0000037, -2.2362435e-16, 0.35283393, -0.013339132) @@ -36,6 +38,7 @@ transform = Transform3D(1, 2.1910389e-16, -2.2202524e-16, -2.2202514e-16, 0.9999 collision_layer = 4 collision_mask = 0 monitoring = false +impact_effect = ExtResource("2_a12c4") [node name="CollisionShape3D" type="CollisionShape3D" parent="Character/Skeleton3D/SpineAttach/Hitbox" index="0"] transform = Transform3D(1, -2.2202515e-16, 2.1910396e-16, 2.1910385e-16, 0.9999122, 0.0132439565, -2.2202522e-16, -0.013243958, 0.99991226, 0.0023498535, 1.1967317, -0.0032694251) @@ -52,6 +55,7 @@ collision_layer = 4 collision_mask = 0 monitoring = false damage_modifier = 2.0 +impact_effect = ExtResource("2_a12c4") [node name="CollisionShape3D" type="CollisionShape3D" parent="Character/Skeleton3D/HeadAttach/Hitbox" index="0"] transform = Transform3D(1, -2.2202515e-16, 2.1910393e-16, 2.1910723e-16, 0.9999161, 0.013243863, -2.2202641e-16, -0.013243858, 0.9999161, -7.644832e-17, 1.3035276, -0.01432839) diff --git a/project/assets/models/enemies/wretched.blend b/project/assets/models/enemies/wretched.blend index e90a2336..9d807b7e 100644 Binary files a/project/assets/models/enemies/wretched.blend and b/project/assets/models/enemies/wretched.blend differ diff --git a/project/assets/models/enemies/wretched.blend1 b/project/assets/models/enemies/wretched.blend1 index 432e3843..dae17f86 100644 Binary files a/project/assets/models/enemies/wretched.blend1 and b/project/assets/models/enemies/wretched.blend1 differ diff --git a/project/objects/effects/blood_effect.tscn b/project/objects/effects/blood_effect.tscn new file mode 100644 index 00000000..e663c9b1 --- /dev/null +++ b/project/objects/effects/blood_effect.tscn @@ -0,0 +1,56 @@ +[gd_scene load_steps=7 format=3 uid="uid://clbq43giddldc"] + +[sub_resource type="GDScript" id="GDScript_abt0s"] +script/source = "extends Node3D + +func _init(): + set_disable_scale(true) + +func _ready(): + $GPUParticles3D.emitting = true +" + +[sub_resource type="Curve" id="Curve_abt0s"] +_data = [Vector2(0.55064934, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), -3.5361242, 0.0, 0, 0] +point_count = 2 + +[sub_resource type="CurveTexture" id="CurveTexture_rtbd5"] +curve = SubResource("Curve_abt0s") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_abt0s"] +direction = Vector3(0, 0, -1) +spread = 5.0 +initial_velocity_min = 1.0 +initial_velocity_max = 3.0 +scale_curve = SubResource("CurveTexture_rtbd5") + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_rtbd5"] +shading_mode = 2 +diffuse_mode = 1 +specular_mode = 2 +albedo_color = Color(0.7921569, 0.09803922, 0.09019608, 1) + +[sub_resource type="QuadMesh" id="QuadMesh_qrff5"] +material = SubResource("StandardMaterial3D_rtbd5") +size = Vector2(0.3, 0.3) + +[node name="BloodEffect" type="Node3D"] +script = SubResource("GDScript_abt0s") + +[node name="Timer" type="Timer" parent="."] +wait_time = 0.2 +one_shot = true +autostart = true + +[node name="GPUParticles3D" type="GPUParticles3D" parent="."] +emitting = false +amount = 10 +lifetime = 0.2 +one_shot = true +explosiveness = 0.6 +fixed_fps = 10 +transform_align = 3 +process_material = SubResource("ParticleProcessMaterial_abt0s") +draw_pass_1 = SubResource("QuadMesh_qrff5") + +[connection signal="timeout" from="Timer" to="." method="queue_free"] diff --git a/project/objects/enemies/enemy_wretched.tscn b/project/objects/enemies/enemy_wretched.tscn index e9c700b5..5dbf46e2 100644 --- a/project/objects/enemies/enemy_wretched.tscn +++ b/project/objects/enemies/enemy_wretched.tscn @@ -6,7 +6,10 @@ script/source = "extends EnemyWretched func _on_health_status_death() -> void: - queue_free(); + %StateMachine.set_process(false) + $wretched/AnimationPlayer.play(\"death\") + $CollisionShape3D.disabled = true + set_movement_direction(Vector2()) " [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_ng1ul"] @@ -20,9 +23,15 @@ script = SubResource("GDScript_qot2n") [node name="Hitbox" parent="wretched/Character/Skeleton3D" index="2" node_paths=PackedStringArray("health")] health = NodePath("../../../../HealthStatus") +[node name="SpineAttach" parent="wretched/Character/Skeleton3D" index="3"] +transform = Transform3D(1, -2.2202518e-16, 2.1910394e-16, 2.1910388e-16, 0.9999122, 0.013243958, -2.220252e-16, -0.01324396, 0.99991226, -4.1256417e-17, 1.1546816, -0.0027124756) + [node name="Hitbox" parent="wretched/Character/Skeleton3D/SpineAttach" index="0" node_paths=PackedStringArray("health")] health = NodePath("../../../../../HealthStatus") +[node name="HeadAttach" parent="wretched/Character/Skeleton3D" index="4"] +transform = Transform3D(0.9999988, -0.0007823897, 0.0013344375, 0.0007271601, 0.99916273, 0.04089782, -0.0013653187, -0.040896803, 0.9991622, -1.3069549e-16, 1.5574794, -0.004068734) + [node name="Hitbox" parent="wretched/Character/Skeleton3D/HeadAttach" index="0" node_paths=PackedStringArray("health")] health = NodePath("../../../../../HealthStatus") diff --git a/project/objects/units/unit_4_wretched.tscn b/project/objects/units/unit_4_wretched.tscn index fc9b8f8c..be219311 100644 --- a/project/objects/units/unit_4_wretched.tscn +++ b/project/objects/units/unit_4_wretched.tscn @@ -8,10 +8,10 @@ transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, -1, -1.1853347, 0.023195954, -0.8597343) [node name="EnemyWretched5" parent="." instance=ExtResource("1_l77gx")] -transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, -1, 0.3304333, 0.023195954, 1.0620495) +transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, -1, 0.30714047, 0.023195954, 0.58812845) [node name="EnemyWretched6" parent="." instance=ExtResource("1_l77gx")] -transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, -1, 0.026455224, 0.023195954, -1.7789332) +transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, -1, 0.05460906, 0.023195954, -1.4555124) [node name="EnemyWretched7" parent="." instance=ExtResource("1_l77gx")] transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, -1, 0.054681122, 0.023195954, -0.4100113)