少年修仙传客户端代码仓库
client_linchunjie
2018-08-23 522ca3468a56c88cb15eaa428eb7499d3dba386f
UI/Common/FuncOpen.cs
@@ -1,208 +1,214 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TableConfig;
namespace Snxxz.UI
{
    public class FuncOpen
    {
        private static FuncOpen _inst = null;
        public static FuncOpen Instance
        {
            get
            {
                if (_inst == null)
                {
                    _inst = new FuncOpen();
                }
                return _inst;
            }
        }
#if UNITY_EDITOR
        public static bool development = true;
        public static Action FuncOpenModeChangeEvent;
#endif
        protected FuncOpen()
        {
#if UNITY_EDITOR
            if (!Application.isPlaying) return;
#endif
            var allKeys = ConfigManager.Instance.GetAllKeys<FuncOpenLVConfig>();
            funcArray = new int[allKeys.Count];
            int _index = 0;
            foreach (var key in allKeys)
            {
                int func = int.Parse(key);
                funcOpenState[func] = false;
                funcArray[_index] = func;
                _index++;
            }
            DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += BeforePlayerDataInitializeEvent;
            DTC0102_tagCDBPlayer.switchAccountEvent += SwitchAccountEvent;
        }
        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]);
                }
            }
        }
        PlayerTaskDatas m_TaskModel;
        PlayerTaskDatas taskmodel
        { get { return m_TaskModel ?? (m_TaskModel = ModelCenter.Instance.GetModel<PlayerTaskDatas>()); } }
        private static Dictionary<int, bool> funcOpenState = new Dictionary<int, bool>();
        private int[] funcArray;
        public event Action<int> OnFuncStateChangeEvent;
        public void UpdateFuncState(HA302_tagMCFuncOpenStateList vNetData)
        {
            for (int i = 0; i < vNetData.FuncCount; i++)
            {
                var funcState = vNetData.FuncStateList[i];
                bool opned = funcOpenState[funcState.FuncID];
                funcOpenState[funcState.FuncID] = funcState.State == 1;
                if (OnFuncStateChangeEvent != null)
                {
                    OnFuncStateChangeEvent(funcState.FuncID);
                }
            }
        }
        private bool IsFuncOpen(int key, out int errorCode)
        {
            errorCode = 0;
            var config = ConfigManager.Instance.GetTemplate<FuncOpenLVConfig>(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.stage < _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;
        }
        public bool IsFuncOpen(int key)
        {
            if (funcOpenState.ContainsKey(key))
            {
                return funcOpenState[key];
            }
            return false;
        }
        public void ProcessorFuncErrorTip(int key)
        {
            var config = ConfigManager.Instance.GetTemplate<FuncOpenLVConfig>(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;
                        case 2:
                            var treasureConfig = ConfigManager.Instance.GetTemplate<TreasureConfig>(config.LimitMagicWeapon / 100);
                            SysNotifyMgr.Instance.ShowTip(config.Tip, Language.Get("OpenFunc1", treasureConfig != null ? treasureConfig.Name : string.Empty));
                            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 = ConfigManager.Instance.GetTemplate<FuncOpenLVConfig>(key);
            return tagFuncOpenLVModel.LimitLV;
        }
        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();
    }
}
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TableConfig;
namespace Snxxz.UI
{
    public class FuncOpen
    {
        private static FuncOpen _inst = null;
        public static FuncOpen Instance
        {
            get
            {
                if (_inst == null)
                {
                    _inst = new FuncOpen();
                }
                return _inst;
            }
        }
#if UNITY_EDITOR
        public static bool development = true;
        public static Action FuncOpenModeChangeEvent;
#endif
        protected FuncOpen()
        {
#if UNITY_EDITOR
            if (!Application.isPlaying) return;
#endif
            var allKeys = Config.Instance.GetAllKeys<FuncOpenLVConfig>();
            funcArray = new int[allKeys.Count];
            int _index = 0;
            foreach (var key in allKeys)
            {
                int func = int.Parse(key);
                funcOpenState[func] = false;
                funcArray[_index] = func;
                _index++;
            }
            DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += BeforePlayerDataInitializeEvent;
            DTC0102_tagCDBPlayer.switchAccountEvent += SwitchAccountEvent;
        }
        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]);
                }
            }
        }
        PlayerTaskDatas m_TaskModel;
        PlayerTaskDatas taskmodel
        { get { return m_TaskModel ?? (m_TaskModel = ModelCenter.Instance.GetModel<PlayerTaskDatas>()); } }
        private static Dictionary<int, bool> funcOpenState = new Dictionary<int, bool>();
        private int[] funcArray;
        public event Action<int> OnFuncStateChangeEvent;
        public void UpdateFuncState(HA302_tagMCFuncOpenStateList vNetData)
        {
            for (int i = 0; i < vNetData.FuncCount; i++)
            {
                var funcState = vNetData.FuncStateList[i];
                if (!funcOpenState.ContainsKey(funcState.FuncID))
                {
                    funcOpenState.Add(funcState.FuncID, funcState.State == 1);
                }
                else
                {
                    funcOpenState[funcState.FuncID] = funcState.State == 1;
                }
                if (OnFuncStateChangeEvent != null)
                {
                    OnFuncStateChangeEvent(funcState.FuncID);
                }
            }
        }
        private bool IsFuncOpen(int key, out int errorCode)
        {
            errorCode = 0;
            var config = Config.Instance.Get<FuncOpenLVConfig>(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.stage < _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;
        }
        public bool IsFuncOpen(int key)
        {
            if (funcOpenState.ContainsKey(key))
            {
                return funcOpenState[key];
            }
            return false;
        }
        public void ProcessorFuncErrorTip(int key)
        {
            var config = Config.Instance.Get<FuncOpenLVConfig>(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;
                        case 2:
                            var treasureConfig = Config.Instance.Get<TreasureConfig>(config.LimitMagicWeapon / 100);
                            SysNotifyMgr.Instance.ShowTip(config.Tip, Language.Get("OpenFunc1", treasureConfig != null ? treasureConfig.Name : string.Empty));
                            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 = Config.Instance.Get<FuncOpenLVConfig>(key);
            return tagFuncOpenLVModel.LimitLV;
        }
        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();
    }
}