SHARE
TWEET

LiveStats_RiftTracker

RNNCode Sep 23rd, 2019 (edited) 49 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // TopStats Rifts Tracker by HaKache
  2. // Versión alternativa para no recurrir al Chat , será independiente del idioma
  3.  
  4. using Turbo.Plugins.Default;
  5. using System.Drawing;
  6. using SharpDX.DirectInput;
  7. using SharpDX.DirectWrite;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Globalization;
  11. using System.Linq;
  12. using System.Media;
  13. using System.Threading;
  14.  
  15. namespace Turbo.Plugins.LiveStats.Modules
  16. {
  17.     public class LiveStats_RiftTracker : BasePlugin, ICustomizer, INewAreaHandler, IAfterCollectHandler
  18.     {
  19.        
  20.         private string NameBoss { get; set; }  
  21.         private bool TBossKilled { get; set; } 
  22.         private bool InRift { get; set; }
  23.            
  24.         public int RiftHistoryTimeout { get; set; } = 0;    // Stop showing old rift clears after this many seconds (0 = never time out)
  25.         public int RiftHistoryHighlight { get; set; } = 20; // Highlight if the drop is new for this many seconds
  26.         public int RiftHistoryShown { get; set; } = 12;     // Max # of clears to show for rift history
  27.         public List<RiftSnapshot> RiftHistory { get; private set; }
  28.            
  29.         public TopLabelDecorator Label { get; set; }
  30.         public List<TopLabelDecorator> ExpandUpLabels { get; private set; }
  31.        
  32.         public IFont RiftFont { get; set; }
  33.         public IFont BossFont { get; set; }
  34.         public IFont TimeFont { get; set; }
  35.  
  36.         public IBrush BgBrush { get; set; }
  37.         public IBrush BgBrushAlt { get; set; }
  38.         public IBrush HighlightBrush { get; set; }
  39.  
  40.         public int TotalRifts { get; private set; } = 0;
  41.         public int TotalGRs { get; private set; } = 0;
  42.         public int TotalNephalems { get; private set; } = 0;
  43.        
  44.         public int Priority { get; set; } = 8;
  45.         public int Hook { get; set; } = 1;
  46.  
  47.         public class RiftSnapshot
  48.         {
  49.             public string Id { get; set; }
  50.             public DateTime Timestamp { get; set; }
  51.             public string BossName { get; set; }
  52.             public bool IsGR { get; set; }
  53.             public string Difficulty { get; set; }
  54.             public string Timer { get; set; }
  55.         }
  56.            
  57.         public LiveStats_RiftTracker()
  58.         {
  59.             Enabled = true;
  60.         }  
  61.  
  62.         public void OnNewArea(bool newGame, ISnoArea area)
  63.         {  
  64.             if (newGame)
  65.             {
  66.                 InRift = false;
  67.             }
  68.             if ((area.HostAreaSno == 288482) || (area.Sno == 288482))
  69.             {
  70.                 if (!InRift) // Se inicia nueva Rift (Nephalem o GR)
  71.                 {
  72.                     InRift = true;
  73.                     TBossKilled = false; NameBoss = null;
  74.                 }
  75.             }
  76.         }
  77.        
  78.         public string FindNameBoss()
  79.         {
  80.             var m = Hud.Game.Markers.FirstOrDefault(k => (k.SnoActor != null) && k.SnoActor.Code.Contains("_Boss_"));
  81.             if  (m != null)
  82.             {
  83.                 return m.Name;
  84.             }
  85.             else
  86.             {
  87.                 var b = Hud.Game.Monsters.FirstOrDefault(s => (s.Rarity == ActorRarity.Boss) && (s.SummonerAcdDynamicId == 0));
  88.                 if (b != null)
  89.                 {
  90.                     return b.SnoMonster.NameLocalized;
  91.                 }
  92.             }
  93.             return null;                               
  94.         }  
  95.        
  96.         public void AfterCollect()  
  97.         {      
  98.             if (!Hud.Game.IsInGame) return;
  99.             if (InRift)
  100.             {          
  101.                 var riftQuest = Hud.Game.Quests.FirstOrDefault(q => (q.SnoQuest.Sno == 337492) && (q.State == QuestState.started || q.State == QuestState.completed )) ;
  102.                 if (riftQuest != null)
  103.                 {  
  104.                     switch (riftQuest.QuestStepId)
  105.                     {              
  106.                         case  3:    // NR Boss Appears                     
  107.                                 if (NameBoss == null)   { NameBoss = FindNameBoss(); }
  108.                                 break;
  109.                         case 10:    // NR Boss Killed , Orek Appears
  110.                                 if (!TBossKilled)
  111.                                 {  
  112.                                     TBossKilled = true;
  113.                                     if (NameBoss == null)   { NameBoss = FindNameBoss(); }
  114.                                     TotalNephalems += 1; TotalRifts += 1;
  115.                                     var rift = new RiftSnapshot() { BossName = NameBoss ?? "Unknown", Timestamp = Hud.Time.Now, IsGR = false, Difficulty = Hud.Game.GameDifficulty.ToString("") };
  116.                                     RiftHistory.Add(rift);                                                                     
  117.                                 }
  118.                                 break;
  119.                         case 16:    // GR Boss Appears  
  120.                                 if (NameBoss == null)   { NameBoss = FindNameBoss(); }                         
  121.                                 break;                                     
  122.                         case 34:    // GR Boss Killed , Kadala Appears
  123.                                 if (!TBossKilled)
  124.                                 {                
  125.                                     TBossKilled = true;
  126.                                     if (NameBoss == null)   { NameBoss = FindNameBoss(); }                                 
  127.                                     TotalGRs += 1; TotalRifts += 1;
  128.                                     var rift = new RiftSnapshot() { BossName = NameBoss ?? "Unknown", Timestamp = Hud.Time.Now, IsGR = true, Difficulty = Hud.Game.Me.InGreaterRiftRank.ToString(""), Timer = ValueToString((long)(riftQuest.CreatedOn - Hud.Game.CurrentTimedEventStartTick + Hud.Game.CurrentTimedEventEndTickMod) * 1000 * TimeSpan.TicksPerMillisecond / 60, ValueFormat.LongTime) };
  129.                                     RiftHistory.Add(rift);                                                                                                         
  130.                                 }                              
  131.                                 break;
  132.                     }
  133.                 }          
  134.                 else
  135.                 {
  136.                     InRift = false;
  137.                 }              
  138.             }
  139.         }
  140.    
  141.         public void Customize()
  142.         {
  143.             // Add this display to the LiveStats readout with a specified positional order priority of 8
  144.             Hud.RunOnPlugin<LiveStatsPlugin>(plugin => {
  145.                 plugin.Add(this.Label, this.Priority, this.Hook);
  146.             });
  147.         }
  148.  
  149.         public override void Load(IController hud)
  150.         {
  151.             base.Load(hud);
  152.  
  153.             RiftHistory = new List<RiftSnapshot>();
  154.  
  155.             TimeFont = Hud.Render.CreateFont("tahoma", 7, 190, 255, 255, 255, false, false, true);
  156.             RiftFont = Hud.Render.CreateFont("tahoma", 7, 255, 198, 86, 255, false, false, true); //205, 102, 255
  157.             BossFont = Hud.Render.CreateFont("tahoma", 7, 190, 255, 0, 0, false, false, true);
  158.                
  159.             var plugin = Hud.GetPlugin<LiveStatsPlugin>();
  160.             BgBrush = plugin.BgBrush;
  161.             BgBrushAlt = plugin.BgBrushAlt;
  162.             HighlightBrush = Hud.Render.CreateBrush(200, 72, 132, 84, 0); // 208, 156, 255 Light Purple
  163.                
  164.             Label = new TopLabelDecorator(Hud)
  165.             {
  166.                 TextFont = RiftFont,
  167.                 TextFunc = () => { return TotalRifts.ToString() + (TotalRifts > 1 ? " rifts" : " rift"); },
  168.                 HintFunc = () => "Rifts Done",
  169.                 ExpandUpLabels = new List<TopLabelDecorator>()
  170.                 {
  171.                     new TopLabelDecorator(Hud)
  172.                     {
  173.                         //Enabled = false,
  174.                         TextFont = RiftFont,
  175.                         BackgroundBrush = BgBrush,
  176.                         ExpandedHintFont =  RiftFont,
  177.                         ExpandedHintWidthMultiplier = (float)((Hud.Window.Size.Width / 1000)* 1.0),
  178.                         TextFunc = () => TotalRifts.ToString(),
  179.                         HintFunc = () => "Total Rifts",
  180.                     },
  181.                     new TopLabelDecorator(Hud)
  182.                     {
  183.                         TextFont =  RiftFont,
  184.                         BackgroundBrush = BgBrushAlt,
  185.                         ExpandedHintFont =  RiftFont,
  186.                         ExpandedHintWidthMultiplier = (float)((Hud.Window.Size.Width / 1000)* 1.0),
  187.                         TextFunc = () => TotalNephalems.ToString() + " (" + (TotalNephalems / ((((double)Hud.Tracker.Session.ElapsedMilliseconds/1000d)/60d)/60d)).ToString("F1", CultureInfo.InvariantCulture) + "/h)",
  188.                         HintFunc = () => "Nephalem Rifts",
  189.                     },
  190.                     new TopLabelDecorator(Hud) {
  191.                         TextFont =  RiftFont,
  192.                         BackgroundBrush = BgBrush,
  193.                         ExpandedHintFont =  RiftFont,
  194.                         ExpandedHintWidthMultiplier = (float)((Hud.Window.Size.Width / 1000)* 1.0),
  195.                         TextFunc = () => TotalGRs.ToString() + " (" + (TotalGRs / ((((double)Hud.Tracker.Session.ElapsedMilliseconds/1000d)/60d)/60d)).ToString("F1", CultureInfo.InvariantCulture) + "/h)",
  196.                         HintFunc = () => "Greater Rifts",
  197.                     },
  198.                     new TopLabelDecorator(Hud)
  199.                     {
  200.                         TextFont = RiftFont,
  201.                         TextFunc = () =>
  202.                         {
  203.                             float w = plugin.WidthFunc();
  204.                             float h = plugin.HeightFunc();
  205.                             float x = Hook == 0 ? (plugin.PinnedLabel == Label ? plugin.ExpandLabelHook : plugin.SelectedRectangle.X) : (plugin.PinnedTopLabel == Label ? plugin.ExpandLabelTopHook : plugin.SelectedTopRectangle.X);
  206.                             float y = Hook == 0 ? (plugin.SelectedRectangle.Y - h * (ExpandUpLabels.Count - 0.5f)) : (plugin.SelectedTopRectangle.Y + h * (ExpandUpLabels.Count - 0.5f));
  207.                                        
  208.                             DrawRiftHistory(new RectangleF(x, y, w, h));
  209.                                            
  210.                             return " ";
  211.                         },
  212.                     },
  213.                 },
  214.             };
  215.                
  216.             ExpandUpLabels = Label.ExpandUpLabels;
  217.         }
  218.        
  219.         private void DrawRiftHistory(RectangleF rect) //x,y coordinates of the bottom left of the rift history window (above the other labels + space gap)
  220.         {
  221.             if (RiftHistory == null || RiftHistory.Count == 0) return;
  222.  
  223.             DateTime now = Hud.Time.Now;
  224.             IEnumerable<RiftSnapshot> history = (RiftHistoryTimeout > 0 ?
  225.                 RiftHistory.Where(d => (now - d.Timestamp).TotalSeconds < RiftHistoryTimeout) :
  226.                 RiftHistory
  227.             ).OrderByDescending(d => d.Timestamp).Take(RiftHistoryShown);
  228.             if (history.Count() == 0) return; // Safecheck
  229.             List<Tuple<TextLayout, TextLayout, TextLayout, IFont, IBrush>> lines = new List<Tuple<TextLayout, TextLayout, TextLayout, IFont, IBrush>>(RiftHistoryShown + 1);
  230.                
  231.             foreach (RiftSnapshot rift in history)
  232.             {
  233.                 // How long ago was the drop
  234.                 TimeSpan elapsed = now - rift.Timestamp;               
  235.                 string time;
  236.                 if (elapsed.TotalSeconds < 60)
  237.                     time = elapsed.TotalSeconds.ToString("F0") + "s ago";
  238.                 else if (elapsed.TotalMinutes < 10)
  239.                     time = elapsed.TotalMinutes.ToString("F0") + "m ago";
  240.                 else
  241.                     time = "⏱️" + rift.Timestamp.ToString("HH:mm", CultureInfo.InvariantCulture); //⏱️⏰🕒⌚
  242.  
  243.                 // IS GR ?
  244.                 string textrift;
  245.                 if (rift.IsGR) textrift = "killed in GR" + (rift.Difficulty != "0" ? rift.Difficulty : "") + " [" + rift.Timer + "]";
  246.                 else textrift = "killed in " + rift.Difficulty.ToUpper() + " Rift";
  247.  
  248.                 // Name
  249.                 IFont color = RiftFont;
  250.  
  251.                 // Store line data
  252.                 lines.Add(new Tuple<TextLayout, TextLayout, TextLayout, IFont, IBrush>(
  253.                     RiftFont.GetTextLayout(time),
  254.                     BossFont.GetTextLayout(rift.BossName),
  255.                     color.GetTextLayout(textrift),
  256.                     color,
  257.                     (elapsed.TotalSeconds <= RiftHistoryHighlight ? HighlightBrush : BgBrush)
  258.                 ));
  259.             }
  260.                
  261.             // Compute width of the loot history display
  262.             float widthTime = lines.Select(t => t.Item1.Metrics.Width).Max();
  263.             float widthBoss = lines.Select(t => t.Item2.Metrics.Width).Max();
  264.             float widthInfos = lines.Select(t => t.Item3.Metrics.Width).Max();
  265.             float width = Math.Max(rect.Width, 5 + widthTime + 10 + widthBoss + 10 + widthInfos + 5);          
  266.                
  267.             //x += width;
  268.             float x = rect.X;
  269.             if (x + width > Hud.Window.Size.Width)
  270.                 x = Hud.Window.Size.Width - width;
  271.             float y = rect.Y;
  272.                
  273.             foreach (Tuple<TextLayout, TextLayout, TextLayout, IFont, IBrush> line in lines)
  274.             {
  275.                 TextLayout layout = line.Item1;
  276.                 float height = Math.Max(layout.Metrics.Height, rect.Height);
  277.                 if (Hook == 0) y -= height;
  278.                     else y += height;
  279.                    
  280.                 //draw background
  281.                 line.Item5.DrawRectangle(x, y, width, height);
  282.                    
  283.                 //draw timestamp
  284.                 TimeFont.DrawText(layout, x + 5 + widthTime - layout.Metrics.Width, y + height*0.5f - layout.Metrics.Height*0.5f);
  285.                    
  286.                 //draw boss name
  287.                 layout = line.Item2;
  288.                 if (layout != null)
  289.                     BossFont.DrawText(line.Item2, x + 5 + widthTime + 5 + widthBoss * 0.5f - layout.Metrics.Width *0.5f, y + height*0.5f - layout.Metrics.Height*0.5f);
  290.                    
  291.                 //draw rift infos
  292.                 layout = line.Item3;
  293.                 line.Item4.DrawText(layout, x + 5 + widthTime + 5 + widthBoss + 5, y + height*0.5f - layout.Metrics.Height*0.5f);
  294.             }
  295.         }
  296.     }
  297. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Not a member of Pastebin yet?
Sign Up, it unlocks many cool features!
 
Top