少年修仙传客户端代码仓库
client_linchunjie
2018-08-27 d106f11e7f44c748f595da36e0cdfd54849649e6
System/FindPrecious/PersonalBossModel.cs
@@ -1,192 +1,214 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using TableConfig;
using Snxxz.UI;
namespace Snxxz.UI
{
    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<int> bossSelectedEvent;
        List<int> sortedBossIds = new List<int>();
        Dictionary<int, PersonalBossData> personalBosses = new Dictionary<int, PersonalBossData>();
        int dungeonTicket = 0;
        FindPreciousModel findPreciousModel { get { return ModelCenter.Instance.GetModel<FindPreciousModel>(); } }
        PlayerPackModel playerPack { get { return ModelCenter.Instance.GetModel<PlayerPackModel>(); } }
        DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel<DungeonModel>(); } }
        public override void Init()
        {
            ParseConfig();
            UpdateRedpoint();
            playerPack.RefreshItemCountAct += RefreshItemCnt;
        }
        public override void UnInit()
        {
            playerPack.RefreshItemCountAct -= RefreshItemCnt;
        }
        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<int> GetPersonalBosses()
        {
            return new List<int>(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 RefreshItemCnt(PackType type, int index, int id)
        {
            if (type == PackType.rptItem && id == dungeonTicket)
            {
                UpdateRedpoint();
            }
        }
        public void UpdateRedpoint()
        {
            if (!FuncOpen.Instance.IsFuncOpen(76))
            {
                return;
            }
            var dungeonModel = ModelCenter.Instance.GetModel<DungeonModel>();
            var enterTimes = dungeonModel.GetDungeonEnterTimes(PERSONALBOSS_MAPID);
            var totalTimes = dungeonModel.GetDungeonTotalTimes(PERSONALBOSS_MAPID);
            if (enterTimes >= totalTimes)
            {
                personalRedpoint.state = RedPointState.None;
                return;
            }
            var ticketItem = dungeonModel.GetDungeonTicketCost(PERSONALBOSS_MAPID);
            var own = playerPack.GetItemCountByID(PackType.rptItem, ticketItem.id);
            if (own < ticketItem.count)
            {
                personalRedpoint.count = 0;
                personalRedpoint.state = RedPointState.None;
                return;
            }
            personalRedpoint.count = own / ticketItem.count;
            personalRedpoint.state = RedPointState.Quantity;
        }
        private void ParseConfig()
        {
            var bossConfigs = ConfigManager.Instance.GetAllValues<PersonalBossConfig>();
            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.DungeonMap(PERSONALBOSS_MAPID, 0);
            var dungeonConfig = ConfigManager.Instance.GetTemplate<DungeonConfig>(dungeonId);
            dungeonTicket = dungeonConfig == null ? 0 : dungeonConfig.TicketID;
        }
        public void OnMapInitOk()
        {
            var dungeonModel = ModelCenter.Instance.GetModel<DungeonModel>();
            var dataMapId = dungeonModel.GetDungeonDataIdByMapId(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;
        }
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using TableConfig;
using Snxxz.UI;
namespace Snxxz.UI
{
    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<int> bossSelectedEvent;
        List<int> sortedBossIds = new List<int>();
        Dictionary<int, PersonalBossData> personalBosses = new Dictionary<int, PersonalBossData>();
        int dungeonTicket = 0;
        FindPreciousModel findPreciousModel { get { return ModelCenter.Instance.GetModel<FindPreciousModel>(); } }
        PlayerPackModel playerPack { get { return ModelCenter.Instance.GetModel<PlayerPackModel>(); } }
        DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel<DungeonModel>(); } }
        public override void Init()
        {
            ParseConfig();
            playerPack.RefreshItemCountAct += RefreshItemCount;
            PlayerDatas.Instance.PlayerDataRefreshEvent += OnPlayerDataChange;
            dungeonModel.dungeonRecordChangeEvent += OnDungeonRecordChange;
        }
        public override void UnInit()
        {
            playerPack.RefreshItemCountAct -= 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<int> GetPersonalBosses()
        {
            return new List<int>(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.rptItem && 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<DungeonModel>();
            var enterTimes = dungeonModel.GetDungeonEnterTimes(PERSONALBOSS_MAPID);
            var totalTimes = dungeonModel.GetDungeonTotalTimes(PERSONALBOSS_MAPID);
            if (enterTimes >= totalTimes)
            {
                personalRedpoint.state = RedPointState.None;
                return;
            }
            var ticketItem = dungeonModel.GetDungeonTicketCost(PERSONALBOSS_MAPID);
            var own = playerPack.GetItemCountByID(PackType.rptItem, ticketItem.id);
            if (own < ticketItem.count)
            {
                personalRedpoint.count = 0;
                personalRedpoint.state = RedPointState.None;
                return;
            }
            personalRedpoint.count = own / ticketItem.count;
            personalRedpoint.state = RedPointState.Quantity;
        }
        private void ParseConfig()
        {
            var bossConfigs = Config.Instance.GetAllValues<PersonalBossConfig>();
            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.DungeonMap(PERSONALBOSS_MAPID, 0);
            var dungeonConfig = Config.Instance.Get<DungeonConfig>(dungeonId);
            dungeonTicket = dungeonConfig == null ? 0 : dungeonConfig.TicketID;
        }
        public void OnMapInitOk()
        {
            var dungeonModel = ModelCenter.Instance.GetModel<DungeonModel>();
            var dataMapId = dungeonModel.GetDungeonDataIdByMapId(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;
        }
    }
}