1
0
Fork 0
mirror of https://codeberg.org/demostf/parser.git synced 2026-06-03 18:24:05 +02:00

track cart

This commit is contained in:
Robin Appelman 2025-06-26 20:22:00 +02:00
commit 1348384ca3
4 changed files with 48 additions and 3 deletions

View file

@ -451,6 +451,24 @@ impl Kill {
} }
} }
#[derive(Default, Debug, Serialize, Deserialize, PartialEq)]
pub struct Cart {
pub position: Vector,
}
#[derive(Debug, Serialize, Deserialize, PartialEq)]
pub enum Objective {
Cart(Cart),
}
impl Objective {
pub fn as_cart(&self) -> Option<&Cart> {
match self {
Objective::Cart(cart) => Some(cart),
}
}
}
#[derive(Default, Debug, Serialize, Deserialize, PartialEq)] #[derive(Default, Debug, Serialize, Deserialize, PartialEq)]
#[non_exhaustive] #[non_exhaustive]
pub struct GameState { pub struct GameState {
@ -465,6 +483,7 @@ pub struct GameState {
pub interval_per_tick: f32, pub interval_per_tick: f32,
pub outer_map: HashMap<Handle, EntityId>, pub outer_map: HashMap<Handle, EntityId>,
pub events: Vec<(DemoTick, GameEvent)>, pub events: Vec<(DemoTick, GameEvent)>,
pub objectives: BTreeMap<EntityId, Objective>,
} }
impl GameState { impl GameState {

View file

@ -1,7 +1,7 @@
pub use crate::demo::data::game_state::{ pub use crate::demo::data::game_state::{
Building, BuildingClass, Dispenser, GameState, Kill, PlayerState, Sentry, Teleporter, World, Building, BuildingClass, Dispenser, GameState, Kill, PlayerState, Sentry, Teleporter, World,
}; };
use crate::demo::data::game_state::{Handle, PipeType, Projectile, ProjectileType}; use crate::demo::data::game_state::{Cart, Handle, Objective, PipeType, Projectile, ProjectileType};
use crate::demo::data::DemoTick; use crate::demo::data::DemoTick;
use crate::demo::gameevent_gen::ObjectDestroyedEvent; use crate::demo::gameevent_gen::ObjectDestroyedEvent;
use crate::demo::gamevent::GameEvent; use crate::demo::gamevent::GameEvent;
@ -157,6 +157,7 @@ impl GameStateAnalyser {
"CObjectSentrygun" => self.handle_sentry_entity(entity, parser_state), "CObjectSentrygun" => self.handle_sentry_entity(entity, parser_state),
"CObjectDispenser" => self.handle_dispenser_entity(entity, parser_state), "CObjectDispenser" => self.handle_dispenser_entity(entity, parser_state),
"CObjectTeleporter" => self.handle_teleporter_entity(entity, parser_state), "CObjectTeleporter" => self.handle_teleporter_entity(entity, parser_state),
"CFuncTrackTrain" => self.handle_train_entity(entity, parser_state),
_ if class_name.starts_with("CTFProjectile_") _ if class_name.starts_with("CTFProjectile_")
|| class_name.as_str() == "CTFGrenadePipebombProjectile" => || class_name.as_str() == "CTFGrenadePipebombProjectile" =>
{ {
@ -660,6 +661,29 @@ impl GameStateAnalyser {
} }
} }
pub fn handle_train_entity(&mut self, entity: &PacketEntity, parser_state: &ParserState) {
const POSITION: SendPropIdentifier =
SendPropIdentifier::new("DT_BaseEntity", "m_vecOrigin");
let objective = self
.state
.objectives
.entry(entity.entity_index)
.or_insert_with(|| {
Objective::Cart(Cart::default())
});
#[allow(irrefutable_let_patterns)]
if let Objective::Cart(cart) = objective {
for prop in entity.props(parser_state) {
if prop.identifier == POSITION {
let pos = Vector::try_from(&prop.value).unwrap_or_default();
cart.position = pos
}
}
}
}
fn parse_user_info( fn parse_user_info(
&mut self, &mut self,
index: usize, index: usize,

View file

@ -5731,5 +5731,6 @@ expression: state
"2087543": 631, "2087543": 631,
"2089591": 631 "2089591": 631
}, },
"events": [] "events": [],
"objectives": {}
} }

View file

@ -1774,5 +1774,6 @@ expression: state
"1645192": 648, "1645192": 648,
"1688201": 649 "1688201": 649
}, },
"events": [] "events": [],
"objectives": {}
} }