Hello devs, I’m a bit stuck on an issue that I’ve been trying to solve for the past hour. Currently Im trying to create a function that will loop untill it finds the top model. This was for the issue of models inside models and me wanting to get the Parent of the all. The issue here is that the return statement is returning Nil to the other piece of code. I have tried looking through all the Forums I could find that were semi related but none of them seemed to be the issue that I was facing
Here is my code:
function parentCheck(model)
local model = model
if model:FindFirstAncestorOfClass("Model") then
print("If: ", model)
model = model:FindFirstAncestorOfClass("Model")
parentCheck(model)
else
print("Else: ", model)
return model
end
end
Any help would be much appreciated whether its a redirection or an explanation!
If I understand correctly, that function would return nil to the initial function call in all of the cases where the first condition is true (where the model passed into the function has an Ancestor which is also a model) because that would result in the function calling itself again.
As a result, when the code in the else statement runs, it’s returning the model to the most recent function call (which happened inside of the function the previous time it ran) instead of the initial function call from somewhere else in the script.
You can test that this is happening by passing a Model into the function that has been placed directly into the Workspace and has no Ancestors which are also Models – in this case, the first condition would be false, causing it to immediately return the model to the initial function call, as it didn’t need to call the function again to look for the next Ancestor with the Model ClassName.
(If my explanation was too confusing, please let me know and I’ll try to explain it further!)
Here’s an example revision of that function that utilizes a loop (avoiding having to call it over and over again from within the function itself) to find the highest-level parent Model:
Example Revision
local function parentCheck(model)
local topModel = model
for count = 0, math.huge do
local ancestorModelCheck = topModel:FindFirstAncestorOfClass("Model")
if ancestorModelCheck then
topModel = ancestorModelCheck
else
break
end
end
return topModel
end
Wow! Thank you so much. I cant believe the solution was as simple as this but I would never have thought of in the first place.
I haven’t really used math.huge before but if I am assuming correctly that for loop will run for math.huge’s number which is a long enough time for the script to find the top model?
Then it will break if there is no model found higher in the hiearchy and return the top model.
Sorry if I wasted your time on something like this, your explanation was great!
Precisely! math.huge is essentially infinity, so defining that as the end value for the loop is a way of guaranteeing that the loop would continue for enough iterations until it finds the top model.
No worries! For me, responding to threads on the Developer Forum is never a waste of time since no matter what, there’s always something that can be learned from it (and, best case scenario is that my responses help out a whole bunch of* people who end up reading it).