MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    Collision sur blocs non cubiques

    Planifier Épinglé Verrouillé Déplacé Résolu 1.8.x
    1.8
    6 Messages 4 Publieurs 1.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.
    • L Hors-ligne
      Loops
      dernière édition par

      Bonjour à tous,
      Etant développeur de formation et de passion je cherche à initier mon fils aux douces joies de l’arrachage de cheveux qu’est le développement.
      Vu qu’il joue beaucoup à Minecraft, je me suis dit que cela pourrait être une bonne mise en pratique. Je suis en train de lui faire une petite documentation d’initiation.

      On s’est mis d’accord sur un bloc à créer : un tapis de diamant à texture animée (fait avec de la laine et du diamant) qui lorsque l’on marche dessus lance quelques particules, restaure la vie si c’est un joueur et empoisonne les monstres ^^
      Bref un bloc qui permet de toucher à quelques notions d’héritage de classe, d’événements, texture animée, bloc non cubique, gestion du timing, différenciation des entités, etc…

      On est presque au bout du truc, mais j’ai un problème de collision avec le bloc. En fait pour tester qu’une entité marche sur le tapis, je surcharge dans ma classe la méthode onEntityCollidedWithBlock. 
      J’intercepte bien la collision, et mon code se déroule sans problème.
      Cependant on s’est aperçu que notre bloc apparaît sous forme de cube lorsque l’on s’approche de lui (affichage de la hitbox). 
      J’ai fait quelques recherches et j’ai vu qu’on pouvait agir sur la dimension des bordures en utilisant la fonction setBlockBounds. J’ai surchargé la méthode setBlockBoundsBasedOnState dans ma classe pour modifier l’aspect du bloc (this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.0625F, 1.0F);)
      Visuellement c’est impeccable, cependant quand le joueur marche sur le tapis, l’événement onEntityCollidedWithBlock ne se déclenche plus.

      Ma question est donc : y-a-t’il quelque chose de plus à définir quand on utilise setBlockBounds et que l’on veut utiliser aussi onEntityCollidedWithBlock ? Ou bien y-a-t’il une autre façon de procéder ?
      Merci pour vos aides.

      1 réponse Dernière réponse Répondre Citer 0
      • DiabolicaTrixD Hors-ligne
        DiabolicaTrix Correcteurs Moddeurs confirmés
        dernière édition par

        Je ne suis pas sur mon PC donc je ne peux pas te donner d’aide concrète mais essaye d’aller voir dans la classe du tapis directement.

        1 réponse Dernière réponse Répondre Citer 0
        • DeletedD Hors-ligne
          Deleted
          dernière édition par

          La classe du tapis ne se sert pas de la méthode onEntityCollidedWithBlock(), du coup sa ne risque pas de l aider…

          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

            Cactus, plaque de pression, etc …

            1 réponse Dernière réponse Répondre Citer 0
            • DiabolicaTrixD Hors-ligne
              DiabolicaTrix Correcteurs Moddeurs confirmés
              dernière édition par

              @Julot, je sais mais pour la hitbox.

              Sinon je crois qe la plaque de pression serait la meilleure solution.

              1 réponse Dernière réponse Répondre Citer 0
              • L Hors-ligne
                Loops
                dernière édition par

                Merci à tous pour les infos, j’ai donc été voir la classe pour la plaque de pression et j’ai trouvé.
                En fait dans ma classe je surchargeait la méthode onEntityCollidedWithBlock avec le prototype suivant : 
                    public void onEntityCollidedWithBlock(World worldIn, BlockPos pos, Entity entityIn) { }

                Il fallait utiliser le prototype :
                    public void onEntityCollidedWithBlock(World worldIn, BlockPos pos, IBlockState state, Entity entityIn) {}

                En faisant des tests, je me suis aperçu que si on surcharge la méthode setBlockBoundsBasedOnState alors c’était la méthode onEntityCollidedWithBlock(World worldIn, BlockPos pos, IBlockState state, Entity entityIn) qui est appelée, sinon c’était la méthode onEntityCollidedWithBlock(World worldIn, BlockPos pos, Entity entityIn) qui est appelée. C’est étrange, mais bon  😮

                package com.loops.tutorial.blocks;
                
                import net.minecraft.block.Block;
                import net.minecraft.block.material.Material;
                import net.minecraft.block.state.IBlockState;
                import net.minecraft.entity.Entity;
                import net.minecraft.entity.player.EntityPlayer;
                import net.minecraft.util.BlockPos;
                import net.minecraft.util.ChatComponentText;
                import net.minecraft.world.IBlockAccess;
                import net.minecraft.world.World;
                
                public class DiamondPlate extends Block
                {
                 public DiamondPlate(Material materialIn)
                 {
                super(materialIn);
                 }
                
                 public void setBlockBoundsBasedOnState(IBlockAccess worldIn, BlockPos pos)
                 {
                   this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.0625F, 1.0F);    
                 }
                
                 public void onEntityCollidedWithBlock(World worldIn, BlockPos pos, IBlockState state, Entity entityIn)
                 {
                   if (entityIn instanceof EntityPlayer)
                   {  
                     EntityPlayer player = (EntityPlayer)entityIn;
                     player.addChatMessage(new ChatComponentText("Collision avec le bloc"));
                   }
                 }
                
                 public boolean isOpaqueCube()
                 {
                     return false;
                 }
                
                 public boolean isFullCube()
                 {
                     return false;
                 }
                }
                
                

                En tout cas merci pour votre aide.
                Je met le sujet en résolu.

                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