MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    Problème onBlockDestroyed

    Planifier Épinglé Verrouillé Déplacé Résolu 1.7.x
    1.7.10
    19 Messages 5 Publieurs 4.6k Vues 1 Watching
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • SCAREXS Hors-ligne
      SCAREX
      dernière édition par

      @‘20cents34’:

      Bonjour, je suis actuellement en train de faire une hache pouvant détruire le bois d’un arbre entier et j’ai réussi à faire disparaître le bois à la verticale, le remplacer par de l’air et faire apparaître l’ItemStack correspondant mais je n’arrive pas à faire la même chose à l’horizontale.

      Classe de l’item :

      package net.mobject.common.item.tool;
      
      import net.minecraft.block.Block;
      import net.minecraft.entity.Entity;
      import net.minecraft.entity.EntityLivingBase;
      import net.minecraft.entity.item.EntityItem;
      import net.minecraft.init.Blocks;
      import net.minecraft.init.Items;
      import net.minecraft.item.ItemAxe;
      import net.minecraft.item.ItemStack;
      import net.minecraft.world.World;
      import net.mobject.common.entity.EntityVoleur;
      
      public class ItemGemmeAxe extends ItemAxe
      {
      public ItemGemmeAxe(ToolMaterial p_i45327_1_) {
      super(p_i45327_1_);
      
      }
      
      public boolean getIsRepairable(ItemStack input, ItemStack repair)
      {
      if(repair.getItem() == Items.diamond)
      {
      return true;
      }
      return false;
      }
      
      public boolean hasEffect(ItemStack stack){
      
      return true;
      
      }
      public boolean onBlockDestroyed(ItemStack stack, World world, Block block, int x, int y, int z, EntityLivingBase living){
      
      for(int i = y; i < 256; i++)
      {
      int m = world.getBlockMetadata(x, y, y);
      System.out.println(m);
      if(world.getBlock(x, i, z).isWood(world, x, y, z)){
      
      float f = 0.7F;
      
      double d0 = (double)(world.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D;
      double d1 = (double)(world.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D;
      double d2 = (double)(world.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D;
      EntityItem entityitem = new EntityItem(world, (double)x + d0, (double)i + d1, (double)z + d2, new ItemStack(world.getBlock(x, i, z), 1,m));
      world.spawnEntityInWorld(entityitem);
      world.setBlockToAir(x, i, z);
      }
      
      else
      {
      System.out.println("blabla");
      return super.onBlockDestroyed(stack, world, block, x, i, z, living);
      }
      }
      
      for(int j = x; j < 25000 || j == 250000 || j > 250000 ; j++)
      
      {
      if(world.getBlock(j, y, z).isWood(world, x, y, z)){
      
      float f = 0.7F;
      double d0 = (double)(world.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D;
      double d1 = (double)(world.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D;
      double d2 = (double)(world.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D;
      EntityItem entityitem = new EntityItem(world, (double)j + d0, (double)y + d1, (double)z + d2, new ItemStack(world.getBlock(x, y, z), 1, world.getBlockMetadata(j, y, y)));
      
      world.
      world.spawnEntityInWorld(entityitem);
      System.out.println("blabla");
      world.setBlockToAir(j, y, z);
      }
      
      else
      {
      return super.onBlockDestroyed(stack, world, block, j, y, z, living);
      }
      }
      return super.onBlockDestroyed(stack, world, block, x, y, z, living);
      
      }
      
      }
      

      Merci d’avance  🙂

      Ton code est très étrange, premièrement : ta première boucle va continuer jusqu’à 256 ce qui veut dire que si tu as un bloc de bois à la hauteur 255, il sera aussi cassé alors qu’il n’y a que de l’air entre le block cassé et ce morceau de bois en y = 255. Tu devrais utiliser une boucle do {} while ();, il me semble que robin avait fait un tutoriel pour faire ça dans sa vidéo sur créer des outils, jettes y un coup d’œil.

      Ensuite, ta deuxième boucle est une boucle infinie ce qui n’est vraiment pas à faire. Et pour finir, change cette condition :

      
      if(world.getBlock(j, y, z).isWood(world, x, y, z)){}
      
      

      en :

      
      if(world.getBlock(j, y, z).isWood(world, j, y, z)){}
      
      

      Site web contenant mes scripts : http://SCAREXgaming.github.io

      Pas de demandes de support par MP ni par skype SVP.
      Je n'accepte sur skype que l…

      1 réponse Dernière réponse Répondre Citer 0
      • 2 Hors-ligne
        20cents34
        dernière édition par

        J’ai regardé le code de robin et il est similaire au miens. Pour la boucles allant jusqu’à 256 j’ai changer la valeur en 25 c’est plus précis mais mon problème est que je n’arrive pas à faire la même chose à l’horizontal. Je sais qu’il faut modifier la boucles for mais en quoi ?

        1 réponse Dernière réponse Répondre Citer 0
        • isadorI Hors-ligne
          isador Moddeurs confirmés Modérateurs
          dernière édition par

          bha au lieu d’incrémenter les y tu incrémente les x

          1 réponse Dernière réponse Répondre Citer 0
          • 2 Hors-ligne
            20cents34
            dernière édition par

            Ouai mais les y ont une valeur max de 256 et ne peuvent pas aller dans les négatifs alors que les x eux ont des valeurs plus grandes donc je ne sais pas quoi mettre pour que le jeu “test” les blocs autours sans faire une boucles infini

            1 réponse Dernière réponse Répondre Citer 0
            • robin4002R Hors-ligne
              robin4002 Moddeurs confirmés Rédacteurs Administrateurs
              dernière édition par

              @‘SCAREX’:

              Ton code est très étrange, premièrement : ta première boucle va continuer jusqu’à 256 ce qui veut dire que si tu as un bloc de bois à la hauteur 255, il sera aussi cassé alors qu’il n’y a que de l’air entre le block cassé et ce morceau de bois en y = 255. Tu devrais utiliser une boucle do {} while ();, il me semble que robin avait fait un tutoriel pour faire ça dans sa vidéo sur créer des outils, jettes y un coup d’œil.

              Non. Regarde le else, une fois qu’il n’y a plus de bois au dessus il sort de la fonction. Donc non, il ne cassera pas le bloc de bois qui se trouve en y=255 si il n’y en a pas en dessous.

              Si tu veux casser les blocs de bois sur toutes les directions il faut partir sur quelques choses de complètement différent, celui-ci n’est pas adapté pour.

                 public boolean onBlockDestroyed(ItemStack stack, World world, Block block, int x, int y, int z, EntityLivingBase living)
                 {
                     if(block.isWood(world, x, y, z))
                     {
                         this.cutWood(world, x, y, z, living.getEquipmentInSlot(0), living);
                     }
              return true;
              
                 }
              
                 public boolean cutWood(World world, int x, int y, int z, ItemStack stack, EntityLivingBase living)
                 {
                     boolean flagxPos = false, flagxNeg = false, flagzPos = false, flagzNeg = false, flagyPos = false, flagyNeg = false;
              
                     if(world.getBlock(x + 1, y, z).isWood(world, x + 1, y, z))
                     {
                         Block b = world.getBlock(x + 1, y, z);
                         int meta = b.damageDropped(world.getBlockMetadata(x + 1, y, z));
                         world.setBlockToAir(x + 1, y, z);
                         this.dropBlockAsItem(world, x + 1, y, z, new ItemStack(Item.getItemFromBlock(b), 1, meta));
                         stack.damageItem(1, living);
                         flagxPos = cutWood(world, x + 1, y, z, stack, living);
                     }
                     else
                     {
                         flagxPos = true;
                     }
              
                     if(world.getBlock(x - 1, y, z).isWood(world, x - 1, y, z))
                     {
                         Block b = world.getBlock(x - 1, y, z);
                         int meta = b.damageDropped(world.getBlockMetadata(x - 1, y, z));
                         world.setBlockToAir(x - 1, y, z);
                         this.dropBlockAsItem(world, x - 1, y, z, new ItemStack(Item.getItemFromBlock(b), 1, meta));
                         stack.damageItem(1, living);
                         flagxNeg = cutWood(world, x - 1, y, z, stack, living);
                     }
                     else
                     {
                         flagxNeg = true;
                     }
              
                     if(world.getBlock(x, y, z + 1).isWood(world, x, y, z + 1))
                     {
                         Block b = world.getBlock(x, y, z + 1);
                         int meta = b.damageDropped(world.getBlockMetadata(x, y, z + 1));
                         world.setBlockToAir(x, y, z + 1);
                         this.dropBlockAsItem(world, x, y, z + 1, new ItemStack(Item.getItemFromBlock(b), 1, meta));
                         stack.damageItem(1, living);
                         flagzPos = cutWood(world, x, y, z + 1, stack, living);
                     }
                     else
                     {
                         flagzPos = true;
                     }
              
                     if(world.getBlock(x, y, z - 1).isWood(world, x, y, z - 1))
                     {
                         Block b = world.getBlock(x, y, z - 1);
                         int meta = b.damageDropped(world.getBlockMetadata(x, y, z - 1));
                         world.setBlockToAir(x, y, z - 1);
                         this.dropBlockAsItem(world, x, y, z - 1, new ItemStack(Item.getItemFromBlock(b), 1, meta));
                         stack.damageItem(1, living);
                         flagzNeg = cutWood(world, x, y, z - 1, stack, living);
                     }
                     else
                     {
                         flagzNeg = true;
                     }
              
                     if(world.getBlock(x, y + 1, z).isWood(world, x, y + 1, z))
                     {
                         Block b = world.getBlock(x, y + 1, z);
                         int meta = b.damageDropped(world.getBlockMetadata(x, y + 1, z));
                         world.setBlockToAir(x, y + 1, z);
                         this.dropBlockAsItem(world, x, y + 1, z, new ItemStack(Item.getItemFromBlock(b), 1, meta));
                         stack.damageItem(1, living);
                         flagyPos = cutWood(world, x, y + 1, z, stack, living);
                     }
                     else
                     {
                         flagyPos = true;
                     }
              
                     if(world.getBlock(x, y - 1, z).isWood(world, x, y - 1, z))
                     {
                         Block b = world.getBlock(x, y - 1, z);
                         int meta = b.damageDropped(world.getBlockMetadata(x, y - 1, z));
                         world.setBlockToAir(x, y - 1, z);
                         this.dropBlockAsItem(world, x, y - 1, z, new ItemStack(Item.getItemFromBlock(b), 1, meta));
                         stack.damageItem(1, living);
                         flagyNeg = cutWood(world, x, y - 1, z, stack, living);
                     }
                     else
                     {
                         flagyNeg = true;
                     }
                     return flagxPos && flagxNeg && flagzPos && flagzNeg && flagyPos && flagyNeg;
                 }
              

              (code de @kevin_68)

              1 réponse Dernière réponse Répondre Citer 0
              • SCAREXS Hors-ligne
                SCAREX
                dernière édition par

                J’ai supposé que ce que tu voulais faire c’était créer une hache qui détruit tous les blocs autour du bloc détruit, voici ce à quoi je suis arrivé :

                
                public class SuperAxe extends ItemAxe
                {
                private static final String name = "superAxe";
                
                protected SuperAxe() {
                super(ToolMaterial.EMERALD);
                GameRegistry.registerItem(this, name);
                setUnlocalizedName(ST18.MODID + "_" + name);
                setCreativeTab(CreativeTabs.tabTools);
                }
                
                public static String getName() {
                return name;
                }
                
                @Override
                public boolean onBlockDestroyed(ItemStack stack, World worldIn, Block blockIn, BlockPos pos, EntityLivingBase playerIn) {
                if (!worldIn.isRemote && playerIn instanceof EntityPlayer) {
                worldIn.destroyBlock(pos, true);
                destroyNearWood(worldIn, pos, stack, playerIn, stack.getMaxDamage() - stack.getItemDamage());
                stack.damageItem(1, playerIn);
                if (stack.stackSize <= 0 || stack.getItemDamage() >= stack.getMaxDamage()) ((EntityPlayer) playerIn).destroyCurrentEquippedItem();
                }
                return true;
                }
                
                public int destroyNearWood(World world, BlockPos pos, ItemStack stack, EntityLivingBase player, int maxBlocks) {
                if (world.getBlockState(pos.up()).getBlock().isWood(world, pos.up())) {
                if (–maxBlocks > 0) {
                world.destroyBlock(pos.up(), true);
                stack.damageItem(1, player);
                maxBlocks = destroyNearWood(world, pos.up(), stack, player, maxBlocks);
                }
                }
                if (world.getBlockState(pos.down()).getBlock().isWood(world, pos.down())) {
                if (--maxBlocks > 0) {
                world.destroyBlock(pos.down(), true);
                stack.damageItem(1, player);
                maxBlocks = destroyNearWood(world, pos.down(), stack, player, maxBlocks);
                }
                }
                if (world.getBlockState(pos.east()).getBlock().isWood(world, pos.east())) {
                if (--maxBlocks > 0) {
                world.destroyBlock(pos.east(), true);
                stack.damageItem(1, player);
                maxBlocks = destroyNearWood(world, pos.east(), stack, player, maxBlocks);
                }
                }
                if (world.getBlockState(pos.west()).getBlock().isWood(world, pos.west())) {
                if (--maxBlocks > 0) {
                world.destroyBlock(pos.west(), true);
                stack.damageItem(1, player);
                maxBlocks = destroyNearWood(world, pos.west(), stack, player, maxBlocks);
                }
                }
                if (world.getBlockState(pos.north()).getBlock().isWood(world, pos.north())) {
                if (--maxBlocks > 0) {
                world.destroyBlock(pos.north(), true);
                stack.damageItem(1, player);
                maxBlocks = destroyNearWood(world, pos.north(), stack, player, maxBlocks);
                }
                }
                if (world.getBlockState(pos.south()).getBlock().isWood(world, pos.south())) {
                if (--maxBlocks > 0) {
                world.destroyBlock(pos.south(), true);
                stack.damageItem(1, player);
                maxBlocks = destroyNearWood(world, pos.south(), stack, player, maxBlocks);
                }
                }
                return maxBlocks;
                }
                }
                
                

                NOTE : ce code est pour la 1.8 mais si tu es en 1.7 tu pourras tout de même l’utiliser en changeant quelques valeus.

                Site web contenant mes scripts : http://SCAREXgaming.github.io

                Pas de demandes de support par MP ni par skype SVP.
                Je n'accepte sur skype que l…

                1 réponse Dernière réponse Répondre Citer 0
                • 2 Hors-ligne
                  20cents34
                  dernière édition par

                  Merci, tu supposais bien c’était mon intention 🙂 Sinon l’équivalent de BlockPos en 1.7.10 est x,y,z mais je vois pas trop comment faire pour adapter ton code . Surtout les fonctions pos.south() etc… A moins que pos.up() ) soit égale à y+1 , pos.down() à y -1 mais alors je vois pas se que peut représenter pos.north() et pos.south(). Bref si tu as une idée donne la moi sinon je mettrais mon mod à jour. Et encore merci pour le code.

                  1 réponse Dernière réponse Répondre Citer 0
                  • robin4002R Hors-ligne
                    robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                    dernière édition par

                    up -> y + 1
                    down -> y - 1
                    south -> x + 1
                    north -> x - 1
                    est -> z + 1
                    west -> z - 1
                    (de tête, pas sûr).

                    1 réponse Dernière réponse Répondre Citer 0
                    • 2 Hors-ligne
                      20cents34
                      dernière édition par

                      J’ai essayé le code de Robin4002 mais j’ai une erreur sur

                      this.dropBlockAsItem(world, x, y - 1, z, new ItemStack(Item.getItemFromBlock(b), 1, meta));
                      

                      Eclipse me dis que dropBlockAsItem est indéfinie pour ma classe.
                      Et Eclipse ne trouve pas non plus player ici

                      this.cutWood(world, x, y, z, player.inventory.getCurrentItem(), player);
                      
                      
                      1 réponse Dernière réponse Répondre Citer 0
                      • robin4002R Hors-ligne
                        robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                        dernière édition par

                        ​
                        private void dropBlockAsItem(World world, int x, int y, int z, ItemStack stack)
                        {
                        if(!world.isRemote && world.getGameRules().getGameRuleBooleanValue("doTileDrops"))
                        {
                        float f = 0.7F;
                        double d0 = world.rand.nextFloat() * f + (1.0F - f) * 0.5D;
                        double d1 = world.rand.nextFloat() * f + (1.0F - f) * 0.5D;
                        double d2 = world.rand.nextFloat() * f + (1.0F - f) * 0.5D;
                        EntityItem entityitem = new EntityItem(world, x + d0, y + d1, z + d2, stack);
                        entityitem.delayBeforeCanPickup = 10;
                        world.spawnEntityInWorld(entityitem);
                        }
                        }
                        

                        Il manquant cette fonction.

                        1 réponse Dernière réponse Répondre Citer 0
                        • 2 Hors-ligne
                          20cents34
                          dernière édition par

                          Merci mais j’ai toujours le problème du player. En gros il me le trouve pas et me propose de créer une variable.

                          1 réponse Dernière réponse Répondre Citer 0
                          • DeletedD Hors-ligne
                            Deleted
                            dernière édition par

                            Ajoutes cette variable dans ta méthode
                            EntityPlayer entityplayer = (EntityPlayer)player;

                            1 réponse Dernière réponse Répondre Citer 0
                            • 2 Hors-ligne
                              20cents34
                              dernière édition par

                              J’ai une erreur sur le cast : (EntityPlayer)player et onBlockDestroyed me demande un return non présent dans le code de robin4002.

                              1 réponse Dernière réponse Répondre Citer 0
                              • SCAREXS Hors-ligne
                                SCAREX
                                dernière édition par

                                @‘20cents34’:

                                Merci, tu supposais bien c’était mon intention 🙂 Sinon l’équivalent de BlockPos en 1.7.10 est x,y,z mais je vois pas trop comment faire pour adapter ton code . Surtout les fonctions pos.south() etc… A moins que pos.up() ) soit égale à y+1 , pos.down() à y -1 mais alors je vois pas se que peut représenter pos.north() et pos.south(). Bref si tu as une idée donne la moi sinon je mettrais mon mod à jour. Et encore merci pour le code.

                                BlockPos est une classe qui existait déjà avant la 1.8, il te suffit donc de faire BlockPos pos = new BlockPos(x,y,z); et le reste sera adapté, dont le pos.south() etc.

                                Site web contenant mes scripts : http://SCAREXgaming.github.io

                                Pas de demandes de support par MP ni par skype SVP.
                                Je n'accepte sur skype que l…

                                1 réponse Dernière réponse Répondre Citer 0
                                • 2 Hors-ligne
                                  20cents34
                                  dernière édition par

                                  Euh non eclipse le trouve nul part et je suis en 1.7.10

                                  1 réponse Dernière réponse Répondre Citer 0
                                  • robin4002R Hors-ligne
                                    robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                                    dernière édition par

                                    @‘20cents34’:

                                    J’ai une erreur sur le cast :  (EntityPlayer)player et onBlockDestroyed me demande un return non présent dans le code de robin4002.

                                    C’est de ma faute, j’ai édité mon message, maintenant ça devrait être bon.

                                    @‘SCAREX’:

                                    BlockPos est une classe qui existait déjà avant la 1.8, il te suffit donc de faire BlockPos pos = new BlockPos(x,y,z); et le reste sera adapté, dont le pos.south() etc.

                                    Non, elle n’existe pas en 1.7.10

                                    1 réponse Dernière réponse Répondre Citer 0
                                    • SCAREXS Hors-ligne
                                      SCAREX
                                      dernière édition par

                                      @‘robin4002’:

                                      @‘20cents34’:

                                      J’ai une erreur sur le cast :  (EntityPlayer)player et onBlockDestroyed me demande un return non présent dans le code de robin4002.

                                      C’est de ma faute, j’ai édité mon message, maintenant ça devrait être bon.

                                      @‘SCAREX’:

                                      BlockPos est une classe qui existait déjà avant la 1.8, il te suffit donc de faire BlockPos pos = new BlockPos(x,y,z); et le reste sera adapté, dont le pos.south() etc.

                                      Non, elle n’existe pas en 1.7.10

                                      Effectivement mais le principe est le même que ce que robin disait, tu fait x + 1 (east) puis x - 1 (west) puis z + 1 (south) puis z - 1 (north) puis y + 1 (up) (puis y - 1 (down) si tu veux aller vers le bas)

                                      Je peux vite fait adapter le code si tu veux pour la 1.7 ?

                                      Site web contenant mes scripts : http://SCAREXgaming.github.io

                                      Pas de demandes de support par MP ni par skype SVP.
                                      Je n'accepte sur skype que l…

                                      1 réponse Dernière réponse Répondre Citer 0
                                      • 2 Hors-ligne
                                        20cents34
                                        dernière édition par

                                        Merci a tous et surtout à robin4002 ça marche parfaitement maintenant  🙂

                                        Ça ira merci SCAREX j’utiliserai ton code quand je passerai en 1.8.

                                        1 réponse Dernière réponse Répondre Citer 0
                                        • 1 / 1
                                        • Premier message
                                          Dernier message
                                        Design by Woryk
                                        ContactMentions Légales

                                        MINECRAFT FORGE FRANCE © 2024

                                        Powered by NodeBB