Rendu TESR Orientable
-
Bonjour, j’en vient à vous car depuis plus d’une semaine je bloque sur la création d’un bloc avec rendu TESR réalisé avec Techne orientable. J’ai tenté de suivre le tutoriel mais sans succès. Si quelqu’un pouvait me lister ce que je dois ajouter dans mon code pour obtenir un bloc qui s’oriente en fonction de la direction du joueur ce serait très appréciable.
Mon code :
Dans ma classe principale, la déclaration du model :
pancarteIncarnam = new PancarteIncarnam(Material.rock).setBlockName("PancarteIncarnam").setBlockTextureName(DCEDO.MODID + ":Texture_Pancarte_Incarnam").setCreativeTab(DCEDO.DCEDOCreativeTabsBlocks); GameRegistry.registerBlock(pancarteIncarnam, "PancarteIncarnam"); GameRegistry.registerTileEntity(TileEntityPancarteIncarnamV2.class, "TileEntityPancarteIncarnam");
La classe de mon model : (même si je ne pense pas que ce sera utile ici)
:::
package fr.shyfe.dcedo.common; import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelRenderer; public class ModelPancarteIncarnamV2 extends ModelBase { ModelRenderer Shape1; ModelRenderer Shape2; ModelRenderer Shape3; ModelRenderer Shape4; ModelRenderer Shape5; ModelRenderer Shape6; ModelRenderer Shape7; public ModelPancarteIncarnamV2() { textureWidth = 128; textureHeight = 128; Shape1 = new ModelRenderer(this, 50, 70); Shape1.addBox(0F, 0F, 0F, 4, 30, 1); Shape1.setRotationPoint(-2F, -6F, 0.1F); Shape1.setTextureSize(128, 128); Shape1.mirror = true; setRotation(Shape1, 0F, 0F, 0F); Shape2 = new ModelRenderer(this, 30, 30); Shape2.addBox(0F, 0F, 0F, 24, 24, 3); Shape2.setRotationPoint(-12F, -10F, -1F); Shape2.setTextureSize(128, 128); Shape2.mirror = true; setRotation(Shape2, 0F, 0F, 0F); Shape3 = new ModelRenderer(this, 10, 30); Shape3.addBox(0F, 0F, 0F, 5, 10, 3); Shape3.setRotationPoint(-16.9F, -10F, -1F); Shape3.setTextureSize(128, 128); Shape3.mirror = true; setRotation(Shape3, 0F, 0F, 0F); Shape4 = new ModelRenderer(this, 58, 15); Shape4.addBox(0F, 0F, 0F, 10, 7, 3); Shape4.setRotationPoint(2F, -16.9F, -1F); Shape4.setTextureSize(128, 128); Shape4.mirror = true; setRotation(Shape4, 0F, 0F, 0F); Shape5 = new ModelRenderer(this, 90, 40); Shape5.addBox(0F, 0F, 0F, 7, 4, 1); Shape5.setRotationPoint(12F, 0.7F, 0F); Shape5.setTextureSize(128, 128); Shape5.mirror = true; setRotation(Shape5, 0F, 0F, 0F); Shape6 = new ModelRenderer(this, 90, 20); Shape6.addBox(0F, 0F, 0F, 10, 4, 1); Shape6.setRotationPoint(17.5F, -4.3F, -0.1F); Shape6.setTextureSize(128, 128); Shape6.mirror = true; setRotation(Shape6, 0F, 0F, 0.7853982F); Shape7 = new ModelRenderer(this, 90, 61); Shape7.addBox(0F, 0F, 0F, 6, 4, 1); Shape7.setRotationPoint(14.7F, 7F, -0.1F); Shape7.setTextureSize(128, 128); Shape7.mirror = true; setRotation(Shape7, 0F, 0F, -0.7853982F); } public void renderAll() { Shape1.render(0.0625F); Shape2.render(0.0625F); Shape3.render(0.0625F); Shape4.render(0.0625F); Shape5.render(0.0625F); Shape6.render(0.0625F); Shape7.render(0.0625F); } private void setRotation(ModelRenderer model, float x, float y, float z) { model.rotateAngleX = x; model.rotateAngleY = y; model.rotateAngleZ = z; } }
:::
La classe du block model :
:::
package fr.shyfe.dcedo.common; import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelRenderer; public class ModelPancarteIncarnamV2 extends ModelBase { ModelRenderer Shape1; ModelRenderer Shape2; ModelRenderer Shape3; ModelRenderer Shape4; ModelRenderer Shape5; ModelRenderer Shape6; ModelRenderer Shape7; public ModelPancarteIncarnamV2() { textureWidth = 128; textureHeight = 128; Shape1 = new ModelRenderer(this, 50, 70); Shape1.addBox(0F, 0F, 0F, 4, 30, 1); Shape1.setRotationPoint(-2F, -6F, 0.1F); Shape1.setTextureSize(128, 128); Shape1.mirror = true; setRotation(Shape1, 0F, 0F, 0F); Shape2 = new ModelRenderer(this, 30, 30); Shape2.addBox(0F, 0F, 0F, 24, 24, 3); Shape2.setRotationPoint(-12F, -10F, -1F); Shape2.setTextureSize(128, 128); Shape2.mirror = true; setRotation(Shape2, 0F, 0F, 0F); Shape3 = new ModelRenderer(this, 10, 30); Shape3.addBox(0F, 0F, 0F, 5, 10, 3); Shape3.setRotationPoint(-16.9F, -10F, -1F); Shape3.setTextureSize(128, 128); Shape3.mirror = true; setRotation(Shape3, 0F, 0F, 0F); Shape4 = new ModelRenderer(this, 58, 15); Shape4.addBox(0F, 0F, 0F, 10, 7, 3); Shape4.setRotationPoint(2F, -16.9F, -1F); Shape4.setTextureSize(128, 128); Shape4.mirror = true; setRotation(Shape4, 0F, 0F, 0F); Shape5 = new ModelRenderer(this, 90, 40); Shape5.addBox(0F, 0F, 0F, 7, 4, 1); Shape5.setRotationPoint(12F, 0.7F, 0F); Shape5.setTextureSize(128, 128); Shape5.mirror = true; setRotation(Shape5, 0F, 0F, 0F); Shape6 = new ModelRenderer(this, 90, 20); Shape6.addBox(0F, 0F, 0F, 10, 4, 1); Shape6.setRotationPoint(17.5F, -4.3F, -0.1F); Shape6.setTextureSize(128, 128); Shape6.mirror = true; setRotation(Shape6, 0F, 0F, 0.7853982F); Shape7 = new ModelRenderer(this, 90, 61); Shape7.addBox(0F, 0F, 0F, 6, 4, 1); Shape7.setRotationPoint(14.7F, 7F, -0.1F); Shape7.setTextureSize(128, 128); Shape7.mirror = true; setRotation(Shape7, 0F, 0F, -0.7853982F); } public void renderAll() { Shape1.render(0.0625F); Shape2.render(0.0625F); Shape3.render(0.0625F); Shape4.render(0.0625F); Shape5.render(0.0625F); Shape6.render(0.0625F); Shape7.render(0.0625F); } private void setRotation(ModelRenderer model, float x, float y, float z) { model.rotateAngleX = x; model.rotateAngleY = y; model.rotateAngleZ = z; } }
:::
Le TileEntity :
package fr.shyfe.dcedo.common; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; import net.minecraft.network.Packet; import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; public class TileEntityPancarteIncarnamV2 extends TileEntity { }
Enfin le Tile EntitySpecialRenderer
:::
package fr.shyfe.dcedo.common; import org.lwjgl.opengl.GL11; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; import fr.shyfe.dcedo.common.DCEDO; public class TileEntityPancarteIncarnamSpecialRenderer extends TileEntitySpecialRenderer { public static ModelPancarteIncarnamV2 model = new ModelPancarteIncarnamV2(); public static ResourceLocation texture = new ResourceLocation(DCEDO.MODID.toLowerCase(), "textures/models/blocks/texture_model_pancarte_incarnam_v2.png"); @Override public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialRenderTick) { this.renderTileEntityPancarteIncarnamV2At((TileEntityPancarteIncarnamV2)tile, x, y, z, partialRenderTick); } private void renderTileEntityPancarteIncarnamV2At(TileEntityPancarteIncarnamV2 tile, double x, double y, double z, float partialRenderTick) { GL11.glPushMatrix(); // ouvre une matrix GL11.glTranslated(x + 0.5D, y + 1.5D, z + 0.5D); // déplace le bloc sur les coordonnés et le centre GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); // met droit le bloc (par défaut il est à l'envers) this.bindTexture(texture); // affiche la texture model.renderAll(); // rend le modèle GL11.glPopMatrix(); // ferme la matrix } }
:::
Voîlà, merci d’avance (je précise qu’actuellement le model est visible mais que je veux pouvoir l’orienter).
-
Il y a tout qui est expliqué dans le tutoriel ….
-
@‘robin4002’:
Il y a tout qui est expliqué dans le tutoriel ….
En fait, je fais le tutoriel sur les tileEntity normalement, puis sur les blocks orientables avec la méthode des TileEntity, mais après je bloque … Et une fois que je l’aurais une fois, je pourrais reprendre le code pour tous mes blocks
(Au passage, ne prends pas ca comme un reproche à ton tutoriel qui sont d’ailleurs super utiles, c’est seulement que dans mon cas précis, j’arrive pas à relier les deux parties)
-
Où est-ce que tu bloques ? Si je me souviens bien dans le tuto tu as un int qui est sauvegardé dans la tile entity, il te suffit de faire ce qui est indiqué dans le tuto pour affecter la bonne valeur à l’int selon l’orientation, et après dans ta classe de rendu, tu récupères cet int et selon sa valeur, tu fais un “GL11.glRotatef(180F, 0.0F, 1.0F, 0.0F); //(faut changer le “180F”)”
-
@‘AymericRed’:
Où est-ce que tu bloques ? Si je me souviens bien dans le tuto tu as un int qui est sauvegardé dans la tile entity, il te suffit de faire ce qui est indiqué dans le tuto pour affecter la bonne valeur à l’int selon l’orientation, et après dans ta classe de rendu, tu récupères cet int et selon sa valeur, tu fais un “GL11.glRotatef(180F, 0.0F, 1.0F, 0.0F); //(faut changer le “180F”)”
En fait ce qui aurait été le mieux c’est de m’envoyer un “exemple” qui fonctionne, mais du coup je vais refaire le tuto et vous envoyez mes erreurs, en espérant que ce soit mieux comme ça
-
Oui c’est mieux ;), c’est toujours mieux d’essayer par soi même puis de demander aux autres la solution aux problèmes que l’on rencontre ^^
-
@‘AymericRed’:
Oui c’est mieux ;), c’est toujours mieux d’essayer par soi même puis de demander aux autres la solution aux problèmes que l’on rencontre ^^
Ah, mais j’avais déjà essayé de nombreuses fois mais sans succès, j’ai refait les tutoriels et je bloque toujours sur la même partie :
Dans la classe de mon block, je dois ajouter :
@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 TileEntityPancarteIncarnamV2) // on vérifie son instance pour éviter un ClassCastException { byte direction = ((TileEntityPancarteIncarnamV2)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) }
L’erreur provient de “icons”, j’avoue ne pas trop comprendre l’utilité de cette partie dans mon cas.
Euhm, je viens de réessayer en enlevant cette partie et il se trouve que ça marche ! J’ai enfin réussi à rendre mon bloc orientable.
Au passage, quelle est la ligne à modifier pour changer la hitbox du model ?
-
https://www.minecraftforgefrance.fr/showthread.php?tid=1509#classe5
Et en effet il ne faut pas mettre la fonction getIcon puisque le rendu est géré par le TESR et pas par la méthode classique.
Il me semblait l’avoir précisé.Et pour les exemples fonctionnels, il y a le github.
-
@‘robin4002’:
https://www.minecraftforgefrance.fr/showthread.php?tid=1509#classe5
Et en effet il ne faut pas mettre la fonction getIcon puisque le rendu est géré par le TESR et pas par la méthode classique.
Il me semblait l’avoir précisé.Et pour les exemples fonctionnels, il y a le github.
Effectivement, je viens de voir les github. Merci pour toutes les aides !
-
Si le problème résolu n’oublie pas la balise