using vnxbqy.UI;
|
using System.Collections.Generic;
|
using System.Linq;
|
using LitJson;
|
using System;
|
|
|
public class RealmLVZhanlingModel : ILModel<RealmLVZhanlingModel>
|
{
|
// 战令类型对应的充值ID列表
|
public Dictionary<int, int> ctgIdDict = new Dictionary<int, int>();
|
//收到的所有服务器战令包字典
|
public Dictionary<int, ZhanlingInfo> zhanLingInfoDict = new Dictionary<int, ZhanlingInfo>();
|
//战令类型: 所需值 :key
|
public Dictionary<int, Dictionary<int, int>> typeToIDListDict = new Dictionary<int, Dictionary<int, int>>();
|
public event Action UpdateGiftStateEvent;
|
public Redpoint redpoint = new Redpoint(MainRedPoint.RechargeGenerousGiftWinRedpoint, MainRedPoint.RealmLvZhanlingRedpoint);
|
List<ZhanLingGiftItemInfo> allGiftItemList = new List<ZhanLingGiftItemInfo>();
|
//同步播放摆动动画
|
public Action PlayAnimationSync;
|
private bool isPlayAnimation = false;
|
public bool IsPlayAnimation
|
{
|
get
|
{
|
return isPlayAnimation;
|
}
|
set
|
{
|
isPlayAnimation = value;
|
if (isPlayAnimation)
|
{
|
PlayAnimationSync?.Invoke();
|
}
|
isPlayAnimation = false;
|
}
|
}
|
protected override void Init()
|
{
|
GameEvent.beforePlayerDataInitializeEvent += OnbeforePlayerDataInitialize;
|
PlayerDatas.Instance.playerDataRefreshEvent += OnplayerDataRefreshEvent;
|
FuncOpen.Instance.OnFuncStateChangeEvent += OnFunctionStateChange;
|
ctgIdDict = GeneralDefine.OldZhanLingCtgIdDict;
|
typeToIDListDict = ILZhanlingConfig.GetAllTypeToIDListDict();
|
}
|
|
private void OnplayerDataRefreshEvent(PlayerDataType type)
|
{
|
if (type == PlayerDataType.RealmLevel)
|
{
|
UpdateRedpoint(2);
|
}
|
}
|
|
private void OnbeforePlayerDataInitialize()
|
{
|
zhanLingInfoDict.Clear();
|
}
|
|
protected override void UnInit()
|
{
|
GameEvent.beforePlayerDataInitializeEvent -= OnbeforePlayerDataInitialize;
|
PlayerDatas.Instance.playerDataRefreshEvent -= OnplayerDataRefreshEvent;
|
FuncOpen.Instance.OnFuncStateChangeEvent -= OnFunctionStateChange;
|
}
|
|
public void UpdateGiftState(HB120_tagMCZhanlingInfo vNetData)
|
{
|
if (zhanLingInfoDict.ContainsKey(vNetData.ZhanlingType))
|
{
|
zhanLingInfoDict[vNetData.ZhanlingType].isActivite = vNetData.IsActivite;
|
zhanLingInfoDict[vNetData.ZhanlingType].isActiviteH = vNetData.IsActiviteH;
|
if (vNetData.RewardCount != 0)
|
{
|
for (int i = 0; i < vNetData.RewardCount; i++)
|
{
|
zhanLingInfoDict[vNetData.ZhanlingType].freeZhanHaveDict[(int)vNetData.RewardList[i].NeedValue] = (int)vNetData.RewardList[i].FreeRewardState;
|
zhanLingInfoDict[vNetData.ZhanlingType].paidZhanHaveDict[(int)vNetData.RewardList[i].NeedValue] = (int)vNetData.RewardList[i].ZLRewardState;
|
zhanLingInfoDict[vNetData.ZhanlingType].paidZhanHaveHDict[(int)vNetData.RewardList[i].NeedValue] = (int)vNetData.RewardList[i].ZLRewardStateH;
|
|
}
|
}
|
}
|
else
|
{
|
ZhanlingInfo zhanlingInfo = new ZhanlingInfo();
|
zhanlingInfo.zhanLingType = vNetData.ZhanlingType;
|
zhanlingInfo.isActivite = vNetData.IsActivite;
|
zhanlingInfo.isActiviteH = vNetData.IsActiviteH;
|
zhanlingInfo.rewardCount = vNetData.RewardCount;
|
zhanlingInfo.value1 = (int)vNetData.Value1;
|
zhanlingInfo.freeZhanHaveDict = new Dictionary<int, int>();
|
zhanlingInfo.paidZhanHaveDict = new Dictionary<int, int>();
|
zhanlingInfo.paidZhanHaveHDict = new Dictionary<int, int>();
|
for (int i = 0; i < zhanlingInfo.rewardCount; i++)
|
{
|
zhanlingInfo.freeZhanHaveDict[(int)vNetData.RewardList[i].NeedValue] = vNetData.RewardList[i].FreeRewardState;
|
zhanlingInfo.paidZhanHaveDict[(int)vNetData.RewardList[i].NeedValue] = vNetData.RewardList[i].ZLRewardState;
|
zhanlingInfo.paidZhanHaveHDict[(int)vNetData.RewardList[i].NeedValue] = vNetData.RewardList[i].ZLRewardStateH;
|
}
|
zhanLingInfoDict[zhanlingInfo.zhanLingType] = zhanlingInfo;
|
}
|
if (vNetData.ZhanlingType == 2)
|
{
|
UpdateRedpoint(2);
|
UpdateGiftStateEvent?.Invoke();
|
}
|
|
|
}
|
|
private void OnFunctionStateChange(int id)
|
{
|
if (id == 218)
|
{
|
UpdateRedpoint(2);
|
}
|
}
|
// 获得当前按钮显示的状态
|
// 0 不能领 1 未领取 2 已领取
|
public int GetGiftState(int zhanLingType, int needValue, bool isFreeGift)
|
{
|
//玩家等级能不能领
|
if (PlayerDatas.Instance.baseData.realmLevel >= needValue)
|
{
|
//是不是免费礼包
|
if (isFreeGift)
|
{
|
return IsHaveZhanLingGift(zhanLingType, needValue, true) ? 2 : 1;
|
}
|
else
|
{
|
//买没买过付费战令
|
if (zhanLingInfoDict[zhanLingType].isActivite > 0)
|
{
|
return IsHaveZhanLingGift(zhanLingType, needValue, false) ? 2 : 1;
|
}
|
else
|
{
|
return 0;
|
}
|
}
|
}
|
else
|
{
|
return 0;
|
}
|
}
|
//发包
|
public void HaveGift(int zhanLingType, int needValue, bool isFreeGift)
|
{
|
var pak = new IL_CA504_tagCMPlayerGetReward();
|
string dataExStr = isFreeGift ? (needValue * 10 + 0).ToString() : (needValue * 10 + 1).ToString();
|
pak.RewardType = (byte)65;
|
pak.DataEx = (uint)zhanLingType;
|
pak.DataExStrLen = (byte)dataExStr.Length;
|
pak.DataExStr = dataExStr;
|
GameNetSystem.Instance.SendInfo(pak);
|
}
|
//是否领取了当前这档的物品
|
public bool IsHaveZhanLingGift(int zhanLingType, int needValue, bool isFreeGift)
|
{
|
return isFreeGift ? zhanLingInfoDict[zhanLingType].freeZhanHaveDict[needValue] > 0 : zhanLingInfoDict[zhanLingType].paidZhanHaveDict[needValue] > 0;
|
}
|
//获取ItemCell的ID
|
public int GetItemCellID(int zhanLingType, int needValue, bool isFreeGift, int loopIndedx = 0)
|
{
|
return isFreeGift ? ILZhanlingConfig.Get(typeToIDListDict[zhanLingType][needValue]).FreeRewardItemList[0][0] : ILZhanlingConfig.Get(typeToIDListDict[zhanLingType][needValue]).ZLRewardItemList[loopIndedx][0];
|
}
|
//获取ItemCell的数量
|
public int GetItemCellCount(int zhanLingType, int needValue, bool isFreeGift, int loopIndedx = 0)
|
{
|
return isFreeGift ? ILZhanlingConfig.Get(typeToIDListDict[zhanLingType][needValue]).FreeRewardItemList[0][1] : ILZhanlingConfig.Get(typeToIDListDict[zhanLingType][needValue]).ZLRewardItemList[loopIndedx][1];
|
}
|
//获取最小未领取的物品索引
|
public int GetJumpStartIndex(int zhanLingType)
|
{
|
var infoDict = ILZhanlingConfig.GetTypeToIDDict(zhanLingType);
|
if (infoDict.IsNullOrEmpty())
|
return 0;
|
|
List<int> infoList = infoDict.Keys.ToList();
|
if (infoList.IsNullOrEmpty())
|
return 0;
|
|
if (zhanLingInfoDict.IsNullOrEmpty() || !zhanLingInfoDict.ContainsKey(zhanLingType))
|
return 0;
|
|
var zhanLingInfo = zhanLingInfoDict[zhanLingType];
|
|
int index = 0;
|
bool allItemsClaimed = true;
|
|
for (int i = 0; i < infoList.Count; i++)
|
{
|
int needValue = infoList[i];
|
bool isHaveFree = zhanLingInfo.freeZhanHaveDict.GetValueOrDefault(needValue, 0) > 0;
|
bool isHavePaid = zhanLingInfo.paidZhanHaveDict.GetValueOrDefault(needValue, 0) > 0;
|
|
if (!isHaveFree || !isHavePaid)
|
{
|
allItemsClaimed = false;
|
if (!isHaveFree)
|
{
|
index = i;
|
break;
|
}
|
|
if (zhanLingInfo.isActivite > 0 && !isHavePaid)
|
{
|
index = i;
|
break;
|
}
|
}
|
}
|
|
if (allItemsClaimed && zhanLingInfo.isActivite > 0)
|
{
|
return infoList.Count - 1;
|
}
|
|
return Math.Max(0, index - 2);
|
}
|
//一键获取所有可领取的礼品,弹出展示窗口
|
public void HaveAllZhanLingGift(int zhanLingType)
|
{
|
//没有格子
|
if (ModelCenter.Instance.GetModelEx<PackModel>().GetEmptyGridCount(PackType.Item) < 1)
|
{
|
SysNotifyMgr.Instance.ShowTip("GeRen_lhs_202580");
|
return;
|
}
|
List<int> haveFreeRewardItemList = new List<int>(); //用户领到的免费物品的所需值列表
|
List<int> havePaidRewardItemList = new List<int>(); //用户领到的付费物品的所需值列表
|
var needValueList = ILZhanlingConfig.GetTypeToIDDict(zhanLingType).Keys.ToList();
|
for (int i = 0; i < needValueList.Count; i++)
|
{
|
int freeState = GetGiftState(zhanLingType, needValueList[i], true);
|
int paidState = GetGiftState(zhanLingType, needValueList[i], false);
|
if (freeState == 1)
|
{
|
haveFreeRewardItemList.Add(needValueList[i]);
|
}
|
if (paidState == 1)
|
{
|
havePaidRewardItemList.Add(needValueList[i]);
|
}
|
}
|
MergeAllHaveZhanLingGift(zhanLingType, haveFreeRewardItemList, havePaidRewardItemList);
|
DebugEx.Log($"背包空格 {ModelCenter.Instance.GetModelEx<PackModel>().GetEmptyGridCount(PackType.Item)} 需要格子 {allGiftItemList.Count}");
|
if (ModelCenter.Instance.GetModelEx<PackModel>().GetEmptyGridCount(PackType.Item) >= allGiftItemList.Count)
|
{
|
for (int i = 0; i < needValueList.Count; i++)
|
{
|
int freeState = GetGiftState(zhanLingType, needValueList[i], true);
|
int paidState = GetGiftState(zhanLingType, needValueList[i], false);
|
if (freeState == 1)
|
{
|
HaveGift(zhanLingType, needValueList[i], true);
|
}
|
if (paidState == 1)
|
{
|
HaveGift(zhanLingType, needValueList[i], false);
|
}
|
}
|
}
|
else
|
{
|
SysNotifyMgr.Instance.ShowTip("GeRen_lhs_202580");
|
return;
|
}
|
}
|
|
|
public void MergeAllHaveZhanLingGift(int zhanLingType, List<int> haveFreeRewardItemList, List<int> havePaidRewardItemList)
|
{
|
for (int i = 0; i < haveFreeRewardItemList.Count; i++)
|
{
|
for (int j = 0; j < ILZhanlingConfig.Get(typeToIDListDict[zhanLingType][haveFreeRewardItemList[i]]).FreeRewardItemList.Length; j++)
|
{
|
ZhanLingGiftItemInfo tempAllGiftItems = new ZhanLingGiftItemInfo();
|
tempAllGiftItems.id = ILZhanlingConfig.Get(typeToIDListDict[zhanLingType][haveFreeRewardItemList[i]]).FreeRewardItemList[j][0];
|
tempAllGiftItems.count = ILZhanlingConfig.Get(typeToIDListDict[zhanLingType][haveFreeRewardItemList[i]]).FreeRewardItemList[j][1];
|
tempAllGiftItems.name = ItemConfig.Get(tempAllGiftItems.id).ItemName;
|
tempAllGiftItems.quality = ItemConfig.Get(tempAllGiftItems.id).ItemColor;
|
if (allGiftItemList.Count == 0)
|
{
|
allGiftItemList.Add(tempAllGiftItems);
|
}
|
else
|
{
|
bool isExist = false;
|
for (int k = 0; k < allGiftItemList.Count; k++)
|
{
|
if (allGiftItemList[k].id == tempAllGiftItems.id)
|
{
|
isExist = true;
|
allGiftItemList[k].count += tempAllGiftItems.count;
|
break;
|
}
|
}
|
if (!isExist)
|
{
|
allGiftItemList.Add(tempAllGiftItems);
|
}
|
}
|
}
|
}
|
for (int i = 0; i < havePaidRewardItemList.Count; i++)
|
{
|
for (int j = 0; j < ILZhanlingConfig.Get(typeToIDListDict[zhanLingType][havePaidRewardItemList[i]]).ZLRewardItemList.Length; j++)
|
{
|
ZhanLingGiftItemInfo tempAllGiftItems = new ZhanLingGiftItemInfo();
|
tempAllGiftItems.id = ILZhanlingConfig.Get(typeToIDListDict[zhanLingType][havePaidRewardItemList[i]]).ZLRewardItemList[j][0];
|
tempAllGiftItems.count = ILZhanlingConfig.Get(typeToIDListDict[zhanLingType][havePaidRewardItemList[i]]).ZLRewardItemList[j][1];
|
tempAllGiftItems.name = ItemConfig.Get(tempAllGiftItems.id).ItemName;
|
tempAllGiftItems.quality = ItemConfig.Get(tempAllGiftItems.id).ItemColor;
|
if (allGiftItemList.Count == 0)
|
{
|
allGiftItemList.Add(tempAllGiftItems);
|
}
|
else
|
{
|
bool isExist = false;
|
for (int k = 0; k < allGiftItemList.Count; k++)
|
{
|
if (allGiftItemList[k].id == tempAllGiftItems.id)
|
{
|
isExist = true;
|
allGiftItemList[k].count += tempAllGiftItems.count;
|
break;
|
}
|
}
|
if (!isExist)
|
{
|
allGiftItemList.Add(tempAllGiftItems);
|
}
|
}
|
}
|
}
|
}
|
int SortGift(ZhanLingGiftItemInfo a, ZhanLingGiftItemInfo b)
|
{
|
return b.quality.CompareTo(a.quality);
|
}
|
//按品质排序
|
public List<ZhanLingGiftItemInfo> SortAllHaveZhanLingGift()
|
{
|
allGiftItemList.Sort(SortGift);
|
return allGiftItemList;
|
}
|
|
void UpdateRedpoint(int zhanLingType)
|
{
|
redpoint.state = RedPointState.None;
|
if (zhanLingInfoDict == null || !zhanLingInfoDict.ContainsKey(zhanLingType) || zhanLingInfoDict[zhanLingType].freeZhanHaveDict == null || !FuncOpen.Instance.IsFuncOpen(218))
|
return;
|
var needValueList = zhanLingInfoDict[zhanLingType].freeZhanHaveDict.Keys.ToList();
|
for (int i = 0; i < needValueList.Count; i++)
|
{
|
if (GetGiftState(zhanLingType, needValueList[i], true) == 1 || GetGiftState(zhanLingType, needValueList[i], false) == 1)
|
{
|
redpoint.state = RedPointState.Simple;
|
break;
|
}
|
}
|
|
}
|
|
//已经购买并领取所有物品
|
public bool IsFinish()
|
{
|
int zhanLingType = 2;
|
if (zhanLingInfoDict.IsNullOrEmpty() || !zhanLingInfoDict.TryGetValue(zhanLingType, out var zhanlingInfo) ||
|
zhanlingInfo == null || zhanlingInfo.freeZhanHaveDict == null || zhanlingInfo.paidZhanHaveDict == null)
|
return false;
|
//有没购买的
|
if (zhanlingInfo.isActivite == 0)
|
return false;
|
//有没领取的物品
|
var arr = zhanlingInfo.freeZhanHaveDict.Keys.ToArray();
|
for (int i = 0; i < arr.Length; i++)
|
{
|
int needValue = arr[i];
|
if (!IsHaveZhanLingGift(zhanLingType, needValue, false) || !IsHaveZhanLingGift(zhanLingType, needValue, true))
|
return false;
|
}
|
return true;
|
}
|
|
}
|
|