Gadgets are streamed alongside monsters now, so chests and ore nodes show up in the world and can be interacted with. The two flows differ: for a chest the client sends the finish request itself and the loot is granted on that one, for ore it sends nothing more so the server has to close everything on the first request. Artifacts used to be silently dropped on the floor because the item ids that actually roll were not in the reliquary table at all. Added the missing rows and gave them real main stat and substat rolls instead of the fixed four. Dropped items survive a relogin. The inventory is still rebuilt from the tables on every login, so the trick is to remember where the default set ends and only persist what was found in the world. Gacha and shop weapons were disappearing the same way and are fixed by the same change. |
||
|---|---|---|
| Yuanshen.Common | ||
| Yuanshen.Gameserver | ||
| Yuanshen.Kcp | ||
| Yuanshen.Proto | ||
| Yuanshen.SDK | ||
| .gitignore | ||
| LICENSE | ||
| message-names-0.9.txt | ||
| README.md | ||
| THIRD-PARTY-NOTICES.md | ||
| Yuanshen.sln | ||
yuanshen
A private server for Genshin Impact 0.9.10 (CBT3), written from scratch in C#.
I started this to figure out how the client actually talks to its server, and it grew from "can I get past the login screen" into something you can walk around in. You can log in, run around Mondstadt, kill hilichurls, buy things and pull on a banner. Plenty is still missing.
What's in here
Yuanshen.Gameserveris the KCP server. Packet dispatch, scenes, combat, gacha, shop, GM commands.Yuanshen.SDKis a small HTTP server on 8899 for the login flow, plus a wish history page.Yuanshen.Protoholds the generated protobuf types and the CmdType table.Yuanshen.Commonhas excel loading and the shared console stuff.Yuanshen.Kcpis a vendored copy of KcpSharp. See THIRD-PARTY-NOTICES.md.
Getting it running
.NET 10 and a PostgreSQL somewhere. Both servers read their connection string from
appsettings.json and default to postgres/postgres on localhost. That is a local dev default,
not a leaked password, but change it if your setup is different.
dotnet build Yuanshen.sln
Start the SDK first, then the gameserver, then a patched client. The gameserver console takes
GM commands directly, /help lists them.
About the game data
Everything under Yuanshen.Gameserver/assets came out of the client rather than being typed
by hand. The excel tables live in a packed bin container that turns out to be a single byte
XOR, with the key derived from the version string, and the monster spawn points come out of
the compiled Lua scene scripts.
One thing you'll notice: items show up as ids and weapon types instead of names. The client only ships text map hashes, and there is no text map in the build, so there is nothing to resolve names against yet.
State of things
Working: login, world streaming, movement, monsters and combat, gacha with pity and the 50/50, shop, wish history.
Not done: quests, dungeons, co-op, chests and world drops.
This is a reverse engineering project for learning. It is not affiliated with miHoYo and it is not trying to be a playable replacement for the real game.