Block ISBRH - Problème de luminosité + questions supplémentaires
-
Bonjour à tous. J’ai un problème avec mon bloc ISBRH. L’un des render est sombre alors que les autres sont bon. Voici un screen pour mieux illustrer le problème et les codes du bloc.
:::package fr.yahoo.eagledeath73.theartbuilder.blocks; import java.util.List; import net.minecraft.block.Block; import net.minecraft.block.BlockStairs; import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import fr.yahoo.eagledeath73.theartbuilder.TheArtBuilder; import fr.yahoo.eagledeath73.theartbuilder.proxy.ClientProxy; public class BockEscalierJardinA1 extends Block { public BockEscalierJardinA1(Material rock) { super(Material.rock); this.setCreativeTab(TheArtBuilder.versaillesCreativeTabs); } public boolean isOpaqueCube() {return false;} public boolean renderAsNormalBlock() {return false;} @SideOnly(Side.CLIENT) public int getRenderType() { return ClientProxy.renderEscalierJardinA1; } @SideOnly(Side.CLIENT) public boolean shouldSideBeRendered(IBlockAccess state, int x, int y, int z, int side) { return true; } public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB axisAlignedBB, List list, Entity entity) { if(world.getBlockMetadata(x, y, z) == 0) { this.setBlockBounds(0F, 0F, 0F, 1F, 0.2F, 1F); super.addCollisionBoxesToList(world, x, y, z, axisAlignedBB, list, entity); this.setBlockBounds(0F, 0F, 0F, 1F, 0.25F, 1F); } if(world.getBlockMetadata(x, y, z) == 1) { this.setBlockBounds(0F, 0F, 0F, 1F, 0.2F, 1F); super.addCollisionBoxesToList(world, x, y, z, axisAlignedBB, list, entity); this.setBlockBounds(0F, 0F, 0F, 1F, 0.25F, 1F); } if(world.getBlockMetadata(x, y, z) == 2) { this.setBlockBounds(0F, 0F, 0F, 1F, 0.2F, 1F); super.addCollisionBoxesToList(world, x, y, z, axisAlignedBB, list, entity); this.setBlockBounds(0F, 0F, 0F, 1F, 0.25F, 1F); } if(world.getBlockMetadata(x, y, z) == 3) { this.setBlockBounds(0F, 0F, 0F, 1F, 0.2F, 1F); super.addCollisionBoxesToList(world, x, y, z, axisAlignedBB, list, entity); this.setBlockBounds(0F, 0F, 0F, 1F, 0.25F, 1F); } } 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); } }
::::::
package fr.yahoo.eagledeath73.theartbuilder.renderer; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; import net.minecraft.world.IBlockAccess; import org.lwjgl.opengl.GL11; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import fr.yahoo.eagledeath73.theartbuilder.proxy.ClientProxy; public class RenderBlockEscalierJardinA1 implements ISimpleBlockRenderingHandler { @Override public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { Tessellator tessellator = Tessellator.instance; renderer.setRenderBounds(0.0F, 0.5F, 0.0F, 1.0F, 1.0F, 1.0F); this.renderInInventory(tessellator, renderer, block, metadata); renderer.setRenderBounds(0F, 0.05F, 0F, 0.5F, 0.2F, 1F); this.renderInInventory(tessellator, renderer, block, metadata); } @Override public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { if(world.getBlockMetadata(x, y, z) == 0) { renderer.setRenderBounds(1F, 0.05F, 0F, 0F, 0F, 1F); renderer.renderStandardBlock(block, x, y, z); renderer.setRenderBounds(1F, 0.2F, 0F, 0F, 0.05F, 0.5F); renderer.renderStandardBlock(block, x, y, z); } if(world.getBlockMetadata(x, y, z) == 1) { renderer.setRenderBounds(0F, 0F, 0F, 1F, 0.05F, 1F); renderer.renderStandardBlock(block, x, y, z); renderer.setRenderBounds(0.5F, 0F, 0F, 1F, 0.2F, 1F); renderer.renderStandardBlock(block, x, y, z); } if(world.getBlockMetadata(x, y, z) == 2) { renderer.setRenderBounds(0F, 0F, 0F, 1F, 0.05F, 1F); renderer.renderStandardBlock(block, x, y, z); renderer.setRenderBounds(0F, 0.05F, 0.5F, 1F, 0.2F, 1F); renderer.renderStandardBlock(block, x, y, z); } if(world.getBlockMetadata(x, y, z) == 3) { renderer.setRenderBounds(0F, 0F, 0F, 1F, 0.05F, 1F); renderer.renderStandardBlock(block, x, y, z); renderer.setRenderBounds(0F, 0.05F, 0F, 0.5F, 0.2F, 1F); renderer.renderStandardBlock(block, x, y, z); } return true; } @Override public boolean shouldRender3DInInventory(int modelId) { return true; } @Override public int getRenderId() { return ClientProxy.renderEscalierJardinA1; } private void renderInInventory(Tessellator tessellator, RenderBlocks renderer, Block block, int metadata) { GL11.glTranslatef(-0.5F, -0.5F, -0.5F); tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, -1F, 0.0F); renderer.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, block.getIcon(0, metadata)); tessellator.draw(); tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 1.0F, 0.0F); renderer.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, block.getIcon(1, metadata)); tessellator.draw(); tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, -1F); renderer.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, block.getIcon(2, metadata)); tessellator.draw(); tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, 1.0F); renderer.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, block.getIcon(3, metadata)); tessellator.draw(); tessellator.startDrawingQuads(); tessellator.setNormal(-1F, 0.0F, 0.0F); renderer.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, block.getIcon(4, metadata)); tessellator.draw(); tessellator.startDrawingQuads(); tessellator.setNormal(1.0F, 0.0F, 0.0F); renderer.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, block.getIcon(5, metadata)); tessellator.draw(); GL11.glTranslatef(0.5F, 0.5F, 0.5F); } }
:::
Questions supplémentaires :
-
Je souhaite faire un angle automatique (comme pour les escaliers) mais avec mon bloc ci dessus. Comment faire svp ? J’ai recherché sur le net des explications pour comment faire ça mais j’ai pas trouvé mon bonheur. J’ai essayé en regardant le code des escaliers directement mais je comprend rien. Je ne sais pas quel morceau du code exactement je dois prendre et comment le modifier.
-
Sur d’autres blocs ISBRH que je vais faire et qui formeront un mur de 11 blocs de haut, je souhaite faire en sorte qu’en posant le bloc tout en bas, les 10 autres blocs se superposent au premier dans l’ordre (bloc 0 = premier bloc; bloc 1 au dessus du 0; bloc 2 au dessus du 1; ect). Comme pour ma première question, j’ai fais des recherches sur le net et dans le code dans ItemDoor ou du Lit, mais je ne sais pas quel morceau du code exactement je dois prendre et comment le modifier.
J’ai commencé à coder en java il y a 2 semaines tout en faisant mon mod. Je comprend certaines choses mais pas tout pour le moment. Donc si vous trouvez des solutions à mon problème et mes questions en me donnant du code, j’aimerais avoir quelques explications sur ces derniers, si possible, afin que je comprenne mieux ce que je code.
-
-
Pour le rendu : j’avais le même problème dans mon mod, j’ai jamais su pourquoi donc je suis passé par un TESR : http://www.minecraftforgefrance.fr/showthread.php?tid=2720
1- http://www.minecraftforgefrance.fr/showthread.php?tid=1304#partie2
2- pas compris -
Pour le 2, il veut que poser un de ses blocs fassent spawn 10 autres blocs au dessus et dans l’ordre voulu.
-
A ce moment la tu as juste une fonction onBlockPlaced (je crois) dans laquelle tu poses tous les autres blocks
-
Merci a tout les deux. Je ne veux pas passé par TESR car ça fait une entité et je ne cherche pas a en avoir car sur le serveur, il y en à déjà masse et je ne veux pas en rajouter encore plus. Surtout pour ce que l’on veux faire. Donc passer par Isbrh me parait le plus adapté. J’espère donc que quelqu’un a une solution au rendu sombre.
Q1 - Merci pour ton lien mais j’ai déjà vu. Mes blocs sont déjà orientable selon où regarde le joueur. Par contre je ne trouve pas comment faire un render avec ce même bloc pour faire un angle. Comme les escaliers de minecraft le font.
Q2 - C’est tout a fait ça Toutoune1008. Cependant je ne connais pas cette fonction Scarex. Quelqu’un pourrait me faire un exemple svp ?
-
Q1 Au moment où le bloc est placé, il faut que tu vérifies les blocs autour et que tu changes ta metadata (et donc le rendu) en fonction de ça.
Q2 Recherches (ctrl + f) la fonction “onBlockAdded” dans le classe BlockDoor, ce sera plus explicite que toute explication. Normalement il y l’orientation puis la pose du block au dessus dans cette fonction. -
Les TESR ajoutent juste une TileEntity, pas une entité à part entière comme un zombie. Ils sont donc moins lourd, en revanche tu as raison les TileEntity peuvent ralentir le jeu mais il faut en avoir une quantité astronomique pour voir une différence
-
Notre projet est de refaire le château de Versailles avec tout les bâtiments qui le compose ainsi que tout les jardins. Nous avons donc énormément de travail a faire et je te laisse imaginé la taille que ça va faire. Si tu veux un aperçu, tu peux aller sur la dynmap aux coordonnées -500 et -1050. Le rdc du château est en cours de construction. Donc malheureusement pour moi, il y aura une quantité astronomique de blocs sachant que nous allons aussi faire tout l’intérieure du château pièces par pièces. C’est pour cela que je préfère rester sur du Isbrh.
Parmi ceux qui m’ont répondu, vous ne savez donc pas comment on corrige le problème du bloc sombre ? Si quelqu’un d’autre le sait, hésitez pas à répondre
Q1 : est-ce bien ce code qu’il faut utiliser ?:::
public void onBlockAdded(World p_149726_1_, int p_149726_2_, int p_149726_3_, int p_149726_4_) { this.onNeighborBlockChange(p_149726_1_, p_149726_2_, p_149726_3_, p_149726_4_, Blocks.air); this.field_150149_b.onBlockAdded(p_149726_1_, p_149726_2_, p_149726_3_, p_149726_4_); }
:::
Q2 : est-ce bien ce code qu’il faut utiliser ?:::
public void func_150147_e(IBlockAccess p_150147_1_, int p_150147_2_, int p_150147_3_, int p_150147_4_) { int l = p_150147_1_.getBlockMetadata(p_150147_2_, p_150147_3_, p_150147_4_); if ((l & 4) != 0) { this.setBlockBounds(0.0F, 0.5F, 0.0F, 1.0F, 1.0F, 1.0F); } else { this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F); } }
:::
-
Q1) “field_150149_b” correspond à quoi ?
Q2) Je peux pas être sur (comme elle a un nom en func_……). Mais par contre il va falloir que tu la changes (tu set les BlocksBounds des dalles). -
Q1 : Je sais pas, j’ai simplement récupéré le code, j’ai rien modifié.
Q2 : Pareil que la Q1, j’ai juste récupéré le code.
-
Q1) Si tu as copié le code et si tu le colles dans ton block, tu as forcément ce field, sinon t’aurais une erreur.
Q2) Tu l’as pris où ? Dans la slab ? -
Q1 : Non car j’ai mis des // devant chaque lignes pour pas avoir d’erreurs pour le moment. Comme ça vient du code minecraft, je ne sais pas a quoi ça correspond. D’ailleurs, les p_149726_1_ ect correspondent a quoi la ? Les metadata ?
PS : ce code est pris dans la class des escaliers (BlockStairs, ligne 483).
Q2 : J’ai pris dans ce code dans la class des escaliers aussi (BlockStairs, ligne 85)
-
public void onBlockAdded(World world, int x, int y, int z)
public void func_150147_e(IBlockAccess world, int x, int y, int z)
-
Merci Scarex. A quoi correspond la fonction “func_150147_e” stp ?
-
On peut pas savoir (je pense que ça doit-être onNeightborBlockChange()), essaye de mettre à jour tes mappings (ce qui convertit ces trucs incomprehenssibles en trucs lisibles), regarde le tuto pour installer les sources, c’est expliqué.
Pour savoir à quoi correspond le “this.field……”, retournes où tu l’as trouvé et fais ctrl + clic dessus. -
Ok merci je verrais ça plus tard du coup. Sinon, personnes ne sait pour mon problème principal ? [size=smallJ’ai mis le code ci-dessous dans la class du bloc et j’ai aussi essayer après dans la class du rendu du bloc mais cela ne change rien.]
@SideOnly(Side.CLIENT) public float getAmbientOcclusionLightValue() { return 1.0F; }
-
Essaye de changer la valeur, voir ce que ça fait
-
Déjà fait aussi.
Ça rend le bloc plus lumineux mais le problème est toujours la. De plus, les 3 autres côté sont encore plus lumineux qu’avant (et ça rend super moche car on vois très très mal les rendu).
-
J’ai pas le code en face de moi, mais dans le code des dalles (et/ou escaliers), dans leur constructeur, il me semble qui y a un this.setje sais plus quoi en rapport avec ça, je te dis ça ce soir si ta pas trouvé
-
Il y a bien “this.setLightOpacity(255);” mais je viens de testé et ça fait rien.