Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

"bad cast" error?

Asked by 8 years ago

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

Log in to vote
1
Answered by 8 years ago

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
0
Stops working at "local autoW = CFrame.new(suit.MainPart.Position)" TheHospitalDev 1134 — 8y
0
It is best to ask a new question when encountering a new error that you cannot figure out. NullSenseStudio 342 — 8y
0
^ Ok TheHospitalDev 1134 — 8y
Ad

Answer this question