Rendre son bloc orientable
-
Ce tutoriel est également disponible en vidéo.
Sommaire
- Introduction
- Pré-requis
- Créer un item qui fait tourner les blocs
- Dans le cas d’un bloc basique
- Dans le cas d’un bloc avec metadata
- Bonus
- Résultat
- En vidéo
- Crédits
Introduction
Certains blocs de minecraft sont orientables, en fonction du sens où vous regardez lorsque vous placez le bloc, la texture du bloc va changer d’emplacement. Par exemple la citrouille est un bloc orientable. Le piston est aussi un bloc orientable, les têtes de joueurs / mobs également. Nous allons apprendre dans ce tutoriel à rendre orientable un bloc. Il y a deux cas. Dans le premier cas nous allons le faire pour un bloc basique et donc pour celui-ci nous allons faire comme la citrouille c’est à dire qu’en fonction du sens dans lequel le bloc va être placé nous allons lui attribuer un metadata différent, puis adapter la texture par rapport à ce metadata. Dans le deuxième cas nous allons le faire avec un bloc avec metadata, nous allons donc devoir passer par une entité de bloc puisque le metadata est déjà utilisé pour savoir de quel bloc il s’agit.
De plus Forge ajoute quelques fonctions qui vont permettre de faire tourner le bloc (pour ce qui connaissent, par exemple la clé de buildcraft peut faire tourner certains blocs de minecraft et de différents mods à l’aide d’un clic droit). Nous allons aussi voir comment créer un item qui fait tourner les blocs.Pré-requis
- Créer un item basique
- Ajouter plusieurs textures à un bloc (avec ou sans metadata)
- Ajouter une entité à votre bloc (Tile Entity)
Créer un item qui fait tourner les blocs
Dans la classe de votre item, ajoutez ce code :
public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { if(!world.isRemote) { player.addChatMessage(new ChatComponentText("serveur : side " + side)); player.addChatMessage(new ChatComponentText("serveur : metadata " + world.getBlockMetadata(x, y, z))); } if(world.getBlock(x, y, z).rotateBlock(world, x, y, z, ForgeDirection.getOrientation(side))) { return true; } return false; }
La première partie du code (celle qui se trouve dans la condition !world.isRemote) n’est pas nécessaire, elle va simplement nous servir pour avoir quelques informations sur le bloc sur lequel on fait un clic droit, et ces informations vont être très utile.
La deuxième condition est celle qui fait tourner le bloc.Dans le cas d’un bloc basique
Rendre le bloc orientable :
Pour commencer, à l’aide des prérequis, créez un bloc basique avec au moins de 2 textures (une pour la face avant, et les autres textures pour le reste).
Ensuite dans la classe du bloc, ajoutez cette méthode :public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase living, ItemStack stack) { int direction = MathHelper.floor_double((double)(living.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3; world.setBlockMetadataWithNotify(x, y, z, direction, 2); }
Elle va permettre de poser un metadata différent en fonction de la direction dans laquelle le joueur regarde (rotationYaw).
Cette variable va de 0 à 360 en fonction de l’angle du joueur, on la multiplie par 4 puis on la divise par 360 pour avoir une valeur entre 0 et 4. On y ajoute 2,5 on obtient donc une valeur comprise entre 2,5 et 6,5 qu’on va arrondir, donc entre 3 et 6.
Pour finir on utilise l’opérateur & (ET bit-à-bit) ce qui nous donne :Calcul en base de 10 Calcul en binaire Résultat binaire Résultat en base de 10 3 & 3 011 & 011 011 3 4 & 3 100 & 011 000 0 5 & 3 101 & 011 001 1 6 & 3 110 & 011 010 2 Bref, tout ça pour avoir au final une variable comprise entre 0 et 3 en fonction de là où regarde le joueur. Et avec la fonction world.setBlockMetadataWithNotify, on place un metadata différent en fonction de ce nombre.
Maintenant que notre bloc a un metadata différent en fonction de la direction, allez en jeu et placez 4 blocs autour de vous de tel sorte qu’ils aient tous une direction différente. Faites un clic droit avec l’item que nous avons créé avant, et vous devrez voir dans le tchat le metadata du bloc ainsi que la face sur laquelle vous avez cliqué. Et voila, vous avez toutes les valeurs, maintenant il ne reste plus qu’à modifier la fonction getIcon avec ce que vous venez d’observer.
Exemple : Je fais un clic droit sur la face du bloc qui devrait être différente :
Son metadata est 1, et le côté est 4. Donc dans ma fonction getIcon, je vais mettre une condition : if(side == 4 && metadata == 1) -> on utilise la texture avant. Et on fait ça pour les 4 directions.
Si vous n’arrivez pas à comprendre, je vous conseilles de regarder la vidéo à 12 minutes et 35 secondes.Une fois les conditions ajoutés pour les 4 côtés on a :
@SideOnly(Side.CLIENT) public IIcon getIcon(int side, int metadata) { if((side == 3 && metadata == 0) || (side == 4 && metadata == 1) || (side == 2 && metadata == 2) || (side == 5 && metadata == 3)) { return this.blockIcon2; } return this.blockIcon; }
Mit en condition ternaire pour tenir sur une seule ligne ça donne ça :
@SideOnly(Side.CLIENT) public IIcon getIcon(int side, int metadata) { return side == 3 && metadata == 0 ? this.blockIcon2 : (side == 4 && metadata == 1 ? this.blockIcon2 : (side == 2 && metadata == 2 ? this.blockIcon2 : (side == 5 && metadata == 3 ? this.blockIcon2 : this.blockIcon))); }
blockIcon2 correspond à ma texture pour la face de devant, blockIcon pour les autres faces.
Faire en sorte que le bloc tourne avec l’api de forge :
Toujours dans la classe du bloc, ajoutez ces deux fonctions :
public boolean rotateBlock(World world, int x, int y, int z, ForgeDirection axis) { if((axis == ForgeDirection.UP || axis == ForgeDirection.DOWN) && !world.isRemote) { int direction = world.getBlockMetadata(x, y, z) + 1; if(direction > 3) { direction = 0; } world.setBlockMetadataWithNotify(x, y, z, direction, 3); return true; } return false; } public ForgeDirection[] getValidRotations(World world, int x, int y, int z) { return new ForgeDirection[] {ForgeDirection.UP, ForgeDirection.DOWN}; }
La fonction rotateBlock fait tourner le bloc. La première condition vérifie que le joueur a fait un clic droit sur le haut du bloc ou sur le bas. Ainsi le bloc ne tournera pas si on fait un clic droit sur les autres directions comme les blocs de minecraft. Vous pouvez bien sûr modifier cette condition pour que le bloc tourne si on clique sur un autre côté. Ensuite on vérifie qu’on est pas sur le monde client (donc le monde de rendu). Puis on cherche le metadata du bloc, on lui ajoute 1, si il dépasse 3 on le remet à 0 et pour finir on change le metadata du bloc.
On return la boolean sur true, car le bloc a bien tourné. Pour les autres cas on met false.La fonction getValidRotations permet de dire quels sont les axes où l’on peut faire un clic droit pour faire tourner le bloc. Vous pouvez bien sûr en mettre plus, ou mettre directement return ForgeDirection.VALID_DIRECTIONS; pour tous les axes.
Dans le cas d’un bloc avec metadata
Rendre le bloc avec metadata orientable :
Dans mon cas je vais rendre que le bloc de metadata 0 orientable mais vous pouvez bien sûr le faire avec tous les autres blocs, ou le faire seulement pour un metadata précis.
Pour commencer il faut ajouter une entité de bloc au metadata en question. Je ne vais pas revenir sur les entités de bloc sur ce tutoriel, retournez voir le tutoriel sur les entités de bloc (il est dans les pré-requis) si vous ne savez plus comment faire. Dans mon cas je vais nommer l’entité de bloc TileEntityDirectional.Dans la classe du bloc ajoutez cette fonction :
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase living, ItemStack stack) { if(stack.getItemDamage() == 0) { TileEntity tile = world.getTileEntity(x, y, z); if(tile instanceof TileEntityDirectional) { int direction = MathHelper.floor_double((double)(living.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3; ((TileEntityDirectional)tile).setDirection((byte)direction); } } }
La première condition (stack.getItemDamage() == 0) permet de vérifier que le metadata est 0 car comme dit plus haut je n’ai que l’attention de rendre orientable mon bloc de metadata 0.
Ensuite on obtient l’entité de bloc, on vérifie qu’elle est bien d’instance TileEntityDirectional et si c’est le cas on calcule la direction (c’est le même code que celui utilisé dans le cas du bloc basique, remontez plus haut pour les détails) puis on met cette valeur dans l’entité de bloc.
Vous allez avoir une erreur sur setDirection car nous n’avons pas encore créé cette fonction.Nous allons d’ailleurs tout de suite la corriger, allez dans la classe de votre entité de bloc (qui devrait être normalement vide pour l’instant) et ajoutez :
private byte direction; @Override public void readFromNBT(NBTTagCompound compound) { super.readFromNBT(compound); this.direction = compound.getByte("Direction"); } @Override public void writeToNBT(NBTTagCompound compound) { super.writeToNBT(compound); compound.setByte("Direction", this.direction); } public byte getDirection() { return direction; } public void setDirection(byte direction) { this.direction = direction; this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); }
Dans l’ordre :
- on déclare la variable direction, qui contiendra la direction du bloc.
- readFromNBT permet de lire dans la sauvegarde du monde la valeur de la direction (mais ça vous devrez déjà le savoir si vous avez bien suivis les pré-requis ;))
- writeToNBT permet d’écrire dans la sauvegarde du monde la valeur de la direction (idem que le commentaire d’en haut)
- getDirection permet d’obtenir la valeur de la direction
- setDirection permet de mettre la valeur de la direction, on fait un worldObj.markBlockForUpdate juste en dessous pour indiquer que le bloc a été modifié.
Mais il va y avoir un problème, en effet la valeur direction est bien sauvegardée, mais si vous avez bien retenu ce qui est dit dans le tutoriel sur les entités de bloc, elle est sauvegardée du côté du serveur, or c’est le client qui en a besoin pour faire le rendu. Il faut donc synchroniser ces deux valeurs, ajoutez donc ces deux fonctions dans la classe de l’entité de bloc :
public Packet getDescriptionPacket() { NBTTagCompound nbttagcompound = new NBTTagCompound(); this.writeToNBT(nbttagcompound); return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbttagcompound); } public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { this.readFromNBT(pkt.func_148857_g()); this.worldObj.markBlockRangeForRenderUpdate(this.xCoord, this.yCoord, this.zCoord, this.xCoord, this.yCoord, this.zCoord); }
La première permet de mettre la valeur dans le paquet, la deuxième lit dans le paquet la valeur à l’arrivée.
Retournez maintenant dans la classe du bloc et ajoutez la fonction suivante :
@SideOnly(Side.CLIENT) public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { if(world.getBlockMetadata(x, y, z) == 0) // vérifie que le metadata est 0, car comme déjà dit je veux que seul mon bloc de metadata 0 soit orientable { if(side == 0 || side == 1) // si le side est en bas ou en haut { return this.icons[0][0]; // je mets la texture que j'ai prévu pour le haut et le bas } TileEntity tile = world.getTileEntity(x, y, z); // on obtient l'entité de bloc if(tile instanceof TileEntityDirectional) // on vérifie son instance pour éviter un ClassCastException { byte direction = ((TileEntityDirectional)tile).getDirection(); // on obtient la valeur de la direction return side == 3 && direction == 0 ? this.icons[0][1] : (side == 4 && direction == 1 ? this.icons[0][1] : (side == 2 && direction == 2 ? this.icons[0][1] : (side == 5 && direction == 3 ? this.icons[0][1] : this.icons[0][2]))); // et ici c'est la même condition ternaire que j'ai déjà utilisé dans le cas du bloc basique, sauf qu'on vérifie la direction et non le metadata } } return this.getIcon(side, world.getBlockMetadata(x, y, z)); // dans les autres cas on cherche la texture dans la fonction getIcon(side, metadata) }
Le code est commenté, vous devrez le comprendre. Attention, dans la fonction getIcon(side, metadata) vous ne devez pas enlever les blocs qui utilisent cette autre fonction, car getIcon(side, metadata) est toujours utilisé pour le rendu en main !
D’ailleurs je l’ai modifié pour que la texture qui s’affiche à l’avant soit visible dans l’inventaire :public IIcon getIcon(int side, int metadata) { if(metadata == 0) // si le metadata est 0 { if(side == 0 || side == 1) // si le côté est le bas ou le haut { return this.icons[0][0]; // je mets la texture que j'ai prévu pour le haut et le bas } else if(side == 3) // sinon si le côté est 3 { return this.icons[0][1]; // je mets la texture que j'ai prévu pour la face avant du bloc } else { return this.icons[0][2]; // sinon je mets la texture pour les 3 autres faces. } } else if(side > 2) { side = 2; } return metadata >= 0 && metadata < subBlock.length ? this.icons[metadata][side] : this.icons[0][0]; // dans les autres cas (même code que celui montré dans le tutoriel sur les blocs multi-textures) }
Faire en sorte que le bloc avec metadata tourne avec l’api de forge :
Toujours dans la classe du bloc, ajoutez :
@Override public boolean rotateBlock(World world, int x, int y, int z, ForgeDirection axis) { if((axis == ForgeDirection.UP || axis == ForgeDirection.DOWN) && !world.isRemote && world.getBlockMetadata(x, y, z) == 0) { TileEntity tile = world.getTileEntity(x, y, z); if(tile instanceof TileEntityDirectional) { TileEntityDirectional tileDirectional = (TileEntityDirectional)tile; byte direction = tileDirectional.getDirection(); direction++; if(direction > 3) { direction = 0; } tileDirectional.setDirection(direction); return true; } } return false; } public ForgeDirection[] getValidRotations(World world, int x, int y, int z) { return world.getBlockMetadata(x, y, z) == 0 ? new ForgeDirection[] {ForgeDirection.UP, ForgeDirection.DOWN} : ForgeDirection.VALID_DIRECTIONS; // si le metadata est 0, les deux directions sur lesquels on peut faire tourner le bloc, sinon toutes les directions ce qui est la valeur par défaut pour les blocs non directionnels. }
Ce sont exactement les mêmes fonctions que dans le cas du bloc basique sauf que :
- Je vérifie d’abord que le metadata est 0
- Je ne change pas le metadata mais la valeur dans l’entité de bloc
Et voila, c’est terminé !
Résultat
Voir le commit sur github
Le commit sur github montre clairement où ont été placés les fichiers, ainsi que ce qui a été ajouté et retiré dans le fichier.En vidéo
https://www.youtube.com/watch?v=0ZJFK5tJaZI
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 -
Merci Robin. Vraiment un gros plus que tu nous offre là. Un vrai plaisir.
-
Qu’elle tuto dois je suivre un pour un rendue orientable tesr ?
-
Suis le second cas, un bloc avec metadata puis ce tutoriel : http://www.minecraftforgefrance.fr/showthread.php?tid=1509#bonus
-
Bonjour j’ai depuis bientôt une semaine un problème sur cette ligne sur TileEntityDirectional, TileEntityDirectional)tile
TileEntity tile = world.getTileEntity(x, y, z);
if(tile instanceof TileEntityDirectional)
{
int direction = MathHelper.floor_double((double)(living.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3;
((TileEntityDirectional)tile).setDirection((byte)direction);
}
}
voici ma classepackage theopsisblack76.primevalcraftworld; import java.util.Random; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.World; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class BlockAnno extends BlockContainer { private static final String subBlock = null; int a1 = 0, a2 = 0, a3 = 0, a4 = 0, a5 = 0, a6 = 0; private IIcon[][] icons; protected BlockAnno() { super(Material.ground); } @SideOnly(Side.CLIENT) public void randomDisplayTick(World world, int x, int y, int z, Random random) { for(int l = 0; l < 700; ++l) { } } public void onEntityCollidedWithBlock(World world, int i, int j, int k, Entity entity) { if(entity.ridingEntity == null && entity.riddenByEntity == null && !world.isRemote) { entity.travelToDimension(1); } } public IIcon getIcon(int side, int metadata) { if(metadata == 0) { if(side == 0 || side == 1) { return this.icons[0][0]; } else if(side == 3) { return this.icons[0][1]; } else { return this.icons[0][2]; } } else if(side > 2) { side = 2; } return metadata >= 0 && metadata < subBlock.length() ? this.icons[metadata][side] : this.icons[0][0]; // dans les autres cas (même code que celui montré dans le tutoriel sur les blocs multi-textures) } @Override public TileEntity createNewTileEntity(World world, int metadata) { return new TileEntityAnno(); } public boolean isOpaqueCube() { return false; } public boolean renderAsNormalBlock() { return false; } public int getRenderType() { return -1; } @Override public int tickRate(World world) { return 10; } public int quantityDropped(Random par1Random) { return 0; public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase living, ItemStack stack) { if(stack.getItemDamage() == 0) { TileEntity tile = world.getTileEntity(x, y, z); if(tile instanceof TileEntityDirectional) { int direction = MathHelper.floor_double((double)(living.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3; ((TileEntityDirectional)tile).setDirection((byte)direction); } }
-
Il te manque des fermetures d’accolades …
à la fin de la fonction quantityDropped, à la fin de la fonction onBlockPlacedBy et à la fin de la classe. -
Bonjour,
J’ai suivi le tuto pour orienter son bloc avec metadata mais, après test, le bloc ne s’oriente pas.
Pouvez-vous m’aider ?Block :
public class BlockCrusher extends BasicBlock { public static String[] subBlock = new String[] {"copper", "bronze", "steel"}; public IIcon[][] iconArray = new IIcon[subBlock.length][3]; private static boolean field_149934_M; public void registerBlockIcons(IIconRegister iconRegister) { for(int i = 0; i < subBlock.length; i++) { this.iconArray*[0] = iconRegister.registerIcon("neworesbasic:" + subBlock* + "_crusher_top"); this.iconArray*[1] = iconRegister.registerIcon("neworesbasic:" + subBlock* + "_crusher_front"); this.iconArray*[2] = iconRegister.registerIcon("neworesbasic:" + subBlock* + "_crusher_side"); } } public void getSubBlocks(Item item, CreativeTabs tabs, List list) { for(int i = 0; i < subBlock.length; i++) { list.add(new ItemStack(item, 1, i)); } } public int damageDropped(int metadata) { return metadata; } @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int metadata) { if(side == 1) // UP { return this.iconArray[metadata][0]; } else if(side == 3) // FRONT : 3 { return this.iconArray[metadata][1]; } else { return this.iconArray[metadata][2]; } } public BlockCrusher() { this.setCreativeTab(Basic.BasicTab); } @Override public TileEntity createTileEntity(World world, int metadata) { return new TileEntityCrusher(); } @Override public boolean hasTileEntity(int metadata) { return true; } public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9) { FMLNetworkHandler.openGui(player, Basic.instance, 0, world, x, y, z); return true; } public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase living, ItemStack stack) { TileEntity te = world.getTileEntity(x, y, z); if(te != null && te instanceof TileEntityCrusher && stack.hasDisplayName()) { ((TileEntityCrusher)te).setCustomGuiName(stack.getDisplayName()); } if(te instanceof TileEntityCrusher) { int direction = MathHelper.floor_double((double)(living.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3; ((TileEntityCrusher)te).setDirection((byte)direction); } } public void breakBlock(World world, int x, int y, int z, Block block, int metadata) { dropContainerItem(world, x, y, z); super.breakBlock(world, x, y, z, block, metadata); } protected void dropContainerItem(World world, int x, int y, int z) { TileEntityCrusher tecrusher = (TileEntityCrusher)world.getTileEntity(x, y, z); if (tecrusher != null) { for (int slotId = 0; slotId < tecrusher.getSizeInventory(); slotId++) { ItemStack stack = tecrusher.getStackInSlot(slotId); if (stack != null) { float f = world.rand.nextFloat() * 0.8F + 0.1F; float f1 = world.rand.nextFloat() * 0.8F + 0.1F; EntityItem entityitem; for (float f2 = world.rand.nextFloat() * 0.8F + 0.1F; stack.stackSize > 0; world.spawnEntityInWorld(entityitem)) { int k1 = world.rand.nextInt(21) + 10; if (k1 > stack.stackSize) { k1 = stack.stackSize; } stack.stackSize -= k1; entityitem = new EntityItem(world, (double)((float)x + f), (double)((float)y + f1), (double)((float)z + f2), new ItemStack(stack.getItem(), k1, stack.getItemDamage())); float f3 = 0.05F; entityitem.motionX = (double)((float)world.rand.nextGaussian() * f3); entityitem.motionY = (double)((float)world.rand.nextGaussian() * f3 + 0.2F); entityitem.motionZ = (double)((float)world.rand.nextGaussian() * f3); if (stack.hasTagCompound()) { entityitem.getEntityItem().setTagCompound((NBTTagCompound)stack.getTagCompound().copy()); } } } } } } public static void updateCrusherBlockState(boolean p_149931_0_, World p_149931_1_, int p_149931_2_, int p_149931_3_, int p_149931_4_) { int l = p_149931_1_.getBlockMetadata(p_149931_2_, p_149931_3_, p_149931_4_); TileEntity tileentity = p_149931_1_.getTileEntity(p_149931_2_, p_149931_3_, p_149931_4_); field_149934_M = true; /*if (p_149931_0_) { p_149931_1_.setBlock(p_149931_2_, p_149931_3_, p_149931_4_, Basic.crusher); // In-crushing block } else { p_149931_1_.setBlock(p_149931_2_, p_149931_3_, p_149931_4_, Basic.crusher); }*/ field_149934_M = false; p_149931_1_.setBlockMetadataWithNotify(p_149931_2_, p_149931_3_, p_149931_4_, l, 2); if (tileentity != null) { tileentity.validate(); p_149931_1_.setTileEntity(p_149931_2_, p_149931_3_, p_149931_4_, tileentity); } } public boolean hasComparatorInputOverride() { return true; } public int getComparatorInputOverride(World p_149736_1_, int p_149736_2_, int p_149736_3_, int p_149736_4_, int p_149736_5_) { return Container.calcRedstoneFromInventory((IInventory)p_149736_1_.getTileEntity(p_149736_2_, p_149736_3_, p_149736_4_)); } }
TileEntity :
private byte direction; @Override public void readFromNBT(NBTTagCompound nbttag) { super.readFromNBT(nbttag); this.direction = nbttag.getByte("Direction"); // Code. Mystère… ;) } @Override public void writeToNBT(NBTTagCompound nbttag) { super.writeToNBT(nbttag); nbttag.setByte("Direction", this.direction); // Code. Mystère... ;) } public byte getDirection() { return direction; } public void setDirection(byte direction) { this.direction = direction; this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); } public Packet getDescriptionPacket() { NBTTagCompound nbttagcompound = new NBTTagCompound(); this.writeToNBT(nbttagcompound); return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbttagcompound); } public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { this.readFromNBT(pkt.func_148857_g()); this.worldObj.markBlockRangeForRenderUpdate(this.xCoord, this.yCoord, this.zCoord, this.xCoord, this.yCoord, this.zCoord); }
-
Tu as loupé une partie du tutoriel, il te manque la fonction :
public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) -
Merci ça marche à la perfection !
-
Ce message a été supprimé ! -
non, il faut utilisé le nouveau système
-
J’ai suivi la première possibilité (l’Item qui fait tourner les blocs) et ça me donne ça :
Classe Principale :package fr.Raphmaster6.TestMod.common; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.common.Mod.Instance; import cpw.mods.fml.common.SidedProxy; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.registry.GameRegistry; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @Mod(modid = "testmod", name = "ModTest", version = "0.0.0-Test Phase") public class TestMod { public static final String MODID = "testmod"; public static final String NAME = "ModTest"; public static Item TestItem; public static Item TestItemRecipeHint; public static Block TestBlock; public static Block AddDistanceToX; public static Block AddDistanceToY; public static Block AddDistanceToZ; public static Block SpeedBooster; public static Block TestBlock2Textures; public static Item ItemOrientation; @Instance("testmod") public static TestMod instance; @SidedProxy(clientSide = "fr.Raphmaster6.TestMod.client.ClientProxy", serverSide = "fr.Raphmaster6.TestMod.common.CommonProxy") public static CommonProxy proxy; @EventHandler public void preInit(FMLPreInitializationEvent event) { TestItem = new TestItem().setUnlocalizedName("itemTest").setTextureName(TestMod.MODID + ":itemTest").setCreativeTab(CreativeTabs.tabMaterials); GameRegistry.registerItem(TestItem, "test_item"); TestItemRecipeHint = new TestItemRecipeHint().setUnlocalizedName("itemTestRecipe").setTextureName(TestMod.MODID + ":itemTestRecipe").setCreativeTab(CreativeTabs.tabMaterials); GameRegistry.registerItem(TestItemRecipeHint, "test_item_recipe"); TestBlock = new TestBlock(Material.ice).setBlockName("blockTest").setBlockTextureName(MODID + ":testBlock").setCreativeTab(CreativeTabs.tabBlock); GameRegistry.registerBlock(TestBlock, "testBlock"); AddDistanceToX = new AddDistanceToX(Material.rock).setBlockName("xRollingBlock").setBlockTextureName(MODID + ":rollingBlockX").setCreativeTab(CreativeTabs.tabBlock).setBlockUnbreakable(); GameRegistry.registerBlock(AddDistanceToX, "xRollingBlock"); AddDistanceToY = new AddDistanceToY(Material.rock).setBlockName("yRollingBlock").setBlockTextureName(MODID + ":rollingBlockY").setCreativeTab(CreativeTabs.tabBlock).setBlockUnbreakable(); GameRegistry.registerBlock(AddDistanceToY, "yRollingBlock"); AddDistanceToZ = new AddDistanceToZ(Material.rock).setBlockName("zRollingBlock").setBlockTextureName(MODID + ":rollingBlockZ").setCreativeTab(CreativeTabs.tabBlock).setBlockUnbreakable(); GameRegistry.registerBlock(AddDistanceToZ, "zRollingBlock"); SpeedBooster = new SpeedBooster(Material.rock).setBlockName("speedBooster").setBlockTextureName(MODID + ":SpeedBooster").setCreativeTab(CreativeTabs.tabBlock).setBlockUnbreakable(); GameRegistry.registerBlock(SpeedBooster, "speedBooster"); TestBlock2Textures = new TestBlock2Textures(Material.rock).setBlockName("testBlock2textures").setCreativeTab(CreativeTabs.tabBlock).setBlockUnbreakable(); GameRegistry.registerBlock(TestBlock2Textures, "testBlock2textures"); GameRegistry.registerTileEntity(TestBlockOrientationTileEntity.class, "testmod:ModTest"); ItemOrientation = new ItemOrientation().setUnlocalizedName("itemOrientation").setTextureName(TestMod.MODID + ":itemOrientation").setCreativeTab(CreativeTabs.tabTools).setMaxStackSize(1); } @EventHandler public void init(FMLInitializationEvent event) { proxy.registerRender(); GameRegistry.addRecipe(new ItemStack(TestItem, 8), new Object[]{ "XXX", "XIX", "XXX", 'X', Items.diamond, 'I', TestMod.TestItemRecipeHint, }); GameRegistry.addShapelessRecipe(new ItemStack(TestItemRecipeHint, 4), new Object[]{ Items.diamond }); GameRegistry.addSmelting(Items.diamond, new ItemStack(TestItemRecipeHint, 4), 5); GameRegistry.addRecipe(new ItemStack(TestBlock, 4), new Object[]{ "I I", "III", "XIX", 'I', TestMod.TestItem, 'X', Items.diamond, }); GameRegistry.addRecipe(new ItemStack(AddDistanceToX, 2), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', Items.slime_ball, 'E', new ItemStack(Items.dye, 1, 2), }); GameRegistry.addRecipe(new ItemStack(AddDistanceToY, 2), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', Items.slime_ball, 'E', new ItemStack(Items.dye, 1, 6), }); GameRegistry.addRecipe(new ItemStack(AddDistanceToZ, 2), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', Items.slime_ball, 'E', new ItemStack(Items.dye, 1, 1), }); GameRegistry.addRecipe(new ItemStack(SpeedBooster, 2), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', Items.arrow, 'E', Items.slime_ball, }); //Start the lines of code to craft the TestBlock2textures GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 0), 'E', new ItemStack(Blocks.log, 1, 0), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 1), 'E', new ItemStack(Blocks.log, 1, 0), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 2), 'E', new ItemStack(Blocks.log, 1, 0), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 3), 'E', new ItemStack(Blocks.log, 1, 0), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 4), 'E', new ItemStack(Blocks.log, 1, 0), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 5), 'E', new ItemStack(Blocks.log, 1, 0), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 6), 'E', new ItemStack(Blocks.log, 1, 0), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 7), 'E', new ItemStack(Blocks.log, 1, 0), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 8), 'E', new ItemStack(Blocks.log, 1, 0), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 9), 'E', new ItemStack(Blocks.log, 1, 0), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 10), 'E', new ItemStack(Blocks.log, 1, 0), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 11), 'E', new ItemStack(Blocks.log, 1, 0), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 12), 'E', new ItemStack(Blocks.log, 1, 0), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 13), 'E', new ItemStack(Blocks.log, 1, 0), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 14), 'E', new ItemStack(Blocks.log, 1, 0), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 15), 'E', new ItemStack(Blocks.log, 1, 0), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 0), 'E', new ItemStack(Blocks.log, 1, 1), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 1), 'E', new ItemStack(Blocks.log, 1, 1), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 2), 'E', new ItemStack(Blocks.log, 1, 1), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 3), 'E', new ItemStack(Blocks.log, 1, 1), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 4), 'E', new ItemStack(Blocks.log, 1, 1), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 5), 'E', new ItemStack(Blocks.log, 1, 1), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 6), 'E', new ItemStack(Blocks.log, 1, 1), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 7), 'E', new ItemStack(Blocks.log, 1, 1), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 8), 'E', new ItemStack(Blocks.log, 1, 1), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 9), 'E', new ItemStack(Blocks.log, 1, 1), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 10), 'E', new ItemStack(Blocks.log, 1, 1), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 11), 'E', new ItemStack(Blocks.log, 1, 1), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 12), 'E', new ItemStack(Blocks.log, 1, 1), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 13), 'E', new ItemStack(Blocks.log, 1, 1), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 14), 'E', new ItemStack(Blocks.log, 1, 1), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 15), 'E', new ItemStack(Blocks.log, 1, 1), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 0), 'E', new ItemStack(Blocks.log, 1, 2), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 1), 'E', new ItemStack(Blocks.log, 1, 2), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 2), 'E', new ItemStack(Blocks.log, 1, 2), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 3), 'E', new ItemStack(Blocks.log, 1, 2), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 4), 'E', new ItemStack(Blocks.log, 1, 2), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 5), 'E', new ItemStack(Blocks.log, 1, 2), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 6), 'E', new ItemStack(Blocks.log, 1, 2), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 7), 'E', new ItemStack(Blocks.log, 1, 2), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 8), 'E', new ItemStack(Blocks.log, 1, 2), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 9), 'E', new ItemStack(Blocks.log, 1, 2), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 10), 'E', new ItemStack(Blocks.log, 1, 2), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 11), 'E', new ItemStack(Blocks.log, 1, 2), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 12), 'E', new ItemStack(Blocks.log, 1, 2), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 13), 'E', new ItemStack(Blocks.log, 1, 2), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 14), 'E', new ItemStack(Blocks.log, 1, 2), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 15), 'E', new ItemStack(Blocks.log, 1, 2), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 0), 'E', new ItemStack(Blocks.log, 1, 3), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 1), 'E', new ItemStack(Blocks.log, 1, 3), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 2), 'E', new ItemStack(Blocks.log, 1, 3), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 3), 'E', new ItemStack(Blocks.log, 1, 3), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 4), 'E', new ItemStack(Blocks.log, 1, 3), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 5), 'E', new ItemStack(Blocks.log, 1, 3), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 6), 'E', new ItemStack(Blocks.log, 1, 3), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 7), 'E', new ItemStack(Blocks.log, 1, 3), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 8), 'E', new ItemStack(Blocks.log, 1, 3), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 9), 'E', new ItemStack(Blocks.log, 1, 3), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 10), 'E', new ItemStack(Blocks.log, 1, 3), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 11), 'E', new ItemStack(Blocks.log, 1, 3), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 12), 'E', new ItemStack(Blocks.log, 1, 3), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 13), 'E', new ItemStack(Blocks.log, 1, 3), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 14), 'E', new ItemStack(Blocks.log, 1, 3), }); GameRegistry.addRecipe(new ItemStack(TestBlock2Textures, 4), new Object[]{ "X X", "IXI", "HEH", 'X', Items.diamond, 'I', TestMod.TestItem, 'H', new ItemStack(Items.dye, 1, 15), 'E', new ItemStack(Blocks.log, 1, 3), }); //End the lines of code to craft the TestBlock2textures } @EventHandler public void postinit(FMLPostInitializationEvent event) { } }
Classe de l’Item :
package fr.Raphmaster6.TestMod.common; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.ChatComponentText; import net.minecraft.world.World; public class ItemOrientation extends Item { public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { if(!world.isRemote) { player.addChatMessage(new ChatComponentText("serveur : side " + side)); player.addChatMessage(new ChatComponentText("serveur : metadata " + world.getBlockMetadata(x, y, z))); } if(world.getBlock(x, y, z).rotateBlock(world, x, y, z, ForgeDirection.getOrientation(side))) { return true; } return false; } }
L’erreur affichée :
ForgeDirection cannot be resolved
-
Tu es en + que 1.7.10 ? Remplace les ForgeDirection par EnumFacing.
Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk
-
ctrl + shift + o
-
O.K merci… En plus, je connais l’astuce, j’aurais du y penser mais je croyais que c’était uniquement pour les Imports
-
Oui c’est pour les importations, tu n’avais pas importé ForgeDirection donc forcement il ne le reconnaissait pas.
-
-
-