using System; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace Snxxz.UI { [XLua.LuaCallCSharp] public class TitleModel : Model, IBeforePlayerDataInitialize,IPlayerLoginOk { const string TITLEKEY = "Title"; public bool reikiPointRemindSymble { get; private set; } ReikiRootModel reikiRootModel { get { return ModelCenter.Instance.GetModel(); } } public override void Init() { GlobalTimeEvent.Instance.secondEvent += SecondEvent; StageLoad.Instance.onStageLoadFinish += OnStageLoadFinish; WindowCenter.Instance.windowAfterOpenEvent += WindowAfterOpenEvent; } public override void UnInit() { GlobalTimeEvent.Instance.secondEvent -= SecondEvent; StageLoad.Instance.onStageLoadFinish -= OnStageLoadFinish; WindowCenter.Instance.windowAfterOpenEvent -= WindowAfterOpenEvent; } private void OnStageLoadFinish() { reikiPointRemindSymble = false; } public void OnBeforePlayerDataInitialize() { serverInited = false; roletitles.Clear(); } private void SecondEvent() { foreach (var _id in roletitles.Keys) { if (!IsTitleGain(_id) && !roletitles[_id].outTimeNotify) { roletitles[_id].outTimeNotify = true; if (roletitles[_id].isEquiped) { var hero = PlayerDatas.Instance.hero; if (hero != null) { hero.RequestName(); } } if (OnRefreshGainTitle != null) { OnRefreshGainTitle(); } UpdateRedpoint(); } } } public event Action OnRefreshGainTitle; private Dictionary roletitles = new Dictionary(); public void OnRoleTitleRefresh(H0335_tagPlayerDienstgradPack vNetData) { if (vNetData.Count < 1) { return; } for (int i = 0; i < vNetData.Items.Length; i++) { int id = (int)vNetData.Items[i].GradID; byte state = vNetData.Items[i].State; string gaintime = vNetData.Items[i].CreateTime; SetTitleData(id, state, gaintime); } if (OnRefreshGainTitle != null) { OnRefreshGainTitle(); } UpdateRedpoint(); } public void OnRoleTitleRefresh(H0439_tagPlayerChangeDienstgrad vNetData) { RefreshTitleEquip((int)vNetData.GradID); if (OnRefreshGainTitle != null) { OnRefreshGainTitle(); } } private void RefreshTitleEquip(int id) { foreach (TitleData title in roletitles.Values) { if (title.id == id) { title.isEquiped = true; } else { title.isEquiped = false; } } } public TitleData GetTitleEquip() { foreach (TitleData title in roletitles.Values) { if (title.isEquiped) { return title; } } return null; } public void OnRoleTitleRefresh(H0336_tagPlayerGetDienstgrad vNetData) { int id = (int)vNetData.GradID; string gaintime = vNetData.CreateTime; byte state = 0; SetTitleData(id, state, gaintime); if (serverInited) { SetGet(id, true); if (reikiRootModel.titleAddPoint.titleId == id) { TryOpenReikiRootPointRemind(); } } if (OnRefreshGainTitle != null) { OnRefreshGainTitle(); } UpdateRedpoint(); } public void OnRoleTitleRefresh(H0337_tagPlayerDelDienstgrad vNetData) { int id = (int)vNetData.GradID; if (roletitles.ContainsKey(id)) { TitleData title = roletitles[id]; roletitles.Remove(id); title = null; } if (OnRefreshGainTitle != null) { OnRefreshGainTitle(); } UpdateRedpoint(); } void SetTitleData(int id, byte state, string gaintime) { TitleData title = null; roletitles.TryGetValue(id, out title); if (title == null) { title = new TitleData(); roletitles.Add(id, title); } title.id = id; title.isEquiped = IsTitleEquip(state); var dateTimeString = UIHelper.GetTime(gaintime); try { title.gainTime = Convert.ToDateTime(dateTimeString); } catch (Exception e) { DebugEx.LogError(e.Message); } //title.expireTime = expireTime; title.outTimeNotify = false; } private bool IsTitleEquip(byte state) { if (state < 1) { return false; } int k = 1 << 0; if ((state & k) == k) { return true; } return false; } public Dictionary GetAllGainTitle() { return roletitles; } public bool IsTitleGain(int id) { TitleData title = null; if (roletitles.TryGetValue(id, out title)) { var config = DienstgradConfig.Get(id); var expireTime = config.Prescription; if (expireTime == 0) { return true; } return GetTitleSurplusSeconds(id) > 0; } return false; } public TitleData GetGainTitle(int id) { TitleData title = null; roletitles.TryGetValue(id, out title); return title; } public int presentSelectTitle { get; set; } public List roleTitleList = new List(); private bool serverInited { get; set; } public bool IsNewGet(int _id) { if (!IsTitleGain(_id)) { return false; } return LocalSave.GetBool(StringUtility.Contact(TITLEKEY, PlayerDatas.Instance.baseData.PlayerID, _id), false); } public void SetTitlesGet() { foreach (var _id in roletitles.Keys) { SetGet(_id); } UpdateRedpoint(); } public void SetGet(int _id,bool _get = false) { LocalSave.SetBool(StringUtility.Contact(TITLEKEY, PlayerDatas.Instance.baseData.PlayerID, _id), _get); } public int GetTitleSurplusSeconds(int _id) { TitleData title = null; if (roletitles.TryGetValue(_id, out title)) { var config = DienstgradConfig.Get(_id); var expireTime = config.Prescription; if (expireTime == 0) { return 0; } DateTime t = title.gainTime.AddTicks(expireTime * TimeSpan.TicksPerSecond); DateTime n = TimeUtility.ServerNow; TimeSpan span = t - n; return Mathf.Max(0, (int)span.TotalSeconds); } return 0; } public void OnPlayerLoginOk() { serverInited = true; UpdateRedpoint(); } private void WindowAfterOpenEvent(Window window) { if (reikiPointRemindSymble && window is RoleTitle) { TryOpenReikiRootPointRemind(); } } void TryOpenReikiRootPointRemind() { if (WindowCenter.Instance.IsOpen()) { reikiPointRemindSymble = false; var reikiPoint = 0; if (PlayerDatas.Instance.baseData.LV >= reikiRootModel.reikiPointAutoAddLevel) { var level = PlayerDatas.Instance.baseData.LV - reikiRootModel.reikiPointAutoAddLevel + 1; reikiPoint = level * reikiRootModel.titleAddPoint.point; } var titleConfig = DienstgradConfig.Get(reikiRootModel.titleAddPoint.titleId); ConfirmCancel.ShowRealmPopConfirm(Language.Get("Mail101"), Language.Get("ReikiRootAddPointRemind_2", titleConfig.Name, reikiPoint), Language.Get("GotoAddPoint"), () => { WindowJumpMgr.Instance.WindowJumpTo(JumpUIType.RolePoint); }); } else { reikiPointRemindSymble = true; } } #region 红点 private Redpoint m_TitleRedpoint=new Redpoint(10101, 1010104); public Redpoint titleRedpoint { get { return m_TitleRedpoint; } } public void UpdateRedpoint() { titleRedpoint.state = RedPointState.None; if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Title)) { return; } foreach (var _key in roletitles.Keys) { if (IsNewGet(_key)) { titleRedpoint.state = RedPointState.Simple; break; } } } #endregion } public class TitleData { public int id; public bool isEquiped; public DateTime gainTime; //public uint expireTime; public bool outTimeNotify = false; } }