rosu_memory_lib/reader/overlay/stable/
memory.rs1use crate::reader::beatmap::stable::memory::mode;
2use crate::reader::common::stable::memory::check_game_state;
3use crate::reader::common::GameMode;
4use crate::reader::common::GameState;
5use crate::reader::overlay::common::{Key, KeyOverlay};
6use crate::reader::structs::State;
7use crate::reader::user::stable::memory::playmode;
8use crate::Error;
9use rosu_mem::process::{Process, ProcessTraits};
10
11pub fn ruleset_addr(p: &Process, state: &mut State) -> Result<i32, Error> {
12 if check_game_state(p, state, GameState::Playing)?
13 && playmode(p, state)? == 0
14 && mode(p, state)? == GameMode::Osu
15 {
16 let ruleset_ptr = p.read_i32(state.addresses.rulesets - 0xb)?;
17 let ruleset_addr = p.read_i32(ruleset_ptr + 0x4)?;
18 Ok(ruleset_addr)
19 } else {
20 Err(Error::NotAvailable("Not Playing".to_string()))
21 }
22}
23
24pub fn key_ptr(p: &Process, state: &mut State) -> Result<i32, Error> {
25 let ruleset_addr = ruleset_addr(p, state)?;
26 let key_ptr = p.read_i32(ruleset_addr + 0xb0)?;
27 Ok(key_ptr)
28}
29
30pub fn key_overlay_std(p: &Process, state: &mut State) -> Result<KeyOverlay, Error> {
31 let key_ptr = key_ptr(p, state)?;
32 let temp = p.read_i32(key_ptr + 0x10)?;
33 let key_array_addr = p.read_i32(temp + 0x4)?;
34 let items_size = p.read_i32(key_array_addr + 0x4)?;
35
36 if items_size < 4 {
37 return Err(Error::MemoryRead(format!(
38 "Key array size is less than 4, got {}",
39 items_size
40 )));
41 }
42
43 let key_1_pressed = p.read_i32(p.read_i32(key_array_addr + 0x8)? + 0x1C)? != 0;
44 let key_1_count = p.read_i32(p.read_i32(key_array_addr + 0x8)? + 0x14)?;
45
46 let key_2_pressed = p.read_i32(p.read_i32(key_array_addr + 0xc)? + 0x1C)? != 0;
47 let key_2_count = p.read_i32(p.read_i32(key_array_addr + 0xc)? + 0x14)?;
48
49 let mouse_1_pressed = p.read_i32(p.read_i32(key_array_addr + 0x10)? + 0x1C)? != 0;
50 let mouse_1_count = p.read_i32(p.read_i32(key_array_addr + 0x10)? + 0x14)?;
51
52 let mouse_2_pressed = p.read_i32(p.read_i32(key_array_addr + 0x14)? + 0x1C)? != 0;
53 let mouse_2_count = p.read_i32(p.read_i32(key_array_addr + 0x14)? + 0x14)?;
54
55 Ok(KeyOverlay {
56 key_1: Key {
57 pressed: key_1_pressed,
58 count: key_1_count,
59 },
60 key_2: Key {
61 pressed: key_2_pressed,
62 count: key_2_count,
63 },
64 mouse_1: Key {
65 pressed: mouse_1_pressed,
66 count: mouse_1_count,
67 },
68 mouse_2: Key {
69 pressed: mouse_2_pressed,
70 count: mouse_2_count,
71 },
72 })
73}