Auto Texturing System - Helmet [ Need Help]

Good Morning/Afternoon/Evening. Im Struggling with making a system to change a Surface Appearance ColorMap with a group rank. The Idea is a Mesh Helmet that has a SurfaceApperance texture in it to give the color and all would change based on the rank so players don’t have to pick the rank they need but would already have based in a group.

The script is below what I have already and the system isn’t working. Im, not a scripter so that’s probs the main issue I’m having. Anyhow here’s the script

My Code
local f = script.Parent.Parent.Face1
f.Parent = game.ServerStorage

function boop(Player)
	if Player.Character:findFirstChild("Humanoid") ~= nil and Player.Character:findFirstChild("Face1") == nil then
		local g = f:clone()
		g.Parent = Player.Character
		local C = g:GetChildren()
		for i=1, #C do
			if C[i].className == "Part" or C[i].className == "UnionOperation" then
				local W = Instance.new("Weld")
				W.Part0 = g.Middle
				W.Part1 = C[i]
				local CJ = CFrame.new(g.Middle.Position)
				local C0 = g.Middle.CFrame:inverse()*CJ
				local C1 = C[i].CFrame:inverse()*CJ
				W.C0 = C0
				W.C1 = C1
				W.Parent = g.Middle
			end
			local Y = Instance.new("Weld")
			Y.Part0 = Player.Character.Head				Y.Part1 = g.Middle
			Y.C0 = CFrame.new(0, 0, 0)
			Y.Parent = Y.Part0
		end

		local h = g:GetChildren()
		for i = 1, # h do
			if h[i].className == "Part" or h[i].className == "UnionOperation" then
				h[i].Anchored = false
				h[i].CanCollide = false
			end
		end

	end
end

script.Parent.ClickDetector.MouseClick:connect(boop)

function CheckRank(Player)
	if Player:GetRankInGroup(4875042) == 240 then -- Probie Firefighter
		Player.Character.Face1.Helmet1 = "rbxassetid://8809230471"
		Player.Character.Face1.Shield = "rbxassetid://9670987251"
	elseif Player:GetRankInGroup(4875042) == 241 then -- Firefighter
		Player.Character.Face1.Helmet1 = "rbxassetid://8808951579"
		Player.Character.Face1.Shield = "rbxassetid://9671015815"
	elseif Player:GetRankInGroup(4875042) == 242 then -- Firefighter/EMT
		Player.Character.Face1.Helmet1 = "rbxassetid://8808951579"
		Player.Character.Face1.Shield = "rbxassetid://9670987658"
	elseif Player:GetRankInGroup(4875042) == 243 then -- Firefighter/Paramedic
		Player.Character.Face1.Helmet1 = "rbxassetid://8808951579"
		Player.Character.Face1.Shield = "rbxassetid://9670987522"
	elseif Player:GetRankInGroup(4875042) == 244 then -- F.A.D.O
		Player.Character.Face1.Helmet1 = "rbxassetid://8808951579"
		Player.Character.Face1.Shield = "rbxassetid://9670987760"
	elseif Player:GetRankInGroup(4875042) == 245 then -- Fire Specialist
		Player.Character.Face1.Helmet1 = "rbxassetid://8808951579"
		Player.Character.Face1.Shield = "rbxassetid://9670987388"
	elseif Player:GetRankInGroup(4875042) == 246 then -- Safety Officer
		Player.Character.Face1.Helmet1 = "rbxassetid://8809197735"
		Player.Character.Face1.Shield = "rbxassetid://9596829104"
	elseif Player:GetRankInGroup(4875042) == 247 then -- EMS Lieutenant
		Player.Character.Face1.Helmet1 = "rbxassetid://9595740707"
		Player.Character.Face1.Shield = "rbxassetid://9596829433"
	elseif Player:GetRankInGroup(4875042) == 248 then -- Fire Lieutenant
		Player.Character.Face1.Helmet1 = "rbxassetid://8809210186"
		Player.Character.Face1.Shield = "rbxassetid://9596829210"
	elseif Player:GetRankInGroup(4875042) == 249 then -- EMS Captain
		Player.Character.Face1.Helmet1 = "rbxassetid://9595745118"
		Player.Character.Face1.Shield = "rbxassetid://9596829592"
	elseif Player:GetRankInGroup(4875042) == 250 then -- Fire Captain
		Player.Character.Face1.Helmet1 = "rbxassetid://8809188555"
		Player.Character.Face1.Shield = "rbxassetid://9596829286"
	elseif Player:GetRankInGroup(4875042) == 251 then -- Director of Emergency
		Player.Character.Face1.Helmet1 = "rbxassetid://8809111043"
		Player.Character.Face1.Shield = "rbxassetid://9596829887"
	elseif Player:GetRankInGroup(4875042) == 252 then -- Battalion Chief
		Player.Character.Face1.Helmet1 = "rbxassetid://8809111043"
		Player.Character.Face1.Shield = "rbxassetid://9596830082"
	elseif Player:GetRankInGroup(4875042) == 253 then -- Deputy Chief
		Player.Character.Face1.Helmet1 = "rbxassetid://8809111043"
		Player.Character.Face1.Shield = "rbxassetid://9596829744"
	elseif Player:GetRankInGroup(4875042) == 254 then --Assistant Chief
		Player.Character.Face1.Helmet1 = "rbxassetid://8809111043"
		Player.Character.Face1.Shield = "rbxassetid://9596864481"
	elseif Player:GetRankInGroup(4875042) == 255 then -- Fire Chief
		Player.Character.Face1.Helmet1 = "rbxassetid://8809111043"
		Player.Character.Face1.Shield = "rbxassetid://9596722240"
	end
end

If anyone could help fix it up or maybe make it work, I would appreciate this!

2 Likes

What’s going wrong with your script? Does it throw any errors?

No Errors, Just doesn’t do anything with the textures

It looks like you’ve got your CheckRank function set up, but you don’t call it anywhere so it can run.

Pretty sure you’re not changing the property of MeshId/textureId or whatever your changing

How would i call for it and where would I place it?

Wdym? like is there something else i have to input?

1 Like

There are properties you can change inside of the mesh helmet/surfaceappearance, so instead of “Player.Character.Face1.Helmet1”, it’d be “Player.Character.Face1.Helmet1.MeshId” to change the mesh.

Also, like the other guy said, the function is never called so that’s why you didn’t receive any errors

1 Like

You’d call it with CheckRank(Player) inside your boop function. I’d put it at the end, right before the last end.

...
local h = g:GetChildren()
		for i = 1, # h do
			if h[i].className == "Part" or h[i].className == "UnionOperation" then
				h[i].Anchored = false
				h[i].CanCollide = false
			end
		end

	end
CheckRank(Player)
end

For the record, there are more efficient ways to do what you want to do with that setup. That should get it working, then if you want it prettier or shorter we can do that.

So if im trying to change the colormap of the surface appearance it would be

Player.Character.Face1.Helmet1.ColorMap = “Asset Id Here”?

if your SurfaceAppearance is named Helmet1 then yes, otherwise it’d be

Player.Character.Face1.Helmet1.SurfaceAppearance.ColorMap

1 Like

I placed it, it pops up red. Is that anything I shall be concerned about?

What does it say when you mouse over it?

image
That

move the entire CheckRank function above your boop function

I missed something there. You need to have the function declared before it’s called - so move your CheckRank(Player) stuff above your helmet function.

local f = script.Parent.Parent.Face1
f.Parent = game.ServerStorage

function CheckRank(Player)
	if Player:GetRankInGroup(4875042) == 240 then -- Probie Firefighter
		Player.Character.Face1.Helmet1 = "rbxassetid://8809230471"
		Player.Character.Face1.Shield = "rbxassetid://9670987251"
	elseif Player:GetRankInGroup(4875042) == 241 then -- Firefighter
		Player.Character.Face1.Helmet1 = "rbxassetid://8808951579"
		Player.Character.Face1.Shield = "rbxassetid://9671015815"
	elseif Player:GetRankInGroup(4875042) == 242 then -- Firefighter/EMT
		Player.Character.Face1.Helmet1 = "rbxassetid://8808951579"
		Player.Character.Face1.Shield = "rbxassetid://9670987658"
	elseif Player:GetRankInGroup(4875042) == 243 then -- Firefighter/Paramedic
		Player.Character.Face1.Helmet1 = "rbxassetid://8808951579"
		Player.Character.Face1.Shield = "rbxassetid://9670987522"
	elseif Player:GetRankInGroup(4875042) == 244 then -- F.A.D.O
		Player.Character.Face1.Helmet1 = "rbxassetid://8808951579"
		Player.Character.Face1.Shield = "rbxassetid://9670987760"
	elseif Player:GetRankInGroup(4875042) == 245 then -- Fire Specialist
		Player.Character.Face1.Helmet1 = "rbxassetid://8808951579"
		Player.Character.Face1.Shield = "rbxassetid://9670987388"
	elseif Player:GetRankInGroup(4875042) == 246 then -- Safety Officer
		Player.Character.Face1.Helmet1 = "rbxassetid://8809197735"
		Player.Character.Face1.Shield = "rbxassetid://9596829104"
	elseif Player:GetRankInGroup(4875042) == 247 then -- EMS Lieutenant
		Player.Character.Face1.Helmet1 = "rbxassetid://9595740707"
		Player.Character.Face1.Shield = "rbxassetid://9596829433"
	elseif Player:GetRankInGroup(4875042) == 248 then -- Fire Lieutenant
		Player.Character.Face1.Helmet1 = "rbxassetid://8809210186"
		Player.Character.Face1.Shield = "rbxassetid://9596829210"
	elseif Player:GetRankInGroup(4875042) == 249 then -- EMS Captain
		Player.Character.Face1.Helmet1 = "rbxassetid://9595745118"
		Player.Character.Face1.Shield = "rbxassetid://9596829592"
	elseif Player:GetRankInGroup(4875042) == 250 then -- Fire Captain
		Player.Character.Face1.Helmet1 = "rbxassetid://8809188555"
		Player.Character.Face1.Shield = "rbxassetid://9596829286"
	elseif Player:GetRankInGroup(4875042) == 251 then -- Director of Emergency
		Player.Character.Face1.Helmet1 = "rbxassetid://8809111043"
		Player.Character.Face1.Shield = "rbxassetid://9596829887"
	elseif Player:GetRankInGroup(4875042) == 252 then -- Battalion Chief
		Player.Character.Face1.Helmet1 = "rbxassetid://8809111043"
		Player.Character.Face1.Shield = "rbxassetid://9596830082"
	elseif Player:GetRankInGroup(4875042) == 253 then -- Deputy Chief
		Player.Character.Face1.Helmet1 = "rbxassetid://8809111043"
		Player.Character.Face1.Shield = "rbxassetid://9596829744"
	elseif Player:GetRankInGroup(4875042) == 254 then --Assistant Chief
		Player.Character.Face1.Helmet1 = "rbxassetid://8809111043"
		Player.Character.Face1.Shield = "rbxassetid://9596864481"
	elseif Player:GetRankInGroup(4875042) == 255 then -- Fire Chief
		Player.Character.Face1.Helmet1 = "rbxassetid://8809111043"
		Player.Character.Face1.Shield = "rbxassetid://9596722240"
	end
end

function boop(Player)
	if Player.Character:findFirstChild("Humanoid") ~= nil and Player.Character:findFirstChild("Face1") == nil then
		local g = f:clone()
		g.Parent = Player.Character
		local C = g:GetChildren()
		for i=1, #C do
			if C[i].className == "Part" or C[i].className == "UnionOperation" then
				local W = Instance.new("Weld")
				W.Part0 = g.Middle
				W.Part1 = C[i]
				local CJ = CFrame.new(g.Middle.Position)
				local C0 = g.Middle.CFrame:inverse()*CJ
				local C1 = C[i].CFrame:inverse()*CJ
				W.C0 = C0
				W.C1 = C1
				W.Parent = g.Middle
			end
			local Y = Instance.new("Weld")
			Y.Part0 = Player.Character.Head				Y.Part1 = g.Middle
			Y.C0 = CFrame.new(0, 0, 0)
			Y.Parent = Y.Part0
		end

		local h = g:GetChildren()
		for i = 1, # h do
			if h[i].className == "Part" or h[i].className == "UnionOperation" then
				h[i].Anchored = false
				h[i].CanCollide = false
			end
		end
	end
CheckRank(Player)
end

script.Parent.ClickDetector.MouseClick:connect(boop)

This is the only Error it shot and the helmet didn’t change

Just searched it up as I’ve rarely used SurfaceAppearance, but apparently SurfaceAppearance properties cannot be adjusted within a script. You could possibly clone a premade asset as a replacement

Im assuming by Premade Asset you are meaning make multiple SurfaceAppearances? This is how the Helmet looks
image
Each Texture is already placed on there and I just need to call it to say Chiefs or FF

Yes although not all inside the Helmet already, keep it somewhere like ServerStorage or ReplicatedStorage and clone them inside as I don’t think you can have multiple SurfaceAppearances under a single meshpart