GetTeleportSetting not working

  1. What do you want to achieve? Keep it simple and clear!

I want to send data across the place I’m getting teleported to.

  1. What is the issue? Include screenshots / videos if possible!

The issue is that the other game or server isn’t recieveing the data instead it is printing me that there’s a mistake with recieving the data, the error is HTTP403(Not found)

  1. What solutions have you tried so far? Did you look for solutions on the Developer Hub?

Yes I look into the developer forums and documentation but I’m still confused about the error

function TeleportServiceModule:TeleportPlayer(accesscode,serverId, players)
	print("serverId",serverId)
	print("player:",players)
	print("AccessCode:", accesscode)
	local firstPlayer = players[1]
	if not firstPlayer then
		warn("The list of players is empty or the first player is nil.")
		return
	end


	local teleportOptions = Instance.new("TeleportOptions")
	teleportOptions.ReservedServerAccessCode = accesscode
	
	local equippedTools = {}
	
	for _, player in pairs(players) do
		if player.Character and player.Character:FindFirstChildOfClass("Tool") then
			equippedTools[player.UserId] = player.Character:FindFirstChildOfClass("Tool").Name
		else
			equippedTools[player.UserId] = nil
		end
	end

	-- it saves the wapons
	TeleportService:SetTeleportSetting("EquippedTools", equippedTools)


	local success, errorMessage = pcall(function()
		TeleportService:TeleportAsync(17386799904, players, teleportOptions)
	end)

	if not success then
		warn("Error teleporting to reserved server:", errorMessage)
	end

end
local TeleportService = game:GetService("TeleportService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local equippedTools = TeleportService:GetTeleportSetting("EquippedTools")
if equippedTools and equippedTools[player.UserId] then
	local toolName = equippedTools[player.UserId]
	if toolName then
		local tool = game.ServerStorage:FindFirstChild(toolName):Clone()
			tool.Parent = player.Backpack
		end
	end 


2 Likes

Edit: Oh it seems that I missed the :SetTeleportSettings() call from the original post; I’ll re-review everything


Original Post

:GetTeleportSetting() is intended to be used to retrieve values that were assigned with TeleportService:SetTeleportSetting().

In the case of the TeleportOptions object, you can retrieve that from the Player object itself with Player:GetJoinData(), which returns a dictionary. Inside of that dictionary is a key called “TeleportData”, which contains the data from that TeleportOptions object.

2 Likes

Alright, I’ve a question I discoverd that :SetTeleportSetting works only on the client what works that I can send it from the Server Side as the code is located on a script?

2 Likes

In that case, you could assign the table of equippedTools to the TeleportOptions object, since it allows you to include custom data by using :SetTeleportData().

For example:

local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ReservedServerAccessCode = accesscode

local equippedTools = {}
	
for _, player in pairs(players) do
	if player.Character and player.Character:FindFirstChildOfClass("Tool") then
		equippedTools[player.UserId] = player.Character:FindFirstChildOfClass("Tool").Name
	else
		equippedTools[player.UserId] = nil
	end
end

teleportOptions:SetTeleportData(equippedTools) -- New addition to the script

Then, on the receiving server:

  1. Listen for players to join the game with PlayerAdded

  2. Call Player:GetJoinData()

  3. Check if there’s any value for the “TeleportData” key within the dictionary that :GetJoinData() returns

  4. If so, refer to TeleportData.equippedTools to access the table

  5. Then use equippedTools[player.UserId] to reference the name of the Tool that was sent through for that specific player

2 Likes

thx for telling me, the data appears to be sent but some of it is lost such as the weapons or atleast I think so, as I did some other attempts and it just appeared me the first weapon name:

Code:

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local HTTP = game:GetService("HttpService")
Players.PlayerAdded:Connect(function(player)
	local joinData = player:GetJoinData()
	local teleportData = joinData.TeleportData
	print("joinData:", teleportData, "JsonEncodedData:", HTTP:JSONEncode(joinData))
	print("teleportData:", teleportData, "JsonEncodedData:", HTTP:JSONEncode(teleportData))
	print("teleportData.equippedTools", teleportData.equippedTools)
end)

1 Like

For reference, what does the TeleportServiceModule:TeleportPlayer() function look like after you made changes to it?

1 Like

it looks like this:

function TeleportServiceModule:TeleportPlayer(accesscode,serverId, players)
	print("serverId",serverId)
	print("player:",players)
	print("AccessCode:", accesscode)
	local firstPlayer = players[1]
	if not firstPlayer then
		warn("The list of players is empty or the first player is nil.")
		return
	end


	local teleportOptions = Instance.new("TeleportOptions")
	teleportOptions.ReservedServerAccessCode = accesscode
	
	local equippedTools = {}
	
	for _, player in pairs(players) do
		if player.Character and player.Character:FindFirstChildOfClass("Tool") then
			equippedTools[player.UserId] = player.Character:FindFirstChildOfClass("Tool").Name
		else
			equippedTools[player.UserId] = nil
		end
	end

	-- Guarda las herramientas equipadas como configuración de teleportación
	teleportOptions:SetTeleportData(equippedTools) 


	local success, errorMessage = pcall(function()
		TeleportService:TeleportAsync(17386799904, players, teleportOptions)
	end)

	if not success then
		warn("Error teleporting to reserved server:", errorMessage)
	end

end
1 Like

Try printing equippedTools after the loop ends (right before calling :SetTeleportData()) to see if anything was successfully added to the table before being teleported.

I’d recommend temporarily adding a task.wait(5) or something similar after the print statement so you have time to look in the Developer Console to see what it prints before being teleported to the destination place.

1 Like

Some times the table was empty because I couldn’t see if I was equiping an item as i made a gui cover the whole screen, I added all the tools of the player Backpack but the teleportData.equippedTools is still nil, also i already verify if it sends the data here are the images:


Should I use the teleportData as the equipped tools?

1 Like

Oh, the screenshot is already showing the UserId and the names of the tools right before checking if teleportData.equippedTools exists, so it seems that TeleportData is directly storing the contents of the equippedTools table rather than it being a nested table.

With that in mind, you can either access it directly via TeleportData[player.UserId], or, if you’d still like to refer to it through TeleportData.equippedTools (which would also make it easier to send more custom data in the future while remaining organized), you could update the TeleportPlayer() function to assign the teleport data like this, instead:

	local teleportOptions = Instance.new("TeleportOptions")
	teleportOptions.ReservedServerAccessCode = accesscode
	
    local teleportData = {
        ["equippedTools"] = {}
    }
	
	for _, player in pairs(players) do
		if player.Character and player.Character:FindFirstChildOfClass("Tool") then
			teleportData.equippedTools[player.UserId] = player.Character:FindFirstChildOfClass("Tool").Name
		else
			teleportData.equippedTools[player.UserId] = nil
		end
	end


	teleportOptions:SetTeleportData(teleportData) 
1 Like

Sorry for the delay,It did work, before we finish can you help me find the reason why tool is nil?

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local HTTP = game:GetService("HttpService")
Players.PlayerAdded:Connect(function(player)
	local joinData = player:GetJoinData()
	local teleportData = joinData.TeleportData
	print("joinData:", joinData, "JsonEncodedData:", HTTP:JSONEncode(joinData))
	print("teleportData:", teleportData, "JsonEncodedData:", HTTP:JSONEncode(teleportData))
	print("teleportData.equippedTools", teleportData.equippedTools)

	if teleportData and teleportData.equippedTools then
		local equippedTools = teleportData.equippedTools
		local tool = equippedTools[player.UserId]
print("Tool:", tool)
		if tool then
			for _, toolName in pairs(tool) do
				tool.Parent = player.Backpack
			end
		else
			warn("No tool names found for player with UserId: " .. player.UserId)
		end
	else
		warn("No TeleportData or equippedTools found for player with UserId: " .. player.UserId)
	end
end)

Also here is the other code:

function TeleportServiceModule:TeleportPlayer(accesscode,serverId, players)
	print("serverId",serverId)
	print("player:",players)
	print("AccessCode:", accesscode)
	local firstPlayer = players[1]
	if not firstPlayer then
		warn("The list of players is empty or the first player is nil.")
		return
	end


	local teleportOptions = Instance.new("TeleportOptions")
	teleportOptions.ReservedServerAccessCode = accesscode
	local teleportData = {
		["equippedTools"] = {}
	}
	
	
	for _, player in pairs(players) do
		if player.Character then
			local allItems = {}

			-- Recolectar herramientas del personaje
			for _, tool in pairs(player.Character:GetChildren()) do
				if tool:IsA("Tool") then
					table.insert(allItems, tool.Name)
				end
			end

			-- Recolectar herramientas de la mochila
			for _, tool in pairs(player.Backpack:GetChildren()) do
				if tool:IsA("Tool") then
					table.insert(allItems, tool.Name)
				end
			end

			teleportData.equippedTools[player.UserId] = allItems
		else
			teleportData.equippedTools[player.UserId] = nil
		end
	end
	task.wait(5)
	print("EquippedTools:", teleportData.equippedTools, "DecodedEquippedTools:", HttpService:JSONEncode(teleportData.equippedTools))
	-- Guarda las herramientas equipadas como configuración de teleportación
	teleportOptions:SetTeleportData(teleportData) 


	local success, errorMessage = pcall(function()
		TeleportService:TeleportAsync(17386799904, players, teleportOptions)
	end)

	if not success then
		warn("Error teleporting to reserved server:", errorMessage)
	end

end

1 Like

The loop is trying to set the Parent of the table to the player’s Backpack.

The script needs to find the correct tool from the ServerStorage based on toolName (at least according to the original codeblock you posted where it’s trying to look through the ServerStorage) and then that object is what would be cloned into the player’s Backpack.

Example Revision

	if teleportData and teleportData.equippedTools then
		local equippedTools = teleportData.equippedTools
		local toolNameTable = equippedTools[player.UserId]

		if toolNameTable then
			for _, toolName in toolNameTable do
                local realTool = ServerStorage:FindFirstChild(toolName)
                if realTool then
                    local clonedTool = realTool:Clone()
                    clonedTool.Parent = player.Backpack
                end
			end

		else
			warn("No tool names found for player with UserId: " .. player.UserId)
		end
	else
		warn("No TeleportData or equippedTools found for player with UserId: " .. player.UserId)
	end
end)
1 Like

Alright, thx for telling me about the issue : ), but now I’d encounter a new one which it says that there’s no tool names for my username, here is a video:

here is an image before entering the place I’m teleporting too:


here is another image when I enter the place I was teleporting too:

1 Like

Hmmm, what does the function activated from the PlayerAdded event look like now?

There’s probably a very simple solution to that that I just can’t spot right now lol (and sorry it is taking me such a long time to help you find the final solution)

1 Like

It looks like this, and don’t worry I feel very grateful for your help, take your time : )

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local HTTP = game:GetService("HttpService")
Players.PlayerAdded:Connect(function(player)
	local joinData = player:GetJoinData()
	local teleportData = joinData.TeleportData
	print("joinData:", joinData, "JsonEncodedData:", HTTP:JSONEncode(joinData))
	print("teleportData:", teleportData, "JsonEncodedData:", HTTP:JSONEncode(teleportData))
	print("teleportData.equippedTools", teleportData.equippedTools)

	if teleportData and teleportData.equippedTools then
		local equippedTools = teleportData.equippedTools
		local toolNameTable = equippedTools[player.UserId]

		if toolNameTable then
			for _, toolName in toolNameTable do
				local realTool = ServerStorage:FindFirstChild(toolName)
				if realTool then
					local clonedTool = realTool:Clone()
					clonedTool.Parent = player.Backpack
				end
			end

		else
			warn("No tool names found for player with UserId: " .. player.UserId)
		end
	else
		warn("No TeleportData or equippedTools found for player with UserId: " .. player.UserId)
	end
end)
1 Like

Huh, so I went into Roblox Studio to test a similar setup, and the same thing happened.

So I tested one possible change… and it turns out that all we needed to do was call tostring() on the UserId for it to successfully recognize the key within the equippedTools table. :laughing:

I thought it would automatically do that, but maybe it was trying to look for an index with that given number rather than converting it into a string and looking for a matching key.


This means that the last revision should be the following:

-- Before
local toolNameTable = equippedTools[player.UserId]

-- After
local toolNameTable = equippedTools[tostring(player.UserId)]
1 Like

Sorry for the late response I was sleeping :sweat_smile:, also thx for telling me I really apreciate your help, I already updated the code, and now the tool toolNameTable isn’t nil :smiley:, but for some reason it isn’t appearing on the player’s perspective

Code:

local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local HTTP = game:GetService("HttpService")
Players.PlayerAdded:Connect(function(player)
	local joinData = player:GetJoinData()
	local teleportData = joinData.TeleportData
	print("joinData:", joinData, "JsonEncodedData:", HTTP:JSONEncode(joinData))
	print("teleportData:", teleportData, "JsonEncodedData:", HTTP:JSONEncode(teleportData))
	print("teleportData.equippedTools", teleportData.equippedTools)

	if teleportData and teleportData.equippedTools then
		local equippedTools = teleportData.equippedTools
		local toolNameTable = equippedTools[tostring(player.UserId)]
		print("toolNameTable:", toolNameTable, "JsonEncodedData:", HTTP:JSONEncode(toolNameTable))
		if toolNameTable then
			for _, toolName in toolNameTable do
				print("toolName",toolName)
				local realTool = ReplicatedStorage:FindFirstChild(toolName)
				if realTool then
					print("RealTool",realTool)
					local clonedTool = realTool:Clone()
					print("Cloned_Tool:", clonedTool)
					clonedTool.Parent = player.Backpack
					print("Cloned.Parent:", clonedTool.Parent)
				end
			end

		else
			warn("No tool names found for player with UserId: " .. player.UserId)
		end
	else
		warn("No TeleportData or equippedTools found for player with UserId: " .. player.UserId)
	end
end)

Images:

Console:


PlayerBackpack:

1 Like

Another thing it appears me that the children of playerBackpack are null:

Code, Fragment:

	if toolNameTable then
		for _, toolName in toolNameTable do
			print("toolName",toolName)
			local realTool = ReplicatedStorage:FindFirstChild(toolName)
			if realTool then
				print("RealTool",realTool)
				local clonedTool = realTool:Clone()
				print("Cloned_Tool:", clonedTool)
				clonedTool.Parent = player.Backpack
				print("Players's Backpack:", HTTP:JSONEncode(player.Backpack:GetChildren()))
				print("Cloned.Parent:", clonedTool.Parent)
			end
		end
1 Like

Hmmm, that’s a bit strange considering the clonedTool is being moved into the Backpack on the server-side, as well as the fact that the print statements are showing that it’s finding the original Tools, are creating clones of it, and setting its Parent property to the Backpack.

It’s even more interesting because it’s not throwing any errors even though it’s showing up as “null” in the Backpack.

I’m not quite sure I fully know what’s causing that to happen at the moment, but here are some suggestions to try:

  • Make sure the items in the ReplicatedStorage are Tool objects (I know that’s probably already the case, but just to be sure)

  • Try including the clonedTool.Parent = player.Backpack assignment within a task.defer(). I don’t think this would change anything, given that there is no error in the Output, but seeing how the clonedTool appears as “null” reminded me of that error that occurs when trying to update the Parent property of an object repeatedly in quick succession.

(Also, you can unmark my first reply as a solution because my first post here wasn’t actually the solution to the thread. If we end up resolving it, I would recommend having you post the completed, working code from both the original server and on the receiving end, and then mark that post as a solution so people who read this thread in the future will see what the final changes were)

1 Like

Alright, something like this?

local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local HTTP = game:GetService("HttpService")
print(HTTP:JSONEncode(workspace:GetChildren(typeof("Tool"))))
Players.PlayerAdded:Connect(function(player)
	local Backpack = player:WaitForChild("Backpack")
	local joinData = player:GetJoinData()
	local teleportData = joinData.TeleportData
	print("joinData:", joinData, "JsonEncodedData:", HTTP:JSONEncode(joinData))
	print("teleportData:", teleportData, "JsonEncodedData:", HTTP:JSONEncode(teleportData))
	print("teleportData.equippedTools", teleportData.equippedTools)

	if teleportData and teleportData.equippedTools then
		local equippedTools = teleportData.equippedTools
		local toolNameTable = equippedTools[tostring(player.UserId)]
		print("toolNameTable:", toolNameTable, "JsonEncodedData:", HTTP:JSONEncode(toolNameTable))
		if toolNameTable then
			for _, toolName in toolNameTable do
				print("toolName",toolName)
				local realTool = ReplicatedStorage:FindFirstChild(toolName)
				if realTool then
					print("RealTool",realTool)
					local clonedTool = realTool:Clone()
					print("Cloned_Tool:", clonedTool)
					print("ClonedToolType", typeof(clonedTool), "ClonedTool:Children",  HTTP:JSONEncode(clonedTool:GetChildren()))
					task.defer(function()
						clonedTool.Parent = Backpack
					end)
					print("Players's Backpack:", HTTP:JSONEncode(player.Backpack:GetChildren()))
					print("Cloned.Parent:", clonedTool.Parent)
				end
			end

		else
			warn("No tool names found for player with UserId: " .. player.UserId)
		end
	else
		warn("No TeleportData or equippedTools found for player with UserId: " .. player.UserId)
	end
end)

Also here is an image of the Replicated Storage incase I’m messing something up:

Captura de pantalla 2024-05-16 a la(s) 14.52.50

1 Like