Included content
| Name | |
|---|---|
v2.3.0 includes major changes to the playback engine and Mod API, including breaking changes to existing APIs and several Emote format features.
minecraft:marker.
emote field in CustomData to specify the Emote to play.emote_skin to specify the skin displayed by the mannequin.default_skin to config.json. The default skin can be specified using a Minecraft player name.participants or await_partner are no longer supported.space and the skin participant distinction.
outro.
loop_end.
loop_start to the end of the timeline.Each Emote playback creates a separate playback session. Every session is assigned a unique UUID session ID, so multiple playbacks of the same Emote still receive different IDs.
PlayResult.Success.playback().sessionId().getPlayback(player) to retrieve the player's current playback.getPlayback(sessionId) to retrieve a specific playback session.PlaybackInfo now provides more detailed information about the current playback state.
state() reports whether the session is running, closing, or fully closed.elapsedTicks() reports the total number of playback ticks elapsed since the session started.timelineTick() reports the current position within the playback timeline.position() provides the current animation, sequence step and repeat position, playback segment, and position within that segment.placement() provides the current playback root position, rotation, and placement mode.Elapsed time and timeline position are intentionally separate.
When a loop repeats or the playback position is changed, the timeline position may move backward or forward, while elapsed time continues to represent how long the session itself has been running.
Use getTimeline(sessionId) to inspect the order and duration of a playback session.
segments() includes animation, transition, wait, loop-delay, and hold segments.Running playback sessions can be moved to another playback position without restarting the session.
setTick(sessionId, tick) moves playback to a specific tick in the full timeline, including Sequence transitions and wait segments.setAnimationTick(sessionId, tick) moves to a specific tick within the currently active Animation.
false if playback is not currently inside an Animation segment.setStep(sessionId, stepIndex, repeatIndex, tick) moves to the selected Animation of a specific Sequence step and repetition.
tick specifies the position within that Animation.When seeking, the pose and timeline state required at the destination are applied. Events and commands from skipped portions of the timeline are not replayed sequentially.
When seeking into a different Animation segment, the previous segment is closed and the destination segment is started.
Seek requests made from inside a callback are applied after the current callback processing finishes.
server_sync playback does not support seeking.
The playback root can either follow the player or remain fixed at an external world position.
PlaybackPlacement.actor() uses the existing player-based placement behavior.
PlaybackPlacement.external(position, yaw) fixes the playback root to the specified world position and rotation.play(player, emoteId, placement) to specify placement when starting playback.setPlacement(sessionId, placement) to change placement without restarting playback.External placement still uses the player's current world. Player hiding behavior and playback cancellation conditions continue to apply.
Use getNodeWorldPosition(sessionId, nodeId) to retrieve the world-space origin of a node based on the current pose and playback root position and rotation.
Optional.empty() is returned.In addition to runtime Animation registration, Sequences can now also be registered at runtime.
register(animation) to register an Animation.register(sequence) to register a Sequence.
Registration can be used to inspect the registration ID and state or unregister the entry.get(emoteId) and getAll() to query registered Emotes.EmoteInfo now includes whether the Emote is an Animation or Sequence and whether it can be played directly.
For Sequences whose duration cannot be determined in advance, such as those using random selection, durationTicks() may return null.
The previous event-specific named callback system has been replaced with playback lifecycle callbacks.
registerCallbacks to register callback names and their Java implementations.callbacks array.onStartonTickonLooponCloseThe PlaybackContext passed to callbacks provides access to:
getUserState() and setUserState() can be used to store per-playback state for each callback.
API operations that modify playback state or query playback information must be performed on the server thread.
participants or await_partner are no longer supported.callbacks must be migrated to the new top-level callbacks and Java lifecycle callback system.find → getEmoteRegistration → RegistrationPlayResult, PlaybackInfo, EmoteInfo, Animation model classes, or callback types must also be updated.| Name | |
|---|---|
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:qUF0jygw:bsDMlD8R"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:qUF0jygw:bsDMlD8R"
}