modernxl_3-3.0.0-1.21.1.jar
Curse Maven Snippet
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 withChannelBuilder.named(...).networkProtocolVersion(...).simpleChannel()PacketDistributor.sendToServer(...)(never a real API) replaced withPACKET_HANDLER.send(message, PacketDistributor.SERVER.noArg())- Argument order for
Channel.send(): message first, target second (reversed compared to older Forge versions) ...GUIButtonPayloadrenamed to...GUIButtonMessagein 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 aHolderLookup.Provider(world.registryAccess());.load()becomes.loadWithComponents(tag, provider)ContainerHelper.loadAllItems/saveAllItems→ 3rd argumentHolderLookup.ProviderrequiredFoodData.eat(float)removed →eat(int nutrition, float saturationModifier)(convention chosen here:(int)value, 0.6F)Inventory.getSelected()now returns theItemStack(no longer the index) → the selected slot index is the public field.selectedMobEffects.*are nowHolder<MobEffect>, no longer rawMobEffectDoorBlock: constructor argument order reversed →(BlockSetType, Properties)Model#renderToBuffer: 5 arguments with color combined into a singleint(instead of 4 separate floats);ModelPart#renderkeeps its name (unlikeModel)MerchantOffer: the first argument (cost) must be anItemCost, not a rawItemStackServerLevel#sendParticles(notspawnParticle)PacketDistributor.PLAYER.with(x): direct value, no more() -> xlambda
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/(theblocks/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) BlockStateself-reassignments with a different name on the left and right side (_bs4 = _bs3.setValue(...)instead of_bs3 = _bs3.setValue(...))getDamageValue()(int) compared against anIteminstead of.getItem()getInventory()used instead ofgetFoodData()
6. Functional bugs found through in-game testing
- Oil diffuser / other ticking blocks: method named
randomTickwhile the block reschedules itself viaworld.scheduleTick(...)→ must be namedtick. 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 withParticleTypes.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 andorchide_red, likely a leftover from the original Blockbench export, not fixed) minecraft:grass(renamedminecraft:short_grassin 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é parChannelBuilder.named(...).networkProtocolVersion(...).simpleChannel()PacketDistributor.sendToServer(...)(jamais une vraie API) remplacé parPACKET_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) ...GUIButtonPayloadrenommé en...GUIButtonMessagedans 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 unHolderLookup.Provider(world.registryAccess()) ;.load()devient.loadWithComponents(tag, provider)ContainerHelper.loadAllItems/saveAllItems→ 3ᵉ argumentHolderLookup.ProviderrequisFoodData.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.selectedMobEffects.*sont maintenant desHolder<MobEffect>, plus desMobEffectbrutsDoorBlock: ordre des arguments du constructeur inversé →(BlockSetType, Properties)Model#renderToBuffer: 5 arguments avec couleur combinée en un seulint(au lieu de 4 floats séparés) ;ModelPart#rendergarde son nom (contrairement àModel)MerchantOffer: le premier argument (coût) doit être unItemCost, pas unItemStackbrutServerLevel#sendParticles(passpawnParticle)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-dossierblocks/À 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
BlockStateavec un nom différent à gauche et à droite (_bs4 = _bs3.setValue(...)au lieu de_bs3 = _bs3.setValue(...)) getDamageValue()(int) comparé à unItemau lieu de.getItem()getInventory()utilisé à la place degetFoodData()
6. Bugs fonctionnels trouvés en testant en jeu
- Diffuseur d'huile / autres blocs à tick : méthode nommée
randomTickalors que le bloc se re-programme lui-même viaworld.scheduleTick(...)→ doit s'appelertick. 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é parParticleTypes.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 etorchide_red, probablement un oubli d'export Blockbench d'origine, non corrigé) minecraft:grass(renomméminecraft:short_grassen 1.20.3/1.20.4) corrigé dans le worldgen (ail/poireau/oignon stage 2)
This mod has no additional files

