
RS Polymorph lets you choose which recipe the Refined Storage Crafting Grid and Pattern Grid use when several recipes share the same ingredients. No Polymorph needed.
Stop letting Refined Storage pick the wrong recipe for you.

Recipe button: next to the grid, it lists every recipe that matches your ingredients.
Never miss a conflict: a red warning and a gold halo show when more than one recipe matches.
Live preview: the output changes the moment you pick, and the choice is kept per grid.

Pattern Grid: the same button, and your choice is written into the printed pattern.
The right craft: autocrafting uses the recipe stored on the pattern, not the first match.
First-open tutorial: a one-time card explains it, in English or French.
1. Install Refined Storage and the RS Polymorph jar for your version and loader, client and server.
2. Open a Crafting Grid or a Pattern Grid and place ingredients.
3. When the recipe button glows, click it and pick your recipe.
| Minecraft | NeoForge | Fabric | Refined Storage |
|---|---|---|---|
| 1.21.1 | Yes | Yes | 2.x |
| 26.1.2 | Yes | No | 3.x |
Optional: Refined Storage - Quartz Arsenal 1.0.7 or later, for its Wireless Crafting Grid.
A bug or an idea? Ask on Discord or open an issue on GitHub.

RS Polymorph vous laisse choisir la recette qu'utilisent la grille de craft et la grille de patrons de Refined Storage quand plusieurs recettes partagent les mêmes ingrédients. Aucun besoin de Polymorph.
Ne laissez plus Refined Storage choisir la mauvaise recette à votre place.
Bouton de recette : à côté de la grille, il liste chaque recette qui correspond à vos ingrédients.
Aucun conflit manqué : un avertissement rouge et un halo doré signalent plusieurs recettes.
Aperçu immédiat : la sortie change dès votre choix, et il est mémorisé pour chaque grille.
Grille de patrons : le même bouton, et votre choix est inscrit dans le patron imprimé.
Le bon craft : l'autocraft utilise la recette inscrite sur le patron, pas la première trouvée.
Tutoriel à l'ouverture : une carte unique l'explique, en anglais ou en français.
1. Installez Refined Storage et le jar RS Polymorph de votre version et loader, client et serveur.
2. Ouvrez une grille de craft ou une grille de patrons et placez vos ingrédients.
3. Quand le bouton de recette s'allume, cliquez et choisissez votre recette.
| Minecraft | NeoForge | Fabric | Refined Storage |
|---|---|---|---|
| 1.21.1 | Oui | Oui | 2.x |
| 26.1.2 | Oui | Non | 3.x |
Optionnel : Refined Storage - Quartz Arsenal 1.0.7 ou plus, pour sa grille de craft sans fil.
Un bug ou une idée ? Demandez sur Discord ou ouvrez un ticket sur GitHub.
Official Hosting Partner / Hébergeur Partenaire Officiel
Run your own modded server with Refined Storage and RS Polymorph on hosting built for modpacks.
Lancez votre serveur moddé avec Refined Storage et RS Polymorph sur un hébergement pensé pour les modpacks.
Play Arcadia V2: Echoes of Power / Jouez à Arcadia V2 : Echoes of Power
RS Polymorph is made by Team Arcadia. Join our modpack and find its server, the website and the wiki.
RS Polymorph est fait par la Team Arcadia. Rejoignez notre modpack et retrouvez son serveur, le site et le wiki.

Support the Project / Soutenir le Projet
Your support keeps the project alive.
Votre soutien fait vivre le projet.
Author / Auteur: vyrriox | License / Licence: Apache 2.0
How to Install Polymorphic Refined Storage (Mod)
Polymorphic Refined Storage by vyrriox is verified for Fabric, Neoforge across Minecraft versions 1.21.1, 26.1.2 (latest release: 1.2.2+neoforge-26.1.2, file size: 60 KB). Follow the steps below to install it safely from ModCraft.tv:
- Click the Download button above and select your Minecraft version (1.21.1, 26.1.2) and platform (Fabric, Neoforge).
- Make sure you have the compatible loader or environment installed for Fabric, Neoforge.
- Move the downloaded Polymorphic Refined Storage file into your Minecraft
.minecraft/modsfolder and launch the game.
All Versions
+ Add Version### Added
- Non-unique craft warning on the recipe button (issue #3)** — When the open grid currently matches more than one recipe, the recipe-selection side button now flags it so the choice is never missed and the wrong item is not crafted by accident. It uses Refined Storage's native warning idiom — a red warning icon drawn on the button plus a red explanatory line appended to its tooltip — and additionally pulses a soft gold halo around the button to draw the eye to it (players reported not noticing the button at all). The pulse stops once the popup is open. The indicator clears automatically when the craft becomes unique. Implemented on all three jars (1.21.1 Fabric/NeoForge, 26.1.2 NeoForge).
### Removed
- Debug "Test Stick" items** — The two development-only items (
test_stick_1/test_stick_2), which existed only to demonstrate the multi-recipe case, were removed from the released mod: their registration (both loaders, both MC lines), creative-tab entries, recipes, models, textures, and lang strings are gone. Real packs already provide genuine non-unique crafts, so the debug items served no purpose in a release build.
### Ajouts
- Avertissement de craft non unique sur le bouton de recette (issue #3)** — Quand la grille ouverte correspond à plusieurs recettes, le bouton latéral de sélection le signale désormais pour que le choix ne soit jamais manqué et qu'un mauvais objet ne soit pas crafté par accident. Il reprend l'idiome d'avertissement natif de Refined Storage — une icône d'avertissement rouge dessinée sur le bouton plus une ligne rouge explicative ajoutée à son infobulle — et fait en plus pulser un léger halo doré autour du bouton pour attirer l'œil (des joueurs signalaient ne pas remarquer le bouton du tout). La pulsation s'arrête dès que le popup est ouvert. L'indicateur disparaît automatiquement quand le craft redevient unique. Implémenté sur les trois jars (1.21.1 Fabric/NeoForge, 26.1.2 NeoForge).
### Suppressions
- Objets de débogage « Bâton de test »** — Les deux objets réservés au développement (
test_stick_1/test_stick_2), qui n'existaient que pour illustrer le cas multi-recettes, ont été retirés du mod publié : leur enregistrement (deux loaders, deux lignes MC), leurs entrées dans l'onglet créatif, leurs recettes, modèles, textures et chaînes de traduction ont disparu. Les packs réels fournissent déjà de vrais crafts non uniques, ces objets de débogage n'avaient donc aucune utilité dans un build de publication.
### Added
- Non-unique craft warning on the recipe button (issue #3)** — When the open grid currently matches more than one recipe, the recipe-selection side button now flags it so the choice is never missed and the wrong item is not crafted by accident. It uses Refined Storage's native warning idiom — a red warning icon drawn on the button plus a red explanatory line appended to its tooltip — and additionally pulses a soft gold halo around the button to draw the eye to it (players reported not noticing the button at all). The pulse stops once the popup is open. The indicator clears automatically when the craft becomes unique. Implemented on all three jars (1.21.1 Fabric/NeoForge, 26.1.2 NeoForge).
### Removed
- Debug "Test Stick" items** — The two development-only items (
test_stick_1/test_stick_2), which existed only to demonstrate the multi-recipe case, were removed from the released mod: their registration (both loaders, both MC lines), creative-tab entries, recipes, models, textures, and lang strings are gone. Real packs already provide genuine non-unique crafts, so the debug items served no purpose in a release build.
### Ajouts
- Avertissement de craft non unique sur le bouton de recette (issue #3)** — Quand la grille ouverte correspond à plusieurs recettes, le bouton latéral de sélection le signale désormais pour que le choix ne soit jamais manqué et qu'un mauvais objet ne soit pas crafté par accident. Il reprend l'idiome d'avertissement natif de Refined Storage — une icône d'avertissement rouge dessinée sur le bouton plus une ligne rouge explicative ajoutée à son infobulle — et fait en plus pulser un léger halo doré autour du bouton pour attirer l'œil (des joueurs signalaient ne pas remarquer le bouton du tout). La pulsation s'arrête dès que le popup est ouvert. L'indicateur disparaît automatiquement quand le craft redevient unique. Implémenté sur les trois jars (1.21.1 Fabric/NeoForge, 26.1.2 NeoForge).
### Suppressions
- Objets de débogage « Bâton de test »** — Les deux objets réservés au développement (
test_stick_1/test_stick_2), qui n'existaient que pour illustrer le cas multi-recettes, ont été retirés du mod publié : leur enregistrement (deux loaders, deux lignes MC), leurs entrées dans l'onglet créatif, leurs recettes, modèles, textures et chaînes de traduction ont disparu. Les packs réels fournissent déjà de vrais crafts non uniques, ces objets de débogage n'avaient donc aucune utilité dans un build de publication.
### Added
- Non-unique craft warning on the recipe button (issue #3)** — When the open grid currently matches more than one recipe, the recipe-selection side button now flags it so the choice is never missed and the wrong item is not crafted by accident. It uses Refined Storage's native warning idiom — a red warning icon drawn on the button plus a red explanatory line appended to its tooltip — and additionally pulses a soft gold halo around the button to draw the eye to it (players reported not noticing the button at all). The pulse stops once the popup is open. The indicator clears automatically when the craft becomes unique. Implemented on all three jars (1.21.1 Fabric/NeoForge, 26.1.2 NeoForge).
### Removed
- Debug "Test Stick" items** — The two development-only items (
test_stick_1/test_stick_2), which existed only to demonstrate the multi-recipe case, were removed from the released mod: their registration (both loaders, both MC lines), creative-tab entries, recipes, models, textures, and lang strings are gone. Real packs already provide genuine non-unique crafts, so the debug items served no purpose in a release build.
### Ajouts
- Avertissement de craft non unique sur le bouton de recette (issue #3)** — Quand la grille ouverte correspond à plusieurs recettes, le bouton latéral de sélection le signale désormais pour que le choix ne soit jamais manqué et qu'un mauvais objet ne soit pas crafté par accident. Il reprend l'idiome d'avertissement natif de Refined Storage — une icône d'avertissement rouge dessinée sur le bouton plus une ligne rouge explicative ajoutée à son infobulle — et fait en plus pulser un léger halo doré autour du bouton pour attirer l'œil (des joueurs signalaient ne pas remarquer le bouton du tout). La pulsation s'arrête dès que le popup est ouvert. L'indicateur disparaît automatiquement quand le craft redevient unique. Implémenté sur les trois jars (1.21.1 Fabric/NeoForge, 26.1.2 NeoForge).
### Suppressions
- Objets de débogage « Bâton de test »** — Les deux objets réservés au développement (
test_stick_1/test_stick_2), qui n'existaient que pour illustrer le cas multi-recettes, ont été retirés du mod publié : leur enregistrement (deux loaders, deux lignes MC), leurs entrées dans l'onglet créatif, leurs recettes, modèles, textures et chaînes de traduction ont disparu. Les packs réels fournissent déjà de vrais crafts non uniques, ces objets de débogage n'avaient donc aucune utilité dans un build de publication.
### Fixed
- Recipe-selection popup drawn under the grid items (z-order)** — The recipe-selection popup rendered *behind* the crafting-grid item icons, so the grid items showed through it and the recipe icons could not be read or clicked. Cause: Minecraft renders all GUI item icons on a fixed high depth layer (
renderItemtranslates to Z=232 on 1.21.1; the carried-item / tooltip phases composite on later strata on 26.x), so even though the popup was drawn at the screen's render tail its flat background sat below the items. On **1.21.1** the whole popup (and the first-open tutorial card) is now drawn inside a pose pushed to Z=400, above the item layer. On **26.1.2** the popup render was moved off RS'sextractContents(the first of four extract phases) onto vanillaAbstractContainerScreen.extractRenderStateat RETURN — the only point that runs afterextractContents→extractCarriedItem→extractSnapbackItem→extractTooltip— via a newMixinScreenPopupRender, so the popup composites on the topmost stratum. The recipe popup is now fully on top and selectable on all three jars.
### Ajouts / Correctifs / Modifications / Performance (French mirror)
### Correctifs
- Popup de sélection de recette affichée sous les items de la grille (ordre de profondeur)** — La popup de sélection s'affichait *derrière* les icônes d'items de la grille de craft : les items transparaissaient par-dessus et les icônes de recette étaient illisibles et incliquables. Cause : Minecraft rend toutes les icônes d'items de GUI sur une couche de profondeur élevée fixe (
renderItemtranslate en Z=232 sur 1.21.1 ; les phases item-porté / infobulle se composent sur des strates ultérieures en 26.x), donc même dessinée en fin de rendu, le fond plat de la popup restait sous les items. Sur **1.21.1**, toute la popup (et la carte de tutoriel de première ouverture) est désormais dessinée dans une pose poussée à Z=400, au-dessus de la couche des items. Sur **26.1.2**, le rendu de la popup a été déplacé deextractContentsde RS (la première des quatre phases d'extraction) versAbstractContainerScreen.extractRenderStatevanilla en RETURN — le seul point exécuté aprèsextractContents→extractCarriedItem→extractSnapbackItem→extractTooltip— via un nouveauMixinScreenPopupRender, pour que la popup se compose sur la strate la plus haute. La popup de recette est maintenant entièrement au premier plan et sélectionnable sur les trois jars.
### Fixed
- Recipe-selection popup drawn under the grid items (z-order)** — The recipe-selection popup rendered *behind* the crafting-grid item icons, so the grid items showed through it and the recipe icons could not be read or clicked. Cause: Minecraft renders all GUI item icons on a fixed high depth layer (
renderItemtranslates to Z=232 on 1.21.1; the carried-item / tooltip phases composite on later strata on 26.x), so even though the popup was drawn at the screen's render tail its flat background sat below the items. On **1.21.1** the whole popup (and the first-open tutorial card) is now drawn inside a pose pushed to Z=400, above the item layer. On **26.1.2** the popup render was moved off RS'sextractContents(the first of four extract phases) onto vanillaAbstractContainerScreen.extractRenderStateat RETURN — the only point that runs afterextractContents→extractCarriedItem→extractSnapbackItem→extractTooltip— via a newMixinScreenPopupRender, so the popup composites on the topmost stratum. The recipe popup is now fully on top and selectable on all three jars.
### Ajouts / Correctifs / Modifications / Performance (French mirror)
### Correctifs
- Popup de sélection de recette affichée sous les items de la grille (ordre de profondeur)** — La popup de sélection s'affichait *derrière* les icônes d'items de la grille de craft : les items transparaissaient par-dessus et les icônes de recette étaient illisibles et incliquables. Cause : Minecraft rend toutes les icônes d'items de GUI sur une couche de profondeur élevée fixe (
renderItemtranslate en Z=232 sur 1.21.1 ; les phases item-porté / infobulle se composent sur des strates ultérieures en 26.x), donc même dessinée en fin de rendu, le fond plat de la popup restait sous les items. Sur **1.21.1**, toute la popup (et la carte de tutoriel de première ouverture) est désormais dessinée dans une pose poussée à Z=400, au-dessus de la couche des items. Sur **26.1.2**, le rendu de la popup a été déplacé deextractContentsde RS (la première des quatre phases d'extraction) versAbstractContainerScreen.extractRenderStatevanilla en RETURN — le seul point exécuté aprèsextractContents→extractCarriedItem→extractSnapbackItem→extractTooltip— via un nouveauMixinScreenPopupRender, pour que la popup se compose sur la strate la plus haute. La popup de recette est maintenant entièrement au premier plan et sélectionnable sur les trois jars.
### Fixed
- Recipe-selection popup drawn under the grid items (z-order)** — The recipe-selection popup rendered *behind* the crafting-grid item icons, so the grid items showed through it and the recipe icons could not be read or clicked. Cause: Minecraft renders all GUI item icons on a fixed high depth layer (
renderItemtranslates to Z=232 on 1.21.1; the carried-item / tooltip phases composite on later strata on 26.x), so even though the popup was drawn at the screen's render tail its flat background sat below the items. On **1.21.1** the whole popup (and the first-open tutorial card) is now drawn inside a pose pushed to Z=400, above the item layer. On **26.1.2** the popup render was moved off RS'sextractContents(the first of four extract phases) onto vanillaAbstractContainerScreen.extractRenderStateat RETURN — the only point that runs afterextractContents→extractCarriedItem→extractSnapbackItem→extractTooltip— via a newMixinScreenPopupRender, so the popup composites on the topmost stratum. The recipe popup is now fully on top and selectable on all three jars.
### Ajouts / Correctifs / Modifications / Performance (French mirror)
### Correctifs
- Popup de sélection de recette affichée sous les items de la grille (ordre de profondeur)** — La popup de sélection s'affichait *derrière* les icônes d'items de la grille de craft : les items transparaissaient par-dessus et les icônes de recette étaient illisibles et incliquables. Cause : Minecraft rend toutes les icônes d'items de GUI sur une couche de profondeur élevée fixe (
renderItemtranslate en Z=232 sur 1.21.1 ; les phases item-porté / infobulle se composent sur des strates ultérieures en 26.x), donc même dessinée en fin de rendu, le fond plat de la popup restait sous les items. Sur **1.21.1**, toute la popup (et la carte de tutoriel de première ouverture) est désormais dessinée dans une pose poussée à Z=400, au-dessus de la couche des items. Sur **26.1.2**, le rendu de la popup a été déplacé deextractContentsde RS (la première des quatre phases d'extraction) versAbstractContainerScreen.extractRenderStatevanilla en RETURN — le seul point exécuté aprèsextractContents→extractCarriedItem→extractSnapbackItem→extractTooltip— via un nouveauMixinScreenPopupRender, pour que la popup se compose sur la strate la plus haute. La popup de recette est maintenant entièrement au premier plan et sélectionnable sur les trois jars.
### Added
- Standalone — no Polymorph dependency** — RS Polymorph no longer requires the Polymorph mod. The recipe-selection UI (side button + popup) and the per-grid selection persistence are now provided entirely by RS Polymorph itself. The side button is the native Refined Storage
AbstractSideButtonWidget; the popup is a self-containedRecipeSelectorPopup(own item-grid widget + render/click mixin on the grid screen); the per-grid choice is persisted on the grid block entity via loader Data Attachments (NeoForgeAttachmentType/ Fabric persistent attachment) behind aServices.GRID_STOREabstraction. The printed-pattern tag stays a vanillaDataComponentType. The Polymorph-only classes (RsGridRecipeData,MixinSelectionWidget,MixinRecipeManagerSafety) were removed. Result: a true Refined Storage add-on that works everywhere RS does, with no third-party recipe-selection dependency. - Minecraft 26.1.2 / Refined Storage 3.2.0 (NeoForge)** — A parallel build targets the new Minecraft 26.1.2 (year-based versioning, Java 25) against Refined Storage 3.2.0, sharing the 1.21.1 codebase. RS 3.x kept the same
com.refinedmods.refinedstorage.common.*structure, so the mixins carry over; the few MC 26.x renames (ResourceLocation→Identifier,GuiGraphics→GuiGraphicsExtractor) are applied by a build-time source remap, and the handful of files touching the reworked recipe API (server.getRecipeManager()/RS3RecipeProvider, single-argassemble,RecipeHolder.id()now aResourceKey) and the new two-phase GUI render pipeline (extractRenderState/extractContents) are forked undercommon-261.MixinPatternResolveris re-targeted with@WrapOperationonto RS3'sPlatform.getClientRecipeProvider().getRecipesFor(...). Build with Gradle on JDK 25:./gradlew :neoforge-261:build -Dorg.gradle.java.home=<jdk25>. - Fabric support — one mod, two loaders** — RS Polymorph now ships for **Fabric** in addition to NeoForge, both for Minecraft 1.21.1. The project was restructured into a MultiLoader layout (
common+neoforge+fabric): all gameplay logic and every mixin live incommonand are shared verbatim by both loaders. Because the mixins target Refined Storage 2 and Polymorph classes (never Minecraft) withremap=false, and both RS2 and Polymorph ship their public surface in a shared cross-loader module, the injection logic resolves byte-for-byte identically on NeoForge and Fabric with no per-loader rewrite. - Loader-agnostic core** — Introduced a small platform abstraction so
commonnever references a loader API:Services/NetworkPlatformresolve the active loader's networking viaServiceLoader, theselected_recipedata component is registered by each loader and injected into the shared core, andSelectRecipePacketexposes a pureapplyOnServer(ServerPlayer, ResourceLocation)that each loader drives from its own packet receiver (NeoForgeIPayloadContext, Fabric `ServerPlayNetwor
### Added
- Standalone — no Polymorph dependency** — RS Polymorph no longer requires the Polymorph mod. The recipe-selection UI (side button + popup) and the per-grid selection persistence are now provided entirely by RS Polymorph itself. The side button is the native Refined Storage
AbstractSideButtonWidget; the popup is a self-containedRecipeSelectorPopup(own item-grid widget + render/click mixin on the grid screen); the per-grid choice is persisted on the grid block entity via loader Data Attachments (NeoForgeAttachmentType/ Fabric persistent attachment) behind aServices.GRID_STOREabstraction. The printed-pattern tag stays a vanillaDataComponentType. The Polymorph-only classes (RsGridRecipeData,MixinSelectionWidget,MixinRecipeManagerSafety) were removed. Result: a true Refined Storage add-on that works everywhere RS does, with no third-party recipe-selection dependency. - Minecraft 26.1.2 / Refined Storage 3.2.0 (NeoForge)** — A parallel build targets the new Minecraft 26.1.2 (year-based versioning, Java 25) against Refined Storage 3.2.0, sharing the 1.21.1 codebase. RS 3.x kept the same
com.refinedmods.refinedstorage.common.*structure, so the mixins carry over; the few MC 26.x renames (ResourceLocation→Identifier,GuiGraphics→GuiGraphicsExtractor) are applied by a build-time source remap, and the handful of files touching the reworked recipe API (server.getRecipeManager()/RS3RecipeProvider, single-argassemble,RecipeHolder.id()now aResourceKey) and the new two-phase GUI render pipeline (extractRenderState/extractContents) are forked undercommon-261.MixinPatternResolveris re-targeted with@WrapOperationonto RS3'sPlatform.getClientRecipeProvider().getRecipesFor(...). Build with Gradle on JDK 25:./gradlew :neoforge-261:build -Dorg.gradle.java.home=<jdk25>. - Fabric support — one mod, two loaders** — RS Polymorph now ships for **Fabric** in addition to NeoForge, both for Minecraft 1.21.1. The project was restructured into a MultiLoader layout (
common+neoforge+fabric): all gameplay logic and every mixin live incommonand are shared verbatim by both loaders. Because the mixins target Refined Storage 2 and Polymorph classes (never Minecraft) withremap=false, and both RS2 and Polymorph ship their public surface in a shared cross-loader module, the injection logic resolves byte-for-byte identically on NeoForge and Fabric with no per-loader rewrite. - Loader-agnostic core** — Introduced a small platform abstraction so
commonnever references a loader API:Services/NetworkPlatformresolve the active loader's networking viaServiceLoader, theselected_recipedata component is registered by each loader and injected into the shared core, andSelectRecipePacketexposes a pureapplyOnServer(ServerPlayer, ResourceLocation)that each loader drives from its own packet receiver (NeoForgeIPayloadContext, Fabric `ServerPlayNetwor
### Added
- Standalone — no Polymorph dependency** — RS Polymorph no longer requires the Polymorph mod. The recipe-selection UI (side button + popup) and the per-grid selection persistence are now provided entirely by RS Polymorph itself. The side button is the native Refined Storage
AbstractSideButtonWidget; the popup is a self-containedRecipeSelectorPopup(own item-grid widget + render/click mixin on the grid screen); the per-grid choice is persisted on the grid block entity via loader Data Attachments (NeoForgeAttachmentType/ Fabric persistent attachment) behind aServices.GRID_STOREabstraction. The printed-pattern tag stays a vanillaDataComponentType. The Polymorph-only classes (RsGridRecipeData,MixinSelectionWidget,MixinRecipeManagerSafety) were removed. Result: a true Refined Storage add-on that works everywhere RS does, with no third-party recipe-selection dependency. - Minecraft 26.1.2 / Refined Storage 3.2.0 (NeoForge)** — A parallel build targets the new Minecraft 26.1.2 (year-based versioning, Java 25) against Refined Storage 3.2.0, sharing the 1.21.1 codebase. RS 3.x kept the same
com.refinedmods.refinedstorage.common.*structure, so the mixins carry over; the few MC 26.x renames (ResourceLocation→Identifier,GuiGraphics→GuiGraphicsExtractor) are applied by a build-time source remap, and the handful of files touching the reworked recipe API (server.getRecipeManager()/RS3RecipeProvider, single-argassemble,RecipeHolder.id()now aResourceKey) and the new two-phase GUI render pipeline (extractRenderState/extractContents) are forked undercommon-261.MixinPatternResolveris re-targeted with@WrapOperationonto RS3'sPlatform.getClientRecipeProvider().getRecipesFor(...). Build with Gradle on JDK 25:./gradlew :neoforge-261:build -Dorg.gradle.java.home=<jdk25>. - Fabric support — one mod, two loaders** — RS Polymorph now ships for **Fabric** in addition to NeoForge, both for Minecraft 1.21.1. The project was restructured into a MultiLoader layout (
common+neoforge+fabric): all gameplay logic and every mixin live incommonand are shared verbatim by both loaders. Because the mixins target Refined Storage 2 and Polymorph classes (never Minecraft) withremap=false, and both RS2 and Polymorph ship their public surface in a shared cross-loader module, the injection logic resolves byte-for-byte identically on NeoForge and Fabric with no per-loader rewrite. - Loader-agnostic core** — Introduced a small platform abstraction so
commonnever references a loader API:Services/NetworkPlatformresolve the active loader's networking viaServiceLoader, theselected_recipedata component is registered by each loader and injected into the shared core, andSelectRecipePacketexposes a pureapplyOnServer(ServerPlayer, ResourceLocation)that each loader drives from its own packet receiver (NeoForgeIPayloadContext, Fabric `ServerPlayNetwor
### Added
- Wireless Crafting Grid compatibility** (issue #2) — Polymorph recipe switching now works in the [Refined Storage - Quartz Arsenal](https://www.curseforge.com/minecraft/mc-mods/refined-storage-quartz-arsenal) Wireless Crafting Grid. The side button already appeared (the wireless menu extends RS2's
AbstractCraftingGridContainerMenu, so the screen is anAbstractGridScreen), but clicking a recipe did nothing because the entire selection bridge was keyed on aBlockEntityand the wireless grid has none — it is a transient, player-boundCraftingGridbuilt from a held item. Added aBlockEntity-free selection path:AccessorAbstractCraftingGridContainerMenuexposes the menu'scraftingGrid,SelectRecipePacketresolves itsRecipeMatrixfrom the existingCONTAINER_TO_MATRIXregistry and drivesupdateResult, and a new per-matrix selection store keeps the choice sticky across input changes (the wireless equivalent ofRsGridRecipeData.selections). The result reaches the client through the menu's crafting result slot on the nextbroadcastChangestick — the same path the wired grid uses.
### Fixed
- Wireless selection mis-routed onto an unrelated wired grid** —
SelectRecipePacket.findBlockEntityhad a global reverse-scan fallback that returned the first registered grid carrying Polymorph data regardless of which menu was open. For a wireless grid (which yields noBlockEntity) in a world with any loaded wired grid, the selection was applied to that unrelated wired grid and silently corrupted it. Removed the fallback; resolution is now strictly scoped to the open menu (slot scan, then grid-field accessor).
### Performance
- No per-open memory leak for wireless grids** — Each opened wireless grid creates a
RecipeMatrixregistered inCONTAINER_TO_MATRIX, which strong-references it with no removal hook, so aWeakHashMapselection store alone could never reclaim it. AddedMixinAbstractGridContainerMenu, aremoved(Player)hook that deterministically unregisters the matrix and its selection on menu close — but only for grids with noBlockEntity, so the wired grid'sBlockEntity-owned mapping is never dropped (guarded byinstanceof BlockEntity). The per-matrix store is also guarded so it can never shadow aBlockEntity-backed selection.
### Compatibility
- Quartz Arsenal is an optional, soft dependency** — Declared
optionalinneoforge.mods.toml. No Quartz Arsenal class is referenced anywhere in the source: the accessor targets the Refined Storage 2 base classAbstractCraftingGridContainerMenu, so the fix applies to the wireless grid (which extends it) and to any futureBlockEntity-free crafting grid, with no compile-time dependency on the addon. The mod loads and runs unchanged when Quartz Arsenal is absent.
### Ajouts
- Compatibilité Wireless Crafting Grid** (issue #2) — Le changement de recette Polymorph fonctionne désormais dans la Wireless Crafting G















