From c7b8b789a4ef38bbd7bdbfd86b0aa73bf9334b1d Mon Sep 17 00:00:00 2001
From: client_linchunjie <461730578@qq.com>
Date: 星期五, 26 十月 2018 10:41:18 +0800
Subject: [PATCH] 4218【1.2】仙盟宴会传功

---
 System/FairyAu/FairyFeastModel.cs                                        |  283 +++++++++++++++++++++++++++++++++++
 Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0411_tagPlayerSit.cs |   67 ++++---
 System/Dungeon/DungeonFairyFeastHintWin.cs                               |   58 ++++++
 System/Dungeon/DungeonData.cs                                            |    1 
 System/WindowBase/ModelCenter.cs                                         |    1 
 System/FairyAu/FairyFeastModel.cs.meta                                   |   12 +
 6 files changed, 390 insertions(+), 32 deletions(-)

diff --git a/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0411_tagPlayerSit.cs b/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0411_tagPlayerSit.cs
index 62bd8bc..a2db392 100644
--- a/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0411_tagPlayerSit.cs
+++ b/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0411_tagPlayerSit.cs
@@ -1,28 +1,39 @@
-using UnityEngine;
-using System.Collections;
-using Snxxz.UI;
-
-//04 11 玩家坐下/站立#tagPlayerSit
-
-
-
-public class DTC0411_tagPlayerSit : DtcBasic {
-    RealmModel m_RealmModel;
-    RealmModel realmModel {
-        get {
-            return m_RealmModel ?? (m_RealmModel = ModelCenter.Instance.GetModel<RealmModel>());
-        }
-    }
-    public override void Done(GameNetPackBasic vNetPack) {
-
-        base.Done(vNetPack);
-
-        H0411_tagPlayerSit vNetData = vNetPack as H0411_tagPlayerSit;
-
-        if (vNetData != null) {
-            realmModel.OnRefreshData(vNetData);
-        }
-    }
-
-}
-
+using UnityEngine;
+using System.Collections;
+using Snxxz.UI;
+
+//04 11 玩家坐下/站立#tagPlayerSit
+
+
+
+public class DTC0411_tagPlayerSit : DtcBasic
+{
+    RealmModel m_RealmModel;
+    RealmModel realmModel
+    {
+        get
+        {
+            return m_RealmModel ?? (m_RealmModel = ModelCenter.Instance.GetModel<RealmModel>());
+        }
+    }
+
+    FairyFeastModel fairyFeastModel
+    {
+        get { return ModelCenter.Instance.GetModel<FairyFeastModel>(); }
+    }
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+
+        base.Done(vNetPack);
+
+        H0411_tagPlayerSit vNetData = vNetPack as H0411_tagPlayerSit;
+
+        if (vNetData != null)
+        {
+            realmModel.OnRefreshData(vNetData);
+            fairyFeastModel.UpdateTransmitState(vNetData);
+        }
+    }
+
+}
+
diff --git a/System/Dungeon/DungeonData.cs b/System/Dungeon/DungeonData.cs
index 57cba8c..a58d364 100644
--- a/System/Dungeon/DungeonData.cs
+++ b/System/Dungeon/DungeonData.cs
@@ -108,6 +108,7 @@
         public FairyFeastTop familyPartyTop;
         public int topPlayerID;
         public int enemyID;
+        public int hasSit;
 
         public long totalExp
         {
diff --git a/System/Dungeon/DungeonFairyFeastHintWin.cs b/System/Dungeon/DungeonFairyFeastHintWin.cs
index 4e61b33..c2d1986 100644
--- a/System/Dungeon/DungeonFairyFeastHintWin.cs
+++ b/System/Dungeon/DungeonFairyFeastHintWin.cs
@@ -23,12 +23,20 @@
         [SerializeField] FairyFeastRankBehaviour[] m_RankBehaviours;
         [SerializeField] FairyFeastRankBehaviour m_TopRank;
         [SerializeField] DungeonMultipleTaskWin.SelectEffect m_SelectEffect;
+        [SerializeField] Button m_Transmit;
+        [SerializeField] SmoothSlider m_TransmitSlider;
+        [SerializeField] Text m_TransmitProgress;
 
         DungeonModel model { get { return ModelCenter.Instance.GetModel<DungeonModel>(); } }
+        FairyFeastModel fairyFeastModel { get { return ModelCenter.Instance.GetModel<FairyFeastModel>(); } }
 
         int currentSelect = 0;
         #region Built-in
         protected override void BindController()
+        {
+        }
+
+        protected override void AddListeners()
         {
             m_FairyFeast.onClick.AddListener(() =>
             {
@@ -38,17 +46,19 @@
             {
                 Select(1);
             });
-        }
-
-        protected override void AddListeners()
-        {
+            m_Transmit.onClick.AddListener(Transmit);
         }
 
         protected override void OnPreOpen()
         {
             Select(0);
+            m_TransmitSlider.ResetValue(0);
             model.updateMissionEvent += UpdateMissionEvent;
+            fairyFeastModel.selectTransmit += SelectTransmit;
+            fairyFeastModel.transmitStateUpdate += TransmitStateUpdate;
+            SelectTransmit();
         }
+
 
         protected override void OnAfterOpen()
         {
@@ -57,10 +67,34 @@
         protected override void OnPreClose()
         {
             model.updateMissionEvent -= UpdateMissionEvent;
+            fairyFeastModel.selectTransmit -= SelectTransmit;
+            fairyFeastModel.transmitStateUpdate -= TransmitStateUpdate;
         }
 
         protected override void OnAfterClose()
         {
+        }
+
+        protected override void LateUpdate()
+        {
+            if (fairyFeastModel.transmiting)
+            {
+                if (!m_TransmitSlider.gameObject.activeSelf)
+                {
+                    m_TransmitSlider.gameObject.SetActive(true);
+                }
+                var surplusTime = (fairyFeastModel.transmitCompleteTime - DateTime.Now).TotalSeconds;
+                var progress = Mathf.Clamp01(1 - (float)surplusTime / fairyFeastModel.transmitCostSeconds);
+                m_TransmitSlider.value = progress;
+                m_TransmitProgress.text = StringUtility.Contact((int)(progress * 100), "%");
+            }
+            else
+            {
+                if (m_TransmitSlider.gameObject.activeSelf)
+                {
+                    m_TransmitSlider.gameObject.SetActive(false);
+                }
+            }
         }
         #endregion
 
@@ -128,6 +162,22 @@
         {
             return x.rank.CompareTo(y.rank);
         }
+
+        private void SelectTransmit()
+        {
+            m_Transmit.gameObject.SetActive(fairyFeastModel.selectPlayer != 0 && fairyFeastModel.allowTransmit
+                && !fairyFeastModel.transmiting);
+        }
+
+        private void Transmit()
+        {
+            fairyFeastModel.Transmit();
+        }
+
+        private void TransmitStateUpdate()
+        {
+            SelectTransmit();
+        }
     }
 }
 
diff --git a/System/FairyAu/FairyFeastModel.cs b/System/FairyAu/FairyFeastModel.cs
new file mode 100644
index 0000000..9531aa8
--- /dev/null
+++ b/System/FairyAu/FairyFeastModel.cs
@@ -0,0 +1,283 @@
+锘縰sing System;
+using System.Collections;
+using System.Collections.Generic;
+using TableConfig;
+using UnityEngine;
+namespace Snxxz.UI
+{
+    public class FairyFeastModel : Model, IBeforePlayerDataInitialize
+    {
+        public uint selectPlayer { get; private set; }
+        public bool allowTransmit { get; private set; }
+
+        public event Action selectTransmit;
+
+        public event Action transmitStateUpdate;
+        DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel<DungeonModel>(); } }
+
+        public override void Init()
+        {
+            ParseConfig();
+            GA_Player.s_OnSelected += OnSelected;
+            GlobalTimeEvent.Instance.secondEvent += SecondEvent;
+            StageManager.Instance.onStageLoadFinish += OnStageLoadFinish;
+            dungeonModel.updateMissionEvent += UpdateMissionEvent;
+            PrepareHandler.Instance.OnPrepareEndSuccess += OnPrepareEndSuccess;
+        }
+
+        public override void UnInit()
+        {
+            GA_Player.s_OnSelected -= OnSelected;
+            GlobalTimeEvent.Instance.secondEvent -= SecondEvent;
+            StageManager.Instance.onStageLoadFinish -= OnStageLoadFinish;
+            dungeonModel.updateMissionEvent -= UpdateMissionEvent;
+            PrepareHandler.Instance.OnPrepareEndSuccess -= OnPrepareEndSuccess;
+        }
+
+        public void OnBeforePlayerDataInitialize()
+        {
+            transmitCompleteTime = TimeUtility.ClientOriginalTime;
+            if (transmitClock != null)
+            {
+                transmitClock.Stop();
+                transmitClock = null;
+            }
+        }
+
+        private void OnStageLoadFinish()
+        {
+            selectPlayer = 0;
+            if (transmitClock != null)
+            {
+                transmitClock.Stop();
+                transmitClock = null;
+            }
+        }
+
+        private void SecondEvent()
+        {
+            if (selectPlayer != 0)
+            {
+                var actor = GAMgr.Instance.GetBySID(selectPlayer);
+                bool update = false;
+                if (actor == null || !(actor is GA_Player))
+                {
+                    selectPlayer = 0;
+                    update = true;
+                }
+                else
+                {
+                    var player = actor as GA_Player;
+                    var hero = PlayerDatas.Instance.hero;
+                    if (SatisfyTransmitState())
+                    {
+                        var distance = MathUtility.CalDistance(player.Pos, hero.Pos);
+                        if (allowTransmit != (distance <= transmitDistance))
+                        {
+                            allowTransmit = distance <= transmitDistance;
+                            update = true;
+                        }
+                    }
+                    else
+                    {
+                        if (allowTransmit)
+                        {
+                            allowTransmit = false;
+                            update = true;
+                        }
+                    }
+                }
+                if (update && selectTransmit != null)
+                {
+                    selectTransmit();
+                }
+            }
+        }
+
+        float transmitDistance = 2f;
+        public int transmitCostSeconds { get; private set; }
+        void ParseConfig()
+        {
+            var config = Config.Instance.Get<FuncConfigConfig>("FairyFeastTransmit");
+            transmitCostSeconds = 15;
+            if (config != null)
+            {
+                transmitDistance = float.Parse(config.Numerical1);
+                transmitCostSeconds = int.Parse(config.Numerical2);
+            }
+        }
+
+        bool SatisfyTransmitState()
+        {
+            var hero = PlayerDatas.Instance.hero;
+            if (hero == null || hero.IsCollecting()
+                || hero.IsCollect() || hero.IsDaZuo())
+            {
+                return false;
+            }
+            return true;
+        }
+
+        private void OnSelected(uint serverInstId, bool select)
+        {
+            var mapId = PlayerDatas.Instance.baseData.MapID;
+            if (mapId != 31230)
+            {
+                return;
+            }
+            if (transmiting)
+            {
+                return;
+            }
+            var mission = dungeonModel.mission;
+            if (mission.hasSit == 1)
+            {
+                return;
+            }
+            selectPlayer = 0;
+            allowTransmit = false;
+            if (select)
+            {
+                var actor = GAMgr.Instance.GetBySID(serverInstId);
+                if (actor != null && actor is GA_Player)
+                {
+                    var player = actor as GA_Player;
+                    var hero = PlayerDatas.Instance.hero;
+                    var distance = MathUtility.CalDistance(player.Pos, hero.Pos);
+                    if (SatisfyTransmitState())
+                    {
+                        allowTransmit = distance <= transmitDistance;
+                    }
+                    selectPlayer = serverInstId;
+                }
+            }
+            if (selectTransmit != null)
+            {
+                selectTransmit();
+            }
+        }
+
+        /// <summary>
+        /// 浠欑洘瀹翠細閲囬泦缁撴潫
+        /// </summary>
+        private void OnPrepareEndSuccess()
+        {
+            var mapId = PlayerDatas.Instance.baseData.MapID;
+            if (mapId != 31230)
+            {
+                return;
+            }
+            var mission = dungeonModel.mission;
+            if (mission.hasSit == 1)
+            {
+                return;
+            }
+            if (!WindowCenter.Instance.IsOpen<MainInterfaceWin>()
+                || WindowCenter.Instance.ExitAnyFullScreenOrMaskWin())
+            {
+                return;
+            }
+            var list = GAMgr.Instance.GetTypeList(E_ActorClassType.Player);
+            if (list != null)
+            {
+                var hero = PlayerDatas.Instance.hero;
+                for (int i = 0; i < list.Count; i++)
+                {
+                    var player = list[i] as GA_Player;
+                    if (player != null)
+                    {
+                        var distance = MathUtility.CalDistance(player.Pos, hero.Pos);
+                        if (distance < transmitDistance)
+                        {
+                            player.OnClick();
+                            return;
+                        }
+                    }
+                }
+            }
+        }
+
+        private void UpdateMissionEvent()
+        {
+            var mapId = PlayerDatas.Instance.baseData.MapID;
+            if (mapId != 31230)
+            {
+                return;
+            }
+            var mission = dungeonModel.mission;
+            if (mission.hasSit == 1 && selectPlayer != 0)
+            {
+                selectPlayer = 0;
+                if (selectTransmit != null)
+                {
+                    selectTransmit();
+                }
+            }
+        }
+
+        #region 鏈嶅姟绔暟鎹�
+        public DateTime transmitCompleteTime { get; private set; }
+        public bool transmiting
+        {
+            get
+            {
+                return DateTime.Now < transmitCompleteTime;
+            }
+        }
+
+        private Clock transmitClock = null;
+
+        public void Transmit()
+        {
+            if (selectPlayer != 0)
+            {
+                CA508_tagCMDoFBAction pak = new CA508_tagCMDoFBAction();
+                pak.ActionType = 0;
+                pak.ActionInfo = selectPlayer;
+                GameNetSystem.Instance.SendInfo(pak);
+            }
+        }
+
+        public void UpdateTransmitState(H0411_tagPlayerSit package)
+        {
+            var mapId = PlayerDatas.Instance.baseData.MapID;
+            if (mapId != 31230 || package.PlayerID != PlayerDatas.Instance.baseData.PlayerID)
+            {
+                return;
+            }
+            if (package.Type == 0)
+            {
+                transmitCompleteTime = DateTime.Now.AddTicks(transmitCostSeconds * TimeSpan.TicksPerSecond);
+                transmitClock = Clock.Create(transmitCostSeconds, TransmitComplete);
+            }
+            else
+            {
+                if (transmitClock != null)
+                {
+                    transmitClock.Stop();
+                    transmitClock = null;
+                }
+                transmitCompleteTime = TimeUtility.ClientOriginalTime;
+            }
+            if (transmitStateUpdate != null)
+            {
+                transmitStateUpdate();
+            }
+        }
+
+        void TransmitComplete()
+        {
+            transmitClock = null;
+            CA508_tagCMDoFBAction pak = new CA508_tagCMDoFBAction();
+            pak.ActionType = 1;
+            pak.ActionInfo = 0;
+            GameNetSystem.Instance.SendInfo(pak);
+            if (transmitStateUpdate != null)
+            {
+                transmitStateUpdate();
+            }
+        }
+        #endregion
+    }
+}
+
diff --git a/System/FairyAu/FairyFeastModel.cs.meta b/System/FairyAu/FairyFeastModel.cs.meta
new file mode 100644
index 0000000..c156190
--- /dev/null
+++ b/System/FairyAu/FairyFeastModel.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 5903c3e70810d3e49936a4f4729c79ed
+timeCreated: 1539661724
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/System/WindowBase/ModelCenter.cs b/System/WindowBase/ModelCenter.cs
index de40c30..d160460 100644
--- a/System/WindowBase/ModelCenter.cs
+++ b/System/WindowBase/ModelCenter.cs
@@ -198,6 +198,7 @@
             RegisterModel<FlashRushToBuyModel>();
             RegisterModel<TalentModel>();
             RegisterModel<OpenServerActivityNotifyModel>();
+            RegisterModel<FairyFeastModel>();
             RegisterModel<WishingPoolModel>();
             RegisterModel<RolePointModel>();
             inited = true;

--
Gitblit v1.8.0