package minefantasy.mf2.client.render;
import java.awt.Color;
import minefantasy.mf2.api.archery.AmmoMechanicsMF;
import minefantasy.mf2.api.archery.IDisplayMFAmmo;
import minefantasy.mf2.api.archery.IFirearm;
import minefantasy.mf2.api.armour.CogworkArmour;
import minefantasy.mf2.api.armour.ICogworkArmour;
import minefantasy.mf2.api.crafting.IBasicMetre;
import minefantasy.mf2.api.crafting.IQualityBalance;
import minefantasy.mf2.api.helpers.ArmourCalculator;
import minefantasy.mf2.api.helpers.GuiHelper;
import minefantasy.mf2.api.helpers.TextureHelperMF;
import minefantasy.mf2.api.helpers.ToolHelper;
import minefantasy.mf2.api.material.CustomMaterial;
import minefantasy.mf2.api.stamina.StaminaBar;
import minefantasy.mf2.block.tileentity.TileEntityAnvilMF;
import minefantasy.mf2.block.tileentity.TileEntityCarpenterMF;
import minefantasy.mf2.block.tileentity.TileEntityTanningRack;
import minefantasy.mf2.config.ConfigClient;
import minefantasy.mf2.item.gadget.IScope;
import minefantasy.mf2.item.weapon.ItemWeaponMF;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Gui;
import net.minecraft.client.gui.ScaledResolution;
import net.minecraft.client.gui.inventory.GuiContainerCreative;
import net.minecraft.client.gui.inventory.GuiInventory;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
import org.lwjgl.opengl.GL11;
public class MineFantasyHUD extends Gui
{
private static Minecraft mc = Minecraft.getMinecraft();
public void renderGameOverlay(float partialTicks, int mouseX, int mouseY)
{
if(mc.thePlayer != null)
{
EntityPlayer player = mc.thePlayer;
if(mc.currentScreen != null && (mc.currentScreen instanceof GuiInventory || mc.currentScreen instanceof GuiContainerCreative))
{
renderArmourRating(player);
}
else
{
renderAmmo(player);
}
if(this.mc.gameSettings.thirdPersonView == 0)
{
if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof IScope)
{
renderScope(player.getHeldItem(), player);
}
}
if(StaminaBar.isSystemActive && !player.capabilities.isCreativeMode)
{
renderStaminaBar(player);
}
if(player.getEquipmentInSlot(0) != null && player.getEquipmentInSlot(0).getItem() instanceof ICogworkArmour)
{
renderPowerArmourBar(player.getEquipmentInSlot(0), player, (ICogworkArmour)player.getEquipmentInSlot(0).getItem());
}
else if(player.getEquipmentInSlot(3) != null && player.getEquipmentInSlot(3).getItem() instanceof ICogworkArmour)
{
renderPowerArmourBar(player.getEquipmentInSlot(3), player, (ICogworkArmour)player.getEquipmentInSlot(3).getItem());
}
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
int[] coords = getClickedBlock(partialTicks, mouseX, mouseY);
if(coords == null)return;
int x = coords[0];
int y = coords[1];
int z = coords[2];
World world = player.worldObj;
TileEntity tile = world.getTileEntity(x, y, z);
if(tile != null)
{
if(tile instanceof TileEntityAnvilMF)
{
this.renderCraftMetre(world, player, (TileEntityAnvilMF)tile);
}
if(tile instanceof TileEntityCarpenterMF)
{
this.renderCraftMetre(world, player, (TileEntityCarpenterMF)tile);
}
if(tile instanceof TileEntityTanningRack)
{
this.renderCraftMetre(world, player, (TileEntityTanningRack)tile);
}
if(tile instanceof IBasicMetre)
{
this.renderCraftMetre(world, player, (IBasicMetre)tile);
}
if(tile instanceof IQualityBalance)
{
this.renderQualityBalance(world, player, (IQualityBalance)tile);
}
}
}
}
private void renderScope(ItemStack item, EntityPlayer user)
{
if(item.getItem() instanceof IFirearm)
{
float factor = ((IScope)item.getItem()).getZoom(item);
if(factor > 0.1F)
{
GL11.glPushMatrix();
ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight);
int width = scaledresolution.getScaledWidth();
int height = scaledresolution.getScaledHeight();
bindTexture("textures/gui/scopes/scope_basic.png");
int xPos = width/2 -128;
int yPos = height/2 -128;
this.drawTexturedModalRect(xPos, yPos, 0, 0, 256, 256);
GL11.glPopMatrix();
}
}
}
private void renderPowerArmourBar(ItemStack item, EntityPlayer user, ICogworkArmour armour)
{
if(armour.needsPower(item))
{
GL11.glPushMatrix();
GL11.glColor3f(1.0F, 1.0F, 1.0F);
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight);
int width = scaledresolution.getScaledWidth();
int height = scaledresolution.getScaledHeight();
bindTexture("textures/gui/hud_overlay.png");
int[] orientationAR = getOrientsFor(width, height, ConfigClient.CF_xOrient, ConfigClient.CF_yOrient);
int xPos = orientationAR[0] + ConfigClient.CF_xPos;
int yPos = orientationAR[1] + ConfigClient.CF_yPos;
this.drawTexturedModalRect(xPos, yPos, 84, 38, 172, 20);
int i = CogworkArmour.getScaledMetre(item, 160);
this.drawTexturedModalRect(xPos+6+(160-i), yPos+11, 90, 20, i, 3);
GL11.glPopMatrix();
}
}
public int[] getClickedBlock(float ticks, int mouseX, int mouseY)
{
if (mc.objectMouseOver != null && mc.objectMouseOver.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK)
{
int j = mc.objectMouseOver.blockX;
int k = mc.objectMouseOver.blockY;
int l = mc.objectMouseOver.blockZ;
return new int[]{j, k, l};
}
return null;
}
private void renderArmourRating(EntityPlayer player)
{
ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight);
int width = scaledresolution.getScaledWidth();
int height = scaledresolution.getScaledHeight();
int[] orientationAR = getOrientsFor(width, height, ConfigClient.AR_xOrient, ConfigClient.AR_yOrient);
int xPosAR = orientationAR[0] + ConfigClient.AR_xPos;
int yPosAR = orientationAR[1] + ConfigClient.AR_yPos;
int y = 8;
if(ArmourCalculator.advancedDamageTypes)
{
mc.fontRenderer.drawStringWithShadow(StatCollector.translateToLocal("attribute.armour.protection"), xPosAR, yPosAR, Color.WHITE.getRGB());
displayTraitValue(xPosAR, yPosAR+8, orientationAR, 0, player);
displayTraitValue(xPosAR, yPosAR+16, orientationAR, 2, player);
displayTraitValue(xPosAR, yPosAR+24, orientationAR, 1, player);
y = 32;
}
else
{
displayGeneralAR(xPosAR, yPosAR, orientationAR, player);
}
float weight = 0.0F;
for(int a = 0; a < 4; a ++)
{
ItemStack armour = mc.thePlayer.getEquipmentInSlot(4-a);
weight += ArmourCalculator.getPieceWeight(armour, a);
}
String massString = CustomMaterial.getWeightString(weight);
mc.fontRenderer.drawStringWithShadow(massString, xPosAR, yPosAR+y, Color.WHITE.getRGB());
}
private void renderAmmo(EntityPlayer player)
{
ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight);
int width = scaledresolution.getScaledWidth();
int height = scaledresolution.getScaledHeight();
int[] orientationAR = getOrientsFor(width, height, ConfigClient.AR_xOrient, ConfigClient.AR_yOrient);
int xPosAR = orientationAR[0] + ConfigClient.AR_xPos;
int yPosAR = orientationAR[1] + ConfigClient.AR_yPos;
ItemStack held = player.getHeldItem();
if(held != null && (held.getItem() instanceof IDisplayMFAmmo))
{
ItemStack arrow = AmmoMechanicsMF.getAmmo(held);
String text = StatCollector.translateToLocal("info.bow.reload");
if(arrow != null)
{
text = arrow.getDisplayName() + " x" + arrow.stackSize ;
}
int[] orientationAC = getOrientsFor(width, height, ConfigClient.AC_xOrient, ConfigClient.AC_yOrient);
int xPosAC = orientationAR[0] + ConfigClient.AC_xPos;
int yPosAC = orientationAR[1] + ConfigClient.AC_yPos;
mc.fontRenderer.drawStringWithShadow(text, xPosAC, yPosAC, Color.WHITE.getRGB());
int cap = ((IDisplayMFAmmo)held.getItem()).getAmmoCapacity(held);
ItemStack ammo = AmmoMechanicsMF.getArrowOnBow(held);
int ammocount = ammo == null ? 0 : ammo.stackSize;
if(cap > 1)
{
String ammostring = StatCollector.translateToLocalFormatted("info.firearm.ammo", ammocount, cap);
mc.fontRenderer.drawStringWithShadow(ammostring, xPosAC, yPosAC+10, Color.WHITE.getRGB());
}
}
}
private void displayTraitValue(int xPosAR, int yPosAR, int[] orientationAR, int id, EntityPlayer player)
{
float AR = ArmourCalculator.useThresholdSystem ? ArmourCalculator.getDTDisplay(player, id) : (int)(ArmourCalculator.getDRDisplay(player, id)*100F);
mc.fontRenderer.drawStringWithShadow(StatCollector.translateToLocal("attribute.armour.rating."+id)+" " + ItemWeaponMF.decimal_format.format(AR), xPosAR, yPosAR, Color.WHITE.getRGB());
}
private void displayGeneralAR(int xPosAR, int yPosAR, int[] orientationAR, EntityPlayer player)
{
float AR = ArmourCalculator.useThresholdSystem ? ArmourCalculator.getDTDisplay(player, 0) : (int)(ArmourCalculator.getDRDisplay(player, 0)*100F);
mc.fontRenderer.drawStringWithShadow(StatCollector.translateToLocal("attribute.armour.protection")+": " + ItemWeaponMF.decimal_format.format(AR), xPosAR, yPosAR, Color.WHITE.getRGB());
}
private void renderStaminaBar(EntityPlayer player)
{
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
float staminaMax = StaminaBar.getTotalMaxStamina(player);
float staminaAt = StaminaBar.getStaminaValue(player);
float staminaPercentage = staminaMax > 0 ? Math.min(1.0F, staminaAt / staminaMax) : 0F;
float flash = StaminaBar.getFlashTime(player);
int stam = (int)Math.min(81F, (81F * staminaPercentage));
ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight);
int width = scaledresolution.getScaledWidth();
int height = scaledresolution.getScaledHeight();
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
bindTexture("textures/gui/hud_overlay.png");
int[] orientation = getOrientsFor(width, height, ConfigClient.stam_xOrient, ConfigClient.stam_yOrient);
int xPos = orientation[0] + ConfigClient.stam_xPos;
int yPos = orientation[1] + ConfigClient.stam_yPos;
this.drawTexturedModalRect(xPos, yPos, 0, 0, 81, 5);
int modifier = modifyMetre(stam, 81, ConfigClient.stam_direction);
this.drawTexturedModalRect(xPos + modifier, yPos, 0, 5, stam, 5);
if(flash > 0 && player.ticksExisted % 10 < 5)
{
this.drawTexturedModalRect(xPos, yPos, 0, 10, 81, 5);
}
/*
else if(StaminaBar.getBonusStaminaRegenTicks(player) > 0 && player.ticksExisted % 10 < 5)
{
this.drawTexturedModalRect(xPos, yPos, 0, 15, 81, 5);
}
*/
String stamTxt = (int)staminaAt + " / " + (int)staminaMax;
boolean bonus = StaminaBar.getBonusStamina(player) > 0;
if(mc.currentScreen != null && mc.currentScreen instanceof GuiInventory)
{
mc.fontRenderer.drawStringWithShadow(stamTxt, xPos + 41 - (mc.fontRenderer.getStringWidth(stamTxt)/2), yPos-2, bonus ? Color.CYAN.getRGB() : Color.WHITE.getRGB());
}
GL11.glDisable(GL11.GL_BLEND);
}
private int modifyMetre(int i, int max, int cfg)
{
if(cfg == 0)
{
if(max == i)
{
return (max-i)/2;
}
else
{
return (max-i-1)/2;
}
}
if(cfg == 1)
{
if(max == i)
{
return max-i;
}
else
{
return max-i-1;
}
}
return 0;
}
public void bindTexture(String image)
{
mc.renderEngine.bindTexture(TextureHelperMF.getResource(image));
}
/**
* Gets the 2 config values to get the X,Y orient
*/
public static int[] getOrientsFor(int screenX, int screenY, int cfgX, int cfgY)
{
int xOrient = cfgX == -1 ? 0 : cfgX == 1 ? screenX : screenX/2;
int yOrient = cfgY == -1 ? 0 : cfgY == 1 ? screenY : screenY/2;
return new int[]{xOrient, yOrient};
}
private void renderCraftMetre(World world, EntityPlayer player, TileEntityAnvilMF tile)
{
boolean knowsCraft = tile.doesPlayerKnowCraft(player);
GL11.glPushMatrix();
ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight);
int width = scaledresolution.getScaledWidth();
int height = scaledresolution.getScaledHeight();
bindTexture("textures/gui/hud_overlay.png");
int xPos = width/2 + -86;
int yPos = height - 69;
this.drawTexturedModalRect(xPos, yPos, 84, 0, 172, 20);
this.drawTexturedModalRect(xPos+6, yPos+12, 90, 20, tile.getProgressBar(160), 3);
String s = knowsCraft ? tile.getResultName() : "????";
mc.fontRenderer.drawString(s, xPos + 86 - (mc.fontRenderer.getStringWidth(s) / 2), yPos+3, 0);
GL11.glColor3f(1.0F, 1.0F, 1.0F);
if(knowsCraft && !tile.resName.equalsIgnoreCase("") && tile.getToolNeeded() != null)
{
boolean available = ToolHelper.isToolSufficient(player.getHeldItem(), tile.getToolNeeded(), tile.getToolTierNeeded());
GuiHelper.renderToolIcon(this, tile.getToolNeeded(), tile.getToolTierNeeded(), xPos-20, yPos, available);
if(tile.getAnvilTierNeeded() > -1)
{
GuiHelper.renderToolIcon(this, "anvil", tile.getAnvilTierNeeded(), xPos+172, yPos, tile.tier >= tile.getAnvilTierNeeded());
}
}
GL11.glPopMatrix();
}
private void renderCraftMetre(World world, EntityPlayer player, TileEntityCarpenterMF tile)
{
boolean knowsCraft = tile.doesPlayerKnowCraft(player);
GL11.glPushMatrix();
ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight);
int width = scaledresolution.getScaledWidth();
int height = scaledresolution.getScaledHeight();
bindTexture("textures/gui/hud_overlay.png");
int xPos = width/2 + -86;
int yPos = height - 69;
this.drawTexturedModalRect(xPos, yPos, 84, 0, 172, 20);
this.drawTexturedModalRect(xPos+6, yPos+12, 90, 20, tile.getProgressBar(160), 3);
String s = knowsCraft ? tile.getResultName() : "????";
mc.fontRenderer.drawString(s, xPos + 86 - (mc.fontRenderer.getStringWidth(s) / 2), yPos+3, 0);
GL11.glColor3f(1.0F, 1.0F, 1.0F);
if(knowsCraft && !tile.resName.equalsIgnoreCase("") && tile.getToolNeeded() != null)
{
boolean available = ToolHelper.isToolSufficient(player.getHeldItem(), tile.getToolNeeded(), tile.getToolTierNeeded());
GuiHelper.renderToolIcon(this, tile.getToolNeeded(), tile.getToolTierNeeded(), xPos-20, yPos, available);
}
GL11.glPopMatrix();
}
private void renderCraftMetre(World world, EntityPlayer player, TileEntityTanningRack tile)
{
boolean knowsCraft = tile.doesPlayerKnowCraft(player);
GL11.glPushMatrix();
ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight);
int width = scaledresolution.getScaledWidth();
int height = scaledresolution.getScaledHeight();
bindTexture("textures/gui/hud_overlay.png");
int xPos = width/2 + -86;
int yPos = height - 69;
this.drawTexturedModalRect(xPos, yPos, 84, 0, 172, 20);
this.drawTexturedModalRect(xPos+6, yPos+12, 90, 20, tile.getProgressBar(160), 3);
String s = knowsCraft ? tile.getResultName() : "????";
ItemStack result = tile.items[1];
if(result != null && result.stackSize > 1)
{
s += " x"+result.stackSize;
}
mc.fontRenderer.drawString(s, xPos + 86 - (mc.fontRenderer.getStringWidth(s) / 2), yPos+3, 0);
GL11.glColor3f(1.0F, 1.0F, 1.0F);
String resName = tile.getResultName();
if(knowsCraft && !resName.equalsIgnoreCase("") && tile.toolType != null)
{
boolean available = ToolHelper.isToolSufficient(player.getHeldItem(), tile.toolType, -1);
GuiHelper.renderToolIcon(this, tile.toolType, tile.tier, xPos-20, yPos, available);
}
GL11.glPopMatrix();
}
private void renderCraftMetre(World world, EntityPlayer player, IBasicMetre tile)
{
if(!tile.shouldShowMetre())
{
return;
}
GL11.glPushMatrix();
ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight);
int width = scaledresolution.getScaledWidth();
int height = scaledresolution.getScaledHeight();
bindTexture("textures/gui/hud_overlay.png");
int xPos = width/2 + -86;
int yPos = height - 69;
this.drawTexturedModalRect(xPos, yPos, 84, 0, 172, 20);
this.drawTexturedModalRect(xPos+6, yPos+12, 90, 20, tile.getMetreScale(160), 3);
String s = tile.getLocalisedName();
mc.fontRenderer.drawString(s, xPos + 86 - (mc.fontRenderer.getStringWidth(s) / 2), yPos+3, 0);
GL11.glColor3f(1.0F, 1.0F, 1.0F);
GL11.glPopMatrix();
}
private void renderQualityBalance(World world, EntityPlayer player, IQualityBalance tile)
{
if(!tile.shouldShowMetre())
{
return;
}
GL11.glPushMatrix();
ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight);
int width = scaledresolution.getScaledWidth();
int height = scaledresolution.getScaledHeight();
bindTexture("textures/gui/hud_overlay.png");
int xPos = width/2 + -86;
int yPos = height - 69+17;
int barwidth = 160;
int centre = xPos+5+(barwidth/2);
this.drawTexturedModalRect(xPos, yPos, 84, 23, 172, 10);
int markerPos = (int) (centre + (tile.getMarkerPosition()*barwidth/2F));
this.drawTexturedModalRect(markerPos, yPos+1, 84, 33, 3, 5);
int offset = (int)(tile.getThresholdPosition()/2F*barwidth);
this.drawTexturedModalRect(centre-offset-1, yPos+1, 87, 33, 2, 4);
this.drawTexturedModalRect(centre+offset, yPos+1, 89, 33, 2, 4);
int offset2 = (int)(tile.getSuperThresholdPosition()/2F*barwidth);
this.drawTexturedModalRect(centre-offset2, yPos+1, 91, 33, 1, 4);
this.drawTexturedModalRect(centre+offset2, yPos+1, 91, 33, 1, 4);
GL11.glColor3f(1.0F, 1.0F, 1.0F);
GL11.glPopMatrix();
}
}