So i am creating a game called Number Quest Ultra which is a game about maths where you create lobbies/games to challenge people. I was testing today when i came across this weird series of problems which makes no sense
Creating a lobby, leaving it and creating another has some freaky behaviour.
The first creation of the lobby is perfectly normal, it creates the lobby, adds me to it and the UI only shows 1 player which is me
Leaving this lobby also works fine, returns to the select lobby screen and removes the lobby.
The second time round seems to have the funny behaviour, this time creating 2 of me on the players list when there should only be 1.
Leaving this does not close the lobby, but instead adds a player to it somehow.
Repeating this just leads to an increase in the player count
Server Side
local lobbies = {} local lobbyid = 0 local mapmodule = require(game.ReplicatedStorage.MapModule) local ds = game:GetService("DataStoreService"):GetDataStore("MapChoice") local ts = game:GetService("TeleportService") local lobbytemplate = { ["GameType"] = "", ["Owner"] = "", ["Map"] = "", ["LobbyID"] = 0, ["Players"] = {} } local function ReturnPlayers(owner,players) local newplayers = players table.insert(newplayers,owner) return newplayers end game.ReplicatedStorage.CreateGame.OnServerEvent:Connect(function(player,gametype,map) if mapmodule.Maps[map]["Type"] == gametype then if player.Data.Maps:FindFirstChild(map) then lobbyid = lobbyid + 1 local newlobby = lobbytemplate newlobby["Owner"] = player.Name newlobby["GameType"] = gametype newlobby["Map"] = map newlobby["LobbyID"] = lobbyid table.insert(lobbies,lobbyid,newlobby) game.ReplicatedStorage.UpdateGameList:FireAllClients(lobbies) game.ReplicatedStorage.UpdatePlayerList:FireClient(player,ReturnPlayers(newlobby["Owner"],newlobby["Players"])) game.ReplicatedStorage.NewLobbyID:FireClient(player,lobbyid) end end end) game.ReplicatedStorage.LeaveGame.OnServerEvent:Connect(function(player,lobbyid) for i,v in pairs(lobbies) do if v["LobbyID"] == lobbyid then if v["Owner"] == player.Name then for a,b in pairs(v["Players"]) do game.ReplicatedStorage.LobbyRemoval:FireClient(game.Players[b]) end table.remove(lobbies,i) game.ReplicatedStorage.UpdateGameList:FireAllClients(lobbies) else for a,b in pairs(v["Players"]) do if b == player.Name then table.remove(v["Players"],a) for c,d in pairs(v["Players"]) do game.ReplicatedStorage.UpdatePlayerList:FireClient(game.Players[d],ReturnPlayers(v["Owner"],v["Players"])) end game.ReplicatedStorage.UpdateGameList:FireAllClients(lobbies) end end end end end end) game.ReplicatedStorage.JoinGame.OnServerEvent:Connect(function(player,lobbyid) for i,v in pairs(lobbies) do if v["LobbyID"] == lobbyid then local maxplayers = 0 if v["GameType"] == "Normal" then maxplayers = 4 else maxplayers = 16 end if (#v["Players"]+1) < maxplayers then table.insert(v["Players"],player.Name) for c,d in pairs(v["Players"]) do game.ReplicatedStorage.UpdatePlayerList:FireClient(game.Players[d],ReturnPlayers(v["Owner"],v["Players"])) end game.ReplicatedStorage.UpdateGameList:FireAllClients(lobbies) end end end end) game.ReplicatedStorage.KickPlayer.OnServerEvent:Connect(function(player,lobbyid,kickplayer) for i,v in pairs(lobbies) do if v["LobbyID"] == lobbyid then if v["Owner"] == player.Name then for a,b in pairs(v["Players"]) do if b == kickplayer then table.remove(v["Players"],a) for c,d in pairs(v["Players"]) do game.ReplicatedStorage.UpdatePlayerList:FireClient(game.Players[d],ReturnPlayers(v["Owner"],v["Players"])) end game.ReplicatedStorage.UpdateGameList:FireAllClients(lobbies) end end end end end end) game.ReplicatedStorage.StartGame.OnServerEvent:Connect(function(player,lobbyid) for i,v in pairs(lobbies) do if v["LobbyID"] == lobbyid then if v["Owner"] == player.Name and #v["Players"] >= 1 then local players = {} table.insert(players,game.Players[v["Owner"]]) for a,b in pairs(v["Players"]) do table.insert(players,game.Players[b]) ds:SetAsync(game.Players[b].UserId,v["Map"]) end local placeidtp if v["GameType"] == "Normal" then placeidtp = 5185622956 else placeidtp = 5185623208 end table.remove(lobbies,i) game.ReplicatedStorage.UpdateGameList:FireAllClients(lobbies) local serverid = ts:ReserveServer(placeidtp) ts:TeleportToPrivateServer(placeidtp,serverid,players) end end end end) game.Players.PlayerRemoving:Connect(function(player) for i,v in pairs(lobbies) do if v["Owner"] == player.Name then for a,b in pairs(v["Players"]) do game.ReplicatedStorage.LobbyRemoval:FireClient(game.Players[b]) end table.remove(lobbies,i) game.ReplicatedStorage.UpdateGameList:FireAllClients(lobbies) else for a,b in pairs(v["Players"]) do if b == player.Name then table.remove(v["Players"],a) for c,d in pairs(v["Players"]) do game.ReplicatedStorage.UpdatePlayerList:FireClient(game.Players[d],ReturnPlayers(v["Owner"],v["Players"])) end game.ReplicatedStorage.UpdateGameList:FireAllClients(lobbies) end end end end end) game.ReplicatedStorage.BuyMap.OnServerEvent:Connect(function(player,map) if player.Data.Coins.Value >= mapmodule.Maps[map]["Cost"] then if player.Data.Maps:FindFirstChild(map) == nil then player.Data.Coins.Value = player.Data.Coins.Value - mapmodule.Maps[map]["Cost"] local newmap = Instance.new("Folder",player.Data.Maps) newmap.Name = map end end end) local function RequestLobbies() return lobbies end game.ReplicatedStorage.RequestLobbies.OnServerInvoke = RequestLobbies
Client Side Lobby UI Manager
local function UpdateList(listdata) for i,v in pairs(script.Parent:GetChildren()) do if v.ClassName == "Frame" then local isavaiable = false for a,b in pairs(listdata) do if b["LobbyID"] == v.ID.Value then isavaiable = true end end if isavaiable == false then v:Destroy() else for a,b in pairs(listdata) do if b["LobbyID"] == v.ID.Value then if b["GameType"] == "Normal" then v.Players.Text =(#b["Players"]+1).."/4 Players" else v.Players.Text =(#b["Players"]+1).."/16 Players" end end end end end end for i,v in pairs(listdata) do local isfound = false for a,b in pairs(script.Parent:GetChildren()) do if b.ClassName == "Frame" then if b.ID.Value == v["LobbyID"] then isfound = true end end end if isfound == false then local clone = game.ReplicatedStorage.LobbyFrame:Clone() clone.ID.Value = v["LobbyID"] clone.Owner.Value = v["Owner"] clone.OwnerText.Text = v["Owner"].."'s Game" clone.Map.Text = v["Map"] clone.Mode.Text = v["GameType"] if v["GameType"] == "Normal" then clone.Players.Text = (#v["Players"]+1).."/4 Players" else clone.Players.Text = (#v["Players"]+1).."/16 Players" end clone.Parent = script.Parent end end end UpdateList(game.ReplicatedStorage.RequestLobbies:InvokeServer()) game.ReplicatedStorage.UpdateGameList.OnClientEvent:Connect(function(lobbies) UpdateList(lobbies) end)
Client Side Player List Manager
local function UpdateList(playerlist) for i,v in pairs(script.Parent:GetChildren()) do if v.Name == "PlayerFrame" then v:Destroy() end end for i,v in pairs(playerlist) do local clone = game.ReplicatedStorage.PlayerFrame:Clone() clone.PlayerName.Text = v clone.Parent = script.Parent end end game.ReplicatedStorage.UpdatePlayerList.OnClientEvent:Connect(function(playerlist) UpdateList(playerlist) end)
I am truly confused and just can't understand why this happens