[Tool/Web/Other] Rust SA:MP SDK
#1

It's a Rust library allows you to write plugins in Rust.

Features
Hides most of type coercion. You don't need make a cell type as a String or other things yourself.

Macros:
  • new_plugin! that defines a plugin and exports functions.
  • define_native! defines a native and parses arguments.
  • log! calls logprinft funciton.
  • natives! makes a vec of your natives.
  • get_string! and get_array! convert pointers to a slice or a String.
  • set_string! sets a string to an AMX by a physical address.
Make a new plugin
Code:
struct Plugin {
    version: &'static str,
    amx_count: u32,
}

impl Plugin {
    fn load(&self) -> bool {
        log!("Plugin is loaded. Version: {}", self.version);
        return true;
    }

    fn amx_load(&mut self, amx: &AMX) -> Cell {
        let natives = natives![
            { "MyFunction", my_function }
        ];

        match amx.register(natives) {
            Ok(_) => log!("Natives are successful loaded"),
            Err(err) => log!("Whoops, there is an error {:?}", err),
        }

        self.amx_count += 1;

        AMX_ERR_NONE
    }

    fn amx_unload(&mut self, _: &AMX) -> Cell {
        self.amx_count -= 1;

        AMX_ERR_NONE
    }

    fn my_function(&self, _amx: &AMX, player_id: i32) -> AmxResult<Cell> {
        Ok(-player_id)
    }
}

impl Default for Plugin {
    fn default() -> Self {
        Plugin {
            version: "0.1",
            amx_count: 0,
        }
    }
}

new_plugin!(Plugin);

// Also you can make a plugin with ProcessTick support.
new_plugin!(Plugin with process_tick)
Define a native function.
Hides arguments parsing inside the macro.

All you need are to define a method function_name in your new plugin with given arguments.

Code:
// native: FunctionName(int_arg, &float_arg);
define_native!(function_name, int_arg: i32, float_ref_arg: ref f32);

// native: WithoutArguments();
define_native(function_name);
Call natives and public functions.
Code:
// Broadcast to all subscribers that a user have changed his name.
fn notify(&self, amx: AMX, player_id: u32, old_name: String, new_name: String) -> AmxResult<Cell> {
    exec_public!(amx, "OnPlayerNameChanged"; player_id, old_name => string, new_name => string) 
}
Documentation and examples
Here is documentation and there is an example plugin (Memcached library) and here is a more simple example.

Repository
https://github.com/ZOTTCE/samp-sdk

Ask your questions and more popular will be in wiki on GitHub.
Reply


Messages In This Thread
Rust SA:MP SDK - by EvaBaka - 14.03.2018, 10:39
Re: Rust SA:MP SDK - by Sia - 14.03.2018, 10:54
Re: Rust SA:MP SDK - by YourShadow - 14.03.2018, 19:25
Re: Rust SA:MP SDK - by Kaperstone - 14.03.2018, 23:42
Re: Rust SA:MP SDK - by KayJ - 15.03.2018, 01:11
Re: Rust SA:MP SDK - by SyS - 15.03.2018, 01:21
Re: Rust SA:MP SDK - by Zeth - 15.03.2018, 09:01
Re: Rust SA:MP SDK - by KashCherry - 15.03.2018, 10:41
Re: Rust SA:MP SDK - by NaS - 15.03.2018, 11:03
Re: Rust SA:MP SDK - by PT - 15.03.2018, 13:07
Re: Rust SA:MP SDK - by Kaperstone - 15.03.2018, 13:59
Re: Rust SA:MP SDK - by EvaBaka - 15.03.2018, 22:29
Re: Rust SA:MP SDK - by Kaperstone - 15.03.2018, 22:59

Forum Jump:


Users browsing this thread: 1 Guest(s)