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