I’ve spent the last few days pouring over the ServUO Ultima Online server emulator code.

First step was to get the server running on my MacBook with Mono. The readme instructions make it seem like this is a simple task - just install Mono and then run make. Unfortunately it wasn’t this simple. The first hurdle was a compile error after running make:

Scripts: Compiling C# scripts...Error:
System.TypeInitializationException: The type initializer for
'Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CompilationSettingsHelper' threw an exception.
---> System.EntryPointNotFoundException: IsDebuggerPresent assembly:<unknown assembly>
type:<unknown type> member:(null)

A bit of digging on the ServUO forums and ServUO Discord turned up a few other people with the same error but no solution. I cloned the previous ServUO version (57.2) and make ran fine.

Next hurdle encountered was this prompt after make had finished compiling and started the server:

Enter the Ultima Online directory:
>

A bit more digging and I discovered that you also need to get copies of the .mul files from a UO client installation and give the server access to them (via the directory passed to the prompt above). The .mul file extension seems to be specific to UO, and the files contain various types of data including graphics, animation data, maps and patch contents.

This ServUO forum post was helpful in figuring out what needed to be done.

To get the .mul files I needed to install the official UO client, so I needed to borrow my son’s Windows PC as there is no client for Linux or MacOS. I coped any .mul files in the Windows UO directory into a UO_DATA subdirectory in the ServUO repo.

Providing a unix style path to this directory at the prompt then worked:

Enter the Ultima Online directory:
> ./UO_DATA
DataPath: ./UO_DATA
Regions: Loading...done
World: Loading...
...done (0 items, 0 mobiles, 0 customs) (0.03 seconds)

I found out you can set this path in Config/DataPath.cfg to avoid having to answer the prompt every time you start the server:

# Config/DataPath.cfg
CustomPath=./UO_DATA

After providing the next prompt with a username and password for the server admin account, the server was running.

Next I wanted to get a client connected to the locally running server so I could inspect packets if I needed to. You can’t use the official UO client to connect to a ServUO server, so I researched what other clients were compatible. The UO Alive free shard had a good guide on client set up which I followed to install the ClassicUO client on my son’s Windows PC. ClassicUO offers a web client too, but there’s gatekeeping over which servers it can connect to, so connecting to my local ServUO instance wouldn’t be possible.

I could see from the server output that ServUO was listening on my local network on port 2593 so I created a new profile in the ClassicUO launcher set to connect to the MacBook’s LAN ip on that port, hit connect and after creating a character I was in the (very empty) UO world.