Add some extra utilities to handle entities

This commit is contained in:
Lol3rrr
2024-10-15 18:42:17 +02:00
parent 7dfa4fa57a
commit 35302891e3
2 changed files with 88 additions and 0 deletions

View File

@@ -24,3 +24,5 @@ pub mod parser;
pub mod csgo_proto { pub mod csgo_proto {
include!(concat!(env!("OUT_DIR"), "/_.rs")); include!(concat!(env!("OUT_DIR"), "/_.rs"));
} }
pub mod structured;

86
src/structured.rs Normal file
View File

@@ -0,0 +1,86 @@
//! Provides some more structured access to entities in a demo
pub mod pawnid {
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
pub struct PawnID(u32);
impl From<i32> for PawnID {
fn from(value: i32) -> Self {
Self((value & 0x7FF) as u32)
}
}
impl From<u32> for PawnID {
fn from(value: u32) -> Self {
Self(value & 0x7FF)
}
}
}
pub mod ccsteam {
pub struct CCSTeam(crate::parser::entities::EntityState);
impl TryFrom<&crate::parser::entities::EntityState> for CCSTeam {
type Error = ();
fn try_from(value: &crate::parser::entities::EntityState) -> Result<Self, Self::Error> {
if value.class.as_ref() != "CCSTeam" {
return Err(());
}
Ok(Self(value.clone()))
}
}
impl CCSTeam {
pub fn entity_id(&self) -> i32 {
self.0.id
}
pub fn team_name(&self) -> Option<&str> {
self.0.get_prop("CCSTeam.m_szTeamname").map(|p| {
match &p.value {
crate::parser::Variant::String(v) => Some(v.as_str()),
_ => None,
}
}).flatten()
}
pub fn player_pawns(&self) -> Vec<super::pawnid::PawnID> {
self.0.props.iter()
.filter(|p| p.prop_info.prop_name.as_ref() == "CCSTeam.m_aPawns")
.filter_map(|p| p.value.as_u32())
.map(|v| super::pawnid::PawnID::from(v))
.collect()
}
}
}
pub mod ccsplayerpawn {
pub struct CCSPlayerPawn(crate::parser::entities::EntityState);
impl TryFrom<&crate::parser::entities::EntityState> for CCSPlayerPawn {
type Error = ();
fn try_from(value: &crate::parser::entities::EntityState) -> Result<Self, Self::Error> {
if value.class.as_ref() != "CCSPlayerPawn" {
return Err(());
}
Ok(Self(value.clone()))
}
}
impl CCSPlayerPawn {
pub fn entity_id(&self) -> i32 {
self.0.id
}
pub fn pawn_id(&self) -> super::pawnid::PawnID {
super::pawnid::PawnID::from(self.0.id)
}
pub fn inner(&self) -> &crate::parser::entities::EntityState {
&self.0
}
}
}