1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
use serde::Serialize; pub mod natives; pub mod events { use cfx_core::events::Event; use futures::Stream; use serde::{Deserialize, Serialize}; #[derive(Debug, Serialize, Deserialize)] pub struct ClientGameTypeStart { pub resource_name: String, } pub fn client_game_type_start<'a>() -> impl Stream<Item = Event<'a, ClientGameTypeStart>> { cfx_core::events::subscribe("onClientGameTypeStart", cfx_core::events::EventScope::Local) } } use cfx_core::runtime::sleep_for; use natives::{player::*, streaming::*, task::*}; use std::time::Duration; #[derive(Debug)] pub struct TaskSequenceBuilder { sequence: i32, } impl TaskSequenceBuilder { pub fn new() -> TaskSequenceBuilder { let mut sequence = 0; open_sequence_task(&mut sequence); TaskSequenceBuilder { sequence } } pub async fn play_anim<Dict, Name>( self, anim_dict: Dict, anim_name: Name, blend_in_speed: f32, blend_out_speed: f32, duration: i32, flag: i32, playback_rate: f32, lock_x: bool, lock_y: bool, lock_z: bool, ) -> Self where Dict: AsRef<str>, Name: AsRef<str>, { let anim_dict = anim_dict.as_ref(); let anim_name = anim_name.as_ref(); request_anim_dict(anim_dict); while !has_anim_dict_loaded(anim_dict) { sleep_for(Duration::from_millis(5)).await; } task_play_anim( 0, anim_dict, anim_name, blend_in_speed, blend_out_speed, duration, flag, playback_rate, lock_x, lock_y, lock_z, ); self } pub fn run(self, clear_tasks: bool) { let ped = player_ped_id(); if clear_tasks { clear_ped_tasks(ped); } close_sequence_task(self.sequence); task_perform_sequence(ped, self.sequence); } } impl Drop for TaskSequenceBuilder { fn drop(&mut self) { clear_sequence_task(&mut self.sequence); } } pub fn emit_net<T: Serialize>(event_name: &str, payload: T) { if let Ok(payload) = rmp_serde::to_vec(&payload) { natives::cfx::trigger_server_event_internal( event_name, payload.as_slice(), payload.len() as _, ); } }