CommunityDragon raw bin.json — fast per-skin investigation
When you need to know what a specific skin or animation actually contains, the fastest path is almost never "unpack a WAD, run the extractor, eyeball the GLB". It's to fetch CommunityDragon's pre-parsed bin.json for that skin and read the JSON directly.
This is the base data source for every extractor bug investigation. If the bug reproduces in the JSON, it's a parse/mapping bug in our code. If the JSON looks right but our output doesn't, the bug is downstream of parsing.
URL pattern
Swap pbe → latest for live servers.
# Skin bin (mesh → material, submesh visibility, hidden submeshes, material overrides)
https://raw.communitydragon.org/pbe/game/data/characters/{champion}/skins/skin{N}.bin.json
# Animation bin (animation graph, clips, frame durations, events)
https://raw.communitydragon.org/pbe/game/data/characters/{champion}/animations/skin{N}.bin.jsonWhere:
{champion}— lowercase champion alias (mordekaiser,shaco,chogath, …).{N}— skin index =skinId mod 1000.82006→mordekaiser / skin635008→shaco / skin80or base skin →skin0
Examples
| Skin | ID | Skin bin | Animation bin |
|---|---|---|---|
| Dark Star Mordekaiser | 82006 | mordekaiser/skins/skin6.bin.json | mordekaiser/animations/skin6.bin.json |
| Dark Star Shaco | 35008 | shaco/skins/skin8.bin.json | shaco/animations/skin8.bin.json |
| Annie skin 31 | 1031 | annie/skins/skin31.bin.json | annie/animations/skin31.bin.json |
What's in the skin bin
The top-level object is the skin's property-bin (PROP) tree, pre-resolved against metaclass definitions. Useful fields you'll look at most:
skinMeshProperties— top-level container for mesh geometry references (.skn), rig (.skl), texture paths.materialOverride— per-submesh{ submesh, material, texture }overrides that replace the base skin's defaults.initialSubmeshToHide— space- or pipe-delimited list of submeshes that start invisible. Load-bearing for VFX attachments (NoodleVfx, poro, etc.).skinMeshProperties.skinScale— champion-relative scale. Mismatch here is a frequent root cause of "mesh too big" bugs.mContextualActionData— recall, homeguard, and contextual emote wiring.dynamicMaterial.parameters[]— shader parameter drivers, including TFT keyframe-flipbookmElements/mDrivers(see TFT_UV_Shift).
Property names render as strings when they're in the metaclass dictionary and as 0xDEADBEEF when they aren't — same as Ritobin.
What's in the animation bin
Typically rooted at an AnimationGraphData object with:
mClipDataMap— map of clip hashes → clip entries. Each clip entry holds the.anmpath, frame rate, duration, and themEventDataMap.mEventDataMap— event payloads keyed by metaclass hash. The important ones:3049371309=JointSnapEventData— the joint-world-override events we bake at extract time.- Flipbook frame events for animation-synced flipbooks.
- Submesh visibility events.
mAnimationResourceData— the blend tree and state machine that drive clip selection.
How to use it in practice
- User hands you a bug on a specific skin.
- Fetch the skin bin and animation bin first. Targeted prompts work well with WebFetch — "list
initialSubmeshToHide", "list all clip names and their.anmpaths", "showJointSnapEventDataentries for Joke". - Decide the scope:
- If the JSON already has the thing you need → parse/mapping bug downstream — open
StaticMaterial.cs,Skin.cs, orSkinExtensions.cs. - If the JSON doesn't show the behavior at all → it isn't in the data — check if it's a different animation clip, a different skin, or a different mechanism entirely.
- If the JSON already has the thing you need → parse/mapping bug downstream — open
- Only after that, spin up the extractor.
Why this beats running the extractor
- No build, no download, no hashtable refresh, no Python interpreter dance.
- Pre-resolved property names — you don't need our local binhashes overlay.
- Works in a browser; easy to share a URL with a teammate.
- PBE and live both available; flip
pbe↔latestto compare.
Related paths on CommunityDragon
The root of the data tree is https://raw.communitydragon.org/{branch}/game/data/characters/{champion}/ — useful paths below that:
{champion}.bin.json— champion-level record (stats, abilities, base skin wiring).skins/skin{N}.bin.json— skin-specific overrides (this page's focus).animations/skin{N}.bin.json— per-skin animation graph (this page's focus).particles/*.bin.json— per-skin particle systems.
Hash dictionaries also live on CommunityDragon:
https://raw.communitydragon.org/data/hashes/lol/hashes.game.txt(xxHash64 → WAD paths)https://raw.communitydragon.org/data/hashes/lol/hashes.binhashes.txt(FNV-1a → BIN property/class names)https://raw.communitydragon.org/data/hashes/lol/hashes.lcu.txt(LCU-side paths)
Our HashTables.TryLoadHashes pulls the first two on first run.
See also
- File formats — BIN for what the raw binary looks like before CDragon parses it.
- Onboarding — the "first-hour tours" mention this as the go-to debugging entry point.
- Skeletons & Animations for how we consume
JointSnapEventDatafrom the animation bin. wadtools— when you actually need to pull a raw chunk from a WAD instead of a parsed bin, this Rust CLI is the fast path.