How ETA Works
ETA intercepts Minecraft’s text rendering pipeline via Mixin to add two separate surfaces for styled and animated text.
Two surfaces
Section titled “Two surfaces”Surface A: inline markup
ETA tags work inside any text component that Minecraft renders on the client. This includes item names, lore, signs, written books, chat messages, and translation arguments. The hooks are LiteralContentsMixin (targeting PlainTextContents.LiteralContents) and TranslatableContentsMixin (targeting TranslatableContents), both injecting into the visit method that vanilla calls when walking a component tree for rendering. StringRenderOutputMixin (targeting Font$StringRenderOutput) then intercepts each glyph’s accept call to apply per-character effects.
Because the hooks sit inside the renderer, they fire for every surface that eventually calls through Font.drawString. No special API call or server-side change is needed to get markup in item names or signs.
Surface B: immersive messages
Immersive messages are HUD popups that exist outside the normal component tree. They’re created via the /eta send command or the ImmersiveMessage Java API and rendered directly to the overlay layer. Unlike inline markup, they carry their own duration, fade-in/out, anchor, offset, text scale, background, and message-level effects. These properties have no equivalent in inline markup.
The text pipeline
Section titled “The text pipeline”When ETA processes a string of markup:
MarkupParser.parse(markup)(for inline text) orMarkupParser.parseFull(markup)(for immersive messages) splits the input into a list ofTextSpanobjects. Each span holds a text fragment plus its style properties and an effect list.- As the parser walks the tag stack it resolves nesting, applies attribute values, and attaches effect instances to each span.
parseFulladditionally strips[bracket]message tags from the string before span parsing and returns aParseResultcontaining the spans, the extractedMessageEffectlist, theMessageAttributelist, and the stripped markup string.- At render time,
StringRenderOutputMixincallsEffectApplicatorfor each character. Effects mutate the character’s position, color, alpha, or queue extra draw passes (neon glow, outline, etc.) through anEffectSettingsobject.
Where effects apply
Section titled “Where effects apply”| Surface | Inline markup tags | Layout and positioning | Message effects |
|---|---|---|---|
| Chat messages | yes | ||
| Item names | yes | ||
| Item lore | yes | ||
| Signs | yes | ||
| Written books | yes | ||
| Anvil renames | yes | ||
| Translation arguments | yes | ||
| Immersive HUD messages | yes | yes | yes |
All inline surfaces go through the same mixin hooks; only immersive HUD messages have per-message layout controls and message-level effects.