using System; using System.Collections.Generic; using UnityEngine; public class AdsManager : GameSystemManager { //<广告ID,今日已领取广告奖励次数> private Dictionary adsInfoDict = new Dictionary(); public event Action OnAdsInfoListUpdateEvent;//ADID type value public Dictionary redPointDict = new Dictionary(); public int waitAdID = 0; //回调后发放奖励用 int loadErrorCD = 10; //等待10秒后才能再请求 public float lastLoadErrorTime = 0; public override void Init() { DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitializeEvent; DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += UpdateRedpoint; DungeonManager.Instance.UpdateFBInfoListEvent += OnUpdateFBInfoChangeEvent; FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent; var keys = ADAwardConfig.GetKeys(); for (int i = 0; i < keys.Count; i++) { var config = ADAwardConfig.Get(keys[i]); if (config.RedpointID == 0) { continue; } redPointDict[keys[i]] = new Redpoint(config.ParentRedpointID, config.RedpointID); } } public override void Release() { DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitializeEvent; DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= UpdateRedpoint; DungeonManager.Instance.UpdateFBInfoListEvent -= OnUpdateFBInfoChangeEvent; FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent; } private void OnFuncStateChangeEvent(int funcId) { switch (funcId) { case (int)FuncOpenEnum.BoneBattle: UpdateBoneAdRedPoint(); break; } } public void OnBeforePlayerDataInitializeEvent() { waitAdID = 0; adsInfoDict.Clear(); } private void OnUpdateFBInfoChangeEvent(int mapID) { switch (mapID) { case 30010: UpdateBoneAdRedPoint(); break; } } void SendGetReward(int ADID) { var pack = new CA504_tagCMPlayerGetReward(); pack.RewardType = 81; // 广告奖励 81 pack.DataEx = (uint)ADID; // 广告奖励ID GameNetSystem.Instance.SendInfo(pack); } //区分不同渠道是否有广告SDK public void PlayAds(int ADID) { //有广告的SDK if (VersionConfig.Get().appId == "ryzj" && !GeneralDefine.noAdsChannels.Contains(SDKUtils.channelSign)) { //视频加载失败需要等10秒后再调用 //奖励需要设置标识对应发放 if (WaitForLoadNewAd()) { SysNotifyMgr.Instance.ShowTip("AdLoadFail"); return; } waitAdID = ADID; SDKUtils.Instance.PlayAds("b69a2b68bb3d22"); return; } //没广告的SDK 直接给奖励 GetAdsAward(ADID); } public void LoadAds() { if (VersionConfig.Get().appId == "ryzj") { if (WaitForLoadNewAd()) { return; } SDKUtils.Instance.LoadAds("b69a2b68bb3d22"); } } //上一次加载失败,检查是否需要等待 public bool WaitForLoadNewAd() { if (Time.time - lastLoadErrorTime < loadErrorCD) { return true; } return false; } public void GetAdsAward(int ADID) { switch (ADID) { case 1: if (!DungeonManager.Instance.TryGetFBInfoByMapID(BoneFieldManager.Instance.DataMapID, out var fbInfo1)) return; SendGetReward(ADID); BoneFieldManager.Instance.SendBBeginFBWipeOut(BoneFieldManager.Instance.DataMapID, (int)fbInfo1.PassLineID); break; case 2: if (!DungeonManager.Instance.TryGetFBInfoByMapID(TianziBillboradManager.Instance.DataMapID, out var fbInfo2)) return; SendGetReward(ADID); break; case 3: //寻宝类型 HappyXBModel.Instance.HeroCallAfterCheckWish(() => { HeroUIManager.Instance.selectCallType = HappXBTitle.HeroCallAdvanced; HeroUIManager.Instance.selectCallIndex = 0; SendGetReward(ADID); TimingGiftManager.Instance.TryAddWhenAllAdsUsed(2, ADID); }); break; case 4: TimingGiftManager.Instance.TryAddWhenAllAdsUsed(1, ADID); SendGetReward(ADID); break; case 5: TimingGiftManager.Instance.TryAddWhenAllAdsUsed(7, ADID); GubaoManager.Instance.selectCallIndex = 0; SendGetReward(ADID); break; case 6: SendGetReward(ADID); break; } } //已获取广告奖励次数 public int GetADCntByADID(int ADID) { if (adsInfoDict.IsNullOrEmpty() || !adsInfoDict.ContainsKey(ADID)) return 0; return adsInfoDict[ADID]; } public void UpdateAdsInfoList(HA722_tagSCADInfoList vNetData) { if (vNetData == null || vNetData.ADInfoList.IsNullOrEmpty()) return; foreach (var item in vNetData.ADInfoList) { adsInfoDict[item.ADID] = item.ADCnt; if (!ADAwardConfig.HasKey(item.ADID)) { continue; } ADAwardConfig aDAwardConfig = ADAwardConfig.Get(item.ADID); var value = aDAwardConfig.ADAwardValue; var type = aDAwardConfig.ADAwardType; OnAdsInfoListUpdateEvent?.Invoke(item.ADID, type, value); UpdateRedpoint(); } } void UpdateRedpoint() { foreach (var key in redPointDict.Keys) { redPointDict[key].state = RedPointState.None; var config = ADAwardConfig.Get(key); if (!FuncOpen.Instance.IsFuncOpen(config.FuncID)) { continue; } if (GetADCntByADID(key) < config.ADCntMax) { switch (key) { //白骨 case 1: UpdateBoneAdRedPoint(); break; default: redPointDict[key].state = RedPointState.Simple; break; } } } } private void UpdateBoneAdRedPoint() { int key = 1; if (!ADAwardConfig.HasKey(key)) return; var config = ADAwardConfig.Get(key); if (!FuncOpen.Instance.IsFuncOpen(config.FuncID)) return; if (redPointDict.IsNullOrEmpty() || !redPointDict.ContainsKey(key)) return; bool isNoChallenge = BoneFieldManager.Instance.IsNoChallenge(); redPointDict[key].state = isNoChallenge ? RedPointState.None : RedPointState.Simple; } }