From 453e96025c4f78888e11f8da85fbdb78245e23f9 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期一, 29 十二月 2025 02:36:23 +0800
Subject: [PATCH] 351 【内政】红颜系统

---
 Main/System/FirstCharge/FirstChargeManager.cs |  194 ++++++++++++++++++++++++++++++++++--------------
 1 files changed, 138 insertions(+), 56 deletions(-)

diff --git a/Main/System/FirstCharge/FirstChargeManager.cs b/Main/System/FirstCharge/FirstChargeManager.cs
index 8c5cb99..3138024 100644
--- a/Main/System/FirstCharge/FirstChargeManager.cs
+++ b/Main/System/FirstCharge/FirstChargeManager.cs
@@ -1,12 +1,11 @@
 using System;
-using System.Collections;
 using System.Collections.Generic;
-using System.Linq;
 using UnityEngine;
 
 public class FirstChargeManager : GameSystemManager<FirstChargeManager>
 {
-    public const int FuncID = 110;
+    public int taskID;
+    public int nextTaskID;
     public int mainItemId { get { return GetMainItemId(); } }
     public int heroItemID;
     public int maxGiftCount
@@ -26,33 +25,46 @@
     public event Action OnUpdateFirstChargeInfo;
     public override void Init()
     {
-        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitializeEvent;
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitializeEventOnRelogin;
         DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOk;
         RechargeManager.Instance.rechargeCountEvent += OnRechargeCountEvent;
-        FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
+        TaskManager.Instance.OnTaskUpdate += OnTaskUpdate;
 
+        FuncConfigConfig config = FuncConfigConfig.Get("FirstCharge");
+        taskID = int.Parse(config.Numerical1);
+        nextTaskID = int.Parse(config.Numerical2);
+
+        InitClickTabDict();
+        InitRedPoint();
     }
 
     public override void Release()
     {
-        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitializeEvent;
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitializeEventOnRelogin;
         DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOk;
         RechargeManager.Instance.rechargeCountEvent -= OnRechargeCountEvent;
-        FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
+        TaskManager.Instance.OnTaskUpdate -= OnTaskUpdate;
     }
 
-    private void OnFuncStateChangeEvent(int obj)
+
+    public event Action OnFirstChargeTaskUpdateEvent;
+    int beforeMainID;
+    private void OnTaskUpdate()
     {
-        if (FuncID == obj)
+        int currentTaskID = TaskManager.Instance.mainTask.TaskID;
+
+        if (beforeMainID == taskID && currentTaskID == nextTaskID)
         {
-            string key = $"FirstCharge_FirstTime_{FuncID}_{PlayerDatas.Instance.baseData.PlayerID}";
+            string key = $"FirstCharge_FirstTime_{taskID}_{PlayerDatas.Instance.baseData.PlayerID}";
             if (!LocalSave.HasKey(key))
             {
-                // 绗竴娆″紑鍚姛鑳�
+                // 绗竴娆″畬鎴愪换鍔�
                 LocalSave.SetBool(key, true);
                 PopupWindowsProcessor.Instance.Add("FirstChargeWin");
+                OnFirstChargeTaskUpdateEvent?.Invoke();
             }
         }
+        beforeMainID = currentTaskID;
     }
 
     public void InitClickTabDict()
@@ -106,22 +118,109 @@
         }
     }
 
-    public void OnBeforePlayerDataInitializeEvent()
+    public void OnBeforePlayerDataInitializeEventOnRelogin()
     {
         firstChargeInfoDict.Clear();
+        isFirstLogin = true;
     }
+
+    bool isFirstLogin = true;
     public void OnPlayerLoginOk()
     {
-        InitClickTabDict();
-        InitRedPoint();
-        if (FuncOpen.Instance.IsFuncOpen(FuncID)&& TryGetUnBuyFirstId(out int firstId))
+        if (isFirstLogin && IsFuncOpen() && TryGetUnBuyFirstId(out int firstId))
         {
+            isFirstLogin = false;
             PopupWindowsProcessor.Instance.Add("FirstChargeWin");
         }
     }
+
     public bool TryGetFirstChargeDataByFirstId(int firstId, out FirstChargeData firstChargeData)
     {
         return firstChargeInfoDict.TryGetValue(firstId, out firstChargeData);
+    }
+
+    //鎵�鏈夌殑鎴樻枟姝讳骸寮归鍏咃紝缃《鍦ㄦ垬鏂楀け璐ョ晫闈笂鍗冲彲锛岃嫢棣栧厖鍏呭畬鍒欐棤椤诲搷搴�,涓嶄細姝讳骸鐨勪笉闇�瑕�
+    public void TryPopWin(string battleName)
+    {
+        if (battleName == null || battleName == string.Empty)
+            return;
+        if (battleName == BattleConst.TianziBillboradBattleField)
+            return;
+        if (!IsFuncOpen())
+            return;
+        if (!TryGetUnBuyFirstId(out int firstId))
+            return;
+        int localTime = GetLocalFailTime();
+
+        DateTime lastFailTime = TimeUtility.GetTime((uint)localTime);
+        DateTime now = TimeUtility.ServerNow;
+
+        // 浠庢湭璁板綍杩囨浜℃垨涓婃姝讳骸鏃堕棿鏄惁涓庡綋鍓嶆椂闂翠笉鍦ㄥ悓涓�澶�
+        if (localTime == 0 || lastFailTime.Year != now.Year || lastFailTime.Month != now.Month || lastFailTime.Day != now.Day)
+        {
+            SetLocalFailTime(TimeUtility.AllSeconds);
+            if (!UIManager.Instance.IsOpened<FirstChargeWin>())
+            {
+                UIManager.Instance.OpenWindow<FirstChargeWin>();
+            }
+        }
+        // 濡傛灉鍚屼竴澶╁凡缁忔浜¤繃锛屽垯涓嶅脊绐�
+    }
+    string failTimeKey = "FirstCharge_FailTime_";
+    public int GetLocalFailTime()
+    {
+        return LocalSave.GetInt(StringUtility.Concat(failTimeKey + PlayerDatas.Instance.PlayerId));
+    }
+
+    public void SetLocalFailTime(int time)
+    {
+        LocalSave.SetInt(StringUtility.Concat(failTimeKey + PlayerDatas.Instance.PlayerId), time);
+    }
+
+    public string loaclKey = "FirstCharge_Fail_";
+
+    public bool GetLocalFail()
+    {
+        return LocalSave.GetBool(StringUtility.Concat(loaclKey + PlayerDatas.Instance.PlayerId));
+    }
+
+    public void SetLocalFail()
+    {
+        LocalSave.SetBool(StringUtility.Concat(loaclKey + PlayerDatas.Instance.PlayerId), true);
+    }
+
+    public bool IsFuncOpen()
+    {
+        if (IsBuyOne())
+            return true;
+        if (TaskConfig.HasKey(taskID) &&
+        TaskManager.Instance.mainTask != null &&
+       TaskConfig.HasKey(TaskManager.Instance.mainTask.TaskID) &&
+       TaskManager.Instance.GetNeedFinishTaskCount(taskID) <= 0)
+            return true;
+        bool isLocalFail = GetLocalFail();
+        return isLocalFail;
+    }
+
+    //  鏈変竴妗h璐拱灏辫繑鍥瀟rue
+    public bool IsBuyOne()
+    {
+        var firstChargeList = FirstChargeConfig.GetKeys();
+        if (firstChargeList != null)
+        {
+            firstChargeList.Sort();
+            foreach (int item in firstChargeList)
+            {
+                if (TryGetFirstChargeDataByFirstId(item, out FirstChargeData data))
+                {
+                    if (data.IsUnlock() && data.IsBuy())
+                    {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
     }
 
     public bool TryGetUnBuyFirstId(out int firstId)
@@ -254,20 +353,21 @@
         UpdateRedPoint();
         OnUpdateFirstChargeInfo?.Invoke();
     }
-    
+
+    public string key { get { return StringUtility.Concat("FirstCharge_AllRewardsClaimed_Time_", PlayerDatas.Instance.baseData.PlayerID.ToString()); } }
+
     /// <summary>
     /// 妫�鏌ユ槸鍚︽墍鏈夐鍏呭鍔遍兘宸查鍙栵紝濡傛灉鏄紝鍒欏皢褰撳墠鏈嶅姟鍣ㄦ椂闂翠繚瀛樺埌鏈湴
     /// </summary>
     private void CheckAndSaveAllRewardsClaimedTime()
     {
-        // 妫�鏌ユ槸鍚︽墍鏈夊鍔遍兘宸查鍙�
-        if (IsAllFirstChargeRewardsClaimed())
-        {
-            // 鐢熸垚涓�涓敮涓�鐨勯敭鏉ュ瓨鍌ㄦ椂闂�
-            string key = $"FirstCharge_AllRewardsClaimed_Time_{PlayerDatas.Instance.baseData.PlayerID}";
-            // 灏嗗綋鍓嶆湇鍔″櫒鏃堕棿淇濆瓨鍒版湰鍦�
-            LocalSave.SetString(key, TimeUtility.ServerNow.Ticks.ToString());
-        }
+        if (LocalSave.HasKey(key))
+            return;
+        // 鎵�鏈夊鍔遍兘宸查鍙�?
+        if (!IsAllFirstChargeRewardsClaimed())
+            return;
+        // 灏嗗綋鍓嶆湇鍔″櫒鏃堕棿淇濆瓨鍒版湰鍦�
+        LocalSave.SetInt(key, TimeUtility.AllSeconds);
     }
     public void UpdateRedPoint()
     {
@@ -355,7 +455,7 @@
             }
         }
     }
-    
+
     // 妫�鏌ユ槸鍚︽墍鏈夐鍏呭鍔遍兘宸茬粡棰嗗彇
     public bool IsAllFirstChargeRewardsClaimed()
     {
@@ -363,17 +463,17 @@
         var firstChargeIds = FirstChargeConfig.GetKeys();
         if (firstChargeIds == null || firstChargeIds.Count == 0)
             return false;
-            
+
         foreach (var firstId in firstChargeIds)
         {
             // 灏濊瘯鑾峰彇棣栧厖鏁版嵁
             if (!TryGetFirstChargeDataByFirstId(firstId, out var firstChargeData))
                 return false;
-                
+
             // 妫�鏌ユ槸鍚﹁喘涔�
             if (!firstChargeData.IsBuy())
                 return false;
-                
+
             // 妫�鏌ユ槸鍚︽墍鏈夊鍔遍兘宸查鍙�
             if (!firstChargeData.IsAllHave())
                 return false;
@@ -383,35 +483,17 @@
         // 妫�鏌ユ槸鍚﹀凡缁忚繃浜嗙浜屽ぉ0鐐�
         return true;
     }
-    
+
     // 妫�鏌ユ槸鍚﹀凡缁忚繃浜嗘墍鏈夊鍔遍鍙栧畬姣曞悗鐨勭浜屽ぉ0鐐�
     public bool IsNextDayAfterAllClaimed()
     {
-        // 鐢熸垚涓�涓敮涓�鐨勯敭鏉ヨ幏鍙栨椂闂�
-        string key = $"FirstCharge_AllRewardsClaimed_Time_{PlayerDatas.Instance.baseData.PlayerID}";
-        
-        // 妫�鏌ユ槸鍚﹀瓨鍦ㄨ褰曠殑鏃堕棿鎴�
         if (!LocalSave.HasKey(key))
             return false;
-        
-        // 鑾峰彇璁板綍鐨勬椂闂存埑
-        string timeString = LocalSave.GetString(key);
-        if (string.IsNullOrEmpty(timeString))
+        int time = LocalSave.GetInt(key);
+        if (time <= 0)
             return false;
-        
-        // 瑙f瀽鏃堕棿鎴�
-        if (!long.TryParse(timeString, out long ticks))
-            return false;
-        
-        // 灏嗘椂闂存埑杞崲涓篋ateTime
-        DateTime allRewardsClaimedTime = new DateTime(ticks);
-        
-        // 璁$畻绗簩澶�0鐐圭殑鏃堕棿
-        DateTime nextDayStart = allRewardsClaimedTime.Date.AddDays(1);
-        
-        // 鍒ゆ柇褰撳墠鏈嶅姟鍣ㄦ椂闂存槸鍚﹀凡缁忚繃浜嗙浜屽ぉ0鐐�
-        DateTime serverNow = TimeUtility.ServerNow;
-        return serverNow >= nextDayStart;
+        DateTime endDateTime = TimeUtility.GetTime((uint)time).Date.AddDays(1);
+        return TimeUtility.ServerNow >= endDateTime;
     }
 
 }
@@ -458,8 +540,8 @@
         }
         return true;
     }
-    
-   // ... existing code ...
+
+    // ... existing code ...
     /// <summary>
     /// 鑾峰彇褰撳墠鏃堕棿鏄喘涔拌繖妗e厖鍊肩ぜ鍖呯殑绗嚑澶�
     /// 璐拱鐨勫綋澶╃畻浣滅涓�澶╋紝绗簩澶�0鐐瑰悗绠楃浜屽ぉ锛屼互姝ょ被鎺�
@@ -469,15 +551,15 @@
     {
         DateTime serverNow = TimeUtility.ServerNow;
         DateTime chargeTime = TimeUtility.GetTime(ChargeTime);
-      
+
         DateTime chargeDate = chargeTime.Date;
         DateTime serverDate = serverNow.Date;
-        
+
         // 璁$畻浠庡厖鍊兼棩鏈熷埌褰撳墠鏃ユ湡鐨勫畬鏁村ぉ鏁�
         // 璐拱鐨勫綋澶╃畻绗竴澶╋紝绗簩澶�0鐐瑰悗绠楃浜屽ぉ
         TimeSpan timeSpan = serverDate - chargeDate;
         int days = (int)timeSpan.TotalDays + 1; // +1 鍥犱负褰撳ぉ绠楃涓�澶�
-        
+
         int maxDay = FirstChargeManager.Instance.maxDay;
 
         return Mathf.Min(maxDay, Mathf.Max(1, days));

--
Gitblit v1.8.0