Meigo™ CorporationMeigo™ Corporation

What is DBetterModel


DBetterModel Omni

DBetterModel 6.0 "Omni": one jar for every BetterModel (1.15.x, 2.x, 3.x).

modrinth_vectorgithub_vectorghpages_vector

Lines of code

Discord BadgeDiscord Badge

Demo


Why 6.0

Up to 5.0 I shipped one DBetterModel release per BetterModel version. BetterModel broke its API twice (1.x → 2.x → 3.x), so that matrix kept growing and every BM update stranded someone. 6.0 replaces it with a single universal jar: it detects the installed BetterModel at startup and picks the matching compat layer.

BetterModelDBetterModel
1.15.x / 2.0.x–2.2.x / 3.x6.0.0 (single jar)

Historical table for pre-6.0 users:

BetterModel VersionLatest Supported DBetterModel Version
1.15.05.0.0
1.14.0-1.14.24.3.0
1.13.44.2.0
1.13.0-1.13.14.1.0
1.11.04.0.0
1.10.33.5.0 (abandoned, will not be released)
1.10.23.4.0
1.10.0-1.10.13.3.0
1.9.0-1.9.32.1.0
1.8.0-1.8.12.0.1
1.5.51.1.0
1.5.11.0.0

What's in 6.0

  • Universal compat core — version-neutral API with three statically compiled layers (v1/v2/v3), selected at startup. No private-field reflection anywhere. Unknown future BM majors (4.x+) get a best-effort probe instead of a crash.
  • Capability system — each layer declares what the running BetterModel can do; scripts query it with <bm.capabilities>. Anything unavailable reports a clean error instead of a stacktrace.
  • Blockbench keyframe signalsdenizen:name{key=value} instruction keyframes fire the bm animation signal Denizen event on all supported BM lines, including 1.15.x and 2.x.
  • bmsummon — location-bound models (dummy trackers) for props and cutscenes, no carrier entity needed.
  • Full event suite — 14 script events: signals, animation start/end, per-player spawn/despawn, tracker lifecycle, hitbox damage/interact, mount/dismount, reload.
  • Read/write bone API — the tags that were write-only in 5.x (glow, tint, billboard, view range, brightness, scale, offset, item...) now read back too.
  • skin bone mechanism — apply a player's skin part to a bone as an adjust (skin:[part=head;from=<player>]), the modern take on bmpart.
  • Legacy aliases restoredworld_rotation, bone bm_entity, lerp_frames work again, so 3.x/4.x-era scripts run as-is.
  • 100% backward compatible — every 5.0 script runs unchanged.
  • Experimental — a keyframe-to-script bridge and Folia-ready internals; see docs/EXPERIMENTAL.

DBetterModel vs denizen-utilities (BetterModel bridge)

Both bridge BetterModel into Denizen. Verified against denizen-utilities 2.8.x (compiled against bettermodel-bukkit-api:3.0.1); the table lists only source-verifiable differences, not a quality judgement.

DBetterModel 6.0denizen-utilities
BetterModel support1.15.x + 2.x + 3.x, one jar3.x only
BM API accesspublic API onlyreflection into a BM private field (RenderedBone.itemStack via setAccessible)
Off-thread workBukkit/region schedulersa raw new Thread + Thread.sleep(100)
Keyframe signals (bm animation signal)fire on all BM lines, incl. 1.15/2.x3.x only
Location-bound models (dummy trackers)yes — bmsummonno
Skin part → bonebmpart command and skin mechanism.skin mechanism (their bmpart is deprecated)
Mount / billboardcommands (bmmount, bmboard)mechanisms (.mount, .billboard)

Docs

Editor setup (VS Code)

The Denizen extension's script checker doesn't know DBetterModel's object types out of the box, so it flags bmentity@/bmmodel@/bmbone@ tags as unknown. Teach it: Settings (Ctrl+,) → search denizenscriptDenizenscript: Extra Sources → add

https://github.com/meigoc/dbettermodel/archive/refs/heads/main.zip

then reload the window. See the FAQ for details.

Requirements

Java21+ (Java 25 only when running BetterModel 3.x — BM 3.x itself requires it)
ServerPaper 1.21.x+
Denizen1.3.1+
BetterModel1.15.x, 2.0.x–2.2.x, or 3.x

On this page