Hello,
I recently obtained an SCP Foundation, and its facility has an automatic morph system. When player count gets above 10 or so, there seems to be significant frame rate drops. Most people suggest that it has to do with the automorph system. I can’t imagine it’s the morphs themselves, they are relatively simple meshes. Just wanted to see if anyone was able to figure out if something in the automorph script is causing it. Thanks.
Automorph script:
local morphsFolder = game.ReplicatedStorage._library._morphs
local Players = game.Players
function loadMorph(player,morph,primarypart)
wait(0.05)
local morph_duplicate = morph:Clone()
morph_duplicate.PrimaryPart = morph_duplicate.Middle
morph_duplicate:SetPrimaryPartCFrame(primarypart.CFrame)
morph_duplicate.Parent = player.Character.Morph
for i,v in pairs (morph_duplicate:GetChildren()) do
if v.className ~= "LocalScript" then
player.Character.Humanoid:RemoveAccessories()
local W = Instance.new("Weld")
W.Part0 = morph_duplicate.Middle
W.Part1 = v
local CJ = CFrame.new(morph_duplicate.Middle.Position)
local C0 = morph_duplicate.Middle.CFrame:inverse()*CJ
local C1 = v.CFrame:inverse()*CJ
W.C0 = C0
W.C1 = C1
W.Parent = morph_duplicate.Middle
end
local W2 = Instance.new("Weld")
W2.Part0 = primarypart
W2.Part1 = morph_duplicate.Middle
W2.Parent = primarypart
for i,v in pairs (morph_duplicate:GetChildren())do
if v.className ~= "LocalScript" then
v.Anchored = false
v.CanCollide= false
end
end
if player.Character:FindFirstChildOfClass("Shirt") or player.Character:FindFirstChildOfClass("Pants") then
for _, child in pairs(player.Character:GetChildren()) do
if child.className == "Shirt" or child.className == "Pants" then
child:Destroy()
end
end
end
local shirt = morph.Parent.Shirt:Clone()
local pants = morph.Parent.Pants:Clone()
shirt.Parent = player.Character
pants.Parent = player.Character
for _, child in pairs(player.Character:GetChildren()) do
if child.className == "Accessory" then
child:Destroy()
end
end
end
if morph_duplicate:FindFirstChild("clientNVG") then
wait(1)
morph_duplicate.clientNVG.Parent = player.PlayerGui
player.PlayerGui:FindFirstChild("clientNVG").Disabled = false
end
if morph.Parent.Name == "AGENT" then
player.Character:FindFirstChild("Body Colors"):Destroy()
player.Character.Head.face:Destroy()
for _, bodyPart in pairs(player.Character:GetChildren()) do
if bodyPart.className == "MeshPart" or bodyPart.className == "Part" then
bodyPart.BrickColor = BrickColor.new("Really black")
end
end
end
if morph.Parent.Name == "DELTA-4" or morph.Parent.Name == "OFFICER" or morph.Parent.Name == "PERSONNEL" or morph.Parent.Name == "NCO" then
for _, bodyPart in pairs(player.Character:GetChildren()) do
local bc = player.Character:FindFirstChild("Body Colors")
bc.TorsoColor = BrickColor.new("Really black")
end
end
end
local morphs = {
["Mobile Task Forces"] = {
{"greaterThanequalTo",1,"DELTA-4"},
},
["Engineering and Technical Services"] = {
{"greaterThanequalTo",7,"CE"},
{"greaterThanequalTo",5,"SE"},
{"greaterThanequalTo",1,"ETS"},
},
["Security Department"] = {
{"greaterThanequalTo",6,"OFFICER"},
{"greaterThanequalTo",4,"NCO"},
{"greaterThanequalTo",1,"PERSONNEL"},
},
["Intelligence Agency"] = {
{"greaterThanequalTo",1,"IA"},
},
["Specialized Recontainment Unit"] = {
{"greaterThanequalTo",6,"OFFICER"},
{"greaterThanequalTo",1,"PERSONNEL"},
},
}
game.Players.PlayerAdded:Connect(function(player)
wait(0.05)
player.CharacterAdded:Connect(function()
player.CharacterAppearanceLoaded:Connect(function(character)
for x,z in pairs(morphs) do
for i,v in pairs(z) do
if player.Team.Name == x then
if v[1] == "greaterThanequalTo" and player:GetRankInGroup(game.Teams:FindFirstChild(x).groupId.Value) >= v[2] then
for _, morphChild in pairs(morphsFolder:FindFirstChild(x):FindFirstChild(v[3]):GetChildren()) do
if morphChild.className == "Model" and not player.Character.Morph:FindFirstChild(morphChild.Name) then
loadMorph(player,morphChild,player.Character:FindFirstChild(morphChild.Name))
end
end
elseif v[1] == "lessThanequalTo" and player:GetRankInGroup(game.Teams:FindFirstChild(x).groupId.Value) <= v[2] then
for _, morphChild in pairs(morphsFolder:FindFirstChild(x):FindFirstChild(v[3]):GetChildren()) do
if morphChild.className == "Model" and not player.Character.Morph:FindFirstChild(morphChild.Name) then
loadMorph(player,morphChild,player.Character:FindFirstChild(morphChild.Name))
end
end
elseif v[1] == "equalTo" and player:GetRankInGroup(game.Teams:FindFirstChild(x).groupId.Value) == v[2] or v[4] ~= nil and v[4] == player.Name or v[5] ~= nil and v[5] == player.Name then
for _, morphChild in pairs(morphsFolder:FindFirstChild(x):FindFirstChild(v[3]):GetChildren()) do
if morphChild.className == "Model" and not player.Character.Morph:FindFirstChild(morphChild.Name) then
loadMorph(player,morphChild,player.Character:FindFirstChild(morphChild.Name))
end
end
end
end
end
end
end)
end)
end)