Code:
// PercentCDR.cs "$Revision: 2592 $" "$Date: 2019-09-23 19:59:38 +0300 (ma, 23 syys 2019) $"
// https://www.ownedcore.com/forums/diablo-3/turbohud/turbohud-community-plugins/796632-cdr-rcr-percent-plugin.html
// https://pastebin.com/3s40U47n
using System;
using System.Globalization;
using System.Linq;
using SharpDX;
using Turbo.Plugins.Default;
namespace Turbo.Plugins.JarJar
{
public class PercentCDR : BasePlugin, IInGameTopPainter
{
public bool ShowCooldownReduction { get; set; } = true;
public bool ShowCooldownReductionItems { get; set; } = true;
public bool ShowResourceCostReduction { get; set; } = true;
public bool ShowResourceCostReductionItems { get; set; } = true;
public IFont LabelHeader { get; set; }
public IFont LabelCDR { get; set; }
public IFont PerfectCDR { get; set; }
public IFont LabelRCR { get; set; }
public IFont PerfectRCR { get; set; }
public IFont CanNotEnchantFont { get; set; }
public float RcrOffset = 15f; // Works with tahoma 6 pt.
public string FormatCdrRcr { get; set; } = "CDR {0:0.00} % RCR {1:0.00} %";
public string FormatCdr { get; set; } = "CDR {0:0.00} %";
public string FormatCdrItem { get; set; } = "{0:0}";
public string FormatRcr { get; set; } = "RCR {0:0.00} %";
public string FormatRcrItem { get; set; } = "{0:0}";
public string EnchantMoreMarker { get; set; } = "+";
public string CanNotEnchantMarker { get; set; } = "0";
public float InventoryHeaderRatioX { get; set; } = 0.08f;
public float InventoryHeaderRatioY { get; set; } = 0.12f;
private float rv;
public PercentCDR() { Enabled = true; Order = 100; }
public override void Load(IController hud)
{
base.Load(hud);
Color textColor;
textColor = Color.White;
LabelHeader = Hud.Render.CreateFont("tahoma", 6, 255, textColor.R, textColor.G, textColor.B, true, false, 255, 0, 0, 0, true);
textColor = Color.White;
LabelCDR = Hud.Render.CreateFont("tahoma", 6, 255, textColor.R, textColor.G, textColor.B, true, false, 255, 0, 0, 0, true);
textColor = Color.LawnGreen;
PerfectCDR = Hud.Render.CreateFont("tahoma", 6, 255, textColor.R, textColor.G, textColor.B, true, false, 255, 0, 0, 0, true);
textColor = Color.White;
LabelRCR = Hud.Render.CreateFont("tahoma", 6, 255, textColor.R, textColor.G, textColor.B, true, false, 255, 0, 0, 0, true);
textColor = Color.LawnGreen;
PerfectRCR = Hud.Render.CreateFont("tahoma", 6, 255, textColor.R, textColor.G, textColor.B, true, false, 255, 0, 0, 0, true);
textColor = Color.Firebrick;
CanNotEnchantFont = Hud.Render.CreateFont("tahoma", 6, 255, textColor.R, textColor.G, textColor.B, true, false, 255, 0, 0, 0, true);
}
public void PaintTopInGame(ClipState clipState)
{
if (clipState != ClipState.Inventory)
return;
if (!Hud.Game.IsInTown)
return;
var uiInv = Hud.Inventory.InventoryMainUiElement;
if (!uiInv.Visible)
return;
var player = Hud.Game.Me;
rv = 32.0f / 600.0f * Hud.Window.Size.Height;
if (ShowCooldownReductionItems || ShowResourceCostReductionItems)
{
var equippedItems = Hud.Game.Items.Where(x => x.Location >= ItemLocation.Head && x.Location <= ItemLocation.Neck);
foreach (var item in equippedItems)
{
var rect = Hud.Inventory.GetItemRect(item);
if (rect == System.Drawing.RectangleF.Empty)
continue;
var cdrItem = (item.Location >= ItemLocation.RightHand && item.Location <= ItemLocation.Waist) || item.Location == ItemLocation.Shoulders ||
(item.Location >= ItemLocation.LeftRing && item.Location <= ItemLocation.Neck);
var code = item.SnoItem.Code.ToLower();
var rcrItem = !(code.Contains("belt") || code.Contains("boots") || code.Contains("bracer") || code.Contains("chest") || code.Contains("helm") || code.Contains("pants"));
if (cdrItem || rcrItem)
{
handleItem(item, cdrItem, rcrItem, rect);
}
}
}
string labelText;
if (ShowCooldownReduction && ShowResourceCostReduction)
{
labelText = string.Format(CultureInfo.InstalledUICulture, FormatCdrRcr, player.Stats.CooldownReduction * 100f, player.Stats.ResourceCostReduction * 100f);
}
else if (ShowCooldownReduction)
{
labelText = string.Format(CultureInfo.InstalledUICulture, FormatCdr, player.Stats.CooldownReduction * 100f);
}
else if (ShowResourceCostReduction)
{
labelText = string.Format(CultureInfo.InstalledUICulture, FormatRcr, player.Stats.ResourceCostReduction * 100f);
}
else
{
return;
}
var xCoord = uiInv.Rectangle.Left + (uiInv.Rectangle.Width * InventoryHeaderRatioX);
var yCoord = uiInv.Rectangle.Top + (uiInv.Rectangle.Height * InventoryHeaderRatioY);
LabelHeader.DrawText(labelText, xCoord, yCoord);
}
private void handleItem(IItem item, bool cdrItem, bool rcrItem, System.Drawing.RectangleF rect)
{
string cdrText = null;
var cdrFont = LabelCDR;
if (cdrItem)
{
var perfection = item.Perfections?.FirstOrDefault(x => x.Attribute.Code == "Power_Cooldown_Reduction_Percent_All");
if (perfection != null)
{
var cdr = Math.Round(perfection.Cur * 100, 3);
var cdrTest = Math.Round(perfection.Cur * 100, 0);
var isWeapon = item.SnoItem.HasGroupCode("weapons");
var needsMore = isWeapon ? (cdrTest < 10.0) : (cdrTest < 8.0);
cdrText = string.Format(CultureInfo.InvariantCulture, FormatCdrItem, cdr);
if (needsMore)
{
var enhancedItemMod = GetEnhancedItemMod(item);
var isEnchanted = IsEnchantedFor(enhancedItemMod, perfection.Attribute.Code);
if (isEnchanted)
{
cdrText += EnchantMoreMarker;
}
}
else
{
cdrFont = PerfectCDR;
}
}
else if (item.StatList != null)
{
foreach (var stat in item.StatList)
{
if (stat.Id == "cdred")
{
var cdr = stat.DoubleValue;
var cdrTest = cdr;
var isWeapon = item.SnoItem.HasGroupCode("weapons");
var needsMore = isWeapon ? (cdrTest < 10.0) : (cdrTest < 8.0);
cdrText = string.Format(CultureInfo.InvariantCulture, FormatCdrItem, cdr);
if (needsMore)
{
var enhancedItemMod = GetEnhancedItemMod(item);
var isEnchanted = IsEnchantedFor(enhancedItemMod, stat.Attribute.Code);
if (isEnchanted)
{
cdrText += EnchantMoreMarker;
}
}
else
{
cdrFont = PerfectCDR;
}
}
}
}
else
{
var enhancedItemMod = GetEnhancedItemMod(item);
if (enhancedItemMod == null)
{
cdrText = EnchantMoreMarker;
}
else
{
cdrText = CanNotEnchantMarker;
cdrFont = CanNotEnchantFont;
}
}
}
string rcrText = null;
var rcrFont = LabelRCR;
if (rcrItem)
{
var perfection = item.Perfections?.FirstOrDefault(x => x.Attribute.Code == "Resource_Cost_Reduction_Percent_All");
if (perfection != null)
{
var isYang = item.SnoItem.NameEnglish == "Yang's Recurve"; // AFAIK the only exception!
var rcr = Math.Round(perfection.Cur * 100, 3);
var rcrTest = Math.Round(perfection.Cur * 100, 0);
var needsMore = isYang ? (rcrTest < 50.0) : (rcrTest < 8.0);
rcrText = string.Format(CultureInfo.InvariantCulture, FormatRcrItem, rcr);
if (needsMore)
{
var enhancedItemMod = GetEnhancedItemMod(item);
var isEnchanted = IsEnchantedFor(enhancedItemMod, perfection.Attribute.Code);
if (isEnchanted)
{
rcrText += EnchantMoreMarker;
}
}
else
{
rcrFont = PerfectRCR;
}
}
else if (item.StatList != null)
{
foreach (var stat in item.StatList)
{
if (stat.Id == "rescostred")
{
var rcr = stat.DoubleValue;
var rcrTest = rcr;
var isYang = item.SnoItem.NameEnglish == "Yang's Recurve"; // AFAIK the only exception!
var needsMore = isYang ? (rcrTest < 50.0) : (rcrTest < 8.0);
rcrText = string.Format(CultureInfo.InvariantCulture, FormatCdrItem, rcr);
if (needsMore)
{
var enhancedItemMod = GetEnhancedItemMod(item);
var isEnchanted = IsEnchantedFor(enhancedItemMod, stat.Attribute.Code);
if (isEnchanted)
{
rcrText += EnchantMoreMarker;
}
}
else
{
rcrFont = PerfectRCR;
}
}
}
}
else
{
var enhancedItemMod = GetEnhancedItemMod(item);
if (enhancedItemMod == null)
{
rcrText = EnchantMoreMarker;
}
else
{
rcrText = CanNotEnchantMarker;
rcrFont = CanNotEnchantFont;
}
}
}
// Top right corner.
if (cdrText != null)
{
var layout = cdrFont.GetTextLayout(cdrText);
cdrFont.DrawText(layout, rect.Right + (rv / 20.0f), rect.Top + (layout.Metrics.Height / 6f));
if (RcrOffset == 0f)
{
RcrOffset = 1.05f * layout.Metrics.Height;
//Hud.Debug("RcrOffset " + RcrOffset.ToString());
}
}
if (rcrText != null)
{
var layout = rcrFont.GetTextLayout(rcrText);
rcrFont.DrawText(layout, rect.Right + (rv / 20.0f), rect.Top + (layout.Metrics.Height / 6f) + RcrOffset);
}
}
private static bool IsEnchantedFor(ISnoItemMod itemMod, string code)
{
return itemMod != null && itemMod.Attribute.Code == code;
}
private static ISnoItemMod GetEnhancedItemMod(IItem item)
{
var affix = item.EnchantedAffixNew != 0 && item.Affixes != null ? item.Affixes.FirstOrDefault(x => x.Id == item.EnchantedAffixNew) : null;
return affix != null && affix.Mods.Length > 0 ? affix.Mods[0] : null;
}
}
}
I was too lazy to refactor the method that checks the value, I'm sorry