Advertisement
jarppaaja

PercentCDR

Aug 11th, 2019
491
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.23 KB | None | 0 0
  1. // PercentCDR.cs "$Revision: 2592 $" "$Date: 2019-09-23 19:59:38 +0300 (ma, 23 syys 2019) $"
  2. // https://www.ownedcore.com/forums/diablo-3/turbohud/turbohud-community-plugins/796632-cdr-rcr-percent-plugin.html
  3. // https://pastebin.com/3s40U47n
  4. using System;
  5. using System.Globalization;
  6. using System.Linq;
  7. using SharpDX;
  8. using Turbo.Plugins.Default;
  9.  
  10. namespace Turbo.Plugins.JarJar.DefaultUI
  11. {
  12.     public class PercentCDR : BasePlugin, IInGameTopPainter
  13.     {
  14.         public bool ShowCooldownReduction { get; set; } = true;
  15.         public bool ShowCooldownReductionItems { get; set; } = true;
  16.         public bool ShowResourceCostReduction { get; set; } = true;
  17.         public bool ShowResourceCostReductionItems { get; set; } = true;
  18.  
  19.         public IFont LabelHeader { get; set; }
  20.         public IFont LabelCDR { get; set; }
  21.         public IFont PerfectCDR { get; set; }
  22.         public IFont LabelRCR { get; set; }
  23.         public IFont PerfectRCR { get; set; }
  24.         public IFont CanNotEnchantFont { get; set; }
  25.         public float RcrOffset = 15f;   // Works with tahoma 6 pt.
  26.  
  27.         public string FormatCdrRcr { get; set; } = "CDR {0:0.00} % RCR {1:0.00} %";
  28.         public string FormatCdr { get; set; } = "CDR {0:0.00} %";
  29.         public string FormatCdrItem { get; set; } = "{0:0}";
  30.         public string FormatRcr { get; set; } = "RCR {0:0.00} %";
  31.         public string FormatRcrItem { get; set; } = "{0:0}";
  32.         public string EnchantMoreMarker { get; set; } = "+";
  33.         public string CanNotEnchantMarker { get; set; } = "0";
  34.  
  35.         public float InventoryHeaderRatioX { get; set; } = 0.08f;
  36.         public float InventoryHeaderRatioY { get; set; } = 0.12f;
  37.  
  38.         private float rv;
  39.  
  40.         public PercentCDR() { Enabled = true; Order = 100; }
  41.  
  42.         public override void Load(IController hud)
  43.         {
  44.             base.Load(hud);
  45.  
  46.             Color textColor;
  47.             textColor = Color.White;
  48.             LabelHeader = Hud.Render.CreateFont("tahoma", 6, 255, textColor.R, textColor.G, textColor.B, true, false, 255, 0, 0, 0, true);
  49.  
  50.             textColor = Color.White;
  51.             LabelCDR = Hud.Render.CreateFont("tahoma", 6, 255, textColor.R, textColor.G, textColor.B, true, false, 255, 0, 0, 0, true);
  52.             textColor = Color.LawnGreen;
  53.             PerfectCDR = Hud.Render.CreateFont("tahoma", 6, 255, textColor.R, textColor.G, textColor.B, true, false, 255, 0, 0, 0, true);
  54.  
  55.             textColor = Color.White;
  56.             LabelRCR = Hud.Render.CreateFont("tahoma", 6, 255, textColor.R, textColor.G, textColor.B, true, false, 255, 0, 0, 0, true);
  57.             textColor = Color.LawnGreen;
  58.             PerfectRCR = Hud.Render.CreateFont("tahoma", 6, 255, textColor.R, textColor.G, textColor.B, true, false, 255, 0, 0, 0, true);
  59.  
  60.             textColor = Color.Firebrick;
  61.             CanNotEnchantFont = Hud.Render.CreateFont("tahoma", 6, 255, textColor.R, textColor.G, textColor.B, true, false, 255, 0, 0, 0, true);
  62.         }
  63.  
  64.         public void PaintTopInGame(ClipState clipState)
  65.         {
  66.             if (clipState != ClipState.Inventory) return;
  67.             if (!Hud.Game.IsInTown) return;
  68.  
  69.             var uiInv = Hud.Inventory.InventoryMainUiElement;
  70.             if (!uiInv.Visible) return;
  71.             var player = Hud.Game.Me;
  72.  
  73.             rv = 32.0f / 600.0f * Hud.Window.Size.Height;
  74.  
  75.             if (ShowCooldownReductionItems || ShowResourceCostReductionItems)
  76.             {
  77.                 var equippedItems = Hud.Game.Items.Where(x => x.Location >= ItemLocation.Head && x.Location <= ItemLocation.Neck);
  78.                 foreach (var item in equippedItems)
  79.                 {
  80.                     var rect = Hud.Inventory.GetItemRect(item);
  81.                     if (rect == System.Drawing.RectangleF.Empty)
  82.                         continue;
  83.                     var cdrItem = (item.Location >= ItemLocation.RightHand && item.Location <= ItemLocation.Waist) || item.Location == ItemLocation.Shoulders ||
  84.                         (item.Location >= ItemLocation.LeftRing && item.Location <= ItemLocation.Neck);
  85.                     var code = item.SnoItem.Code;
  86.                     var rcrItem = !(code == "belt" || code == "boots" || code == "bracers" || code == "chestarmor" || code == "helm" || code == "pants");
  87.                     if (cdrItem || rcrItem)
  88.                     {
  89.                         handleItem(item, cdrItem, rcrItem, rect);
  90.                     }
  91.                 }
  92.             }
  93.             string labelText;
  94.             if (ShowCooldownReduction && ShowResourceCostReduction)
  95.             {
  96.                 labelText = string.Format(CultureInfo.InstalledUICulture, FormatCdrRcr, player.Stats.CooldownReduction * 100f, player.Stats.ResourceCostReduction * 100f);
  97.             }
  98.             else if (ShowCooldownReduction)
  99.             {
  100.                 labelText = string.Format(CultureInfo.InstalledUICulture, FormatCdr, player.Stats.CooldownReduction * 100f);
  101.             }
  102.             else if (ShowResourceCostReduction)
  103.             {
  104.                 labelText = string.Format(CultureInfo.InstalledUICulture, FormatRcr, player.Stats.ResourceCostReduction * 100f);
  105.             }
  106.             else
  107.             {
  108.                 return;
  109.             }
  110.             var xCoord = uiInv.Rectangle.Left + (uiInv.Rectangle.Width * InventoryHeaderRatioX);
  111.             var yCoord = uiInv.Rectangle.Top + (uiInv.Rectangle.Height * InventoryHeaderRatioY);
  112.             LabelHeader.DrawText(labelText, xCoord, yCoord);
  113.         }
  114.  
  115.         private void handleItem(IItem item, bool cdrItem, bool rcrItem, System.Drawing.RectangleF rect)
  116.         {
  117.             string cdrText = null;
  118.             var cdrFont = LabelCDR;
  119.             if (cdrItem)
  120.             {
  121.                 var needsMore = true;
  122.                 var perfection = item.Perfections?.FirstOrDefault(x => x.Attribute.Code == "Power_Cooldown_Reduction_Percent_All");
  123.                 if (perfection != null)
  124.                 {
  125.                     var isWeapon = item.SnoItem.HasGroupCode("weapons");
  126.                     var cdr = Math.Round(perfection.Cur * 100, 3);
  127.                     var cdrTest = Math.Round(perfection.Cur * 100, 0);
  128.                     needsMore = isWeapon ? (cdrTest < 10.0) : (cdrTest < 8.0);
  129.                     cdrText = string.Format(CultureInfo.InvariantCulture, FormatCdrItem, cdr);
  130.                     if (needsMore)
  131.                     {
  132.                         var enhancedItemMod = GetEnhancedItemMod(item);
  133.                         var isEnchanted = IsEnchantedFor(enhancedItemMod, perfection.Attribute.Code);
  134.                         if (isEnchanted)
  135.                         {
  136.                             cdrText += EnchantMoreMarker;
  137.                         }
  138.                     }
  139.                     else
  140.                     {
  141.                         cdrFont = PerfectCDR;
  142.                     }
  143.                 }
  144.                 else
  145.                 {
  146.                     var enhancedItemMod = GetEnhancedItemMod(item);
  147.                     if (enhancedItemMod == null)
  148.                     {
  149.                         cdrText = EnchantMoreMarker;
  150.                     }
  151.                     else
  152.                     {
  153.                         cdrText = CanNotEnchantMarker;
  154.                         cdrFont = CanNotEnchantFont;
  155.                     }
  156.                 }
  157.             }
  158.             string rcrText = null;
  159.             var rcrFont = LabelRCR;
  160.             if (rcrItem)
  161.             {
  162.                 var perfection = item.Perfections?.FirstOrDefault(x => x.Attribute.Code == "Resource_Cost_Reduction_Percent_All");
  163.                 if (perfection != null)
  164.                 {
  165.                     var isYang = item.SnoItem.NameEnglish == "Yang's Recurve";  // AFAIK the only exception!
  166.                     var rcr = Math.Round(perfection.Cur * 100, 3);
  167.                     var rcrTest = Math.Round(perfection.Cur * 100, 0);
  168.                     var needsMore = isYang ? (rcrTest < 50.0) : (rcrTest < 8.0);
  169.                     rcrText = string.Format(CultureInfo.InvariantCulture, FormatRcrItem, rcr);
  170.                     if (needsMore)
  171.                     {
  172.                         var enhancedItemMod = GetEnhancedItemMod(item);
  173.                         var isEnchanted = IsEnchantedFor(enhancedItemMod, perfection.Attribute.Code);
  174.                         if (isEnchanted)
  175.                         {
  176.                             rcrText += EnchantMoreMarker;
  177.                         }
  178.                     }
  179.                     else
  180.                     {
  181.                         rcrFont = PerfectRCR;
  182.                     }
  183.                 }
  184.                 else
  185.                 {
  186.                     var enhancedItemMod = GetEnhancedItemMod(item);
  187.                     if (enhancedItemMod == null)
  188.                     {
  189.                         rcrText = EnchantMoreMarker;
  190.                     }
  191.                     else
  192.                     {
  193.                         rcrText = CanNotEnchantMarker;
  194.                         rcrFont = CanNotEnchantFont;
  195.                     }
  196.                 }
  197.             }
  198.             // Top right corner.
  199.             if (cdrText != null)
  200.             {
  201.                 var layout = cdrFont.GetTextLayout(cdrText);
  202.                 cdrFont.DrawText(layout, rect.Right + (rv / 20.0f), rect.Top + (layout.Metrics.Height / 6f));
  203.                 if (RcrOffset == 0f)
  204.                 {
  205.                     RcrOffset = 1.05f * layout.Metrics.Height;
  206.                     Hud.Debug("RcrOffset " + RcrOffset.ToString());
  207.                 }
  208.             }
  209.             if (rcrText != null)
  210.             {
  211.                 var layout = rcrFont.GetTextLayout(rcrText);
  212.                 rcrFont.DrawText(layout, rect.Right + (rv / 20.0f), rect.Top + (layout.Metrics.Height / 6f) + RcrOffset);
  213.             }
  214.         }
  215.  
  216.         private static bool IsEnchantedFor(ISnoItemMod itemMod, string code)
  217.         {
  218.             return itemMod != null && itemMod.Attribute.Code == code;
  219.         }
  220.  
  221.         private static ISnoItemMod GetEnhancedItemMod(IItem item)
  222.         {
  223.             var affix = item.EnchantedAffixNew != 0 && item.Affixes != null ? item.Affixes.FirstOrDefault(x => x.Id == item.EnchantedAffixNew) : null;
  224.             return affix != null && affix.Mods.Length > 0 ? affix.Mods[0] : null;
  225.         }
  226.     }
  227. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement