This is an implementation of an Ultima Online server I've been building whilst learning Rust. I'm using it as a playground for things I've learnt and want to put into practice, and also to work out how to tackle some hard problems in Rust.
Ultima Online (UO) is a fantasy massively multiplayer online role-playing game (MMORPG) originally released in 1997. There are still official servers run by Broadsword, running a closed-source implementation. There are also a large amount of free to play servers that run on open-source, community built server implementations such as this one which emulate the behaviour of the official servers. The most popular implementations are written in C#. As far as I'm aware there aren't any existing Rust implementations. I'm hoping that my implementation will provide at least some interesting benchmarks, if not a server implementation that is adopted by the community and prolongs the life of a game that I love.
I have been documenting my progress on my public journal - see all posts tagged "UO server project". They cover my thoughts on how I've architected the server, the design decisions and some code walkthroughs.
The following list obviously isn't a complete list of tasks, just those I've completed so far and the ones I think would be most interesting and useful to tackle next:
- Basic timer logic (1df6c58)
- Add CLI to trigger test timers (dd9ab54)
- Refactor timer logic (3dc6e81, a21b024, ee83e96, 66cd327)
- Explore approaches to adding callbacks to timers and making them multi-threaded (fe86c53, 161cd3c, 25774cd, 5553241)
- Basic TCP connection handling (a1744e4, 95fdea7, 44f855b, 7bbb24a)
- Receive, parse and respond to login and shard selection packets from game client (a1744e4, 9964692, d484f7c, 8f98387)
- Non-blocking connection handling to allow multiple clients (98c3641, 1af0e99, 03042d8, 26970df)
- Packet compression for "in-game" packets (0b1e8f6)
- Refactor compression interface and module structure (08265ac, 10a5f61)
- Refactor TCP module - extract sub modules and write tests (acac0ed)
- Finalise design of timer logic then add tests and documentation
- Store connection state and associate it with timers
- Receive, parse and respond to initial "in-game" packets
- Load game world state on server startup
- Save game world state to DB at intervals