Recap of 2019
In this post I want to recap what was accomplished in 2019 and what will come next in 2020.
Hey folks, in this post I want to recap what was accomplished in 2019 and what will come next in 2020.
All the way to .net core
We managed to migrate the whole project to .NET Core 3 and also 3.1. This enabled some new opportunities, simplifications and optimizations in the code base.
Docker
With the help of some people of the community we managed to provide a Dockerfile and a publish images on DockerHub. Additionally, there is a docker-compose configuration to deploy a server including the postgres database with one simple command. You can find the required information in the QuickStart-Guide.
Packet Structures
In the previous posts I talked about how ref structs can be used to parse and write data into a Span<byte> and how these structs can be generated from some data on compile time. I managed to set up a XSL transformation to make that happen, changed almost all of the affected code to make use of these structs.
The first tool which benefits the most of this yet is the NetworkAnalyzer. There is no new release with it yet, however if you can compile it yourself, you‘ll be surprised how well it extracts all the available data out of the network data.
I plan to release a NuGet-Package of the Network-Assembly to make it easier to develop other network based tools for the game, too.
Plugin System
Another great addition this year was the introduction of a plugin system. It allows us to select the right plugins for each connected client separately, depending on the game client version. For the outgoing messages, I basically broke up all the „Views“ (interfaces with a lot of methods) into smaller "ViewPlugIns" which mostly only have one method and send one message. On the incoming side of data, I made a "PacketHandlerPlugIn" out of every existing "PacketHandler".
This enabled new possibilities to support other game clients than only season 6. However, the main focus is still season 6. Anyone is free to add their own plugins to support newer or older clients, though. It’s even possible to connect to the same game server and join the same game world using two different game client versions. I managed to do that with Season 6 and one of the oldest MU Online versions which you can find - 0.75. At the moment, I have no more interest in extending the 0.75 stuff, because this client is buggy as hell - nobody would ever want to play it in this state. However, in the future I also want to add support for 0.97d where more stable clients are available.
Of course, there are other use cases for plugins as well. In the code you can find several plugin extension points where custom code can be plugged into.
Ancient SimpleModulus
In order to make the server compatible with a game client of version 0.75, I also had to make the network encryption work. It turned out that this version used the very first variant of the SimpleModulus algorithm. After banging my head on the keyboard a few times I managed to find out that this variant uses a much bigger block size than the newer variant. With some luck, I managed to decrypt the client side encryption keys and calculated the server side ones after I adapted the key generator.
This all also helped me to better understand the algorithm, so I implemented some minor improvements to support longer keys with the same code base, too.
Quest System - In progress
To get some game features done, I started to begin implementing the quest system. It’s currently still incomplete. The first thing which was done is defining all the required network message structures and implementing the corresponding View- and PacketHandler-Plugins. Then I went further and tried to make some sense out of packets I captured a decade ago on the original Global MU Online server and implemented some of the game logic.
Now, what’s missing is the initialization data for all the available quests and a lot of testing ;)
Outlook for 2020 and beyond
Disclaimer: I have a lot of ideas for the future, but unfortunately I lack of time. This will probably even get worse because I got a new job starting with this year which will need my full focus. I still hope to get something nice done this year.
My goals for this year are:
- Stabilizing and getting the Network-NuGet out
- Release of an updated Network Analyzer
- Completion of the Quest System
- Getting other game features done which are lurking around in the GitHub issues
- Simplifying/Modularization of the server -> Public API