Skip to content

Commit 4ed658a

Browse files
authored
fix inventory missing c4 and flashbangs (#309)
1 parent b916881 commit 4ed658a

File tree

4 files changed

+23
-224
lines changed

4 files changed

+23
-224
lines changed

src/parser/src/e2e_test.rs

Lines changed: 3 additions & 215 deletions
Original file line numberDiff line numberDiff line change
@@ -3161,231 +3161,19 @@ mod tests {
31613161
fn inventory() {
31623162
let prop = (
31633163
"inventory",
3164-
PropColumn {
3165-
data: Some(StringVec(vec![
3166-
vec![
3167-
"knife_t".to_string(),
3168-
"Desert Eagle".to_string(),
3169-
"Smoke Grenade".to_string(),
3170-
"Flashbang".to_string(),
3171-
],
3172-
vec!["Bowie Knife".to_string(), "USP-S".to_string()],
3173-
vec!["knife_t".to_string(), "Desert Eagle".to_string()],
3174-
vec![
3175-
"knife_t".to_string(),
3176-
"Glock-18".to_string(),
3177-
"AK-47".to_string(),
3178-
"High Explosive Grenade".to_string(),
3179-
],
3180-
vec!["knife".to_string(), "USP-S".to_string()],
3181-
vec!["knife".to_string(), "P2000".to_string()],
3182-
vec!["M9 Bayonet".to_string(), "USP-S".to_string()],
3183-
vec![
3184-
"knife_t".to_string(),
3185-
"Glock-18".to_string(),
3186-
"C4 Explosive".to_string(),
3187-
"AK-47".to_string(),
3188-
"Smoke Grenade".to_string(),
3189-
],
3190-
vec!["knife".to_string(), "USP-S".to_string()],
3191-
vec!["knife_t".to_string()],
3192-
vec!["knife_t".to_string(), "Glock-18".to_string(), "AK-47".to_string(), "Flashbang".to_string()],
3193-
vec!["Bowie Knife".to_string(), "USP-S".to_string(), "M4A4".to_string()],
3194-
vec!["knife_t".to_string(), "Glock-18".to_string(), "AK-47".to_string()],
3195-
vec!["knife_t".to_string(), "Glock-18".to_string(), "MAC-10".to_string()],
3196-
vec![],
3197-
vec!["knife".to_string(), "P2000".to_string(), "M4A4".to_string()],
3198-
vec!["M9 Bayonet".to_string(), "USP-S".to_string(), "AK-47".to_string(), "Smoke Grenade".to_string()],
3199-
vec![
3200-
"knife_t".to_string(),
3201-
"Glock-18".to_string(),
3202-
"MAC-10".to_string(),
3203-
"Smoke Grenade".to_string(),
3204-
"Flashbang".to_string(),
3205-
"C4 Explosive".to_string(),
3206-
],
3207-
vec!["knife".to_string(), "USP-S".to_string(), "FAMAS".to_string()],
3208-
vec![
3209-
"Huntsman Knife".to_string(),
3210-
"Glock-18".to_string(),
3211-
"SSG 08".to_string(),
3212-
"Flashbang".to_string(),
3213-
],
3214-
vec!["knife_t".to_string(), "AK-47".to_string(), "Desert Eagle".to_string()],
3215-
vec!["Bowie Knife".to_string(), "Desert Eagle".to_string()],
3216-
vec![],
3217-
vec!["knife_t".to_string(), "Glock-18".to_string(), "AK-47".to_string()],
3218-
vec!["knife".to_string(), "USP-S".to_string(), "M4A1-S".to_string()],
3219-
vec![],
3220-
vec!["M9 Bayonet".to_string(), "USP-S".to_string(), "M4A1-S".to_string(), "Flashbang".to_string()],
3221-
vec![],
3222-
vec!["knife".to_string(), "P250".to_string()],
3223-
vec![
3224-
"Huntsman Knife".to_string(),
3225-
"SSG 08".to_string(),
3226-
"P250".to_string(),
3227-
"Smoke Grenade".to_string(),
3228-
"Flashbang".to_string(),
3229-
],
3230-
vec![
3231-
"knife_t".to_string(),
3232-
"Glock-18".to_string(),
3233-
"AK-47".to_string(),
3234-
"Smoke Grenade".to_string(),
3235-
"Molotov".to_string(),
3236-
"Flashbang".to_string(),
3237-
],
3238-
vec!["Bowie Knife".to_string(), "USP-S".to_string(), "M4A1-S".to_string()],
3239-
vec!["knife_t".to_string(), "Glock-18".to_string(), "AK-47".to_string()],
3240-
vec![
3241-
"knife_t".to_string(),
3242-
"Glock-18".to_string(),
3243-
"AK-47".to_string(),
3244-
"Molotov".to_string(),
3245-
"High Explosive Grenade".to_string(),
3246-
"Smoke Grenade".to_string(),
3247-
"Flashbang".to_string(),
3248-
],
3249-
vec!["knife".to_string(), "USP-S".to_string()],
3250-
vec![
3251-
"knife".to_string(),
3252-
"P2000".to_string(),
3253-
"Smoke Grenade".to_string(),
3254-
"High Explosive Grenade".to_string(),
3255-
"Incendiary Grenade".to_string(),
3256-
],
3257-
vec!["M9 Bayonet".to_string(), "USP-S".to_string()],
3258-
vec![
3259-
"knife_t".to_string(),
3260-
"Glock-18".to_string(),
3261-
"C4 Explosive".to_string(),
3262-
"AWP".to_string(),
3263-
"Smoke Grenade".to_string(),
3264-
"Molotov".to_string(),
3265-
"High Explosive Grenade".to_string(),
3266-
],
3267-
vec!["knife".to_string(), "USP-S".to_string()],
3268-
vec![
3269-
"Huntsman Knife".to_string(),
3270-
"AK-47".to_string(),
3271-
"R8 Revolver".to_string(),
3272-
"High Explosive Grenade".to_string(),
3273-
"Molotov".to_string(),
3274-
"Smoke Grenade".to_string(),
3275-
"Flashbang".to_string(),
3276-
],
3277-
])),
3278-
num_nones: 0,
3279-
},
3164+
PropColumn { data: Some(StringVec(vec![vec!["knife_t".to_string(), "Desert Eagle".to_string(), "Smoke Grenade".to_string(), "Flashbang".to_string(), "Flashbang".to_string()], vec!["Bowie Knife".to_string(), "USP-S".to_string()], vec!["knife_t".to_string(), "Desert Eagle".to_string()], vec!["knife_t".to_string(), "Glock-18".to_string(), "AK-47".to_string(), "High Explosive Grenade".to_string()], vec!["knife".to_string(), "USP-S".to_string()], vec!["knife".to_string(), "P2000".to_string()], vec!["M9 Bayonet".to_string(), "USP-S".to_string()], vec!["knife_t".to_string(), "Glock-18".to_string(), "C4 Explosive".to_string(), "AK-47".to_string(), "Smoke Grenade".to_string()], vec!["knife".to_string(), "USP-S".to_string()], vec!["knife_t".to_string()], vec!["knife_t".to_string(), "Glock-18".to_string(), "AK-47".to_string(), "Flashbang".to_string(), "Flashbang".to_string()], vec!["Bowie Knife".to_string(), "USP-S".to_string(), "M4A4".to_string()], vec!["knife_t".to_string(), "Glock-18".to_string(), "AK-47".to_string()], vec!["knife_t".to_string(), "Glock-18".to_string(), "MAC-10".to_string()], vec![], vec!["knife".to_string(), "P2000".to_string(), "M4A4".to_string()], vec!["M9 Bayonet".to_string(), "USP-S".to_string(), "AK-47".to_string(), "Smoke Grenade".to_string()], vec!["knife_t".to_string(), "Glock-18".to_string(), "MAC-10".to_string(), "Smoke Grenade".to_string(), "Flashbang".to_string(), "Flashbang".to_string(), "C4 Explosive".to_string()], vec!["knife".to_string(), "USP-S".to_string(), "FAMAS".to_string()], vec!["Huntsman Knife".to_string(), "Glock-18".to_string(), "SSG 08".to_string(), "Flashbang".to_string()], vec!["knife_t".to_string(), "AK-47".to_string(), "Desert Eagle".to_string()], vec!["Bowie Knife".to_string(), "Desert Eagle".to_string()], vec![], vec!["knife_t".to_string(), "Glock-18".to_string(), "AK-47".to_string()], vec!["knife".to_string(), "USP-S".to_string(), "M4A1-S".to_string()], vec![], vec!["M9 Bayonet".to_string(), "USP-S".to_string(), "M4A1-S".to_string(), "Flashbang".to_string(), "Flashbang".to_string()], vec![], vec!["knife".to_string(), "P250".to_string()], vec!["Huntsman Knife".to_string(), "SSG 08".to_string(), "P250".to_string(), "Smoke Grenade".to_string(), "Flashbang".to_string()], vec!["knife_t".to_string(), "Glock-18".to_string(), "AK-47".to_string(), "Smoke Grenade".to_string(), "Molotov".to_string(), "Flashbang".to_string(), "Flashbang".to_string()], vec!["Bowie Knife".to_string(), "USP-S".to_string(), "M4A1-S".to_string()], vec!["knife_t".to_string(), "Glock-18".to_string(), "AK-47".to_string()], vec!["knife_t".to_string(), "Glock-18".to_string(), "AK-47".to_string(), "Molotov".to_string(), "High Explosive Grenade".to_string(), "Smoke Grenade".to_string(), "Flashbang".to_string()], vec!["knife".to_string(), "USP-S".to_string()], vec!["knife".to_string(), "P2000".to_string(), "Smoke Grenade".to_string(), "High Explosive Grenade".to_string(), "Incendiary Grenade".to_string()], vec!["M9 Bayonet".to_string(), "USP-S".to_string()], vec!["knife_t".to_string(), "Glock-18".to_string(), "C4 Explosive".to_string(), "AWP".to_string(), "Smoke Grenade".to_string(), "Molotov".to_string(), "High Explosive Grenade".to_string()], vec!["knife".to_string(), "USP-S".to_string()], vec!["Huntsman Knife".to_string(), "AK-47".to_string(), "R8 Revolver".to_string(), "High Explosive Grenade".to_string(), "Molotov".to_string(), "Smoke Grenade".to_string(), "Flashbang".to_string()]])), num_nones: 0
3165+
}
32803166
);
32813167
assert_eq!(out.0.df[&INVENTORY_ID], prop.1);
32823168
}
32833169
#[test]
32843170
fn inventory_as_ids() {
32853171
let prop = (
32863172
"inventory_as_ids",
3287-
PropColumn {
3288-
data: Some(U32Vec(vec![
3289-
vec![59, 1, 45, 43],
3290-
vec![514, 61],
3291-
vec![59, 1],
3292-
vec![59, 4, 7, 44],
3293-
vec![42, 61],
3294-
vec![42, 32],
3295-
vec![508, 61],
3296-
vec![59, 4, 49, 7, 45],
3297-
vec![42, 61],
3298-
vec![59],
3299-
vec![59, 4, 7, 43],
3300-
vec![514, 61, 16],
3301-
vec![59, 4, 7],
3302-
vec![59, 4, 17],
3303-
vec![],
3304-
vec![42, 32, 16],
3305-
vec![508, 61, 7, 45],
3306-
vec![59, 4, 17, 45, 43, 49],
3307-
vec![42, 61, 10],
3308-
vec![509, 4, 40, 43],
3309-
vec![59, 7, 1],
3310-
vec![514, 1],
3311-
vec![],
3312-
vec![59, 4, 7],
3313-
vec![42, 61, 60],
3314-
vec![],
3315-
vec![508, 61, 60, 43],
3316-
vec![],
3317-
vec![42, 36],
3318-
vec![509, 40, 36, 45, 43],
3319-
vec![59, 4, 7, 45, 46, 43],
3320-
vec![514, 61, 60],
3321-
vec![59, 4, 7],
3322-
vec![59, 4, 7, 46, 44, 45, 43],
3323-
vec![42, 61],
3324-
vec![42, 32, 45, 44, 48],
3325-
vec![508, 61],
3326-
vec![59, 4, 49, 9, 45, 46, 44],
3327-
vec![42, 61],
3328-
vec![509, 7, 64, 44, 46, 45, 43],
3329-
])),
3330-
num_nones: 0,
3331-
},
3173+
PropColumn { data: Some(U32Vec(vec![vec![59, 1, 45, 43, 43], vec![514, 61], vec![59, 1], vec![59, 4, 7, 44], vec![42, 61], vec![42, 32], vec![508, 61], vec![59, 4, 49, 7, 45], vec![42, 61], vec![59], vec![59, 4, 7, 43, 43], vec![514, 61, 16], vec![59, 4, 7], vec![59, 4, 17], vec![], vec![42, 32, 16], vec![508, 61, 7, 45], vec![59, 4, 17, 45, 43, 43, 49], vec![42, 61, 10], vec![509, 4, 40, 43], vec![59, 7, 1], vec![514, 1], vec![], vec![59, 4, 7], vec![42, 61, 60], vec![], vec![508, 61, 60, 43, 43], vec![], vec![42, 36], vec![509, 40, 36, 45, 43], vec![59, 4, 7, 45, 46, 43, 43], vec![514, 61, 60], vec![59, 4, 7], vec![59, 4, 7, 46, 44, 45, 43], vec![42, 61], vec![42, 32, 45, 44, 48], vec![508, 61], vec![59, 4, 49, 9, 45, 46, 44], vec![42, 61], vec![509, 7, 64, 44, 46, 45, 43]])), num_nones: 0 },
33323174
);
33333175
assert_eq!(out.0.df[&INVENTORY_AS_IDS_ID], prop.1);
33343176
}
3335-
3336-
#[test]
3337-
fn CCSPlayerPawn_CCSPlayer_WeaponServices_m_iAmmo() {
3338-
let prop = (
3339-
"CCSPlayerPawn.CCSPlayer_WeaponServices.m_iAmmo",
3340-
PropColumn {
3341-
data: Some(U32(vec![
3342-
Some(2),
3343-
Some(0),
3344-
Some(0),
3345-
Some(1),
3346-
Some(0),
3347-
Some(0),
3348-
Some(0),
3349-
Some(1),
3350-
Some(0),
3351-
Some(0),
3352-
Some(2),
3353-
Some(0),
3354-
Some(0),
3355-
Some(0),
3356-
Some(0),
3357-
Some(0),
3358-
Some(0),
3359-
Some(2),
3360-
Some(0),
3361-
Some(1),
3362-
Some(0),
3363-
Some(0),
3364-
Some(0),
3365-
Some(0),
3366-
Some(0),
3367-
Some(0),
3368-
Some(0),
3369-
Some(0),
3370-
Some(0),
3371-
Some(0),
3372-
Some(2),
3373-
Some(0),
3374-
Some(0),
3375-
Some(1),
3376-
Some(0),
3377-
Some(0),
3378-
Some(0),
3379-
Some(1),
3380-
Some(0),
3381-
Some(1),
3382-
])),
3383-
num_nones: 0,
3384-
},
3385-
);
3386-
let prop_id = out.1.name_to_id[prop.0];
3387-
assert_eq!(out.0.df[&prop_id], prop.1);
3388-
}
33893177
#[test]
33903178
fn CCSPlayerPawn_m_iProgressBarDuration() {
33913179
let prop = (

src/parser/src/first_pass/prop_controller.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ pub const WEAPON_SKIN_NAME: u32 = 420420420;
1717
pub const WEAPON_ORIGINGAL_OWNER_ID: u32 = 6942000;
1818
pub const MY_WEAPONS_OFFSET: u32 = 500000;
1919
pub const GRENADE_AMMO_ID: u32 = 1111111;
20+
pub const FLASHBANG_AMMO_ID: u32 = 2222222;
2021
pub const INVENTORY_ID: u32 = 100000000;
2122
pub const IS_ALIVE_ID: u32 = 100000001;
2223
pub const GAME_TIME_ID: u32 = 100000002;
@@ -485,7 +486,9 @@ impl PropController {
485486
if full_name.starts_with("CCSPlayerPawn") && prop_name.contains("CEconItemAttribute.m_iRawValue32") {
486487
f.prop_id = GLOVE_PAINT_ID as u32;
487488
}
488-
489+
if full_name == "CCSPlayerPawn.CCSPlayer_WeaponServices.m_iAmmo"{
490+
f.prop_id = GRENADE_AMMO_ID;
491+
}
489492
self.id += 1;
490493
}
491494

src/parser/src/first_pass/sendtables.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ use super::read_bits::Bitreader;
22
use super::read_bits::DemoParserError;
33
use crate::first_pass::parser_settings::needs_velocity;
44
use crate::first_pass::parser_settings::FirstPassParser;
5+
use crate::first_pass::prop_controller::FLASHBANG_AMMO_ID;
6+
use crate::first_pass::prop_controller::GRENADE_AMMO_ID;
57
use crate::first_pass::prop_controller::PropController;
68
use crate::first_pass::prop_controller::FLATTENED_VEC_MAX_LEN;
79
use crate::first_pass::prop_controller::GLOVE_PAINT_ID;
@@ -497,6 +499,10 @@ pub fn get_propinfo(field: &Field, path: &FieldPath) -> Option<FieldInfo> {
497499
if fi.prop_id == GLOVE_PAINT_ID {
498500
fi.prop_id = GLOVE_PAINT_ID + path.path[1] as u32;
499501
}
502+
// index 14 seems to be for flashbang ammo...
503+
if fi.prop_id == GRENADE_AMMO_ID && path.path[2] == 14{
504+
fi.prop_id = FLASHBANG_AMMO_ID;
505+
}
500506

501507
if path.path[1] != 1 {
502508
if fi.prop_id >= ITEM_PURCHASE_COUNT && fi.prop_id < ITEM_PURCHASE_COUNT + FLATTENED_VEC_MAX_LEN {

src/parser/src/second_pass/collect_data.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -787,14 +787,14 @@ impl<'a> SecondPassParser<'a> {
787787
Some(weap_name) => {
788788
match weap_name {
789789
// Check how many flashbangs player has (only prop that works like this)
790-
&"flashbang" => {
790+
&"Flashbang" => {
791791
if let Ok(Variant::U32(2)) = self.get_prop_from_ent(&GRENADE_AMMO_ID, player_entid) {
792792
*bitmask |= 1 << def_idx;
793793
}
794794
*bitmask |= 1 << def_idx;
795795
}
796796
// c4 seems bugged. Find c4 entity and check owner from it.
797-
&"c4" => {
797+
&"C4 Explosive" => {
798798
if let Some(c4_owner_id) = self.find_c4_owner() {
799799
if *player_entid == c4_owner_id {
800800
*bitmask |= 1 << def_idx;
@@ -816,14 +816,14 @@ impl<'a> SecondPassParser<'a> {
816816
Some(weap_name) => {
817817
match weap_name {
818818
// Check how many flashbangs player has (only prop that works like this)
819-
&"flashbang" => {
820-
if let Ok(Variant::U32(2)) = self.get_prop_from_ent(&GRENADE_AMMO_ID, player_entid) {
819+
&"Flashbang" => {
820+
if let Ok(Variant::U32(2)) = self.get_prop_from_ent(&FLASHBANG_AMMO_ID, player_entid) {
821821
names.push(def_idx);
822822
}
823823
names.push(def_idx);
824824
}
825825
// c4 seems bugged. Find c4 entity and check owner from it.
826-
&"c4" => {
826+
&"C4 Explosive" => {
827827
if let Some(c4_owner_id) = self.find_c4_owner() {
828828
if *player_entid == c4_owner_id {
829829
names.push(def_idx);
@@ -846,14 +846,16 @@ impl<'a> SecondPassParser<'a> {
846846
Some(weap_name) => {
847847
match weap_name {
848848
// Check how many flashbangs player has (only prop that works like this)
849-
&"flashbang" => {
850-
if let Ok(Variant::U32(2)) = self.get_prop_from_ent(&GRENADE_AMMO_ID, player_entid) {
849+
&"Flashbang" => {
850+
// println!("FLASHBANG");
851+
// println!("{:?}", self.get_prop_from_ent(&GRENADE_AMMO_ID, player_entid));
852+
if let Ok(Variant::U32(2)) = self.get_prop_from_ent(&FLASHBANG_AMMO_ID, player_entid) {
851853
names.push(weap_name.to_string());
852854
}
853855
names.push(weap_name.to_string());
854856
}
855857
// c4 seems bugged. Find c4 entity and check owner from it.
856-
&"c4" => {
858+
&"C4 Explosive" => {
857859
if let Some(c4_owner_id) = self.find_c4_owner() {
858860
if *player_entid == c4_owner_id {
859861
names.push(weap_name.to_string());

0 commit comments

Comments
 (0)