The server has 2500+ players logged in right now, so still very much active.
Recently, I've enjoyed scripting for the TazUO game client in Python; it's a slightly older version of Python 3, but still far ahead of scripting in Razor or SteamUO. If you're looking for a quiet single-player shard to play around with, I've enjoyed Memento.
The game is currently only available via emulator.
Localized, text-heavy RPGs are a very easy way to "learn-while-playing" a foreign language, and reading as well.
Would love to see this built !
I played T2A a little last year, great shard & peeps running it.
got into it with Sphere (51 and 55) if my memory doesn't trick me.
was there ever a working port of the client for OSX ? would love to revamp it.
I was surprised that there is still an active community around UO!
In any case, this is very cool. Thanks for sharing!
I've been working on my own MFC C++ decompilation project. It's insane how useful LLMs are for this.
I liked the old Ultima saga, in particular from 5 to 7. Ultima 8 ... I did not hate it, but they killed off the old concept. Perhaps the old genre was meant to die anyway, but it was such a big difference from 7 to 8. While 7 is often the most praised variant, I particularly hated combat; it was much easier in Ultima 6. Either way it was specific for the 1990s era for the most part, which was pretty nice. (Ok - just looked up ... Ultima 1 to 5 actually was in the 1980s era; I thought it wasn't quite that old. Ultima 6 was released in 1990.)
Nowadays I miss the UO experience but simply don't have time to sink into anything like it.
I didn't have an LLM back then but also at least some debug symbols from a powerpc binary that was 3 years in the future, it helped a bit.
Some of your file names seem eerily familiar like packet_handler and entitylist :D
The final frontier is basically having a perfect netcode before polishing up the rest, but that was already a waste of a couple 100h so far.
I only glanced over the source a bit, but it does not seem like some reliably mechanic on top is used because its TCP all the way down? Interesting... if thats the case - it seems like a "slow" choice for an MMO back then.
I wonder if they considered writing their disassembly in the 'pre-C++98 dialect of C++' used in the original, and targeting the original compiler. I've done some disassembly of binaries which ran on vintage systems, and I would've targeted the original toolchain if I could have. It's an interesting philosophical question.
I never realized this demo was in the expansion pack.
What about
- Star Wars: The Old Republic (SWTOR),
- The Elder Scrolls Online (ESO),
- Guild Wars 2 (GW2),
- EVE Online,
- Black Desert?
These files would be extremely valuable to produce a highly accurate reproduction of the Ultima Online world content.
I still have an inkling to get back into MapleStory custom servers (or other MMOs) but to be honest something about the vast open world that is empty of players is really creepy/sad/liminal to me. I'd want to take a spin at adding some "life" to the servers, even if it is just extra player-ish NPCs.
Such great memories!
I played UO a lot when younger, on Neverlands shard, and none of my friends knew how to write code for EasyUO, so I had to learn it. Good times!
That is truly honorable perseverance
> each server (so called “shards”) ran on multiple Solaris machines (the map was split by regions).
Found this 13 year old Quora commment (from https://www.quora.com/What-was-the-technology-stack-driving-...).
Ruben Cortez
Those original servers were Sun Ultra II's running Solaris. If I remember correctly, it was a dual proc box (rare in those days), 300mhz, with 256MB of ram (which we subsequently upgraded to 512MB for a boat load of cash). The server weighed a ton, and certainly wasn't rack mountable. and they cost about $30k each, making one UO shard cost about $150k (not including external storage), which is a ridiculous amount of money these days for a single shard. We eventually built MMO shards for a lot less (including MCO, TSO, ENB, and of course SWTOR) cost per shard. Back ups were kept on internal storage, for which we sweated buckets over everytime we lost a drive. we eventually centralized backups on an Hitachi Storage array that was a monster and weighed easily 100lbs and provided a whopping ~10GB of raw space.
I think where we revolutionized administration of a distributed MMO was on the network side, specifically via the VPN, which was very new at that time. Short of ordering PTP circuits all over the country and world, we used a software VPN to create those tunnels over our public internet connection at the time (a SINGLE DS3 -- it wasn't until late 1998 that we had a second circuit!) to allow for login handoff, administration, backups, publishes, etc. our hub and spoke VPN design and subsequent fully-meshed design were what made distributing shards economically feasible.
I think it was around mid 1999 when we converted to Linux, but not before using Solaris x86 first for a time. We bought Dell Towers to act as servers (Dell didn't ship a true rack-mountable server until the following year or so I think) and they were slightly better on speed than the Suns and at a much lower cost. But i think we needed more of them per shard, especially as we released expansion packs (which in those days, meant adding a new server to handle the added land mass). We were likely closer to 10 servers/shard around 2000/1.
Credit to Mark Rizzo for the architecture and buildout of the UO's backend. It was way ahead of it's time, and the innovations we mustered back then is so taken for granted these days (but isn't that true for everything?!).
That timeline for Solaris (Sparc) -> Solaris (x86) -> Linux (x86) feels very familiar from my small company developer job at the time.
1) Asheron's Call (which had a very active mod scene and now an emulator scene). I don' think the servers are nearly as popular as UO though.
2) Shadowbane (this one was heavily guild based but it was fun being a bit of an outlaw and PvPing random people and guilds).
UO was the only Ultima game I played. I got into programming doing Sphere and RunUO emulation as a kid without ever knowing about the long history of Ultima games. Assuming that all of the brilliance of UO was architected in a few year span of development. Now looking back at the series seeing all the foundations is incredible. Overnight success 20 years in the making.
Before they finally patched the hole, I used to enjoy running through crowds of high level monsters in dungeons to get a whole parade of them chasing me, then quickly casting a portal into the middle of town, usually next to the bank, then ducking behind the portal without going through, as the whole line of monsters walked towards me and popped through the portal and into town!
Also, you could tame animals to make them your pets.
So one Halloween I logged into UO, and my character had been transformed into a deer, as some kind of a sick joke! All my inventory was gone, and all I could do was deer stuff.
Then some bastard came along and TAMED ME. That totally sucked! I had to follow him around obediently all day. I guess I'm lucky he didn't skin me and make me into leather armor.
Mine too! My second one was changing the map (remove static items, add new islands and buildings, etc), and my third one was changing verdata.mul to add new animations and item graphics.
Playing Ultima Online on an unofficial POL server literally got me into IT. I was studying to be an accountant before that.
I was 12-13 at the time (late 90s/early 2000s), I can't remember the emulator anymore, very likely it was POL, and the concept behind the shard was to be as close as possible to the official servers before UO:Renaissance so we worked quite a lot to make it look and feel as T2A. I learnt a lot, later when RunUO came out and became a bit stable (circa 2003) I helped to migrate what we had done within POL to C# code for RunUO, had to learn a lot more to keep up.
The other people working on this shard were all in university studying CS, or already had jobs as programmers, I was the kid who could write some scripts, I believe having this experience was pivotal for me to later become a professional. My first job in a real tech company even came from a recommendation one of these guys made when an internship position opened.
In a way I probably only have my career because of UO and private shards.
https://drive.google.com/drive/folders/1Jw_QGpRJPGGnLUhYjVgk...
Not sure whether the exact files you’re looking for are included yet, but there are several server/client-era ISOs and backups in the archive. Might be worth digging through.
Let me know if you find anything interesting in there.
Then WoW happened.
It was a great experience when I was 14. Also caused my high school career to plummet, all I wanted to do was to keep coding for my UO server.
On the upside, I have a great job now and it's all because I followed that passion.
I can't remember all the things I did, but a couple of things I do remember:
1. Added 50-ish new spells. 2. Created an arena, where you could fight monsters of increasing difficulty and win prizes. There was another option where you could pick a specific monster and fight them in waves of increasing difficulty.
I actually have an archive with all of the scripts too. I'm a hoarder for my source code haha
May 1, 2026
After 10 years of on-and-off work, I’m releasing a full reverse-engineering of the 1998 Ultima Online demo server: https://github.com/draxinar/ouo. About 5,000 functions disassembled from MSVC x86 and translated into portable C99, with each function compared instruction-by-instruction against the binary.

For those who don’t know, Ultima Online is a 1997 MMORPG developed by Origin Systems Inc. It was one of the first commercially successful MMORPGs. The client ran on Windows and each server (so called “shards”) ran on multiple Solaris machines (the map was split by regions).
The first release of “Ultima Online: The Second Age” expansion (October 1998) shipped with a standalone Ultima Online demo (UoDemo.exe and UoDemo.dat), which bundled a client and a Windows port of the full server code and data. UoDemo.exe is dated 1998-09-02, and the server data were extracted from the production server on June 2nd, 1998. A handful of features were stubbed for the demo and the playable map was reduced to the island of Ocllo (a small NPC town off the southern coast of Britannia), but the rest is the actual production server code that was running on live UO in mid-1998. The demo featured a simple quest to kill a dragon on the island of Ocllo, with an overview of the basic game mechanisms (speech, trading, combat, etc.). Many UO server emulators reused parts of it, but so far none have ever fully reverse-engineered it.
UoDemo.exe was compiled with Microsoft Visual C++ 5.0 (Visual Studio 97), targeting a pre-C++98 dialect of C++.
I worked on this project intermittently for 10 years, until recent developments in LLMs finally made it possible to complete this seemingly never-ending task.
The class hierarchy was the most important thing to get right early on: CEntity (0x10) -> CResourceEntity (0x1C) -> CItem (0x50) -> CContainer (0x5C) -> CMobile (0x37C) -> CPlayer (0x458), with virtual dispatch through vtable slots (vtable[0x18] is IsPlayer, [0xD0] is IsMobile, [0xE4] is IsNPC, etc.). Once those layouts were nailed down, most of the binary was straightforward to translate.
The result is an almost perfect replica of a 1998 Ultima Online server, though there are some differences.
Compared to the original code, I’ve fixed stability issues (crashes, overflows, uninitialized variables, etc.) and gameplay issues (skill gain, fame/notoriety direction, spawn density, etc.). Each fix is tagged in the source, so anyone diffing against UoDemo.exe can see precisely what changed and why.
Some features were broken, like the spawn system and the decay system, probably because they were partially disabled or stubbed out specifically for the demo release: the code is intact but no live call site reaches it. Decompiling them in isolation and re-wiring the dispatch is enough to make them work again. Some data was missing too: for example, the game map only covered the island of Ocllo. I’ve written a full tooling suite to manipulate the server data formats, and fully reconstructed doors, signs, decorations, teleporters, traps, chests and spawn locations for the rest of the world.
More surprisingly, the famous retired ecology system was still present in the code, even though the functions were no longer called. I’ve re-wired the predator/prey/scavenger system, which is very cool: you can now see wolves chasing rabbits or crows eating items. However, this doesn’t implement the full resource/production system, because of the lack of precise data. See blog posts from Raph Koster about UO ecology system and UO resource system: 1, 2 and 3.
I’ve also added a few straightforward new features, like the Meditation, Stealth and Remove Trap skills, which were added by OSI in February 1999, though some early traces were already present in the code. Most of the new features can be enabled or disabled at startup using the -features parameter.
Since the account system was completely absent from the demo server, I’ve re-implemented it by guessing how the original developers would have done it, though slightly modernized.
While the demo server only supported client 1.25.33, I’ve added support for all clients from 1.25.30 up to 5.0.9.1 (2007-03-27), with and without encryption. Since there were five completely different encryption mechanisms over the years, I had to reverse-engineer each of them in the client binaries.
The original binary is 32-bit, but the default build now targets 64-bit. The class hierarchy uses C struct embedding to reproduce the original C++ inheritance, so a CMobile* can still be passed where a CContainer* is expected. Pointer widening on 64-bit would otherwise shift the inherited fields out of place, so some structs are deliberately padded to keep the inheritance and vtable layout matching the binary in both modes.

UoDemo.dat along with fixes, completed data and new features: https://github.com/draxinar/rundirI’d strongly encourage you to read the code and data, because there are innumerable little details about the internals of Ultima Online that are little known and explain a lot about its history and design.
OUO is still in early stages and many issues could be still present. Please report any issue you encounter. Contributions are highly appreciated.
Enjoy.
If anyone out there has the dynamic0.mul or dynamic0.bkp (server savegames) or regions.txt (spawn definitions) or resbank.mul (resources definitions) files from the original Ultima Online servers, circa 1997-2003, I’d be very grateful if you could send them to me. It seems very unlikely that the original dynamic0.mul or dynamic0.bkp files are truly lost, since they were surely backed up in multiple safe places.
I have all the tooling needed to strip out player data from the dynamic0.mul files to preserve privacy before distributing them.
These files would be extremely valuable to produce a highly accurate reproduction of the Ultima Online world content.