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;
|
}
|
}
|