using LitJson; using System; using System.Collections.Generic; using System.Linq; using System.Text; using UnityEditor; using UnityEngine; namespace vnxbqy.UI { public class FairySiegeActModel : Model, IBeforePlayerDataInitialize, IPlayerLoginOk, IOpenServerActivity { public static Operation operaTypeCross = Operation.default53; public static int crossRoundRankType = 169; //跨服轮次伤害排行 public static int crossRankType = 168; //跨服个人排行 public static int crossFamilyRankType = 167; //跨服仙盟排行 public OperationFairySiegeCross operationCrossAct; readonly int regesitCrossType = (int)NewDayActivityID.FairySiegeActCross; public event Action UpdateFlowStateEvent; public readonly int joinListFairyRowMax = 2; public readonly int joinListPlayerRowMax = 2; public int matchRoundMax; //最大轮次 public int showBatType; //当前展示的战场类型 public int showBatGroup; //当前展示的战场组别 public uint showCityId; //当前进入的城池ID public FairySiegeBatSceneInfo nowInfo = new FairySiegeBatSceneInfo(); //当前战场信息 public Action UpdateSummonDragonFrameAction; // 轮次分组信息 public int matchRound; // 第x轮的分组,从1开始,没有在对应轮次战场分组里的视为没有该轮次的参赛资格 //<战场类型,<分组编号,仙盟ID列表>> public Dictionary> batGroupInfo = new Dictionary>(); // 玩家信息 public int contributionCnt; // 轮次低级捐献已捐献次数,轮次变更时会重置 public int energy; // 当前可用免费体力 public uint energyTime; // 上次恢复免费体力时间戳,为0时不再恢复 public uint awardState; // 活动奖励领取状态,按二进制位判断是否已领取,0-竞猜奖励;1-个人排行奖励;2-仙盟排名奖励; public event Action UpdateFamilyGCZPlayerInfoEvent; //仙盟攻城战玩家信息更新 public int energyMax;//免费体力上限 public int energyRecIntervalMin;//多久恢复1点体力,时间分钟 public event Action UpdateFamilyGCZBatGroupInfoEvent; PackModel packModel { get { return ModelCenter.Instance.GetModel(); } } FairySiegeHelpModel fairySiegeHelpModel { get { return ModelCenter.Instance.GetModel(); } } public Dictionary> killDefMemRewardDict = new Dictionary>(); //击杀防守成员额外奖励库列表[[权重, [物品ID, 个数, 是否拍品]], ...] RankModel rankModel { get { return ModelCenter.Instance.GetModel(); } } VipModel vipModel { get { return ModelCenter.Instance.GetModel(); } } StoreModel storeModel { get { return ModelCenter.Instance.GetModel(); } } public int AllSeconds { get { TimeSpan t = ILTimeUtility.ServerCrossNow - TimeUtility.OriginalTime; return (int)t.TotalSeconds; } } public bool IsError() { OperationFairySiegeCross act; OperationTimeHepler.Instance.TryGetOperation(operaTypeCross, out act); if (act == null) return false; if (act.StateError != 0) return false; return true; } #region build-in public override void Init() { InitRedPoint(); InitTable(); OperationTimeHepler.Instance.operationStartEvent += OperationStartEvent; OperationTimeHepler.Instance.operationEndEvent += OperationEndEvent; OpenServerActivityCenter.Instance.Register(regesitCrossType, this, (int)OpenServerActivityCenter.ActivityType.AT_Activity2); OperationTimeHepler.Instance.operationTimeUpdateEvent += operationTimeUpdateEvent; RedpointCenter.Instance.redpointValueChangeEvent += OnRedpointChange; packModel.refreshItemCountEvent += OnRefreshItemCountEvent; PlayerDatas.Instance.playerDataRefreshEvent += OnPlayerDataRefreshEvent; GlobalTimeEvent.Instance.secondEvent += OnSecondEvent; UpdateAwardInfoAction += OnUpdateAwardInfoAction; rankModel.onMyRankRefresh += RankModel_onMyRankRefresh; UpdateCampInfoEvent += OnUpdateCampInfoEvent; vipModel.rechargeCountEvent += VipModel_rechargeCountEvent; storeModel.RefreshBuyShopLimitEvent += RefreshBuyShopLimitEvent; } public override void UnInit() { OperationTimeHepler.Instance.operationStartEvent -= OperationStartEvent; OperationTimeHepler.Instance.operationEndEvent -= OperationEndEvent; OperationTimeHepler.Instance.operationTimeUpdateEvent -= operationTimeUpdateEvent; RedpointCenter.Instance.redpointValueChangeEvent -= OnRedpointChange; packModel.refreshItemCountEvent -= OnRefreshItemCountEvent; PlayerDatas.Instance.playerDataRefreshEvent -= OnPlayerDataRefreshEvent; GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent; UpdateAwardInfoAction -= OnUpdateAwardInfoAction; rankModel.onMyRankRefresh -= RankModel_onMyRankRefresh; UpdateCampInfoEvent -= OnUpdateCampInfoEvent; vipModel.rechargeCountEvent -= VipModel_rechargeCountEvent; storeModel.RefreshBuyShopLimitEvent -= RefreshBuyShopLimitEvent; } private void RefreshBuyShopLimitEvent() { UpdateRedpoint(); } private void VipModel_rechargeCountEvent(int obj) { OperationFamilyRechargeConn act; OperationTimeHepler.Instance.TryGetOperation(FairySiegeHelpModel.operaType, out act); if (act == null || act.ctgIDs.IsNullOrEmpty() || !act.ctgIDs.Contains(obj)) return; UpdateRedpoint(); } public void OnBeforePlayerDataInitialize() { no1PlayerIDCross = 0; no1PlayerIDCrossFamily = 0; isSpringAuto = false; isWaitSpringPack = false; isWaitC030Pack = false; } public void OnPlayerLoginOk() { InitAtkEffectId(); InitAtkEffectDelay(); InitAtkEffectDuration(); } #endregion private void InitTable() { pushItemList = JsonMapper.ToObject(FuncConfigConfig.Get("FamilyGCZPush").Numerical1); var jsonData = JsonMapper.ToObject(FuncConfigConfig.Get("FamilyGCZAtk1").Numerical1); foreach (var key in jsonData.Keys) { atkEffectDict.Add(int.Parse(key), int.Parse(jsonData[key].ToJson())); } jsonData = JsonMapper.ToObject(FuncConfigConfig.Get("FamilyGCZAtk1").Numerical2); foreach (var key in jsonData.Keys) { atkEffectDelayDict.Add(int.Parse(key), float.Parse(jsonData[key].ToJson())); } jsonData = JsonMapper.ToObject(FuncConfigConfig.Get("FamilyGCZAtk1").Numerical3); foreach (var key in jsonData.Keys) { atkEffectDurationDict.Add(int.Parse(key), float.Parse(jsonData[key].ToJson())); } jsonData = JsonMapper.ToObject(FuncConfigConfig.Get("FamilyGCZGroupSet").Numerical1); foreach (string participantCountStr in jsonData.Keys) { int participantCount = int.Parse(participantCountStr); var roundDict = new Dictionary>(); JsonData roundsData = jsonData[participantCountStr]; foreach (string roundStr in roundsData.Keys) { int round = int.Parse(roundStr); var battleTypeDict = new Dictionary(); JsonData battleTypesData = roundsData[roundStr]; foreach (string battleTypeStr in battleTypesData.Keys) { int battleType = int.Parse(battleTypeStr); JsonData ruleArray = battleTypesData[battleTypeStr]; int[] rule = new int[ruleArray.Count]; for (int i = 0; i < ruleArray.Count; i++) { rule[i] = (int)ruleArray[i]; } battleTypeDict.Add(battleType, rule); } roundDict.Add(round, battleTypeDict); } matchRuleDict.Add(participantCount, roundDict); } jsonData = JsonMapper.ToObject(FuncConfigConfig.Get("FamilyGCZGroupSet").Numerical2); foreach (string battlefieldTypeStr in jsonData.Keys) { int battlefieldType = int.Parse(battlefieldTypeStr); var rankScoreDict = new Dictionary(); JsonData rankScores = jsonData[battlefieldTypeStr]; foreach (string rankStr in rankScores.Keys) { int rank = int.Parse(rankStr); int score = (int)rankScores[rankStr]; rankScoreDict.Add(rank, score); } rankToScoreRawDict.Add(battlefieldType, rankScoreDict); } summonRewardArr = JsonMapper.ToObject(FuncConfigConfig.Get("FamilyGCZAtkAward").Numerical3); flztSkillItemId = int.Parse(FuncConfigConfig.Get("FamilyGCZAtk").Numerical4); flztSkillRate = int.Parse(FuncConfigConfig.Get("FamilyGCZAtk").Numerical3); flztSkillAtkCityCnt = int.Parse(FuncConfigConfig.Get("FamilyGCZAtk2").Numerical1); ltwjSkillItemId = int.Parse(FuncConfigConfig.Get("FamilyGCZAtk").Numerical4); ltwjSkillRate = int.Parse(FuncConfigConfig.Get("FamilyGCZAtk").Numerical3); ltwjSkillAtkCityCnt = int.Parse(FuncConfigConfig.Get("FamilyGCZAtk2").Numerical2); lowDonateMoneyType = int.Parse(FuncConfigConfig.Get("FamilyGCZContributionLow").Numerical1); lowDonateNeedMoneyArr = JsonMapper.ToObject(FuncConfigConfig.Get("FamilyGCZContributionLow").Numerical2); lowDonateOnceExpAdd = int.Parse(FuncConfigConfig.Get("FamilyGCZContributionLow").Numerical3); jsonData = JsonMapper.ToObject(FuncConfigConfig.Get("FamilyGCZContributionLow").Numerical4); for (int i = 0; i < jsonData.Count; i++) { JsonData item = jsonData[i]; int weight = int.Parse(item[0].ToString()); JsonData rewardData = item[1]; int[] reward = new int[3]; reward[0] = int.Parse(rewardData[0].ToString()); // 物品ID reward[1] = int.Parse(rewardData[1].ToString()); // 个数 reward[2] = int.Parse(rewardData[2].ToString()); // 是否拍品 if (!lowDonateRewardDict.ContainsKey(weight)) { lowDonateRewardDict[weight] = new List(); } lowDonateRewardDict[weight].Add(reward); } highDonateItemId = int.Parse(FuncConfigConfig.Get("FamilyGCZContributionHigh").Numerical1); highDonateOnceExpAdd = int.Parse(FuncConfigConfig.Get("FamilyGCZContributionHigh").Numerical2); jsonData = JsonMapper.ToObject(FuncConfigConfig.Get("FamilyGCZContributionHigh").Numerical3); for (int i = 0; i < jsonData.Count; i++) { JsonData item = jsonData[i]; int weight = int.Parse(item[0].ToString()); JsonData rewardData = item[1]; int[] reward = new int[3]; reward[0] = int.Parse(rewardData[0].ToString()); // 物品ID reward[1] = int.Parse(rewardData[1].ToString()); // 个数 reward[2] = int.Parse(rewardData[2].ToString()); // 是否拍品 if (!highDonateRewardDict.ContainsKey(weight)) { highDonateRewardDict[weight] = new List(); } highDonateRewardDict[weight].Add(reward); } jsonData = JsonMapper.ToObject(FuncConfigConfig.Get("FamilyGCZAtkAward").Numerical4); for (int i = 0; i < jsonData.Count; i++) { JsonData item = jsonData[i]; int weight = int.Parse(item[0].ToString()); JsonData rewardData = item[1]; int[] reward = new int[3]; reward[0] = int.Parse(rewardData[0].ToString()); // 物品ID reward[1] = int.Parse(rewardData[1].ToString()); // 个数 reward[2] = int.Parse(rewardData[2].ToString()); // 是否拍品 if (!killDefMemRewardDict.ContainsKey(weight)) { killDefMemRewardDict[weight] = new List(); } killDefMemRewardDict[weight].Add(reward); } springCostItemId = int.Parse(FuncConfigConfig.Get("FamilyGCZItem").Numerical1); springAutoIntervalSec = float.Parse(FuncConfigConfig.Get("FamilyGCZSQ").Numerical1); springHasRewardCnt = int.Parse(FuncConfigConfig.Get("FamilyGCZSQ").Numerical2); atkCostItemId = int.Parse(FuncConfigConfig.Get("FamilyGCZAtk").Numerical2); guessFlowIDArr = JsonMapper.ToObject(FuncConfigConfig.Get("FamilyGCZGuess").Numerical1); guessNameListCnt = int.Parse(FuncConfigConfig.Get("FamilyGCZGuess").Numerical2); guessMaxChooseCnt = int.Parse(FuncConfigConfig.Get("FamilyGCZGuess").Numerical3); energyMax = int.Parse(FuncConfigConfig.Get("FamilyGCZEnergy").Numerical1); energyRecIntervalMin = int.Parse(FuncConfigConfig.Get("FamilyGCZEnergy").Numerical2); attackInterval = int.Parse(FuncConfigConfig.Get("FamilyGCZAtk1").Numerical4); } private void OnUpdateCampInfoEvent() { TryOpenPromotionWinOnline(); } public FairySiegeCampRound newCampRound = null; public void TryOpenPromotionWinOnline() { int stateValue; if (!TryGetCurrentStateValue(out stateValue)) return; int state = GetStateByStateValue(stateValue);//0 公示期 1 备战期 2 开战期 3 休战期 4 领奖期 int roundNum = GetRoundNumByStateValue(stateValue); if (state == 0 || state == 1 || state == 2) return; if (state == 3) { //当前轮次已经展示过 if (GetRoundEndShow(roundNum)) return; } else if (state == 4) { //最后一轮的已经展示过 if (GetRoundEndShow(matchRoundMax)) return; } TryGetNewCampRound(out newCampRound); if (newCampRound == null || newCampRound.UpdownState <= 0 || newCampRound.UpdownState > 3) return; if (newCampRound.RoundNum == matchRoundMax) { if (!WindowCenter.Instance.IsOpen()) { WindowCenter.Instance.Open(); } return; } //0-未处理;1-降级;2-保级;3-晋级 switch (newCampRound.UpdownState) { case 1: if (!WindowCenter.Instance.IsOpen()) { WindowCenter.Instance.Open(); } break; case 2: if (!WindowCenter.Instance.IsOpen()) { WindowCenter.Instance.Open(); } break; case 3: if (!WindowCenter.Instance.IsOpen()) { WindowCenter.Instance.Open(); } break; } } public bool IsOpen { get { return OperationTimeHepler.Instance.SatisfyOpenCondition(operaTypeCross, ILTimeUtility.ServerCrossNow); } } //是否参与活动时间,由跨服封包决定,以跨服时间为准 public bool IsJoin { get { return OperationTimeHepler.Instance.SatisfyJoinCondition(operaTypeCross, ILTimeUtility.ServerCrossNow); } } public bool IsPrepareTime { get { if (!IsOpen) return false; return OperationTimeHepler.Instance.IsPrepareTime(operaTypeCross, ILTimeUtility.ServerCrossNow); } } //是否展示结果时间, 以跨服时间为准(前提为以判断是活动中) public bool IsResultShowTime { get { if (operationCrossAct == null) return false; return operationCrossAct.IsShowResultTime(); } } public bool IsAdvance { get { return false; } } public bool priorityOpen { get { return false; } } private void OnRedpointChange(int id) { if (id == MainRedDot.RankActRepoint) { parentRedpoint.state = RedpointCenter.Instance.GetRedpointState(MainRedDot.RankActRepoint); } } private void OperationEndEvent(Operation operationType, int state) { if (operationType == operaTypeCross && state == 0) { if (onStateUpdate != null) { onStateUpdate(regesitCrossType); } WindowCenter.Instance.Close(); } } private void OperationStartEvent(Operation operationType, int state) { if (operationType == operaTypeCross && state == 0) { if (onStateUpdate != null) { onStateUpdate(regesitCrossType); } } } private void operationTimeUpdateEvent(Operation obj) { if (obj != operaTypeCross) return; OperationBase operationBase1; if (OperationTimeHepler.Instance.TryGetOperationTime(operaTypeCross, out operationBase1)) { operationCrossAct = operationBase1 as OperationFairySiegeCross; } if (operationCrossAct != null) { matchRoundMax = GetCurrentMatchRoundMax(); UpdateRedpoint(); PopUpWin(); TryQueryMyRank(); } } public RankData myRankInfo; private void UpdateRankPlayerRedpoint() { int stateValue; if (!TryGetCurrentStateValue(out stateValue)) return; int state = GetStateByStateValue(stateValue); if (state != 4) return; if (!TryGetRedpoint(FairySiegeRedPointType.RankAwardPlayer, out Redpoint redpoint)) return; redpoint.state = RedPointState.None; myRankInfo = rankModel.GetMyRankByID(crossRankType, (int)PlayerDatas.Instance.baseData.PlayerID); if (myRankInfo != null && !IsHaveAward(1)) { redpoint.state = RedPointState.Simple; } } public RankData myFamilyRankInfo; private void UpdateRankFamilyRedpoint() { int stateValue; if (!TryGetCurrentStateValue(out stateValue)) return; int state = GetStateByStateValue(stateValue); if (state != 4) return; if (!TryGetRedpoint(FairySiegeRedPointType.RankAwardFamily, out Redpoint redpoint)) return; redpoint.state = RedPointState.None; myFamilyRankInfo = rankModel.GetMyRankByID(crossFamilyRankType, (int)PlayerDatas.Instance.baseData.FamilyId); if (myFamilyRankInfo != null && !IsHaveAward(2)) { redpoint.state = RedPointState.Simple; } } bool isSendQueryMyRank = false; //是否已经定时发送过查询我的排名请求 private void TryQueryMyRank() { if (isSendQueryMyRank) return; // 没有参赛资格 if (!hasQualification()) return; int stateValue; if (!TryGetCurrentStateValue(out stateValue)) return; int state = GetStateByStateValue(stateValue); if (state != 4) return; SendMyRank(); isSendQueryMyRank = true; } private int checkQueryStartTime = 60; //进入领奖期后300s内每秒判定随机执行,如果没执行300s后立即执行一次 bool isTimeSendQueryMyRank = false; //是否已经定时发送过查询我的排名请求 private void TryTimeQueryMyRank() { if (isSendQueryMyRank) return; if (isTimeSendQueryMyRank) return; // 没有参赛资格 if (!hasQualification()) return; int stateValue; if (!TryGetCurrentStateValue(out stateValue)) return; int state = GetStateByStateValue(stateValue); if (state != 4) return; if (!TryGetStartTimeByStateValue(stateValue, out DateTime startTime)) return; int time = (int)(ILTimeUtility.ServerCrossNow - startTime).TotalSeconds; if (time <= 0) return; if (time > checkQueryStartTime) { //如果没执行60s后立即执行一次 if (!isSendQueryMyRank) { SendMyRank(); isTimeSendQueryMyRank = true; } } else { if (UnityEngine.Random.Range(0f, 1f) < 0.6f) { SendMyRank(); isTimeSendQueryMyRank = true; } } } private void SendMyRank() { rankModel.QueryCrossRank(FairySiegeActModel.crossRankType, operationCrossAct.zoneID, watchID: (int)PlayerDatas.Instance.baseData.PlayerID, forceQuery: true); rankModel.QueryCrossRank(FairySiegeActModel.crossFamilyRankType, operationCrossAct.zoneID, watchID: (int)PlayerDatas.Instance.baseData.FamilyId, forceQuery: true); } bool isFirst = true; public void PopUpWin() { if (!IsError()) return; if (!isFirst) return; isFirst = false; //选中今日不再提示 if (isPushDaySkip) return; PopupWindowsProcessor.Instance.Add("FairySiegePushWin"); } private void OnRefreshItemCountEvent(PackType type, int arg2, int arg3) { if (type != PackType.Item) return; if (arg3 == flztSkillItemId || arg3 == ltwjSkillItemId || arg3 == highDonateItemId || arg3 == springCostItemId || arg3 == atkCostItemId) { UpdateRedpoint(); } } private void OnPlayerDataRefreshEvent(PlayerDataType type) { if (type != PlayerDataType.GoldPaper) return; UpdateRedpoint(); } public void OnSecondEvent() { TryTimeQueryMyRank(); } private void RankModel_onMyRankRefresh(int type) { if (type == crossRankType) { UpdateRankPlayerRedpoint(); } else if (type == crossFamilyRankType) { UpdateRankFamilyRedpoint(); } } public bool GetRoundEndShow(int roundNum) { var key = GetRoundEndShowKey(roundNum); return LocalSave.GetBool(key); } public void SetRoundEndShow(int roundNum, bool value = true) { var key = GetRoundEndShowKey(roundNum); LocalSave.SetBool(key, value); } public void TrySetRoundEndShow() { if (!TryGetCurrentStateValue(out var stateValue)) return; int roundNum = GetNowRoundNumByStateValue(stateValue); if (roundNum <= 0) return; SetRoundEndShow(roundNum); } public string GetRoundEndShowKey(int roundNum) { if (operationCrossAct == null) return string.Empty; return StringUtility.Contact("FairySiegeRoundEndShow", "_", operationCrossAct.actID, "_", roundNum, "_", PlayerDatas.Instance.baseData.PlayerID); } #region 通用 public bool TryGetStartTimeByStateValue(int stateValue, out DateTime startTime) { startTime = new DateTime(); if (operationCrossAct == null) return false; if (!ActTimeFlowConfig.TryGetID(operationCrossAct.ActFlowID, stateValue, out int id)) return false; return TryGetStartTimeById(id, out startTime); } public bool TryGetEndTimeByStateValue(int stateValue, out DateTime endTime) { endTime = new DateTime(); if (operationCrossAct == null) return false; if (!ActTimeFlowConfig.TryGetID(operationCrossAct.ActFlowID, stateValue, out int id)) return false; return TryGetEndTimeById(id, out endTime); } public bool TryGetStartTimeById(int id, out DateTime startTime) { startTime = new DateTime(); if (!ActTimeFlowConfig.Has(id)) return false; ActTimeFlowConfig config = ActTimeFlowConfig.Get(id); if (operationCrossAct == null) return false; startTime = new DateTime(operationCrossAct.startDate.year, operationCrossAct.startDate.month, operationCrossAct.startDate.day, 0, 0, 0); startTime = startTime.AddDays(Mathf.Max(config.StartDay - 1, 0)).AddHours(config.StartHour).AddMinutes(config.StartMinute); return true; } public bool TryGetEndTimeById(int id, out DateTime endTime) { endTime = new DateTime(); if (!ActTimeFlowConfig.Has(id)) return false; ActTimeFlowConfig config = ActTimeFlowConfig.Get(id); if (operationCrossAct == null) return false; endTime = new DateTime(operationCrossAct.startDate.year, operationCrossAct.startDate.month, operationCrossAct.startDate.day, 0, 0, 0); endTime = endTime.AddDays(Mathf.Max(config.EndDay - 1, 0)).AddHours(config.EndHour).AddMinutes(config.EndMinute).AddSeconds(59); return true; } //仙盟攻城战3轮:1-公式期;99-领奖期;轮次状态=轮次*10+轮次阶段;轮次阶段:1-分组战备;2-战斗;3-休战结算 public bool TryGetCurrentStateValue(out int stateValue) { stateValue = 0; if (operationCrossAct == null) return false; Dictionary idDict; if (!ActTimeFlowConfig.TryGetFlowIDInfo(operationCrossAct.ActFlowID, out idDict)) return false; var list = idDict.Keys.ToList(); list.Sort(); DateTime nowTime = ILTimeUtility.ServerCrossNow; DateTime startDate = new DateTime(operationCrossAct.startDate.year, operationCrossAct.startDate.month, operationCrossAct.startDate.day, 0, 0, 0); DateTime endDate = new DateTime(operationCrossAct.endDate.year, operationCrossAct.endDate.month, operationCrossAct.endDate.day, 23, 59, 59); if (nowTime < startDate || nowTime > endDate) return false; foreach (var nowStateValue in list) { int id = idDict[nowStateValue]; DateTime startTime; if (!TryGetStartTimeById(id, out startTime)) continue; if (startTime > nowTime) break; stateValue = ActTimeFlowConfig.Get(id).StateValue; } return list.Contains(stateValue); } //0 公示期 1 备战期 2 开战期 3 休战期 4 领奖期 public int GetStateByStateValue(int stateValue) { if (stateValue == 1) return 0; if (stateValue == 99) return 4; return stateValue % 10; } public int GetRoundNumByStateValue(int stateValue) { if (stateValue == 1) return 0; if (stateValue == 99) return 0; return stateValue / 10; } public int GetNowRoundNumByStateValue(int stateValue) { if (stateValue == 1) return 0; if (stateValue == 99) return GetCurrentMatchRoundMax(); return stateValue / 10; } private int GetCurrentMatchRoundMax() { if (operationCrossAct == null) return 0; Dictionary idDict; if (!ActTimeFlowConfig.TryGetFlowIDInfo(operationCrossAct.ActFlowID, out idDict)) return 0; var list = idDict.Keys.ToList(); //仙盟攻城战3轮:1-公式期;99-领奖期; if (list.Contains(1)) { list.Remove(1); } if (list.Contains(99)) { list.Remove(99); } list.Sort(); list.Reverse(); int maxStateValue = list[0]; int roundMax = maxStateValue / 10;//轮次状态=轮次*10+轮次阶段;轮次阶段:1-分组战备;2-战斗;3-休战结算 return roundMax; } public string GetRemainTime() { var nowTime = ILTimeUtility.CSAllSeconds; if (!TryGetCurrentStateValue(out int stateValue)) return string.Empty; int state = GetStateByStateValue(stateValue);// 0 公示期 1 备战期 2 开战期 3 休战期 4 领奖期 switch (state) { case 0: return GetRemainCountdownStr("FairySiege006", stateValue); case 1: return GetRemainCountdownStr("FairySiege003", stateValue); case 2: return GetRemainCountdownStr("FairySiege117", stateValue); case 3: return GetRemainCountdownStr("FairySiege118", stateValue); case 4: return GetRemainCountdownStr("FairySiege005", stateValue); } return string.Empty; } public string GetRemainCountdownStr(string key, int stateValue) { if (!TryGetEndTimeByStateValue(stateValue, out DateTime endTime)) return string.Empty; int time = (int)(endTime - ILTimeUtility.ServerCrossNow).TotalSeconds; if (time <= 0) return string.Empty; return Language.Get(key, TimeUtility.SecondsToDHMS(time)); } private int GetDamageNumKey(string _pattern, int _num) { var config = DamageNumConfig.Get(_pattern); //.的ASCII码是46 if (_num == 46) { return config.nums[10]; } //k的ASCII码是107 else if (_num == 107) { return config.nums[11]; } //m的ASCII码是109 else if (_num == 109) { return config.nums[12]; } //b的ASCII码是98 else if (_num == 98) { return config.nums[13]; } //t的ASCII码是116 else if (_num == 116) { return config.nums[14]; } return config.nums[_num - 48]; } public string DisplayDamageNum(long num, string key = "EnemyAttack") { var basePowerStr = UIHelper.ReplaceLargeArtNum(num); var result = string.Empty; for (int i = 0; i < basePowerStr.Length; i++) { var numChar = (char)GetDamageNumKey(key, basePowerStr[i]); if (numChar > 0) { result += numChar; } } return result; } //展示称号 public void DisplayTitle(ImageEx imgTitle, UIFrame frame, int titleId) { if (!DienstgradConfig.Has(titleId)) { DebugEx.LogError($"称号表不存在key:{titleId}"); return; } var config = DienstgradConfig.Get(titleId); DisplayDynamicImage(imgTitle, frame, config.Image); } //展示动态图 public void DisplayDynamicImage(ImageEx image, UIFrame frame, string str) { if (UIFrameMgr.Inst.ContainsDynamicImage(str)) { var spriteList = UIFrameMgr.Inst.GetDynamicImage(str); if (!spriteList.IsNullOrEmpty()) image.rectTransform.sizeDelta = new Vector2(spriteList[0].rect.width, spriteList[0].rect.height); frame.ResetFrame(str); frame.enabled = true; } else { frame.enabled = false; image.SetSprite(str); } } // 玩家是否有资格参赛 public bool hasQualification() { // 玩家ID是否在防守成员名单里面 // 特殊情况: 玩家当前盟ID在锁定盟名单里,但是玩家不在该盟的成员名单里,也没有参与资格 // 这种一般是锁定名单后才加入该盟的,同样视为没有参与资格 return campMemberDict != null && campMemberDict.ContainsKey(PlayerDatas.Instance.PlayerId); } public bool IsRankImageDisplay(int rankNum) { return rankNum > 0 && rankNum < 4; } public string GetRankNumImage(int rankNum) { return StringUtility.Contact("RankNum", rankNum); } #endregion #region 红点管理 public Redpoint parentRedpoint = new Redpoint(MainRedDot.FairySiegeRepoint); public Dictionary redPointDict = new Dictionary(); public int GetRedpointId(FairySiegeRedPointType type) { return MainRedDot.FairySiegeRepoint * 10000 + (int)type; } public bool TryGetRedpoint(FairySiegeRedPointType type, out Redpoint redpoint) { var id = GetRedpointId(type); return redPointDict.TryGetValue(id, out redpoint); } public void InitRedPoint() { var mainRedPoints = new[] { FairySiegeRedPointType.RankAward, FairySiegeRedPointType.Guess, FairySiegeRedPointType.Gift, FairySiegeRedPointType.Help, FairySiegeRedPointType.Base, FairySiegeRedPointType.Spring, FairySiegeRedPointType.Go, FairySiegeRedPointType.Like, }; foreach (var redPointType in mainRedPoints) { var id = GetRedpointId(redPointType); redPointDict[id] = new Redpoint(MainRedDot.FairySiegeRepoint, id); } // 初始化子红点及其父节点关系 //<子节点,父节点> var childRedPoints = new Dictionary { { FairySiegeRedPointType.GuessAward, FairySiegeRedPointType.Guess }, { FairySiegeRedPointType.BaseTabCity, FairySiegeRedPointType.Base }, { FairySiegeRedPointType.BaseLowContribution, FairySiegeRedPointType.BaseTabCity }, { FairySiegeRedPointType.BaseHighContribution, FairySiegeRedPointType.BaseTabCity }, { FairySiegeRedPointType.SummonDragon, FairySiegeRedPointType.Go }, { FairySiegeRedPointType.SummonDragonFLZT, FairySiegeRedPointType.SummonDragon }, { FairySiegeRedPointType.SummonDragonLTWJ, FairySiegeRedPointType.SummonDragon }, { FairySiegeRedPointType.Atk, FairySiegeRedPointType.Go }, { FairySiegeRedPointType.RankAwardPlayer, FairySiegeRedPointType.RankAward }, { FairySiegeRedPointType.RankAwardFamily, FairySiegeRedPointType.RankAward }, }; foreach (var pair in childRedPoints) { var parentId = GetRedpointId(pair.Value); var childId = GetRedpointId(pair.Key); redPointDict[childId] = new Redpoint(parentId, childId); } } public void UpdateRedpoint() { parentRedpoint.state = RedPointState.None; foreach (var redPoint in redPointDict.Values) { redPoint.state = RedPointState.None; } fairySiegeHelpModel.UpdateHelpRedpoint(); fairySiegeHelpModel.UpdateGiftRedpoint(); UpdateLowContributionRedPoint(); UpdateHighContributionRedPoint(); UpdateSpringRedPoint(); UpdateLikeRedPoint(); UpdateAtkRedpoint(); UpdateSummonDragonFLZTRedpoint(); UpdateSummonDragonLTWJRedpoint(); UpdateGuessAwardRedpoint(); UpdateRankFamilyRedpoint(); UpdateRankPlayerRedpoint(); } public void UpdateGuessAwardRedpoint() { int state = GetGuessState(); //0 未开始 1 竞猜中 2 竞猜结束 3 领奖期 if (state != 3) return; var list = GetMatchedEntryIDs(); if (list.IsNullOrEmpty()) return; bool isHaveAward = IsHaveAward(0); if (isHaveAward) return; if (!ActGuessConfig.TryGetIdDictByTemplateID(operationCrossAct.GuessTemplateID, out var dict) || dict == null) return; if (!TryGetRedpoint(FairySiegeRedPointType.GuessAward, out Redpoint redpoint)) return; redpoint.state = RedPointState.None; foreach (var item in dict.Keys) { if (list.Contains(item)) { redpoint.state = RedPointState.Simple; break; } } } public void UpdateLowContributionRedPoint() { // 没有参赛资格 if (!hasQualification()) return; int stateValue; if (!TryGetCurrentStateValue(out stateValue)) return; int state = GetStateByStateValue(stateValue); //0 公示期 1 备战期 2 开战期 3 休战期 4 领奖期 if (state == 0 || state == 4) return; if (!TryGetRedpoint(FairySiegeRedPointType.BaseLowContribution, out Redpoint redpoint)) return; redpoint.state = RedPointState.None; int remainLowDonationCnt = lowDonateMaxCnt - contributionCnt; var hasMoney = UIHelper.GetMoneyCnt(lowDonateMoneyType); bool hasLowDonationCnt = TryGetNeedMoney(out int needMoney); if (remainLowDonationCnt > 0 && hasLowDonationCnt && hasMoney >= (ulong)needMoney) { redpoint.state = RedPointState.Simple; } } public void UpdateHighContributionRedPoint() { // 没有参赛资格 if (!hasQualification()) return; int stateValue; if (!TryGetCurrentStateValue(out stateValue)) return; int state = GetStateByStateValue(stateValue); //0 公示期 1 备战期 2 开战期 3 休战期 4 领奖期 if (state == 0 || state == 4) return; if (!TryGetRedpoint(FairySiegeRedPointType.BaseHighContribution, out Redpoint redpoint)) return; redpoint.state = RedPointState.None; var hasItemCnt = packModel.GetItemCountByID(PackType.Item, highDonateItemId); if (hasItemCnt > 0) { redpoint.state = RedPointState.Simple; } } public void UpdateSpringRedPoint() { int stateValue; if (!TryGetCurrentStateValue(out stateValue)) return; int state = GetStateByStateValue(stateValue); //0 公示期 1 备战期 2 开战期 3 休战期 4 领奖期 if (state == 0) return; if (!TryGetRedpoint(FairySiegeRedPointType.Spring, out Redpoint redpoint)) return; if (!ActFamilyGCZSQConfig.Has(SQLayer)) return; redpoint.state = RedPointState.None; var actConfig = ActFamilyGCZSQConfig.Get(SQLayer); int springCostItemCnt = actConfig.CostItemCnt; var hasItemCnt = packModel.GetItemCountByID(PackType.Item, springCostItemId); if (hasItemCnt >= springCostItemCnt) { redpoint.state = RedPointState.Simple; } } public void UpdateLikeRedPoint() { int stateValue; if (!TryGetCurrentStateValue(out stateValue)) return; int state = GetStateByStateValue(stateValue); if (state != 4) return; if (!TryGetRedpoint(FairySiegeRedPointType.Like, out Redpoint redpoint)) return; redpoint.state = RedPointState.None; if (!IsHaveAward(3)) { redpoint.state = RedPointState.Simple; } } //0-竞猜奖励;1-个人排行奖励;2-仙盟排名奖励;3-点赞; public bool IsHaveAward(int bit) { return (awardState & (1 << bit)) != 0; } private void UpdateSummonDragonFLZTRedpoint() { // 没有参赛资格 if (!hasQualification()) return; int stateValue; if (!TryGetCurrentStateValue(out stateValue)) return; int state = GetStateByStateValue(stateValue); //0 公示期 1 备战期 2 开战期 3 休战期 4 领奖期 if (state != 2) return; if (!TryGetRedpoint(FairySiegeRedPointType.SummonDragonFLZT, out Redpoint redpoint)) return; redpoint.state = RedPointState.None; var itemId = flztSkillItemId; var hasCnt = packModel.GetItemCountByID(PackType.Item, itemId); var needCnt = flztSkillNeedCnt; if (hasCnt >= needCnt) { redpoint.state = RedPointState.Simple; } } private void UpdateSummonDragonLTWJRedpoint() { // 没有参赛资格 if (!hasQualification()) return; int stateValue; if (!TryGetCurrentStateValue(out stateValue)) return; int state = GetStateByStateValue(stateValue); //0 公示期 1 备战期 2 开战期 3 休战期 4 领奖期 if (state != 2) return; if (!TryGetRedpoint(FairySiegeRedPointType.SummonDragonLTWJ, out Redpoint redpoint)) return; redpoint.state = RedPointState.None; int itemId = ltwjSkillItemId; int hasCnt = packModel.GetItemCountByID(PackType.Item, itemId); int needCnt = ltwjSkillNeedCnt; if (hasCnt >= needCnt) { redpoint.state = RedPointState.Simple; } } public void UpdateAtkRedpoint() { // 没有参赛资格 if (!hasQualification()) return; int stateValue; if (!TryGetCurrentStateValue(out stateValue)) return; int state = GetStateByStateValue(stateValue); //0 公示期 1 备战期 2 开战期 3 休战期 4 领奖期 if (state != 2) return; if (!TryGetRedpoint(FairySiegeRedPointType.Atk, out Redpoint redpoint)) return; redpoint.state = RedPointState.None; var hasCount = packModel.GetItemCountByID(PackType.Item, atkCostItemId); if (energy > 0 || hasCount > 0) { redpoint.state = RedPointState.Simple; } } #endregion #region 推送弹窗 public int[][] pushItemList; public bool isPushDaySkip { get { var key = GetPushKey(); return LocalSave.GetBool(key); } set { var key = GetPushKey(); LocalSave.SetBool(key, value); } } private string GetPushKey() { var time = ILTimeUtility.ServerCrossNow; if (operationCrossAct == null) { return string.Empty; } return StringUtility.Contact("FairySiegePush", "_", operationCrossAct.actID, "_", time.Day, PlayerDatas.Instance.baseData.PlayerID); } #endregion #region 背景故事 public bool isFairySiegeStoryPlaying = true; public Action fairySiegeStoryShowAllAction; public Action fairySiegeStoryExitAction; readonly string FairySiegeStoryKey = "IsFirstEnterFairySiegeAct"; public bool isSkipStory { get { string key = GetFairySiegeStoryKey(); return LocalSave.GetBool(key); } set { string key = GetFairySiegeStoryKey(); LocalSave.SetBool(key, value); } } private string GetFairySiegeStoryKey() { if (operationCrossAct == null) return string.Empty; return StringUtility.Contact(FairySiegeStoryKey, "_", operationCrossAct.actID, "_", PlayerDatas.Instance.PlayerId); } #endregion #region 排行榜 public int chooseRankIndex; public Dictionary roundsData = new Dictionary(); //查询第一名信息,界面快速切换查询回包和界面不一致 需多个ID记录 public int no1PlayerIDCross; public int no1PlayerIDCrossFamily; //盟主 //排行榜名次信息 public int SelectRank { get; set; } //排行榜奖励信息 public int SelectAwardRank { get; set; } public event Action OnPlayerInfo; public event Action onStateUpdate; public int GetMaxRank(int templateID) { var rankDict = BillboardAwardTempConfig.GetRankDict(templateID); if (rankDict == null) return 0; var list = rankDict.Keys.ToList(); list.Sort(); list.Reverse(); int id = rankDict[list[0]]; int maxRank = BillboardAwardTempConfig.Get(id).Rank; return maxRank; } public int GetPlayerId(RankData rankData) { // 检查输入数据是否为空 if (rankData == null) return 0; // 根据 SelectRank 的值选择对应的 ID switch (SelectRank) { case 0: case 1: return (int)rankData.id; case 2: return rankData.id2; default: return 0; } } public ulong GetRankPersonalScore(RankData rankData) { return rankData == null ? 0 : rankData.cmpValue * oneHundredMillion + rankData.cmpValue2; } #endregion #region 排行奖励 public bool TryGetTitleId(int[][] arr, out int titleId) { titleId = 0; foreach (var item in arr) { int itemId = item[0]; if (!ItemConfig.Has(itemId)) continue; var config = ItemConfig.Get(itemId); if (config.Type == 4) { titleId = config.EffectValueA1; if (DienstgradConfig.Has(titleId)) { return true; } } } return false; } #endregion #region 赛程 public uint queryFairyId = 0; //查询的仙盟ID //<参与仙盟数,<轮次,<战场类型,[组数, 前x名晋级, 后x名降级]>>> public Dictionary>> matchRuleDict = new Dictionary>>(); //<战场类型,<名次,积分>> public Dictionary> rankToScoreRawDict = new Dictionary>(); //<名次,int[]{低级战场积分,中级战场积分,高级战场积分}> Dictionary rankToScoreDict = new Dictionary(); public class RankRowData { public string RankDisplay { get; set; } // 显示的排名(如"第1名"、"第5-6名") public int? PrimaryScore { get; set; } // 初级战场积分 public int? IntermediateScore { get; set; } // 中级战场积分 public int? AdvancedScore { get; set; } // 高级战场积分 } private List scoreRowList = new List(); // 获取所有行数据 public List GetScoreRowData() { if (scoreRowList.IsNullOrEmpty()) { // 获取所有战场类型中配置的排名点,并去重排序 var allRankPoints = new SortedSet(); foreach (var battlefield in rankToScoreRawDict.Values) { foreach (var rank in battlefield.Keys) { allRankPoints.Add(rank); } } // 为每个排名点创建行数据 int previousRank = 0; foreach (var rank in allRankPoints) { var row = new RankRowData(); // 设置排名显示文本 if (previousRank + 1 == rank) { row.RankDisplay = rank.ToString(); } else { row.RankDisplay = Language.Get("FairySiege138", previousRank + 1, rank); } // 设置各战场积分 row.PrimaryScore = GetScoreForRank(1, rank); row.IntermediateScore = GetScoreForRank(2, rank); row.AdvancedScore = GetScoreForRank(3, rank); scoreRowList.Add(row); previousRank = rank; } } return scoreRowList; } // 辅助方法:获取指定战场和排名的积分 private int GetScoreForRank(int battlefieldType, int rank) { if (rankToScoreRawDict.TryGetValue(battlefieldType, out var battlefield)) { // 查找小于等于指定rank的最大key var validRanks = battlefield.Keys.Where(r => r <= rank).OrderByDescending(r => r); if (validRanks.Any()) { return battlefield[validRanks.First()]; } } return 0; } public bool TryGetMatchUpNum(int matchType, int matchRound, int battlefieldType, out int num) { num = 0; if (!matchRuleDict.TryGetValue(matchType, out var roundDict)) return false; if (!roundDict.TryGetValue(matchRound, out var matchTypeDict)) return false; if (!matchTypeDict.TryGetValue(battlefieldType, out var arr)) return false; num = arr[1]; return true; } public bool TryGetMatchDownNum(int matchType, int matchRound, int battlefieldType, out int num) { num = 0; if (!matchRuleDict.TryGetValue(matchType, out var roundDict)) return false; if (!roundDict.TryGetValue(matchRound, out var matchTypeDict)) return false; if (!matchTypeDict.TryGetValue(battlefieldType, out var arr)) return false; num = arr[2]; return true; } public bool TryGetNowBatTypeAndGroup(uint familyId, out int battleType, out int battleGroup) { battleType = 0; battleGroup = 0; if (batGroupInfo.IsNullOrEmpty()) return false; // 遍历所有战场类型 foreach (var battlePair in batGroupInfo) { int currentBattleType = battlePair.Key; var groupDict = battlePair.Value; // 遍历当前战场类型的所有分组 foreach (var groupPair in groupDict) { int currentGroupNumber = groupPair.Key; uint[] guildIds = groupPair.Value; // 检查当前分组中是否包含目标仙盟ID if (Array.IndexOf(guildIds, familyId) >= 0) { battleType = currentBattleType; battleGroup = currentGroupNumber; return true; } } } return false; } public Action UpdateSwitchGroupAction; public List GetSwitchGroupList() { var switchGroupList = new List(); if (batGroupInfo != null) { List batTypeList = batGroupInfo.Keys.ToList(); batTypeList.Sort(); batTypeList.Reverse(); for (var i = 0; i < batTypeList.Count; i++) { var batType = batTypeList[i]; if (!batGroupInfo.TryGetValue(batType, out var groupInfo) || groupInfo == null) continue; var groupList = groupInfo.Keys.ToList(); groupList.Sort(); for (int j = 0; j < groupList.Count; j++) { switchGroupList.Add(batType * 10 + groupList[j]); } } } return switchGroupList; } public int JumpToMySwitchGroupIndex() { var switchGroupList = GetSwitchGroupList(); if (!TryGetNowBatTypeAndGroup(myFamilyID, out int myBattleType, out int myBattleGroup)) return 0; int key = myBattleType * 10 + myBattleGroup; if (switchGroupList.IsNullOrEmpty()) return 0; int index = switchGroupList.IndexOf(key); return index < 0 || index >= switchGroupList.Count ? 0 : index; } #endregion #region 竞猜 public int[] guessFlowIDArr;//可竞猜的流程状态列表,对应活动时间流程表的状态值 public int guessNameListCnt; //竞猜阶段取当前总积分前x名为备选竞猜名单 public int guessMaxChooseCnt; //可竞猜选择数 public readonly int ScrRowCntMax = 3; //Scroller一行最多有x个物品 public int[] chooseArr = new int[3]; public Action UpdateChooseAction; //更新我的选择面板 public bool TryGetGuessTimeStateValue(out int startStateValue, out int endStateValue) { startStateValue = 0; endStateValue = 0; if (guessFlowIDArr.IsNullOrEmpty()) return false; List res = guessFlowIDArr.ToList(); res.Sort(); startStateValue = res[0]; endStateValue = res[res.Count - 1]; return true; } // 获取竞猜时间 public bool TryGetGuessTime(out DateTime startGuessTime, out DateTime endGuessTime) { startGuessTime = new DateTime(); endGuessTime = new DateTime(); int startStateValue; int endStateValue; if (!TryGetGuessTimeStateValue(out startStateValue, out endStateValue)) return false; if (operationCrossAct == null) return false; int startFlowID; if (!ActTimeFlowConfig.TryGetID(operationCrossAct.ActFlowID, startStateValue, out startFlowID)) return false; int endFlowID; if (!ActTimeFlowConfig.TryGetID(operationCrossAct.ActFlowID, endStateValue, out endFlowID)) return false; if (!TryGetStartTimeById(startFlowID, out startGuessTime)) return false; if (!TryGetEndTimeById(endFlowID, out endGuessTime)) return false; return true; } // 获取竞猜领奖时间 public bool TryGetGuessAwardTime(out DateTime startGuessAwardTime, out DateTime endGuessAwardTime) { startGuessAwardTime = new DateTime(); endGuessAwardTime = new DateTime(); if (operationCrossAct == null) return false; int stateValue = 99; int flowID; if (!ActTimeFlowConfig.TryGetID(operationCrossAct.ActFlowID, stateValue, out flowID)) return false; if (!TryGetStartTimeById(flowID, out startGuessAwardTime)) return false; if (!TryGetEndTimeById(flowID, out endGuessAwardTime)) return false; return true; } //0 未开始 1 竞猜中 2 竞猜结束 3 领奖期 public int GetGuessState() { DateTime nowTime = ILTimeUtility.ServerCrossNow; if (!TryGetGuessTime(out DateTime startGuessTime, out DateTime endGuessTime)) return 0; if (!TryGetGuessAwardTime(out DateTime startGuessAwardTime, out DateTime endGuessAwardTime)) return 0; if (nowTime < startGuessTime) return 0; if (nowTime >= startGuessTime && nowTime < endGuessTime) return 1; if (nowTime >= endGuessTime && nowTime < startGuessAwardTime) return 2; if (nowTime >= startGuessAwardTime && nowTime < endGuessAwardTime) return 3; return 0; } //获取当前排名最靠前的空名次的索引 public bool TryGetIndex(out int index) { index = 0; for (var i = 0; i < chooseArr.Length; i++) { if (chooseArr[i] == 0) { index = i; return true; } } return false; } //获取当前仙盟Id的索引 public bool TryGetIndex(int familyId, out int index) { index = 0; for (var i = 0; i < chooseArr.Length; i++) { if (familyId == chooseArr[i]) { index = i; return true; } } return false; } public List GetMatchedEntryIDs() { // 创建结果列表 List matchedEntryIDs = new List(); // 检查输入有效性 if (SelectFamilyIDList == null || FinalFamilyIDList == null || SelectFamilyIDList.Length != 3 || FinalFamilyIDList.Length != 3) { return matchedEntryIDs; } // 检查猜中的名次 List rightRanks = new List(); // 检查冠军(第1名)是否猜中 if (SelectFamilyIDList[0] == FinalFamilyIDList[0]) { rightRanks.Add(1); } // 检查亚军(第2名)是否猜中 if (SelectFamilyIDList[1] == FinalFamilyIDList[1]) { rightRanks.Add(2); } // 检查季军(第3名)是否猜中 if (SelectFamilyIDList[2] == FinalFamilyIDList[2]) { rightRanks.Add(3); } // 根据猜中的名次匹配条目ID if (rightRanks.Count == 3) // 猜中冠亚季军 { matchedEntryIDs.Add(1); } else if (rightRanks.Count == 2 && rightRanks.Contains(1) && rightRanks.Contains(2)) // 猜中冠亚军 { matchedEntryIDs.Add(2); } else if (rightRanks.Count == 1 && rightRanks.Contains(1)) // 猜中冠军 { matchedEntryIDs.Add(3); } else if (rightRanks.Count == 1 && rightRanks.Contains(2)) // 猜中亚军 { matchedEntryIDs.Add(4); } else if (rightRanks.Count == 1 && rightRanks.Contains(3)) // 猜中季军 { matchedEntryIDs.Add(5); } else // 什么都没猜中 { matchedEntryIDs.Add(6); } return matchedEntryIDs; } #endregion #region 大本营 public int lowDonateMoneyType; //低级捐献消耗货币类型,配0代表关闭货币捐献 public int[] lowDonateNeedMoneyArr; //低级捐献消耗货币列表[第1次消耗, 第2次消耗, ...],列表长度也就是每轮可使用货币捐赠的最大次数 public int lowDonateMaxCnt { get { return lowDonateNeedMoneyArr.IsNullOrEmpty() ? 0 : lowDonateNeedMoneyArr.Length; } } //低级捐献最大次数 public int lowDonateOnceExpAdd; //低级捐献每次获得大本营经验 public Dictionary> lowDonateRewardDict = new Dictionary>();//低级捐献概率获得物品库 [[权重, [物品ID,个数,是否拍品]], ,,,] public int highDonateItemId; //高级捐献物品ID public int highDonateOnceExpAdd; //高级捐献一次等级经验增加x //<权重,物品信息列表> public Dictionary> highDonateRewardDict = new Dictionary>();//高级捐献概率获得物品库 [[权重, [物品ID,个数,是否拍品]], ,,,] public bool TryGetFairySiegeFamilyInfo(uint familyID, out FairySiegeFamilyInfo fairySiegeFamilyInfo) { fairySiegeFamilyInfo = new FairySiegeFamilyInfo(); if (operationCrossAct == null || operationCrossAct.joinFamilyDict == null) return false; return operationCrossAct.joinFamilyDict.TryGetValue(familyID, out fairySiegeFamilyInfo) && fairySiegeFamilyInfo != null; } public bool TryGetNeedMoney(out int needMoney) { needMoney = 0; if (lowDonateNeedMoneyArr.IsNullOrEmpty()) return false; if (contributionCnt >= lowDonateNeedMoneyArr.Length) return false; needMoney = lowDonateNeedMoneyArr[contributionCnt]; return true; } // 获取所有不重复的物品ID列表 public List GetAllUniqueItemIDs(Dictionary> dict) { List res = new List(); foreach (var weight in dict.Keys) { var list = dict[weight]; if (list.IsNullOrEmpty()) continue; foreach (var arr in list) { if (arr.IsNullOrEmpty()) continue; int itemId = arr[0]; if (!res.Contains(itemId)) { res.Add(itemId); } } } res.Sort((a, b) => { ItemConfig itemConfigA = ItemConfig.Get(a); ItemConfig itemConfigB = ItemConfig.Get(b); if (itemConfigA == null || itemConfigB == null) return 0; if (itemConfigA.ItemColor != itemConfigB.ItemColor) { return itemConfigA.ItemColor.CompareTo(itemConfigB.ItemColor); } return b.CompareTo(a); }); return res; } // 获取当前等级下一级的生命累计总加成百分比 public bool TryGetNextHPPer(int campLV, out int nextAddHPPer) { nextAddHPPer = 0; if (!FamilyGCZCampLVConfig.Has(campLV)) return false; var keys = FamilyGCZCampLVConfig.GetKeys().Select(int.Parse).ToList(); keys.Sort(); int indexOf = keys.IndexOf(campLV); if (indexOf < 0 || indexOf > keys.Count - 1) return false; FamilyGCZCampLVConfig config = FamilyGCZCampLVConfig.Get(campLV); // 配0代表满级了,不可再升级 if (config.LVUPNeedExp == 0) return false; int nextIndexOf = indexOf + 1; if (nextIndexOf < 0 || nextIndexOf > keys.Count - 1) return false; int nextCampLV = keys[nextIndexOf]; FamilyGCZCampLVConfig nextConfig = FamilyGCZCampLVConfig.Get(nextCampLV); nextAddHPPer = nextConfig.AddHPPer; return true; } #endregion #region 城池 public string GetCityStateImage(int state) { return StringUtility.Contact("FairySiegeCityState" + state); } int attackInterval = 0; //被攻击时间间隔x秒 // 获取当前城池状态 // 0 未摧毁-默认状态 1 未摧毁-被攻击 2 已被摧毁 public int GetCityState(FairySiegeBatSceneCity data) { if (data.HP <= 0) return 2; int time = (int)(AllSeconds - data.LastAtkedTime); if (data.LastAtkedTime > 0 && time < attackInterval) return 1; return 0; } #endregion #region 圣泉 public readonly string SpringBudKeyStr = "XMGC_hgd"; public readonly string SpringFlowerKeyStr = "XMGC_lh"; public int springCostItemId; //圣泉抽奖消耗物品Id public float springAutoIntervalSec; //圣泉自动抽奖间隔x秒抽一次 public int springHasRewardCnt; //随机获得以下x项圣泉奖励 public bool isWaitSpringPack = true; //是否等待圣泉奖励包 public List gridAwardList = new List(); public List passAllAwardList; public Action UpdateGridAwardAction; //自动挖宝 public bool isSpringAuto = false; //普通格子奖励 正常通关奖励 和全部通通关奖励 public class FairySiegeAwardInfo { public string eventName; public List showItems; public string info; public FairySiegeAtkAwardInfo atkAwardInfo; } public Action UpdateAwardInfoAction; public Queue sqAwardQueue = new Queue(); public Queue contiributionAwardQueue = new Queue(); public Queue atkAwardQueue = new Queue(); public Queue cityAwardQueue = new Queue(); public FairySiegeAwardInfo nowAtkAwardInfo = new FairySiegeAwardInfo(); public void StopAutoSend() { isSpringAuto = false; isWaitSpringPack = false; } public int nowContiributionType = 0; //0 普通 1 高级 public int nowContributionCount = 0; //捐献次数 public void OnUpdateAwardInfoAction(HA801_tagMCGiveAwardInfo netPack) { FairySiegeAwardInfo awardInfo = new FairySiegeAwardInfo(); awardInfo.eventName = UIHelper.ServerStringTrim(netPack.EventName); awardInfo.showItems = GetShowItems(netPack); awardInfo.info = string.Empty; if (LanguageConfig.Has("commonShowAwardEvents_" + awardInfo.eventName)) { awardInfo.info = Language.Get("commonShowAwardEvents_" + awardInfo.eventName); } switch (netPack.EventName) { case "FamilyGCZSQGrid": case "FamilyGCZSQPass": case "FamilyGCZSQPassAll": sqAwardQueue.Enqueue(awardInfo); isWaitSpringPack = false; break; case "FamilyGCZContiribution": ItemLogicUtility.Instance.ShowGetItemEx("FairySiegeBaseDonateGetItemWin", awardInfo.showItems, awardInfo.info, 0, eventName: awardInfo.eventName); break; case "FamilyGCZAtk": awardInfo.atkAwardInfo = GetDataExInfo(netPack.DataEx); if (awardInfo.atkAwardInfo.atkType == 1) { atkAwardQueue.Enqueue(awardInfo); } else { cityAwardQueue.Enqueue(awardInfo); } break; } } public FairySiegeAtkAwardInfo GetDataExInfo(string dataEx) { JsonData jsonData = JsonMapper.ToObject(dataEx); FairySiegeAtkAwardInfo awardInfo = new FairySiegeAtkAwardInfo(); awardInfo.atkType = (int)jsonData["atkType"]; awardInfo.hurtCnt = (int)jsonData["hurtCnt"]; awardInfo.killCntTotal = (int)jsonData["killCntTotal"]; awardInfo.hurtValueTotal = (long)jsonData["hurtValueTotal"]; return awardInfo; } private List GetShowItems(HA801_tagMCGiveAwardInfo netPack) { List showItems = new List(); if (netPack.Exp != 0 || netPack.ExpPoint != 0) { ulong expValue = netPack.Exp + netPack.ExpPoint * (ulong)Constants.ExpPointValue; showItems.Add(new Item(GeneralDefine.expDisplayId, expValue)); } if (netPack.MoneyList.Length != 0) { for (int i = 0; i < netPack.MoneyLen; i++) { var moneyType = netPack.MoneyList[i].MoneyType; if (GeneralDefine.moneyDisplayIds.ContainsKey(moneyType) && netPack.MoneyList[i].MoneyValue != 0) { showItems.Add(new Item(GeneralDefine.moneyDisplayIds[moneyType], netPack.MoneyList[i].MoneyValue)); } } } if (netPack.ItemList.Length != 0) { for (int i = 0; i < netPack.ItemLen; i++) { showItems.Add(new Item((int)netPack.ItemList[i].ItemID, netPack.ItemList[i].Count, netPack.ItemList[i].IsBind)); } } return showItems; } public Action OnGetItem; //CommonGetItemWin界面关闭时触发 public string getSpringItemInfo { get; private set; } //通用显示获得的界面信息 public string getSpringItemBtnText { get; private set; } //通用显示获得的界面按钮文字 默认确定 public int springCloseSeconds { get; private set; } // 关闭倒计时时间 如果传0代表手动关闭 public bool isSpringNameShow { get; private set; } // 是否展示物品名字 // 如果同时有多种奖励封包,同一个事件归集,不同事件直接顶掉显示最新 public Dictionary totalSpringShowItems = new Dictionary(); public event Action OnGetSpringItemShowEvent; private string getItemSpringEventName; public void ClearGetItem() { //不清理物品,下次收到数据会自动清理,只改事件方便打开界面测试 getItemSpringEventName = ""; } // 通用显示获得的物品 public void ShowGetItem(List items, string info = "", int seconds = 3, string btnName = "", Action func = null, bool isNameShow = true, string eventName = "default") { if (getItemSpringEventName != eventName) { if (WindowCenter.Instance.IsOpen()) WindowCenter.Instance.CloseImmediately("CommonGetItemWin"); totalSpringShowItems.Clear(); getItemSpringEventName = eventName; } //相同ID 合并数量显示 for (int i = 0; i < items.Count; i++) { var id = items[i].id; if (totalSpringShowItems.ContainsKey(id)) { totalSpringShowItems[id] = new Item(id, items[i].countEx + totalSpringShowItems[id].countEx, items[i].bind, items[i].quality); } else { totalSpringShowItems.Add(id, items[i]); } } getSpringItemInfo = info; OnGetItem = func; if (btnName == "") btnName = Language.Get("PopConfirmWin_OK"); getSpringItemBtnText = btnName; springCloseSeconds = seconds; this.isSpringNameShow = isNameShow; OnGetSpringItemShowEvent?.Invoke(); if (!WindowCenter.Instance.IsOpen()) WindowCenter.Instance.Open(); } #endregion #region 攻打 public float atkEffectDelay; //攻打特效播放延迟x秒 public float atkEffectDuration; //攻打特效飞到目标点时间 public int atkEffectId; //攻打特效ID public int atkCityIndex; public int atkCostItemId; bool m_isRewardDisplay; public bool isRewardDisplay { get { return m_isRewardDisplay; } set { if (m_isRewardDisplay == value) return; m_isRewardDisplay = value; RewardDisplayAction?.Invoke(); } } public event Action RewardDisplayAction; // public Dictionary atkEffectDict = new Dictionary(); // public Dictionary atkEffectDelayDict = new Dictionary(); // public Dictionary atkEffectDurationDict = new Dictionary(); private bool TryGetAtkEffectId(int job, out int effectId) { if (atkEffectDict.TryGetValue(job, out effectId)) return true; if (atkEffectDict.TryGetValue(0, out effectId)) return true; return false; } private bool TryGetAtkEffectDelay(int job, out float delay) { if (atkEffectDelayDict.TryGetValue(job, out delay)) return true; if (atkEffectDelayDict.TryGetValue(0, out delay)) return true; return false; } private bool TryGetAtkEffectDuration(int job, out float duration) { if (atkEffectDurationDict.TryGetValue(job, out duration)) return true; if (atkEffectDurationDict.TryGetValue(0, out duration)) return true; return false; } private void InitAtkEffectId() { int job = PlayerDatas.Instance.baseData.Job; if (!TryGetAtkEffectId(job, out var value)) { DebugEx.LogError("仙盟攻城战:找不到对应职业的攻击特效配置"); return; } atkEffectId = value; } private void InitAtkEffectDelay() { int job = PlayerDatas.Instance.baseData.Job; if (!TryGetAtkEffectDelay(job, out var value)) { DebugEx.LogError("仙盟攻城战:找不到对应职业的攻击特效延迟播放时间"); return; } atkEffectDelay = value; } private void InitAtkEffectDuration() { int job = PlayerDatas.Instance.baseData.Job; if (!TryGetAtkEffectDuration(job, out var value)) { DebugEx.LogError("仙盟攻城战:找不到对应职业的攻打特效播放延迟时间配置"); return; } atkEffectDuration = value; } #endregion #region 召唤神龙 public int[][] summonRewardArr; public int flztSkillItemId; public int ltwjSkillItemId; public int flztSkillNeedCnt = 1; public int ltwjSkillNeedCnt = 1; public int flztSkillRate; //飞龙在天技能总伤害是妖力的x倍 public int ltwjSkillRate; //雷霆万钧技能总伤害是妖力的x倍 public int flztSkillAtkCityCnt; //飞龙在天技能攻击城池个数 public int ltwjSkillAtkCityCnt; //雷霆万钧技能攻击城池个数 //神龙召唤自动攻击 public bool isSummonDragonAutoAtk { get { string key = GetSummonAutoKey(); return LocalSave.GetBool(key); } set { string key = GetSummonAutoKey(); LocalSave.SetBool(key, value); } } readonly string SummonDragonAutoAtkKey = "FairySiegeSummonDragonAutoAtk"; private string GetSummonAutoKey() { if (operationCrossAct == null) { return string.Empty; } return StringUtility.Contact(SummonDragonAutoAtkKey, "_", operationCrossAct.actID, "_", matchRound, "_", PlayerDatas.Instance.PlayerId); } //飞龙在天技能上次攻击的仙盟Id public int isSummonDragonLastAtkFamilyId { get { string key = GetSummonDragonLastAtkFairyIdKey(); return LocalSave.GetInt(key); } set { string key = GetSummonDragonLastAtkFairyIdKey(); LocalSave.SetInt(key, value); } } readonly string SummonDragonLastAtkFairyIdKey = "FairySiegeSummonDragonLastAtkFairyId"; private string GetSummonDragonLastAtkFairyIdKey() { if (operationCrossAct == null) { return string.Empty; } return StringUtility.Contact(SummonDragonLastAtkFairyIdKey, "_", operationCrossAct.actID, "_", matchRound, "_", PlayerDatas.Instance.PlayerId); } // 是否勾选观看他人动画 public bool isSummonDragonWatch { get { string key = GetSummonDragonWatchKey(); return LocalSave.GetBool(key); } set { string key = GetSummonDragonWatchKey(); LocalSave.SetBool(key, value); } } readonly string SummonDragonWatchKey = "FairySiegeSummonDragonWatch"; private string GetSummonDragonWatchKey() { if (operationCrossAct == null) { return string.Empty; } return StringUtility.Contact(SummonDragonWatchKey, "_", operationCrossAct.actID, "_", PlayerDatas.Instance.PlayerId); } // 当前FairyId是否在玩家所在的组中 public bool IsFamilyIdInCurrentMatchRound(uint familyId) { if (!TryGetNowBatTypeAndGroup(myFamilyID, out int myBattleType, out int myBattleGroup)) return false; int key = GetBatSceneKey(myBattleType, myBattleGroup); if (!BatSceneInfoDict.TryGetValue(key, out var dict) || dict == null || dict.BatSceneCityDict == null) return false; foreach (var CityId in dict.BatSceneCityDict.Keys) { if (dict.BatSceneCityDict[CityId].FamilyID == familyId) { return true; } } return false; } public string GetSkillIcon(int atkType) { return StringUtility.Contact("FairySiegeSummonDragonSkillIcon", atkType); } public string GetSkillNameIcon(int atkType) { return StringUtility.Contact("FairySiegeSummonDragonSkillName", atkType); } #endregion #region 参与名单 //按serverId从小到大 public bool TryGetSortServerIdList(out List list) { list = null; if (operationCrossAct == null) return false; if (operationCrossAct.joinFamilys.IsNullOrEmpty()) return false; list = operationCrossAct.joinFamilys.Keys.ToList(); if (list.IsNullOrEmpty()) return false; list.Sort(); return true; } // 妖盟名单和成员名单都按战力从高到低排 public bool TryGetSortFamilyList(uint serverId, out List list) { list = null; if (operationCrossAct == null) return false; if (operationCrossAct.joinFamilys.IsNullOrEmpty()) return false; if (!operationCrossAct.joinFamilys.ContainsKey(serverId)) return false; list = operationCrossAct.joinFamilys[serverId].Values.ToList(); if (list.IsNullOrEmpty()) return false; list.Sort((x, y) => { int fightPowerComparison = y.FightPower.CompareTo(x.FightPower); if (fightPowerComparison != 0) { return fightPowerComparison; } return string.Compare(x.Name, y.Name, StringComparison.CurrentCultureIgnoreCase); }); return true; } public bool TryGetSortMemberList(out List list) { list = new List(); if (campMemberDict == null) return false; list = campMemberDict.Values.ToList(); list.Sort((x, y) => { int fightPowerComparison = y.FightPower.CompareTo(x.FightPower); if (fightPowerComparison != 0) { return fightPowerComparison; } return string.Compare(x.Name, y.Name, StringComparison.CurrentCultureIgnoreCase); }); return true; } private List GetLeaderNameTopCnt(int count) { if (!TryGetSortServerIdList(out List list)) return null; List res = new List(); bool isBreak = false; foreach (var serverId in list) { if (!TryGetSortFamilyList(serverId, out List infoList)) continue; if (isBreak) break; foreach (var item in infoList) { if (res.Count >= count) { isBreak = true; break; } else { res.Add(item.LeaderName); } } } return res; } public string GetJoinFamilyNameStr() { List nameList = GetLeaderNameTopCnt(3); if (nameList.IsNullOrEmpty()) return string.Empty; StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < nameList.Count; i++) { if (i == nameList.Count - 1) { string originalName = nameList[i]; int halfLength = originalName.Length / 2; string halfName = originalName.Substring(0, halfLength);// 截取前面一半字符 stringBuilder.Append(halfName); } else { stringBuilder.Append(nameList[i]); stringBuilder.Append(Language.Get("FairySiege128")); } } stringBuilder.Append(Language.Get("FairySiege127")); return stringBuilder.ToString(); } #endregion #region 发包 // C0 26 仙盟攻城战查询 public void SendQuery(int QueryType, int BatType, int GroupNum, uint FamilyID) { CC026_tagCGFamilyGCZQuery pack = new CC026_tagCGFamilyGCZQuery(); pack.QueryType = (byte)QueryType; pack.BatType = (byte)BatType; pack.GroupNum = (byte)GroupNum; pack.FamilyID = FamilyID; GameNetSystem.Instance.SendInfo(pack); } // C1 24 仙盟攻城战捐献 public void SendContribution(uint ContributionType, uint UseCount) { CC124_tagCMFamilyGCZContribution pack = new CC124_tagCMFamilyGCZContribution(); pack.ContributionType = (byte)ContributionType; pack.UseCount = UseCount; GameNetSystem.Instance.SendInfo(pack); } // C1 25 仙盟攻城战攻击 public void SendAtk(int AtkType, uint TagCityID, uint TagGuardID) { CC125_tagCMFamilyGCZAtk pack = new CC125_tagCMFamilyGCZAtk(); pack.AtkType = (byte)AtkType; pack.TagCityID = TagCityID; pack.TagGuardID = TagGuardID; GameNetSystem.Instance.SendInfo(pack); } // C1 26 仙盟攻城战竞猜 public void SendGuess(uint[] SelectFamilyIDList) { CC126_tagCMFamilyGCZGuess pack = new CC126_tagCMFamilyGCZGuess(); pack.SelectCnt = (byte)SelectFamilyIDList.Length; pack.SelectFamilyIDList = SelectFamilyIDList; GameNetSystem.Instance.SendInfo(pack); } // C1 27 仙盟攻城战圣泉抽奖 public void SendSQ(int GridNum) { CC127_tagCMFamilyGCZSQ pack = new CC127_tagCMFamilyGCZSQ(); pack.GridNum = (byte)GridNum; GameNetSystem.Instance.SendInfo(pack); } public void SendViewTagFamily(uint familyID) { CA414_tagCGViewTagFamily pack = new CA414_tagCGViewTagFamily(); pack.TagFamilyID = familyID; GameNetSystem.Instance.SendInfo(pack); } public void SendAward(uint dataEx) { CA504_tagCMPlayerGetReward pack = new CA504_tagCMPlayerGetReward(); pack.RewardType = 80; pack.DataEx = (uint)dataEx; pack.DataExStrLen = 0; pack.DataExStr = string.Empty; GameNetSystem.Instance.SendInfo(pack); } #endregion #region 收包 public readonly ulong oneHundredMillion = 100000000; public void UpdateFamilyGCZBatGroupInfo(HC025_tagGCFamilyGCZBatGroupInfo vNetData) { matchRound = vNetData.RoundNum; batGroupInfo.Clear(); foreach (var item in vNetData.BatList) { if (!batGroupInfo.ContainsKey(item.BatType)) { batGroupInfo[item.BatType] = new Dictionary(); } foreach (var group in item.GroupList) { batGroupInfo[item.BatType][group.GroupNum] = group.FamilyIDList; } } UpdateFamilyGCZBatGroupInfoEvent?.Invoke(); } public void UpdateFamilyGCZPlayerInfo(HC110_tagMCFamilyGCZPlayerInfo vNetData) { contributionCnt = vNetData.ContributionCnt; energy = vNetData.Energy; energyTime = vNetData.EnergyTime; awardState = vNetData.AwardState; UpdateFamilyGCZPlayerInfoEvent?.Invoke(); UpdateRedpoint(); } // 大本营信息 public uint myFamilyID; //所在活动仙盟ID,可能不是玩家当前的仙盟ID,活动以该ID为准 public int myCityScore; //活动总积分,如果不在榜上则读该值 public int myCampLV; //大本营当前等级 public uint myCampExp; //大本营当前经验 public int myCityLV; //城池属性等级,开战后可能与当前大本营等级不一样 public ulong myCityHPBase;//基础生命 public ulong myCityHP;//剩余生命 public ulong myCityHPMax;//总生命 //<轮次,轮次信息> public Dictionary campRoundDict = new Dictionary(); public bool TryGetNewCampRound(out FairySiegeCampRound fairySiegeCampRound) { fairySiegeCampRound = null; if (campRoundDict.IsNullOrEmpty()) return false; if (campRoundDict.TryGetValue(matchRound, out var round)) { fairySiegeCampRound = round; return round != null; } return false; } public int GetAllScore() { if (campRoundDict == null) return 0; int res = 0; var values = campRoundDict.Values.ToList(); foreach (var item in values) { res += item.Score; } return res; } // public Dictionary campMemberDict = new Dictionary(); public event Action UpdateCampInfoEvent; public void UpdateFamilyGCZCampInfo(HC026_tagGCFamilyGCZCampInfo vNetData) { myFamilyID = vNetData.FamilyID; myCampLV = vNetData.CampLV; myCampExp = vNetData.CampExp; myCityLV = vNetData.CityLV; myCityHPBase = (ulong)vNetData.HPBaseEx * oneHundredMillion + vNetData.HPBase; myCityHPMax = (ulong)vNetData.HPMaxEx * oneHundredMillion + vNetData.HPMax; myCityHP = (ulong)vNetData.HPEx * oneHundredMillion + vNetData.HP; foreach (var pack in vNetData.RoundInfoList) { if (!campRoundDict.ContainsKey(pack.RoundNum)) { campRoundDict[pack.RoundNum] = new FairySiegeCampRound(); } campRoundDict[pack.RoundNum].RoundNum = pack.RoundNum; campRoundDict[pack.RoundNum].BatType = pack.BatType; campRoundDict[pack.RoundNum].GroupNum = pack.GroupNum; campRoundDict[pack.RoundNum].Rank = pack.Rank; campRoundDict[pack.RoundNum].Score = pack.Score; campRoundDict[pack.RoundNum].UpdownState = pack.UpdownState; } foreach (var pack in vNetData.DefMemList) { if (!campMemberDict.ContainsKey(pack.PlayerID)) { campMemberDict[pack.PlayerID] = new FairySiegeCampMember(); } campMemberDict[pack.PlayerID].PlayerID = pack.PlayerID; campMemberDict[pack.PlayerID].Name = UIHelper.ServerStringTrim(pack.Name); campMemberDict[pack.PlayerID].FamilyLV = pack.FamilyLV; campMemberDict[pack.PlayerID].Job = pack.Job; campMemberDict[pack.PlayerID].Face = pack.Face; campMemberDict[pack.PlayerID].FacePic = pack.FacePic; campMemberDict[pack.PlayerID].FightPower = pack.FightPowerEx * oneHundredMillion + pack.FightPower; campMemberDict[pack.PlayerID].HP = pack.HPEx * oneHundredMillion + pack.HP; campMemberDict[pack.PlayerID].HPMax = pack.HPMaxEx * oneHundredMillion + pack.HPMax; campMemberDict[pack.PlayerID].TotalHurt = pack.TotalHurtEx * oneHundredMillion + pack.TotalHurt; } UpdateRedpoint(); UpdateCampInfoEvent?.Invoke(); } public event Action UpdateFamilyGCZContributionInfoEvent; public Dictionary contributionInfoDict = new Dictionary(); public void UpdateFamilyGCZContributionInfo(HC027_tagGCFamilyGCZContributionInfo vNetData) { foreach (var contri in vNetData.ContriList) { contributionInfoDict[contri.PlayerID] = contri.ContributionValue; } UpdateFamilyGCZContributionInfoEvent?.Invoke(); } public event Action UpdateFamilyGCZBatReportEvent; public uint nowBatReportFamilyID; public Dictionary> batReportDefDict = new Dictionary>(); public Dictionary> batReportAtkDict = new Dictionary>(); public string CalculateDamagePercentage(ulong damage, ulong totalHealth) { // 避免除以0的情况 if (totalHealth == 0) return string.Empty; double damageDouble = (double)damage; double totalHealthDouble = (double)totalHealth; double percentage = (damageDouble / totalHealthDouble) * 100; string formattedPercentage = Language.Get("BlessedLand039", percentage.ToString("F2")); return formattedPercentage; } public uint showBatReportFamilyID; public void UpdateFamilyGCZBatReport(HC030_tagGCFamilyGCZBatReport vNetData) { nowBatReportFamilyID = vNetData.FamilyID; if (!batReportDefDict.ContainsKey(vNetData.FamilyID)) { batReportDefDict[vNetData.FamilyID] = new Dictionary(); } if (!batReportAtkDict.ContainsKey(vNetData.FamilyID)) { batReportAtkDict[vNetData.FamilyID] = new Dictionary(); } foreach (var item in vNetData.DefRepList) { batReportDefDict[vNetData.FamilyID][item.TagFamilyID] = item.HurtValueEx * oneHundredMillion + item.HurtValue; } foreach (var item in vNetData.AtkRepList) { batReportAtkDict[vNetData.FamilyID][item.TagFamilyID] = item.HurtValueEx * oneHundredMillion + item.HurtValue; } UpdateFamilyGCZBatReportEvent?.Invoke(); } public event Action UpdateGroupFamilyMemHurtInfoEvent; Dictionary groupFamilyMemHurtInfo = new Dictionary(); public void UpdateGroupFamilyMemHurtInfo(HC031_tagGCFamilyGCZGroupFamilyMemHurtInfo vNetData) { if (!groupFamilyMemHurtInfo.ContainsKey(vNetData.FamilyID)) { groupFamilyMemHurtInfo = new Dictionary(); } foreach (var memHurt in vNetData.HurtMemList) { groupFamilyMemHurtInfo[memHurt.PlayerID].PlayerID = memHurt.PlayerID; groupFamilyMemHurtInfo[memHurt.PlayerID].Name = UIHelper.ServerStringTrim(memHurt.Name); groupFamilyMemHurtInfo[memHurt.PlayerID].HurtValue = memHurt.HurtValueEx * oneHundredMillion + memHurt.HurtValue; } UpdateGroupFamilyMemHurtInfoEvent?.Invoke(); } public int SQLayer; //<格子编号,Item> public Dictionary sqInfoDict = new Dictionary(); public event Action UpdateFamilyGCZSQInfoEvent; public void UpdateFamilyGCZSQInfo(HC111_tagMCFamilyGCZSQInfo vNetData) { //仅同步全部或变更的格子,前端进行差异更新,层数变更时重置本地记录 if (SQLayer != vNetData.SQLayer) { StopAutoSend(); sqInfoDict.Clear(); } SQLayer = vNetData.SQLayer; foreach (var pack in vNetData.SQGridList) { sqInfoDict[pack.GridNum] = new Item((int)pack.ItemID, (int)pack.ItemCount); } UpdateFamilyGCZSQInfoEvent?.Invoke(); } public int[] SelectFamilyIDList; //竞猜玩家选择的仙盟ID顺序 public int[] FinalFamilyIDList; //最终排名顺序,仅活动排名出来后才有值 public Dictionary rightInfoListDict = new Dictionary();//猜中个数明细列表 public Dictionary guessFamilyListDict = new Dictionary();//备选仙盟名单列表 public event Action UpdateFamilyGCZGuessInfoEvent; public void UpdateFamilyGCZGuessInfo(HC032_tagGCFamilyGCZGuessInfo vNetData) { if (vNetData.PlayerID == PlayerDatas.Instance.PlayerId) { SelectFamilyIDList = vNetData.SelectFamilyIDList != null ? vNetData.SelectFamilyIDList.Select(x => (int)x).ToArray() : null; } FinalFamilyIDList = vNetData.FinalFamilyIDList != null ? vNetData.FinalFamilyIDList.Select(x => (int)x).ToArray() : null; if (vNetData.RightInfoList != null) { foreach (var item in vNetData.RightInfoList) { rightInfoListDict[item.AwardID] = item.RightPlayerCnt; } } if (vNetData.GuessFamilyList != null) { foreach (var item in vNetData.GuessFamilyList) { guessFamilyListDict[item.FamilyID] = item.GuessValue; } } UpdateRedpoint(); UpdateFamilyGCZGuessInfoEvent?.Invoke(); } //FamilyID,PlayerID,FairySiegeGroupFamilyMemHurt public Dictionary> hurtMemDict = new Dictionary>(); public event Action OnUpdateFamilyGCZGroupFamilyMemHurtInfoEvent; public void UpdateFamilyGCZGroupFamilyMemHurtInfo(HC031_tagGCFamilyGCZGroupFamilyMemHurtInfo vNetData) { for (int i = 0; i < vNetData.HurtMemList.Length; i++) { if (!hurtMemDict.ContainsKey(vNetData.FamilyID)) { hurtMemDict[vNetData.FamilyID] = new Dictionary(); } if (!hurtMemDict[vNetData.FamilyID].ContainsKey(vNetData.HurtMemList[i].PlayerID)) { hurtMemDict[vNetData.FamilyID][vNetData.HurtMemList[i].PlayerID] = new FairySiegeGroupFamilyMemHurt(); } hurtMemDict[vNetData.FamilyID][vNetData.HurtMemList[i].PlayerID].PlayerID = vNetData.HurtMemList[i].PlayerID; hurtMemDict[vNetData.FamilyID][vNetData.HurtMemList[i].PlayerID].Name = UIHelper.ServerStringTrim(vNetData.HurtMemList[i].Name); hurtMemDict[vNetData.FamilyID][vNetData.HurtMemList[i].PlayerID].HurtValue = vNetData.HurtMemList[i].HurtValueEx * oneHundredMillion + vNetData.HurtMemList[i].HurtValue; } OnUpdateFamilyGCZGroupFamilyMemHurtInfoEvent?.Invoke(); } //FamilyID public Dictionary tagFamilyInfoDict = new Dictionary(); public event Action OnUpdateTagFamilyInfo; public void UpdateTagFamilyInfo(HA413_tagGCTagFamilyInfo vNetData) { if (!tagFamilyInfoDict.ContainsKey(vNetData.FamilyID)) { tagFamilyInfoDict[vNetData.FamilyID] = new FairySiegeTagFamilyInfo(); } tagFamilyInfoDict[vNetData.FamilyID].FamilyID = vNetData.FamilyID; tagFamilyInfoDict[vNetData.FamilyID].FamilyName = UIHelper.ServerStringTrim(vNetData.FamilyName); tagFamilyInfoDict[vNetData.FamilyID].FamilyLV = vNetData.FamilyLV; tagFamilyInfoDict[vNetData.FamilyID].Broadcast = UIHelper.ServerStringTrim(vNetData.Broadcast); tagFamilyInfoDict[vNetData.FamilyID].FightPower = vNetData.FightPowerEx * oneHundredMillion + vNetData.FightPower; tagFamilyInfoDict[vNetData.FamilyID].EmblemID = vNetData.EmblemID; tagFamilyInfoDict[vNetData.FamilyID].ServerID = vNetData.ServerID; foreach (var pack in vNetData.Member) { if (!tagFamilyInfoDict.ContainsKey(pack.PlayerID)) { tagFamilyInfoDict[vNetData.FamilyID].tagFamilyMemberDict[pack.PlayerID] = new FairySiegeTagFamilyMember(); } tagFamilyInfoDict[vNetData.FamilyID].tagFamilyMemberDict[pack.PlayerID].PlayerID = pack.PlayerID; tagFamilyInfoDict[vNetData.FamilyID].tagFamilyMemberDict[pack.PlayerID].Name = UIHelper.ServerStringTrim(pack.Name); tagFamilyInfoDict[vNetData.FamilyID].tagFamilyMemberDict[pack.PlayerID].FamilyLV = pack.FamilyLV; tagFamilyInfoDict[vNetData.FamilyID].tagFamilyMemberDict[pack.PlayerID].LV = pack.LV; tagFamilyInfoDict[vNetData.FamilyID].tagFamilyMemberDict[pack.PlayerID].Job = pack.Job; tagFamilyInfoDict[vNetData.FamilyID].tagFamilyMemberDict[pack.PlayerID].Face = pack.Face; tagFamilyInfoDict[vNetData.FamilyID].tagFamilyMemberDict[pack.PlayerID].FacePic = pack.FacePic; tagFamilyInfoDict[vNetData.FamilyID].tagFamilyMemberDict[pack.PlayerID].OfficialRank = pack.OfficialRank; tagFamilyInfoDict[vNetData.FamilyID].tagFamilyMemberDict[pack.PlayerID].FightPower = pack.FightPowerEx * oneHundredMillion + vNetData.FightPower; } OnUpdateTagFamilyInfo?.Invoke(); } public Action JumpToCityAction; //batType 战场类型 1-初级;2-中级;3-高级; //groupNum 分组编号,从1开始,对应A public int GetBatSceneKey(int batType, int groupNum) { return batType * 10 + groupNum; } //主键,战场信息 //主键=战场类型*10+分组编号 public Dictionary BatSceneInfoDict = new Dictionary(); public event Action UpdateFamilyGCZBatSceneInfoEvent; public event Action UpdateBatSceneHurtListEvent;//收到技能攻击包 public bool TryGetBatSceneInfo(int batType, int groupNum, out FairySiegeBatSceneInfo batSceneInfo) { batSceneInfo = null; int key = GetBatSceneKey(batType, groupNum); if (BatSceneInfoDict == null) return false; return BatSceneInfoDict.TryGetValue(key, out batSceneInfo) && batSceneInfo != null; } public bool TryGetBatSceneCityInfo(int batType, int groupNum, uint cityID, out FairySiegeBatSceneCity batSceneCity) { batSceneCity = null; int key = GetBatSceneKey(batType, groupNum); if (BatSceneInfoDict == null || !TryGetBatSceneInfo(batType, groupNum, out FairySiegeBatSceneInfo batSceneInfo)) return false; if (batSceneInfo == null || batSceneInfo.BatSceneCityDict == null) return false; return batSceneInfo.BatSceneCityDict.TryGetValue(cityID, out batSceneCity) && batSceneCity != null; } public bool TryGetBatSceneSkillAtkCityList(int batType, int groupNum, out List batSceneHurtList) { batSceneHurtList = null; int key = GetBatSceneKey(batType, groupNum); if (BatSceneInfoDict == null) return false; if (!BatSceneInfoDict.TryGetValue(key, out var batSceneInfo) || batSceneInfo == null) return false; batSceneHurtList = batSceneInfo.BatSceneHurtList; return batSceneHurtList.IsNullOrEmpty(); } public bool TryGetCityList(int batType, int groupNum, out List cityIdList) { cityIdList = new List(); if (!TryGetBatSceneInfo(batType, groupNum, out FairySiegeBatSceneInfo batSceneInfo)) return false; if (batSceneInfo == null || batSceneInfo.BatSceneCityDict == null) return false; cityIdList = batSceneInfo.BatSceneCityDict.Keys.ToList(); cityIdList.Sort((x, y) => { ulong hpMaxX = batSceneInfo.BatSceneCityDict[x].HPMax; ulong hpMaxY = batSceneInfo.BatSceneCityDict[y].HPMax; return hpMaxY.CompareTo(hpMaxX); }); return cityIdList != null; } public bool TryGetCityDataList(int batType, int groupNum, out List cityDataList) { cityDataList = new List(); if (!TryGetBatSceneInfo(batType, groupNum, out FairySiegeBatSceneInfo batSceneInfo)) return false; if (batSceneInfo == null || batSceneInfo.BatSceneCityDict == null) return false; cityDataList = batSceneInfo.BatSceneCityDict.Values.ToList(); cityDataList.Sort((x, y) => { return y.HPMax.CompareTo(x.HPMax); }); return cityDataList != null; } public uint BossCityId { get { return 20 * (uint)oneHundredMillion; } } public bool TryGetRegularCityDataList(int batType, int groupNum, out List regularCityDataList) { regularCityDataList = new List(); if (!TryGetCityDataList(batType, groupNum, out List cityDataList)) return false; foreach (var batSceneCity in cityDataList) { if (batSceneCity.CityID == BossCityId) continue; regularCityDataList.Add(batSceneCity); } return regularCityDataList != null; } public bool TryGetBossCityData(int batType, int groupNum, out FairySiegeBatSceneCity bossCityData) { bossCityData = new FairySiegeBatSceneCity(); if (!TryGetBatSceneInfo(batType, groupNum, out FairySiegeBatSceneInfo batSceneInfo)) return false; if (batSceneInfo == null || batSceneInfo.BatSceneCityDict == null) return false; if (!batSceneInfo.BatSceneCityDict.TryGetValue(BossCityId, out bossCityData)) return false; return bossCityData != null; } public bool TryGetCityIndex(int batType, int groupNum, uint cityId, out int index) { index = 0; if (!TryGetCityList(batType, groupNum, out List cityIdList)) return false; if (cityIdList == null) return false; index = cityIdList.IndexOf(cityId); if (index < 0 || index >= cityIdList.Count) return false; return true; } public List GetSummonDragonCityList() { var cityList = new List(); if (TryGetRegularCityDataList(showBatType, showBatGroup, out List regularCityDataList)) { for (int i = 0; i < regularCityDataList.Count; i++) { //排除自己的城池 if (regularCityDataList[i].CityID == myFamilyID) continue; //排除被摧毁的城池 if (regularCityDataList[i].HP <= 0) continue; cityList.Add(regularCityDataList[i]); } } //存在修罗城 if (TryGetBossCityData(showBatType, showBatGroup, out FairySiegeBatSceneCity bossCityData)) { cityList.Add(bossCityData); } cityList.Sort((x, y) => { return y.HPMax.CompareTo(x.HPMax); }); return cityList; } public void UpdateFamilyGCZBatSceneInfo(HC028_tagGCFamilyGCZBatSceneInfo vNetData) { int key = GetBatSceneKey(vNetData.BatType, vNetData.GroupNum); if (!BatSceneInfoDict.ContainsKey(key)) { BatSceneInfoDict[key] = new FairySiegeBatSceneInfo(); } BatSceneInfoDict[key].BatType = vNetData.BatType; BatSceneInfoDict[key].GroupNum = vNetData.GroupNum; BatSceneInfoDict[key].TopFamilyID = vNetData.TopFamilyID; BatSceneInfoDict[key].TopLeaderID = vNetData.TopLeaderID; BatSceneInfoDict[key].TopPlayerID = vNetData.TopPlayerID; BatSceneInfoDict[key].TopPlayerFamilyID = vNetData.TopPlayerFamilyID; BatSceneInfoDict[key].AtkPlayerID = vNetData.AtkPlayerID; BatSceneInfoDict[key].AtkType = vNetData.AtkType; BatSceneInfoDict[key].KillCnt = vNetData.KillCnt; foreach (var city in vNetData.CityList) { if (!BatSceneInfoDict[key].BatSceneCityDict.ContainsKey(city.CityID)) { BatSceneInfoDict[key].BatSceneCityDict[city.CityID] = new FairySiegeBatSceneCity(); } BatSceneInfoDict[key].BatSceneCityDict[city.CityID].CityID = city.CityID; BatSceneInfoDict[key].BatSceneCityDict[city.CityID].CityLV = city.CityLV; BatSceneInfoDict[key].BatSceneCityDict[city.CityID].FamilyID = city.FamilyID; BatSceneInfoDict[key].BatSceneCityDict[city.CityID].Rank = city.Rank; BatSceneInfoDict[key].BatSceneCityDict[city.CityID].HP = city.HPEx * oneHundredMillion + city.HP; BatSceneInfoDict[key].BatSceneCityDict[city.CityID].HPMax = city.HPMaxEx * oneHundredMillion + city.HPMax; BatSceneInfoDict[key].BatSceneCityDict[city.CityID].LastAtkedTime = city.LastAtkedTime; } foreach (var playerInfo in vNetData.PlayerInfoList) { if (!BatSceneInfoDict[key].BatScenePlayerInfoDict.ContainsKey(playerInfo.PlayerID)) { BatSceneInfoDict[key].BatScenePlayerInfoDict[playerInfo.PlayerID] = new FairySiegeBatScenePlayer(); } BatSceneInfoDict[key].BatScenePlayerInfoDict[playerInfo.PlayerID].PlayerID = playerInfo.PlayerID; BatSceneInfoDict[key].BatScenePlayerInfoDict[playerInfo.PlayerID].Name = UIHelper.ServerStringTrim(playerInfo.Name); BatSceneInfoDict[key].BatScenePlayerInfoDict[playerInfo.PlayerID].Job = playerInfo.Job; BatSceneInfoDict[key].BatScenePlayerInfoDict[playerInfo.PlayerID].Face = playerInfo.Face; BatSceneInfoDict[key].BatScenePlayerInfoDict[playerInfo.PlayerID].FacePic = playerInfo.FacePic; BatSceneInfoDict[key].BatScenePlayerInfoDict[playerInfo.PlayerID].FamilyID = playerInfo.FamilyID; } if (vNetData.HurtList != null) { BatSceneInfoDict[key].BatSceneHurtList.Clear(); foreach (var hurt in vNetData.HurtList) { BatSceneInfoDict[key].BatSceneHurtList.Add((new FairySiegeBatSceneHurt() { CityID = hurt.CityID, HurtValue = hurt.HurtValueEx * oneHundredMillion + hurt.HurtValue, })); } UpdateBatSceneHurtListEvent?.Invoke(BatSceneInfoDict[key]); } UpdateFamilyGCZBatSceneInfoEvent?.Invoke(); } public bool isClickCity = false; public bool isWaitC030Pack = false; // 是否等待C030包返回,避免多次点击按钮发送请求 //当前最新的信息 public FairySiegeBatCityInfo nowFairySiegeBatCityInfo = new FairySiegeBatCityInfo(); //当前最新信息的上一次信息 public FairySiegeBatCityInfo lastFairySiegeBatCityInfo = new FairySiegeBatCityInfo(); //当前的城池信息 public event Action UpdateFamilyGCZBatCityInfoEvent; public void UpdateFamilyGCZBatCityInfo(HC029_tagGCFamilyGCZBatCityInfo vNetData) { DeepCopyFairySiegeBatCityInfo(nowFairySiegeBatCityInfo, lastFairySiegeBatCityInfo); nowFairySiegeBatCityInfo.CityID = vNetData.CityID; nowFairySiegeBatCityInfo.CityLV = vNetData.CityLV; nowFairySiegeBatCityInfo.FamilyID = vNetData.FamilyID; nowFairySiegeBatCityInfo.GuardID = vNetData.GuardID; nowFairySiegeBatCityInfo.HP = vNetData.HPEx * oneHundredMillion + vNetData.HP; nowFairySiegeBatCityInfo.HPMax = vNetData.HPMaxEx * oneHundredMillion + vNetData.HPMax; nowFairySiegeBatCityInfo.AtkPlayerID = vNetData.AtkPlayerID; nowFairySiegeBatCityInfo.AtkRet = vNetData.AtkRet; nowFairySiegeBatCityInfo.KillCnt = vNetData.KillCnt; nowFairySiegeBatCityInfo.HurtValue = vNetData.HurtValueEx * oneHundredMillion + vNetData.HurtValue; UpdateFamilyGCZBatCityInfoEvent?.Invoke(); } public void DeepCopyFairySiegeBatCityInfo(FairySiegeBatCityInfo source, FairySiegeBatCityInfo target) { target.CityID = source.CityID; target.CityLV = source.CityLV; target.FamilyID = source.FamilyID; target.GuardID = source.GuardID; target.HP = source.HP; target.HPMax = source.HPMax; target.AtkPlayerID = source.AtkPlayerID; target.AtkRet = source.AtkRet; target.KillCnt = source.KillCnt; target.HurtValue = source.HurtValue; } // 深拷贝方法 public FairySiegeBatSceneInfo DeepCopyFairySiegeBatSceneInfo(FairySiegeBatSceneInfo source) { var copy = new FairySiegeBatSceneInfo { BatType = source.BatType, GroupNum = source.GroupNum, TopFamilyID = source.TopFamilyID, TopLeaderID = source.TopLeaderID, TopPlayerID = source.TopPlayerID, TopPlayerFamilyID = source.TopPlayerFamilyID, AtkPlayerID = source.AtkPlayerID, AtkType = source.AtkType, KillCnt = source.KillCnt, HurtCnt = source.HurtCnt }; foreach (var kvp in source.BatSceneCityDict) { copy.BatSceneCityDict[kvp.Key] = new FairySiegeBatSceneCity { CityID = kvp.Value.CityID, CityLV = kvp.Value.CityLV, FamilyID = kvp.Value.FamilyID, Rank = kvp.Value.Rank, HP = kvp.Value.HP, HPMax = kvp.Value.HPMax, LastAtkedTime = kvp.Value.LastAtkedTime }; } foreach (var kvp in source.BatScenePlayerInfoDict) { copy.BatScenePlayerInfoDict[kvp.Key] = new FairySiegeBatScenePlayer { PlayerID = kvp.Value.PlayerID, Name = kvp.Value.Name, Job = kvp.Value.Job, Face = kvp.Value.Face, FacePic = kvp.Value.FacePic, FamilyID = kvp.Value.FamilyID }; } foreach (var item in source.BatSceneHurtList) { copy.BatSceneHurtList.Add(new FairySiegeBatSceneHurt { CityID = item.CityID, HurtValue = item.HurtValue }); } return copy; } } #endregion public class FairySiegeAtkAwardInfo { public int atkType; public int hurtCnt; public int killCntTotal; public long hurtValueTotal; } public class FairySiegeBatCityInfo { public uint CityID; //城池ID public int CityLV; //城池等级 public uint FamilyID; //所属仙盟ID,可能为0 public uint GuardID; //当前防守成员ID,为0时表示没有防守成员了,城池已被击毁 public ulong HP; //防守成员剩余生命,剩余生命为0时代表该防守成员被击败 public ulong HPMax; //防守成员最大生命 public uint AtkPlayerID; //发起攻击的玩家ID,可能为0,判断是否自己的ID进行相应的攻击表现 public int AtkRet; //攻击结果,仅在攻击玩家ID不为0时有效,0--成功;1-目标已被击杀;2-城池已被摧毁;3-其他 public int KillCnt; //本次攻击击杀防守人员数 public ulong HurtValue; //伤害飘血 } public class FairySiegeBatScenePlayer { public uint PlayerID; public string Name; public byte Job; public uint Face; public uint FacePic; public uint FamilyID; } public class FairySiegeBatSceneHurt { public uint CityID; //被攻击的城池ID public ulong HurtValue; //伤害飘血,求余亿部分 } public class FairySiegeBatSceneCity { public uint CityID; //城池ID public byte CityLV; //城池等级 public uint FamilyID; //所属仙盟ID,可能为0 public byte Rank; //当前名次,从1开始 public ulong HP; //剩余生命 public ulong HPMax; //最大生命 public uint LastAtkedTime; //最后一次被攻击时间戳,可能为0 } public class FairySiegeBatSceneInfo { public byte BatType; // 战场类型 1-初级;2-中级;3-高级; public byte GroupNum; // 分组编号,从1开始,对应A public uint TopFamilyID; // 伤害第一仙盟ID public uint TopLeaderID; // 伤害第一盟主ID public uint TopPlayerID; // 伤害第一玩家ID public uint TopPlayerFamilyID; // 伤害第一玩家仙盟ID public uint AtkPlayerID; // 发起攻击的玩家,可能为0,仅技能攻击时通知,普攻时仅通知血量等信息 public byte AtkType; // 攻击类型,有发起攻击的玩家时有效 public byte KillCnt; // 本次攻击累计击杀数,有发起攻击的玩家时有效 public byte HurtCnt; //CityID public Dictionary BatSceneCityDict = new Dictionary(); //PlayerID public Dictionary BatScenePlayerInfoDict = new Dictionary(); public List BatSceneHurtList = new List(); } public class FairySiegeAllRoundData { public int batType; // 战场类型 public int groupNum; // 分组编号 public int rank; // 排名 public int score; // 积分 } public class FairySiegeTagFamilyMember { public uint PlayerID; public string Name; //size = NameLen public byte FamilyLV; //家族成员等级 public ushort LV; public byte Job; //职业 public uint Face; //头像 public uint FacePic; //头像外框 public byte OfficialRank; //境界 public ulong FightPower; //成员战力,求余亿部分 } public class FairySiegeTagFamilyInfo { public uint FamilyID; public string FamilyName; //家族名称 public int FamilyLV; //家族等级 public string Broadcast; //size = BroadcastLen public ulong FightPower; //仙盟总战力,求余亿部分 public uint EmblemID; //徽章ID public uint ServerID; //仙盟区服ID public Dictionary tagFamilyMemberDict = new Dictionary(); } public class FairySiegeGroupFamilyMemHurt { public uint PlayerID; public string Name; //参与玩家名字 public ulong HurtValue; //伤害 } public class FairySiegeBatRepHurt { public uint TagFamilyID; //目标仙盟ID public uint HurtValue; //输出伤害 } public class FairySiegeMemHurt { public uint PlayerID; public string Name; //参与玩家名字 public ulong HurtValue; //伤害 } public class FairySiegeRoundRule { public int GroupCount; public int TopXPromote; public int BottomXDemote; } public class FairySiegeFamilyInfo { public uint FamilyID; public string Name; //参与仙盟名字 public int LV; //仙盟等级 public uint ServerID; //仙盟所属区服ID public uint EmblemID; //徽章ID public ulong FightPower; //仙盟总战力 public uint LeaderID; //盟主ID public string LeaderName; //盟主名 public uint LeaderFace; public uint LeaderFacePic; } public class FairySiegeCampMember { public uint PlayerID; public string Name; //参与玩家名字 public int FamilyLV; //参与时的家族职位 public uint Job; //基本脸型 public uint Face; //基本脸型 public uint FacePic; //头像框 public ulong FightPower; //战力 public ulong HP; //剩余生命 public ulong HPMax; //最大生命 public ulong TotalHurt; //活动总伤害 } public class FairySiegeCampRound { public byte RoundNum; //轮次编号,从1开始 public byte BatType; //所在战场类型 public byte GroupNum; //所在分组编号 public byte Rank; //本轮排名 public ushort Score; //本轮积分,总积分为所有轮次累加 public byte UpdownState; //本轮结算晋级降级状态:0-未处理,1-降级;2-保级;3-晋级,即本轮的晋降级状态决定下一轮的战场类型 } public enum FairySiegeRedPointType { Guess = 1, // 竞猜入口 GuessAward = 11, // 竞猜奖励入口 Gift = 2, // 礼包入口 Help = 3, // 仙盟协力入口 Base = 4, // 大本营入口 BaseTabCity = 41, //大本营-城池备战 BaseLowContribution = 411,//大本营-低级捐献 BaseHighContribution = 412,//大本营-高级捐献 Spring = 5, // 圣泉入口 Go = 6, // 进入入口 SummonDragon = 61, // 进入-神龙召唤 SummonDragonFLZT = 611,//进入-神龙召唤-飞龙在天 SummonDragonLTWJ = 612,//进入-神龙召唤-雷霆万钧 Atk = 62,//进入-普通攻击 RankAward = 7, // 排行奖励入口 RankAwardPlayer = 71, // 排行奖励入口 RankAwardFamily = 72, // 排行奖励入口 Like = 8,//点赞 } }