rosu-memory-lib 1.3.1

A library to read osu! memory
Documentation
use crate::reader::beatmap::stable::memory::mode;
use crate::reader::common::stable::memory::check_game_state;
use crate::reader::common::GameMode;
use crate::reader::common::GameState;
use crate::reader::overlay::common::{Key, KeyOverlay};
use crate::reader::structs::State;
use crate::reader::user::stable::memory::playmode;
use crate::Error;
use rosu_mem::process::{Process, ProcessTraits};

pub fn ruleset_addr(p: &Process, state: &mut State) -> Result<i32, Error> {
    if check_game_state(p, state, GameState::Playing)?
        && playmode(p, state)? == 0
        && mode(p, state)? == GameMode::Osu
    {
        let ruleset_ptr = p.read_i32(state.addresses.rulesets - 0xb)?;
        let ruleset_addr = p.read_i32(ruleset_ptr + 0x4)?;
        Ok(ruleset_addr)
    } else {
        Err(Error::NotAvailable("Not Playing".to_string()))
    }
}

pub fn key_ptr(p: &Process, state: &mut State) -> Result<i32, Error> {
    let ruleset_addr = ruleset_addr(p, state)?;
    let key_ptr = p.read_i32(ruleset_addr + 0xb0)?;
    Ok(key_ptr)
}

pub fn key_overlay_std(p: &Process, state: &mut State) -> Result<KeyOverlay, Error> {
    let key_ptr = key_ptr(p, state)?;
    let temp = p.read_i32(key_ptr + 0x10)?;
    let key_array_addr = p.read_i32(temp + 0x4)?;
    let items_size = p.read_i32(key_array_addr + 0x4)?;

    if items_size < 4 {
        return Err(Error::MemoryRead(format!(
            "Key array size is less than 4, got {}",
            items_size
        )));
    }

    let key_1_pressed = p.read_i32(p.read_i32(key_array_addr + 0x8)? + 0x1C)? != 0;
    let key_1_count = p.read_i32(p.read_i32(key_array_addr + 0x8)? + 0x14)?;

    let key_2_pressed = p.read_i32(p.read_i32(key_array_addr + 0xc)? + 0x1C)? != 0;
    let key_2_count = p.read_i32(p.read_i32(key_array_addr + 0xc)? + 0x14)?;

    let mouse_1_pressed = p.read_i32(p.read_i32(key_array_addr + 0x10)? + 0x1C)? != 0;
    let mouse_1_count = p.read_i32(p.read_i32(key_array_addr + 0x10)? + 0x14)?;

    let mouse_2_pressed = p.read_i32(p.read_i32(key_array_addr + 0x14)? + 0x1C)? != 0;
    let mouse_2_count = p.read_i32(p.read_i32(key_array_addr + 0x14)? + 0x14)?;

    Ok(KeyOverlay {
        key_1: Key {
            pressed: key_1_pressed,
            count: key_1_count,
        },
        key_2: Key {
            pressed: key_2_pressed,
            count: key_2_count,
        },
        mouse_1: Key {
            pressed: mouse_1_pressed,
            count: mouse_1_count,
        },
        mouse_2: Key {
            pressed: mouse_2_pressed,
            count: mouse_2_count,
        },
    })
}