using System; using System.Reflection; using System.Collections.Generic; using Activity.HomeEntranceBtn; using OrderManager; using asap.core; using cfg; using UnityEngine; namespace Activity { /// /// 活动哨兵基类 - 只负责执行活动开关,不负责监听和判断 /// public abstract class AActivitySentry : IActivitySentry where TM : AEventDataManager where TD : IEventData ,new() { protected AActivitySentry() { var attribute = GetType().GetCustomAttribute(); if (attribute == null) { Debug.LogError($"{GetType().Name} must have ActivitySentryAttribute"); return; } EventType = attribute.EventType; EventSubType = attribute.EventSubType; } public int EventType { get; } public int EventSubType { get; } public IHomeEntranceBtn HomeEntranceBtn { get; set; } public FishingEvent CurrentEventConfig { get; set; } public List RelatedEvents { get; set; } protected bool IsActive { get; private set; } = false; // DI 注入的依赖(用于替代静态方法调用) protected ActivityScopeManager _scopeManager; /// /// 由 ActivityManager 在创建 Sentry 时调用,注入依赖 /// public void InjectDependencies(ActivityScopeManager scopeManager ) { _scopeManager = scopeManager; } /// /// 便捷方法:解析活动管理器 /// protected TM ResolveManager() { return _scopeManager.GetOrRegisterInstance((EventType, EventSubType)); } /// /// 活动开启(由 Manager 调用) /// public void Open(FishingEvent fishingEvent) { if (fishingEvent == null) return; var previousEventConfig = CurrentEventConfig; CurrentEventConfig = fishingEvent; IsActive = true; // 如果是切换到新活动,先调用切换钩子 if (previousEventConfig != fishingEvent) OnEventChanged(previousEventConfig, fishingEvent); // 调用激活钩子 OnEventActive(fishingEvent); } /// /// 活动关闭(由 Manager 调用) /// public void Close(FishingEvent fishingEvent) { if (fishingEvent == null) return; OnEventClosed(fishingEvent); IsActive = false; CurrentEventConfig =null; } public void RegisterHomeEntranceBtn(IHomeEntranceBtn homeEntranceBtn) { HomeEntranceBtn = homeEntranceBtn; if(IsActive) homeEntranceBtn?.OnOpen(CurrentEventConfig,ResolveManager()); } public void UnregisterHomeEntranceBtn() { HomeEntranceBtn = null; } /// public virtual void OnActivityTokenBalanceChanged(int eventId) { if (!IsActive || CurrentEventConfig == null || CurrentEventConfig.ID != eventId) return; var manager = ResolveManager(); if (manager == null) return; if (manager is IActivityEventRedPoint red) { try { red.SetRedPoint(manager.LoadData()); } catch (Exception e) { Debug.LogError($"[{GetType().Name}] SetRedPoint after token balance change failed: {e.Message}"); } } } #region 生命周期钩子 /// /// 活动切换时调用 /// protected virtual void OnEventChanged(FishingEvent previousEventConfig, FishingEvent newEventConfig) { if(newEventConfig==null) return; ResolveManager()?.RefreshData(newEventConfig); } /// /// 活动激活时调用 /// protected virtual void OnEventActive(FishingEvent fishingEvent) { // 活动开启时注册到 OrderManager var manager = ResolveManager(); if (manager is IOrderReplenishment repl) OrderManager.OrderManager.RegisterReplenishment(repl); if (manager is IOrderSuccess succ) OrderManager.OrderManager.RegisterOrderSuccess(succ); //todo 这里通知homepanle 实例化 homeEntranceBtn prefab, HomeEntranceBtn?.OnOpen(fishingEvent, manager); } /// /// 活动关闭时调用 /// protected virtual void OnEventClosed(FishingEvent fishingEvent) { // 活动关闭时取消注册 var manager = ResolveManager(); if (manager is IOrderReplenishment repl) OrderManager.OrderManager.UnregisterReplenishment(repl); if (manager is IOrderSuccess succ) OrderManager.OrderManager.UnregisterOrderSuccess(succ); // 通知按钮活动关闭 HomeEntranceBtn?.OnClose(fishingEvent); } #endregion #region IDisposable public virtual void Dispose() { if (!IsActive) return; Close(CurrentEventConfig); } #endregion } }