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