diff --git a/java/squeek/tictooltips/TooltipHandler.java b/java/squeek/tictooltips/TooltipHandler.java index 4a4ebcf..f180817 100644 --- a/java/squeek/tictooltips/TooltipHandler.java +++ b/java/squeek/tictooltips/TooltipHandler.java @@ -624,6 +624,15 @@ public List getBowTooltip(ToolCore tool, NBTTagCompound toolTag, ItemSta if (ToolHelper.hasToolTag(currentAmmo) && currentAmmo.getItem() instanceof ToolCore) { toolTip.addAll(getWeaponTooltip((ToolCore) currentAmmo.getItem(), ToolHelper.getToolTag(currentAmmo), projectileWeapon.getProjectileSpeed(itemStack))); + + float[] critDamageRange = ToolHelper.getCriticalDamageRange((ToolCore) currentAmmo.getItem(), ToolHelper.getToolTag(currentAmmo), projectileWeapon.getProjectileSpeed(itemStack)); + if (critDamageRange[1] != 0) + { + EnumChatFormatting textColor = critDamageRange[0] >= 0 ? EnumChatFormatting.DARK_GREEN : EnumChatFormatting.DARK_RED; + String bonusOrLoss = (critDamageRange[0] >= 0 ? StringHelper.getLocalizedString("gui.toolstation4") : StringHelper.getLocalizedString("gui.toolstation5")); + bonusOrLoss = bonusOrLoss.substring(0, bonusOrLoss.length() - 2); + toolTip.add(EnumChatFormatting.DARK_GRAY + "- " + StatCollector.translateToLocalFormatted("tictooltips.tool.crit.damage", bonusOrLoss) + textColor + StringHelper.getDamageNumberString(critDamageRange[0]) + "-" + StringHelper.getDamageString(critDamageRange[1])); + } } else if (currentAmmo.getItem() == Items.arrow) { diff --git a/java/squeek/tictooltips/helpers/StringHelper.java b/java/squeek/tictooltips/helpers/StringHelper.java index 5b81647..63b92ba 100644 --- a/java/squeek/tictooltips/helpers/StringHelper.java +++ b/java/squeek/tictooltips/helpers/StringHelper.java @@ -33,11 +33,21 @@ public static String getDamageString(int attack) return damageNum + heart; } + public static String getDamageString(float attack) + { + return getDamageString((int) attack); + } + public static String getDamageNumberString(int attack) { return df.format(attack / 2f); } + public static String getDamageNumberString(float attack) + { + return getDamageNumberString((int) attack); + } + public static String getShoddinessTypeString(float shoddiness) { return shoddiness > 0 ? StringHelper.getLocalizedString("material.stone.ability") : (shoddiness < 0 ? StringHelper.getLocalizedString("material.cactus.ability") : ""); diff --git a/java/squeek/tictooltips/helpers/ToolHelper.java b/java/squeek/tictooltips/helpers/ToolHelper.java index 2e7fc2a..090acd6 100644 --- a/java/squeek/tictooltips/helpers/ToolHelper.java +++ b/java/squeek/tictooltips/helpers/ToolHelper.java @@ -9,6 +9,7 @@ import tconstruct.library.tools.HarvestTool; import tconstruct.library.tools.ToolCore; import tconstruct.library.tools.ToolMaterial; +import tconstruct.library.weaponry.AmmoItem; import tconstruct.library.weaponry.AmmoWeapon; import tconstruct.library.weaponry.IAmmo; import tconstruct.tools.TinkerTools; @@ -152,7 +153,25 @@ public static int getRawDamage(ToolCore tool, NBTTagCompound toolTag) public static int getDamage(ToolCore tool, NBTTagCompound toolTag, float damageModifier) { - float attack = toolTag.getInteger("Attack") * damageModifier; + return (int) getPreciseDamage(tool, toolTag, damageModifier); + } + + public static float getPreciseDamage(ToolCore tool, NBTTagCompound toolTag, float damageModifier) + { + float attack; + if ((Item) tool instanceof AmmoItem && toolTag.hasKey("BaseAttack")) + { + float baseAttack = toolTag.getInteger("BaseAttack"); + float totalAttack = toolTag.getInteger("Attack"); + attack = baseAttack * damageModifier; // damageModifier is the projectile speed here + + // add quartz damage + attack += (totalAttack - baseAttack); + + attack = Math.max(0, attack - totalAttack / 2f); + } + else + attack = toolTag.getInteger("Attack") * damageModifier; attack += getShoddinessDamageBonus(tool, toolTag); attack *= tool.getDamageModifier(); if (tool instanceof AmmoWeapon) @@ -162,12 +181,29 @@ public static int getDamage(ToolCore tool, NBTTagCompound toolTag, float damageM if (attack < 1) attack = 1; - return (int) attack; + return attack; } public static int getDamage(ToolCore tool, NBTTagCompound toolTag) { - return getDamage(tool, toolTag, 1f); + return (int) getPreciseDamage(tool, toolTag); + } + + public static float getPreciseDamage(ToolCore tool, NBTTagCompound toolTag) + { + return getPreciseDamage(tool, toolTag, 1f); + } + + public static float[] getCriticalDamageRange(ToolCore tool, NBTTagCompound toolTag, float damageModifier) + { + float attack = getPreciseDamage(tool, toolTag, damageModifier); + + // the real formula (from ProjectileBase.onHitEntity): + // (this.rand.nextFloat()/4f + Math.min(0.75f, distance/25f)) * (damage / 2f + 2f); + float minCritDamage = 0.0f; + float maxCritDamage = (1.0f / 4f + 0.75f) * (attack / 2f + 2f); + + return new float[]{minCritDamage, maxCritDamage}; } public static int getSprintDamage(ToolCore tool, NBTTagCompound toolTag) diff --git a/resources/assets/tictooltips/lang/en_US.lang b/resources/assets/tictooltips/lang/en_US.lang index e7f6661..f21498c 100644 --- a/resources/assets/tictooltips/lang/en_US.lang +++ b/resources/assets/tictooltips/lang/en_US.lang @@ -23,6 +23,7 @@ tictooltips.tool.chance.to.behead=Chance to Behead: tictooltips.tool.modifiers=Modifiers: tictooltips.tool.knockback=Knockback: tictooltips.tool.sprint.damage=Sprint Damage: +tictooltips.tool.crit.damage=Crit Damage %s: # generic tictooltips.minimum=Min