diff --git a/MaxPowerLevel/Controllers/AccountController.cs b/MaxPowerLevel/Controllers/AccountController.cs index 77e2663..5388796 100644 --- a/MaxPowerLevel/Controllers/AccountController.cs +++ b/MaxPowerLevel/Controllers/AccountController.cs @@ -201,6 +201,7 @@ public async Task Dashboard(BungieMembershipType type, long id) Items = maxGear[item.Key].Values, PowerLevel = _maxPower.ComputePower(maxGear[item.Key].Values), Progressions = profile.CharacterProgressions.Data[item.Key].Progressions, + Milestones = profile.CharacterProgressions.Data[item.Key].Milestones, Engrams = engrams[item.Key] }); var recommendations = await _recommendations.GetRecommendations(recomendationInfo); diff --git a/MaxPowerLevel/Controllers/CharacterController.cs b/MaxPowerLevel/Controllers/CharacterController.cs index 0b33272..506500f 100644 --- a/MaxPowerLevel/Controllers/CharacterController.cs +++ b/MaxPowerLevel/Controllers/CharacterController.cs @@ -115,6 +115,7 @@ public async Task Details(int type, long id, long characterId) Items = maxGear.Values, PowerLevel = maxPower, Progressions = characterProgressions.Progressions.Data.Progressions, + Milestones = characterProgressions.Progressions.Data.Milestones, Engrams = engrams }); diff --git a/MaxPowerLevel/MaxPowerLevel.csproj b/MaxPowerLevel/MaxPowerLevel.csproj index d110809..924fe8e 100644 --- a/MaxPowerLevel/MaxPowerLevel.csproj +++ b/MaxPowerLevel/MaxPowerLevel.csproj @@ -4,8 +4,8 @@ ed64c0be-3d6b-4283-b887-4dcb9de6293a - - - + + + \ No newline at end of file diff --git a/MaxPowerLevel/Models/CharacterRecomendationInfo.cs b/MaxPowerLevel/Models/CharacterRecomendationInfo.cs index c1daf98..b47c5d5 100644 --- a/MaxPowerLevel/Models/CharacterRecomendationInfo.cs +++ b/MaxPowerLevel/Models/CharacterRecomendationInfo.cs @@ -20,6 +20,7 @@ public decimal PowerLevel } public int IntPowerLevel { get; private set; } public IDictionary Progressions { get; set; } + public IDictionary Milestones { get; set; } public IEnumerable Engrams { get; set; } } } diff --git a/MaxPowerLevel/Models/PinnacleActivity.cs b/MaxPowerLevel/Models/PinnacleActivity.cs index 193b345..eba7c16 100644 --- a/MaxPowerLevel/Models/PinnacleActivity.cs +++ b/MaxPowerLevel/Models/PinnacleActivity.cs @@ -6,11 +6,14 @@ public class PinnacleActivity { public string Name { get; } + public uint MilestoneHash { get; } + public ItemSlot.SlotHashes[][] Encounters { get; } - public PinnacleActivity(string name, ItemSlot.SlotHashes[][] encounters) + public PinnacleActivity(string name, uint milestonHash, ItemSlot.SlotHashes[][] encounters) { Name = name; + MilestoneHash = milestonHash; Encounters = encounters; } diff --git a/MaxPowerLevel/Services/AbstractRecommendations.cs b/MaxPowerLevel/Services/AbstractRecommendations.cs index 2e05353..5101099 100644 --- a/MaxPowerLevel/Services/AbstractRecommendations.cs +++ b/MaxPowerLevel/Services/AbstractRecommendations.cs @@ -128,7 +128,7 @@ private IEnumerable GetRecommendations(CharacterRecomendationInf recommendations.Add(recommendation); } - recommendations.AddRange(CreatePinnacleRecommendations(info.IntPowerLevel, info.Items)); + recommendations.AddRange(CreatePinnacleRecommendations(info.IntPowerLevel, info.Items, info.Milestones)); return recommendations; } @@ -258,14 +258,26 @@ private static string GetDisplayString(string description, IEnumerable<(ItemSlot protected abstract IEnumerable CreatePinnacleActivities(); protected virtual IEnumerable CreateWeakPinnacleActivities() => Enumerable.Empty(); - protected virtual IEnumerable CreatePinnacleRecommendations(int powerLevel, IEnumerable items) + protected virtual IEnumerable GetAvailablePinnacleActivities(IDictionary milestones) + { + return CreatePinnacleActivities() + .Where(p => p.MilestoneHash == uint.MinValue || milestones.ContainsKey(p.MilestoneHash)); + } + + protected virtual IEnumerable GetAvailableWeakPinnacleActivities(IDictionary milestones) + { + return CreateWeakPinnacleActivities() + .Where(p => p.MilestoneHash == uint.MinValue || milestones.ContainsKey(p.MilestoneHash)); + } + + protected virtual IEnumerable CreatePinnacleRecommendations(int powerLevel, IEnumerable items, IDictionary activities) { var powerLevels = items.ToDictionary(item => item.Slot.Hash, item => (decimal)item.PowerLevel); var strongPinnacles = new Recommendation("Pinnacle Engrams", - SortPinnacleActivites(CreatePinnacleActivities(), powerLevels)); + SortPinnacleActivites(GetAvailablePinnacleActivities(activities), powerLevels)); var weakPinnacles = new Recommendation("Pinnacle Engrams (Weak)", - SortPinnacleActivites(CreateWeakPinnacleActivities(), powerLevels)); + SortPinnacleActivites(GetAvailableWeakPinnacleActivities(activities), powerLevels)); var levelsToGo = HardCap - powerLevel; if (levelsToGo <= 2) diff --git a/MaxPowerLevel/Services/PinnacleActivities.cs b/MaxPowerLevel/Services/PinnacleActivities.cs index 7ccbd69..6c21658 100644 --- a/MaxPowerLevel/Services/PinnacleActivities.cs +++ b/MaxPowerLevel/Services/PinnacleActivities.cs @@ -18,17 +18,17 @@ static class PinnacleActivities }; public static readonly PinnacleActivity Strikes = - new PinnacleActivity("Weekly Vanguard Strikes", new[] { AllSlots }); + new PinnacleActivity("Weekly Vanguard Strikes", 1437935813, new[] { AllSlots }); public static readonly PinnacleActivity Crucible = - new PinnacleActivity("Crucible Playlist Challenge", new[] { AllSlots }); + new PinnacleActivity("Crucible Playlist Challenge", 3312774044, new[] { AllSlots }); public static readonly PinnacleActivity Gambit = - new PinnacleActivity("Gambit", new[] { AllSlots }); + new PinnacleActivity("Gambit", 3448738070, new[] { AllSlots }); public static readonly PinnacleActivity Clan = - new PinnacleActivity("Clan Rewards", new[] { AllSlots }); + new PinnacleActivity("Clan Rewards", 3603098564, new[] { AllSlots }); public static readonly PinnacleActivity NightfallScore = - new PinnacleActivity("Nightfall: The Ordeal Weekly Score", new[] { PinnacleActivities.AllSlots }); + new PinnacleActivity("Nightfall: The Ordeal Weekly Score", 2029743966, new[] { PinnacleActivities.AllSlots }); - public static readonly PinnacleActivity Prophecy = new PinnacleActivity("Prophecy", new[] + public static readonly PinnacleActivity Prophecy = new PinnacleActivity("Prophecy", 825965416, new[] { new[] { diff --git a/MaxPowerLevel/Services/YearFour/Season12Recommendations.cs b/MaxPowerLevel/Services/YearFour/Season12Recommendations.cs index ad12b57..b2e8fe0 100644 --- a/MaxPowerLevel/Services/YearFour/Season12Recommendations.cs +++ b/MaxPowerLevel/Services/YearFour/Season12Recommendations.cs @@ -26,8 +26,8 @@ protected override IEnumerable CreatePinnacleActivities() var year4Pinnacles = base.CreatePinnacleActivities(); return year4Pinnacles.Concat(new[] { - new PinnacleActivity("Weekly Wrathborn Hunts", new[] { PinnacleActivities.AllSlots }), - new PinnacleActivity("Coup Dê Grace", new[] { PinnacleActivities.AllSlots }), + new PinnacleActivity("Weekly Wrathborn Hunts", 2406589846, new[] { PinnacleActivities.AllSlots }), + new PinnacleActivity("Coup Dê Grace", uint.MinValue, new[] { PinnacleActivities.AllSlots }), //can't find the hash for coup }); } } diff --git a/MaxPowerLevel/Services/YearFour/Season13Recommendations.cs b/MaxPowerLevel/Services/YearFour/Season13Recommendations.cs index b733fdf..74f65df 100644 --- a/MaxPowerLevel/Services/YearFour/Season13Recommendations.cs +++ b/MaxPowerLevel/Services/YearFour/Season13Recommendations.cs @@ -1,4 +1,7 @@ using Destiny2; +using MaxPowerLevel.Models; +using System.Collections.Generic; +using System.Linq; namespace MaxPowerLevel.Services.YearFour { @@ -16,5 +19,14 @@ public Season13Recommendations(IManifest manifest, SeasonPass seasonPass) protected override int HardCap => 1310; protected override uint SeasonHash => 2809059426; + + protected override IEnumerable CreatePinnacleActivities() + { + var year4Pinnacles = base.CreatePinnacleActivities(); + return year4Pinnacles.Concat(new[] + { + new PinnacleActivity("Presage", uint.MinValue, new[] { PinnacleActivities.AllSlots }) + }); + } } } \ No newline at end of file diff --git a/MaxPowerLevel/Services/YearFour/Year4Recommendations.cs b/MaxPowerLevel/Services/YearFour/Year4Recommendations.cs index 0e9ffde..4018a47 100644 --- a/MaxPowerLevel/Services/YearFour/Year4Recommendations.cs +++ b/MaxPowerLevel/Services/YearFour/Year4Recommendations.cs @@ -18,7 +18,7 @@ protected override IEnumerable CreatePinnacleActivities() return new[] { PinnacleActivities.NightfallScore, - new PinnacleActivity("Deep Stone Crypt", new[] + new PinnacleActivity("Deep Stone Crypt", 541780856, new[] { new[] { @@ -49,10 +49,11 @@ protected override IEnumerable CreatePinnacleActivities() ItemSlot.SlotHashes.Power // Sword and HMG }, }), - new PinnacleActivity("Weekly Exo Challenge", new[] { PinnacleActivities.AllSlots }), - new PinnacleActivity("Weekly Empire Hunts", new[] { PinnacleActivities.AllSlots }), + new PinnacleActivity("Weekly Exo Challenge", 1713200903, new[] { PinnacleActivities.AllSlots }), + new PinnacleActivity("Weekly Empire Hunts", 291895718, new[] { PinnacleActivities.AllSlots }), PinnacleActivities.Prophecy, - new PinnacleActivity("Harbringer", new[] { PinnacleActivities.AllSlots }) + new PinnacleActivity("Harbinger",1086730368, new[] { PinnacleActivities.AllSlots }), + }; } diff --git a/MaxPowerLevel/Services/YearThree/Season11Recommendations.cs b/MaxPowerLevel/Services/YearThree/Season11Recommendations.cs index 8fa4331..38fcbdf 100644 --- a/MaxPowerLevel/Services/YearThree/Season11Recommendations.cs +++ b/MaxPowerLevel/Services/YearThree/Season11Recommendations.cs @@ -31,7 +31,7 @@ protected override IEnumerable CreatePinnacleActivities() .Concat(new[] { PinnacleActivities.Prophecy, - new PinnacleActivity(DarkTimes, new[] { PinnacleActivities.AllSlots }) + new PinnacleActivity(DarkTimes, uint.MinValue, new[] { PinnacleActivities.AllSlots }) //can't find the hash }); } } diff --git a/MaxPowerLevel/Services/YearThree/Season9Recommendations.cs b/MaxPowerLevel/Services/YearThree/Season9Recommendations.cs index a7e2413..c9ebf76 100644 --- a/MaxPowerLevel/Services/YearThree/Season9Recommendations.cs +++ b/MaxPowerLevel/Services/YearThree/Season9Recommendations.cs @@ -23,7 +23,7 @@ protected override IEnumerable CreatePinnacleActivities() return base.CreatePinnacleActivities() .Concat(new[] { - new PinnacleActivity(SundialLegend, new[] + new PinnacleActivity(SundialLegend, uint.MinValue, new[] //can't find the hash for sundial { new[] { diff --git a/MaxPowerLevel/Services/YearThree/Year3Recommendations.cs b/MaxPowerLevel/Services/YearThree/Year3Recommendations.cs index 67903f7..e634a0c 100644 --- a/MaxPowerLevel/Services/YearThree/Year3Recommendations.cs +++ b/MaxPowerLevel/Services/YearThree/Year3Recommendations.cs @@ -23,7 +23,7 @@ protected override IEnumerable CreatePinnacleActivities() return new[] { // Pit of Heresy can drop armor - new PinnacleActivity(PitOfHeresy, new[] + new PinnacleActivity(PitOfHeresy, uint.MinValue, new[] //can't find the hash for PoH { new[] { @@ -35,11 +35,11 @@ protected override IEnumerable CreatePinnacleActivities() } }), // Nightmare Hunt: Master can drop anything - new PinnacleActivity(MasterNightmareHunt, new[] { PinnacleActivities.AllSlots }), + new PinnacleActivity(MasterNightmareHunt, 291895718, new[] { PinnacleActivities.AllSlots }), // Nightfall: The Ordeal Weekly Score can drop anything PinnacleActivities.NightfallScore, // Garden of Salvation - new PinnacleActivity(GardenOfSalvation, new[] + new PinnacleActivity(GardenOfSalvation, 2712317338, new[] { // Encounter 1 drops Bow (Kinetic), Fusion Rifle (Energy), Boots new[]