Match - Customizable Matchmaking Module

Match

Roblox matchmaking module. Full documentation is available in the README.

Features:

  • Supports multiple game modes and submodes.
  • Fully configurable matchmaking rules, ELO ranges, batching, and teleport retries.
  • Handles both individual and bulk player queueing.

GitHub

Basic Usage:

local Match = require(path.to.Match)

-- // Start matchmaking loops
Match:StartMatchmaking()

-- // Queue a player with an optional ELO parameter (Player, Mode, SubMode, ELO?)
Match:QueuePlayer(player, "Ranked", "1v1", 1200)

-- // Bulk queue multiple players (all in the same mode/submode, optional shared ELO)
Match:QueuePlayer({player1, player2, player3}, "Ranked", "2v2", 1300)

-- // Stop the queue of a player
Match:StopQueue(player)

-- // Bulk stop the queue of multiple players
Match:StopQueue({player1, player2, player3})

-- // Stop matchmaking loops
Match:StopMatchmaking()
22 Likes
  • QueueManager.generatePlayerQueueData writes JoinTime in ms but MatchmakingEngine:IsGroupValid does seconds math. so waitTime just goes “0 lol” and the ELO spread never opens up.
  • MatchmakingEngine:FindOptimalPlayerGroup never sorts playersInContinent before FindBestGroup. FindBestGroup assumes sorted ELO cuz it peeks at first/last values. spread math is totally bogus per continent.
  • QueueManager:GetQueuedPlayers just raw JSONDecode(entry.value) no pcall lol one bad entry nukes the loop.
  • same for GetPlayerJoinTime no pcall, no survivors.
  • MatchmakingEngine:LockAllPlayers overwrites existing locks like “yeah whatever”. stolen locks everywhere.
  • ProcessPlayerRemoval adds to playersByServer even when RemoveAsync fails. so yeah you’re teleporting ghosts now.
  • CreateCrossServerMatch deletes from queue before telling servers. if NotifyServersOfMatch dies, gg players just vanish.
  • HandleTeleportRequest thinks pcall = everyone made it. some didn’t. they’re still locked. rip.
  • RequestCrossServerMatchmaking fires on every matchmaking tick. plus the loop. messaging service getting absolutely hammered no cooldown in sight.
  • StopQueue splits queueKey with (.+)_(.+) like that’s safe. underscore in mode? lmao enjoy deleting the wrong queue.
  • QueueManager:Cleanup clears cache but not localQueueCounts. congrats on your immortal stale counts.
  • RunHeartbeat checks tick() every frame. unnecessary cardio.
  • _lockMap exists but no one calls it. ghost data, dead vibes.
  • mixed ms and sec times all over. sorting kinda works but time math is straight chaos.
  • message payload casing all over the place Mode, SubMode, PLACE_ID, camelCase pick a side lmao
  • FindBestGroup hard caps at 50 iterations. massive queues? lol guess half of them never get a look.
  • UpdateLocalQueueCount just believes whatever ServerId says even if it’s ancient. local counts drift into the abyss.
  • QueuePlayer writes keys before SetAsync, if that fails it cleans half the mess and leaves empty tables. messy leaks.
  • SendQueueStatus hides players if they’re offline. stealth queues. ghost town lookin clean tho.
  • NotifyServersOfMatch fails? just unlocks. no restore. players gone forever. shrug.
  • MatchMake sets _data.isProcessingMatch[queueKey] = false after the pcall but if anything explodes earlier, that flag stays true till the heat death of the server.
  • GetQueuedPlayers and CollectPlayers only grab first batchSize entries. the rest? lol invisible. matchmaking just pretending they don’t exist.

You should find better humans to analyze this!

2 Likes

Thanks, i’ll take a look when I get the time. Although some of these look wrong or just nitpicks

e.x. “message payload casing all over the place Mode, SubMode, PLACE_ID, camelCase pick a side lmao”; I use different naming for the data they hold.

e.x. “GetQueuedPlayers and CollectPlayers only grab first batchSize entries. the rest? lol invisible. matchmaking just pretending they don’t exist.”. Not really a bug, just how the batching works, i’ll probably change this to a setting.

2 Likes

V.2.2.3

  • Bugfixes and Cleanup
  • More settings to handle specific settings
  • More safeguards
1 Like

V.2.2.5

  • Major Cleanup, fixed all type related issues
1 Like

Hi, is there an editable testing place? Thanks

1 Like

Yes, I created a .rbxl a while back with some testing UI (Code for the UI is pretty messy, wouldn’t recommend using it in a actual game).

Match.rbxl (113.1 KB)

2 Likes

Hey! Is this all working? I saw some listed inconsistencies at the top, are they all cleared?

1 Like

I am testing out the .rbxl at the bottom of the post and do not see it totally working

timer keep going… tried casual and ranked… it anyone has it working please let me know so I can check out your .rbxl , thanks!

1 Like

Oh off the top of my head, memory store service doesn’t work in Studio. Try publish it and see if it works

1 Like

I should have added that I published the place, turned on API, and HTPP… in security… so those were on…

I did not modify any of the code, if I need to add a teleport place ID… but I would have thought it would have errored out if I did not do that…and or the timer would have stop when if it tried to teleport

1 Like

Yes, I fixed some of them although most weren’t issues.

Github: GitHub - g0ofycat/Match: An ELO Based, easy to use, customizable matchmaking system for Roblox games.

It might not work due to the rbxm being a older version

RBXL:
Match.rbxl (115.8 KB)

@Lord_BradyRocks Let me know if this works

Video of the newer version: Watch 2025-11-10 06-22-04 | Streamable

1 Like

excellent thanks! I am working on getting Rojo working on it and the Rojo plug in and will get back to you.

Also using the paid ChatGPT to assist with understanding the codes, initially it was says some remoteevents were missing, but I will see what is in the new one.

also in the video I see

what are the chat commands doing?

2 Likes

The chat commands are built into roblox

1 Like

Hello, @MasterPotBoi. I’ve used your module in the test place (rbxl), and I really like it! I believe it’s beneficial, and I plan to incorporate it into my game. However, I have a few suggestions.

Firstly, could you add a “FinishMatchmaking” function? For example, when a match is found during the search, the module should call “FinishMatchmaking”. This would allow me to connect to FinishMatchmaking via event or whatever and inform the players that they are being teleported.

Secondly, I think utilizing a signal or network library would be beneficial. It’s much more useful and optimized. Thank you!

1 Like

:+1:, i’ll most likely add something similar like that in the next update. Thanks for the suggestion!

1 Like

V.3.3.9: Added minimal Signal module, added callback when players are matchmaked

Example:

Match:OnMatchmake(function(matched_players)
	print("Matchmaking complete!")

	print(matched_players) -- // { Types.ParsedPlayerData }
end)
1 Like

@MasterPotBoi, if I were to create a party system that allows players to invite others, would you run the function Match:QueuePlayer({player1, player2, player3}, selectedHostRankName, selectedHostModeName, selectedHostRankName == "Ranked" and 1300 or 0) when you press “Start,” or when a player accepts an invitation?

Additionally, I have another idea. We could use PartyId = Match:GetID({player1, player2, player3}), followed by Match:StartParty(PartyId).

1 Like

Theres a party system already built in if you mean it like that, documentation is in the README

1 Like

I completely missed it before.

2 Likes