From c38a249a6deb26a0eab333ac8a1b00d170e1762f Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Wed, 24 Sep 2014 11:39:56 +0200 Subject: [PATCH] Display Armor/Accessories correctly in toolstations/forges --- resources/assets/tinker/lang/en_US.lang | 2 + .../tconstruct/library/armor/ArmorCore.java | 23 +- .../tconstruct/tools/gui/ToolStationGui.java | 202 +++++++++++++++--- 3 files changed, 186 insertions(+), 41 deletions(-) diff --git a/resources/assets/tinker/lang/en_US.lang b/resources/assets/tinker/lang/en_US.lang index 7a32cda5066..99243a00bcb 100644 --- a/resources/assets/tinker/lang/en_US.lang +++ b/resources/assets/tinker/lang/en_US.lang @@ -758,6 +758,8 @@ gui.toolstation15=Mining Level: gui.toolstation16=Usage Speed: gui.toolstation17=Modifiers gui.toolstation18=Modifiers remaining: +gui.toolstation19=Damage Reduction: +gui.toolstation20=Protection: gui.mining1=Stone gui.mining2=Iron diff --git a/src/main/java/tconstruct/library/armor/ArmorCore.java b/src/main/java/tconstruct/library/armor/ArmorCore.java index c5c5b3a160f..2eaccc558c5 100644 --- a/src/main/java/tconstruct/library/armor/ArmorCore.java +++ b/src/main/java/tconstruct/library/armor/ArmorCore.java @@ -183,6 +183,18 @@ public ArmorProperties getProperties (EntityLivingBase player, ItemStack armor, if (tags.getBoolean("Broken")) return new ArmorProperties(0, 0, 0); + double current = getProtection(tags); + + return new ArmorProperties(0, current / 100, 100); + } + + public double getProtection(ItemStack stack) + { + return getProtection(stack.getTagCompound().getCompoundTag(getBaseTagName())); + } + + public double getProtection(NBTTagCompound tags) + { float maxDurability = tags.getInteger("TotalDurability"); float currentDurability = maxDurability - tags.getInteger("Damage"); float ratio = currentDurability / maxDurability; @@ -190,7 +202,7 @@ public ArmorProperties getProperties (EntityLivingBase player, ItemStack armor, double max = tags.getDouble("MaxDefense"); double current = (max - base) * ratio + base; - return new ArmorProperties(0, current / 100, 100); + return current; } @Override @@ -388,7 +400,7 @@ public int getItemMaxDamageFromStackForDisplay (ItemStack stack) return tags.getCompoundTag(getBaseTagName()).getInteger("Damage"); } - DecimalFormat df = new DecimalFormat("##.#"); + private DecimalFormat df = new DecimalFormat("##.#"); @Override @SideOnly(Side.CLIENT) @@ -400,12 +412,7 @@ public void addInformation (ItemStack stack, EntityPlayer player, List list, boo double protection = 0; if (!tags.getBoolean("Broken")) { - float maxDurability = tags.getInteger("TotalDurability"); - float currentDurability = maxDurability - tags.getInteger("Damage"); - float ratio = currentDurability / maxDurability; - double base = tags.getDouble("BaseDefense"); - double max = tags.getDouble("MaxDefense"); - protection = (max - base) * ratio + base; + protection = getProtection(tags); } if (protection > 0) list.add("\u00a77Protection: " + df.format(protection) + "%"); diff --git a/src/main/java/tconstruct/tools/gui/ToolStationGui.java b/src/main/java/tconstruct/tools/gui/ToolStationGui.java index aebaf49a770..f698d0f79ca 100644 --- a/src/main/java/tconstruct/tools/gui/ToolStationGui.java +++ b/src/main/java/tconstruct/tools/gui/ToolStationGui.java @@ -14,6 +14,8 @@ import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; import tconstruct.TConstruct; +import tconstruct.library.accessory.AccessoryCore; +import tconstruct.library.armor.ArmorCore; import tconstruct.library.client.*; import tconstruct.library.tools.*; import tconstruct.library.util.HarvestLevels; @@ -164,20 +166,36 @@ protected void drawGuiContainerForegroundLayer (int par1, int par2) drawToolInformation(); } - void drawToolStats () + protected void drawToolStats () { ItemStack stack = logic.getStackInSlot(0); if (stack.getItem() instanceof ToolCore) { ToolCore tool = (ToolCore) stack.getItem(); - NBTTagCompound tags = stack.getTagCompound().getCompoundTag("InfiTool"); + NBTTagCompound tags = stack.getTagCompound().getCompoundTag(tool.getBaseTagName()); this.drawCenteredString(fontRendererObj, "\u00A7n" + tool.getLocalizedToolName(), 349, 8, 0xffffff); - drawModularToolStats(stack, tool, tags); + drawModularToolStats(stack, tool, tags, 294, 24); + } + if(stack.getItem() instanceof ArmorCore) + { + ArmorCore armor = (ArmorCore) stack.getItem(); + NBTTagCompound tags = stack.getTagCompound().getCompoundTag(armor.getBaseTagName()); + this.drawCenteredString(fontRendererObj, "\u00A7n" + armor.getArmorName(), 349, 8, 0xffffff); // todo: localize + + drawModularArmorStats(stack, armor, tags, 294, 24); + } + if(stack.getItem() instanceof AccessoryCore) + { + AccessoryCore accessory = (AccessoryCore) stack.getItem(); + NBTTagCompound tags = stack.getTagCompound().getCompoundTag(accessory.getBaseTagName()); + this.drawCenteredString(fontRendererObj, "\u00A7n" + stack.getDisplayName(), 349, 8, 0xffffff); // todo: localize + + drawModularAccessoryStats(stack, accessory, tags, 294, 24); } } - void drawModularToolStats (ItemStack stack, ToolCore tool, NBTTagCompound tags) + protected void drawModularToolStats (ItemStack stack, ToolCore tool, NBTTagCompound tags, int x, int y) { List categories = Arrays.asList(tool.getTraits()); final int durability = tags.getInteger("Damage"); @@ -185,20 +203,20 @@ void drawModularToolStats (ItemStack stack, ToolCore tool, NBTTagCompound tags) int availableDurability = maxDur - durability; // Durability - int base = 24; + int base = y; int offset = 0; if (maxDur > 0) { if (maxDur >= 10000) { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation1"), 294, base + offset * 11, 0xffffff); + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation1"), x, base + offset * 11, 0xffffff); offset++; - fontRendererObj.drawString("- " + availableDurability + "/" + maxDur, 294, base + offset * 10, 0xffffff); + fontRendererObj.drawString("- " + availableDurability + "/" + maxDur, x, base + offset * 10, 0xffffff); offset++; } else { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation2") + availableDurability + "/" + maxDur, 294, base + offset * 10, 0xffffff); + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation2") + availableDurability + "/" + maxDur, x, base + offset * 10, 0xffffff); offset++; } } @@ -216,9 +234,9 @@ void drawModularToolStats (ItemStack stack, ToolCore tool, NBTTagCompound tags) String heart = attack == 2 ? StatCollector.translateToLocal("gui.partcrafter8") : StatCollector.translateToLocal("gui.partcrafter9"); if (attack % 2 == 0) - this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation3") + attack / 2 + heart, 294, base + offset * 10, 0xffffff); + this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation3") + attack / 2 + heart, x, base + offset * 10, 0xffffff); else - this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation3") + attack / 2f + heart, 294, base + offset * 10, 0xffffff); + this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation3") + attack / 2f + heart, x, base + offset * 10, 0xffffff); offset++; if (stoneboundDamage != 0) @@ -226,7 +244,7 @@ void drawModularToolStats (ItemStack stack, ToolCore tool, NBTTagCompound tags) DecimalFormat df = new DecimalFormat("##.##"); heart = stoneboundDamage == 2 ? StatCollector.translateToLocal("gui.partcrafter8") : StatCollector.translateToLocal("gui.partcrafter9"); String bloss = stoneboundDamage > 0 ? StatCollector.translateToLocal("gui.toolstation4") : StatCollector.translateToLocal("gui.toolstation5"); - this.fontRendererObj.drawString(bloss + df.format(stoneboundDamage / 2f) + heart, xSize + 8, base + offset * 10, 0xffffff); + this.fontRendererObj.drawString(bloss + df.format(stoneboundDamage / 2f) + heart, x, base + offset * 10, 0xffffff); offset++; } offset++; @@ -239,9 +257,9 @@ void drawModularToolStats (ItemStack stack, ToolCore tool, NBTTagCompound tags) int drawSpeed = tags.getInteger("DrawSpeed"); float flightSpeed = tags.getFloat("FlightSpeed"); float trueDraw = drawSpeed / 20f * flightSpeed; - this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation6") + df.format(trueDraw) + "s", 294, base + offset * 10, 0xffffff); + this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation6") + df.format(trueDraw) + "s", x, base + offset * 10, 0xffffff); offset++; - this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation7") + df.format(flightSpeed) + "x", 294, base + offset * 10, 0xffffff); + this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation7") + df.format(flightSpeed) + "x", x, base + offset * 10, 0xffffff); offset++; offset++; } @@ -255,26 +273,26 @@ void drawModularToolStats (ItemStack stack, ToolCore tool, NBTTagCompound tags) float shatter = tags.getFloat("BreakChance"); float accuracy = tags.getFloat("Accuracy"); - this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation10"), 294, base + offset * 10, 0xffffff); + this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation10"), x, base + offset * 10, 0xffffff); offset++; String heart = attack == 2 ? StatCollector.translateToLocal("gui.partcrafter8") : StatCollector.translateToLocal("gui.partcrafter9"); if (attack % 2 == 0) - this.fontRendererObj.drawString("- " + attack / 2 + heart, 294, base + offset * 10, 0xffffff); + this.fontRendererObj.drawString("- " + attack / 2 + heart, x, base + offset * 10, 0xffffff); else - this.fontRendererObj.drawString("- " + attack / 2f + heart, 294, base + offset * 10, 0xffffff); + this.fontRendererObj.drawString("- " + attack / 2f + heart, x, base + offset * 10, 0xffffff); offset++; int minAttack = attack; int maxAttack = attack * 2; heart = StatCollector.translateToLocal("gui.partcrafter9"); - this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation11"), 294, base + offset * 10, 0xffffff); + this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation11"), x, base + offset * 10, 0xffffff); offset++; - this.fontRendererObj.drawString(df.format(minAttack / 2f) + "-" + df.format(maxAttack / 2f) + heart, 294, base + offset * 10, 0xffffff); + this.fontRendererObj.drawString(df.format(minAttack / 2f) + "-" + df.format(maxAttack / 2f) + heart, x, base + offset * 10, 0xffffff); offset++; offset++; - this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation8") + df.format(mass), 294, base + offset * 10, 0xffffff); + this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation8") + df.format(mass), x, base + offset * 10, 0xffffff); offset++; - this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation9") + df.format(accuracy - 4) + "%", 294, base + offset * 10, 0xffffff); + this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation9") + df.format(accuracy - 4) + "%", x, base + offset * 10, 0xffffff); offset++; /* * this.fontRendererObj.drawString("Chance to break: " + @@ -295,20 +313,20 @@ void drawModularToolStats (ItemStack stack, ToolCore tool, NBTTagCompound tags) float trueSpeed = mineSpeed + stoneboundSpeed; float trueSpeed2 = mineSpeed2 + stoneboundSpeed; - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation12"), 294, base + offset * 10, 0xffffff); + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation12"), x, base + offset * 10, 0xffffff); offset++; - fontRendererObj.drawString("- " + df.format(trueSpeed) + ", " + df.format(trueSpeed2), 294, base + offset * 10, 0xffffff); + fontRendererObj.drawString("- " + df.format(trueSpeed) + ", " + df.format(trueSpeed2), x, base + offset * 10, 0xffffff); offset++; if (stoneboundSpeed != 0) { String bloss = stoneboundSpeed > 0 ? StatCollector.translateToLocal("gui.toolstation4") : StatCollector.translateToLocal("gui.toolstation5"); - fontRendererObj.drawString(bloss + df.format(stoneboundSpeed), 294, base + offset * 10, 0xffffff); + fontRendererObj.drawString(bloss + df.format(stoneboundSpeed), x, base + offset * 10, 0xffffff); offset++; } offset++; - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation13"), 294, base + offset * 10, 0xffffff); + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation13"), x, base + offset * 10, 0xffffff); offset++; - fontRendererObj.drawString("- " + HarvestLevels.getHarvestLevelName(tags.getInteger("HarvestLevel")) + ", " + HarvestLevels.getHarvestLevelName(tags.getInteger("HarvestLevel2")), 294, base + offset * 10, 0xffffff); + fontRendererObj.drawString("- " + HarvestLevels.getHarvestLevelName(tags.getInteger("HarvestLevel")) + ", " + HarvestLevels.getHarvestLevelName(tags.getInteger("HarvestLevel2")), x, base + offset * 10, 0xffffff); offset++; offset++; } @@ -322,15 +340,15 @@ else if (categories.contains("harvest")) trueSpeed += stoneboundSpeed; if (trueSpeed < 0) trueSpeed = 0; - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation14") + df.format(trueSpeed), 294, base + offset * 10, 0xffffff); + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation14") + df.format(trueSpeed), x, base + offset * 10, 0xffffff); offset++; if (stoneboundSpeed != 0 && !Float.isNaN(stoneboundSpeed)) { String bloss = stoneboundSpeed > 0 ? StatCollector.translateToLocal("gui.toolstation4") : StatCollector.translateToLocal("gui.toolstation5"); - fontRendererObj.drawString(bloss + df.format(stoneboundSpeed), 294, base + offset * 10, 0xffffff); + fontRendererObj.drawString(bloss + df.format(stoneboundSpeed), x, base + offset * 10, 0xffffff); offset++; } - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation15") + HarvestLevels.getHarvestLevelName(tags.getInteger("HarvestLevel")), 294, base + offset * 10, 0xffffff); + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation15") + HarvestLevels.getHarvestLevelName(tags.getInteger("HarvestLevel")), x, base + offset * 10, 0xffffff); offset++; offset++; } @@ -338,7 +356,7 @@ else if (categories.contains("utility")) { float mineSpeed = tags.getInteger("MiningSpeed"); float trueSpeed = mineSpeed / (100f); - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation16") + trueSpeed, 294, base + offset * 10, 0xffffff); + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation16") + trueSpeed, x, base + offset * 10, 0xffffff); offset++; offset++; } @@ -346,12 +364,130 @@ else if (categories.contains("utility")) int modifiers = tags.getInteger("Modifiers"); if (modifiers > 0) { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation18") + tags.getInteger("Modifiers"), 294, base + offset * 10, 0xffffff); + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation18") + tags.getInteger("Modifiers"), x, base + offset * 10, 0xffffff); + offset++; + } + if (tags.hasKey("Tooltip1")) + { + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation17"), x, base + offset * 10, 0xffffff); + } + + boolean displayToolTips = true; + int tipNum = 0; + while (displayToolTips) + { + tipNum++; + String tooltip = "ModifierTip" + tipNum; + if (tags.hasKey(tooltip)) + { + String tipName = tags.getString(tooltip); + fontRendererObj.drawString("- " + tipName, x, base + (offset + tipNum) * 10, 0xffffff); + } + else + displayToolTips = false; + } + } + + private static DecimalFormat df = new DecimalFormat("##.#"); + + // todo: do this properly, quick and dirty fix + protected void drawModularArmorStats (ItemStack stack, ArmorCore armor, NBTTagCompound tags, int x, int y) + { + List categories = Arrays.asList(armor.getTraits()); + int base = y; + int offset = 0; + + // durability + final int durability = tags.getInteger("Damage"); + final int maxDur = tags.getInteger("TotalDurability"); + int availableDurability = maxDur - durability; + + // Durability + if (maxDur > 0) + { + if (maxDur >= 10000) + { + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation1"), x, base + offset * 11, 0xffffff); + offset++; + fontRendererObj.drawString("- " + availableDurability + "/" + maxDur, x, base + offset * 10, 0xffffff); + offset++; + } + else + { + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation2") + availableDurability + "/" + maxDur, x, base + offset * 10, 0xffffff); + offset++; + } + } + // Damage reduction + double damageReduction = tags.getDouble("DamageReduction"); + if(damageReduction > 0.000001d) + { + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation19") + df.format(damageReduction), x, base + offset * 10, 0xffffff); + offset++; + } + + // Protection + double protection = armor.getProtection(stack); + double maxProtection = tags.getDouble("MaxDefense"); + //if(maxProtection > protection) + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation20") + df.format(protection) + "/" + df.format(maxProtection), 294, base + offset * 10, 0xffffff); + //else + // fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation20") + df.format(protection), x, base + offset * 10, 0xffffff); + offset++; + + offset++; + int modifiers = tags.getInteger("Modifiers"); + if (modifiers > 0) + { + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation18") + tags.getInteger("Modifiers"), x, base + offset * 10, 0xffffff); + offset++; + } + if (tags.hasKey("Tooltip1")) + { + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation17"), x, base + offset * 10, 0xffffff); + } + + boolean displayToolTips = true; + int tipNum = 0; + while (displayToolTips) + { + tipNum++; + String tooltip = "ModifierTip" + tipNum; + if (tags.hasKey(tooltip)) + { + String tipName = tags.getString(tooltip); + fontRendererObj.drawString("- " + tipName, x, base + (offset + tipNum) * 10, 0xffffff); + } + else + displayToolTips = false; + } + } + + // todo: also quick and dirty fix + protected void drawModularAccessoryStats (ItemStack stack, AccessoryCore accessory, NBTTagCompound tags, int x, int y) + { + List categories = Arrays.asList(accessory.getTraits()); + int base = y; + int offset = 0; + + if (categories.contains("utility")) + { + float mineSpeed = tags.getInteger("MiningSpeed"); + float trueSpeed = mineSpeed / (100f); + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation16") + trueSpeed, x, base + offset * 10, 0xffffff); + offset++; + } + + offset++; + int modifiers = tags.getInteger("Modifiers"); + if (modifiers > 0) + { + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation18") + tags.getInteger("Modifiers"), x, base + offset * 10, 0xffffff); offset++; } if (tags.hasKey("Tooltip1")) { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation17"), 294, base + offset * 10, 0xffffff); + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation17"), x, base + offset * 10, 0xffffff); } boolean displayToolTips = true; @@ -363,14 +499,14 @@ else if (categories.contains("utility")) if (tags.hasKey(tooltip)) { String tipName = tags.getString(tooltip); - fontRendererObj.drawString("- " + tipName, 294, base + (offset + tipNum) * 10, 0xffffff); + fontRendererObj.drawString("- " + tipName, x, base + (offset + tipNum) * 10, 0xffffff); } else displayToolTips = false; } } - void drawToolInformation () + protected void drawToolInformation () { this.drawCenteredString(fontRendererObj, title, 349, 8, 0xffffff); fontRendererObj.drawSplitString(body, 294, 24, 115, 0xffffff);