Retromod

Retromod Is a Minecraft mod that allows you to play older mods on newer versions.

File Details

Retromod 1.2.0-snapshot.6 (NeoForge 26.1.2)

  • R
  • Jun 30, 2026
  • 3.09 MB
  • 3
  • 26.1.2
  • NeoForge

File Name

retromod-1.2.0-snapshot.6+26.1.2.jar

Supported Versions

  • 26.1.2

Curse Maven Snippet

NeoForge

implementation "curse.maven:retromod-1532616:8348599"
Curse Maven does not yet support mods that have disabled 3rd party sharing

Learn more about Curse Maven

Added

  • 1.12.2 (pre-1.13) Forge class-move baseline (#103/#108/#113). Old 1.12.2 Forge mods reference Minecraft classes the 1.13 "Flattening" + 1.17 repackaging moved/renamed (net.minecraft.util.math.BlockPos -> core.BlockPos, world.World -> world.level.Level, util.ResourceLocation -> resources.Identifier, the block/item/entity packages, NBT, containers, …). A bundled, jar-validated 1.12.2 -> 26.1 class-move table (117 entries in forge-1.12.2-class-moves.tsv, harvested by scripts/harvest-1.12.2-class-moves.py) is loaded by the 1.12.2 shim, gated to a 26.1 host. These are transform-level building blocks, unit-tested at the bytecode level, not yet in-game loading. A 1.12.2 mod ships only mcmod.info (the mods.toml format postdates 1.13), so running one end-to-end on modern Forge/NeoForge additionally needs: mcmod.info -> mods.toml metadata generation (so the loader scans the mod at all), the 1.12.2 SRG member namespace (func_/field_ -> Mojang), and the old @EventHandler/FMLPreInitializationEvent registry idiom. None of those are built yet, so 1.12.2 mods do not load in-game in this build. Class-moves are the dominant bytecode gap (308 of 344 issues on a real 1.12.2 mod). Transform-tested (Forge1122ClassMovesTest).
  • 1.12.2 Block/Item Properties-constructor bridge (#80). After the class moves, a 1.12.2 custom block/item still wouldn't construct: 26.1 made Block and Item Properties-constructed, but a 1.12.2 block calls super(Material) and a 1.12.2 item calls super(), neither of which has a matching ctor (and Material itself was removed). Two new transformer mechanisms bridge this: a super-constructor replace (pop the old args, push a fresh default Properties) turns super(Material) into super(BlockBehaviour.Properties.of()), and the existing insert-defaults path now constructs a real default for Properties types (not null, which would NPE) so super() becomes super(new Item.Properties()). A static-field nuller neutralizes reads of removed-class constants (Material.IRON) so the field read doesn't fault before the super call. Default properties only (material-specific settings are lost). At the transform level the block/item now constructs; like the class-move table this is a bytecode building block gated behind the same in-game prerequisites noted above (metadata generation, SRG members, registry idiom). Gated to a 26.1 host. Transform-tested (Forge1122ClassMovesTest).

Fixed

  • The Betweenlands: missing ISound sound class (#113). The 1.12.2 client sound interface net.minecraft.client.audio.ISound was relocated by the 1.17 repackaging to net.minecraft.client.resources.sounds.SoundInstance (same name on 1.20.1 and 26.1), and Retromod didn't map it. Added the class move (ungated; the target exists on every supported host). It was The Betweenlands' only transform gap, so the mod should now transform cleanly.
  • Chunk force-loading crash on 26.1 (Chunky and other 1.18-era chunk mods). 26.1 renamed ServerChunkCache.addRegionTicket(TicketType, ChunkPos, int, T) to addTicketWithRadius(TicketType, ChunkPos, int) and dropped the value argument, so an old chunk-loading mod's 4-arg call had no target on 26.1 and crashed worlds on load. A plain rename can't fix it (the arity changed), so Retromod gained a generic arg-dropping method redirect (it pops the dropped trailing value, then calls the shorter renamed method) and registered the chunk-ticket case. Verified on the real Chunky jar: FabricWorld now calls the 3-arg addTicketWithRadius. Mechanism tested by ArgDropRedirectTest. (Chunky also mixins ThreadedAnvilChunkStorage, so full Chunky compatibility needs that checked in-game; this removes the addRegionTicket crash.)