## 📚 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.
<details>
<summary>Gradle (Kotlin)</summary>
#### Release
```kotlin
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
```kotlin
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)
}
```
</details>
### 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.
<details open>
<summary>Adapter API Usage (Bukkit)</summary>
```java
EntityTracker tracker = BetterModel.model("demon_knight")
.map(r -> r.create(BukkitAdapter.adapt(entity), TrackerModifier.DEFAULT, t -> t.update(TrackerUpdateAction.tint(0x0026FF))))
.orElse(null);
```
</details>
<details>
<summary>Event API Usage (Bukkit)</summary>
```java
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"))
));
});
}
}
```
</details>
### 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.
<details open>
<summary>Event handling with Bukkit (Skript)</summary>
```
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()
```
</details>
### 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](https://github.com/toxicity188/BetterModel/compare/1.15.2...2.0.0)
Developer information
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle.
maven { name = "Modrinth"; url = "https://api.modrinth.com/maven" }