DrawSelectionBoundingBox



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



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



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


  • Rédacteurs

    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.



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


Log in to reply