/* * Minecraft Forge * Copyright (c) 2016-2019. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation version 2.1 * of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ package net.minecraftforge.client; import static net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType.*; import java.util.ArrayList; import java.util.List; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.AbstractGui; import net.minecraft.client.gui.IngameGui; import net.minecraft.client.gui.overlay.DebugOverlayGui; import net.minecraft.client.network.play.ClientPlayNetHandler; import net.minecraft.client.resources.I18n; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.IAttributeInstance; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.block.Blocks; import net.minecraft.potion.Effects; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.scoreboard.ScoreObjective; import net.minecraft.scoreboard.ScorePlayerTeam; import net.minecraft.scoreboard.Scoreboard; import net.minecraft.tags.FluidTags; import net.minecraft.util.FoodStats; import net.minecraft.util.ResourceLocation; import net.minecraft.util.StringUtils; import net.minecraft.util.Util; import net.minecraft.util.math.MathHelper; import net.minecraft.util.text.ITextComponent; import net.minecraft.world.GameType; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; import net.minecraftforge.common.MinecraftForge; import com.mojang.blaze3d.platform.GlStateManager; import org.lwjgl.opengl.GL11; public class ForgeIngameGui extends IngameGui { //private static final ResourceLocation VIGNETTE = new ResourceLocation("textures/misc/vignette.png"); //private static final ResourceLocation WIDGITS = new ResourceLocation("textures/gui/widgets.png"); //private static final ResourceLocation PUMPKIN_BLUR = new ResourceLocation("textures/misc/pumpkinblur.png"); private static final int WHITE = 0xFFFFFF; //Flags to toggle the rendering of certain aspects of the HUD, valid conditions //must be met for them to render normally. If those conditions are met, but this flag //is false, they will not be rendered. public static boolean renderVignette = true; public static boolean renderHelmet = true; public static boolean renderPortal = true; public static boolean renderSpectatorTooltip = true; public static boolean renderHotbar = true; public static boolean renderCrosshairs = true; public static boolean renderBossHealth = true; public static boolean renderHealth = true; public static boolean renderArmor = true; public static boolean renderFood = true; public static boolean renderHealthMount = true; public static boolean renderAir = true; public static boolean renderExperiance = true; public static boolean renderJumpBar = true; public static boolean renderObjective = true; public static int left_height = 39; public static int right_height = 39; /* * If the Euclidian distance to the moused-over block in meters is less than this value, the "Looking at" text will appear on the debug overlay. */ public static double rayTraceDistance = 20.0D; private FontRenderer fontrenderer = null; private RenderGameOverlayEvent eventParent; //private static final String MC_VERSION = MinecraftForge.MC_VERSION; private GuiOverlayDebugForge debugOverlay; public ForgeIngameGui(Minecraft mc) { super(mc); debugOverlay = new GuiOverlayDebugForge(mc); } @Override public void renderGameOverlay(float partialTicks) { this.scaledWidth = this.mc.mainWindow.getScaledWidth(); this.scaledHeight = this.mc.mainWindow.getScaledHeight(); eventParent = new RenderGameOverlayEvent(partialTicks, this.mc.mainWindow); renderHealthMount = mc.player.getRidingEntity() instanceof LivingEntity; renderFood = mc.player.getRidingEntity() == null; renderJumpBar = mc.player.isRidingHorse(); right_height = 39; left_height = 39; if (pre(ALL)) return; fontrenderer = mc.fontRenderer; //mc.entityRenderer.setupOverlayRendering(); GlStateManager.enableBlend(); if (renderVignette && Minecraft.isFancyGraphicsEnabled()) { func_212303_b(mc.getRenderViewEntity()); } else { GlStateManager.enableDepthTest(); GlStateManager.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); } if (renderHelmet) renderHelmet(partialTicks); if (renderPortal && !mc.player.isPotionActive(Effects.NAUSEA)) { renderPortal(partialTicks); } if (this.mc.playerController.getCurrentGameType() == GameType.SPECTATOR) { if (renderSpectatorTooltip) spectatorGui.renderTooltip(partialTicks); } else if (!this.mc.gameSettings.hideGUI) { if (renderHotbar) renderHotbar(partialTicks); } if (!this.mc.gameSettings.hideGUI) { GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); blitOffset = -90; rand.setSeed((long)(ticks * 312871)); if (renderCrosshairs) renderAttackIndicator(); if (renderBossHealth) renderBossHealth(); GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); if (this.mc.playerController.shouldDrawHUD() && this.mc.getRenderViewEntity() instanceof PlayerEntity) { if (renderHealth) renderHealth(this.scaledWidth, this.scaledHeight); if (renderArmor) renderArmor(this.scaledWidth, this.scaledHeight); if (renderFood) renderFood(this.scaledWidth, this.scaledHeight); if (renderHealthMount) renderHealthMount(this.scaledWidth, this.scaledHeight); if (renderAir) renderAir(this.scaledWidth, this.scaledHeight); } if (renderJumpBar) { renderHorseJumpBar(this.scaledWidth / 2 - 91); } else if (renderExperiance) { renderExperience(this.scaledWidth / 2 - 91); } if (this.mc.gameSettings.heldItemTooltips && this.mc.playerController.getCurrentGameType() != GameType.SPECTATOR) { this.renderSelectedItem(); } else if (this.mc.player.isSpectator()) { this.spectatorGui.renderSelectedItem(); } } renderSleepFade(this.scaledWidth, this.scaledHeight); renderHUDText(this.scaledWidth, this.scaledHeight); renderFPSGraph(); renderPotionEffects(); if (!mc.gameSettings.hideGUI) { renderRecordOverlay(this.scaledWidth, this.scaledHeight, partialTicks); renderSubtitles(); renderTitle(this.scaledWidth, this.scaledHeight, partialTicks); } Scoreboard scoreboard = this.mc.world.getScoreboard(); ScoreObjective objective = null; ScorePlayerTeam scoreplayerteam = scoreboard.getPlayersTeam(mc.player.getScoreboardName()); if (scoreplayerteam != null) { int slot = scoreplayerteam.getColor().getColorIndex(); if (slot >= 0) objective = scoreboard.getObjectiveInDisplaySlot(3 + slot); } ScoreObjective scoreobjective1 = objective != null ? objective : scoreboard.getObjectiveInDisplaySlot(1); if (renderObjective && scoreobjective1 != null) { this.renderScoreboard(scoreobjective1); } GlStateManager.enableBlend(); GlStateManager.blendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, 1, 0); GlStateManager.disableAlphaTest(); renderChat(this.scaledWidth, this.scaledHeight); renderPlayerList(this.scaledWidth, this.scaledHeight); GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); GlStateManager.disableLighting(); GlStateManager.enableAlphaTest(); post(ALL); } @Override protected void renderAttackIndicator() { if (pre(CROSSHAIRS)) return; bind(AbstractGui.GUI_ICONS_LOCATION); GlStateManager.enableBlend(); GlStateManager.enableAlphaTest(); super.renderAttackIndicator(); post(CROSSHAIRS); } @Override protected void renderPotionEffects() { if (pre(POTION_ICONS)) return; super.renderPotionEffects(); post(POTION_ICONS); } protected void renderSubtitles() { if (pre(SUBTITLES)) return; this.overlaySubtitle.render(); post(SUBTITLES); } protected void renderBossHealth() { if (pre(BOSSHEALTH)) return; bind(AbstractGui.GUI_ICONS_LOCATION); GlStateManager.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); mc.getProfiler().startSection("bossHealth"); GlStateManager.enableBlend(); this.overlayBoss.render(); GlStateManager.disableBlend(); mc.getProfiler().endSection(); post(BOSSHEALTH); } @Override protected void func_212303_b(Entity entity) { if (pre(VIGNETTE)) { // Need to put this here, since Vanilla assumes this state after the vignette was rendered. GlStateManager.enableDepthTest(); GlStateManager.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); return; } super.func_212303_b(entity); post(VIGNETTE); } private void renderHelmet(float partialTicks) { if (pre(HELMET)) return; ItemStack itemstack = this.mc.player.inventory.armorItemInSlot(3); if (this.mc.gameSettings.thirdPersonView == 0 && !itemstack.isEmpty()) { Item item = itemstack.getItem(); if (item == Blocks.CARVED_PUMPKIN.asItem()) { renderPumpkinOverlay(); } else { item.renderHelmetOverlay(itemstack, mc.player, this.scaledWidth, this.scaledHeight, partialTicks); } } post(HELMET); } protected void renderArmor(int width, int height) { if (pre(ARMOR)) return; mc.getProfiler().startSection("armor"); GlStateManager.enableBlend(); int left = width / 2 - 91; int top = height - left_height; int level = mc.player.getTotalArmorValue(); for (int i = 1; level > 0 && i < 20; i += 2) { if (i < level) { blit(left, top, 34, 9, 9, 9); } else if (i == level) { blit(left, top, 25, 9, 9, 9); } else if (i > level) { blit(left, top, 16, 9, 9, 9); } left += 8; } left_height += 10; GlStateManager.disableBlend(); mc.getProfiler().endSection(); post(ARMOR); } @Override protected void renderPortal(float partialTicks) { if (pre(PORTAL)) return; float f1 = mc.player.prevTimeInPortal + (mc.player.timeInPortal - mc.player.prevTimeInPortal) * partialTicks; if (f1 > 0.0F) { super.renderPortal(f1); } post(PORTAL); } @Override protected void renderHotbar(float partialTicks) { if (pre(HOTBAR)) return; if (mc.playerController.getCurrentGameType() == GameType.SPECTATOR) { this.spectatorGui.renderTooltip(partialTicks); } else { super.renderHotbar(partialTicks); } post(HOTBAR); } @Override public void setOverlayMessage(ITextComponent component, boolean animateColor) { this.setOverlayMessage(component.getFormattedText(), animateColor); } protected void renderAir(int width, int height) { if (pre(AIR)) return; mc.getProfiler().startSection("air"); PlayerEntity player = (PlayerEntity)this.mc.getRenderViewEntity(); GlStateManager.enableBlend(); int left = width / 2 + 91; int top = height - right_height; int air = player.getAir(); if (player.areEyesInFluid(FluidTags.WATER) || air < 300) { int full = MathHelper.ceil((double)(air - 2) * 10.0D / 300.0D); int partial = MathHelper.ceil((double)air * 10.0D / 300.0D) - full; for (int i = 0; i < full + partial; ++i) { blit(left - i * 8 - 9, top, (i < full ? 16 : 25), 18, 9, 9); } right_height += 10; } GlStateManager.disableBlend(); mc.getProfiler().endSection(); post(AIR); } public void renderHealth(int width, int height) { bind(GUI_ICONS_LOCATION); if (pre(HEALTH)) return; mc.getProfiler().startSection("health"); GlStateManager.enableBlend(); PlayerEntity player = (PlayerEntity)this.mc.getRenderViewEntity(); int health = MathHelper.ceil(player.getHealth()); boolean highlight = healthUpdateCounter > (long)ticks && (healthUpdateCounter - (long)ticks) / 3L %2L == 1L; if (health < this.playerHealth && player.hurtResistantTime > 0) { this.lastSystemTime = Util.milliTime(); this.healthUpdateCounter = (long)(this.ticks + 20); } else if (health > this.playerHealth && player.hurtResistantTime > 0) { this.lastSystemTime = Util.milliTime(); this.healthUpdateCounter = (long)(this.ticks + 10); } if (Util.milliTime() - this.lastSystemTime > 1000L) { this.playerHealth = health; this.lastPlayerHealth = health; this.lastSystemTime = Util.milliTime(); } this.playerHealth = health; int healthLast = this.lastPlayerHealth; IAttributeInstance attrMaxHealth = player.getAttribute(SharedMonsterAttributes.MAX_HEALTH); float healthMax = (float)attrMaxHealth.getValue(); float absorb = MathHelper.ceil(player.getAbsorptionAmount()); int healthRows = MathHelper.ceil((healthMax + absorb) / 2.0F / 10.0F); int rowHeight = Math.max(10 - (healthRows - 2), 3); this.rand.setSeed((long)(ticks * 312871)); int left = width / 2 - 91; int top = height - left_height; left_height += (healthRows * rowHeight); if (rowHeight != 10) left_height += 10 - rowHeight; int regen = -1; if (player.isPotionActive(Effects.REGENERATION)) { regen = ticks % 25; } final int TOP = 9 * (mc.world.getWorldInfo().isHardcore() ? 5 : 0); final int BACKGROUND = (highlight ? 25 : 16); int MARGIN = 16; if (player.isPotionActive(Effects.POISON)) MARGIN += 36; else if (player.isPotionActive(Effects.WITHER)) MARGIN += 72; float absorbRemaining = absorb; for (int i = MathHelper.ceil((healthMax + absorb) / 2.0F) - 1; i >= 0; --i) { //int b0 = (highlight ? 1 : 0); int row = MathHelper.ceil((float)(i + 1) / 10.0F) - 1; int x = left + i % 10 * 8; int y = top - row * rowHeight; if (health <= 4) y += rand.nextInt(2); if (i == regen) y -= 2; blit(x, y, BACKGROUND, TOP, 9, 9); if (highlight) { if (i * 2 + 1 < healthLast) blit(x, y, MARGIN + 54, TOP, 9, 9); //6 else if (i * 2 + 1 == healthLast) blit(x, y, MARGIN + 63, TOP, 9, 9); //7 } if (absorbRemaining > 0.0F) { if (absorbRemaining == absorb && absorb % 2.0F == 1.0F) { blit(x, y, MARGIN + 153, TOP, 9, 9); //17 absorbRemaining -= 1.0F; } else { blit(x, y, MARGIN + 144, TOP, 9, 9); //16 absorbRemaining -= 2.0F; } } else { if (i * 2 + 1 < health) blit(x, y, MARGIN + 36, TOP, 9, 9); //4 else if (i * 2 + 1 == health) blit(x, y, MARGIN + 45, TOP, 9, 9); //5 } } GlStateManager.disableBlend(); mc.getProfiler().endSection(); post(HEALTH); } public void renderFood(int width, int height) { if (pre(FOOD)) return; mc.getProfiler().startSection("food"); PlayerEntity player = (PlayerEntity)this.mc.getRenderViewEntity(); GlStateManager.enableBlend(); int left = width / 2 + 91; int top = height - right_height; right_height += 10; boolean unused = false;// Unused flag in vanilla, seems to be part of a 'fade out' mechanic FoodStats stats = mc.player.getFoodStats(); int level = stats.getFoodLevel(); for (int i = 0; i < 10; ++i) { int idx = i * 2 + 1; int x = left - i * 8 - 9; int y = top; int icon = 16; byte background = 0; if (mc.player.isPotionActive(Effects.HUNGER)) { icon += 36; background = 13; } if (unused) background = 1; //Probably should be a += 1 but vanilla never uses this if (player.getFoodStats().getSaturationLevel() <= 0.0F && ticks % (level * 3 + 1) == 0) { y = top + (rand.nextInt(3) - 1); } blit(x, y, 16 + background * 9, 27, 9, 9); if (idx < level) blit(x, y, icon + 36, 27, 9, 9); else if (idx == level) blit(x, y, icon + 45, 27, 9, 9); } GlStateManager.disableBlend(); mc.getProfiler().endSection(); post(FOOD); } protected void renderSleepFade(int width, int height) { if (mc.player.getSleepTimer() > 0) { mc.getProfiler().startSection("sleep"); GlStateManager.disableDepthTest(); GlStateManager.disableAlphaTest(); int sleepTime = mc.player.getSleepTimer(); float opacity = (float)sleepTime / 100.0F; if (opacity > 1.0F) { opacity = 1.0F - (float)(sleepTime - 100) / 10.0F; } int color = (int)(220.0F * opacity) << 24 | 1052704; fill(0, 0, width, height, color); GlStateManager.enableAlphaTest(); GlStateManager.enableDepthTest(); mc.getProfiler().endSection(); } } protected void renderExperience(int x) { bind(GUI_ICONS_LOCATION); if (pre(EXPERIENCE)) return; GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); GlStateManager.disableBlend(); if (mc.playerController.gameIsSurvivalOrAdventure()) { super.renderExpBar(x); } GlStateManager.enableBlend(); GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); post(EXPERIENCE); } @Override public void renderHorseJumpBar(int x) { bind(GUI_ICONS_LOCATION); if (pre(JUMPBAR)) return; GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); GlStateManager.disableBlend(); super.renderHorseJumpBar(x); GlStateManager.enableBlend(); mc.getProfiler().endSection(); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); post(JUMPBAR); } protected void renderHUDText(int width, int height) { mc.getProfiler().startSection("forgeHudText"); GlStateManager.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); ArrayList listL = new ArrayList(); ArrayList listR = new ArrayList(); if (mc.isDemo()) { long time = mc.world.getGameTime(); if (time >= 120500L) { listR.add(I18n.format("demo.demoExpired")); } else { listR.add(I18n.format("demo.remainingTime", StringUtils.ticksToElapsedTime((int)(120500L - time)))); } } if (this.mc.gameSettings.showDebugInfo && !pre(DEBUG)) { debugOverlay.update(); listL.addAll(debugOverlay.getLeft()); listR.addAll(debugOverlay.getRight()); post(DEBUG); } RenderGameOverlayEvent.Text event = new RenderGameOverlayEvent.Text(eventParent, listL, listR); if (!MinecraftForge.EVENT_BUS.post(event)) { int top = 2; for (String msg : listL) { if (msg == null) continue; fill(1, top - 1, 2 + fontrenderer.getStringWidth(msg) + 1, top + fontrenderer.FONT_HEIGHT - 1, -1873784752); fontrenderer.drawStringWithShadow(msg, 2, top, 14737632); top += fontrenderer.FONT_HEIGHT; } top = 2; for (String msg : listR) { if (msg == null) continue; int w = fontrenderer.getStringWidth(msg); int left = width - 2 - w; fill(left - 1, top - 1, left + w + 1, top + fontrenderer.FONT_HEIGHT - 1, -1873784752); fontrenderer.drawStringWithShadow(msg, left, top, 14737632); top += fontrenderer.FONT_HEIGHT; } } mc.getProfiler().endSection(); post(TEXT); } protected void renderFPSGraph() { if (this.mc.gameSettings.showDebugInfo && this.mc.gameSettings.showLagometer && !pre(FPS_GRAPH)) { this.debugOverlay.render(); post(FPS_GRAPH); } } protected void renderRecordOverlay(int width, int height, float partialTicks) { if (overlayMessageTime > 0) { mc.getProfiler().startSection("overlayMessage"); float hue = (float)overlayMessageTime - partialTicks; int opacity = (int)(hue * 256.0F / 20.0F); if (opacity > 255) opacity = 255; if (opacity > 0) { GlStateManager.pushMatrix(); GlStateManager.translatef((float)(width / 2), (float)(height - 68), 0.0F); GlStateManager.enableBlend(); GlStateManager.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); int color = (animateOverlayMessageColor ? MathHelper.hsvToRGB(hue / 50.0F, 0.7F, 0.6F) & WHITE : WHITE); fontrenderer.drawStringWithShadow(overlayMessage, -fontrenderer.getStringWidth(overlayMessage) / 2, -4, color | (opacity << 24)); GlStateManager.disableBlend(); GlStateManager.popMatrix(); } mc.getProfiler().endSection(); } } protected void renderTitle(int width, int height, float partialTicks) { if (titlesTimer > 0) { mc.getProfiler().startSection("titleAndSubtitle"); float age = (float)this.titlesTimer - partialTicks; int opacity = 255; if (titlesTimer > titleFadeOut + titleDisplayTime) { float f3 = (float)(titleFadeIn + titleDisplayTime + titleFadeOut) - age; opacity = (int)(f3 * 255.0F / (float)titleFadeIn); } if (titlesTimer <= titleFadeOut) opacity = (int)(age * 255.0F / (float)this.titleFadeOut); opacity = MathHelper.clamp(opacity, 0, 255); if (opacity > 8) { GlStateManager.pushMatrix(); GlStateManager.translatef((float)(width / 2), (float)(height / 2), 0.0F); GlStateManager.enableBlend(); GlStateManager.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); GlStateManager.pushMatrix(); GlStateManager.scalef(4.0F, 4.0F, 4.0F); int l = opacity << 24 & -16777216; this.getFontRenderer().drawStringWithShadow(this.displayedTitle, (float)(-this.getFontRenderer().getStringWidth(this.displayedTitle) / 2), -10.0F, 16777215 | l); GlStateManager.popMatrix(); GlStateManager.pushMatrix(); GlStateManager.scalef(2.0F, 2.0F, 2.0F); this.getFontRenderer().drawStringWithShadow(this.displayedSubTitle, (float)(-this.getFontRenderer().getStringWidth(this.displayedSubTitle) / 2), 5.0F, 16777215 | l); GlStateManager.popMatrix(); GlStateManager.disableBlend(); GlStateManager.popMatrix(); } this.mc.getProfiler().endSection(); } } protected void renderChat(int width, int height) { mc.getProfiler().startSection("chat"); RenderGameOverlayEvent.Chat event = new RenderGameOverlayEvent.Chat(eventParent, 0, height - 48); if (MinecraftForge.EVENT_BUS.post(event)) return; GlStateManager.pushMatrix(); GlStateManager.translatef((float) event.getPosX(), (float) event.getPosY(), 0.0F); persistantChatGUI.render(ticks); GlStateManager.popMatrix(); post(CHAT); mc.getProfiler().endSection(); } protected void renderPlayerList(int width, int height) { ScoreObjective scoreobjective = this.mc.world.getScoreboard().getObjectiveInDisplaySlot(0); ClientPlayNetHandler handler = mc.player.connection; if (mc.gameSettings.keyBindPlayerList.isKeyDown() && (!mc.isIntegratedServerRunning() || handler.getPlayerInfoMap().size() > 1 || scoreobjective != null)) { this.overlayPlayerList.setVisible(true); if (pre(PLAYER_LIST)) return; this.overlayPlayerList.render(width, this.mc.world.getScoreboard(), scoreobjective); post(PLAYER_LIST); } else { this.overlayPlayerList.setVisible(false); } } protected void renderHealthMount(int width, int height) { PlayerEntity player = (PlayerEntity)mc.getRenderViewEntity(); Entity tmp = player.getRidingEntity(); if (!(tmp instanceof LivingEntity)) return; bind(GUI_ICONS_LOCATION); if (pre(HEALTHMOUNT)) return; boolean unused = false; int left_align = width / 2 + 91; mc.getProfiler().endStartSection("mountHealth"); GlStateManager.enableBlend(); LivingEntity mount = (LivingEntity)tmp; int health = (int)Math.ceil((double)mount.getHealth()); float healthMax = mount.getMaxHealth(); int hearts = (int)(healthMax + 0.5F) / 2; if (hearts > 30) hearts = 30; final int MARGIN = 52; final int BACKGROUND = MARGIN + (unused ? 1 : 0); final int HALF = MARGIN + 45; final int FULL = MARGIN + 36; for (int heart = 0; hearts > 0; heart += 20) { int top = height - right_height; int rowCount = Math.min(hearts, 10); hearts -= rowCount; for (int i = 0; i < rowCount; ++i) { int x = left_align - i * 8 - 9; blit(x, top, BACKGROUND, 9, 9, 9); if (i * 2 + 1 + heart < health) blit(x, top, FULL, 9, 9, 9); else if (i * 2 + 1 + heart == health) blit(x, top, HALF, 9, 9, 9); } right_height += 10; } GlStateManager.disableBlend(); post(HEALTHMOUNT); } //Helper macros private boolean pre(ElementType type) { return MinecraftForge.EVENT_BUS.post(new RenderGameOverlayEvent.Pre(eventParent, type)); } private void post(ElementType type) { MinecraftForge.EVENT_BUS.post(new RenderGameOverlayEvent.Post(eventParent, type)); } private void bind(ResourceLocation res) { mc.getTextureManager().bindTexture(res); } private class GuiOverlayDebugForge extends DebugOverlayGui { private Minecraft mc; private GuiOverlayDebugForge(Minecraft mc) { super(mc); this.mc = mc; } public void update() { Entity entity = this.mc.getRenderViewEntity(); this.rayTraceBlock = entity.func_213324_a(rayTraceDistance, 0.0F, false); this.rayTraceFluid = entity.func_213324_a(rayTraceDistance, 0.0F, true); } @Override protected void renderDebugInfoLeft(){} @Override protected void renderDebugInfoRight(){} private List getLeft() { List ret = this.call(); ret.add(""); ret.add("Debug: Pie [shift]: " + (this.mc.gameSettings.showDebugProfilerChart ? "visible" : "hidden") + " FPS [alt]: " + (this.mc.gameSettings.showLagometer ? "visible" : "hidden")); ret.add("For help: press F3 + Q"); return ret; } private List getRight(){ return this.getDebugInfoRight(); } } }