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

      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