#[cfg(test)]
#[path = "tests/user_cmd.rs"]
mod tests;
use crate::math::QAngle;
use sdk_raw::user_cmd as raw;
use std::ffi::c_int;
use std::fmt::{self, Debug, Formatter};
use std::ptr::NonNull;
bitflags::bitflags! {
#[doc(alias("IN_"))]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub struct Buttons: c_int {
#[doc(alias("IN_ALT1"))]
const ALT1 = raw::IN_ALT1;
#[doc(alias("IN_ALT2"))]
const ALT2 = raw::IN_ALT2;
#[doc(alias("IN_ATTACK"))]
const ATTACK = raw::IN_ATTACK;
#[doc(alias("IN_ATTACK2"))]
const ATTACK2 = raw::IN_ATTACK2;
#[doc(alias("IN_ATTACK3"))]
const ATTACK3 = raw::IN_ATTACK3;
#[doc(alias("IN_BACK"))]
const BACK = raw::IN_BACK;
#[doc(alias("IN_BULLRUSH"))]
const BULLRUSH = raw::IN_BULLRUSH;
#[doc(alias("IN_CANCEL"))]
const CANCEL = raw::IN_CANCEL;
#[doc(alias("IN_DUCK"))]
const DUCK = raw::IN_DUCK;
#[doc(alias("IN_FORWARD"))]
const FORWARD = raw::IN_FORWARD;
#[doc(alias("IN_GRENADE1"))]
const GRENADE1 = raw::IN_GRENADE1;
#[doc(alias("IN_GRENADE2"))]
const GRENADE2 = raw::IN_GRENADE2;
#[doc(alias("IN_JUMP"))]
const JUMP = raw::IN_JUMP;
#[doc(alias("IN_LEFT"))]
const LEFT = raw::IN_LEFT;
#[doc(alias("IN_MOVELEFT"))]
const MOVE_LEFT = raw::IN_MOVELEFT;
#[doc(alias("IN_MOVERIGHT"))]
const MOVE_RIGHT = raw::IN_MOVERIGHT;
#[doc(alias("IN_RELOAD"))]
const RELOAD = raw::IN_RELOAD;
#[doc(alias("IN_RIGHT"))]
const RIGHT = raw::IN_RIGHT;
#[doc(alias("IN_RUN"))]
const RUN = raw::IN_RUN;
#[doc(alias("IN_SCORE"))]
const SCORE = raw::IN_SCORE;
#[doc(alias("IN_SPEED"))]
const SPEED = raw::IN_SPEED;
#[doc(alias("IN_USE"))]
const USE = raw::IN_USE;
#[doc(alias("IN_WALK"))]
const WALK = raw::IN_WALK;
#[doc(alias("IN_WEAPON1"))]
const WEAPON1 = raw::IN_WEAPON1;
#[doc(alias("IN_WEAPON2"))]
const WEAPON2 = raw::IN_WEAPON2;
#[doc(alias("IN_ZOOM"))]
const ZOOM = raw::IN_ZOOM;
const _ = !0;
}
}
#[doc(alias("CUserCmd"))]
#[repr(transparent)]
pub struct UserCmd(sys::CUserCmd);
impl UserCmd {
pub const fn as_raw(&self) -> &sys::CUserCmd {
&self.0
}
pub const fn as_raw_mut(&mut self) -> &mut sys::CUserCmd {
&mut self.0
}
pub const fn buttons(&self) -> Buttons {
Buttons::from_bits_retain(self.0.buttons)
}
pub const fn command_number(&self) -> c_int {
self.0.command_number
}
#[doc(alias("forwardmove"))]
pub const fn forward_move(&self) -> f32 {
self.0.forwardmove
}
pub const unsafe fn from_raw_mut<'a>(command: NonNull<sys::CUserCmd>) -> &'a mut Self {
unsafe { command.cast::<Self>().as_mut() }
}
pub const fn impulse(&self) -> u8 {
self.0.impulse
}
#[doc(alias("mousedx", "mousedy"))]
pub const fn mouse_delta(&self) -> (i16, i16) {
(self.0.mousedx, self.0.mousedy)
}
pub const fn random_seed(&self) -> c_int {
self.0.random_seed
}
pub const fn set_buttons(&mut self, buttons: Buttons) {
self.0.buttons = buttons.bits();
}
pub const fn set_forward_move(&mut self, speed: f32) {
self.0.forwardmove = speed;
}
pub const fn set_impulse(&mut self, impulse: u8) {
self.0.impulse = impulse;
}
pub const fn set_side_move(&mut self, speed: f32) {
self.0.sidemove = speed;
}
pub const fn set_up_move(&mut self, speed: f32) {
self.0.upmove = speed;
}
pub fn set_view_angles(&mut self, angles: QAngle) {
self.0.viewangles = angles.into();
}
pub const fn set_weapon_select(&mut self, index: c_int, subtype: c_int) {
self.0.weaponselect = index;
self.0.weaponsubtype = subtype;
}
#[doc(alias("sidemove"))]
pub const fn side_move(&self) -> f32 {
self.0.sidemove
}
pub const fn tick_count(&self) -> c_int {
self.0.tick_count
}
#[doc(alias("upmove"))]
pub const fn up_move(&self) -> f32 {
self.0.upmove
}
#[doc(alias("viewangles"))]
pub fn view_angles(&self) -> QAngle {
self.0.viewangles.into()
}
#[doc(alias("weaponselect"))]
pub const fn weapon_select(&self) -> c_int {
self.0.weaponselect
}
#[doc(alias("weaponsubtype"))]
pub const fn weapon_subtype(&self) -> c_int {
self.0.weaponsubtype
}
}
impl Debug for UserCmd {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
f.debug_struct("UserCmd")
.field("command_number", &self.command_number())
.field("tick_count", &self.tick_count())
.field("view_angles", &self.view_angles())
.field("forward_move", &self.forward_move())
.field("side_move", &self.side_move())
.field("up_move", &self.up_move())
.field("buttons", &self.buttons())
.field("impulse", &self.impulse())
.field("weapon_select", &self.weapon_select())
.field("weapon_subtype", &self.weapon_subtype())
.finish_non_exhaustive()
}
}