package net.minecraft.client.gui;

import static net.lax1dude.eaglercraft.v1_8.opengl.RealOpenGLEnums.*;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map.Entry;
import java.util.TimeZone;

import com.google.common.base.Strings;
import com.google.common.collect.Lists;

import net.lax1dude.eaglercraft.v1_8.Display;
import net.lax1dude.eaglercraft.v1_8.EagRuntime;
import net.lax1dude.eaglercraft.v1_8.HString;
import net.lax1dude.eaglercraft.v1_8.internal.EnumPlatformType;
import net.lax1dude.eaglercraft.v1_8.opengl.EaglercraftGPU;
import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager;
import net.lax1dude.eaglercraft.v1_8.opengl.ext.dynamiclights.DynamicLightsStateManager;
import net.lax1dude.eaglercraft.v1_8.sp.SingleplayerServerController;
import net.minecraft.block.Block;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.ClientBrandRetriever;
import net.minecraft.client.Minecraft;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.Entity;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.BlockPos;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.FrameTimer;
import net.minecraft.util.MathHelper;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.world.DifficultyInstance;
import net.minecraft.world.EnumSkyBlock;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraft.world.chunk.Chunk;

/**+
 * This portion of EaglercraftX contains deobfuscated Minecraft 1.8 source code.
 * 
 * Minecraft 1.8.8 bytecode is (c) 2015 Mojang AB. "Do not distribute!"
 * Mod Coder Pack v9.18 deobfuscation configs are (c) Copyright by the MCP Team
 * 
 * EaglercraftX 1.8 patch files (c) 2022-2024 lax1dude, ayunami2000. All Rights Reserved.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 * 
 */
public class GuiOverlayDebug extends Gui {
	private final Minecraft mc;
	private final FontRenderer fontRenderer;
	public int playerOffset = 0;

	public GuiOverlayDebug(Minecraft mc) {
		this.mc = mc;
		this.fontRenderer = mc.fontRendererObj;
	}

	public void renderDebugInfo(ScaledResolution scaledResolutionIn) {
		playerOffset = 0;
		int ww = scaledResolutionIn.getScaledWidth();
		int hh = scaledResolutionIn.getScaledHeight();
		this.mc.mcProfiler.startSection("debug");
		if (this.mc.gameSettings.showDebugInfo) {
			GlStateManager.pushMatrix();
			this.renderDebugInfoLeft();
			this.renderDebugInfoRight(scaledResolutionIn);
			GlStateManager.popMatrix();
			if (this.mc.gameSettings.field_181657_aC) {
				this.func_181554_e();
			}
		} else {
			int i = 2;

			if (this.mc.gameSettings.hudFps) {
				drawFPS(2, i);
				playerOffset = drawSingleplayerStats(scaledResolutionIn);
				i += 9;
			}

			if (this.mc.gameSettings.hudCoords) {
				drawXYZ(2, i);
			}

		}

		if (this.mc.currentScreen == null || !(this.mc.currentScreen instanceof GuiChat)) {
			if (this.mc.gameSettings.hudStats) {
				drawStatsHUD(ww - 2, hh - 2);
			}

			if (this.mc.gameSettings.hudWorld) {
				drawWorldHUD(2, hh - 2);
			}
		}

		if (this.mc.gameSettings.hudCoords && this.mc.joinWorldTickCounter < 80) {
			if (this.mc.joinWorldTickCounter > 70) {
				GlStateManager.enableBlend();
				GlStateManager.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
			}
			int i = this.mc.joinWorldTickCounter - 70;
			if (i < 0)
				i = 0;
			drawHideHUD(ww / 2, hh - 70, (10 - i) * 0xFF / 10);
			if (this.mc.joinWorldTickCounter > 70) {
				GlStateManager.disableBlend();
			}
		}

		this.mc.mcProfiler.endSection();
	}

	private void drawFPS(int x, int y) {
		this.fontRenderer.drawStringWithShadow(this.mc.renderGlobal.getDebugInfoShort(), x, y, 0xFFFFFF);
	}

	private void drawXYZ(int x, int y) {
		Entity e = mc.getRenderViewEntity();
		BlockPos blockpos = new BlockPos(e.posX, e.getEntityBoundingBox().minY, e.posZ);
		this.fontRenderer.drawStringWithShadow(
				"x: " + blockpos.getX() + ", y: " + blockpos.getY() + ", z: " + blockpos.getZ(), x, y, 0xFFFFFF);
	}

	private void drawStatsHUD(int x, int y) {
		int i = 9;

		String line = "Walk: " + EnumChatFormatting.YELLOW + HString.format("%.2f", mc.thePlayer.getAIMoveSpeed())
				+ EnumChatFormatting.WHITE + " Flight: "
				+ (mc.thePlayer.capabilities.allowFlying
						? ("" + EnumChatFormatting.YELLOW + mc.thePlayer.capabilities.getFlySpeed())
						: EnumChatFormatting.RED + "No");
		int lw = fontRenderer.getStringWidth(line);
		this.fontRenderer.drawStringWithShadow(line, x - lw, y - i, 0xFFFFFF);
		i += 11;

		line = "Food: " + EnumChatFormatting.YELLOW + mc.thePlayer.getFoodStats().getFoodLevel()
				+ EnumChatFormatting.WHITE + ", Sat: " + EnumChatFormatting.YELLOW
				+ HString.format("%.1f", mc.thePlayer.getFoodStats().getSaturationLevel());
		lw = fontRenderer.getStringWidth(line);
		this.fontRenderer.drawStringWithShadow(line, x - lw, y - i, 0xFFFFFF);
		i += 11;

		line = "Amr: " + EnumChatFormatting.YELLOW + mc.thePlayer.getTotalArmorValue() + EnumChatFormatting.WHITE
				+ ", Health: " + EnumChatFormatting.RED + HString.format("%.1f", mc.thePlayer.getHealth());
		lw = fontRenderer.getStringWidth(line);
		this.fontRenderer.drawStringWithShadow(line, x - lw, y - i, 0xFFFFFF);
		i += 11;

		int xpc = mc.thePlayer.xpBarCap();
		line = "XP: " + EnumChatFormatting.GREEN + MathHelper.floor_float(mc.thePlayer.experience * xpc)
				+ EnumChatFormatting.WHITE + " / " + EnumChatFormatting.GREEN + xpc;
		lw = fontRenderer.getStringWidth(line);
		this.fontRenderer.drawStringWithShadow(line, x - lw, y - i, 0xFFFFFF);
		i += 11;

		Iterator<PotionEffect> potions = mc.thePlayer.getActivePotionEffects().iterator();
		if (potions.hasNext()) {
			while (potions.hasNext()) {
				i += 11;
				PotionEffect e = potions.next();
				int t = e.getDuration() / 20;
				int m = t / 60;
				int s = t % 60;
				int j = e.getAmplifier();
				if (j > 0) {
					line = I18n.format(e.getEffectName())
							+ (j > 0 ? (" " + EnumChatFormatting.YELLOW + EnumChatFormatting.BOLD
									+ I18n.format("potion.potency." + j) + EnumChatFormatting.RESET) : "")
							+ " [" + EnumChatFormatting.YELLOW + HString.format("%02d:%02d", m, s)
							+ EnumChatFormatting.RESET + "]";
				} else {
					line = I18n.format(e.getEffectName()) + " [" + EnumChatFormatting.YELLOW
							+ HString.format("%02d:%02d", m, s) + EnumChatFormatting.RESET + "]";
				}
				lw = fontRenderer.getStringWidth(line);
				this.fontRenderer.drawStringWithShadow(line, x - lw, y - i, 0xFFFFFF);
			}
		}

	}

	public static final int ticksAtMidnight = 18000;
	public static final int ticksPerDay = 24000;
	public static final int ticksPerHour = 1000;
	public static final double ticksPerMinute = 1000d / 60d;
	public static final double ticksPerSecond = 1000d / 60d / 60d;
	private static final SimpleDateFormat SDFTwentyFour = new SimpleDateFormat("HH:mm", Locale.ENGLISH);
	private static final SimpleDateFormat SDFTwelve = new SimpleDateFormat("h:mm aa", Locale.ENGLISH);

	private void drawWorldHUD(int x, int y) {
		/*
		 * Math was taken from: https://github.com/EssentialsX/Essentials/blob/
		 * dc7fb919391d62de45e17b51ae1e6fe3e66d7ac6/Essentials/src/main/java/com/
		 * earth2me/essentials/utils/DescParseTickFormat.java
		 */
		long totalTicks = mc.theWorld.getWorldTime();
		long ticks = totalTicks;
		ticks = ticks - ticksAtMidnight + ticksPerDay;
		final long days = ticks / ticksPerDay;
		ticks -= days * ticksPerDay;
		final long hours = ticks / ticksPerHour;
		ticks -= hours * ticksPerHour;
		final long minutes = (long) Math.floor(ticks / ticksPerMinute);
		final double dticks = ticks - minutes * ticksPerMinute;
		final long seconds = (long) Math.floor(dticks / ticksPerSecond);

		// TODO: why does desktop JRE not apply "GMT" correctly?
		final Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.ENGLISH);

		cal.setLenient(true);
		cal.set(0, Calendar.JANUARY, 1, 0, 0, 0);
		cal.add(Calendar.DAY_OF_YEAR, (int) days);
		cal.add(Calendar.HOUR_OF_DAY, (int) hours);
		cal.add(Calendar.MINUTE, (int) minutes);
		cal.add(Calendar.SECOND, (int) seconds + 1);

		String timeString = EnumChatFormatting.WHITE + "Day " + ((totalTicks + 30000l) / 24000l) + " ("
				+ EnumChatFormatting.YELLOW
				+ (this.mc.gameSettings.hud24h ? SDFTwentyFour : SDFTwelve).format(cal.getTime())
				+ EnumChatFormatting.WHITE + ")";

		Entity e = mc.getRenderViewEntity();
		BlockPos blockpos = new BlockPos(e.posX, MathHelper.clamp_double(e.getEntityBoundingBox().minY, 0.0D, 254.0D),
				e.posZ);
		BiomeGenBase biome = mc.theWorld.getBiomeGenForCoords(blockpos);

		Chunk c = mc.theWorld.getChunkFromBlockCoords(blockpos);
		int blockLight = c.getLightFor(EnumSkyBlock.BLOCK, blockpos);
		int skyLight = c.getLightFor(EnumSkyBlock.SKY, blockpos) - mc.theWorld.calculateSkylightSubtracted(1.0f);
		int totalLight = Math.max(blockLight, skyLight);
		EnumChatFormatting lightColor = blockLight < 8
				? ((skyLight < 8 || !mc.theWorld.isDaytime()) ? EnumChatFormatting.RED : EnumChatFormatting.YELLOW)
				: EnumChatFormatting.GREEN;
		String lightString = "Light: " + lightColor + totalLight + EnumChatFormatting.WHITE;

		float temp = biome.getFloatTemperature(blockpos);

		String tempString = "Temp: "
				+ ((blockLight > 11 || temp > 0.15f) ? EnumChatFormatting.YELLOW : EnumChatFormatting.AQUA)
				+ HString.format("%.2f", temp) + EnumChatFormatting.WHITE;

		this.fontRenderer.drawStringWithShadow(timeString, x, y - 30, 0xFFFFFF);
		this.fontRenderer.drawStringWithShadow("Biome: " + EnumChatFormatting.AQUA + biome.biomeName, x, y - 19,
				0xFFFFFF);
		this.fontRenderer.drawStringWithShadow(lightString + " " + tempString, x, y - 8, 0xFFFFFF);
	}

	private void drawHideHUD(int x, int y, int fade) {
		drawCenteredString(fontRenderer, I18n.format("options.hud.note"), x, y, 0xEECC00 | (fade << 24));
	}

	private boolean isReducedDebug() {
		return this.mc.thePlayer.hasReducedDebug() || this.mc.gameSettings.reducedDebugInfo;
	}

	private int drawSingleplayerStats(ScaledResolution parScaledResolution) {
		if (mc.isDemo()) {
			return 13;
		}
		int i = 0;
		if (SingleplayerServerController.isWorldRunning()) {
			long tpsAge = SingleplayerServerController.getTPSAge();
			if (tpsAge < 20000l) {
				int color = tpsAge > 2000l ? 0x777777 : 0xFFFFFF;
				List<String> strs = SingleplayerServerController.getTPS();
				int l;
				boolean first = true;
				for (int j = 0, m = strs.size(); j < m; ++j) {
					String str = strs.get(j);
					l = (int) (this.fontRenderer.getStringWidth(str) * (!first ? 0.5f : 1.0f));
					GlStateManager.pushMatrix();
					GlStateManager.translate(parScaledResolution.getScaledWidth() - 2 - l, i + 2, 0.0f);
					if (!first) {
						GlStateManager.scale(0.5f, 0.5f, 0.5f);
					}
					this.fontRenderer.drawStringWithShadow(str, 0, 0, color);
					GlStateManager.popMatrix();
					i += (int) (this.fontRenderer.FONT_HEIGHT * (!first ? 0.5f : 1.0f));
					first = false;
					if (color == 0xFFFFFF) {
						color = 14737632;
					}
				}
			}
		}
		return i > 0 ? i + 2 : i;
	}

	protected void renderDebugInfoLeft() {
		List list = this.call();

		for (int i = 0; i < list.size(); ++i) {
			String s = (String) list.get(i);
			if (!Strings.isNullOrEmpty(s)) {
				int j = this.fontRenderer.FONT_HEIGHT;
				int k = this.fontRenderer.getStringWidth(s);
				boolean flag = true;
				int l = 2 + j * i;
				drawRect(1, l - 1, 2 + k + 1, l + j - 1, -1873784752);
				this.fontRenderer.drawString(s, 2, l, 14737632);
			}
		}

	}

	protected void renderDebugInfoRight(ScaledResolution parScaledResolution) {
		List list = this.getDebugInfoRight();

		for (int i = 0; i < list.size(); ++i) {
			String s = (String) list.get(i);
			if (!Strings.isNullOrEmpty(s)) {
				int j = this.fontRenderer.FONT_HEIGHT;
				int k = this.fontRenderer.getStringWidth(s);
				int l = parScaledResolution.getScaledWidth() - 2 - k;
				int i1 = 2 + j * i;
				drawRect(l - 1, i1 - 1, l + k + 1, i1 + j - 1, -1873784752);
				this.fontRenderer.drawString(s, l, i1, 14737632);
			}
		}

	}

	protected List<String> call() {
		if (!this.mc.gameSettings.showDebugInfo) {
			BlockPos blockpos = new BlockPos(this.mc.getRenderViewEntity().posX,
					this.mc.getRenderViewEntity().getEntityBoundingBox().minY, this.mc.getRenderViewEntity().posZ);
			return Lists.newArrayList(new String[] { this.mc.renderGlobal.getDebugInfoShort(),
					"x: " + blockpos.getX() + ", y: " + blockpos.getY() + ", z: " + blockpos.getZ() });
		}

		BlockPos blockpos = new BlockPos(this.mc.getRenderViewEntity().posX,
				this.mc.getRenderViewEntity().getEntityBoundingBox().minY, this.mc.getRenderViewEntity().posZ);
		if (this.isReducedDebug()) {
			return Lists.newArrayList(new String[] {
					"Minecraft 1.8.8 (" + this.mc.getVersion() + "/" + ClientBrandRetriever.getClientModName() + ")",
					this.mc.debug, this.mc.renderGlobal.getDebugInfoRenders(),
					this.mc.renderGlobal.getDebugInfoEntities(),
					"P: " + this.mc.effectRenderer.getStatistics() + ". T: "
							+ this.mc.theWorld.getDebugLoadedEntities(),
					this.mc.theWorld.getProviderName(), "",
					HString.format("Chunk-relative: %d %d %d", new Object[] { Integer.valueOf(blockpos.getX() & 15),
							Integer.valueOf(blockpos.getY() & 15), Integer.valueOf(blockpos.getZ() & 15) }) });
		} else {
			Entity entity = this.mc.getRenderViewEntity();
			EnumFacing enumfacing = entity.getHorizontalFacing();
			String s = "Invalid";
			switch (enumfacing) {
			case NORTH:
				s = "Towards negative Z";
				break;
			case SOUTH:
				s = "Towards positive Z";
				break;
			case WEST:
				s = "Towards negative X";
				break;
			case EAST:
				s = "Towards positive X";
			}

			ArrayList arraylist = Lists.newArrayList(new String[] {
					"Minecraft 1.8.8 (" + this.mc.getVersion() + "/" + ClientBrandRetriever.getClientModName() + ")",
					this.mc.debug, this.mc.renderGlobal.getDebugInfoRenders(),
					this.mc.renderGlobal.getDebugInfoEntities(), "P: " + this.mc.effectRenderer.getStatistics()
							+ ". T: " + this.mc.theWorld.getDebugLoadedEntities(),
					this.mc.theWorld.getProviderName(), "",
					HString.format("XYZ: %.3f / %.5f / %.3f",
							new Object[] { Double.valueOf(this.mc.getRenderViewEntity().posX),
									Double.valueOf(this.mc.getRenderViewEntity().getEntityBoundingBox().minY),
									Double.valueOf(this.mc.getRenderViewEntity().posZ) }),
					HString.format("Block: %d %d %d",
							new Object[] { Integer.valueOf(blockpos.getX()), Integer.valueOf(blockpos.getY()),
									Integer.valueOf(blockpos.getZ()) }),
					HString.format("Chunk: %d %d %d in %d %d %d",
							new Object[] { Integer.valueOf(blockpos.getX() & 15), Integer.valueOf(blockpos.getY() & 15),
									Integer.valueOf(blockpos.getZ() & 15), Integer.valueOf(blockpos.getX() >> 4),
									Integer.valueOf(blockpos.getY() >> 4), Integer.valueOf(blockpos.getZ() >> 4) }),
					HString.format("Facing: %s (%s) (%.1f / %.1f)",
							new Object[] { enumfacing, s,
									Float.valueOf(MathHelper.wrapAngleTo180_float(entity.rotationYaw)),
									Float.valueOf(MathHelper.wrapAngleTo180_float(entity.rotationPitch)) }) });
			if (DynamicLightsStateManager.isDynamicLightsRender()) {
				arraylist.add(6, DynamicLightsStateManager.getF3String());
			}
			if (this.mc.theWorld != null && this.mc.theWorld.isBlockLoaded(blockpos)) {
				Chunk chunk = this.mc.theWorld.getChunkFromBlockCoords(blockpos);
				arraylist.add("Biome: " + chunk.getBiome(blockpos, null).biomeName);
				arraylist.add("Light: " + chunk.getLightSubtracted(blockpos, 0) + " ("
						+ chunk.getLightFor(EnumSkyBlock.SKY, blockpos) + " sky, "
						+ chunk.getLightFor(EnumSkyBlock.BLOCK, blockpos) + " block)");
				DifficultyInstance difficultyinstance = this.mc.theWorld.getDifficultyForLocation(blockpos);
				arraylist.add(HString.format("Local Difficulty: %.2f (Day %d)",
						new Object[] { Float.valueOf(difficultyinstance.getAdditionalDifficulty()),
								Long.valueOf(this.mc.theWorld.getWorldTime() / 24000L) }));
			}

			if (this.mc.objectMouseOver != null
					&& this.mc.objectMouseOver.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK
					&& this.mc.objectMouseOver.getBlockPos() != null) {
				BlockPos blockpos1 = this.mc.objectMouseOver.getBlockPos();
				arraylist.add(HString.format("Looking at: %d %d %d", new Object[] { Integer.valueOf(blockpos1.getX()),
						Integer.valueOf(blockpos1.getY()), Integer.valueOf(blockpos1.getZ()) }));
			}

			return arraylist;
		}
	}

	protected List<String> getDebugInfoRight() {
		ArrayList arraylist;
		if (EagRuntime.getPlatformType() != EnumPlatformType.JAVASCRIPT) {
			long i = EagRuntime.maxMemory();
			long j = EagRuntime.totalMemory();
			long k = EagRuntime.freeMemory();
			long l = j - k;
			arraylist = Lists.newArrayList(new String[] {
					HString.format("Java: %s %dbit",
							new Object[] { System.getProperty("java.version"),
									Integer.valueOf(this.mc.isJava64bit() ? 64 : 32) }),
					HString.format("Mem: % 2d%% %03d/%03dMB",
							new Object[] { Long.valueOf(l * 100L / i), Long.valueOf(bytesToMb(l)),
									Long.valueOf(bytesToMb(i)) }),
					HString.format("Allocated: % 2d%% %03dMB",
							new Object[] { Long.valueOf(j * 100L / i), Long.valueOf(bytesToMb(j)) }),
					"", HString.format("CPU: %s", new Object[] { "eaglercraft" }), "",
					HString.format("Display: %dx%d (%s)",
							new Object[] { Integer.valueOf(Display.getWidth()), Integer.valueOf(Display.getHeight()),
									EaglercraftGPU.glGetString(7936) }),
					EaglercraftGPU.glGetString(7937), EaglercraftGPU.glGetString(7938) });
		} else {
			arraylist = Lists.newArrayList(
					new String[] { "Java: TeaVM", "", HString.format("CPU: %s", new Object[] { "eaglercraft" }), "",
							HString.format("Display: %dx%d (%s)",
									new Object[] { Integer.valueOf(Display.getWidth()),
											Integer.valueOf(Display.getHeight()), EaglercraftGPU.glGetString(7936) }),
							EaglercraftGPU.glGetString(7937), EaglercraftGPU.glGetString(7938) });
		}
		if (this.isReducedDebug()) {
			return arraylist;
		} else {
			if (this.mc.objectMouseOver != null
					&& this.mc.objectMouseOver.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK
					&& this.mc.objectMouseOver.getBlockPos() != null) {
				BlockPos blockpos = this.mc.objectMouseOver.getBlockPos();
				IBlockState iblockstate = this.mc.theWorld.getBlockState(blockpos);
				arraylist.add("");
				arraylist.add(String.valueOf(Block.blockRegistry.getNameForObject(iblockstate.getBlock())));

				for (Entry entry : iblockstate.getProperties().entrySet()) {
					String s = ((Comparable) entry.getValue()).toString();
					if (entry.getValue() == Boolean.TRUE) {
						s = EnumChatFormatting.GREEN + s;
					} else if (entry.getValue() == Boolean.FALSE) {
						s = EnumChatFormatting.RED + s;
					}

					arraylist.add(((IProperty) entry.getKey()).getName() + ": " + s);
				}
			}

			return arraylist;
		}
	}

	private void func_181554_e() {
		GlStateManager.disableDepth();
		FrameTimer frametimer = this.mc.func_181539_aj();
		int i = frametimer.func_181749_a();
		int j = frametimer.func_181750_b();
		long[] along = frametimer.func_181746_c();
		ScaledResolution scaledresolution = new ScaledResolution(this.mc);
		int k = i;
		int l = 0;
		drawRect(0, scaledresolution.getScaledHeight() - 60, 240, scaledresolution.getScaledHeight(), -1873784752);

		while (k != j) {
			int i1 = frametimer.func_181748_a(along[k], 30);
			int j1 = this.func_181552_c(MathHelper.clamp_int(i1, 0, 60), 0, 30, 60);
			this.drawVerticalLine(l, scaledresolution.getScaledHeight(), scaledresolution.getScaledHeight() - i1, j1);
			++l;
			k = frametimer.func_181751_b(k + 1);
		}

		drawRect(1, scaledresolution.getScaledHeight() - 30 + 1, 14, scaledresolution.getScaledHeight() - 30 + 10,
				-1873784752);
		this.fontRenderer.drawString("60", 2, scaledresolution.getScaledHeight() - 30 + 2, 14737632);
		this.drawHorizontalLine(0, 239, scaledresolution.getScaledHeight() - 30, -1);
		drawRect(1, scaledresolution.getScaledHeight() - 60 + 1, 14, scaledresolution.getScaledHeight() - 60 + 10,
				-1873784752);
		this.fontRenderer.drawString("30", 2, scaledresolution.getScaledHeight() - 60 + 2, 14737632);
		this.drawHorizontalLine(0, 239, scaledresolution.getScaledHeight() - 60, -1);
		this.drawHorizontalLine(0, 239, scaledresolution.getScaledHeight() - 1, -1);
		this.drawVerticalLine(0, scaledresolution.getScaledHeight() - 60, scaledresolution.getScaledHeight(), -1);
		this.drawVerticalLine(239, scaledresolution.getScaledHeight() - 60, scaledresolution.getScaledHeight(), -1);
		if (this.mc.gameSettings.limitFramerate <= 120) {
			this.drawHorizontalLine(0, 239,
					scaledresolution.getScaledHeight() - 60 + this.mc.gameSettings.limitFramerate / 2, -16711681);
		}

		GlStateManager.enableDepth();
	}

	private int func_181552_c(int parInt1, int parInt2, int parInt3, int parInt4) {
		return parInt1 < parInt3 ? this.func_181553_a(-16711936, -256, (float) parInt1 / (float) parInt3)
				: this.func_181553_a(-256, -65536, (float) (parInt1 - parInt3) / (float) (parInt4 - parInt3));
	}

	private int func_181553_a(int parInt1, int parInt2, float parFloat1) {
		int i = parInt1 >> 24 & 255;
		int j = parInt1 >> 16 & 255;
		int k = parInt1 >> 8 & 255;
		int l = parInt1 & 255;
		int i1 = parInt2 >> 24 & 255;
		int j1 = parInt2 >> 16 & 255;
		int k1 = parInt2 >> 8 & 255;
		int l1 = parInt2 & 255;
		int i2 = MathHelper.clamp_int((int) ((float) i + (float) (i1 - i) * parFloat1), 0, 255);
		int j2 = MathHelper.clamp_int((int) ((float) j + (float) (j1 - j) * parFloat1), 0, 255);
		int k2 = MathHelper.clamp_int((int) ((float) k + (float) (k1 - k) * parFloat1), 0, 255);
		int l2 = MathHelper.clamp_int((int) ((float) l + (float) (l1 - l) * parFloat1), 0, 255);
		return i2 << 24 | j2 << 16 | k2 << 8 | l2;
	}

	private static long bytesToMb(long bytes) {
		return bytes / 1024L / 1024L;
	}
}