示例#1
0
        private IBuild ConvertXmlBuild(XmlPathOfBuilding xmlBuild)
        {
            var items = ConvertItems(xmlBuild.Items.Items);
            var gems  = ConvertSkills(xmlBuild.Skills.Skills).ToList();
            var specs = xmlBuild.Tree.Specs;

            if (specs.IsEmpty())
            {
                return(ConvertXmlBuild(xmlBuild, new XmlPathOfBuildingTreeSpec {
                    Url = Constants.DefaultTree
                }, items, gems));
            }
            else if (specs.Count == 1)
            {
                return(ConvertXmlBuild(xmlBuild, specs.Single(), items, gems));
            }
            else
            {
                var hasDifferentTreeVersions = specs.Select(s => s.TreeVersion).Distinct().Count() > 1;
                var folder = new BuildFolder {
                    Name = "PoB Import"
                };
                foreach (var spec in specs)
                {
                    folder.Builds.Add(ConvertXmlBuild(xmlBuild, spec, items, gems, hasDifferentTreeVersions));
                }
                return(folder);
            }
        }
示例#2
0
        private PoEBuild ConvertXmlBuild(
            XmlPathOfBuilding xmlBuild, XmlPathOfBuildingTreeSpec treeSpec, IReadOnlyDictionary <int, Item> items, IEnumerable <PoBGem> gems,
            bool addTreeVersionToName = false)
        {
            var name = treeSpec.Title ?? "Default";

            if (addTreeVersionToName && treeSpec.TreeVersion != null)
            {
                name += $" ({treeSpec.TreeVersion})";
            }
            return(new PoEBuild(
                       new BanditSettings {
                Choice = xmlBuild.Build.Bandit
            },
                       new string[0][],
                       new ushort[0],
                       new ushort[0],
                       ConfigurationStatConverter.Convert(xmlBuild.Config).Concat(ConvertMainSkillConfiguration(xmlBuild)),
                       null)
            {
                ItemData = ConvertItemData(xmlBuild, items, gems, treeSpec.Sockets),
                Level = xmlBuild.Build.Level,
                Name = name,
                Note = xmlBuild.Notes?.Trim(),
                TreeUrl = treeSpec.Url.Trim(),
            });
        }
示例#3
0
        private static IEnumerable <(string, double?)> ConvertMainSkillConfiguration(XmlPathOfBuilding xmlBuild)
        {
            if (xmlBuild.Skills.Skills.Count < xmlBuild.Build.MainSocketGroup)
            {
                yield break;
            }

            var xmlSkill = xmlBuild.Skills.Skills[xmlBuild.Build.MainSocketGroup - 1];
            var slot     = ConvertItemSlot(xmlSkill.Slot, ItemSlot.Amulet);

            yield return("Character.MainSkillItemSlot", (int)slot);

            if (xmlSkill.Gems.Count < xmlSkill.MainActiveSkill)
            {
                yield break;
            }
            yield return("Character.MainSkillSocketIndex", xmlSkill.MainActiveSkill);

            var xmlGem = xmlSkill.Gems[xmlSkill.MainActiveSkill - 1];

            if (xmlGem.SkillPart > 0)
            {
                yield return("Character.MainSkillPart", xmlGem.SkillPart);
            }
        }
        private string ConvertItemData(
            XmlPathOfBuilding xmlBuild, IReadOnlyDictionary <int, Item> items, IEnumerable <Skill> skills, IEnumerable <XmlPathOfBuildingTreeSocket> sockets)
        {
            var itemSerializer = new ItemAttributes(_equipmentData, null !);

            foreach (var(slot, group) in skills.GroupBy(s => s.ItemSlot))
            {
                itemSerializer.SetSkillsInSlot(group.ToList(), slot);
            }

            foreach (var xmlSlot in xmlBuild.Items.Slots)
            {
                var(slotString, socket) = ConvertItemSocket(xmlSlot.Name);
                var slot = ConvertItemSlot(slotString);
                if (slot == ItemSlot.Unequipable)
                {
                    continue;
                }
                var item = new Item(items[xmlSlot.ItemId])
                {
                    IsEnabled = xmlSlot.Active || !slot.IsFlask()
                };
                itemSerializer.SetItemInSlot(item, slot, socket);
            }

            foreach (var xmlTreeSocket in sockets)
            {
                if (items.TryGetValue(xmlTreeSocket.ItemId, out var item))
                {
                    itemSerializer.SetItemInSlot(new Item(item), ItemSlot.SkillTree, (ushort)xmlTreeSocket.NodeId);
                }
            }

            return(itemSerializer.ToJsonString());
        }