Retromod 1.4.0-snapshot.3.1 (Fabric 26.2)
Curse Maven Snippet
What's new
Third 1.4.0 snapshot. Refreshes the older mapping data that Forge SRG and Fabric intermediary translation depend on, checked against the game jars each name has to match.
Added
- Translates old Forge mods' SRG names on Forge 1.20, 1.20.2, 1.20.3, and 1.20.4. Those hosts run SRG names like Forge 1.20.1 but number some members differently, so each has its own table, shipped as the changes to the 1.20.1 table. Before, Retromod registered no SRG names on them at all.
- Names 4,604 more Forge SRG ids exactly:
func_andfield_ids that only 1.14.4 to 1.16.4 had, andm_andf_ids that 1.17, 1.18, 1.19, 1.19.3, and 1.20.2 added and later dropped. - Adds class moves for 65 classes from 1.21.2 to 1.21.11 that 26.1 moved to another package, for Fabric, Forge, and NeoForge mods alike.
- Adds 158 Fabric intermediary ids the table lacked, each checked against the 26.1.2, 26.2, and 26.3 jars.
- Follows classes and tag constants that 26.2 and 26.3 renamed without changing their members: the HUD's heart and contextual info enums, dripstone thickness, the last Enderman goal, a structure placement enum, the client clock and underwater sound classes, loot condition types, and eight tags such as
BlockTags.CONCRETE_POWDERS. - Moves a resource pack's trim palettes to the folder 26.3 reads.
- Renames the vanilla tags that 26.1, 26.2, and 26.3 renamed, in mod code and mod data alike: tag constants such as
BlockTags.MUSHROOM_GROW_BLOCKandItemTags.DYEABLE,#minecraft:references and tag fields in data files and functions, and a mod's additions to an old tag, which are copied to the new name. 26.1 dyes armor through onecrafting_dyerecipe per item, so Retromod writes that recipe for each item a mod lists in#minecraft:dyeable. - Keeps a 1.20.2 to 26.2 advancement trigger working on 26.3, which replaced
ContextAwarePredicatewith a holder of one loot condition. The predicate type, its codec,matches,validate,create, andEntityPredicate.ADVANCEMENT_CODECread and test that condition. - Follows twelve NeoForge 1.21.1 classes that later NeoForge releases moved to another package, such as
ModelData,StackCopySlot, andAddAttributeTooltipsEvent, on hosts that moved them. - Follows NeoForge 1.21.1 members that later releases renamed or retyped:
PacketDistributor.sendToServer, which moved toClientPacketDistributor, the key event methods 26.3 renamed, a fall event's distance, an explosion event's explosion, and a tag update event's registries and cause. - Keeps NeoForge 1.21.1's
LootModifiershape on 26.2, which added a priority, and 26.3, which replaced the condition array with one condition. A global loot modifier built from a condition array, with its codec started from the oldcodecStart, still registers and reads the conditions its host's data carries. - Keeps
ModList.get(),LoadingModList.get(),FMLLoader.getLoadingModList(), and the calls made on them working on Forge 26.2, which made both mod lists static, and followsModLoadingContext.getActiveContainer()togetContainer(). - Runs Forge 1.20.1 tick listeners on Forge 26.2, which fires a Pre and a Post event for each tick. An old listener runs for both, and its
phase,side,level,player,getServer(), andhaveTime()reads answer from the event it got. - Runs Forge 1.20.1
SimpleChannelnetworking on Forge 26.x through channels Forge builds itself. Each old channel opens an optional Forge channel under its id, each message keeps its id, encoder, decoder, and handler, and the old sends, replies, andNetworkEvent.Contextcalls reach Forge's. The oldNetworkRegistry.ChannelBuilderandacceptMissingOrwork on Forge 26.x and NeoForge alike. - Hooks a mod bus listener that a Forge 1.20.1 mod adds with a lambda onto EventBus 7 on Forge 26.2, where mod bus events have no static bus.
- Writes the root
pack.mcmetathat Forge 26.x needs into a translated mod jar that has none. Forge reported such a jar as broken resources and skipped its assets and data, and that loading warning shut down every game event, so server start, login, and loot modifier listeners never ran. - Renames the registry keys that 26.3 gave to other registries, such as
Registries.CONFIGURED_CARVER, which is nowRegistries.CARVER, in one pass per class, so a reused name never points at the wrong registry. - Serves the old Fabric API strippable, flattenable, tillable, and composting registries on 26.3, which removed them, through Fabric API's block transformers and item components, and the pre-1.21.2
FuelRegistryon every 26.x host. TheHoeItemhelpers old mods pass to the tilling registry work again too. This is part of the loader API runtime, which is on in snapshots. - Redirects a static method reference whose parameters widen to
Object, such asHoeItem::onlyIfAirAbovesent to a Retromod helper. Such a reference used to keep pointing at the removed method and fail to link. - Serves the old Fabric API
TradeOfferHelperon 26.x, where villager and wandering trader trades are data. Retromod writes the trades a mod registers into a data pack in the world folder once the server has started. - Serves the old Fabric API brewing registries on 26.x: through Fabric API's builder on 26.1 and 26.2, and as
minecraft:brewingrecipes in a world data pack on 26.3. - Keeps the per-state copper constants, such as
Blocks.EXPOSED_COPPER, the 1.21.9 copper records, and the dyed harness items working on 26.2 and newer, which folded them into collections. - Reads the
SoundEventsconstants that 26.3 turned into holders as plain sound events for older mods. - Builds an old
MerchantOfferfrom item stacks on 1.20.5 and newer, which take item costs. - Runs a 1.20.1 mod's recipes on 1.20.5 to 1.21.1: serializers that read JSON and buffers, recipe classes that read containers and registry access,
RecipeManagerlookups that pass a container or expect recipes instead of holders, and the removedIngredient, item stack JSON, andFriendlyByteBufitem helpers. - Runs advancement triggers that a mod built before 1.20.2 reads from JSON, with their entity and item predicates, on hosts that read triggers with codecs.
- Runs Gson loot function and loot condition serializers that a mod built before 1.20.5 registers, on hosts that take codecs.
- Rebases a 1.21.1 mod's
Explosionsubclass onto a server explosion on 1.21.2 and newer, whereExplosionis an interface.explode()still lists the blocks it will break, andfinalizeExplosionbreaks and drops them. - Rebuilds the armor material registry that 1.21.2 removed under Retromod's own id, so 1.21.1 armor materials still register and build armor on 26.x.
- Answers 1.21.1 recipe lookups on 1.21.2 and newer:
RecipeManagerqueries by type or id, a recipe's ingredients, result, experience, and cooking time, andIngredient.getItems. - Bridges NeoForge 1.21.1 item, fluid, and energy capabilities on NeoForge 1.21.11 to 26.2, which moved them to resource handlers. An old handler registers under both capabilities, and an old lookup falls back to a new handler.
- Rebuilds NeoForge's item, fluid, and energy handler APIs, which 26.3 removed, inside each translated jar that uses them:
IItemHandler,ItemStackHandlerand the item wrappers,IFluidHandler,FluidTankand the fluid item templates,FluidUtil's container helpers,IEnergyStorage,EnergyStorage, and the old capabilities, which work beside the current ones as they do on 26.2. - Keeps the 1.21.1 save methods of
ItemStackHandler,FluidTank, andEnergyStorageon NeoForge 1.21.6 to 26.2, which save through ValueIO, in the format 1.21.1 wrote. A handler subclass's own override of those methods still runs. - Rebuilds
PotionBrewing, which 26.3 replaced withminecraft:brewingrecipes, from those recipes, so a mod readingserver.potionBrewing()sees the same potion and container mixes. This applies to Fabric, Forge, and NeoForge mods alike. - Reads a block state written with the old
NameandPropertieskeys in a mod's own data files on 26.3, which readsidandproperties. - Keeps the removed block type registry,
AddServerReloadListenersEvent.getRegistryAccess(), armor components from an old armor material, and old recipe result reads working on NeoForge 26.3. - Renames old game rule constants and bridges game rule reads on NeoForge and Forge 1.21.11, which reworked game rules before 26.1, and follows
SimpleCraftingRecipeSerializerto its 1.21.11 name,CustomRecipe.Serializer. On NeoForge 1.21.11 it also follows the old reload listener events to their new names. - Bridges more members that 1.21.2 to 26.x removed: tool rules built from a tag or a block list, tier-only tool constructors,
BlockEntityType.Builder, data attachments serialized with aCodec,lootFrom, NeoForge's stack-aware crafting remainders,Level.getProfiler,Level.getGameRuleswith typed rule reads, and reads of theLevel.isClientSideandLevel.randomfields. - Gives a block or item its registration id when the mod builds its properties before the registration, as mods often do for a torch and its wall torch.
- Serves a NeoForge 1.21.1 HUD layer through NeoForge's
GuiLayeron 1.21.6 and newer. - Maps Forge 1.20.1 biome modifiers, their phases and builders,
ServerLifecycleHooks, andStrictNBTIngredientto NeoForge's own, and converts biome and structure modifier serializers to theMapCodecs NeoForge reads. On NeoForge 26.3, which added a registry access toBiomeModifier.modify, an old modifier's three-argumentmodifystill runs. - Shows Retromod's logo in the NeoForge 26.2 and newer mod list, and updates the German translation, both contributed by ttaute (#376).
- Updates ASM, the bytecode library behind every transform, from 9.10.1 to 9.11.1, SLF4J from 2.0.18 to 2.0.20, the compile-only Guava to 33.7.2, the compiler plugin to 3.16.0, the exec plugin to 3.6.4, and the build-helper plugin to 3.6.2. The supported Java and Minecraft ranges are unchanged.
Fixed
- Removes 751 Fabric intermediary entries that gave a lambda the name of another member sharing its obfuscated name. A mixin aimed at one of those lambdas could land on the wrong method.
- Corrects 67 class and 43 member names that no 26.x host has, such as
BakedModeltoBlockStateModeland block entity renderers'rendertosubmit. - Replaces 258 approximate 1.12.2 SRG names with the exact name of the same id, such as
causeFallDamagefor the oldfall. - Registers three 1.21.11 client class moves on 26.1.x hosts, where only 26.2 and newer had them, although released 26.1 already used the new paths.
- Gets 1.20.1 Forge mods with machine recipes, custom advancements, and custom world generation through startup on NeoForge 1.21.1. Retromod now also bridges enchantments registered through Architectury, chunk generators and biome sources that give a plain codec,
ModConfig.getConfigData, access transformers written with SRG names, point of interest types that claim block states vanilla already owns, item names read fromtoString, registrations made after the registries froze,Properties.copyof a waterlogged block, the old stack size field ofItem.Properties, button, sign, pressure plate, and torch constructors that took their type later, and camera mixins that move by doubles. Fossils and Archaeology (#372) starts on a NeoForge 1.21.1 server. - Runs Forge 1.19.4's
CreativeModeTabEventon Forge 1.20 and newer: a tab registered through the old event becomes a tab registry entry in the same place, the contents event keeps its members, and the oldCreativeModeTabsconstants read the registered tabs. OldServerPlayer.setLevelcalls and the old void damage type reach their 1.20 names, including on Forge hosts that run SRG names. Super Mario Mania (#364) starts on a Forge 1.20.1 server. - Reads a mod's Minecraft version from
Build-On-Minecraftin its manifest. TerraBlender 1.21.1 declares only an open NeoForge range, and Retromod translated it as a 1.20.4 mod in place of the native jar. - Gets ProjectE (#366), a NeoForge 1.21.1 mod, through startup on NeoForge 26.2 and 26.3 servers, with its EMC values loaded and its nova explosions breaking blocks.
- Keeps the fuzzy field match from swapping one registry or registry key constant for another. It sent
Registries.BLOCK_TYPEto the block registry on 26.3, where a mod's block types then collided with its blocks. - Stops a
DeferredRegistersubclass that overridesregisterand callssuperfrom looping until the stack overflowed on NeoForge 1.20.5 to 1.21.11. - Starts Retromod on NeoForge 1.20.5 and 1.20.6. Every NeoForge 20.5 build and the first 13 builds of 20.6 run FML 3.0.18, which still loads the older mod locator, so Retromod never started there and FML reported it as a mod with no classes. The jars for those two versions now carry both locators (#375).
- Opens Retromod's entry in the NeoForge 1.20.2 and 1.20.3 mod list without crashing. Those mod lists read the logo path as one segment and rejected its slash with
Illegal segment, so the logo now sits at the jar root (#375). - Keeps an entity's own eye height when its class overrides
getEyeHeight(Pose), which 1.20.5 made final and moved into the entity's dimensions. Such a class failed to load withIncompatibleClassChangeError. The override now sets the eye height of the dimensions the host reads, on Fabric, Forge, and NeoForge alike (#377). - Applies a 26.1 class move on NeoForge and Forge 26.2 and newer when 26.2 moved the class again, as it did the advancement trigger classes. Retromod skipped such a move because the host lacks the 26.1 name, so a NeoForge 1.21.1 mod's custom trigger failed to load there.
- Gives the stand-in classes Retromod embeds the last name in a chain of class moves, as a mod's own classes get. A stand-in written with a 1.20.1 name stopped at the first move.
- Leaves a static call as written when a redirect expects a receiver. A newer mod calls the static method that replaced an instance one under the same name, and the redirect left the stack one value short.
- Frames a branch that joins a mod class with a Minecraft class correctly in the offline CLI, from the
--mc-jarindex or the installed game it finds. The CLI typed such a value asObject, and the class failed verification, as ProjectE's Arcana ring did. - Keeps an advancement trigger built before 1.20.2 working on 26.x, for every loader. 26.1 and 26.2 moved its base class, so the trigger lost the codec Retromod gives it, and the first advancement that used it stopped the world from loading with
AbstractMethodError. - Adapts an old recipe serializer that a Forge mod registers through
DeferredRegisteron Forge 26.2 and newer, as NeoForge already did. The registry held the mod's own object, and reading its recipes stopped the world from loading withClassCastException. - Falls back to the vanilla rarity of the same color when a mod calls
Rarity.createon Forge 26.x, which removed it, and says so in the log. The mod stopped at construction withNoSuchMethodError. - Renames the attribute operations
ADDITION,MULTIPLY_BASE, andMULTIPLY_TOTALon Forge 1.20.5 and newer. Only NeoForge had the rename, so an old attribute modifier failed withNoSuchFieldErroron Forge. - Reopens the vanilla registries on Forge 26.x for a registration a mod makes after they froze, as on NeoForge, and renames vanilla tags in Forge mods on 26.1 and newer, which the Forge chain skipped.
- Writes EventBus 7 bridge failures on Forge 26.2 to the game log. They went to standard error, which launchers such as Prism do not keep.
A Forge 1.20.1 mod that opens a network channel with SimpleChannel still stops on Forge 1.20.2 to 1.20.4, which replaced that API. On Forge 26.2, old mods still fail on cancellable events (setCanceled), capabilities attached through AttachCapabilitiesEvent, and render events, which EventBus 7 replaced, and a tick listener added with addListener instead of @SubscribeEvent is not split. Rarity.create cannot add a rarity on Forge 26.x, where Rarity is a plain enum. The Forge 26.x bridges were run on a Forge 26.2 client; Forge 26.3 was not launched in testing. NeoForge client APIs that 26.x rebuilt, such as RenderLevelStageEvent stages, model geometry loaders, color handler events, and shader registration, still fail. The offline CLI follows an inherited method to the class that declares it on Forge 1.20 to 1.20.4 only when --mc-jar names the SRG-named jar the Forge installer writes. SRG ids that only 1.13.2 or 1.14.3 had cannot be named exactly, because Mojang published no mappings for those versions. 26.3 removed Fabric API's decorated pot pattern registry, and old mods that use it still fail there. Old trades, and old brewing on 26.3, apply from the second start of a world, because the host reads them before the first start writes them. The 1.20.1 recipe bridge covers 1.20.5 to 1.21.1. 1.20.2 to 1.20.4 read serializers in another shape, and 1.21.2 rebuilt recipes around placement and display data, so an old recipe class still fails on those hosts, including 26.x. On 26.x its recipes stay unloaded and the world still loads. A recipe read through the bridge carries a generated id until the mod looks it up, because a serializer no longer receives the file's id, and a 1.20.1 serializer cannot write recipes back to JSON. Screens a Forge 1.19.4 mod draws with a PoseStack still fail when opened on 1.20 and newer, which draw with GuiGraphics, and a block's material compared with anything other than Material.AIR still fails, because 1.20 removed materials. An old compost chance takes the nearest of vanilla's five tiers, from 30 to 100 percent. A tilling rule with the mod's own check or action is not served on 26.3, because block transformers store only block states, and an item dropped while tilling is not dropped. Compost and fuel set on an item tag do nothing on 26.3, and a modded fuel burns as long in a blast furnace or smoker as in a furnace. An item a mod lists as optional in #minecraft:dyeable gets no dye recipe, because the item may not exist and a recipe naming a missing item stops a 26.3 world from loading. An advancement that a pre-1.21 mod ships in its advancements/ folder and that uses the mod's own trigger stays out of 26.3, because Retromod cannot show the trigger reads it, and one advancement that fails to load stops a 26.3 world. Data that names a tag 26.3 removed with no successor, such as #minecraft:brewing_fuel or the carver replaceable tags, still names nothing there. The rebuilt NeoForge handler APIs are copied into each translated jar, so two old mods that hand handlers to each other outside capabilities see different classes; a shared copy would fix that. FluidUtil's helpers that pick up and place fluids in the world are not rebuilt. NeoForge's old brewing recipe API (IBrewingRecipe and its registration event) is not rebuilt, and the rebuilt table's getRecipes() is empty. A client connected to a remote server sees an empty brewing table, because 26.3 keeps recipes on the server. The static PotionBrewing methods from before 1.20.5 are not bridged. A NeoForge 1.21.1 mod that builds blocks or items before registering them, or serializes data attachments with a Codec, still stops on NeoForge 1.21.2 to 1.21.11, because those bridges register from 26.1; ProjectE stops there. ProjectE's player layer and render types use client rendering classes that 26.x rebuilt, so its client still fails. An old explosion's detonate event lists no blocks, because Retromod keeps them for finalizeExplosion, so a claim mod cannot protect blocks from it. Explosion subclasses are not bridged on Fabric 1.21.2 to 1.21.11 hosts, which run intermediary names. Old game rule reads are not bridged on Fabric 1.21.11. Retromod on NeoForge 1.20.5 and 1.20.6 was checked against FML 3.0.18's loader API but not launched in testing. On 1.21.5 and newer MobSpawnSettingsBuilder.getSpawner returns a weighted list builder, so an old biome modifier that edits spawns through it still fails. A 1.21.x Fabric mod that builds a SingleItemRecipe.Serializer, which 26.1 removed, still fails on 26.x, as MrCrayfish's Furniture Mod: Refurbished does (#374).
This mod has no additional files

