Слив нейметегов. Можно их доделать и сделать esp отображают криво тк залазиют на оригинальный нейметг от майна (можно убрать через миксин) сделать боксы и хп - будет есп package ru.wuq.implement.features.modules.render; import com.mojang.blaze3d.systems.RenderSystem; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.render.GameRenderer; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.player.PlayerEntity; import ru.wuq.api.feature.module.Module; import ru.wuq.api.feature.module.ModuleCategory; import ru.wuq.core.Wuq; public class NameTags extends Module { private final MinecraftClient mc = MinecraftClient.getInstance(); public NameTags() { super("NameTags", ModuleCategory.RENDER); WorldRenderEvents.AFTER_ENTITIES.register(this::renderPlayerNames); } private void renderPlayerNames(WorldRenderContext context) { if (!Wuq.getInstance().getModuleProvider() .module("NameTags") .isState() || mc.world == null) return; MatrixStack matrixStack = context.matrixStack(); float tickDelta = context.tickDelta(); for (PlayerEntity player : mc.world.getPlayers()) { if (player != mc.player) { renderPlayerName(player, matrixStack, tickDelta); } } } private void renderPlayerName(PlayerEntity player, MatrixStack matrixStack, float tickDelta) { double x = player.prevX + (player.getX() - player.prevX) * tickDelta; double y = player.prevY + (player.getY() - player.prevY) * tickDelta; double z = player.prevZ + (player.getZ() - player.prevZ) * tickDelta; matrixStack.push(); matrixStack.translate( x - mc.getEntityRenderDispatcher().camera.getPos().x, y - mc.getEntityRenderDispatcher().camera.getPos().y + player.getHeight() + 0.5f, z - mc.getEntityRenderDispatcher().camera.getPos().z ); matrixStack.multiply(mc.getEntityRenderDispatcher().getRotation()); matrixStack.scale(-0.025f, -0.025f, 0.025f); TextRenderer textRenderer = mc.textRenderer; String name = player.getName().getString(); float width = -textRenderer.getWidth(name) / 2f; VertexConsumerProvider.Immediate immediate = mc.getBufferBuilders().getEntityVertexConsumers(); RenderSystem.disableDepthTest(); RenderSystem.enableBlend(); RenderSystem.defaultBlendFunc(); RenderSystem.setShader(GameRenderer::getPositionColorProgram); textRenderer.draw(name, width, 0, 0xFFFFFFFF, false, matrixStack.peek().getPositionMatrix(), immediate, TextRenderer.TextLayerType.SEE_THROUGH, 0, 0xF000F0); immediate.draw(); RenderSystem.enableDepthTest(); RenderSystem.disableBlend(); matrixStack.pop(); } @Override public void activate() { WorldRenderEvents.AFTER_ENTITIES.register(this::renderPlayerNames); super.activate(); } @Override public void deactivate() { super.deactivate(); } }