SA-MP Forums

Go Back   SA-MP Forums > SA-MP Scripting and Plugins > Plugin Development

Thread Tools Display Modes
Prev Previous Post   Next Post Next
Old 14/03/2018, 11:39 AM   #1
Little Clucker
Join Date: Jul 2016
Posts: 3
Reputation: 23
Default Rust SA:MP SDK

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.

Last edited by EvaBaka; 15/03/2018 at 07:39 PM.
EvaBaka is offline   Reply With Quote

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Similar Threads
Thread Thread Starter Forum Replies Last Post
Rust On 4GB RAM K0P Everything and Nothing 20 28/12/2016 01:34 AM
[Projeto] San Andreas Rust (DayZ/Rust/Survival) JPedro Português/Portuguese 38 15/10/2015 03:31 AM
[Off] Rust para SA-MP PratesPlay Português/Portuguese 17 27/02/2014 08:29 PM
Anybody got Rust on steam to trade? RedJohn Everything and Nothing 10 23/02/2014 12:13 AM

All times are GMT. The time now is 06:01 AM.

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