Activation de bloc + permission commande op



  • ​package fr.altiscraft.altiscraft.common;
    
    import cpw.mods.fml.relauncher.Side;
    import cpw.mods.fml.relauncher.SideOnly;
    import fr.altiscraft.altiscraft.proxy.ClientProxy;
    import net.minecraft.block.Block;
    import net.minecraft.block.material.Material;
    import net.minecraft.entity.EntityLivingBase;
    import net.minecraft.item.ItemStack;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.util.MathHelper;
    import net.minecraft.world.World;
    import net.minecraftforge.common.util.ForgeDirection;
    
    public class BlocBarriereFerme extends Block {
    protected BlocBarriereFerme() {
    super(Material.ground);
    }
    
    public boolean hasTileEntity(int metadata) {
    return true;
    }
    
    public TileEntity createTileEntity(World world, int metadata) {
    return new TileEntityBarriereFerme();
    }
    
    public boolean isOpaqueCube() {
    return false;
    }
    
    public boolean renderAsNormalBlock() {
    return false;
    }
    
    public boolean onBlockActivated(World world, int i, int j, int k, int l) {
    return world.setBlock(i, j, k, ModAltisCraft.BlocBarriereOuverte, 0, 2);
    }
    
    @SideOnly(Side.CLIENT)
    public int getRenderType() {
    return ClientProxy.tesrRenderId;
    }
    
    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase living, ItemStack stack) {
    if (stack.getItemDamage() == 0) {
    TileEntity tile = world.getTileEntity(x, y, z);
    if ((tile instanceof TileEntityBarriereFerme)) {
    int direction = MathHelper.floor_double(living.rotationYaw * 4.0F / 360.0F + 2.5D) & 0x3;
    ((TileEntityBarriereFerme) tile).setDirection((byte) direction);
    }
    }
    }
    
    public boolean rotateBlock(World world, int x, int y, int z, ForgeDirection axis) {
    if (((axis == ForgeDirection.UP) || (axis == ForgeDirection.DOWN)) && (!world.isRemote)
    && (world.getBlockMetadata(x, y, z) == 0)) {
    TileEntity tile = world.getTileEntity(x, y, z);
    if ((tile instanceof TileEntityBarriereFerme)) {
    TileEntityBarriereFerme tileBarriere = (TileEntityBarriereFerme) tile;
    byte direction = tileBarriere.getDirection();
    direction = (byte) (direction + 1);
    if (direction > 3) {
    direction = 0;
    }
    tileBarriere.setDirection(direction);
    return true;
    }
    }
    return false;
    }
    
    public ForgeDirection[] getValidRotations(World world, int x, int y, int z) {
    return world.getBlockMetadata(x, y, z) == 0 ? new ForgeDirection[] { ForgeDirection.UP, ForgeDirection.DOWN }
    : ForgeDirection.VALID_DIRECTIONS;
    }
    }
    

    Mais même avec le onBlockActivated lorsque je clique droit le bloc ne se change pas en autre bloc et comment faire éxécuter au joueur une commande avec la permission d'op ?


  • Administrateurs

    @'Benjamin:

    1. Mais même avec le onBlockActivated lorsque je clique droit le bloc ne se change pas en autre bloc
    2. et comment faire éxécuter au joueur une commande avec la permission d'op ?
    1. car la bonne méthode c'est :
    public boolean onBlockActivated(World world, int i, int j, int k, int l, float hitX, float hitY, float hitZ) {
    return world.setBlock(i, j, k, ModAltisCraft.BlocBarriereOuverte, 0, 2);
    }
    
    1. ça dépend de la commande

    Par contre attention avec sur nombre demande d'aide, tu es en train d’abuser …



  • Voici ma nouvelle classe :

    ​package fr.altiscraft.altiscraft.common;
    
    import cpw.mods.fml.relauncher.Side;
    import cpw.mods.fml.relauncher.SideOnly;
    import fr.altiscraft.altiscraft.proxy.ClientProxy;
    import net.minecraft.block.Block;
    import net.minecraft.block.material.Material;
    import net.minecraft.entity.EntityLivingBase;
    import net.minecraft.item.ItemStack;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.util.MathHelper;
    import net.minecraft.world.World;
    import net.minecraftforge.common.util.ForgeDirection;
    
    public class BlocBarriereFerme extends Block {
    protected BlocBarriereFerme() {
    super(Material.ground);
    }
    
    public boolean hasTileEntity(int metadata) {
    return true;
    }
    
    public TileEntity createTileEntity(World world, int metadata) {
    return new TileEntityBarriereFerme();
    }
    
    public boolean isOpaqueCube() {
    return false;
    }
    
    public boolean renderAsNormalBlock() {
    return false;
    }
    
    public boolean onBlockActivated(World world, int i, int j, int k, int l, float hitX, float hitY, float hitZ) {
    return world.setBlock(i, j, k, ModAltisCraft.BlocBarriereOuverte, 0, 2);
    }
    
    @SideOnly(Side.CLIENT)
    public int getRenderType() {
    return ClientProxy.tesrRenderId;
    }
    
    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase living, ItemStack stack) {
    if (stack.getItemDamage() == 0) {
    TileEntity tile = world.getTileEntity(x, y, z);
    if ((tile instanceof TileEntityBarriereFerme)) {
    int direction = MathHelper.floor_double(living.rotationYaw * 4.0F / 360.0F + 2.5D) & 0x3;
    ((TileEntityBarriereFerme) tile).setDirection((byte) direction);
    }
    }
    }
    
    public boolean rotateBlock(World world, int x, int y, int z, ForgeDirection axis) {
    if (((axis == ForgeDirection.UP) || (axis == ForgeDirection.DOWN)) && (!world.isRemote)
    && (world.getBlockMetadata(x, y, z) == 0)) {
    TileEntity tile = world.getTileEntity(x, y, z);
    if ((tile instanceof TileEntityBarriereFerme)) {
    TileEntityBarriereFerme tileBarriere = (TileEntityBarriereFerme) tile;
    byte direction = tileBarriere.getDirection();
    direction = (byte) (direction + 1);
    if (direction > 3) {
    direction = 0;
    }
    tileBarriere.setDirection(direction);
    return true;
    }
    }
    return false;
    }
    
    public ForgeDirection[] getValidRotations(World world, int x, int y, int z) {
    return world.getBlockMetadata(x, y, z) == 0 ? new ForgeDirection[] { ForgeDirection.UP, ForgeDirection.DOWN }
    : ForgeDirection.VALID_DIRECTIONS;
    }
    }
    

    Mais toujours aucun changement lorsque je clique droit dessus strictement rien ne se passe…

    Et pour la commande en faite je voudrais faire un GUI avec deux boutons un qui redirige vers l'enderchest (et j'avais donc pensé à l'utilisation de la commande en op de /enderchest mais je viens de remarquer qu'on peut faire autrement du coup une fonction à me donner pour l'ouverture de l'enderchest ?) et un qui fait une commande joueur normal que je sais faire.

    Et désolé de vous demandez beaucoup de choses mais maintenant je me sens plus à l'aise dans le java grace à vous encore merci et je vais me calmer sur les sujets désolé...


  • Administrateurs

    ah autant pour moi, il manque encore l'argument EntityPlayer player.
    Le plus simple c'est de regarder dans la classe Block.java pour avoir les arguments exacts. Tu peux aussi mettre l'annotation @Override au dessus de la méthode, Eclipse mettra une erreur si la méthode n'existe pas dans la classe mère.

    Pour l'ouverture de l'enderchest en effet pas besoin de passer par une commande qui vient d'un plugin en plus (vive le gros bordel) tu peux utiliser directement player.displayEnderChest() ou un truc du genre.



  • Balise résolu ?



  • Non pas encore même pour mes autres posts… Et après on touche à ma réputation...



  • C'est bon j'ai réussi :

    ​    public boolean onBlockActivated(World world, int i, int j, int k, EntityPlayer p_149727_5_, int p_149727_6_, float p_149727_7_, float p_149727_8_, float p_149727_9_)
        {
        return world.setBlock(i, j, k, ModAltisCraft.BlocBarriereFerme, 0, 2);
        }
    

    mais j'aimerais faire qu'un autre bloc se mette 2 bloc en dessous de celui-ci et sinon j'aimerais faire que le setBlock respecte la direction du bloc initial comment faire ?


  • Administrateurs

    public boolean onBlockActivated(World world, int i, int j, int k, EntityPlayer p_149727_5_, int p_149727_6_, float p_149727_7_, float p_149727_8_, float p_149727_9_)
    {
    return world.setBlock(i, j, k, ModAltisCraft.BlocBarriereFerme, 0, 2);
    
    return world.setBlock(i, j - 2, k, ModAltisCraft.BlocBarriereFerme, 0, 2); // deuxième bloc
    }
    

    Et pour la direction ça dépend de si tu utilises le metadata ou un tile entity pour la direction.



  • TileEntity comment faire alors ? ps: Thanks pour ta réponse 😄

    EDIT : J'ai un autre problème lorsque je met ça :

    ​    public boolean onBlockActivated(World world, int i, int j, int k, EntityPlayer p_149727_5_, int p_149727_6_, float p_149727_7_, float p_149727_8_, float p_149727_9_)
        {
        return world.setBlock(i, j, k, ModAltisCraft.BlocBarriereFerme, 0, 2);
    
        return world.setBlock(i, j - 2, k, Blocks.air, 0, 2);
        }
    

    Eclipse me dit : Unreachable code :S et en le lançant ça veut mais quand je clique droit sur le bloc en jeu ça plante voici le crash-report : http://pastebin.com/4AE141i2



  • Apprends le java : tu as 2 "return".



  • Oui je sais c'est robin qui m'a dit de faire ça je me disais bien que j'avais lu que c'était pas possible mais bon peut-être que FML aurait changé pour que ça marche ^^ des idées sinon ?



  • FML ne peut pas changer la java…

    La méthode onBlockActivated te demande un booléen, si tu retourne true, il y aura une animation sur le bras du joueur et ce qui est dans la main du joueur de sera pas activé. Ton code plante car ton code ne peut pas être compilé, il faut mettre un seul return. Je te conseille personnellement de ne pas mettre le world.setBlock dans le block return.



  • Oui mais c'est ce que je désire de faire que deux setBlock soit éxécuté :S


  • Administrateurs

    public boolean onBlockActivated(World world, int i, int j, int k, EntityPlayer p_149727_5_, int p_149727_6_, float p_149727_7_, float p_149727_8_, float p_149727_9_)
    {
    world.setBlock(i, j, k, ModAltisCraft.BlocBarriereFerme, 0, 2);
    world.setBlock(i, j - 2, k, ModAltisCraft.BlocBarriereFerme, 0, 2); // deuxième bloc
    return true;
    }
    

    Une fois de plus je vais trop vite x)



  • Ok merci ça marche mais comment faire respecter comme c'est un TileEntity la direction ? et aussi dans le setBlock ? 😕



  • Les paramètres te donnent accès aux coordonnées de ton block, le joueur qui a cliqué, le côté cliqué ainsi que l'endroit précis avec des float. Je vois pas ce qu'il te manque, si ta direction est gérée avec les metadatas tu peux le récupérer en faisant world.getBlockMetadata(x,y,z). Si çà passe par la TileEntity, il faudra faire world.getTileEntity(x,y,z) et récupérer ta variable.



  • Mon bloc marche avec les TileEntity et je ne souhaite pas ça mais récupéré le sens de la barrière (ex: vers le nord) et pouvoir la mettre baissé toujours vers le nord 😕 mais je ne trouve vraiment pas…

    Et je ne comprends pas comment tu peux te servir de ça world.getTileEntity(x,y,z) pour résoudre mon problème :S


  • Administrateurs

    public boolean onBlockActivated(World world, int i, int j, int k, EntityPlayer p_149727_5_, int p_149727_6_, float p_149727_7_, float p_149727_8_, float p_149727_9_)
    {
    TileEntity tile = world.getTileEntity(i, j, k);
    if(tile instanceof TonTileEntity)
    {
    int direction = ((TonTileEntity)tile).getDirection();
    world.setBlock(i, j, k, ModAltisCraft.BlocBarriereFerme, 0, 2);
    TileEntity tile2 = world.getTileEntity(i, j, k);
    if(tile2 instanceof TonTileEntityAssociéAuBlockBlocBarriereFerme)
    {
    ((TonTileEntityAssociéAuBlockBlocBarriereFerme)tile2).setDirection(direction);
    }
    world.setBlock(i, j - 2, k, ModAltisCraft.BlocBarriereFerme, 0, 2); // deuxième bloc
    TileEntity tile3 = world.getTileEntity(i, j -2, k);
    if(tile3 instanceof TonTileEntityAssociéAuBlockBlocBarriereFerme)
    {
    ((TonTileEntityAssociéAuBlockBlocBarriereFerme)tile3).setDirection(direction);
    }
    }
    return true;
    }
    

    Franchement c'est pas compliqué …



  • 😕 mais maintenant j'ai plus dûr c'est que je veux qu'un setBlock soit en fonction de la direction et ça j'ai essayé pleins de trucs sans résulats :

    ​ public boolean onBlockActivated(World world, int i, int j, int k, EntityPlayer p_149727_5_, int p_149727_6_, float p_149727_7_, float p_149727_8_, float p_149727_9_)
        {
            TileEntity tile = world.getTileEntity(i, j, k);
            if(tile instanceof TileEntityBarriereOuverte)
            {
                byte direction = ((TileEntityBarriereOuverte)tile).getDirection();
           world.setBlock(i, j, k, ModAltisCraft.BlocBarriereFerme, 0, 2);
                TileEntity tile2 = world.getTileEntity(i, j, k);
                if(tile2 instanceof TileEntityBarriereFerme)
                {
                      ((TileEntityBarriereFerme)tile2).setDirection(direction);
                 world.setBlock(i, j + 1, k, ModAltisCraft.BlocI, 0, 2);
                }
           world.setBlock(i, j + 2, k, ModAltisCraft.BlocI, 0, 2);
           world.setBlock(i, j, k + 1, ModAltisCraft.BlocI, 0, 2);
            }
            return true;
        }
    

    J'aimerais faire que ce soit le dernier setBlock qui se mette toujours un bloc devant tout en restant dans l'axe du bloc 🙂
    Merci d'avance,


  • Administrateurs

    Dans ce cas en fonction de la direction tu dois le placer à un endroit différent.