少年修仙传客户端代码仓库
client_linchunjie
2019-04-19 88e0a333f20f06f56a5ba156e6f04de4930422ae
3335 炼丹功能
4 文件已复制
9个文件已删除
1 文件已重命名
5个文件已添加
17个文件已修改
1666 ■■■■■ 已修改文件
Core/GameEngine/Model/Config/AttrFruitConfig.cs 417 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Config/AttrFruitConfig.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/TelPartialConfig/PartialAttrFruitConfig.cs 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/TelPartialConfig/PartialAttrFruitConfig.cs.meta 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA339_tagMCAttrFruitEatCntList.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/HAD_SaleActivity.meta 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/HAE_Truck.meta 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/HAF_Merge.meta 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/HB0_Event.meta 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ServerPack/HA3_Function/HA339_tagMCAttrFruitEatCntList.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ServerPack/HAD_SaleActivity.meta 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ServerPack/HAE_Truck.meta 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ServerPack/HAF_Merge.meta 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ServerPack/HB0_Event.meta 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Lua/Gen/AttrFruitConfigWrap.cs 387 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Lua/Gen/XLuaGenAutoRegister.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Alchemy/AlchemyBaseWin.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Alchemy/AlchemyDrugBriefBehaviour.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Alchemy/AlchemyModel.cs 175 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Alchemy/AlchemySortBehaviour.cs 165 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Alchemy/AlchemySortBehaviour.cs.meta 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Alchemy/AlchemySortCell.cs 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Alchemy/AlchemySortCell.cs.meta 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Alchemy/AlchemyUseDrugCell.cs 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Alchemy/AlchemyUseDrugCell.cs.meta 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Alchemy/AlchemyUseDrugWin.cs 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Alchemy/AlchemyUseDrugWin.cs.meta 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/KnapSack/Logic/ItemOperateUtility.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/KnapSack/Logic/MakeDrugCell.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/KnapSack/Logic/PackModel.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/KnapSack/Logic/RoleElixirTipWin.cs 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Mount/MountModel.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Mount/MountStoneTipsWin.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Pet/PetModel.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Pet/PetStoneTipsWin.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/RoleParticulars/ViewPetHorseStoneCell.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Config/AttrFruitConfig.cs
@@ -1,222 +1,225 @@
//--------------------------------------------------------
//    [Author]:           Fish
//    [  Date ]:           Thursday, February 14, 2019
//--------------------------------------------------------
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System;
using UnityEngine;
[XLua.LuaCallCSharp]
public partial class AttrFruitConfig
{
//--------------------------------------------------------
//    [Author]:           Fish
//    [  Date ]:           Friday, April 19, 2019
//--------------------------------------------------------
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System;
using UnityEngine;
[XLua.LuaCallCSharp]
public partial class AttrFruitConfig
{
    public readonly int ID;
    public readonly int FuncID;
    public readonly int MaxUseCnt;
    public readonly Int2[] MaxUseCnt;
    public readonly string AddItemMaxCnt;
    public readonly int RecycleExp;
    public readonly int FightPowerEx;
    public readonly int Sort;
    public readonly int[] RecipeLv;
    public AttrFruitConfig()
    {
    }
    public AttrFruitConfig(string input)
    {
        try
        {
            var tables = input.Split('\t');
    public readonly int drugType;
    public readonly int Sort;
    public AttrFruitConfig()
    {
    }
    public AttrFruitConfig(string input)
    {
        try
        {
            var tables = input.Split('\t');
            int.TryParse(tables[0],out ID); 
            int.TryParse(tables[1],out FuncID); 
            int.TryParse(tables[2],out MaxUseCnt);
            int.TryParse(tables[3],out RecycleExp);
            int.TryParse(tables[4],out FightPowerEx);
            int.TryParse(tables[5],out Sort);
            string[] RecipeLvStringArray = tables[6].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
            RecipeLv = new int[RecipeLvStringArray.Length];
            for (int i=0;i<RecipeLvStringArray.Length;i++)
            string[] MaxUseCntStringArray = tables[2].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
            MaxUseCnt = new Int2[MaxUseCntStringArray.Length];
            for (int i=0;i<MaxUseCntStringArray.Length;i++)
            {
                 int.TryParse(RecipeLvStringArray[i],out RecipeLv[i]);
                 Int2.TryParse(MaxUseCntStringArray[i],out MaxUseCnt[i]);
            }
        }
        catch (Exception ex)
        {
            DebugEx.Log(ex);
        }
    }
    static Dictionary<string, AttrFruitConfig> configs = new Dictionary<string, AttrFruitConfig>();
    public static AttrFruitConfig Get(string id)
    {
        if (!inited)
        {
            Debug.Log("AttrFruitConfig 还未完成初始化。");
            return null;
        }
        if (configs.ContainsKey(id))
        {
            return configs[id];
        }
            AddItemMaxCnt = tables[3];
        AttrFruitConfig config = null;
        if (rawDatas.ContainsKey(id))
        {
            config = configs[id] = new AttrFruitConfig(rawDatas[id]);
            rawDatas.Remove(id);
        }
            int.TryParse(tables[4],out RecycleExp);
        return config;
    }
            int.TryParse(tables[5],out FightPowerEx);
    public static AttrFruitConfig Get(int id)
    {
        return Get(id.ToString());
    }
            int.TryParse(tables[6],out drugType);
    public static List<string> GetKeys()
    {
        var keys = new List<string>();
        keys.AddRange(configs.Keys);
        keys.AddRange(rawDatas.Keys);
        return keys;
    }
    public static List<AttrFruitConfig> GetValues()
    {
        var values = new List<AttrFruitConfig>();
        values.AddRange(configs.Values);
        var keys = new List<string>(rawDatas.Keys);
        foreach (var key in keys)
        {
            values.Add(Get(key));
        }
        return values;
    }
    public static bool Has(string id)
    {
        return configs.ContainsKey(id) || rawDatas.ContainsKey(id);
    }
    public static bool Has(int id)
    {
        return Has(id.ToString());
    }
    public static bool inited { get; private set; }
    protected static Dictionary<string, string> rawDatas = new Dictionary<string, string>();
    public static void Init(bool sync=false)
    {
        inited = false;
        var path = string.Empty;
        if (AssetSource.refdataFromEditor)
        {
            path = ResourcesPath.CONFIG_FODLER +"/AttrFruit.txt";
        }
        else
        {
            path = AssetVersionUtility.GetAssetFilePath("config/AttrFruit.txt");
        }
        var tempConfig = new AttrFruitConfig();
        var preParse = tempConfig is IConfigPostProcess;
        if (sync)
        {
            var lines = File.ReadAllLines(path);
            if (!preParse)
            {
                rawDatas = new Dictionary<string, string>(lines.Length - 3);
            }
            for (int i = 3; i < lines.Length; i++)
            {
                try
                {
                    var line = lines[i];
                    var index = line.IndexOf("\t");
                    if (index == -1)
                    {
                        continue;
                    }
                    var id = line.Substring(0, index);
                    if (preParse)
                    {
                        var config = new AttrFruitConfig(line);
                        configs[id] = config;
                        (config as IConfigPostProcess).OnConfigParseCompleted();
                    }
                    else
                    {
                        rawDatas[id] = line;
                    }
                }
                catch (System.Exception ex)
                {
                    Debug.LogError(ex);
                }
            }
            inited = true;
        }
        else
        {
            ThreadPool.QueueUserWorkItem((object _object) =>
            {
                var lines = File.ReadAllLines(path);
                if (!preParse)
                {
                    rawDatas = new Dictionary<string, string>(lines.Length - 3);
                }
                for (int i = 3; i < lines.Length; i++)
                {
                    try
                    {
                       var line = lines[i];
                        var index = line.IndexOf("\t");
                        if (index == -1)
                        {
                            continue;
                        }
                        var id = line.Substring(0, index);
                        if (preParse)
                        {
                            var config = new AttrFruitConfig(line);
                            configs[id] = config;
                            (config as IConfigPostProcess).OnConfigParseCompleted();
                        }
                        else
                        {
                            rawDatas[id] = line;
                        }
                    }
                    catch (System.Exception ex)
                    {
                        Debug.LogError(ex);
                    }
                }
                inited = true;
            });
        }
    }
}
            int.TryParse(tables[7],out Sort);
        }
        catch (Exception ex)
        {
            DebugEx.Log(ex);
        }
    }
    static Dictionary<string, AttrFruitConfig> configs = new Dictionary<string, AttrFruitConfig>();
    public static AttrFruitConfig Get(string id)
    {
        if (!inited)
        {
            Debug.Log("AttrFruitConfig 还未完成初始化。");
            return null;
        }
        if (configs.ContainsKey(id))
        {
            return configs[id];
        }
        AttrFruitConfig config = null;
        if (rawDatas.ContainsKey(id))
        {
            config = configs[id] = new AttrFruitConfig(rawDatas[id]);
            rawDatas.Remove(id);
        }
        return config;
    }
    public static AttrFruitConfig Get(int id)
    {
        return Get(id.ToString());
    }
    public static List<string> GetKeys()
    {
        var keys = new List<string>();
        keys.AddRange(configs.Keys);
        keys.AddRange(rawDatas.Keys);
        return keys;
    }
    public static List<AttrFruitConfig> GetValues()
    {
        var values = new List<AttrFruitConfig>();
        values.AddRange(configs.Values);
        var keys = new List<string>(rawDatas.Keys);
        foreach (var key in keys)
        {
            values.Add(Get(key));
        }
        return values;
    }
    public static bool Has(string id)
    {
        return configs.ContainsKey(id) || rawDatas.ContainsKey(id);
    }
    public static bool Has(int id)
    {
        return Has(id.ToString());
    }
    public static bool inited { get; private set; }
    protected static Dictionary<string, string> rawDatas = new Dictionary<string, string>();
    public static void Init(bool sync=false)
    {
        inited = false;
        var path = string.Empty;
        if (AssetSource.refdataFromEditor)
        {
            path = ResourcesPath.CONFIG_FODLER +"/AttrFruit.txt";
        }
        else
        {
            path = AssetVersionUtility.GetAssetFilePath("config/AttrFruit.txt");
        }
        var tempConfig = new AttrFruitConfig();
        var preParse = tempConfig is IConfigPostProcess;
        if (sync)
        {
            var lines = File.ReadAllLines(path);
            if (!preParse)
            {
                rawDatas = new Dictionary<string, string>(lines.Length - 3);
            }
            for (int i = 3; i < lines.Length; i++)
            {
                try
                {
                    var line = lines[i];
                    var index = line.IndexOf("\t");
                    if (index == -1)
                    {
                        continue;
                    }
                    var id = line.Substring(0, index);
                    if (preParse)
                    {
                        var config = new AttrFruitConfig(line);
                        configs[id] = config;
                        (config as IConfigPostProcess).OnConfigParseCompleted();
                    }
                    else
                    {
                        rawDatas[id] = line;
                    }
                }
                catch (System.Exception ex)
                {
                    Debug.LogError(ex);
                }
            }
            inited = true;
        }
        else
        {
            ThreadPool.QueueUserWorkItem((object _object) =>
            {
                var lines = File.ReadAllLines(path);
                if (!preParse)
                {
                    rawDatas = new Dictionary<string, string>(lines.Length - 3);
                }
                for (int i = 3; i < lines.Length; i++)
                {
                    try
                    {
                       var line = lines[i];
                        var index = line.IndexOf("\t");
                        if (index == -1)
                        {
                            continue;
                        }
                        var id = line.Substring(0, index);
                        if (preParse)
                        {
                            var config = new AttrFruitConfig(line);
                            configs[id] = config;
                            (config as IConfigPostProcess).OnConfigParseCompleted();
                        }
                        else
                        {
                            rawDatas[id] = line;
                        }
                    }
                    catch (System.Exception ex)
                    {
                        Debug.LogError(ex);
                    }
                }
                inited = true;
            });
        }
    }
}
Core/GameEngine/Model/Config/AttrFruitConfig.cs.meta
@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: 95c7a3606abde144bbf29969de2b9bd4
timeCreated: 1550121347
timeCreated: 1555640176
licenseType: Pro
MonoImporter:
  serializedVersion: 2
Core/GameEngine/Model/TelPartialConfig/PartialAttrFruitConfig.cs
New file
@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
public partial class AttrFruitConfig
{
    public int basicUseLimit
    {
        get
        {
            return MaxUseCnt.Length > 0 && MaxUseCnt[0].x == 0 ? MaxUseCnt[0].y : 0;
        }
    }
}
Core/GameEngine/Model/TelPartialConfig/PartialAttrFruitConfig.cs.meta
File was renamed from Lua/Gen/AttrFruitConfigWrap.cs.meta
@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: 3211f8f2fa96a53488c0cb28b6ee2299
timeCreated: 1550122887
guid: b44b05aeb0d8c824d9abd838a17c0579
timeCreated: 1555591301
licenseType: Pro
MonoImporter:
  serializedVersion: 2
Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA339_tagMCAttrFruitEatCntList.cs
@@ -30,6 +30,8 @@
        get { return _playerPack ?? (_playerPack = ModelCenter.Instance.GetModel<PackModel>()); }
    }
    AlchemyModel model { get { return ModelCenter.Instance.GetModel<AlchemyModel>(); } }
    public override void Done(GameNetPackBasic vNetPack) {
        base.Done(vNetPack);
@@ -41,6 +43,7 @@
            petmodel.PetA339(vNetData);
            horsemodel.MountHA339(vNetData);
            playerPack.UpdateItemSumUseCnt(vNetData);
            model.ReceivePackage(vNetData);
        }
          
    }
Core/NetworkPackage/DTCFile/ServerPack/HAD_SaleActivity.meta
File was deleted
Core/NetworkPackage/DTCFile/ServerPack/HAE_Truck.meta
File was deleted
Core/NetworkPackage/DTCFile/ServerPack/HAF_Merge.meta
File was deleted
Core/NetworkPackage/DTCFile/ServerPack/HB0_Event.meta
File was deleted
Core/NetworkPackage/ServerPack/HA3_Function/HA339_tagMCAttrFruitEatCntList.cs
@@ -17,12 +17,14 @@
        for (int i = 0; i < count; i ++) {
            EatCntList[i] = new tagMCAttrFruitEatCnt();
            TransBytes (out EatCntList[i].ItemID, vBytes, NetDataType.DWORD);
            TransBytes (out EatCntList[i].EatCnt, vBytes, NetDataType.WORD);
            TransBytes (out EatCntList[i].EatCnt, vBytes, NetDataType.WORD);             TransBytes (out EatCntList[i].AddItemCnt, vBytes, NetDataType.DWORD);
        }
    }
    public class tagMCAttrFruitEatCnt {
        public uint ItemID;        //果实物品ID
        public ushort EatCnt;        //已使用个数
        public ushort EatCnt;        //已使用个数
        public uint AddItemCnt; //增幅丹使用个数
    }
}
Core/NetworkPackage/ServerPack/HAD_SaleActivity.meta
File was deleted
Core/NetworkPackage/ServerPack/HAE_Truck.meta
File was deleted
Core/NetworkPackage/ServerPack/HAF_Merge.meta
File was deleted
Core/NetworkPackage/ServerPack/HB0_Event.meta
File was deleted
Lua/Gen/AttrFruitConfigWrap.cs
File was deleted
Lua/Gen/XLuaGenAutoRegister.cs
@@ -70,9 +70,6 @@
            translator.DelayWrapLoader(typeof(AreaCameraConfig), AreaCameraConfigWrap.__Register);
        
        
            translator.DelayWrapLoader(typeof(AttrFruitConfig), AttrFruitConfigWrap.__Register);
            translator.DelayWrapLoader(typeof(AuctionConfig), AuctionConfigWrap.__Register);
        
        
System/Alchemy/AlchemyBaseWin.cs
@@ -16,6 +16,7 @@
        [SerializeField] FunctionButtonGroup m_FuncGroup;
        [SerializeField] FunctionButton m_AlchemyNormal;
        [SerializeField] FunctionButton m_AlchemyFairy;
        [SerializeField] FunctionButton m_AlchemyDrug;
        [SerializeField] Button m_Close;
        [SerializeField] Button m_Left;
        [SerializeField] Button m_Right;
@@ -29,6 +30,7 @@
        {
            m_AlchemyNormal.AddListener(ShowAlchemyNormal);
            m_AlchemyFairy.AddListener(ShowAlchemyFairy);
            m_AlchemyDrug.AddListener(ShowAlchemyDrug);
            m_Left.AddListener(()=> 
            {
                m_FuncGroup.TriggerLast();
@@ -82,6 +84,13 @@
            functionOrder = m_AlchemyNormal.order;
        }
        private void ShowAlchemyDrug()
        {
            CloseSubWindows();
            WindowCenter.Instance.Open<AlchemyUseDrugWin>();
            functionOrder = m_AlchemyDrug.order;
        }
        private void CloseSubWindows()
        {
            var children = WindowConfig.Get().FindChildWindows("AlchemyBaseWin");
System/Alchemy/AlchemyDrugBriefBehaviour.cs
@@ -47,7 +47,7 @@
                    if (index < m_Propertys.Length)
                    {
                        m_Propertys[index].gameObject.SetActive(true);
                        m_Propertys[index].Display(property, s_Propertys[property]);
                        m_Propertys[index].DisplayUpper(property, s_Propertys[property]);
                        index++;
                    }
                }
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)
@@ -206,6 +242,34 @@
                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 bool IsGraspRecipe(int alchemyId)
@@ -264,14 +328,6 @@
            if (package.ItemID != 0)
            {
                if (package.ItemCnt > 0)//炼丹成功
                {
                }
                else//炼丹失败
                {
                }
                if (isServerPrepare)
                {
                    if (!NewBieCenter.Instance.inGuiding && WindowCenter.Instance.IsOpen<AlchemyBaseWin>())
@@ -292,8 +348,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 +384,92 @@
            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;
        }
        public int GetUseLimit()
        {
            var times = 0;
            var realmLevel = PlayerDatas.Instance.baseData.realmLevel;
            foreach (var level in realmLimits.Keys)
            {
                if (realmLevel >= level)
                {
                    times = realmLimits[level];
                }
            }
            times += addTimes * addLimitPerTimes;
            return times;
        }
        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;
        }
    }
}
System/Alchemy/AlchemySortBehaviour.cs
New file
@@ -0,0 +1,165 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace Snxxz.UI
{
    public class AlchemySortBehaviour : MonoBehaviour
    {
        [SerializeField] AlchemySortType m_AlchemySortType;
        [SerializeField] Button m_Func;
        [SerializeField] Image m_Arrow;
        [SerializeField] Transform m_ContainerSort;
        [SerializeField] ScrollerController m_Controller;
        List<int> m_Sorts = new List<int>();
        Dictionary<int, bool> m_SortEnables = new Dictionary<int, bool>();
        bool m_OpenSort = false;
        bool openSort
        {
            get { return m_OpenSort; }
            set
            {
                if (m_OpenSort != value)
                {
                    m_OpenSort = value;
                    OnSortChange();
                }
            }
        }
        public static event Action onSortRefresh;
        AlchemyModel model { get { return ModelCenter.Instance.GetModel<AlchemyModel>(); } }
        private void Awake()
        {
            m_Controller.OnRefreshCell += OnRefreshCell;
            m_Func.SetListener(() =>
            {
                DisplaySorts();
            });
        }
        public void Display()
        {
            m_ContainerSort.gameObject.SetActive(false);
            m_OpenSort = false;
            if (m_Sorts.Count == 0)
            {
                switch (m_AlchemySortType)
                {
                    case AlchemySortType.AlchemyType:
                        m_Sorts.Add((int)AlchemyType.Normal);
                        m_Sorts.Add((int)AlchemyType.Fairy);
                        break;
                    case AlchemySortType.Quality:
                        var qualities = model.GetDrugQualitys();
                        m_Sorts.AddRange(qualities);
                        break;
                }
                m_Sorts.RemoveAll((x) => { return x == 0; });
            }
            SetSortEnable(0, true);
            DisplaySortState();
        }
        void DisplaySortState()
        {
            m_Arrow.transform.localEulerAngles = new Vector3(0, 0, openSort ? 0 : 180);
        }
        void DisplaySorts()
        {
            m_ContainerSort.gameObject.SetActive(true);
            if (m_Controller.GetNumberOfCells(m_Controller.m_Scorller) == 0)
            {
                m_Controller.Refresh();
                m_Controller.AddCell(ScrollerDataType.Header, 0);
                for (int i = 0; i < m_Sorts.Count; i++)
                {
                    m_Controller.AddCell(ScrollerDataType.Header, m_Sorts[i]);
                }
                m_Controller.Restart();
            }
            else
            {
                m_Controller.JumpIndex(0);
                m_Controller.m_Scorller.RefreshActiveCellViews();
            }
        }
        public bool IsSortEnabled(int sort)
        {
            if (sort == 0)
            {
                var allEnabled = true;
                foreach (var _sort in m_Sorts)
                {
                    if (!IsSortEnabled(_sort))
                    {
                        allEnabled = false;
                        break;
                    }
                }
                return allEnabled;
            }
            return m_SortEnables.ContainsKey(sort) && m_SortEnables[sort];
        }
        public void SetSortEnable(int sort, bool enabled, bool single = true)
        {
            if (sort == 0)
            {
                foreach (var _sort in m_Sorts)
                {
                    SetSortEnable(_sort, enabled, false);
                }
                m_Controller.m_Scorller.RefreshActiveCellViews();
                return;
            }
            m_SortEnables[sort] = enabled;
            if (single)
            {
                m_Controller.m_Scorller.RefreshActiveCellViews();
            }
        }
        private void OnRefreshCell(ScrollerDataType type, CellView cell)
        {
            var sortCell = cell as AlchemySortCell;
            sortCell.Display(this, m_AlchemySortType, cell.index);
        }
        private void OnSortChange()
        {
            DisplaySortState();
            if (!openSort)
            {
                if (onSortRefresh != null)
                {
                    onSortRefresh();
                }
            }
        }
        private void LateUpdate()
        {
            openSort = m_ContainerSort.gameObject.activeSelf;
        }
        public enum AlchemySortType
        {
            AlchemyType,
            Quality,
        }
    }
}
System/Alchemy/AlchemySortBehaviour.cs.meta
copy from Lua/Gen/AttrFruitConfigWrap.cs.meta copy to System/Alchemy/AlchemySortBehaviour.cs.meta
File was copied from Lua/Gen/AttrFruitConfigWrap.cs.meta
@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: 3211f8f2fa96a53488c0cb28b6ee2299
timeCreated: 1550122887
guid: 8d0cf26a245665c4fa46d6d4d650ce64
timeCreated: 1555592475
licenseType: Pro
MonoImporter:
  serializedVersion: 2
System/Alchemy/AlchemySortCell.cs
New file
@@ -0,0 +1,54 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace Snxxz.UI
{
    public class AlchemySortCell : CellView
    {
        [SerializeField] Text m_ClassifyName;
        [SerializeField] Button m_Select;
        [SerializeField] Image m_Sign;
        public void Display(AlchemySortBehaviour behaviour,
            AlchemySortBehaviour.AlchemySortType sortType, int sort)
        {
            switch (sortType)
            {
                case AlchemySortBehaviour.AlchemySortType.AlchemyType:
                    switch (sort)
                    {
                        case 0:
                            m_ClassifyName.text = "全部丹药";
                            break;
                        case 1:
                            m_ClassifyName.text = "普通丹药";
                            break;
                        case 2:
                            m_ClassifyName.text = "仙丹";
                            break;
                    }
                    break;
                case AlchemySortBehaviour.AlchemySortType.Quality:
                    if (sort == 0)
                    {
                        m_ClassifyName.text = "全部品级";
                    }
                    else
                    {
                        m_ClassifyName.text = string.Format("{0}品", sort);
                    }
                    break;
            }
            m_Select.SetListener(() =>
            {
                behaviour.SetSortEnable(sort, !behaviour.IsSortEnabled(sort));
            });
            m_Sign.gameObject.SetActive(behaviour.IsSortEnabled(sort));
        }
    }
}
System/Alchemy/AlchemySortCell.cs.meta
copy from Lua/Gen/AttrFruitConfigWrap.cs.meta copy to System/Alchemy/AlchemySortCell.cs.meta
File was copied from Lua/Gen/AttrFruitConfigWrap.cs.meta
@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: 3211f8f2fa96a53488c0cb28b6ee2299
timeCreated: 1550122887
guid: 2a3c15a23b90e344492c9007a9fff2d0
timeCreated: 1555639353
licenseType: Pro
MonoImporter:
  serializedVersion: 2
System/Alchemy/AlchemyUseDrugCell.cs
New file
@@ -0,0 +1,134 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace Snxxz.UI
{
    public class AlchemyUseDrugCell : CellView
    {
        [SerializeField] ItemCell m_Item;
        [SerializeField] Slider m_Slider;
        [SerializeField] Text m_UseCount;
        [SerializeField] PropertyBehaviour[] m_Propertys;
        [SerializeField] Button m_Func;
        [SerializeField] Text m_FuncLabel;
        static Dictionary<int, int> propertys = new Dictionary<int, int>();
        AlchemyModel model { get { return ModelCenter.Instance.GetModel<AlchemyModel>(); } }
        PackModel packModel { get { return ModelCenter.Instance.GetModel<PackModel>(); } }
        public void Display(int itemId)
        {
            var count = packModel.GetItemCountByID(PackType.Item, itemId);
            var itemModel = new ItemCellModel(itemId, true, (ulong)count);
            m_Item.Init(itemModel);
            m_Item.button.SetListener(() =>
            {
                var itemData = new ItemAttrData(itemId, true, (ulong)count);
                ModelCenter.Instance.GetModel<ItemTipsModel>().SetItemTipsModel(itemData);
            });
            var eatTimes = 0;
            AlchemyDrugUseLimit drugUseLimit;
            if (model.TryGetAlchemyUseLimit(itemId, out drugUseLimit))
            {
                var useLimit = drugUseLimit.GetUseLimit();
                m_UseCount.text = StringUtility.Contact(drugUseLimit.eatTimes, "/", useLimit);
                m_Slider.value = Mathf.Clamp01((float)drugUseLimit.eatTimes / useLimit);
                eatTimes = drugUseLimit.eatTimes;
            }
            GetProperty(itemId, ref propertys);
            var index = 0;
            foreach (var key in propertys.Keys)
            {
                if (index < m_Propertys.Length)
                {
                    m_Propertys[index].gameObject.SetActive(true);
                    m_Propertys[index].DisplayUpper(key, propertys[key] * eatTimes);
                    index++;
                }
            }
            for (int i = index; i < m_Propertys.Length; i++)
            {
                m_Propertys[i].gameObject.SetActive(false);
            }
            var state = model.GetAlchemyDrugState(itemId);
            m_Func.SetInteractable(m_FuncLabel, state == 0 || state == 1);
            switch (state)
            {
                case 0:
                case 2:
                    m_FuncLabel.text = "服用丹药";
                    break;
                case 1:
                case 3:
                    m_FuncLabel.text = "达到上限";
                    break;
            }
            m_Func.SetListener(() =>
            {
                OnFunc(itemId);
            });
        }
        private void OnFunc(int itemId)
        {
            var state = model.GetAlchemyDrugState(itemId);
            switch (state)
            {
                case 0:
                    var list = packModel.GetItemsById(PackType.Item, itemId);
                    if (list != null && list.Count > 0)
                    {
                        if (ItemOperateUtility.Instance.CheckItemUselimit(itemId))
                        {
                            ItemOperateUtility.Instance.UseItem(list[0].guid);
                        }
                    }
                    break;
                case 1:
                    break;
            }
        }
        static void GetProperty(int itemId, ref Dictionary<int, int> dict)
        {
            dict.Clear();
            var itemConfig = ItemConfig.Get(itemId);
            if (itemConfig == null)
            {
                return;
            }
            if (itemConfig.Effect1 != 0)
            {
                dict.Add(itemConfig.Effect1, itemConfig.EffectValueA1);
            }
            if (itemConfig.Effect2 != 0)
            {
                dict.Add(itemConfig.Effect2, itemConfig.EffectValueA2);
            }
            if (itemConfig.Effect3 != 0)
            {
                dict.Add(itemConfig.Effect3, itemConfig.EffectValueA3);
            }
            if (itemConfig.Effect4 != 0)
            {
                dict.Add(itemConfig.Effect4, itemConfig.EffectValueA4);
            }
            if (itemConfig.Effect5 != 0)
            {
                dict.Add(itemConfig.Effect5, itemConfig.EffectValueA5);
            }
        }
    }
}
System/Alchemy/AlchemyUseDrugCell.cs.meta
copy from Lua/Gen/AttrFruitConfigWrap.cs.meta copy to System/Alchemy/AlchemyUseDrugCell.cs.meta
File was copied from Lua/Gen/AttrFruitConfigWrap.cs.meta
@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: 3211f8f2fa96a53488c0cb28b6ee2299
timeCreated: 1550122887
guid: 210ff610f75a03f44ab2fb9a3723fa59
timeCreated: 1555645883
licenseType: Pro
MonoImporter:
  serializedVersion: 2
System/Alchemy/AlchemyUseDrugWin.cs
New file
@@ -0,0 +1,132 @@
//--------------------------------------------------------
//    [Author]:           第二世界
//    [  Date ]:           Thursday, April 18, 2019
//--------------------------------------------------------
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace Snxxz.UI
{
    public class AlchemyUseDrugWin : Window
    {
        [SerializeField] ScrollerController m_Controller;
        [SerializeField] AlchemySortBehaviour m_AlchemyTypeSort;
        [SerializeField] AlchemySortBehaviour m_AlchemyQualitySort;
        List<int> displayItems = new List<int>();
        AlchemyModel model { get { return ModelCenter.Instance.GetModel<AlchemyModel>(); } }
        PackModel packModel { get { return ModelCenter.Instance.GetModel<PackModel>(); } }
        #region Built-in
        protected override void BindController()
        {
            m_Controller.lockType = EnhanceLockType.KeepVertical;
        }
        protected override void AddListeners()
        {
            m_Controller.OnRefreshCell += OnRefreshCell;
        }
        protected override void OnPreOpen()
        {
            m_AlchemyTypeSort.Display();
            m_AlchemyQualitySort.Display();
            Display();
            AlchemySortBehaviour.onSortRefresh += OnSortRefresh;
            model.alchemyDrugUseRefresh += AlchemyDrugUseRefresh;
            packModel.refreshItemCountEvent += RefreshItemCountEvent;
        }
        protected override void OnAfterOpen()
        {
        }
        protected override void OnPreClose()
        {
            AlchemySortBehaviour.onSortRefresh -= OnSortRefresh;
            model.alchemyDrugUseRefresh -= AlchemyDrugUseRefresh;
            packModel.refreshItemCountEvent -= RefreshItemCountEvent;
        }
        protected override void OnAfterClose()
        {
        }
        #endregion
        void Display()
        {
            DisplayDrugs();
        }
        void DisplayDrugs()
        {
            m_Controller.Refresh();
            displayItems.Clear();
            var items = model.GetAlchemyDrugs();
            foreach (var id in items)
            {
                var config = AttrFruitConfig.Get(id);
                var itemConfig = ItemConfig.Get(id);
                if (m_AlchemyTypeSort.IsSortEnabled(config.drugType)
                    && m_AlchemyQualitySort.IsSortEnabled(itemConfig.LV))
                {
                    displayItems.Add(id);
                }
            }
            displayItems.Sort(Compare);
            for (int i = 0; i < displayItems.Count; i++)
            {
                m_Controller.AddCell(ScrollerDataType.Header, displayItems[i]);
            }
            m_Controller.Restart();
        }
        private void OnSortRefresh()
        {
            DisplayDrugs();
        }
        private void AlchemyDrugUseRefresh()
        {
            DisplayDrugs();
        }
        private void OnRefreshCell(ScrollerDataType type, CellView cell)
        {
            var useDrugCell = cell as AlchemyUseDrugCell;
            useDrugCell.Display(cell.index);
        }
        private void RefreshItemCountEvent(PackType packType, int arg2, int itemId)
        {
            if (packType == PackType.Item && displayItems.Contains(itemId))
            {
                DisplayDrugs();
            }
        }
        private int Compare(int lhs, int rhs)
        {
            var lhs_state = model.GetAlchemyDrugState(lhs);
            var rhs_state = model.GetAlchemyDrugState(rhs);
            return lhs_state.CompareTo(rhs_state);
        }
    }
}
System/Alchemy/AlchemyUseDrugWin.cs.meta
copy from Lua/Gen/AttrFruitConfigWrap.cs.meta copy to System/Alchemy/AlchemyUseDrugWin.cs.meta
File was copied from Lua/Gen/AttrFruitConfigWrap.cs.meta
@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: 3211f8f2fa96a53488c0cb28b6ee2299
timeCreated: 1550122887
guid: 32c4145a1f8723e4e86eccd23b4a07d6
timeCreated: 1555592173
licenseType: Pro
MonoImporter:
  serializedVersion: 2
System/KnapSack/Logic/ItemOperateUtility.cs
@@ -614,7 +614,7 @@
            var usedCountTotal = packModel.GetItemTotalUsedTimes(item.itemId);
            var fruitConfig = AttrFruitConfig.Get(item.itemId);
            if (fruitConfig != null && (usedCountTotal >= fruitConfig.MaxUseCnt || useCnt > fruitConfig.MaxUseCnt))
            if (fruitConfig != null && (usedCountTotal >= fruitConfig.basicUseLimit || useCnt > fruitConfig.basicUseLimit))
            {
                error = 1;
                return false;
System/KnapSack/Logic/MakeDrugCell.cs
@@ -75,7 +75,7 @@
            nameText.text = itemConfig.ItemName;
            nameText.color = UIHelper.GetUIColor(itemConfig.ItemColor, true);
            numSlider.minValue = 0;
            numSlider.maxValue = fruitConfig.MaxUseCnt;
            numSlider.maxValue = fruitConfig.basicUseLimit;
            if (itemConfig.Effect1 != 0)
            {
                attrDict.Add(itemConfig.Effect1, itemConfig.EffectValueA1);
@@ -135,7 +135,7 @@
            }
            attrDesText.text = attrSB.ToString();
            useBtn.RemoveAllListeners();
            if (useNum < fruitConfig.MaxUseCnt)
            if (useNum < fruitConfig.basicUseLimit)
            {
                reachMaxUse.SetActive(false);
                useBtnText.text = Language.Get("KnapS103");
System/KnapSack/Logic/PackModel.cs
@@ -1028,7 +1028,7 @@
            int remainSumCnt = 0;
            if (fruitConfig != null)
            {
                remainSumCnt = fruitConfig.MaxUseCnt - sumHaveUseCnt;
                remainSumCnt = fruitConfig.basicUseLimit - sumHaveUseCnt;
                if (remainSumCnt <= remainDayCnt && itemModel.count > remainSumCnt)
                {
                    count = (ulong)remainSumCnt;
@@ -1689,7 +1689,7 @@
            if (fruitConfig == null) return false;
            int useNum = GetItemTotalUsedTimes(fruitConfig.ID);
            if (useNum >= fruitConfig.MaxUseCnt)
            if (useNum >= fruitConfig.basicUseLimit)
            {
                return true;
            }
@@ -1713,7 +1713,7 @@
            for (int i = 0; i < limitlist.Count; i++)
            {
                progress += ((float)1 / limitlist.Count) * ((float)GetItemTotalUsedTimes(limitlist[i].ID) / limitlist[i].MaxUseCnt);
                progress += ((float)1 / limitlist.Count) * ((float)GetItemTotalUsedTimes(limitlist[i].ID) / limitlist[i].basicUseLimit);
            }
            return progress * 100;
        }
System/KnapSack/Logic/RoleElixirTipWin.cs
@@ -177,25 +177,25 @@
        private void CreateCell()
        {
            fruitlist = playerPack.GetDrugOrderByCnt();
            ctrl.Refresh();
            for (int i = 0; i < fruitlist.Count; i++)
            {
                int[] recipeLvs = fruitlist[i].RecipeLv;
                if(recipeLvs != null)
                {
                   for(int j= 0; j < recipeLvs.Length; j++)
                    {
                        if(blastModel.sortDruglist.Contains(recipeLvs[j]))
                        {
                            ctrl.AddCell(ScrollerDataType.Header, i);
                            break;
                        }
                    }
                }
            }
            ctrl.Restart();
            //fruitlist = playerPack.GetDrugOrderByCnt();
            //ctrl.Refresh();
            //for (int i = 0; i < fruitlist.Count; i++)
            //{
            //    int[] recipeLvs = fruitlist[i].RecipeLv;
            //    if(recipeLvs != null)
            //    {
            //       for(int j= 0; j < recipeLvs.Length; j++)
            //        {
            //            if(blastModel.sortDruglist.Contains(recipeLvs[j]))
            //            {
            //                ctrl.AddCell(ScrollerDataType.Header, i);
            //                break;
            //            }
            //        }
            //    }
            //
            //}
            //ctrl.Restart();
        }
System/Mount/MountModel.cs
@@ -302,7 +302,7 @@
            {
                continue;
            }
            if (_DicMountItem[key] >= AttrFruit.MaxUseCnt)
            if (_DicMountItem[key] >= AttrFruit.basicUseLimit)
            {
                continue;
            }
@@ -716,7 +716,7 @@
                }
                return iSHint;
            case HorseEnum.HorseStone:
                int _maxuse = AttrFruitConfig.Get(id).MaxUseCnt;
                int _maxuse = AttrFruitConfig.Get(id).basicUseLimit;
                if (_DicMountItem.ContainsKey(id))
                {
                    if (_maxuse > _DicMountItem[id])
System/Mount/MountStoneTipsWin.cs
@@ -140,7 +140,7 @@
                _MountStoneItem.ItemNum.text = hs_number.ToString() + "/1";
                bagIndex = playerPack.GetSinglePack(PackType.Item).GetItemIndexsAppointedCount(_id, 1);
            }
            int _maxuse = AttrFruitConfig.Get(_id).MaxUseCnt;
            int _maxuse = AttrFruitConfig.Get(_id).basicUseLimit;
            _MountStoneItem.PetExpNum.text = tag_Item[_id].ToString() + "/" + _maxuse.ToString();
            _MountStoneItem.Slider.value = (float)Math.Round((float)tag_Item[_id] / _maxuse, 2, MidpointRounding.AwayFromZero);
            SpiritBeastsText(_id.ToString(), _MountStoneItem.Some_text, tag_Item[_id]);
@@ -339,7 +339,7 @@
        private bool IsUse(int Id)
        {
            int hs_number = playerPack.GetItemCountByID(PackType.Item, Id);//魂石数量
            int _maxuse = AttrFruitConfig.Get(Id.ToString()).MaxUseCnt;
            int _maxuse = AttrFruitConfig.Get(Id.ToString()).basicUseLimit;
            if (tag_Item.ContainsKey(Id))
            {
                if (hs_number > 0 && _maxuse > tag_Item[Id])
@@ -353,7 +353,7 @@
        private bool IsFull(int Id)
        {
            bool IsBool = true;
            int _maxuse = AttrFruitConfig.Get(Id.ToString()).MaxUseCnt;
            int _maxuse = AttrFruitConfig.Get(Id.ToString()).basicUseLimit;
            if (tag_Item.ContainsKey(Id))
            {
                if (tag_Item[Id] >= _maxuse)
System/Pet/PetModel.cs
@@ -257,7 +257,7 @@
            int type = 0;
            foreach (var key in _TagPetItem.Keys)
            {
                if (_TagPetItem[key] >= AttrFruitConfig.Get(key).MaxUseCnt)
                if (_TagPetItem[key] >= AttrFruitConfig.Get(key).basicUseLimit)
                {
                    continue;
                }
@@ -778,7 +778,7 @@
                    }
                    return iSHint;
                case PetEnum.PetStone:
                    int _maxuse = AttrFruitConfig.Get(id).MaxUseCnt;
                    int _maxuse = AttrFruitConfig.Get(id).basicUseLimit;
                    if (_TagPetItem.ContainsKey(id))
                    {
                        if (_maxuse > _TagPetItem[id])
System/Pet/PetStoneTipsWin.cs
@@ -137,7 +137,7 @@
                _MountStoneItem.ItemNum.text = hs_number.ToString() + "/1";
                bagIndex = playerPack.GetSinglePack(PackType.Item).GetItemIndexsAppointedCount(_id, 1);
            }
            int _maxuse = AttrFruitConfig.Get(_id).MaxUseCnt;
            int _maxuse = AttrFruitConfig.Get(_id).basicUseLimit;
            _MountStoneItem.PetExpNum.text = tag_Item[_id].ToString() + "/" + _maxuse.ToString();
            _MountStoneItem.Slider.value = (float)Math.Round((float)tag_Item[_id] / _maxuse, 2, MidpointRounding.AwayFromZero);
            SpiritBeastsText(_id.ToString(), _MountStoneItem.Some_text, tag_Item[_id]);
@@ -360,7 +360,7 @@
        private bool IsUse(int Id)
        {
            int hs_number = playerPack.GetItemCountByID(PackType.Item, Id);//魂石数量
            int _maxuse = AttrFruitConfig.Get(Id.ToString()).MaxUseCnt;
            int _maxuse = AttrFruitConfig.Get(Id.ToString()).basicUseLimit;
            if (tag_Item.ContainsKey(Id))
            {
                if (hs_number > 0 && _maxuse > tag_Item[Id])
@@ -374,7 +374,7 @@
        private bool IsFull(int Id)
        {
            bool IsBool = true;
            int _maxuse = AttrFruitConfig.Get(Id.ToString()).MaxUseCnt;
            int _maxuse = AttrFruitConfig.Get(Id.ToString()).basicUseLimit;
            if (tag_Item.ContainsKey(Id))
            {
                if (tag_Item[Id] >= _maxuse)
System/RoleParticulars/ViewPetHorseStoneCell.cs
@@ -38,7 +38,7 @@
            var stoneConfig = AttrFruitConfig.Get(itemId);
            if (stoneConfig != null)
            {
                m_Slider.value = (float)count / stoneConfig.MaxUseCnt;
                m_Slider.value = (float)count / stoneConfig.basicUseLimit;
                m_UseNum.text = StringUtility.Contact(count, "/", stoneConfig.MaxUseCnt);
            }