| using System;  | 
| using System.Collections;  | 
| using System.Collections.Generic;  | 
|   | 
| using UnityEngine;  | 
| namespace vnxbqy.UI  | 
| {  | 
|       | 
|     public class RedEnvelopeModel : Model, IBeforePlayerDataInitialize, IPlayerLoginOk  | 
|     {  | 
|         Dictionary<int, string> redpackSfxDict = new Dictionary<int, string>();  | 
|   | 
|         RedPacketModel redPackdata { get { return ModelCenter.Instance.GetModel<RedPacketModel>(); } }  | 
|         OSRedEnvelopeModel envelopeModel { get { return ModelCenter.Instance.GetModel<OSRedEnvelopeModel>(); } }  | 
|         FestivalRedpackModel festivalRedpackModel { get { return ModelCenter.Instance.GetModel<FestivalRedpackModel>(); } }  | 
|   | 
|         public override void Init()  | 
|         {  | 
|             ParseConfig();  | 
|             SysNotifyMgr.Instance.sysNotifyEvent += OnSystemNotifyEvent;  | 
|         }  | 
|   | 
|         public override void UnInit()  | 
|         {  | 
|   | 
|         }  | 
|   | 
|         public void OnPlayerLoginOk()  | 
|         {  | 
|             serverInited = true;  | 
|         }  | 
|   | 
|         public void OnBeforePlayerDataInitialize()  | 
|         {  | 
|             serverInited = false;  | 
|             m_RedEnvelopeDict.Clear();  | 
|             redpacks.Clear();  | 
|         }  | 
|   | 
|         bool serverInited = false;  | 
|   | 
|         Dictionary<int, RedEnvelope> m_RedEnvelopeDict = new Dictionary<int, RedEnvelope>();  | 
|         Dictionary<int, List<int>> redpacks = new Dictionary<int, List<int>>();  | 
|   | 
|         public event Action EnvelopeUpdateEvent;  | 
|         public event Action<int> EnvelopeGetEvent;  | 
|   | 
|         public void UpdateRedEnvelope(HA404_tagGCFamilyRedPacketInfo _pak)  | 
|         {  | 
|             for (int i = 0; i < _pak.Count; i++)  | 
|             {  | 
|                 var info = _pak.RedPacketInfo[i];  | 
|                 RedEnvelope _envelope = new RedEnvelope()  | 
|                 {  | 
|                     id = (int)info.RedPacketID,  | 
|                     player = (int)info.PlayerID,  | 
|                     playerName = info.Name,  | 
|                     time = info.Time,  | 
|                     job = info.PlayeJob,  | 
|                     moneyType = info.MoneyType,  | 
|                     moneyNum = (int)info.MoneyNum,  | 
|                     type = info.GetWay,  | 
|                     packCount = info.PacketCnt,  | 
|                     state = info.State,  | 
|                     Wish = UIHelper.ServerStringTrim(info.Wish),  | 
|                     face = (int)info.Face,  | 
|                     facePic = (int)info.FacePic,  | 
|                 };  | 
|   | 
|                 List<int> list;  | 
|                 if (!redpacks.TryGetValue(info.GetWay, out list))  | 
|                 {  | 
|                     list = new List<int>();  | 
|                     redpacks.Add(info.GetWay, list);  | 
|                 }  | 
|                 if (!list.Contains((int)info.RedPacketID))  | 
|                 {  | 
|                     list.Add((int)info.RedPacketID);  | 
|                 }  | 
|   | 
|                 m_RedEnvelopeDict[(int)info.RedPacketID] = _envelope;  | 
|                 if (EnvelopeGetEvent != null)  | 
|                 {  | 
|                     EnvelopeGetEvent(_envelope.id);  | 
|                 }  | 
|             }  | 
|             if (EnvelopeUpdateEvent != null)  | 
|             {  | 
|                 EnvelopeUpdateEvent();  | 
|             }  | 
|         }  | 
|   | 
|   | 
|         public void UpdateRedEnvelope(HA405_tagGCFamilyRedPacketGrabInfo vNetData)  | 
|         {  | 
|             RedEnvelope envelope;  | 
|             if (TryGetEnvelope((int)vNetData.RedPacketID, out envelope))  | 
|             {  | 
|                 if (envelope.packCount == vNetData.Count  | 
|                     && envelope.state != 3)  | 
|                 {  | 
|                     UpdateRedEnvelope(envelope, 3);  | 
|                 }  | 
|             }  | 
|             bool self = false;  | 
|             for (int i = 0; i < vNetData.Count; i++)  | 
|             {  | 
|                 if (UIHelper.ServerStringTrim(vNetData.GrabInfo[i].Name).Equals(  | 
|                     UIHelper.ServerStringTrim(PlayerDatas.Instance.baseData.PlayerName)))  | 
|                 {  | 
|                     self = true;  | 
|                     break;  | 
|                 }  | 
|             }  | 
|             if (vNetData.RedPacketID == cacheEnvelopeId)  | 
|             {  | 
|                 if (!envelope.Equals(default(RedEnvelope)))  | 
|                 {  | 
|                     if (envelope.type == FestivalRedpackModel.FESTIVALSYSTEMREDPACK1  | 
|                         || envelope.type == FestivalRedpackModel.FESTIVALSYSTEMREDPACK2)  | 
|                     {  | 
|                         if (!WindowCenter.Instance.IsOpen<RedpackSystemDetailsWin>())  | 
|                         {  | 
|                             envelopeSfx = vNetData.RedPacketID == envelopeSfx && self ? envelopeSfx : 0;  | 
|                             ModelCenter.Instance.GetModel<RedPacketModel>().redpackDetailId = (int)vNetData.RedPacketID;  | 
|                             WindowCenter.Instance.Open<RedpackSystemDetailsWin>();  | 
|                         }  | 
|                         cacheEnvelopeId = 0;  | 
|                         return;  | 
|                     }  | 
|                 }  | 
|                 if (!WindowCenter.Instance.IsOpen<RedDetailsTipsWin>())  | 
|                 {  | 
|                     envelopeSfx = vNetData.RedPacketID == envelopeSfx && self ? envelopeSfx : 0;  | 
|                     ModelCenter.Instance.GetModel<RedPacketModel>().redpackDetailId = (int)vNetData.RedPacketID;  | 
|                     WindowCenter.Instance.Open<RedDetailsTipsWin>();  | 
|                 }  | 
|                 cacheEnvelopeId = 0;  | 
|             }  | 
|         }  | 
|   | 
|         public void UpdateRedEnvelope(RedEnvelope envelope, int _state)  | 
|         {  | 
|             m_RedEnvelopeDict[(int)envelope.id] = new RedEnvelope()  | 
|             {  | 
|                 id = envelope.id,  | 
|                 player = envelope.player,  | 
|                 playerName = envelope.playerName,  | 
|                 time = envelope.time,  | 
|                 job = envelope.job,  | 
|                 moneyType = envelope.moneyType,  | 
|                 moneyNum = envelope.moneyNum,  | 
|                 type = envelope.type,  | 
|                 packCount = envelope.packCount,  | 
|                 state = _state,  | 
|                 Wish = UIHelper.ServerStringTrim(envelope.Wish),  | 
|                 face = envelope.face,  | 
|                 facePic = envelope.facePic,  | 
|             };  | 
|             if (EnvelopeUpdateEvent != null)  | 
|             {  | 
|                 EnvelopeUpdateEvent();  | 
|             }  | 
|         }  | 
|   | 
|         public event Action EnvelopeDelEvent;  | 
|   | 
|         public bool TryGetEnvelope(int _id,out RedEnvelope _envelope)  | 
|         {  | 
|             return m_RedEnvelopeDict.TryGetValue(_id, out _envelope);  | 
|         }  | 
|   | 
|         public void UpdateRedEnvelope(HAC05_tagGCRedPacketDel _pak)  | 
|         {  | 
|             for (int i = 0; i < _pak.Cnt; i++)  | 
|             {  | 
|                 var _id = (int)_pak.DelRedPacketID[i];  | 
|                 if (m_RedEnvelopeDict.ContainsKey(_id))  | 
|                 {  | 
|                     var type = m_RedEnvelopeDict[_id].type;  | 
|                     if (redpacks.ContainsKey(type))  | 
|                     {  | 
|                         var list = redpacks[type];  | 
|                         if (list.Contains(_id))  | 
|                         {  | 
|                             list.Remove(_id);  | 
|                         }  | 
|                     }  | 
|   | 
|                     m_RedEnvelopeDict.Remove(_id);  | 
|                 }  | 
|             }  | 
|             if (EnvelopeDelEvent != null)  | 
|             {  | 
|                 EnvelopeDelEvent();  | 
|             }  | 
|         }  | 
|   | 
|         public void SendGetEnvelope(int _id,int getWay)  | 
|         {  | 
|             RedEnvelope _envelope;  | 
|             if(m_RedEnvelopeDict.TryGetValue(_id,out _envelope))  | 
|             {  | 
|                 if (_envelope.state == 1)  | 
|                 {  | 
|                     CAB12_tagCMGrabFamilyRedPacket _pak = new CAB12_tagCMGrabFamilyRedPacket();  | 
|                     _pak.RedPaketID = (uint)_id;  | 
|                     _pak.GetWay = (byte)getWay;  | 
|                     GameNetSystem.Instance.SendInfo(_pak);  | 
|                 }  | 
|             }  | 
|         }  | 
|   | 
|         public bool TryGetLatestEnvelope(out RedEnvelope envelope)  | 
|         {  | 
|             envelope = default(RedEnvelope);  | 
|             bool _has = false;  | 
|             foreach (var _envelope in m_RedEnvelopeDict.Values)  | 
|             {  | 
|                 if (_envelope.state == 1)  | 
|                 {  | 
|                     envelope = _envelope;  | 
|                     _has = true;  | 
|                 }  | 
|             }  | 
|             return _has;  | 
|         }  | 
|   | 
|         public bool TryGetEnvelopes(int type, out List<int> list)  | 
|         {  | 
|             return redpacks.TryGetValue(type, out list);  | 
|         }  | 
|   | 
|         public void GetEnvelopes(int _type, ref List<int> _list)  | 
|         {  | 
|             _list.Clear();  | 
|             foreach (var _id in m_RedEnvelopeDict.Keys)  | 
|             {  | 
|                 if (m_RedEnvelopeDict[_id].type == _type)  | 
|                 {  | 
|                     _list.Add(_id);  | 
|                 }  | 
|             }  | 
|         }  | 
|   | 
|         public bool CheckEnvelopeLimit(int _id, bool _tip = false)  | 
|         {  | 
|             if (!m_RedEnvelopeDict.ContainsKey(_id))  | 
|             {  | 
|                 return false;  | 
|             }  | 
|             RedEnvelope _envelope = m_RedEnvelopeDict[_id];  | 
|             var _OSRedModel = ModelCenter.Instance.GetModel<OSRedEnvelopeModel>();  | 
|             var _OSRedType = _OSRedModel.OSRedEnvelopeType;  | 
|             if (_envelope.type == _OSRedType)  | 
|             {  | 
|                 if (TimeUtility.OpenDay >= _OSRedModel.openDays)  | 
|                 {  | 
|                     if (_tip)  | 
|                     {  | 
|                         SysNotifyMgr.Instance.ShowTip("ActiveOutTime");  | 
|                     }  | 
|                     return false;  | 
|                 }  | 
|                 if (_OSRedModel.getEnvelopeTimes <= 0)  | 
|                 {  | 
|                     if (_tip)  | 
|                     {  | 
|                         SysNotifyMgr.Instance.ShowTip("ActiveOutTime");  | 
|                     }  | 
|                     return false;  | 
|                 }  | 
|             }  | 
|             return true;  | 
|         }  | 
|   | 
|         public int cacheEnvelopeId = 0;  | 
|         public int envelopeSfx { get; set; }  | 
|         public void SendOpenRedpackPackage(int _id,int getWay)  | 
|         {  | 
|             cacheEnvelopeId = _id;  | 
|             CAB12_tagCMGrabFamilyRedPacket _pak = new CAB12_tagCMGrabFamilyRedPacket();  | 
|             _pak.RedPaketID = (uint)_id;  | 
|             _pak.GetWay = (byte)getWay;  | 
|             GameNetSystem.Instance.SendInfo(_pak);  | 
|         }  | 
|   | 
|   | 
|         #region 红包雨特效  | 
|         DateTime sfxRedpackTime = DateTime.Now;  | 
|   | 
|         private void OnSystemNotifyEvent(string _key, ArrayList list)  | 
|         {  | 
|             var config = SysInfoConfig.Get(_key);  | 
|             if (config != null && string.IsNullOrEmpty(config.richText))  | 
|             {  | 
|                 foreach (var key in redpackSfxDict.Keys)  | 
|                 {  | 
|                     if (_key.Equals(redpackSfxDict[key]))  | 
|                     {  | 
|                         var effectId = 0;  | 
|                         int.TryParse(config.effect, out effectId);  | 
|                         PlayRedpackSfx(key, effectId);  | 
|                         return;  | 
|                     }  | 
|                 }  | 
|             }  | 
|             if (_key.Equals("OSRedpackSfx") && list.Count > 0)  | 
|             {  | 
|                 var type = 0;  | 
|                 int.TryParse(list[0].ToString(), out type);  | 
|                 if (type != 0)  | 
|                 {  | 
|                     switch (type)  | 
|                     {  | 
|                         case 5:  | 
|                             CheckRedpackSfx(type);  | 
|                             break;  | 
|                         case FestivalRedpackModel.FESTIVALTASKREDPACKTYPE:  | 
|                             CheckFestivalRedpackSfx(type);  | 
|                             break;  | 
|                     }  | 
|                 }  | 
|             }  | 
|         }  | 
|   | 
|         public void CheckRedpackSfx(int type)  | 
|         {  | 
|             if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.OpenServerRedEnvelope))  | 
|             {  | 
|                 return;  | 
|             }  | 
|             if (envelopeModel.getEnvelopeTimes <= 0)  | 
|             {  | 
|                 return;  | 
|             }  | 
|             if (!serverInited)  | 
|             {  | 
|                 return;  | 
|             }  | 
|             if (!(StageLoad.Instance.currentStage is DungeonStage)  | 
|                 || WindowCenter.Instance.IsOpen<LoadingWin>())  | 
|             {  | 
|                 return;  | 
|             }  | 
|             if (DateTime.Now >= sfxRedpackTime)  | 
|             {  | 
|                 var _effect = EffectMgr.Instance.PlayUIEffect(5162, 4500, WindowCenter.Instance.uiRoot.tipsCanvas, false);  | 
|                 sfxRedpackTime = sfxRedpackTime.AddSeconds(_effect != null ? _effect.duration : 0);  | 
|             }  | 
|         }  | 
|   | 
|         public void PlayRedpackSfx(int type, int effectId)  | 
|         {  | 
|             if (!serverInited)  | 
|             {  | 
|                 return;  | 
|             }  | 
|             festivalRedpackModel.JudgePlayRedpackVoice(type);  | 
|             if (!(StageLoad.Instance.currentStage is DungeonStage)  | 
|                 || WindowCenter.Instance.IsOpen<LoadingWin>())  | 
|             {  | 
|                 return;  | 
|             }  | 
|             if (DateTime.Now >= sfxRedpackTime)  | 
|             {  | 
|                 var _effect = EffectMgr.Instance.PlayUIEffect(effectId, 4500, WindowCenter.Instance.uiRoot.tipsCanvas, false);  | 
|                 sfxRedpackTime = sfxRedpackTime.AddSeconds(2f);  | 
|             }  | 
|         }  | 
|   | 
|         public void CheckFestivalRedpackSfx(int type)  | 
|         {  | 
|             if (!festivalRedpackModel.IsOpen)  | 
|             {  | 
|                 return;  | 
|             }  | 
|             if (festivalRedpackModel.grabRedpackTimes <= 0)  | 
|             {  | 
|                 return;  | 
|             }  | 
|             if (!serverInited)  | 
|             {  | 
|                 return;  | 
|             }  | 
|             if (!(StageLoad.Instance.currentStage is DungeonStage)  | 
|                 || WindowCenter.Instance.IsOpen<LoadingWin>())  | 
|             {  | 
|                 return;  | 
|             }  | 
|             if (DateTime.Now >= sfxRedpackTime)  | 
|             {  | 
|                 var _effect = EffectMgr.Instance.PlayUIEffect(5162, 4500, WindowCenter.Instance.uiRoot.tipsCanvas, false);  | 
|                 sfxRedpackTime = sfxRedpackTime.AddSeconds(2f);  | 
|             }  | 
|         }  | 
|         #endregion  | 
|   | 
|         void ParseConfig()  | 
|         {  | 
|             var config = FuncConfigConfig.Get("OpenServerRedPacketRain");  | 
|             var json = LitJson.JsonMapper.ToObject(config.Numerical2);  | 
|             foreach (var key in json.Keys)  | 
|             {  | 
|                 var type = int.Parse(key);  | 
|                 redpackSfxDict.Add(type, json[key].ToString());  | 
|             }  | 
|         }  | 
|   | 
|         public struct RedEnvelope  | 
|         {  | 
|             public int id;  | 
|             public int player;  | 
|             public string playerName;  | 
|             public uint time;  | 
|             public int job;  | 
|             public int moneyType;  | 
|             public int moneyNum;  | 
|             public int type;  | 
|             public int packCount;  | 
|             public int state;        //0未发,1未领取,2已领取,3全部领完  | 
|             public string Wish;        //祝福语  | 
|             public int face;  | 
|             public int facePic;  | 
|         }  | 
|     }  | 
| }  | 
|   |