Welcome to the Hangar Open Beta. Please report any issue you encounter on GitHub!
Avatar for toxicity188

⚡ Custom 3D entity model on servers!

Report BetterModel?

Release
2.0.0

toxicity188 released BetterModel version 2.0.0 on Yesterday 2:46 AM

📚 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

Information

Published onJanuary 31, 2026
Downloads1

Platforms

Paper Paper (1.21-1.21.1, 1.21.4-1.21.11)

Dependencies

Paper Paper
Edit Plugin Dependencies: Paper