using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; namespace vnxbqy.UI { public class TitleModel : Model, IBeforePlayerDataInitialize,IPlayerLoginOk { const string TITLEKEY = "Title"; public int selectTitleId; //点击升星的称号ID 和 presentSelectTitle 不一样用处 public bool reikiPointRemindSymble { get; private set; } public Dictionary titleStarDict = new Dictionary(); //称号ID:星级 public event Action OnTitleStarUpdate; public Dictionary titleStarRedpoints = new Dictionary(); ReikiRootModel reikiRootModel { get { return ModelCenter.Instance.GetModel(); } } PackModel packModel { get { return ModelCenter.Instance.GetModel(); } } public override void Init() { //GlobalTimeEvent.Instance.secondEvent += SecondEvent; StageLoad.Instance.onStageLoadFinish += OnStageLoadFinish; WindowCenter.Instance.windowAfterOpenEvent += WindowAfterOpenEvent; foreach (var _id in TitleStarUpConfig.titleIDToIDs.Keys) { titleStarRedpoints.Add(_id, new Redpoint(1010104, 1010104*1000 + _id)); } } 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(); // } // } // } //} 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(); AutoUseTile(); } //第一个称号自动佩戴 void AutoUseTile() { if (roletitles.Count == 1) { var titles = roletitles.Keys.ToList(); C0337_tagCPlayerChangeDienstgrad equipTitlePack = new C0337_tagCPlayerChangeDienstgrad(); equipTitlePack.GradID = (uint)titles[0]; equipTitlePack.State = 1; GameNetSystem.Instance.SendInfo(equipTitlePack); } } 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(); } if (window is KnapSackWin) { UpdateRedpoint(); } } 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; } } public void UpdateTitleStarInfo(HA3CE_tagMCTitleStarInfo netPack) { for (int i = 0; i < netPack.TitleStarList.Length; i++) { titleStarDict[(int)netPack.TitleStarList[i].TitleID] = netPack.TitleStarList[i].Star; } OnTitleStarUpdate?.Invoke(); UpdateRedpoint(); } public int GetTitleStar(int titleId) { int star = 0; titleStarDict.TryGetValue(titleId, out star); return star; } public bool IsStarRedpoint(int titleID) { if (titleStarRedpoints.ContainsKey(titleID)) { return titleStarRedpoints[titleID].state == RedPointState.Simple; } return false; } #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 (TitleStarUpConfig.titleIDToIDs.ContainsKey(_key)) { var star = GetTitleStar(_key); var maxStar = TitleStarUpConfig.titleIDToIDs[_key].Count; titleStarRedpoints[_key].state = RedPointState.None; if (star < maxStar) { var id = TitleStarUpConfig.titleIDToIDs[_key][star]; var config = TitleStarUpConfig.Get(id); if (packModel.GetItemCountByID(PackType.Item, config.StarUpNeedItemList[0][0]) >= config.StarUpNeedItemList[0][1]) { titleStarRedpoints[_key].state = RedPointState.Simple; } } } } } #endregion } public class TitleData { public int id; public bool isEquiped; public DateTime gainTime; //public uint expireTime; public bool outTimeNotify = false; } }