//-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Wednesday, December 12, 2018 //-------------------------------------------------------- using System; using System.Collections.Generic; using System.Linq; using vnxbqy.UI; //跨服PK奖励信息 public class Item_Class { public int ItemId; public int ItemNumber; public int Isbind; } public class SeasonAwardClass//赛季奖励 { public int DanLv; public string Name; public int Score; public List ItemList; } public struct ZoneRankingStruct { public int ZoneID; public int SeasonID; public override bool Equals(object obj) { var compare = (ZoneRankingStruct)obj; return this.ZoneID == compare.ZoneID && this.SeasonID == compare.SeasonID; } public override int GetHashCode() { return (ZoneID * 1000 + SeasonID).GetHashCode(); } } public class RankingInformationClass//排名信息 { public int Rankin;//名次 public int Realm;//境界 public int PlayerID;//玩家ID public string PlayerName;//玩家名 public int Job;//职业 public int Face; public int FacePic; public int Power;//战力 public int DanLv;//段位 public int PkScore;//积分 } public enum CrossRealmPKAwardStateEnum { DayPKCountAwardState = 1, DayWinCountAwardState = 2, DanLVAwardState = 3, SeasonAwardState = 4, } public class CrossServerOneVsOneRewardModel : Model, IBeforePlayerDataInitialize, IPlayerLoginOk { CrossServerOneVsOneModel crossServerModel { get { return ModelCenter.Instance.GetModel(); } } RankModel rankModel { get { return ModelCenter.Instance.GetModel(); } } public Dictionary SegmentRewardDic = new Dictionary();//段位奖励 public ImpactRankModel.RankAwardItem SeasonRewardDic = new ImpactRankModel.RankAwardItem();//赛季奖励 public Dictionary> SeasonRewardConfigDic = new Dictionary>(); //赛季的段位奖励(废弃) public Dictionary> ZoneRankingDic = new Dictionary>(); private List CrossRealmPKDanAwardList = new List(); public Action CrossRealmPKAwardStateUpdate;//领取奖励刷新 public Action RankInformationUpdate;//排行榜刷新 private uint DayPKCountAwardState; //每日匹配次数奖励记录 private uint DayWinCountAwardState; // 每日胜利次数奖励记录 private uint DanLVAwardState; // 段位达标奖励记录 private int SeasonAwardState; // 赛季结算奖励是否已领取 public int ZoneID = 0;//赛区ID public int SeasonID = 0;//赛季ID public int MyRank = -1;//我的排名 private const int Redpoint_key1 = 2130102;//段位奖励红点 public Redpoint redPointStre1 = new Redpoint(21301, Redpoint_key1); private const int Redpoint_key2 = 2130103;//赛季奖励红点 public Redpoint redPointStre2 = new Redpoint(21301, Redpoint_key2); private int MianOpenLV = 0;//跨服按钮开启条件 public string ZoneName = string.Empty;//赛区名 private int currentId = 0;//获取当前赛区ID private string crossZoneName = string.Empty;//赛区编号 public const int rankType = 165; public override void Init() { var config = FuncConfigConfig.Get("CrossServerIcon").Numerical1; MianOpenLV = int.Parse(config); CrossRealmPKDanAwardList = CrossRealmPKDanAwardConfig.GetValues(); rankModel.onRankRefresh -= OnRefreshRankList; rankModel.onRankRefresh += OnRefreshRankList; rankModel.onMyRankRefresh -= RankModel_onMyRankRefresh; rankModel.onMyRankRefresh += RankModel_onMyRankRefresh; } public void OnBeforePlayerDataInitialize() { currentId = 0; crossZoneName = string.Empty; ZoneID = 0; SeasonID = 0; PkDanLvNow = 0; SegmentRewardDic.Clear(); SeasonRewardConfigDic.Clear(); crossServerModel.UpdatePkResultEvent -= UpdatePkResultEvent; CrossServerOneVsOnePlayerInfo.Instance.UpdatePlayerInfoEvent -= UpdatePlayerInfoEvent; } public void OnPlayerLoginOk() { currentId = 0; crossZoneName = string.Empty; GetSeasonAward(); GetSegmentReward(); crossServerModel.UpdatePkResultEvent += UpdatePkResultEvent; CrossServerOneVsOnePlayerInfo.Instance.UpdatePlayerInfoEvent += UpdatePlayerInfoEvent; GetZoneName(); RedPointSeg(); RedPointSea(); if (CrossServerOneVsOnePKSeason.Instance.SeasonState == 2) { ViewCrossPKBillboard(CrossServerOneVsOnePKSeason.Instance.ZoneID, CrossServerOneVsOnePKSeason.Instance.SeasonID, true);//关于赛季查询 } } private void GetZoneName() { for (int i = 0; i < CrossServerOneVsOnePKSeason.Instance.ZoneCount; i++) { if (CrossServerOneVsOnePKSeason.Instance.ZoneIDList[i].ZoneID == CrossServerOneVsOnePKSeason.Instance.ZoneID) { ZoneName = UIHelper.ServerStringTrim(CrossServerOneVsOnePKSeason.Instance.ZoneIDList[i].ZoneName); } } } void OnRefreshRankList(int type) { if (type % 1000 == rankType) { CrossRealmPKBillboardInfo(type); } } private void RankModel_onMyRankRefresh(int type) { if (type % 1000 == rankType) { CrossRealmPKBillboardInfo(type); } } public override void UnInit() { } private void UpdatePlayerInfoEvent() { RedPointSeg(); RedPointSea(); } public bool IsShowCrossServerOneVsOne()//是否开启跨服按钮 { bool Isbool = false; if (PlayerDatas.Instance.baseData.LV >= MianOpenLV) { Isbool = true; } return Isbool; } private void UpdatePkResultEvent() { //if (CrossServerUtility.IsCrossServerOneVsOne() )//副本结算界面 { WindowCenter.Instance.Open(); } } public void GetSeasonAward()//赛季奖励数据获取 { var seasonID = CrossServerOneVsOnePKSeason.Instance.SeasonID; var configPK = CrossRealmPKDanAwardList; var result2 = false; for (int j = 0; j < configPK.Count; j++) { var _config = configPK[j]; if (CrossServerOneVsOnePKSeason.Instance.CrossZoneName != null) { bool result = CrossServerOneVsOnePKSeason.Instance.CrossZoneName.Equals(_config.CrossZoneName); if (result) { result2 = true; } } } if (CrossServerOneVsOnePKSeason.Instance.CrossZoneName != null && result2) { crossZoneName = CrossServerOneVsOnePKSeason.Instance.CrossZoneName; } if (seasonID == 0) { seasonID += 1; } if (currentId == seasonID && SegmentRewardDic.Count != 0) { return; } SegmentRewardDic.Clear(); for (int i = 0; i < configPK.Count; i++) { var _config = configPK[i]; bool result = crossZoneName.Equals(_config.CrossZoneName); if (!SegmentRewardDic.ContainsKey(_config.DanLV) && _config.SeasonID == seasonID && result) { SeasonAwardClass seasonAwardClass = new SeasonAwardClass(); seasonAwardClass.DanLv = _config.DanLV; var crossServerArena = CrossServerArenaConfig.Get(_config.DanLV); if (crossServerArena != null) { seasonAwardClass.Name = crossServerArena.Name; seasonAwardClass.Score = crossServerArena.LVUpScore; } var _jsonData = LitJson.JsonMapper.ToObject(_config.DanLVAwardList); List itemClassList = new List(); for (int j = 0; j < _jsonData.Count; j++) { Item_Class itemClass = new Item_Class(); itemClass.ItemId = int.Parse((_jsonData[j][0]).ToString()); itemClass.ItemNumber = int.Parse((_jsonData[j][1]).ToString()); itemClass.Isbind = int.Parse((_jsonData[j][2]).ToString()); itemClassList.Add(itemClass); } if (itemClassList.Count <= 0) { continue; } seasonAwardClass.ItemList = itemClassList; SegmentRewardDic.Add(_config.DanLV, seasonAwardClass); } } currentId = seasonID; } public void GetSegmentReward()//段位奖励 { var seasonID = CrossServerOneVsOnePKSeason.Instance.SeasonID; var configPK = CrossRealmPKDanAwardList; var result2 = false; for (int j = 0; j < configPK.Count; j++) { var _config = configPK[j]; if (CrossServerOneVsOnePKSeason.Instance.CrossZoneName != null) { bool result = CrossServerOneVsOnePKSeason.Instance.CrossZoneName.Equals(_config.CrossZoneName); if (result) { result2 = true; } } } if (CrossServerOneVsOnePKSeason.Instance.CrossZoneName != null && result2) { crossZoneName = CrossServerOneVsOnePKSeason.Instance.CrossZoneName; } if (seasonID == 0) { seasonID += 1; } if (currentId == seasonID && SeasonRewardDic.AwardDic.Count != 0) { return; } var crossRealmPKOrderAward = CrossRealmPKOrderAwardConfig.GetValues(); for (int i = 0; i < crossRealmPKOrderAward.Count; i++) { var _config = crossRealmPKOrderAward[i]; bool result = crossZoneName.Equals(_config.CrossZoneName); if (seasonID == _config.SeasonID && result) { ImpactRankModel.RankAwardItem _award = new ImpactRankModel.RankAwardItem(); var _jsonData = LitJson.JsonMapper.ToObject(_config.SeasonOrderAward); foreach (string key in _jsonData.Keys) { var _ranking = int.Parse(key); var _itemArray = LitJson.JsonMapper.ToObject(_jsonData[key].ToJson()); for (int j = 0; j < _itemArray.Length; j++) { _award.Add(_ranking, new Item(_itemArray[j][0], _itemArray[j][1])); } } SeasonRewardDic = _award; } } //--- //SeasonRewardConfigDic.Clear(); //for (int i = 0; i < configPK.Count; i++) //{ // var _config = configPK[i]; // bool result = crossZoneName.Equals(_config.CrossZoneName); // if (!SeasonRewardConfigDic.ContainsKey(_config.DanLV) && _config.SeasonID == seasonID && result) // { // var _jsonDataC = LitJson.JsonMapper.ToObject(_config.SeasonAwardList); // List itemClassList = new List(); // for (int j = 0; j < _jsonDataC.Count; j++) // { // Item_Class itemClass = new Item_Class(); // itemClass.ItemId = int.Parse((_jsonDataC[j][0]).ToString()); // itemClass.ItemNumber = int.Parse((_jsonDataC[j][1]).ToString()); // itemClass.Isbind = int.Parse((_jsonDataC[j][2]).ToString()); // itemClassList.Add(itemClass); // } // if (itemClassList.Count <= 0) // { // continue; // } // SeasonRewardConfigDic.Add(_config.DanLV, itemClassList); // } //} currentId = seasonID; } public void CrossRealmPKAwardState(HC102_tagMCCrossRealmPKAwardState info)//c102跨服PK玩家奖励记录 { DayPKCountAwardState = info.DayPKCountAwardState; DayWinCountAwardState = info.DayWinCountAwardState; DanLVAwardState = info.DanLVAwardState; SeasonAwardState = info.SeasonAwardState; if (CrossRealmPKAwardStateUpdate != null) { CrossRealmPKAwardStateUpdate(); } RedPointSeg(); RedPointSea(); } public bool IsAwardState(CrossRealmPKAwardStateEnum _cross, int Index)//是否已领取奖励 { bool _bool = false; if (_cross == CrossRealmPKAwardStateEnum.SeasonAwardState) { if (SeasonAwardState == 1) { _bool = true; } else { _bool = false; } } else { switch (_cross) { case CrossRealmPKAwardStateEnum.DayPKCountAwardState: _bool = MathUtility.GetBitValue(DayPKCountAwardState, (ushort)Index); break; case CrossRealmPKAwardStateEnum.DayWinCountAwardState: _bool = MathUtility.GetBitValue(DayWinCountAwardState, (ushort)Index); break; case CrossRealmPKAwardStateEnum.DanLVAwardState: _bool = MathUtility.GetBitValue(DanLVAwardState, (ushort)Index); break; } } return _bool; } public void CrossRealmPKGetAward(CrossRealmPKAwardStateEnum _cross, int Index)//领奖发包 { CC103_tagCMCrossRealmPKGetAward c103 = new CC103_tagCMCrossRealmPKGetAward(); c103.AwardType = (byte)_cross; c103.AwardData = (byte)Index; GameNetSystem.Instance.SendInfo(c103); } public void ViewCrossPKBillboard(int ZoneID, int SeasonID, bool isQuerySelf = false)//(赛区,赛季) 查看跨服竞技场赛季排行榜 { ZoneRankingStruct zoneRanking = new ZoneRankingStruct(); zoneRanking.ZoneID = ZoneID; zoneRanking.SeasonID = SeasonID; //int seasonIDNow = CrossServerOneVsOnePKSeason.Instance.SeasonID; if (ZoneRankingDic.ContainsKey(zoneRanking)) { if (RankInformationUpdate != null) { RankInformationUpdate(); } } //CC001_tagCGViewCrossPKBillboard c001 = new CC001_tagCGViewCrossPKBillboard(); //c001.ZoneID = (byte)ZoneID; //c001.SeasonID = (byte)SeasonID; //GameNetSystem.Instance.SendInfo(c001); if (isQuerySelf) rankModel.QueryCrossRank(rankType, ZoneID, watchID: (int)PlayerDatas.Instance.baseData.PlayerID, forceQuery: true, groupValue2:SeasonID); else { rankModel.ResetQueryParam(); rankModel.QueryCrossRank(rankType, ZoneID, groupValue2: SeasonID); } } public void CrossRealmPKBillboardInfo(int type)//跨服PK赛季排行榜 { var datas = rankModel.GetRankPageDatas(type); Dictionary RankInformationDic = new Dictionary(); ZoneRankingStruct zoneRank = new ZoneRankingStruct(); if (datas.Count > 0) { var keys = datas.Keys.ToList(); for (int i = 0; i < keys.Count; i++) { int index = keys[i]; var info = datas[index]; RankingInformationClass RankingInformation = new RankingInformationClass(); RankingInformation.PlayerID = (int)info.id; RankingInformation.PlayerName = info.name1; RankingInformation.Job = info.subType; RankingInformation.Face = (int)info.value3; RankingInformation.FacePic = (int)info.value4; RankingInformation.Power = 0; RankingInformation.Realm = (int)info.value1; RankingInformation.DanLv = (int)info.value2; RankingInformation.PkScore = (int)info.cmpValue; RankInformationDic[index] = RankingInformation; } } var myData = rankModel.GetMyRank(type); MyRank = myData != null ? myData.index : -1; //赛区3位+赛季3位+排行榜类型3位 zoneRank.ZoneID = type / 1000000; zoneRank.SeasonID = type/1000 % 1000; if (!ZoneRankingDic.ContainsKey(zoneRank)) { ZoneRankingDic.Add(zoneRank, RankInformationDic); } else { if (RankInformationDic.Count > 0) { ZoneRankingDic[zoneRank] = RankInformationDic; } } if (RankInformationUpdate != null) { RankInformationUpdate(); } } public static void ExitCrossRealm()//退出跨服副本 { var match = new CC104_tagCMExitCrossRealm(); GameNetSystem.Instance.SendToCrossServer(match); } private static int pkDanLvNow = 0; public static int PkDanLvNow//获取在跨服副本当前段位 { get { return pkDanLvNow; } set { pkDanLvNow = value; } } private void RedPointSeg()//段位奖励红点 { int Danlv = CrossServerOneVsOnePlayerInfo.Instance.DanLV; bool Isbool = false; foreach (var key in SegmentRewardDic.Keys) { if (Danlv >= SegmentRewardDic[key].DanLv && !IsAwardState(CrossRealmPKAwardStateEnum.DanLVAwardState, SegmentRewardDic[key].DanLv)) { Isbool = true; } } if (Isbool) { redPointStre1.state = RedPointState.Simple; } else { redPointStre1.state = RedPointState.None; } CrossServerUtility.UpdateCrossServerRedpoint(); } private void RedPointSea()//赛季奖励红点 { bool Isbool = false; int Danlv = CrossServerOneVsOnePlayerInfo.Instance.DanLV; bool isbool = IsAwardState(CrossRealmPKAwardStateEnum.SeasonAwardState, -1); int Number = 0; foreach (var key in SeasonRewardDic.AwardDic.Keys) { Number = key; } if (CrossServerOneVsOnePKSeason.Instance.SeasonState == 2 && CrossServerOneVsOnePlayerInfo.Instance.Score != 0 && !isbool) { if ((MyRank > -1 && MyRank < Number) || SeasonRewardConfigDic.ContainsKey(Danlv)) { Isbool = true; } } if (Isbool) { redPointStre2.state = RedPointState.Simple; } else { redPointStre2.state = RedPointState.None; } CrossServerUtility.UpdateCrossServerRedpoint(); } private static int m_PkType = 0; public static int PkType { get { return m_PkType; } set { m_PkType = value; } } public static void SetPkType() { if (m_PkType != 1) { DTCA202_tagMCAttackMode.Send_SwitchAttackMode((E_AttackMode)m_PkType); } else { DTCA202_tagMCAttackMode.Send_SwitchAttackMode((E_AttackMode)0); } } }