Skip to content
RustPluginGenerator
Runtime errorOxide + Carbon

Fix "tried to register command 'home', this command already exists and cannot be overridden!" (Oxide)

Two loaded plugins claim the same chat command name. Oxide refuses to override the first registration and skips the second plugin's command. Rename the command in one plugin (or unload the duplicate) and reload.

Server console
Teleport tried to register command 'home', this command already exists and cannot be overridden!

Why it happens

Oxide keeps a single global table of chat command names. When a plugin is loaded, every [ChatCommand("...")] method in it is registered into that table. If the name is already taken by another loaded plugin, Oxide logs <Plugin> tried to register command '<name>', this command already exists and cannot be overridden! and does not bind the new one. It is not a compile error, so most people only notice when /home runs the wrong plugin or the second plugin's command does nothing. Common triggers: a teleport-style plugin that ships /home, /tpr or /sethome while another plugin already provides them; a fork of a popular plugin installed alongside the original; two plugins built from the same source with different file names; a leftover copy of a plugin still enabled in oxide/plugins. Carbon reports the same situation because it loads the same Oxide chat command registry.

How to fix it

  1. Find the owner of the command. Run oxide.show user <steamid> is not needed here; instead reload each candidate and watch the console. The plugin loaded first owns the name and the warning names the plugin that lost. Alternatively grep the folder: grep -r "ChatCommand(\"home\")" oxide/plugins (on Windows, search the folder for ChatCommand("home")).\n2. Decide which plugin should keep /home. If you wrote one of them, change the attribute to a unique name, e.g. [ChatCommand("tphome")], and rename the handler method to match (CmdTphome).\n3. If the duplicate is unused, unload and delete it: oxide.unload Teleport, then remove the .cs file from oxide/plugins so it does not come back on restart.\n4. Reload the plugin you changed with oxide.reload Teleport.\n5. Confirm: the loader line for the plugin appears (Loaded plugin ...) and no "tried to register command" warning follows it. Type /home in game and check the correct plugin answers.

Before and after

BeforeFails
using Oxide.Core.Plugins;
using UnityEngine;

namespace Oxide.Plugins
{
    [Info("Teleport", "RustPluginGenerator", "1.0.0")]
    [Description("Saves a home location per player and teleports back to it")]
    public class Teleport : RustPlugin
    {
        [ChatCommand("home")]
        private void CmdHome(BasePlayer player, string command, string[] args)
        {
            if (player == null) return;

            if (args.Length > 0 && args[0] == "set")
            {
                player.ChatMessage("Home set to your current position.");
                return;
            }

            // Another plugin already owns /home, so this handler never runs.
            player.ChatMessage("Teleporting home.");
        }

        [ChatCommand("tpr")]
        private void CmdTpr(BasePlayer player, string command, string[] args)
        {
            if (player == null) return;
            player.ChatMessage("Teleport requests are not enabled yet.");
        }
    }
}
AfterFixed
using Oxide.Core.Plugins;
using UnityEngine;

namespace Oxide.Plugins
{
    [Info("Teleport", "RustPluginGenerator", "1.0.0")]
    [Description("Saves a home location per player and teleports back to it")]
    public class Teleport : RustPlugin
    {
        // Unique command names avoid clashing with other loaded plugins.
        [ChatCommand("tphome")]
        private void CmdTpHome(BasePlayer player, string command, string[] args)
        {
            if (player == null) return;

            if (args.Length > 0 && args[0] == "set")
            {
                player.ChatMessage("Home set to your current position.");
                return;
            }

            player.ChatMessage("Teleporting home.");
        }

        [ChatCommand("tptpr")]
        private void CmdTpTpr(BasePlayer player, string command, string[] args)
        {
            if (player == null) return;
            player.ChatMessage("Teleport requests are not enabled yet.");
        }
    }
}

FAQ

Does this warning stop the plugin from loading?

No. The plugin finishes loading; only that one chat command is not registered. Everything else in the plugin, including its console commands and hooks, keeps working. The practical symptom is that typing the command runs the other plugin or produces an unknown-command reply.

Which plugin wins when two register the same name?

The one loaded first. Oxide does not allow later registrations to replace an existing entry, so the warning always names the plugin that arrived second. Load order depends on file names and on the order plugins were loaded, so after a restart a different plugin may win.

Can I override the command from a config file instead?

Not for the command name itself. The name is compiled into the attribute. Some plugins let you disable their built-in commands in config, which removes the registration, but if the plugin offers no such option you must edit the source or remove one of the plugins.

The warning mentions a plugin I already deleted. Why?

The old file is probably still in oxide/plugins (or carbon/plugins). Oxide scans that folder on startup. Delete the .cs file and the compiled copy under oxide/plugins or the cache, then restart the server or run oxide.reload on the remaining plugin.

Different error?

Paste the full console output and get the cause and a fix in plain English.

Open the error explainer

Skip the debugging

Generated plugins are compiled before you get them, and compiler errors are fixed automatically.

Generate a plugin

2 free plugins a month, no card.

Last updated Oct 26, 2026.

Get plugins that compile first time

Generate