using vnxbqy.UI; using System.Collections.Generic; using System.Linq; using LitJson; using System; public class RealmLVZhanlingModel : ILModel { // 战令类型对应的充值ID列表 public Dictionary ctgIdDict = new Dictionary(); //收到的所有服务器战令包字典 public Dictionary zhanLingInfoDict = new Dictionary(); //战令类型: 所需值 :key public Dictionary> typeToIDListDict = new Dictionary>(); public event Action UpdateGiftStateEvent; public Redpoint redpoint = new Redpoint(MainRedPoint.RechargeGenerousGiftWinRedpoint, MainRedPoint.RealmLvZhanlingRedpoint); List allGiftItemList = new List(); //同步播放摆动动画 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(); zhanlingInfo.paidZhanHaveDict = new Dictionary(); zhanlingInfo.paidZhanHaveHDict = new Dictionary(); 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 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().GetEmptyGridCount(PackType.Item) < 1) { SysNotifyMgr.Instance.ShowTip("GeRen_lhs_202580"); return; } List haveFreeRewardItemList = new List(); //用户领到的免费物品的所需值列表 List havePaidRewardItemList = new List(); //用户领到的付费物品的所需值列表 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().GetEmptyGridCount(PackType.Item)} 需要格子 {allGiftItemList.Count}"); if (ModelCenter.Instance.GetModelEx().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 haveFreeRewardItemList, List 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 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; } }