| | |
| | | var newHeroData = netPack.HeroInfoList[i]; |
| | | int heroID = (int)newHeroData.HeroID; |
| | | |
| | | // ---- 新增:对比旧数据,检测皮肤状态变化 ---- |
| | | if (heroCollectInfoDic.TryGetValue(heroID, out var oldHeroData)) |
| | | { |
| | | if (newHeroData.SkinList != null) |
| | | { |
| | | foreach (var newSkin in newHeroData.SkinList) |
| | | { |
| | | // 在旧数据中寻找对应的皮肤 |
| | | var oldSkin = oldHeroData.SkinList?.FirstOrDefault(s => s.SkinID == newSkin.SkinID); |
| | | // 1. 调用封装好的方法:检测并触发新皮肤事件 |
| | | CheckAndTriggerNewSkinEvents(heroID, newHeroData); |
| | | |
| | | // 如果旧数据中没有这个皮肤(首次获得),或者状态发生了变化 |
| | | if (oldSkin == null || oldSkin.State != newSkin.State) |
| | | { |
| | | OnHeroSkinStateChanged?.Invoke(heroID, (int)newSkin.SkinID, newSkin.State); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 2. 更新字典为最新的网络包数据 |
| | | heroCollectInfoDic[heroID] = newHeroData; |
| | | } |
| | | |
| | |
| | | OnHeroCollectEvent?.Invoke(); |
| | | } |
| | | |
| | | public event Action<int, int> OnNewSkinAcquired;// 当玩家获得新皮肤(激活皮肤)时触发的事件 HeroID SkinID |
| | | |
| | | /// <summary> |
| | | /// 检查并触发获得新皮肤的事件 |
| | | /// </summary> |
| | | private void CheckAndTriggerNewSkinEvents(int heroID, HB122_tagSCHeroInfo.tagSCHero newHeroData) |
| | | { |
| | | // 如果新数据中没有皮肤信息,直接返回 |
| | | if (newHeroData?.SkinList == null || newHeroData?.SkinCnt <= 0) return; |
| | | |
| | | // 尝试获取旧数据 |
| | | bool isOldHeroExist = heroCollectInfoDic.TryGetValue(heroID, out var oldHeroData); |
| | | |
| | | for (int j = 0; j < newHeroData.SkinCnt; j++) |
| | | { |
| | | var newSkin = newHeroData.SkinList[j]; |
| | | |
| | | // 如果新皮肤未激活,直接跳过当前循环,检查下一个皮肤 |
| | | if (newSkin.State <= 0) continue; |
| | | |
| | | bool isNewlyAcquired = false; |
| | | |
| | | if (!isOldHeroExist) |
| | | { |
| | | // 场景A:这是一个全新的武将,且自带了已激活的非默认皮肤 |
| | | isNewlyAcquired = true; |
| | | } |
| | | else |
| | | { |
| | | // 场景B:已有的老武将,需要对比旧数据看这个皮肤是不是刚刚才获得的 |
| | | bool foundOldSkin = false; |
| | | |
| | | if (oldHeroData.SkinList != null) |
| | | { |
| | | for (int k = 0; k < oldHeroData.SkinCnt; k++) |
| | | { |
| | | var oldSkin = oldHeroData.SkinList[k]; |
| | | if (oldSkin.SkinID == newSkin.SkinID) |
| | | { |
| | | foundOldSkin = true; |
| | | // 如果旧数据中该皮肤未激活 (State == 0),现在激活了,算作获得新皮肤 |
| | | if (oldSkin.State == 0) |
| | | { |
| | | isNewlyAcquired = true; |
| | | } |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 如果旧武将数据里压根没有这个皮肤的数据(现在是激活状态),也算作获得新皮肤 |
| | | if (!foundOldSkin) |
| | | { |
| | | isNewlyAcquired = true; |
| | | } |
| | | } |
| | | |
| | | // 如果最终判定为“全新获得”的皮肤,则触发事件 |
| | | if (isNewlyAcquired) |
| | | { |
| | | OnNewSkinAcquired?.Invoke(heroID, (int)newSkin.SkinID); |
| | | } |
| | | } |
| | | } |
| | | |
| | | // public int GetHeroCollectBookPer() |
| | | // { |