Rendu complexe de bloc via TESR
-
Introduction
Qu’est-ce qu’un rendu TESR ?
TESR signifie TileEntitySpecialRenderer, c’est ce que nous allons utiliser pour notre rendu dans le monde. Pour l’inventaire, nous devront passer par un rendu ISBRH.
Un rendu TESR est plus complexe et va passer par un TileEntityLes avantages du TESR :
- Permet de faire des rendus animé (exemple : le portal de l’end, les réservoirs et la raffinerie de buildcraft, etc …)
- Simple à utiliser à l’aide d’un modèle techne.
- Interaction facile avec le TileEntity associer.
Les désavantages du TESR :
- Le rendu est mit à jour à chaque tick, il est donc lourd, il en faut pas en abuser.
- Nécessite un TileEntity
- Beaucoup de classe, plus encore comme nous devrons utiliser un rendu ISBRH pour l’inventaire (le TESR ne fait que le rendu sur le monde)
Ce rendu est donc très intéressant pour faire quelque chose en fonction de votre tileEntity. Si votre bloc n’a pas de TileEntity, le rendu via ISBRH est plus intéressant, sauf si vous voulez utiliser un modèle techne.
Prérequis
- Un bloc basique
- Les entités de bloc (TileEntity)
- Direction de bloc (uniquement si vous souhaitez faire un rendu avec des directions)
- Un modèle techne (ne suivez que la partie “Création du modèle”)
Adapter le modèle techne
Une fois votre modèle exporté en java, il faut modifier quelques trucs dedans. Placez la classe du modèle dans votre package client puis changez la déclaration de package. Ensuite faite ctrl + shift + o pour mettre à jour les importations (prenez toujours net.minecraft.quelque chose)
Tout à la fin de la classe, supprimez la fonction setRotationAngles.
Ensuite modifier la méthode render, supprimer tous les paramètres sauf le dernier, nommé-le juste f. Modifier ensuite le paramètre des Shape.render en f. Exemple :public void render(float f) { Shape1.render(f); Shape2.render(f); Shape3.render(f); Shape4.render(f); Shape5.render(f); Shape6.render(f); }
La classe du bloc
Si vous avez bien suivi les prérequis, votre classe devrait ressembler à ça :
package tutoriel.common; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; public class BlockSculpture extends Block { public BlockSculpture(int id) { super(id, Material.rock); } public TileEntity createTileEntity(World world, int metadata) { return new TileEntitySculpture(); } public boolean hasTileEntity(int metadata) { return true; } }
Ajoutez ces trois fonctions :
public boolean renderAsNormalBlock() { return false; } public boolean isOpaqueCube() { return false; } @SideOnly(Side.CLIENT) public int getRenderType() { return TutoClientProxy.renderInventoryTESRId; }
La première fonction dit que notre bloc n’est pas un cube de 1x1. La deuxième indique de notre bloc n’est pas opaque (pour les blocs ayant une textures transparente ou un rendu ne faisant pas 1x1) et la dernière unique l’id du rendu pour le rendu en main.
ClientProxy + classe principale + interface
Dans votre proxy client, déclarez l’int renderInventoryTESRId :
public static int renderInventoryTESRId;
Dans la méthode registerRender() ajoutez :
renderInventoryTESRId = RenderingRegistry.getNextAvailableRenderId(); RenderingRegistry.registerBlockHandler(new TESRInventoryRenderer());
Créez la classe TESRInventoryRenderer, nous allons nous en occuper après.
Toujours dans le ClientProxy, créez une nouvelle méthode registerTileEntityRender :
@Override public void registerTileEntityRender() { }
N’oubliez pas d’ajouter cette même méthode sans le @Override dans le CommonProxy.
Allez dans votre classe principale, dans la méthode init, après proxy.registerRender(); ajoutez :
proxy.registerTileEntityRender();
N’oubliez pas d’enregistrer votre TileEntity si ce n’est pas déjà fait :
GameRegistry.registerTileEntity(TileEntitySculpture.class, "Sculpture");
Retournez dans votre ClientProxy, et dans la méthode registerTileEntityRender que nous venons de créer ajoutez :
ClientRegistry.bindTileEntitySpecialRenderer(TileEntitySculpture.class, new TileEntitySculptureSpecialRender());
Vous pouvez déjà créez la classe TileEntitySculptureSpecialRender dans votre package client.
Dans votre package client, créez une nouvelle interface IInventoryRenderer :
package tutoriel.client; public interface IInventoryRenderer { public void renderInventory(double x, double y, double z); }
Chaque TESR devra être implémenté de cette interface.
La classe du rendu de tileEntity
Cette classe doit hériter de TileEntitySpecialRenderer pour le rendu sur le monde et être implémenté de IInventoryRenderer pour le rendu en main.
public class TileEntitySculptureSpecialRender extends TileEntitySpecialRenderer implements IInventoryRenderer
Ajoutez un constructeur à la classe, faite un petit ctrl + shift + o et un “add unimplemented methods” et on a :
package tutoriel.client; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; public class TileEntitySculptureSpecialRender extends TileEntitySpecialRenderer implements IInventoryRenderer { public TileEntitySculptureSpecialRender() { } @Override public void renderInventory(double x, double y, double z) { } @Override public void renderTileEntityAt(TileEntity te, double x, double y, double z, float tick) { } }
Ajoutez une nouvelle méthode :
public void renderTileEntitySculptureAt(TileEntitySculpture te, double x, double y, double z, float tick) { }
TileEntitySculpture est le nom du TileEntity que je veux rendre.
Dans la méthode renderTileEntityAt ajoutez : “this.renderTileEntitySculptureAt((TileEntitySculpture)te, x, y, z, tick);” et dans renderInventory ajoutez : “this.renderTileEntitySculptureAt(null, x, y, z, 0.0F);”. Cela donne :@Override public void renderInventory(double x, double y, double z) { this.renderTileEntitySculptureAt(null, x, y, z, 0.0F); } @Override public void renderTileEntityAt(TileEntity te, double x, double y, double z, float tick) { this.renderTileEntitySculptureAt((TileEntitySculpture)te, x, y, z, tick); }
Au dessus du constructeur déclarez un field d’objet ResourceLocation en publique, statique et final, et un d’objet de votre modèle en privé et finale et ajoutez dans le constructeur la fonction “this.setTileEntityRenderer(TileEntityRenderer.instance);”. On obtient :
private final ModelTutorial model = new ModelTutorial(); public static final ResourceLocation textureLocation = new ResourceLocation("modtutoriel", "textures/blocks/modelTutoriel.png"); public TileEntitySculptureSpecialRender() { this.setTileEntityRenderer(TileEntityRenderer.instance); }
Explication : On instancie notre modèle, on déclare notre ResourceLocation (la texture sera dans assets/modtutoriel/textures/blocks/modelTutoriel.png) puis dans le constructeur on initialise le TileEntityRenderer. Très important sinon vous allez avoir des NPE.
Maintenant dans la fonction renderTileEntitySculptureAt.
GL11.glPushMatrix(); GL11.glTranslated(x + 0.5F, y + 1.5F, z + 0.5F); this.bindTexture(textureLocation); GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); this.model.render(0.0625F); GL11.glPopMatrix();
Lancez votre jeu en debug (le scarabée à gauche de run) pour tester le rendu sur le monde (il ne se fait pas encore dans l’inventaire), si vous avez fait votre modèle sur la planche en bois sur techne, le modèle devrait s’afficher correctement, si ce n’est pas le cas, modifiez la valeur y + 1.5F dans “GL11.glTranslated(x + 0.5F, y + 1.5F, z + 0.5F);” (le changement sera fait en directe lorsque vous sauvegarderez, c’est l’intérêt du debug).
Le rendu en main
Notre ISBRH est encore vide, nous allons le compléter. Le code avec interface que j’ai fait (en me basant sur celui de buildcraft) permet d’avoir un seul ISBRH pour tout vos rendus TESR.
Cela veut dire que si vous souhaitez ajouter un deuxième, puis un troisième, etc. rendu via TileEntitySpecialRenderer, il vous suffira de remettre le même id de rendu que pour les autres, et utiliser le même ISBRH. Si c’est pas clair pour vous, allez dans la parti bonus, et suivez les instructions de “ajouter plusieurs rendus via TileEntitySpecialRenderer”.Donc dans la classe TESRInventoryRenderer, changez
@Override public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { return false; } @Override public boolean shouldRender3DInInventory() { return false; } @Override public int getRenderId() { return 0; }
en :
@Override public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { return true; } @Override public boolean shouldRender3DInInventory() { return true; } @Override public int getRenderId() { return TutoClientProxy.renderInventoryTESRId; }
En haut de la classe, ajoutez :
public static class TESRIndex { Block block; int metadata; public TESRIndex(Block block, int metadata) { this.block = block; this.metadata = metadata; } @Override public int hashCode() { return block.hashCode() + metadata; } @Override public boolean equals(Object o) { if(!(o instanceof TESRIndex)) return false; TESRIndex tesr = (TESRIndex)o; return tesr.block == block && tesr.metadata == metadata; } } public static HashMap<TesrIndex, IInventoryRenderer> blockByTESR = new HashMap<TesrIndex, IInventoryRenderer>();
TESRIndex est une classe qui va servir pour nos rendus dans l’inventaire / en main. Dans son constructeur elle prend l’objet du bloc et son metadata.
Ensuite dans la HashMap nous allons enregistrer nos rendus d’inventaire. Dans la fonction renderInventoryBlock, ajoutez :TESRIndex index = new TESRIndex(block, metadata); if(blockByTESR.containsKey(index)) { blockByTESR.get(index).renderInventory(-0.5, -0.5, -0.5); }
A chaque fois qu’un rendu dans l’inventaire d’id renderInventoryTESRId est initialisé, on créé un nouveau TESRIndex, et si ce TESRIndex existe dans la HashMap blockByTESR, on fait le rendu.
Finitions + rendu final
À nouveau dans votre ClientProxy, dans la méthode registerTileEntityRender() ajoutez :
TESRInventoryRenderer.blockByTESR.put(new TESRIndex(ModTutoriel.blockSculpture, 0), new TileEntitySculptureSpecialRender());
ModTutoriel.blockSculpture est l’objet de mon bloc et 0 le metadata.
Lance votre jeu, le rendu en main / dans l’inventaire devrait se faire.
(oui, modèle fait à l’arrache)Bonus / Pour aller plus loin
Les particules :
Vous avez surement remarqué que les particules sont noirs et rose, comme avec un missing texture. Pour résoudre ce problème, il suffit d’attribuer un icône a votre bloc avec la méthode setTextureName que nous avons vu dans un bloc basique. Pour un bloc déjà existant, vous pouvez utiliser la fonction getIcon dans la classe de votre bloc. Par exemple avec :public Icon getIcon(int side, int metadata) { return Block.blockIron.getIcon(0, 0); }
mon bloc aura les particules du bloc de fer.
Ajoutez plusieurs rendus via TileEntitySpecialRenderer
Si vous lisez cette partie, c’est que vous n’avez pas compris mes explications plus haut. En fait il vous suffit de un autre bloc et une autre entité de bloc et une autre TileEntitySpecialRenderer. (ou alors juste une entité de bloc sur metadata avec une TileEntitySpecialRenderer).
Si vous faite un deuxième bloc, dans la fonction@SideOnly(Side.CLIENT) public int getRenderType() { return TutoClientProxy.renderInventoryTESRId; }
Remettez la même chose, ne recréer pas un id de rendu. Comme je l’ai expliqué plus haut, on utilise un seul ISimpleBlockRenderingHandler (nommé TESRInventoryRenderer) pour tout nos rendus en main de TileEntitySpecialRenderer.
N’oubliez pas les fonctions dans le proxy client.
Par exemple, si j’ai 3 TESR sur un bloc en metadata et un quatrième sur un autre bloc, je vais avoir :- 2 blocs
- 4 TileEntity
- 4 TileEntitySpecialRenderer
- 1 seul TileEntitySpecialRenderer
et mon client proxy ressemblera à ça :
public static int renderInventoryTESRId; public void registerRender() { renderInventoryTESRId = RenderingRegistry.getNextAvailableRenderId(); RenderingRegistry.registerBlockHandler(new TESRInventoryRenderer()); } @Override public void registerTileEntityRender() { ClientRegistry.bindTileEntitySpecialRenderer(TileEntitySculpture.class, new TileEntitySculptureSpecialRender()); TESRInventoryRenderer.blockByTESR.put(new TESRIndex(ModTutoriel.blockSculpture, 0), new TileEntitySculptureSpecialRender()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntitySculpture2.class, new TileEntitySculptureSpecialRender2()); TESRInventoryRenderer.blockByTESR.put(new TESRIndex(ModTutoriel.blockSculpture, 1), new TileEntitySculptureSpecialRender2()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntitySculpture3.class, new TileEntitySculptureSpecialRender3()); TESRInventoryRenderer.blockByTESR.put(new TESRIndex(ModTutoriel.blockSculpture, 2), new TileEntitySculptureSpecialRender3()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTuto.class, new TileEntityTutoSpecialRender()); TESRInventoryRenderer.blockByTESR.put(new TESRIndex(ModTutoriel.blockTuto, 0), new TileEntityTutoSpecialRender()); }
Voila, j’espère que c’est plus clair comme ça
Sinon, il y a un exemple ici
Tourner votre modèle en fonction de la direction :
Comme nous avons besoin d’un tileEntity, autant sauvegarder la direction dedans. Suivez donc à la lettre la partie “Sur un bloc avec metadata” du tutoriel Direction de bloc. Ignorez juste la méthode getBlockTexture(IBlockAccess blockaccess, int x, int y, int z, int side), elle ne servira à rien comme la texture est sur le TESR.
Ensuite allez dans votre TileEntitySpecialRenderer, et dans la méthode renderTileEntityQuelqueChoseAt, ajoutez avant " this.model.render(0.0625F);" :if(te != null) { GL11.glRotatef(90F * te.getDirection(), 0.0F, 1.0F, 0.0F); }
Ce qui donne au final :
public void renderTileEntitySculptureAt(TileEntitySculpture te, double x, double y, double z, float tick) { GL11.glPushMatrix(); GL11.glTranslated(x + 0.5F, y + 1.5F, z + 0.5F); this.bindTexture(textureLocation); GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); if(te != null) { GL11.glRotatef(90F * te.getDirection(), 0.0F, 1.0F, 0.0F); } this.model.render(0.0625F); GL11.glPopMatrix(); }
Et voila, maintenant en fonction de la direction du joueur lors du placement, le rendu va tourner !
-
Un tutoriel qui peut sembler compliqué, mais très bien expliqué et simple a suivre !
GG
-
Super tuto , mais j’ai une erreur a :
protected static final ResourceLocation texture = new ResourceLocation("mods/prototypeMod:textures/blocks/Prot.png");
Et il me dit :
PS : je suis en 1.5.2 , cela vient peut-être de la ?
-
Oui, pas besion de ça en 1.5.2, regarde là:
https://github.com/MCNanotech/nanotech_mod/blob/master/common/fr/mcnanotech/kevin_68/nanotech_mod/main/client/renderer/tileentity/TileEntityLampRender.java -
J’ai juste changé le titre car on peut aussi faire des rendus de bloc avec ISimpleBlockRenderingHandler.
Il faudrait aussi faire un tutoriel sur l’orientation du rendu en fonction de la rotation (un tag NTB dans le tileEntity comme les directions avec metadata).En passant, pas besoin de prérequis comme je mets les tutoriels dans le menu principale dans l’ordre, après si tu veux vraiment les mettre laisses-les ^^.
-
Sinon , tu pourrais dire comment faire pour avoir le rendu dans la main et faire disparaitre le block en dessous ?
Car ( pour moi en tout cas ) je vois le block ( carré sans model ) dans le model , et dans ma main , c’est juste un cube et non pas le model … -
@‘Nolan-XX’:
faire disparaitre le block en dessous ?
Comment ça o_O ?
Pour le rendu en main c’est plutôt complexe, je regarderai quand j’aurai le temps.
-
@‘robin4002’:
@‘Nolan-XX’:
faire disparaitre le block en dessous ?
Comment ça o_O ?
Pour le rendu en main c’est plutôt complexe, je regarderai quand j’aurai le temps.
Bah ça :
-
Heu ça c’est pas normal, tu t’en planté quelque part, ou tu as fail ton modèle.
-
ça vient pas du model , et j’ai suivi le tuto a la lettre … :s
-
Je ne sais pas si c’est moi qui n’est pas bon, mais a chaque fois que j’esseye de faire ce tuto au complet, j’ai toujours un erreur quelque part. Cette fois j’en est eu une dans le “Client.proxy”, dans la “render” je croit, il y avait un “.func……” qui ne marchai pas et moi les “proxy.render” ne marche pas, je doit les ecrire comme sa “proxy.renderers”. quelqu’un peut m’aider parce que j’aimerai vraiment pouvoir finir se tuto et me faire un bloc avec un render techne xD merci d’avance
-
Comment s’appelle la fonction dans ton proxy ?
là tu appelles une variable, il faut faire proxy.taFonction(). -
je sais pas vraiment si c’est de sa que tu parle, vu que sa ne fait que environ 1 mois que j’ai commencer à modder, mais dans mon Clientproxy j’ai ça :
package bitegab; import cpw.mods.fml.client.registry.ClientRegistry; import net.minecraftforge.client.MinecraftForgeClient; public class ClientProxy extends CommonProxy { @Override public void registerRenderers() { //ici mes futur client registry ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTutorialTechne.class, TileEntityTutorialTechneRender.class); } }
-
Mets des balises pour tes codes si il te plais.
Merci. -
On peut avoir ta classe principale ?
(PS : j’ai édité ton poste pour le code java, et celui de sevenno pour l’orthographe)
-
Quesqu’une balise? et voici ma classe principale: ```java
package minecraftplus;
import net.minecraft.block.Block;
import net.minecraft.block.BlockOre;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.FurnaceRecipes;
import net.minecraft.potion.Potion;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.oredict.OreDictionary;
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.network.NetworkMod;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;@Mod(modid=“MinePlus”, name=“Minecraft+”, version=“MV.1.6.2-VM.1.0.0”)
@NetworkMod(clientSideRequired=true, serverSideRequired=false, channels = “TutoMod”, packetHandler = TutPacketHandler.class) // NE PAS MODIFIER CETTE LIGNE!!!public class minecraftplusmain {
@SidedProxy(clientSide = “minecraftplus.ClientProxy”, serverSide = “minecraftplus.CommonProxy”)
public static minecraftplus.CommonProxy proxy;@Instance(“MinePlus”)
public static minecraftplusmain instance = new minecraftplusmain();//creativeTabs static
public static CreativeTabs MinecraftplusTabs = new MinecraftplusTabs(CreativeTabs.getNextID(), “Minecraftplus Mod Tabs”);//block static
public static Block platine, cr, BlockPlatine, thallium, phosphore, blockphosphore1, blockphosphore2, blockphosphore3, blockphosphore4, blockphosphore5, gallium, polonium, BlockGallium, BlockPolonium, BlockThallium, StoneFuel ;//item static
public static Item moulear, moulearc, moulearp, platine1, platine2, platine3, platine4, platine5, rc, cs, gr, ch, platinein, ss, sh, is, lameferraf, tetepiocheferraf, tetehacheferraf, tetepelleferraf, moulearth, thallium1, thallium2, thalliumin, moulearpo, polonium1, polonium2, poloniumin, moulearga, gallium1, gallium2, galliumin, phosphoredust, Legouteur, BottleFuel ;//other static
public static Block TutFurnaceIdle;
public static Block TutFurnaceBurning;
private GuiHandler guihandler = new GuiHandler();@EventHandler
public void PreInit(FMLPreInitializationEvent event)
{//Configuration
//Blocks
cr = new cr(2001).setHardness(4.0F).setResistance(14.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName(“Cobblestone renforcee”).func_111022_d(“rm:cr”);
GameRegistry.registerBlock(cr, “cr”);
LanguageRegistry.addName(cr, “Cobblestone renforcee”);//four 500C
TutFurnaceIdle = new TutFurnace(1000, false).setHardness(3.5F).setUnlocalizedName(“Ore Furnace 500C”);
TutFurnaceBurning = new TutFurnace(1001, true).setHardness(3.5F).setUnlocalizedName(“Ore Furnace 500C Burning”).setLightValue(0.4F);
GameRegistry.registerBlock(TutFurnaceIdle, “Tutorial.FurnaceIdle”);
GameRegistry.registerBlock(TutFurnaceIdle, “Tutorial.FurnaceBurning”);
GameRegistry.registerTileEntity(TileEntityTutFurnace.class, “tileentitytutfurnace”);
NetworkRegistry.instance().registerGuiHandler(this, guihandler);
LanguageRegistry.addName(TutFurnaceIdle, “Ore Furnace 500C”);
LanguageRegistry.addName(TutFurnaceBurning, “Ore Furnace 500C Burning”);//ore
StoneFuel = new StoneFuel(2015).setHardness(8.0F).setResistance(1.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName(“StoneFuel”).func_111022_d(“rm:StoneFuel”);
polonium = new polonium(2011).setHardness(3.0F).setResistance(5.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName(“Polonium”).func_111022_d(“rm:polonium”);
phosphore = new phosphore(2004).setHardness(2.0F).setResistance(2.0F).setLightValue(0.4F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName(“Phosphore”).func_111022_d(“rm:phosphore”);
platine = new platine(2000).setHardness(3.0F).setResistance(5.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName(“Platine”).func_111022_d(“rm:platine”);
thallium = new thallium(2003).setHardness(3.0F).setResistance(5.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName(“Thallium”).func_111022_d(“rm:thallium”);
gallium = new gallium(2010).setHardness(3.0F).setResistance(5.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName(“Gallium”).func_111022_d(“rm:gallium”);
GameRegistry.registerBlock(StoneFuel, “StoneFuel”);
GameRegistry.registerBlock(phosphore, “phosphore”);
GameRegistry.registerBlock(platine, “platine”);
GameRegistry.registerBlock(thallium, “thallium”);
GameRegistry.registerBlock(gallium, “gallium”);
GameRegistry.registerBlock(polonium, “polonium”);
LanguageRegistry.addName(StoneFuel, “StoneFuel”);
LanguageRegistry.addName(phosphore, “Phosphore”);
LanguageRegistry.addName(platine, “Platine”);
LanguageRegistry.addName(thallium, “Thallium”);
LanguageRegistry.addName(gallium, “Gallium”);
LanguageRegistry.addName(polonium, “Polonium”);//phosphore
blockphosphore1 = new blockphosphore1(2005).setHardness(3.0F).setResistance(4.0F).setLightValue(0.2F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName(“Block de Phosphore L1”).func_111022_d(“rm:phosphore1”);
blockphosphore2 = new blockphosphore2(2006).setHardness(3.0F).setResistance(4.0F).setLightValue(0.4F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName(“Block de Phosphore L2”).func_111022_d(“rm:phosphore2”);
blockphosphore3 = new blockphosphore3(2007).setHardness(3.0F).setResistance(4.0F).setLightValue(0.6F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName(“Block de Phosphore L3”).func_111022_d(“rm:phosphore3”);
blockphosphore4 = new blockphosphore4(2008).setHardness(3.0F).setResistance(4.0F).setLightValue(0.8F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName(“Block de Phosphore L4”).func_111022_d(“rm:phosphore4”);
blockphosphore5 = new blockphosphore5(2009).setHardness(3.0F).setResistance(4.0F).setLightValue(1.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName(“Block de Phosphore L5”).func_111022_d(“rm:phosphore5”);
phosphoredust = new moulearc(1232).setUnlocalizedName(“Poudre de Phosphore”).func_111206_d(“rm:phosphoredust”);
GameRegistry.registerBlock(blockphosphore1, “blockphosphore1”);
GameRegistry.registerBlock(blockphosphore2, “blockphosphore2”);
GameRegistry.registerBlock(blockphosphore3, “blockphosphore3”);
GameRegistry.registerBlock(blockphosphore4, “blockphosphore4”);
GameRegistry.registerBlock(blockphosphore5, “blockphosphore5”);
GameRegistry.registerItem(phosphoredust, “phosphoredust”);
LanguageRegistry.addName(blockphosphore1, “Block de Phosphore L1”);
LanguageRegistry.addName(blockphosphore2, “Block de Phosphore L2”);
LanguageRegistry.addName(blockphosphore3, “Block de Phosphore L3”);
LanguageRegistry.addName(blockphosphore4, “Block de Phosphore L4”);
LanguageRegistry.addName(blockphosphore5, “Block de Phosphore L5”);
LanguageRegistry.addName(phosphoredust, “Poudre de Phosphore”);//Items
BottleFuel= new BottleFuel(1234).setUnlocalizedName(“Bouteille de gaz”).func_111206_d(“rm:BottleFuel”);
Legouteur = new Legouteur(1233).setUnlocalizedName(“Goudrelle”).setFull3D().func_111206_d(“rm:Legouteur”);
moulear = new moulear(1200).setUnlocalizedName(“Moule d’Argile”).func_111206_d(“rm:moulear”);
moulearc = new moulearc(1201).setUnlocalizedName(“Moule d’argile Cuit”).func_111206_d(“rm:moulearc”);
rc = new rc(1209).setUnlocalizedName(“Reservoir de Chaleur”).func_111206_d(“rm:rc”);
cs = new cs(1210).setUnlocalizedName(“Cobblestone Stick”).setFull3D().func_111206_d(“rm:cs”);
gr = new cs(1211).setUnlocalizedName(“Grille de Cobblestone”).func_111206_d(“rm:gr”);
ch = new ch(1212).setUnlocalizedName(“Cobblestone Hammer”).setFull3D().func_111206_d(“rm:ch”);
ss = new ss(1213).setUnlocalizedName(“Stone Stick”).setFull3D().func_111206_d(“rm:ss”);
sh = new sh(1214).setUnlocalizedName(“Stone Hammer”).setFull3D().func_111206_d(“rm:sh”);
is = new is(1215).setUnlocalizedName(“Iron Stick”).setFull3D().func_111206_d(“rm:is”);
GameRegistry.registerItem(BottleFuel, “BottleFuel”);
GameRegistry.registerItem(Legouteur, “Legouteur”);
GameRegistry.registerItem(moulear, “moule”);
GameRegistry.registerItem(moulearc, “moulearc”);
GameRegistry.registerItem(rc, “rc”);
GameRegistry.registerItem(cs, “cs”);
GameRegistry.registerItem(gr, “gr”);
GameRegistry.registerItem(ch, “ch”);
GameRegistry.registerItem(ss, “ss”);
GameRegistry.registerItem(sh, “sh”);
GameRegistry.registerItem(is, “is”);
LanguageRegistry.addName(BottleFuel, “Bouteille de gaz”);
LanguageRegistry.addName(Legouteur, “Goudrelle”);
LanguageRegistry.addName(moulear, “Moule d’Argile”);
LanguageRegistry.addName(moulearc, “Moule d’argile Cuit”);
LanguageRegistry.addName(rc, “Reservoir de Chaleur”);
LanguageRegistry.addName(cs, “Cobblestone Stick”);
LanguageRegistry.addName(gr, “Grille de Cobblestone”);
LanguageRegistry.addName(ch, “Cobblestone Hammer”);
LanguageRegistry.addName(ss, “Stone Stick”);
LanguageRegistry.addName(sh, “Stone Hammer”);
LanguageRegistry.addName(is, “Iron Stick”);//Gallium
BlockGallium = new BlockGallium(2012).setHardness(5.0F).setResistance(5.0F).setStepSound(Block.soundMetalFootstep).setUnlocalizedName(“Block de Gallium”).func_111022_d(“rm:BlockGallium”);
moulearga = new moulearth(1228).setUnlocalizedName(“Moule de Gallium”).func_111206_d(“rm:moulearga”);
gallium1 = new thallium1(1229).setUnlocalizedName(“Gallium [1/2]C”).func_111206_d(“rm:gallium1”);
gallium2 = new thallium2(1230).setUnlocalizedName(“Gallium Liquide”).func_111206_d(“rm:gallium2”);
galliumin = new thalliumin(1231).setUnlocalizedName(“Gallium Ingot”).func_111206_d(“rm:galliumin”);
GameRegistry.registerItem(moulearga, “moulearga”);
GameRegistry.registerItem(gallium1, “gallium1”);
GameRegistry.registerItem(gallium2, “gallium2”);
GameRegistry.registerItem(galliumin, “galliumin”);
GameRegistry.registerBlock(BlockGallium, “BlockGallium”);
LanguageRegistry.addName(moulearga, “Moule de Gallium”);
LanguageRegistry.addName(gallium1, “Gallium [1/2]C”);
LanguageRegistry.addName(gallium2, “Gallium Liquide”);
LanguageRegistry.addName(galliumin, “Gallium Ingot”);
LanguageRegistry.addName(BlockGallium, “Block de Gallium”);//Polonium
BlockPolonium = new BlockGallium(2013).setHardness(5.0F).setResistance(5.0F).setStepSound(Block.soundMetalFootstep).setUnlocalizedName(“Block de Polonium”).func_111022_d(“rm:BlockPolonium”);
moulearpo = new moulearth(1224).setUnlocalizedName(“Moule de Polonium”).func_111206_d(“rm:moulearpo”);
polonium1 = new thallium1(1225).setUnlocalizedName(“Polonium [1/2]C”).func_111206_d(“rm:polonium1”);
polonium2 = new thallium2(1226).setUnlocalizedName(“Polonium Liquide”).func_111206_d(“rm:polonium2”);
poloniumin = new thalliumin(1227).setUnlocalizedName(“Polonium Ingot”).func_111206_d(“rm:poloniumin”);
GameRegistry.registerItem(moulearpo, “moulearpo”);
GameRegistry.registerItem(polonium1, “polonium1”);
GameRegistry.registerItem(polonium2, “polonium2”);
GameRegistry.registerItem(poloniumin, “poloniumin”);
GameRegistry.registerBlock(BlockPolonium, “BlockPolonium”);
LanguageRegistry.addName(moulearpo, “Moule de Polonium”);
LanguageRegistry.addName(polonium1, “Polonium [1/2]C”);
LanguageRegistry.addName(polonium2, “Polonium Liquide”);
LanguageRegistry.addName(poloniumin, “Polonium Ingot”);
LanguageRegistry.addName(BlockPolonium, “Block de Polonium”);//Thallium
BlockThallium = new BlockThallium(2014).setHardness(5.0F).setResistance(5.0F).setStepSound(Block.soundMetalFootstep).setUnlocalizedName(“Block de Thallium”).func_111022_d(“rm:BlockThallium”);
moulearth = new moulearth(1220).setUnlocalizedName(“Moule de Thallium”).func_111206_d(“rm:moulearth”);
thallium1 = new thallium1(1221).setUnlocalizedName(“Thallium [1/2]C”).func_111206_d(“rm:thallium1”);
thallium2 = new thallium2(1222).setUnlocalizedName(“Thallium Liquide”).func_111206_d(“rm:thallium2”);
thalliumin = new thalliumin(1223).setUnlocalizedName(“Thallium Ingot”).func_111206_d(“rm:thalliumin”);
GameRegistry.registerItem(moulearth, “moulearth”);
GameRegistry.registerItem(thallium1, “thallium1”);
GameRegistry.registerItem(thallium2, “thallium2”);
GameRegistry.registerItem(thalliumin, “thalliumin”);
GameRegistry.registerBlock(BlockThallium, “BlockThallium”);
LanguageRegistry.addName(moulearth, “Moule de Thallium”);
LanguageRegistry.addName(thallium1, “Thallium [1/2]C”);
LanguageRegistry.addName(thallium2, “Thallium Liquide”);
LanguageRegistry.addName(thalliumin, “Thallium Ingot”);
LanguageRegistry.addName(BlockThallium, “Block de Thallium”);//Platine
moulearp = new moulearp(1202).setUnlocalizedName(“Moule de Platine”).func_111206_d(“rm:moulearp”);
platine1 = new platine1(1203).setUnlocalizedName(“Platine [1/5]C”).func_111206_d(“rm:platine1”);
platine2 = new platine2(1204).setUnlocalizedName(“Platine [2/5]C”).func_111206_d(“rm:platine2”);
platine3 = new platine3(1205).setUnlocalizedName(“Platine [3/5]C”).func_111206_d(“rm:platine3”);
platine4 = new platine4(1206).setUnlocalizedName(“Platine [4/5]C”).func_111206_d(“rm:platine4”);
platine5 = new platine5(1207).setUnlocalizedName(“Platine Liquide”).func_111206_d(“rm:platine5”);
platinein = new platinein(1208).setUnlocalizedName(“Platine Ingot”).func_111206_d(“rm:platinein”);
BlockPlatine = new BlockPlatine(2002).setHardness(8.0F).setResistance(10.0F).setStepSound(Block.soundMetalFootstep).setUnlocalizedName(“Block de Platine”).func_111022_d(“rm:BlockPlatine”);
GameRegistry.registerItem(moulearp, “moulearp”);
GameRegistry.registerItem(platine1, “platine1”);
GameRegistry.registerItem(platine2, “platine2”);
GameRegistry.registerItem(platine3, “platine3”);
GameRegistry.registerItem(platine4, “platine4”);
GameRegistry.registerItem(platine5, “platine5”);
GameRegistry.registerItem(platinein, “platinein”);
GameRegistry.registerBlock(BlockPlatine, “BlockPlatine”);
LanguageRegistry.addName(moulearp, “Moule de Platine”);
LanguageRegistry.addName(platine1, “Platine [1/5]C”);
LanguageRegistry.addName(platine2, “Platine [2/5]C”);
LanguageRegistry.addName(platine3, “Platine [3/5]C”);
LanguageRegistry.addName(platine4, “Platine [4/5]C”);
LanguageRegistry.addName(platine5, “Platine liquide”);
LanguageRegistry.addName(platinein, “Platine Ingot”);
LanguageRegistry.addName(BlockPlatine, “Block de Platine”);//raffine
tetepelleferraf = new tetepelleferraf(1217).setUnlocalizedName(“Tete de pelle en fer Raffinee”).func_111206_d(“rm:tetehacheferraf”);
tetehacheferraf = new tetehacheferraf(1216).setUnlocalizedName(“Tete de hache en fer Raffinee”).func_111206_d(“rm:tetehacheferraf”);
tetepiocheferraf = new tetepiocheferraf(1218).setUnlocalizedName(“Tete de pioche en fer Raffinee”).func_111206_d(“rm:tetepiocheferraf”);
lameferraf = new lameferraf(1219).setUnlocalizedName(“Lame de fer Raffinee”).func_111206_d(“rm:lameferraf”);
GameRegistry.registerItem(tetepelleferraf, “tetepelleferraf”);
GameRegistry.registerItem(tetehacheferraf, “tetehacheferraf”);
GameRegistry.registerItem(tetepiocheferraf, “tetepiocheferraf”);
GameRegistry.registerItem(lameferraf, “lameferraf”);
LanguageRegistry.addName(tetepelleferraf, “Tete de pelle en fer Raffinee”);
LanguageRegistry.addName(tetehacheferraf, “Tete de hache en fer Raffinee”);
LanguageRegistry.addName(tetepiocheferraf, “Tete de pioche en fer Raffinee”);
LanguageRegistry.addName(lameferraf, “Lame de fer Raffinee”);}
@EventHandler
public void Init(FMLInitializationEvent event)
{
//RegistryGameRegistry.registerWorldGenerator(new oregeneration());
GameRegistry.registerCraftingHandler(new chHandler());
GameRegistry.registerCraftingHandler(new shHandler());
GameRegistry.registerCraftingHandler(new LegouteurHandler());//Mobs
//Render
proxy.registerRenderers();//NetWork
//Recipe
GameRegistry.addRecipe(new ItemStack(moulear, 2), new Object[]{“ZZZ”, “YZY”, “YYY”, ‘Y’, new ItemStack(Item.clay)});
GameRegistry.addRecipe(new ItemStack(rc), new Object[]{“ZAZ”, “ZAZ”, “ZZZ”, ‘Z’, cr});
GameRegistry.addRecipe(new ItemStack(cr, 4), new Object[]{“ZYZ”, “YYY”, “ZYZ”, ‘Y’, new ItemStack(Block.cobblestone), ‘Z’, new ItemStack(Block.gravel)});
GameRegistry.addRecipe(new ItemStack(cs, 2), new Object[] {“#”, “#”, ‘#’, new ItemStack(Block.cobblestone, 1, 0)});
GameRegistry.addRecipe(new ItemStack(gr), new Object[]{“XXX”, “ZZZ”, “ZZZ”, ‘Z’, cs});
GameRegistry.addRecipe(new ItemStack(ss, 2), new Object[] {“#”, “#”, ‘#’, new ItemStack(Block.stone, 1, 0)});
GameRegistry.addRecipe(new ItemStack(TutFurnaceIdle), new Object[]{“XXX”, “XYX”, “XZX”, ‘X’, cr, ‘Z’, rc, ‘Y’, gr});
GameRegistry.addRecipe(new ItemStack(BlockPlatine), new Object[]{“XXX”, “XXX”, “XXX”, ‘X’, platine5});
GameRegistry.addRecipe(new ItemStack(BlockGallium), new Object[]{“XXX”, “XXX”, “XXX”, ‘X’, gallium2});
GameRegistry.addRecipe(new ItemStack(BlockThallium), new Object[]{“XXX”, “XXX”, “XXX”, ‘X’, thallium2});
GameRegistry.addRecipe(new ItemStack(BlockPolonium), new Object[]{“XXX”, “XXX”, “XXX”, ‘X’, polonium2});
GameRegistry.addRecipe(new ItemStack(blockphosphore1), new Object[]{“XXX”, “XXX”, “XXX”, ‘X’, phosphoredust});
GameRegistry.addRecipe(new ItemStack(blockphosphore2, 4), new Object[] {“XYX”, “YYY”, “XYX”, ‘X’, blockphosphore1, ‘Y’, phosphoredust});
GameRegistry.addRecipe(new ItemStack(blockphosphore3, 4), new Object[] {“XYX”, “YYY”, “XYX”, ‘X’, blockphosphore2, ‘Y’, phosphoredust});
GameRegistry.addRecipe(new ItemStack(blockphosphore4, 4), new Object[] {“XYX”, “YYY”, “XYX”, ‘X’, blockphosphore3, ‘Y’, phosphoredust});
GameRegistry.addRecipe(new ItemStack(blockphosphore5, 4), new Object[] {“XYX”, “YYY”, “XYX”, ‘X’, blockphosphore4, ‘Y’, phosphoredust});
GameRegistry.addRecipe(new ItemStack(is, 2), new Object[] {“#”, “#”, ‘#’, new ItemStack(Item.ingotIron, 1, 0)});
GameRegistry.addRecipe(new ItemStack(Legouteur), new Object[] {“YZY”, “XXX”, “XZY”, ‘X’, cr, ‘Z’, thalliumin});
GameRegistry.addShapelessRecipe(new ItemStack(BottleFuel, 1, 0), new ItemStack(Legouteur, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(StoneFuel), new ItemStack(Item.glassBottle));
GameRegistry.addSmelting(moulear.itemID, new ItemStack(moulearc), 1.2F);//raffine_recipes
GameRegistry.addSmelting(Item.shovelIron.itemID, new ItemStack(tetepelleferraf), 0.5F);
GameRegistry.addSmelting(Item.swordIron.itemID, new ItemStack(lameferraf), 0.5F);
GameRegistry.addSmelting(Item.pickaxeIron.itemID, new ItemStack(tetepiocheferraf), 0.5F);
GameRegistry.addSmelting(Item.axeIron.itemID, new ItemStack(tetehacheferraf), 0.5F);
GameRegistry.addSmelting(Item.pickaxeIron.itemID, new ItemStack(tetepiocheferraf), 0.5F);//Ores_recipes
GameRegistry.addShapelessRecipe(new ItemStack(moulearp), new Object[]{ new ItemStack(moulearc), new ItemStack(platine5)});
GameRegistry.addShapelessRecipe(new ItemStack(moulearth), new Object[]{ new ItemStack(moulearc), new ItemStack(thallium2)});
GameRegistry.addShapelessRecipe(new ItemStack(moulearpo), new Object[]{ new ItemStack(moulearc), new ItemStack(polonium2)});
GameRegistry.addShapelessRecipe(new ItemStack(moulearga), new Object[]{ new ItemStack(moulearc), new ItemStack(gallium2)});//Cobble_Hammer_recipes
GameRegistry.addRecipe(new ItemStack(ch), new Object[]{“XXX”, “XXX”, “ZYZ”, ‘Y’, cs, ‘X’, new ItemStack(Block.cobblestone)});
GameRegistry.addShapelessRecipe(new ItemStack(platinein, 1, 0), new ItemStack(ch, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(moulearp));
GameRegistry.addShapelessRecipe(new ItemStack(thalliumin, 1, 0), new ItemStack(ch, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(moulearth));
GameRegistry.addShapelessRecipe(new ItemStack(poloniumin, 1, 0), new ItemStack(ch, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(moulearpo));
GameRegistry.addShapelessRecipe(new ItemStack(galliumin, 1, 0), new ItemStack(ch, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(moulearga));//Stone_Hammer_recipes
GameRegistry.addRecipe(new ItemStack(sh), new Object[]{“XXX”, “XXX”, “ZYZ”, ‘Y’, ss, ‘X’, new ItemStack(Block.stone)});
GameRegistry.addShapelessRecipe(new ItemStack(platinein, 1, 0), new ItemStack(sh, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(moulearp));
GameRegistry.addShapelessRecipe(new ItemStack(thalliumin, 1, 0), new ItemStack(sh, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(moulearth));
GameRegistry.addShapelessRecipe(new ItemStack(poloniumin, 1, 0), new ItemStack(sh, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(moulearpo));
GameRegistry.addShapelessRecipe(new ItemStack(galliumin, 1, 0), new ItemStack(sh, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(moulearga));//Remove_Recipies
FurnaceRecipes.smelting().getSmeltingList().remove(Block.oreIron.blockID);
FurnaceRecipes.smelting().getSmeltingList().remove(Block.oreGold.blockID);
FurnaceRecipes.smelting().getSmeltingList().remove(Block.oreDiamond.blockID);
FurnaceRecipes.smelting().getSmeltingList().remove(Block.oreCoal.blockID);
FurnaceRecipes.smelting().getSmeltingList().remove(Block.oreEmerald.blockID);
FurnaceRecipes.smelting().getSmeltingList().remove(Block.oreLapis.blockID);
FurnaceRecipes.smelting().getSmeltingList().remove(Block.oreNetherQuartz.blockID);
FurnaceRecipes.smelting().getSmeltingList().remove(Block.oreRedstone.blockID);
FurnaceRecipes.smelting().getSmeltingList().remove(Block.oreRedstoneGlowing.blockID);//Harvest_Level
MinecraftForge.setBlockHarvestLevel(platine, “pickaxe”, 3);
MinecraftForge.setBlockHarvestLevel(thallium, “pickaxe”, 1);
MinecraftForge.setBlockHarvestLevel(gallium, “pickaxe”, 1);
MinecraftForge.setBlockHarvestLevel(polonium, “pickaxe”, 1);
MinecraftForge.setBlockHarvestLevel(phosphore, “pickaxe”, 2);
}@EventHandler
public void PostInit(FMLPostInitializationEvent event)
{
//Integration_avec_les_autres_mods}
}ma classe ClientProxy: ```java package minecraftplus; import cpw.mods.fml.client.registry.RenderingRegistry; public class ClientProxy extends CommonProxy { @Override public void registerRenderers() { //ici mes futurs client registry } @Override public void registerRenderEntity(){ } }
et ma classe CommonProxy: ```java
package minecraftplus;
public class CommonProxy {
public void registerRenderers(){
}
public void registerRenderEntity(){
}
} -
Je vois pas de problème, tu as juste à mettre :
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTutorialTechne.class, TileEntityTutorialTechneRender.class);
dans le void registerRenderers et c’est bon.
Si tu as toujours une erreur, ou est-elle précisément ? Que dit eclipse ? -
désoler de te poser cette question, mais je ne suis vraiment pas très bon avec les terms de modding, quesque c’est que le void registerRenderers, et je refait le tuto complet maintenant et je poste les erreures ensuite
-
voila, je n’ai pas encore fait la classe du model, mais j’ai déjà des erreurs dans le TileEntityTutorialTechneRender.java:
package minecraftplus; import org.lwjgl.opengl.GL11; import net.minecraft.block.Block; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.Tessellator; import net.minecraft.entity.Entity; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntitySpecialRenderer; import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; public class TileEntityTutorialTechneRender extends TileEntitySpecialRenderer { private final ModelBlockTutorielTechne model; protected static final ResourceLocation texture = new ResourceLocation("rm:textures/blocks/BlockTechne.png"); public TileEntityTutorialTechneRender() { this.model = new ModelBlockTutorielTechne(); } private void adjustRotatePivotViaMeta(World world, int x, int y, int z) { int meta = world.getBlockMetadata(x, y, z); GL11.glPushMatrix(); GL11.glRotatef(meta * (-90), 0.0F, 0.0F, 1.0F); GL11.glPopMatrix(); } @Override public void renderTileEntityAt(TileEntity tileentity, double x, double y, double z, float scale) { this.renderTileEntityAtBlockTutorielTechne((TileEntityTutorialTechne)tileentity,? x, y, z, scale); } public void renderTileEntityAtBlockTutorielTechne(TileEntityTutorialTechne tileentity, double x, double y, double z, float scale) { GL11.glPushMatrix(); GL11.glTranslatef((float)x + 0.5F, (float)y + 1.5F, (float)z + 0.5F); this.func_110628_a(texture); GL11.glPushMatrix(); GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); this.model.render((Entity)null, 0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F); GL11.glPopMatrix(); GL11.glPopMatrix(); } private void adjustLightFixture(World world, int i, int j, int k, Block block) { Tessellator tess = Tessellator.instance; float brightness = block.getBlockBrightness(world, i, j, k); int skyLight = world.getLightBrightnessForSkyBlocks(i, j, k, 0); int modulousModifier = skyLight % 65536; int divModifier = skyLight / 65536; tess.setColorOpaque_F(brightness, brightness, brightness); OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)modulousModifier, divModifier); } }
et dans le ClientProxy:
package minecraftplus; import cpw.mods.fml.client.registry.ClientRegistry; import cpw.mods.fml.client.registry.RenderingRegistry; public class ClientProxy extends CommonProxy { @Override public void registerRenderers() { //ici mes futurs client registry ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTutorialTechne.class, new TileEntityTutorialTechneRender()); } @Override public void registerRenderEntity(){ } }
et voici la classe de mon block juste au cas ou:
package minecraftplus; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; public class BlockTutorial extends BlockContainer { public BlockTutorial(int par1) { super(par1, Material.rock); this.setCreativeTab(CreativeTabs.tabBlock); } @Override public TileEntity createNewTileEntity(World world) { return new TileEntityTuto(); } @Override public TileEntity createTileEntity(World world, int metadata) { return new TileEntityTutorialTechne(); } public boolean hasTileEntity(int metadata) { return true; } public boolean isOpaqueCube() { return false; } public boolean renderAsNormalBlock() { return false; } public int getRenderType() { return -1; } }
Voici tout se qui ne marche pas:
-import net.minecraft.tileentity.TileEntitySpecialRenderer;
-extends TileEntitySpecialRenderer
-this.model = new ModelBlockTutorielTechne();
-public void renderTileEntityAt(TileEntity tileentity, double x, double y, double z, float scale)
-this.func_110628_a(texture);
-this.model.render((Entity)null, 0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F);
-.bindTileEntitySpecialRenderer
///////////////////////////////////////////////////////////////////////////////////////////////////
j’espere que vous pourrai m’aider, merci -
Normal, net.minecraft.tileentity.TileEntitySpecialRenderer; n’existe pas c’est net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;