minecraft
Création d'un élément de base avec Forge
Recherche…
Introduction
Créer un objet simple avec Forge est l’une des premières tâches qu’un aspirant modder devra apprendre. Comment faire cela a changé sur les différentes versions de Minecraft et est probablement à une difficulté "modérée" après 1.7.10 en raison du grand nombre d'erreurs faciles à faire, en particulier avec le rendu correct.
Remarques
Si quelque chose ne va pas et que votre élément personnalisé a une texture manquante (noir / violet) ou un modèle (cube par défaut trop grand lorsqu'il est maintenu), vérifiez le journal. Les problèmes de ce type apparaîtront presque toujours dans le journal, à condition que vous ayez enregistré les éléments correctement.
La première chose à afficher est la ligne "Exception loading model for variant..."
ou similaire, vous indiquant quel bloc ou élément n'a pas pu être chargé correctement. Après une douzaine de lignes commençant par at...
sera une autre ligne commençant Caused by...
Cette ligne "causée par" est la plus importante, elle vous indiquera quel fichier n'a pas pu être chargé correctement et peut être l'une des erreurs suivantes:
- JSON mal formé (votre fichier JSON n'est pas valide et a une faute de frappe)
- Fichier introuvable (le fichier recherché par Minecraft n'est pas correctement nommé ou au bon endroit)
- Exception de variante manquante (votre JSON Blockstate est incomplet)
Vous pouvez même obtenir plus d'une erreur d'échec pour une seule erreur! Si vous ne savez pas quel élément est le problème, commentez chaque bloc et chaque élément que vous connaissez fonctionne, réduisez la liste des erreurs au niveau du ou des blocs en question. Vous devrez peut-être le faire plusieurs fois.
De plus, une texture de mixage montre comme une liste simple toutes les ressources manquantes pour un domaine donné (ID mod).
Classe d'objets
Cette partie n'a pas beaucoup changé sur les versions de Minecraft, bien qu'il y ait eu des mutations dans les signatures de méthodes exactes ainsi que dans la hiérarchie des classes. Un élément de base (celui qui n'a pas de fonctionnalité, comme un bâton ou un lingot: c'est vrai, les deux sont des objets à ne rien faire!)
public class CustomItem extends Item {
public CustomItem () {
super();
this.setMaxDamage(0);
this.setCreativeTab(CreativeTabs.MISC);
}
}
Peu de place pour la personnalisation à ce stade, contrairement aux blocs. Tout ce que nous pouvons faire, c'est de changer si l'élément peut subir des dégâts (les outils l'utilisent) et dans quel onglet créatif il existera. Nom et texture que nous traiterons lorsque nous enregistrons l'élément avec GameRegistry.
Cependant, c'est tout ce qui est nécessaire pour tenir, transporter, larguer, fabriquer, fondre et utiliser autrement l'objet. Certains éléments de Minecraft (tels que les bâtons) n'ont même pas une classe unique et utilisent simplement un new Item()
. Nous pourrions le faire ici, mais tout élément avec des fonctionnalités supplémentaires nécessitera une classe.
Modèle d'article
Comme pour les blocs, les éléments ont également besoin de modèles.
{
"parent": "item/generated",
"textures": {
"layer0": "example:items/basic"
}
}
C'est à peu près tout ce dont vous avez besoin pour fonctionner une fois que l'article est enregistré. La seule chose importante est que le nom de fichier corresponde au nom de registre utilisé pour enregistrer le bloc et doit être en minuscule (les noms de fichiers 1.11+ doivent être en minuscules, avant cela, il est juste sensible à la casse).
Notez que "layer0" est la seule texture nécessaire et il est hautement improbable qu'une autre texture soit spécifiée (bien que certains éléments tels que les potions et les armures de cuir aient un "layer1"). Tous les noms sont définis par item/builtin
(le modèle parent le plus haut interne pour les éléments), contrairement aux blocs.
Nommez le fichier JSON modèle my_item.json
(correspondant au nom du registre que nous allons lui donner ultérieurement) et enregistrez-le dans src\main\resources\assets\example\models\item\
(où example
est l'identifiant du mod spécifié dans le @Motage de votre classe de mod principal.
Créez en outre une texture pour votre élément, nommez-le basic.png
et enregistrez-le dans src\main\resources\assets\example\textures\items\
Le modèle d'élément utilise ici un parent d'élément / généré, ce qui signifie que la texture fournie unique sera utilisée (comme avec la plupart des éléments non bloquants) et sera conservée dans la main du joueur dans une orientation par défaut. Il existe également un élément / ordinateur de poche qui spécifie différentes orientations d'affichage (pour les outils). Les articles peuvent également fournir leur propre attribut "display", remplaçant ceux du parent, mais ne sont pas nécessaires dans 99,9% des cas.
Enregistrement de l'article
L'enregistrement d'éléments est effectué à partir de votre classe de mod principale ou d'une méthode de classe ModItems appelée à partir de la classe mod principale lors de préInit.
Item item = new CustomItem();
string registryname = "my_item";
item.setRegistryName(registryname);
item.setUnlocalizedName(item.getRegistryName().toString());
GameRegistry.register(item);
Il existe une raison importante d'utiliser item.setUnlocalizedName(item.getRegistryName().toString());
ainsi que! Il s'assure que le nom non localisé de votre article contient l'ID de mod pour éviter les conflits de fichiers de langue entre les mods.
Maintenant, l'élément a également besoin d'un modèle, et c'est là que les choses ont été difficiles après le 1.7.10, ce qui impliquait simplement de dire à Minecraft le nom de la texture à charger et pourrait être spécifié dans le constructeur de l'élément.
final ModelResourceLocation fullModelLocation = new ModelResourceLocation(item.getRegistryName().toString(), "inventory");
ModelBakery.registerItemVariants(item, fullModelLocation);
ModelLoader.setCustomMeshDefinition(item, new ItemMeshDefinition()
{
public ModelResourceLocation getModelLocation(ItemStack stack)
{
return fullModelLocation;
}
});
Notez que cette section ne doit être située que côté client (c'est-à-dire le proxy client), car la plupart des classes référencées n'existent pas sur le serveur dédié.
Enregistrement d' articles avec des variantes par exemple Plantons, doit être fait d' une manière différente, en utilisant ModelLoader.setCustomModelResourceLocation(item, metadata, resourceLocation)
les ModelLoader.setCustomModelResourceLocation(item, metadata, resourceLocation)
bien qu'il nous permet d' utiliser un fichier Blockstate pour indiquer nos variantes (qui est beaucoup plus préféré à l'alternative). Notre article n'utilise pas de variantes, nous avons donc terminé.