Going live Oct 1Follow us on YouTube for the beta testBeta test on YouTube

Golf Club

All nine holes of the city’s golf course, playable as stroke play, with real ball flight, automatic lies and putting that breaks off the actual terrain.

v1.0.1Qbox / QBCore$14.99Store page

The full nine at the city’s golf course. Stroke play on the game’s own tee and pin coordinates, with real aerodynamic ball flight, lies and hazards read from the world, and slope-aware putting.

Sibling of rr-golf, which is a driving range: one tee, hit balls at the ocean, score on distance. This is the actual game.


The two things to read before you change a number

1. The scorecard yardage is not the world distance

The game map is compressed. Measuring every hole tee to pin against its posted yardage gives a near-constant ratio:

hole123456789
ratio2.032.032.192.162.042.022.052.032.04

Seven of nine sit at 2.02 to 2.05, so Config.Course.yardScale = 2.04 displayed yards per world metre. Holes 3 and 4 read a little short of their signage; the posted figure is kept per hole as signYards for flavour, but the game uses the measured one everywhere, because club selection has to agree with the distance readout or it is unplayable.

The consequence: rr-golf's clubs are tuned to real yards, where a driver carries 249 yd / 228 m. Dropped in here unchanged, a driver covers 228 of hole one's 261 world metres and a 531-yard par 5 falls to one swing and a chip.

2. Club speeds were solved, not typed

speed and launch in Config.Clubs were solved numerically against this resource's own flight model so that each club's carry reads its yards value at that scale, and its apex-to-carry ratio matches a real trajectory of that loft. Solving both together matters: scaling speed alone gives a driver a 10 m apex, which is a line drive that will not clear terrain.

Change yards and re-run the calibration. Do not nudge speed by hand.

Never scale Config.Flight.dragK or liftK. They are the real 0.5*rho*C*A/m for a 45.9 g ball and they are what make the wind, the slice and the apex behave. Distance is tuned with club speed.


Where the course data came from

Not surveyed by hand. Every tee and pin is lifted verbatim from the game’s own golf.ysc, decompiled build 3095 (Aure7138/GTAV-Decompiled-Scripts-1, decompiled_scripts/golf.c, branch master):

sourcewhat it is
func_560(hole)the TEE, golf.c:93711
func_550(hole)the CUP / PIN, golf.c:93608
func_731(hole)teeing-ground radius in metres, golf.c:98859

The roles were confirmed at the call sites rather than assumed. The game streams a corridor from func_559 to func_550 (golf.c:99797), reads VDIST(ball, func_550) as its distance-to-hole (golf.c:101826), and walks you to func_559(h+1) after you hole out (golf.c:99274).

Tee headings are derived, not measured: the bearing tee to pin, GTA convention. Exact on a straight hole. A dogleg wants its aim set at the corner instead, which is an eyeball value, so it lives in the editor.

The posted nine sum to 3463 yards, not the 3,464 the GTA wiki prints.


Lies and hazards, without placing a single volume

There are no hand-authored bunker or water shapes anywhere in this resource. Placing them across nine holes is a day of work that goes stale the moment anybody edits the map. Instead:

liehow it is found
waterthe water probe answers above the terrain
bunkerthe ground material under the ball is sand
greeninside greenRadius of the pin
fairwaywithin fairwayWidth of the tee-to-pin centre line
rougheverything else

The fairway test is an approximation and is meant to be. It costs nothing to place, never goes stale, and plays correctly: miss the line, get a worse lie. Each lie has its own strike penalty, spray, bounce and run-out, so a green holds a shot, a fairway runs it on and a bunker kills it dead.


Playing

Walk to the clubhouse marker at -1370.369, 55.880, 52.706 and press E. Pick 3, 6 or 9 holes and pay the green fee. The controls card comes up for eleven seconds on the first tee, and H brings it back any time.

keydoes
SPACEthe three-click swing: start, power, strike
A / Daim
scrollchange club
Zscorecard
Hshow the controls again
BACKSPACEround menu — scorecard, controls, leave
ESCskip the hole flyover

A putt is two clicks, not three: start, then pace. There is no face angle on a putter, which is why a putt never curves. What it does do is break, read from the real terrain normal along the line and weighted toward the cup, because the ball is slowest there and late slope bends a putt far more than early slope.

Water costs a stroke and drops you back at the last dry ground. Out of bounds is stroke and distance. You are picked up at Config.Penalties.maxStrokes so nobody is stuck on a hole forever.


/golfcourseedit

One panel for every value in this resource you can only judge by looking: green radius, fairway width, tee, pin, dogleg, the golfer's stance and the grip.

Arrows move and adjust, SHIFT is x10, E performs an action row, Q poses the golfer at the current tee, ENTER saves, BACKSPACE closes.

This exists because the last golf build shipped guesses and paid for it: three consecutive wrong answers off screenshots, each costing a full round trip, before an editor ended it in one pass.

Saving does not close the editor. The server echoes the cleaned values back and the preview continues from those, so what is on screen after ENTER is what is in the file.

Saving writes settings.json in the resource folder, ace-gated on Config.EditorAce, every value sanitised. settings.json overrides config.lua — read it before believing the config.

Angles wrap, distances clamp. rr-golf once lost a perfectly lined-up stance to a sanitiser that clamped 361 down to 360.


Install

  1. Drop in resources/[custom]/rr-golfcourse/.
  2. ensure rr-golfcourse after ox_lib and oxmysql.
  3. Tables are created on first boot. sql/install.sql is there if you would rather import them by hand.
  4. Give yourself command.golfcourseedit to use the editor, and set Config.AllowEditor = false on a live server.

Requires ox_lib and oxmysql.


Seeing other players' shots

Everyone plays their own round at their own pace, and any number of people can be out on the course at once. Round state is per player on the server and cleared when they drop, so two people on the same hole never interfere.

The ball is a local object on the hitter's client, which is deliberate: a networked prop per ball would be entity churn across nine holes, and two players on the same tee would fight over ownership. The cost is that without help you would watch somebody swing and see nothing leave the tee.

So shots are re-simulated rather than streamed. The flight model is deterministic, so the hitter broadcasts the numbers that define the arc once, and every client within 320 m runs the same integrator locally and draws the ball with that player's name over it. Two messages per shot instead of thirty position updates.

The payload carries the lie the shot was played from, because lie scales ball speed and a watcher defaulting to fairway would fly a rough shot further than it actually went. The hitter also sends the true resting spot when the ball stops, because bounce depends on a surface each client probes for itself.

Not done yet

  • Group rounds. Everyone plays their own card. There is no turn order, no shared scorecard and no waiting on the away ball.
  • Match play and skins. Stroke play only.
  • Green radii are estimates. They ship as 12 to 14 m and have not been checked against the actual putting surfaces. Walk each one in the editor.
  • Doglegs are unset. Every hole currently aims at the pin off the tee.
  • A golf cart. You fade to your ball instead; turn it off with Config.Travel.autoMove.

Last updated 2026-09-27