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
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`