{"id":23676376,"url":"https://github.com/toxicity188/bettermodel","last_synced_at":"2026-04-19T06:16:46.066Z","repository":{"id":269021040,"uuid":"904843107","full_name":"toxicity188/BetterModel","owner":"toxicity188","description":"Modern Bedrock model engine for Minecraft Java Edition","archived":false,"fork":false,"pushed_at":"2026-02-08T00:49:08.000Z","size":6095,"stargazers_count":243,"open_issues_count":34,"forks_count":40,"subscribers_count":2,"default_branch":"v2","last_synced_at":"2026-02-08T09:24:32.623Z","etag":null,"topics":["blockbench","bukkit-plugin","fabric-mod","fabric-server","folia-plugin","java","kotlin","minecraft","minecraft-mod","minecraft-model","minecraft-plugin","modelengine","paper-plugin","resource-pack","spigot-plugin"],"latest_commit_sha":null,"homepage":"https://modrinth.com/plugin/bettermodel","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/toxicity188.png","metadata":{"files":{"readme":"README.md","changelog":"changelog/2.0.1.md","contributing":".github/CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":{"github":["toxicity188"],"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":"toxicity188","thanks_dev":null,"custom":null}},"created_at":"2024-12-17T16:51:37.000Z","updated_at":"2026-02-08T02:11:59.000Z","dependencies_parsed_at":"2025-01-11T17:43:35.542Z","dependency_job_id":"887266d9-448c-4f71-8e7e-c1390650c051","html_url":"https://github.com/toxicity188/BetterModel","commit_stats":null,"previous_names":["toxicity188/modelrenderer","toxicity188/bettermodel"],"tags_count":54,"template":false,"template_full_name":null,"purl":"pkg:github/toxicity188/BetterModel","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/toxicity188%2FBetterModel","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/toxicity188%2FBetterModel/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/toxicity188%2FBetterModel/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/toxicity188%2FBetterModel/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/toxicity188","download_url":"https://codeload.github.com/toxicity188/BetterModel/tar.gz/refs/heads/v2","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/toxicity188%2FBetterModel/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29329492,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-11T06:13:03.264Z","status":"ssl_error","status_checked_at":"2026-02-11T06:12:55.843Z","response_time":97,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blockbench","bukkit-plugin","fabric-mod","fabric-server","folia-plugin","java","kotlin","minecraft","minecraft-mod","minecraft-model","minecraft-plugin","modelengine","paper-plugin","resource-pack","spigot-plugin"],"created_at":"2024-12-29T14:46:32.545Z","updated_at":"2026-02-11T07:14:52.843Z","avatar_url":"https://github.com/toxicity188.png","language":"Kotlin","funding_links":["https://github.com/sponsors/toxicity188","https://buymeacoffee.com/toxicity188","https://www.paypal.com/paypalme/toxicity188?country.x=KR\u0026locale.x=en_US"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n![](https://github.com/user-attachments/assets/89e191ba-ed4f-44ab-bb98-634cfe568dca)\n\n# BetterModel\n*- Modern Bedrock model engine for Minecraft Java Edition -*\n\n[![](https://img.shields.io/maven-central/v/io.github.toxicity188/bettermodel-api?style=flat-square\u0026logo=sonatype)](https://central.sonatype.com/artifact/io.github.toxicity188/bettermodel-api)\n[![](https://www.codefactor.io/repository/github/toxicity188/bettermodel/badge?style=flat-square)](https://www.codefactor.io/repository/github/toxicity188/bettermodel)\n[![](https://img.shields.io/github/actions/workflow/status/toxicity188/BetterModel/publish.yml?style=flat-square)](https://modrinth.com/plugin/bettermodel/versions)\n[![](https://img.shields.io/github/issues/toxicity188/BetterModel?style=flat-square\u0026logo=github)](https://github.com/toxicity188/BetterModel/issues)\n[![](https://img.shields.io/bstats/servers/24237?style=flat-square)](https://bstats.org/plugin/bukkit/BetterModel/24237)\n\n\u003c/div\u003e\n\n* * *\n![](https://github.com/user-attachments/assets/5a6c1a8c-6fe2-4a67-a10e-e63e40825d35)\n![](https://github.com/user-attachments/assets/ff515577-6a72-48ba-9943-81f00dddb375)\n\n* * *\n\u003csub\u003e(In BlockBench / In Minecraft)\u003c/sub\u003e\n\n# ✨ Introduction\n\n**BetterModel** is a server-based engine that provides runtime BlockBench model rendering \u0026 animating for Minecraft Java Edition.\n\nIt implements **fully server-side 3D models** by using an item display entity packet.\n\n- Importing Generic BlockBench model `.bbmodel`\n- Auto-generating resource pack\n- Playing animation\n- Syncing with base entity\n- Custom hit box\n- 12-limb player animation\n\n\u003cdetails\u003e\n\u003csummary\u003eIn-Game Screenshots\u003c/summary\u003e\n\n![](https://github.com/user-attachments/assets/b4e69aef-a446-4ac3-b84e-eb42fe4f069d)  \n![](https://github.com/user-attachments/assets/94aee9ed-9c2f-4975-92c4-3ea84ae31d24)  \n![](https://github.com/user-attachments/assets/eb2d64ef-7b6e-4306-8c31-d92d0266dbac)  \n![](https://github.com/user-attachments/assets/034dd64c-6889-4a01-961d-e69679b1c71b)\n\u003c/details\u003e\n\n## 🚀 Key Features \u0026 Focus\nBetterModel aims to be a reliable engine that provides stable, high-quality animations for Paper-based high-traffic servers.\n\n- **Stability First**: We take a conservative approach to feature expansion. By avoiding the implementation of features that are difficult to maintain or have limited use cases, we focus on providing a stable API and ensuring overall operational safety.\n- **Performance Optimized**: Our goal is to minimize runtime computation, memory footprint, and network overhead. Through asynchronous design and optimized packet handling, we ensure the engine runs efficiently even under heavy server loads.\n- **Tailored for Large-scale Servers**: We provide essential features specifically designed for high-population servers and MMORPG content creation.\n  - **Per-player Animation**: Individual animation control tailored to each player's perspective.\n  - **Player Model Animation**: Support for sophisticated 12-limb animations based on player models.\n\n## 📚 Wiki\n[![](https://img.shields.io/badge/GitHub%20Wiki-181717?logo=github\u0026logoColor=white)](https://github.com/toxicity188/BetterModel/wiki)\n[![](https://deepwiki.com/badge.svg)](https://deepwiki.com/toxicity188/BetterModel)\n\n## 🛠️ Build info\n\n[![](https://img.shields.io/badge/minecraft-1.21%7E1.21.11-8FCA5C)](https://www.minecraft.net/en-us/download/server)\n[![](https://img.shields.io/badge/java-21%7E-ED8B00)](https://adoptium.net/)\n\n#### Build\n[![](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy/built-with/gradle_vector.svg)](https://gradle.org/)\n\n`./gradlew build`: Builds all jars  \n`./gradlew shadowJar`: Builds plugin jar  \n`./gradlew javadocJar`: Builds javadoc jar  \n`./gradlew runServer`: Runs Paper test server with test plugin\n\n#### Library\n- [Kotlin stdlib](https://github.com/JetBrains/kotlin): modern functional programming\n- [semver4j](https://github.com/vdurmont/semver4j): semver parser\n- [cloud](https://github.com/Incendo/cloud-minecraft): command\n- [adventure](https://github.com/KyoriPowered/adventure): component\n- [stable player display](https://github.com/bradleyq/stable_player_display): player animation\n- [caffeine](https://github.com/ben-manes/caffeine): concurrent map cache\n- [DynamicUV](https://github.com/toxicity188/DynamicUV): player model\n- [ArmorModel](https://github.com/toxicity188/ArmorModel): armor in player model\n- [molang-compiler](https://github.com/Ocelot5836/molang-compiler): compiling and evaluating molang expression\n- [libby](https://github.com/AlessioDP/libby): runtime library downloader\n\n#### Tested Bukkit Server Platform\n- [Paper](https://papermc.io/downloads/paper)\n- [Purpur](https://purpurmc.org/download/purpur)\n- [Spigot](https://www.spigotmc.org/)\n- [Folia](https://papermc.io/downloads/folia)\n- [Leaf](https://www.leafmc.one/download)\n- [Canvas](https://canvasmc.io/downloads/canvas)\n\n#### Tested Mod Server Platform\n- [Fabric Loader](https://fabricmc.net/)\n\n## 💻 API\n\n[![](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy/available/maven-central_vector.svg)](https://central.sonatype.com/artifact/io.github.toxicity188/bettermodel)\n\n\u003e [!NOTE]\\\n\u003e For more detailed API specifications, please refer to our [GitHub Wiki](https://github.com/toxicity188/BetterModel/wiki/API-example).\n\n\u003cdetails open\u003e\n\u003csummary\u003eGradle (Kotlin)\u003c/summary\u003e\n\n#### Release\n```kotlin\nrepositories {\n    mavenCentral()\n    maven(\"https://maven.blamejared.com/\") // For transitive dependency in bettermodel-fabric\n    maven(\"https://maven.nucleoid.xyz/\") // For transitive dependency in bettermodel-fabric\n}\n\ndependencies {\n    compileOnly(\"io.github.toxicity188:bettermodel-bukkit-api:VERSION\") // bukkit(spigot, paper, etc) api\n    //modApi(\"io.github.toxicity188:bettermodel-fabric:VERSION\") // mod(fabric)\n}\n```\n\n#### Snapshot\n```kotlin\nrepositories {\n    maven(\"https://maven.pkg.github.com/toxicity188/BetterModel\") {\n        credentials {\n            username = YOUR_GITHUB_USERNAME\n            password = YOUR_GITHUB_TOKEN\n        }\n    }\n    maven(\"https://maven.blamejared.com/\") // For transitive dependency in bettermodel-fabric\n    maven(\"https://maven.nucleoid.xyz/\") // For transitive dependency in bettermodel-fabric\n}\n\ndependencies {\n    compileOnly(\"io.github.toxicity188:bettermodel-bukkit-api:VERSION-SNAPSHOT\") // bukkit(spigot, paper, etc) api\n    //modApi(\"io.github.toxicity188:bettermodel-fabric:VERSION-SNAPSHOT\") // mod(fabric)\n}\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eGradle (Groovy)\u003c/summary\u003e\n\n#### Release\n```groovy\nrepositories {\n    mavenCentral()\n    maven 'https://maven.blamejared.com/' // For transitive dependency in bettermodel-fabric\n    maven 'https://maven.nucleoid.xyz/' // For transitive dependency in bettermodel-fabric\n}\n\ndependencies {\n    compileOnly 'io.github.toxicity188:bettermodel-bukkit-api:VERSION' // bukkit(spigot, paper, etc) api\n    //modApi 'io.github.toxicity188:bettermodel-fabric:VERSION' // mod(fabric)\n}\n```\n\n#### Snapshot\n```groovy\nrepositories {\n    maven {\n        url \"https://maven.pkg.github.com/toxicity188/BetterModel\"\n        credentials {\n            username = YOUR_GITHUB_USERNAME\n            password = YOUR_GITHUB_TOKEN\n        }\n    }\n    maven 'https://maven.blamejared.com/' // For transitive dependency in bettermodel-fabric\n    maven 'https://maven.nucleoid.xyz/' // For transitive dependency in bettermodel-fabric\n}\n\ndependencies {\n    compileOnly 'io.github.toxicity188:bettermodel-bukkit-api:VERSION-SNAPSHOT' // bukkit(spigot, paper, etc) api\n    //modApi 'io.github.toxicity188:bettermodel-fabric:VERSION-SNAPSHOT' // mod(fabric)\n}\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eMaven\u003c/summary\u003e\n\n#### Release\n```xml\n\u003crepositories\u003e\n    \u003crepository\u003e\n        \u003cid\u003ecentral\u003c/id\u003e\n        \u003curl\u003ehttps://repo.maven.apache.org/maven2\u003c/url\u003e\n    \u003c/repository\u003e\n\u003c/repositories\u003e\n\n\u003cdependencies\u003e\n    \u003cdependency\u003e\n        \u003cgroupId\u003eio.github.toxicity188\u003c/groupId\u003e\n        \u003cartifactId\u003ebettermodel-bukkit-api\u003c/artifactId\u003e\n        \u003cversion\u003eVERSION\u003c/version\u003e\n        \u003cscope\u003eprovided\u003c/scope\u003e\n    \u003c/dependency\u003e\n\u003c/dependencies\u003e\n```\n\n#### Snapshot\n```xml\n\u003crepositories\u003e\n    \u003crepository\u003e\n        \u003cid\u003egithub\u003c/id\u003e\n        \u003curl\u003ehttps://maven.pkg.github.com/toxicity188/BetterModel\u003c/url\u003e\n    \u003c/repository\u003e\n\u003c/repositories\u003e\n\n\u003cdependencies\u003e\n    \u003cdependency\u003e\n        \u003cgroupId\u003eio.github.toxicity188\u003c/groupId\u003e\n        \u003cartifactId\u003ebettermodel-api\u003c/artifactId\u003e\n        \u003cversion\u003eVERSION-SNAPSHOT\u003c/version\u003e\n        \u003cscope\u003eprovided\u003c/scope\u003e\n    \u003c/dependency\u003e\n    \u003cdependency\u003e\n        \u003cgroupId\u003eio.github.toxicity188\u003c/groupId\u003e\n        \u003cartifactId\u003ebettermodel-bukkit-api\u003c/artifactId\u003e\n        \u003cversion\u003eVERSION-SNAPSHOT\u003c/version\u003e\n        \u003cscope\u003eprovided\u003c/scope\u003e\n    \u003c/dependency\u003e\n\u003c/dependencies\u003e\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eExample code\u003c/summary\u003e\n\n#### Gets some model or limb\n```java\nBetterModel.model(\"demon_knight\"); //A model file in BetterModel/models (for general model with saving)\nBetterModel.limb(\"steve\"); //A model file in BetterModel/players (for player model with no saveing)\n\nBetterModel.modelOrNull(\"demon_knight\"); //general model or null\nBetterModel.limbOrNull(\"steve\"); //player model or null\n```\n\n#### Creates model (entity)\n```java\nEntityTracker tracker = BetterModel.model(\"demon_knight\")\n    .map(r -\u003e r.getOrCreate(BukkitAdapter.adapt(entity))) //Gets or creates entity tracker by this renderer to some entity.\n    .orElse(null);\n```\n```java\nEntityTracker tracker = BetterModel.model(\"demon_knight\")\n    .map(r -\u003e r.create(BukkitAdapter.adapt(entity), TrackerModifier.DEFAULT, t -\u003e t.update(TrackerUpdateAction.tint(0x0026FF)))) //Creates entity tracker with pre-spawn task.\n    .orElse(null);\n```\n\n#### Creates model (dummy)\n```java\nDummyTracker tracker = BetterModel.model(\"demon_knight\")\n    .map(r -\u003e r.create(BukkitAdapter.adapt(location))) //Creates some dummy tracker to this location.\n    .orElse(null);\n```\n```java\nDummyTracker tracker = BetterModel.limb(\"steve\")\n    .map(r -\u003e r.create(BukkitAdapter.adapt(location), ModelProfile.of(BukkitAdapter.adapt(player)))) //Creates some dummy tracker to this location and player's skin profile.\n    .orElse(null);\n```\n\n#### Update some tracker's display data\n```java\nBetterModel.model(\"demon_knight\")\n    .map(r -\u003e r.create(BukkitAdapter.adapt(entity), TrackerModifier.DEFAULT, t -\u003e {\n        t.update(TrackerUpdateAction.tint(rgb)); //Tint\n        t.update(TrackerUpdateAction.enchant(true), bone -\u003e true); //Enchant with predicate\n    }))\n    .ifPresent(tracker -\u003e tracker.update(TrackerUpdateAction.composite( //Composite\n        TrackerUpdateAction.brightness(15, 15)  //Brightness\n        TrackerUpdateAction.billboard(Display.Billboard.CENTER) //Billboard\n    )));\n}\n```\n\n\u003c/details\u003e\n\n## 💬 Community\n[![](https://discord.com/api/guilds/1012718460297551943/widget.png?style=banner2)](https://discord.com/invite/rePyFESDbk)\n\n## 💖 Support\n[![](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy/donate/buymeacoffee-singular_vector.svg)](https://buymeacoffee.com/toxicity188)\n[![](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy/donate/ghsponsors-singular_vector.svg)](https://github.com/sponsors/toxicity188)\n[![](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy/donate/paypal-singular_vector.svg)](https://www.paypal.com/paypalme/toxicity188?country.x=KR\u0026locale.x=en_US)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftoxicity188%2Fbettermodel","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftoxicity188%2Fbettermodel","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftoxicity188%2Fbettermodel/lists"}