Ten-Pin Bowling
Ten-pin bowling with a real physics ball — GTA's own physics knocks the pins, with full ten-frame scoring, server-booked lanes, and live spectators. Zero streamed assets: drop it into any bowling-alley MLO.
Ten-pin bowling with a real physics ball for any bowling-alley MLO. No streamed assets — the ball and pins are base-game props (prop_bowling_ball, prop_bowling_pin) and GTA's own physics knocks the pins, so it drops into any server with zero extra streaming weight.
- Frameworks: Qbox (qbx_core) and QBCore, auto-detected.
ox_librequired. - Open files:
config.lua,html/and this README ship unencrypted so you can re-coordinate, re-price, restyle and translate freely. - Works with any alley: every position is config — lanes (head pin + throw spot pairs), ball racks, front desk. Defaults target a Vinewood mansion alley; point them at Gabz/Denis3D or any other bowling MLO.
How to play
- Front desk (green marker,
-2236.0, 474.04): press E, pick a free lane. Free by default (Config.GameFee). - Ball rack (yellow marker): press E to grab your ball — once per game; it comes back to you automatically after every throw.
- Your lane (teal marker): press E to step up.
- A / D — aim (blue dot on the deck shows where you're pointed)
- SPACE — hold to charge the power meter, release to throw
- BACKSPACE — step away without throwing
- Full ten-frame scoring with strikes, spares and the three-ball tenth frame.
/leavebowlingquits early; walking out of the alley also ends the game.
Multiplayer
The server books lanes (no double-booking, auto-freed on disconnect) and relays every throw, so nearby players watch your ball and pins live on their own clients. The bowler's client is authoritative for the pin count.
First-run calibration
The head pin sits exactly on each lane's measured pins coordinate; the rack triangle extends away from the thrower along the throw-spot -> head-pin line. Only the pin gap and height should ever need touching:
/bowlcal -- toggles green dots at every computed pin spot
/bowlcal spacing 0.28 -- pin-to-pin gap
/bowlcal z 0.05 -- raise/lower the rack
Values apply live; the console prints a line to paste back into config.lua. Set Config.AllowCalibration = false once dialled in.
Difficulty tuning
Strikes are earned twice over: release the power meter inside the green sweet spot AND time the swaying aim dot over the pocket — both run on different cycles. Config.Throw.sweetSpot / maxError / swayWidth / swayPeriod set the challenge; Config.Pins.mass / maxFlySpeed control how violently pins scatter (/bowlcal mass|fly to tune live).
Notes
- Only the active lane's pins are ever unfrozen, so a gutter ball wandering sideways can't disturb the neighbouring lane's rack.
- Nearby players watch throws live (relayed origin/velocity, local physics); the bowler's client is authoritative for the count.
