Fix memory leak + crash
This commit is contained in:
parent
61ea504f28
commit
363db1c56a
@ -196,7 +196,8 @@ impl DmaCtx {
|
|||||||
let mut data_vec: Vec<(Address, u64, Vec<(u64, i32)>)> = data_vec
|
let mut data_vec: Vec<(Address, u64, Vec<(u64, i32)>)> = data_vec
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|(pawn, _, wep_count, wep_base)| {
|
.map(|(pawn, _, wep_count, wep_base)| {
|
||||||
let weps = (0..wep_count).into_iter().map(|idx| (0u64, idx)).collect();
|
let safe_count = if wep_count < 0 || wep_count > 32 { 0 } else { wep_count };
|
||||||
|
let weps = (0..safe_count).into_iter().map(|idx| (0u64, idx)).collect();
|
||||||
(pawn, wep_base, weps)
|
(pawn, wep_base, weps)
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
@ -206,7 +207,7 @@ impl DmaCtx {
|
|||||||
data_vec.iter_mut().for_each(|(_, wep_base, wep_data_vec)| {
|
data_vec.iter_mut().for_each(|(_, wep_base, wep_data_vec)| {
|
||||||
wep_data_vec.iter_mut().for_each(|(_, idx)| {
|
wep_data_vec.iter_mut().for_each(|(_, idx)| {
|
||||||
let b: Address = (*wep_base).into();
|
let b: Address = (*wep_base).into();
|
||||||
batcher.read_into(b + * idx * 0x4, idx);
|
batcher.read_into(b + u64::saturating_mul(*idx as u64, 0x4), idx);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
drop(batcher);
|
drop(batcher);
|
||||||
|
103
src/dma/mod.rs
103
src/dma/mod.rs
@ -76,10 +76,18 @@ pub async fn run(radar_data: ArcRwlockRadarData, connector: Connector, pcileech_
|
|||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|(_, pawn)| pawn)
|
.map(|(_, pawn)| pawn)
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
pawns.push(data.local_pawn.into());
|
|
||||||
|
|
||||||
|
pawns.push(data.local_pawn.into());
|
||||||
|
|
||||||
|
let prev_holder = data.bomb_holder;
|
||||||
|
|
||||||
data.bomb_holder = ctx.get_c4_holder(pawns, data.entity_list.into(), &data);
|
data.bomb_holder = ctx.get_c4_holder(pawns, data.entity_list.into(), &data);
|
||||||
|
|
||||||
|
if data.bomb_holder.is_some() && prev_holder.is_none() {
|
||||||
|
log::debug!("Bomb picked up by player");
|
||||||
|
data.bomb_dropped = false;
|
||||||
|
}
|
||||||
|
|
||||||
data.recheck_bomb_holder = false;
|
data.recheck_bomb_holder = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,18 +146,25 @@ pub async fn run(radar_data: ArcRwlockRadarData, connector: Connector, pcileech_
|
|||||||
|
|
||||||
// Bomb
|
// Bomb
|
||||||
if data.bomb_dropped || data.bomb_planted {
|
if data.bomb_dropped || data.bomb_planted {
|
||||||
let node = ctx.process.read_addr64(
|
if let Ok(node) = ctx.process.read_addr64(
|
||||||
data.bomb + cs2dumper::client::C_BaseEntity::m_pGameSceneNode as u64
|
data.bomb + cs2dumper::client::C_BaseEntity::m_pGameSceneNode as u64
|
||||||
).unwrap();
|
) {
|
||||||
let pos = ctx.process.read(node + cs2dumper::client::CGameSceneNode::m_vecAbsOrigin).unwrap();
|
if let Ok(pos) = ctx.process.read(node + cs2dumper::client::CGameSceneNode::m_vecAbsOrigin) {
|
||||||
|
entity_data.push(EntityData::Bomb(BombData::new(pos, data.bomb_planted)));
|
||||||
entity_data.push(EntityData::Bomb(BombData::new(pos, data.bomb_planted)));
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Local player
|
// Local player
|
||||||
let local_data = ctx.batched_player_read(
|
let local_data = match ctx.batched_player_read(
|
||||||
data.local.into(), data.local_pawn.into()
|
data.local.into(), data.local_pawn.into()
|
||||||
).unwrap();
|
) {
|
||||||
|
Ok(data) => data,
|
||||||
|
Err(e) => {
|
||||||
|
log::warn!("Failed to read local player data: {}", e);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
if local_data.health > 0 {
|
if local_data.health > 0 {
|
||||||
let has_bomb = match data.bomb_holder {
|
let has_bomb = match data.bomb_holder {
|
||||||
@ -160,7 +175,7 @@ pub async fn run(radar_data: ArcRwlockRadarData, connector: Connector, pcileech_
|
|||||||
entity_data.push(
|
entity_data.push(
|
||||||
EntityData::Player(
|
EntityData::Player(
|
||||||
PlayerData::new(
|
PlayerData::new(
|
||||||
local_data.pos,
|
local_data.pos,
|
||||||
local_data.yaw,
|
local_data.yaw,
|
||||||
PlayerType::Local,
|
PlayerType::Local,
|
||||||
has_bomb,
|
has_bomb,
|
||||||
@ -175,41 +190,47 @@ pub async fn run(radar_data: ArcRwlockRadarData, connector: Connector, pcileech_
|
|||||||
|
|
||||||
// Other players
|
// Other players
|
||||||
for (controller, pawn) in &data.players {
|
for (controller, pawn) in &data.players {
|
||||||
let player_data = ctx.batched_player_read(*controller, *pawn).unwrap();
|
match ctx.batched_player_read(*controller, *pawn) {
|
||||||
|
Ok(player_data) => {
|
||||||
|
if player_data.health < 1 {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if player_data.health < 1 {
|
let has_bomb = match data.bomb_holder {
|
||||||
continue;
|
Some(bh) => *pawn == bh,
|
||||||
}
|
None => false,
|
||||||
|
};
|
||||||
|
|
||||||
let has_bomb = match data.bomb_holder {
|
let player_type = {
|
||||||
Some(bh) => *pawn == bh,
|
if local_data.team != player_data.team {
|
||||||
None => false,
|
PlayerType::Enemy
|
||||||
};
|
} else if local_data.team == player_data.team {
|
||||||
|
PlayerType::Team
|
||||||
|
} else {
|
||||||
|
PlayerType::Unknown
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
let player_type = {
|
entity_data.push(
|
||||||
if local_data.team != player_data.team {
|
EntityData::Player(
|
||||||
PlayerType::Enemy
|
PlayerData::new(
|
||||||
} else if local_data.team == player_data.team {
|
player_data.pos,
|
||||||
PlayerType::Team
|
player_data.yaw,
|
||||||
} else {
|
player_type,
|
||||||
PlayerType::Unknown
|
has_bomb,
|
||||||
|
player_data.has_awp,
|
||||||
|
player_data.is_scoped,
|
||||||
|
player_data.player_name,
|
||||||
|
player_data.weapon_id
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
},
|
||||||
|
Err(e) => {
|
||||||
|
log::warn!("Failed to read player data: {}", e);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
entity_data.push(
|
|
||||||
EntityData::Player(
|
|
||||||
PlayerData::new(
|
|
||||||
player_data.pos,
|
|
||||||
player_data.yaw,
|
|
||||||
player_type,
|
|
||||||
has_bomb,
|
|
||||||
player_data.has_awp,
|
|
||||||
player_data.is_scoped,
|
|
||||||
player_data.player_name,
|
|
||||||
player_data.weapon_id
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut radar = radar_data.write().await;
|
let mut radar = radar_data.write().await;
|
||||||
|
@ -104,10 +104,12 @@ impl CsData {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if self.bomb_planted {
|
} else if self.bomb_planted {
|
||||||
let bomb = ctx.get_plantedc4()
|
match ctx.get_plantedc4() {
|
||||||
.expect("Failed to get planted bomb");
|
Ok(bomb) => self.bomb = bomb,
|
||||||
|
Err(e) => {
|
||||||
self.bomb = bomb;
|
log::warn!("Failed to get planted bomb: {}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user