Résolu Block "Trappe"
-
Salut,
Après le marteau, j’aimerai aussi créer un bloc “trappe” qui “s’ouvre” quand on fait click droit. J’ai créé ceci :
package com.mod.androria.blocks; import com.mod.androria.Reference; import com.trcgames.dbSynchronizer.DatabaseGetter; import com.trcgames.dbSynchronizer.database.DBFolder; import com.trcgames.dbSynchronizer.database.Database; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.world.World; public class Tappe extends Block { public Tappe(Material mat) { super(mat); setHardness(2.0F); setResistance(5.0F); setBlockTextureName(Reference.MOD_ID + ":trappe"); // TODO Auto-generated constructor stub } @Override public boolean isOpaqueCube() { return false; } @SideOnly(Side.CLIENT) public int getRenderBlockPass() { return 0; } /** * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) */ public boolean renderAsNormalBlock() { return false; } public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer p_149727_5_, int p_149727_6_, float p_149727_7_, float p_149727_8_, float p_149727_9_) { if(!world.isRemote) { if(this.getBlockBoundsMinX() == 0.1F) { setBlockTextureName(Reference.MOD_ID + ":trappe"); this.setBlockBounds(0F, 0F, 0F, 1F, 1F, 1F); } else { setBlockTextureName(Reference.MOD_ID + ":Invisible_Block"); this.setBlockBounds(0.1F, 0.1F, 0.1F, 0.2F, 0.2F, 0.2F); } } return true; } }
Cependant, j’ai deux problèmes :
- La texture ne se met à jour que si il y a une update (quand on casse un bloc à coté)
- Quand on faire click droit sur un bloc pour réduire sa boite de collision pour passer, tous les autres bloc voient leur boite de collision réduite
Merci beaucoup d’avance !
-
Salut,
Il faudrait plutôt un bloc avec deux metadatas, un metadata pour l’état ouvert et l’autre pour l’état fermé.
Et ensuite dans ta fonction onBlockActivated change le metadata (avec un world.setBlock(x, y, z, this, metadata, 3) ; ) -
Je vais essayer
Edit :
Mon code :public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer p_149727_5_, int p_149727_6_, float p_149727_7_, float p_149727_8_, float p_149727_9_) { if(this.getDamageValue(world, x, y, z) == 1) { world.setBlock(x, y, z, this, 0, 3); setBlockBounds(0F, 0F, 0F, 1F, 1F, 1F); } else { world.setBlock(x, y, z, this, 1, 3); setBlockBounds(0.1F, 0F, 0.1F, 0.2F, 0.1F, 0.1F); } return true; }
Les métadatas fonctionne mais dès que je trouche au BlockBounds c’est tous les blocs qui sont modifiés et pas que celui où j’ai fait click droit
-
setBlockBounds ne permet pas de définir en fonction du metadata et s’applique sur l’instance du bloc qui est partagé entre tous les blocs.
Tu devrais plutôt override la fonction getCollision (ou que chose comme ça) qui a world, x, y et z en argument, ce qui te permettra de retourner une collision différente en fonction de world.getMetadata(x, y, z).
-
Y a que ces trois fonctions dans la classe Block :
- addCollisionBoxesToList
- getCollisionBoundingBoxFromPool
- collisionRayTrace
EDIT :
J’ai fait ça :public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { if(world.getBlockMetadata(x, y, z) == 1) { return AxisAlignedBB.getBoundingBox(0.1, 0, 0.1, 0.2, 0.2, 0.2); } else { return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 1, 1); } }
Mais quelque sois le metadata, je peux traverser le bloc
EDIT² : Je viens de me rendre compte avec un System.out.println que la fonction n’est jamais appelé
-
Alors ça veut dire que tu as mal renseigné ses paramètres.
Esssayes de mettre un @Override dessus, si ça te met une erreur, supprimes celle là, commence à écrire son nom, fais ctrl+space et eclipse te la proposera. -
Le @Override ne me signale pas d’erreur
Et même avec, toujours aucune collisions avec le bloc -
extends juste BlockTrapdor non ?
-
Tu as mis ton sysout où ? Bien au tout début de la fonction avant le if ?
-
@Yanis : Faudrait que je m’intéresse à cette classe
@Aymeric : OuiEDIT : MERCI ! Regarder la classe BlockTrapDoor m’a permis de faire mon truc !
Voici le code pour changer la boite de collision en fonction de la métadata :public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { this.setBlockBoundsBasedOnState(world, x, y, z); return super.getCollisionBoundingBoxFromPool(world, x, y, z); } public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { this.setBounds(world.getBlockMetadata(x, y, z)); } public void setBounds(int metadata) { if (metadata == 1) { this.setBlockBounds(0.1F, 0.0F, 0.1F, 0.2F,0.2F, 0.2F); } else { this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); } }