Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
✓ ANSWER ACCEPTED

Searching your game for an object with a certain directory durring runtime?

I am trying to take a string

local path = "game.Workspace.Part.Position.X"

and I need to print the Parts "X" Position with that string using that path, so something like this

local path = "game.Workspace.Part.Position.X"
print(path)

--Output (Normal)
--[[
game.Workspace.Part.Position.X
]]--

--Output (How I need it to be)
--[[
231 - (theoretical X position)
]]--

Is there anyway I can do this without recursively checking if every Object in my game has the same FullName as the path?

1 comment

0

Use a for loop for every single part in the workspace and check if its the same or not

1 answer

✓ Accepted answer

This is actually pretty cool programming activity. The best way to do this would to be do some string manipulation. We basically treat every '.' as a divider between a parent and a child so we can get the name of something between each '.' and that will be the child we index from the parent we last indexed.

local path = "game.Workspace.Part.Position.X"
function proccessPath(s)
	local currentParent = game
	-- first thing we do is remove 'game.'
	local startNum= string.find(s,'.',1,true) -- need to tell the function to only search for strings not patterns because if set to false it will consider '.' as any character
	local currentString = string.sub(s,startNum + 1)
	local foundPeriod
	local foundChild
	repeat
		foundPeriod = false -- we can change this later instead of having an else statement to set it
		foundChild = false
		local startNum = string.find(currentString,'.',1,true)
		if startNum then
			foundPeriod = true
		elseif string.len(currentString) > 0 then
			foundPeriod = false
			startNum = 0
		else
			break
		end
		local childName = string.sub(currentString,1,startNum - 1) -- first we index from the start of the string to the position of the period to get the current child 
		currentString = string.sub(currentString,startNum + 1) -- then we save the new string which slices out the child to go on to the next one
		if typeof(currentParent) == "Instance" and currentParent:FindFirstChild(childName) or pcall(function() return currentParent[childName] end) then
			foundChild = true
			currentParent = currentParent[childName]
		end
	until not foundPeriod or not foundChild
	if foundChild then
		return currentParent -- returns part or property we got from the path name
	else
		warn("Child or property could not be found :(")
	end
end
	
print(proccessPath(path))

Outputs --> -6 Which was the position of the one part in my workspace at that time. The best thing about this is it works for properties too so you can do say "game.Workspace.Part.Position.X"

Well uh have fun with this function or whatever your gonna do with it. Cheers

2 comments

0

Thank you so much!

0

Don't use string.len(str). use #str

This discussion is preserved as it was. New answers, comments, and votes are closed.