• S'inscrire
    • Se connecter
    • Recherche
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes

    Résolu Falling Block : condition

    1.8.x
    1.8
    2
    6
    1496
    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.
    • J
      Jodge dernière édition par

      Bonsoir, c’est (encore) moi  😄

      Plutôt que de me dégouter du modding avec mon problème toujours pas entièrement résolus sur l’interface, j’ai décidé de m’attaquer à une autre partie de mon arme : les attaque de zones.

      Pour cela, je me suis créer plusieurs classes (qui ne sont pas encore totalement optimisé, surtout sur les grosses zone) : Cliquez ici (GitHub)

      Jusque la ça allais. Puis arrive le premier problème. Dans ma classe : JScythe (GitHub), je créer un dôme creux, puis je remplace chaque position autorisé par un block de feu que j’ai créer.

      C’est la tous le problème.

      Pour créer ma classe Fire Block (GitHub), je créer une entends de la classe FallingBlock (GitHub). la classe FallingBlock (GitHub) ne me servant qu’a rajouter mes fonctions pour assisté la création de la texture/oreDictionnary, on peu considérer que Fire Block (GitHub) est une extension directe de de la classe Minecraft “BlockFalling”.

      Le problème est que justement, je veux rendre cette classe spécial. Tous d’abors, elle doit, lorsqu’elle touche le sol, se transformer en un object de la classe “Fire” de Minecraft.
      Celle partie est faite grâce à :

      public void onEndFalling(World worldIn, BlockPos pos)
      {
      worldIn.setBlockState(pos, Blocks.fire.getDefaultState());
      }
      

      La deuxième partie (la chute) est gerer par cette partie :

      public static boolean canFallInto(World worldIn, BlockPos pos)
      {
      boolean canFall = false;
      if (worldIn.isAirBlock(pos))
      {
      Block block = worldIn.getBlockState(pos).getBlock();
      Material material = block.getMaterial();
      
      if(material == Material.fire || material == Material.air)
      {
      canFall = true;
      }
      else
      {
      if(block instanceof BlockBush || block instanceof BlockStaticLiquid || block instanceof JFireBlock)
      {
      canFall = true;
      }
      }
      }
      
      return canFall;
      
      

      Les problèmes sont donc les suivants :

      - Si le block ne peu pas bouger dès sa création, alors il reste en l’état. Le problème est que “canFallInto” est une fonction statique, il n’est donc pas possible de faire appel a la fonction “onEndFalling”.

      • Ma condition pour vérifier si le bloc peu bouger (  if( (block instanceof BlockBush || block instanceof JFireBlock) && !(block instanceof BlockStaticLiquid) ) ) ne semble fonctionner qu’en partie. Les block instance de “Bush” sont correctement écrasé. En revanche, si il s’agit d’un block instance de lui même, il n’en a strictement rien a faire. De même, si il s’agit d’un block instance de liquide (eau/lave). Dans le premier cas, il considère qu’il ne peu pas bouger, et dans le second cas, il considère qu’il peu (alors que cela devrai être l’inverse).
      • Si mon bloque chute sur une torche, alors il réagit comme le sable/gravier : il deviens un block. Et ceux malgré le fait que la quantité dropé soit régler sur 0. De plus, je ne vois aucune portion du code qui gère ce cas… Du coup je ne sais pas comment l’en empêcher…

      Mici les gens pour votre aide passé, et futur je l’espère 😄

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

        Il me semble que le drop est directement géré dans la classe EntityFalling
        Pour ton autre problème, comme la fonction canFallInto est static tu ne peux pas l’override, c’est pour ça qu’elle n’a aucun effet.

        1 réponse Dernière réponse Répondre Citer 0
        • J
          Jodge dernière édition par

          Pour le drop, je verrai avec ton indication demain.

          Pour le canFallInto, je savais que le static empêcher de l’override, du coup j’ai copier/coller (et modifier aussi) la seul fonction qui utilisai “canFallInto”. Il me semblais que l’ordre de priorité faisais que ma fonction situer dans ma classe fasse appelle à la fonction situer dans sa propre classe. Malheureusement, il semblerai que cela ne fonctionne pas

          :::

          package fr.Jodge.jodgeLibrary.common.block;
          
          import java.util.Map;
          import java.util.Random;
          
          import com.google.common.collect.Maps;
          
          import fr.Jodge.jodgeLibrary.common.Main;
          import fr.Jodge.jodgeLibrary.common.function.JFunction;
          
          import net.minecraft.block.Block;
          import net.minecraft.block.BlockBush;
          import net.minecraft.block.BlockFalling;
          import net.minecraft.block.BlockFire;
          import net.minecraft.block.BlockStaticLiquid;
          import net.minecraft.block.material.MapColor;
          import net.minecraft.block.material.Material;
          import net.minecraft.block.state.IBlockState;
          import net.minecraft.entity.item.EntityFallingBlock;
          import net.minecraft.init.Blocks;
          import net.minecraft.util.AxisAlignedBB;
          import net.minecraft.util.BlockPos;
          import net.minecraft.util.EnumFacing;
          import net.minecraft.world.World;
          import net.minecraftforge.fml.common.registry.GameRegistry;
          import net.minecraftforge.oredict.OreDictionary;
          
          public class JFireBlock extends JFallingBlock
          {
          
          private String oreDictionnaryName;
          
          private final Map encouragements = Maps.newIdentityHashMap();
          private final Map flammabilities = Maps.newIdentityHashMap();
          
          public JFireBlock()
          {
          super(Material.fire, "Fall Fire", Main.MODID, "firefall");
          
          }
          
          public int tickRate(World worldIn)
          {
          return 30;
          }
          
          // – FALLING --- //
          public boolean canFallIntoBlock(World worldIn, BlockPos pos)
          {
          boolean canFall = false;
          if (worldIn.isAirBlock(pos))
          {
          Block block = worldIn.getBlockState(pos).getBlock();
          Material material = block.getMaterial();
          
          if(material == Material.fire || material == Material.air)
          {
          canFall = true;
          }
          else
          {
          if( (block instanceof BlockBush || block instanceof JFireBlock) && !(block instanceof BlockStaticLiquid) )
          {
          canFall = true;
          }
          }
          }
          
          return canFall;
          }
          
          public void updateTick(World worldIn, BlockPos pos, IBlockState state, Random rand)
          {
          if (!worldIn.isRemote)
          {
          this.checkFallable(worldIn, pos);
          }
          }
          
          private void checkFallable(World worldIn, BlockPos pos)
          {
          if (canFallIntoBlock(worldIn, pos.down()) && pos.getY() >= 0)
          {
          byte b0 = 32;
          
          if (!fallInstantly && worldIn.isAreaLoaded(pos.add(-b0, -b0, -b0), pos.add(b0, b0, b0)))
          {
          if (!worldIn.isRemote)
          {
          EntityFallingBlock entityfallingblock = new EntityFallingBlock(worldIn, (double) pos.getX() + 0.5D, (double) pos.getY(), (double) pos.getZ() + 0.5D, worldIn.getBlockState(pos));
          this.onStartFalling(entityfallingblock);
          worldIn.spawnEntityInWorld(entityfallingblock);
          }
          }
          else
          {
          worldIn.setBlockToAir(pos);
          BlockPos blockpos1 = pos.down();
          Block blockWhereFall;
          
          while (true)
          {
          blockpos1 = blockpos1.down();
          blockWhereFall = worldIn.getBlockState(blockpos1).getBlock();
          
          if ( !(canFallIntoBlock(worldIn, blockpos1) && blockpos1.getY() > 0))
          {
          break;
          }
          
          try
          {
          wait(15);
          }
          catch (InterruptedException e)
          {
          ;
          }
          }
          
          if (blockpos1.getY() > 0)
          {
          worldIn.setBlockState(blockpos1.up(), this.getDefaultState());
          }
          }
          }
          }
          
          public void onEndFalling(World worldIn, BlockPos pos)
          {
          worldIn.setBlockState(pos, Blocks.fire.getDefaultState());
          }
          
          // -- FIRE --- //
          public boolean isCollidable()
          {
          return false;
          }
          
          public AxisAlignedBB getCollisionBoundingBox(World worldIn, BlockPos pos, IBlockState state)
          {
          return null;
          }
          
          public boolean isOpaqueCube()
          {
          return false;
          }
          
          public boolean isFullCube()
          {
          return false;
          }
          
          public int quantityDropped(Random random)
          {
          return 0;
          }
          
          public MapColor getMapColor(IBlockState state)
          {
          return MapColor.tntColor;
          }
          }
          
          

          :::

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

            Si cette méthode est static elle est surement appelé autre part. Sélectionnes la méthode canFallIntoBlock de la classe BlockFalling et fait une recherche Java.

            1 réponse Dernière réponse Répondre Citer 0
            • J
              Jodge dernière édition par

              En effet, tous mes problèmes se concentre sur la même classe EntityFallingBlock. C’est la qu’est ré-utilisé la fonction, et c’est justement cette partie qui entre en jeux dans mes autres problèmes.
              Je n’ai donc pas le choix, je vais devoir m’attaquer a cette classe 😄

              Je mettrai la balise résolus demain dans la soirée si je n’ai pas eu d’autre problème significatif sur la fonction 😉

              sur ceux, bonne nuit, et merci 😄

              1 réponse Dernière réponse Répondre Citer 0
              • J
                Jodge dernière édition par

                Bon je triche, double post avec moins de 24h 😛

                J’ai régler l’intégralité des problèmes avec un bon vieux copier/coller des classes Minecraft (et des adaptation évidemment)

                ha un problème près… Impossible de faire appel a une texture de minecraft… X) m’enfin bon, je dois aussi revoir mes classe pour ajouter ce détaille important ^^"

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

                MINECRAFT FORGE FRANCE © 2018

                Powered by NodeBB