50 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#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(false);
 | 
						|
}
 | 
						|
 | 
						|
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));
 | 
						|
			connect("area_entered", callable_mp(this, &self_type::on_body_entered));
 | 
						|
			set_monitoring(false);
 | 
						|
			return;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
void DamageBox::set_damage(int amount) {
 | 
						|
	this->damage = amount;
 | 
						|
}
 | 
						|
 | 
						|
int DamageBox::get_damage() const {
 | 
						|
	return this->damage;
 | 
						|
}
 |