Example #1
0
        private async Task <Socket> CreateSocket(DestinyItemSocketEntryDefinition socketEntry,
                                                 DestinySocketTypeDefinition socketType, DestinySocketCategoryDefinition categoryDef,
                                                 IEnumerable <Mod> mods, IEnumerable <Mod> shaders, IEnumerable <Perk> perks)
        {
            var availablePerks = await _perkFactory.LoadAvailablePerks(socketEntry,
                                                                       socketType, categoryDef, mods, shaders, perks);

            var selectedPerk = perks?.FirstOrDefault(perk => perk.IsSelected);

            if (selectedPerk == null)
            {
                selectedPerk = await _perkFactory.LoadPerk(socketEntry.SingleInitialItemHash, true);
            }

            var currentPerk = availablePerks.FirstOrDefault(perk => perk.Hash == selectedPerk.Hash);

            if (currentPerk == null)
            {
                availablePerks = availablePerks.Concat(new[] { selectedPerk });
            }
            else if (!currentPerk.IsSelected)
            {
                currentPerk.IsSelected = true;
            }

            return(new Socket(selectedPerk, availablePerks));
        }
Example #2
0
        private async Task <Socket> CreateSocket(DestinyItemSocketEntryDefinition socketEntry,
                                                 DestinySocketTypeDefinition socketType, DestinySocketCategoryDefinition categoryDef,
                                                 DestinyItemSocketState socketState)
        {
            Perk selectedPerk = null;

            if (socketState.PlugHash != 0)
            {
                selectedPerk = await _perkFactory.LoadPerk(socketState.PlugHash, true);
            }

            return(new Socket(selectedPerk, null));
        }
Example #3
0
        private IEnumerable <Perk> FindCompatibleMods(DestinyItemSocketEntryDefinition socketEntry,
                                                      DestinySocketTypeDefinition socketType, IEnumerable <Mod> mods, IEnumerable <Mod> shaders)
        {
            var categories = socketType.PlugWhiteList.Select(whiteListEntry => whiteListEntry.CategoryHash)
                             .ToHashSet();

            var compatibleMods = mods.Where(mod => categories.Contains(mod.CategoryHash));

            if (!compatibleMods.Any())
            {
                compatibleMods = shaders.Where(shader => categories.Contains(shader.CategoryHash));
            }
            return(compatibleMods);
        }
Example #4
0
        public async Task <IEnumerable <Perk> > LoadAvailablePerks(DestinyItemSocketEntryDefinition socketEntry,
                                                                   DestinySocketTypeDefinition socketType, DestinySocketCategoryDefinition categoryDef,
                                                                   IEnumerable <Mod> mods, IEnumerable <Mod> shaders, IEnumerable <Perk> currentPerks)
        {
            var perkGroups = new List <IEnumerable <Perk> >();

            if (socketEntry.PlugSources.HasFlag(SocketPlugSources.InventorySourced))
            {
                switch (categoryDef.CategoryStyle)
                {
                case DestinySocketCategoryStyle.Reusable:
                {
                    if (!socketEntry.ReusablePlugItems?.Any() ?? true)
                    {
                        // use the (only?) perk in the current perks
                        perkGroups.Add(currentPerks);
                    }
                    else
                    {
                        var perks = await LoadReusablePlugItems(socketEntry);

                        perkGroups.Add(perks);
                    }
                    break;
                }

                case DestinySocketCategoryStyle.Consumable:
                {
                    // Why does the Masterwork Armor slot get here?!?!?
                    if (ShouldLoadFromReusablePlugItems(socketType))
                    {
                        // All of the possible Masterwork armor plugs are in the
                        // ReusablePlugItems on the SocketEntry.
                        var perks = await LoadReusablePlugItems(socketEntry);

                        perkGroups.Add(perks);
                    }
                    else
                    {
                        var perks = FindCompatibleMods(socketEntry, socketType, mods, shaders);
                        perkGroups.Add(perks);
                    }
                    break;
                }

                case DestinySocketCategoryStyle.Unlockable:
                {
                    // Only known case of getting here is ghost shell perks.
                    // Treat these like normal item perks and hope for the best.
                    goto case DestinySocketCategoryStyle.Reusable;
                }

                default:
                {
                    // Not sure if we'll ever get here...
                    throw new Exception($"Unexpected DestinySocketCategoryStyle: {categoryDef.CategoryStyle}");
                }
                }
            }

            if (socketEntry.PlugSources.HasFlag(SocketPlugSources.ReusablePlugItems))
            {
                perkGroups.Add(currentPerks);
            }

            if (socketEntry.PlugSources.HasFlag(SocketPlugSources.ProfilePlugSet))
            {
                // TODO: Load from ProfilePlugSets
            }

            if (socketEntry.PlugSources.HasFlag(SocketPlugSources.CharacterPlugSet))
            {
                // TODO: Load from CharacterPlugSets
            }

            return(perkGroups.Where(perkGroup => perkGroup != null).SelectMany(perkGroup => perkGroup));
        }
Example #5
0
 private static bool ShouldLoadFromReusablePlugItems(DestinySocketTypeDefinition socketType) =>
 _loadFromReusablePlugItemSocketTypeHashes.Contains(socketType.Hash);