using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using vnxbqy.UI; namespace vnxbqy.UI { public class PersonalBossModel : Model { public const int PERSONALBOSS_MAPID = 31240; public const int PERSONAL_REDPOINTID = 76003; public Redpoint personalRedpoint = new Redpoint(FindPreciousModel.FINDPRECIOUS_REDPOINTID, PERSONAL_REDPOINTID); Redpoint mainBossRedpoint = new Redpoint(FindPreciousModel.FINDPRECIOUS_REDPOINTIDEX); int m_SelectedBoss = 0; public int selectedBoss { get { return this.m_SelectedBoss; } set { if (this.m_SelectedBoss != value) { this.m_SelectedBoss = value; if (bossSelectedEvent != null) { bossSelectedEvent(value); } } } } public event Action bossSelectedEvent; List sortedBossIds = new List(); Dictionary personalBosses = new Dictionary(); int dungeonTicket = 0; FindPreciousModel findPreciousModel { get { return ModelCenter.Instance.GetModel(); } } PackModel playerPack { get { return ModelCenter.Instance.GetModel(); } } DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel(); } } public int WipeOutLV = 100; //XX级后可S级扫荡 public int maxBossTimes = 0; public override void Init() { ParseConfig(); //playerPack.refreshItemCountEvent += RefreshItemCount; PlayerDatas.Instance.playerDataRefreshEvent += OnPlayerDataChange; dungeonModel.dungeonRecordChangeEvent += OnDungeonRecordChange; } public override void UnInit() { //playerPack.refreshItemCountEvent -= RefreshItemCount; PlayerDatas.Instance.playerDataRefreshEvent -= OnPlayerDataChange; dungeonModel.dungeonRecordChangeEvent -= OnDungeonRecordChange; } public void RequestSetDungeonAction() { var sendInfo = new CA508_tagCMDoFBAction(); sendInfo.ActionType = 0; sendInfo.ActionInfo = (uint)selectedBoss; GameNetSystem.Instance.SendInfo(sendInfo); } public bool TryGetBossData(int _bossId, out PersonalBossData _data) { return personalBosses.TryGetValue(_bossId, out _data); } public List GetPersonalBosses() { var bosses = new List(); var lockedCount = 0; for (int i = 0; i < sortedBossIds.Count; i++) { var bossId = sortedBossIds[i]; if (findPreciousModel.IsBossUnlock(bossId)) { bosses.Add(bossId); } else { if (lockedCount < FindPreciousModel.ShowLockBossCnt) { bosses.Add(bossId); lockedCount++; } } } return bosses; } public int GetRecommendBoss() { for (int i = 0; i < sortedBossIds.Count; i++) { var bossId = sortedBossIds[i]; if (!findPreciousModel.IsBossUnlock(bossId)) { continue; } if (IsFreeTime(bossId)) { return bossId; } } for (int i = sortedBossIds.Count - 1; i >= 0; i--) { var bossId = sortedBossIds[i]; if (IsFreeTime(bossId)) { return bossId; } if (findPreciousModel.IsBossUnlock(bossId) && findPreciousModel.IsPlayerLevelLargerOrBiggerThanBoss(bossId)) { return bossId; } } return sortedBossIds[0]; } public int GetBossNpcId(int lineId) { var configs = PersonalBossConfig.GetValues(); foreach (var config in configs) { if (config.lineId == lineId) { return config.NPCID; } } return 0; } private void OnPlayerDataChange(PlayerDataType _type) { if (_type == PlayerDataType.LV) { UpdateRedpoint(); } } //private void RefreshItemCount(PackType type, int index, int id) //{ // if (type == PackType.Item && id == dungeonTicket) // { // UpdateRedpoint(); // } //} private void OnDungeonRecordChange(int _id) { if (_id == PERSONALBOSS_MAPID) { UpdateRedpoint(); } } public void UpdateRedpoint() { if (!FuncOpen.Instance.IsFuncOpen(22)) { return; } var dungeonModel = ModelCenter.Instance.GetModel(); var enterTimes = dungeonModel.GetEnterTimes(PERSONALBOSS_MAPID); var totalTimes = dungeonModel.GetTotalTimes(PERSONALBOSS_MAPID); bool hasFreeTimes = HasFreeBoss(); if (hasFreeTimes) { mainBossRedpoint.state = RedPointState.Simple; } else { mainBossRedpoint.state = RedPointState.None; } if (enterTimes >= totalTimes) { personalRedpoint.count = 0; if (hasFreeTimes) { personalRedpoint.state = RedPointState.Simple; } else { personalRedpoint.state = RedPointState.None; } return; } personalRedpoint.count = totalTimes - enterTimes; personalRedpoint.state = RedPointState.Quantity; } public bool HasFreeBoss() { foreach (var bossID in GetPersonalBosses()) { if (IsFreeTime(bossID)) { return true; } } return false; } private void ParseConfig() { var bossConfigs = PersonalBossConfig.GetValues(); for (int i = 0; i < bossConfigs.Count; i++) { var config = bossConfigs[i]; var bossData = personalBosses[config.NPCID] = new PersonalBossData(config.NPCID); var dungeonId = dungeonModel.GetDungeonId(PERSONALBOSS_MAPID, config.lineId); var dungeonConfig = DungeonConfig.Get(dungeonId); if (dungeonConfig != null) { bossData.challengableLevel = dungeonConfig.LVLimitMin; } } sortedBossIds.AddRange(personalBosses.Keys); sortedBossIds.Sort(FindPreciousModel.BossCompare); //{ // var dungeonId = dungeonModel.GetDungeonId(PERSONALBOSS_MAPID, 0); // var dungeonConfig = DungeonConfig.Get(dungeonId); // dungeonTicket = dungeonConfig == null ? 0 : dungeonConfig.TicketID; //} maxBossTimes = dungeonModel.GetMaxTimesShow(PERSONALBOSS_MAPID); WipeOutLV = int.Parse(FuncConfigConfig.Get("WipeOutLV").Numerical1); } public void RequestGotoDungeon(int _bossId) { var config = PersonalBossConfig.Get(_bossId); ClientDungeonStageUtility.GotoNormalClientDungeon(PERSONALBOSS_MAPID, PERSONALBOSS_MAPID, config.lineId); } public bool IsPlayerLevelEnough(int bossId) { var config = NPCConfig.Get(bossId); return PlayerDatas.Instance.baseData.LV >= config.NPCLV; } public bool IsFreeTime(int bossID) { if (bossID == 0) return false; if (!(findPreciousModel.IsBossUnlock(bossID) && IsPlayerLevelEnough(bossID))) return false; var config = PersonalBossConfig.Get(bossID); DungeonRecord dungeonRecord; if (dungeonModel.TryGetRecord(PERSONALBOSS_MAPID, out dungeonRecord)) { if (dungeonRecord.lineGrades.ContainsKey(config.lineId) && dungeonRecord.lineGrades[config.lineId] > 0) { return false; } } return true; } //S级可扫荡,增加等级限制(任务必须进副本否则会卡住,也不希望用户过早的扫荡低级BOSS) public bool CanFBWipeOut(int bossID) { if (PlayerDatas.Instance.baseData.LV <= WipeOutLV) { return false; } var config = PersonalBossConfig.Get(bossID); DungeonRecord dungeonRecord; if (dungeonModel.TryGetRecord(PERSONALBOSS_MAPID, out dungeonRecord)) { if (dungeonRecord.lineGrades.ContainsKey(config.lineId) && dungeonRecord.lineGrades[config.lineId] == 5) { return true; } } return false; } //是否通关过 public bool IsFBPass(int lineId) { DungeonRecord dungeonRecord; if (dungeonModel.TryGetRecord(PERSONALBOSS_MAPID, out dungeonRecord)) { if (dungeonRecord.lineGrades.ContainsKey(lineId) && dungeonRecord.lineGrades[lineId] != 0) { return true; } } return false; } } public class PersonalBossData { public int id { get; private set; } public int challengableLevel { get; set; } public PersonalBossData(int _id) { this.id = _id; } } }