Here is my code:

game.Players.PlayerRemoving:Connect(function(plr)
	
	if plr.CanSave.Value then
		
		local specialKey = "User_"..plr.UserId
		local plrName = plr.Name
		local plrInfo = game.ServerStorage:FindFirstChild(plrName):WaitForChild("PlayerInfo")
		
		if plrInfo.OwnsTycoon.Value then
			
			local tycoonName = plrInfo.OwnedTycoon.Value
			local tycoon = game.Workspace.Tycoons:FindFirstChild(tycoonName)
			local moneyToSave = plrInfo.Money.Value
			local buildLevelToSave = plrInfo.BuildLevel.Value
			local purchasedItemsTable = getTableForDataStore(tycoon, plrInfo)
			local mainTableToSave = {moneyToSave, buildLevelToSave, purchasedItemsTable}
			
			local success, message = pcall(function()
				
				local encodedData = hService:JSONEncode(mainTableToSave)
				 mainDataStore:SetAsync(specialKey, encodedData) -- here is what I tried
				
			end)
					
			if success then
				
				print(plrName.."'s data saved successfully")
				
			else
				
				print(plrName.."'s data failed to save successfully")
				
				wait(15)
				
				local maxAttemptsAllowed = 3
				local saveAttempts = 0
			
				repeat
					
					saveAttempts = saveAttempts + 1
					
					local success, message = pcall(function()
				
						local encodedData = hService:JSONEncode(mainTableToSave)
						mainDataStore:SetAsync(specialKey, encodedData)
			
					end)
					
					if success then
						
						print(plrName.."'s data saved successfully on try "..saveAttempts)
						
					else
						
						print(plrName.."'s data failed to save successfully on try "..saveAttempts)						
						
					end

				until success or saveAttempts == maxAttemptsAllowed
				
			end
		end	
	end
end)