Skip to content

Releases: toxicity188/BetterModel

Patch Release 2.0.1

11 Feb 05:12
0cff60d

Choose a tag to compare

🔧 Fixes

  • player animation in NPC
  • Fabric event bus

🧹 Chores

  • chore: update kotlin to v2.3.10
  • chore: update fabric api to v0.141.3+1.21.11
  • chore: update MythicMobs to v5.11.2
  • chore: update fabric-language-kotlin to v1.13.9+kotlin.2.3.10
  • chore: update polymer-resource-pack to v0.15.2+1.21.11

Full change log

Major Release 2.0.0

31 Jan 02:44
7888b00

Choose a tag to compare

📚 Notices

Starting with this version, BetterModel is officially designated as v2.0.0.
Please be aware that this update introduces several Breaking Changes.

✨ Feats

Fabric platform port

BetterModel now supports the Fabric platform as a server-side mod.

  • Supported: Dedicated Server, Integrated Server (Singleplayer)
  • Unsupported: Hybrid servers (e.g., Arclight, Mohist)

Keyframe optimization

AnimationMovement has been deprecated and replaced by the highly optimized AnimationKeyframe.
This change introduces a more efficient data access structure, significantly improving animation processing performance.

ModelAssetsEvent

The new ModelAssetsEvent allows you to inject BlockBench models from external resources directly into the BetterModel reload pipeline.
This enables seamless integration of custom assets within the engine's internal build process.

Others

  • feat: optimize IK solver

🚀 Breaking Changes

Publishing & Dependencies

The legacy io.github.toxicity188:bettermodel package is no longer published.

Starting with v2.0.0, the project is split into the following modules:

  • bettermodel-api: Common API module.
  • bettermodel-core: Internal core module (Internal use only).
  • bettermodel-bukkit-api: API for Bukkit-based environments (Spigot, Paper, etc.).
  • bettermodel-fabric: Server-side mod implementation for Fabric.

Please refer to README.md for detailed build script instructions.

Gradle (Kotlin)

Release

repositories {
    mavenCentral()
    maven("https://maven.blamejared.com/") // For transitive dependency in bettermodel-fabric
    maven("https://maven.nucleoid.xyz/") // For transitive dependency in bettermodel-fabric
}

dependencies {
    compileOnly("io.github.toxicity188:bettermodel-bukkit-api:VERSION") // bukkit(spigot, paper, etc) api
    //modApi("io.github.toxicity188:bettermodel-fabric:VERSION") // mod(fabric)
}

Snapshot

repositories {
    maven("https://maven.pkg.github.com/toxicity188/BetterModel") {
        credentials {
            username = YOUR_GITHUB_USERNAME
            password = YOUR_GITHUB_TOKEN
        }
    }
    maven("https://maven.blamejared.com/") // For transitive dependency in bettermodel-fabric
    maven("https://maven.nucleoid.xyz/") // For transitive dependency in bettermodel-fabric
}

dependencies {
    compileOnly("io.github.toxicity188:bettermodel-bukkit-api:VERSION-SNAPSHOT") // bukkit(spigot, paper, etc) api
    //modApi("io.github.toxicity188:bettermodel-fabric:VERSION-SNAPSHOT") // mod(fabric)
}

API & Event System

  • Platform Adapters: You must now use the appropriate adapter for your platform (e.g., BukkitAdapter, FabricAdapter).
  • Event Bus: BetterModelEventBus (accessible via BetterModel#eventBus) has been introduced.
  • New Entrypoints: Dedicated entrypoints for each platform have been introduced to provide platform-specific functionalities:
    • BetterModelBukkit: Use BetterModelBukkit#platform() to access Bukkit-specific APIs.
    • BetterModelFabric: Use BetterModelFabric#platform() to access Fabric-specific APIs.
Adapter API Usage (Bukkit)
EntityTracker tracker = BetterModel.model("demon_knight")
    .map(r -> r.create(BukkitAdapter.adapt(entity), TrackerModifier.DEFAULT, t -> t.update(TrackerUpdateAction.tint(0x0026FF))))
    .orElse(null);
Event API Usage (Bukkit)
import org.bukkit.plugin.java.JavaPlugin;
import kr.toxicity.model.api.bukkit.BetterModelBukkit;
import kr.toxicity.model.api.data.ModelAsset;
import kr.toxicity.model.api.data.renderer.ModelRenderer;
import kr.toxicity.model.api.event.ModelAssetsEvent;

import java.util.*;

public class YourPlugin extends JavaPlugin {
    @Override
    public void onEnable() {
        BetterModelBukkit.platform().eventBus().subscribe(this, ModelAssetsEvent.class, event -> {
            if (event.type() == ModelRenderer.Type.PLAYER) event.addAsset(ModelAsset.of(
                "knight",
                () -> Objects.requireNonNull(getResource("knight.bbmodel"))
            ));
        });
    }
}

Bukkit-specific Event Support

While the core Event API is now platform-agnostic, you can still utilize Bukkit's Event API via BetterModelBukkitEvent.
This ensures seamless integration with the existing Bukkit event lifecycle, which is particularly useful for tools like Skript or other plugins that rely on Bukkit-native events.

Event handling with Bukkit (Skript)
import:
    kr.toxicity.model.api.bukkit.event.BetterModelBukkitEvent
    kr.toxicity.model.api.event.CreateEntityTrackerEvent

on BetterModelBukkitEvent:
    set {_original} to event.as(CreateEntityTrackerEvent.class)
    {_original} is set

    broadcast {_original}.tracker().name()

Bukkit Compatibility

To optimize the project, support for the following versions (which showed low usage) has been removed:

  • 1.20.5 ~ 1.20.6
  • 1.21.2 ~ 1.21.3

🧹 Chores

  • chore(deps): update gradle to v9.3.1
  • fix(deps): update dependency com.nexomc:nexo to v1.18.0
  • chore(deps): update plugin com.vanniktech.maven.publish to v0.36.0
  • chore: update dependency io.github.toxicity188:armormodel to v1.0.2

Full change log

Major Release 2.0.0-pre2

25 Jan 09:51
b56bfd2

Choose a tag to compare

Pre-release

📚 Notices

This is a pre-release version distributed to assist in migrating to the new API.
Content in this document is subject to change before the official 2.0.0 release.

Starting with this version, BetterModel is officially designated as v2.0.0.
Please be aware that this update introduces several Breaking Changes.

✨ Feats

Fabric platform port

BetterModel now supports the Fabric platform as a server-side mod.

  • Supported: Dedicated Server, Integrated Server (Singleplayer)
  • Unsupported: Hybrid servers (e.g., Arclight, Mohist)

Keyframe optimization

AnimationMovement has been deprecated and replaced by the highly optimized AnimationKeyframe.
This change introduces a more efficient data access structure, significantly improving animation processing performance.

ModelAssetsEvent

The new ModelAssetsEvent allows you to inject BlockBench models from external resources directly into the BetterModel reload pipeline.
This enables seamless integration of custom assets within the engine's internal build process.

🚀 Breaking Changes

Publishing & Dependencies

The legacy io.github.toxicity188:bettermodel package is no longer published.

Starting with v2.0.0, the project is split into the following modules:

  • bettermodel-api: Common API module.
  • bettermodel-core: Internal core module (Internal use only).
  • bettermodel-bukkit-api: API for Bukkit-based environments (Spigot, Paper, etc.).
  • bettermodel-fabric: Server-side mod implementation for Fabric.

Please refer to README.md for detailed build script instructions.

Gradle (Kotlin)

Release

repositories {
    mavenCentral()
    maven("https://maven.blamejared.com/") // For transitive dependency in bettermodel-fabric
    maven("https://maven.nucleoid.xyz/") // For transitive dependency in bettermodel-fabric
}

dependencies {
    compileOnly("io.github.toxicity188:bettermodel-bukkit-api:VERSION") // bukkit(spigot, paper, etc) api
    //modApi("io.github.toxicity188:bettermodel-fabric:VERSION") // mod(fabric)
}

Snapshot

repositories {
    maven("https://maven.pkg.github.com/toxicity188/BetterModel") {
        credentials {
            username = YOUR_GITHUB_USERNAME
            password = YOUR_GITHUB_TOKEN
        }
    }
    maven("https://maven.blamejared.com/") // For transitive dependency in bettermodel-fabric
    maven("https://maven.nucleoid.xyz/") // For transitive dependency in bettermodel-fabric
}

dependencies {
    compileOnly("io.github.toxicity188:bettermodel-bukkit-api:VERSION-SNAPSHOT") // bukkit(spigot, paper, etc) api
    //modApi("io.github.toxicity188:bettermodel-fabric:VERSION-SNAPSHOT") // mod(fabric)
}

API & Event System

  • Platform Adapters: You must now use the appropriate adapter for your platform (e.g., BukkitAdapter, FabricAdapter).
  • Event Bus: BetterModelEventBus (accessible via BetterModel#eventBus) has been introduced.
  • New Entrypoints: Dedicated entrypoints for each platform have been introduced to provide platform-specific functionalities:
    • BetterModelBukkit: Use BetterModelBukkit#platform() to access Bukkit-specific APIs.
    • BetterModelFabric: Use BetterModelFabric#platform() to access Fabric-specific APIs.
Adapter API Usage (Bukkit)
EntityTracker tracker = BetterModel.model("demon_knight")
    .map(r -> r.create(BukkitAdapter.adapt(entity), TrackerModifier.DEFAULT, t -> t.update(TrackerUpdateAction.tint(0x0026FF))))
    .orElse(null);
Event API Usage (Bukkit)
import org.bukkit.plugin.java.JavaPlugin;
import kr.toxicity.model.api.bukkit.BetterModelBukkit;
import kr.toxicity.model.api.data.ModelAsset;
import kr.toxicity.model.api.data.renderer.ModelRenderer;
import kr.toxicity.model.api.event.ModelAssetsEvent;

import java.util.*;

public class YourPlugin extends JavaPlugin {
    @Override
    public void onEnable() {
        BetterModelBukkit.platform().eventBus().subscribe(this, ModelAssetsEvent.class, event -> {
            if (event.type() == ModelRenderer.Type.PLAYER) event.addAsset(ModelAsset.of(
                "knight",
                () -> Objects.requireNonNull(getResource("knight.bbmodel"))
            ));
        });
    }
}

Bukkit-specific Event Support

While the core Event API is now platform-agnostic, you can still utilize Bukkit's Event API via BetterModelBukkitEvent.
This ensures seamless integration with the existing Bukkit event lifecycle, which is particularly useful for tools like Skript or other plugins that rely on Bukkit-native events.

Event handling with Bukkit (Skript)
import:
    kr.toxicity.model.api.bukkit.event.BetterModelBukkitEvent
    kr.toxicity.model.api.event.CreateEntityTrackerEvent

on BetterModelBukkitEvent:
    set {_original} to event.as(CreateEntityTrackerEvent.class)
    {_original} is set

    broadcast {_original}.tracker().name()

Bukkit Compatibility

To optimize the project, support for the following versions (which showed low usage) has been removed:

  • 1.20.5 ~ 1.20.6
  • 1.21.2 ~ 1.21.3

🧹 Chores

  • chore(deps): update gradle to v9.3.0
  • chore(deps): update plugin com.vanniktech.maven.publish to v0.36.0
  • chore: update dependency io.github.toxicity188:armormodel to v1.0.2

Full change log

Major Release 2.0.0-pre1

22 Jan 17:39
2434dd4

Choose a tag to compare

Pre-release

📚 Notices

This is a pre-release version distributed to assist in migrating to the new API.
Content in this document is subject to change before the official 2.0.0 release.

Starting with this version, BetterModel is officially designated as v2.0.0.
Please be aware that this update introduces several Breaking Changes.

✨ Feats

Fabric platform port

BetterModel now supports the Fabric platform as a server-side mod.

  • Supported: Dedicated Server, Integrated Server (Singleplayer)
  • Unsupported: Hybrid servers (e.g., Arclight, Mohist)

🚀 Breaking Changes

Publishing & Dependencies

The legacy io.github.toxicity188:bettermodel package is no longer published.

Starting with v2.0.0, the project is split into the following modules:

  • bettermodel-api: Common API module.
  • bettermodel-core: Internal core module (Internal use only).
  • bettermodel-bukkit-api: API for Bukkit-based environments (Spigot, Paper, etc.).
  • bettermodel-fabric: Server-side mod implementation for Fabric.

Please refer to README.md for detailed build script instructions.

Gradle (Kotlin)

Release

repositories {
    mavenCentral()
    maven("https://maven.blamejared.com/") // For transitive dependency in bettermodel-fabric
    maven("https://maven.nucleoid.xyz/") // For transitive dependency in bettermodel-fabric
}

dependencies {
    compileOnly("io.github.toxicity188:bettermodel-bukkit-api:VERSION") // bukkit(spigot, paper, etc) api
    //modApi("io.github.toxicity188:bettermodel-fabric:VERSION") // mod(fabric)
}

Snapshot

repositories {
    maven("https://maven.pkg.github.com/toxicity188/BetterModel") {
        credentials {
            username = YOUR_GITHUB_USERNAME
            password = YOUR_GITHUB_TOKEN
        }
    }
    maven("https://maven.blamejared.com/") // For transitive dependency in bettermodel-fabric
    maven("https://maven.nucleoid.xyz/") // For transitive dependency in bettermodel-fabric
}

dependencies {
    compileOnly("io.github.toxicity188:bettermodel-bukkit-api:VERSION-SNAPSHOT") // bukkit(spigot, paper, etc) api
    //modApi("io.github.toxicity188:bettermodel-fabric:VERSION-SNAPSHOT") // mod(fabric)
}

API & Event System

  • Platform Adapters: You must now use the appropriate adapter for your platform (e.g., BukkitAdapter, FabricAdapter).
  • Event Bus: BetterModelEventBus (accessible via BetterModel#eventBus) has been introduced. Bukkit's Event API is no longer supported.
Adapter API Usage (Bukkit)
EntityTracker tracker = BetterModel.model("demon_knight")
    .map(r -> r.create(BukkitAdapter.adapt(entity), TrackerModifier.DEFAULT, t -> t.update(TrackerUpdateAction.tint(0x0026FF))))
    .orElse(null);
Event API Usage (Bukkit)
import org.bukkit.plugin.java.JavaPlugin;
import kr.toxicity.model.api.BetterModel;
import kr.toxicity.model.api.data.ModelAsset;
import kr.toxicity.model.api.data.renderer.ModelRenderer;
import kr.toxicity.model.api.event.ModelAssetsEvent;

import java.util.*;

public class YourPlugin extends JavaPlugin {
    @Override
    public void onEnable() {
        BetterModel.eventBus().subscribe(ModelAssetsEvent.class, event -> {
            if (event.type() == ModelRenderer.Type.PLAYER) event.addAsset(ModelAsset.of(
                "knight",
                () -> Objects.requireNonNull(getResource("knight.bbmodel"))
            ));
        });
    }
}

Bukkit Compatibility

To optimize the project, support for the following versions (which showed low usage) has been removed:

  • 1.20.5 ~ 1.20.6
  • 1.21.2 ~ 1.21.3

🧹 Chores

  • chore(deps): update gradle to v9.3.0
  • chore(deps): update plugin com.vanniktech.maven.publish to v0.36.0
  • chore: update dependency io.github.toxicity188:armormodel to v1.0.2

Full change log

Patch Release 1.15.2

07 Jan 10:32
236ae46

Choose a tag to compare

🔥 Feat

  • feat: add frame time and frame interpolate in texture

🔧 Fix

  • fix: skin cache expiration
  • fix: disable EntitiesLoadEvent listener (#239)
  • fix: equality check with v6 authlib (#238)
  • fix: optimize memory allocation
  • fix: invalid type inference of compiler (#245)
  • fix: empty data save

⚡ Refactor

  • refactor: simplify and rename some code
  • refactor: clear unnecessary hitbox code

🧹 Chores

  • chore: update license to 2026
  • fix(deps): update dependency net.skinsrestorer:skinsrestorer-api to v15.9.2
  • fix(deps): update dependency com.nexomc:nexo to v1.17.0
  • fix(deps): update dependency com.gradleup.shadow:com.gradleup.shadow.gradle.plugin to v9.3.1

Full change log

Patch Release 1.15.1

26 Dec 09:29
98a5a9a

Choose a tag to compare

🔥 Feat

  • feat: per-player animation in MythicMobs state mechanic
  • feat: TrackerUpdateAction#perBone
  • feat: optimize memory usage

🔧 Fix

  • fix: model disappearance when plugin is reloaded
  • fix: mount controller strafing
  • fix: Kotlin 2.3.0 compatibility

⚡ Refactor

  • refactor: ModelManagerImpl.kt

🧹 Chores

  • chore: update Kotlin to 2.3.0
  • chore: update citizens-main to 2.0.41-SNAPSHOT
  • chore: update cloud-paper to 2.0.0-beta.14
  • fix(deps): update dependency net.kyori:adventure-api to v4.26.1
  • fix(deps): update dependency com.nexomc:nexo to v1.16.1

Full change log

Feature Release 1.15.0

09 Dec 19:02
42faee5

Choose a tag to compare

📗 Notice

Due to Mojang’s new version numbering system (e.g., 1.21.x → 26.x), the next BetterModel feature release will begin at 2.0.0 to avoid confusion with Minecraft versions.
This also marks the completion of the BetterModel 1.x series, as its core APIs and features have now reached a stable, finalized state.

Several technical questions are expected to emerge in the near future, and they may influence the evolution of BetterModel 2.0.0:

🔥 Feat

// ModelProfile#of
// Can be offline player, uuid
BetterModel.model("model").ifPresent(model -> model.create(location, ModelProfile.of(player)));
  • CommandAPI is no longer used. Now cloud is used to implement commands.
  • parallel json build
  • optimized IK
  • optimized texture load
  • BonePredicate builder
//Or chain
BonePredicate.name("hitbox")
    .or(BonePredicate.tag(BoneTags.HITBOX))
    .or(b -> b.getGroup().getMountController().canMount())
    .notSet();

//Apply with children
BonePredicate.tag(BoneTags.HEAD_WITH_CHILDREN).withChildren();
  • added 'loop_type' to '/bm limb' command
  • added 'scaling' to 'bm disguise' command

⚡ Refactor

  • ModelChildren -> ModelOutliner
  • BaseEntity
  • Float3 and Float4
  • ModelBlueprint

🔧 Fix

  • Tracker#hide on init
  • resource pack load error
  • Citizens trait
  • UV issue regarding right forearm

🧹 Chores

  • fix(deps): update dependency io.lumine:mythic-dist to v5.11.1
  • fix(deps): update dependency com.gradleup.shadow:com.gradleup.shadow.gradle.plugin to v9.3.0

Full change log

Patch Release 1.14.2

17 Nov 01:43
16fcb6d

Choose a tag to compare

🔥 Feat

  • more accurate ik rig
  • support client skin customisation for player limb (cape)

🔧 Fix

  • RenderedBone#worldPosition ('ModelPart' MythicMobs targeter)
  • 'camera' element type
  • 'bm test' command in Spigot platform
  • step interpolation
  • bezier interpolation

Full change log

Patch Release 1.14.1

10 Nov 01:02
8ad2659

Choose a tag to compare

🔥 Feat

IK rig (experimental)



Now BetterModel supports IK rig. (locator, null object)

Rotation in global space


Now animator option 'rotation in global space' is available.

Other features

  • 'brightness' script
  • namespace in MythicMobs script (bm)

🔧 Fix

  • default leather armor color
  • animation placeholder
  • exception handling in missing textures
  • stability with SkinsRestorer

Full change log

Feature Release 1.14.0

02 Nov 07:06
6f39bad

Choose a tag to compare

⚡ BetterModel 1.14.0

📗 Notice

This update introduces significant API changes to the entity adapter.
Please verify the compatibility of all plugins that depend on BetterModel.

🔥 Feat

Armor in player model (experimental)


The player model now supports vanilla armor.
Armor textures can be customized in the BetterModel/armors directory.

Global texture (global_)


Any texture prefixed with global_ is recognized as a global texture.
These textures have no namespace and can be shared between multiple models, avoiding duplicate texture creation.

Other features

  • remove image process
  • 'loop_mode' argument in /npc animate

🔧 Fix

  • move duration
  • parsing bone tag
  • NoSuchElementException in ModelAnimation

🧹 Chores

  • deps: update dependency com.github.ben-manes.caffeine:caffeine to v3.2.3
  • deps: update dependency io.github.toxicity188:dynamicuv to v1.1.0
  • deps: update gradle to v9.2.0

Full change log