Skip to content

Commit 7af4983

Browse files
committed
player connect bugfix
1 parent 3a2d0ea commit 7af4983

3 files changed

Lines changed: 61 additions & 27 deletions

File tree

src/parser/src/parse_demo.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,33 @@ impl<'a> Parser<'a> {
9494
if let Some(new_df) = self.rm_unwanted_ticks(&mut outputs.df) {
9595
outputs.df = new_df;
9696
}
97+
98+
Parser::remove_duplicate_player_connects(&mut outputs.game_events);
9799
Parser::add_item_purchase_sell_column(&mut outputs.game_events);
98100
Parser::remove_item_sold_events(&mut outputs.game_events);
99101
Ok(outputs)
100102
}
103+
fn remove_duplicate_player_connects(events: &mut Vec<GameEvent>){
104+
let mut v = events.iter().filter(|x| x.name == "player_first_connect").collect_vec();
105+
v.sort_by_key(|x| x.tick);
106+
let mut ids = AHashMap::default();
107+
for x in v{
108+
for f in &x.fields{
109+
if f.name == "steamid"{
110+
if let Some(Variant::U64(s)) = f.data{
111+
match ids.get(&s) {
112+
Some(_) => {},
113+
None => {
114+
ids.insert(s, x.clone());
115+
}
116+
}
117+
}
118+
}
119+
}
120+
}
121+
events.retain(|x|x.name != "player_first_connect");
122+
events.extend(ids.values().map(|x| x.clone()));
123+
}
101124

102125
fn second_pass_single_threaded(&self, outer_bytes: &[u8], first_pass_output: FirstPassOutput) -> Result<DemoOutput, DemoParserError> {
103126
let mut parser = SecondPassParser::new(first_pass_output.clone(), 16, true, None)?;

src/parser/src/second_pass/entities.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,8 +246,8 @@ impl<'a> SecondPassParser<'a> {
246246
}
247247
}
248248
// Custom events
249-
if !is_fullpacket && !is_baseline {
250-
events_to_emit.extend(SecondPassParser::listen_for_events(entity, &result, field, field_info, &self.prop_controller, &self.prop_controller.special_ids));
249+
if !is_baseline {
250+
events_to_emit.extend(SecondPassParser::listen_for_events(entity, &result, field, field_info, &self.prop_controller, &self.prop_controller.special_ids, is_fullpacket));
251251
}
252252
// Debug
253253
if self.is_debug_mode {

src/parser/src/second_pass/game_events.rs

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -482,15 +482,15 @@ impl<'a> SecondPassParser<'a> {
482482
data: Some(Variant::I32(self.tick)),
483483
name: "tick".to_string(),
484484
});
485+
fields.extend(self.find_non_player_props());
486+
let ge = GameEvent {
487+
name: "server_cvar".to_string(),
488+
fields: fields.clone(),
489+
tick: self.tick,
490+
};
491+
self.game_events.push(ge);
492+
self.game_events_counter.insert("server_cvar".to_string());
485493
}
486-
fields.extend(self.find_non_player_props());
487-
let ge = GameEvent {
488-
name: "server_cvar".to_string(),
489-
fields,
490-
tick: self.tick,
491-
};
492-
self.game_events.push(ge);
493-
self.game_events_counter.insert("server_cvar".to_string());
494494
}
495495
Ok(())
496496
}
@@ -583,23 +583,24 @@ impl<'a> SecondPassParser<'a> {
583583
};
584584
if let Some(e) = player_entid {
585585
if e != PLAYER_ENTITY_HANDLE_MISSING && steamid != Some(0) && team_num != Some(SPECTATOR_TEAM_NUM) {
586-
if self.players.iter().all(|x| x.1.steamid != steamid){
587-
// println!("{:?} {:?}", steamid, self.players.iter().filter_map(|x| x.1.steamid).collect_vec());
588-
match self.should_remove(steamid) {
589-
Some(eid) => {
590-
self.players.remove(&eid);
591-
}
592-
None => {}
586+
match self.should_remove(steamid) {
587+
Some(eid) => {
588+
self.players.remove(&eid);
593589
}
594-
let p = PlayerMetaData {
595-
name,
596-
team_num,
597-
player_entity_id: player_entid,
598-
steamid,
599-
controller_entid: Some(*entity_id),
600-
};
601-
self.players.insert(e,p.clone());
590+
None => {}
591+
}
592+
let p = PlayerMetaData {
593+
name,
594+
team_num,
595+
player_entity_id: player_entid,
596+
steamid,
597+
controller_entid: Some(*entity_id),
598+
};
599+
if self.players.iter().all(|x| x.1.steamid != steamid){
602600
self.create_custom_event_player_connect(&p)?;
601+
self.players.insert(e,p.clone());
602+
}else{
603+
self.players.insert(e,p.clone());
603604
}
604605
}
605606
}
@@ -1171,6 +1172,10 @@ impl<'a> SecondPassParser<'a> {
11711172
data: Some(Variant::String(player_metadata.clone().name.unwrap_or("".to_string()))),
11721173
name: "name".to_string(),
11731174
});
1175+
fields.push(EventField {
1176+
data: Some(Variant::I32(player_metadata.controller_entid.unwrap_or(0))),
1177+
name: "controller_entid".to_string(),
1178+
});
11741179
let team= match player_metadata.team_num {
11751180
Some(1) => "spectator",
11761181
Some(2) => "T",
@@ -1420,20 +1425,26 @@ impl<'a> SecondPassParser<'a> {
14201425
_field: &Field,
14211426
field_info: Option<FieldInfo>,
14221427
prop_controller: &PropController,
1423-
special_ids: &SpecialIDs
1428+
special_ids: &SpecialIDs,
1429+
is_fullpacket: bool,
14241430
) -> Vec<GameEventInfo> {
14251431
// Might want to start splitting this function
14261432
let mut events = vec![];
14271433
if let Some(fi) = field_info {
1434+
14281435
if entity.entity_type == EntityType::PlayerController{
14291436
if let Some(f) = field_info{
14301437
let connect_ids = [special_ids.teamnum, special_ids.player_name, special_ids.steamid, special_ids.player_pawn];
14311438
if connect_ids.contains(&Some(f.prop_id)) {
14321439
events.push(GameEventInfo::PlayerConnect(entity.entity_id));
14331440
}
14341441
}
1442+
if fi.prop_id != 3014{
1443+
}
1444+
}
1445+
if is_fullpacket{
1446+
return events;
14351447
}
1436-
14371448
// round end
14381449
if let Some(id) = prop_controller.special_ids.round_end_count {
14391450
if fi.prop_id == id {

0 commit comments

Comments
 (0)