use gdnative::api::*; use gdnative::prelude::*; use crate::buff_trait::Buff; struct BuffPhase { name: String, description: String, rigid_body: Option>, wall_layer_bit: i64, } impl BuffPhase { fn new(rigid_body: Option>) -> Self { // calculate the bit for the mask to enable/ disable collision detection let mask_layer = 2; let mask_bit = 2_i64.pow(mask_layer - 1); BuffPhase { name: String::from("Phase"), description: String::from("Phases through thin fences"), rigid_body, wall_layer_bit: mask_bit, } } } impl Buff for BuffPhase { unsafe fn execute_buff(&mut self) { match &self.rigid_body { Some(body) => { // actually disable the collision to the fences let save_body = body.assume_safe(); save_body.set_collision_mask_bit(self.wall_layer_bit, false); }, None => godot_warn!("Rigid body not found") } } unsafe fn revert_buff(& mut self) { // make sure the rigid body exists match &self.rigid_body { Some(body) => { // actually enable the collision again let save_body = body.assume_safe(); save_body.set_collision_mask_bit(self.wall_layer_bit, false); }, None => godot_warn!("Rigid body not found") } } fn get_name(self) -> GodotString { GodotString::from_str(self.name) } fn get_description(self) -> GodotString { GodotString::from_str(self.description) } }