Before You Begin#
Before installing Newspaper Job, make sure your server meets the requirements. Only the first three are mandatory; everything else is picked up automatically when it is running.
Requirement | Status | Notes |
|---|---|---|
| Required | Database access. The tables create themselves. |
| Required | Callbacks and the scheduler behind the daily and season resets. |
Framework | Required | ESX (es_extended), QBCore (qb-core) or Qbox (qbx_core) — detected automatically. |
Inventory | Recommended | ox_inventory or qs-inventory are used directly; otherwise the framework's own inventory. The newspaper item must be registered in it. |
Target | Optional | ox_target or qb-target. Without one, players press E next to the editor. |
Vehicle keys | Optional | Hands the courier the keys of the work bike. Eleven resources supported. |
Fuel | Optional | Fills the Faggio's tank on spawn (LegacyFuel or any resource with a SetFuel export). |
| Optional | Books every payout through the job's treasury and statistics instead of paying cash directly. |
Framework, inventory and vehicle keys are detected by looking for started resources, so whatever is not running is simply skipped. See Integrations for the full list of supported resources.
github.comReleases · overextended/oxmysqlMySQL resource for FXServer.github.comReleases · overextended/ox_libA FiveM resource and script library for Lua and JS.Downloading Newspaper Job#
After purchasing Newspaper Job, the resource is automatically linked to your CFX Portal account.
Sign in to the CFX Portal using the same account used during checkout, open Granted Assets, and download Newspaper Job.
After extracting the download, you should have the following:
[newspaperjob]/
├── qs-newspaperjob/ -- the resource itself
│ ├── config/ -- config.lua and translations.lua: what you edit
│ ├── client/framework/ -- open bridges: framework, target, vehicle keys
│ ├── server/framework/ -- open bridges: framework and inventory
│ └── fxmanifest.lua
├── [items]/items.lua -- the newspaper item for each inventory
└── [sql]/qs-newspaperjob.sql -- optional, the tables create themselvesInstalling the Resource#
Move the qs-newspaperjob folder into your server's resources directory. It can live in any category folder:
resources/
└── [qs]/
└── qs-newspaperjob/Then open your server.cfg and start every dependency before the job:
ensure oxmysql
ensure ox_lib
# Framework
ensure qb-core # or qbx_core / es_extended
# Optional integrations
ensure ox_inventory # or qs-inventory
ensure ox_target # or qb-target
ensure qs-vehiclekeys # or any supported keys resource
ensure LegacyFuel
ensure qs-newspaperjobThe loading order matters. The framework and the vehicle-keys resource are detected the moment the job's config loads, so anything that starts after qs-newspaperjob is not found.
Registering the Job#
Taking a route requires the job newspaper_delivery (anyone can still open the panel, read the guide and see the statistics). The job name is set in Config.NewspaperJob, which accepts several names if you run more than one paper. To let everybody deliver, set Config.RequireJob = false and skip this step.
Nothing to do. On first start the script inserts the job into jobs and a grade 0 · Courier into job_grades for every name in Config.NewspaperJob that does not exist yet, and prints Registered the ESX job "newspaper_delivery".
QBCore keeps its jobs in a file, not the database. Add this to qb-core/shared/jobs.lua and restart qb-core:
['newspaper_delivery'] = {
label = 'Newspaper Delivery',
defaultDuty = true,
offDutyPay = false,
grades = {
['0'] = { name = 'Courier', payment = 10 },
},
},Add this to qbx_core/shared/jobs.lua and restart qbx_core:
['newspaper_delivery'] = {
label = 'Newspaper Delivery',
defaultDuty = true,
offDutyPay = false,
grades = {
[0] = { name = 'Courier', payment = 10 },
},
},Then hand the job to a player with your framework's usual command, for example /setjob <id> newspaper_delivery 0, or through your job centre.
Registering the Newspaper Item#
The newspaper is a throwable weapon item — weapon_acidpackage, labelled Newspaper — because deliveries are detected from the projectile it throws. Your inventory must know it, or every route is refused with This item does not exist: weapon_acidpackage.
shared/items.lua
['weapon_acidpackage'] = {
['name'] = 'weapon_acidpackage',
['label'] = 'Newspaper',
['weight'] = 1000,
['type'] = 'weapon',
['ammotype'] = nil,
['image'] = 'weapon_acidpackage.png',
['unique'] = true,
['useable'] = false,
['description'] = 'A printed or digital publication with news and articles'
},shared/weapons.lua
[`weapon_acidpackage`] = {
name = 'weapon_acidpackage',
label = 'Newspaper',
weapontype = 'Throwable',
ammotype = nil,
damagereason = 'Died'
},In the inventory's config, add 'acidpackage' to Config.Throwables and give it a durability multiplier:
Config.Throwables = {
'ball', 'bzgas', 'flare', 'grenade', 'molotov', 'pipebomb',
'proxmine', 'smokegrenade', 'snowball', 'stickybomb',
'acidpackage', -- add this
}
Config.DurabilityMultiplier = {
weapon_acidpackage = 0.15,
}Finally, in client/custom/misc/UseWeapon.lua, add weapon_acidpackage to the line that lists the throwables:
elseif weaponName == 'weapon_stickybomb' or weaponName == 'weapon_pipebomb' or weaponName == 'weapon_smokegrenade' or weaponName == 'weapon_flare' or weaponName == 'weapon_proxmine' or weaponName == 'weapon_ball' or weaponName == 'weapon_molotov' or weaponName == 'weapon_grenade' or weaponName == 'weapon_bzgas' or weaponName == 'weapon_acidpackage' thenAdd the weapon to the Weapons table in ox_inventory/data/weapons.lua:
['WEAPON_ACIDPACKAGE'] = {
label = 'Newspaper',
weight = 0,
throwable = true,
},The upper-case name is expected: ox_inventory keys weapons that way, and the job matches both spellings.
qb-core/shared/items.lua
['weapon_acidpackage'] = { ['name'] = 'weapon_acidpackage', ['label'] = 'Newspaper', ['weight'] = 1000, ['type'] = 'weapon', ['ammotype'] = 'nil', ['image'] = 'weapon_acidpackage.png', ['unique'] = true, ['useable'] = false, ['description'] = 'A printed or digital publication with news and articles' },qb-core/shared/weapons.lua
[`weapon_acidpackage`] = { ['name'] = 'weapon_acidpackage', ['label'] = 'Newspaper', ['weapontype'] = 'Throwable', ['ammotype'] = 'nil', ['damagereason'] = 'Died' },qb-weapons/config.lua — add it to the throwables:
Config.Throwables = {
'ball', 'bzgas', 'flare', 'grenade', 'molotov', 'pipebomb',
'proxmine', 'smokegrenade', 'snowball', 'stickybomb',
'acidpackage', -- add this
}qb-hud/config.lua — so the HUD treats it as a weapon:
[`weapon_acidpackage`] = trueThe same snippets ship in
[items]/items.lua. Using another throwable? ChangeConfig.NewspaperItemandConfig.NewspaperWeapontogether — the first is the inventory name, the second the weapon the projectile is detected by.
The Database#
There is no SQL to import. On first start Newspaper Job creates its tables, adds any column an older install is missing, and only prints a line when it actually changed something.
Table | Holds |
|---|---|
| One row per character: level, experience, and the all-time, season and daily experience and earnings. |
| When the daily and season rankings last reset, so a reset is never paid twice. |
| Ranking prizes won while the player was offline, paid on their next login. |
| The last daily and season podium shown in the statistics. |
The rankings join these tables to your framework's characters (users on ESX, players on QBCore/Qbox). On newer MariaDB versions the two can end up with different collations, so on start the script aligns its own identifier columns to your framework's and prints aligned N identifier column(s) when it does.
Prefer to prepare the database yourself?
[sql]/qs-newspaperjob.sqldoes exactly the same work and is safe to import twice. Importing it is optional either way.
Configuring the Resource#
Everything lives in two open files. Every option is explained in Usage.
File | Contents |
|---|---|
| Eight sections: general (job, interaction, money), world (blip and editor), vehicles, delivery, levels and routes, leaderboard, the editor's marker, debug — plus Discord webhooks. |
| The active language and every text the job shows, in eleven languages. |
The values worth reviewing first:
Config.Language = 'en' -- config/translations.lua
Config.RequireJob = true -- false lets anybody take a route
Config.NewspaperJob = { ['newspaper_delivery'] = true }
Config.Target = false -- true = ox_target / qb-target on the editor
Config.TargetScript = 'ox' -- 'ox' or 'qb'
Config.NewspaperItem = 'weapon_acidpackage'
Config.NewspaperWeapon = 'WEAPON_ACIDPACKAGE'
Config.LeaderBoardRewards = {
Daily = { [1] = 550, [2] = 350, [3] = 200 },
Season = { [1] = 5000, [2] = 3500, [3] = 2000 },
}Config changes need a restart of
qs-newspaperjob. Restarting mid-route ends every route in progress without pay, so do it while nobody is out delivering.
Verifying the Installation#
Restart your server and make sure the console shows no red line from qs-newspaperjob. Then join and work through one route:
Take the job
Give yourself
newspaper_delivery. The News Station blip appears on the map — it is only shown to players who can deliver.Talk to the editor
Walk up to Marcus Vale under the floating marker and press E (or use your target). The camera cuts to him and the job panel opens on the right.
Start a route
Pick Cityline Route, keep the Whippet Race Bike and press Start route. A bike spawns in the parking spot and six newspapers land in your inventory.
Deliver one stop
Ride to a blue ground marker, select the newspaper and throw it with the left mouse button. Newspaper delivered! confirms the server counted it.
Get paid
Deliver the remaining stops. Once every house is served — or the bag is empty — the GPS points back to the station. Press E at the drop-off to hand the bike in: You finished the route and earned $… confirms the payout and the experience.
Something did not happen? Common Errors lists every message the job can show and what to do about it, and
Config.Debug = truemakes the script narrate what it is doing in both consoles.



