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

151 lines
3.7 KiB
C#

using Framework;
using Gameplay;
using Gameplay.Common;
using Gameplay.Net;
using PhxhSDK;
using System.Collections.Generic;
public class MailSystem : Singlenton<MailSystem>, IInitable
{
public Dictionary<ulong, SingleMail> DicMail;
public bool isHaveAll;
public const int MailStatus_New = 0;
public const int MailStatus_Opened = 1;
public const int MailStatus_Cliamed = 2;
public void Init()
{
DicMail = new Dictionary<ulong, SingleMail>();
isHaveAll = false;
RegisterEvent();
}
private void RegisterEvent()
{
EventManager.Instance.Register(EventManager.EventName.HaveNewMail, OnHaveNewMail);
}
private void OnHaveNewMail()
{
NetHelper.RequestMailList(!Instance.isHaveAll);
}
private void UnregisterEvent()
{
EventManager.Instance.Unregister(EventManager.EventName.HaveNewMail, OnHaveNewMail);
}
public void Release()
{
UnregisterEvent();
isHaveAll = false;
DicMail.Clear();
}
public void RemoveMail(ulong id)
{
if (!DicMail.Remove(id))
DebugUtil.LogError($"移除id为{id}的邮件失败");
}
public void AddMail(Mail mail)
{
if (DicMail.TryGetValue(mail.Id, out SingleMail singleMail))
singleMail.Refresh(mail);
else
{
if (DicMail.Count >= GLConfig.Inst.data.MaxMailCount)
{
SingleMail mailDelect = null;
foreach (SingleMail temp in DicMail.Values)
{
if (mailDelect == temp)
mailDelect = temp;
if (temp.Status < mailDelect.Status)
continue;
if (temp.Status > mailDelect.Status)
{
mailDelect = temp;
continue;
}
if (mailDelect.SendTime < temp.SendTime)
continue;
if (mailDelect.SendTime > temp.SendTime)
{
mailDelect = temp;
continue;
}
if (temp.MailID < mailDelect.MailID)
continue;
if (temp.MailID > mailDelect.MailID)
{
mailDelect = temp;
continue;
}
}
if (mailDelect != null)
RemoveMail(mailDelect.Id);
}
DicMail[mail.Id] = new(mail);
Instance.isHaveAll = true;
}
}
public void SetStatus(ulong id, uint status)
{
DicMail[id].SetStatus(status);
}
public void HandleIds(ulong id)
{
if (id == 0) // 全部已领取
{
foreach (SingleMail singleMail in DicMail.Values)
{
if (singleMail.Status != MailStatus_Opened)
continue;
if (singleMail.MailData == null)
continue;
singleMail.SetStatus(MailStatus_Cliamed);
}
}
else
DicMail[id].SetStatus(MailStatus_Cliamed);
}
public SingleMail GetMail(uint mailID)
{
if (DicMail.TryGetValue(mailID, out SingleMail mail))
return mail;
else
{
DebugUtil.LogError($"你莫得Id为{mailID}的邮件,不要找了");
return null;
}
}
public bool IsHaveGetMail()
{
foreach (SingleMail singleMail in DicMail.Values)
{
if (singleMail.Status != MailStatus_Cliamed)
return true;
}
return false;
}
}