Skip to content

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 pbelatest 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.json

Where:

  • {champion} — lowercase champion alias (mordekaiser, shaco, chogath, …).
  • {N} — skin index = skinId mod 1000.
    • 82006mordekaiser / skin6
    • 35008shaco / skin8
    • 0 or base skin → skin0

Examples

SkinIDSkin binAnimation bin
Dark Star Mordekaiser82006mordekaiser/skins/skin6.bin.jsonmordekaiser/animations/skin6.bin.json
Dark Star Shaco35008shaco/skins/skin8.bin.jsonshaco/animations/skin8.bin.json
Annie skin 311031annie/skins/skin31.bin.jsonannie/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-flipbook mElements / 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 .anm path, frame rate, duration, and the mEventDataMap.
  • 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

  1. User hands you a bug on a specific skin.
  2. Fetch the skin bin and animation bin first. Targeted prompts work well with WebFetch — "list initialSubmeshToHide", "list all clip names and their .anm paths", "show JointSnapEventData entries for Joke".
  3. Decide the scope:
    • If the JSON already has the thing you need → parse/mapping bug downstream — open StaticMaterial.cs, Skin.cs, or SkinExtensions.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.
  4. 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 pbelatest to compare.

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 JointSnapEventData from 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.

Built for engineers and AI assistants working on Khada.