mirror of
https://codeberg.org/demostf/parser.git
synced 2026-06-03 18:24:05 +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)]
|
#[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 {
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -5731,5 +5731,6 @@ expression: state
|
||||||
"2087543": 631,
|
"2087543": 631,
|
||||||
"2089591": 631
|
"2089591": 631
|
||||||
},
|
},
|
||||||
"events": []
|
"events": [],
|
||||||
|
"objectives": {}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1774,5 +1774,6 @@ expression: state
|
||||||
"1645192": 648,
|
"1645192": 648,
|
||||||
"1688201": 649
|
"1688201": 649
|
||||||
},
|
},
|
||||||
"events": []
|
"events": [],
|
||||||
|
"objectives": {}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue