Jixryo Skills
Twenty-two skills in four groups that level by doing, with one perk line each, named effects any script reads, GTA's own stats from the body skills, and a menu with a staff tab.
Version 1.0.0 Updated See it on its script page
On this page
Jixryo Skills is the resource jixryo_advancedskills, version 1.0.0. It keeps 22 skills in four categories (crime, drugs, trades, body), each with levels 0 to 10, rank names and one line of perks. A perk is a set of named effects such as lockpick.break = -0.25, and any script in the suite reads the effects it cares about through Jixryo Core. XP comes only from server code that each skill names; the body skills also level from what players do, through a report the server checks against what it saw itself. The body skills set GTA's own stats.
What players get
- The menu.
/skills, or the K key, opens the skills menu with the game blurred behind it: tabs for CRIME, DRUGS, TRADES and BODY (Q and E), the skills on the left (the arrows) and the selected one on the right: level and rank, the next rank, XP through the level, the perk line (every level a station, the perks as cards under it: yours, next, locked), what it does for you now in words, what the next level adds, how to train it, today's XP against the full-XP cap, and recent gains. Esc closes it. - XP as it comes in. An XP chip top centre ("LOCKPICKING +18 XP", the bar filling; gains on the same skill add up), a level-up banner with GTA's rank-up sound and every perk it unlocked, a "new skill found" banner, and a banner for everyone when staff start an XP event.
- Hidden skills. Crime and drugs skills show only once you have earned XP in them; the menu counts the rest ("2 more crime skills to find"). Trades and body skills always show.
- Perks that other scripts read. Each skill has perks at levels 2, 4, 6, 8 and 10, plus small per-level scaling on some (Lockpicking picks 2% faster a level, Cultivation harvests 1% heavier a level). Effects add up across perks.
- Body skills that change the game. Stamina, Strength, Lung Capacity, Shooting, Driving and Flying set GTA's own stats: 20 at level 0 plus 8 a level, 100 at level 10. Their XP comes from doing it: sprinting and swimming, time under water, melee hits landed, driving fast, flying. Shooting XP comes from range scripts (Jixryo Police is its source).
- A soft daily cap. Full XP up to 1,500 a skill a day (the server's day), then a quarter of it. There is no hard wall.
- Rust on body skills. A body skill unused for 7 days fades 5% of the current level's span a day, never below the start of the level: nobody loses a level.
- Boosts and XP events. Staff can boost one player (or a listed script can, such as a skill book) and start server-wide XP events; both multiply, and the menu shows how long they have left.
What staff get
The STAFF tab of the same menu, for anyone with group.god, group.admin or the ACE jixryo.skills:
- Find a player in the city by name, citizen id or server id, or open anyone by citizen id when offline (read straight from the database).
- Set a level, give or take XP, reset one skill or all. Staff edits skip boosts, caps and the day's count, write to the database at once, and raise the level-up event for other scripts when a level goes up.
- Boost a player in the city: a multiplier from 1.05 to 5 on one skill or all, for up to 24 hours, kept in the database.
- Start or stop an XP event for everyone: a multiplier from 1.05 to 5 on some skills or all, for a quarter of an hour up to 72 hours, with a label. It is kept across restarts in the resource's KVP and shows as a banner to everyone in the city.
- Every change needs a reason and goes to Jixryo Core's audit log with it. Looking things up does not.
Install
Stop nothing. Jixryo Skills replaces no other resource.
Upload the folder whole. The page is already built in
web/build.Order in
server.cfg. It needs ox_lib, oxmysql, qbx_core and Jixryo Core 1.2.0 or later.server.cfg ensure ox_lib ensure oxmysql ensure qbx_core ensure jixryo_core ensure jixryo_advancedskillsStaff.
group.godandgroup.adminalready pass. To give someone else the STAFF tab:server.cfg add_ace group.mod jixryo.skills allowItems. None. It adds no items and reads no inventory.
The database. The tables
jixryo_skills,jixryo_skills_logandjixryo_skills_boostsare made on the first start through Jixryo Core's migrations, in one step. If they cannot be made, the console says so and skills stay off.Full restart. If the resource alone is restarted while people play, it loads every character already in the city, and each game asks for its skills again.
How other scripts' calls behave
Jixryo Skills does not stand in for any other skills resource. Every script in the suite reaches it through Jx.skills in Jixryo Core, which works whether or not this resource runs: off, levels and effects are 0 and adding XP answers false, 'no_skills'.
-- server
Jx.skills.add(src, 'lockpicking', 18, 'Picked a car door') -- true, gained | false, why
Jx.skills.level(src, 'cultivation') -- 0..10
Jx.skills.has(src, 'chemistry', 3) -- a recipe that needs Chemistry 3
local yield = grams * (1 + Jx.skills.effect(src, 'grow.yield'))
Jx.skills.boost(src, 'chemistry', 1.5, 30, 'Chemistry notes') -- needs the resource in Config.boostSources
-- client (for feel and showing things; the server decides)
local zone = 50 * (1 + Jx.skills.effect('lockpick.zone'))
Jx.skills.open()- A script must be named in the skill's
sourcesinconfig.luato give it XP. Anything else is refused withnot_allowedand printed once in the console (<resource> tried to give <skill> XP: add it to the skill's sources in config.lua to allow it). The invoking resource is read by the server, so a script cannot claim to be another. - One call gives at most 100 XP (
maxPerCall, a skill can set its own), and a skill takes at most 20 gains from one player in 10 seconds; the 21st answerstoo_fast. XP that arrives while a character is still loading is queued and applied once loaded. - Boosts from a script need the resource in
Config.boostSources(only this resource by default); staff boosts from the menu are always allowed. - Level ups raise a server-only event other resources can listen for (never a net event):
AddEventHandler('jixryo_advancedskills:levelUp', function(src, skill, level, before) end)- XP events are published in
GlobalState.jxSkillsEvent(mult,ends,label,skills), so any script can read whether one is on. - Who gives XP today. The resources each skill names are in the configuration table below. Jixryo Criminal's dialogue XP action goes through this resource (its suite proves the call); the README of this build still describes only the body skills as wired, so check each other script's own doc for what it gives
[inferred: which named sources already call Jx.skills.add is not re-checked against their code in this pass].
The effects each skill's perks carry, for a script to read:
| Skill | Effects |
|---|---|
| Lockpicking | lockpick.zone, lockpick.break, lockpick.alarm, lockpick.pins, lockpick.speed (+2% a level) |
| Hacking | hack.time, hack.tries, hack.alarm, hack.skip |
| Demolitions | thermite.grid, demo.fail, demo.time, demo.burn, demo.charges |
| Safecracking | safe.window, drill.jam, drill.speed, drill.keepbit, vault.boxes |
| Car Theft | hotwire.speed, slimjim.speed, theft.report, tracker.speed, hotwire.fail |
| Cultivation | grow.care, grow.yield (+1% a level too), grow.pests, grow.loupe, grow.quality |
| Chemistry | lab.purity, lab.fire, lab.batch, lab.value |
| Dealing | sell.price, sell.snitch, sell.rate, sell.amount |
| Smuggling | run.pay, run.heat, run.time, run.tier |
| Cooking | cook.speed, cook.window, cook.quality |
| Fishing | fish.bite, fish.snap, fish.rare, fish.size |
| Hunting | hunt.track, hunt.spook, hunt.quality, hunt.meat |
| Mining | mine.speed, mine.yield, mine.rare, mine.wear |
| Mechanics | repair.speed, repair.save, repair.diag, tune.quality |
| Trucking | haul.pay, haul.hook, haul.fuel, haul.tier |
| Crafting | craft.speed, craft.save, craft.quality, craft.tier |
| Body skills | No effects: the level sets the GTA stat instead. |
Fractions are percents (0.25 is 25%); whole numbers are counts (one pin fewer, one extra try).
Its own API
Server exports (what Jx.skills calls; use them directly without Jixryo Core):
| Export | What it does |
|---|---|
AddXP(src, skill, amount, reason) | Adds XP as the calling resource. true, gained or false, why (unknown_skill, not_allowed, bad_amount, not_loaded, too_fast). |
Boost(src, skill, mult, minutes, label) | XP times mult on one skill ('*' for all) for minutes. Needs the caller in Config.boostSources. |
GetLevel(src, skill) | 0 to 10; 0 for anyone not in the city. |
GetXP(src, skill) | Total XP in the skill. |
HasLevel(src, skill, level) | true when the level is reached. |
GetEffect(src, name) | The summed effect, 0 when none. |
GetSkills(src) | Every skill the character has touched: { xp, level } by id. |
Client exports:
| Export | What it does |
|---|---|
GetLevel(skill), GetXP(skill), HasLevel(skill, level), GetEffect(name), GetSkills() | This player's own copy, as the server last sent it. For showing things and feel only. |
Open() | Opens the menu. |
Callbacks (ox_lib):
| Callback | Who | What |
|---|---|---|
jixryo_advancedskills:server:view | Players | The whole menu for this character: categories, skills, perks, today's XP, boosts, the event, recent gains. |
jixryo_advancedskills:server:staff | Staff | find, player, set, give, reset, boost, event (with stop = true to end one). Changes need reason. |
Events:
| Event | Direction | What |
|---|---|---|
jixryo_advancedskills:client:sync | Server to a game | The player's own skills, effects and boosts, on load and after staff edits. |
jixryo_advancedskills:client:gain | Server to a game | One gain: skill, amount, XP span, level up with its perks, rank, multiplier, reduced flag. |
jixryo_advancedskills:client:boosts | Server to a game | The player's live boosts after a new one. |
jixryo_advancedskills:server:hello | Game to server | A game asks for its skills after the resource (re)starts. |
jixryo_advancedskills:server:body | Game to server | The once-a-minute body report (metres sprinted, swum and driven fast; seconds under water and flying; melee hits). |
jixryo_advancedskills:levelUp | Server only | (src, skill, level, before) for other resources. |
State: GlobalState.jxSkillsEvent holds the running XP event, or nothing.
Database: jixryo_skills (one row per character and skill: XP, the day and its XP, last used, last rusted), jixryo_skills_log (recent gains, merged by skill and reason within 10 minutes, 50 kept per character), jixryo_skills_boosts.
Audit actions: skills.set, skills.give, skills.reset, skills.boost, skills.event, skills.event.stop.
Commands and keybinds
| Command or key | Who | What |
|---|---|---|
/skills | Everyone | Opens or closes the skills menu. The name is Config.menu.command. |
| K | Everyone | The same, as a key mapping ("Skills menu"); players can change it in GTA's Settings, Key Bindings, FiveM. |
| Q and E, arrows, Enter, Esc | Everyone, in the menu | Switch tabs, move between skills, close. |
Configuration
| Key | Default | What it does |
|---|---|---|
Config.menu.command | 'skills' | The command and key mapping name. |
Config.menu.key | 'K' | The default key. |
Config.menu.label | 'Skills menu' | The key mapping's label in GTA's settings. |
Config.levels.max | 10 | The top level. A skill can set its own max. |
Config.levels.base, .power | 100, 1.6 | XP from level L-1 to L is base x L ^ power, rounded to 10: 100, 300, 580, 920, 1310, 1760, 2250, 2790, 3360, 3980 (17,350 to level 10). |
Config.ranks | Untrained 0, Novice 1, Apprentice 3, Skilled 5, Expert 7, Master 9, Legend 10 | Default rank names by level; a skill can set its own ranks. |
Config.dailyCap.xp, .after | 1500, 0.25 | Full XP up to this a skill a day, then this fraction. |
Config.rust.days, .perDay | 7, 0.05 | Rusting skills fade after this many days unused, this fraction of the level's span a day. |
Config.limits.maxPerCall | 100 | The most XP one call gives (a skill can set its own maxPerCall). |
Config.limits.burst | 20 | Gains one skill takes from one player in 10 seconds. |
Config.log.merge, .keep | 600, 50 | Gains of the same skill and reason within this many seconds are one line; lines kept per character. |
Config.saveEvery | 15 | Seconds between database writes of changed skills (also on logout, drop and resource stop). |
Config.staff.ace | { 'group.god', 'group.admin', 'jixryo.skills' } | Who gets the STAFF tab. |
Config.staff.maxEventHours | 72 | The longest XP event. |
Config.staff.maxBoostMinutes | 1440 | The longest boost. |
Config.staff.maxMult | 5 | The biggest multiplier for a boost or an event. |
Config.boostSources | { 'jixryo_advancedskills' } | Resources that may hand out boosts. |
Config.categories | crime (hidden), drugs (hidden), trades, body (rust) | The four categories: label, icon, whether skills hide until found, where they show, whether they rust. |
Config.body.reportEvery | 60 | Seconds between body reports from a game. |
Config.body.sampleEvery | 5 | Seconds between the server's own position samples. |
Config.body.perMinute | sprint 540, swim 180, under 60, melee 40, drive 4200, fly 60 | The most one minute can hold of each activity. |
Config.body.xp | stamina: sprint 0.04, swim 0.06; lung: under 0.25; strength: melee 2; driving: drive 0.004; flying: fly 0.15 | XP per metre, second or hit. |
Config.body.reasons | Sprinting and swimming, Under water, Melee hits, Driving fast, Flying | What each shows as in recent gains. |
Config.skills.<id> | 22 skills | Each skill's label, category, icon, about, train, sources, ranks, perks, scale, stat, rust, maxPerCall, base, power, max. |
Config.order | the 22 ids | The order skills show in, within their category. |
The resources each skill names as XP sources in this build:
| Skill | Sources |
|---|---|
| Lockpicking | jixryo_vehiclekeys, jixryo_criminal |
| Hacking | jixryo_criminal, jixryo_vehiclekeys |
| Demolitions, Safecracking, Chemistry, Dealing, Smuggling | jixryo_criminal |
| Car Theft | jixryo_vehiclekeys, jixryo_criminal |
| Cultivation | jixryo_smoking, jixryo_criminal |
| Cooking | jixryo_restaurants |
| Fishing | jixryo_fishing |
| Hunting | jixryo_trailcam, jixryo_hunting |
| Mechanics | jixryo_mechanic |
| Trucking | jixryo_trucking, jixryo_restaurants |
| Strength | jixryo_prison (plus melee hits from the body report) |
| Shooting | jixryo_police |
| Mining, Crafting, Stamina, Lung Capacity, Driving, Flying | None named. Stamina, Lung Capacity, Driving and Flying level from the body report. Mining and Crafting have no source yet in this build. |
Security
- XP only from server code. No event a player's game can send adds XP, except the body report: once a minute (the server refuses one sooner than 50 seconds after the last), every number is capped to what a minute can hold, metres on foot and at the wheel are capped to what the server's own position samples saw the player cover (with a little slack for corners), flying to the time the server saw them at an aircraft's controls, and then the daily cap applies. Garbage values (negative, text, NaN, infinite) add nothing. A cheat gets no more than a player who never stops running.
- Each skill names the resources that may give it XP, read from the invoking resource; a per-call cap and a burst limit stop a looping script without stopping the server.
- A player's skills go to their own game only. The client's copy is for showing things and feel; outcomes that matter are decided on the server with
Jx.skillsthere. - Staff tools re-check the ACE on every call, validate every value (level within the skill's range, XP from -20,000 to 20,000, multipliers and durations within the staff limits), refuse odd citizen ids before the database is asked, require a reason for every change and audit it.
- Rate limits through Jixryo Core: the menu view once every half second, staff calls once every quarter second, the hello once every 5 seconds, the body report once every 50 seconds.
- In memory while a character plays, written in batches every 15 seconds and on logout, drop and resource stop; a character switch on the same player keeps each character's skills apart.
Tests
The suite runs the real server on a real database (the resource's own SQL on SQLite) with Jixryo Core's real validate, db, rate, perm, audit and player modules, then the real client in a stand-in game. Run on 2026-10-31.
| Suite | Result | What it covers |
|---|---|---|
jixryo_advancedskills.lua | 22 passed, 0 failed | The tables, the config's soundness, the XP curve and ranks, loading with effects to the owner only, XP queued while loading, XP from a named source with logging and level ups, refused sources and bad amounts, the day's soft cap, boosts and events multiplying, the burst limit, saving on the timer, logout and drop, rust, the menu's view, staff tools (ACE, reason, audit, offline by citizen id, odd ids), XP events and boosts, body reports capped against the server's own samples, the exports, Jixryo Core's Jx.skills with the resource on and off, and the player's game (stats, the chip, the rank-up sound, the menu's focus and blur, body counting). |
cd dev-tools/luarun && node run.mjs ../../jixryo_scripts/jixryo_advancedskills tests/jixryo_advancedskills.luaA filter word after the suite name runs only the tests whose name has it. The README records 15 planted bugs, all caught, and the built page checked through dev-tools/nui/cdp-game.mjs (opening, rows, keys, Esc, chips merging, banners, sounds).
Check it in game
/skillsand K open the menu with the game blurred; Esc closes it. The CRIME and DRUGS tabs count the skills you have not found yet.- Sprint for a minute: within the next minute the Stamina chip shows the XP, and the recent gains list "Sprinting and swimming".
- With Stamina a few levels up, the stamina bar lasts longer; the BODY tab shows the GTA stat value and the next level's.
- Have a script that a skill names give XP (Jixryo Criminal's XP action is one): the chip shows, and at level 2 the level-up banner names the perk with GTA's rank-up sound.
- STAFF tab as staff: find a player, set a level with a reason; without a reason it refuses. Check the entry in Jixryo Core's audit log.
- Start an XP event (x2, 1 hour): everyone sees the banner and gains double; stop it and gains return to normal. Restart the resource during an event: it is still on.
- Open an offline character by citizen id and set a level; log that character in and see it.