using System; using System.Collections.Generic; using System.Linq; /// /// boss历练 和 跨服信息合并 /// namespace vnxbqy.UI { public class BossTrialModel : Model, IBeforePlayerDataInitialize, IPlayerLoginOk, IOpenServerActivity { public OperationBossTrial operationBossTrial = null; public OperationCrossBossTrial operationBossTrialCross = null; public static Operation operaType = Operation.default27; public static Operation operaTypeCross = Operation.default33; public static int rankType = 33; //本服个人排行 //public static int historyRankType = 35; public static int crossRankType = 158; //跨服个人排行 public static int crossFamilyRankType = 160; //跨服仙盟排行 public static List rankList = new List() { rankType, crossRankType, crossFamilyRankType }; int regesitType = (int)NewDayActivityID.BossTrial; int regesitCrossType = (int)NewDayActivityID.CrossBossTrial; public bool IsOpen { get { //return OperationTimeHepler.Instance.SatisfyOpenCondition(operaType); return OperationTimeHepler.Instance.SatisfyOpenCondition(operaType) && OperationTimeHepler.Instance.SatisfyOpenCondition(operaTypeCross, ILTimeUtility.ServerCrossNow); } } //是否参与活动时间,由跨服封包决定,以跨服时间为准 public bool IsJoin { get { return OperationTimeHepler.Instance.SatisfyJoinCondition(operaTypeCross, ILTimeUtility.ServerCrossNow); } } public bool IsPrepareTime { get { if (!IsOpen) return false; return OperationTimeHepler.Instance.IsPrepareTime(operaTypeCross, ILTimeUtility.ServerCrossNow); } } //是否展示结果时间, 以跨服时间为准(前提为以判断是活动中) public bool IsResultShowTime { get { if (operationBossTrialCross == null) return false; return operationBossTrialCross.IsShowResultTime(); } } public bool IsAdvance { get { return false; } } public bool priorityOpen { get { return false; } } public event Action OnPlayerInfo; public event Action onStateUpdate; public byte actNum; //对应界面 public int submitAllCount; //总提交凭证个数 用于排行榜 活动可以是一段时间内的总提交个数 public int submitCount; // 已提交凭证个数 活动可以配置每日重置 public int submitCountAward; // 提交凭证奖励领奖状态 public int subItemID; // 提交凭证物品ID public int goodItemID = 621; //天玄丹 增强掉落 //查询第一名信息,界面快速切换查询回包和界面不一致 需多个ID记录 public int no1PlayerID = 0; public int no1PlayerIDCross = 0; public int no1PlayerIDCrossFamily = 0; //盟主 //排行榜名次信息 private int m_SelectRank = 0; public int SelectRank { get { return m_SelectRank; } set { m_SelectRank = value; } } //排行榜奖励信息 private int m_SelectAwardRank = 0; public int SelectAwardRank { get { return m_SelectAwardRank; } set { m_SelectAwardRank = value; } } PackModel packModel { get { return ModelCenter.Instance.GetModel(); } } public override void Init() { OperationTimeHepler.Instance.operationStartEvent += OperationStartEvent; OperationTimeHepler.Instance.operationEndEvent += OperationEndEvent; OpenServerActivityCenter.Instance.Register(regesitType, this, (int)OpenServerActivityCenter.ActivityType.AT_Activity2); OpenServerActivityCenter.Instance.Register(regesitCrossType, this, (int)OpenServerActivityCenter.ActivityType.AT_Activity2); OperationTimeHepler.Instance.operationTimeUpdateEvent += operationTimeUpdateEvent; packModel.refreshItemCountEvent += RefreshItemCountEvent; RedpointCenter.Instance.redpointValueChangeEvent += OnRedpointChange; subItemID = int.Parse(FuncConfigConfig.Get("BossTrial").Numerical1); } public void OnBeforePlayerDataInitialize() { operationBossTrial = null; operationBossTrialCross = null; no1PlayerID = 0; no1PlayerIDCross = 0; no1PlayerIDCrossFamily = 0; submitAllCount = 0; submitCount = 0; submitCountAward = 0; } public void OnPlayerLoginOk() { UpdateRedpoint(); } public override void UnInit() { OperationTimeHepler.Instance.operationStartEvent -= OperationStartEvent; OperationTimeHepler.Instance.operationEndEvent -= OperationEndEvent; RedpointCenter.Instance.redpointValueChangeEvent -= OnRedpointChange; OperationTimeHepler.Instance.operationTimeUpdateEvent -= operationTimeUpdateEvent; packModel.refreshItemCountEvent -= RefreshItemCountEvent; } private void OperationEndEvent(Operation operationType, int state) { if (operationType == operaType && state == 0) { if (onStateUpdate != null) { onStateUpdate(regesitType); } WindowCenter.Instance.Close(); } } private void OperationStartEvent(Operation operationType, int state) { if (operationType == operaType && state == 0) { if (onStateUpdate != null) { onStateUpdate(regesitType); } } } private void operationTimeUpdateEvent(Operation obj) { if (obj != operaType && obj != operaTypeCross) return; OperationBase operationBase1; if (OperationTimeHepler.Instance.TryGetOperationTime(operaTypeCross, out operationBase1)) { operationBossTrialCross = operationBase1 as OperationCrossBossTrial; } OperationBase operationBase; if (OperationTimeHepler.Instance.TryGetOperationTime(operaType, out operationBase)) { operationBossTrial = operationBase as OperationBossTrial; } if (operationBossTrialCross != null && operationBossTrial != null) UpdateRedpoint(); WindowCenter.Instance.Close(); } void OnRedpointChange(int id) { if (id == MainRedDot.RankActRepoint) { parentRedpoint.state = RedpointCenter.Instance.GetRedpointState(MainRedDot.RankActRepoint); } } #region 服务端数据 public void UpdateHActBossTrialPlayerInfo(HAA68_tagMCActBossTrialPlayerInfo netPack) { actNum = netPack.ActNum; submitAllCount = (int)netPack.SubmitCount; submitCount = (int)netPack.SubmitAwardCount; submitCountAward = (int)netPack.SubmitAwardState; UpdateRedpoint(); OnPlayerInfo?.Invoke(); } private void RefreshItemCountEvent(PackType packType, int index, int itemId) { if (itemId != subItemID) return; if (!IsOpen) return; UpdateRedpoint(); } #endregion #region 红点 Redpoint parentRedpoint = new Redpoint(MainRedDot.BossTrialRepoint); public Redpoint redpoint = new Redpoint(MainRedDot.BossTrialRepoint, MainRedDot.BossTrialRepoint * 10); public void UpdateRedpoint() { redpoint.state = RedPointState.None; if (!IsOpen) { return; } int hasCnt = packModel.GetItemCountByID(PackType.Item, subItemID); var keys = operationBossTrial.bossTrialSubmitInfo.Keys.ToList(); keys.Sort(); if (IsJoin) { //参与时间才需要提交红点 foreach (var tagetCnt in keys) { if (submitCount + hasCnt >= tagetCnt && submitCount < tagetCnt) { redpoint.state = RedPointState.Simple; return; } } } foreach (var tagetCnt in keys) { if (submitCount < tagetCnt) { break; } if (GetSubmitAwardState(tagetCnt) == 1) { redpoint.state = RedPointState.Simple; return; } } } //0 未达标 1 已达标未领取 2 已领取 public int GetSubmitAwardState(int tagetCnt) { if (submitCount < tagetCnt) { return 0; } if(((int)Math.Pow(2, operationBossTrial.bossTrialSubmitInfo[tagetCnt].index) & submitCountAward) == 0) { return 1; } return 2; } #endregion //获取排行榜排名对应的奖励数据配置名次 public int GetRankDataIndex(int rank, Dictionary rankInfo) { rank += 1; var keys = rankInfo.Keys.ToList(); keys.Sort(); for (int i = 0; i < keys.Count; i++) { if (rank <= keys[i]) { return keys[i]; } } return -1; } public int GetPlayerId(RankData rankData) { // 检查输入数据是否为空 if (rankData == null) return 0; // 根据 SelectRank 的值选择对应的 ID switch (SelectRank) { case 0: case 1: return (int)rankData.id; case 2: return (int)rankData.id2; default: return 0; } } } }