Skip to content

v2.1.5

Choose a tag to compare

@rigelx2b rigelx2b released this 08 Nov 21:40
· 8 commits to main since this release

Minecraft: 1.20.1, 1.20.4, 1.21.1, 1.21.11, 26.1, 26.1.1, 26.1.2, 26.2, 26.3

Plexus Mod Loader 2.1.5 enables Fabric mods to run in client windows alongside NeoForge 20.4.253 by isolating foreign network payloads, bridges local captures on host-patched delegate methods such as RenderRegionCache.createRegion, runs Origins 1.10.2 and Apoli 2.9.2 on Minecraft 1.20.1 by deferring method-ending and return hooks to a late transformation pass, resolves local variable table and private enum constructor incompatibilities on Forge 1.20.1 patched classes to include Cardinal Components API 5.2.3 and Metal Pipe 1.0.5 in corpusQuiltForge, retains QSL in Quilt corpus runs on 1.20.4 and 1.21.1, prioritizes standalone nested mod providers in CrossLoaderModResolver, and patches FML's ModList to query foreign mods across all supported pre-26.1 Forge and NeoForge versions.

🔧 Improvements & Fixes

  • Allow Fabric mods to run in a NeoForge 20.4.253 (Minecraft 1.20.4, FML 2) client window by adding NeoForgeFml2ForeignPayloads transformation rules to NeoForge 20.4's NetworkRegistry (canSendPacket clientbound/serverbound, onModdedPacketAtServer, onModdedPacketAtClient, filterGameBundlePackets) to delegate custom payloads to their own loaders and using ForeignPayloads.Host to inspect configuration and play registrations to distinguish NeoForge payloads from foreign ones (ADR-0026 point 40), resolving client negotiation disconnects ("Incompatible client! Please use NeoForge 20.4.253") and packet rejections ("Tried to send minecraft:register packet to a client that does not support it"), verified via corpusFabricNeoForgeClient on 1.20.4 (world reached, 200 client ticks, left) and 1.21.1.
  • Support host-patched delegate methods by moving Fabric @Inject handlers that capture locals at RETURN/TAIL (such as Fabric API fabric-block-view-api-v2 ChunkRendererRegionBuilderMixin with CAPTURE_FAILHARD) to the added overload holding the vanilla body through a bridge (HostPatchAdjustments) when a host loader's patch converts a vanilla method into a delegate (NeoForge 20.4.253 RenderRegionCache.createRegion) while keeping handlers without captured locals on the original method, fixing the "Invalid descriptor" client crash when building chunk meshes next to NeoForge 20.4.
  • Enable Origins 1.10.2 / Apoli 2.9.2 to run on Minecraft 1.20.1 by running Plexus head hooks that can end a method (HeadHookResult CANCEL_IF_TRUE, RETURN_IF_NON_NULL, such as plexus:block_break) and hooks before a return (InvokeHookBeforeReturn) in the late transformation pass (ClassTransformExecutor.transformLate) after loader bridges' Mixin rather than the early pass (where an early ireturn shifted Apoli's @At("RETURN", ordinal = 4) in ServerPlayerGameMode.destroyBlock, causing "LVT ... has incompatible changes at opcode 177"), while keeping non-ending head hooks (CONTINUE) in the early pass, scoping ParameterFrames.keepParameters to methods with InvokeHookBeforeReturn, and updating worldCreateSaveTest expected log lines for two-pass transformation of classes such as MinecraftServer.
  • Resolve incompatibilities with javac-compiled MinecraftForge 1.20.x patched classes on Forge 1.20.1 (Forge 47): rewrite Fabric/Quilt positional LocalCapture into MixinExtras @Local captures by type via HostCapturedLocals when each type maps to a single slot in the patched method (PLEXUS-COMPAT-212 otherwise), allowing Cardinal Components API 5.2.3 to run in Forge's patched FallingBlockEntity.tick; and restore vanilla package access to enum constructors made private by Forge patches via HostEnumConstructors (read from the vanilla jar), allowing Metal Pipe 1.0.5 (EnchantmentCategory constant with a body) to run next to Forge 1.20.1, so corpusQuiltForge on 1.20.1 no longer leaves them out.
  • Update cross-loader mod resolution (CrossLoaderModResolver) so that when multiple nested copies share a mod ID, a nested copy that only provides that ID and is the sole copy of its own mod ID wins (matching Quilt Loader's rule requiring the only copy of a required mod to load), fixing Quilted Fabric API 7.7.0 on 1.20.1 being omitted entirely when its quilted_fabric_api_base (providing fabric-api-base 0.4.31) lost to a newer nested fabric-api-base 0.4.32 in a Fabric mod.
  • Retain QSL / Quilted Fabric API in corpusQuilt and corpusQuiltServer runs on Minecraft 1.20.4 and 1.21.1 (omitting Fabric API's own jar to avoid duplicate IDs), while excluding corpus mods that stop a server with QSL as they would under Quilt Loader (client classes loaded in init entrypoints, Regedit for 1.20.2, Tools of Perseus for 1.19.2, jars naming missing classes, Simple Voice Chat 2.6.27 for 1.21.1 whose nested QSL resource loader redirects the same Language.loadDefault call as Quilted Fabric API's resource loader, and Custom Player Models 0.6.27a using QSL lifecycle events not held by Quilted Fabric API 11.0.0-alpha.3), while continuing to leave QSL out of 1.20.1 Quilt corpus runs (where over ten mods load client classes in init entrypoints and CristelLib 1.1.2's Mixin plugin triggers a NoSuchMethodError on PackResources.getActivationType before QSL's resource loader injects QuiltResourcePack) and out of all corpus runs beside Forge or NeoForge.
  • Enable FML ModList to query other loaders' mods on pre-26.1 Forge and NeoForge versions (ADR-0025): patch ModList instance lookups (getModFileById via fileById, isLoaded via indexedMods) via ForgeModListPatch Shape.FORGE_1 on MinecraftForge 47 to 61 (Minecraft 1.20.1, 1.20.4, 1.21.1, 1.21.11) to delegate to Plexus Mod Loader's ForeignModList (PLEXUS-COMPAT-211 if the code differs), verified on 1.20.1 answering for 29 foreign mods; and patch ModList in FML's fml_loader BOOT module via Shape.NEOFORGE_MODLAUNCHER on NeoForge 20.4.253 (FML 2) and 21.1.265 (FML 4) with responses supplied by NeoForgeForeignModList implementing neoforgespi (PLEXUS-COMPAT-218 if the code differs), installed by PlexusModLauncher and verified on 1.21.1 (15 mods) and 1.20.4 (57 mods), resolving the limitation across all supported Forge and NeoForge versions.
  • Verify the 2026-11-09 release on Java 25 with check, build-logic check, headless suites on all 9 supported versions (serverBootSmokeTest, worldCreateSaveTest, gameTests *:*, and compatibilityMatrix, 127-155 s per version; updating expected log lines for two-pass transformation of MinecraftServer), compatibilityCorpus on all 9 versions (loaded / not loaded: 1.20.1 corpusFabric 57/34, corpusFabricForge 29/50, corpusQuilt 190/883, corpusQuiltServer 192/827; 1.20.4 corpusFabric 98/69, corpusFabricForge 52/86, corpusQuilt 158/145, corpusQuiltServer 160/143; 1.21.1 corpusFabric 92/68, corpusFabricForge 56/83, corpusQuilt 121/171, corpusQuiltServer 97/139; 1.21.11 corpusFabric 90/78, corpusFabricForge 64/98, corpusQuilt 123/141, corpusQuiltServer 123/96; 26.1 corpusQuilt 118/115, corpusQuiltServer 116/72; 26.1.1 72/118 and 70/75; 26.1.2 73/117 and 71/73; 26.2 135/125 and 133/80; 26.3 109/79 and 112/34), separate development runs for corpusQuiltForge 1.20.1 (110 loaded / 909 not loaded, with Metal Pipe 1.0.5 and Cardinal Components API 5.2.3 included), corpusFabricNeoForge 1.21.1 (15/40) and 1.20.4 (57/80), and corpusFabricForge 1.20.1, and all 26 window tasks run one at a time 20 s apart (clientWorldReloadTest across all 9 versions; corpusForgeClient on 1.20.1, 1.20.4, 1.21.1, and 1.21.11; corpusNeoForgeClient on 1.20.4, 1.21.1, and 1.21.11; launcherProfileForgeTest on 1.20.1, 1.20.4, 1.21.1, and 1.21.11; launcherProfileNeoForgeTest on 1.20.4, 1.21.1, and 1.21.11; corpusFabricNeoForgeClient on 1.20.4 and 1.21.1; and launcherProfileTest on 26.3).

NOT AN OFFICIAL MINECRAFT PRODUCT. NOT APPROVED BY OR ASSOCIATED WITH MOJANG OR MICROSOFT.