feat: fully implemented death in NpcUnit
This commit is contained in:
		
							parent
							
								
									5f61fafe7b
								
							
						
					
					
						commit
						28183fceb8
					
				| 
						 | 
					@ -19,11 +19,15 @@ void EnemyBody::on_child_added(Node *node) {
 | 
				
			||||||
void EnemyBody::ready() {
 | 
					void EnemyBody::ready() {
 | 
				
			||||||
	this->fsm = cast_to<StateMachine>(get_node(NodePath("%StateMachine")));
 | 
						this->fsm = cast_to<StateMachine>(get_node(NodePath("%StateMachine")));
 | 
				
			||||||
	this->nav = cast_to<NavigationAgent3D>(get_node(NodePath("%NavigationAgent3D")));
 | 
						this->nav = cast_to<NavigationAgent3D>(get_node(NodePath("%NavigationAgent3D")));
 | 
				
			||||||
 | 
						this->health = cast_to<HealthStatus>(get_node(NodePath("%HealthStatus")));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void EnemyBody::physics_process(double delta) {
 | 
					void EnemyBody::physics_process(double delta) {
 | 
				
			||||||
	GETSET(velocity, {
 | 
						GETSET(velocity, {
 | 
				
			||||||
		velocity = Vector3{ this->movement_direction.x * this->movement_speed, velocity.y, this->movement_direction.y * this->movement_speed } + (velocity * delta);
 | 
							velocity = Vector3{ this->movement_direction.x * this->movement_speed, velocity.y, this->movement_direction.y * this->movement_speed } + (velocity * delta);
 | 
				
			||||||
 | 
							if (!is_on_floor() && this->health->get_health() > 0) {
 | 
				
			||||||
 | 
								velocity += get_gravity() * delta;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	});
 | 
						});
 | 
				
			||||||
	if (!this->movement_direction.is_zero_approx()) {
 | 
						if (!this->movement_direction.is_zero_approx()) {
 | 
				
			||||||
		look_at(get_global_position() + Vector3{ this->movement_direction.x, 0.f, this->movement_direction.y });
 | 
							look_at(get_global_position() + Vector3{ this->movement_direction.x, 0.f, this->movement_direction.y });
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,18 +11,28 @@ void NpcUnit::_bind_methods() {
 | 
				
			||||||
	BIND_HPROPERTY(Variant::OBJECT, region, PROPERTY_HINT_NODE_TYPE, "MapRegion");
 | 
						BIND_HPROPERTY(Variant::OBJECT, region, PROPERTY_HINT_NODE_TYPE, "MapRegion");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void NpcUnit::remove_npc(EnemyBody *npc) {
 | 
				
			||||||
 | 
						Transform3D const tf{ npc->get_global_transform() };
 | 
				
			||||||
 | 
						remove_child(npc);
 | 
				
			||||||
 | 
						this->get_parent()->add_child(npc);
 | 
				
			||||||
 | 
						npc->set_global_transform(tf);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void NpcUnit::on_npc_death() {
 | 
					void NpcUnit::on_npc_death() {
 | 
				
			||||||
 | 
						Vector<EnemyBody>::Size living{ this->npcs.size() };
 | 
				
			||||||
	// remove any dead npcs from the list
 | 
						// remove any dead npcs from the list
 | 
				
			||||||
	// leaving their bodies as separate nodes part of the tree
 | 
						// leaving their bodies as separate nodes part of the tree
 | 
				
			||||||
	for (EnemyBody *npc : this->npcs) {
 | 
						for (Vector<EnemyBody>::Size i{ 0 }; i < this->npcs.size(); ++i) {
 | 
				
			||||||
 | 
							EnemyBody *npc{ this->npcs[i] };
 | 
				
			||||||
		if (npc->get_health()->get_health() <= 0) {
 | 
							if (npc->get_health()->get_health() <= 0) {
 | 
				
			||||||
			this->get_parent()->add_child(npc);
 | 
								--living;
 | 
				
			||||||
			this->npcs.erase(npc);
 | 
					 | 
				
			||||||
			break;
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// remove unit from world once all npcs are dead
 | 
						// remove unit from world once all npcs are dead
 | 
				
			||||||
	if (this->npcs.size() <= 0) {
 | 
						if (living == 0) {
 | 
				
			||||||
 | 
							for (EnemyBody *npc : this->npcs) {
 | 
				
			||||||
 | 
								remove_npc(npc);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		this->set_region(nullptr); // de-register from region
 | 
							this->set_region(nullptr); // de-register from region
 | 
				
			||||||
		this->queue_free();
 | 
							this->queue_free();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,6 +10,7 @@ class MapRegion;
 | 
				
			||||||
class NpcUnit : public Node3D {
 | 
					class NpcUnit : public Node3D {
 | 
				
			||||||
	GDCLASS(NpcUnit, Node3D);
 | 
						GDCLASS(NpcUnit, Node3D);
 | 
				
			||||||
	static void _bind_methods();
 | 
						static void _bind_methods();
 | 
				
			||||||
 | 
						void remove_npc(EnemyBody *unit);
 | 
				
			||||||
	void on_npc_death();
 | 
						void on_npc_death();
 | 
				
			||||||
	void on_npc_awareness_changed(bool seen);
 | 
						void on_npc_awareness_changed(bool seen);
 | 
				
			||||||
	void child_added(Node *node);
 | 
						void child_added(Node *node);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,23 +7,43 @@ script/source = "extends EnemyWretched
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@export var difficulty_weight : float = 10
 | 
					@export var difficulty_weight : float = 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func _on_health_status_death() -> void:
 | 
					var is_dead := false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func on_death() -> void:
 | 
				
			||||||
	%StateMachine.process_mode = Node.PROCESS_MODE_DISABLED
 | 
						%StateMachine.process_mode = Node.PROCESS_MODE_DISABLED
 | 
				
			||||||
	%NavigationAgent3D.process_mode = Node.PROCESS_MODE_DISABLED
 | 
						%NavigationAgent3D.process_mode = Node.PROCESS_MODE_DISABLED
 | 
				
			||||||
	$wretched/AnimationPlayer.play(\"death\")
 | 
					 | 
				
			||||||
	$CollisionShape3D.disabled = true
 | 
						$CollisionShape3D.disabled = true
 | 
				
			||||||
	set_movement_direction(Vector2())
 | 
						set_movement_direction(Vector2())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _on_health_status_death() -> void:
 | 
				
			||||||
 | 
						$wretched/AnimationPlayer.play(\"death\")
 | 
				
			||||||
	get_unit().region.raise_difficulty(1.0 / difficulty_weight)
 | 
						get_unit().region.raise_difficulty(1.0 / difficulty_weight)
 | 
				
			||||||
 | 
						on_death.call_deferred()
 | 
				
			||||||
 | 
						is_dead = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _enter_tree() -> void:
 | 
				
			||||||
 | 
						if is_dead and $wretched/AnimationPlayer.current_animation != \"death\":
 | 
				
			||||||
 | 
							$wretched/AnimationPlayer.play.call_deferred(\"death\")
 | 
				
			||||||
 | 
							$wretched/AnimationPlayer.advance.call_deferred(INF)
 | 
				
			||||||
 | 
						elif is_dead:
 | 
				
			||||||
 | 
							$wretched/AnimationPlayer.play.call_deferred(\"death\")
 | 
				
			||||||
"
 | 
					"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_ng1ul"]
 | 
					[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_ng1ul"]
 | 
				
			||||||
radius = 0.26953125
 | 
					radius = 0.58691406
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="EnemyWretched" type="EnemyWretched"]
 | 
					[node name="EnemyWretched" type="EnemyWretched"]
 | 
				
			||||||
 | 
					wall_min_slide_angle = 0.0
 | 
				
			||||||
script = SubResource("GDScript_qot2n")
 | 
					script = SubResource("GDScript_qot2n")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="wretched" parent="." instance=ExtResource("1_qot2n")]
 | 
					[node name="wretched" parent="." instance=ExtResource("1_qot2n")]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node name="Body" parent="wretched/Character/Skeleton3D" index="0"]
 | 
				
			||||||
 | 
					gi_mode = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[node name="club" parent="wretched/Character/Skeleton3D" index="1"]
 | 
				
			||||||
 | 
					gi_mode = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[node name="Hitbox" parent="wretched/Character/Skeleton3D" index="2" node_paths=PackedStringArray("health")]
 | 
					[node name="Hitbox" parent="wretched/Character/Skeleton3D" index="2" node_paths=PackedStringArray("health")]
 | 
				
			||||||
health = NodePath("../../../../HealthStatus")
 | 
					health = NodePath("../../../../HealthStatus")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue