use gdnative::api::*; use gdnative::prelude::*; use crate::buff_trait::Buff; struct BuffBounce { name: String, description: String, rigid_body: Option>, target_bounciness: f64, previous_bounciness: f64 } impl BuffBounce { fn new(rigid_body: Option>) -> Self { BuffBounce { name: String::from("Bounce"), description: String::from("Let's the die bounce more than usual."), rigid_body, target_bounciness: 1.0, previous_bounciness: 0.0 } } } impl Buff for BuffBounce { unsafe fn execute_buff(&mut self) { // make sure the rigid body exists match &self.rigid_body { Some(body) => { let safe_body = body.assume_safe(); // get the physics material match safe_body.physics_material_override() { Some(mat) => { let save_mat = mat.assume_safe(); self.previous_bounciness = save_mat.bounce(); save_mat.set_bounce(self.target_bounciness); }, None => godot_warn!("Physics material was not found") } }, None => godot_warn!("No rigid body initialized to apply properties to") } } unsafe fn revert_buff(&mut self) { // make sure the rigid body exists match &self.rigid_body { Some(body) => { let safe_body = body.assume_safe(); // get the physics material match safe_body.physics_material_override() { Some(mat) => { let save_mat = mat.assume_safe(); save_mat.set_bounce(self.previous_bounciness); }, None => godot_warn!("Physics material was not found") } }, None => godot_warn!("No rigid body initialized to apply properties to") } } fn get_name(self) -> GodotString { GodotString::from_str(self.name) } fn get_description(self) -> GodotString { GodotString::from_str(self.description) } }