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

"bad cast" error?

So. I have made a Morph which has a model, a script, parts and unions and a script that should add it to the player. But, I keep getting the error:

15:42:08.307 - bad cast
15:42:08.308 - Script 'Workspace.Model.Model.Spawn.Torso', Line 13 -- suitw.Part1 = G[i]
15:42:08.309 - Stack End
function onTouch(hit)

	if hit.Parent:findFirstChild("Humanoid") ~= nil and hit.Parent:findFirstChild("BTorso") == nil then
		local suit = game.ServerStorage["BTorso"]:clone()
		suit.Parent = hit.Parent
		local G = suit:getChildren()
		for i=1, #G do
			if G[i].className == "Part" or "Unionoperation" or "Model" or "Script" then
				local suitW = Instance.new("Weld")
				suitW.Part0 = suit.MainPart
				suitW.Part1 = G[i]
				local autoW = CFrame.new(suit.MainPart.Position)
				suitW.C0 = suit.MainPart.CFrame:inverse()*autoW
				suitW.C1 = G[i].CFrame:inverse()*autoW
				suitW.Parent = suit.MainPart
			end
			local bpW = Instance.new("Weld")
			bpW.Part0 = hit.Parent["Torso"]
			bpW.Part1 = suit.MainPart
			bpW.C0 = CFrame.new(0, 0, 0)
			bpW.Parent = suit.MainPart
		end
		local c = suit:getChildren()
		for i=1, #c do
			c[i].Anchored = false
			c[i].CanCollide = false
		end
	end
end

script.Parent.Touched:connect(onTouch)

1 answer

✓ Accepted answer

The Error

bad cast refers to an error on the C side of Lua where an object does not inherit a certain class. Since you are working with Part1 of a Weld object you are required to use a BasePart or something that inherits it, like a Part, WedgePart, Seat, or UnionOperation. Models and Scripts however do not inherit BasePart.

The Cause

Line 8 in your supplied code is causing G[i] to not always inherit BasePart when being set to Part1. Due to how you are using the or operator the if statement will always run. This is how Lua interprets that line:

if (G[i].className == "Part") or ("Unionoperation") or ("Model") or ("Script") then

To use the or operator correctly you'd have to do this:

if G[i].className == "Part" or G[i].className == "Unionoperation" or G[i].className == "Model" or G[i].className == "Script" then

The Solution

Since you only have to check if G[i] inherits BasePart, you can use the :IsA() method.

if G[i]:IsA("BasePart") then

3 comments

0

Stops working at "local autoW = CFrame.new(suit.MainPart.Position)"

0

It is best to ask a new question when encountering a new error that you cannot figure out.

0

^ Ok

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