Du code à la volé pour dessiner dans le monde


  • Bonjour à tous, je vais rapidement faire un pseudo tuto, je le fais ici car ce n'est pas du tout un tuto complet, c'est simplement à titre informatif, je ne pense pas que j'aurais le temps de faire un réel tuto donc si cela peut aider, j'ai eu du mal pendant plusieurs semaines pour avoir le résultat (peut être juste mal chanceux ^^)

    J'espère faire bien.

    J'ai trouvé cette partie de source qui permet facilement sans connaissance de faire des zones visuels, je comptes étudier cela et ajouter des formes (inutile pour mon projet mais bon ^^), mais cela risque d'être difficile j'ai très peu de temps libre.

     @SubscribeEvent
    public static void renderWorldLastEvent(RenderWorldLastEvent event) {
        MatrixStack ms = event.getMatrixStack();
        IRenderTypeBuffer.Impl buffers = IRenderTypeBuffer.getImpl(Tessellator.getInstance().getBuffer());
        RenderSystem.disableCull();
        ms.push();
    
        for (Entity e : Minecraft.getInstance().world.getAllEntities()) {
            if (!Minecraft.getInstance().player.equals(e) && !(e instanceof ItemEntity) && !(e instanceof ExperienceOrbEntity)) {
                drawCube(ms, buffers, new AxisAlignedBB(e.getPosition()).expand(0, 1, 0), new Color(0, 255, 0, 127));
                draw3dOutline(ms, buffers, new AxisAlignedBB(e.getPosition()).expand(0, 1, 0), new Color(255, 255, 255, 255));
            }
        }
        draw3dOutline(ms, buffers, new AxisAlignedBB(new BlockPos(0, 10, 0)), new Color(255, 255, 255, 255));
    
        ms.pop();
        buffers.finish();
    }
    
    public static void drawCube(MatrixStack ms, IRenderTypeBuffer buffers, AxisAlignedBB aabb, Color color) {
        draw3dRectangle(ms, buffers, aabb, color, "TOP");
        draw3dRectangle(ms, buffers, aabb, color, "BOTTOM");
        draw3dRectangle(ms, buffers, aabb, color, "NORTH");
        draw3dRectangle(ms, buffers, aabb, color, "EAST");
        draw3dRectangle(ms, buffers, aabb, color, "SOUTH");
        draw3dRectangle(ms, buffers, aabb, color, "WEST");
    }
    
    public static void draw3dRectangle(MatrixStack ms, IRenderTypeBuffer buffers, AxisAlignedBB aabb, Color color, String side) {
        int r = color.getRed();
        int g = color.getGreen();
        int b = color.getBlue();
        int a = color.getAlpha();
        double renderPosX = Minecraft.getInstance().getRenderManager().info.getProjectedView().getX();
        double renderPosY = Minecraft.getInstance().getRenderManager().info.getProjectedView().getY();
        double renderPosZ = Minecraft.getInstance().getRenderManager().info.getProjectedView().getZ();
    
        ms.push();
        ms.translate(aabb.minX - renderPosX, aabb.minY - renderPosY, aabb.minZ - renderPosZ);
    
        IVertexBuilder buffer = buffers.getBuffer(RenderType.makeType(HypixelClient.MODID + ":rectangle_highlight", DefaultVertexFormats.POSITION_COLOR, GL11.GL_QUADS, 256, false, true, RenderType.State.getBuilder().transparency(ObfuscationReflectionHelper.getPrivateValue(RenderState.class, null, "field_228515_g_")).cull(new RenderState.CullState(false)).build(false)));
        Matrix4f mat = ms.getLast().getMatrix();
    
        float x = (float) (aabb.maxX - aabb.minX);
        float y = (float) (aabb.maxY - aabb.minY);
        float z = (float) (aabb.maxZ - aabb.minZ);
    
        switch (side) {
            case "TOP":
                buffer.pos(mat, x, y, 0).color(r, g, b, a).endVertex();
                buffer.pos(mat, 0, y, 0).color(r, g, b, a).endVertex();
                buffer.pos(mat, 0, y, z).color(r, g, b, a).endVertex();
                buffer.pos(mat, x, y, z).color(r, g, b, a).endVertex();
                break;
            case "BOTTOM":
                buffer.pos(mat, x, 0, 0).color(r, g, b, a).endVertex();
                buffer.pos(mat, 0, 0, 0).color(r, g, b, a).endVertex();
                buffer.pos(mat, 0, 0, z).color(r, g, b, a).endVertex();
                buffer.pos(mat, x, 0, z).color(r, g, b, a).endVertex();
                break;
            case "NORTH":
                buffer.pos(mat, 0, y, 0).color(r, g, b, a).endVertex();
                buffer.pos(mat, 0, 0, 0).color(r, g, b, a).endVertex();
                buffer.pos(mat, x, 0, 0).color(r, g, b, a).endVertex();
                buffer.pos(mat, x, y, 0).color(r, g, b, a).endVertex();
                break;
            case "EAST":
                buffer.pos(mat, x, y, 0).color(r, g, b, a).endVertex();
                buffer.pos(mat, x, 0, 0).color(r, g, b, a).endVertex();
                buffer.pos(mat, x, 0, z).color(r, g, b, a).endVertex();
                buffer.pos(mat, x, y, z).color(r, g, b, a).endVertex();
                break;
            case "SOUTH":
                buffer.pos(mat, 0, y, z).color(r, g, b, a).endVertex();
                buffer.pos(mat, 0, 0, z).color(r, g, b, a).endVertex();
                buffer.pos(mat, x, 0, z).color(r, g, b, a).endVertex();
                buffer.pos(mat, x, y, z).color(r, g, b, a).endVertex();
                break;
            case "WEST":
                buffer.pos(mat, 0, y, 0).color(r, g, b, a).endVertex();
                buffer.pos(mat, 0, 0, 0).color(r, g, b, a).endVertex();
                buffer.pos(mat, 0, 0, z).color(r, g, b, a).endVertex();
                buffer.pos(mat, 0, y, z).color(r, g, b, a).endVertex();
                break;
        }
        ms.pop();
    }
    
    public static void draw3dOutline(MatrixStack ms, IRenderTypeBuffer buffers, AxisAlignedBB aabb, Color color) {
        int r = color.getRed();
        int g = color.getGreen();
        int b = color.getBlue();
        int a = color.getAlpha();
        double renderPosX = Minecraft.getInstance().getRenderManager().info.getProjectedView().getX();
        double renderPosY = Minecraft.getInstance().getRenderManager().info.getProjectedView().getY();
        double renderPosZ = Minecraft.getInstance().getRenderManager().info.getProjectedView().getZ();
    
        ms.push();
        ms.translate(aabb.minX - renderPosX, aabb.minY - renderPosY, aabb.minZ - renderPosZ);
    
        RenderType.State glState = RenderType.State.getBuilder().line(new RenderState.LineState(OptionalDouble.of(1))).layer(ObfuscationReflectionHelper.getPrivateValue(RenderState.class, null, "field_228500_J_")).transparency(ObfuscationReflectionHelper.getPrivateValue(RenderState.class, null, "field_228515_g_")).writeMask(new RenderState.WriteMaskState(true, false)).depthTest(new RenderState.DepthTestState(GL11.GL_ALWAYS)).build(false);
        IVertexBuilder buffer = buffers.getBuffer(RenderType.makeType(HypixelClient.MODID + ":line_1_no_depth", DefaultVertexFormats.POSITION_COLOR, GL11.GL_LINES, 128, glState));
        Matrix4f mat = ms.getLast().getMatrix();
    
        float x = (float) (aabb.maxX - aabb.minX);
        float y = (float) (aabb.maxY - aabb.minY);
        float z = (float) (aabb.maxZ - aabb.minZ);
    
        // Top edges
        buffer.pos(mat, x, y, 0).color(r, g, b, a).endVertex();
        buffer.pos(mat, 0, y, 0).color(r, g, b, a).endVertex();
        buffer.pos(mat, 0, y, 0).color(r, g, b, a).endVertex();
        buffer.pos(mat, 0, y, z).color(r, g, b, a).endVertex();
        buffer.pos(mat, 0, y, z).color(r, g, b, a).endVertex();
        buffer.pos(mat, x, y, z).color(r, g, b, a).endVertex();
        buffer.pos(mat, x, y, z).color(r, g, b, a).endVertex();
        buffer.pos(mat, x, y, 0).color(r, g, b, a).endVertex();
    
        // Bottom edges
        buffer.pos(mat, x, 0, 0).color(r, g, b, a).endVertex();
        buffer.pos(mat, 0, 0, 0).color(r, g, b, a).endVertex();
        buffer.pos(mat, 0, 0, 0).color(r, g, b, a).endVertex();
        buffer.pos(mat, 0, 0, z).color(r, g, b, a).endVertex();
        buffer.pos(mat, 0, 0, z).color(r, g, b, a).endVertex();
        buffer.pos(mat, x, 0, z).color(r, g, b, a).endVertex();
        buffer.pos(mat, x, 0, z).color(r, g, b, a).endVertex();
        buffer.pos(mat, x, 0, 0).color(r, g, b, a).endVertex();
    
        // Side edges
        buffer.pos(mat, x, 0, 0).color(r, g, b, a).endVertex();
        buffer.pos(mat, x, y, 0).color(r, g, b, a).endVertex();
        buffer.pos(mat, 0, y, 0).color(r, g, b, a).endVertex();
        buffer.pos(mat, 0, 0, 0).color(r, g, b, a).endVertex();
        buffer.pos(mat, 0, y, z).color(r, g, b, a).endVertex();
        buffer.pos(mat, 0, 0, z).color(r, g, b, a).endVertex();
        buffer.pos(mat, x, 0, z).color(r, g, b, a).endVertex();
        buffer.pos(mat, x, y, z).color(r, g, b, a).endVertex();
    
        ms.pop();
    }
    

    (Le code permet de faire un affichage visuel vert sur les entités de 2 cases de haut et 1 de large).

    Voilà un exemple d'un chunk entouré d'une couleur légère rouge avec trait blanc sur les contours:

            BlockPos pbc = new BlockPos(0,0,16);  // Premier Block du Chunk
            double exp_x = 15;  
            double exp_y = 256;     
            double exp_z = 15;                                                               
            
            drawCube(ms, buffers, new AxisAlignedBB(pbc).expand(exp_x,exp_y,exp_z), new Color(255, 0, 0, 50));
            draw3dOutline(ms, buffers, new AxisAlignedBB(pbc).expand(exp_x,exp_y,exp_z), new Color(255, 255, 255, 255));
    

    L'expand est dans le sens de l'expansion, si vous êtes en 10 et vous voulez aller en 0 il faudra expand -10 🙂

    Rappel des couleurs pour les débutants:

            Color rouge = new Color(255,0,0,50);     
            Color bleu = new Color(0,255,0,50);      
            Color vert = new Color(0,0,255,50);      
                                                     
            Color blanc = new Color(255,255,255,255);
            Color noir = new Color(0,0,0,255);       
    

    Une valeur entre 0 et 255 (on peut imaginer que 0 = 0% et 255 = 100%), la 4eme valeur représente l'alpha, c'est à dire le niveau de transparence, 255 = pas de transparence, 0 = invisible.

    Le contour (draw3dOutline) est en alpha 255 pour être bien visible.

    Le draw3dOutline à un Depth et le drawCube n'en à pas, autrement dit l'un ce voit à travers les blocs et pas l'autre. Vous pouvez modifier cela en étudiant le code bien évidemment 🙂

    Ceci n'est pas réellement un tuto, donc à vous d'étudier la chose, mais je pose cela ici, au moins c'est présent 🙂

    Example:
    line

    line2

    PS: N'oubliez pas de changer HypixelClient.MODID