Исходник Информация SAMP PLUGIN в RUST пример

g305noobo

Известный
Автор темы
211
188
Привет! Стало интересно глянуть, что за язык такой rust 🤔
Как оказалось, даже плагины для сампа писать можно o_O
(ниже прикрепил сам плагин и исх)

Работает это точно также, как и плагины на С++, попали в игру и дальше:
C++:
const DLL_PROCESS_ATTACH: u32 = 1;
const DLL_PROCESS_DETACH: u32 = 0;
#[no_mangle]
pub extern "system" fn DllMain(_h_module: *mut u8, dw_reason: u32, _lp_reserved: *mut u8) -> bool {
    match dw_reason {
        DLL_PROCESS_ATTACH => {
            println!("DLL: load");
            match install_hook() {
                Ok(()) => println!("MinHook: installed"),
                Err(err) => eprintln!("MinHook: fail -> {:?}", err),
            }
        }
        DLL_PROCESS_DETACH => {
            println!("DLL: unload");
            if let Err(err) = unsafe { MinHook::remove_hook(OFFSET_CTIMER) } {
                // Обработка ошибки, например, вывод её или обработка исключения.
                println!("MinHook: error removing hook {:?}", err);
            }
        }
        _ => {}
    }
    true
}
C++:
fn install_hook() -> Result<(), MH_STATUS> {
    unsafe {
        let hook_status = MinHook::create_hook(OFFSET_CTIMER, game_loop as *mut _)?;

        // Получаем указатель на оригинальную функцию game_loop
        CTIMER = Some(std::mem::transmute(hook_status));
        MinHook::enable_hook(OFFSET_CTIMER)?;
        Ok(())
    }
}
Тело хука:
C++:
extern "C" fn command(_args: *const i8) {
    samp::add_chat_message(0, "{edb634}hello world!!!\0");
}
extern "C" fn game_loop() {
    unsafe {
        // Вызываем оригинальную функцию game_loop, если она была сохранена
        if let Some(orig_func) = CTIMER {

            if !INITED && samp::init() {
                INITED = true;
                println!("DLL: samp inited!");

                gta::add_message_jump_q("~g~Plugin Loaded\0", 5000, 0, false);
                samp::add_chat_message(0, "{32a854}Rust samp plugin loaded!\0");

                samp::register_chat_command("rust\0", command);
            }

            orig_func();
        }
    }
}
1712543801865.jpeg
 

Вложения

  • rust_samp_plugin.dll
    246 KB · Просмотры: 0
  • rust_samp_plugin.7z
    2 KB · Просмотры: 6