public void render2D() {
double renderX = getMinecraft().getRenderManager().getRenderPosX();
double renderY = getMinecraft().getRenderManager().getRenderPosY();
double renderZ = getMinecraft().getRenderManager().getRenderPosZ();
int scaleFactor = new ScaledResolution(getMinecraft()).getScaleFactor();
for (Entity entity : getWorld().loadedEntityList) {
if (!shouldRenderNametag(entity)) {
continue;
}
EntityLivingBase livingEntity = (EntityLivingBase) entity;
Vector3f position = projectEntityToScreen(scaleFactor, renderX, renderY, renderZ, livingEntity);
if (position != null && position.z >= 0.0D && position.z < 1.0D) {
drawNametag(livingEntity.getName(), position);
}
}
}
// Check if an entity should have a nametag rendered
private boolean shouldRenderNametag(Entity entity) {
if (getMinecraft().getRenderManager() == null ||
entity == getPlayer() ||
entity.isDead ||
entity.isInvisible() ||
(entity instanceof EntityArmorStand) ||
!(entity instanceof EntityLivingBase)) {
return false;
}
return true;
}
// Project entity's position to the screen
private Vector3f projectEntityToScreen(int scaleFactor, double renderX, double renderY, double renderZ, EntityLivingBase livingEntity) {
if (GLU.gluProject((float) (livingEntity.lastTickPosX - renderX),
(float) (livingEntity.lastTickPosY - renderY),
(float) (livingEntity.lastTickPosZ - renderZ),
ActiveRenderInfo.MODELVIEW,
ActiveRenderInfo.PROJECTION,
ActiveRenderInfo.VIEWPORT,
ActiveRenderInfo.OBJECTCOORDS)) {
float x = ActiveRenderInfo.OBJECTCOORDS.get(0) / scaleFactor;
float y = (Display.getHeight() - ActiveRenderInfo.OBJECTCOORDS.get(1)) / scaleFactor;
float z = ActiveRenderInfo.OBJECTCOORDS.get(2);
return new Vector3f(x, y, z);
}
return null;
}
// Draw nametag on the screen
private void drawNametag(String name, Vector3f position) {
int x = (int) (position.x - mc.fontRendererObj.getStringWidth(name) / 2);
int y = (int) (position.y - 2 - mc.fontRendererObj.FONT_HEIGHT);
mc.fontRendererObj.drawStringWithShadow(name, x, y, -1);
}