Configuration

Complete reference for all oxide-postaljob configuration settings

Config File Map

FilePurpose
shared/config.luaGeneral settings (debug, sync, slot limits)
shared/config/job.luaCrew, payment, complaints, timer settings
shared/config/levels.luaProgression level definitions
shared/config/locations.luaDepot locations, delivery zones, letterboxes
shared/config/npcs.luaNPC models, blip settings, customer reactions
shared/config/outfits.luaMale/female GoPostal uniform components
shared/config/vehicles.luaVan model, props, offsets, health settings
shared/config/visuals.luaMarkers, animations, waypoint rendering
shared/init.luaShiftState and TaskType enums
server/main.luaRate limit configuration

General Settings

File: shared/config.lua

SettingTypeDefaultDescription
Config.DebugbooleanfalseEnable debug logging with [oxide-postaljob] prefix
Config.shiftSummarystring'nui'Shift summary display mode: 'nui' for popup summary screen, 'text' for SMS summary
Config.menuStylestring'nui'Supervisor menu style: 'nui' for Vue shift menu with cinematic camera, 'menu' for Bridge.Menu context menu. When set to 'menu', the NUI summary is also bypassed in favor of a notification
Config.Sync.broadcastRangenumber250.0Range in meters for broadcasting pallet sync events to nearby players
Config.MaxSlotsPerLocationnumber3Maximum concurrent shift slots per depot location

Job Settings

File: shared/config/job.lua

Crew

SettingTypeDefaultDescription
Config.Crew.maxSizenumber2Maximum crew members (leader + partner)
Config.Crew.inviteTimeoutnumber60Seconds before a crew invite expires
Config.Crew.coopBonusPercentnumber0.15Bonus percentage applied to deliveries completed while in a crew (15%)
Config.Crew.extraDeliveriesnumber2Extra deliveries added when a partner joins the crew

Payment

SettingTypeDefaultDescription
Config.Payment.basePaynumber40Base pay per delivery
Config.Payment.distanceBonusPerUnitnumber0.40Bonus per distance unit from origin to delivery point
Config.Payment.speedBonusAmountnumber20Flat bonus for completing a delivery before the timer expires
Config.Payment.earlyFinishPenaltynumber0.80Multiplier applied when clocking out with undelivered packages (20% deduction)
Config.Payment.vehicleDestroyFinenumber150Flat fine when the delivery van is destroyed
Config.Payment.streakBonusPerDaynumber10Bonus added per consecutive daily streak day
Config.Payment.maxStreakDaysnumber7Maximum streak days (caps the streak bonus)
Config.Payment.minDeliveryTimePerDistanceUnitnumber0.05Minimum delivery time scaling per distance unit
Config.Payment.absoluteMinDeliveryTimenumber10Absolute minimum delivery time in seconds

Complaints

SettingTypeDefaultDescription
Config.Complaints.maxComplaintsnumber3Complaints needed to trigger a suspension
Config.Complaints.timeoutMinutesnumber30Suspension duration in minutes
Config.Complaints.vehicleDestroyPenaltynumber1Complaints added when the van is destroyed
Config.Complaints.deathPenaltynumber1Complaints added when the player dies on shift
Config.Complaints.decayPerDeliverynumber1Complaints removed per successful delivery

Timer

SettingTypeDefaultDescription
Config.Timer.baseTimenumber60Base delivery timer in seconds
Config.Timer.timePerDistanceUnitnumber0.25Additional seconds per distance unit from player to delivery point
Config.Timer.expiredPenaltynumber0.85Payment multiplier when delivering after the timer expires (15% penalty)

Levels

File: shared/config/levels.lua

Each level is defined as an entry in Config.Levels:

FieldTypeDescription
titlestringLocale key for the level title
requiredDeliveriesnumberTotal deliveries needed to reach this level
maxPackagesnumberMaximum packages per batch
maxLettersnumberMaximum letters per batch
tipChancenumberProbability of receiving a tip (0.0 - 1.0)
tipRangetableMin/max tip amount { min, max }
payMultipliernumberMultiplier applied to base pay calculation
spreadFactornumberRoute spread bias (0.0 = tight clusters, 1.0 = spread apart). Controls how delivery zones are selected — low-level players get sparse routes for map exploration, high-level players get clustered routes for efficient grinding

Default Levels

Config.Levels = {
    [1] = { title = 'level.trainee',        requiredDeliveries = 0,   maxPackages = 3, maxLetters = 3, tipChance = 0.10, tipRange = { 5, 15 },  payMultiplier = 1.0,  spreadFactor = 1.0  },
    [2] = { title = 'level.mail_carrier',   requiredDeliveries = 20,  maxPackages = 4, maxLetters = 4, tipChance = 0.15, tipRange = { 5, 20 },  payMultiplier = 1.0,  spreadFactor = 0.75 },
    [3] = { title = 'level.senior_courier', requiredDeliveries = 50,  maxPackages = 5, maxLetters = 4, tipChance = 0.25, tipRange = { 10, 30 }, payMultiplier = 1.15, spreadFactor = 0.5  },
    [4] = { title = 'level.route_manager',  requiredDeliveries = 100, maxPackages = 7, maxLetters = 5, tipChance = 0.30, tipRange = { 10, 40 }, payMultiplier = 1.3,  spreadFactor = 0.25 },
    [5] = { title = 'level.head_postman',   requiredDeliveries = 200, maxPackages = 9, maxLetters = 6, tipChance = 0.40, tipRange = { 15, 50 }, payMultiplier = 1.5,  spreadFactor = 0.0  },
}

Locations

File: shared/config/locations.lua

Depot Structure

Each location in Config.Locations defines a complete depot:

FieldTypeDescription
namestringLocale key for the depot name
coordsvector3NPC supervisor position
headingnumberNPC facing direction
vehicleSpawnvector4Van spawn position and heading
pickupPointstableArray of vector4 pallet spawn locations
postBoxestableArray of vector4 post box locations for letter tasks
letterBoxestableArray of letterbox definitions
deliveryZonestableArray of delivery zone definitions

Delivery Zones

Each entry in deliveryZones:

FieldTypeDescription
coordsvector3Delivery destination coordinates
minLevelnumberMinimum player level required to receive this zone
labelstringLocale key for the zone label (e.g., street name)

Letterboxes

Each entry in letterBoxes:

FieldTypeDescription
coordsvector3Letterbox world coordinates
minLevelnumberMinimum player level required
labelstringLocale key for the letterbox label

Post Boxes

Each entry in postBoxes is a vector4 defining the coordinates and heading of a post box where players collect mail bags for letter tasks.

NPCs

File: shared/config/npcs.lua

SettingTypeDefaultDescription
Config.NpcModelstring's_m_m_postal_01'Ped model for the supervisor NPC
Config.NpcScenariostring'WORLD_HUMAN_CLIPBOARD'Ambient scenario the NPC performs

Blip Settings

SettingTypeDefaultDescription
Config.Blip.spritenumber480Map blip sprite ID
Config.Blip.colornumber2Map blip color
Config.Blip.scalenumber0.6Map blip scale
Config.Blip.labelstring'blip.gopostal_office'Locale key for blip label

Customer Peds

Config.CustomerPeds is an array of ped model names used for spawning customer NPCs at delivery points. A random model is selected for each delivery.

Customer Reactions

ReactionWalk SpeedAnimation DictAnimation NameMessage
good1.0mp_commongivetake1_aNone
poor0.8gestures@m@standing@casualgesture_no_waynotify.customer_took_long

Outfits

File: shared/config/outfits.lua

Separate outfit configurations for male (Config.PostalOutfitMale) and female (Config.PostalOutfitFemale) characters. Each contains:

FieldTypeDescription
componentstableArray of { component_id, drawable, texture } entries
propstableArray of { prop_id, drawable, texture } entries

Vehicles

File: shared/config/vehicles.lua

Van Settings

SettingTypeDefaultDescription
Config.Vehicle.modelstring'boxville2'Vehicle model name
Config.Vehicle.spawnDistancenumber5.0Distance threshold for spawn area clearing
Config.Vehicle.healthCheckIntervalnumber1000Milliseconds between health checks
Config.Vehicle.destroyedThresholdnumber150Engine health below which the van is considered destroyed
Config.Vehicle.damageChargeRatenumber0.50Dollar charge per health point below damage threshold
Config.Vehicle.damageChargeThresholdnumber950Body health below which damage charges apply
Config.Vehicle.rearDoorstable{ 2, 3 }Door indices that must be open for loading/unloading
Config.Vehicle.primaryColortable{ 255, 255, 255 }RGB primary color
Config.Vehicle.secondaryColortable{ 255, 255, 255 }RGB secondary color

Pallet & Box Props

SettingTypeDefaultDescription
Config.Pallet.modelstring'bkr_prop_coke_pallet_01a'Pallet prop model
Config.Pallet.boxModelstring'prop_cs_cardbox_01'Cardboard box prop model
Config.Pallet.maxVisibleBoxesnumber12Maximum visible box entities on a pallet
Config.Pallet.pickupTimenumber3000Pickup animation duration (ms)
Config.Pallet.loadTimenumber2000Load animation duration (ms)
Config.Pallet.vanProximitynumber5.0Distance to van required for loading
Config.Pallet.palletProximitynumber2.5Distance to pallet required for pickup
Config.Pallet.carryBonenumber24818Ped bone ID for carry attachment (SKEL_Spine3)
Config.Pallet.carryOffsetvector3(-0.2, 0.54, 0.0)Carry prop offset from bone
Config.Pallet.carryRotationvector3(0.0, 90.0, 0.0)Carry prop rotation

Letter Props

SettingTypeDefaultDescription
Config.Letter.postBoxModelstring'prop_postbox_01a'Post box prop model (for reference)
Config.Letter.letterBoxModelstable4 modelsLetterbox prop models for scanning
Config.Letter.mailBagModelstring'h4_prop_h4_med_bag_01b'Mail bag carry prop model
Config.Letter.envelopeModelstring'prop_cash_envelope_01'Envelope prop for letter delivery animation
Config.Letter.searchRadiusnumber15.0Radius for letterbox prop searching
Config.Letter.pickupTimenumber3000Mail bag pickup duration (ms)
Config.Letter.loadTimenumber2000Mail bag load duration (ms)
Config.Letter.deliverTimenumber2500Letter delivery animation duration (ms)
Config.Letter.carryBonenumber57005Ped bone ID for mail bag carry (SKEL_R_Hand)
Config.Letter.carryOffsetvector3(0.35, 0.0, 0.0)Mail bag carry offset
Config.Letter.carryRotationvector3(-5.0, -90.0, 40.0)Mail bag carry rotation

Van Box Offsets

Config.BoxOffsets defines 12 positions for boxes on the pallet. Config.VanBoxOffsets defines 11 positions for boxes inside the van. Config.VanBoxRotation sets the rotation for all van boxes (default: vector3(0, 0, 0)).

Visuals

File: shared/config/visuals.lua

Delivery Marker

SettingTypeDefaultDescription
Config.DeliveryMarker.typenumber25GTA marker type
Config.DeliveryMarker.scalevector3(1.0, 1.0, 0.5)Marker scale
Config.DeliveryMarker.colortable{ r=255, g=200, b=50, a=120 }Marker RGBA color
Config.DeliveryMarker.bobUpAndDownbooleanfalseEnable bobbing animation
Config.DeliveryMarker.rotatebooleanfalseEnable rotation animation

Animations

Config.Animations contains animation definitions for pickup and deliver actions:

AnimationDictClipDurationLabel
pickupanim@heists@box_carry@idle3000msPicking up package...
delivermp_commongivetake1_a3000msDelivering package...

Waypoints

SettingTypeDefaultDescription
Config.Waypoints.heightOffsetnumber5.0Height above ground for waypoint marker
Config.Waypoints.updateIntervalnumber0Render thread sleep time (0 = every frame)
Config.Waypoints.scaleMinnumber0.5Minimum scale at far distance
Config.Waypoints.scaleMaxnumber1.0Maximum scale at near distance
Config.Waypoints.scaleNearDistnumber30.0Distance at which maximum scale is used
Config.Waypoints.scaleFarDistnumber300.0Distance at which minimum scale is used

Enums

File: shared/init.lua

ShiftState

ValueConstantDescription
'idle'ShiftState.IDLENot on shift
'clocked_in'ShiftState.CLOCKED_INOn shift, ready for tasks
'loading'ShiftState.LOADINGLoading items into van
'delivering'ShiftState.DELIVERINGDelivering to addresses

TaskType

ValueConstantDescription
'packages'TaskType.PACKAGESPackage delivery task
'letters'TaskType.LETTERSLetter delivery task

Rate Limits

File: server/main.lua

Server-side rate limiting prevents action spam. Each action has a cooldown period in milliseconds:

ActionCooldown (ms)Description
completeDelivery5000Completing a delivery
loadBox2000Loading a box/bag into the van
clockIn2000Clocking in to a shift
clockOut2000Clocking out of a shift
crewInvite5000Sending a crew invite
respondToInvite2000Accepting/declining a crew invite
vehicleDestroyed10000Vehicle destruction event
grabPackage2000Grabbing a package from the van
palletSpawned5000Pallet spawn sync event
boxPickedUp1000Box pickup sync event
palletCleanedUp5000Pallet cleanup sync event
updateVehicle5000Vehicle network ID update