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<int, Dictionary<int, uint[]>> batGroupInfo = new Dictionary<int, Dictionary<int, uint[]>>();
|
// 玩家信息
|
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<PackModel>(); } }
|
FairySiegeHelpModel fairySiegeHelpModel { get { return ModelCenter.Instance.GetModel<FairySiegeHelpModel>(); } }
|
|
public Dictionary<int, List<int[]>> killDefMemRewardDict = new Dictionary<int, List<int[]>>(); //击杀防守成员额外奖励库列表[[权重, [物品ID, 个数, 是否拍品]], ...]
|
RankModel rankModel { get { return ModelCenter.Instance.GetModel<RankModel>(); } }
|
VipModel vipModel { get { return ModelCenter.Instance.GetModel<VipModel>(); } }
|
StoreModel storeModel { get { return ModelCenter.Instance.GetModel<StoreModel>(); } }
|
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<int[][]>(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<int, Dictionary<int, int[]>>();
|
|
JsonData roundsData = jsonData[participantCountStr];
|
foreach (string roundStr in roundsData.Keys)
|
{
|
int round = int.Parse(roundStr);
|
var battleTypeDict = new Dictionary<int, int[]>();
|
|
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<int, int>();
|
|
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<int[][]>(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<int[]>(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<int[]>();
|
}
|
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<int[]>();
|
}
|
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<int[]>();
|
}
|
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<int[]>(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<FairySiegePromotionEndWin>())
|
{
|
WindowCenter.Instance.Open<FairySiegePromotionEndWin>();
|
}
|
return;
|
}
|
|
//0-未处理;1-降级;2-保级;3-晋级
|
switch (newCampRound.UpdownState)
|
{
|
case 1:
|
if (!WindowCenter.Instance.IsOpen<FairySiegePromotionFailedWin>())
|
{
|
WindowCenter.Instance.Open<FairySiegePromotionFailedWin>();
|
}
|
break;
|
case 2:
|
if (!WindowCenter.Instance.IsOpen<FairySiegePromotionSurvivalWin>())
|
{
|
WindowCenter.Instance.Open<FairySiegePromotionSurvivalWin>();
|
}
|
break;
|
case 3:
|
if (!WindowCenter.Instance.IsOpen<FairySiegePromotionSuccessWin>())
|
{
|
WindowCenter.Instance.Open<FairySiegePromotionSuccessWin>();
|
}
|
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<PetHorseActWin>();
|
}
|
}
|
|
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<int, int> 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<int, int> 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<int, Redpoint> redPointDict = new Dictionary<int, Redpoint>();
|
|
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, FairySiegeRedPointType>
|
{
|
{ 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<int, FairySiegeAllRoundData> roundsData = new Dictionary<int, FairySiegeAllRoundData>();
|
//查询第一名信息,界面快速切换查询回包和界面不一致 需多个ID记录
|
public int no1PlayerIDCross;
|
public int no1PlayerIDCrossFamily; //盟主
|
|
//排行榜名次信息
|
public int SelectRank { get; set; }
|
|
//排行榜奖励信息
|
public int SelectAwardRank { get; set; }
|
public event Action OnPlayerInfo;
|
public event Action<int> 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<int, Dictionary<int, Dictionary<int, int[]>>> matchRuleDict = new Dictionary<int, Dictionary<int, Dictionary<int, int[]>>>();
|
//<战场类型,<名次,积分>>
|
public Dictionary<int, Dictionary<int, int>> rankToScoreRawDict = new Dictionary<int, Dictionary<int, int>>();
|
//<名次,int[]{低级战场积分,中级战场积分,高级战场积分}>
|
Dictionary<int, int[]> rankToScoreDict = new Dictionary<int, int[]>();
|
|
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<RankRowData> scoreRowList = new List<RankRowData>();
|
|
// 获取所有行数据
|
public List<RankRowData> GetScoreRowData()
|
{
|
if (scoreRowList.IsNullOrEmpty())
|
{
|
// 获取所有战场类型中配置的排名点,并去重排序
|
var allRankPoints = new SortedSet<int>();
|
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;
|
//key = battlefieldType * 10 + battlefieldGroup
|
private List<int> switchGroupList = new List<int>();
|
|
public List<int> GetSwitchGroupList()
|
{
|
if (switchGroupList.IsNullOrEmpty())
|
{
|
if (batGroupInfo != null)
|
{
|
List<int> 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()
|
{
|
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<int> 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<int> GetMatchedEntryIDs()
|
{
|
// 创建结果列表
|
List<int> matchedEntryIDs = new List<int>();
|
|
// 检查输入有效性
|
if (SelectFamilyIDList == null || FinalFamilyIDList == null ||
|
SelectFamilyIDList.Length != 3 || FinalFamilyIDList.Length != 3)
|
{
|
return matchedEntryIDs;
|
}
|
|
// 检查猜中的名次
|
List<int> rightRanks = new List<int>();
|
|
// 检查冠军(第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<int, List<int[]>> lowDonateRewardDict = new Dictionary<int, List<int[]>>();//低级捐献概率获得物品库 [[权重, [物品ID,个数,是否拍品]], ,,,]
|
public int highDonateItemId; //高级捐献物品ID
|
public int highDonateOnceExpAdd; //高级捐献一次等级经验增加x
|
//<权重,物品信息列表>
|
public Dictionary<int, List<int[]>> highDonateRewardDict = new Dictionary<int, List<int[]>>();//高级捐献概率获得物品库 [[权重, [物品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<int> GetAllUniqueItemIDs(Dictionary<int, List<int[]>> dict)
|
{
|
List<int> res = new List<int>();
|
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<Item> gridAwardList = new List<Item>();
|
public List<Item> passAllAwardList;
|
public Action UpdateGridAwardAction;
|
|
//自动挖宝
|
public bool isSpringAuto = false;
|
|
//普通格子奖励 正常通关奖励 和全部通通关奖励
|
public class FairySiegeAwardInfo
|
{
|
public string eventName;
|
public List<Item> showItems;
|
public string info;
|
public FairySiegeAtkAwardInfo atkAwardInfo;
|
}
|
|
public Action<HA801_tagMCGiveAwardInfo> UpdateAwardInfoAction;
|
public Queue<FairySiegeAwardInfo> sqAwardQueue = new Queue<FairySiegeAwardInfo>();
|
public Queue<FairySiegeAwardInfo> contiributionAwardQueue = new Queue<FairySiegeAwardInfo>();
|
public Queue<FairySiegeAwardInfo> atkAwardQueue = new Queue<FairySiegeAwardInfo>();
|
public Queue<FairySiegeAwardInfo> cityAwardQueue = new Queue<FairySiegeAwardInfo>();
|
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<Item> GetShowItems(HA801_tagMCGiveAwardInfo netPack)
|
{
|
List<Item> showItems = new List<Item>();
|
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<int, Item> totalSpringShowItems = new Dictionary<int, Item>();
|
public event Action OnGetSpringItemShowEvent;
|
private string getItemSpringEventName;
|
|
public void ClearGetItem()
|
{
|
//不清理物品,下次收到数据会自动清理,只改事件方便打开界面测试
|
getItemSpringEventName = "";
|
}
|
|
// 通用显示获得的物品
|
public void ShowGetItem(List<Item> items, string info = "", int seconds = 3, string btnName = "", Action func = null, bool isNameShow = true, string eventName = "default")
|
{
|
if (getItemSpringEventName != eventName)
|
{
|
if (WindowCenter.Instance.IsOpen<FairySiegeSpringPassAllAwardWin>())
|
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<FairySiegeSpringPassAllAwardWin>())
|
WindowCenter.Instance.Open<FairySiegeSpringPassAllAwardWin>();
|
}
|
|
#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;
|
|
//<job,effectId>
|
public Dictionary<int, int> atkEffectDict = new Dictionary<int, int>();
|
|
//<job,delay>
|
public Dictionary<int, float> atkEffectDelayDict = new Dictionary<int, float>();
|
|
//<job,duration>
|
public Dictionary<int, float> atkEffectDurationDict = new Dictionary<int, float>();
|
|
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<uint> 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<FairySiegeFamilyInfo> 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<FairySiegeCampMember> list)
|
{
|
list = new List<FairySiegeCampMember>();
|
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<string> GetLeaderNameTopCnt(int count)
|
{
|
if (!TryGetSortServerIdList(out List<uint> list))
|
return null;
|
List<string> res = new List<string>();
|
bool isBreak = false;
|
foreach (var serverId in list)
|
{
|
if (!TryGetSortFamilyList(serverId, out List<FairySiegeFamilyInfo> 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<string> 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<int, uint[]>();
|
}
|
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<int, FairySiegeCampRound> campRoundDict = new Dictionary<int, FairySiegeCampRound>();
|
|
public bool TryGetNewCampRound(out FairySiegeCampRound fairySiegeCampRound)
|
{
|
fairySiegeCampRound = null;
|
|
if (campRoundDict == null || campRoundDict.Count == 0)
|
return false;
|
var keys = campRoundDict.Keys.ToList();
|
keys.Sort();
|
int latestRoundKey = keys[keys.Count - 1];
|
fairySiegeCampRound = campRoundDict[latestRoundKey];
|
return fairySiegeCampRound != null;
|
}
|
|
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;
|
}
|
|
//<playerId,人员信息>
|
public Dictionary<uint, FairySiegeCampMember> campMemberDict = new Dictionary<uint, FairySiegeCampMember>();
|
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<uint, uint> contributionInfoDict = new Dictionary<uint, uint>();
|
|
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<uint, Dictionary<uint, ulong>> batReportDefDict = new Dictionary<uint, Dictionary<uint, ulong>>();
|
public Dictionary<uint, Dictionary<uint, ulong>> batReportAtkDict = new Dictionary<uint, Dictionary<uint, ulong>>();
|
|
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<uint, ulong>();
|
}
|
if (!batReportAtkDict.ContainsKey(vNetData.FamilyID))
|
{
|
batReportAtkDict[vNetData.FamilyID] = new Dictionary<uint, ulong>();
|
}
|
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<uint, FairySiegeMemHurt> groupFamilyMemHurtInfo = new Dictionary<uint, FairySiegeMemHurt>();
|
|
public void UpdateGroupFamilyMemHurtInfo(HC031_tagGCFamilyGCZGroupFamilyMemHurtInfo vNetData)
|
{
|
if (!groupFamilyMemHurtInfo.ContainsKey(vNetData.FamilyID))
|
{
|
groupFamilyMemHurtInfo = new Dictionary<uint, FairySiegeMemHurt>();
|
}
|
|
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<int, Item> sqInfoDict = new Dictionary<int, Item>();
|
|
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<int, int> rightInfoListDict = new Dictionary<int, int>();//猜中个数明细列表
|
public Dictionary<uint, uint> guessFamilyListDict = new Dictionary<uint, uint>();//备选仙盟名单列表
|
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<uint, Dictionary<uint, FairySiegeGroupFamilyMemHurt>> hurtMemDict = new Dictionary<uint, Dictionary<uint, FairySiegeGroupFamilyMemHurt>>();
|
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<uint, FairySiegeGroupFamilyMemHurt>();
|
}
|
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<uint, FairySiegeTagFamilyInfo> tagFamilyInfoDict = new Dictionary<uint, FairySiegeTagFamilyInfo>();
|
|
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[vNetData.FamilyID] = new FairySiegeTagFamilyMember();
|
}
|
tagFamilyInfoDict[vNetData.FamilyID].tagFamilyMemberDict[vNetData.FamilyID].PlayerID = pack.PlayerID;
|
tagFamilyInfoDict[vNetData.FamilyID].tagFamilyMemberDict[vNetData.FamilyID].Name = UIHelper.ServerStringTrim(pack.Name);
|
tagFamilyInfoDict[vNetData.FamilyID].tagFamilyMemberDict[vNetData.FamilyID].FamilyLV = pack.FamilyLV;
|
tagFamilyInfoDict[vNetData.FamilyID].tagFamilyMemberDict[vNetData.FamilyID].LV = pack.LV;
|
tagFamilyInfoDict[vNetData.FamilyID].tagFamilyMemberDict[vNetData.FamilyID].Job = pack.Job;
|
tagFamilyInfoDict[vNetData.FamilyID].tagFamilyMemberDict[vNetData.FamilyID].Face = pack.Face;
|
tagFamilyInfoDict[vNetData.FamilyID].tagFamilyMemberDict[vNetData.FamilyID].FacePic = pack.FacePic;
|
tagFamilyInfoDict[vNetData.FamilyID].tagFamilyMemberDict[vNetData.FamilyID].OfficialRank = pack.OfficialRank;
|
tagFamilyInfoDict[vNetData.FamilyID].tagFamilyMemberDict[vNetData.FamilyID].FightPower = pack.FightPowerEx * oneHundredMillion + vNetData.FightPower;
|
}
|
OnUpdateTagFamilyInfo?.Invoke();
|
}
|
|
public Action<uint> JumpToCityAction;
|
|
//batType 战场类型 1-初级;2-中级;3-高级;
|
//groupNum 分组编号,从1开始,对应A
|
public int GetBatSceneKey(int batType, int groupNum)
|
{
|
return batType * 10 + groupNum;
|
}
|
|
//主键,战场信息
|
//主键=战场类型*10+分组编号
|
public Dictionary<int, FairySiegeBatSceneInfo> BatSceneInfoDict = new Dictionary<int, FairySiegeBatSceneInfo>();
|
|
public event Action UpdateFamilyGCZBatSceneInfoEvent;
|
public event Action<FairySiegeBatSceneInfo> 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<FairySiegeBatSceneHurt> 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<uint> cityIdList)
|
{
|
cityIdList = new List<uint>();
|
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<FairySiegeBatSceneCity> cityDataList)
|
{
|
cityDataList = new List<FairySiegeBatSceneCity>();
|
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<FairySiegeBatSceneCity> regularCityDataList)
|
{
|
regularCityDataList = new List<FairySiegeBatSceneCity>();
|
if (!TryGetCityDataList(batType, groupNum, out List<FairySiegeBatSceneCity> 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<uint> cityIdList))
|
return false;
|
if (cityIdList == null)
|
return false;
|
index = cityIdList.IndexOf(cityId);
|
if (index < 0 || index >= cityIdList.Count)
|
return false;
|
return true;
|
}
|
|
public List<FairySiegeBatSceneCity> GetSummonDragonCityList()
|
{
|
var cityList = new List<FairySiegeBatSceneCity>();
|
if (TryGetRegularCityDataList(showBatType, showBatGroup, out List<FairySiegeBatSceneCity> 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 myFairySiegeBatCityInfo = new FairySiegeBatCityInfo();
|
//我发起攻击时的内容
|
public FairySiegeBatCityInfo lastFairySiegeBatCityInfo = new FairySiegeBatCityInfo();
|
//当前最新的结果
|
public FairySiegeBatCityInfo nowFairySiegeBatCityInfo = new FairySiegeBatCityInfo();
|
public event Action<FairySiegeBatCityInfo> UpdateFamilyGCZBatCityInfoEvent;
|
|
public void UpdateFamilyGCZBatCityInfo(HC029_tagGCFamilyGCZBatCityInfo vNetData)
|
{
|
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(nowFairySiegeBatCityInfo);
|
}
|
|
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<uint, FairySiegeBatSceneCity> BatSceneCityDict = new Dictionary<uint, FairySiegeBatSceneCity>();
|
//PlayerID
|
public Dictionary<uint, FairySiegeBatScenePlayer> BatScenePlayerInfoDict = new Dictionary<uint, FairySiegeBatScenePlayer>();
|
public List<FairySiegeBatSceneHurt> BatSceneHurtList = new List<FairySiegeBatSceneHurt>();
|
}
|
|
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<uint, FairySiegeTagFamilyMember> tagFamilyMemberDict = new Dictionary<uint, FairySiegeTagFamilyMember>();
|
}
|
|
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,//点赞
|
}
|
}
|