Привет! Стало интересно глянуть, что за язык такой rust 🤔
Как оказалось, даже плагины для сампа писать можно
(ниже прикрепил сам плагин и исх)
Работает это точно также, как и плагины на С++, попали в игру и дальше:
Тело хука:
Как оказалось, даже плагины для сампа писать можно
(ниже прикрепил сам плагин и исх)
Работает это точно также, как и плагины на С++, попали в игру и дальше:
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();
}
}
}