Advertisement
jarppaaja

LevelProgressLabel.cs rev 1372

Mar 13th, 2019
464
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 19.68 KB | None | 0 0
  1. // LevelProgressLabel.cs "$Revision: 1372 $" "$Date: 2019-03-13 18:11:31 +0200 (ke, 13 maalis 2019) $"
  2. using SharpDX;
  3. using System;
  4. using System.Text;
  5. using Turbo.Plugins;
  6. using Turbo.Plugins.Default;
  7.  
  8. namespace Turbo.plugins.JarJar.DefaultUI
  9. {
  10.     class LevelProgressLabel : BasePlugin, IInGameTopPainter
  11.     {
  12.         public IFont textFont { get; set; }
  13.         public float offsetX { get; set; } = 1.00f;             // Relative to player portrait Width from Top.
  14.         public float offsetY { get; set; } = 0.70f;             // Relative to portrait Height from Left.
  15.  
  16.         public Func<IController, System.Drawing.PointF> LabelPosFunc { get; set; }  // Override label positioning logic if needed.
  17.  
  18.         public bool logRiftCompletion { get; set; } = false;    // Logs kill xp and RG bonus xp (rift completed or arrive to town).
  19.         public bool logDebugData { get; set; } = false;         // Debug logging.
  20.  
  21.         string previousBuilder = "";
  22.         StringBuilder logBuilder = new StringBuilder();
  23.         StringBuilder labelBuilder = new StringBuilder();
  24.  
  25.         public LevelProgressLabel() { Enabled = true; Order = 51; }     // Just after RiftTimeLogger
  26.  
  27.         public override void Load(IController hud)
  28.         {
  29.             base.Load(hud);
  30.  
  31.             var textColor = Color.DodgerBlue;
  32.             textFont = hud.Render.CreateFont("consolas", 9f, textColor.A, textColor.R, textColor.G, textColor.B, true, false, 220, 32, 32, 32, true);
  33.  
  34.             LabelPosFunc = (thud) => {
  35.                 var portraitRect = thud.Game.Me.PortraitUiElement.Rectangle;
  36.                 float posX = portraitRect.Left + portraitRect.Width * offsetX;
  37.                 float posY = portraitRect.Top + portraitRect.Height * offsetY;
  38.                 return new System.Drawing.PointF(posX, posY);
  39.             };
  40.         }
  41.  
  42.         SpecialArea currentArea = SpecialArea.PvP;
  43.         bool isInTown = false;
  44.         bool riftRunning = false;
  45.         bool riftCompleted = true;
  46.         bool logRunStats = false;
  47.         double prevRiftPercentage = 0;
  48.         uint savedLevelParagon;
  49.         long savedParagonTotalExp;
  50.         long savedMobKillsExp;
  51.         long finalRGKillsExp;
  52.         // If we got paragon levels, save prev values.
  53.         long prevLevelParagonTotalExp;
  54.         uint firstOfPreviousParagons;
  55.         uint LastOfPreviousParagons;
  56.  
  57.         void resetStats()
  58.         {
  59.             var game = Hud.Game;
  60.             var player = game.Me;
  61.             prevRiftPercentage = game.RiftPercentage;
  62.             savedParagonTotalExp = player.ParagonTotalExp;
  63.             savedMobKillsExp = 0;
  64.             finalRGKillsExp = 0;
  65.             prevLevelParagonTotalExp = 0;
  66.             firstOfPreviousParagons = 0;
  67.             LastOfPreviousParagons = 0;
  68.         }
  69.  
  70.         public void PaintTopInGame(ClipState clipState)
  71.         {
  72.             if (clipState != ClipState.BeforeClip) return;
  73.             if (Hud.Render.UiHidden) return;
  74.             if ((Hud.Game.MapMode == MapMode.WaypointMap) || (Hud.Game.MapMode == MapMode.ActMap) || (Hud.Game.MapMode == MapMode.Map)) return;
  75.             var game = Hud.Game;
  76.             var player = game.Me;
  77.             // Sanity checks as changing level causes sometimes these to be temporarily zero.
  78.             if (player.ParagonTotalExp == 0 || player.CurrentLevelParagon == 0) return;
  79.  
  80.             if (currentArea != game.SpecialArea || isInTown != game.IsInTown)
  81.             {
  82.                 if (logDebugData) logNewArea();
  83.                 if ((currentArea == SpecialArea.None || currentArea == SpecialArea.PvP) &&
  84.                     (game.SpecialArea == SpecialArea.Rift || game.SpecialArea == SpecialArea.GreaterRift || game.SpecialArea == SpecialArea.ChallengeRift))
  85.                 {
  86.                     // Start rift.
  87.                     if (!riftRunning)
  88.                     {
  89.                         riftRunning = true;
  90.                         if (riftCompleted)
  91.                         {
  92.                             resetStats();
  93.                             riftCompleted = false;
  94.                         }
  95.                         if (logDebugData) logRiftStart();
  96.                     }
  97.                 }
  98.                 if (game.SpecialArea == SpecialArea.None &&
  99.                     (currentArea == SpecialArea.Rift || currentArea == SpecialArea.GreaterRift || currentArea == SpecialArea.ChallengeRift))
  100.                 {
  101.                     // Return from rift.
  102.                     riftRunning = false;
  103.                     savedMobKillsExp = player.ParagonTotalExp - savedParagonTotalExp;
  104.                     if (logDebugData) logRiftEnd();
  105.                 }
  106.                 if (game.IsInTown)
  107.                 {
  108.                     if (!isInTown)
  109.                     {
  110.                         // Enter town
  111.                         if (savedParagonTotalExp == 0)
  112.                         {
  113.                             // First time in town after new game.
  114.                             savedParagonTotalExp = player.ParagonTotalExp;
  115.                             savedLevelParagon = player.CurrentLevelParagon;
  116.                         }
  117.                         else if (game.RiftPercentage == 0)
  118.                         {
  119.                             // We return from other gameplay level (than rift).
  120.                             if (logRiftCompletion) logRunStats = true;
  121.                         }
  122.                         if (logDebugData) logEnterTown();
  123.                     }
  124.                 }
  125.                 else
  126.                 {
  127.                     if (isInTown)
  128.                     {
  129.                         // Leave town
  130.                         if (logDebugData) logExitTown();
  131.                         if (!riftRunning)
  132.                         {
  133.                             // When we leave, reset stats for next run.
  134.                             resetStats();
  135.                         }
  136.                     }
  137.                 }
  138.                 currentArea = game.SpecialArea;
  139.             }
  140.             if (isInTown != game.IsInTown)
  141.             {
  142.                 isInTown = game.IsInTown;   // Current town state.
  143.             }
  144.             if (savedLevelParagon != player.CurrentLevelParagon)
  145.             {
  146.                 // Save current progress for pervious level and start stats for new paragon level.
  147.                 // - if we get new paragon level during rift, it is "impossible" to calculate xp distribution between paragon levels :-(
  148.                 prevLevelParagonTotalExp += player.ParagonTotalExp - savedParagonTotalExp;
  149.                 if (firstOfPreviousParagons == 0)
  150.                 {
  151.                     firstOfPreviousParagons = savedLevelParagon;
  152.                     LastOfPreviousParagons = savedLevelParagon;
  153.                 }
  154.                 else
  155.                 {
  156.                     LastOfPreviousParagons = savedLevelParagon;
  157.                 }
  158.                 // Restart paragon exp stats!
  159.                 savedParagonTotalExp = player.ParagonTotalExp;
  160.                 savedMobKillsExp = 0;
  161.                 if (logDebugData) logParagonChanged();
  162.                 savedLevelParagon = player.CurrentLevelParagon;
  163.             }
  164.             if (!isInTown)
  165.             {
  166.                 // Calculate mob kill exp "realtime".
  167.                 if (player.ParagonTotalExp > (savedParagonTotalExp + savedMobKillsExp))
  168.                 {
  169.                     savedMobKillsExp = player.ParagonTotalExp - savedParagonTotalExp;
  170.                 }
  171.             }
  172.             if (prevRiftPercentage != game.RiftPercentage)
  173.             {
  174.                 if (game.RiftPercentage == 0 && prevRiftPercentage > 0)
  175.                 {
  176.                     // Rift guardian kill experience bonus has been awarded to us now.
  177.                     riftCompleted = true;
  178.                     if (logRiftCompletion) logRunStats = true;
  179.                     finalRGKillsExp = player.ParagonTotalExp - savedParagonTotalExp - savedMobKillsExp;
  180.                     if (logDebugData) logBonusXpReward();
  181.                 }
  182.                 prevRiftPercentage = game.RiftPercentage;
  183.             }
  184.             if (logBuilder.Length > 0)
  185.             {
  186.                 logData();
  187.                 logBuilder.Clear();
  188.             }
  189.             // Progression label.
  190.             // - flash 100% rift progression until it is collected!
  191.             string percentLabel =
  192.                 game.RiftPercentage <= 0 ? "":
  193.                 game.RiftPercentage < 100 ? string.Format(" : {0:0}%", game.RiftPercentage)
  194.                 : ((Hud.Game.CurrentGameTick / 60) % 2 == 0 ? "" : " : 100% Bonus");
  195.             labelBuilder
  196.                 .AppendFormat("{0,-17} {1}", player.SnoArea.NameEnglish, percentLabel)
  197.                 .AppendLine()
  198.                 .AppendFormat("Level done  {0,10}  needs {1}",
  199.                     percent(player.ParagonExpInThisLevel, player.ParagonExpToNextLevel),
  200.                     ValueToString(player.ParagonExpToNextLevel - player.ParagonExpInThisLevel, ValueFormat.LongNumber))
  201.                 .AppendLine();
  202.             bool splitXp = prevLevelParagonTotalExp > 0;    // Impossible to allocate XP between two levels properly :-(
  203.             if (splitXp)
  204.                 labelBuilder
  205.                 .AppendFormat("Prev  XP {0,7} (P {1})", ValueToString(prevLevelParagonTotalExp, ValueFormat.LongNumber),
  206.                     firstOfPreviousParagons == LastOfPreviousParagons ? firstOfPreviousParagons.ToString() : string.Format("{0}-{1}", firstOfPreviousParagons, LastOfPreviousParagons))
  207.                 .AppendLine();
  208.             if (savedMobKillsExp > 0)
  209.                 labelBuilder
  210.                 .AppendFormat("Kill  XP {0,7}{1}", ValueToString(savedMobKillsExp, ValueFormat.LongNumber), splitXp ? "" : percent(savedMobKillsExp, player.ParagonExpToNextLevel))
  211.                 .AppendLine();
  212.             if (finalRGKillsExp > 0)
  213.             {
  214.                 long totalExp = savedMobKillsExp + finalRGKillsExp;
  215.                 labelBuilder
  216.                 .AppendFormat("Bonus XP {0,7}{1}", ValueToString(finalRGKillsExp, ValueFormat.LongNumber), splitXp ? "" : percent(finalRGKillsExp, player.ParagonExpToNextLevel))
  217.                 .AppendLine()
  218.                 .AppendFormat("Total XP {0,7}{1}", ValueToString(totalExp, ValueFormat.LongNumber), splitXp ? "" : percent(totalExp, player.ParagonExpToNextLevel))
  219.                 .AppendLine();
  220.             }
  221.             var layout = textFont.GetTextLayout(labelBuilder.ToString());
  222.             var pos = LabelPosFunc(Hud);
  223.             textFont.DrawText(layout, pos.X,  pos.Y);
  224.             labelBuilder.Clear();
  225.             if (logRunStats)
  226.             {
  227.                 long kills = prevLevelParagonTotalExp + savedMobKillsExp;
  228.                 if (kills > 0) Hud.Debug(string.Format("Kill: {0,7} XP", ValueToString(kills, ValueFormat.LongNumber)));
  229.                 if (finalRGKillsExp > 0) Hud.Debug(string.Format("RG:   {0,7} XP", ValueToString(finalRGKillsExp, ValueFormat.LongNumber)));
  230.                 logRunStats = false;
  231.             }
  232.         }
  233.  
  234.         string percent(double value, double total)
  235.         {
  236.             if (total > 0)
  237.             {
  238.                 double result = value / total * 100d;
  239.                 if (result < 0.1) return string.Format(" {0:0.00}%", result);
  240.                 return string.Format(" {0,4:0.0}%", result);
  241.             }
  242.             return "";
  243.         }
  244.  
  245.         void logData()
  246.         {
  247.             var game = Hud.Game;
  248.             var player = game.Me;
  249.             string area = string.Format("{0}: {1}\r\n",
  250.                 player.InGreaterRift ? player.InGreaterRiftRank.ToString() : game.GameDifficulty.ToString().ToUpper(),
  251.                 player.SnoArea.NameEnglish
  252.                 );
  253.             string temp = logBuilder
  254.                 .Insert(0, area)
  255.                 .ToString();
  256.             if (temp != previousBuilder)
  257.             {
  258.                 previousBuilder = temp;
  259.                 Hud.Debug("\r\n" + temp);
  260.             }
  261.         }
  262.  
  263.         void logNewArea()
  264.         {
  265.             var game = Hud.Game;
  266.             var player = game.Me;
  267.             logBuilder
  268.             .AppendFormat("CHANGE area {0} -> {1} : {2}", currentArea, game.SpecialArea, player.SnoArea.NameEnglish)
  269.             .AppendLine();
  270.         }
  271.  
  272.         void logRiftStart()
  273.         {
  274.             var game = Hud.Game;
  275.             var player = game.Me;
  276.             logBuilder
  277.             .AppendFormat("rift  {0,20}", "START")
  278.             .AppendLine()
  279.             .AppendFormat("exp   {0,20}", ValueToString(player.ParagonTotalExp, ValueFormat.NormalNumber))
  280.             .AppendLine()
  281.             .AppendFormat("this  {0,20}{1}", ValueToString(player.ParagonExpInThisLevel, ValueFormat.NormalNumber), percent(player.ParagonExpInThisLevel, player.ParagonExpToNextLevel))
  282.             .AppendLine()
  283.             .AppendFormat("next  {0,20}", ValueToString(player.ParagonExpToNextLevel, ValueFormat.NormalNumber))
  284.             .AppendLine();
  285.         }
  286.  
  287.         void logRiftEnd()
  288.         {
  289.             var game = Hud.Game;
  290.             var player = game.Me;
  291.             logBuilder
  292.                 .AppendFormat("rift  {0,20}", "END")
  293.                 .AppendLine()
  294.                 .AppendFormat("exp   {0,20}", ValueToString(player.ParagonTotalExp, ValueFormat.NormalNumber))
  295.                 .AppendLine()
  296.                 .AppendFormat("this  {0,20}{1}", ValueToString(player.ParagonExpInThisLevel, ValueFormat.NormalNumber), percent(player.ParagonExpInThisLevel, player.ParagonExpToNextLevel))
  297.                 .AppendLine()
  298.                 .AppendFormat("next  {0,20}", ValueToString(player.ParagonExpToNextLevel, ValueFormat.NormalNumber))
  299.                 .AppendLine()
  300.                 .AppendFormat("saved {0,20}", ValueToString(savedParagonTotalExp, ValueFormat.NormalNumber))
  301.                 .AppendLine()
  302.                 .AppendFormat("kills {0,20}", ValueToString(savedMobKillsExp, ValueFormat.NormalNumber))
  303.                 .AppendLine();
  304.             if (logDebugData && prevLevelParagonTotalExp > 0)
  305.                 logBuilder
  306.                 .AppendFormat("p-lvl {0,20} {1}-{2}", ValueToString(prevLevelParagonTotalExp, ValueFormat.NormalNumber), firstOfPreviousParagons, LastOfPreviousParagons)
  307.                 .AppendLine();
  308.         }
  309.  
  310.         void logEnterTown()
  311.         {
  312.             var game = Hud.Game;
  313.             var player = game.Me;
  314.             logBuilder
  315.             .AppendFormat("town  {0,20} {1}", "ENTER", riftRunning ? "riftRunning" : "")
  316.             .AppendLine()
  317.             .AppendFormat("exp   {0,20}", ValueToString(player.ParagonTotalExp, ValueFormat.NormalNumber))
  318.             .AppendLine()
  319.             .AppendFormat("this  {0,20}{1}", ValueToString(player.ParagonExpInThisLevel, ValueFormat.NormalNumber), percent(player.ParagonExpInThisLevel, player.ParagonExpToNextLevel))
  320.             .AppendLine()
  321.             .AppendFormat("next  {0,20}", ValueToString(player.ParagonExpToNextLevel, ValueFormat.NormalNumber))
  322.             .AppendLine()
  323.             .AppendFormat("saved {0,20}", ValueToString(savedParagonTotalExp, ValueFormat.NormalNumber))
  324.             .AppendLine()
  325.             .AppendFormat("kills {0,20}", ValueToString(savedMobKillsExp, ValueFormat.NormalNumber))
  326.             .AppendLine();
  327.             if (logDebugData && prevLevelParagonTotalExp > 0)
  328.                 logBuilder
  329.                 .AppendFormat("p-lvl {0,20} {1}-{2}", ValueToString(prevLevelParagonTotalExp, ValueFormat.NormalNumber), firstOfPreviousParagons, LastOfPreviousParagons)
  330.                 .AppendLine();
  331.         }
  332.  
  333.         void logExitTown()
  334.         {
  335.             var game = Hud.Game;
  336.             var player = game.Me;
  337.             logBuilder
  338.             .AppendFormat("town  {0,20} {1}", "EXIT", riftRunning ? "riftRunning" : "")
  339.             .AppendLine()
  340.             .AppendFormat("exp   {0,20}", ValueToString(player.ParagonTotalExp, ValueFormat.NormalNumber))
  341.             .AppendLine()
  342.             .AppendFormat("this  {0,20}{1}", ValueToString(player.ParagonExpInThisLevel, ValueFormat.NormalNumber), percent(player.ParagonExpInThisLevel, player.ParagonExpToNextLevel))
  343.             .AppendLine()
  344.             .AppendFormat("next  {0,20}", ValueToString(player.ParagonExpToNextLevel, ValueFormat.NormalNumber))
  345.             .AppendLine()
  346.             .AppendFormat("saved {0,20}", ValueToString(savedParagonTotalExp, ValueFormat.NormalNumber))
  347.             .AppendLine()
  348.             .AppendFormat("kills {0,20}", ValueToString(savedMobKillsExp, ValueFormat.NormalNumber))
  349.             .AppendLine();
  350.             if (logDebugData && prevLevelParagonTotalExp > 0)
  351.                 logBuilder
  352.                 .AppendFormat("p-lvl {0,20} {1}-{2}", ValueToString(prevLevelParagonTotalExp, ValueFormat.NormalNumber), firstOfPreviousParagons, LastOfPreviousParagons)
  353.                 .AppendLine();
  354.         }
  355.  
  356.         void logParagonChanged()
  357.         {
  358.             var game = Hud.Game;
  359.             var player = game.Me;
  360.             logBuilder
  361.             .AppendFormat("new   {0,20} {1} -> {2}", "PARAGON", savedLevelParagon, player.CurrentLevelParagon)
  362.             .AppendLine()
  363.             .AppendFormat("exp   {0,20}", ValueToString(player.ParagonTotalExp, ValueFormat.NormalNumber))
  364.             .AppendLine()
  365.             .AppendFormat("this  {0,20}{1}", ValueToString(player.ParagonExpInThisLevel, ValueFormat.NormalNumber), percent(player.ParagonExpInThisLevel, player.ParagonExpToNextLevel))
  366.             .AppendLine()
  367.             .AppendFormat("next  {0,20}", ValueToString(player.ParagonExpToNextLevel, ValueFormat.NormalNumber))
  368.             .AppendLine()
  369.             .AppendFormat("p-lvl {0,20} {1}-{2}", ValueToString(prevLevelParagonTotalExp, ValueFormat.NormalNumber), firstOfPreviousParagons, LastOfPreviousParagons)
  370.             .AppendLine();
  371.         }
  372.  
  373.         void logBonusXpReward()
  374.         {
  375.             var game = Hud.Game;
  376.             var player = game.Me;
  377.             long deltaTotXp = player.ParagonTotalExp - savedParagonTotalExp;
  378.             long totalExp = savedMobKillsExp + finalRGKillsExp;
  379.             logBuilder
  380.                 .Append("CHANGE EXP REWARD")
  381.                 .AppendLine()
  382.                 .AppendFormat("exp   {0,20}", ValueToString(player.ParagonTotalExp, ValueFormat.NormalNumber))
  383.                 .AppendLine()
  384.                 .AppendFormat("this  {0,20}{1}", ValueToString(player.ParagonExpInThisLevel, ValueFormat.NormalNumber), percent(player.ParagonExpInThisLevel, player.ParagonExpToNextLevel))
  385.                 .AppendLine()
  386.                 .AppendFormat("next  {0,20}", ValueToString(player.ParagonExpToNextLevel, ValueFormat.NormalNumber))
  387.                 .AppendLine()
  388.                 .AppendFormat("saved {0,20}", ValueToString(savedParagonTotalExp, ValueFormat.NormalNumber))
  389.                 .AppendLine()
  390.                 .AppendFormat("delta {0,20}{1}", ValueToString(deltaTotXp, ValueFormat.NormalNumber), percent(deltaTotXp, player.ParagonExpToNextLevel))
  391.                 .AppendLine()
  392.                 .AppendFormat("kills {0,20}{1}", ValueToString(savedMobKillsExp, ValueFormat.NormalNumber), percent(savedMobKillsExp, player.ParagonExpToNextLevel))
  393.                 .AppendLine()
  394.                 .AppendFormat("boss  {0,20}{1}", ValueToString(finalRGKillsExp, ValueFormat.NormalNumber), percent(finalRGKillsExp, player.ParagonExpToNextLevel))
  395.                 .AppendLine()
  396.                 .AppendFormat("total {0,20}{1}", ValueToString(totalExp, ValueFormat.NormalNumber), percent(totalExp, player.ParagonExpToNextLevel))
  397.                 .AppendLine();
  398.             if (prevLevelParagonTotalExp > 0)
  399.                 logBuilder
  400.                 .AppendFormat("p-lvl {0,20} {1}-{2}", ValueToString(prevLevelParagonTotalExp, ValueFormat.NormalNumber), firstOfPreviousParagons, LastOfPreviousParagons)
  401.                 .AppendLine();
  402.         }
  403.     }
  404. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement