Skip to content

Releases: toxicity188/BetterModel

Feature Release 3.1.0

25 May 07:43
fef048f

Choose a tag to compare

✨ Feats

  • feat: rewrite AnimationGenerator for parallel processing of animation import
  • feat: fully obfuscating resource pack

🔧 Fixes

  • fix: initial tick of animation

🧹 Chores

  • fix(deps): update dependency io.lumine:mythic-dist to v5.12.0 by @renovate[bot] in #341
  • fix(deps): update dependency com.github.ben-manes.caffeine:caffeine to v3.2.4 by @renovate[bot] in #342
  • fix(deps): update dependency dev.yumi.gradle.licenser:dev.yumi.gradle.licenser.gradle.plugin to v4 by @renovate[bot] in #343
  • fix(deps): update dependency org.ow2.asm:asm-tree to v9.10 by @renovate[bot] in #350
  • fix(deps): update dependency io.lumine:mythic-dist to v5.12.1 by @renovate[bot] in #353
  • fix(deps): update dependency org.ow2.asm:asm-tree to v9.10.1 by @renovate[bot] in #352

Full change log

Patch Release 3.0.2

30 Apr 06:57
237b962

Choose a tag to compare

🔧 Fixes

  • fix: remove HitBoxInteractEvent, port to HitBoxInteractAtEvent
  • fix: make hitbox interaction should not be

🧹 Chores

  • chore: update fabric-api to v0.147.0+26.1.2
  • chore: update gradle to v9.5.0
  • chore: update net.fabricmc:fabric-language-kotlin to v1.13.11+kotlin.2.3.21
  • fix(deps): update dependency com.google.code.gson:gson to v2.14.0
  • fix(deps): update kotlin monorepo to v2.3.21
  • fix(deps): update dependency org.projectlombok:lombok to v1.18.46
  • chore: update ViaVersion to v5.9.0 for test server

Full change log

Patch Release 3.0.1

19 Apr 04:52
1833e53

Choose a tag to compare

🔧 Fixes

  • fix: PriorityMap

🧹 Chores

  • chore: update net.fabricmc:fabric-loader to 0.19.2
  • chore: update net.fabricmc.fabric-loom-repositories to 1.16-SNAPSHOT
  • chore: update Skript to v2.15.0 for test server
  • chore: update fabric-api to v0.146.1+26.1.2
  • chore: update eu.pb4:polymer-resource-pack to v0.16.3+26.1.2

Full change log

Major Release 3.0.0

15 Apr 06:11
291fd69

Choose a tag to compare

📚 Notices

With the official release of Minecraft 26.1, BetterModel has decided to deploy a major version update to 3.0.0.
As with 2.0.0, there are several Breaking Changes, so please take note when using it.


✨ Feats

Minecraft 26.1.x Support

From now on, BetterModel supports running on Minecraft 26.1.x Servers.


Mesh Element Support (Experiment)

We now support client resource pack conversion for Mesh Elements from BlockBench.
It is available on Minecraft clients version 26.1 and above.


Others

  • Support meg-client-mod.
  • A priority property has been added to the AnimationModifier class, allowing you to adjust the application order of animations.
  • perf: minor optimization for some method
  • refactor: remove unused code

🚀 Breaking Changes

Java 25 Usage

BetterModel is now built in a Java 25 environment, and therefore the required Java version to run it on a server has also been increased to 25.


Deobfuscation Porting

As obfuscation has been removed from the Minecraft jar starting from 26.1, tooling for mod platforms—which are most affected by mappings—has been changed.

  • bettermodel-fabric: Starting from 3.0.0, this is separated from the mod platform's API, bettermodel-mod-api.
build.gradle.kts
// Use the following dependency when referencing only the API.
// There is no need to use a separate remap configuration such as modCompileOnly.
dependencies {
    compileOnly("io.github.toxicity188:bettermodel-mod-api:3.0.0")
}
// Use this when importing all Fabric platform modules to automate test servers, etc.
// There is no need to use a separate remap configuration such as modApi.
dependencies {
    api("io.github.toxicity188:bettermodel-fabric:3.0.0")
}

Deprecation of 1.21.3 Support

To keep the project lightweight, support for versions 1.21.3 and below will be discontinued. Therefore, operation is only guaranteed on servers and clients version 1.21.4 or higher.


🔧 Fixes

  • fix: swap unsupported char to hashcode
  • fix: unnecessary decimal value (#299)
  • fix: global rot (#325)
  • fix: close limb when reloading

🧹 Chores

  • chore: update cloud
  • chore: update Purpur api
  • chore: com.vdurmont:semver4j -> org.semver4j:semver4j
  • fix(deps): update dependency com.nexomc:nexo to v1.21.0
  • chore(deps): update gradle to v9.4.1
  • fix(deps): update dependency com.gradleup.shadow:com.gradleup.shadow.gradle.plugin to v9.4.1
  • fix(deps): update dependency org.jetbrains.dokka:dokka-gradle-plugin to v2.2.0
  • fix(deps): update kotlin monorepo to v2.3.20
  • fix(deps): update dependency net.fabricmc:fabric-language-kotlin to v1.13.10+kotlin.2.3.20
  • fix(deps): update dependency net.fabricmc:fabric-loader to v0.19.1
  • fix(deps): update dependency com.modrinth.minotaur:com.modrinth.minotaur.gradle.plugin to v2.9.0
  • fix(deps): update dependency org.projectlombok:lombok to v1.18.44
  • fix(deps): update dependency net.skinsrestorer:skinsrestorer-api to v15.12.0
  • chore: update net.citizensnpcs:citizens-main to 2.0.42-SNAPSHOT
  • chore: update polymer-resource-pack to 0.16.2+26.1.1
  • fix(deps): update dependency com.google.guava:guava to v33.6.0-jre
  • fix(deps): update dependency net.kyori:adventure-platform-fabric to v6.9.0

Full change log

Feature Release 2.2.0

04 Mar 09:09
8d35ff5

Choose a tag to compare

✨ Feats

  • optimize model realtime thread (3~5x lightweight than BM 2.0.1)
  • optimize BoneName
  • add TrackerAnimation API (TrackerBuiltInAnimation, TrackerExtraAnimation)
  • remove unused class (AnimationEventHandler)
public static final TrackerAnimation<EntityTracker> DEATH = TrackerAnimation.builder("death")
    .type(EntityTracker.class)
    .modifier(tracker -> AnimationModifier.DEFAULT_WITH_PLAY_ONCE)
    .onRemove(Tracker::close)
    .onSuccess(tracker -> tracker.forRemoval(true))
    .build();

🔧 Fixes

  • Molang support in Spigot platform

🚀 Changes

  • config pack.use-obfuscation is now true by default

🧹 Chores

  • fix(deps): update dependency com.nexomc:nexo to v1.20.1
  • fix(deps): update dependency net.skinsrestorer:skinsrestorer-api to v15.10.1
  • fix(deps): update dependency com.gradleup.shadow:com.gradleup.shadow.gradle.plugin to v9.3.2

Full change log

Feature Release 2.1.0

26 Feb 03:16
9e86103

Choose a tag to compare

✨ Feats

  • optimize most of runtime calculation
  • improved body rotator
  • API Tracker#listenHitBox for handle each tracker's hitbox individually
  • new example model: blue_wizard.bbmodel
  • glow_ tag for enable light emission both of group and cube (#284)
tracker.listenHitBox(HitBoxInteractEvent.class, event -> {
    HitBox hitBox = event.getHitBox();
    // Do something with hitbox
});

🔧 Fixes

  • ik rig
  • non hide player filtering

🧹 Chores

  • fix(deps): update dependency org.bstats:bstats-bukkit to v3.2.1

Full change log

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