8-Ball Pool System

Hey everyone!

I recently made an 8 Ball Pool System

The system is made to be clean, customizable, and easy to set up. It includes 50+ configs inside PoolConfig, supports Mobile, Console, and PC, and lets you easily change the table model to any pool table or stick you want.

I’d really appreciate feedback on the gameplay feel, controls, setup, and anything that could be improved.

Solo test it here:

Can be purchased here:
https://create.roblox.com/store/asset/107916745555223

‎ ‎ ‎




--[[
    8-Ball Pool System
    Version 1.5
    Made By @TheRealxLucas
--]]

local PoolConfig = {}

PoolConfig.TableName = "PoolTable"
PoolConfig.TablesFolderName = "PoolTables"
PoolConfig.BallsFolderName = "Balls"
PoolConfig.PocketsFolderName = "Pockets"
PoolConfig.CueBallName = "CueBall"
PoolConfig.PlayingSurfaceName = "PlayingSurface"
PoolConfig.PoolStickName = "PoolStick"
PoolConfig.SoundsFolderName = "Sounds"

PoolConfig.MaxPlayers = 2 -- Max players per table, set to 1 for single player mode, set to 2 for multiplayer mode
PoolConfig.MinShootPower = 2
PoolConfig.MaxShootPower = 80
PoolConfig.PowerChargeSeconds = 1.65
PoolConfig.StopVelocity = 0.08
PoolConfig.StopAngularVelocity = 0.75
PoolConfig.StillTimeRequired = 0.75
PoolConfig.ShotCooldown = 0.45
PoolConfig.TurnShootSeconds = 35
PoolConfig.QueueCancelDistance = 99999 
PoolConfig.QueueCancelCheckSeconds = 0.25
PoolConfig.MaxShotSeconds = 14
PoolConfig.AllowBallColorFallback = true
PoolConfig.PreferBallVisualColor = true
PoolConfig.SimulationStep = 1 / 180
PoolConfig.MaxSimulationSteps = 8
PoolConfig.ShotSpeedScale = 0.28
PoolConfig.BallFriction = 2.35
PoolConfig.BallRestitution = 0.78
PoolConfig.BallVisualSpinScale = 1
PoolConfig.ClientBallInterpolationSpeed = 26
PoolConfig.ClientBallSnapDistance = 4.5
PoolConfig.RackBallGap = 0
PoolConfig.RackCenterFromFootRatio = 0.2
PoolConfig.CueStartFromHeadRatio = 0.2
PoolConfig.MaxPocketRadius = 1.15
PoolConfig.PocketRequiredBallOverlap = 0.51
PoolConfig.PocketCenterInsideRatio = 0.2
PoolConfig.CuePlacementPadding = 0.08
PoolConfig.RollingSoundStartVelocity = 0.22
PoolConfig.RollingSoundVolumeScale = 0.045
PoolConfig.RollingSoundMaxVolume = 0.35
PoolConfig.BallConnectSoundCooldown = 0.045
PoolConfig.BallConnectPitchMin = 0.94
PoolConfig.BallConnectPitchMax = 1.06
PoolConfig.BorderHitSoundCooldown = 0.08
PoolConfig.BorderHitSoundVolumeScale = 0.65
PoolConfig.PocketSoundVolumeScale = 1
PoolConfig.CueStickSoundVolumeScale = 1
PoolConfig.PocketSinkSeconds = 0.28
PoolConfig.PocketSinkScale = 0.12
PoolConfig.PocketSinkDrop = 1.2
PoolConfig.AimGuideLength = 13
PoolConfig.AimGuideRailPadding = 0.15
PoolConfig.AimGuideBallOverlap = 0.08
PoolConfig.MobileAimDragThreshold = 8
PoolConfig.GamepadAimDeadzone = 0.18
PoolConfig.GamepadAimTurnDegreesPerSecond = 150
PoolConfig.GamepadCuePlacementDeadzone = 0.18
PoolConfig.GamepadCuePlacementSpeed = 4.5
PoolConfig.ObjectGuideLength = 1.2
PoolConfig.ObjectGuideWidth = 0.08
PoolConfig.FinishResetSeconds = 5
PoolConfig.CameraHeightMultiplier = 0
PoolConfig.CameraMinHeight = 7
PoolConfig.RailHeight = 1.4
PoolConfig.RailThickness = 0.7
PoolConfig.BlackBallNames = { "Ball8", "8Ball", "BlackBall", "Black", "BlackBall8" }
PoolConfig.StickTipGap = 0.03
PoolConfig.StickHeightOffset = 0
PoolConfig.StickPullbackDistance = 1.6
PoolConfig.StickSinglePartTipSign = 1
PoolConfig.HiddenCoreGuiTypes = {
	Backpack = true,
	PlayerList = true,
	Chat = false,
	EmotesMenu = true,
	Health = true,
	SelfView = true,
	Captures = true,
	AvatarSwitcher = true,
}

PoolConfig.BallPhysicalProperties = PhysicalProperties.new(0.9, 0.22, 0.45, 1, 1)
PoolConfig.RailPhysicalProperties = PhysicalProperties.new(1, 0.12, 0.75, 1, 1)


-- Keep in mind many of these ain't being used
PoolConfig.UiText = {
	ExitButton = "EXIT",
	ShootButton = "SHOOT",
	PlaceBallButton = "PLACE BALL",

	JoinPromptLeave = "Leave {playerCount}/{maxPlayers}",
	JoinPromptJoin = "Join {playerCount}/{maxPlayers}",
	JoinPromptObject = "Pool Table",

	BallsMoving = "",
	BallInHandMouse = "Ball in hand - click the table",
	BallInHandTouch = "Ball in hand - move it, then press PLACE BALL",
	BallInHandGamepad = "Ball in hand - left stick move, X to place",
	OpponentPlacingCue = "Opponent is placing the cue ball",
	YourTurn = "Your turn",
	PlayerTurn = "{playerName} turn",
	UnknownPlayer = "Player",
	YouWin = "You win",
	GameOver = "Game over",
	GameOverSentence = "Game over.",
	BlackBallPocketed = "Black ball pocketed.",
	ResettingTable = "Resetting table...",
	WaitingForPrompt = "Use the table prompt to join",

	ServerWaitingForPrompt = "Use the table prompt to join.",
	PlayerLeftQueue = "{playerName} left the queue.",
	PlayerExitedEndingGame = "{playerName} has exited, ending game..",
	PlayerExited = "{playerName} has exited.",
	PlayerJoinedAnotherTable = "{playerName} joined another table.",
	GameStartedOpen = "Game started. Table is open.",
	PlayerJoinedTable = "{playerName} joined the table.",
	PlayerWalkedTooFar = "{playerName} walked too far from the table.",
	TimedOut = "{playerName} ran out of time.",
	TimedOutPlacement = "{timeoutMessage} {playerName} can place the cue ball.",
	TimedOutTurn = "{timeoutMessage} Turn: {playerName}",
	NextPlayer = "next player",
	ScratchPocketed = "Scratch. Turn passes after the balls stop.",
	BallPocketedOpen = "{ballColor} pocketed. Table is open until the shot settles.",
	NiceShotRemaining = "Nice shot. {ballColor} has {remaining} left.",
	BallPocketed = "{ballColor} pocketed.",
	BlackBallWaitingForCue = "Black ball pocketed. Waiting for the cue ball.",
	BlackAndCuePocketed = "Black and cue ball pocketed. {result}",
	BlackBallPocketedResult = "Black ball pocketed. {result}",
	PlayerWins = "{playerName} wins.",
	ShooterLoses = "Shooter loses.",
	ScratchBallInHand = "Scratch. Ball in hand.",
	NoBallHitBallInHand = "No ball hit. Ball in hand.",
	WrongBallFirstBallInHand = "Wrong ball first. Ball in hand.",
	AssignedGroup = "{playerName} is {groupName}.",
	Shooter = "Shooter",
	PlaceCue = "{reason} {playerName} can place the cue ball.",
	Turn = "Turn: {playerName}",
	PlayerShot = "{playerName} shot.",
	ShotSettled = "Shot settled.",
}

return PoolConfig


Check out my other systems:
https://create.roblox.com/store/asset/100889120118472 - Darts
https://create.roblox.com/store/asset/128934894745450 - Fow In A Row

6 Likes

its nice, i reworked my version with:

custom proximty prompt for joining
30 second timer if a player doesnt play
new image buttons, tweens + sounds
multi table support

2 Likes

and please get rid of the huge ai generated picture, just use figma or something :sob:

2 Likes

Nicee I’ll be doing those changes too, also i think sounds are global at the moment so are fixing those too, to be local for those who are playing, you should too if you plan to have them in your voice hangout games.

1 Like

Added these features:

  • Added a 35-second timer for each player
  • Sound only for people who are playing.
  • Multiple tables support

Version 1.1

2 Likes

I just purchased it this and I’m loving it. It’s very smooth. I did modify the prompts however to make the player leave the queue if they try to join another queue (you can join on all the tables at once if you have multiple) and also auto cancel if they walk too far away, so maybe this would be a nice thing to add natively. I would definitely recommend this to other creators. Also one of the ball sockets has a missing catch part.

Edit: Ball in hand does not work on Console. Tested on PS5 with controller It is also frustrating to aim the cue on Console.

1 Like

This 8-Ball Pool system is excellent! Awesome job on it! I rate it 10/10! How long did it take to make this for you?

1 Like

Thanks for the feedback, I’ll do those updates too! and improve and fix it on console as well

1 Like

Version 1.2
Added & Fixed these features:

  • Table queue cancel based on distance config
  • Auto leaves table queue if player joins another
  • Fixed ball in hand console
  • Improved movement on console
  • All game messages can now easily be edited in config
  • Fixed missing pocket
1 Like

Version 1.3

  • Made cue ball local for opponent so feels more smooth for both
  • Made Stick local for opponent so feels more smooth for both
  • Added Solo Value if active that table is a solo table
1 Like

Appreciate the updates. The last one is especially helpful.

1 Like

Made this Four In A Row System if anyone is interested:

1 Like

Version 1.4

  • Fixed exit breaks on reset and death while playing

Version 1.5

  • Added configurable CoreGui toggles

Check out my new system Darts:
https://create.roblox.com/store/asset/100889120118472