mirror of
https://codeberg.org/demostf/parser.git
synced 2026-06-03 10:14:06 +02:00
track cart
This commit is contained in:
parent
331a9fe593
commit
1348384ca3
4 changed files with 48 additions and 3 deletions
|
|
@ -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)]
|
||||
#[non_exhaustive]
|
||||
pub struct GameState {
|
||||
|
|
@ -465,6 +483,7 @@ pub struct GameState {
|
|||
pub interval_per_tick: f32,
|
||||
pub outer_map: HashMap<Handle, EntityId>,
|
||||
pub events: Vec<(DemoTick, GameEvent)>,
|
||||
pub objectives: BTreeMap<EntityId, Objective>,
|
||||
}
|
||||
|
||||
impl GameState {
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
pub use crate::demo::data::game_state::{
|
||||
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::gameevent_gen::ObjectDestroyedEvent;
|
||||
use crate::demo::gamevent::GameEvent;
|
||||
|
|
@ -157,6 +157,7 @@ impl GameStateAnalyser {
|
|||
"CObjectSentrygun" => self.handle_sentry_entity(entity, parser_state),
|
||||
"CObjectDispenser" => self.handle_dispenser_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_")
|
||||
|| 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(
|
||||
&mut self,
|
||||
index: usize,
|
||||
|
|
|
|||
|
|
@ -5731,5 +5731,6 @@ expression: state
|
|||
"2087543": 631,
|
||||
"2089591": 631
|
||||
},
|
||||
"events": []
|
||||
"events": [],
|
||||
"objectives": {}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1774,5 +1774,6 @@ expression: state
|
|||
"1645192": 648,
|
||||
"1688201": 649
|
||||
},
|
||||
"events": []
|
||||
"events": [],
|
||||
"objectives": {}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue