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 "register_types.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "core/object/class_db.h"
 | 
					#include "core/object/class_db.h"
 | 
				
			||||||
 | 
					#include "wave_survival/damage_box.h"
 | 
				
			||||||
#include "wave_survival/enemies/enemy_wretched.h"
 | 
					#include "wave_survival/enemies/enemy_wretched.h"
 | 
				
			||||||
#include "wave_survival/enemy_body.h"
 | 
					#include "wave_survival/enemy_body.h"
 | 
				
			||||||
#include "wave_survival/health_status.h"
 | 
					#include "wave_survival/health_status.h"
 | 
				
			||||||
| 
						 | 
					@ -41,6 +42,7 @@ void initialize_wave_survival_module(ModuleInitializationLevel p_level) {
 | 
				
			||||||
	GDREGISTER_CLASS(WretchedAttackState);
 | 
						GDREGISTER_CLASS(WretchedAttackState);
 | 
				
			||||||
	GDREGISTER_CLASS(PlayerDetector);
 | 
						GDREGISTER_CLASS(PlayerDetector);
 | 
				
			||||||
	GDREGISTER_CLASS(Hitbox);
 | 
						GDREGISTER_CLASS(Hitbox);
 | 
				
			||||||
 | 
						GDREGISTER_CLASS(DamageBox);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void uninitialize_wave_survival_module(ModuleInitializationLevel p_level) {
 | 
					void uninitialize_wave_survival_module(ModuleInitializationLevel p_level) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue