Rendu complexe de bloc via TESR
-
La classe de ton rendu doit être comme ça :
package modCraftech.client; import org.lwjgl.opengl.GL11; import modCrafttech.common.TileEntitySculpture; import net.minecraft.client.renderer.tileentity.TileEntityRenderer; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; public class TileEntitySculptureSpecialRender extends TileEntitySpecialRenderer implements IInventoryRenderer { private final ModelBariquade model = new ModelBariquade(); public static final ResourceLocation textureLocation = new ResourceLocation("craftech", "textures/blocks/Bariquade.png"); public TileEntitySculptureSpecialRender() { this.setTileEntityRenderer(TileEntityRenderer.instance); } @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); } 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(); } }
Il y avait de problème :
le glRotate doit être avant la fonction du rendu.
Ta fonction renderTileEntitySculptureAt n’était pas appelé dans renderTileEntityAt. -
Merci !
Mais le bloc ne tourne toujours pas -
Ha oui je viens de voir que ta fonction onBlockPlacedBy n’est pas bonne.
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; TileEntity te = world.getBlockTileEntity(x, y, z); if(te instanceof TileEntitySculpture) { ((TileEntitySculpture)te).setDirection((byte)direction); world.markBlockForUpdate(x, y, z); } }
Faut bien suivre les explications et pas juste copier/coller, j’ai expliqué dans le tutoriel que j’avais plusieurs blocs en metadata dans l’exemple.
-
Merci beaucoup !!
Désoler j’ai du mal lire un endroit du tuto
Mais par contre comment je pourrai changer la hit box du bloc car je ne trouve aucun tuto dessus ?
Cordialement Sidney
-
http://www.minecraftforgefrance.fr/showthread.php?tid=136
J’ai parlé de la fonction getSelectedBoundingBoxFromPool et getCollisionBoundingBoxFromPool, mais ce n’est pas très détaillé. Il faudrait que je fasse un tutoriel complet sur les collisions un jour. -
Merci , j ai reussi a modifier la hit box et tous mais quand un problème est résolu, un autre revient car la hit box ne pivote pas en même temps que le model sais tu comment je pourrai faire ?
Cordialement Sidney
-
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { TileEntity te = world.getBlockTileEntity(x, y, z); if(te instanceof TileEntitySculpture) { int direction = ((TileEntitySculpture)te).getDirection(); if(direction == 0) { // direction 0 return AxisAlignedBB.getAABBPool().getAABB((double)x + 0.1D, (double)y + this.minY, (double)z + 0.2D, (double)x + this.maxX, (double)y + 0.9D, (double)z + 0.8D); } else if(direction == 1) { //direction 1 //etc … jusqu'à 3 } } return AxisAlignedBB.getAABBPool().getAABB((double)x + this.minX, (double)y + this.minY, (double)z + this.minZ, (double)x + this.maxX, (double)y + this.maxY, (double)z + this.maxZ); // tile entity invalide, pas de direction, donc valeur par défaut (ne devrait pas arriver en temps normal) }
Même principe pour getSelectedBoundingBoxFromPool.
-
Merci beaucoup !
J’ai donc réussi a faire pivoté la hit-box en fonction de la direction du bloc mais cependant j’ai encore un petit souci (c’est promit , c’est le dernier) lorsque je met le curseur a coté du bloc sa me le sélectionne quand même. Peut tu me dire comment je pourrai réglé ce souci , j’ai était jeté un coup d’œil du coté de la vine mais rien de bien intéressent.
Voici un petit screen shot :
http://zupimages.net/viewer.php?id=14/15/s0xp.pngCordialement Sidney
-
Étrange, je ne vois pas comment régler ça, désolé
-
Ok pas grave. Merci quand même !!
-
@‘sisidney’:
Merci beaucoup !
J’ai donc réussi a faire pivoté la hit-box en fonction de la direction du bloc mais cependant j’ai encore un petit souci (c’est promit , c’est le dernier) lorsque je met le curseur a coté du bloc sa me le sélectionne quand même. Peut tu me dire comment je pourrai réglé ce souci , j’ai était jeté un coup d’œil du coté de la vine mais rien de bien intéressent.
Voici un petit screen shot :
http://zupimages.net/viewer.php?id=14/15/s0xp.pngCordialement Sidney
Es-tu sûr d’avoir utilisé le même principe pour la méthode getSelectedBoundingBoxFromPool?
Sinon, met dans une méthode (peu importe laquelle) et fais Control+Espace (sous Eclipse, en tout cas) pour avoir la liste des méthodes disponibles.
Cherches-en celles qui renvoient AxisAlignedBB et essaie d’appliquer le même traitement que pour les deux méthodes citées dans les précédents posts. -
Ok merci Je vais regardé ça !
-
[size=largeBonjour,
Tout d’abord, merci à tous ceux qui ont écrit les tutoriaux et fait les vidéos de votre chaîne. Sans tout cela, j’aurais été incapable de réaliser ce que vous pouvez voir ci-dessous: un scorpion et un coffre. Ce sont une entité et un bloc :). En plus, ces tutoriels fonctionnent pour la 1.7.x ! Donc, un grand merci <3.
Malheureusement, j’ai un problème… Eh oui :/. Comme vous pouvez-le voir sur le screenshot, un petit cadre noir s’affiche autour de mon coffre. Pour faire cela, j’ai écris ces deux méthodes dans la classe de mon block:
//Cadre (fine ligne noir) autour du block @SideOnly(Side.CLIENT) public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { return AxisAlignedBB.getAABBPool().getAABB((double)x + this.minX, (double)y + this.minY, (double)z + this.minZ, (double)x + 2.10D, (double)y + 1.20D, (double)z + 1.65D); } //Empeche les mobs de traverser le cardre ci-dessus public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { return AxisAlignedBB.getAABBPool().getAABB((double)x + this.minX, (double)y + this.minY, (double)z + this.minZ, (double)x + 2.10D, (double)y + 1.20D, (double)z + 1.65D); }
Cependant, elles ne permettent pas d’empêcher un joueur ou un mob de les traverser. Hors, j’aimerais qu’on ne puisse pas traverser mon coffre. Regardez:
Donc, je vous demande: ] Existe-t-il une méthode pour remplir les blocks couvert par le coffre, et empêcher ainsi qu’on puisse les traverser ?
%(#000000)[Merci d’avance pour votre aide !Au revoir :)]
-
Le ne me souvient plus de la méthode exacte donc je te cherche ça quand je go au pc
-
Déjà traité dans la section support pour les moddeurs. Il faut poser un second bloc en même temps et l’enleve quand un des deux est détruit (onBlockPlacedBy et blockBreak).
-
Bonjour j’ai un petit problème, quand je regarde dans l’inventaire (le rendu du block) ou que je me give le block, le jeu crash instantanément … Je ne sais aps pourquoi, j’ai pourtant suvi le tutoriel là la lettre … Ps: Je suis en Forge 1.7.2
Crash :
Time: 18/05/14 10:15 Description: Rendering item java.lang.NullPointerException: Rendering item at net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer.bindTexture(TileEntitySpecialRenderer.java:21) at fr.mrazerty31.MoreFurnitures.proxy.TileEntityChairSpecialRender.renderTileEntityChairAt(TileEntityChairSpecialRender.java:38) at fr.mrazerty31.MoreFurnitures.proxy.TileEntityChairSpecialRender.renderInventory(TileEntityChairSpecialRender.java:25) at fr.mrazerty31.MoreFurnitures.proxy.TESRInventoryRenderer.renderInventoryBlock(TESRInventoryRenderer.java:49) at cpw.mods.fml.client.registry.RenderingRegistry.renderInventoryBlock(RenderingRegistry.java:125) at net.minecraft.src.FMLRenderAccessLibrary.renderInventoryBlock(FMLRenderAccessLibrary.java:59) at net.minecraft.client.renderer.RenderBlocks.renderBlockAsItem(RenderBlocks.java:8378) at net.minecraft.client.renderer.entity.RenderItem.renderItemIntoGUI(RenderItem.java:447) at net.minecraft.client.renderer.entity.RenderItem.renderItemAndEffectIntoGUI(RenderItem.java:560) at net.minecraft.client.gui.inventory.GuiContainer.func_146977_a(GuiContainer.java:291) at net.minecraft.client.gui.inventory.GuiContainer.drawScreen(GuiContainer.java:118) at net.minecraft.client.renderer.InventoryEffectRenderer.drawScreen(InventoryEffectRenderer.java:44) at net.minecraft.client.gui.inventory.GuiContainerCreative.drawScreen(GuiContainerCreative.java:672) at net.minecraft.client.renderer.EntityRenderer.updateCameraAndRender(EntityRenderer.java:1143) at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1022) at net.minecraft.client.Minecraft.run(Minecraft.java:910) at net.minecraft.client.main.Main.main(Main.java:112) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at net.minecraft.launchwrapper.Launch.launch(Launch.java:134) at net.minecraft.launchwrapper.Launch.main(Launch.java:28) A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- Head -- Stacktrace: at net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer.bindTexture(TileEntitySpecialRenderer.java:21) at fr.mrazerty31.MoreFurnitures.proxy.TileEntityChairSpecialRender.renderTileEntityChairAt(TileEntityChairSpecialRender.java:38) at fr.mrazerty31.MoreFurnitures.proxy.TileEntityChairSpecialRender.renderInventory(TileEntityChairSpecialRender.java:25) at fr.mrazerty31.MoreFurnitures.proxy.TESRInventoryRenderer.renderInventoryBlock(TESRInventoryRenderer.java:49) at cpw.mods.fml.client.registry.RenderingRegistry.renderInventoryBlock(RenderingRegistry.java:125) at net.minecraft.src.FMLRenderAccessLibrary.renderInventoryBlock(FMLRenderAccessLibrary.java:59) at net.minecraft.client.renderer.RenderBlocks.renderBlockAsItem(RenderBlocks.java:8378) at net.minecraft.client.renderer.entity.RenderItem.renderItemIntoGUI(RenderItem.java:447) -- Item being rendered -- Details: Item Type: net.minecraft.item.ItemBlock@56c96a62 Item Aux: 0 Item NBT: null Item Foil: false Stacktrace: at net.minecraft.client.renderer.entity.RenderItem.renderItemAndEffectIntoGUI(RenderItem.java:560) at net.minecraft.client.gui.inventory.GuiContainer.func_146977_a(GuiContainer.java:291) at net.minecraft.client.gui.inventory.GuiContainer.drawScreen(GuiContainer.java:118) at net.minecraft.client.renderer.InventoryEffectRenderer.drawScreen(InventoryEffectRenderer.java:44) at net.minecraft.client.gui.inventory.GuiContainerCreative.drawScreen(GuiContainerCreative.java:672) -- Screen render details -- Details: Screen name: net.minecraft.client.gui.inventory.GuiContainerCreative Mouse location: Scaled: (225, 128). Absolute: (450, 222) Screen size: Scaled: (427, 240). Absolute: (854, 480). Scale factor of 2 -- Affected level -- Details: Level name: MpServer All players: 1 total; [EntityClientPlayerMP['Player624'/49, l='MpServer', x=-482,50, y=5,62, z=-279,50]] Chunk stats: MultiplayerChunkCache: 225, 225 Level seed: 0 Level generator: ID 01 - flat, ver 0\. Features enabled: false Level generator options: Level spawn location: World: (-489,4,-277), Chunk: (at 7,0,11 in -31,-18; contains blocks -496,0,-288 to -481,255,-273), Region: (-1,-1; contains chunks -32,-32 to -1,-1, blocks -512,0,-512 to -1,255,-1) Level time: 144 game time, 144 day time Level dimension: 0 Level storage version: 0x00000 - Unknown? Level weather: Rain time: 0 (now: false), thunder time: 0 (now: false) Level game mode: Game mode: creative (ID 1). Hardcore: false. Cheats: false Forced entities: 8 total; [EntitySlime['Slime'/7788, l='MpServer', x=-490,80, y=4,00, z=-225,43], EntitySlime['Slime'/8138, l='MpServer', x=-459,50, y=4,00, z=-228,72], EntitySlime['Slime'/7202, l='MpServer', x=-451,81, y=4,00, z=-225,55], EntitySlime['Slime'/20525, l='MpServer', x=-561,81, y=4,00, z=-343,31], EntitySlime['Slime'/7200, l='MpServer', x=-453,54, y=4,00, z=-238,64], EntitySlime['Slime'/9123, l='MpServer', x=-517,09, y=4,00, z=-278,41], EntityClientPlayerMP['Player624'/49, l='MpServer', x=-482,50, y=5,62, z=-279,50], EntitySlime['Slime'/10016, l='MpServer', x=-461,97, y=4,77, z=-330,11]] Retry entities: 0 total; [] Server brand: fml,forge Server type: Integrated singleplayer server Stacktrace: at net.minecraft.client.multiplayer.WorldClient.addWorldInfoToCrashReport(WorldClient.java:412) at net.minecraft.client.Minecraft.addGraphicsAndWorldToCrashReport(Minecraft.java:2521) at net.minecraft.client.Minecraft.run(Minecraft.java:932) at net.minecraft.client.main.Main.main(Main.java:112) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at net.minecraft.launchwrapper.Launch.launch(Launch.java:134) at net.minecraft.launchwrapper.Launch.main(Launch.java:28) – System Details -- Details: Minecraft Version: 1.7.2 Operating System: Windows 7 (amd64) version 6.1 Java Version: 1.7.0_21, Oracle Corporation Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation Memory: 946895344 bytes (903 MB) / 1056309248 bytes (1007 MB) up to 1056309248 bytes (1007 MB) JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M AABB Pool Size: 9251 (518056 bytes; 0 MB) allocated, 155 (8680 bytes; 0 MB) used IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0 FML: MCP v9.01-pre FML v7.2.156.1060 Minecraft Forge 10.12.1.1060 4 mods loaded, 4 mods active mcp{8.09} [Minecraft Coder Pack] (minecraft.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available FML{7.2.156.1060} [Forge Mod Loader] (forgeSrc-1.7.2-10.12.1.1060.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available Forge{10.12.1.1060} [Minecraft Forge] (forgeSrc-1.7.2-10.12.1.1060.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available morefurnitures{0.0.1} [More Furnitures] (bin) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available Launched Version: 1.6 LWJGL: 2.9.0 OpenGL: GeForce GT 630/PCIe/SSE2 GL version 4.4.0, NVIDIA Corporation Is Modded: Definitely; Client brand changed to 'fml,forge' Type: Client (map_client.txt) Resource Packs: [] Current Language: English (US) Profiler Position: N/A (disabled) Vec3 Pool Size: 353 (19768 bytes; 0 MB) allocated, 65 (3640 bytes; 0 MB) used Anisotropic Filtering: Off (1) #@!@# Game crashed! Crash report saved to: #@!@# C:\Users\Guillaume\Desktop\Programmation\Programmes\Minecraft\Mods\New 1.7.2\More Furnitures\eclipse\.\crash-reports\crash-2014-05-18_10.15.43-client.txt AL lib: (EE) alc_cleanup: 1 device not closed
-
Problème au niveau du proxy
-
Je vais voir si j’ai bien tout mis ^^ Merci de ta réponse
Je ne vois rien dans le Client Proxy qui pourrait causer un crash Oo
Mon ClientProxy.java :
package fr.mrazerty31.MoreFurnitures.proxy; import cpw.mods.fml.client.registry.ClientRegistry; import cpw.mods.fml.client.registry.RenderingRegistry; import fr.mrazerty31.MoreFurnitures.MoreFurnitures; import fr.mrazerty31.MoreFurnitures.TileEntityChair; import fr.mrazerty31.MoreFurnitures.proxy.TESRInventoryRenderer.TESRIndex; public class ClientProxy extends CommonProxy { public static int renderInventoryTESRId; @Override public void registerRender() { renderInventoryTESRId = RenderingRegistry.getNextAvailableRenderId(); RenderingRegistry.registerBlockHandler(new TESRInventoryRenderer()); } @Override public void registerTileEntityRender() { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityChair.class, new TileEntityChairSpecialRender()); TESRInventoryRenderer.blockByTESR.put(new TESRIndex(MoreFurnitures.woodenChair, 0), new TileEntityChairSpecialRender()); } }
-
Le problème est très simple:
[1.6.x] Rendu complexe de bloc via TESR
“j’ai pourtant suvi le tutoriel là la lettre … Ps: Je suis en Forge 1.7.2”Si tu l’as suivi à la lettre c’est normal que ça ne fontionne pas en 1.7 vu que le tuto est pour 1.6
Sinon je pourrais voir ton TileEntitySpecialRender
-
Je te le donne :
package fr.mrazerty31.MoreFurnitures.proxy; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; import fr.mrazerty31.MoreFurnitures.ModelChair; import fr.mrazerty31.MoreFurnitures.TileEntityChair; public class TileEntityChairSpecialRender extends TileEntitySpecialRenderer implements IInventoryRenderer { private final ModelChair model = new ModelChair(); public static final ResourceLocation textureLocation = new ResourceLocation("morefurnitures", "textures/blocks/woodenchair.png"); public TileEntityChairSpecialRender() { } @Override public void renderInventory(double x, double y, double z) { this.renderTileEntityChairAt(null, x, y, z, 0.0F); } @Override public void renderTileEntityAt(TileEntity te, double x, double y, double z, float tick) { this.renderTileEntityChairAt((TileEntityChair)te, x, y, z, tick); } public void renderTileEntityChairAt(TileEntityChair 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); this.model.render(0.0625F); GL11.glPopMatrix(); } }
Ps : Je n’ai pas mis l’instance dans le constructeur car je n’ai pas trouvé le fonction.