SkillAbler administration and developer API
Admin permission
The commands below are available to server-console/RCON users and in-game admins (authLevel >= 2). To delegate them to an Oxide permission group, grant:
oxide.grant group admin skillabler.admin
Run the examples in the server console or RCON. Replace <player> with either the player's Steam ID or their online player name (playername); names containing spaces are accepted when the match is unambiguous. Use a Steam ID for offline players or when a name matches more than one online player. Skill identifiers are the key values in the SkillAbler configuration.
Reset progression
skillabler.admin reset skills <player> skillabler.admin reset prestige <player> skillabler.admin reset all <player> skillabler.admin give xp <player> <amount> skillabler.admin give points <player> <amount> skillabler.admin give prestigepoints <player> <amount>
-
skillsclears purchased normal skills and their activation states, then refunds their invested levels as normal Skill Points. Player level and XP are preserved. -
prestigeclears Prestige skill purchases and prestige XP/Skill Point ranks, then refunds the invested ranks as Prestige Points. Prestige level is preserved. -
allresets SkillAbler progression to level 1 with zero XP, points, purchased skills, and prestige level. It does not delete player preferences or stored backpack contents. -
give xpgrants XP using the player's configured Prestige XP multiplier; level-ups award their normal Skill Points. It works for online and offline players and does not share the granted XP with teammates. -
give pointsadds normal Skill Points without changing player level or XP. -
give prestigepointsadds Prestige Points without changing Prestige level.
Admin resets do not charge Scrap. Giving points and resetting an online player refreshes their SkillAbler interface; resets also apply runtime cleanup for affected prestige features.
Set an owned skill's state
skillabler.admin skill <player> <skill_key> <on|off> skillabler.admin prestige <player> <prestige_skill_key> <on|off>
These commands only change the activation state of a skill the player already owns. They do not grant levels or spend/refund points. The skill must be enabled in server configuration. Admins can also force the state of skills configured as non-toggleable; regular players still cannot toggle those from the UI. Changes to offline players are saved and applied when they next connect.
Examples:
skillabler.admin skill 76561198000000000 amateur_miner off skillabler.admin prestige 76561198000000000 backpack on skillabler.admin give xp 76561198000000000 5000 skillabler.admin give points 76561198000000000 10 skillabler.admin give prestigepoints 76561198000000000 3
The same commands accept a player name instead of the Steam ID, for example:
skillabler.admin skill "Player Name" amateur_miner off skillabler.admin prestige "Player Name" backpack on skillabler.admin give xp "Player Name" 5000 skillabler.admin give points "Player Name" 10 skillabler.admin give prestigepoints "Player Name" 3
Let every player use perks
There is no blanket permission command required for normal players: the skill menu and perks are available by default, and players unlock perks through their skill points and Prestige Points.
Normal skills can optionally be restricted with PermissionRequiredToShow in the config. When that field is non-empty, grant that exact permission to the default player group to let everyone see and buy that skill:
oxide.grant group default <permission-from-PermissionRequiredToShow>
Do not grant skillabler.admin to the default group; that permission is only for delegated administration.
Skill configuration
The config contains a Skills list for regular skills and a PrestigeSkills list for built-in Prestige skills. Existing entries can be tuned independently:
-
Regular skills:
Name,Category,Enabled,VisibleInTree,MaxLevel,Tier,Effect,ValuePerLevel,Description,IconUrl,IconSkin,CanToggle,MinimumPrestigeLevel,MinimumPlayerLevel,RequiredSkillKey,BlockedBySkillKey, andPermissionRequiredToShow. -
Prestige skills:
Name,Enabled,VisibleInTree,MaxLevel,Tier,ValuePerLevel,Description,IconUrl,IconSkin, andCanToggle. -
Keyis a persistent identifier used in saved player data; keep it stable when renaming a skill. -
Enabled: falsedisables buying and the skill's effect.VisibleInTree: falseonly hides its card; it does not refund/remove levels already owned. Hidden skills can still be queried or administered through the API/admin commands. -
Regular skill entries may be added with a unique key, a built-in category, and a built-in
Effect. New effect handlers/categories require code changes. - Prestige entries configure the built-in Prestige skills only. Adding an arbitrary new prestige key does not create a new effect and is rejected.
ValuePerLevel for Prestige has these built-in meanings:
-
cooldown_reduction: fractional cooldown reduction per rank (0.10= 10% per rank; capped at 100% total). -
evader: fractional damage-avoidance chance per rank (0.15= 15% per rank; capped at 100%). -
backpack: whole number of 24-slot pages granted per rank (default1). - Other built-in Prestige skills do not currently use this numeric field.
Example of hiding a Prestige skill without disabling the perk, and tuning the built-in scaling:
{
"Key": "evader",
"Name": "Evader",
"Description": "Avoid damage from hostile players and traps.",
"MaxLevel": 5,
"Tier": 2,
"Enabled": true,
"VisibleInTree": false,
"CanToggle": true,
"ValuePerLevel": 0.10,
"IconUrl": "",
"IconSkin": 0
}
After editing the file, reload SkillAbler for changes to take effect. The plugin normalizes missing/invalid entries and writes the resulting config back on load.
Calling the API from another Oxide plugin
SkillAbler exposes the following hooks for Plugin.Call. API changes are persisted immediately. userId is the player's Steam ID (BasePlayer.userID), and skill keys are case-insensitive configuration keys.
| Hook | Arguments | Return |
|---|---|---|
API_GetPlayerProgress
|
ulong userId
|
Dictionary<string, object> with level, xp, skillPoints, prestigeLevel, and prestigePoints; null for ID 0. Unknown IDs return default progression values without creating a saved record.
|
API_GetSkills
|
none |
List of skill dictionaries containing key, name, category, maxLevel, enabled, visibleInTree, canToggle, and effect
|
API_GetPrestigeSkills
|
none |
List of prestige-skill dictionaries containing key, name, maxLevel, enabled, visibleInTree, canToggle, and valuePerLevel
|
API_GetSkillLevel
|
ulong userId, string skillKey
|
int; null for ID 0 or an unknown key
|
API_IsSkillEnabled
|
ulong userId, string skillKey
|
bool; null for ID 0 or an unknown key
|
API_GetPrestigeSkillLevel
|
ulong userId, string skillKey
|
int; null for ID 0 or an unknown key
|
API_IsPrestigeSkillEnabled
|
ulong userId, string skillKey
|
bool; null for ID 0 or an unknown key
|
API_SetSkillEnabled
|
ulong userId, string skillKey, bool enabled
|
bool; false if the skill is unknown, not owned, or server-disabled
|
API_SetPrestigeSkillEnabled
|
ulong userId, string skillKey, bool enabled
|
bool; false if the skill is unknown, not owned, or server-disabled. Enabling Night Vision for an online player also requires per-player environment sync.
|
API_AddXP
|
BasePlayer player, int amount
|
bool; true when XP is awarded, false for a null, NPC, disconnected player, or non-positive amount. Uses the normal XP progression, Prestige modifier, level-up Skill Points, XP sharing, HUD updates, and immediate data saving.
|
Quest and event plugins can use API_AddXP to award XP to a connected player:
using Oxide.Core.Plugins;
[PluginReference]
private Plugin SkillAbler;
private void RewardQuest(BasePlayer player, int xpReward)
{
if (SkillAbler == null || player == null) return;
object result = SkillAbler.Call("API_AddXP", player, xpReward);
if (!(result is bool success) || !success)
{
PrintWarning($"Could not award {xpReward} SkillAbler XP to {player.UserIDString}.");
}
}
The player must be connected when the reward is granted. XP uses SkillAbler's standard progression path, so the player's Prestige XP bonus and any active XP-sharing skill are applied.
Example consumer plugin:
using System.Collections.Generic;
using Oxide.Core.Plugins;
private Plugin SkillAbler;
private void OnServerInitialized()
{
SkillAbler = plugins.Find("SkillAbler");
}
private void CheckSkill(BasePlayer player)
{
if (SkillAbler == null || player == null) return;
object result = SkillAbler.Call("API_GetSkillLevel", player.userID, "amateur_miner");
if (result == null) return;
int level = (int)result;
Puts($"{player.displayName} has Amateur Miner level {level}.");
object changed = SkillAbler.Call("API_SetPrestigeSkillEnabled", player.userID, "backpack", false);
if (changed is bool success && !success)
{
Puts("Backpack could not be disabled; check ownership and server configuration.");
}
}
Use the skill-list hooks to discover configured keys rather than relying on display names. API setters do not bypass ownership or server configuration, but can set states for skills that are not normally toggleable in the player UI.
