SA-MP Forums

SA-MP Forums (
-   Plugin Development (
-   -   [Tool/Web/Other] Rust SA:MP SDK (

EvaBaka 14/03/2018 10:39 AM

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

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

  • 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

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;


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


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

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


// 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.


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

// native: WithoutArguments();

Call natives and public functions.

// 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.


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

Sia 14/03/2018 10:54 AM

Re: Rust SA:MP SDK
Nice proga SDK plygin

YourShadow 14/03/2018 07:25 PM

Re: Rust SA:MP SDK
Very good.

Kaperstone 14/03/2018 11:42 PM

Re: Rust SA:MP SDK

KayJ 15/03/2018 01:11 AM

Re: Rust SA:MP SDK

SyS 15/03/2018 01:21 AM

Re: Rust SA:MP SDK
Nice :)

Zeth 15/03/2018 09:01 AM

Re: Rust SA:MP SDK

KashCherry 15/03/2018 10:41 AM

Re: Rust SA:MP SDK
Nice 8)

NaS 15/03/2018 11:03 AM

Re: Rust SA:MP SDK
Nice, definitely going to try it out.

PT 15/03/2018 01:07 PM

Re: Rust SA:MP SDK
It’s very interesting this plugin

Nice work

Kaperstone 15/03/2018 01:59 PM

Re: Rust SA:MP SDK
Made an example code of usage.

EvaBaka 15/03/2018 10:29 PM

Re: Rust SA:MP SDK
Check out Get Started wiki page.

Kaperstone 15/03/2018 10:59 PM

Re: Rust SA:MP SDK

Originally Posted by EvaBaka (Post 4003377)
Check out Get Started wiki page.

You have forgotten to state that nightly toolchain needs to be installed.

or otherwise it will error

  --> /root/.cargo/registry/src/
12 | #![feature(macro_reexport)]
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: aborting due to previous error

error: Could not compile `samp-sdk`.

To learn more, run the command again with --verbose.

All times are GMT. The time now is 04:10 PM.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.