From 78aefe728e21950bf7dc2b1f93de9b2bae882b68 Mon Sep 17 00:00:00 2001
From: client_Wu Xijin <364452445@qq.com>
Date: 星期六, 05 一月 2019 14:24:24 +0800
Subject: [PATCH] 5725 【前端】【1.5】跨服BOSS开发

---
 System/CrossServerBoss/CrossServerBossModel.cs |  387 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 386 insertions(+), 1 deletions(-)

diff --git a/System/CrossServerBoss/CrossServerBossModel.cs b/System/CrossServerBoss/CrossServerBossModel.cs
index f90798d..1cacec0 100644
--- a/System/CrossServerBoss/CrossServerBossModel.cs
+++ b/System/CrossServerBoss/CrossServerBossModel.cs
@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 using UnityEngine;
 using TableConfig;
+using System;
 
 namespace Snxxz.UI
 {
@@ -18,14 +19,73 @@
         public int smallBoxNpcId = 0;
         public List<int> eliteMonsters = new List<int>();
 
+        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);
+                    }
+                }
+            }
+        }
+
+        int m_BigBoxCollectCount = 0;
+        public int bigBoxCollectCount {
+            get { return m_BigBoxCollectCount; }
+            set {
+                if (m_BigBoxCollectCount != value)
+                {
+                    m_BigBoxCollectCount = value;
+                    if (bigBoxCollectCountChangeEvent != null)
+                    {
+                        bigBoxCollectCountChangeEvent();
+                    }
+                }
+            }
+        }
+
+        int m_SmallBoxCollectCount = 0;
+        public int smallBoxCollectCount {
+            get { return m_SmallBoxCollectCount; }
+            set { m_SmallBoxCollectCount = value; }
+        }
+
+        public int wearyValue {
+            get {
+                return dogzDungeonModel.wearyValue;
+            }
+        }
+
+        public event Action<int> bossSelectedEvent;
+        public event Action bossWearyValueChangeEvent;
+        public event Action bigBoxCollectCountChangeEvent;
+        public event Action boxSurplusChangeEvent;
+        public event Action eliteSurplusChangeEvent;
+
+        public DogzDungeonBox dogzDungeonBox = new DogzDungeonBox();
+        public DogzDungeonElite dogzDungeonElite = new DogzDungeonElite();
+        public Redpoint redpoint = new Redpoint(FindPreciousModel.LOOTPRECIOUs_REDPOINTID, REDPOINT);
+
+        FindPreciousModel findPreciousModel { get { return ModelCenter.Instance.GetModel<FindPreciousModel>(); } }
+        DogzDungeonModel dogzDungeonModel { get { return ModelCenter.Instance.GetModel<DogzDungeonModel>(); } }
+
         public override void Init()
         {
+            ParseConfig();
+            FuncOpen.Instance.OnFuncStateChangeEvent += OnFunctionStateChange;
         }
 
         public override void UnInit()
         {
+            FuncOpen.Instance.OnFuncStateChangeEvent -= OnFunctionStateChange;
         }
-
 
         public bool IsAtCrossServerBossMap()
         {
@@ -55,6 +115,261 @@
 
         }
 
+        public bool TryGetBossData(int bossId, out CrossServerBossData data)
+        {
+            return bosses.TryGetValue(bossId, out data);
+        }
+
+        public List<int> GetNpcIds()
+        {
+            var npcIds = new List<int>();
+            npcIds.Add(bigBoxNpcId);
+            npcIds.Add(eliteMonsters[0]);
+            npcIds.AddRange(bosses.Keys);
+
+            return npcIds;
+        }
+
+        public List<int> GetBosses()
+        {
+            return new List<int>(bosses.Keys);
+        }
+
+        public int GetRecommendNpc()
+        {
+            if (bigBoxCollectCount < GeneralDefine.dogzBoxLimit)
+            {
+                return bigBoxNpcId;
+            }
+
+            if (wearyValue < GeneralDefine.bossWearyValues[2])
+            {
+                var playerLevel = PlayerDatas.Instance.baseData.LV;
+                for (int i = sortedBossIds.Count - 1; i >= 0; i--)
+                {
+                    var bossId = sortedBossIds[i];
+                    var npcConfig = Config.Instance.Get<NPCConfig>(bossId);
+                    if (IsBossUnLocked(bossId) && findPreciousModel.IsBossAlive(bossId) && playerLevel >= npcConfig.NPCLV)
+                    {
+                        return bossId;
+                    }
+                }
+
+                return sortedBossIds[0];
+            }
+
+            return eliteMonsters[0];
+        }
+
+        public int GetRecommendKillElite()
+        {
+            var Elite = dogzDungeonElite.GetAliveElite();
+            if (Elite == 0)
+            {
+                Elite = eliteMonsters[0];
+            }
+
+            return Elite;
+        }
+
+        public bool IsBossUnLocked(int _bossId)
+        {
+            if (_bossId == bigBoxNpcId || _bossId == smallBoxNpcId)
+            {
+                return true;
+            }
+
+            if (eliteMonsters.Contains(_bossId))
+            {
+                return true;
+            }
+
+            return bosses.ContainsKey(_bossId) && bosses[_bossId].isUnLocked;
+        }
+
+        public void RequestBoxAndEliteSurplusInfo()
+        {
+            var sendInfo = new CA227_tagCMQueryNPCCntInfo();
+            sendInfo.MapID = DATA_MAPID;
+            sendInfo.LineID = 0;
+            var stringArray = new string[eliteMonsters.Count + 2];
+            for (int i = 0; i < eliteMonsters.Count; i++)
+            {
+                stringArray[i] = eliteMonsters[i].ToString();
+            }
+
+            stringArray[eliteMonsters.Count] = bigBoxNpcId.ToString();
+            stringArray[eliteMonsters.Count + 1] = smallBoxNpcId.ToString();
+
+            sendInfo.NPCIDList = string.Format("[{0}]", string.Join(",", stringArray));
+            sendInfo.NPCIDListLen = (byte)sendInfo.NPCIDList.Length;
+            GameNetSystem.Instance.SendInfo(sendInfo);
+        }
+
+        public void RequestBoxSurplusInfo()
+        {
+            var sendInfo = new CA227_tagCMQueryNPCCntInfo();
+            sendInfo.MapID = DATA_MAPID;
+            sendInfo.LineID = 0;
+            sendInfo.NPCIDList = string.Format("[{0},{1}]", bigBoxNpcId, smallBoxNpcId);
+            sendInfo.NPCIDListLen = (byte)sendInfo.NPCIDList.Length;
+            GameNetSystem.Instance.SendInfo(sendInfo);
+        }
+
+        public void RequestEliteSurplusInfo()
+        {
+            var sendInfo = new CA227_tagCMQueryNPCCntInfo();
+            sendInfo.MapID = DATA_MAPID;
+            sendInfo.LineID = 0;
+            var stringArray = new string[eliteMonsters.Count];
+            for (int i = 0; i < stringArray.Length; i++)
+            {
+                stringArray[i] = eliteMonsters[i].ToString();
+            }
+
+            sendInfo.NPCIDList = string.Format("[{0}]", string.Join(",", stringArray));
+            sendInfo.NPCIDListLen = (byte)sendInfo.NPCIDList.Length;
+            GameNetSystem.Instance.SendInfo(sendInfo);
+        }
+
+        public void UpdateMonsterSurplusInfo(HA714_tagMCNPCCntList _npcInfoes)
+        {
+            if (_npcInfoes.MapID != DATA_MAPID)
+            {
+                return;
+            }
+
+            var updatedBigBox = false;
+            var updatedSmallBox = false;
+            var updatedEliteNpcIds = new List<int>();
+
+            for (int i = 0; i < _npcInfoes.NPCInfoList.Length; i++)
+            {
+                var npcInfo = _npcInfoes.NPCInfoList[i];
+                if (npcInfo.NPCID == bigBoxNpcId)
+                {
+                    dogzDungeonBox.bigBoxSurplus = (int)npcInfo.Cnt;
+                    updatedBigBox = true;
+                }
+
+                if (npcInfo.NPCID == smallBoxNpcId)
+                {
+                    dogzDungeonBox.smallBoxSurplus = (int)npcInfo.Cnt;
+                    updatedSmallBox = true;
+                }
+
+                if (eliteMonsters.Contains((int)npcInfo.NPCID))
+                {
+                    dogzDungeonElite.UpdateEliteInfo((int)npcInfo.NPCID, (int)npcInfo.Cnt);
+                    updatedEliteNpcIds.Add((int)npcInfo.NPCID);
+                }
+            }
+
+            if (!updatedBigBox)
+            {
+                dogzDungeonBox.bigBoxSurplus = 0;
+            }
+
+            if (!updatedSmallBox)
+            {
+                dogzDungeonBox.smallBoxSurplus = 0;
+            }
+
+            if (boxSurplusChangeEvent != null)
+            {
+                boxSurplusChangeEvent();
+            }
+
+            foreach (var item in eliteMonsters)
+            {
+                if (!updatedEliteNpcIds.Contains(item))
+                {
+                    dogzDungeonElite.UpdateEliteInfo(item, 0);
+                }
+            }
+
+            if (eliteSurplusChangeEvent != null)
+            {
+                eliteSurplusChangeEvent();
+            }
+        }
+
+        public void UpdateBoxOrEliteRefreshTime(HA904_tagGCDogzNPCRefreshTime _refreshTimes)
+        {
+            var containBox = false;
+            var boxRefreshSecond = 0;
+
+            var containElite = false;
+            var eliteRefreshSecond = 0;
+
+            for (int i = 0; i < _refreshTimes.InfoList.Length; i++)
+            {
+                var info = _refreshTimes.InfoList[i];
+                if (bigBoxNpcId == info.NPCID || smallBoxNpcId == info.NPCID)
+                {
+                    containBox = true;
+                    boxRefreshSecond = (int)info.RefreshSecond;
+                }
+
+                if (eliteMonsters.Contains((int)info.NPCID))
+                {
+                    containElite = true;
+                    eliteRefreshSecond = (int)info.RefreshSecond;
+                }
+            }
+
+            if (containBox)
+            {
+                dogzDungeonBox.UpdateBoxRefreshTime(boxRefreshSecond);
+            }
+
+            if (containElite)
+            {
+                dogzDungeonElite.UpdateEliteRefreshTime(eliteRefreshSecond);
+            }
+
+            if (WindowCenter.Instance.IsOpen("DogzDungeonWin"))
+            {
+                if (containBox)
+                {
+                    RequestBoxSurplusInfo();
+                }
+
+                if (containElite)
+                {
+                    RequestEliteSurplusInfo();
+                }
+            }
+        }
+
+        public void OnPlayerLoginOk()
+        {
+            UpdateRedpoint();
+        }
+
+        private void OnFunctionStateChange(int id)
+        {
+            if (id == 138)
+            {
+                UpdateRedpoint();
+            }
+        }
+
+        private void UpdateRedpoint()
+        {
+            if (!FuncOpen.Instance.IsFuncOpen(138))
+            {
+                redpoint.count = 0;
+            }
+            else
+            {
+                var wearyValueLimit = GeneralDefine.bossWearyValues[2];
+                redpoint.count = wearyValueLimit - wearyValue;
+            }
+
+            redpoint.state = redpoint.count > 0 ? RedPointState.Quantity : RedPointState.None;
+        }
+
         private void ParseConfig()
         {
             var configs = Config.Instance.GetAllValues<CrossServerBossConfig>();
@@ -81,6 +396,76 @@
             sortedBossIds.Sort(CrossServerBossData.LevelCompare);
         }
 
+
+    }
+
+    public class CrossServerBossBox
+    {
+        public int bigBoxSurplus;
+        public int smallBoxSurplus;
+        public DateTime refreshTime { get; private set; }
+
+        public event Action refreshTimeEvent;
+
+        public void UpdateBoxInfo(int _big, int _small)
+        {
+            bigBoxSurplus = _big;
+            smallBoxSurplus = _small;
+        }
+
+        public void UpdateBoxRefreshTime(int _seconds)
+        {
+            refreshTime = TimeUtility.ServerNow + new TimeSpan(_seconds * TimeSpan.TicksPerSecond);
+            if (refreshTimeEvent != null)
+            {
+                refreshTimeEvent();
+            }
+        }
+    }
+
+    public class CrossServerBossElite
+    {
+        public Dictionary<int, int> eliteCounts = new Dictionary<int, int>();
+        public int eliteSurplus {
+            get {
+                var count = 0;
+                foreach (var eliteCount in eliteCounts.Values)
+                {
+                    count += eliteCount;
+                }
+                return count;
+            }
+        }
+
+        public DateTime refreshTime { get; private set; }
+        public event Action refreshTimeEvent;
+
+        public void UpdateEliteInfo(int _npcId, int _count)
+        {
+            eliteCounts[_npcId] = _count;
+        }
+
+        public void UpdateEliteRefreshTime(int _seconds)
+        {
+            refreshTime = TimeUtility.ServerNow + new TimeSpan(_seconds * TimeSpan.TicksPerSecond);
+            if (refreshTimeEvent != null)
+            {
+                refreshTimeEvent();
+            }
+        }
+
+        public int GetAliveElite()
+        {
+            foreach (var EliteCount in eliteCounts)
+            {
+                if (EliteCount.Value > 0)
+                {
+                    return EliteCount.Key;
+                }
+            }
+
+            return 0;
+        }
     }
 
     public class CrossServerBossData

--
Gitblit v1.8.0