All documentation

Free scripts

Poggy Multijob

Lets characters hold several jobs and switch between them from a menu or with one command. Staff get an admin panel for online and offline characters, with one-click job presets.

  • poggy_multijobv1.7.4
  • FrameworksVORP Core, RSG Core, QBCore RedM
  • Updated5 Oct 2026

Overview#

Poggy Multijob remembers every job a character is given. Players switch between them from a menu (/multijob) or straight away with /mj <number>. Staff get an admin panel to see and change every character's jobs, online or offline, with ready-made job presets.

  • Keeps every job. Every job change on the server, from any script, admin command or boss menu, is saved to the character's list: both the job they left and the job they took.
  • Menu and quick switch. /multijob lists every job held; /mj 1 jumps straight to another.
  • Admin panel (/mjadmin): edit any character's jobs, see every saved job in one searchable table, and apply presets.
  • Offline changes. The panel can change an offline character's active job.
  • Shop jobs. With Poggy Markets installed, a tab in /poggy shows which job each shop gives its staff.
  • Server API for other scripts to add, remove and re-grade jobs on a character's list.

Requirements#

NeedsWhy
poggy_core 0.14.0 or newerCharacters, jobs, groups, the menu and notifications. Start it first.
oxmysqlStores each character's jobs.
VORP Core, RSG Core or QBCore RedMOnline job changes go through poggy_core on all three. Offline active-job changes are written to the framework's own table, which works on all three.

No menu resource (such as vorp_menu) is needed.

Installation#

  1. Download Poggy Multijob and put the poggy_multijob folder in your resources folder.
  2. Add it to server.cfg, after poggy_core and oxmysql:
    ensure oxmysql
    ensure poggy_core
    ensure poggy_multijob
  3. Add your staff groups to Admin groups (see Permissions).
  4. Restart the server.

The poggy_multijob table is created automatically when the script starts. There is nothing to import.

Configuration#

Every setting can be changed in game: type /poggy and open Poggy Multijob. You can also edit config.lua and translations.lua by hand. Restart the script after a change.

SettingDefaultWhat it does
Menu command (Config.Command)'multijob'Command that opens the job menu.
Quick switch command (Config.SwitchCommand)'mj'Command that switches job by number.
Job after quitting (Config.DefaultJob)'unemployed'The job given after Quit Job or Quit All Jobs, and when another script removes the job a character is wearing. Picking Unemployed from the menu always uses unemployed, grade 0.
Grade after quitting (Config.DefaultGrade)0The grade given with it.
Label after quitting (Config.DefaultJobLabel)'Unemployed'The label given with it.
Admin groups (Config.AdminGroups)admin, superadmin, moderatorGroups that may use /mjadmin.
Job presets (Config.JobPresets)Law, Medical, Business, ShopsReady-made jobs for the admin panel (see below).
Debug output (Config.Debug)falsePrints admin panel actions and failed job changes to the consoles.

Config.MaxJobs, Config.Webhook, Config.CommandDescription and Config.SwitchCommandDescription are in the file but not used: there is no job limit, nothing is sent to Discord, and no chat suggestions are registered.

Job presets

Presets let staff hand out a job in one click. They are grouped; each group has a name and a list of jobs:

Config.JobPresets = {
    police = {
        name = "Law Enforcement",
        jobs = {
            { job = "sheriff", label = "DEPUTY", grade = 1, category = "Sheriff" },
            { job = "sheriff", label = "SHERIFF", grade = 6, category = "Sheriff" },
        }
    },
}
FieldWhat it is
jobThe job name, exactly as your server spells it (case-sensitive on VORP).
labelThe name shown for the job.
gradeThe rank number.
categoryA subheading inside the group, such as Sheriff.

The law and medical presets use the stock job names police, sheriff, marshal and doctor. The shipped Shop Owners jobs are examples, not stock jobs: rename or delete them. The panel's category filter knows the group keys police, medical, business and shops; a group with any other key still shows under All Categories.

Text

Every player message is in translations.lua (the Text & language tab). Keep every %s: the script fills in a job name or number there.

Commands#

CommandWhoWhat it does
/multijobEveryoneOpens the job menu: every job held (the active one marked), plus Unemployed, Quit Job and Quit All Jobs.
/mj <number>EveryoneSwitches straight to one of your other jobs. 1 is the first job that is not your current one; Unemployed is always last.
/mjadminAdmin groupsOpens the admin panel. This name is fixed.

/multijob and /mj can be renamed in the config.

Permissions#

/mjadmin and every admin action are checked on the server. A player is allowed when their account group or their character group is in Admin groups (Config.AdminGroups). Case does not matter. No ACE is needed.

The Shop jobs tab in /poggy belongs to Poggy Markets and follows its rules: only server staff can change a shop's job.

Using it in game#

Getting a job onto the list

A job is added the moment a character gets it, whatever gave it: an admin command, a boss menu or another script. The job they had before stays on the list too. The current job is also saved when they join and whenever they use /multijob or /mj.

The menu

  • Every job held is listed; the active one says [CURRENT].
  • Unemployed is always there, to go off duty.
  • Quit Job removes the current job and gives the job after quitting.
  • Quit All Jobs clears the whole list.

Quick switch

/mj <number> counts your other jobs, not the one you are wearing: /mj 1 is the first of them, and Unemployed is the last number. A wrong number tells the player the valid range.

The admin panel

  • Edit Job: every character with saved jobs, online and offline. Set the active job, or add, edit or remove jobs.
  • All Jobs: every saved job in one table. Search, filter by job, sort, see last login, remove.
  • Job Presets: pick the player in Edit Job first, then a preset, then Apply Selected Preset.

Shop jobs (with Poggy Markets)

/poggy → Poggy Multijob → Shop jobs lists every Poggy Markets shop and the job it gives its owner and staff. Change it there and it applies at once: everyone hired at that shop gets the job added to their list (their current job is left alone), and loses it when let go. It needs poggy_markets running with its shop jobs switched on.

For developers#

Client export: exports.poggy_multijob:GetJobs() returns the cached job list.

Job changes go through poggy_core's job.set with persist = true, and poggy_core raises its own job-changed events for other scripts.

Server API

poggy_multijob owns every character's job list. Other scripts change it through these server exports instead of writing the table:

local ok, reason = exports.poggy_multijob:AddJob(target, job, grade, label)
local ok, reason = exports.poggy_multijob:RemoveJob(target, job)
local ok, reason = exports.poggy_multijob:SetJobGrade(target, job, grade)
local has, reason = exports.poggy_multijob:HasJob(target, job)
ExportWhat it does
AddJob(target, job, grade?, label?)Adds the job to the list without switching the active job. Grade defaults to 0, label to the job name. If it is already there, its grade (and label, when given) are updated.
RemoveJob(target, job)Removes the job. If the character is wearing it, they are switched to the job after quitting, online or offline.
SetJobGrade(target, job, grade)Changes the job's grade on the list, and the active grade when it is the job they wear.
HasJob(target, job)true when the job is on the list, or is the job an online player wears.
  • target is an online player's server id (a number) or a character id (a string): the VORP charidentifier as text, or the RSG / QBCore RedM citizenid. A character id also works for offline characters. Pass a VORP character id as a string (tostring(charId)); a number is always read as a server id.
  • Call them from a thread (CreateThread): they wait on the database.
  • Reasons on success: added, updated, unchanged, removed. On failure: not_ready, bad_target, bad_job, bad_grade, not_online, no_character, not_found, db_error.
  • Unemployed (and none, unknown or an empty name) can never be added.

Troubleshooting#

A new job does not show in the menu
Job changes are saved as they happen. A job given while poggy_multijob was stopped is picked up the next time the character opens /multijob while wearing it.
Jobs are not saving
Look for a red poggy_multijob database: line in the server console at start, check oxmysql is running, and turn on Debug output for more detail.
The admin panel does not open
The player's account or character group must be in Admin groups.
"Offline job changes are not supported on this framework"
Online players can be changed on every framework. Offline active-job changes are written to the framework's own character table; their multijob entries are still saved and apply the next time they switch.

Updating#

Poggy Multijob updates through poggy_core's updater, which keeps your values in config.lua and translations.lua (see Updates).

From the old multijob folder (before 1.6.0)

  1. Copy your settings out of the old shared/config.lua and shared/locales.lua.
  2. Delete the old multijob folder and add poggy_multijob.
  3. In server.cfg, change ensure multijob to ensure poggy_multijob.
  4. Put your settings into config.lua and translations.lua.

Players keep their jobs: the table is still poggy_multijob and the commands are unchanged. Scripts that called exports.multijob or listened for multijob: events must use exports.poggy_multijob and poggy_multijob:.

From 1.3.0 or earlier, rows are copied from the old marshal_multi_jobs table on the first start; the old table is kept so you can roll back.

Join the Discord Discord