NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/UI/Mail/MailSystem.cs

168 lines
4.2 KiB
C#

using Framework;
using Gameplay;
using Gameplay.Common;
using Gameplay.Net;
using NLDPB;
using PhxhSDK;
using System.Collections.Generic;
public class MailSystem : Singlenton<MailSystem>, IInitable
{
/// <summary>
/// 邮件数据字典
/// </summary>
public Dictionary<ulong, MailInfo> DicMail;
public bool isHaveAll;
public void Init()
{
DicMail = new Dictionary<ulong, MailInfo>();
isHaveAll = false;
EventManager.Instance.Register(EventManager.EventName.HaveNewMail, OnHaveNewMail);
}
public void Release()
{
EventManager.Instance.Unregister(EventManager.EventName.HaveNewMail, OnHaveNewMail);
isHaveAll = false;
DicMail.Clear();
}
private void OnHaveNewMail()
{
NetHelper.RequestMailList(!Instance.isHaveAll);
}
public void RemoveMail(ulong id)
{
if (!DicMail.Remove(id))
DebugUtil.LogError($"移除id为{id}的邮件失败");
}
/// <summary>
/// 添加邮件
/// </summary>
/// <param name="mail"></param>
public void AddMail(Mail mail)
{
if (DicMail.TryGetValue(mail.Id, out MailInfo mailInfo))
mailInfo.Refresh(mail);
else
{
if (DicMail.Count >= GLConfig.Inst.data.MaxMailCount)
{
MailInfo delectMail = null; // 待删除的邮件信息
foreach (MailInfo temp in DicMail.Values)
{
if (delectMail == temp)
delectMail = temp;
if (temp.EStatus < delectMail.EStatus)
continue;
if (temp.EStatus > delectMail.EStatus)
{
delectMail = temp;
continue;
}
if (delectMail.SendTime < temp.SendTime)
continue;
if (delectMail.SendTime > temp.SendTime)
{
delectMail = temp;
continue;
}
if (temp.Cfg.Id < delectMail.Cfg.Id)
continue;
if (temp.Cfg.Id > delectMail.Cfg.Id)
{
delectMail = temp;
continue;
}
}
if (delectMail != null)
RemoveMail(delectMail.Id);
}
DicMail[mail.Id] = new(mail);
Instance.isHaveAll = true;
}
}
/// <summary>
/// 设置邮件逻辑状态
/// </summary>
/// <param name="id"></param>
/// <param name="status"></param>
public void SetStatus(ulong id, MailStatus status)
{
if (DicMail.TryGetValue(id, out MailInfo singleMail))
singleMail.SetStatus(status);
}
public void HandleIds(ulong id)
{
if (id == 0) // 全部已领取
{
foreach (MailInfo singleMail in DicMail.Values)
{
singleMail.SetStatus(MailStatus.Cliamed);
}
}
else
SetStatus(id, MailStatus.Cliamed);
}
public MailInfo GetMail(uint mailID)
{
if (DicMail.TryGetValue(mailID, out MailInfo mail))
return mail;
else
{
DebugUtil.LogError($"你莫得Id为{mailID}的邮件,不要找了");
return null;
}
}
/// <summary>
/// 是否有可以领取的邮件
/// </summary>
/// <returns></returns>
public bool IsHaveGetMail()
{
foreach (MailInfo mailInfo in DicMail.Values)
{
if(mailInfo.IsHaveClaim)
return true;
}
return false;
}
/// <summary>
/// 清理所有到期邮件
/// </summary>
public void ClearOverTime()
{
List<ulong> listDelId = new();
foreach (MailInfo mailInfo in DicMail.Values)
{
if (mailInfo.OverTime <= CommonUtils.GetCurTime(CommonUtils.E_TimeType.Server))
listDelId.Add(mailInfo.Id);
}
foreach (ulong id in listDelId)
{
Instance.RemoveMail(id);
NetHelper.DeleteMail(id);
}
}
}