Skip to content
RustPluginGenerator
Runtime errorOxide + Carbon

Fix "Missing plugin name prefix" for permission in Oxide plugins

Oxide prints this warning when a registered permission does not begin with the plugin's lowercase class name followed by a dot. Rename the permission constant to "killrewards.rewards.use" (or similar) so the warning disappears, then reload the plugin.

Server console
Missing plugin name prefix 'killrewards' for permission 'rewards.use' (by plugin 'Kill Rewards')

Why it happens

Oxide groups permissions by plugin, so every permission a plugin registers should start with the lowercase class name and a dot, for example killrewards.rewards.use on a plugin whose class is KillRewards. When the string lacks that prefix, Oxide still registers it - grants, revokes and permission.UserHasPermission checks keep working - but it logs Missing plugin name prefix '<perm>' for permission '<perm>' (by plugin '<Title>') once at startup so admins know the permission is impossible to attribute to a plugin. The most common trigger is a constant written as rewards.use while the class is KillRewards, or a plugin whose class was renamed but whose permission constants were not. Another trap is mixing cases in the prefix: Oxide lookups are case-insensitive, but the warning compares against the actual class name, so an unrelated prefix (for example copying economy. naming from another plugin) is what trips it. Because the warning appears in Init, it shows on every load and reload.

How to fix it

  1. Note the plugin class name - here KillRewards - and lowercase it: killrewards.
  2. Rewrite each permission constant so it starts with that prefix plus a dot, e.g. killrewards.use, and keep all registration and checks pointing at the same constant.
  3. Search the file for any hard-coded permission strings used in [ConsoleCommand] or chat commands so nothing still references the old name.
  4. Reload with oxide.reload KillRewards (Carbon accepts the same command).
  5. Confirm the console no longer prints the Missing plugin name prefix line and instead shows Loaded plugin Kill Rewards v1.0.0 by RustPluginGenerator.
  6. If the server already granted the old permission name, either grant the new one (oxide.grant group default killrewards.use) or revoke the stale entry with oxide.revoke.

Before and after

BeforeFails
using Oxide.Core;
using UnityEngine;

namespace Oxide.Plugins
{
    [Info("Kill Rewards", "RustPluginGenerator", "1.0.0")]
    [Description("Gives players a small reward for kills when they have permission")]
    public class KillRewards : RustPlugin
    {
        private const string PermUse = "rewards.use";

        private void Init()
        {
            permission.RegisterPermission(PermUse, this);
        }

        private void OnEntityDeath(BaseCombatEntity entity, HitInfo info)
        {
            if (entity == null || info == null) return;

            var killer = info.InitiatorPlayer;
            if (killer == null || killer.IsNpc || killer == entity) return;

            if (!permission.UserHasPermission(killer.UserIDString, PermUse)) return;

            var item = ItemManager.CreateByName("scrap", 5);
            if (item == null) return;
            killer.GiveItem(item);
            killer.ChatMessage("You received 5 scrap for the kill.");
        }
    }
}
AfterFixed
using Oxide.Core;
using UnityEngine;

namespace Oxide.Plugins
{
    [Info("Kill Rewards", "RustPluginGenerator", "1.0.0")]
    [Description("Gives players a small reward for kills when they have permission")]
    public class KillRewards : RustPlugin
    {
        // Prefix must match the lowercase class name: killrewards
        private const string PermUse = "killrewards.use";

        private void Init()
        {
            permission.RegisterPermission(PermUse, this);
        }

        private void OnEntityDeath(BaseCombatEntity entity, HitInfo info)
        {
            if (entity == null || info == null) return;

            var killer = info.InitiatorPlayer;
            if (killer == null || killer.IsNpc || killer == entity) return;

            if (!permission.UserHasPermission(killer.UserIDString, PermUse)) return;

            var item = ItemManager.CreateByName("scrap", 5);
            if (item == null) return;
            killer.GiveItem(item);
            killer.ChatMessage("You received 5 scrap for the kill.");
        }
    }
}

FAQ

Does the warning break the permission?

No. Oxide registers the permission anyway and permission.UserHasPermission keeps returning true for granted users. The line is informational: it tells you the permission cannot be tied back to a plugin name, which matters for oxide.show perms and for support requests.

Can I keep the old permission name for compatibility?

You can register the old name deliberately, but the warning stays. A cleaner option is to register the correctly prefixed name, then check both names in play (UserHasPermission(userId, PermUse) || UserHasPermission(userId, "rewards.use")) while you migrate grants to the new permission.

Why does the message end with "(by plugin 'Kill Rewards')"?

Oxide matches the permission back to a loaded plugin and prints its [Info] title, not the class name. That is why the prefix is compared against the class name KillRewards, not the title Kill Rewards.

Does Carbon print this too?

Carbon loads the same plugin files and emulates Oxide's permission system, so permissions should follow the same prefix convention. Even if Carbon stays quiet, keep the prefix so the plugin behaves identically on both frameworks.

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