[1.15.x] Créer un item basique
-
Bonjour à tous ! Forge ayant sorti récemment sa deuxième version stable pour la 1.15.2, j’ai décidé d’en profiter pour rédiger ce tuto qui vous permettra de créer votre item, avec les ajouts de la 1.15 par rapport à la 1.14 ou la 1.12.
Pour commencer, vous aurez juste besoin de la base de votre mod prête, et c’est parti !Sommaire
- Créer le Deferred Register
- Créer l’item sans classe custom
- Créer l’item avec classe custom
- Ajout du model de l’item
- Ajout de la texture de l’item
- Localisation de l’item dans les fichiers lang (.json)
- Résultats
Prérequis
- Créer la base d’un mod
- Apprendre les bases du Java
Créer le Deferred Register
Si vous aviez l’habitude en 1.14 ou même en 1.12 d’utiliser les events pour enregistrer vos items, et bien sachez qu’il y a un nouveau moyen plus simple qui vous permet d’économiser un bon paquet de lignes de code.
Auparavant, vous aviez une classe pour vos items qui tenait au minimum dans une dizaine de lignes. Avec ce qu’on appelle lesDeferredRegister
, c’est désormais une seule ligne ! Alors, pour ce qui est de l’explication de ce qu’est unDeferredRegister
, honnêtement, je ne saurais pas l’expliquer, mais si vous avez la réponse je mettrai à jour le sujet tout en vous citant bien sûr
Sachez juste que c’est un moyen de communiquer directement avec les registres de Forge sans passer par les events.
Bref, passons au code.Pour commencer, vous allez avoir besoin de créer une nouvelle classe qui, dans mon cas, s’appellera
ModItems
, mais le nom importe peu.public class ModItems { }
Cette classe n’aura pas de classe mère spécifique, on se servira de la classe telle qu’elle est.
Et maintenant, on attaque la seule ligne de code (en tout cas pour cette partie).public class ModItems { public static final DeferredRegister<Item> ITEMS = new DeferredRegister<>(ForgeRegistries.ITEMS, "modid") }
Pour expliquer ce qu’on a fait ici, on a simplement créé une variable de typeDeferredRegister
à laquelle est attachée la classe Item (vérifiez que vous avez importé la classe de Forge). On l’a instanciée directement dans la déclaration de la variable (qui est en static car on aura besoin d’y accéder dans les autres classes et final car la variable ne devra surtout pas être redéfinie par la suite). En paramètre, leForgeRegistries.ITEMS
indique le registre dans lequel seront enregistrés nos objets, dans le cas présent, c’est dans le registre des items.Vous pourrez remarquer qu’il y a un bon nombre de registres prévus par Forge, et je vous laisse bidouiller si l’envie vous prend, mais on va se concentrer ici uniquement sur les items.
Enfin, le
"modid"
, vous le remplacerez avec votre modid, que je vous conseille de stocker dans une variable static et final dans une de vos classesEt voilà, plutôt rapide non ? En réalité, on a pas totalement fini.
Dans votre classe principale, vous devriez avoir votre constructeur.@Mod("modid") public class ClassePrincipale { public ClassePrincipale() { // Vous devriez avoir vos lignes ici } }
Dans ce même constructeur, on va enregistrer notre
DeferredRegister
et le faire détecter par Forge.@Mod("modid") public class ClassePrincipale { public ClassePrincipale() { // Vous devriez avoir vos lignes ici IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus(); ModItems.ITEMS.register(bus) } }
Ici, on a besoin de l’event bus de Forge pour enregistrer notre
DeferredRegister
. Je ne vais pas vous expliquer en détail ce qu’il se passe, mais en gros, retenez juste que lesDeferredRegister
ont besoin de l’event bus de forge pour fonctionner.Normalement, si vous avez bien suivi, votre
DeferredRegister
devrait fonctionner. Comment le vérifier ? En créant un item !Créer l’item sans classe custom
Il y a “2 manières” de créer un item. Je mets ça entre guillemets parce qu’il y a une infinité de possibilités de création, mais on va dire qu’il y a deux manières basiques de faire. Soit on crée une classe personnalisée ou on ne crée pas de classe.
Ici, on va se concentrer sur le cas où on utilisera pas de classes persos.
Pour ma part, je me rends dans ma classeModItems
qui est la classe où j’ai déclaré monDeferredRegister
public class ModItems { public static final DeferredRegister<Item> ITEMS = new DeferredRegister<>(ForgeRegistries.ITEMS, "modid") public static final RegistryObject<Item> MON_ITEM = ITEMS.register("mon_item", () -> new Item(new Item.Properties())) }
Bon et bien c’est pas banal comme code, hein ? Si vous comparez à la 1.12, ça n’a absolument plus rien à voir. Au lieu de créer une variable de type
Item
, on en crée une de typeRegistryObject<Item>
. C’est un type assez spécial qui est apparu avec les Deferred Registries, ce n’est pas exactement un item, mais plutôt une variable qui contient un item, auquel vous pourrez accéder avec, par exemple,MON_ITEM.get()
.Le premier paramètre définit le nom délocalisé de votre item et aussi son identifiant (ce n’est pas le nom définitif de l’item dans le jeu), c’est à dire le nom de base de l’item que vous pourrez traduire par la suite avec les fichiers lang (qui sont maintenant en .json)
Le second paramètre est un
Supplier
, c’est un type un peu bizarre qui requiert l’utilisation des lambdas, et je vous conseille de regarder plus en détail ces derniers si vous ne savez pas ce que c’est. On instancie cependant la classeItem
de Minecraft avec en paramètre unItem.Properties
que nous verrons plus en détail dans la partie sur la classe personnaliséeEt voilà, vous avez votre item qui est normalement enregistré dans le jeu. Vous pouvez tester de votre côté en lançant le client, mais vous devriez avoir une texture buguée et c’est normal !
Je m’attarderai sur les textures et les modèles dans la section dédiée de ce tutoriel. On va donc passer à la création d’items avec classe personnalisée
Créer l’item avec classe custom
Bon, le point cool c’est que la méthode avec classe personnalisée est assez ressemblante à la méthode sans classe.
public class ModItems { public static final DeferredRegister<Item> ITEMS = new DeferredRegister<>(ForgeRegistries.ITEMS, "modid") public static final RegistryObject<Item> MON_ITEM = ITEMS.register("mon_item", MonItem::new) }
Et là, vous allez me dire "Wouah mais qu’est ce que c’est que ce
MonItem::new
?
Et bien voyez ça comme une contraction du() -> new MonItem()
.
Normalement, à ce stade, vous devriez avoir une erreur et c’est normal car on doit encore créer la classe en elle-même. Je vous invite donc à créer un package que vous pourrez appeler “items” ou comme vous le souhaitez, mais faites en sorte que ce soit logique et compréhensible.
public class MonItem extends Item { public MonItem() { super(new Item.Properties().group(ItemGroup.MATERIALS).maxStackSize(16)); } }
Passons aux explications . Tout d’abord, on hérite de la classe
Item
de Minecraft afin que ce soit compatible avec notreDeferredRegister
.
Ensuite, le constructeur va peut-être vous interpeller notamment en voyant les paramètres… et bien… inexistants. C’est très important, autrement on va avoir une erreur dans notre classeModItems
.En contrepartie, on va devoir spécifier un paramètre dans le
super()
qui sera unItem.Properties
. C’est une classe contenant des propriétés pour les items.
Ici, j’ai mis seulement deux propriétés, je ferai peut-être un article sur chacune des propriétés..group(votreCreativeTab)
: Permet de spécifier l’onglet dans lequel va se trouver l’item en mode créatif.maxStackSize(tailleMax)
: Permet de spécifier une taille de stack max (les épées se stack seulement par 1)Et voilà, votre item est prêt et vous pouvez lancer le jeu. Bien qu’il manque votre texture, l’item devrait être présent dans l’onglet spécifié. Pour régler cette immonde texture rose et noire, on va s’attaquer par la suite au modèle de notre item.
Ajout du model de l’item
Avec les dernières mises à jours (>1.12.2), on n’a plus besoin de spécifier dans le code la localisation de notre modèle JSON, et tant mieux . Maintenant, il sera automatiquement redirigé dans le dossier “assets/modid/models/item/” présent dans le dossier resources de votre workspace.
Voici comment devrait s’organiser votre dossier resources pour la suite du cours. Remplacez “tutomff” par votre modid, bien entendu.
Une fois votre dossier organisé, vous allez dans le dossier models/item et vous créez un fichier “votre_item.json” où “votre_item” équivaudra au nom que vous avez mis à l’enregistrement de l’item dans le
DeferredRegister
.
À ce moment-là, vous avez le choix soit d’importer un modèle custom en JSON réalisé à l’aide de BlockBench, par exemple, ou alors vous allez vous baser sur les modèles vanilla, ce qui est le plus fréquent.Dans le cas de ce tuto, je vais me baser sur le modèle de base des items vanilla, à savoir le modèle “item/generated”.
{ "parent": "item/generated", "textures": { "layer0": "modid:item/mon_item" } }
Voilà à quoi devrait ressembler votre modèle si vous souhaitez avoir un rendu une fois en jeu du genre de la pomme, par exemple. Si jamais votre item est une épée ou alors comme un stick vous pouvez remplacer “item/generated” par “item/handheld”.
Bien sûr, ne copiez-collez pas bêtement ce que j’ai mis, et remplacez bien “modid” par votre modid et “mon_item” par le nom délocalisé exact de votre item.
Ajout de la texture de l’item
Sans transition, on passe à la texture. Cela va être relativement rapide, vous n’aurez qu’à déplacer votre texture dans le dossier “textures/item” avec le nom délocalisé de votre item
Localisation de l’item
Avant de passer au résultat, il reste la localisation de notre item à faire. Localiser c’est quoi ? C’est simplement traduire le nom des éléments de notre mod pour chaque langue qui existe. Enfin, je vous rassure, on ne fera que le français et l’anglais ici, je ne parle pas encore toutes les langues du monde .
Pour faire ça, il suffit de créer un nouveau dossier “assets/modid/lang/” dans lequel vous allez créer au moins le fichier “en_us.json”, et ensuite le fichier “fr_fr.json”. Les deux fichiers seront, en réalité, une copie l’un de l’autre mis à part les noms localisés qui seront différents.
Fichier anglais
Fichier français
Fiou ! Et voilà, votre premier item est enfin créé et finalisé ! Reste plus qu’à tester !
Résultats
Licence et attribution
Ce tutoriel rédigé par ZomZD, corrigé par DiabolicaTrix et publié sur Minecraft Forge France est mis à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International
-
Super tuto surtout pour ceux qui se lancent dans la création d’un mod en 1.15.2
Personnelement je dévoloppe en 1.12.2 et j’ai aprris grace a ta série de tuto
-
Merci pour ta contribution !
Le tutoriel est complet et bien rédiger, je vais le faire passer en relecture puis le publier avec les autres tutoriels d’items. -
@robin4002 Super ! Merci beaucoup ^^
-
@Ck_Luky Merci ça fait plaisir
-
Bravo, très bien rédigé ! J’ai corrigé quelques erreurs, il pourra bientôt être publié !
-
Ouais très bon tutoriel Zim… heu pardon Zom :grinning_face_with_sweat:
-
@DiabolicaTrix Merci ^^
-
@Mysterious-Dev Mais qui est Zim ? :hushed_face:
-
-