using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using Snxxz.UI; namespace Snxxz.UI { [XLua.LuaCallCSharp] public class PersonalBossModel : Model, IMapInitOk { public const int PERSONALBOSS_MAPID = 31240; public const int PERSONAL_REDPOINTID = 76003; public Redpoint personalRedpoint = new Redpoint(FindPreciousModel.FINDPRECIOUS_REDPOINTID, PERSONAL_REDPOINTID); 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 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() { return new List(sortedBossIds); } public bool IsBossUnLocked(int _bossId) { var playerLevel = PlayerDatas.Instance.baseData.LV; return personalBosses.ContainsKey(_bossId) && playerLevel >= personalBosses[_bossId].challengableLevel; } public int GetLatestUnLockBoss() { for (int i = sortedBossIds.Count - 1; i >= 0; i--) { var bossId = sortedBossIds[i]; if (IsBossUnLocked(bossId)) { return bossId; } } return sortedBossIds[0]; } private void OnPlayerDataChange(PlayerDataRefresh _type, int _value) { if (_type == PlayerDataRefresh.VIPLv) { 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(76)) { return; } var dungeonModel = ModelCenter.Instance.GetModel(); var enterTimes = dungeonModel.GetEnterTimes(PERSONALBOSS_MAPID); var totalTimes = dungeonModel.GetTotalTimes(PERSONALBOSS_MAPID); if (enterTimes >= totalTimes) { personalRedpoint.count = 0; personalRedpoint.state = RedPointState.None; return; } var ticketItem = dungeonModel.GetTicketCost(PERSONALBOSS_MAPID); var own = playerPack.GetItemCountByID(PackType.Item, ticketItem.id); if (own < ticketItem.count) { personalRedpoint.count = 0; personalRedpoint.state = RedPointState.None; return; } personalRedpoint.count = Mathf.Clamp(own / ticketItem.count, 0, totalTimes - enterTimes); personalRedpoint.state = RedPointState.Quantity; } 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); bossData.challengableLevel = config.ChanllengeLv; } sortedBossIds.AddRange(personalBosses.Keys); sortedBossIds.Sort((int a, int b) => { var data1 = personalBosses[a]; var data2 = personalBosses[b]; return PersonalBossData.ChallengableLevelCompare(data1, data2); }); var dungeonId = dungeonModel.GetDungeonId(PERSONALBOSS_MAPID, 0); var dungeonConfig = DungeonConfig.Get(dungeonId); dungeonTicket = dungeonConfig == null ? 0 : dungeonConfig.TicketID; } public void OnMapInitOk() { var dungeonModel = ModelCenter.Instance.GetModel(); var dataMapId = dungeonModel.GetDataMapIdByMapId(PlayerDatas.Instance.baseData.MapID); switch (dataMapId) { case PERSONALBOSS_MAPID: var sendInfo = new CA508_tagCMDoFBAction(); sendInfo.ActionType = 0; sendInfo.ActionInfo = (uint)selectedBoss; GameNetSystem.Instance.SendInfo(sendInfo); MapTransferUtility.Instance.MoveToNPC(selectedBoss); break; } } } public class PersonalBossData { public int id { get; private set; } public int challengableLevel { get; set; } public PersonalBossData(int _id) { this.id = _id; } public static int ChallengableLevelCompare(PersonalBossData _lhs, PersonalBossData _rhs) { return _lhs.challengableLevel < _rhs.challengableLevel ? -1 : 1; } } }