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.
    • 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