少年修仙传客户端代码仓库
client_Hale
2019-04-19 feeceecc1252fd472a7027fc2049cd95816ea162
System/Alchemy/AlchemyModel.cs
@@ -10,6 +10,9 @@
        Dictionary<int, AlchemyCount> m_AlchemyCounts = new Dictionary<int, AlchemyCount>();
        Dictionary<int, int> m_AlchemyQualityLucks = new Dictionary<int, int>();
        Dictionary<int, List<Item>> m_AlchemyMaterials = new Dictionary<int, List<Item>>();
        Dictionary<int, AlchemyDrugUseLimit> m_AlchemyDrugUseLimits = new Dictionary<int, AlchemyDrugUseLimit>();
        List<int> m_AlchemyDrugs = new List<int>();
        List<int> m_AlchemyDrugQualitys = new List<int>();
        int m_SelectQuality = 0;
        public int selectQuality
@@ -56,6 +59,7 @@
        public event Action selectQualityRefresh;
        public event Action selectAlchemyRefresh;
        public event Action alchemyStateRefresh;
        public event Action alchemyDrugUseRefresh;
        PackModel packModel { get { return ModelCenter.Instance.GetModel<PackModel>(); } }
@@ -69,12 +73,20 @@
            m_AlchemyTimes.Clear();
            stoveLevel = 0;
            stoveExp = 0;
            foreach (var item in m_AlchemyDrugUseLimits.Values)
            {
                item.SetTimes(0, 0);
            }
            isServerPrepare = false;
        }
        public void OnPlayerLoginOk()
        {
            isServerPrepare = true;
        }
        public override void UnInit()
        {
        }
        void ParseConfig()
@@ -139,6 +151,25 @@
                    }
                }
            }
            {
                var configs = AttrFruitConfig.GetValues();
                foreach (var config in configs)
                {
                    if (config.FuncID == 2)
                    {
                        m_AlchemyDrugs.Add(config.ID);
                        var itemConfig = ItemConfig.Get(config.ID);
                        if (!m_AlchemyDrugQualitys.Contains(itemConfig.LV))
                        {
                            m_AlchemyDrugQualitys.Add(itemConfig.LV);
                        }
                        m_AlchemyDrugUseLimits.Add(config.ID, new AlchemyDrugUseLimit(config.ID));
                    }
                }
                m_AlchemyDrugQualitys.Sort();
            }
        }
        public bool TryGetAlchemyStartTime(int alchemyId, out uint tick)
@@ -165,6 +196,11 @@
        public bool TryGetAlchemyMaterials(int alchemyId, out List<Item> items)
        {
            return m_AlchemyMaterials.TryGetValue(alchemyId, out items);
        }
        public bool TryGetAlchemyUseLimit(int id,out AlchemyDrugUseLimit drugUseLimit)
        {
            return m_AlchemyDrugUseLimits.TryGetValue(id, out drugUseLimit);
        }
        public float GetAlchemySuccRate(int alchemyId)
@@ -204,6 +240,44 @@
                var startTime = TimeUtility.GetTime(tick);
                var seconds = (int)(config.NeedTime - (float)(TimeUtility.ServerNow - startTime).TotalSeconds);
                return seconds > 0 ? 1 : 2;
            }
            return 0;
        }
        public ICollection<int> GetDrugQualitys()
        {
            return m_AlchemyDrugQualitys;
        }
        public ICollection<int> GetAlchemyDrugs()
        {
            return m_AlchemyDrugs;
        }
        public int GetAlchemyDrugState(int id)//0-可服用丹药 1-达到上限 2-没有丹药 3-没有提升空间
        {
            AlchemyDrugUseLimit drugUseLimit;
            if (TryGetAlchemyUseLimit(id, out drugUseLimit))
            {
                if (!drugUseLimit.IsReachLimit())
                {
                    var count = packModel.GetItemCountByID(PackType.Item, id);
                    return count > 0 ? 0 : 2;
                }
                else
                {
                    return drugUseLimit.CanUpgradeLimit() ? 1 : 3;
                }
            }
            return int.MaxValue;
        }
        public int GetAlchemyDrugUseLimit(int id)
        {
            AlchemyDrugUseLimit drugUseLimit;
            if (TryGetAlchemyUseLimit(id, out drugUseLimit))
            {
                return drugUseLimit.GetUseLimit();
            }
            return 0;
        }
@@ -264,14 +338,6 @@
            if (package.ItemID != 0)
            {
                if (package.ItemCnt > 0)//炼丹成功
                {
                }
                else//炼丹失败
                {
                }
                if (isServerPrepare)
                {
                    if (!NewBieCenter.Instance.inGuiding && WindowCenter.Instance.IsOpen<AlchemyBaseWin>())
@@ -292,8 +358,22 @@
            }
        }
        public override void UnInit()
        public void ReceivePackage(HA339_tagMCAttrFruitEatCntList vNetData)
        {
            for (int i = 0; i < vNetData.count; i++)
            {
                var data = vNetData.EatCntList[i];
                AlchemyDrugUseLimit drugUseLimit;
                if (TryGetAlchemyUseLimit((int)data.ItemID, out drugUseLimit))
                {
                    drugUseLimit.SetTimes(data.EatCnt, (int)data.AddItemCnt);
                }
            }
            if (alchemyDrugUseRefresh != null)
            {
                alchemyDrugUseRefresh();
            }
        }
    }
@@ -314,5 +394,108 @@
            max = 1,
        };
    }
    public class AlchemyDrugUseLimit
    {
        public readonly int id;
        public readonly Item addItem;
        public readonly int addLimitPerTimes;
        Dictionary<int, int> realmLimits = new Dictionary<int, int>();
        public int addTimes { get; private set; }
        public int eatTimes { get; private set; }
        PackModel packModel { get { return ModelCenter.Instance.GetModel<PackModel>(); } }
        public AlchemyDrugUseLimit(int id)
        {
            this.id = id;
            var config = AttrFruitConfig.Get(id);
            foreach (var realmLimit in config.MaxUseCnt)
            {
                realmLimits.Add(realmLimit.x, realmLimit.y);
            }
            if (!string.IsNullOrEmpty(config.AddItemMaxCnt))
            {
                var array = LitJson.JsonMapper.ToObject<int[]>(config.AddItemMaxCnt);
                addItem = new Item()
                {
                    id = array[0],
                    count = array[1],
                };
                addLimitPerTimes = array[2];
            }
        }
        public void SetTimes(int eatTimes, int addTimes)
        {
            this.eatTimes = eatTimes;
            this.addTimes = addTimes / (addItem.count <= 0 ? 1 : addItem.count);
        }
        public int GetUseLimit()
        {
            var times = 0;
            var realmLevel = PlayerDatas.Instance.baseData.realmLevel;
            foreach (var level in realmLimits.Keys)
            {
                if (realmLevel >= level)
                {
                    times = realmLimits[level];
                }
            }
            if (addItem.id != 0)
            {
                times += addTimes * addLimitPerTimes;
            }
            return times;
        }
        public int GetRealmLimit(int realmLevel)
        {
            var limit = 0;
            foreach (var level in realmLimits.Keys)
            {
                if (realmLevel >= level)
                {
                    limit = realmLimits[level];
                }
            }
            return limit;
        }
        public bool IsReachLimit()
        {
            var limit = GetUseLimit();
            return eatTimes >= limit;
        }
        public bool CanUpgradeLimit()
        {
            if (addItem.id != 0)
            {
                return true;
            }
            if (GetNextUpgradeRealm() > 0)
            {
                return true;
            }
            return false;
        }
        public int GetNextUpgradeRealm()
        {
            var realmLevel = PlayerDatas.Instance.baseData.realmLevel;
            foreach (var level in realmLimits.Keys)
            {
                if (realmLevel < level)
                {
                    return level;
                }
            }
            return 0;
        }
    }
}