
I rebuilt World of Warcraft 1.12.1 to run directly in a web browser
Hey everyone,
For the last few months I've been working on a side project that got way bigger than I originally expected.
A few months ago I had some free time and I was messing around with a few projects. I also work a lot and at the time I was thinking about how annoying it is when you're on a laptop where you can't really install/download wow or anything like that.
At some point I had the stupid idea of basically, why not just make World of Warcraft run in the browser instead.
So that's what I've been doing.
This is a custom client for WoW 1.12.1 Build 5875, written from scratch in TypeScript. It's using WebGL2, Three.js, HTML5 Canvas, Web Audio and WebSockets and it runs directly in Chrome/Firefox without plugins, cloud streaming or running WoW.exe through WebAssembly.
For the backend I'm using a normal vMaNGOS 1.12.1 core, movement validation, combat, quests, loot, inventory, NPCs, persistence etc are still handled by the real server.
The browser is basically just a modern client.
Because browsers can't connect directly to the TCP socket WoW expects, I have a small Node.js WebSocket to TCP bridge in the middle. The actual protocol is still handled by the browser client itself, including the SRP-6 authentication, encryption, packed GUIDs, UpdateTypes, movement packets and so on.
One thing that took me way more time than expected was the graphics layer.
If you just load the old WoW assets into Three.js and use normal modern lighting it kinda looks like WoW, but at the same time it doesn't. The colors, fog and lighting feel wrong.
So I ended up comparing a lot of it with the original client and going through reversed/disassembled WoW.exe behavior.
Terrain uses the original MCAL alpha maps with 4 texture layers on the GPU, I'm matching the older gamma-space lighting as close as I can, WMO vertex colors are there, day/night lighting, distance fog etc.
I'm not really trying to remaster the game. I actually want it to keep that old look for now, this engine is highly capable to be customized.
Characters are GPU skinned from the original M2 bones and all 8 playable races with both genders are working. Weapon animations also use the original AttackAnimKits and AttackAnimTypes, so different weapons actually use their proper attack animations.
Transports are working too, which was honestly annoying to get right.
Right now I have 33 elevators using around 630 original animation nodes, and ships/zeppelins running over 8 routes.
When you're standing on a ship your character is actually moving relative to the transport, so you can walk around the deck, jump etc while the whole thing is moving.
Most of the UI is also drawn directly using HTML5 Canvas instead of having hundreds of HTML elements sitting on top of the game.
I've been recreating parts of the original Interface 11200 FrameXML/Lua UI in my own canvas system, so bags, action bars, character screen, chat, quests, merchants, stack splitting and a lot of the normal interface is already there.
At the moment I'm calling the build Alpha 1.0.
I currently have 584 tiles covering the Level 1-40 areas I've implemented in Eastern Kingdoms and Kalimdor, the major cities and also places like Deadmines, Scarlet Monastery, Wailing Caverns and Deeprun Tram.
Combat, spells, projectiles, quests, loot, vendors, trainers, professions, inventory/equipment and most of the normal PvE stuff is working now.
Audio is also there with around 3,887 sound entries and 11,514 spell sound references, plus zone music, day/night transitions and different weapon impact sounds.
Also just to get this out of the way because I know people are probably going to ask, yes, I used AI quite a lot while building this.
I'm one guy and realistically I wouldn't get anywhere near this amount of work done in a few months without it. I still review and test the code myself and I've built a lot of custom systems/pipelines around the project, but AI definitely helped me move much faster.
I recorded around 15 minutes of completely unedited freestyle gameplay where I basically just walk around, cast some spells, show random parts of the client and explain what I've done so far.
Youtube Video <- Any updates about the project will be posted here on youtube for now.
I also plan to open source the project once I clean up the extraction/build tools enough that somebody besides me can actually use them.
Just to be clear, I'm not distributing WoW.exe, Blizzard game files or game assets. Everything currently runs locally from my own files, and any future GitHub repo would only contain the code/tools I've written. People would need to provide their own game files in order for the browser client to extract its graphics layer.
There's still a lot left to polish and probably a lot of things I'm going to find are completely wrong, but at this point it's actually playable and not just another WoW browser map viewer/demo.
I'm curious what people think about it.
I'm also curious what kind of QoL changes or custom features people would want, and honestly if you think I should keep working on this.
I know some people will probably see it as pointless compared to just playing the real game, and I get that. For me it's mostly a fun and challenging project, and I still think having WoW run on basically any device without installing anything could have some interesting uses in the near future.