Hey so I was making a game where you´ll be needing parties to join a game but I don´t really understand because I´m not a scripter so I hope someone could help me
The thing I was trying to make is similar to the one from black hawk rescue mission it has a party inviter now I wanna make that but I don´t know how there should a party leader and 3 other players and need to have an invite button and they need to teleport to a game or private game is what I´ve read so if anyone could help me thanks…
local TS = game:GetService("TeleportService")
local Players = game:GetService("Players")
local code = TS:ReserveServer(game.PlaceId) -- Returns a code
local players = Players:GetPlayers() -- Get a list of all players
TS:TeleportToPrivateServer(game.PlaceId,code,players) -- Actually teleport the players
-- You could add extra arguments to this function: spawnName, teleportData and customLoadingScreen
Sorry, I was asleep when you sent that then I was at work all day. You can party players either by having them all stand in a designated area, or you can create a UI and have them click on players names to invite them to their party (Which would be stored in a table on the server) and then teleport all of them when the party leader decides to teleport them.
Like @MrLonely1221 said, you could do many things. This is called matchmaking and my goodness is this a thread that has been posted about a ton.
Please avoid posting a post if the post already exists. This is an ongoing issue on the Developer Forums.
To help with your situation however, you can have a party leader where people would get invited to it. Create all their stuff in a folder, and then teleport them when the countdown ends ( party full ) or when everyone is ready.
So, here is some help I created in about an hour.
--Client
--//Services
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
--//Variables
local Player = Players.LocalPlayer
local Assets = ReplicatedStorage:WaitForChild("Assets")
local Remotes = ReplicatedStorage:WaitForChild("Remotes")
local Parties = Assets:WaitForChild("Parties")
local MyParty = Parties:WaitForChild(Player.UserId.."'s party")
local Events = Remotes.Events
local Functions = Remotes.Functions
local UI = Assets.UI
local GUI = script.Parent
local Main = GUI:WaitForChild("Main")
local Invite = Main.Invite
local InviteCoolDown = false
--//Functions
local function CheckForPlayersYouMissed()
for i,player in pairs(Players:GetPlayers()) do
if Invite:FindFirstChild(player.UserId) == nil and player ~= Player then
local Template = UI.InviteTemplate:Clone()
Template.Parent = Invite
Template.Name = player.UserId
Template.Text = player.Name
Template.MouseButton1Click:Connect(function()
if not InviteCoolDown then
InviteCoolDown = not InviteCoolDown
Events:FireServer("Invite",{tonumber(Template.Name)}) -- tell the server they want to invite the player
wait(4)
InviteCoolDown = not InviteCoolDown
end
end)
end
end
end
local function FindInTable(index,tbl)
for i,v in pairs(tbl) do
if i == index then
return v
end
end
end
--//Events
Players.PlayerAdded:Connect(function(player)
if Invite:FindFirstChild(player.UserId) == nil and player ~= Player then
local Template = UI.InviteTemplate:Clone()
Template.Parent = Invite
Template.Name = player.UserId
Template.Text = player.Name
Template.MouseButton1Click:Connect(function()
if not InviteCoolDown then
InviteCoolDown = not InviteCoolDown
Events:FireServer("Invite",{tonumber(Template.Name)}) -- tell the server they want to invite the player
wait(4)
InviteCoolDown = not InviteCoolDown
end
end)
end
end)
Players.PlayerRemoving:Connect(function(player)
if Invite:FindFirstChild(player.UserId) ~= nil and player ~= Player then
Invite:FindFirstChild(player.UserId):Destroy() -- remove their stuff since they left
end
end)
Functions.OnClientInvoke = function(Command,ArgumentTable)
end
Events.OnClientEvent:Connect(function(Command,ArgumentTable)
if Command == "AddPlayerToMM" then
local AddPlayer = ArgumentTable.Player
local PartyPlace = ArgumentTable.PartyPlace
Main.Party:FindFirstChild("Player"..PartyPlace).Player.Text = AddPlayer.Name
Main.Party:FindFirstChild("Player"..PartyPlace).Icon.Image = "https://www.roblox.com/bust-thumbnail/image?userId="..AddPlayer.UserId.."&width=420&height=420&format=png"
if AddPlayer == Player then
if PartyPlace == 1 then
Main.Ready.Visible = true
else
Main.Ready.Visible = false
if Main.Party.Player1.Player.Text == Player.Name then
Main.Ready.Visible = true
end
end
end
elseif Command == "ENDPARTY" then
for i,v in pairs(Main.Party:GetChildren()) do
if v.Name ~= "Player1" then
v.Icon.Image = "rbxasset://textures/ui/GuiImagePlaceholder.png"
v.Player.Text = "PlayerName"
else
v.Player.Text = Player.Name
v.Icon.Image = "https://www.roblox.com/bust-thumbnail/image?userId="..Player.UserId.."&width=420&height=420&format=png"
end
end
Main.Ready.Visible = true
Main.BadNews.Visible = true
wait(string.len(Main.BadNews.Text)/20)
Main.BadNews.Visible = false
elseif Command == "Invited" then
local PlayerFrom = ArgumentTable.From
Main.Invited.Visible = true
Main.Invited.Message.Text = PlayerFrom.Name.." has invited you to a party, would you like to join?"
Main.Invited.Yes.MouseButton1Click:Connect(function()
Main.Invited.Visible = false
Events:FireServer("AcceptInvite",{From = PlayerFrom,Key = ArgumentTable.InviteID})
end)
Main.Invited.No.MouseButton1Click:Connect(function()
Main.Invited.Visible = false
Events:FireServer("DeclineInvite",{From = PlayerFrom,Key = ArgumentTable.InviteID})
end)
elseif Command == "AddAllToNewParty" then
local PlayersTable = ArgumentTable.Players
for i,v in pairs(Main.Party:GetChildren()) do
local Find = FindInTable(i,PlayersTable)
if Find ~= nil then
if Players:GetPlayerByUserId(tonumber(Find)) == Player then
if i == 1 then
Main.Ready.Visible = true
else
Main.Ready.Visible = false
end
end
end
if Find ~= nil then
v.Player.Text = Players:GetPlayerByUserId(tonumber(Find)).Name
v.Icon.Image = "https://www.roblox.com/bust-thumbnail/image?userId="..Find.."&width=420&height=420&format=png"
else
v.Icon.Image = "rbxasset://textures/ui/GuiImagePlaceholder.png"
v.Player.Text = "PlayerName"
end
end
end
end)
Main.Ready.MouseButton1Click:Connect(function()
Events:FireServer("Ready")
end)
--//Main
Main.Ready.Visible = true
CheckForPlayersYouMissed()
if MyParty ~= nil then
if tonumber(MyParty.Party["1"].Value) == Player.UserId then
Main.Party.Player1.Player.Text = Player.Name
Main.Party.Player1.Icon.Image = "https://www.roblox.com/bust-thumbnail/image?userId="..Player.UserId.."&width=420&height=420&format=png"
end
end
local CheckIfServerIsReserved = Functions:InvokeServer("IsReserved?")
if CheckIfServerIsReserved then
Main.Visible = false
end
--Server
--//Services
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local TeleportService = game:GetService("TeleportService")
--//Variables
local Assets = ReplicatedStorage:WaitForChild("Assets")
local Remotes = ReplicatedStorage:WaitForChild("Remotes")
local Events = Remotes.Events
local Functions = Remotes.Functions
local Parties = Assets.Parties
local AvailableStrings = {"A","a","B","b","C","c","D","d","E","e","F","f","G","g","H","h","I","i","J","j","K","k","L","l","M","m","N","n","O",
"o","P","p","Q","q","R","r","S","s","T","t","U","u","V","v","W","w","X","x","Y","y","Z","z"}
local InviteQueue = {}
--//Functions
function FindAvailableSpot(player,joiner)
local Done = false
local Found = nil
if Parties:FindFirstChild(player.."'s party") ~= nil then
for i,v in pairs(Parties:FindFirstChild(player.."'s party").Party:GetChildren()) do
if v.Value == "None" and not Done then
Done = true
Found = i
end
if i == #Parties:FindFirstChild(player.."'s party").Party:GetChildren() and not Done then
Done = true
return "FULL"
elseif i == #Parties:FindFirstChild(player.."'s party").Party:GetChildren() and Done then
return Found
end
end
end
end
local function RandomKeyMaker()
local KeyTable = ""
for i,v in pairs(AvailableStrings) do
local Hello = math.random(1,2)
if Hello == 1 then
local RandomizedString = AvailableStrings[math.random(1,#AvailableStrings)]
KeyTable = KeyTable..RandomizedString
elseif Hello == 2 then
local RandomizedNumeral = math.random(1,100)
KeyTable = KeyTable..RandomizedNumeral
end
if i == #AvailableStrings then
return KeyTable
end
end
end
local function ClearOriginalParty(player)
if Parties:FindFirstChild(player.UserId.."'s party") ~= nil then
Parties:FindFirstChild(player.UserId.."'s party").Party["1"].Value = "None"
for i,v in pairs(Parties:FindFirstChild(player.UserId.."'s party").Party:GetChildren()) do
if v.Value ~= "None" then
local Player = Players:GetPlayerByUserId(tonumber(v.Value))
if Player ~= nil then
Events:FireClient(Player,"ENDPARTY")
if Parties:FindFirstChild(Player.UserId.."'s party") ~= nil then
if Parties:FindFirstChild(Player.UserId.."'s party").Party["1"].Value == "None" then
Parties:FindFirstChild(Player.UserId.."'s party").Party["1"].Value = Player.UserId
end
end
end
end
end
end
end
local function LocatePlayer(player)
local Done = false
for i,v in pairs(Parties:GetChildren()) do
for _,Obj in pairs(v.Party:GetChildren()) do
if tonumber(Obj.Value) == player.UserId and not Done then
Done = true
return Obj
end
end
end
end
--//Events
--player added
Players.PlayerAdded:Connect(function(player)
if Parties:FindFirstChild(player.UserId.."'s party") == nil then
local PartyFolder = Instance.new("Folder")
PartyFolder.Parent = Parties
PartyFolder.Name = player.UserId.."'s party"
local AttendeesFolder = Instance.new("Folder")
AttendeesFolder.Parent = PartyFolder
AttendeesFolder.Name = "Party"
for i = 1,4 do
if i ~= 1 then
local X = Instance.new("StringValue")
X.Parent = AttendeesFolder
X.Name = i
X.Value = "None"
else
local X = Instance.new("StringValue")
X.Parent = AttendeesFolder
X.Name = i
X.Value = player.UserId
end
end
end
end)
--player removing
Players.PlayerRemoving:Connect(function(player)
local Find = LocatePlayer(player)
local Send = {}
if Find ~= nil then
Find.Value = "None"
for i,v in pairs(Find.Parent:GetChildren()) do
if v.Value ~= "None" then
table.insert(Send,tonumber(v.Value))
end
if i == #Find.Parent:GetChildren() then
for _,Obj in pairs(Send) do
local Player = Players:GetPlayerByUserId(Obj)
if Player ~= nil then
Events:FireClient(Player,"AddAllToNewParty",{Players = Send})
end
end
end
end
end
if Parties:FindFirstChild(player.UserId.."'s party") ~= nil then
for i,v in pairs(Parties:FindFirstChild(player.UserId.."'s party").Party:GetChildren()) do
if v.Value ~= "None" then
local Player = Players:GetPlayerByUserId(tonumber(v.Value))
if Player ~= nil then
Events:FireClient(Player,"ENDPARTY")
if Parties:FindFirstChild(Player.UserId.."'s party") ~= nil then
if Parties:FindFirstChild(Player.UserId.."'s party").Party["1"].Value == "None" then
Parties:FindFirstChild(Player.UserId.."'s party").Party["1"].Value = Player.UserId
end
end
end
end
if i == #Parties:FindFirstChild(player.UserId.."'s party").Party:GetChildren() then
Parties:FindFirstChild(player.UserId.."'s party"):Destroy()
end
end
end
end)
--functions
Functions.OnServerInvoke = function(Player,Command,ArgumentTable)
if Command == "IsReserved?" then
if game.VIPServerId ~= "" and game.VIPServerOwnerId == 0 then
return true
else
return false
end
end
end
--Events
Events.OnServerEvent:Connect(function(Player,Command,ArgumentTable)
if Command == "Invite" then
local PlayerToInvite = Players:GetPlayerByUserId(ArgumentTable[1])
if PlayerToInvite ~= nil then
local Key = RandomKeyMaker()
Events:FireClient(PlayerToInvite,"Invited",{From = Player,InviteID = Key})
table.insert(InviteQueue,Key)
end
elseif Command == "AcceptInvite" then
local Key = ArgumentTable.Key
local Done = false
for i,v in pairs(InviteQueue) do
if v == Key and not Done then
Done = not Done
table.remove(InviteQueue,i)
local Spot = FindAvailableSpot(ArgumentTable.From.UserId,Player)
if Spot ~= "FULL" then
ClearOriginalParty(Player)
local NewParty = Parties:FindFirstChild(ArgumentTable.From.UserId.."'s party")
local SendTable = {}
NewParty.Party[Spot].Value = Player.UserId
for i,v in pairs(NewParty.Party:GetChildren()) do
if v.Value ~= "None" then
table.insert(SendTable,v.Value)
end
if i == #NewParty.Party:GetChildren()then
Events:FireClient(Player,"AddAllToNewParty",{Players = SendTable})
end
end
for i,v in pairs(NewParty.Party:GetChildren()) do
if v.Value ~= "None" then
local vPlayer = Players:GetPlayerByUserId(tonumber(v.Value))
Events:FireClient(vPlayer,"AddPlayerToMM",{Player = Player,PartyPlace = Spot})
end
end
end
end
end
elseif Command == "Ready" then
if Parties:FindFirstChild(Player.UserId.."'s party") ~= nil then
local ReserveId = TeleportService:ReserveServer(game.PlaceId)
local PlayersToTP = {}
for i,v in pairs(Parties:FindFirstChild(Player.UserId.."'s party").Party:GetChildren()) do
if v.Value ~= "None" then
table.insert(PlayersToTP,Players:GetPlayerByUserId(tonumber(v.Value)))
end
if i == #Parties:FindFirstChild(Player.UserId.."'s party").Party:GetChildren() then
TeleportService:TeleportToPrivateServer(game.PlaceId,ReserveId,PlayersToTP)
end
end
end
end
end)
--//Main
And well, it did work but it for sure isn’t the greatest masterpiece on earth. I made this in an hour so keep in mind it could have bugs. Here is a link to the place open sourced ( also I am garbage at UI so be patient with that too… lmao );
Hi, sorry if this is a late response, although I used this system, and it was great, but I modified it a little bit so that when the players are in a party, they can be teleported to another game. Here is the post. Failed to reserve server: HTTP 403 (Forbidden) Error - #6 by AerooDev
As you can see in the post, there is an error with HTTP 403. Do you know what is wrong?