- Other players walk the world. A watched player's motion between server updates now runs through the same grounded movement resolve as your own character — same capsule, same colliders, same step-up and ground election — so they follow terrain every frame instead of every packet, and stop at a wall instead of walking into it and being snapped back. Their jumps are swept against the world too, and a standstill jump steered mid-air reports that steer, the one mid-air press the reference client broadcasts rather than defers. - The move relay rebuilt: relayed moves ride a per-unit chain on real time, a due move never jumps ahead of its unit's queue, and SMSG_COMPRESSED_MOVES — the batched carrier the server sends under load — is decoded rather than skipped. Our own send path now matches the reference client's: facing streams while moving, Nagle is off so each packet is one write, and the strafe axis nets so left and right can never ride the same packet. - NPC and quest text speaks the whole $-macro grammar, carved from the reference bytes — your name, class and race, the gendered forms, and the server's live world states — and the same substitution feeds gossip, quest text, the quest log and unit frames. Greetings are a weighted draw, rolled per NPC per open, and a quest giver with no quest to give is no longer clickable, where it used to open a dialog holding nothing but a placeholder greeting. - Spell tooltips finish the reference's line law: cast time and cooldown behind the real passive gate, the required tool or form, the reagents block, the chance-to-X line, a multi-bit equipped-item requirement named properly instead of by raw bits, and a buff's dispel class. - The UI layout engine got a dense, reusable anchor solver, and a change gate that skips the resolve entirely on frames where no layout input moved — in practice, almost every idle frame. Pets are named by their pet number rather than a creature-template entry, so the client asks the query the server can actually answer. And the asset extractor grew a stray-geometry census for tracking down geometry that renders where it should not. This snapshot replaces the six dated `sync` commits that stood here before it, whose subjects said nothing but the date. If you cloned before now: `git fetch && git reset --hard origin/main`. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
87 lines
4.9 KiB
Markdown
87 lines
4.9 KiB
Markdown
# benilla
|
|
|
|
[](https://discord.gg/wJSJx467G4)
|
|
[](https://www.youtube.com/playlist?list=PLdCnpZNKxyb8)
|
|
[](#license)
|
|
|
|
A from-scratch **World of Warcraft 1.12.1 client** in **Rust + [Bevy](https://bevy.org)**, speaking
|
|
the vanilla protocol to a [vmangos](https://github.com/vmangos/core) server. Every file format and
|
|
the network protocol are implemented from scratch — no original client code, no third-party WoW
|
|
crates, and no bundled game assets: benilla reads its data at runtime from your own 1.12.1 install.
|
|
|
|
## What works
|
|
|
|
- **Formats & assets** — in-repo readers for the full asset stack (MPQ patch chain, BLP, DBC,
|
|
ADT/WDT/WDL, M2, WMO), wired into Bevy as an asset source, plus extraction CLI tools.
|
|
- **World** — streamed terrain with the distant horizon, portal-culled WMOs with interior lighting,
|
|
doodads and ground clutter, swimmable liquids, sky and weather, and the client's own day/night
|
|
lighting, fog, glow, and gamma passes.
|
|
- **Models & animation** — GPU-skinned M2s with the full animation controller (cross-fades,
|
|
one-shots, fidgets), a near feature-complete particle system, ribbons, and animated gameobjects
|
|
(doors, chests, mailboxes, lifts).
|
|
- **Characters** — customization end to end, the armor-region texture composite, held weapons and
|
|
sheathing, and mounts.
|
|
- **Movement & travel** — a WoW-feel controller (run/strafe/jump/swim/step-up), networked movement
|
|
in both directions, a follow-camera with collision, ridden boats and zeppelins, and taxi flights.
|
|
- **Networking** — SRP6 auth through world-session crypto, the object-descriptor mirror into the
|
|
ECS, and live wire coverage for movement, chat, spells and auras, party, mail, trade, vendors,
|
|
bank, trainers, quests, loot with group rolls, and death.
|
|
- **UI** — a from-scratch FrameXML + Lua UI engine driving the built-in interface: login and
|
|
character screens, the full HUD, the classic windows (bags, spellbook, talents, quests, mail,
|
|
merchant, trade, bank, world map, …), chat, and tooltips.
|
|
- **Combat** — melee with the faithful swing law, ranged and Auto Shot, casting with GCD, cooldowns
|
|
and the cancel ladder, and the spell-visual pipeline (kits, missiles, impacts, ground rings).
|
|
- **Audio** — music, ambience, and SFX under the client's own selection and crossfade rules, with
|
|
interior/underwater transitions and zone reverb.
|
|
|
|
## Not built yet
|
|
|
|
Guilds, the auction house, hunter/warlock pets, duels and inspect, the social panel
|
|
(friends/who), PvP systems, the macros/options/key-binding screens, and third-party addon
|
|
loading — the Lua/FrameXML engine currently runs only the built-in UI.
|
|
|
|
## Running it
|
|
|
|
You need a **1.12.1 (build 5875) client install** for game data, a
|
|
[vmangos](https://github.com/vmangos/core) server to connect to, and stable Rust.
|
|
|
|
```sh
|
|
WOW_DATA=/path/to/WoW/Data cargo run --release -p benilla
|
|
```
|
|
|
|
The server defaults to `localhost` — point `WOW_HOST` at any IP or hostname, with an optional
|
|
auth port: `WOW_HOST=play.example.com:3724`. A bare host uses port 13724 (this project's own dev
|
|
deploy); a stock vmangos `realmd` listens on 3724, so you'll usually want the explicit port.
|
|
Credentials go in at the login screen, or set `WOW_USER` / `WOW_PASS` to skip it.
|
|
|
|
## Contributing
|
|
|
|
benilla is a solo project and isn't taking pull requests for now. Bug reports and questions are
|
|
welcome — open an issue, or bring them to Discord. Comments throughout the code cite numbered
|
|
decision records and method notes from a private development log; the citations won't resolve
|
|
here, but the reasoning they carry is kept in the comments themselves.
|
|
|
|
Development happens in that private tree, and this repo is its published export: **each commit here
|
|
is one squashed snapshot** of everything that landed since the last one, titled with what changed —
|
|
not an atomic change, which is why they're large and why there are few of them.
|
|
|
|
## Acknowledgements
|
|
|
|
The [wowemulation-dev](https://github.com/wowemulation-dev) community — and
|
|
[warcraft-rs](https://github.com/wowemulation-dev/warcraft-rs) in particular — was an early
|
|
inspiration and a source of guidance on the client's file formats. benilla's readers ended up
|
|
written from scratch, but their preservation work made starting far less daunting. And none of
|
|
this runs without [vmangos](https://github.com/vmangos/core) on the other end of the socket.
|
|
|
|
## Legal
|
|
|
|
benilla is an independent, fan-made project, not affiliated with or endorsed by Blizzard
|
|
Entertainment. It contains no Blizzard code or assets and never will; you must provide your own
|
|
legally-obtained 1.12.1 client for game data. World of Warcraft is a trademark of Blizzard
|
|
Entertainment, Inc.
|
|
|
|
## License
|
|
|
|
Licensed under either of the [Apache License 2.0](LICENSE-APACHE) or the [MIT
|
|
license](LICENSE-MIT), at your option.
|