Roleplay jobs
Roleplay jobs
Seven ready-made Night City jobs for a roleplay server: what each one plays like, how they connect, the setup steps they share, the settings to run them all on one server and the platform features they rely on.
On this page6 sections
Ready-made Night City jobs for a roleplay server: a ripperdoc who installs real cyberware, a CHOOH2
fuel chain from the corn rows to the depot, a techie's workbench, netrunners breaching for fixers, a
contract board, Trauma Team and Aldecaldos smugglers. Each job is a Lua resource in the
Open2077/open77-resources repository, under rp/,
and runs on the same building blocks: prompts and timed work from
open77_actions, item and money transfers saved as one operation by
open77_transactions, and offers the other player accepts through
player interactions.
This section is for two readers: players who want to know how a job plays, and server owners who want to run it. Each job page covers both. To write a job of your own instead, start with Build your first Lua job.
Like the world-interaction libraries they use, these jobs are experimental. Run a job on a test server with two players before opening it to your community.
The jobs
| Job | What players do | Where |
|---|---|---|
| Ripperdoc | Quote a patient, operate in the chair and install real cyberware, paid once; keep the clinic stocked with chrome from a dealer. | Viktor's clinic, Little China; the chrome dealer in Kabuki Market |
| CHOOH2 chain | Harvest corn into crates, truck them to the refinery, ferment them into CHOOH2 canisters, then sell the canisters at the depot or pour them into a car. | The Biotechnica protein farm on the northern edge of Northside; the Petrochem tank farm of the North Sunrise Oil Field |
| Techie | Buy salvage from a dealer or a scrapper, strip it at the workbenches, assemble weapon mods and cyberware components in stages, and sell them to a shop or a player. | The Kabuki west workshop; Wilson's stall and Dr. Osei's Med-Point |
| Netrunner | Take a breach contract, jack into a real terminal against the clock, risk an NCPD trace on a failure, and deliver the data shard for the reward minus the fixer's cut. | The Afterlife's back room and six terminals across the city |
| Fixer board | Take escrowed deliveries, retrievals, job orders and cyberpsycho bounties, or post your own contracts as a fixer, and build the reputation that unlocks better-paid work. | Rogue at the Afterlife, Wakako's in Japantown, Regina's corner in Kabuki |
| Trauma Team | Sell Silver, Gold and Platinum plans; answer a downed player's call, fly the AV out, stabilise and evacuate them, billed to their plan or their wallet. | Plan kiosks at The Stalls and on the Afterlife street; the AV pad outside the Afterlife |
| Nomad smuggler | Take a run at the Aldecaldos camp, carry contraband crates into a truck, get past the NCPD checkpoints and hand the crates to a fence; NCPD officers can search the truck. | The Aldecaldos camp in the Badlands; drops at the Afterlife and Lizzie's Bar |
What the jobs have in common
- A job and a shift. Workers hold the job through
rp_jobsand clock in with/service. Clocking out stops the work in progress. - Prompts and progress bars. Walk up to a work spot and press E on its card. A bar shows how long the work takes; X stops it, and work stopped before its bar ends moves nothing. A work spot holds one player: another player standing on it is refused with "Someone is standing there."
- Consent. When a job involves another player, that player sees an offer card that names who
offers what: Y accepts, N declines. Both keys can be rebound under Pause > Settings > Key
bindings, and
/interaction acceptor/interaction declinein chat do the same. Trauma Team asks an uninsured patient to accept the charges in a dialog instead. - Crates in your hands. The CHOOH2 chain, the nomad runs and some fixer contracts use crates you carry. E picks one up; while you carry it you walk, and cannot sprint, jump or fight. G sets it down, and E at a truck's tailgate loads it into the bed.
- Money and items move once. A payment and the items it pays for are saved together. Work that is cancelled or interrupted before it completes moves nothing, and a retried payment is not charged twice.
- Refusals in words. A refused action says why, in the job's own words. Each job page lists them, with what an operator can fix.
- Names are characters. When
rp_identityruns, offers, boards and notices name players by their character, not by their account. - Shown to everyone. The server plays the work postures, so every player nearby sees the same scene.
How the jobs connect
- The fixer board's job orders pay for work the other jobs report: a netrunner's successful breach, an implant installed at the ripperdoc, CHOOH2 canisters refined at Petrochem, an assembly at the techie's bench, a Trauma Team stabilisation or a nomad's delivered crate.
- The netrunner's contracts are posted by players with the fixer job, and a failed breach reaches the NCPD officers on duty.
- The CHOOH2 chain and the nomad runs load crates into the
same truck beds (
rp_cargo), and a nomad on duty may haul corn. - A Trauma Team patient wakes up at Viktor's clinic, where the ripperdoc works.
Setting up a job
Every job page lists its exact resources and settings. The steps are the same for all of them:
-
Database. The jobs store items and money in SQL: configure a MySQL or MariaDB database first.
-
Inventory backend. Pockets, stashes and wallets must be accounts of
open77_transactions. Set the convar inserver.jsonc:"convars": { "rp_inventory_backend": "transactions" } -
Load the resources. Add the libraries, the RP pack resources and the job to
resources.load, libraries first. See Lua resources. -
Allow the job to move value. In the server console, give the job a
writersentry and, when it creates items or money, a mint rule (who may write). Keep the entries of your other jobs. -
Start it.
open77_transactions,open77_actionsand most jobs declareauto_start false: start them withensure, or list theensurelines instartup.commandsso they start with the server. -
Staff it. Players join a job the way
rp_jobsdefines for it. Agency jobs are joined at the employment agency on the Kabuki Gallery (/agence); the others are hired by the job's boss with/embaucher <playerId>or by ALT+clicking a player. In the server console,setjob <playerId> <job> <grade>gives a job directly, for example to appoint the first boss.
The jobs and the rp_jobs names they use, all shipped with rp_jobs:
| Job page | rp_jobs job |
How players get it |
|---|---|---|
| Ripperdoc | ripper |
Hired |
| CHOOH2 chain | farmhand, refinery |
Agency |
| Techie | techie |
Agency |
| Netrunner | netrunner; contracts posted by fixer |
Hired |
| Fixer board | fixer posts contracts; anyone takes them |
Hired |
| Trauma Team | trauma |
Hired |
| Nomad smuggler | nomade; searches by ncpd |
Agency; NCPD is hired |
Run every job on one server
A server that runs all seven jobs loads the union of their resources. rp_trauma replaces
rp_medic: do not load both.
"resources": {
"load": [
// ...your existing resources, without rp_medic...
"open77_animations", "open77_props", "open77_interactions",
"open77_transactions", "open77_actions", "open77_containers", "open77_player_interactions",
"open77_uikit", "open77_contextmenu", "open77_notifications",
"open77_cyberware", "open77_hacking", "open77_fuel",
"rp_jobs", "rp_inventory", "rp_economy", "rp_bank", "rp_zones", "rp_identity",
"rp_garage", "rp_cargo", "rp_ncpd",
"rp_ripperdoc", "rp_chooh2", "rp_techie", "rp_netrunner", "rp_fixer", "rp_trauma", "rp_nomade"
]
}
The default writers value * lets every resource write. If your server uses a list, the jobs'
entries together do not fit in one text tunable, which holds at most 256 characters: writers2 to
writers4 continue the list. Each mint tunable has the same limit, so the rules are spread over
four of the six slots:
tunable.set open77_transactions writers rp_ripperdoc:cash+bank+soc+char+stash/stock, rp_trauma:cash+bank+soc+stash/tti, rp_techie:stash/tray+char+cash, rp_netrunner:char+stash/contracts, rp_fixer:char+stash
tunable.set open77_transactions writers2 rp_chooh2:world+stash+char, rp_nomade:world+stash+char, rp_cargo:veh/cargo, open77_containers:world, rp_economy:cash+bank+soc, rp_inventory
tunable.set open77_transactions writers3 <your other writers>
tunable.set open77_transactions mint1 rp_inventory sys:* * 2000; rp_economy sys:* money 2000000
tunable.set open77_transactions mint2 rp_ripperdoc sys:ripperdoc.supplier * 40; rp_netrunner sys:netrunner * 300; rp_trauma sys:trauma.plans tti_card 500; rp_trauma sys:trauma.billing tti_invoice 2000000
tunable.set open77_transactions mint3 rp_chooh2 sys:chooh2.fields * 2000; rp_chooh2 sys:chooh2.refinery chooh2_canister 400; rp_nomade sys:nomad nomad_crate 500; rp_nomade sys:nomad.supplier nomad_contraband 2000
tunable.set open77_transactions mint4 rp_techie sys:techie.workshop * 960; rp_techie sys:techie.dealer * 540
If your server already uses some of these slots, append the rules to them with ; instead,
keeping each value under 256 characters. transactions mints in the console lists every rule with
this hour's use; a rule the coordinator cannot read is logged as mint rules: ignored entry. Size
the hourly caps to your server: each job page explains its own.
Then start the libraries and the jobs. rp_trauma starts on its own once the libraries it waits
for are running:
"startup": {
"commands": [
"ensure open77_transactions",
"ensure open77_actions",
"ensure open77_containers",
"ensure rp_cargo",
"ensure rp_ripperdoc",
"ensure rp_chooh2",
"ensure rp_techie",
"ensure rp_netrunner",
"ensure rp_fixer",
"ensure rp_nomade"
]
}
Platform features the jobs rely on
Three platform changes came with these jobs. They matter to a server that runs them, and to anyone writing a job of their own.
-
Lying down on beds. Seating offers "Lie down on the bed" on the measured double-bed family, next to sitting and leaning, and
/sittakes those beds too. One player per bed; the player lies down from where they stand. The convaropen77_seating_postures(a comma list ofsit,leanandlie,allby default) narrows the postures;sit,leanturns the bed prompts off. -
The cyberware lab is for operators.
open77_cyberware_lab(/cyberlab) installs implants and changes health, stats and abilities with no ripperdoc and no payment. Every player may still use it on themselves; acting on another player or on the whole server needs the server console or the ACL rightcommand.cyberlab.others, and anyone else is refused withoperator_required. A roleplay server that sells cyberware through the ripperdoc should not start the lab at all, or keep it to operators. See Cyberware. -
Client scripts clean up on stop. A resource's client script hears that it stops through
onClientResourceStop(name, reason);onResourceStopis never sent to a client script. The platform resources the jobs use release their locks, effects and leases there, so restarting a job or a library with players connected leaves nobody stuck. In your own client scripts, put the stop cleanup in anonClientResourceStophandler that checks the resource name:-- client AddEventHandler("onClientResourceStop", function(name) if name ~= GetCurrentResourceName() then return end -- release what this script holds: input locks, effects, props, HUD end)
Where to go next
- Ripperdoc: Viktor's clinic: from the patient's chair to the server console.
- Fixer: the contract board: the board that pays for the other jobs' work.
- Jobs and world interaction: the example jobs and the libraries behind them.
- Actions and carrying: the prompts, timed work and crates every job uses.
- Cyberware: the implants the ripperdoc installs.
// For agents & LLMsthis page as Markdownllms.txtllms-full.txt
