Tags
Creators
Details
All versions
0.9.0
Release
0.9.0last week 26
Compatibility
Minecraft: Java Edition
1.7.10
Platform
Forge
Supported environments
Client and server
Required content
Any compatible version
Changes
CatFrame - 0.9.0
What is changed?
Change version number from previous to 0.9.0
➕Add:
- Restore FMLCorePluginContainsFMLMod manifest attribute: the Mixin FML legacy agent adds tweaker jars outside the boot class path to FML's reparseable coremods collection, which prevents class path discovery from producing a duplicate mod container next to the mods directory discovery; also document the mechanism in the build file
- Replace Entry construction reflection with an access transformer: add META-INF/catframe_at.cfg opening ResourcePackRepository(ResourcePackRepository, File), rewrite BuiltinPackInjector.createEntry to call repository.new Entry(file) directly and drop findEntryConstructor/describeConstructors
- Add BuiltinPackBootstrap: on the first vanilla refreshResources after preInit (Loader INITIALIZATION), rebuild the repository and restore enabled state from options, so packs registered by ordinary mods in preInit/postInit are live on the same launch; wire MixinMinecraftRefreshResources into Mixins.NormalMixin.BUILTIN_PACK_BOOTSTRAP; sync BuiltinPackRegistry javadoc and builtin pack guide
- Add built-in resource pack usage guide (markdown/docs/BUILTIN_RESOURCE_PACKS.md) covering descriptor registration, asset layout, translation keys, lifecycle and player-side steps; correct BuiltinPackRegistry javadoc: the persisted enabled state is restored on launch only when the registration runs before the repository's first build (coremod stage)
- Complete the Text component chain: FormattedText-style traversal API (visit/toFlatList/decompose) decomposing %s templates while preserving embedded component styles; translatableWithFallback plus side-agnostic StatCollector lookup replacing client-only I18n; segment-based legacy flattening with same-style run merging; Serializer fallback field, component-preserving with args and robust hover parsing; Style.getRawFlag for tri-state flags; new VanillaChatAdapter bridging Text<->IChatComponent both ways; FontHelper full-tree rendering so nested styles survive
- Move structural tooltip chain to core.tooltip mirroring 26.1.2 common/client layering: relocate TooltipComponent marker and ItemTooltipImages registry out of ui.tooltip (client renderers stay there), update imports in GuiGraphicsExtractor, Tooltip, AbstractContainerScreen and ClientTooltipComponent, and document the addInformation + ItemTooltipEvent legacy-hook compatibility guaranteed via the ItemStack#getTooltip delegation.
- Wire tooltip component dispatch and item tooltip integration: add ClientTooltipComponent.create dispatch table with register API, ItemTooltipImages provider registry, TOOLTIP_STYLE data component, ItemStack/component setTooltipForNextFrame overloads, Screen.getTooltipFromItem, and container-screen extractTooltip with vanilla renderToolTip suppression
- FeatureRenderDispatcher newPartContext construction, the four overriders
- Add OverlayNetwork: SimpleNetworkWrapper channel (name: catframe)
- Add PacketTitleOverlay: S2C packet with Action enum, JSON text, timing
- Add PacketTitleOverlayHandler: client handler delegating to Title API
- Add Text.toJson()/toJsonElement(): Text tree → JSON serialisation
- Add server usage and noTargets localization keys
- Serverize Title/ActionBar: add S2C network channel, server-side /cftitle command, and client auto-forwarding
- Add CatFrameNetwork: SimpleNetworkWrapper channel registration
- Add PacketTitleOverlay: S2C packet (IMessage) with Action enum, JSON text, and timing fields
- Add PacketTitleOverlayHandler: client-side handler delegating to Title/ActionBar API
- Add CommandTitleServer: server-side OP command (level 2) with full /title syntax, multi-target selector support via PlayerSelector.matchPlayers
- Add Text.toJson()/toJsonElement(): serialize Text tree back to JSON for network transmission
- Add en_us/zh_cn localization keys for /cftitle command feedback messages
- under the new signature)
- FeatureRenderDispatcher: builds one submission-level RenderContext per-submit (newPartContext: quad=null, shade placeholder 1.0f, submission-level
- Add the license of redistribution jars
🔧Fix:
- Fix NoClassDefFoundError on production clients: the early coremod constructor resolved ICommand before FML installed the deobfuscation remapper, poisoning LaunchClassLoader.invalidClasses. Move built-in example pack registration from CatFrameEarlyMixinPlugin to CatFrame.preInit behind the new enableBuiltinExampleResource config; regroup middle mixins into event/render subpackages; bump version to 0.9.0.
- Add built-in resource pack framework (coremod seeding, repository/GUI early mixins) and split mixin declarations into Mixins.EarlyMixin (Phase.EARLY) and Mixins.NormalMixin (phase null); remove static arrays from mixins.catframe.json and resolve regular mixins via IMixins.getMixins in CatFrameMixinPlugin
- Add CommandTitleServer: server-side /title command (OP level 2), resolves
@a/@p/@r/@sand player names via PlayerSelector
❗❗❗Deprecated:
- Remove the early mixin channel: migrate the builtin resource pack repository mixins (repository, entry and list-entry hooks) from the GTNHMixins early config into the ordinary mixins.catframe.json, delete CatFrameEarlyMixinPlugin and the early config, and drop the FMLCorePlugin/FMLCorePluginContainsFMLMod manifest attributes. Keep ForceLoadAsMod: without it FML skips tweaker jars during mod discovery. Register the three mixins in Mixins.NormalMixin and refresh the builtin pack javadoc that referenced the coremod stage.
- Simplify the entry construction to the exact two-argument (ResourcePackRepository, File) constructor: it is the real constructor behind the source-level private Entry(File) and the only one present in both the MCP recompile and the obfuscated jar, so drop the access-bridge fallback and the argument-count dispatch that chased the synthetic bridge whose dummy parameter type differs between layouts. Keep the signature dump on lookup failure for diagnostics.
- Move the built-in example resource pack registration from CatFrame.preInit to ClientProxy.preInit: packs are a client-only subsystem (repository, refresh loop and pack GUI). Registration still runs inside CatFrame.preInit, well within the BuiltinPackBootstrap window; drop the now-unused imports in CatFrame.
- independent-snapshot semantics are removed in full - interface signatures (the
- Remove
@Deprecatedannotations from ModernItem: setModels, inventoryModelPath, handModelPath, hasDualModels are still in active use - Remove dead deprecated code: ModelBaker.clearCache(), TabBar.DEFAULT_TAB_TEXTURE alias, TabBar.drawSingleTabButton()
- removed the legacy two-arg beforePart shim (no callers, cannot delegate
Notes
Full Changelog: https://github.com/song682/CatFrame/commits/v0.9.0
Supplementary resources
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.
Maven coordinates:
Version ID:
build.gradle:
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:lSH4nVom:ugynykks"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:lSH4nVom:ugynykks"
}

