Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using Turbo.Plugins.Default;
- using System.Linq;
- using System.Collections.Generic;
- namespace Turbo.Plugins.Thd3fp
- {
- public class ParagonCalculator : BasePlugin, IInGameTopPainter, IAfterCollectHandler
- {
- public IFont TextFont { get; set; }
- public IFont ParaFont { get; set; }
- public string LabelTextPart1 { get; set; } = "Paragons";
- public string LabelTextPart2 { get; set; } = "after Season:";
- private List<Player> ListPlayers;
- private float[] LabelLPointParaSoft = new float[] { 0, 0 };
- private float[] LabelLPointParaHard = new float[] { 0, 0 };
- private float LabelRightXsoft = 0;
- private float LabelRightXhard = 0;
- private long RefreshTimer = 0;
- private const uint RefreshTimeMs = 200;
- public static double ParagonToExperience(int paragon)
- {
- return CalcParaAndXp(paragon);
- }
- public static int ExperienceToParagon(double experience)
- {
- const int rangePara = 40000;
- return (int)CalcParaAndXp(rangePara, experience);
- }
- public ParagonCalculator()
- {
- Enabled = true;
- }
- public override void Load(IController hud)
- {
- base.Load(hud);
- TextFont = Hud.Render.CreateFont("tahoma", 8, 255, 181, 139, 72, false, false, false);
- ParaFont = Hud.Render.CreateFont("tahoma", 8, 255, 225, 225, 225, false, false, false);
- ListPlayers = new List<Player>();
- RefreshTimer = Hud.Game.CurrentRealTimeMilliseconds;
- }
- public void PaintTopInGame(ClipState clipState)
- {
- if (!Hud.Game.Me.IsInGame && clipState != ClipState.AfterClip)
- return;
- if ((!UiNonSeasonSummary() && !UiSeasonSummary()) || !IsPlayedInCurrentSeason()) // show/draw in profile NonSeason/Season Summary only if login in game with season hero
- return;
- var offsetY = Hud.Window.Size.Height * 0.02f;
- float x, y;
- var player = ListPlayers.FirstOrDefault(p => p.Name == UiProfileName());
- if (player?.SeasonSoftCoreParagon > 0)
- {
- x = LabelLPointParaSoft[0];
- y = LabelLPointParaSoft[1] - offsetY;
- var curInRect = Hud.Window.CursorInsideRect(x, y, LabelRightXsoft - x, offsetY);
- var paraTextSum = " (" + player.NonSeasonSoftCoreParagon + "+" + player.SeasonSoftCoreParagon + ")";
- TextFont.DrawText(LabelTextPart1 + (curInRect ? paraTextSum : "") + " " + LabelTextPart2, x, y);
- var layout = ParaFont.GetTextLayout(player.AfterSeasonSoftCoreParagon.ToString());
- x = LabelRightXsoft - layout.Metrics.Width;
- ParaFont.DrawText(layout, x, y);
- }
- if (player?.SeasonHardCoreParagon > 0)
- {
- x = LabelLPointParaHard[0];
- y = LabelLPointParaHard[1] - offsetY;
- var curInRect = Hud.Window.CursorInsideRect(x, y, LabelRightXhard - x, offsetY);
- var paraTextSum = " (" + player.NonSeasonHardCoreParagon + "+" + player.SeasonHardCoreParagon + ")";
- TextFont.DrawText(LabelTextPart1 + (curInRect ? paraTextSum : "") + " " + LabelTextPart2, x, y);
- var layout = ParaFont.GetTextLayout(player.AfterSeasonHardCoreParagon.ToString());
- x = LabelRightXhard - layout.Metrics.Width;
- var friendList = Hud.Render.GetUiElement("Root.NormalLayer.BattleNetFriendsList_main.LayoutRoot.OverlayContainer.FriendsListContent");
- var communities = Hud.Render.GetUiElement("Root.NormalLayer.GroupList_main.LayoutRoot.OverlayContainer.GroupsListContent");
- if (friendList?.Visible != true && communities?.Visible != true)
- ParaFont.DrawText(layout, x, y);
- }
- }
- private bool IsPlayedInCurrentSeason()
- {
- if (Hud.Game.Me.Hero == null)
- return false;
- int lastPlayedSeasonNumber = 0;
- var path = "Root.NormalLayer.BattleNetProfile_main.LayoutRoot.OverlayContainer.CategoryList._content._stackpanel._item3.NavigationMenuListItemContainer.MenuListItem.MenuSubItem.MenuSubList._content._stackpanel._item0.SubListItemDown.SubListItemDownValue";
- var uiLastPlayedSeason = Hud.Render.GetUiElement(path);
- if (uiLastPlayedSeason == null)
- uiLastPlayedSeason = Hud.Render.RegisterUiElement(path, uiLastPlayedSeason, null);
- if (uiLastPlayedSeason != null)
- {
- var lastPlayedSeasonText = uiLastPlayedSeason.ReadText(System.Text.Encoding.Default, removeColors: true);
- var lastPlayedSeasonTexttNumber = lastPlayedSeasonText != null ? new string(lastPlayedSeasonText.Where(char.IsDigit).ToArray()) : null; // remove non Digit symbols form string
- if (int.TryParse(lastPlayedSeasonTexttNumber, out int _seasonNumber))
- lastPlayedSeasonNumber = _seasonNumber;
- var currentSeasonNumber = Hud.Game.Me.Hero.Season;
- return Hud.Game.Me.Hero.Seasonal && (lastPlayedSeasonNumber == currentSeasonNumber);
- }
- return false;
- }
- private bool UiNonSeasonSummary()
- {
- var path = "Root.NormalLayer.BattleNetProfile_main.LayoutRoot.OverlayContainer.CategoryList._content._stackpanel._item0.NavigationMenuListItemContainer.MenuListItem.MenuSubItem.MenuSubList._content._stackpanel._item0.SubListItemDown.SubListItemDownValue";
- var uiNonSeasonSummary = Hud.Render.GetUiElement(path);
- if (uiNonSeasonSummary == null)
- uiNonSeasonSummary = Hud.Render.RegisterUiElement(path, uiNonSeasonSummary, null);
- return uiNonSeasonSummary.Visible;
- }
- private bool UiSeasonSummary()
- {
- var path = "Root.NormalLayer.BattleNetProfile_main.LayoutRoot.OverlayContainer.CategoryList._content._stackpanel._item3.NavigationMenuListItemContainer.MenuListItem.MenuSubItem.MenuSubList._content._stackpanel._item0.MenuTertiaryList._content._stackpanel._item0.TertiaryListItemDown.TertiaryListItemDownValue";
- var uiNonSeasonSummary = Hud.Render.GetUiElement(path);
- if (uiNonSeasonSummary == null)
- uiNonSeasonSummary = Hud.Render.RegisterUiElement(path, uiNonSeasonSummary, null);
- return uiNonSeasonSummary.Visible;
- }
- private string UiProfileName()
- {
- string name = "";
- var path = "Root.NormalLayer.BattleNetProfile_main.LayoutRoot.OverlayContainer.PageHeader.PageTitle";
- var uiNonSeasonSummary = Hud.Render.GetUiElement(path);
- if (uiNonSeasonSummary == null)
- uiNonSeasonSummary = Hud.Render.RegisterUiElement(path, uiNonSeasonSummary, null);
- if (uiNonSeasonSummary.Visible)
- return uiNonSeasonSummary.ReadText(System.Text.Encoding.Default, removeColors: true);
- return name;
- }
- // can convert paragon to experience and experience to paragon
- // when parameter experience == -1 // returns(convert) paragon to experience
- // when parameter experience > 0 // returns(convert) experience to paragon, parameter paragon in this case must be a large number e.g. 20000 or 30000
- private static double CalcParaAndXp(int paragon, double experience = -1)
- {
- if (paragon == 0 || experience == 0)
- return 0;
- double paragonTotalExp = 0, xpToNextLvl = 0, diffNextLvl = 0, xpToParagon = 0;
- for (int i = 1; i <= paragon; i++)
- {
- if (i == 1)
- paragonTotalExp = xpToNextLvl += 7200000;
- else if (i > 1 && i <= 60)
- paragonTotalExp += xpToNextLvl += 1440000;
- else if (i > 60 && i <= 70)
- paragonTotalExp += xpToNextLvl += 2880000;
- else if (i > 70 && i <= 73)
- paragonTotalExp += xpToNextLvl += 5040000;
- else if (i == 74)
- paragonTotalExp += xpToNextLvl += 3660000;
- else if (i > 74 && i <= 149)
- paragonTotalExp += xpToNextLvl += 1020000;
- else if (i > 149 && i <= 250)
- paragonTotalExp += xpToNextLvl += 2040000;
- else if (i > 250 && i <= 350)
- paragonTotalExp += xpToNextLvl += 4080000;
- else if (i > 350 && i <= 449)
- paragonTotalExp += xpToNextLvl += 6120000;
- else if (i > 449 && i <= 500)
- paragonTotalExp += xpToNextLvl += 8160000;
- else if (i > 500 && i <= 550)
- paragonTotalExp += xpToNextLvl += 20400000;
- else if (i > 550 && i <= 600)
- paragonTotalExp += xpToNextLvl += 40800000;
- else if (i > 600 && i <= 650)
- paragonTotalExp += xpToNextLvl += 61200000;
- else if (i > 650 && i <= 700)
- paragonTotalExp += xpToNextLvl += 81600000;
- else if (i > 700 && i <= 750)
- paragonTotalExp += xpToNextLvl += 102000000;
- else if (i > 750 && i <= 2250)
- paragonTotalExp += xpToNextLvl += 122400000;
- else if (i == 2251)
- paragonTotalExp += xpToNextLvl += diffNextLvl = 229602000;
- else if (i > 2251)
- {
- diffNextLvl *= (i + 1f) / i;
- diffNextLvl = diffNextLvl % 1000 >= 500 ? diffNextLvl + 1000 - diffNextLvl % 1000 : diffNextLvl - diffNextLvl % 1000; // rounds to 1000
- xpToNextLvl += diffNextLvl;
- paragonTotalExp += xpToNextLvl;
- }
- if (experience >= 0)
- {
- if (paragonTotalExp <= experience)
- xpToParagon = i;
- else
- return xpToParagon; // xp to paragons
- }
- }
- return paragonTotalExp; // paragons to xp
- }
- // returns Paragons from profile softcor/hardcore
- // index [0] = paragon
- // index [1] = right point X on pragon label number
- // path - UiElement string path for soft/hardcore paragon label
- int[] GetParagon(string path)
- {
- var uiPragon = Hud.Render.GetUiElement(path);
- if (uiPragon == null)
- uiPragon = Hud.Render.RegisterUiElement(path, uiPragon, null);
- if (uiPragon != null)
- {
- var paraText = uiPragon.ReadText(System.Text.Encoding.Default, removeColors: true);
- paraText = paraText != null ? new string(paraText.Where(char.IsDigit).ToArray()) : null; // remove non Digit symbols form string, like '.' or ','
- if (int.TryParse(paraText, out int paraNumber))
- return new int[] { paraNumber, (int)uiPragon.Rectangle.Right };
- }
- return new int[] { 0, 0 };
- }
- // returns upper-left corner on label in profile "Paragon Level:"
- float[] GetLeftPointLabelParagonLevel(string path)
- {
- var uiPragon = Hud.Render.GetUiElement(path);
- if (uiPragon == null)
- uiPragon = Hud.Render.RegisterUiElement(path, uiPragon, null);
- if (uiPragon?.Visible == true)
- return new float[] { uiPragon.Rectangle.X, uiPragon.Rectangle.Y };
- return new float[] { 0, 0 };
- }
- public void AfterCollect()
- {
- if (!Hud.Game.Me.IsInGame || !IsPlayedInCurrentSeason()) // only if login in game with season hero
- return;
- var isUiNonSeasonSummary = UiNonSeasonSummary();
- var isUiSeasonSummary = UiSeasonSummary();
- if (!isUiNonSeasonSummary && !isUiSeasonSummary)
- return;
- if (Hud.Game.CurrentRealTimeMilliseconds - RefreshTimer < RefreshTimeMs)
- return;
- RefreshTimer = Hud.Game.CurrentRealTimeMilliseconds;
- var uiProfileName = UiProfileName();
- var paraSoftCore = GetParagon("Root.NormalLayer.BattleNetProfile_main.LayoutRoot.OverlayContainer.CareerTabContent.CharacterStats.NormalParagonValue");
- var paraHardCore = GetParagon("Root.NormalLayer.BattleNetProfile_main.LayoutRoot.OverlayContainer.CareerTabContent.CharacterStats.HighestHardcoreParagonValue");
- LabelLPointParaSoft = GetLeftPointLabelParagonLevel("Root.NormalLayer.BattleNetProfile_main.LayoutRoot.OverlayContainer.CareerTabContent.CharacterStats.unnamed16");
- LabelLPointParaHard = GetLeftPointLabelParagonLevel("Root.NormalLayer.BattleNetProfile_main.LayoutRoot.OverlayContainer.CareerTabContent.CharacterStats.unnamed18");
- LabelRightXsoft = paraSoftCore[1];
- LabelRightXhard = paraHardCore[1];
- if (!ListPlayers.Any(p => p.Name == uiProfileName))
- ListPlayers.Add(new Player() { Name = uiProfileName });
- var player = ListPlayers.FirstOrDefault(p => p.Name == uiProfileName);
- if (player == null)
- return;
- if (isUiNonSeasonSummary)
- {
- player.NonSeasonSoftCoreParagon = paraSoftCore[0];
- player.NonSeasonHardCoreParagon = paraHardCore[0];
- }
- else if (isUiSeasonSummary)
- {
- player.SeasonSoftCoreParagon = paraSoftCore[0];
- player.SeasonHardCoreParagon = paraHardCore[0];
- }
- }
- private class Player
- {
- public string Name { get; set; }
- public int NonSeasonSoftCoreParagon { get; set; }
- public int SeasonSoftCoreParagon { get; set; }
- public int AfterSeasonSoftCoreParagon
- {
- get { return ParagonCalculator.ExperienceToParagon(ParagonCalculator.ParagonToExperience(NonSeasonSoftCoreParagon) + ParagonCalculator.ParagonToExperience(SeasonSoftCoreParagon)); }
- }
- public int NonSeasonHardCoreParagon { get; set; }
- public int SeasonHardCoreParagon { get; set; }
- public int AfterSeasonHardCoreParagon
- {
- get { return ParagonCalculator.ExperienceToParagon(ParagonCalculator.ParagonToExperience(NonSeasonHardCoreParagon) + ParagonCalculator.ParagonToExperience(SeasonHardCoreParagon)); }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement