promotional bannermobile promotional banner

ModernXL 3

A modern decoration/furtniture mod that allows you to create pleasant interiors in Minecraft!
Back to Files

modernxl_3-3.0.0-1.21.1.jar

File namemodernxl_3-3.0.0-1.21.1.jar
Uploader
Ragnar_8395Ragnar_8395
Uploaded
Aug 2, 2026
Downloads
18
Size
75.0 MB
Mod Loaders
Forge
File ID
8563439
Type
R
Release
Supported game versions
  • 1.21.1

Curse Maven Snippet

Forge

implementation "curse.maven:modernxl-3-1636620:8563439"

Learn more about Curse Maven

What's new

Modernxl_II — Forge Port 1.20.1 → 1.21.1 ↓FR↓

Technical project summary. Reference document explaining what was done, why, and what remains open.


Overview

  • Original mod: Modernxl 2: Survival (Mathibus, MCreator) — CurseForge
  • License: CC BY-NC 3.0
  • Port by: Ragnar_8395
  • Starting point: ~22,500 compilation errors
  • End result: 0 errors, mod fully working in-game

Main categories of fixes

1. Networking (SimpleChannel / ChannelBuilder)

  • NetworkRegistry.newSimpleChannel(...) replaced with ChannelBuilder.named(...).networkProtocolVersion(...).simpleChannel()
  • PacketDistributor.sendToServer(...) (never a real API) replaced with PACKET_HANDLER.send(message, PacketDistributor.SERVER.noArg())
  • Argument order for Channel.send(): message first, target second (reversed compared to older Forge versions)
  • ...GUIButtonPayload renamed to ...GUIButtonMessage in screen classes (import + usages)

2. Mass renaming of leftover SRG identifiers

Dozens of m_XXXXX_/f_XXXXX_ methods left untranslated to their Mojang names after the automated renaming tool. Fixed progressively, including: newBlockEntity, getShape, getCollisionShape, createBlockStateDefinition, getStateForPlacement, rotate, mirror, getMenuProvider, propagatesSkylightDown, getLightBlock, hasAnalogOutputSignal, getAnalogOutputSignal, entityInside, dynamicShape, stillValid, quickMoveStack, moveItemStackTo, build (BlockEntityType.Builder), sendParticles, setupAnim, renderToBuffer, addOrReplaceChild, addBox.

⚠️ These SRG names do NOT cause compile errors when they simply fail to override an optional method (the block compiles, but its actual behavior — shape, rotation, redstone — can stay silently broken). If a block behaves oddly in-game with no compile error, check first whether it still contains any m_XXXXX_/f_XXXXX_.

3. APIs changed between 1.20.1 and 1.21.1

  • ResourceLocation: no public constructor anymore → ResourceLocation.parse(...) (1 argument) or .fromNamespaceAndPath(ns, path) (2 arguments)
  • BlockEntity.saveWithoutMetadata() / .load() → now require a HolderLookup.Provider (world.registryAccess()); .load() becomes .loadWithComponents(tag, provider)
  • ContainerHelper.loadAllItems/saveAllItems → 3rd argument HolderLookup.Provider required
  • FoodData.eat(float) removed → eat(int nutrition, float saturationModifier) (convention chosen here: (int)value, 0.6F)
  • Inventory.getSelected() now returns the ItemStack (no longer the index) → the selected slot index is the public field .selected
  • MobEffects.* are now Holder<MobEffect>, no longer raw MobEffect
  • DoorBlock: constructor argument order reversed → (BlockSetType, Properties)
  • Model#renderToBuffer: 5 arguments with color combined into a single int (instead of 4 separate floats); ModelPart#render keeps its name (unlike Model)
  • MerchantOffer: the first argument (cost) must be an ItemCost, not a raw ItemStack
  • ServerLevel#sendParticles (not spawnParticle)
  • PacketDistributor.PLAYER.with(x): direct value, no more () -> x lambda

4. Data folders renamed to singular in 1.21 (vanilla — independent of Forge/NeoForge)

Important empirical discovery, confirmed in-game (/execute if block ... #minecraft:walls):

  • data/<namespace>/recipes/recipe/
  • data/<namespace>/loot_tables/loot_table/ (the blocks/ subfolder INSIDE it stays plural, e.g. loot_table/blocks/xxx.json)
  • data/minecraft/tags/blocks/tags/block/
  • Likely also tags/items/tags/item/, tags/entity_types/tags/entity_type/, tags/fluids/tags/fluid/, tags/game_events/tags/game_event/ (same principle, check if used)

Without this renaming: recipes, loot tables, and tags (including wall-to-wall connections) fail to load at all, with no visible error.

5. Pre-existing renaming bugs (not version-related, inherited from an earlier renaming session)

  • Variables reused in sequence where each reappearance got an incrementing digit instead of keeping the same name (_be2, _ent3, etc. instead of _be, _ent)
  • BlockState self-reassignments with a different name on the left and right side (_bs4 = _bs3.setValue(...) instead of _bs3 = _bs3.setValue(...))
  • getDamageValue() (int) compared against an Item instead of .getItem()
  • getInventory() used instead of getFoodData()

6. Functional bugs found through in-game testing

  • Oil diffuser / other ticking blocks: method named randomTick while the block reschedules itself via world.scheduleTick(...) → must be named tick. Both methods share the same signature, so no compile error — just an effect that almost never triggers (the game's random tick instead of the scheduled one).
  • Shower: ParticleTypes.FLASH (respawn anchor light flash) used by mistake instead of a water particle → replaced with ParticleTypes.FALLING_WATER.
  • All lamps: brightness raised to 15 (max).

Known unresolved issue: "Fusion" blocks

Furniture pieces marked "[Fusion]" (offset boxes, drawer tops) have a model that deliberately overflows one block into the neighboring space. In 1.20.1, placement is precise. In 1.21.1, the code and models are byte-for-byte identical (verified), yet placement has become imprecise — the crosshair hits the overflowing visual geometry rather than the actual collision box.

→ Likely cause: Minecraft 1.21.1 itself handles placement raycasting and/or collision shapes differently for this "overflowing model" pattern. Not a mod bug. Fixing it would require redesigning the affected models (containing the geometry within a single block, or handling the offset through code instead).


PowerShell scripts created during the port

All in the project's root folder (can be removed once the port is stable, or kept for reference):

Script Purpose
Fix-ModPorting.ps1 Round 1: scope-aware renaming for duplicate variables, basic mechanical fixes (ResourceLocation, UnmodifiableIterator, lambdas, playSound)
Fix-ModPorting-Round2.ps1 The bulk of the work — 47 cumulative fixes (see conversation history for full detail on each)
Fix-BrokenVarSuffix.ps1 / Fix-ReusedVarSuffix.ps1 Targeted fixes for wrong numeric-suffix variable bugs
Fix-TablesPlacedBso.ps1 Line-by-line fix for one specific file
Fix-DepluralizedFolders.ps1 Renames recipes/loot_tables/tags/blocks folders to singular
Fix-LampBrightness.ps1 Sets all lamps' brightness to 15
Fix-PlaySoundBoolean.ps1 Removes the extra trailing boolean in some playSound calls
Fix-ImportVar.ps1 Cleans up invalid var imports left by an earlier script bug

French translation

assets/modernxl_ii/lang/fr_fr.json — a mechanical, dictionary-based translation of all 904 entries (not a human translation). Good vocabulary coverage (colors, materials, furniture types), but gender agreement is not handled systematically. An Excel file (Modernxl_II_Traductions.xlsx) lists technical ID / EN name / FR name to help with manual corrections later.


Assets verified

  • 3,416 JSON files (assets + data) syntax-checked: 100% valid
  • 340 PNG textures checked: none corrupted
  • Models/blockstates: every referenced model exists, every referenced texture exists (except one gap: an empty "missing" texture on the clocks and orchide_red, likely a leftover from the original Blockbench export, not fixed)
  • minecraft:grass (renamed minecraft:short_grass in 1.20.3/1.20.4) fixed in worldgen (garlic/leek/onion stage 2)

Modernxl_II — Portage Forge 1.20.1 → 1.21.1

Résumé technique du portage. Document de référence pour comprendre ce qui a été fait, pourquoi, et ce qui reste en suspens.


Vue d'ensemble

  • Mod d'origine : Modernxl 2: Survival (Mathibus, MCreator) — CurseForge
  • Licence : CC BY-NC 3.0
  • Portage réalisé par : Ragnar_8395
  • Point de départ : ~22 500 erreurs de compilation
  • Point d'arrivée : 0 erreur, mod fonctionnel en jeu

Grandes catégories de correctifs

1. Réseau (SimpleChannel / ChannelBuilder)

  • NetworkRegistry.newSimpleChannel(...) remplacé par ChannelBuilder.named(...).networkProtocolVersion(...).simpleChannel()
  • PacketDistributor.sendToServer(...) (jamais une vraie API) remplacé par PACKET_HANDLER.send(message, PacketDistributor.SERVER.noArg())
  • Ordre des arguments de Channel.send() : message d'abord, cible ensuite (inversé par rapport aux anciennes versions de Forge)
  • ...GUIButtonPayload renommé en ...GUIButtonMessage dans les écrans (import + usages)

2. Renommage massif des identifiants SRG résiduels

Des dizaines de méthodes m_XXXXX_/f_XXXXX_ non traduites en noms Mojang après l'outil de renommage automatique. Corrigées au fur et à mesure, notamment : newBlockEntity, getShape, getCollisionShape, createBlockStateDefinition, getStateForPlacement, rotate, mirror, getMenuProvider, propagatesSkylightDown, getLightBlock, hasAnalogOutputSignal, getAnalogOutputSignal, entityInside, dynamicShape, stillValid, quickMoveStack, moveItemStackTo, build (BlockEntityType.Builder), sendParticles, setupAnim, renderToBuffer, addOrReplaceChild, addBox.

⚠️ Ces noms SRG ne causent PAS d'erreur de compilation quand ils ne font que ne pas surcharger une méthode optionnelle (le bloc compile, mais son comportement réel — forme, rotation, redstone — peut rester silencieusement cassé). Si un bloc se comporte bizarrement en jeu sans erreur de compilation, vérifier en premier s'il reste des m_XXXXX_/f_XXXXX_ dedans.

3. API changées entre 1.20.1 et 1.21.1

  • ResourceLocation : plus de constructeur public → ResourceLocation.parse(...) (1 argument) ou .fromNamespaceAndPath(ns, path) (2 arguments)
  • BlockEntity.saveWithoutMetadata() / .load() → demandent un HolderLookup.Provider (world.registryAccess()) ; .load() devient .loadWithComponents(tag, provider)
  • ContainerHelper.loadAllItems/saveAllItems → 3ᵉ argument HolderLookup.Provider requis
  • FoodData.eat(float) supprimé → eat(int nutrition, float saturationModifier) (convention choisie ici : (int)valeur, 0.6F)
  • Inventory.getSelected() retourne maintenant l'ItemStack (plus l'index) → l'index de slot est le champ public .selected
  • MobEffects.* sont maintenant des Holder<MobEffect>, plus des MobEffect bruts
  • DoorBlock : ordre des arguments du constructeur inversé → (BlockSetType, Properties)
  • Model#renderToBuffer : 5 arguments avec couleur combinée en un seul int (au lieu de 4 floats séparés) ; ModelPart#render garde son nom (contrairement à Model)
  • MerchantOffer : le premier argument (coût) doit être un ItemCost, pas un ItemStack brut
  • ServerLevel#sendParticles (pas spawnParticle)
  • PacketDistributor.PLAYER.with(x) : valeur directe, plus de lambda () -> x

4. Dossiers de données renommés au singulier (1.21, vanilla — indépendant de Forge/NeoForge)

Découverte empirique importante, confirmée en jeu (/execute if block ... #minecraft:walls) :

  • data/<namespace>/recipes/recipe/
  • data/<namespace>/loot_tables/loot_table/ (le sous-dossier blocks/ À L'INTÉRIEUR reste au pluriel, ex: loot_table/blocks/xxx.json)
  • data/minecraft/tags/blocks/tags/block/
  • Probablement aussi tags/items/tags/item/, tags/entity_types/tags/entity_type/, tags/fluids/tags/fluid/, tags/game_events/tags/game_event/ (mêmes principes, à vérifier si utilisés)

Sans ce renommage : recettes, loot tables et tags (dont la connexion des murs entre eux) ne se chargent pas du tout, sans aucune erreur visible.

5. Bugs de renommage préexistants (pas liés à la version, hérités d'une session de renommage antérieure)

  • Variables réutilisées en séquence dont chaque réapparition avait reçu un chiffre incrémental au lieu de garder le même nom (_be2, _ent3, etc. au lieu de _be, _ent)
  • Auto-réaffectations BlockState avec un nom différent à gauche et à droite (_bs4 = _bs3.setValue(...) au lieu de _bs3 = _bs3.setValue(...))
  • getDamageValue() (int) comparé à un Item au lieu de .getItem()
  • getInventory() utilisé à la place de getFoodData()

6. Bugs fonctionnels trouvés en testant en jeu

  • Diffuseur d'huile / autres blocs à tick : méthode nommée randomTick alors que le bloc se re-programme lui-même via world.scheduleTick(...) → doit s'appeler tick. Les deux méthodes ont la même signature donc aucune erreur de compilation, juste un déclenchement quasi jamais (tick aléatoire du jeu au lieu du tick programmé).
  • Douche : ParticleTypes.FLASH (flash lumineux du respawn anchor) utilisé par erreur à la place d'une particule d'eau → remplacé par ParticleTypes.FALLING_WATER.
  • Toutes les lampes : luminosité remontée à 15 (max).

Problème connu non résolu : blocs "Fusion"

Les meubles marqués "[Fusion]" (boîtes décalées, dessus de tiroir) ont un modèle qui déborde volontairement d'un bloc dans la case voisine. En 1.20.1, le placement est précis. En 1.21.1, le code et les modèles sont strictement identiques (vérifié au bit près), mais le placement est devenu imprécis — le viseur touche le débordement visuel plutôt que la vraie hitbox.

→ Cause probable : Minecraft 1.21.1 lui-même gère différemment le raycast de placement et/ou les formes de collision pour ce motif de "modèle qui déborde". Pas un bug du mod. Corriger nécessiterait de redesigner les modèles concernés (contenir la géométrie dans un seul bloc, ou gérer le décalage par le code).


Scripts PowerShell créés pendant le portage

Tous dans le dossier racine du projet (peuvent être supprimés une fois le portage stabilisé, ou gardés en référence) :

Script Rôle
Fix-ModPorting.ps1 Round 1 : renommage de portée pour variables dupliquées, corrections mécaniques de base (ResourceLocation, UnmodifiableIterator, lambdas, playSound)
Fix-ModPorting-Round2.ps1 Le gros du travail — 47 correctifs cumulés (voir historique de conversation pour le détail complet de chaque fix)
Fix-BrokenVarSuffix.ps1 / Fix-ReusedVarSuffix.ps1 Correctifs ciblés pour les bugs de variables à suffixe numérique erroné
Fix-TablesPlacedBso.ps1 Correctif ligne-par-ligne pour un fichier spécifique
Fix-DepluralizedFolders.ps1 Renommage des dossiers recipes/loot_tables/tags/blocks vers le singulier
Fix-LampBrightness.ps1 Luminosité de toutes les lampes à 15
Fix-PlaySoundBoolean.ps1 Retrait du booléen final en trop dans certains appels playSound
Fix-ImportVar.ps1 Nettoyage des imports var invalides issus d'un bug de script antérieur

Traduction française

assets/modernxl_ii/lang/fr_fr.json — traduction mécanique par dictionnaire des 904 entrées (pas une traduction humaine). Bonne couverture du vocabulaire (couleurs, matériaux, types de meubles), mais les accords de genre ne sont pas gérés systématiquement. Un fichier Excel (Modernxl_II_Traductions.xlsx) liste ID technique / nom EN / nom FR pour faciliter les corrections manuelles ultérieures.


Assets vérifiés

  • 3 416 fichiers JSON (assets + data) validés syntaxiquement : 100% valides
  • 340 textures PNG vérifiées : aucune corrompue
  • Modèles/blockstates : tous les modèles référencés existent, toutes les textures référencées existent (sauf 1 trou : texture "missing" vide sur les horloges et orchide_red, probablement un oubli d'export Blockbench d'origine, non corrigé)
  • minecraft:grass (renommé minecraft:short_grass en 1.20.3/1.20.4) corrigé dans le worldgen (ail/poireau/oignon stage 2)

This mod has no additional files