NAV
csharp

Getting Started

namespace Oxide.Plugins
{
    [Info("EpicStuff", "Unknown", 0.1)]
    [Description("Makes epic stuff happen")]

    class EpicStuff : HurtworldPlugin
    {
        // The rest of the code and magic
    }
}

The Title variable is what defines your plugin. This should be a unique codename or short description such as Pets.

The Author variable is used to show who made the plugin. This should match your OxideMod.org username if releasing.

The Version variable is used to tell if the plugin is outdated or not, and is incremented with each release. Semantic Versioning recommended.

The Description variable helps explain to users what your plugin does, in case the title isn’t enough. Make it good, but not too long!

Universal Hooks

Available for all supported games

7 Days to Die Blockstorm Hide & Hold Out Hurtworld Reign of Kings Rust Rust Legacy The Forest Unturned

Init

void Init()
{
    Puts("Init works!");
}

Loaded

void Loaded()
{
    Puts("Loaded works!");
}

Unload

void Unload()
{
    Puts("Save files, destroy timers, etc");
}

LoadDefaultConfig

protected override void LoadDefaultConfig()
{
    Puts("Default configuration created");
}

OnFrame

void OnFrame()
{
    Puts("OnFrame works!");
}

OnPluginLoaded

void OnPluginLoaded(Plugin name)
{
    Puts($"Plugin '{name}' has been loaded");
}

OnPluginUnloaded

void OnPluginUnloaded(Plugin name)
{
    Puts($"Plugin '{name}' has been unloaded");
}

OnServerInitialized

void OnServerInitialized()
{
    Puts("OnServerInitialized works!");
}

OnServerSave

void OnServerSave
{
    Puts("OnServerSave works!");
}

OnUserPermissionGranted

void OnUserPermissionGranted(string id, string perm)
{
    Puts($"User '{id}' granted permission: {perm}");
}

OnUserPermissionRevoked

void OnUserPermissionRevoked(string id, string perm)
{
    Puts($"User '{id}' revoked permission: {perm}");
}

OnUserGroupAdded

void OnUserGroupAdded(string id, string name)
{
    Puts($"User '{id}' added to group: {name}");
}

OnUserGroupRemoved

void OnUserGroupRemoved(string id, string name)
{
    Puts($"User '{id}' removed from group: {name}");
}

OnGroupPermissionGranted

void OnGroupPermissionGranted(string name, string perm)
{
    Puts($"Group '{name}' granted permission: {perm}");
}

OnGroupPermissionRevoked

void OnGroupPermissionRevoked(string name, string perm)
{
    Puts($"Group '{name}' revoked permission: {perm}");
}

Timers (Basic)

Timers are great for delaying code, allowing it to be run later.

Single timer

timer.Once(3f, () =>
{
    Puts("Hello world!")
});

Executes the specified function once after the specified delay.

Repeating timer

timer.Repeat(5f, 0, () =>
{
    Puts("Hello world!")
});

Executes the specified function every “delay” seconds.

If “repeats” is specified, the function will only be called “repeats” times.

Next frame timer

NextFrame(() =>
{
    Puts("Hello world!");
});

Executes the specified function at the next frame.

Web Requests

Web requests allow you to send a HTTP GET or POST to a specified URL.

The request will return true if the web request was sent, false if not. The callback is called with 2 parameters - an integer HTTP response code and a string response.

Basic Get method

using Oxide.Core.Libraries.Covalence;

namespace Oxide.Plugins
{
    [Info("EpicStuff", "Unknown", 1.0)]
    [Description("This example illustrates how to use a GET WebRequest")]

    class EpicStuff : CovalencePlugin
    {
        [Command("get")]
        void GetRequest(IPlayer player, string command, string[] args)
        {
            webrequest.EnqueueGet("http://www.google.com/search?q=oxide", (code, response) => GetCallback(code, response, player), this);
        }

        void GetCallback(int code, string response, IPlayer player)
        {
            if (response == null || code != 200)
            {
                Puts($"Error: {code} - Couldn't get an answer from Google for {player.Name}");
                return;
            }

            Puts($"Google answered for {player.Name}: {response}");
        }
    }
}

This uses the raw connection to a web page as you would on your browser.

Basic POST method

using Oxide.Core.Libraries.Covalence;

namespace Oxide.Plugins
{
    [Info("EpicStuff", "Unknown", 1.0)]
    [Description("This example illustrates how to use a POST WebRequest")]

    class EpicStuff : CovalencePlugin
    {
        [Command("post")]
        void PostRequest(IPlayer player, string command, string[] args)
        {
            webrequest.EnqueuePost("http://www.google.com/search?q=oxide", "param1=value1&param2=value2", (code, response) => PostCallback(code, response, player), this);
        }

        void PostCallback(int code, string response, IPlayer player)
        {
            if (response == null || code != 200)
            {
                Puts($"Error: {code} - Couldn't get an answer from Google for {player.Name}");
                return;
            }
            Puts("Google answered for " + player.Name + ": " + response);
        }
    }
}

Advanced GET method

using Oxide.Core.Libraries.Covalence;

namespace Oxide.Plugins
{
    [Info("EpicStuff", "Unknown", 1.0)]
    [Description("This example illustrates how to use a GET WebRequest")]

    class EpicStuff : CovalencePlugin
    {
        [Command("get")]
        void GetRequest(IPlayer player, string command, string[] args)
        {
            // Set a custom timeout (in milliseconds)
            var timeout = 200f;

            // Set some custom request headers (eg. for HTTP Basic Auth)
            var headers = new Dictionary<string, string> { { "header", "value" } };

            webrequest.EnqueueGet("http://www.google.com/search?q=oxide", (code, response) => GetCallback(code, response, player), this, headers, timeout);
        }

        void GetCallback(int code, string response, IPlayer player)
        {
            if (response == null || code != 200)
            {
                Puts($"Error: {code} - Couldn't get an answer from Google for {player.Name}");
                return;
            }

            Puts($"Google answered for {player.Name}: {response}");
        }
    }
}

Advanced POST method

using Oxide.Core.Libraries.Covalence;

namespace Oxide.Plugins
{
    [Info("EpicStuff", "Unknown", 1.0)]
    [Description("This example illustrates how to use a POST WebRequest")]

    class EpicStuff : CovalencePlugin
    {
        [Command("post")]
        void PostRequest(IPlayer player, string command, string[] args)
        {
            // Set a timeout (in milliseconds)
            var timeout = 200f;

            // Set some custom request headers (eg. for HTTP Basic Auth)
            var headers = new Dictionary<string, string> { { "header", "value" } };

            webrequest.EnqueuePost("http://www.google.com/search?q=oxide", "param1=value1&param2=value2", (code, response) => PostCallback(code, response, player), this, headers, timeout);
        }

        void PostCallback(int code, string response, IPlayer player)
        {
            if (response == null || code != 200)
            {
                Puts($"Error: {code} - Couldn't get an answer from Google for {player.Name}");
                return;
            }
            Puts("Google answered for " + player.Name + ": " + response);
        }
    }
}

Plugin Calling

Oxide allows you to expose methods in your plugin and make them available to other plugins. This allows you to access objects or properties from other plugins without having to replicate functionality yourself.

Exposing a plugin’s method

namespace Oxide.Plugins
{
    [Info("EpicStuff", "Unknown", 0.1)]
    [Description("Makes epic stuff happen")]

    class EpicStuff : CovalencePlugin
    {
        // Plugin methods can be a simple bool that is returned
        bool GetReturn()
        {
            return true;
        }

        // Plugin methods can take parameters and return simple types
        string TakeParam(string param, int secondParam)
        {
            if (param == "first parameter") return param;
            else return "First parameter didn't match!";
        }

        // To return complex types, they should first be converted
        // into builtin types (e.g. JSON.net types like JObject, JArray, etc. or builtin
        // collections like System.Collections.Generic.Dictionary)
        JObject ReturnObject()
        {
            var myObject = new JObject();
            myObject["key"] = "value";
            myObject["array"] = new JArray();
            return myObject;
        }

        // Plugin methods don't have to return something
        void SendMessage()
        {
            Puts("You just called the 'SendMessage' method!");
        }
    }
}

Exposing a plugin’s method allows other plugins to call that method.

For example, you could write a plugin that does some player management, then allow other plugins to “query” it to get a list of players who have certain privileges set in the original plugin.

Calling a plugin’s method

namespace Oxide.Plugins
{
    [Info("SecondEpicStuff", "Unknown", 0.1)]
    [Description("Makes more epic stuff happen")]

    class SecondEpicStuff : CovalencePlugin
    {
        // First, add a reference to the plugin you are trying to call
        // The name of this field needs to be the exact name of the desired plugin
        // eg. We are referencing the example plugin above which is called 'EpicStuff'
        [PluginReference] Plugin EpicStuff;

        // It's a good idea to check if the plugin you're trying to call
        // has been loaded by oxide (otherwise you can't call the method)
        void OnServerInitialized()
        {
            // Note: Trying to do this check in the plugin Init() method may
            // fail, as the plugin load order may be different each time
            if (EpicStuff == null)
            {
                PrintWarning("Plugin 'EpicStuff' was not found!");
            }
        }

        void CallPlugin()
        {
            // Plugin methods return objects, so cast the API call to the type
            // you're expecting
            var getTypedReturn = (bool)EpicStuff?.Call("GetReturn");

            // Send parameters through as variables after the method name
            var takeParam = (string)EpicStuff?.Call("TakeParam", "param1", 1024);

            // Use JSON.net to process the returned object
            var returnedObject = EpicStuff?.Call("ReturnObject");

            // Call a plugin to do some work without returning anything
            EpicStuff?.Call("SendMessage");
        }
    }
}

Calling a plugin’s method allows you to access results from another plugin.

Styling Messages

Render the text in boldface

We are <b>not</b> amused.

Render the text in italics

We are <i>usually</i> not amused.

It is possible to apply more than one style to a section of text by nesting one element inside another.

We are <b><i>definitely not</i></b> amused

Note the ordering of the ending tags, which is in reverse to that of the starting tags. The reason for this is perhaps clearer when you consider that the inner tags need not span the whole text of the outermost element.

We are <b>absolutely <i>definitely</i> not</b> amused

Change the size of text, by pixel value

We are <size=50>largely</size> unaffected.

Change the color of text

<color=#00ffffff>Hello world</color>

Messages sent from the server via plugins can be stylized using basic HTML. Styling is limited to bold, italic, size, and color.

The color can be specified in the traditional HTML format. #rrggbbaa… where the letters correspond to pairs of hexadecimal digits denoting the red, green, blue and alpha (transparency) values for the color.

Another option is to use the name of the color. This is easier to understand but naturally, the range of colors is limited and full opacity is always assumed. <color=cyan>… The available color names are given in the table below.

Color Name Hex Value Swatch
aqua (same as cyan) #00ffffff
black #000000ff
blue #0000ffff
brown #a52a2aff
cyan (same as aqua) #00ffffff
darkblue #0000a0ff
fuchsia (same as magenta) #ff00ffff
green #008000ff
grey #808080ff
lightblue #add8e6ff
lime #00ff00ff
magenta (same as fuchsia) #ff00ffff
maroon #800000ff
navy #000080ff
olive #808000ff
orange #ffa500ff
purple #800080ff
red #ff0000ff
silver #c0c0c0ff
teal #008080ff
white #ffffffff
yellow #ffff00ff

Source: http://docs.unity3d.com/Manual/StyledText.html