using System;  
 | 
using System.Collections.Generic;  
 | 
using UnityEngine;  
 | 
using UnityEngine.UI;  
 | 
  
 | 
  
 | 
      
 | 
    public class KnapsackTimeCDMgr : SingletonMonobehaviour<KnapsackTimeCDMgr>  
 | 
  
 | 
    {  
 | 
        private List<ItemCDCool> itemCDList = new List<ItemCDCool>();  
 | 
        private List<NormalCDCool> normalCDList = new List<NormalCDCool>();  
 | 
        public event Action<string> RefresCoolTimeAct;  
 | 
        public event Action<string> RefreshItemOverdueTimeAct;  
 | 
        public event Action<string> RefreshItemOverdueAct;  
 | 
        public event Action<int, int> RefreshNormalCDAct;  
 | 
        int secondBuf = -1;  
 | 
        int minuteBuf = -1;  
 | 
        private void LateUpdate()  
 | 
        {  
 | 
            CheckItemCoolTime(TimeRefreshType.Frame);  
 | 
            var minute = DateTime.Now.Minute;  
 | 
            var second = DateTime.Now.Second;  
 | 
            if (second != secondBuf)  
 | 
            {  
 | 
                CheckNormalCoolTime(TimeRefreshType.Second);  
 | 
                secondBuf = second;  
 | 
            }  
 | 
            if (minute != minuteBuf)  
 | 
            {  
 | 
                CheckItemCoolTime(TimeRefreshType.Minute);  
 | 
                minuteBuf = minute;  
 | 
            }  
 | 
  
 | 
        }  
 | 
  
 | 
        private void CheckItemCoolTime(TimeRefreshType type)  
 | 
        {  
 | 
            for (int i = itemCDList.Count - 1; i > -1; i--)  
 | 
            {  
 | 
                double remianCD = itemCDList[i].GetRemainTime();  
 | 
                switch (type)  
 | 
                {  
 | 
                    case TimeRefreshType.Frame:  
 | 
                        if (RefresCoolTimeAct != null)  
 | 
                        {  
 | 
                            RefresCoolTimeAct(itemCDList[i].guid);  
 | 
                        }  
 | 
                        break;  
 | 
                    case TimeRefreshType.Minute:  
 | 
                        if (RefreshItemOverdueTimeAct != null)  
 | 
                        {  
 | 
                            RefreshItemOverdueTimeAct(itemCDList[i].guid);  
 | 
                        }  
 | 
                        break;  
 | 
                }  
 | 
  
 | 
                if (remianCD <= 0)  
 | 
                {  
 | 
                    string guid = itemCDList[i].guid;  
 | 
                    itemCDList.RemoveAt(i);  
 | 
                    if (RefreshItemOverdueAct != null)  
 | 
                    {  
 | 
                        RefreshItemOverdueAct(guid);  
 | 
                    }  
 | 
                }  
 | 
            }  
 | 
  
 | 
        }  
 | 
  
 | 
        private void CheckNormalCoolTime(TimeRefreshType type)  
 | 
        {  
 | 
            for (int i = 0; i < normalCDList.Count; i++)  
 | 
            {  
 | 
                double remianCD = normalCDList[i].GetRemainTime();  
 | 
                switch (type)  
 | 
                {  
 | 
                    case TimeRefreshType.Frame:  
 | 
                        break;  
 | 
                    case TimeRefreshType.Second:  
 | 
                        if (RefreshNormalCDAct != null)  
 | 
                        {  
 | 
                            RefreshNormalCDAct(normalCDList[i].code, (int)remianCD);  
 | 
                        }  
 | 
                        break;  
 | 
                    case TimeRefreshType.Minute:  
 | 
                        break;  
 | 
                }  
 | 
  
 | 
                if (remianCD <= 0)  
 | 
                {  
 | 
                    UnRegister(normalCDList[i].code);  
 | 
                }  
 | 
            }  
 | 
  
 | 
        }  
 | 
  
 | 
        public void Register(string guid, int itemId,  double cdTime)  
 | 
        {  
 | 
            int index;  
 | 
            if (ContainsItemCD(guid, out index))  
 | 
            {  
 | 
                itemCDList[index].SetTime(cdTime);  
 | 
            }  
 | 
            else  
 | 
            {  
 | 
                ItemCDCool cool = new ItemCDCool(guid, itemId, cdTime);  
 | 
                itemCDList.Add(cool);  
 | 
            }  
 | 
        }  
 | 
  
 | 
        public void Register(int code, double cdTime)  
 | 
        {  
 | 
            int index;  
 | 
            if (ContainsNormalCD(code, out index))  
 | 
            {  
 | 
                normalCDList[index].SetTime(cdTime);  
 | 
            }  
 | 
            else  
 | 
            {  
 | 
                NormalCDCool cool = new NormalCDCool(code, cdTime);  
 | 
                normalCDList.Add(cool);  
 | 
            }  
 | 
        }  
 | 
  
 | 
        public void UnRegister(string guid)  
 | 
        {  
 | 
            int index;  
 | 
            if (ContainsItemCD(guid, out index))  
 | 
            {  
 | 
                itemCDList.RemoveAt(index);  
 | 
            }  
 | 
        }  
 | 
  
 | 
        public void UnRegister(int code)  
 | 
        {  
 | 
            int index;  
 | 
            if (ContainsNormalCD(code, out index))  
 | 
            {  
 | 
                normalCDList.RemoveAt(index);  
 | 
            }  
 | 
        }  
 | 
  
 | 
        public ItemCDCool GetItemCoolById(string guid)  
 | 
        {  
 | 
            int index;  
 | 
            if (ContainsItemCD(guid, out index))  
 | 
            {  
 | 
                return itemCDList[index];  
 | 
            }  
 | 
            return null;  
 | 
        }  
 | 
  
 | 
        public int GetNormalCDTime(int code)  
 | 
        {  
 | 
            int index;  
 | 
            if (ContainsNormalCD(code, out index))  
 | 
            {  
 | 
                return (int)normalCDList[index].GetRemainTime();  
 | 
            }  
 | 
            return 0;  
 | 
        }  
 | 
  
 | 
        List<ItemCDCool> typeCoollist = new List<ItemCDCool>();  
 | 
        public List<ItemCDCool> GetItemCoolByCDType(int type, out bool isCool)  
 | 
        {  
 | 
            typeCoollist.Clear();  
 | 
            isCool = false;  
 | 
            for (int i = 0; i < itemCDList.Count; i++)  
 | 
            {  
 | 
                ItemConfig itemConfig = ItemConfig.Get(itemCDList[i].itemId);  
 | 
                if (itemConfig != null  
 | 
                    && itemConfig.CDType == type  
 | 
                    && itemCDList[i].GetRemainTime() > 0)  
 | 
                {  
 | 
                    typeCoollist.Add(itemCDList[i]);  
 | 
                    isCool = true;  
 | 
                }  
 | 
            }  
 | 
            return typeCoollist;  
 | 
        }  
 | 
  
 | 
        private bool ContainsItemCD(string guid, out int index)  
 | 
        {  
 | 
            index = 0;  
 | 
            for (int i = 0; i < itemCDList.Count; i++)  
 | 
            {  
 | 
                if (itemCDList[i].guid == guid)  
 | 
                {  
 | 
                    index = i;  
 | 
                    return true;  
 | 
                }  
 | 
            }  
 | 
            return false;  
 | 
        }  
 | 
  
 | 
        private bool ContainsNormalCD(int code, out int index)  
 | 
        {  
 | 
            index = 0;  
 | 
            for (int i = 0; i < normalCDList.Count; i++)  
 | 
            {  
 | 
                if (normalCDList[i].code == code)  
 | 
                {  
 | 
                    index = i;  
 | 
                    return true;  
 | 
                }  
 | 
            }  
 | 
            return false;  
 | 
        }  
 | 
  
 | 
        public enum TimeRefreshType  
 | 
        {  
 | 
            Frame, //每帧  
 | 
            Second, //每秒  
 | 
            Minute //每分  
 | 
        }  
 | 
    }  
 | 
  
 | 
    public class ItemCDCool  
 | 
    {  
 | 
        public string guid;  
 | 
        public int itemId;  
 | 
        public double totalTime;  
 | 
        public DateTime startTime { get; private set; }  
 | 
  
 | 
        public ItemCDCool(string guid, int itemId, double totalTime)  
 | 
        {  
 | 
            this.guid = guid;  
 | 
            this.itemId = itemId;  
 | 
            this.totalTime = totalTime;  
 | 
            this.startTime = DateTime.Now;  
 | 
        }  
 | 
  
 | 
        public void SetTime(double totalTime)  
 | 
        {  
 | 
            this.totalTime = totalTime;  
 | 
            this.startTime = DateTime.Now;  
 | 
        }  
 | 
  
 | 
        public double GetRemainTime()  
 | 
        {  
 | 
            double remainTime = totalTime - (DateTime.Now - startTime).TotalSeconds;  
 | 
            if (remainTime <= 0)  
 | 
            {  
 | 
                remainTime = 0;  
 | 
            }  
 | 
            return remainTime;  
 | 
        }  
 | 
    }  
 | 
  
 | 
    public class NormalCDCool  
 | 
    {  
 | 
        public int code;  
 | 
        public double totalTime;  
 | 
        public DateTime startTime { get; private set; }  
 | 
        public NormalCDCool(int code, double totalTime)  
 | 
        {  
 | 
            this.code = code;  
 | 
            this.totalTime = totalTime;  
 | 
            this.startTime = DateTime.Now;  
 | 
        }  
 | 
  
 | 
        public void SetTime(double totalTime)  
 | 
        {  
 | 
            this.totalTime = totalTime;  
 | 
            this.startTime = DateTime.Now;  
 | 
        }  
 | 
  
 | 
        public double GetRemainTime()  
 | 
        {  
 | 
            double remainTime = totalTime - (DateTime.Now - startTime).TotalSeconds;  
 | 
            if (remainTime <= 0)  
 | 
            {  
 | 
                remainTime = 0;  
 | 
            }  
 | 
            return remainTime;  
 | 
        }  
 | 
    }  
 |