hch
2026-03-20 c8aea6cbef51b3dd41b4d911bc7e6bf89a6e2e2d
Main/System/BoneField/AdsManager.cs
@@ -1,26 +1,71 @@
using System;
using System.Collections.Generic;
using UnityEngine;
public class AdsManager : GameSystemManager<AdsManager>
{
    //<广告ID,今日已领取广告奖励次数>
    private Dictionary<int, int> adsInfoDict = new Dictionary<int, int>();
    public event Action<int, int> OnAdsInfoListUpdateEvent;//ADID ADMapID
    public event Action<int, int, int> OnAdsInfoListUpdateEvent;//ADID type value
    public Dictionary<int, Redpoint> redPointDict = new Dictionary<int, Redpoint>();
    public int waitAdID = 0;  //回调后发放奖励用
    int loadErrorCD = 10;   //等待10秒后才能再请求
    public float lastLoadErrorTime = 0;
    public override void Init()
    {
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitializeEvent;
        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.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitializeEvent;
        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();
    }
    public void SendGetReward(int ADID)
    private void OnUpdateFBInfoChangeEvent(int mapID)
    {
        switch (mapID)
        {
            case 30010:
                UpdateBoneAdRedPoint();
                break;
        }
    }
    void SendGetReward(int ADID)
    {
        var pack = new CA504_tagCMPlayerGetReward();
        pack.RewardType = 81;       //  广告奖励 81
@@ -28,7 +73,51 @@
        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)
        {
@@ -39,15 +128,37 @@
                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);
                BoneFieldManager.Instance.SendBBeginFBWipeOut(TianziBillboradManager.Instance.DataMapID, (int)fbInfo2.PassLineID);
                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))
@@ -63,14 +174,60 @@
        {
            adsInfoDict[item.ADID] = item.ADCnt;
            int mapID = 0;
            if (ADAwardConfig.HasKey(item.ADID))
            if (!ADAwardConfig.HasKey(item.ADID))
            {
                ADAwardConfig aDAwardConfig = ADAwardConfig.Get(item.ADID);
                mapID = aDAwardConfig.ADMapID;
                continue;
            }
            OnAdsInfoListUpdateEvent?.Invoke(item.ADID, mapID);
            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;
    }
}