Créer un bloc basique
-
Ce tutoriel est également disponible en vidéo.
Sommaire
Introduction
Dans ce tutoriel, nous allons créer un bloc. Un bloc est comme un item qui peut être placé dans le monde. Le bloc possède un item (ItemBlock). Ce tutoriel vous sera important pour la réalisation de vos futurs blocs plus (ou moins) complexes.
Pré-requis
Code
La classe principale :
Tous d’abord, déclarez votre bloc en dessous des proxys, dans le init.
public static Block tutoBlock;
N’oubliez pas d’importer la classe Block (net.minecraft.block.Block) avec Ctrl+Shift+O (ou en passant la souris sur l’erreur).
Une fois ceci effectué, il nous faut initialiser notre bloc.tutoBlock = new TutoBlock(Material.rock)
Dans le constructeur du bloc nous avons en paramètre le matériau. Il existe différents matériaux, pour les voir faite Ctrl+clic droit, il existe divers matériaux. Les matériaux peuvent avoir différentes propriétés ; en voici la liste :
- setBurning() = peut brûler
- setRequiresTool() = droppe uniquement avec l’outil requis
- setImmovableMobility() = n’est pas déplaçable par un piston
- setNoPushMobility() = contrairement à setImmovableMobility(), si un piston se déplace sur le bloc, il disparaît
- setTranslucent() = rend le bloc transparent
Vous pouvez aussi ajouter a votre bloc :
- setUnlocalizedName() = il s’agit du nom de votre bloc
- setResistance() = cela correspond à la résistance aux explosions de votre bloc
- setHardness() = c’est la vitesse de minage du bloc
- setCreativeTab() = vous permet de définir dans quel onglet du menu créatif se trouve votre bloc (cela fonctionne avec vos Creative Tabs)
voici ce que vous devriez avoir si vous les ajoutez :
tutoBlock = new TutoBlock(Material.rock).setUnlocalizedName("tuto_block").setResistance(5.0F).setHardness(3.0F).setCreativeTab(CreativeTabs.tabFood);
Donc, j’ai donné un nom à mon bloc “tuto_block”, je lui ai attribué une résistance aux explosions et une vitesse de minage qui est la même que le minerai de charbon, je l’ai aussi mis dans l’onglet créatif de la nourriture (vous pouvez le mettre dans un autre, pour voir la liste faites : Ctrl+clique droit sur la classe).
Ensuite, il faut mettre :GameRegistry.registerBlock(tutoBlock, "tuto_block");
Le premier paramètre permet d’enregistrer votre bloc (tutoBlock est le nom de votre variable) et le second permet de vous le donner par la commande “/give modid:tuto_block”. Dans le second paramètre évitez les espaces (utiliser les “_” à la place), les majuscules et les caractères spéciaux.
La classe du bloc :
Normalement, vous avez une erreur depuis que vous avez initialisé votre bloc sur TutoBlock car cette classe n’existe pas. Nous allons la créer. Créez la classe et ajoutez en super classe la classe “net.minecraft.block.Block”, vous pouvez aussi ajouter “extends Block” une fois la classe créée.
Une fois ceci fait, vous devriez avoir une erreur sur le nom de votre classe, passez la souris dessus et cliquez sur “Add constructor NomDeLaClasse(Material)”, une fois cette action effectuée vous devriez avoir cela :protected TutoBlock(Material materialIn) { super(materialIn); }
Vous pouvez renommer le paramètre “materialIn” en “material”, ce qui donne :
protected TutoBlock(Material material) { super(material); }
Nous en avons fini avec notre bloc. Cependant si vous lancez votre jeu, vous aurez des erreurs dans la console, mais en jeu votre bloc aura une texture bizarre (avec deux carrés violet et deux carré noir sur chaque face). Donc nous allons ajouter ce qu’il faut pour afficher la texture.
Les proxy
Nous allons créer des fonctions qui nous permettrons d’enregistrer les .json et donc la texture, notez que ces fonctions sont utilisables pour vos autres blocs (et items). Commencez par ajouter dans le Common Proxy :
protected void registerItemTexture(Item item, int metadata, String name){} protected void registerItemTexture(Item item, String name){} protected void registerBlockTexture(Block block, int metadata, String name){} protected void registerBlockTexture(Block block, String name){}
Et ensuite, dans le client proxy :
@Override public void registerItemTexture(Item item, int metadata, String name) { ItemModelMesher mesher = Minecraft.getMinecraft().getRenderItem().getItemModelMesher(); mesher.register(item, metadata, new ModelResourceLocation("tuto:" + name, "inventory")); } @Override public void registerItemTexture(Item item, String name) { registerItemTexture(item, 0, name); } @Override public void registerBlockTexture(Block block, int metadata, String name) { registerItemTexture(Item.getItemFromBlock(block), metadata, name); } @Override public void registerBlockTexture(Block block, String name) { registerBlockTexture(block, 0, name); }
Une petite explication (code venant de Superloup10) :
Les trois paramètres, “item”/“block” est l’item/block concerné, “metadata” correspond à la damage value/metadata (quand le paramètre est absent la valeur vaut 0), name vous permet d’enregistrer le .json (blockstate). N’oubliez pas de changer “tuto:” par votre modid (n’enlevez pas les “:”).
Retournez dans la classe principale, dans la fonction init (FMLInitializationEvent), et ajoutez :proxy.registerBlockTexture(tutoBlock, "tuto_block");
tutoBlock, est le nom de votre variable, “tuto_block” est le nom de votre json.
Les json, la texture et le nom :
Nous allons enfin donner une texture à notre bloc. Allez dans votre “asset/modid” (modid correspond au dossier qui a le même nom que votre modid) et créez trois dossiers :
- blockstates, dans ce dossier nous aurons les blocs avec leur directions et les chemins vers nos models
- models
- textures
Dans le dossier blockstates, ajoutez le fichier .json (avec comme nom le nom que vous avez mis dans votre code). Dans le fichier ajoutez :
{ "variants": { "normal": { "model": "MODID:tuto_block" } } }
Qu’est-ce que cela veut bien dire ? Cela nous donne dans quel “dossier/fichier” le model de notre bloc est.
Remplacez MODID par votre modid et tuto_block par le nom de bloc choisi (c’est le nom des fichier .json dans models/block et models/item)
Maintenant, allez dans le dossier models et créez, à l’intérieur, ces deux dossiers :- block, vous mettrez dans ce dossier les rendus des blocs dans le monde, ça vous permettra de mettre la texture et de faire les rendus particuliers
- item, dans ce dossier vous mettrez les rendus des blocs en temps qu’item
Dans le dossier block, ajoutez un fichier .json qui porte le nom que vous avez mis dans le premier fichier .json (pour moi ce sera : tuto_block).
Dans le fichier .json ajoutez :
{ "parent": "block/cube_all", "textures": { "all": "MODID:blocks/tuto_block" } }
Petite description ?
"parent": "block/cube_all
Correspond au fichier .json (dans "models/block"), dont il reprend le modèle. C'est le modèle des blocs simples. Le deuxième bout de code :
"textures": { "all": "MODID:blocks/tuto_block" }
Cela correspond à l’accès de la texture pour savoir quelle texture le bloc aura (comme en 1.7 le .setBlockTextureName()). Remplacez le “MODID” par votre modid et le “tuto_block” par le nom de la texture de votre bloc (vos textures pour les blocs seront à placer dans textures/blocks).
Une fois ceci fait, dans le dossier item, ajoutez encore un fichier .json (du même nom que dans le dossier “models/block”), une fois que vous l’avez fait, ajoutez dans le fichier .json :{ "parent": "MODID:block/tuto_block", "display": { "thirdperson": { "rotation": [ 10, -45, 170 ], "translation": [ 0, 1.5, -2.75 ], "scale": [ 0.375, 0.375, 0.375 ] } } }
Donc, comme plus haut, le parent correspond à quel bloc il prend le modèle, mais dans ce .json, il faudra mettre votre .json créés précédemment. Ensuite, le reste du code nous permet de dessiner l’item dans l’inventaire…
N’oubliee pas de remplacer le “MODID” par votre modid et “tuto_block” par le nom de votre .json (du dossier “models/block”).Maintenant, dans le dossier textures, créez un dossier blocks et mettez y la texture du bloc (elle doit être au format de pixel hauteur*largeur, à une puissance de deux soit : 1, 2, 4, 8, 16, 32, 64…). N’oubliez pas de la nommer comme vous l’avez fait dans les fichiers plus haut (rappel : “textures”: { “all”: “MODID:blocks/tuto_block” };en jaune il s’agit du nom de la texture).
Normalement, si vous n’avez rien raté, en lançant votre jeu, votre bloc aura la texture que vous lui aurez attribuée. Mais, tout de fois, vous verrez que votre bloc a un nom bizarre (tile.nom_du_block.name), donc dans votre fichier .lang (dans le dossier lang), vous devez mettre :
tile.nom_du_block.name=Nom Du Block
Bien sûr, remplacez “nom_du_block” par le vrai nom de votre bloc (rappel : .setUnlocalizedName()), et “Nom Du Block” par le nom que vous voulez lui donner en jeu.
Maintenant lancez votre jeu et votre bloc aura le nom que vous lui aurez donné.Résultat
Voir le commit sur github
Le commit sur github montre clairement où ont été placé les fichiers, ainsi que ce qui a été ajouté et retiré dans le fichier.En vidéo
https://www.youtube.com/watch?v=ws8j0ZxYZYg
Crédits
Rédaction :
Correction :
Ce tutoriel de 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 -
Comment donner une ID au bloc?
-
Si c’est une ID de type chaîne de caractère dont tu parles, c’est le nom que tu mets dans GameRegistry.registerBlock. Si tu parles d’ID sous forme de nombre, çà n’existe plus en 1.8.
-
@‘SCAREX’:
Si tu parles d’ID sous forme de nombre, çà n’existe plus en 1.8.
Il existe toujours mais ils sont attribués automatiquement par FML.
-
C’est impossible de donner l’ID ?
-
En effet, ce n’est pas possible
-
En 1.6, c’était possible, pourquoi veux-tu utiliser les IDs ? C’est beaucoup plus simple de faire avec le nouveau système !
-
C’est pour éviter un “regen” car vanilla –> forge
-
-
Mon block apparait bien avec sa texture quand je le pose mais en main il est non-texturé
Des idées de pourquoi ?
-
Tu as probablement oublié d’appeler le model json de ton block.
-
Euuh j’ai pourtant tout bien mis regarde
ClientProxy
package mod.client; import mod.DinoCraft; import mod.client.model.ModelBrachiosaurus; import mod.client.model.ModelCoelophysis; import mod.client.model.ModelFrog; import mod.client.model.ModelTriceratops; import mod.client.model.ModelVelociraptors; import mod.client.render.RenderBrachiosaurus; import mod.client.render.RenderCoelophysis; import mod.client.render.RenderFlechette; import mod.client.render.RenderFrog; import mod.client.render.RenderTriceratops; import mod.client.render.RenderVelociraptors; import mod.common.CommonProxy; import mod.common.block.BlockRegister; import mod.common.block.entity.TileEntityBarriere; import mod.common.block.entity.TileEntityBarriereSpecialRenderer; import mod.common.block.entity.TileEntityCombiner; import mod.common.block.entity.TileEntityCombinerSpecialRenderer; import mod.common.block.entity.TileEntityCouveuse; import mod.common.block.entity.TileEntityCouveuseSpecialRenderer; import mod.common.block.entity.TileEntityEgg; import mod.common.block.entity.TileEntityEggSpecialRenderer; import mod.common.block.entity.TileEntityExtractor; import mod.common.block.entity.TileEntityExtractorSpecialRenderer; import mod.common.entity.EntityBrachiosaurus; import mod.common.entity.EntityCoelophysis; import mod.common.entity.EntityFlechette; import mod.common.entity.EntityFrog; import mod.common.entity.EntityTriceratops; import mod.common.entity.EntityVelociraptors; import mod.common.item.ItemRegister; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BlockModelRenderer; import net.minecraft.client.renderer.ItemModelMesher; import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.item.Item; import net.minecraftforge.fml.client.registry.ClientRegistry; import net.minecraftforge.fml.client.registry.RenderingRegistry; public class ClientProxy extends CommonProxy { public static int tesrRenderId; @Override public void register() { ItemModelMesher mesher = Minecraft.getMinecraft().getRenderItem().getItemModelMesher(); System.out.println("Rendering Entity/TileEntity"); RenderingRegistry.registerEntityRenderingHandler(EntityFlechette.class, new RenderFlechette(Minecraft.getMinecraft().getRenderManager())); RenderingRegistry.registerEntityRenderingHandler(EntityFrog.class, new RenderFrog(Minecraft.getMinecraft().getRenderManager(),new ModelFrog(), 0.5F)); RenderingRegistry.registerEntityRenderingHandler(EntityBrachiosaurus.class, new RenderBrachiosaurus(Minecraft.getMinecraft().getRenderManager(), new ModelBrachiosaurus(), 3.5F)); RenderingRegistry.registerEntityRenderingHandler(EntityCoelophysis.class, new RenderCoelophysis(Minecraft.getMinecraft().getRenderManager(), new ModelCoelophysis(), 0.5F)); RenderingRegistry.registerEntityRenderingHandler(EntityTriceratops.class, new RenderTriceratops(Minecraft.getMinecraft().getRenderManager(),new ModelTriceratops(), 3.5F)); RenderingRegistry.registerEntityRenderingHandler(EntityVelociraptors.class, new RenderVelociraptors(Minecraft.getMinecraft().getRenderManager(),new ModelVelociraptors(), 3.5F)); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityBarriere.class, new TileEntityBarriereSpecialRenderer()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityEgg.class, new TileEntityEggSpecialRenderer()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCouveuse.class, new TileEntityCouveuseSpecialRenderer()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityExtractor.class, new TileEntityExtractorSpecialRenderer()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCombiner.class, new TileEntityCombinerSpecialRenderer()); /* tesrRenderId = RenderingRegistry.getNextAvailableRenderId(); RenderingRegistry.registerBlockHandler(new TESRInventoryRenderer()); */ System.out.println("Rendering Items"); mesher.register(ItemRegister.itemADNofFrog, 0, new ModelResourceLocation(DinoCraft.MODID + ":item_ADNofFrog", "inventory")); mesher.register(ItemRegister.itemADNofmosquito, 0, new ModelResourceLocation(DinoCraft.MODID + ":item_ADNofmosquito", "inventory")); mesher.register(ItemRegister.itemADNofvelociraptors, 0, new ModelResourceLocation(DinoCraft.MODID + ":item_ADNofvelociraptors", "inventory")); mesher.register(ItemRegister.itemAmbre, 0, new ModelResourceLocation(DinoCraft.MODID + ":item_Ambre", "inventory")); mesher.register(ItemRegister.itemAmbrewithmosquito, 0, new ModelResourceLocation(DinoCraft.MODID + ":item_Ambrewithmmosquito", "inventory")); mesher.register(ItemRegister.itemBloodofmosquito, 0, new ModelResourceLocation(DinoCraft.MODID + ":item_Bloodofmosquito", "inventory")); mesher.register(ItemRegister.itemBlowGun, 0, new ModelResourceLocation(DinoCraft.MODID + ":item_Blowgun", "inventory")); mesher.register(ItemRegister.itemCPU, 0, new ModelResourceLocation(DinoCraft.MODID + ":item_CPU", "inventory")); mesher.register(ItemRegister.itemDart, 0, new ModelResourceLocation(DinoCraft.MODID + ":item_Dart", "inventory")); mesher.register(ItemRegister.itemDartEmpty, 0, new ModelResourceLocation(DinoCraft.MODID + ":item_DartEmpty", "inventory")); mesher.register(ItemRegister.itemEnhancer, 0, new ModelResourceLocation(DinoCraft.MODID + ":item_Enhancer", "inventory")); mesher.register(ItemRegister.itemFrogLegs, 0, new ModelResourceLocation(DinoCraft.MODID + ":item_FrogLegs", "inventory")); mesher.register(ItemRegister.itemFrogLegsCooked, 0, new ModelResourceLocation(DinoCraft.MODID + ":item_FrogLegsCooked", "inventory")); mesher.register(ItemRegister.itemSap, 0, new ModelResourceLocation(DinoCraft.MODID + ":item_Sap", "inventory")); mesher.register(ItemRegister.itemSapwithmosquito, 0, new ModelResourceLocation(DinoCraft.MODID + ":item_Sapwithmosquito", "inventory")); mesher.register(ItemRegister.itemSuperAxe, 0, new ModelResourceLocation(DinoCraft.MODID + ":item_SuperAxe", "inventory")); mesher.register(ItemRegister.itemSyringe, 0, new ModelResourceLocation(DinoCraft.MODID + ":item_Syringe", "inventory")); mesher.register(ItemRegister.itemSyringewithblood, 0, new ModelResourceLocation(DinoCraft.MODID + ":item_SyringeWithBlood", "inventory")); mesher.register(ItemRegister.itemSyringewithraptorblood, 0, new ModelResourceLocation(DinoCraft.MODID + ":item_SyringeWithRaptorBlood", "inventory")); mesher.register(ItemRegister.itemZoom, 0, new ModelResourceLocation(DinoCraft.MODID + ":item_Zoom", "inventory")); System.out.println("Rendering Blocks"); } @Override public void registerBlockTexture(Block block, int metadata, String name) { registerItemTexture(Item.getItemFromBlock(block), metadata, name); } @Override public void registerBlockTexture(Block block, String name) { registerBlockTexture(block, 0, name); } }
ClassePrincipale
package mod; import java.util.HashMap; import mod.client.TickClient.TickClientHandlerEvent; import mod.common.CommonProxy; import mod.common.block.BlockRegister; import mod.common.block.entity.RegisterTileEntity; import mod.common.block.gui.GuiHandler; import mod.common.block.recipe.RecipeRegisterBlock; import mod.common.entity.EntityRegister; import mod.common.item.ItemRegister; import mod.common.item.recipe.RecipeRegister; import mod.common.world.biome.BiomeRegister; import mod.common.world.structure.DimensionRegister; import net.minecraft.block.Block; import net.minecraft.entity.EntityList; import net.minecraft.item.Item; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventHandler; import net.minecraftforge.fml.common.Mod.Instance; import net.minecraftforge.fml.common.ObfuscationReflectionHelper; import net.minecraftforge.fml.common.SidedProxy; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.network.NetworkRegistry; @Mod(modid = DinoCraft.MODID, name = DinoCraft.Name, version = DinoCraft.Version) public class DinoCraft { public static HashMap <class, integer="">maptoid; public static final String MODID = "dinocraft"; public static final String Name = "DinoCraft"; public static final String Version = "1.0"; @Instance("dinocraft") public static DinoCraft instance; @SidedProxy(clientSide = "mod.client.ClientProxy", serverSide = "mod.common.CommonProxy") public static CommonProxy proxy; @EventHandler public void preInit(FMLPreInitializationEvent event) { BlockRegister.register(); ItemRegister.register(); if(event.getSide().isClient()) { FMLCommonHandler.instance().bus().register(new TickClientHandlerEvent()); MinecraftForge.EVENT_BUS.register(new TickClientHandlerEvent()); } } @EventHandler public void init(FMLInitializationEvent event) { RegisterTileEntity.register(); RecipeRegister.register(); RecipeRegisterBlock.register(); BiomeRegister.register(); EntityRegister.register(); proxy.register(); proxy.registerBlockTexture(BlockRegister.BlockAmbre, "block_ambre"); NetworkRegistry.INSTANCE.registerGuiHandler(instance, new GuiHandler()); } @EventHandler public void postInit(FMLPostInitializationEvent event) { /*DimensionRegister.register();*/ maptoid = ObfuscationReflectionHelper.getPrivateValue(EntityList.class, null, "classToIDMapping", "field_75624_e"); } }
BlockRegister
package mod.common.block; import mod.DinoCraft; import mod.common.block.entity.TileEntityAnalyzer; import mod.common.block.entity.TileEntityBarriere; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.world.biome.BiomeGenBase; import net.minecraftforge.fml.common.registry.GameRegistry; public class BlockRegister { public static Block BlockBarriere; public static Block BlockTronc; public static Block BlockFeuille; public static Block BlockPousse; public static Block BlockAnalyzer; public static Block BlockAmbre; public static Block BlockEgg; public static Block BlockEggIndominus; public static Block BlockFossiliser; public static Block BlockCouveuse; public static Block BlockExtractor; public static Block BlockCombiner; public static Block BlockPortail; public static void register() { BlockBarriere = new BlockBarriere(Material.rock).setCreativeTab(CreativeTabs.tabBlock); BlockTronc = new BlockTronc().setCreativeTab(CreativeTabs.tabBlock).setHardness(2.0F); BlockFeuille = new BlockFeuille(Material.leaves).setCreativeTab(CreativeTabs.tabBlock).setHardness(0.1F); BlockPousse = new BlockPousse().setHardness(0.5F); BlockAnalyzer = new BlockAnalyzer().setCreativeTab(CreativeTabs.tabBlock); BlockAmbre = new BlockAmbre(Material.rock); BlockEgg = new BlockEgg(); BlockEggIndominus = new BlockEggIndominus(Material.dragonEgg); BlockFossiliser = new BlockFossiliser(Material.rock); BlockCouveuse = new BlockBroody(Material.rock).setCreativeTab(CreativeTabs.tabBlock).setLightLevel(1.0F); BlockExtractor = new BlockExtractor(Material.rock).setCreativeTab(CreativeTabs.tabBlock); BlockCombiner = new BlockCombiner(Material.rock).setCreativeTab(CreativeTabs.tabBlock); BlockPortail = new BlockPortail(Material.portal); GameRegistry.registerBlock(BlockAnalyzer,"block_analyzer"); GameRegistry.registerBlock(BlockBarriere, "block_barriere"); GameRegistry.registerBlock(BlockTronc, "block_tronc"); GameRegistry.registerBlock(BlockFeuille, "block_feuille"); GameRegistry.registerBlock(BlockPousse, "block_pousse"); GameRegistry.registerBlock(BlockAmbre, "block_ambre"); GameRegistry.registerBlock(BlockEgg, ItemBlockEgg.class, "block_egg"); GameRegistry.registerBlock(BlockEggIndominus, "block_eggindominus"); GameRegistry.registerBlock(BlockFossiliser, "block_fossiliser"); GameRegistry.registerBlock(BlockCouveuse, "block_couveuse"); GameRegistry.registerBlock(BlockExtractor, "block_extractor"); GameRegistry.registerBlock(BlockCombiner, "block_combiner"); GameRegistry.registerBlock(BlockPortail, "block_portail"); } } ```</class,>
-
Il manque le register mesher pour ton bloc.
-
Des fois je me demande comment je peut être aussi con T_T Merci robin ^^
-
Moi c’est le contraire, la texture en main s’affiche mais pas quand je pose le bloc (il est invisible)
Classe principale :
@Mod(modid = "testmod", name = "Mod de test", version = "1.0.0") public class TestMod { @Instance("testmod") public static TestMod instance; public static final String MODID = "testmod"; @SidedProxy(clientSide = "in.olympe.javaware.testmod.proxy.ClientProxy", serverSide = "in.olympe.javaware.testmod.proxy.CommonProxy") public static CommonProxy proxy; public static Block machineTuto; @EventHandler public void preInit(FMLPreInitializationEvent event) { machineTuto = new BlockMachineTuto(); } @EventHandler public void init(FMLInitializationEvent event) { GameRegistry.registerBlock(machineTuto, "machinetuto"); GameRegistry.registerTileEntity(TileEntityMachineTuto.class, "tileentitymachinetuto"); proxy.registerRender(); proxy.registerBlockTexture(machineTuto, "machinetuto"); if(event.getSide().isClient()) { MinecraftForge.EVENT_BUS.register(new EventClientListener()); } FMLCommonHandler.instance().bus().register(new EventListener()); MinecraftForge.EVENT_BUS.register(new EventListener()); NetworkRegistry.INSTANCE.registerGuiHandler(instance, new GuiHandlerTestMod()); } @EventHandler public void postInit(FMLPostInitializationEvent event) { } }
Client Proxy :
public class ClientProxy extends CommonProxy { @Override public void registerRender() { } @Override public void registerItemTexture(Item item, int metadata, String name) { ItemModelMesher mesher = Minecraft.getMinecraft().getRenderItem().getItemModelMesher(); mesher.register(item, metadata, new ModelResourceLocation(TestMod.MODID + ":" + name, "inventory")); } @Override public void registerItemTexture(Item item, String name) { registerItemTexture(item, 0, name); } @Override public void registerBlockTexture(Block block, int metadata, String name) { registerItemTexture(Item.getItemFromBlock(block), metadata, name); } @Override public void registerBlockTexture(Block block, String name) { registerBlockTexture(block, 0, name); } }
Le json du blockstate :
{ "variants": { "normal": { "model": "testmod:machinetuto" } } }
Le json du model :
{ "parent": "block/cube_all", "textures": { "all": "testmod:blocks/machinetuto" } }
Le json de l’item :
{ "parent": "testmod:block/machinetuto", "display": { "thirdperson": { "rotation": [ 10, -45, 170 ], "translation": [ 0, 1.5, -2.75 ], "scale": [ 0.375, 0.375, 0.375 ] } } }
-
Logs ?
-
[17:49:22] [main/INFO] [GradleStart]: Extra: [] [17:49:22] [main/INFO] [GradleStart]: Running with arguments: [–userProperties, {}, --assetsDir, C:/Users/Utilisateur/.gradle/caches/minecraft/assets, --assetIndex, 1.8, --accessToken, {REDACTED}, --version, 1.8, --tweakClass, net.minecraftforge.fml.common.launcher.FMLTweaker, --tweakClass, net.minecraftforge.gradle.tweakers.CoremodTweaker] [17:49:22] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.FMLTweaker [17:49:22] [main/INFO] [LaunchWrapper]: Using primary tweak class name net.minecraftforge.fml.common.launcher.FMLTweaker [17:49:22] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.gradle.tweakers.CoremodTweaker [17:49:22] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLTweaker [17:49:22] [main/INFO] [FML]: Forge Mod Loader version 8.0.37.1334 for Minecraft 1.8 loading [17:49:22] [main/INFO] [FML]: Java is Java HotSpot(TM) 64-Bit Server VM, version 1.8.0_65, running on Windows 10:amd64:10.0, installed at C:\Program Files\Java\jre1.8.0_65 [17:49:22] [main/INFO] [FML]: Managed to load a deobfuscated Minecraft name- we are in a deobfuscated environment. Skipping runtime deobfuscation [17:49:22] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.gradle.tweakers.CoremodTweaker [17:49:22] [main/INFO] [GradleStart]: Injecting location in coremod net.minecraftforge.fml.relauncher.FMLCorePlugin [17:49:22] [main/INFO] [GradleStart]: Injecting location in coremod net.minecraftforge.classloading.FMLForgePlugin [17:49:22] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker [17:49:22] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.FMLDeobfTweaker [17:49:22] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.gradle.tweakers.AccessTransformerTweaker [17:49:22] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker [17:49:22] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker [17:49:22] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper [17:49:23] [main/ERROR] [FML]: The binary patch set is missing. Either you are in a development environment, or things are not going to work! [17:49:26] [main/ERROR] [FML]: FML appears to be missing any signature data. This is not a good thing [17:49:26] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper [17:49:26] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLDeobfTweaker [17:49:26] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.gradle.tweakers.AccessTransformerTweaker [17:49:26] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.TerminalTweaker [17:49:26] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.TerminalTweaker [17:49:26] [main/INFO] [LaunchWrapper]: Launching wrapped minecraft {net.minecraft.client.main.Main} [17:49:27] [Client thread/INFO]: Setting user: Player984 [17:49:32] [Client thread/INFO]: LWJGL Version: 2.9.1 [17:49:32] [Client thread/INFO] [MinecraftForge]: Attempting early MinecraftForge initialization [17:49:32] [Client thread/INFO] [FML]: MinecraftForge v11.14.1.1334 Initialized [17:49:33] [Client thread/INFO] [FML]: Replaced 204 ore recipies [17:49:33] [Client thread/INFO] [MinecraftForge]: Completed early MinecraftForge initialization [17:49:33] [Client thread/INFO] [FML]: Searching C:\Users\Utilisateur\Desktop\Minecraft modding\Forge\forge-1.8-11.14.1.1334\mods for mods [17:49:35] [Client thread/INFO] [FML]: Forge Mod Loader has identified 4 mods to load [17:49:35] [Client thread/INFO] [FML]: Attempting connection with missing mods [mcp, FML, Forge, testmod] at CLIENT [17:49:35] [Client thread/INFO] [FML]: Attempting connection with missing mods [mcp, FML, Forge, testmod] at SERVER [17:49:36] [Client thread/INFO]: Reloading ResourceManager: Default, FMLFileResourcePack:Forge Mod Loader, FMLFileResourcePack:Minecraft Forge, FMLFileResourcePack:Mod de test [17:49:36] [Client thread/INFO] [FML]: Processing ObjectHolder annotations [17:49:36] [Client thread/INFO] [FML]: Found 384 ObjectHolder annotations [17:49:36] [Client thread/INFO] [FML]: Configured a dormant chunk cache size of 0 [17:49:36] [Client thread/INFO] [FML]: Applying holder lookups [17:49:36] [Client thread/INFO] [FML]: Holder lookups applied [17:49:37] [Sound Library Loader/INFO]: Starting up SoundSystem… [17:49:37] [Thread-7/INFO]: Initializing LWJGL OpenAL [17:49:37] [Thread-7/INFO]: (The LWJGL binding of OpenAL. For more information, see http://www.lwjgl.org) [17:49:38] [Thread-7/INFO]: OpenAL initialized. [17:49:38] [Sound Library Loader/INFO]: Sound engine started [17:49:43] [Client thread/INFO]: Created: 512x512 textures-atlas [17:49:44] [Client thread/INFO] [FML]: Forge Mod Loader has successfully loaded 4 mods [17:49:44] [Client thread/INFO]: Reloading ResourceManager: Default, FMLFileResourcePack:Forge Mod Loader, FMLFileResourcePack:Minecraft Forge, FMLFileResourcePack:Mod de test [17:49:45] [Client thread/INFO]: SoundSystem shutting down… [17:49:45] [Client thread/WARN]: Author: Paul Lamb, www.paulscode.com [17:49:45] [Sound Library Loader/INFO]: Starting up SoundSystem… [17:49:45] [Thread-9/INFO]: Initializing LWJGL OpenAL [17:49:45] [Thread-9/INFO]: (The LWJGL binding of OpenAL. For more information, see http://www.lwjgl.org) [17:49:45] [Thread-9/INFO]: OpenAL initialized. [17:49:45] [Sound Library Loader/INFO]: Sound engine started [17:49:49] [Client thread/INFO]: Created: 512x512 textures-atlas [17:49:59] [Server thread/INFO]: Starting integrated minecraft server version 1.8 [17:49:59] [Server thread/INFO]: Generating keypair [17:49:59] [Server thread/INFO] [FML]: Injecting existing block and item data into this server instance [17:49:59] [Server thread/INFO] [FML]: Applying holder lookups [17:49:59] [Server thread/INFO] [FML]: Holder lookups applied [17:49:59] [Server thread/INFO] [FML]: Loading dimension 0 (New World) (net.minecraft.server.integrated.IntegratedServer@13fc6737) [17:49:59] [Server thread/INFO] [FML]: Loading dimension 1 (New World) (net.minecraft.server.integrated.IntegratedServer@13fc6737) [17:50:00] [Server thread/INFO] [FML]: Loading dimension -1 (New World) (net.minecraft.server.integrated.IntegratedServer@13fc6737) [17:50:00] [Server thread/INFO]: Preparing start region for level 0 [17:50:01] [Server thread/INFO]: Preparing spawn area: 88% [17:50:01] [Server thread/INFO]: Changing view distance to 12, from 10 [17:50:02] [Netty Local Client IO #0/INFO] [FML]: Server protocol version 1 [17:50:02] [Netty Server IO #1/INFO] [FML]: Client protocol version 1 [17:50:02] [Netty Server IO #1/INFO] [FML]: Client attempting to join with 4 mods : FML@8.0.37.1334,testmod@1.0.0,Forge@11.14.1.1334,mcp@9.05 [17:50:02] [Netty Local Client IO #0/INFO] [FML]: [Netty Local Client IO #0] Client side modded connection established [17:50:03] [Server thread/INFO] [FML]: [Server thread] Server side modded connection established [17:50:03] [Server thread/INFO]: Player984[local:E:64f89e2b] logged in with entity id 76 at (-594.2845748776858, 4.0, 24.696510820793282) [17:50:03] [Server thread/INFO]: Player984 joined the game
-
Étrange car il n’y a pas d’erreur dans les logs. Ton bloc est enregistré dans init ou dans preInit ?
-
preInit je l’instancie, puis je l’enregistre dans init, ma classe principale et plus haut (la première)
-
Enregistre le bloc dans preInit.