This is an educational project to create a server emulator for World of Warcraft patch 3.3.5 (12340) in Rust. It uses async-std to remain fully asynchronous for maximum performance. It is nowhere near playable, let alone feature complete right now. Contributions in the form of pull requests are welcome. Wrath-rs is part of a fantastic Rust WoW community. Be sure to check out awesome-wow-rust for more cool projects and a link to our Discord.
- Login and character creation.
- Getting into the world.
- Movement
- Equipment
- Creatures
Install Rust and clone the repo. In order to run the servers, wrath-rs requires a MySQL connection to manage its data. An optional docker setup for the database is available, see Dockersised Setup. Wrath-rs uses wow_messages for its type-safe message serde. When any messages are missing, we aim to add them to wow_messages and PR the changes upstream so everybody can benefit from them.
Get a MySQL server up and running. Install cargo sqlx by following these instructions
Navigate into the databases/wrath-auth-db folder, copy the .env.template file into .env and open the .env file with your favourite text editor. Change the connection data to match your local MySQL server. Create the database and run migrations through sqlx-cli commands.
cd databases/wrath-auth-db
cp .env.template .env
#modify .env file to match your database setup
cargo sqlx database create
cargo sqlx migrate run
With your favourite database browser you can now verify that the authentication database has been created and some testing accounts have been inserted to get you started. Repeat this process for the databases/wrath-realm-db folder. Verify that also the world database has been set up.
Navigate to the auth_server folder, set up the .env file from provided .env.template and you are ready to compile and run the Authentication server.
cd auth_server
cp .env.template .env
#modify .env with your favourite text editor
cargo run
Repeat these steps for the world_server folder to kick off a world server. You should now be able to log in with user test with password test using a 3.3.5(12340) game client and create your first character.
The world server depends on DBC files. You can extract these directly from a WoW client build using the included dbc-extractor tool. Set the following environment variables to specify the WoW client directory and the output directory for DBC files:
# Directory containing a WoW client
export WOTLK_PATH="/path/to/WoW-3.3.5"
# Directory where to extract DBC files
export DBC_FOLDER_PATH="/path/to/dbc"
cargo run --bin dbc-extractorAlternatively, you may use other open source tools, for example this one. After extracting the DBC files, modify the .env key DBC_FOLDER_PATH to point to the folder containing the DBC files.
Some progress on the server code may change the database tables. In that case you will have to go into the database folders and run to bring your database up to the latest structure. This will wipe your database. This shouldn't be an issue since the server is nowhere near being able to host actual players anyway.
cargo sqlx database drop
cargo sqlx database create
cargo sqlx migrate run
Hint: Windows users can run reset_db.bat to quickly reset both the authentication and world databases. This requires sqlx-cli to be correctly installed.
To bring up a MariaDB container for wrath-rs and point all .env files at the container, run the docker/docker-setup.sh file.
docker and docker-compose are required.
The setup script:
- Checks for all necessary pre-requisites (and attempts to automatically install sqlx-cli if needed).
- Sets a user-defined DB root password across all .env files, and in the MariaDB container.
- Deletes any pre-existing docker volumes (if run with
--wipe). - Runs the auth/world migrations against the new DB.
Running the world/auth servers works exactly the same way as the normal installation process, using cargo run in the auth_server and world_server folders.
Alternatively, if you just need to bring up a server quickly and don't need to input any commands or debug, you can use launch.sh in the root folder to run the auth and world servers in the same terminal.
Both the authentication server and the world server accept console commands to be typed while they're running. This is useful to control certain aspects of the servers and databases, without having to resort to third-party database editing tools. Currently available console commands are:
| Command | Description |
|---|---|
create-account <username> <password> |
Inserts a fresh user into the database with the given username and password. |
ban <username> |
Bans a user in the database (does not currently disconnect them if they're connected) |
unban <username> |
Unbans a user. |
| Command | Description |
|---|---|
exit |
Gracefully shuts down the world server. |