diff --git a/samp-precise-timers.inc b/samp-precise-timers.inc index 31bdfa1..f29b350 100644 --- a/samp-precise-timers.inc +++ b/samp-precise-timers.inc @@ -30,3 +30,12 @@ native ResetPreciseTimer(const timer_number, const interval, const repeat); # DeletePreciseTimer returns 1 if the timer existed or 0 on failure. */ native DeletePreciseTimer(const timer_number); + +/* + # IsValidPreciseTimer returns 1 if the timer is valid and exists, 0 otherwise. + Returns 0 if: + - timer had already been removed + - timer_number is invalid (0 or negative) + - timer_number is not in the system +*/ +native IsValidPreciseTimer(const timer_number); diff --git a/src/lib.rs b/src/lib.rs index 5298fa5..e4d187f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -17,7 +17,7 @@ mod scheduling; mod timer; use schedule::Repeat::{DontRepeat, Every}; use schedule::Schedule; -use scheduling::{delete_timer, insert_and_schedule_timer, remove_timers}; +use scheduling::{delete_timer, insert_and_schedule_timer, remove_timers, STATE}; /// The plugin struct PreciseTimers; @@ -104,6 +104,21 @@ impl PreciseTimers { } Ok(1) } + + #[samp::native(name = "IsValidPreciseTimer")] + pub fn is_valid(&self, _: &Amx, timer_number: i32) -> AmxResult { + if timer_number <= 0 { + return Ok(0); + } + + let key = (timer_number as usize).saturating_sub(1); + + let is_valid = STATE.with_borrow(|state| { + state.timers.contains(key) + }); + + Ok(if is_valid { 1 } else { 0 }) + } } impl SampPlugin for PreciseTimers { @@ -139,6 +154,7 @@ samp::initialize_plugin!( PreciseTimers::delete, PreciseTimers::create, PreciseTimers::reset, + PreciseTimers::is_valid, ], { samp::plugin::enable_process_tick();