Skip to content

Delivery & robberies

  • mailbox: the item or money is left in the mailbox.
  • meetup: pickup at a defined point.
  • npc: delivery by an NPC at an extra cost.
  • person: in-person meeting between buyer and seller.

Config.DeliveryBuyerFee defines the extra the buyer pays depending on the chosen mode:

  • mailbox: 0
  • meetup: 100
  • npc: 0
  • person: 300

Config.MeetupPoints defines the fixed pickup points on the map.

Config.Gameplay.NPCDelivery controls:

  • extra cost
  • whether it can be intercepted
  • minimum value to be robbable
  • insurance cost
  • insurance payout
  • vehicle speed
  • delivery timeout
  • blip visibility
  • ped and vehicle models
  • the courier’s prop
  • robbery attempts per player and van (ExtractionAttempts)
  • minimum time the server validates (ExtractionMinSeconds)
  • the thief’s animation while forcing the trunk (ExtractionAnim)

An interceptable delivery can be robbed through the trunk, and to get there the courier must first be taken out of play: hold them at gunpoint -they surrender on their own, at IntimidationDistance- or kill them.

A courier who is being held stops delivering. The buyer cannot collect their order while the driver is held at gunpoint, not even if the buyer is the one holding them: the package is in the trunk and has to be taken out from there.

Forcing the trunk is the Config.SkillCheck minigame (section 9.4.2). It is interrupted if the thief moves more than 3.5 metres away, shoots, runs or takes damage. Failing the minigame uses up one of the attempts; getting shot or the van driving off does not. Once all attempts are used, that trunk no longer opens for that player, but it is still available to anyone else.

If the thief is the buyer themselves, forcing the trunk counts as an early delivery and the seller is paid anyway. If it is a third party, it is a robbery and the seller is only paid if there was insurance.

Who can rob it. Any player can, as long as the delivery is interceptable (Interceptable = true and the order is worth at least MinValueForIntercept). There is no blip for thieves by default: they have to find the van in the world. If NotifyJob is set to a job name (for example 'robber'), players with that job get a notification and a flashing blip at the van’s starting point when an interceptable delivery begins.

What each party gets:

Case Thief Buyer Seller
Robbed by a third party Gets the package Loses the order (no refund) and is told who took it Paid InsurancePayout (80 %) only if the buyer bought insurance
Robbed by the buyer — Receives the order (early delivery) Paid normally
Van destroyed or timed out (DeliveryTimeout) — Full refund to the mailbox Paid the insurance if the van was destroyed and insured
Buyer disconnected — Order sent to the nearest pickup point Paid the insurance if insured

Police and integrations. Config.OnDeliveryRobbed(thiefSrc, deliveryId, value, trigger) in config.lua and Handlers.OnDeliveryRobbed in server/handlers.lua fire once per robbery (trigger is 'driver_killed' or 'cargo_stolen'), ready for a dispatch alert. On the client, sl-marketplace:onDeliveryRobbed and the three skill-check events are available in client/handlers.lua.

Security. The server validates the vehicle and ped models, the distance, the minimum time of the robbery (ExtractionMinSeconds), a one-time token per attempt and the rate limit deliveryRobbery. A modified client cannot rob a van from a distance or skip the minigame.

Config.SkillCheck defines the ring that appears when forcing the trunk: it goes round once with a segment painted on the edge, and you have to press the key when the tip passes over that segment.

  • Phases — the phases, in order. duracion is the lap in milliseconds and arco how wide the segment is, in degrees out of 360. Widening the segment or lengthening the lap make it easier; the segment has the stronger effect of the two.
  • Keys — where the keys come from, shuffled every game. control is the GTA control id, since the game does not understand letters. They are disabled while the minigame runs so that hitting a phase does not also open a door.
  • ZoneMin / ZoneMax — where the segment can land, in degrees. Never at the start: at 5 degrees there would be no time to see it and it would be a coin toss.
  • LockMovement — pins the player’s feet in place while it lasts. The camera is not touched. Enabled by default: the ring is fixed on the trunk, so walking takes it out of frame.
  • Sounds — the four sounds: phase start, hit, miss and clearing the whole thing. false turns them off.
  • LatencyMs — the offset between the clock that decides whether you hit (the game) and the one that draws the ring (the browser). Raise it if hits are registered too early.

The minigame knows nothing about robberies: it is generic, and whoever launches it says what each game is about. The three events it emits are in client/handlers.lua.

Config.InPersonTrade controls:

  • proximity distance to start the trade
  • valid radius of the point
  • timeout
  • whether a custom location is allowed
  • cancellation if either player moves too far away