What's new

Installing and playing UO Outlands in Linux

#1
Playing UO Outlands in Linux using WINE

This guide will help you install and play UO Outlands if you run the Linux operating system. It may or may
not work with other platforms that can use WINE (MacOS, FreeBSD, etc.) but I have no way of testing
these platforms.

NOTE REGARDING GRAPHICS DRIVERS: UO Outlands client should not need special graphics drivers.
If you have trouble, let me know.


NOTE REGARDING UO RAZOR: It appears that UO Razor, one of the two "helper" applications available
in UO Outlands, will not work in a 64-bit WINE environment. UO Steam works fine. If you need to
use UO Razor, you should use a 32-bit environment for WINE and UO Outlands. This guide may be
updated in the future regarding how to accomplish this.


NOTE REGARDING SOUND: If you hear no sound when UO Outlands starts, it may be having a hard
time interacting with the PulseAudio sound system. You can place 'pasuspender' before the WINE command
line (`$ pasuspender wine ./OutlandsUO.exe`) to bypass this problem, but no other programs will be able
to play sounds while UO Outlands is running. I am still searching for a better solution.


Installing WINE

Use your operating system's package manager to install wine and the winetricks program. The winbind
package is also required. This will be different for some Linux distributions. For instance, on a Ubuntu
system, one would issue the command:

$ sudo apt install wine winetricks winbind

On a Fedora system, the command would be:

$ sudo dnf install wine winetricks samba-winbind-clients

As for the version of WINE to install, I am using wine-3.17-staging directly from the winehq.org website.
This is a very bleeding-edge version of wine that I need for other, more graphically intensive games. I
am guessing that any moderately-recent version of WINE that comes with your distribution will work, but
I have not tested any other versions. Ultima Online is an old game that should give you no problems
under a recent WINE version.

Installing .NET 4.0

The UO Outlands installer/patcher requires .NET 4.0 from Microsoft. The easiest way to install these
support libraries is to use the winetricks command that you installed in the previous step. To use
winetricks, just call it from the command line (do NOT use sudo):

$ winetricks

A window will pop up in your graphical user interface. If you want to set up a separate $WINEPREFIX for
UO Outlands, you may do so here, but it is optional and not in the scope of this guide.

  1. Choose "Select the default wineprefix" and click OK.
  2. Select "Install a Windows DLL or component" and click OK.
  3. Scroll down the list of available components and select "dotnet40" and click OK.
At this point, winetricks will "do it's thing" and install .NET 4.0 for you. You are now ready to install
UO Outlands!

Installing UO Outlands

At this point, it's as easy as running the UO Outlands installer using WINE:

$ wine ./OutlandsUO.exe

The UO Outlands client should download all of the client files for you, and you're ready to go! Use
your desktop environment to run UO Outlands in the future!

Feel free to contact me with any problems or additions to this guide. Have fun!
 
Last edited:
#5
Has anyone been able to get this to work on macos yosemite? Keep getting an exception with wine when trying to install outlands. I installed dotnet40 with wine tricks and that seemed to go ok. Guessing I might be missing some sort of other dependency, but I am not sure.

Added the terminal output in case anyone on the forum is more wine savvy than I am.
 

Attachments

#6
Has anyone been able to get this to work on macos yosemite? Keep getting an exception with wine when trying to install outlands. I installed dotnet40 with wine tricks and that seemed to go ok. Guessing I might be missing some sort of other dependency, but I am not sure.

Added the terminal output in case anyone on the forum is more wine savvy than I am.
Hmm...can't say for sure @billnyeonrye :-( I see two main issues in your logfile:

  1. Lots of HID stuff (human interface device); try another program with WINE and see if you still get those? WINE on Mac looks like it is not happy with your mouse or keyboard (or other USB device) but it may not be the main problem, and
  2. Complaints about a "unsupported compressor", which would be like zip/gzip/7zip/etc.
But it is not for sure that either of these issues is why WINE is crashing. Again, try another program with WINE (one that works really well on WINE) and see how that works.
 
#7
Hmm ok I'll try to find another program and try it. BTW, I lied and I am actually running Mojave. The keyboard/mouse stuff is likely because I spilled a beer on my macbook a year or two ago and now have to use an external mouse and keyboard. It's my dogs fault even though it was my butt.
 
#8
Ha ha...no matter to me, I know nothing about MacOS :) Just knew that sometimes WINE is used there. Yeah, find a program that everyone agrees works well in WINE (find something on winehq.org maybe) just to see if your WINE installation is working at all.
 
#11
Doing some googling (looks like your output on forums had more stuff?) the "Unknown authentication service" is related to .NET, so installing "dotnet40" via winetricks should have worked. Hmm...

EDIT: Make sure it was "dotnet40" (there are other versions there...) and make sure it installed in the same $WINEPREFIX as UO Outlands.
 
#12
Thanks for all the help with this @MercFredis. I haven't been able to try another program yet because to be honest I'm having trouble getting winetricks back in a state where it can install dotnet40 in the first place. I can never seem to the get the dotnet40 installer to pop up anymore. Trying to start from scratch has been quite the struggle. Going to get back at it today.

Other apps I have tried...
Playonmac
wineskin

No luck with these either.
 
#13
You should be able to delete ~/.wine and start everything over. Don't know if that directory is where MacOS puts it...your home directory, then a directory in it called .wine .
 
#14
Apparently you want:

`open ~/.wine`

Just delete that folder, or anything in it. Re-run winetricks for the current WINEPREFIX (just leave it default), and follow above instructions to install dotnet40. Then try the installer again.
 
#15
I've had some more luck using wine bottler, which is a sorta wrapper for wine, which has some things that make managing it easier. I actually got the uo outlands installer window to pop up before it crashed using this. Going to keep experimenting with this app for the time being.
 
#16
Still no luck. Was able to get notepad++ (windows version) to install properly when using wine bottler, but no go with UO Outlands. Could be conflicts with using Mojave, which is pretty new. Unfortunately no one has responded on the winehq forums either so for now I am going to have to give up on this. I've spent a lot of time just trying to get this to work just so I don't have to sit at my PC in the other room haha. I'm not the biggest mac user so maybe someone with more mac knowledge will come along in the future and get this figured out.
 
#17
So I went through the process of installing on an ubuntu system that I had lying around and was able to get it to work. At first it crashed for me but I found out that I needed to install samba + win bind for some reason. After installing them, it no longer crashed. So that got me thinking that maybe I need to do the same on Mac osx. Found a installer for samba but couldn't find something to specifically install winbind. Installer still crashes with an exception when trying to run with wine.
 
#18
Starting to think it might be an issue with the installer itself when attempting to run using the macosx wine enviroment. I found an error log generated by UO outlands itself that shows...

Code:
System.Net.Sockets.SocketException (0x80004005): Unknown error (0x2747)
   at System.Net.Sockets.Socket.SetSocketOption(SocketOptionLevel optionLevel, SocketOptionName optionName, Int32 optionValue, Boolean silent)
   at System.Net.Sockets.Socket.SetSocketOption(SocketOptionLevel optionLevel, SocketOptionName optionName, Int32 optionValue)
   at System.Net.Sockets.Socket.set_ReceiveBufferSize(Int32 value)
   at Multiverse.PortalClient..ctor(Socket client, Nullable`1 serverID, Boolean remote)
   at Multiverse.PortalClient..ctor()
   at Multiverse.Portal.Configure()
   at Multiverse.Portal.Start()
   at Outlands.Patch.Client.PatchClient.Verify(Boolean initial)
   at Outlands.Patch.Client.PatchClient.OnStartup(Object sender, StartupEventArgs e)
   at System.Windows.Application.OnStartup(StartupEventArgs e)
   at System.Windows.Application.<.ctor>b__1(Object unused)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
   at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
   at System.Threading.ExecutionContext.runTryCode(Object userData)
   at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.ProcessQueue()
   at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
   at System.Windows.Application.RunDispatcher(Object ignore)
   at System.Windows.Application.RunInternal(Window window)
   at System.Windows.Application.Run(Window window)
   at Outlands.Patch.Client.PatchClient.Main()
System.Windows.Markup.XamlParseException: Add value to collection of type 'System.Windows.Controls.UIElementCollection' threw an exception. ---> System.Runtime.InteropServices.COMException: Unknown authentication service. (Exception from HRESULT: 0x800706D3)
   at System.Windows.Media.MediaSystem.ConnectTransport()
   at System.Windows.Media.MediaSystem.Startup(MediaContext mc)
   at System.Windows.Media.MediaContext..ctor(Dispatcher dispatcher)
   at System.Windows.Media.MediaContext.From(Dispatcher dispatcher)
   at System.Windows.Media.Visual.VerifyAPIReadWrite()
   at System.Windows.Media.VisualCollection.Add(Visual visual)
   at System.Windows.Controls.UIElementCollection.AddInternal(UIElement element)
   at System.Windows.Controls.UIElementCollection.Add(UIElement element)
   at System.Windows.Controls.UIElementCollection.System.Collections.IList.Add(Object value)
   at System.Xaml.Schema.XamlTypeInvoker.AddToCollection(Object instance, Object item)
   at MS.Internal.Xaml.Runtime.ClrObjectRuntime.Add(Object collection, XamlType collectionType, Object value, XamlType valueXamlType)
   --- End of inner exception stack trace ---
   at System.Windows.Markup.XamlReader.RewrapException(Exception e, IXamlLineInfo lineInfo, Uri baseUri)
   at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
   at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri)
   at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)
   at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)
   at Outlands.Patch.Client.UI.InitializeComponent()
   at Outlands.Patch.Client.UI..ctor()
   at Outlands.Patch.Client.PatchClient.InitializeUI()
   at Outlands.Patch.Client.PatchClient.Verify(Boolean initial)
   at Outlands.Patch.Client.PatchClient.OnStartup(Object sender, StartupEventArgs e)
   at System.Windows.Application.OnStartup(StartupEventArgs e)
   at System.Windows.Application.<.ctor>b__1(Object unused)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
   at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
   at System.Threading.ExecutionContext.runTryCode(Object userData)
   at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.ProcessQueue()
   at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
   at System.Windows.Application.RunDispatcher(Object ignore)
   at System.Windows.Application.RunInternal(Window window)
   at System.Windows.Application.Run(Window window)
   at Outlands.Patch.Client.PatchClient.Main()
System.Net.Sockets.SocketException (0x80004005): Unknown error (0x2747)
   at System.Net.Sockets.Socket.SetSocketOption(SocketOptionLevel optionLevel, SocketOptionName optionName, Int32 optionValue, Boolean silent)
   at System.Net.Sockets.Socket.SetSocketOption(SocketOptionLevel optionLevel, SocketOptionName optionName, Int32 optionValue)
   at System.Net.Sockets.Socket.set_ReceiveBufferSize(Int32 value)
   at Multiverse.PortalClient..ctor(Socket client, Nullable`1 serverID, Boolean remote)
   at Multiverse.PortalClient..ctor()
   at Multiverse.Portal.Configure()
   at Multiverse.Portal.Start()
   at Outlands.Patch.Client.PatchClient.Verify(Boolean initial)
   at Outlands.Patch.Client.PatchClient.OnStartup(Object sender, StartupEventArgs e)
   at System.Windows.Application.OnStartup(StartupEventArgs e)
   at System.Windows.Application.<.ctor>b__1(Object unused)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
   at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
   at System.Threading.ExecutionContext.runTryCode(Object userData)
   at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.ProcessQueue()
   at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
   at System.Windows.Application.RunDispatcher(Object ignore)
   at System.Windows.Application.RunInternal(Window window)
   at System.Windows.Application.Run(Window window)
   at Outlands.Patch.Client.PatchClient.Main()
System.Net.Sockets.SocketException (0x80004005): Unknown error (0x2747)
   at System.Net.Sockets.Socket.SetSocketOption(SocketOptionLevel optionLevel, SocketOptionName optionName, Int32 optionValue, Boolean silent)
   at System.Net.Sockets.Socket.SetSocketOption(SocketOptionLevel optionLevel, SocketOptionName optionName, Int32 optionValue)
   at System.Net.Sockets.Socket.set_ReceiveBufferSize(Int32 value)
   at Multiverse.PortalClient..ctor(Socket client, Nullable`1 serverID, Boolean remote)
   at Multiverse.PortalClient..ctor()
   at Multiverse.Portal.Configure()
   at Multiverse.Portal.Start()
   at Outlands.Patch.Client.PatchClient.Verify(Boolean initial)
   at Outlands.Patch.Client.PatchClient.OnStartup(Object sender, StartupEventArgs e)
   at System.Windows.Application.OnStartup(StartupEventArgs e)
   at System.Windows.Application.<.ctor>b__1(Object unused)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
   at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
   at System.Threading.ExecutionContext.runTryCode(Object userData)
   at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.ProcessQueue()
   at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
   at System.Windows.Application.RunDispatcher(Object ignore)
   at System.Windows.Application.RunInternal(Window window)
   at System.Windows.Application.Run(Window window)
   at Outlands.Patch.Client.PatchClient.Main()
Looks like it could be an issue reaching out to the patch server. Maybe something is already using the port, or some dependency is missing...
 
Last edited:
#19
Hmm...is your Mac running a firewall? Lots of sockets errors...also I still believe this is related to .Net :( Wish I could help more...

EDIT: Also I must point out, it is not a problem with the client if both Windows and Linux+WINE can run it. ;-) MacOS's WINE support may not be up to snuff, I don't know...

Try using another .NET other than dotnet40, maybe the dotnet452 or whatever it is?
 
Last edited: