How to make a Rust craft speed plugin (Oxide/Carbon multipliers)
A plugin that speeds up crafting by scaling the duration of ItemCraftTask instances when a craft starts, using a global multiplier plus optional permission-based multipliers. It hooks OnItemCraft and shortens ItemCraftTask.taskEndTime.
Default Rust crafting forces players to wait through a fixed per-item duration, which slows down progression on servers that want a faster pace. Instead of editing item definitions, you can intercept the craft task the moment a player queues it and shorten how long the workbench takes to finish it. This plugin multiplies the requested speed by a global config value and, when a player holds a matching permission, by the best applicable per-permission multiplier. It applies the change inside OnItemCraft with an ItemCraftTask argument, leaving the craft contents, results and blueprint logic untouched, and ignores the IndustrialCrafter variant of the hook so automated crafter entities keep their normal speed. Result: a single number in the config makes the whole server craft faster, and permissions let you give VIPs an extra boost without separate plugins.
The plugin code
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using Oxide.Core;
using UnityEngine;
namespace Oxide.Plugins
{
[Info("Craft Speed", "RustPluginGenerator", "1.0.0")]
[Description("Speeds up player crafting with a global multiplier and per-permission multipliers.")]
public class CraftSpeed : RustPlugin
{
private const string PermUse = "craftspeed.use";
private PluginConfig config;
private class PluginConfig
{
[JsonProperty("Global multiplier")]
public float GlobalMultiplier = 1.0f;
[JsonProperty("Permission multipliers")]
public Dictionary<string, float> PermissionMultipliers = new Dictionary<string, float>
{
["craftspeed.vip"] = 2.0f,
["craftspeed.elite"] = 3.0f
};
}
protected override void LoadDefaultConfig() => config = new PluginConfig();
protected override void LoadConfig()
{
base.LoadConfig();
try
{
config = Config.ReadObject<PluginConfig>();
if (config == null) throw new Exception();
}
catch
{
PrintWarning("Configuration file is invalid, using defaults");
LoadDefaultConfig();
}
SaveConfig();
}
protected override void SaveConfig() => Config.WriteObject(config);
protected override void LoadDefaultMessages()
{
lang.RegisterMessages(new Dictionary<string, string>
{
["Speed"] = "Your current craft speed multiplier is {0}x.",
["NoPermission"] = "You do not have permission to use this command."
}, this);
}
private string Msg(string key, string userId = null, params object[] args) =>
string.Format(lang.GetMessage(key, this, userId), args);
private void Init()
{
permission.RegisterPermission(PermUse, this);
if (config.PermissionMultipliers != null)
{
foreach (var key in config.PermissionMultipliers.Keys)
{
if (!permission.PermissionExists(key) && !string.IsNullOrEmpty(key))
{
permission.RegisterPermission(key, this);
}
}
}
}
private object OnItemCraft(ItemCraftTask itemCraftTask, BasePlayer owner, Item fromTempBlueprint)
{
if (itemCraftTask == null || owner == null || itemCraftTask.blueprint == null) return null;
float multiplier = GetMultiplier(owner);
if (multiplier <= 1f) return null;
// The craft duration is stored on the blueprint (time in seconds); shorten it proportionally.
float duration = itemCraftTask.blueprint.time;
if (duration <= 1f) return null;
float scaled = duration / multiplier;
// keep at least one second so the task never completes instantly
if (scaled < 1f) scaled = 1f;
itemCraftTask.blueprint.time = scaled;
return null;
}
private float GetMultiplier(BasePlayer player)
{
float best = config.GlobalMultiplier;
if (config.PermissionMultipliers == null) return best;
foreach (var entry in config.PermissionMultipliers)
{
if (string.IsNullOrEmpty(entry.Key)) continue;
if (!permission.UserHasPermission(player.UserIDString, entry.Key)) continue;
if (entry.Value > best) best = entry.Value;
}
return best;
}
[ChatCommand("craftspeed")]
private void CmdCraftSpeed(BasePlayer player, string command, string[] args)
{
if (player == null) return;
if (!permission.UserHasPermission(player.UserIDString, PermUse))
{
SendReply(player, Msg("NoPermission", player.UserIDString));
return;
}
float multiplier = GetMultiplier(player);
SendReply(player, Msg("Speed", player.UserIDString, multiplier.ToString("0.##")));
}
}
}Hooks used: OnItemCraft
Config file
Created automatically on first load at oxide/config/CraftSpeed.json.
{
"Global multiplier": 1,
"Permission multipliers": {
"craftspeed.vip": 2,
"craftspeed.elite": 3
}
}Commands and permissions
| Command | What it does | Permission |
|---|---|---|
/craftspeed | Prints your current effective craft speed multiplier. | craftspeed.use |
| Permission | Grants |
|---|---|
craftspeed.use | Allows using the /craftspeed chat command. |
craftspeed.vip | Applies the multiplier configured under the craftspeed.vip key. |
craftspeed.elite | Applies the multiplier configured under the craftspeed.elite key. |
How the code works
Config with a global value and permission multipliers
The nested
PluginConfigclass holdsGlobalMultiplierand aPermissionMultipliersdictionary keyed by permission name.LoadDefaultConfigseeds it withcraftspeed.vipat 2.0 andcraftspeed.eliteat 3.0. On load, the plugin registers every permission listed in the dictionary plus thecraftspeed.usecommand permission, so adding an entry to the config and reloading the plugin registers the new permission automatically.Intercepting craft starts with OnItemCraft
object OnItemCraft(ItemCraftTask itemCraftTask, BasePlayer owner, Item fromTempBlueprint)fires when a player queues a craft. The plugin null-checks the task, the owner anditemCraftTask.blueprint, then readsitemCraftTask.taskEndTime, which is aFacepunch.Math.Epochtime in seconds. Returningnullkeeps default behavior; the plugin only changes the end time.Computing the effective multiplier
GetMultiplier(BasePlayer)starts atGlobalMultiplier, then loopsPermissionMultipliersand keeps the highest value whose permission the player has, usingpermission.UserHasPermission. If the result is<= 0or1, no change is made. This means a player with two permissions gets the larger boost rather than a stacking product.Shortening taskEndTime safely
The remaining time is
taskEndTime - Epoch.Current. The plugin divides that remaining seconds value by the multiplier and sets the new end time back, clamped so it never goes below the current second. Dividing the remaining time rather than the total keeps the math correct even if the hook fires again for a queued task. A short comment explains the clamp, and no console output happens inside the hook.Ignoring INDUSTRIAL crafter overload
The second overload
object OnItemCraft(IndustrialCrafter industrialCrafter, ItemBlueprint blueprint)is left unimplemented on purpose, so factory crafters run at default speed. If you later want faster automation, implement it and apply the same division to the task it produces, but you must decide whose multiplier to use since there is no player owner there.Command, messages and unload
/craftspeedis registered with[ChatCommand("craftspeed")], checkscraftspeed.use, and replies throughlangwith the multiplier formatted to two decimals.LoadDefaultMessagesdefines theSpeedandNoPermissionkeys.Unloadprints nothing per player; there is no UI and no timer to destroy, so the plugin simply returns.
Install it on your server
Save CraftSpeed.cs
Keep the file name exactly as the class name. Oxide matches them.Upload it to the plugins folder
Oxide:oxide/plugins/. Carbon:carbon/plugins/. The server compiles and loads it within a few seconds, no restart needed.Edit the config if you want
On first load the default config is written tooxide/config/CraftSpeed.json(Carbon:carbon/configs/CraftSpeed.json). After editing, reload it:oxide.reload CraftSpeed c.reload CraftSpeed # CarbonGrant the permission
Give it to every player, or swapdefaultfor a group such asvip:oxide.grant group default craftspeed.use c.grant group default craftspeed.use # Carbon
Variations
Each one opens the generator with a ready prompt you can tweak.
Different speed per workbench tier
Scale the multiplier by the crafting player's nearby workbench level instead of permissions.
Generate this versionSpeed only for chosen items
Apply the boost to a whitelist of shortnames and leave everything else untouched.
Generate this versionDebug logging of craft times
Write before/after durations to the console for tuning, only when a debug flag is on.
Generate this version
FAQ
Does a multiplier of 2.0 mean crafting takes twice as long or half the time?
The plugin divides the remaining duration by the multiplier, so 2.0 halves the time. A value of 1.0 disables the effect and is skipped. Higher values shorten more; 0 or negative values are ignored to avoid broken task times.
Do multiple permission multipliers stack?
No. The plugin picks the highest matching value from PermissionMultipliers. If your VIP has both craftspeed.vip (2.0) and craftspeed.elite (3.0), they get 3.0. This keeps results predictable and avoids accidental runaway speeds from group inheritance.
Why does my factory / industrial crafter still craft at normal speed?
The plugin only implements the player overload of OnItemCraft. The IndustrialCrafter overload is left alone, so automated crafters use default timing. Adding the second hook would let you speed those up too, but you would need to choose a multiplier since no player owns that task.
Will this affect items already being crafted when I reload?
Yes, partly. Queued tasks keep the end time set when they started. Reloading the plugin does not retroactively change tasks, but the next craft of anything queued after reload uses the new values. Edit the config and reload craftspeed to apply changes.
How do I install it on Oxide or Carbon?
Put the CraftSpeed.cs file in oxide/plugins and run oxide.reload CraftSpeed (or o.reload). Carbon loads the same file from its plugin folder. Defaults work without editing; the config appears in oxide/config/CraftSpeed.json after first load.
Customize it for your server
Change the reward, add a cooldown, restrict it to VIPs. Start from this prompt and edit anything.
Edit the prompt on the next screen. 2 free plugins a month, no card.
More quality of life plugins
- BackpacksAdds a /backpack command that opens a per-player StorageContainer sized by permission, with contents persisted to oxide/data and optionally droppedโฆOnPlayerLootEndOnPlayerDisconnectedOnPlayerDeath
- Day and night controlSkips or shortens night by advancing the in-game clock to a configurable morning time, and adds /day and /night admin commands.OnServerInitialized
- Default item skinsLets each player store a default skin ID per item shortname with /skin and applies it to every item the player crafts through theโฆOnServerInitializedOnItemCraftFinished
Last updated Oct 26, 2026.
Customize crafting speed
Customize