Ejemplo n.º 1
0
        /// <summary>
        /// 获取该产品的制造蓝图
        /// </summary>
        /// <returns></returns>
        private BluePrints _getManufactBluePrint()
        {
            if (!_manufactable)
            {
                return(null);
            }

            if (_manufactBluePrint != null)
            {
                return(_manufactBluePrint);
            }

            DCEVEDataContext dc = new DCEVEDataContext();

            // 查找相应的生产记录
            var iap = dc.industryActivityProducts.SingleOrDefault(p => p.activityID == 1 && p.productTypeID == typeID);

            if (iap != null)
            {
                return(_manufactBluePrint = iap.BluePrints);
            }
            else
            {
                return(null);
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 从 ESI 获取价格数据更新本地数据库
        /// </summary>
        /// <param name="location"></param>
        private void UpdateMarketPrice(Locations location)
        {
            DCEVEDataContext dc = new DCEVEDataContext();

            MarketPrice mp;

            if (_marketPriceOfLocation == null)
            {
                // 若该字段为空则说明数据库还没有此数据, 新建一条
                mp = new MarketPrice()
                {
                    TypeID = typeID, LocationID = location.LocationID, ExpiresDateTime = DateTime.MinValue
                };
                dc.MarketPrice.InsertOnSubmit(mp);
            }
            else
            {
                // 若不为空则从新的 DataContext 获取该数据
                mp = dc.MarketPrice.Single(p => p.TypeID == typeID && p.LocationID == location.LocationID);
            }

            // 数据过期时间
            DateTime expriesDateTime = new DateTime();

            // 从 ESI 获取价格数据
            IEnumerable <ESIMarketOrder> marketOrders = ESI.GetMarketOrders(mp.TypeID, location.RegionID, ref expriesDateTime);

            // 仅获取对应位置的数据
            marketOrders = marketOrders.Where(p => p.LocationID == mp.LocationID);

            if (marketOrders.Where(p => p.IsBuyOrder).Count() == 0)
            {
                mp.MaxBuyPrice = 0;
            }
            else
            {
                mp.MaxBuyPrice = marketOrders.Where(p => p.IsBuyOrder).Max(p => p.Price);
            }

            // TODO: 当售价为 0 时, 即没有出售单时, 应该做些处理
            // 设置 PriceAsProduct 和 PriceAsMaterial 属性, 根据不同情况做不同处理
            if (marketOrders.Where(p => !p.IsBuyOrder).Count() == 0)
            {
                mp.MinSellPrice = 0;
            }
            else
            {
                mp.MinSellPrice = marketOrders.Where(p => !p.IsBuyOrder).Min(p => p.Price);
            }

            // 数据过期时间
            mp.ExpiresDateTime = expriesDateTime;

            // 更新数据库
            dc.SubmitChanges();
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 从 ESI 获取所有角色拥有的蓝图信息
        /// </summary>
        /// <returns></returns>
        public static List <OwnedBluePrints> OwnedBluePrintsOfAllCharacters()
        {
            var esiOwnedBluePrints = new List <OwnedBluePrints>();    // ESI 取得的 OwnedBluePrints 数据

            var dc = new DCEVEDataContext();

            // ESI获取所有角色和军团拥有的蓝图
            foreach (var c in dc.Characters)
            {
                // TODO: Z 多线程处理 OwnedBluePrints.Update() -> Characters.GetBluePrints()
                esiOwnedBluePrints.AddRange(c.GetBluePrints());
            }

            return(esiOwnedBluePrints);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 更新系统价格
        /// </summary>
        /// <returns></returns>
        public static bool Update()
        {
            // TODO: 暂时每次启动时更新一次, 后期根据需要修改

            // 数据过期时间
            DateTime expiresIn = new DateTime();

            // 从 ESI 获取系统价格数据
            List <ESIMarketPrice> eSIMarketPrices = ESI.GetMarketPrices(ref expiresIn);

            // 如果获取不成功则返回
            if (eSIMarketPrices == null)
            {
                return(false);
            }

            DCEVEDataContext dc = new DCEVEDataContext();

            dc.UniversePrice.DeleteAllOnSubmit(dc.UniversePrice);       // 清空所有旧数据
            dc.SubmitChanges();

            UniversePrice up;

            foreach (var mp in eSIMarketPrices)
            {
                // 判断物品类型数据库是否有跟踪, 无跟踪则跳过
                if (dc.invTypes.SingleOrDefault(t => t.typeID == mp.TypeID) == null)
                {
                    continue;
                }

                // 新建数据
                up = new UniversePrice();

                // 更新数据
                up.TypeID        = mp.TypeID;
                up.AdjustedPrice = mp.AdjustedPrice;
                up.AveragePrice  = mp.AveragePrice;
                up.ExpiresIn     = expiresIn;

                dc.UniversePrice.InsertOnSubmit(up);
            }

            // 提交数据库
            dc.SubmitChanges();

            return(true);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 更新软件跟踪的所有角色和军团拥有的蓝图信息
        /// </summary>
        /// <returns>若更新成功则返回 True, 应 SubmitChange() </returns>
        public static bool Update()
        {
            DCEVEDataContext dc = new DCEVEDataContext();
            // TODO: First OwnedBluePrints.Update() 执行前, 应该先根据数据库蓝图更新时间, 将从上次更新到目前为止的工业历史更新进数据库蓝图的属性中.()
            DateTime updateTime         = DateTime.Now;                     // 统一更新时间
            var      esiOwnedBluePrints = OwnedBluePrintsOfAllCharacters(); // ESI 取得的 OwnedBluePrints 数据

            var dbOwnedBluePrints = dc.OwnedBluePrints.ToList();            // 数据库上的 OwnedBluePrints 数据 -> 必须调用 ToList() 方法, 否则每次都会重新重数据库获取数据

            // 第一次遍历先将 ItemID 匹配得上且基本属性没有改变的蓝图对象的数据更新
            OwnedBluePrints bluePrintDB;

            for (int i = esiOwnedBluePrints.Count - 1; i >= 0; i--)
            {
                // 查找数据库中对应 ItemID 的蓝图数据 (p.UpdateTime != updateTime 条件筛选掉已更新的数据)
                bluePrintDB = dbOwnedBluePrints.SingleOrDefault(p => p.UpdateTime != updateTime && p.ItemID == esiOwnedBluePrints[i].ItemID);

                // 若没有对应的数据, 则留待下次遍历处理
                if (bluePrintDB == null)
                {
                    continue;
                }

                // 虽然 ItemID 一样, 需通过确认蓝图 BluePrintID 属性是否相同来确认是否是同一个物品
                if (bluePrintDB.BluePrintID != esiOwnedBluePrints[i].BluePrintID)
                {
                    // 若不是同一个物品, 理论上也是将数据的字段更新一下就可以, 但若出现这个问题则属以外情况.
                    // continue;
                    // _updateAllPropertyFromESIData 中没有更新 BluePrintID

                    // 理论上不可能存在这种情况, 若出现,先用一个 MessageBox 提示
                    MessageBox.Show(string.Format("OwnedBluePrints.Update() 更新错误, 数据 ItemID:{0} 能匹配到, 但是物品类型不一样. ", bluePrintDB.ItemID));

                    // 出现错误, 更新失败
                    return(false);
                }

                // 若是蓝图基本属性匹配不上
                if (bluePrintDB.TimeEfficiency != esiOwnedBluePrints[i].TimeEfficiency ||
                    bluePrintDB.MaterialEfficiency != esiOwnedBluePrints[i].MaterialEfficiency ||
                    bluePrintDB.Quantity != esiOwnedBluePrints[i].Quantity ||
                    bluePrintDB.Runs != esiOwnedBluePrints[i].Runs)
                {
                    // 若是同一个物品, 但是物品基本属性变了, 理论上在用户确认后更新物品基本属性即可, 但必须尽量排除, 因为属于可以完全避免出现的情况
                    // TODO: Z 完善工业线程控制后需取消注释 OwnedBluePrints.Update() -> 蓝图基本属性不同时弹窗提示
                    // MessageBox.Show(string.Format("蓝图:{0}, ItemID:{1} 的数据库基本数据与ESI匹配不上.", bluePrintDB.BluePrints.invTypes.Name, bluePrintDB.ItemID), "注意");

                    continue;
                }

                // 用 ESI 蓝图的数据更新数据库蓝图的一般数据
                bluePrintDB._updateGeneralPropertyFromESIData(esiOwnedBluePrints[i]);

                // 统一设置数据更新时间
                bluePrintDB.UpdateTime = updateTime;

                // 更新完数据库蓝图数据后将数据从 ESI 蓝图列表中对应的对象删除
                esiOwnedBluePrints.Remove(esiOwnedBluePrints[i]);
            }

            // 若临时表中没有元素, 且数据库中的数据都已更新过, 则更新完成
            if (esiOwnedBluePrints.Count == 0 && dbOwnedBluePrints.Where(p => p.UpdateTime != updateTime).Count() == 0)
            {
                return(true);
            }
            else
            {
                // 否则, 则必须进行用户确认

                // 新建用户确认窗体
                ESIAndDBConfirm winConfirm = new ESIAndDBConfirm();

                // 表头赋值
                winConfirm.DBListViewColumnHeaders  = ListViewColumnHeaders();
                winConfirm.ESIListViewColumnHeaders = ListViewColumnHeaders();

                // 获取数据库数据中和 ESI 数据匹配不上, 无法更新的数据
                var dbUnMatchBluePrints = dbOwnedBluePrints.Where(p => p.UpdateTime != updateTime);

                // 若有, 则添加到确认窗体的显示列表中
                if (dbUnMatchBluePrints.Count() != 0)
                {
                    foreach (var bp in dbUnMatchBluePrints)
                    {
                        winConfirm.DBListViewItemCollection.Add(bp.ListViewItem());
                    }
                }

                // 若 ESI 数据中还有没更新到数据库的, 也显示到确认窗体中
                if (esiOwnedBluePrints.Count != 0)
                {
                    foreach (var bp in esiOwnedBluePrints)
                    {
                        winConfirm.ESIListViewItemCollection.Add(bp.ListViewItem());
                    }
                }

                // 确认窗体载入数据
                winConfirm.LoadListViewData();

                // 若用户确认变更
                if (winConfirm.ShowDialog() == DialogResult.OK)
                {
                    // 关掉窗体
                    winConfirm.Close();

                    // 先遍历 ESI 数据将 ItemID 相同得数据更新到数据库
                    for (int i = esiOwnedBluePrints.Count - 1; i >= 0; i--)
                    {
                        // 查找数据库中对应 ItemID 的蓝图数据 (p.UpdateTime != updateTime 条件筛选掉已更新的数据)
                        bluePrintDB = dbOwnedBluePrints.SingleOrDefault(p => p.UpdateTime != updateTime && p.ItemID == esiOwnedBluePrints[i].ItemID);

                        if (bluePrintDB != null)
                        {
                            // 更新数据库对象除了 ItemID 和 BluePrintID 以外的所有字段
                            bluePrintDB._updateAllPropertyFromESIData(esiOwnedBluePrints[i]);
                            bluePrintDB.UpdateTime = updateTime;

                            // 更新完数据库蓝图数据后将数据从 ESI 蓝图列表中对应的对象删除
                            esiOwnedBluePrints.RemoveAt(i);
                        }
                    }

                    // 若此时数据库中还有未更新到的蓝图数据, 则说明游戏中是没有该数据了, 要从数据库中删除
                    dbUnMatchBluePrints = dbOwnedBluePrints.Where(p => p.UpdateTime != updateTime);
                    if (dbUnMatchBluePrints.Count() != 0)
                    {
                        dc.OwnedBluePrints.DeleteAllOnSubmit(dbUnMatchBluePrints);
                    }

                    // 若 ESI 数据还没有匹配完, 剩下的就直接插入了
                    if (esiOwnedBluePrints.Count() != 0)
                    {
                        dc.OwnedBluePrints.InsertAllOnSubmit(esiOwnedBluePrints);
                    }

                    dc.SubmitChanges();

                    return(true);
                }

                return(false);
            }
        }
Ejemplo n.º 6
0
        /// <summary>
        /// 获取 invTypes 对象, 传入DC实例方便后期更新数据
        /// </summary>
        /// <param name="typeID"></param>
        /// <param name="dc"></param>
        /// <returns></returns>
        public static invTypes GetInvTypes(int typeID)
        {
            DCEVEDataContext dc = new DCEVEDataContext();

            return(dc.invTypes.Single(p => p.typeID == typeID));
        }
Ejemplo n.º 7
0
        /// <summary>
        /// 清空并重新获取角色的技能数据(提交数据库)
        /// </summary>
        /// <returns>是否更新成功</returns>
        public bool UpdateSkills()
        {
            // 通过ESI获取角色的技能信息
            ESICharacterSkillList csl = ESI.GetCharacterSkillList(CharacterID, GetAccessToken());

            if (csl == null)
            {
                return(false);
            }

            DCEVEDataContext dc = new DCEVEDataContext();

            // 清空原有技能数据
            dc.CharacterSkills.DeleteAllOnSubmit(CharacterSkills);
            dc.SubmitChanges();

            var targetSkillID = dc.invTypes.Where(p => CONST.TargetSkillsGroupID.Contains(p.groupID)).Select(p => p.typeID);

            CharacterSkills skill;

            // 只提取有用的技能数据且处理角色数据
            foreach (var s in csl.SkillList)
            {
                // 若技能 ID 不在要存储的技能ID队列里面, 则跳过
                if (!targetSkillID.Contains(s.SkillID))
                {
                    continue;
                }

                // 若是要存储的技能, 则创建对应的数据记录
                skill = new CharacterSkills()
                {
                    CharacterID = CharacterID,
                    SkillID     = s.SkillID,
                    Level       = s.TrainedSkillLevel
                };

                CharacterSkills.Add(skill);
            }

            dc.SubmitChanges();

            // 分析角色能力
            // 制造能力
            ManuCapability = (from s in dc.industryActivitySkills
                              join c in dc.CharacterSkills
                              on s.skillID equals c.SkillID
                              where c.CharacterID == CharacterID && s.activityID == CONST.ManufactActivityID && c.Level >= s.level
                              select s.skillID).Count();

            NumManufactureLine = 1;
            var targetSkill = CharacterSkills.SingleOrDefault(p => p.SkillID == 3387);     // 批量生产学

            if (targetSkill != null)
            {
                NumManufactureLine += targetSkill.Level;
            }

            targetSkill = CharacterSkills.SingleOrDefault(p => p.SkillID == 24625);         // 高级量产技术
            if (targetSkill != null)
            {
                NumManufactureLine += targetSkill.Level;
            }

            // 科研能力
            ReseCapability = (from s in dc.industryActivitySkills
                              join c in dc.CharacterSkills
                              on s.skillID equals c.SkillID
                              where c.CharacterID == CharacterID && CONST.ResearchActivitiesID.Contains(s.activityID) && c.Level >= s.level
                              select s.skillID).Count();

            NumResearchLine = 1;
            targetSkill     = CharacterSkills.SingleOrDefault(p => p.SkillID == 3406); // 实验室运作理论
            if (targetSkill != null)
            {
                NumResearchLine += targetSkill.Level;
            }

            targetSkill = CharacterSkills.SingleOrDefault(p => p.SkillID == 24624);         // 高级实验室运作理论
            if (targetSkill != null)
            {
                NumResearchLine += targetSkill.Level;
            }

            // 市场订单量
            if (Market)
            {
                NumMarketOrder = 5;
                targetSkill    = CharacterSkills.SingleOrDefault(p => p.SkillID == 3443);  // 贸易学
                if (targetSkill != null)
                {
                    NumMarketOrder += targetSkill.Level * 4;
                }

                targetSkill = CharacterSkills.SingleOrDefault(p => p.SkillID == 3444);     // 零售技巧
                if (targetSkill != null)
                {
                    NumMarketOrder += targetSkill.Level * 8;
                }

                targetSkill = CharacterSkills.SingleOrDefault(p => p.SkillID == 16596);     // 批发技巧
                if (targetSkill != null)
                {
                    NumMarketOrder += targetSkill.Level * 16;
                }

                targetSkill = CharacterSkills.SingleOrDefault(p => p.SkillID == 18580);     // 商业巨头
                if (targetSkill != null)
                {
                    NumMarketOrder += targetSkill.Level * 32;
                }
            }

            dc.SubmitChanges();

            return(true);
        }
Ejemplo n.º 8
0
        public static Characters GetCharacters(int characterID)
        {
            DCEVEDataContext dc = new DCEVEDataContext();

            return(dc.Characters.Single(p => p.CharacterID == characterID));
        }