/* * This file is part of Matter Overdrive * Copyright (c) 2015., Simeon Radivoev, All rights reserved. * * Matter Overdrive is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Matter Overdrive 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Matter Overdrive. If not, see <http://www.gnu.org/licenses>. */ package matteroverdrive.gui.android; import matteroverdrive.Reference; import matteroverdrive.api.inventory.IEnergyPack; import matteroverdrive.api.weapon.IWeapon; import matteroverdrive.client.data.Color; import matteroverdrive.client.render.HoloIcon; import matteroverdrive.entity.player.AndroidPlayer; import matteroverdrive.proxy.ClientProxy; import matteroverdrive.util.RenderUtils; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; import java.text.DecimalFormat; import static org.lwjgl.opengl.GL11.*; /** * Created by Simeon on 9/9/2015. */ public class AndroidHudStats extends AndroidHudElement { public static final ResourceLocation top_element_bg = new ResourceLocation(Reference.PATH_ELEMENTS + "android_bg_element.png"); public AndroidHudStats(AndroidHudPosition position,String name) { super(position,name, 174, 32); } @Override public boolean isVisible(AndroidPlayer android) { return true; } @Override public void drawElement(AndroidPlayer androidPlayer,int mouseX, int mouseY, ScaledResolution resolution, float ticks) { glDisable(GL_ALPHA_TEST); double energy_perc = (double) androidPlayer.getEnergyStored() / (double) androidPlayer.getMaxEnergyStored(); double health_perc = androidPlayer.getPlayer().getHealth() / androidPlayer.getPlayer().getEntityAttribute(SharedMonsterAttributes.maxHealth).getBaseValue(); int x = 0; int y = 0; String info; if (this.getPosition().y > 0.5) { y = -48; } if (getPosition().y == 0 || getPosition().y == 1) { x = 12 - (int)(24 * getPosition().x); y = 12 - (int)(24 * getPosition().y); glBlendFunc(GL_SRC_ALPHA, GL_ONE); RenderUtils.applyColorWithAlpha(baseColor); mc.renderEngine.bindTexture(top_element_bg); RenderUtils.drawPlane(x, y+(getHeight(resolution,androidPlayer)-11)*getPosition().y,0,174,11); y += 10 - 5 * getPosition().y; x += 5; int statsX = x; statsX -= (getWidthIconWithPercent(health_perc,18) + getWidthIconWithPercent(energy_perc,20) + getWidthIconWithPercent(androidPlayer.getSpeedMultiply(),16)) * getPosition().x; statsX += 165 * getPosition().x; statsX += renderIconWithPercent("health", health_perc, statsX, y,0,0, false, Reference.COLOR_HOLO_RED, baseColor, 18, 18); statsX += renderIconWithPercent("battery", energy_perc, statsX, y,0,-2, false, Reference.COLOR_HOLO_RED, baseColor, 20, 20); renderIconWithPercent("person", androidPlayer.getSpeedMultiply(), statsX, y,0,1, false, baseColor, baseColor, 14, 14); int weaponX = x; weaponX -= (getAmmoBoxWidth(androidPlayer) + getHeatWidth(androidPlayer)) * getPosition().x; weaponX += 165 * getPosition().x; y += 20; weaponX += renderAmmoBox(androidPlayer,weaponX,y,false,baseColor); renderHeat(androidPlayer,weaponX,y,false,baseColor); } else if (getPosition() == AndroidHudPosition.MIDDLE_LEFT || getPosition() == AndroidHudPosition.MIDDLE_RIGHT) { x = 12 - (int)(24 * getPosition().x); //drawBackground(x,y,androidPlayer,resolution); glBlendFunc(GL_SRC_ALPHA, GL_ONE); RenderUtils.applyColorWithAlpha(baseColor); glPushMatrix(); glTranslated(x+11+(getWidth(resolution,androidPlayer)-11)*getPosition().x,y,0); glRotated(90,0,0,1); mc.renderEngine.bindTexture(top_element_bg); RenderUtils.drawPlane(0, 0,0,174,11); glPopMatrix(); y += 86; int ySize = 24 + 22 + 24; int ammoWidth = getAmmoBoxWidth(androidPlayer); int heatWidth = getHeatWidth(androidPlayer); int ammoHeight = ammoWidth == 0 ? 0 : 24; int heatHeight = heatWidth == 0 ? 0 : 24; ySize += ammoHeight; ySize += heatHeight; y -= ySize/2; //y += 40; x += 11; renderIconWithPercent("health", health_perc, x + (int) (((getWidth(resolution,androidPlayer)-getWidthIconWithPercent(health_perc,18)) - 22) * getPosition().x), y,0,0, false, Reference.COLOR_HOLO_RED, baseColor, 18, 18); y += 24; renderIconWithPercent("battery", energy_perc, x + (int)(((getWidth(resolution,androidPlayer)-getWidthIconWithPercent(energy_perc,20)) - 22) * getPosition().x), y - 2,0,-2, false, Reference.COLOR_HOLO_RED, baseColor, 20, 20); y += 22; renderIconWithPercent("person", androidPlayer.getSpeedMultiply(), x + (int)(((getWidth(resolution,androidPlayer)-getWidthIconWithPercent(androidPlayer.getSpeedMultiply(),16)) - 22) * getPosition().x), y,0,1, false, baseColor, baseColor, 16, 16); y += 24; renderAmmoBox(androidPlayer,x + (int) (((getWidth(resolution,androidPlayer)-ammoWidth) - 22) * getPosition().x),y,false,baseColor); y += ammoHeight; renderHeat(androidPlayer,x + (int) (((getWidth(resolution,androidPlayer)-heatWidth) - 22) * getPosition().x),y,false,baseColor); } else if (getPosition() == AndroidHudPosition.MIDDLE_CENTER) { renderIconWithPercent("health", health_perc, x - getWidthIconWithPercent(health_perc,18) - 22, y - 8,0,0, true, Reference.COLOR_HOLO_RED, baseColor, 18, 18); renderIconWithPercent("battery", energy_perc, x + 24,y - 9,0,0, false, Reference.COLOR_HOLO_RED, baseColor, 20, 20); } glEnable(GL_ALPHA_TEST); } private int getWidthIconWithInfo(String info,int iconWidth) { return iconWidth + mc.fontRenderer.getStringWidth(info) + 4; } private int getWidthIconWithPercent(double amount,int iconWidth) { return getWidthIconWithInfo(DecimalFormat.getPercentInstance().format(amount),iconWidth); } private int renderIconWithPercent(String icon,double amount,int x,int y,int iconOffsetX,int iconOffsetY,boolean leftSided,Color fromColor,Color toColor,int iconWidth,int iconHeight) { return this.renderIconWithInfo(icon,DecimalFormat.getPercentInstance().format(amount),RenderUtils.lerp(fromColor, toColor, MathHelper.clamp_float((float) amount,0,1)),x,y,iconOffsetX,iconOffsetY,leftSided,iconWidth,iconHeight); } private int renderIconWithInfo(String icon, String info, Color color, int x, int y, int iconOffsetX, int iconOffsetY, boolean leftSided, int iconWidth, int iconHeight) { HoloIcon holoIcon = ClientProxy.holoIcons.getIcon(icon); int infoWidth = mc.fontRenderer.getStringWidth(info); glDisable(GL_TEXTURE_2D); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glColor4f(0,0,0,backgroundAlpha); RenderUtils.drawPlane(x,y-1,0,infoWidth + 2 + iconWidth + 2,18+2); glEnable(GL_TEXTURE_2D); glBlendFunc(GL_SRC_ALPHA, GL_ONE); RenderUtils.applyColorWithAlpha(color); if (!leftSided) { ClientProxy.holoIcons.renderIcon(holoIcon, x + iconOffsetX, y + iconOffsetY,iconWidth,iconHeight); mc.fontRenderer.drawString(info, x + iconWidth + 2 + iconOffsetX, y + iconWidth/2 - mc.fontRenderer.FONT_HEIGHT/2 + iconOffsetY, color.getColor()); }else { mc.fontRenderer.drawString(info, x + iconOffsetX, y + iconWidth/2 - mc.fontRenderer.FONT_HEIGHT/2 + iconOffsetY, color.getColor()); ClientProxy.holoIcons.renderIcon(icon,x+infoWidth+2+iconOffsetX,y+iconOffsetY,iconWidth,iconHeight); } return infoWidth + 2 + iconWidth + 2; } private int renderAmmoBox(AndroidPlayer androidPlayer,int x,int y,boolean leftSided,Color baseColor) { if (androidPlayer.getPlayer() != null && androidPlayer.getPlayer().getHeldItem() != null && androidPlayer.getPlayer().getHeldItem().getItem() instanceof IWeapon) { float percent = (float)((IWeapon)androidPlayer.getPlayer().getHeldItem().getItem()).getAmmo(androidPlayer.getPlayer().getHeldItem()) / (float)((IWeapon)androidPlayer.getPlayer().getHeldItem().getItem()).getMaxAmmo(androidPlayer.getPlayer().getHeldItem()); int energyPackCount = getEnergyPackCount(androidPlayer.getPlayer()); return renderIconWithInfo("ammo",DecimalFormat.getPercentInstance().format(percent) + " | " + Integer.toString(energyPackCount), RenderUtils.lerp(Reference.COLOR_HOLO_RED, baseColor, percent),x,y,0,0,leftSided,18,18); } return 0; } private int getAmmoBoxWidth(AndroidPlayer androidPlayer) { if (androidPlayer.getPlayer() != null && androidPlayer.getPlayer().getHeldItem() != null && androidPlayer.getPlayer().getHeldItem().getItem() instanceof IWeapon) { float percent = (float)((IWeapon)androidPlayer.getPlayer().getHeldItem().getItem()).getAmmo(androidPlayer.getPlayer().getHeldItem()) / (float)((IWeapon)androidPlayer.getPlayer().getHeldItem().getItem()).getMaxAmmo(androidPlayer.getPlayer().getHeldItem()); int energyPackCount = getEnergyPackCount(androidPlayer.getPlayer()); return getWidthIconWithInfo(DecimalFormat.getPercentInstance().format(percent) + " | " + Integer.toString(energyPackCount),18); } return 0; } private int renderHeat(AndroidPlayer androidPlayer,int x,int y,boolean leftSided,Color baseColor) { if (androidPlayer.getPlayer() != null && androidPlayer.getPlayer().getHeldItem() != null && androidPlayer.getPlayer().getHeldItem().getItem() instanceof IWeapon) { if (((IWeapon)androidPlayer.getPlayer().getHeldItem().getItem()).getMaxHeat(androidPlayer.getPlayer().getHeldItem()) > 0) { float percent = ((IWeapon)androidPlayer.getPlayer().getHeldItem().getItem()).getHeat(androidPlayer.getPlayer().getHeldItem()) / ((IWeapon)androidPlayer.getPlayer().getHeldItem().getItem()).getMaxHeat(androidPlayer.getPlayer().getHeldItem()); return renderIconWithPercent("temperature",percent,x,y,0,0,leftSided,baseColor,Reference.COLOR_HOLO_RED,18,18); } } return 0; } private int getHeatWidth(AndroidPlayer androidPlayer) { if (androidPlayer.getPlayer() != null && androidPlayer.getPlayer().getHeldItem() != null && androidPlayer.getPlayer().getHeldItem().getItem() instanceof IWeapon) { if (((IWeapon)androidPlayer.getPlayer().getHeldItem().getItem()).getMaxHeat(androidPlayer.getPlayer().getHeldItem()) > 0) { float percent = ((IWeapon)androidPlayer.getPlayer().getHeldItem().getItem()).getHeat(androidPlayer.getPlayer().getHeldItem()) / ((IWeapon)androidPlayer.getPlayer().getHeldItem().getItem()).getMaxHeat(androidPlayer.getPlayer().getHeldItem()); return getWidthIconWithPercent(percent,18); } } return 0; } private int getEnergyPackCount(EntityPlayer entityPlayer) { int energyPackCount = 0; for (ItemStack stack : entityPlayer.inventory.mainInventory) { if (stack != null && stack.getItem() instanceof IEnergyPack) { energyPackCount += stack.stackSize; } } return energyPackCount; } @Override public int getWidth(ScaledResolution resolution,AndroidPlayer androidPlayer) { if (getPosition() == AndroidHudPosition.MIDDLE_CENTER) return 0; if (getPosition().y == 0.5) { return Math.max(getAmmoBoxWidth(androidPlayer)+16,getWidthIconWithPercent(1000,18)); } return width; } @Override public int getHeight(ScaledResolution resolution,AndroidPlayer androidPlayer) { if (getPosition() == AndroidHudPosition.MIDDLE_CENTER) return 0; if (getPosition().y == 0.5) { return width; } if (androidPlayer.getPlayer() != null && androidPlayer.getPlayer().getHeldItem() != null && androidPlayer.getPlayer().getHeldItem().getItem() instanceof IWeapon) { return height + 20; }else { return height; } } }