Поворот текста в мире вокруг игрока

Версия Minecraft
1.8.9
API
Forge
29
1
2
Как привязать текст к модельке игрока чтобы текст поворачивался при повороте игрока а не при повороте моей камеры
1613901239249.png
Текущий код:
@SubscribeEvent
    public void render(RenderPlayerEvent.Pre event) {
        EntityPlayer player = event.entityPlayer;
        if (player != Minecraft.getMinecraft().thePlayer) {
            renderName(event, "Speed: ", player, event.x, event.y * .3D, event.z + 1);
        }
    }
    public void renderName(RenderPlayerEvent event, String text, EntityPlayer entityIn, double x, double y, double z) {
        //#if MC<=10809
        FontRenderer fontrenderer = event.renderer.getFontRendererFromRenderManager();
        //#else
        //$$ FontRenderer fontrenderer = event.getRenderer().getFontRendererFromRenderManager();
        //#endif
        float f = (float) (1.6F * 1);
        float f1 = 0.016666668F * f;
        GlStateManager.pushMatrix();

        int xMultiplier = 1;
        if (Minecraft.getMinecraft() != null && Minecraft.getMinecraft().gameSettings != null && Minecraft.getMinecraft().gameSettings.thirdPersonView == 2) {
            xMultiplier = -1;
        }

        GlStateManager.translate((float) x + 0.0F, (float) y + entityIn.height + 0.5F, (float) z);
        GL11.glNormal3f(0.0F, 1.0F, 0.0F);
        //#if MC<=10809
        float Xcc = (float) Math.sin(90 - entityIn.cameraPitch) * 10;

        float Ycc = (float) Math.sin(entityIn.cameraPitch) * 10;

        float Zcc = (float) Math.sin(entityIn.cameraYaw) * 10;

        //GlStateManager.rotate(-event.renderer.getRenderManager().playerViewX, 0.0F, 1.0F, 0.0F);
        GlStateManager.rotate(-event.renderer.getRenderManager().playerViewY, 0.0F, 1.0F, 0.0F);
        GlStateManager.rotate(event.renderer.getRenderManager().playerViewX * xMultiplier, 1.0F, 0.0F, 0.0F);
        System.out.println(event.renderer.getRenderManager().playerViewX * xMultiplier);
        System.out.println(Xcc * xMultiplier);
        //#else
        //$$ GlStateManager.rotate(-event.getRenderer().getRenderManager().playerViewY, 0.0F, 1.0F, 0.0F);
        //$$ GlStateManager.rotate(event.getRenderer().getRenderManager().playerViewX * xMultiplier, 1.0F, 0.0F, 0.0F);
        //#endif
        GlStateManager.scale(-f1, -f1, f1);
        GlStateManager.disableLighting();
        GlStateManager.depthMask(false);
        GlStateManager.disableDepth();
        GlStateManager.enableBlend();
        GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0);
        Tessellator tessellator = Tessellator.getInstance();
        WorldRenderer worldrenderer = tessellator.getWorldRenderer();
        int i = 0;

        int j = fontrenderer.getStringWidth(text) / 2;
        GlStateManager.disableTexture2D();
        worldrenderer.begin(7, DefaultVertexFormats.POSITION_COLOR);
        worldrenderer.pos(-j - 1, -1 + i, 0.0D).color(0.0F, 0.0F, 0.0F, 0.25F).endVertex();
        worldrenderer.pos(-j - 1, 8 + i, 0.0D).color(0.0F, 0.0F, 0.0F, 0.25F).endVertex();
        worldrenderer.pos(j + 1, 8 + i, 0.0D).color(0.0F, 0.0F, 0.0F, 0.25F).endVertex();
        worldrenderer.pos(j + 1, -1 + i, 0.0D).color(0.0F, 0.0F, 0.0F, 0.25F).endVertex();
        tessellator.draw();
        GlStateManager.enableTexture2D();

        renderString(fontrenderer, text);

        GlStateManager.enableLighting();
        GlStateManager.disableBlend();
        GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
        GlStateManager.popMatrix();
    }

    private void renderString(FontRenderer renderer, String text) {
        int x = -renderer.getStringWidth(text) / 2;
        //Render header
        render(renderer, text, x);
        //x -= renderer.getStringWidth(text);

    }

    private void render(FontRenderer renderer, String text, int x) {
        GlStateManager.disableDepth();
        GlStateManager.depthMask(true);
        GlStateManager.disableDepth();
        GlStateManager.depthMask(false);

        int y = 0;
        GlStateManager.color(255, 255, 255, .5F);
        renderer.drawString(text, x, y, Color.WHITE.darker().darker().darker().darker().darker().getRGB() * 255);
        GlStateManager.enableDepth();
        GlStateManager.depthMask(true);

        GlStateManager.color(1.0F, 1.0F, 1.0F);



        GlStateManager.color(255, 255, 255, .5F);

        renderer.drawString(text, x, y, Color.WHITE.darker().getRGB());
    }
 
Последнее редактирование:
Решение
Решено:

Код:
public boolean loadOrRender(EntityPlayer player) {
        if (player == null) {
            return false;
        }

        for (PotionEffect effect : player.getActivePotionEffects()) {
            //#if MC<=10809
            if (effect.getPotionID() == 14) {
                return false;
            }
            //#else
            //$$ if (effect.getPotion().getName().equalsIgnoreCase("invisibility")) {
            //$$     return false;
            //$$ }
            //#endif
        }
        //#if MC<=10809
        if(player.riddenByEntity != null) {
            return false;
        }
        //#else
        //$$ if(player.isBeingRidden()) {
        //$$     return false;
        //$$ }
        //#endif

        int...
29
1
2
Решено, осталась одна проблема когда я прыгаю то текст изменяет свою высоту у другого игрока.

Текущий код:
public boolean loadOrRender(EntityPlayer player) {
        if (player == null) {
            return false;
        }

        for (PotionEffect effect : player.getActivePotionEffects()) {
            //#if MC<=10809
            if (effect.getPotionID() == 14) {
                return false;
            }
            //#else
            //$$ if (effect.getPotion().getName().equalsIgnoreCase("invisibility")) {
            //$$     return false;
            //$$ }
            //#endif
        }
        //#if MC<=10809
        if(player.riddenByEntity != null) {
            return false;
        }
        //#else
        //$$ if(player.isBeingRidden()) {
        //$$     return false;
        //$$ }
        //#endif

        int renderDistance = 32;
        int min = Math.min(64 * 64, renderDistance * renderDistance);


        return !(player.getDistanceSqToEntity(Minecraft.getMinecraft().thePlayer) > min)
                && (!player.hasCustomName() || !player.getCustomNameTag().isEmpty())
                && !player.getDisplayNameString().isEmpty()
                && !player.isInvisible()
                && !player.isInvisibleToPlayer(Minecraft.getMinecraft().thePlayer)
                && !player.isSneaking();
    }

    @SubscribeEvent
    public void render(RenderPlayerEvent.Pre event) {
        EntityPlayer player = event.entityPlayer;
        if (loadOrRender(player)) {
            double distTraveledLastTickX = player.posX - player.prevPosX;
            double distTraveledLastTickZ = player.posZ - player.prevPosZ;
            double distTraveledLastTickY = player.posY - player.prevPosY;
            double speed = MathHelper.sqrt_double(distTraveledLastTickX * distTraveledLastTickX + distTraveledLastTickZ * distTraveledLastTickZ);
            renderName(event, "SH: " + String.format("%.2f", speed), player, event.x, -event.y * .3D - 1, event.z);
        }
    }
    public void renderName(RenderPlayerEvent event, String text, EntityPlayer entityIn, double x, double y, double z) {
        //#if MC<=10809
        FontRenderer fontrenderer = event.renderer.getFontRendererFromRenderManager();
        //#else
        //$$ FontRenderer fontrenderer = event.getRenderer().getFontRendererFromRenderManager();
        //#endif
        float f = (float) (1.6F * 1);
        float f1 = 0.016666668F * f;
        GlStateManager.pushMatrix();

        int xMultiplier = 1;
        if (Minecraft.getMinecraft() != null && Minecraft.getMinecraft().gameSettings != null && Minecraft.getMinecraft().gameSettings.thirdPersonView == 2) {
            xMultiplier = -1;
        }

        GlStateManager.translate((float) x + 0.0F, (float) y + entityIn.height + 0.5F, (float) z);
        GL11.glNormal3f(0.0F, 1.0F, 0.0F);
        //#if MC<=10809
        //GlStateManager.rotate(-event.renderer.getRenderManager().playerViewX, 0.0F, 1.0F, 0.0F);
        GlStateManager.rotate(-event.renderer.getRenderManager().playerViewY, 0.0F, 1.0F, 0.0F);
        GlStateManager.rotate(event.renderer.getRenderManager().playerViewX * xMultiplier, 1.0F, 0.0F, 0.0F);
        //GlStateManager.rotate(-event.renderer.getRenderManager().playerViewY, 0.0F, 1.0F, 0.0F);
        //GlStateManager.rotate(Xcc * xMultiplier / 2, 1.0F, 0.0F, 0.0F);
        //System.out.println(Xcc * xMultiplier / 2);
        //System.out.println(event.renderer.getRenderManager().playerViewX * xMultiplier);
        //#else
        //$$ GlStateManager.rotate(-event.getRenderer().getRenderManager().playerViewY, 0.0F, 1.0F, 0.0F);
        //$$ GlStateManager.rotate(event.getRenderer().getRenderManager().playerViewX * xMultiplier, 1.0F, 0.0F, 0.0F);
        //#endif
        GlStateManager.scale(-f1, -f1, f1);
        GlStateManager.disableLighting();
        GlStateManager.depthMask(false);
        GlStateManager.disableDepth();
        GlStateManager.enableBlend();
        GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0);
        Tessellator tessellator = Tessellator.getInstance();
        WorldRenderer worldrenderer = tessellator.getWorldRenderer();
        int offset = fontrenderer.getStringWidth(text);
        int i = 0;
        int j = fontrenderer.getStringWidth(text) / 2;
        GlStateManager.disableTexture2D();
        worldrenderer.begin(7, DefaultVertexFormats.POSITION_COLOR);
        worldrenderer.pos(-j - 1 + offset, -1 + i, 0.0D ).color(0.0F, 0.0F, 0.0F, 0.25F).endVertex();
        worldrenderer.pos(-j - 1 + offset, 8 + i, 0.0D).color(0.0F, 0.0F, 0.0F, 0.25F).endVertex();
        worldrenderer.pos(j + 1 + offset, 8 + i, 0.0D).color(0.0F, 0.0F, 0.0F, 0.25F).endVertex();
        worldrenderer.pos(j + 1 + offset, -1 + i, 0.0D).color(0.0F, 0.0F, 0.0F, 0.25F).endVertex();
        tessellator.draw();
        GlStateManager.enableTexture2D();

        renderString(fontrenderer, text, offset);

        GlStateManager.enableLighting();
        GlStateManager.disableBlend();
        GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
        GlStateManager.popMatrix();
    }

    private void renderString(FontRenderer renderer, String text, int offset) {
        int x = -renderer.getStringWidth(text) / 2 + offset;
        //Render header
        render(renderer, text, x);
        //x -= renderer.getStringWidth(text);

    }

    private void render(FontRenderer renderer, String text, int x) {
        GlStateManager.disableDepth();
        GlStateManager.depthMask(true);
        GlStateManager.disableDepth();
        GlStateManager.depthMask(false);

        int y = 0;
        GlStateManager.color(255, 255, 255, .5F);
        renderer.drawString(text, x, y, Color.WHITE.darker().darker().darker().darker().darker().getRGB() * 255);
        GlStateManager.enableDepth();
        GlStateManager.depthMask(true);

        GlStateManager.color(1.0F, 1.0F, 1.0F);



        GlStateManager.color(255, 255, 255, .5F);

        renderer.drawString(text, x, y, Color.WHITE.darker().getRGB());
    }
 
Последнее редактирование:
29
1
2
Решено:

Код:
public boolean loadOrRender(EntityPlayer player) {
        if (player == null) {
            return false;
        }

        for (PotionEffect effect : player.getActivePotionEffects()) {
            //#if MC<=10809
            if (effect.getPotionID() == 14) {
                return false;
            }
            //#else
            //$$ if (effect.getPotion().getName().equalsIgnoreCase("invisibility")) {
            //$$     return false;
            //$$ }
            //#endif
        }
        //#if MC<=10809
        if(player.riddenByEntity != null) {
            return false;
        }
        //#else
        //$$ if(player.isBeingRidden()) {
        //$$     return false;
        //$$ }
        //#endif

        int renderDistance = 32;
        int min = Math.min(64 * 64, renderDistance * renderDistance);


        return !(player.isInvisible()
                && !player.isInvisibleToPlayer(Minecraft.getMinecraft().thePlayer)
                && !player.isSneaking());
    }

    @SubscribeEvent
    public void render(RenderPlayerEvent.Pre event) {
        EntityPlayer player = event.entityPlayer;
        if (loadOrRender(player)) {
            double offset = -1.3;
            Scoreboard scoreboard = player.getWorldScoreboard();
            ScoreObjective scoreObjective = scoreboard.getObjectiveInDisplaySlot(2);

            if (scoreObjective != null && player.getDistanceSqToEntity(Minecraft.getMinecraft().thePlayer) < 10 * 10) {
                offset *= 2;
            }

            double distTraveledLastTickX = player.posX - player.prevPosX;
            double distTraveledLastTickZ = player.posZ - player.prevPosZ;
            double distTraveledLastTickY = player.posY - player.prevPosY;
            double speed = MathHelper.sqrt_double(distTraveledLastTickX * distTraveledLastTickX + distTraveledLastTickZ * distTraveledLastTickZ);
            renderName(event, "SH: " + String.format("%.2f", speed), player, event.x, event.y + offset * .3D, event.z);
        }
    }
    public void renderName(RenderPlayerEvent event, String text, EntityPlayer entityIn, double x, double y, double z) {
        //#if MC<=10809
        FontRenderer fontrenderer = event.renderer.getFontRendererFromRenderManager();
        //#else
        //$$ FontRenderer fontrenderer = event.getRenderer().getFontRendererFromRenderManager();
        //#endif
        float f = (float) (1.6F * 1);
        float f1 = 0.016666668F * f;
        GlStateManager.pushMatrix();

        int xMultiplier = 1;
        if (Minecraft.getMinecraft() != null && Minecraft.getMinecraft().gameSettings != null && Minecraft.getMinecraft().gameSettings.thirdPersonView == 2) {
            xMultiplier = -1;
        }

        GlStateManager.translate((float) x + 0.0F, (float) y + entityIn.height + 0.5F, (float) z);
        GL11.glNormal3f(0.0F, 1.0F, 0.0F);
        //#if MC<=10809
        //GlStateManager.rotate(-event.renderer.getRenderManager().playerViewX, 0.0F, 1.0F, 0.0F);
        GlStateManager.rotate(-event.renderer.getRenderManager().playerViewY, 0.0F, 1.0F, 0.0F);
        GlStateManager.rotate(event.renderer.getRenderManager().playerViewX * xMultiplier, 1.0F, 0.0F, 0.0F);
        //GlStateManager.rotate(-event.renderer.getRenderManager().playerViewY, 0.0F, 1.0F, 0.0F);
        //GlStateManager.rotate(Xcc * xMultiplier / 2, 1.0F, 0.0F, 0.0F);
        //System.out.println(Xcc * xMultiplier / 2);
        //System.out.println(event.renderer.getRenderManager().playerViewX * xMultiplier);
        //#else
        //$$ GlStateManager.rotate(-event.getRenderer().getRenderManager().playerViewY, 0.0F, 1.0F, 0.0F);
        //$$ GlStateManager.rotate(event.getRenderer().getRenderManager().playerViewX * xMultiplier, 1.0F, 0.0F, 0.0F);
        //#endif
        GlStateManager.scale(-f1, -f1, f1);
        GlStateManager.disableLighting();
        GlStateManager.depthMask(false);
        GlStateManager.disableDepth();
        GlStateManager.enableBlend();
        GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0);
        Tessellator tessellator = Tessellator.getInstance();
        WorldRenderer worldrenderer = tessellator.getWorldRenderer();
        int offset = fontrenderer.getStringWidth(text);
        int i = 0;
        int j = fontrenderer.getStringWidth(text) / 2;
        GlStateManager.disableTexture2D();
        worldrenderer.begin(7, DefaultVertexFormats.POSITION_COLOR);
        worldrenderer.pos(-j - 1 + offset, -1 + i, 0.0D ).color(0.0F, 0.0F, 0.0F, 0.25F).endVertex();
        worldrenderer.pos(-j - 1 + offset, 8 + i, 0.0D).color(0.0F, 0.0F, 0.0F, 0.25F).endVertex();
        worldrenderer.pos(j + 1 + offset, 8 + i, 0.0D).color(0.0F, 0.0F, 0.0F, 0.25F).endVertex();
        worldrenderer.pos(j + 1 + offset, -1 + i, 0.0D).color(0.0F, 0.0F, 0.0F, 0.25F).endVertex();
        tessellator.draw();
        GlStateManager.enableTexture2D();

        renderString(fontrenderer, text, offset);

        GlStateManager.enableLighting();
        GlStateManager.disableBlend();
        GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
        GlStateManager.popMatrix();
    }

    private void renderString(FontRenderer renderer, String text, int offset) {
        int x = -renderer.getStringWidth(text) / 2 + offset;
        //Render header
        render(renderer, text, x);
        //x -= renderer.getStringWidth(text);

    }

    private void render(FontRenderer renderer, String text, int x) {
        GlStateManager.disableDepth();
        GlStateManager.depthMask(true);
        GlStateManager.disableDepth();
        GlStateManager.depthMask(false);

        int y = 0;
        GlStateManager.color(255, 255, 255, .5F);
        renderer.drawString(text, x, y, Color.WHITE.darker().darker().darker().darker().darker().getRGB() * 255);
        GlStateManager.enableDepth();
        GlStateManager.depthMask(true);

        GlStateManager.color(1.0F, 1.0F, 1.0F);



        GlStateManager.color(255, 255, 255, .5F);

        renderer.drawString(text, x, y, Color.WHITE.darker().getRGB());
    }
 
Сверху