I made a script that attaches the backpack to the player, but it doesn't really work. I think I made a mistake with the CFrame. The backpack is rotated in the wrong direction and sometimes I cannot move. https://gyazo.com/38374d1a8c21f9f7b48226e6cf273a78 Here is the script:

local function AttachToBack(player, object)
   object = object:Clone()
   local char = player.Character
        
   object.Parent = char
   object:SetPrimaryPartCFrame(char.UpperTorso.CFrame  * CFrame.Angles(0,math.pi/2, 0))

   for _, v in pairs(object:GetChildren()) do
   	
   	if v:IsA("BasePart") and v ~= object.PrimaryPart then
   		
   		local weldPart = Instance.new("WeldConstraint")
   		weldPart.Parent = object.PrimaryPart
   		weldPart.Part0 = object.PrimaryPart
   		weldPart.Part1 = v
   		
   	end
   	
   end
        
   local weld = Instance.new("Motor6D")
   weld.C0 = CFrame.new(char.HumanoidRootPart.CFrame.lookVector * -1.85)
   weld.Parent = char.UpperTorso
   weld.Part0 = char.UpperTorso
   weld.Part1 = object.PrimaryPart

end

local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")

Players.PlayerAdded:Connect(function(player) 
   
   player.CharacterAppearanceLoaded:Connect(function(character)
   	
   	 AttachToBack(player, ReplicatedStorage:WaitForChild("Backpacks").Commons[game.Workspace.BackpackLocations[player:WaitForChild("EquippedBackpack").Value].Backpack.Value])
   
   end)

end)


game:GetService("ReplicatedStorage"):WaitForChild("RemoteEvents").EquippBackpack.OnServerEvent:Connect(function(plr, backpackNum, backpackname)
	for i,v in pairs(game.ReplicatedStorage:WaitForChild("Backpacks").Commons:GetChildren()) do
		if plr.Character:FindFirstChild(v.Name) ~= nil then
			plr.Character:FindFirstChild(v.Name):Destroy()
		end
	end
	AttachToBack(plr, game.ReplicatedStorage:WaitForChild("Backpacks").Commons[backpackname])
end)