> For the complete documentation index, see [llms.txt](https://wanted-mods.gitbook.io/home/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wanted-mods.gitbook.io/home/redm/skills-system/exports.md).

# Exports

Here you will find all the exports you can use in other scripts as you wish.

<h2 align="center">Client-Side Exports</h2>

### `GetSkillLevel(skillId)`

Client-only. Returns the cached level of a skill (0 if not loaded yet).

```lua
local hunterLevel = exports['wm_skills']:GetSkillLevel('hunter')
print("Hunter Level: " .. hunterLevel)
```

Important:

* Call `TriggerServerEvent('skilltree:requestSkills')` first.
* Wait for `skilltree:receiveSkills` before reading.

Example:

```lua
TriggerServerEvent('skilltree:requestSkills')

RegisterNetEvent('skilltree:receiveSkills', function()
    local hunterLevel = exports['wm_skills']:GetSkillLevel('hunter')
    print("Hunter Level: " .. hunterLevel)
end)
```

### `GetSkillData(skillId)`

Client-only. Returns cached data for a skill (nil if not loaded yet).

```lua
local hunterData = exports['wm_skills']:GetSkillData('hunter')
if hunterData then
    print("Level: " .. hunterData.level)
    print("XP: " .. hunterData.xp)
end
```

Important:

* Call `TriggerServerEvent('skilltree:requestSkills')` first.
* Wait for `skilltree:receiveSkills` before reading.

Example:

```lua
TriggerServerEvent('skilltree:requestSkills')

RegisterNetEvent('skilltree:receiveSkills', function()
    local hunterData = exports['wm_skills']:GetSkillData('hunter')
    if hunterData then
        print("Level: " .. hunterData.level)
        print("XP: " .. hunterData.xp)
    end
end)
```

***

<h2 align="center">Server-Side Exports</h2>

<h3 id="xp-management" align="center">XP Management</h3>

**`AddSkillXP(source, skillId, amount)`**

Add XP to a player's skill

```lua
-- Returns (in order):
-- success: boolean (true if XP was applied; false if invalid skill/player)
-- leveledUp: boolean (true if the skill leveled up)
-- newLevel: number (current level after XP; 0 if failed)
-- oldLevel: number|nil (level before XP; nil if failed)
-- oldXP: number|nil (current XP before add; nil if failed)
-- oldTotal: number|nil (total XP before add; nil if failed)
-- newXP: number|nil (current XP after add; nil if failed)
-- newTotal: number|nil (total XP after add; nil if failed)
-- Note: XP amount is affected by Config.XPMultiplier, VIP, and Prestige multipliers.
-- Example:
exports['wm_skills']:AddSkillXP(source, 'hunter', 50)

```

**`RemoveSkillXP(source, skillId, amount)`**

Remove XP from a player's skill

```lua
-- Returns (in order):
-- success: boolean (true if XP was removed; false if invalid skill/player)
-- newCurrentXP: number (current XP after removal; 0 if failed)
-- Example:
exports['wm_skills']:RemoveSkillXP(source, 'hunter', 25)

```

**`SetSkillXP(source, skillId, xpAmount)`**

Set exact XP amount for a skill

```lua
-- Returns (in order):
-- success: boolean (true if XP was set; false if invalid skill/player)
-- Example:
exports['wm_skills']:SetSkillXP(source, 'hunter', 500)
```

**`GetSkillCurrentXP(source, skillId)`**

Get current XP in the player's current level

```lua
-- Returns:
-- currentXP: number (current XP toward next level; 0 if invalid skill/player)
local currentXP = exports['wm_skills']:GetSkillCurrentXP(source, 'hunter')
print("Current XP: " .. currentXP)

```

**`GetSkillTotalXP(source, skillId)`**

Get total accumulated XP for a skill

```lua
local totalXP = exports['wm_skills']:GetSkillTotalXP(source, 'hunter')
print("Total XP: " .. totalXP)
```

**`GetTotalXPAllSkills(source)`**

Get total XP across all player skills

```lua
local totalXP = exports['wm_skills']:GetTotalXPAllSkills(source)
print("Total XP (all skills): " .. totalXP)
```

***

<h3 align="center">Level Management</h3>

**`AddSkillLevel(source, skillId, levels)`**

Add levels to a player's skill

```lua
-- Returns (in order):
-- success: boolean (true if levels were added; false if invalid skill/player)
-- newLevel: number (current level after add; 0 if failed)
-- Example:
exports['wm_skills']:AddSkillLevel(source, 'hunter', 2)
```

**`SetSkillLevel(source, skillId, level)`**

Set exact level for a player's skill

```lua
-- Returns:
-- success: boolean (true if level was set; false if invalid skill/player)
-- Example:
exports['wm_skills']:SetSkillLevel(source, 'hunter', 5)
```

**`GetSkillLevel(source, skillId)`**

Get current level of a player's skill

```lua
local level = exports['wm_skills']:GetSkillLevel(source, 'hunter')
print("Hunter Level: " .. level)
```

**`GetSkillData(source, skillId)`**

Get complete skill data for a player

```lua
local data = exports['wm_skills']:GetSkillData(source, 'hunter')
if data then
    print("Level: " .. data.level)
    print("XP: " .. data.xp)
    print("Total XP: " .. data.total_xp)
end
```

**`GetTotalLevelsAllSkills(source)`**

Get sum of all skill levels for a player

```lua
local totalLevels = exports['wm_skills']:GetTotalLevelsAllSkills(source)
print("Total Levels: " .. totalLevels)
```

***

<h3 align="center">General Player Data</h3>

**`GetPlayerSkills(source)`**

Get all skills data for a player

```lua
local skills = exports['wm_skills']:GetPlayerSkills(source)
for skillId, data in pairs(skills) do
    print(skillId .. ": Level " .. data.level)
end
```

***

<h3 align="center">Skill Configuration</h3>

**`IsValidSkill(skillId)`**

Check if a skill ID exists in config

```lua
if exports['wm_skills']:IsValidSkill('hunter') then
    print("Hunter skill exists")
end
```

**`GetSkillName(skillId)`**

Get the display name of a skill

```lua
local name = exports['wm_skills']:GetSkillName('hunter')
print("Skill Name: " .. name)
```

**`GetSkillMaxLevel(skillId)`**

Get maximum level for a skill

```lua
local maxLevel = exports['wm_skills']:GetSkillMaxLevel('hunter')
print("Max Level: " .. maxLevel)
```

***

<h3 align="center">Prestige System</h3>

**`GetPrestigeMultiplier(source, skillId)`**

Get XP multiplier from prestige level

```lua
local multiplier = exports['wm_skills']:GetPrestigeMultiplier(source, 'hunter')
print("XP Multiplier: " .. multiplier .. "x")
```

**`GetPlayerPrestige(source, skillId)`**

Get prestige level for a specific skill

```lua
local prestige = exports['wm_skills']:GetPlayerPrestige(source, 'hunter')
print("Prestige Level: " .. prestige)
```

**`CanPrestige(source, skillId)`**

Check if player meets requirements to prestige

```lua
if exports['wm_skills']:CanPrestige(source, 'hunter') then
    print("Player can prestige!")
end
```

**`PrestigeSkill(source, skillId)`**

Prestige a skill (reset to level 0 with bonus)

```lua
-- Returns (in order):
-- success: boolean (true if prestige succeeded; false if requirements not met)
-- newPrestige: number|nil (new prestige level; nil if failed)
-- bonusInfo: table|string|nil (bonus table on success; reason string on failure)
exports['wm_skills']:PrestigeSkill(source, 'hunter')
```

**`GetAllPrestigeData(source)`**

Get prestige data for all player skills

```lua
local prestigeData = exports['wm_skills']:GetAllPrestigeData(source)
for skillId, prestige in pairs(prestigeData) do
    print(skillId .. ": Prestige " .. prestige)
end
```

**`LoadPlayerPrestige(source)`**

Load/refresh prestige data from database

```lua
exports['wm_skills']:LoadPlayerPrestige(source)
```

***

<h3 align="center">Skill Decay System</h3>

**`GetDecayStatus(source, skillId)`**

Get decay information for a skill

```lua
local decay = exports['wm_skills']:GetDecayStatus(source, 'hunter')
if decay then
    print("Days since last use: " .. decay.days_inactive)
end
```

**`ApplyDecay(source, skillId, decayAmount)`**

Manually apply decay to a skill

```lua
-- Returns (in order):
-- success: boolean (true if decay applied; false if no decay or exempt/invalid)
-- xpLoss: number|nil (XP lost; nil if failed)
-- levelsLost: number|nil (levels lost; nil if failed)
exports['wm_skills']:ApplyDecay(source, 'hunter')
```

**`CheckSkillDecay(source)`**

Check and apply decay for all player skills

```lua
exports['wm_skills']:CheckSkillDecay(source)
```

**`UpdateLastUsed(source, skillId)`**

Update last used timestamp for a skill

```lua
exports['wm_skills']:UpdateLastUsed(source, 'hunter')
```

**`IsPlayerExempt(source)`**

Check if player is exempt from skill decay

```lua
if exports['wm_skills']:IsPlayerExempt(source) then
    print("Player is exempt from decay")
end
```

***

<h3 align="center">Challenges System</h3>

**`GetChallengeProgress(source, challengeId)`**

Get progress for a specific challenge

```lua
local progress = exports['wm_skills']:GetChallengeProgress(source, 'hunter_animals_25')
if progress then
    print("Progress: " .. progress.progress .. "/" .. progress.requirement)
end
```

**`UpdateChallengeProgress(source, challengeId, amount)`**

Update challenge progress

```lua
-- Returns (in order):
-- success: boolean (true if progress updated; false if invalid/completed)
-- completed: boolean|nil (true if challenge just completed; nil if failed)
exports['wm_skills']:UpdateChallengeProgress(source, 'hunter_animals_25', 1)
```

**`GetSkillChallenges(source, skillId)`**

Get all challenges for a specific skill

```lua
local challenges = exports['wm_skills']:GetSkillChallenges(source, 'hunter')
for _, challenge in ipairs(challenges) do
    print(challenge.name .. ": " .. challenge.progress .. "/" .. challenge.requirement)
end
```

**`GetAllPlayerChallenges(source)`**

Get all challenges for a player

```lua
local allChallenges = exports['wm_skills']:GetAllPlayerChallenges(source)
for _, challenge in ipairs(allChallenges) do
    print(challenge.name .. ": " .. (challenge.completed and "Completed" or "In Progress"))
end
```

**`GetCompletedChallengesCount(source)`**

Get count of completed challenges

```lua
local count = exports['wm_skills']:GetCompletedChallengesCount(source)
print("Completed Challenges: " .. count)
```

***

<h3 align="center">Daily/Weekly Challenges</h3>

**`GetDailyChallengeProgress(source)`**

Get player's daily challenge progress

```lua
local dailies = exports['wm_skills']:GetDailyChallengeProgress(source)
for id, data in pairs(dailies.daily) do
    print("Daily: " .. id .. " - " .. data.progress)
end
```

**`UpdateDailyChallengeProgress(source, challengeId, amount, challengeType)`**

Update daily/weekly challenge progress

```lua
-- Returns (in order):
-- success: boolean (true if progress updated; false if invalid/completed)
-- completed: boolean|nil (true if challenge just completed; nil if failed)
-- Example:
exports['wm_skills']:UpdateDailyChallengeProgress(source, 'daily_hunt_10', 1, 'daily')
exports['wm_skills']:UpdateDailyChallengeProgress(source, 'weekly_hunt_50', 1, 'weekly')

```

**`GetAllDailyChallenges(source)`**

Get all daily and weekly challenges for player

```lua
local challenges = exports['wm_skills']:GetAllDailyChallenges(source)
print("Daily challenges: " .. #challenges.daily)
print("Weekly challenges: " .. #challenges.weekly)
```

***

<h3 align="center">Leaderboards</h3>

**`GetLeaderboard(leaderboardType, skillId, limit)`**

Get leaderboard data (global, skill, prestige, challenges)

```lua
-- Global leaderboard (top 10)
local global = exports['wm_skills']:GetLeaderboard('global', nil, 10)

-- Hunter skill leaderboard
local hunter = exports['wm_skills']:GetLeaderboard('skill', 'hunter', 10)

-- Prestige leaderboard
local prestige = exports['wm_skills']:GetLeaderboard('prestige', nil, 10)

-- Challenges leaderboard
local challenges = exports['wm_skills']:GetLeaderboard('challenges', nil, 10)
```

**`GetPlayerRank(source)`**

Get player's rank in all leaderboard categories

```lua
local ranks = exports['wm_skills']:GetPlayerRank(source)
print("Global Rank: " .. ranks.global)
print("Prestige Rank: " .. ranks.prestige)
print("Challenges Rank: " .. ranks.challenges)
```

**`CalculateGlobalLeaderboard()`**

Recalculate global leaderboard rankings

```lua
exports['wm_skills']:CalculateGlobalLeaderboard()
```

**`CalculateSkillLeaderboard(skillId)`**

Recalculate specific skill leaderboard

```lua
exports['wm_skills']:CalculateSkillLeaderboard('hunter')
```

**`CalculatePrestigeLeaderboard()`**

Recalculate prestige leaderboard

```lua
exports['wm_skills']:CalculatePrestigeLeaderboard()
```

**`CalculateChallengesLeaderboard()`**

Recalculate challenges leaderboard

```lua
exports['wm_skills']:CalculateChallengesLeaderboard()
```

**`UpdateAllLeaderboards()`**

Recalculate all leaderboard rankings

```lua
exports['wm_skills']:UpdateAllLeaderboards()
```

***

<h3 align="center">Complete Integration Examples</h3>

#### Hunting System Integration

```lua
RegisterNetEvent('hunting:animalKilled', function(animalType)
    local src = source

    -- Add XP
    exports['wm_skills']:AddSkillXP(src, 'hunter', 50)

    -- Update challenges
    exports['wm_skills']:UpdateChallengeProgress(src, 'hunter_animals_25', 1)

    -- Update daily challenge
    exports['wm_skills']:UpdateDailyChallengeProgress(src, 'daily_hunt_10', 1, 'daily')

    -- Update last used (prevent decay)
    exports['wm_skills']:UpdateLastUsed(src, 'hunter')
end)
```

#### Combat System Integration

```lua
RegisterNetEvent('combat:playerKilled', function(isHeadshot)
    local src = source

    if isHeadshot then
        exports['wm_skills']:AddSkillXP(src, 'gunslinger', 100)
        exports['wm_skills']:UpdateChallengeProgress(src, 'gunslinger_headshots_10', 1)
    else
        exports['wm_skills']:AddSkillXP(src, 'gunslinger', 50)
    end
end)
```

#### Check Player Skill Level

```lua
RegisterNetEvent('fishing:startFishing', function()
    local src = source
    local fishingLevel = exports['wm_skills']:GetSkillLevel(src, 'fisherman')

    if fishingLevel >= 5 then
        -- Give bonus for high level fisherman
        TriggerClientEvent('fishing:bonus', src, 'rare_fish_chance')
    end
end)
```
