Skip to content

Commit

Permalink
Optimize/improve arrow count, update changelog
Browse files Browse the repository at this point in the history
  • Loading branch information
mccreery committed Jan 30, 2018
1 parent 5919a5d commit fb654fb
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 30 deletions.
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,23 @@
### Added
- Server compatibility checks for future elements
- CPS counter
- Block viewer recognises custom inventory names
- Block viewer is smarter with special blocks
- New positioning system which accepts an anchor, an offset and an alignment
- XP viewer can show both total XP and XP since death
### Changed
- Code refactoring, easier to work with
- Much smaller code
- Multiple choice settings now save their names rather than indices
- Config uses Forge's system
- Some settings show different text
- Language file made easier to view
### Removed
- Text mode for sign viewer
### Fixed
- Absolute positions are correctly anchored
- No longer corrupts the game's OpenGL state manager, so most render bugs should be fixed
- Arrow count works correctly if the player is left-handed and has a bow in their offhand

## [1.3.9] - 2017-07-06
### Added
Expand Down
74 changes: 46 additions & 28 deletions src/main/java/tk/nukeduck/hud/element/ExperienceInfo.java
Original file line number Diff line number Diff line change
@@ -1,32 +1,38 @@
package tk.nukeduck.hud.element;

import static tk.nukeduck.hud.BetterHud.MANAGER;
import static tk.nukeduck.hud.BetterHud.MC;

import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.resources.I18n;
import java.util.ArrayList;
import java.util.List;

import net.minecraftforge.client.GuiIngameForge;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import tk.nukeduck.hud.element.settings.Legend;
import tk.nukeduck.hud.element.settings.SettingBoolean;
import tk.nukeduck.hud.element.text.TextElement;
import tk.nukeduck.hud.util.Bounds;
import tk.nukeduck.hud.util.Colors;
import tk.nukeduck.hud.util.GlUtil;

public class ExperienceInfo extends TextElement {
private final SettingBoolean total;
private final SettingBoolean total = new SettingBoolean("showTotalExp").setUnlocalizedValue(SettingBoolean.VISIBLE);
private final SettingBoolean lifetime = new SettingBoolean("showLifetimeExp").setUnlocalizedValue(SettingBoolean.VISIBLE);

@Override
public void loadDefaults() {
super.loadDefaults();

total.set(false);
lifetime.set(false);
}

public ExperienceInfo() {
super("experienceInfo");

settings.add(new Legend("expInfoNotice"));
settings.add(new Legend("misc"));
settings.add(total = new SettingBoolean("total"));
settings.add(total);
settings.add(lifetime);
}

@Override
Expand All @@ -36,29 +42,21 @@ public boolean shouldRender() {

@Override
public Bounds render(RenderGameOverlayEvent event) {
int has = Math.round(MC.player.experience * getExperienceWithinLevel(MC.player.experienceLevel));
int needed = getExperienceWithinLevel(MC.player.experienceLevel) - has;
int fullBar = getExperienceWithinLevel(MC.player.experienceLevel);

drawBorderedString(MC.fontRenderer, String.valueOf(has), event.getResolution().getScaledWidth() / 2 - 90, event.getResolution().getScaledHeight() - 30, Colors.WHITE); // 30
drawBorderedString(MC.fontRenderer, String.valueOf(needed), event.getResolution().getScaledWidth() / 2 + 90 - MC.fontRenderer.getStringWidth(String.valueOf(needed)), event.getResolution().getScaledHeight() - 30, Colors.WHITE);
int has = (int)(MC.player.experience * fullBar);
int needed = fullBar - has;

if(total.get()) {
return super.render(event);
} else {
return null;
}
}
GlUtil.drawBorderedString(String.valueOf(has), MANAGER.getResolution().x / 2 - 90, MANAGER.getResolution().y - 30, Colors.WHITE); // 30
GlUtil.drawBorderedString(String.valueOf(needed), MANAGER.getResolution().x / 2 + 90 - MC.fontRenderer.getStringWidth(String.valueOf(needed)), MANAGER.getResolution().y - 30, Colors.WHITE);

// TODO improve rendering of bordered string
public void drawBorderedString(FontRenderer fontrenderer, String s, int x, int y, int color) {
fontrenderer.drawString(s, x + 1, y, 0, false);
fontrenderer.drawString(s, x - 1, y, 0, false);
fontrenderer.drawString(s, x, y + 1, 0, false);
fontrenderer.drawString(s, x, y - 1, 0, false);
fontrenderer.drawString(s, x, y, color, false);
return super.render(event);
}

public static int getExperienceWithinLevel(int level) {
/** @param level The player's current level
* @return The total amount of experience in the current experience bar
* @see <a href="https://minecraft.gamepedia.com/Experience#Leveling_up">Levelling Up</a> */
private static int getExperienceWithinLevel(int level) {
if (level >= 31) {
return 9 * level - 158;
} else if (level >= 16) {
Expand All @@ -68,14 +66,34 @@ public static int getExperienceWithinLevel(int level) {
}
}

/** @return The total amount of experience required to reach {@code level}
* @see <a href="https://minecraft.gamepedia.com/Experience#Leveling_up">Levelling Up</a> */
private static int getExperienceToLevel(int level) {
/* Result is always integer despite real coefficients
* because level and level^2 are either both odd or both even */

if(level >= 32) {
return (int)((4.5 * level - 162.5) * level) + 2220;
} else if(level >= 17) {
return (int)((2.5 * level - 40.5) * level) + 360;
} else {
return (level + 6) * level;
}
}

@Override
protected String[] getText() {
if(!total.get()) return new String[] {};
List<String> parts = new ArrayList<String>(2);

int totalExp = Math.round(MC.player.experience * getExperienceWithinLevel(MC.player.experienceLevel));
for(int i = 0; i < MC.player.experienceLevel; ++i) {
totalExp += getExperienceWithinLevel(i);
if(total.get()) {
int totalDisplay = getExperienceToLevel(MC.player.experienceLevel);
totalDisplay += MC.player.experience * getExperienceWithinLevel(MC.player.experienceLevel);

parts.add(total.getLocalizedName() + ": "+ totalDisplay);
}
if(lifetime.get()) {
parts.add(lifetime.getLocalizedName() + ": " + MC.player.experienceTotal);
}
return new String[] {I18n.format("betterHud.strings.total", String.valueOf(totalExp))};
return parts.toArray(new String[parts.size()]);
}
}
11 changes: 11 additions & 0 deletions src/main/java/tk/nukeduck/hud/util/GlUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -67,4 +67,15 @@ public static void drawTooltipBox(int x, int y, int w, int h) {
GuiUtils.drawGradientRect(zLevel, x+w-2, y+2, x+w-1, y+h-2, borderStart, borderEnd); // Right
GuiUtils.drawGradientRect(zLevel, x+1, y+h-2, x+w-1, y+h-1, borderEnd, borderEnd); // Bottom
}

/** Draws text with black borders on all sides */
public static void drawBorderedString(String text, int x, int y, int color) {
// Borders
MC.fontRenderer.drawString(text, x + 1, y, Colors.BLACK, false);
MC.fontRenderer.drawString(text, x - 1, y, Colors.BLACK, false);
MC.fontRenderer.drawString(text, x, y + 1, Colors.BLACK, false);
MC.fontRenderer.drawString(text, x, y - 1, Colors.BLACK, false);

MC.fontRenderer.drawString(text, x, y, color, false);
}
}
5 changes: 3 additions & 2 deletions src/main/resources/assets/hud/lang/en_US.lang
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ betterHud.element.cps=CPS
betterHud.element.enchantIndicator=Enchantment Indicator
betterHud.element.armorBars=Armor Bars
betterHud.element.handBar=Holding Bar
betterHud.element.experienceInfo=Exp. Info
betterHud.element.experienceInfo=XP Info
betterHud.element.foodHealthStats=Food and Health Stats
betterHud.element.foodIndicator=Hunger Indicator
betterHud.element.fpsCount=FPS
Expand Down Expand Up @@ -194,7 +194,8 @@ betterHud.setting.numberOnly=Number Only
betterHud.setting.saturation=Saturation
betterHud.setting.text=Text
betterHud.setting.visual=Visual
betterHud.setting.showTotalExp=Total EXP
betterHud.setting.showTotalExp=Total XP
betterHud.setting.showLifetimeExp=XP Since Death
betterHud.setting.disableDefault=Disable Default
betterHud.hud.distance.0=§a[§r%s§a]
betterHud.hud.distance.1=%sm away
Expand Down

0 comments on commit fb654fb

Please sign in to comment.