From 8cf6664c4b9e80220a8fe49a91662b822b852d9b Mon Sep 17 00:00:00 2001 From: Janek <development@superyu.xyz> Date: Tue, 16 Apr 2024 15:18:50 +0200 Subject: [PATCH] wip: more batching in bomb search algo --- src/dma/threaddata/mod.rs | 71 +++++++++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 25 deletions(-) diff --git a/src/dma/threaddata/mod.rs b/src/dma/threaddata/mod.rs index f08deac..a540a6e 100755 --- a/src/dma/threaddata/mod.rs +++ b/src/dma/threaddata/mod.rs @@ -39,37 +39,59 @@ pub struct CsData { impl CsData { pub fn update_bomb(&mut self, ctx: &mut DmaCtx) { - // If the bomb is dropped, do a reverse entity list loop with early exit when we found the bomb. ( Now with BATCHING!!! :O ) if self.bomb_dropped { + // If the bomb is dropped, do a reverse entity list loop with early exit when we found the bomb. - // We search in chunks of 128 indexes - for chunk in &(0..=self.highest_index).rev().into_iter().chunks(128) { - let mut data_vec: Vec<(u64, i32)> = chunk - .map(|idx| (0u64, idx)) + // We search in chunks of 512 indexes + for chunk in &(0..=self.highest_index).rev().into_iter().chunks(512) { + // data vec: (address, index, entity_identity_ptr, designer_name_ptr, designer_name_buff) + let mut data_vec: Vec<(u64, i32, u64, u64, [u8; 2])> = chunk + .map(|idx| (0u64, idx, 0u64, 0u64, [0u8; 2])) .collect(); - { - let mut batcher = ctx.process.batcher(); - let ent_list: Address = self.entity_list.into(); + // Get the entity handle + let mut batcher = ctx.process.batcher(); + data_vec.iter_mut().for_each(|(handle, idx, _, _, _)| { + let base: Address = (self.entity_list).into(); + batcher.read_into(base + 8 * (*idx >> 9) + 16, handle); + }); + drop(batcher); - data_vec.iter_mut().for_each(|(data, idx)| { - batcher.read_into(ent_list + 8 * (*idx >> 9) + 16, data); - }); - } + // Get the actual entity address + let mut batcher = ctx.process.batcher(); + data_vec.iter_mut().for_each(|(ptr, index, _, _, _)| { + let base: Address = (*ptr).into(); + batcher.read_into(base + 120 * (*index & 0x1FF), ptr); + }); + drop(batcher); - { - let mut batcher = ctx.process.batcher(); - - data_vec.iter_mut().for_each(|(ptr, index)| { - let handle: Address = (*ptr).into(); - batcher.read_into(handle + 120 * (*index & 0x1FF), ptr); - }); - } + // Get the entity identity address + let mut batcher = ctx.process.batcher(); + data_vec.iter_mut().for_each(|(ptr, _, ent_ident_ptr, _, _)| { + let base: Address = (*ptr).into(); + batcher.read_into(base + cs2dumper::client::CEntityInstance::m_pEntity, ent_ident_ptr); + }); + drop(batcher); - // You can actually optimize this EVEN more - let bomb = data_vec.into_iter().find(|(ptr, _)| { - // By doing this with a batcher too... - ctx.is_dropped_c4((*ptr).into()).unwrap_or(false) + // Get the designer name address + let mut batcher = ctx.process.batcher(); + data_vec.iter_mut().for_each(|(_, _, ent_ident_ptr, designer_name_ptr, _)| { + let base: Address = (*ent_ident_ptr).into(); + batcher.read_into(base + cs2dumper::client::CEntityIdentity::m_designerName, designer_name_ptr); + }); + drop(batcher); + + // Read out 2 bytes of the designer name + let mut batcher = ctx.process.batcher(); + data_vec.iter_mut().for_each(|(_, _, _, designer_name_ptr, designer_name_buff)| { + let base: Address = (*designer_name_ptr).into(); + batcher.read_into(base + 7, designer_name_buff); + }); + drop(batcher); + + // Actually check for the right designer name + let bomb = data_vec.into_iter().find(|(_, _, _, _, designer_name_buff)| { + designer_name_buff == "c4".as_bytes() }); if let Some(bomb) = bomb { @@ -77,7 +99,6 @@ impl CsData { break; } } - } else if self.bomb_planted { let bomb = ctx.get_plantedc4() .expect("Failed to get planted bomb");