Navigation

    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Popular
    • Users
    • Groups

    SOLVED DrawSelectionBoundingBox

    1.11.x
    1.11.x
    3
    5
    543
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • F
      fabulacraft last edited by

      Salut,
      je voudrai faire un mod permettant de voir la hitbox d’une shulker meme lorsqu’on ne fait pas F3+B et qu’elle est derrière un mur.
      Voici mon code : 
      :::

      
      TileEntity shulker = null;
      for (TileEntity e : Minecraft.getMinecraft().world.loadedTileEntityList) {
           String name = e.getBlockType().getUnlocalizedName();
           if (name.contains("shulker")) {
                shulker = e;
            }
      }
      if (shulker != null) {
      //j'affiche
      GlStateManager.enableBlend();
      GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA,
      GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE,
      GlStateManager.DestFactor.ZERO);
      GlStateManager.glLineWidth(2.0F);
      GlStateManager.disableTexture2D();
      GlStateManager.depthMask(false);
      BlockPos blockpos = shulker.getPos();
      IBlockState iblockstate = Minecraft.getMinecraft().world.getBlockState(blockpos);
      
      EntityPlayer player = Minecraft.getMinecraft().player;
      
      float partialTicks = Minecraft.getMinecraft().getRenderPartialTicks();
      if (iblockstate.getMaterial() != Material.AIR
      && Minecraft.getMinecraft().world.getWorldBorder().contains(blockpos)) {
      double d0 = player.lastTickPosX + (player.posX - player.lastTickPosX) * partialTicks;
      double d1 = player.lastTickPosY + (player.posY - player.lastTickPosY) * partialTicks;
      double d2 = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * partialTicks;
      RenderGlobal
      .drawSelectionBoundingBox(
      iblockstate.getSelectedBoundingBox(Minecraft.getMinecraft().world, blockpos)
      .expandXyz(0.0020000000949949026D).offset(-d0, -d1, -d2),
      0.0F, 0.0F, 0.0F, 0.4F);
      }
      GlStateManager.depthMask(true);
      GlStateManager.enableTexture2D();
      GlStateManager.disableBlend();
      }
      
      

      :::
      Je mets ce code dans une fonction prenant en paramètre un

      WorldTickEvent
      

      appelé par le 5zigMod.
      J’ai récupéré ce code depuis la fonction RenderGlobal#drawSelectionBox.
      Le problème est que ça n’affiche absolu rien autour de ma shulker.
      Je suis en 1.11.2. J’ai mis des debugs pour être sur que ça entre bien dans le if et il se sont affichés.

      1 Reply Last reply Reply Quote 0
      • AymericRed
        AymericRed last edited by

        Salut, l’event que tu as utilisé n’est pas un event de rendu, donc tu ne peux rien dessiner quand il est appelé.
        Ensuite, ton code actuelle va dessiner les countours d’un seul shulker, le dernier qu’il trouve dans la liste.
        De plus, vérifier le nom du block comme tu le fais n’est pas du tout optimisé, compares plutôt avec Blocks.SHULKER_BOX (je connais pas le nom exact).

        1 Reply Last reply Reply Quote 0
        • F
          fabulacraft last edited by

          Oui en fait je me suis mal exprimé effectivement je ne cherche à draw la hitbox que d’un seul shulker.
          Merci je vais essayer de faire comme ça pour le nom du block.

          Autrement c’est vraiment complètement impossible d’utiliser des méthodes du GLStateManager lorsque ce n’est pas dans un event de rendu ?

          1 Reply Last reply Reply Quote 0
          • BrokenSwing
            BrokenSwing Moddeurs confirmés Rédacteurs last edited by

            Bonjour,

            Premièrement, WorldTickEvent est un évènement qui est appelé côté serveur et côté client, or tu ne fais en aucun cas la distinction ici donc tu essais aussi de dessiner quelque chose sur le serveur ce qui n’est pas possible. De plus tu utilises la classe Minecraft qui est aussi une classe côté client, cela te fait déjà 2 raisons pour lesquelles ton code fera crash ton serveur.

            Ensuite, comme l’a dit AymericRed, cet évènement n’est pas fait pour le rendu, cependant tu peux utiliser RenderWorldLastEvent qui est un évènement de rendu et comme tu n’utilises aucun champ et aucune méthode de l’évènement cela ne te changera rien.

            Par ce qui est d’ajouter la possibilité de voir la boite de collision même lorsque que celle-ci est derrière un mur il te suffit de désactiver le test de profondeur :

            
            GlStateManager.disableDepth();
            
            // Ici tu rend la boite de collision
            
            GLStateManager.enableDepth();
            
            

            N’oublie pas de la réactiver, bien sûr.

            1 Reply Last reply Reply Quote 1
            • F
              fabulacraft last edited by

              En fait pour être plus précis comme je l’ai dit plus haut ce que je fais est un plugin pour le 5ZigMod. Je ne peux donc pas register des events normaux de forge car justement ce n’est pas un mod et ma classe n’est pas détectée par forge.
              Je ne peux donc qu’utiliser les events du 5ZigMod et des fonctions de forge.
              Et de plus j’avais bien précisé que la méthode worldTickEvent était appelée par le 5ZigMod et non pas par forge.

              Bon bah tant pis.

              1 Reply Last reply Reply Quote 0
              • 1 / 1
              • First post
                Last post
              Design by Woryk
              Contact / Mentions Légales / Faire un don

              MINECRAFT FORGE FRANCE © 2018

              Powered by NodeBB