RNNCode

GRPylonMarker

Sep 26th, 2019
1,176
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Based on GLQ_GreaterRiftPylonMarkerPlugin.cs  ( https://pastebin.com/iQeBWcTs )
  2. using Turbo.Plugins.Default;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System;
  6.  
  7. namespace Turbo.Plugins.RNN
  8. {
  9.     public class GRPylonMarker : BasePlugin, IInGameTopPainter, INewAreaHandler, IAfterCollectHandler, ICustomizer 
  10.     {
  11.         public Dictionary<ActorSnoEnum, PylonData> PylonsFound { get; set; } = new Dictionary<ActorSnoEnum, PylonData>();
  12.         public Dictionary<uint, Tuple<string,ActorSnoEnum,ITexture>> BuffNA { get; set; }
  13.         public Dictionary<uint, string> Lnn { get; set; }
  14.         public int MyIndex { get; set; } = -1;
  15.         public IFont FontUsed { get; set; }
  16.         public IFont FontLevel { get; set; }
  17.         public IFont LeftFont { get; set; }
  18.         public IFont FontOther { get; set; }
  19.         public IBrush BrushLine { get; set; }
  20.         public bool InRift { get; set; }
  21.         public bool MapGR { get; set; }
  22.         public bool Horizontal { get; set;}
  23.         public float sizeFont { get; set; }
  24.         public float widthLine { get; set; }
  25.         public IBrush BorderBrush { get; set; }
  26.         public IBrush BorderGreenBrush { get; set; }
  27.         public bool ShowIcon { get; set; }
  28.         public float SPname { get; set; } = 0f;
  29.         public float LineSpacing { get; set; }
  30.         public bool PreSetSPname { get; set; }     
  31.        
  32.         public GRPylonMarker()
  33.         {
  34.             Enabled = true;
  35.         }      
  36.         public override void Load(IController hud)
  37.         {
  38.             base.Load(hud);
  39.             Order = 30001;
  40.            
  41.             Horizontal = true;
  42.             ShowIcon = true;
  43.             sizeFont = 7f;
  44.             widthLine = 1f;
  45.             LineSpacing = 1f;
  46.            
  47.             PreSetSPname = false;
  48.            
  49.             BorderBrush = Hud.Render.CreateBrush(250, 250, 100, 0, 1);
  50.             BorderGreenBrush = Hud.Render.CreateBrush(250, 0, 220, 0, -1);
  51.             BuffNA = new Dictionary<uint, Tuple<string,ActorSnoEnum,ITexture>>   // < buffsno, <nombre,actosno,ITexture> >
  52.             {
  53.                 { 262935,   new Tuple<string,ActorSnoEnum,ITexture>( "Power",   ActorSnoEnum._x1_lr_shrine_damage, Hud.Texture.GetTexture(2350065673) )                 },
  54.                 { 403404,   new Tuple<string,ActorSnoEnum,ITexture>( "Conduit", ActorSnoEnum._x1_lr_shrine_electrified_tieredrift, Hud.Texture.GetTexture(1751750314) ) },
  55.                 { 266258,   new Tuple<string,ActorSnoEnum,ITexture>( "Chann",   ActorSnoEnum._x1_lr_shrine_infinite_casting, Hud.Texture.GetTexture(3254056115) )       },
  56.                 { 266254,   new Tuple<string,ActorSnoEnum,ITexture>( "Shield",  ActorSnoEnum._x1_lr_shrine_invulnerable, Hud.Texture.GetTexture(455040081) )            },
  57.                 { 266271,   new Tuple<string,ActorSnoEnum,ITexture>( "Speed",   ActorSnoEnum._x1_lr_shrine_run_speed, Hud.Texture.GetTexture(1927801803) )              }
  58.             };
  59.             Lnn = new Dictionary<uint,string>   // < SnoArea.Sno, Level string>
  60.             {
  61.                 {288482, "Level 01"},   {288684, "Level 02"},   {288686, "Level 03"},   {288797, "Level 04"},   {288799, "Level 05"},
  62.                 {288801, "Level 06"},   {288803, "Level 07"},   {288809, "Level 08"},   {288812, "Level 09"},   {288813, "Level 10"},
  63.                 {0, "Level xx"}  // está añadido por precaución, por si en el futuro añaden más niveles
  64.             }; 
  65.         }  
  66.                
  67.         public class PylonData
  68.         {
  69.             public string Name { get; set; }
  70.             public uint AreaSno { get; set; }
  71.             public double Percent { get; set; }
  72.             public uint BuffSno { get; set; }
  73.             public bool Used { get; set; }
  74.             public PylonData( string name, uint area , double percent , uint buff , bool used)
  75.             {
  76.                 this.Name = name;
  77.                 this.AreaSno = area;
  78.                 this.Percent = percent;
  79.                 this.BuffSno = buff;
  80.                 this.Used = used;                      
  81.             }
  82.         }
  83.        
  84.         public void Customize()
  85.         {
  86.             FontUsed = Hud.Render.CreateFont("tahoma", sizeFont, 255, 170, 170, 170, false, false, 250, 0, 0, 0, true);
  87.             FontLevel = Hud.Render.CreateFont("tahoma", sizeFont, 255, 235, 145, 235, false, false, 160, 0, 0, 0, true);
  88.             FontOther = Hud.Render.CreateFont("tahoma", sizeFont, 255, 250, 50, 50, false, false, 160, 0, 0, 0, true);
  89.             LeftFont = Hud.Render.CreateFont("tahoma", sizeFont - ( (sizeFont > 7)? 1.5f : 1f ), 255, 255, 255, 255, false, false, 160, 0, 0, 0, true);
  90.             BrushLine = Hud.Render.CreateBrush(255, 125, 175, 240, widthLine); 
  91.             if (PreSetSPname)
  92.             {
  93.                 SPname = 0f;
  94.                 foreach(var e in BuffNA)
  95.                 {
  96.                     var spname = FontLevel.GetTextLayout(e.Value.Item1).Metrics.Width;
  97.                     if  (SPname < spname) { SPname = spname; }
  98.                 }  
  99.             }
  100.             if (LineSpacing > 1.2f) { LineSpacing = 1.2f; }
  101.             else if (LineSpacing < 0.8f) { LineSpacing = 0.8f; }
  102.         }
  103.        
  104.         public void PylonsFoundAdd(uint buff , bool used)
  105.         {          
  106.             PylonsFound.Add(BuffNA[buff].Item2, new PylonData(BuffNA[buff].Item1,Hud.Game.Me.SnoArea.Sno,Hud.Game.RiftPercentage,buff,used));                      
  107.             if (!PreSetSPname)
  108.             {
  109.                 var spname = FontLevel.GetTextLayout(BuffNA[buff].Item1).Metrics.Width;
  110.                 if  (SPname < spname) { SPname = spname; }         
  111.             }
  112.         }  
  113.        
  114.         public void OnNewArea(bool newGame, ISnoArea area)
  115.         {  
  116.             if (newGame || (MyIndex != Hud.Game.Me.Index) )   // Fix partialment the newGame limitation
  117.             {
  118.                 MyIndex = Hud.Game.Me.Index;
  119.                 InRift = false; MapGR = false;
  120.             }
  121.             if ((area.HostAreaSno == 288482) || (area.Sno == 288482))
  122.             {  
  123.                 if (Hud.Game.Me.InGreaterRift) { MapGR = true; }       
  124.                 if (!InRift)        //Start New Rift (Nephalem o GR)
  125.                 {
  126.                     InRift = true;                 
  127.                     if (Hud.Game.Me.InGreaterRift)
  128.                     {
  129.                         if (!PreSetSPname) { SPname = 0; }
  130.                         PylonsFound.Clear();
  131.                     }                  
  132.                 }
  133.             }
  134.             else { MapGR = false; }
  135.         }  
  136.        
  137.         public void AfterCollect()  
  138.         {
  139.             if (!Hud.Game.IsInGame) return;
  140.             if (InRift && (Hud.Game.Quests.FirstOrDefault(q => (q.SnoQuest.Sno == 337492) && (q.State == QuestState.started || q.State == QuestState.completed )) == null)) { InRift = false; }
  141.         }  
  142.    
  143.         public void ShowIconBuff(uint buff,float x, float y,float s)
  144.         {
  145.             BuffNA[buff].Item3.Draw(x , y, s, s); // texture draw
  146.             if (Hud.Game.Me.Powers.BuffIsActive(buff, 0)) // check buff
  147.             {
  148.                 var left = Hud.Game.Me.Powers.GetBuff(buff).TimeLeftSeconds[0];
  149.                 var layout = LeftFont.GetTextLayout(left.ToString( (left < 1)? "F1" : "F0") );
  150.                 LeftFont.DrawText(layout, x - layout.Metrics.Width - 3 , y + ((s - layout.Metrics.Height) / 2)); // counter                        
  151.                 BorderGreenBrush.DrawRectangle(x + 1, y + 1, s - 2, s - 2); // border green
  152.             }
  153.             else
  154.             {
  155.                 BorderBrush.DrawRectangle(x + 1, y + 1, s - 2, s - 2); // border orange
  156.             }
  157.         }
  158.        
  159.         public void PaintTopInGame(ClipState clipState)
  160.         {
  161.             if ( (clipState != ClipState.BeforeClip) || !Hud.Game.IsInGame || !MapGR ) return;   // Hud.Game.SpecialArea está enlazado a la visibilidad de la barra de progreso...  ¿por qué?   
  162.            
  163.             foreach (var s in Hud.Game.Shrines)  // pilones que vemos
  164.             {
  165.                 if  (PylonsFound.ContainsKey(s.SnoActor.Sno))
  166.                 {
  167.                     if ( (s.IsDisabled || s.IsOperated) && !PylonsFound[s.SnoActor.Sno].Used )  { PylonsFound[s.SnoActor.Sno].Used = true; }
  168.                     if ( Hud.Game.Me.SnoArea.Sno != PylonsFound[s.SnoActor.Sno].AreaSno )   // to fix slow update of snoarea for pylon near the door
  169.                     {
  170.                         PylonsFound[s.SnoActor.Sno].AreaSno = Hud.Game.Me.SnoArea.Sno;
  171.                     }  
  172.                 }
  173.                 else
  174.                 {
  175.                     switch (s.SnoActor.Sno)  
  176.                     {
  177.                         case ActorSnoEnum._x1_lr_shrine_damage:                 PylonsFoundAdd(262935,s.IsDisabled || s.IsOperated); break;     //330695 Power
  178.                         case ActorSnoEnum._x1_lr_shrine_electrified_tieredrift: PylonsFoundAdd(403404,s.IsDisabled || s.IsOperated); break;     //398654 Conduit
  179.                         case ActorSnoEnum._x1_lr_shrine_infinite_casting:       PylonsFoundAdd(266258,s.IsDisabled || s.IsOperated); break;     //330697 Channeling
  180.                         case ActorSnoEnum._x1_lr_shrine_invulnerable:           PylonsFoundAdd(266254,s.IsDisabled || s.IsOperated); break;     //330698 Shield
  181.                         case ActorSnoEnum._x1_lr_shrine_run_speed:              PylonsFoundAdd(266271,s.IsDisabled || s.IsOperated); break;     //330699 Speed                             
  182.                     }
  183.                 }                                          
  184.             }
  185.            
  186.             foreach (uint buff in BuffNA.Keys)  // bufos que recibimos , para marcar pilones usados y también para detectar pilones nuevos no vistos
  187.             {
  188.                 if ( Hud.Game.Players.Any(p => p.HasValidActor && p.Powers.BuffIsActive(buff,0)) )  // Miro el buff de todos los jugadores , no sólo el mío (Hud.Game.Me.Powers.BuffIsActive(buff, 0))
  189.                 {
  190.                     var sno = BuffNA[buff].Item2;
  191.                     if (PylonsFound.ContainsKey(sno))
  192.                     {
  193.                         if (!PylonsFound[sno].Used) PylonsFound[sno].Used = true;
  194.                     }
  195.                     else { PylonsFoundAdd(buff, true); }
  196.                 }
  197.             }
  198.                    
  199.             if (Hud.Render.GreaterRiftBarUiElement.Visible) // Se mostrará información sólo si la barra de progreso está visible, pero recolectaremos datos siempre
  200.             {
  201.                 var uiRect = Hud.Render.GreaterRiftBarUiElement.Rectangle;
  202.                 double lastPercent = 0; int num = 0; float bPos = 0; var Ypos = uiRect.Bottom + Hud.Window.Size.Height / 30; string texto = string.Empty; SharpDX.DirectWrite.TextLayout layout = null;
  203.                 foreach (var sno in PylonsFound.Keys)  
  204.                 {
  205.                     PylonData p = PylonsFound[sno];                
  206.                     IFont font = p.Used ? FontUsed : ( (p.AreaSno == Hud.Game.Me.SnoArea.Sno)? FontLevel : FontOther ) ;
  207.                     if (Horizontal) // modo Horizontal
  208.                     {
  209.                         bPos = uiRect.Left + uiRect.Width / 100 * (float) p.Percent;
  210.                         BrushLine.DrawLine(bPos, uiRect.Bottom, bPos, uiRect.Bottom + uiRect.Height * 0.3f , 0);    // Line Blue               
  211.                         layout = font.GetTextLayout(string.Format("{0:F1}%\t",p.Percent)); 
  212.                         var h = layout.Metrics.Height; var x = uiRect.Left; var y = Ypos + num * (h * LineSpacing);
  213.                         if (ShowIcon)
  214.                         {  
  215.                             ShowIconBuff(p.BuffSno,x, y + (h * (1 - LineSpacing) + 1) / 2, h * LineSpacing - 1 );
  216.                             x += h * 1.5f;
  217.                         }                                              
  218.                         font.DrawText(layout, x, y);                                               
  219.                         x += layout.Metrics.Width;
  220.                         font.DrawText(font.GetTextLayout(p.Name), x, y);                       
  221.                         x = x + SPname + h;
  222.                         texto = (num > 0)? string.Format("[+{0:F1}%]",p.Percent - lastPercent) : "" ;                      
  223.                         texto = string.Format("{0}   {1}", Lnn[Lnn.ContainsKey(p.AreaSno) ? p.AreaSno : 0],texto);
  224.                         layout = font.GetTextLayout(texto);                    
  225.                         font.DrawText(layout, x, y);
  226.                     }
  227.                     else // modo Vertical
  228.                     {
  229.                         bPos = (float) (uiRect.Left + (uiRect.Width * p.Percent  / 100));                  
  230.                         texto = (num > 0)? string.Format("[+{0:F0}%]",p.Percent - lastPercent) : "" ;
  231.                         texto = string.Format("{0:F1}%\n{1}\n{2}\n{3}",p.Percent, p.Name, Lnn[Lnn.ContainsKey(p.AreaSno) ? p.AreaSno : 0],texto);
  232.                         layout = font.GetTextLayout(texto);
  233.                         BrushLine.DrawLine(bPos, uiRect.Bottom, bPos, Ypos + layout.Metrics.Height / 2, 0);
  234.                         font.DrawText(layout, bPos - layout.Metrics.Width, Ypos);
  235.                     }
  236.                     lastPercent = p.Percent; num += 1;
  237.                 }
  238.                 if ( (num != 4) && (Hud.Game.RiftPercentage < 100)) // progreso que llevamos desde el último pilón
  239.                 {
  240.                     layout = FontLevel.GetTextLayout(string.Format("(+{0:F1}%)", Hud.Game.RiftPercentage - lastPercent));
  241.                     FontLevel.DrawText(layout, uiRect.Left + uiRect.Width / 2 - layout.Metrics.Width / 2, uiRect.Bottom + uiRect.Height * 0.25f);
  242.                 }                          
  243.             }  
  244.         }      
  245.     }  
  246. }
RAW Paste Data