Source: https://forum.minecraft-france.fr/threads/class-modifi%C3%A9s-pour-faciliter-le-map-making.34266/
Timestamp: 2020-07-06 08:30:46+00:00

Document:
Mapping - .class modifiés pour faciliter le map-making | Forum - Minecraft-France
Après une longue pause je vais reprendre les tutoriels, et aujourd’hui nous n’allons pas parler d’une fonctionnalité oubliée mais plutôt d’une fonctionnalité inexistante de base mais bien pratique pour le map-making. Il s’agit de quelque chose dont vous avez possiblement déjà entendu parler sans forcément vous y intéresser : les .class modifiées (que je désignerai de manière random au masculin comme fichier ou au féminin comme classe).
Il s’agit tout simplement de bouts de code du jeu qui ont été modifiés afin, pour la plupart, non pas d’introduire mais de débloquer certaines possibilités limitées par le jeu. Nous ne parlerons pas ici de la manière de les créer, mais de comment les installer puisque la méthode s’est un peu complexifiée depuis les dernières versions.
Vous trouverez vers la fin du post un lien vers mon onedrive où je mettrais des versions prêtes à l'utilisation ainsi que les class pour leurs versions spécifiques (vu qu’ils peuvent varier d’une update à l’autre). Vous aurez besoin pour la suite de ce tutoriel d’un logiciel pouvant ouvrir les archives .jar comme 7zip ou Winrar et d’un éditeur de .json (il y en a plusieurs mais le plus connu reste Notepad++).
1. Comment se compose une version :
Depuis l’arrivée du nouveau launcher en 1.6 la manière dont minecraft gère ses versions a été modifiée. Auparavant il fallait soi-même changer le .jar dans le .minecraft\bin et il existait d’ailleurs des logiciels comme Magic Launcher pour créer plusieurs profils et en changer facilement. Maintenant cette fonctionnalité est intégrée au jeu et nous allons d’ailleurs l’exploiter par la suite, mais continuons nos explications.
Les versions sont maintenant stockées dans le dossier .minecraft\versions. Ici vous trouverez plusieurs dossiers correspondant chacun à une version différente utilisable par le jeu. De base ils possèdent le nom de la version en question, mais il est possible de l’éditer ou de créer une toute nouvelle version.
Ces dossiers contiennent deux fichiers : une archive .jar similaire à l’ancienne du dossier bin contenant le code du jeu et un .json contenant divers paramètres de lancement tels que l’appel des librairies nécessaires au fonctionnement, le nom de la version ou son type (release, snapshot, etc…) et d’autres paramètres dont nous reparlerons plus tard.
2. Les class modifiés :
En ouvrant votre archive .jar vous pourrez voir un très grand nombre de fichiers .class. Il s’agit des fameux bouts de code du jeu qui sont dits "obfuscated", c’est-à-dire que les fonctions ne portent pas leur nom de base mais un nom composé de lettres random ce qui rend le code difficile à explorer et les recherches d'une partie particulière ardues.
Pour retrouver le nom de base de ces .class et pouvoir les éditer il faudrait décompiler le code du jeu grâce à Minecraft Coder pack. Fort heureusement pour nous, la recompilation d’une version garde les mêmes noms pour chaque fonction, il est donc possible d’insérer des bouts de codes modifiés par une unique personne au milieu du reste et ils fonctionneront.
Avant de vous montrer leur installation je vais décrire l’utilité des .class qui vous seront proposées ici, il est possible que d’autres arrivent plus tard auquel cas je les détaillerai également.
A. Utiliser du formatage directement en jeu :
La première classe vous permettra d’utiliser le fameux symbole § permettant le formatage du texte directement en jeu, afin d’éviter le recourt à un programme extérieur.
Nous allons d'abord modifier la classe « ChatAllowedCharacters » ("SharedConstants" désormais).
public static final char[] allowedCharactersArray = new char[] {'/', '\n', '\r', '\t', '\u0000', '\f', '`', '?', '*', '\\', '<', '>', '|', '\"', ':'};
public static boolean isAllowedCharacter(char character)
return character != 167 && character >= 32 && character != 127;
Cette dernière permet de définir des caractères dont l’utilisation en jeu sera bloquée, et le caractère d’identifiant "167" correspond, comme vous l’avez deviné au §. En enlevant cette petite partie nous pourrons débloquer son utilisation, ce qui donne ceci :
return character >= 32 && character != 127;
Vous pourrez alors utiliser en jeu le §. Etant un caractère de formatage il ne sera visible que jusqu’à ce que vous rentriez un nouveau caractère définissant le formatage choisi (bien que vous puissiez le faire réapparaitre en vous déplaçant dans un texte, mais il n’apparaitra pas lorsque le texte sera affiché en jeu). Voici un rappel des différentes modifications applicables (pour plus d’info vous pouvez consulter le wiki) :
Les couleurs : §0 noir, §1 bleu foncé, §2 vert foncé, §3 turquoise foncé, §4 rouge foncé, §5 violet foncé, §6 or, §7 gris, §8 gris foncé, §9 bleu, §a vert, §b turquoise, §c rouge, §d violet, §e jaune, §f blanc
Les mises en forme : §l gras, §m barré, §n souligné, §o italique
Les spéciaux : §r reset annule tout formatage précédent (il met fin à la chaîne formatée précédemment pour revenir au texte du base qui peut également être formaté différemment), §k obfuscate qui fait changer les caractères très rapidement de manière random
B. Etendre son chat jusqu’à la capacité d’un bloc de commande :
Qui n’a jamais ragé en tapant une commande de buter contre la limite de caractères du chat ? Grâce à ici non pas une mais deux classes modifiés nous allons pouvoir étendre cette limite jusqu’à 32 767 caractères, permettant ainsi de faire des commandes entières en chat avant de pouvoir les copier-coller ailleurs, ou tout simplement de les stocker dans l’historique pour pouvoir les reprendre plus tard ou déplacer des systèmes.
La première classe qui sera modifiée est « GuiChat » ("ChatScreen" désormais), voici la partie qui nous intéresse :
this.sentHistoryCursor = this.mc.ingameGUI.getChatGUI().getSentMessages().size();
this.inputField = new GuiTextField(0, this.fontRendererObj, 4, this.height - 12, this.width - 4, 12);
this.inputField.setMaxStringLength(100);
this.inputField.setEnableBackgroundDrawing(false);
this.inputField.setFocused(true);
this.inputField.setText(this.defaultInputFieldText);
this.inputField.setCanLoseFocus(false);
this.field_184096_i = new GuiChat.ChatTabCompleter(this.inputField);
Nous allons ici modifier le paramètre « setMaxStringLenght » pour étendre la capacité d’une chaine de texte à 32 767 ce qui donne :
this.inputField.setMaxStringLength(32767);
Mais ce n’est pas tout, cela étend la capacité d’affichage pour une seule chaîne de caractère mais n’enlève pas encore la limite en chat. Nous allons devoir modifier une seconde classe appelée « CPacketChatMessage » ("CChatMessagePacket" désormais). La partie à modifier se trouve ici :
public CPacketChatMessage(String p_i46887_1_)
if (p_i46887_1_.length() > 100)
p_i46887_1_ = p_i46887_1_.substring(0, 100);
this.message = p_i46887_1_;
Nous allons donc modifier les valeurs utiliser pour augmenter la limite jusqu’à 32 767 :
if (p_i46887_1_.length() > 32767)
p_i46887_1_ = p_i46887_1_.substring(0, 32767);
PS : Attention en utilisant cette classe en map-making car en augmentant la capacité du chat vous étendez également la limite de taille d’un run_command en json, hors quelqu’un n’ayant pas cette classe aura bel et bien la limite.
Voilà, vous avez maintenant un chat (presque) infini. Enfin vous l’aurez quand vous aurez appliqué ces modifications et nous allons passer à l’installation.
C. Ajouter les blocs techniques à l'inventaire créatif :
Nouveauté ajoutée le 23/06/2016.
Il suffit d'aller dans le .java et d'un bloc et de faire deux choses :
Rajouter dans les import au début la classe creative tabs
Modifier le premier protected de la class pour rajouter la tab auquel l'ajouter (ici comme exemple le mobSpawner
protected BlockMobSpawner()
Blocs disponibles :
Onglet block : farmland, grass path, hugemushroom
Onglet décoration : dragon egg
Onglet redstone : command block (les 3 types), barrier structure block, structure void
Onglet divers : spawner
D. Rajouter une spawn egg d'une entité :
Nouveauté ajoutée le 7/07/2016
Dans la classe "EntityList", rajouter dans la seconde partie de la grande liste une ligne pour l'entité, avec les nombres donnant en décimales le code pour les deux couleurs de l'oeuf (ici un extrait en 1.12 pour le giant).
func_191305_a("ghast", 16382457, 12369084);
func_191305_a("giant", 34735, 7311963);
func_191305_a("guardian", 5931634, 15826224);
func_191305_a("horse", 12623485, 15656192);
Œufs disponibles : giant, snowman, villagergolem
E. Augmenter la limite de luminosité
Nouveauté ajoutée le 27/08/2016
Dans la classe "GameSettings" ("AbstractOption" désormais) :
Dans "getKeyBinding" qui vérifie les options, modifier la partie concernant le gamma
else if (settingOption == GameSettings.Options.GAMMA)
return s + I18n.format("options.gamma.min");
return f == 5.0F ? s + I18n.format("options.gamma.max") : s + "+" + (int)(f * 500.0F) + "%";
Dans le enum "Options", modifier le gamma en ajoutant la valeur minimale, la valeur maximale, et le pas
FOV("options.fov", true, false, 30.0F, 110.0F, 1.0F),
GAMMA("options.gamma", true, false, 0.0F, 5.0F, 0.01F),
SATURATION("options.saturation", true, false),
RENDER_DISTANCE("options.renderDistance", true, false, 2.0F, 16.0F, 1.0F),
Permet de pousser la limite de luminosité à +500% (+100% de base).
F. Utiliser des blocs de commandes pour "ajouter" un item aux blocs cachés
Nouveauté ajoutée le 28/08/2016
Il est nécessaire au préalable de rajouter le bloc de commande à l'inventaire comme expliqué en C.
Trois parties à cet ajout :
Import de méthodes utilisées par la suite (à rajouter parmi les import au début,)
Rajout d'une méthode pour créer un itemstack à partir d'une commande et du nom à donner au bloc de commande
public ItemStack ReturnStack (String Command, String Name)
tag.setByte("auto", (byte) 1);
tag.setString("Command", Command);
stack.setTagInfo("BlockEntityTag", tag);
Rajout d'un getSubBlocks (méthode d'énumération dans l'inventaire existant sur d'autres blocs) appelant la méthode précédente pour chaque variante
public void getSubBlocks(CreativeTabs itemIn, NonNullList<ItemStack> tab)
tab.add(new ItemStack(this));
if (this == Blocks.COMMAND_BLOCK)
tab.add(ReturnStack ("setblock ~ ~ ~ double_stone_slab 8 replace","§7Stone Slab Block§r"));
tab.add(ReturnStack ("setblock ~ ~ ~ double_stone_slab 9 replace","§eSmooth Sandstone§r"));
tab.add(ReturnStack ("setblock ~ ~ ~ double_stone_slab2 8 replace","§cSmooth Red Sandstone§r"));
tab.add(ReturnStack ("setblock ~ ~ ~ end_gateway 0 replace {Age:300}","§dEnd Gateway§r"));
tab.add(ReturnStack ("setblock ~ ~ ~ log 12 replace","§aFull Oak Log§r"));
tab.add(ReturnStack ("setblock ~ ~ ~ log 13 replace","§aFull Spruce Log§r"));
tab.add(ReturnStack ("setblock ~ ~ ~ log 14 replace","§aFull Birch Log§r"));
tab.add(ReturnStack ("setblock ~ ~ ~ log 15 replace","§aFull Jungle Log§r"));
tab.add(ReturnStack ("setblock ~ ~ ~ log2 12 replace","§aFull Acacia Log§r"));
tab.add(ReturnStack ("setblock ~ ~ ~ log2 13 replace","§aFull DarkOak Log§r"));
Ajoute à la liste d'objets des variantes de bloc de commande avec des tags et nom prédéfinis, qui se transformeront en un bloc caché une fois posés.
Blocs disponibles : "bloc" de stone slab, smooth sandstone et red sandstone, end gateway, bûches "pleines"
NB : il s'agit d'une des classes les plus variables, il arrive couramment qu'elle soit éditée pour fonctionner avec les modifications qu'apportent les versions, ce code exact peut ne plus fonctionner à l'avenir (dans cet exemple il s'agit de la version 1.12 qui vient tout juste d'être modifiée depuis la 1.11)
3. Appliquer des .class modifiés :
A. Installation sur client
Pour installer les classes modifiées vous devrez tout d’abord créer une nouvelle version de minecraft. Pour cela rendez-vous dans .minecraft\versions et dupliquez la version à laquelle vous souhaitez appliquer les .class, pour cette explication j’appellerai mon dossier "1.9-Map_Making" :
Dans ce dossier, renommez le .jar et le .json avec exactement le même nom que celui du dossier :
Ouvrez maintenant votre .json (ici avec Notepad++) et changez le paramètre « id » avec également le même nom :
Voilà vous avez créé une nouvelle version du jeu qui apparaitra dans le menu déroulant de choix de version sous le nom "1.9-Map_Making" nous pouvons maintenant modifier le .jar. Cette étape devrait rappeler à beaucoup les installations de forge avant la 1.6 : il vous suffit de supprimer le dossier "META-INF" et de glisser dans l’archive vos classes modifiées.
Est-ce tout ? Je peux tester ça de suite ? Il se trouve que depuis les récentes mises à jour la réponse est non. Mojang a décidé de rajouter dans le .json quelques arguments afin de retélécharger le .jar à chaque démarrage si celui-ci a été modifié. La raison de ce changement reste inconnue mais heureusement pour nous c’est très facile à contourner.
Ouvrez de nouveau votre .json et allez à la toute fin du fichier. Vous verrez alors ces fonctions qui provoquent le téléchargement du .jar :
Il vous suffit tout simplement d’effacer ces lignes. Pour les personnes ayant peur de mal faire, voici ce à quoi doit ressembler la fin du fichier une fois les lignes effacées :
Cette fois c’est vraiment fini ! Vous pouvez ouvrir votre jeu, sélectionner la nouvelle version créée et la lancer pour vérifier qu’elle fonctionne correctement. Attention cependant si vous jouez sur serveur, vous pouvez utiliser les fonctionnalités dans un bloc de commande ou autre, mais envoyer un message non supporté par le serveur (incluant un § ou dépassant les 100 caractères) vous kickera automatiquement.
B. Installation sur serveur :
Glissez juste la version serveur des .class dans le jar de votre serveur.
Oui oui c'est tout, ne supprimez pas le META-INF ni rien d'autre.
Lien vers le OneDrive de téléchargement :
https://onedrive.live.com/redir?resid=C9B6749DAF4C48C9!28148&authkey=!AJ1dlgC3npCKmWI&ithint=folder,
Je m’assurerai de mettre à jour ces classes lorsque de nouvelles versions sortiront et de bump/mettre à jour le topic lorsqu’elles seront disponibles.
Dans la mesure où il faut attendre le Minecraft Coder Pack de chaque version pour refaire ces classes mais que parfois elles ne changent pas entre les versions, je vais ci-dessous recenser la stabilité/disponibilité des classes pour chacun des versions.
Pour chaque .class où il est nécessaire de modifier le .jar du serveur pour utiliser les fonctionnalités ajoutées en multi, il existe un sous-dossier "server" dans celui des .class contenant les .class à ajouter au serveur.
✔ Disponible : la class a été créée avec MCP pour cette version, dans ce cas je mettrai un dossier version pré-fait en téléchargement pour vous épargner les manipulations
✔ Compatible : la class d'une version antérieure est compatible avec la version
● Fonctionnelle : la class a changé mais une version temporaire basée sur les anciennes versions ou utilisant un MCP non officiel fonctionne, à utiliser à vos risques et périls
● Indisponible en attente de McCoderpack
✘ Non disponible/Ignorée
+ Ajout : de nouvelles classes ont été ajoutées, elles n'existent cependant que depuis leur version d'ajout, si vous souhaitez les avoir pour des versions antérieures, merci de le signaler
- Retrait : des classes ne sont plus produites, car elle n'ont plus d'intérêt ou sont devenues trop compliquées à produire par rapport à leur réelle utilité
1.8.8 : ✔ Disponible
1.8.9 : ✔ Compatible avec la version 1.8.8
1.9 : ✔ Disponible
1.9.1/1.9.2 :
Formatage § ✔ Compatible avec la version 1.9
Chat étendu ✘ Ignorée
1.9.3/1.9.4 : ✔ Disponible
1.10 : ✔ Disponible
(+ Ajout des classes rendant disponibles les blocs techniques dans l'inventaire)
(+ Ajout des classes ajoutant les monster egg de certaines entités)
(+ Ajout des classes permettant d'augmenter la limite de luminosité)
(+ Ajout des classes donnant accès à des blocs cachés, via command block)
1.10.1/1.10.2 : ✔ Compatible avec la version 1.10
1.11 : ✔ Disponible
1.11.2 : ✔ Disponible
1.12 : ✔ Disponible
1.13 : ✔ Disponible
(- Retrait des classes ajoutant les blocs techniques à l'inventaire créatif)
(- Retrait des classes ajoutant des œufs d'entités)
(- Retrait des classes donnant accès aux blocs cachés via command block)
1.13.2 : ✔ Disponible
1.14 : ✔ Disponible
1.14.1 : ✔ Disponible
1.14.2 : ✔ Disponible
1.14.3 : ✔ Disponible
1.14.4 : ✔ Disponible
1.15/1.15.1 : ✘ Indisponible
1.15.2 : ✔ Disponible
1.9.4 : ✔ Disponible
Si vous souhaitez que je rajoute une version spécifique antérieure, merci de le demander en réponse à ce topic, je m’arrangerais pour le rajouter en quelques jours.
Je tiens avant tout à rappeler que je ne suis pas moddeur, je ne connais rien à Java et toute les manipulations faites ici ne sont qu’un peu d’observation et de déduction. Ces classes ont été à l’origine créées par kikipunk dont le topic est visible ici. Néanmoins l’auteur n’ayant pas mis à jour ces fichiers depuis la 1.8.1, j’ai décidé de le faire et de vous expliquer par la même occasion leur installation. Tout ce contenu appartient avant tout à Mojang, et la découverte revient à kikipunk.
Legacy 1.10-1.12 : De plus, il convient de mentionner que pour les mises à jour non officielles de MCP, j'ai suivi le tutoriel de Daniel Appleby dont voici la chaîne : https://www.youtube.com/user/CGFreethemice/videos
Concernant l'utilisation du nouveau MCP, j'ai suivi ce tutoriel par EarthComputer :
https://gist.github.com/Earthcomputer/afe6f6da5eb8d93a2cb4aec453d6b912
Faites aussi un bisou à @robin4002 pour son aide inestimable sur le modding.
Voilà ce sera tout pour aujourd’hui, j’espère que tout ça vous sera utile dans vos créations :)
#1 Calambiel, 8 Mar 2016
En ce moment, il n'y a que de bon tutoriels qui sortent... Je porte plainte. ._.
#2 Pikachu, 8 Mar 2016
è_é C'est très bien mais impossible d'utilisation en multi sinon...
#3 Xgrps, 8 Mar 2016
Xgrps a dit : ↑
Seul l'envoi en chat provoque un kick. Tu peux le mettre dans un bloc de commande directement sur un serveur sans problème, et les joueurs sans les class verront bien l'effet de formatage, ils ne pourront juste pas le modifier.
Entre autre utiliser § dans un give d'objet donnera bien un nom coloré pour tout le monde sans problème mais l'intégrer dans un no-mod n'est pas possible puisque le joueur appliquant la commande ne l'aura pas lors de la copie.
Il faut que je vois si on peut également appliquer les modifications sur serveur mais ce n'est pas ma priorité pour le moment.
#4 Calambiel, 8 Mar 2016
Wahou ! Bien joué @Calambiel c'est très complet et très interessant !
Mise à jour avec la sortie de la première pre-release 1.9.1
La classe pour obtenir le § reste la même qu'en 1.9
En revanche une des deux classes du chat étendu a sensiblement changée, elle ne sera donc pas disponible avant la sortie de MCP 1.9.1, qui lui-même ne sortira qu'après l'arrivée de la 1.9.1 d'ici quelques semaines.
Les disponibilités ont été mises à jour.
EDIT : same pour la pre-release 2 et 3
#6 Calambiel, 10 Mar 2016
Tu gères, c'est vraiment utile o/
Je me souviens qu'à l'époque j'avais installé un mod pour ce caractère, et que j'avais été déçu de voir qu'il était incompatible avec la version qui venait de sortir. x)
#7 Hawezo, 11 Mar 2016
Est-il possible de modifier ces class sur la version d'optifine?
#8 Freeze', 22 Mar 2016
J'avais testé avec la 1.8.9 d'optifine et ça marchait, néanmoins je ne garantis pas que ça ne crashera pas pour d'autres versions, faites des backups et essayez.
Il est également possible de les faire marcher avec Forge :
Soit en modifiant directement le .jar de forge
Soit pour les versions n'ayant pas de .jar, modifier le .json de la version forge en changeant le "jar" et "inheritsFrom" par le nom de votre version modifiée
Forge crashera instantanément dans ces conditions, pour qu'il démarre malgré la modification du jar il faut ajouter ces deux arguments de lancement au profil :
A nouveau si c'est bloqué en temps normal, c'est avec raisons, donc je ne garantis pas qu'il n'y aura pas de problèmes à court ou à long terme, avec ou sans mods. Soyez prévoyants si vous décidez de le faire. Mais pour les quelques versions que j'avais testées, ça marchait.
#9 Calambiel, 22 Mar 2016
Et comment on fait pour décompiler Optifine?
#10 Freeze', 22 Mar 2016
On ne peut pas, ou du moins pas avec le Minecraft Coder Pack.
Mais vous n'avez pas besoin de décompiler une version pour y ajouter les classes que j'ai mis en DL, il suffit juste de les glisser dans le .jar (via 7zip ou winrar) et de supprimer le META-INF (3ème partie du tutoriel mais sans la modification du .json)
La deuxième partie parlant de la modification du code n'est là qu'à titre informatif ou pour vous expliquer comment le faire vous-même, mais vous n'avez besoin que de DL les .class déjà modifiés et de suivre la 3ème partie pour les installer.
#11 Calambiel, 22 Mar 2016
J'ai intégré la class au .jar et supprimé META-INF, mais ça retéléchargeait la version au démarrage de mc, donc je ne pouvais pas écrire §. J'ai donc répété l'opération et j'ai supprimé les lignes du json, mais ça continuait quand même à télécharger au démarrage :/
#12 Freeze', 22 Mar 2016
Yup, ma faute.
J'avais pas vu qu'Optifine a également un "inheritsFrom" vu qu'il est tout à la fin.
Créé une version modifiée de base vanilla (juste avec les classes modifiées, aucun autre mod).
Puis refais également la manipulation pour optifine, et édites le .json d'optifine, à la toute fin change le nom en face de "inheritsFrom" par celui de ta version de base modifiée.
Penses bien à relancer ton launcher après ça.
#13 Calambiel, 22 Mar 2016
Yes! Merci beaucoup, ça marche parfaitement
#14 Freeze', 22 Mar 2016
Mise à jour avec la sortie de la 1.9.3/4 :
Ces versions sont incompatibles avec les deux classes des versions précédentes.
Sans nouvelle release MCP, il ne sera probablement pas possible d'obtenir de nouvelles .class pour cette version.
On peut également oublier le chat étendu pour la 1.9.1/1.9.2, peu de chance qu'un MCP soit release pour ces versions.
#15 Calambiel, 16 Mai 2016

References: §0
 §1
 §2
 §3
 §4
 §5
 §6
 §7
 §8
 §9