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

Weld Script?Falling parts?

Asked by 8 years ago

So I Had Made Guns that multiple parts welded to the Handle of the guns. The problem is that when i clone it from ReplicatedStorage and give it to a Player (via GuiShop). When the Player selects the tool, the welded parts fall and fall out of the Map and the tool breaks because of the missing parts. I already tried the MakeJoints() function. But it still doesn't work

function shop()
    local give = game.ReplicatedStorage.Pistol:Clone()
    local temp = give:Clone()
    if player.leaderstats.Money.Value >= 1 then
        temp.Handle:MakeJoints()
        temp.Parent = player.Backpack
        give.Parent = player.StarterGear
        player.leaderstats.Money.Value = player.leaderstats.Money.Value - 1
    end
end
0
Use Solid Modeling to make the pistol a single part. That lets your skip annoying welding. Perci1 4988 — 8y
0
Lol yep koolkid8099 705 — 8y
0
The welded parts are scripted though. GeezuzFusion 200 — 8y

1 answer

Log in to vote
0
Answered by 8 years ago

You can insert a regular script into the weapon and insert Quenty's weld script into it that script.

`local NEVER_BREAK_JOINTS = false -- If you set this to true it will never break joints (this can create some welding issues, but can save stuff like hinges).


local function CallOnChildren(Instance, FunctionToCall)
    -- Calls a function on each of the children of a certain object, using recursion.  

    FunctionToCall(Instance)

    for _, Child in next, Instance:GetChildren() do
        CallOnChildren(Child, FunctionToCall)
    end
end

local function GetNearestParent(Instance, ClassName)
    -- Returns the nearest parent of a certain class, or returns nil

    local Ancestor = Instance
    repeat
        Ancestor = Ancestor.Parent
        if Ancestor == nil then
            return nil
        end
    until Ancestor:IsA(ClassName)

    return Ancestor
end

local function GetBricks(StartInstance)
    local List = {}

    -- if StartInstance:IsA("BasePart") then
    --  List[#List+1] = StartInstance
    -- end

    CallOnChildren(StartInstance, function(Item)
        if Item:IsA("BasePart") then
            List[#List+1] = Item;
        end
    end)

    return List
end

local function Modify(Instance, Values)
    -- Modifies an Instance by using a table.  

    assert(type(Values) == "table", "Values is not a table");

    for Index, Value in next, Values do
        if type(Index) == "number" then
            Value.Parent = Instance
        else
            Instance[Index] = Value
        end
    end
    return Instance
end

local function Make(ClassType, Properties)
    -- Using a syntax hack to create a nice way to Make new items.  

    return Modify(Instance.new(ClassType), Properties)
end

local Surfaces = {"TopSurface", "BottomSurface", "LeftSurface", "RightSurface", "FrontSurface", "BackSurface"}
local HingSurfaces = {"Hinge", "Motor", "SteppingMotor"}

local function HasWheelJoint(Part)
    for _, SurfaceName in pairs(Surfaces) do
        for _, HingSurfaceName in pairs(HingSurfaces) do
            if Part[SurfaceName].Name == HingSurfaceName then
                return true
            end
        end
    end

    return false
end

local function ShouldBreakJoints(Part)
    --- We do not want to break joints of wheels/hinges. This takes the utmost care to not do this. There are
    --  definitely some edge cases. 

    if NEVER_BREAK_JOINTS then
        return false
    end

    if HasWheelJoint(Part) then
        return false
    end

    local Connected = Part:GetConnectedParts()

    if #Connected == 1 then
        return false
    end

    for _, Item in pairs(Connected) do
        if HasWheelJoint(Item) then
            return false
        elseif not Item:IsDescendantOf(script.Parent) then
            return false
        end
    end

    return true
end

local function WeldTogether(Part0, Part1, JointType, WeldParent)
    --- Weld's 2 parts together
    -- @param Part0 The first part
    -- @param Part1 The second part (Dependent part most of the time).
    -- @param [JointType] The type of joint. Defaults to weld.
    -- @param [WeldParent] Parent of the weld, Defaults to Part0 (so GC is better).
    -- @return The weld created.

    JointType = JointType or "Weld"
    local RelativeValue = Part1:FindFirstChild("qRelativeCFrameWeldValue")

    local NewWeld = Part1:FindFirstChild("qCFrameWeldThingy") or Instance.new(JointType)
    Modify(NewWeld, {
        Name = "qCFrameWeldThingy";
        Part0  = Part0;
        Part1  = Part1;
        C0     = CFrame.new();--Part0.CFrame:inverse();
        C1     = RelativeValue and RelativeValue.Value or Part1.CFrame:toObjectSpace(Part0.CFrame); --Part1.CFrame:inverse() * Part0.CFrame;-- Part1.CFrame:inverse();
        Parent = Part1;
    })

    if not RelativeValue then
        RelativeValue = Make("CFrameValue", {
            Parent     = Part1;
            Name       = "qRelativeCFrameWeldValue";
            Archivable = true;
            Value      = NewWeld.C1;
        })
    end

    return NewWeld
end

local function WeldParts(Parts, MainPart, JointType, DoNotUnanchor)
    -- @param Parts The Parts to weld. Should be anchored to prevent really horrible results.
    -- @param MainPart The part to weld the model to (can be in the model).
    -- @param [JointType] The type of joint. Defaults to weld. 
    -- @parm DoNotUnanchor Boolean, if true, will not unachor the model after cmopletion.

    for _, Part in pairs(Parts) do
        if ShouldBreakJoints(Part) then
            Part:BreakJoints()
        end
    end

    for _, Part in pairs(Parts) do
        if Part ~= MainPart then
            WeldTogether(MainPart, Part, JointType, MainPart)
        end
    end

    if not DoNotUnanchor then
        for _, Part in pairs(Parts) do
            Part.Anchored = false
        end
        MainPart.Anchored = false
    end
end

local function PerfectionWeld() 
    local Tool = GetNearestParent(script, "Tool")

    local Parts = GetBricks(script.Parent)
    local PrimaryPart = Tool and Tool:FindFirstChild("Handle") and Tool.Handle:IsA("BasePart") and Tool.Handle or script.Parent:IsA("Model") and script.Parent.PrimaryPart or Parts[1]

    if PrimaryPart then
        WeldParts(Parts, PrimaryPart, "Weld", false)
    else
        warn("qWeld - Unable to weld part")
    end

    return Tool
end

local Tool = PerfectionWeld()


if Tool and script.ClassName == "Script" then
    --- Don't bother with local scripts

    script.Parent.AncestryChanged:connect(function()
        PerfectionWeld()
    end)
end`
0
This isn't Useful for learning. But thanks anyway. GeezuzFusion 200 — 8y
Ad

Answer this question