少年修仙传客户端代码仓库
client_linchunjie
2018-08-28 95e0544aa36854c34c433c46dc4fb34b15b3a528
System/FairyAu/FairyGrabBossModel.cs
@@ -5,15 +5,18 @@
using UnityEngine;
namespace Snxxz.UI
{
    public class FairyGrabBossModel : Model
    public class FairyGrabBossModel : Model, IBeforePlayerDataInitialize, IPlayerLoginOk
    {
        public List<int> bosses { get; private set; }
        Dictionary<int, List<Item>> dropItemDict = new Dictionary<int, List<Item>>();
        Dictionary<int, Dictionary<int, FairyGrabBossInfo>> fairyGrabBossDict = new Dictionary<int, Dictionary<int, FairyGrabBossInfo>>();
        public bool IsOpen
        {
            get
            {
                return true;
                return dailyQuestModel.GetQuestState((int)DailyQuestType.FairyGrabBoss)
                    == DailyQuestModel.DailyQuestState.Normal;
            }
        }
        int m_SelectBoss = 0;
@@ -32,17 +35,63 @@
                }
            }
        }
        public int surplusSeconds
        {
            get
            {
                DailyQuestOpenTime openTime;
                if (dailyQuestModel.TryGetOpenTime((int)DailyQuestType.FairyGrabBoss, out openTime))
                {
                    if (openTime.InOpenTime() && openTime.IsValidServerOpenTime())
                    {
                        HourMinute hourMinute;
                        if (openTime.TryGetTodayNearestOpenTime(out hourMinute))
                        {
                            DateTime end = new DateTime(TimeUtility.Year, TimeUtility.Month, TimeUtility.Day,
                                hourMinute.hourEnd, hourMinute.minuteEnd, 0);
                            return (int)(end - TimeUtility.ServerNow).TotalSeconds;
                        }
                    }
                }
                return 0;
            }
        }
        private bool serverInited = false;
        public event Action stateUpdate;
        public event Action<int> bossSelectedEvent;
        public event Action<int, int> bossHurtUpdate;
        DailyQuestModel dailyQuestModel { get { return ModelCenter.Instance.GetModel<DailyQuestModel>(); } }
        public override void Init()
        {
            ParseConfig();
            GlobalTimeEvent.Instance.secondEvent += SecondEvent;
            StageManager.Instance.onStageLoadFinish += OnStageLoadFinish;
        }
        public void OnBeforePlayerDataInitialize()
        {
            serverInited = false;
        }
        public void OnPlayerLoginOk()
        {
            serverInited = true;
        }
        public override void UnInit()
        {
        }
        private void OnStageLoadFinish()
        {
            if (!(StageManager.Instance.CurrentStage is DungeonStage))
            {
                fairyGrabBossDict.Clear();
            }
        }
        void ParseConfig()
@@ -52,6 +101,137 @@
            for (int i = 0; i < configs.Count; i++)
            {
                bosses.Add(configs[i].NPCID);
                var itemArray = LitJson.JsonMapper.ToObject<int[][]>(configs[i].dropItems);
                List<Item> list = new List<Item>();
                for (int k = 0; k < itemArray.Length; k++)
                {
                    Item item = new Item()
                    {
                        id = itemArray[k][0],
                        count = itemArray[k][1],
                        bind = itemArray[k][2] == 1,
                    };
                    list.Add(item);
                }
                dropItemDict.Add(configs[i].NPCID, list);
            }
        }
        public bool TryGetDropItems(int bossId, out List<Item> dropItems)
        {
            return dropItemDict.TryGetValue(bossId, out dropItems);
        }
        /// <summary>
        /// 查询Boss伤害信息
        /// </summary>
        /// <param name="bossId"></param>
        /// <param name="queryType">0-实时仙盟伤血 1-历史仙盟伤血 2-实时玩家伤血 3-历史玩家伤血</param>
        public void QueryGrabBossHurt(int bossId, int queryType)
        {
            CA228_tagCMQueryFamilyBossHurt pak = new CA228_tagCMQueryFamilyBossHurt();
            pak.NPCID = (uint)bossId;
            pak.QueryType = (byte)queryType;
            GameNetSystem.Instance.SendInfo(pak);
        }
        public void UpdateBossHurt(HA715_tagMCFamilyBossHurtList package)
        {
            Dictionary<int, FairyGrabBossInfo> dict = null;
            FairyGrabBossInfo fairyGrabBossInfo = null;
            if (!fairyGrabBossDict.TryGetValue((int)package.NPCID, out dict))
            {
                dict = new Dictionary<int, FairyGrabBossInfo>();
                fairyGrabBossDict.Add((int)package.NPCID, dict);
            }
            if (!dict.TryGetValue(package.HurtType, out fairyGrabBossInfo))
            {
                fairyGrabBossInfo = new FairyGrabBossInfo();
                dict.Add(package.HurtType, fairyGrabBossInfo);
            }
            fairyGrabBossInfo.SetData(package);
            if (bossHurtUpdate != null)
            {
                bossHurtUpdate((int)package.NPCID, package.HurtType);
            }
        }
        public void QueryGrabBossProgress()
        {
            CAC04_tagCGQueryAllFamilyBossHurt pak = new CAC04_tagCGQueryAllFamilyBossHurt();
            GameNetSystem.Instance.SendInfo(pak);
        }
        private void SecondEvent()
        {
            if (!serverInited)
            {
                return;
            }
        }
        public class FairyGrabBossInfo
        {
            public int npcId { get; private set; }
            public int objId { get; private set; }
            public int hurtType { get; private set; }
            public int IsSort { get; private set; }
            public List<BossHurtInfo> hurtInfos = new List<BossHurtInfo>();
            public void SetData(HA715_tagMCFamilyBossHurtList package)
            {
                npcId = (int)package.NPCID;
                objId = (int)package.ObjID;
                hurtType = package.HurtType;
                IsSort = package.IsSort;
                hurtInfos.Clear();
                for (int i = 0; i < package.HurtCount; i++)
                {
                    var sHurt = package.HurtList[i];
                    var hurtInfo = new BossHurtInfo()
                    {
                        FamilyID = (int)sHurt.FamilyID,
                        HurtID = (int)sHurt.HurtID,
                        HurtName = UIHelper.ServerStringTrim(sHurt.HurtName),
                        HurtValue = (int)sHurt.HurtValue,
                        HurtValueEx = (int)sHurt.HurtValueEx,
                        InitTick = sHurt.InitTick,
                    };
                    hurtInfos.Add(hurtInfo);
                }
                if (IsSort != 1)
                {
                    hurtInfos.Sort(Compare);
                }
            }
            int Compare(BossHurtInfo x, BossHurtInfo y)
            {
                if (x.totalHurt != y.totalHurt)
                {
                    return -x.totalHurt.CompareTo(y.totalHurt);
                }
                return x.InitTick.CompareTo(y.InitTick);
            }
        }
        public struct BossHurtInfo
        {
            public int FamilyID;
            public int HurtID;        // 伤血的ID, 根据伤血类型表示不同的ID, 如仙盟ID或玩家ID
            public string HurtName;
            public int HurtValue;        // 累计伤血,求余1亿的值
            public int HurtValueEx;        // 累计伤血,整除1亿的值
            public uint InitTick;        // 伤血初始tick,用于排序,先按伤血倒序排,再按tick正序排
            public long totalHurt
            {
                get
                {
                    return HurtValue + (long)HurtValueEx * Constants.ExpPointValue;
                }
            }
        }
    }