192 lines
4.7 KiB
C#
192 lines
4.7 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;
|
||
/// <summary>
|
||
/// 是否有全部邮件
|
||
/// </summary>
|
||
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();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 收到MailInfo的Message,表示有新邮件需要更新
|
||
/// </summary>
|
||
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 (null == delectMail)
|
||
{
|
||
delectMail = temp;
|
||
continue;
|
||
}
|
||
|
||
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(List<ulong> listId)
|
||
{
|
||
foreach (ulong id in listId)
|
||
{
|
||
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;
|
||
}
|
||
|
||
public bool IsHaveUnreadMail()
|
||
{
|
||
foreach (MailInfo mailInfo in DicMail.Values)
|
||
{
|
||
var status = mailInfo.EStatus;
|
||
if (status == MailStatus.New)
|
||
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);
|
||
}
|
||
}
|
||
|
||
public void ClearMailData()
|
||
{
|
||
if (null == DicMail)
|
||
return;
|
||
|
||
DicMail.Clear();
|
||
isHaveAll = false;
|
||
}
|
||
} |