minecraft
Créer un bloc de base avec Forge
Recherche…
Introduction
Créer un bloc simple et décoratif 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 à un niveau de difficulté "modéré" après le 1.7.10 en raison du grand nombre d'erreurs faciles à faire.
Remarques
Si quelque chose ne va pas et que votre bloc personnalisé (placé ou en attente) 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 est le problème, commentez chaque bloc et élément que vous connaissez, réduisez la liste des erreurs jusqu'au bloc (ou aux 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).
La classe de bloc
Nous avons d'abord besoin d'une classe qui représente le bloc
public class CustomBlock extends Block {
public CustomBlock () {
super(Material.ROCK);
setHardness(1.0f);
setHarvestLevel("pickaxe", 0);
setResistance(1.0f);
setCreativeTab(CreativeTabs.DECORATIONS);
this.setSoundType(SoundType.STONE);
}
}
Même ici, plusieurs modifications sont possibles: matériau (qui régit certaines propriétés telles que pouvoir être poussé par des pistons et s'il peut être cassé à la main), dureté (combien de temps il faut pour casser), niveau de récolte (outil et outil appropriés) matériel: dans ce cas la pioche en bois), la résistance (vs explosions), l'onglet qui apparaît dans le menu créatif, et quelle étape sonne-t-il.
C'est là que les blocs de fonctionnalités fantaisistes devront fonctionner, mais pour le moment nous faisons un bloc qui a l'air sympa, donc nous avons fini.
Le modèle de bloc JSON
Ensuite, nous devons dire à Minecraft ce que nous voulons que notre bloc ressemble.
{
"parent": "block/cube_all",
"textures": {
"all": "example:blocks/decorative"
}
}
C'est à peu près tout ce qui est nécessaire pour que le bloc fonctionne une fois 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).
Nommez le fichier JSON modèle my_block.json
(correspondant au nom du registre que nous allons lui donner ultérieurement) et enregistrez-le dans src\main\resources\assets\example\models\block\
(où example
est l'ID de mod spécifié dans le @Motage de votre classe de mod principal.
Le modèle de bloc utilise ici un parent de block / cube_all, ce qui signifie que la texture fournie unique sera utilisée sur toutes les faces. Il existe également d'autres modèles par défaut, tels que:
- bloc / cube (les six faces sont affectées indépendamment)
- block / cube_bottom_top (faces supérieure et inférieure indépendantes des côtés)
- bloc / orientable (bloc de revêtement directionnel, par exemple four)
- bloc / croix (fleurs, herbes hautes)
- bloc / culture (blé, carottes)
Notez que chaque modèle spécifie les textures qu'il utilise par un identifiant de nom (par exemple "all"
ou "top"
). Regardez le modèle parent pour déterminer quels sont ces noms si vous êtes incertain. Des textures mal spécifiées peuvent entraîner des problèmes de texture manquants dans les rapports de non-erreurs .
Il est également possible de créer un modèle entièrement personnalisé ou de créer un modèle parent personnalisé. Mais pour l'instant, cela suffira.
N'oubliez pas de créer une texture, nommez-la decorative.png
(comme le spécifie le fichier JSON) et enregistrez-le dans src\main\resources\assets\example\textures\blocks\
Enregistrement de bloc
L'enregistrement de blocs est effectué à partir de votre classe de mod principale ou d'une méthode de classe ModBlocks appelée à partir de la classe de mod principale au cours de preInit.
Block myBlock = new CustomBlock();
string registryname = "my_block";
block.setRegistryName(registryname);
block.setUnlocalizedName(block.getRegistryName().toString());
GameRegistry.register(block);
Il existe une raison importante d'utiliser block.setUnlocalizedName(block.getRegistryName().toString());
ainsi que! Il s'assure que vos noms non localisés de bloc (et d'élément) contiennent l'ID de mod pour éviter les conflits de fichiers de langue entre les mods.
Oh, vous voulez aussi une version d'article pour qu'elle puisse aussi exister dans votre inventaire? C'est créé séparément après 1.7.10 et fait comme ça:
ItemBlock ib = new ItemBlock(block);
ib.setRegistryName(registryname);
GameRegistry.register(ib);
Notez que nous définissons le nom du registre de ItemBlock sur la même chaîne que notre bloc. Voici comment forger et associer les blocs à leur homologue ItemBlock et vice versa.
Mais attendez, il y a plus!
Votre bloc peut avoir une forme d'élément , mais cet objet n'a pas encore de modèle ou de texture! Les modèles sont automatiquement enregistrés pour les blocs, mais pas pour les éléments. Ceci ne peut être appelé qu'à partir du proxy client et ne couvre pas les blocs avec des variantes (comme la laine ou les feuilles).
ModelLoader.setCustomModelResourceLocation(
ib , 0, new ModelResourceLocation(ib.getRegistryName(),"normal"));
En règle générale, vous n'aurez pas non plus besoin d'un modèle d'objet JSON, car Forge et vanilla se rabattront sur le modèle du bloc, mais ce n'est pas toujours le cas. Si vous trouvez que vous avez besoin d'un modèle d'objet JSON, placez-le simplement par parent dans votre bloc JSON et enregistrez-le dans src\main\resources\assets\example\models\item\
avec le même nom de fichier que le nom de registre du bloc.
{
"parent": "example:block/my_block"
}