s4000

DAV_COE

Jun 11th, 2019
1,740
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Globalization;
  4. using System.Linq;
  5. using Turbo.Plugins.Default;
  6.  
  7. namespace Turbo.Plugins.DavPlayer
  8. {
  9.     public class DAV_COE : BasePlugin, IInGameTopPainter, ICustomizer {
  10.         public float offsetX { get; set; } = 0.45f; // Percent-X pos me
  11.         public float offsetY { get; set; } = 0.65f; // Percent-Y pos me
  12.         public bool ShowParty { get; set; } = true;
  13.         public float partyOffsetX { get; set; } = 0.00f; // Percent-X pos for other players
  14.         public float partyOffsetY { get; set; } = 0.18f; // Percent-Y pos for other players -0.27 for default plug-in
  15.  
  16.         public float CoeBarH { get; set; } = 10.0f; // COE bar height
  17.         public bool ShowCoeTime { get; set; } = true; // Show time until highest elemental
  18.         public string CoeMaxIndicator { get; set; } = "Max";
  19.         public IFont CoeTimeFont { get; set; }
  20.         public GroundLabelDecorator AttackFont1 { get; set; }
  21.         public GroundLabelDecorator AttackFont2 { get; set; }
  22.         public float MeOffsetX { get; set; } = -10f;
  23.         public float MeOffsetY { get; set; } = -10f;
  24.        
  25.         public IBrush BackgroundBrush { get; set; }
  26.         public IBrush GreenBrush { get; set; }
  27.         public IBrush YellowBrush { get; set; }
  28.         public IBrush RedBrush { get; set; }
  29.         public BuffPainter COEPainter { get; set; }
  30.         private BuffRuleCalculator CoeRuleCalculator;
  31.        
  32.         public bool SpeakOK { get; set; } = true;
  33.         public double VolumeMultiplier { get; set; } = 2.0; // Set to 1 for default volume, -1 to disable setting.
  34.         public double Attacktime2 { get; set; } = 4.0; // for other player, change to yellow bar before max bonus      
  35.         public Dictionary<HeroClass, Tuple<double, string, int, int>> TimeRule { get; set; }
  36.        
  37.         public DAV_COE() {
  38.             Enabled = true;
  39.         }
  40.  
  41.         public override void Load(IController hud) {
  42.             base.Load(hud);
  43.            
  44.             if (VolumeMultiplier > 0 && Hud.Sound.VolumeMultiplier != VolumeMultiplier)
  45.                 Hud.Sound.VolumeMultiplier = VolumeMultiplier;
  46.            
  47.             CoeTimeFont = Hud.Render.CreateFont("arial", 9, 255, 255, 255, 255, false, false, 255, 0, 0, 0, true);
  48.             AttackFont1 = new GroundLabelDecorator(hud) {
  49.                 TextFont = Hud.Render.CreateFont("arial", 15, 255, 255, 255, 51, true, true, 255, 255, 51, 51, true),
  50.             };
  51.            
  52.             AttackFont2 = new GroundLabelDecorator(hud) {
  53.                 TextFont = Hud.Render.CreateFont("arial", 15, 255, 255, 51, 51, true, true, 255, 255, 255, 51, true),
  54.             };
  55.            
  56.             BackgroundBrush = Hud.Render.CreateBrush(255, 200, 200, 200, 0);
  57.             GreenBrush = Hud.Render.CreateBrush(240, 128, 255, 0, 0);
  58.             YellowBrush = Hud.Render.CreateBrush(240, 255, 255, 102, 0);
  59.             RedBrush = Hud.Render.CreateBrush(240, 255, 51, 51, 0);
  60.            
  61.             // attack time before max bonus | the message | role of your character | message type
  62.             // Role :   -2 no speak
  63.             //          -1 speak all the time except in town
  64.             //           0 speak all the time in GR
  65.             //           1 speak as trash killer in GR
  66.             //           2 speak as RGK in GR
  67.             // Message type :   -1 none
  68.             //                   0 text
  69.             //                   1 sound
  70.             //                   2 sound + text
  71.             TimeRule = new Dictionary<HeroClass, Tuple<double, string, int, int>> {
  72.                 {HeroClass.Barbarian, new Tuple<double, string, int, int>(4.0, "Attack", 0, 2)},
  73.                 {HeroClass.Monk, new Tuple<double, string, int, int>(4.0, "Attack", 0, 2)},
  74.                 {HeroClass.Necromancer, new Tuple<double, string, int, int>(1.0, "Charge", 2, 2)},
  75.                 {HeroClass.Wizard, new Tuple<double, string, int, int>(4.0, "Attack", 1, 2)},
  76.                 {HeroClass.WitchDoctor, new Tuple<double, string, int, int>(4.0, "Attack", 0, 2)},
  77.                 {HeroClass.Crusader, new Tuple<double, string, int, int>(4.0, "Attack", 0, 2)},
  78.                 {HeroClass.DemonHunter, new Tuple<double, string, int, int>(1.0, "Attack", 0, 2)}
  79.             };
  80.  
  81.             COEPainter = new BuffPainter(Hud, true) {
  82.                 Opacity = 1.0f,
  83.                 TimeLeftFont = Hud.Render.CreateFont("arial", 9, 255, 255, 255, 255, true, false, 255, 0, 0, 0, true),
  84.             };
  85.            
  86.             CoeRuleCalculator = new BuffRuleCalculator(Hud) { SizeMultiplier = 0.85f };
  87.             CoeRuleCalculator.Rules.Add(new BuffRule(430674) { IconIndex = 1, MinimumIconCount = 0, DisableName = true }); // Arcane
  88.             CoeRuleCalculator.Rules.Add(new BuffRule(430674) { IconIndex = 2, MinimumIconCount = 0, DisableName = true }); // Cold
  89.             CoeRuleCalculator.Rules.Add(new BuffRule(430674) { IconIndex = 3, MinimumIconCount = 0, DisableName = true }); // Fire
  90.             CoeRuleCalculator.Rules.Add(new BuffRule(430674) { IconIndex = 4, MinimumIconCount = 0, DisableName = true }); // Holy
  91.             CoeRuleCalculator.Rules.Add(new BuffRule(430674) { IconIndex = 5, MinimumIconCount = 0, DisableName = true }); // Lightning
  92.             CoeRuleCalculator.Rules.Add(new BuffRule(430674) { IconIndex = 6, MinimumIconCount = 0, DisableName = true }); // Physical
  93.             CoeRuleCalculator.Rules.Add(new BuffRule(430674) { IconIndex = 7, MinimumIconCount = 0, DisableName = true }); // Poison
  94.         }
  95.  
  96.         private IEnumerable<BuffRule> GetCurrentRules(HeroClass heroClass) {
  97.             for (int i = 1; i <= 7; i++) {
  98.                 switch (heroClass) {
  99.                     case HeroClass.Barbarian: if (i == 1 || i == 4 || i == 7) continue; break;
  100.                     case HeroClass.Crusader: if (i == 1 || i == 2 || i == 7) continue; break;
  101.                     case HeroClass.DemonHunter: if (i == 1 || i == 4 || i == 7) continue; break;
  102.                     case HeroClass.Monk: if (i == 1 || i == 7) continue; break;
  103.                     case HeroClass.Necromancer: if (i == 1 || i == 3 || i == 4 || i == 5) continue; break;
  104.                     case HeroClass.WitchDoctor: if (i == 1 || i == 4 || i == 5) continue; break;
  105.                     case HeroClass.Wizard: if (i == 4 || i == 6 || i == 7) continue; break;
  106.                 }
  107.                 yield return CoeRuleCalculator.Rules[i - 1];
  108.             }
  109.         }
  110.  
  111.         public void PaintTopInGame(ClipState clipState) {
  112.             if (clipState != ClipState.BeforeClip) return;
  113.  
  114.             foreach (var player in Hud.Game.Players) {
  115.                 if (!player.HasValidActor) continue;
  116.                 if (!player.IsMe && !ShowParty) continue;
  117.  
  118.                 var buff = player.Powers.GetBuff(430674);
  119.                 if ((buff == null) || (buff.IconCounts[0] <= 0)) continue;
  120.  
  121.                 var classSpecificRules = GetCurrentRules(player.HeroClassDefinition.HeroClass);
  122.                 CoeRuleCalculator.CalculatePaintInfo(player, classSpecificRules);
  123.  
  124.                 var NumElement = CoeRuleCalculator.PaintInfoList.Count;
  125.                 var best = false;
  126.                 var maxindex = 0;
  127.                 var curindex = 0;
  128.                 var timeLeft = 0.0d;
  129.                 var highestElementalBonus = player.Offense.HighestElementalDamageBonus;
  130.                 for (int i = NumElement - 1; i >= 0; i--) {
  131.                     var info = CoeRuleCalculator.PaintInfoList[i];
  132.                    
  133.                     switch (info.Rule.IconIndex) {
  134.                         case 1: best = player.Offense.BonusToArcane == highestElementalBonus; break;
  135.                         case 2: best = player.Offense.BonusToCold == highestElementalBonus; break;
  136.                         case 3: best = player.Offense.BonusToFire == highestElementalBonus; break;
  137.                         case 4: best = player.Offense.BonusToHoly == highestElementalBonus; break;
  138.                         case 5: best = player.Offense.BonusToLightning == highestElementalBonus; break;
  139.                         case 6: best = player.Offense.BonusToPhysical == highestElementalBonus; break;
  140.                         case 7: best = player.Offense.BonusToPoison == highestElementalBonus; break;
  141.                     }
  142.                    
  143.                     if (best && maxindex == 0) { maxindex = i + 1; }
  144.                     if (info.TimeLeft > 0.0f) {
  145.                         curindex = i + 1;
  146.                         timeLeft = curindex * 4d - info.TimeLeft;
  147.                     }
  148.                 }
  149.                
  150.                 if (maxindex < curindex) timeLeft -= maxindex * 4;
  151.                 else timeLeft += (NumElement - maxindex) * 4;
  152.                
  153.                 for (int i = 0; i < maxindex; i++) {
  154.                     var info = CoeRuleCalculator.PaintInfoList[0];
  155.                     CoeRuleCalculator.PaintInfoList.RemoveAt(0);
  156.                     CoeRuleCalculator.PaintInfoList.Add(info);
  157.                 }
  158.  
  159.                 var barW = CoeRuleCalculator.StandardIconSize * NumElement;
  160.                 var barH = CoeBarH;
  161.                 var timeW = NumElement * 4;
  162.                 var eleW = (float) timeLeft / timeW * barW;
  163.                
  164.                 float x, y;
  165.                 double timeyellow;
  166.                
  167.                 if (player.IsMe) {
  168.                     x = Hud.Window.Size.Width * offsetX;
  169.                     y = Hud.Window.Size.Height * offsetY;
  170.                     timeyellow = timeW - 4 - TimeRule[player.HeroClassDefinition.HeroClass].Item1;
  171.                 }
  172.                 else {
  173.                     var portraitRect = player.PortraitUiElement.Rectangle;
  174.                     x = portraitRect.Right + portraitRect.Width * partyOffsetX;
  175.                     y = portraitRect.Top + portraitRect.Height * partyOffsetY;
  176.                     timeyellow = timeW - 4 - Attacktime2;
  177.                 }
  178.                
  179.                 COEPainter.PaintHorizontal(CoeRuleCalculator.PaintInfoList, x, y, CoeRuleCalculator.StandardIconSize, 0);
  180.                 BackgroundBrush.DrawRectangle(x, y - barH, barW, barH);
  181.                
  182.                 if (timeLeft > timeW - 4 && highestElementalBonus > 0) {
  183.                     RedBrush.DrawRectangle(x, y - barH, eleW, barH);
  184.                     if (player.IsMe) {
  185.                         Message(timeLeft);
  186.                         if (!SpeakOK)
  187.                             SpeakOK = true;
  188.                     }
  189.                 }
  190.                 else if (timeLeft > timeyellow && highestElementalBonus > 0) {
  191.                     YellowBrush.DrawRectangle(x, y - barH, eleW, barH);
  192.                     if (player.IsMe) {
  193.                         Message(timeLeft);
  194.                         Speak();
  195.                     }
  196.                 }
  197.                 else {GreenBrush.DrawRectangle(x, y - barH, eleW, barH);}
  198.                
  199.                 if (ShowCoeTime && highestElementalBonus > 0) {
  200.                     var timeWait = 4 * (NumElement - 1) - timeLeft;
  201.                     var layout = CoeTimeFont.GetTextLayout(timeWait > 0 ? timeWait.ToString("F1", CultureInfo.InvariantCulture) : CoeMaxIndicator);
  202.                     CoeTimeFont.DrawText(layout, x + barW + CoeRuleCalculator.StandardIconSpacing, y - barH);
  203.                 }
  204.             }
  205.         }
  206.        
  207.         public bool IsGuardianAlive { get { return (Hud.Game.RiftPercentage == 100); } }
  208.  
  209.         private void Message(double time) {
  210.             if (Hud.Game.IsInTown) return;
  211.            
  212.             var charRule = TimeRule[Hud.Game.Me.HeroClassDefinition.HeroClass];
  213.             if (charRule.Item4 != 0 && charRule.Item4 != 2) return;
  214.            
  215.             var MessageEnable = false;
  216.             var role = charRule.Item3;
  217.             if (role == -1)
  218.                 MessageEnable = true;
  219.             else if (Hud.Game.SpecialArea == SpecialArea.GreaterRift && role >= 0){
  220.             //  var BossState = IsGuardianAlive;
  221.                 switch (role) {
  222.                     case 0 : MessageEnable = true; break;
  223.                     case 1 : MessageEnable = !IsGuardianAlive; break;
  224.                     case 2 : MessageEnable = IsGuardianAlive; break;
  225.                 }
  226.             }
  227.            
  228.             if (!MessageEnable) return;
  229.            
  230.             var textDecorator = time%2 > 1f ? AttackFont1 : AttackFont2;
  231.             textDecorator.Paint(null, Hud.Game.Me.FloorCoordinate.Offset(MeOffsetX, MeOffsetY, 0), charRule.Item2);
  232.         }
  233.        
  234.         private void Speak() {
  235.             if (Hud.Game.IsInTown || !SpeakOK) return;
  236.            
  237.             var charRule = TimeRule[Hud.Game.Me.HeroClassDefinition.HeroClass];
  238.             if (charRule.Item4 < 1) return;
  239.            
  240.             var SpeakEnable = false;
  241.             var role = charRule.Item3;
  242.             if (role == -1)
  243.                 SpeakEnable = true;
  244.             else if (Hud.Game.SpecialArea == SpecialArea.GreaterRift && role >= 0){
  245.             //  var BossState = IsGuardianAlive;
  246.                 switch (role) {
  247.                     case 0 : SpeakEnable = true; break;
  248.                     case 1 : SpeakEnable = !IsGuardianAlive; break;
  249.                     case 2 : SpeakEnable = IsGuardianAlive; break;
  250.                 }
  251.             }
  252.            
  253.             if (!SpeakEnable) return;
  254.  
  255.             if(SpeakOK) {
  256.                 Hud.Sound.Speak(charRule.Item2);
  257.                 SpeakOK = false;
  258.             }
  259.         }
  260.    
  261.         public void Customize() {
  262.             Hud.TogglePlugin<ConventionOfElementsBuffListPlugin>(false);
  263.         }
  264.     }
  265. }
RAW Paste Data