rosu_memory_lib/reader/overlay/stable/
memory.rs

1use 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}