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)); }
private async Task <IEnumerable <Perk> > LoadReusablePlugItems(DestinyItemSocketEntryDefinition socketEntry) { var tasks = socketEntry.ReusablePlugItems.Select(reusablePlug => LoadPerk(reusablePlug.PlugItemHash, false)); var perks = await Task.WhenAll(tasks); return(perks); }
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)); }
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); }
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)); }