A couple of my AzerothCore modules need client patches. When I unlock new race/class combinations like Gnome Priest, for example, the server accepts them fine, but the 3.3.5a client only offers them in the character creation screen if I hand it a patched CharBaseInfo.dbc. Such a patch is an MPQ archive, patch-*.MPQ, with a few DBC files inside.
Reviewing one of those was the same fiddling every time: download the MPQ, unpack it with a tool, load the DBC into a viewer, diff it against the standard version by hand. Way too much manual work for one changed row.
What is inside such a patch
MPQ is Blizzard's old archive format, basically a container with a hash table and a block table. The interesting part is what sits inside: DBC files. A DBC is a plain binary table, fixed header, fixed record size, a string block at the end. No schema in the file itself, you have to know the columns.
The most interesting one is CharBaseInfo.dbc: a tiny table of a race byte and a class byte that tells the client which combinations to offer for selection. CharStartOutfit.dbc holds the starting gear per race, class and gender. SkillRaceClassInfo.dbc is the table behind the classic "Undead Paladin can't use swords", it hands out weapon and armor skills depending on race and class.
The action
So I built a GitHub Action that automates exactly this path. It checks which .MPQ files a pull request changes, opens them, reads the file manifest and decodes the known DBCs. The result comes back as a Markdown sticky comment on the PR.
The trick that makes it useful is the diff: the decoded CharBaseInfo is held against the standard WotLK matrix, so newly unlocked combos get highlighted right away instead of me diffing a hundred rows by hand. Item IDs from the StartOutfit link to Wowhead, so you see at a glance what comes out as starting gear.
How to wire it up
You add one workflow to the repo that receives the MPQ patches:
name: Inspect MPQ patches on: pull_request_target: types: [opened, synchronize, reopened] paths: ["**/*.MPQ", "**/*.mpq"] permissions: contents: read pull-requests: write jobs: inspect: runs-on: ubuntu-latest steps: - uses: maluramichael/mpq-inspect-action@main with: pr-number: ${{ github.event.pull_request.number }}
No actions/checkout needed, the action only fetches the changed MPQ blobs through the GitHub API. It uses pull_request_target instead of pull_request because fork PRs otherwise only get a read-only token and the action could not comment at all. It is safe here because the PR's code is never checked out or executed, only the .MPQ files get parsed as data.
It lives on the GitHub Marketplace, the code and project page are at mpq-inspect-action.