hch
2025-08-28 16a90aa94d8579cc120c9962d389b59bda5e7398
95 【主界面】自动挂机
1个文件已删除
17个文件已修改
2 文件已复制
4个文件已添加
1 文件已重命名
1437 ■■■■■ 已修改文件
Main/Component/UI/Common/FuncEnable.cs 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Component/UI/Common/FuncOpen.cs 490 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Component/UI/Common/UIFuncOpen.cs 123 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Config/Configs/FuncOpenLVConfig.cs 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Config/Configs/HeroQualityConfig.cs 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ClientPack/C03_MainCharacter/C0303_tagCSetShutCutData.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ClientPack/C03_MainCharacter/C0303_tagCSetShutCutData.cs.meta 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/H01_System/DTC0102_tagCDBPlayer.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Main.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/CustomizedGift/CustomizedGiftModel.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/CustomizedGift/CustomizedRechargeModel.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Equip/EquipModel.cs 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Login/LoginWin.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Main/AutoFightModel.cs 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Main/AutoFightWin.cs 244 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Main/AutoFightWin.cs.meta 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Main/HomeWin.cs 56 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Main/MainWin.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Message/SysNotifyMgr.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Recharge/RechargeManager.cs 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Setting.meta 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Setting/QuickSetting.cs 166 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Setting/QuickSetting.cs.meta 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Task/TaskManager.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Utility/UIHelper.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Component/UI/Common/FuncEnable.cs
File was deleted
Main/Component/UI/Common/FuncOpen.cs
@@ -4,250 +4,258 @@
using UnityEngine;
using LitJson;
    public class FuncOpen
    {
        private static FuncOpen _inst = null;
        public static FuncOpen Instance {
            get {
                if (_inst == null)
                {
                    _inst = new FuncOpen();
                }
                return _inst;
            }
        }
        protected FuncOpen()
        {
            if (Application.isEditor)
public class FuncOpen
{
    private static FuncOpen _inst = null;
    public static FuncOpen Instance {
        get {
            if (_inst == null)
            {
                if (!Application.isPlaying) return;
                _inst = new FuncOpen();
            }
            var allKeys = new List<int>(FuncOpenLVConfig.dic.Keys);//GetKeys();
            funcArray = new int[allKeys.Count];
            int _index = 0;
            foreach (var key in allKeys)
            {
                int func = key;
                funcOpenState[func] = false;
                funcArray[_index] = func;
                _index++;
            }
            DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += BeforePlayerDataInitializeEvent;
            DTC0102_tagCDBPlayer.switchAccountEvent += SwitchAccountEvent;
            funcClientLVLimitDict.Clear();
            var jsonConfig = JsonMapper.ToObject(FuncConfigConfig.Get("FuncLevelLimitClient").Numerical1);
            foreach (var key in jsonConfig.Keys)
            {
                funcClientLVLimitDict[int.Parse(key)] = int.Parse(jsonConfig[key].ToString());
            }
        }
        private void BeforePlayerDataInitializeEvent()
        {
            for (int i = 0; i < funcArray.Length; i++)
            {
                funcOpenState[funcArray[i]] = false;
            }
        }
        private void SwitchAccountEvent()
        {
            for (int i = 0; i < funcArray.Length; i++)
            {
                funcOpenState[funcArray[i]] = false;
                if (OnFuncStateChangeEvent != null)
                {
                    OnFuncStateChangeEvent(funcArray[i]);
                }
            }
        }
        // TaskModel m_TaskModel;
        // TaskModel taskmodel { get { return m_TaskModel ?? (m_TaskModel = ModelCenter.Instance.GetModel<TaskModel>()); } }
        private static Dictionary<int, bool> funcOpenState = new Dictionary<int, bool>();
        private int[] funcArray;
        public event Action<int> OnFuncStateChangeEvent;
        //纯客户端的功能等级限制, key 以功能配置表的FuncLevelLimitClient为准
        //1. 精彩活动-全服红包显示等级
        public Dictionary<int, int> funcClientLVLimitDict = new Dictionary<int, int>();
        public bool IsClientLVLimit(int key)
        {
            if (!funcClientLVLimitDict.ContainsKey(key))
                return true;
            if (PlayerDatas.Instance.baseData.LV >= funcClientLVLimitDict[key])
                return true;
            return false;
        }
        public void UpdateFuncState(HA302_tagMCFuncOpenStateList vNetData)
        {
            for (int i = 0; i < vNetData.FuncCount; i++)
            {
                var funcState = vNetData.FuncStateList[i];
                bool bPerFuncIsOpen = false;
                bool bAfterFuncIsOpen = false;
                if (!funcOpenState.ContainsKey(funcState.FuncID))
                {
                    funcOpenState.Add(funcState.FuncID, funcState.State == 1);
                    bAfterFuncIsOpen = true;
                }
                else
                {
                    bPerFuncIsOpen = funcOpenState[funcState.FuncID];
                    funcOpenState[funcState.FuncID] = funcState.State == 1;
                    bAfterFuncIsOpen = funcOpenState[funcState.FuncID];
                }
                if (OnFuncStateChangeEvent != null)
                {
                    OnFuncStateChangeEvent(funcState.FuncID);
                }
            }
        }
        private bool IsFuncOpen(int key, out int errorCode)
        {
            errorCode = 0;
            var config = FuncOpenLVConfig.Get(key);
            if (config == null)
            {
                return false;
            }
            // if (config.LimitMagicWeapon > 0)
            // {
            //     Treasure treasure = null;
            //     var _stage = config.LimitMagicWeapon % 100;
            //     ModelCenter.Instance.GetModel<TreasureModel>().TryGetTreasure(config.LimitMagicWeapon / 100, out treasure);
            //     if (treasure == null || treasure.state != TreasureState.Collected || treasure.level < _stage)
            //     {
            //         errorCode = 2;
            //         return false;
            //     }
            // }
            // if (config.LimitMissionID > 0)
            // {
                // MissionDetailDates missionDetailDates = null;
                // taskmodel.allMissionDict.TryGetValue(config.LimitMissionID, out missionDetailDates);
                // if (missionDetailDates == null || missionDetailDates.MissionState != 3)
                // {
                    // errorCode = 4;
                    // return false;
                // }
            // }
            // if (config.LimiRealmLV > 0 && PlayerDatas.Instance.baseData.realmLevel < config.LimiRealmLV)
            // {
            //     errorCode = 3;
            //     return false;
            // }
            if (config.LimitLV > 0 && PlayerDatas.Instance.baseData.LV < config.LimitLV)
            {
                errorCode = 1;
                return false;
            }
            return true;
            // return false;
        }
        public bool IsFuncOpen(int key, bool tip = false)
        {
            bool isOpen = false;
            if (funcOpenState.ContainsKey(key))
                isOpen = funcOpenState[key];
            if (!isOpen && tip)
                ProcessorFuncErrorTip(key);
            return isOpen;
        }
        public void ProcessorFuncErrorTip(int key)
        {
            var config = FuncOpenLVConfig.Get(key);
            if (config != null)
            {
                SoundPlayer.Instance.PlayUIAudio(SoundPlayer.defaultClickNegativeAudio);
                if (config.Tip.Equals("FuncLimit_Level"))
                {
                    SysNotifyMgr.Instance.ShowTip(config.Tip);
                    return;
                }
                var errorCode = 0;
                if (!IsFuncOpen(key, out errorCode))
                {
                    switch (errorCode)
                    {
                        case 1:
                            SysNotifyMgr.Instance.ShowTip(config.Tip, Language.Get("OpenFunc4", config.LimitLV));
                            break;
                        //  TODO YYL
                        // case 2:
                        //     var treasureConfig = TreasureConfig.Get(config.LimitMagicWeapon / 100);
                        //     SysNotifyMgr.Instance.ShowTip(config.Tip, Language.Get("OpenFunc1", treasureConfig != null ? treasureConfig.Name : string.Empty));
                        //     break;
                        // case 3:
                        //     SysNotifyMgr.Instance.ShowTip(config.Tip, UIHelper.GetRealmName(config.LimiRealmLV, true));
                        //     break;
                        case 4:
                            if (config.LimitLV > 0)
                            {
                                SysNotifyMgr.Instance.ShowTip(config.Tip, Language.Get("OpenFunc2", config.LimitLV));
                            }
                            else
                            {
                                SysNotifyMgr.Instance.ShowTip(config.Tip, Language.Get("OpenFunc3"));
                            }
                            break;
                    }
                }
            }
        }
        public int GetLimitLv(int key)
        {
            // FuncOpenLVConfig tagFuncOpenLVModel = FuncOpenLVConfig.Get(key);
            // if (tagFuncOpenLVModel.LimitLV != 0)
            // {
            //     return tagFuncOpenLVModel.LimitLV;
            // }
            // if (tagFuncOpenLVModel.LimitMissionID != 0)
            // {
            //     var TaskConfig = PyTaskConfig.Get(tagFuncOpenLVModel.LimitMissionID);
            //     return TaskConfig.lv;
            // }
            return 1;
        }
        Dictionary<int, ICheckFuncOpen> m_CheckFuncDict = new Dictionary<int, ICheckFuncOpen>();
        public void Register(int _key, ICheckFuncOpen _check)
        {
            if (!m_CheckFuncDict.ContainsKey(_key))
            {
                m_CheckFuncDict.Add(_key, _check);
            }
        }
        public bool CheckFuncOpen(int _key)
        {
            if (m_CheckFuncDict.ContainsKey(_key))
            {
                return m_CheckFuncDict[_key].CheckFunc();
            }
            return true;
            return _inst;
        }
    }
    public interface ICheckFuncOpen
    protected FuncOpen()
    {
        bool CheckFunc();
    }
        if (Application.isEditor)
        {
            if (!Application.isPlaying) return;
        }
        var allKeys = new List<int>(FuncOpenLVConfig.dic.Keys);//GetKeys();
        funcArray = new int[allKeys.Count];
        int _index = 0;
        foreach (var key in allKeys)
        {
            int func = key;
            funcOpenState[func] = false;
            funcArray[_index] = func;
            _index++;
        }
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += BeforePlayerDataInitializeEvent;
        DTC0102_tagCDBPlayer.switchAccountEvent += SwitchAccountEvent;
        funcClientLVLimitDict.Clear();
        var jsonConfig = JsonMapper.ToObject(FuncConfigConfig.Get("FuncLevelLimitClient").Numerical1);
        foreach (var key in jsonConfig.Keys)
        {
            funcClientLVLimitDict[int.Parse(key)] = int.Parse(jsonConfig[key].ToString());
        }
    }
    private void BeforePlayerDataInitializeEvent()
    {
        for (int i = 0; i < funcArray.Length; i++)
        {
            funcOpenState[funcArray[i]] = false;
        }
    }
    private void SwitchAccountEvent()
    {
        for (int i = 0; i < funcArray.Length; i++)
        {
            funcOpenState[funcArray[i]] = false;
            if (OnFuncStateChangeEvent != null)
            {
                OnFuncStateChangeEvent(funcArray[i]);
            }
        }
    }
    // TaskModel m_TaskModel;
    // TaskModel taskmodel { get { return m_TaskModel ?? (m_TaskModel = ModelCenter.Instance.GetModel<TaskModel>()); } }
    private static Dictionary<int, bool> funcOpenState = new Dictionary<int, bool>();
    private int[] funcArray;
    public event Action<int> OnFuncStateChangeEvent;
    //纯客户端的功能等级限制, key 以功能配置表的FuncLevelLimitClient为准
    //1. 精彩活动-全服红包显示等级
    public Dictionary<int, int> funcClientLVLimitDict = new Dictionary<int, int>();
    public bool IsClientLVLimit(int key)
    {
        if (!funcClientLVLimitDict.ContainsKey(key))
            return true;
        if (PlayerDatas.Instance.baseData.LV >= funcClientLVLimitDict[key])
            return true;
        return false;
    }
    public void UpdateFuncState(HA302_tagMCFuncOpenStateList vNetData)
    {
        for (int i = 0; i < vNetData.FuncCount; i++)
        {
            var funcState = vNetData.FuncStateList[i];
            bool bPerFuncIsOpen = false;
            bool bAfterFuncIsOpen = false;
            if (!funcOpenState.ContainsKey(funcState.FuncID))
            {
                funcOpenState.Add(funcState.FuncID, funcState.State == 1);
                bAfterFuncIsOpen = true;
            }
            else
            {
                bPerFuncIsOpen = funcOpenState[funcState.FuncID];
                funcOpenState[funcState.FuncID] = funcState.State == 1;
                bAfterFuncIsOpen = funcOpenState[funcState.FuncID];
            }
            if (OnFuncStateChangeEvent != null)
            {
                OnFuncStateChangeEvent(funcState.FuncID);
            }
        }
    }
    private bool IsFuncOpen(int key, out int errorCode)
    {
        errorCode = 0;
        var config = FuncOpenLVConfig.Get(key);
        if (config == null)
        {
            return false;
        }
        if (config.OpenDay > 0)
        {
            if (config.OpenDay > TimeUtility.OpenDay + 1)
            {
                errorCode = 2;
                return false;
            }
        }
        if (config.LimitMissionID > 0)
        {
            if (TaskManager.Instance.GetNeedFinishTaskCount(config.LimitMissionID) > 0)
            {
                errorCode = 4;
                return false;
            }
        }
        if (config.LimiRealmLV > 0 && PlayerDatas.Instance.baseData.realmLevel < config.LimiRealmLV)
        {
            errorCode = 3;
            return false;
        }
        if (config.LimitLV > 0 && PlayerDatas.Instance.baseData.LV < config.LimitLV)
        {
            errorCode = 1;
            return false;
        }
        return true;
        // return false;
    }
    public bool IsFuncOpen(int key, bool tip = false)
    {
        bool isOpen = false;
        if (funcOpenState.ContainsKey(key))
            isOpen = funcOpenState[key];
        if (!isOpen && tip)
            ProcessorFuncErrorTip(key);
        return isOpen;
    }
    public void ProcessorFuncErrorTip(int key)
    {
        var config = FuncOpenLVConfig.Get(key);
        if (config != null)
        {
            SoundPlayer.Instance.PlayUIAudio(SoundPlayer.defaultClickNegativeAudio);
            var errorCode = 0;
            if (!IsFuncOpen(key, out errorCode))
            {
                switch (errorCode)
                {
                    case 1:
                        SysNotifyMgr.Instance.ShowStringTip(Language.Get("FuncLimit_Level", config.LimitLV)
                        + Language.Get("FuncLimitOpen1"));
                        break;
                    case 2:
                        //开服多少天 一般是组合
                        if (config.LimitLV != 0)
                        {
                            SysNotifyMgr.Instance.ShowStringTip(Language.Get("FuncLimit_OpenDay", config.OpenDay)
                             + Language.Get("FuncLimitOpen2")
                             + Language.Get("FuncLimit_Level", config.LimitLV)
                             + Language.Get("FuncLimitOpen1"));
                        }
                        else if (config.LimitMissionID != 0)
                        {
                            SysNotifyMgr.Instance.ShowStringTip(Language.Get("FuncLimit_OpenDay", config.OpenDay)
                             + Language.Get("FuncLimitOpen2")
                             + Language.Get("FuncLimit_Mission", TaskManager.Instance.GetNeedFinishTaskCount(config.LimitMissionID))
                             + Language.Get("FuncLimitOpen1"));
                        }
                        else
                        {
                            SysNotifyMgr.Instance.ShowStringTip(Language.Get("FuncLimit_OpenDay", config.OpenDay)
                             + Language.Get("FuncLimitOpen1"));
                        }
                        break;
                    case 3:
                        SysNotifyMgr.Instance.ShowStringTip(Language.Get("FuncLimit_Realm", RealmConfig.Get(config.LimiRealmLV).Name)
                         + Language.Get("FuncLimitOpen1"));
                        break;
                    case 4:
                        SysNotifyMgr.Instance.ShowStringTip(Language.Get("FuncLimit_Mission", TaskManager.Instance.GetNeedFinishTaskCount(config.LimitMissionID))
                         + Language.Get("FuncLimitOpen1"));
                        break;
                }
            }
        }
    }
    public int GetLimitLv(int key)
    {
        // FuncOpenLVConfig tagFuncOpenLVModel = FuncOpenLVConfig.Get(key);
        // if (tagFuncOpenLVModel.LimitLV != 0)
        // {
        //     return tagFuncOpenLVModel.LimitLV;
        // }
        // if (tagFuncOpenLVModel.LimitMissionID != 0)
        // {
        //     var TaskConfig = PyTaskConfig.Get(tagFuncOpenLVModel.LimitMissionID);
        //     return TaskConfig.lv;
        // }
        return 1;
    }
    Dictionary<int, ICheckFuncOpen> m_CheckFuncDict = new Dictionary<int, ICheckFuncOpen>();
    public void Register(int _key, ICheckFuncOpen _check)
    {
        if (!m_CheckFuncDict.ContainsKey(_key))
        {
            m_CheckFuncDict.Add(_key, _check);
        }
    }
    public bool CheckFuncOpen(int _key)
    {
        if (m_CheckFuncDict.ContainsKey(_key))
        {
            return m_CheckFuncDict[_key].CheckFunc();
        }
        return true;
    }
}
public interface ICheckFuncOpen
{
    bool CheckFunc();
}
Main/Component/UI/Common/UIFuncOpen.cs
@@ -8,86 +8,87 @@
using System;
using UnityEngine.EventSystems;
    public class UIFuncOpen : MonoBehaviour, IPointerClickHandler
public class UIFuncOpen : MonoBehaviour, IPointerClickHandler
{
    [SerializeField] int funcOpenKey;
    [SerializeField] GameObject LockImg;
    [SerializeField] bool active = true;
    public int id { get { return funcOpenKey; } }
    private Button funcBtn;
    private void Awake()
    {
        [SerializeField] int funcOpenKey;
        [SerializeField] GameObject LockImg;
        [SerializeField] bool active = true;
        public int id { get { return funcOpenKey; } }
        funcBtn = GetComponent<Button>();
        private Button funcBtn;
        FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
    }
        private void Awake()
    public void OnPointerClick(PointerEventData eventData)
    {
        if (!FuncOpen.Instance.IsFuncOpen(funcOpenKey))
        {
            funcBtn = GetComponent<Button>();
            FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
            FuncOpen.Instance.ProcessorFuncErrorTip(funcOpenKey);
            return;
        }
    }
        public void OnPointerClick(PointerEventData eventData)
        {
            if (!FuncOpen.Instance.IsFuncOpen(funcOpenKey))
            {
                FuncOpen.Instance.ProcessorFuncErrorTip(funcOpenKey);
                return;
            }
        }
    private void OnEnable()
    {
        SetState();
    }
        private void OnEnable()
    private void OnFuncStateChangeEvent(int func)
    {
        if (funcOpenKey == func)
        {
            SetState();
        }
    }
        private void OnFuncStateChangeEvent(int func)
    private void OnDestroy()
    {
        FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
    }
    private void SetState()
    {
        var IsOpen = FuncOpen.Instance.IsFuncOpen(funcOpenKey);
        var _funcOpenCfg = FuncOpenLVConfig.Get(funcOpenKey);
        if (_funcOpenCfg == null)
        {
            if (funcOpenKey == func)
            {
                SetState();
            }
            IsOpen = true;
            active = true;
        }
        private void OnDestroy()
        if (funcBtn != null)
        {
            FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
            funcBtn.interactable = IsOpen;
        }
        private void SetState()
        if (LockImg != null)
        {
            var IsOpen = FuncOpen.Instance.IsFuncOpen(funcOpenKey);
            var _funcOpenCfg = FuncOpenLVConfig.Get(funcOpenKey);
            LockImg.SetActive(!IsOpen);
        }
            if (_funcOpenCfg == null)
            {
                IsOpen = true;
                active = true;
            }
        // 未开启是否显示的配置
        // if (_funcOpenCfg != null && _funcOpenCfg.open == 0)
        // {
        //     gameObject.SetActive(false);
        //     return;
        // }
            if (funcBtn != null)
        if (!active)
        {
            gameObject.SetActive(IsOpen);
        }
        else
        {
            if (!gameObject.activeSelf)
            {
                funcBtn.interactable = IsOpen;
            }
            if (LockImg != null)
            {
                LockImg.SetActive(!IsOpen);
            }
            if (_funcOpenCfg != null && _funcOpenCfg.open == 0)
            {
                gameObject.SetActive(false);
                return;
            }
            if (!active)
            {
                gameObject.SetActive(IsOpen);
            }
            else
            {
                if (!gameObject.activeSelf)
                {
                    gameObject.SetActive(true);
                }
                gameObject.SetActive(true);
            }
        }
    }
    }
}
Main/Config/Configs/FuncOpenLVConfig.cs
@@ -1,6 +1,6 @@
//--------------------------------------------------------
//    [Author]:           YYL
//    [  Date ]:           2025年8月20日
//    [  Date ]:           2025年8月28日
//--------------------------------------------------------
using System.Collections.Generic;
@@ -20,11 +20,11 @@
    public int LimitLV;
    public int LimiRealmLV;
    public int LimitMissionID;
    public int OpenDay;
    public string Name;
    public string Desc;
    public string Tip;
    public string Icon;
    public int open;
    public Dictionary<int, int[][]> Award;
    public override int LoadKey(string _key)
    {
@@ -44,15 +44,15 @@
            int.TryParse(tables[3],out LimitMissionID); 
            Name = tables[4];
            int.TryParse(tables[4],out OpenDay);
            Desc = tables[5];
            Name = tables[5];
            Tip = tables[6];
            Desc = tables[6];
            Icon = tables[7];
            int.TryParse(tables[8],out open);
            Award = ConfigParse.ParseIntArray2Dict(tables[8]);
        }
        catch (Exception exception)
        {
Main/Config/Configs/HeroQualityConfig.cs
@@ -1,6 +1,6 @@
//--------------------------------------------------------
//    [Author]:           YYL
//    [  Date ]:           2025年8月7日
//    [  Date ]:           Thursday, August 28, 2025
//--------------------------------------------------------
using System.Collections.Generic;
@@ -17,7 +17,6 @@
    }
    public int Quality;
    public int[] UPCostItem;
    public int InitStarUpper;
    public int InitAddPer;
    public int LVAddPer;
@@ -41,37 +40,23 @@
        string[] tables = input.Split('\t');
        int.TryParse(tables[0],out Quality); 
            if (tables[1].Contains("["))
            int.TryParse(tables[1],out InitStarUpper);
            int.TryParse(tables[2],out InitAddPer);
            int.TryParse(tables[3],out LVAddPer);
            int.TryParse(tables[4],out BreakLVAddPer);
            int.TryParse(tables[5],out StarAddPer);
            if (tables[6].Contains("["))
            {
                UPCostItem = JsonMapper.ToObject<int[]>(tables[1]);
                BookActAwardMoney = JsonMapper.ToObject<int[]>(tables[6]);
            }
            else
            {
                string[] UPCostItemStringArray = tables[1].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
                UPCostItem = new int[UPCostItemStringArray.Length];
                for (int i=0;i<UPCostItemStringArray.Length;i++)
                {
                     int.TryParse(UPCostItemStringArray[i],out UPCostItem[i]);
                }
            }
            int.TryParse(tables[2],out InitStarUpper);
            int.TryParse(tables[3],out InitAddPer);
            int.TryParse(tables[4],out LVAddPer);
            int.TryParse(tables[5],out BreakLVAddPer);
            int.TryParse(tables[6],out StarAddPer);
            if (tables[7].Contains("["))
            {
                BookActAwardMoney = JsonMapper.ToObject<int[]>(tables[7]);
            }
            else
            {
                string[] BookActAwardMoneyStringArray = tables[7].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
                string[] BookActAwardMoneyStringArray = tables[6].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
                BookActAwardMoney = new int[BookActAwardMoneyStringArray.Length];
                for (int i=0;i<BookActAwardMoneyStringArray.Length;i++)
                {
@@ -79,13 +64,13 @@
                }
            }
            int.TryParse(tables[8],out BookInitAddPer);
            int.TryParse(tables[7],out BookInitAddPer);
            int.TryParse(tables[9],out BookStarAddPer);
            int.TryParse(tables[8],out BookStarAddPer);
            int.TryParse(tables[10],out BookBreakLVAddPer);
            int.TryParse(tables[9],out BookBreakLVAddPer);
            DismissReturnItems = JsonMapper.ToObject<int[][]>(tables[11].Replace("(", "[").Replace(")", "]"));
            DismissReturnItems = JsonMapper.ToObject<int[][]>(tables[10].Replace("(", "[").Replace(")", "]"));
        }
        catch (Exception exception)
        {
Main/Core/NetworkPackage/ClientPack/C03_MainCharacter/C0303_tagCSetShutCutData.cs
New file
@@ -0,0 +1,17 @@
using UnityEngine;
using System.Collections;
//03 03 设置快捷栏保存#tagCSetShutCutData
public class C0303_tagCSetShutCutData : GameNetPackBasic {
    public string Setting;
    public C0303_tagCSetShutCutData () {
        _cmd = (ushort)0x0303;
    }
    public override void WriteToBytes () {
        WriteBytes (Setting, NetDataType.Chars, 100);
    }
}
Main/Core/NetworkPackage/ClientPack/C03_MainCharacter/C0303_tagCSetShutCutData.cs.meta
copy from Main/Component/UI/Common/FuncEnable.cs.meta copy to Main/Core/NetworkPackage/ClientPack/C03_MainCharacter/C0303_tagCSetShutCutData.cs.meta
File was copied from Main/Component/UI/Common/FuncEnable.cs.meta
@@ -1,8 +1,7 @@
fileFormatVersion: 2
guid: e034d1a3f772bb44bbbcd4273f5084e1
timeCreated: 1516430103
licenseType: Free
guid: 35992e06ad8ed6049bbfca868849f3d1
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
Main/Core/NetworkPackage/DTCFile/ServerPack/H01_System/DTC0102_tagCDBPlayer.cs
@@ -37,7 +37,7 @@
        PlayerDatas.Instance.InitPlayerData(package);
        PlayerDatas.Instance.RequestWorldTick();
        QuickSetting.Instance.SetQuickSetting(package.Setting);
        if (playerIdBuf != 0 && playerIdBuf != PlayerDatas.Instance.baseData.PlayerID)
        {
            if (switchAccountEvent != null)
Main/Main.cs
@@ -77,6 +77,7 @@
        managers.Add(HeroUIManager.Instance);
        managers.Add(InvestModel.Instance);
        managers.Add(BlessLVManager.Instance);
        managers.Add(AutoFightModel.Instance);
        foreach (var manager in managers)
        {
Main/System/CustomizedGift/CustomizedGiftModel.cs
@@ -127,7 +127,7 @@
        for (int i = 0; i < act.ctgIDs.Count; i++)
        {
            int ctgID = act.ctgIDs[i];
            RechargeManager.RechargeCount rechargeCount;
            RechargeCount rechargeCount;
            if (RechargeManager.Instance.TryGetRechargeCount(ctgID, out rechargeCount))
            {
                total += rechargeCount.totalCount;
@@ -142,7 +142,7 @@
        OperationRechargeGiftAct act;
        OperationTimeHepler.Instance.TryGetOperation(operaType, out act);
        RechargeManager.RechargeCount rechargeCount;
        RechargeCount rechargeCount;
        RechargeManager.Instance.TryGetRechargeCount(ctgID, out rechargeCount);
        var ctgConfig = CTGConfig.Get(ctgID);
Main/System/CustomizedGift/CustomizedRechargeModel.cs
@@ -30,7 +30,7 @@
        if (!RechargeManager.Instance.TryGetRechargeItem(ctgId, out awards))
            return false;
        RechargeManager.RechargeCount rechargeCount;
        RechargeCount rechargeCount;
        if (!RechargeManager.Instance.TryGetRechargeCount(ctgId, out rechargeCount))
        {
            return false;
@@ -101,7 +101,7 @@
    public void InitChoose()
    {
        RechargeManager.RechargeCount rechargeCount;
        RechargeCount rechargeCount;
        RechargeManager.Instance.TryGetRechargeCount(chooseCTGID, out rechargeCount);
        var selectedItemIndexs = CustomizedRechargeModel.Instance.GetSelectedItems(rechargeCount.selectItemValue);
@@ -132,7 +132,7 @@
        int goodsSumCount; //商品总数量
        List<Item> awards = new List<Item>();
        TryGetRechargeItemEx(ctgID, out awards, out goodsCount, out goodsSumCount);
        RechargeManager.RechargeCount rechargeCount;
        RechargeCount rechargeCount;
        RechargeManager.Instance.TryGetRechargeCount(ctgID, out rechargeCount);
        for (int i = 0; i < itemCells.Count; i++)
        {
Main/System/Equip/EquipModel.cs
@@ -9,7 +9,7 @@
public class EquipModel : GameSystemManager<EquipModel>
{
    public const int TotleEquip = 12;  //装备栏大小
    public bool waitEquipOPPack = false;
    public bool waitEquipOPPack = false;    // 穿戴装备的操作 不含分解
    public event Action<bool, int> OnEquipOPResultAction;    //是否换上了新装备且分解了 装备索引
    public event Action<List<int>, RectTransform> OnItemDropEvent;
@@ -23,7 +23,7 @@
    public int[] equipUIGirdEffects;  //装备格子特效
    public ItemModel selectFloorEquip; //选中的地板装备
    public int lastShowEquipIndex = -1;  //上一次界面显示装备的索引,拾取后物品消失需记录下做表现
    public Queue<int> waitEquipOP = new Queue<int>();    //等待操作的装备,需要和UI交互确认
    public Queue<int> waitEquipOP = new Queue<int>();    //等待操作的装备,需要和UI交互确认 不含分解
    public override void Init()
    {
@@ -238,6 +238,13 @@
        // if (!IsEquip(equip))
        //     return false;
        if (AutoFightModel.Instance.TryAutoFightDoEquip(equip))
        {
            //自动战力对比, 条件不满足的分解
            return false;
        }
        // 好几件装备需要处理的情况存起来
        waitEquipOP.Enqueue(equip.gridIndex);
        //未回复装备操作结果,否则会显示旧装备
        if (waitEquipOPPack)
@@ -252,10 +259,12 @@
            return false;
        }
        selectFloorEquip = GetSelectFloorEquip();
        if (selectFloorEquip == null)
            return false;
        UIManager.Instance.OpenWindow<EquipExchangeWin>();
        return true;
    }
@@ -266,18 +275,12 @@
        if (waitEquipOP.Count == 0)
            return null;
        ItemModel item = PackManager.Instance.GetItemByIndex(PackType.DropItem, waitEquipOP.Dequeue());
        if (AutoFightModel.Instance.isAutoAttack)
        {
            //自动战力对比, 条件不满足的分解
            return null;
        return PackManager.Instance.GetItemByIndex(PackType.DropItem, waitEquipOP.Dequeue());
        }
        return item;
    }
    //等级
    public int GetEquipLV(ItemModel equip)
    {
Main/System/Login/LoginWin.cs
@@ -99,6 +99,7 @@
        //     InGameDownLoad.Instance.downLoadGo = false;
        //     DownloadMgr.MaxDownLoadTask = InGameDownLoad.Instance.GetMaxTask();
        // });
        AutoFightModel.Instance.isAutoAttack = false;
    }
    protected override void OnOpenAnimationComplete()
@@ -124,9 +125,9 @@
    public override void Refresh()
    {
        base.Refresh();
        Debug.Log("刷新登录窗口");
        //打包版本 + 功能版本 + 语言ID
        Debug.Log("刷新登录窗口");
        //打包版本 + 功能版本 + 语言ID
        verInfo.text = LoginManager.Instance.GetVersionStr();
        var sprite = BuiltInLoader.LoadSprite("TB_DL_Logo");
Main/System/Main/AutoFightModel.cs
@@ -2,25 +2,133 @@
using System.Collections;
using System.Collections.Generic;
using System.Text;
using LitJson;
using UnityEngine;
public class AutoFightModel : GameSystemManager<AutoFightModel>
{
    public int fightSpeed = 1; //战斗倍数:值越大越快,影响战斗表现,掉落速度等
    //战斗倍数:值越大越快,影响战斗表现,掉落速度等
    public int fightSpeed
    {
        get
        {
            int value = QuickSetting.Instance.GetQuickSettingValue<int>(QuickSettingType.AutoFight_Speed, 0);
            return Math.Min(Math.Max(value, 1), maxSpeed);
        }
        set
        {
            QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_Speed, value);
        }
    }
    public bool isAutoAttack; //自动攻击
    //消耗倍数
    public int fightCost
    {
        get
        {
            int value = QuickSetting.Instance.GetQuickSettingValue<int>(QuickSettingType.AutoFight_Cost, 0);
            return Math.Min(Math.Max(value, 1), maxCost);
        }
        set
        {
            QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_Cost, value);
        }
    }
    //自动模式, 真正点击战锤消耗开启,和休息(或无材料)停止
    public bool isAutoAttack = false;
    //是否开启自动战斗设置
    public bool isAutoAttackSet
    {
        get
        {
            return QuickSetting.Instance.GetQuickSettingBool(QuickSettingType.AutoFight_Open, 0);
        }
        set
        {
            QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_Open, value);
        }
    }
    //更好装备停止战斗
    public bool isStopFightByBetterEquip
    {
        get
        {
            return QuickSetting.Instance.GetQuickSettingBool(QuickSettingType.AutoFight_FightPower, 0);
        }
        set
        {
            QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_FightPower, value);
        }
    }
    public event Action ChangeAutoEvent;
    public int maxSpeed = 3; //最高速度
    public int maxCost; //最高消耗
    public int[] autoCostWithBlessLV; //自动战斗消耗倍数关联祝福等级
    public int speed2UnlockMissionID;
    public int speed3UnlockCTGID;
    public override void Init()
    {
        ParseConfig();
        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOk;
    }
    public override void Release()
    {
        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOk;
    }
    void ParseConfig()
    {
        var config = FuncConfigConfig.Get("AutoGuaji");
        autoCostWithBlessLV = JsonMapper.ToObject<int[]>(config.Numerical1);
        speed2UnlockMissionID = int.Parse(config.Numerical2);
        speed3UnlockCTGID = int.Parse(config.Numerical3);
        maxCost = autoCostWithBlessLV.Length;
    }
    void OnPlayerLoginOk()
    {
        //登录时有装备的处理
    }
    public void SaveAutoFightSetting()
    {
        QuickSetting.Instance.SendPackage();
        ChangeAutoEvent?.Invoke();
    }
    //自动处理装备,需要等待穿戴返回false,其他情况返回true
    public bool TryAutoFightDoEquip(ItemModel item)
    {
        if (!isAutoAttack)
            return false;
        if (item == null)
            return true;
        long showFightPower = FightPowerManager.Instance.GetFightPowerChange(item);
        if (showFightPower < 0)
        {
            EquipModel.Instance.SendEquipOP(new ushort[] { (ushort)item.gridIndex }, 1);
            return true;
        }
        else
        {
            if (isStopFightByBetterEquip)
                return false;
            EquipModel.Instance.SendEquipOP(new ushort[] { (ushort)item.gridIndex }, 1);
            return true;
        }
    }
}
Main/System/Main/AutoFightWin.cs
New file
@@ -0,0 +1,244 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class AutoFightWin : UIBase
{
    [SerializeField] Button autoStartBtn;
    [SerializeField] GameObject usingAutoObj;
    [SerializeField] Button autoStopBtn;
    [SerializeField] Button autoSaveBtn;
    [SerializeField] Button changeCostBtn;
    [SerializeField] Text costText;
    [SerializeField] Image costArrow;
    [SerializeField] Text costTip;
    [SerializeField] ScrollerController costScroll;
    [SerializeField] Button changeSpeedBtn;
    [SerializeField] Text speedText;
    [SerializeField] Image speedArrow;
    [SerializeField] ScrollerController speedScroll;
    [SerializeField] Toggle betterEquipToggle;
    bool isOpenCostScroll = false;
    bool isOpenSpeedScroll = false;
    protected override void InitComponent()
    {
        autoStartBtn.AddListener(OnClickAutoStart);
        autoStopBtn.AddListener(OnClickAutoStop);
        autoSaveBtn.AddListener(OnClickAutoStart);
        changeCostBtn.AddListener(() =>
        {
            isOpenCostScroll = !isOpenCostScroll;
            costScroll.SetActive(isOpenCostScroll);
            costArrow.transform.localRotation = Quaternion.Euler(0, 0, isOpenCostScroll ? 180 : 0);
        });
        changeSpeedBtn.AddListener(() =>
        {
            isOpenSpeedScroll = !isOpenSpeedScroll;
            speedScroll.SetActive(isOpenSpeedScroll);
            speedArrow.transform.localRotation = Quaternion.Euler(0, 0, isOpenSpeedScroll ? 180 : 0);
        });
        betterEquipToggle.AddListener((bool value) =>
        {
            betterEquipToggle.isOn = value;
        });
        costScroll.GetComponent<ClickScreenOtherSpace>().AddListener(() =>
        {
            isOpenCostScroll = false;
            costArrow.transform.localRotation = Quaternion.Euler(0, 0, 0);
        });
        speedScroll.GetComponent<ClickScreenOtherSpace>().AddListener(() =>
        {
            isOpenSpeedScroll = false;
            speedArrow.transform.localRotation = Quaternion.Euler(0, 0, 0);
        });
    }
    protected override void OnPreOpen()
    {
        costScroll.OnRefreshCell += OnRefreshCostCell;
        speedScroll.OnRefreshCell += OnRefreshSpeedCell;
        Display();
    }
    protected override void OnPreClose()
    {
        costScroll.OnRefreshCell -= OnRefreshCostCell;
        speedScroll.OnRefreshCell -= OnRefreshSpeedCell;
    }
    void Display()
    {
        costText.text = AutoFightModel.Instance.fightCost.ToString();
        speedText.text = AutoFightModel.Instance.fightSpeed.ToString();
        betterEquipToggle.isOn = AutoFightModel.Instance.isStopFightByBetterEquip;
        costTip.text = Language.Get("AutoFight2", ItemConfig.Get(GeneralDefine.MoneyDisplayModel[41]).ItemName, AutoFightModel.Instance.fightCost);
        if (AutoFightModel.Instance.isAutoAttackSet)
        {
            usingAutoObj.SetActive(true);
            autoStartBtn.SetActive(false);
        }
        else
        {
            usingAutoObj.SetActive(false);
            autoStartBtn.SetActive(true);
        }
        costScroll.SetActive(false);
        speedScroll.SetActive(false);
        costArrow.transform.localRotation = Quaternion.Euler(0, 0, 0);
        speedArrow.transform.localRotation = Quaternion.Euler(0, 0, 0);
        CreateCostScroll();
        CreateSpeedScroll();
    }
    void CreateCostScroll()
    {
        costScroll.Refresh();
        for (int i = 0; i < AutoFightModel.Instance.maxCost; i++)
        {
            costScroll.AddCell(ScrollerDataType.Header, i + 1);
        }
        costScroll.Restart();
    }
    void CreateSpeedScroll()
    {
        speedScroll.Refresh();
        for (int i = 0; i < AutoFightModel.Instance.maxSpeed; i++)
        {
            speedScroll.AddCell(ScrollerDataType.Header, i + 1);
        }
        speedScroll.Restart();
    }
    void OnRefreshCostCell(ScrollerDataType type, CellView cell)
    {
        var btn = cell.GetComponent<Button>();
        btn.AddListener(() =>
        {
            if (AutoFightModel.Instance.autoCostWithBlessLV[cell.index - 1] > BlessLVManager.Instance.m_TreeLV)
            {
                SysNotifyMgr.Instance.ShowTip("autofight4", AutoFightModel.Instance.autoCostWithBlessLV[cell.index - 1]);
                return;
            }
            isOpenCostScroll = false;
            costScroll.SetActive(false);
            costArrow.transform.localRotation = Quaternion.Euler(0, 0, 0);
            costText.text = cell.index.ToString();
            costTip.text = Language.Get("AutoFight2", ItemConfig.Get(GeneralDefine.MoneyDisplayModel[41]).ItemName, cell.index);
        });
        var cntText = cell.GetComponentInChildren<Text>();
        if (AutoFightModel.Instance.autoCostWithBlessLV[cell.index - 1] <= BlessLVManager.Instance.m_TreeLV)
        {
            cntText.text = UIHelper.AppendColor(TextColType.LightWhite, cell.index.ToString());
        }
        else
        {
            cntText.text = UIHelper.AppendColor(TextColType.Gray, cell.index.ToString());
        }
    }
    void OnRefreshSpeedCell(ScrollerDataType type, CellView cell)
    {
        var btn = cell.GetComponent<Button>();
        var needtaskCount = TaskManager.Instance.GetNeedFinishTaskCount(AutoFightModel.Instance.speed2UnlockMissionID);
        RechargeCount _rechargeCount;
        bool isbuy = false;
        if (RechargeManager.Instance.TryGetRechargeCount(AutoFightModel.Instance.speed3UnlockCTGID, out _rechargeCount))
        {
            isbuy = _rechargeCount.totalCount > 0;
        }
        btn.AddListener(() =>
        {
            if (cell.index == 2)
            {
                if (needtaskCount > 0)
                {
                    SysNotifyMgr.Instance.ShowTip("autofight2", needtaskCount);
                    return;
                }
            }
            else if (cell.index == 3)
            {
                if (!isbuy)
                {
                    SysNotifyMgr.Instance.ShowTip("autofight3");
                    return;
                }
            }
            isOpenSpeedScroll = false;
            speedScroll.SetActive(false);
            speedArrow.transform.localRotation = Quaternion.Euler(0, 0, 0);
            speedText.text = cell.index.ToString();
        });
        var cntText = cell.GetComponentInChildren<Text>();
        if (cell.index == 2)
        {
            cntText.text = UIHelper.AppendColor(needtaskCount > 0 ? TextColType.Gray : TextColType.LightWhite, cell.index.ToString());
        }
        else if (cell.index == 3)
        {
            cntText.text = UIHelper.AppendColor(isbuy ? TextColType.LightWhite : TextColType.Gray, cell.index.ToString());
        }
        else
        {
            cntText.text = cell.index.ToString();
        }
    }
    void OnClickAutoStart()
    {
        AutoFightModel.Instance.isAutoAttackSet = true;
        AutoFightModel.Instance.fightCost = int.Parse(costText.text);
        AutoFightModel.Instance.fightSpeed = int.Parse(speedText.text);
        AutoFightModel.Instance.isStopFightByBetterEquip = betterEquipToggle.isOn;
        AutoFightModel.Instance.SaveAutoFightSetting();
        CloseWindow();
        SysNotifyMgr.Instance.ShowTip("autofight1");
    }
    void OnClickAutoStop()
    {
        ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"),
        Language.Get("AutoFight11"), (bool isOK) =>
            {
                if (isOK)
                {
                    AutoFightModel.Instance.isAutoAttackSet = false;
                    AutoFightModel.Instance.fightCost = int.Parse(costText.text);
                    AutoFightModel.Instance.fightSpeed = int.Parse(speedText.text);
                    AutoFightModel.Instance.isStopFightByBetterEquip = betterEquipToggle.isOn;
                    AutoFightModel.Instance.SaveAutoFightSetting();
                    CloseWindow();
                }
            });
    }
}
Main/System/Main/AutoFightWin.cs.meta
copy from Main/Component/UI/Common/FuncEnable.cs.meta copy to Main/System/Main/AutoFightWin.cs.meta
File was copied from Main/Component/UI/Common/FuncEnable.cs.meta
@@ -1,8 +1,7 @@
fileFormatVersion: 2
guid: e034d1a3f772bb44bbbcd4273f5084e1
timeCreated: 1516430103
licenseType: Free
guid: eb3b2c8794aa61c4c95ea434c6baebbc
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
Main/System/Main/HomeWin.cs
@@ -33,6 +33,8 @@
    //底部功能
    [SerializeField] Button autoBtn;
    [SerializeField] Image autoCloseImg;
    [SerializeField] UIEffectPlayer autoOpenEffect;
    [SerializeField] Button  blessLVBtn;
    [SerializeField] Text blessLVText;
@@ -58,25 +60,30 @@
        autoBtn.AddListener(() =>
        {
            //测试拾取所有物品
            var items = PackManager.Instance.GetItems(PackType.DropItem);
            List<int> dropindexs = new List<int>();
            for (int i = 0; i < items.Count; i++)
            {
                var item = items[i];
                if (dropindexs.Count > 5)
                {
                    EquipModel.Instance.NotifyItemDrop(dropindexs, BattleManager.Instance.storyBattleField.battleRootNode.blueTeamNodeList[Random.Range(0, 5)].GetComponent<RectTransform>());
                    dropindexs.Clear();
                }
            // //测试拾取所有物品
            // var items = PackManager.Instance.GetItems(PackType.DropItem);
            // List<int> dropindexs = new List<int>();
            // for (int i = 0; i < items.Count; i++)
            // {
            //     var item = items[i];
            //     if (dropindexs.Count > 5)
            //     {
            //         EquipModel.Instance.NotifyItemDrop(dropindexs, BattleManager.Instance.storyBattleField.battleRootNode.blueTeamNodeList[Random.Range(0, 5)].GetComponent<RectTransform>());
            //         dropindexs.Clear();
            //     }
                dropindexs.Add(item.gridIndex);
            }
            if (dropindexs.Count > 0)
            //     dropindexs.Add(item.gridIndex);
            // }
            // if (dropindexs.Count > 0)
            // {
            //     EquipModel.Instance.NotifyItemDrop(dropindexs, BattleManager.Instance.storyBattleField.battleRootNode.blueTeamNodeList[Random.Range(0, 5)].GetComponent<RectTransform>());
            //     dropindexs.Clear();
            // }
            if (!FuncOpen.Instance.IsFuncOpen(108, true))
            {
                EquipModel.Instance.NotifyItemDrop(dropindexs, BattleManager.Instance.storyBattleField.battleRootNode.blueTeamNodeList[Random.Range(0, 5)].GetComponent<RectTransform>());
                dropindexs.Clear();
                return;
            }
            UIManager.Instance.OpenWindow<AutoFightWin>();
        });
@@ -107,6 +114,7 @@
        UpdateTask();
        RefreshRecharge();
        ShowBlessLV();
        DisplayAutoFight();
    }
    protected override void OnPreOpen()
@@ -114,6 +122,7 @@
        PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefresh;
        TaskManager.Instance.OnTaskUpdate += UpdateTask;
        BlessLVManager.Instance.OnBlessLVUpdateEvent += ShowBlessLV;
        AutoFightModel.Instance.ChangeAutoEvent += DisplayAutoFight;
        Display();
        // var battleWin = UIManager.Instance.OpenWindow<BattleWin>();
        // battleWin.SetBattleField(BattleManager.Instance.storyBattleField);
@@ -126,6 +135,7 @@
        PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefresh;
        TaskManager.Instance.OnTaskUpdate -= UpdateTask;
        BlessLVManager.Instance.OnBlessLVUpdateEvent -= ShowBlessLV;
        AutoFightModel.Instance.ChangeAutoEvent -= DisplayAutoFight;
        //  关闭的时候把战斗界面也给关了 虽然是在外面开的
        UIManager.Instance.CloseWindow<BattleWin>();
@@ -157,6 +167,20 @@
    {
        blessLVText.text = BlessLVManager.Instance.m_TreeLV.ToString();
    }
    void DisplayAutoFight()
    {
        if (AutoFightModel.Instance.isAutoAttackSet)
        {
            autoCloseImg.SetActive(false);
            autoOpenEffect.Play();
        }
        else
        {
            autoCloseImg.SetActive(true);
            autoOpenEffect.Stop();
        }
    }
    
    /// <summary>
    /// 更新玩家信息
Main/System/Main/MainWin.cs
@@ -105,6 +105,10 @@
            if (currentSubUI != null && currentSubUI.name == "HomeWin")
            {
                //打开主界面的情况下再点击按钮,执行攻击逻辑
                if (AutoFightModel.Instance.isAutoAttackSet)
                {
                    AutoFightModel.Instance.isAutoAttack = true;
                }
                StoryBattleField storyBattleField = BattleManager.Instance.storyBattleField;
                if (storyBattleField != null)
                {
Main/System/Message/SysNotifyMgr.cs
@@ -149,6 +149,7 @@
        }
    }
    //信息提示表的提示
    public void ShowTip(string key, params object[] msg)
    {
        SysInfoConfig cfg = SysInfoConfig.Get(key);
@@ -159,11 +160,24 @@
            AnalysisSysmsg(cfg);
        }
        else
        {
        {
            Debug.LogError("未找到系统提示信息: " + key);
        }
    }
    //语言表的提示
    public void ShowLangTip(string key, params object[] msg)
    {
        string hint = Language.Get(key, msg);
        ScrollTip.ShowTip(hint);
    }
    //直接传文字的提示
    public void ShowStringTip(string hint)
    {
        ScrollTip.ShowTip(hint);
    }
    void AnalysisSysmsg(SysInfoConfig cfg)
    {
        SysNotifySound(cfg.sound);
Main/System/Recharge/RechargeManager.cs
@@ -613,15 +613,6 @@
    }
    public struct RechargeCount
    {
        public int todayCount;
        public int totalCount;
        public int weekPayCount;
        public int monthPayCount;
        public int selectItemValue;
    }
    public int FirstGoldServerDay = 0; //0表示未充值,首充时为开服第几天(openday+1) 
@@ -768,3 +759,12 @@
}
public struct RechargeCount
{
    public int todayCount;
    public int totalCount;
    public int weekPayCount;
    public int monthPayCount;
    public int selectItemValue;
}
Main/System/Setting.meta
New file
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 629835bc583036c41a4e9cb04fc4fdb7
folderAsset: yes
DefaultImporter:
  externalObjects: {}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Setting/QuickSetting.cs
New file
@@ -0,0 +1,166 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Text;
using System;
using System.Text.RegularExpressions;
/// <summary>
/// 服务端Setting配置,存储一些快捷设置,目前长度为100
/// </summary>
public class QuickSetting : Singleton<QuickSetting>
{
    public QuickSetting()
    {
        //自动战斗 几倍消耗 几倍速度 是否高战力停止 是否开启自动战斗
        quickSettingDic.Add(QuickSettingType.AutoFight_Cost, new QuickSettingRange(QuickSettingType.AutoFight_Cost, 0, 1));
        quickSettingDic.Add(QuickSettingType.AutoFight_Speed, new QuickSettingRange(QuickSettingType.AutoFight_Speed, 1, 1));
        quickSettingDic.Add(QuickSettingType.AutoFight_FightPower, new QuickSettingRange(QuickSettingType.AutoFight_FightPower, 2, 1));
        quickSettingDic.Add(QuickSettingType.AutoFight_Open, new QuickSettingRange(QuickSettingType.AutoFight_Open, 3, 1));
        setting = new string(UCharacter, 100);
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += BeforePlayerDataInitializeEvent;
    }
    public Dictionary<QuickSettingType, QuickSettingRange> quickSettingDic = new Dictionary<QuickSettingType, QuickSettingRange>();
    public const char UCharacter = '*';
    private string setting;
    private string cacheSetting;
    private StringBuilder textBuilder = new StringBuilder();
    public event Action onQuickSettingUpdate;
    public void SetQuickSetting<T>(QuickSettingType type, T value, int index = 0) where T : struct
    {
        SetQuickSetting(type, value.ToString(), index);
    }
    public void SetQuickSetting(QuickSettingType type, bool value, int index = 0)
    {
        SetQuickSetting<int>(type, value ? 1 : 0, index);
    }
    public void SetQuickSetting(int type, string value, int index)
    {
        SetQuickSetting((QuickSettingType)type, value, index);
    }
    public void SetQuickSetting(QuickSettingType type, string value, int index)
    {
        var quickRange = quickSettingDic[type];
        if ((index - quickRange.index) * quickRange.single + value.Length > quickRange.length || value.Length > quickRange.single)
        {
            Debug.LogErrorFormat("存储的数据超过最大长度!{0}", type);
            return;
        }
        textBuilder.Length = 0;
        var start = quickRange.index + index * quickRange.single;
        var end = start + value.Length;
        if (quickRange.length == quickRange.single)
        {
            end = start + quickRange.length;
        }
        textBuilder.Append(setting, 0, start);
        textBuilder.Append(value);
        if (quickRange.length == quickRange.single
            && quickRange.length > value.Length)
        {
            textBuilder.Append('*', quickRange.length - value.Length);
        }
        textBuilder.Append(setting, end, setting.Length - end);
        setting = textBuilder.ToString();
        PlayerDatas.Instance.baseData.Setting = setting;
    }
    public void SetQuickSetting(string value)
    {
        value = UIHelper.ServerStringTrim(value);
        if (value != null && value.Length > 0)
        {
            setting = StringUtility.Contact(value, setting.Substring(value.Length, setting.Length - value.Length));
            cacheSetting = setting;
            PlayerDatas.Instance.baseData.Setting = setting;
        }
        if (onQuickSettingUpdate != null)
        {
            onQuickSettingUpdate();
        }
    }
    public T GetQuickSettingValue<T>(QuickSettingType type, int index) where T : struct
    {
        string destinationStr = GetQuickSetting(type, index);
        if (string.IsNullOrEmpty(destinationStr))
        {
            return default(T);
        }
        return (T)Convert.ChangeType(destinationStr, typeof(T));
    }
    public string GetQuickSetting(QuickSettingType type, int index)
    {
        var quickRange = quickSettingDic[type];
        var start = quickRange.index + index * quickRange.single;
        var destinationStr = setting.Substring(start, quickRange.single);
        destinationStr = Regex.Replace(destinationStr, @"\*", string.Empty);
        return destinationStr;
    }
    public bool GetQuickSettingBool(QuickSettingType type, int index, bool _default = false)
    {
        string destinationStr = GetQuickSetting(type, index);
        if (string.IsNullOrEmpty(destinationStr))
        {
            return _default;
        }
        int _value = _default ? 1 : 0;
        int.TryParse(destinationStr, out _value);
        return _value == 1;
    }
    public string GetQuickSetting(int type, int index)
    {
        return GetQuickSetting((QuickSettingType)type, index);
    }
    public void SendPackage()
    {
        if (cacheSetting != setting)
        {
            cacheSetting = setting;
            C0303_tagCSetShutCutData vNetData = new C0303_tagCSetShutCutData();
            vNetData.Setting = setting;
            GameNetSystem.Instance.SendInfo(vNetData);
        }
    }
    private void BeforePlayerDataInitializeEvent()
    {
        setting = null;
        setting = new string(UCharacter, 100);
        PlayerDatas.Instance.baseData.Setting = setting;
    }
}
public enum QuickSettingType
{
    AutoFight_Cost, //自动战斗 几倍消耗
    AutoFight_Speed,    //几倍速度
    AutoFight_FightPower,   //是否高战力停止
    AutoFight_Open,    //是否开启自动战斗
}
public class QuickSettingRange
{
    public QuickSettingType type;
    public int index;
    public int length;
    public int single;
    public QuickSettingRange(QuickSettingType type, int start, int length, int single = 0)
    {
        this.type = type;
        this.index = start;
        this.length = length;
        this.single = single == 0 ? length : single;
    }
}
Main/System/Setting/QuickSetting.cs.meta
File was renamed from Main/Component/UI/Common/FuncEnable.cs.meta
@@ -1,8 +1,7 @@
fileFormatVersion: 2
guid: e034d1a3f772bb44bbbcd4273f5084e1
timeCreated: 1516430103
licenseType: Free
guid: 591bd551698e54c42bb51c4b2af7ae0e
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
Main/System/Task/TaskManager.cs
@@ -69,9 +69,15 @@
    // 任务状态 1-进行中 2-可领取
    public int GetMainTaskState()
    {
    {
        return mainTask.State;
    }
    //还需完成多少个任务
    public int GetNeedFinishTaskCount(int taskID)
    {
        var taskConfig = TaskConfig.Get(taskID);
        return taskConfig.Index - TaskConfig.Get(mainTask.TaskID).Index + 1;
    }
}
Main/Utility/UIHelper.cs
@@ -372,7 +372,7 @@
    public static readonly Color s_NavyYellow = new Color32(242, 238, 2, 255); //f2ee02
    public static readonly Color s_LightGreen = new Color32(42, 227, 55, 255);//2ae337
    public static readonly Color s_LightWhite = new Color32(245, 246, 230, 255); //f5f6e6
    public static readonly Color s_Gray = new Color32(132, 121, 123, 255);  //84797b
    public static readonly Color s_Gray = new Color32(104, 104, 104,255);  //bbbbbb
    public static readonly Color s_Gold = new Color32(255, 239, 71, 255);//ffef47
    public static readonly Color s_EarthYellow = new Color32(248, 152, 59, 255);//f8983b
@@ -715,7 +715,7 @@
            case TextColType.LightGreen:
                return StringUtility.Contact("<color=#8ddc11>", msg, "</color>");
            case TextColType.Gray:
                return StringUtility.Contact("<color=#84797b>", msg, "</color>");
                return StringUtility.Contact("<color=#bbbbbb>", msg, "</color>");
            case TextColType.lightYellow:
                return StringUtility.Contact("<color=#fcedb9>", msg, "</color>");
            case TextColType.NavyYellow: