diff --git a/src/dma/threaddata/mod.rs b/src/dma/threaddata/mod.rs index 5bc02f2..5264716 100755 --- a/src/dma/threaddata/mod.rs +++ b/src/dma/threaddata/mod.rs @@ -34,41 +34,42 @@ impl CsData { // 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 { - // We search 16 entities at a time. - for chunk in &(0..=self.highest_index).rev().chunks(16) { + // 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)) + .collect(); - let indexes: Vec<i32> = chunk.collect(); - - let mut data_array = [(0u64, 0i32); 16]; { let mut batcher = ctx.process.batcher(); let ent_list: Address = self.entity_list.into(); - data_array.iter_mut().zip(indexes).for_each(|((data_ptr, data_idx), index)| { - batcher.read_into(ent_list + 8 * (index >> 9) + 16, data_ptr); - *data_idx = index; + data_vec.iter_mut().for_each(|(data, idx)| { + batcher.read_into(ent_list + 8 * (*idx >> 9) + 16, data); }); } { let mut batcher = ctx.process.batcher(); - - data_array.iter_mut().for_each(|(ptr, index)| { + + data_vec.iter_mut().for_each(|(ptr, index)| { let handle: Address = (*ptr).into(); batcher.read_into(handle + 120 * (*index & 0x1FF), ptr); }); } // You can actually optimize this EVEN more - let bomb = data_array.into_iter().find(|(ptr, _)| { + let bomb = data_vec.into_iter().find(|(ptr, _)| { // By doing this with a batcher too... ctx.is_dropped_c4((*ptr).into()).unwrap_or(false) }); if let Some(bomb) = bomb { self.bomb = bomb.0.into(); + break; } } + } else if self.bomb_planted { let bomb = ctx.get_plantedc4() .expect("Failed to get planted bomb");