From 04e0d2d733f6ceb35456deeb3e14bbf51e90124d Mon Sep 17 00:00:00 2001
From: client_linchunjie <461730578@qq.com>
Date: 星期二, 29 一月 2019 10:00:13 +0800
Subject: [PATCH] 6086 【前端】【1.5.200】春节红包雨活动

---
 System/OpenServerActivity/FestivalRedpackModel.cs |  102 ++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 89 insertions(+), 13 deletions(-)

diff --git a/System/OpenServerActivity/FestivalRedpackModel.cs b/System/OpenServerActivity/FestivalRedpackModel.cs
index fbfbd56..4481cd5 100644
--- a/System/OpenServerActivity/FestivalRedpackModel.cs
+++ b/System/OpenServerActivity/FestivalRedpackModel.cs
@@ -8,7 +8,7 @@
     public class FestivalRedpackModel : Model, IBeforePlayerDataInitialize, IPlayerLoginOk, IOpenServerActivity
     {
         Dictionary<int, FestivalRedpack> festivalRedpacks = new Dictionary<int, FestivalRedpack>();
-        Dictionary<int, List<int>> achievements = new Dictionary<int, List<int>>();
+        Dictionary<int, List<FestivalRedpackAchievement>> achievements = new Dictionary<int, List<FestivalRedpackAchievement>>();
         List<int> taskRedpacks = new List<int>();
 
         bool serverInited = false;
@@ -148,13 +148,17 @@
                 var configs = Config.Instance.GetAllValues<FestivalRedpackTaskConfig>();
                 foreach (var config in configs)
                 {
-                    List<int> list;
+                    List<FestivalRedpackAchievement> list;
                     if (!achievements.TryGetValue(config.FeastDay, out list))
                     {
-                        list = new List<int>();
+                        list = new List<FestivalRedpackAchievement>();
                         achievements.Add(config.FeastDay, list);
                     }
-                    list.Add(config.achievementId);
+                    list.Add(new FestivalRedpackAchievement()
+                    {
+                        id = config.ID,
+                        achievements = config.achievements,
+                    });
                 }
             }
 
@@ -239,12 +243,24 @@
             return false;
         }
 
+        public bool IsContainsAchievement(List<FestivalRedpackAchievement> list, int achievementId)
+        {
+            foreach (var festivalRedpackAchievement in list)
+            {
+                if (festivalRedpackAchievement.Contains(achievementId))
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+
         public bool TryGetRedpack(int id, out FestivalRedpack redpack)
         {
             return festivalRedpacks.TryGetValue(id, out redpack);
         }
 
-        public bool TryGetAchievements(out List<int> list)
+        public bool TryGetAchievements(out List<FestivalRedpackAchievement> list)
         {
             return achievements.TryGetValue(festivalDay + 1, out list);
         }
@@ -257,6 +273,27 @@
                 return festivalRedpacks[lhs].openTime.CompareTo(festivalRedpacks[rhs].openTime);
             }
             return 0;
+        }
+
+        public int AchievementSort(FestivalRedpackAchievement lhs, FestivalRedpackAchievement rhs)
+        {
+            Achievement lhsAchievement;
+            Achievement rhsAchievement;
+            if (achievementModel.TryGetAchievement(lhs.CurrentAchieve, out lhsAchievement)
+                && achievementModel.TryGetAchievement(rhs.CurrentAchieve, out rhsAchievement))
+            {
+                if (lhsAchievement.completed.CompareTo(rhsAchievement.completed) != 0)
+                {
+                    return lhsAchievement.completed.CompareTo(rhsAchievement.completed);
+                }
+                bool xReach = Achievement.IsReach(lhsAchievement.id, lhsAchievement.progress);
+                bool yReach = Achievement.IsReach(rhsAchievement.id, rhsAchievement.progress);
+                if (xReach.CompareTo(yReach) != 0)
+                {
+                    return -xReach.CompareTo(yReach);
+                }
+            }
+            return lhs.id.CompareTo(rhs.id);
         }
 
         public void OnReceivePackage(HAB25_tagMCFeastRedPackInfo package)
@@ -323,8 +360,8 @@
 
         private void AchievementCompletedEvent(int _achieve)
         {
-            List<int> list;
-            if (TryGetAchievements(out list) && list.Contains(_achieve))
+            List<FestivalRedpackAchievement> list;
+            if (TryGetAchievements(out list) && IsContainsAchievement(list, _achieve))
             {
                 if (achievementRefresh != null)
                 {
@@ -336,8 +373,8 @@
 
         private void AchievementProgressUpdateEvent(int _achieve)
         {
-            List<int> list;
-            if (TryGetAchievements(out list) && list.Contains(_achieve))
+            List<FestivalRedpackAchievement> list;
+            if (TryGetAchievements(out list) && IsContainsAchievement(list, _achieve))
             {
                 if (achievementRefresh != null)
                 {
@@ -382,15 +419,15 @@
                     }
                 }
 
-                List<int> list;
+                List<FestivalRedpackAchievement> list;
                 if (TryGetAchievements(out list))
                 {
-                    foreach (var achievementId in list)
+                    foreach (var festivalRedpackAchievement in list)
                     {
                         Achievement achievement;
-                        if (achievementModel.TryGetAchievement(achievementId, out achievement))
+                        if (achievementModel.TryGetAchievement(festivalRedpackAchievement.CurrentAchieve, out achievement))
                         {
-                            if (Achievement.IsReach(achievementId, achievement.progress) && !achievement.completed)
+                            if (Achievement.IsReach(festivalRedpackAchievement.CurrentAchieve, achievement.progress) && !achievement.completed)
                             {
                                 existFinishTask = true;
                                 break;
@@ -430,6 +467,45 @@
         }
     }
 
+    public class FestivalRedpackAchievement
+    {
+        public int id;
+        public int[] achievements;
+
+        public AchievementModel model { get { return ModelCenter.Instance.GetModel<AchievementModel>(); } }
+
+        public int CurrentAchieve
+        {
+            get
+            {
+                for (int i = 0; i < achievements.Length; i++)
+                {
+                    Achievement achievement;
+                    if (model.TryGetAchievement(achievements[i], out achievement))
+                    {
+                        if (!achievement.completed)
+                        {
+                            return achievements[i];
+                        }
+                    }
+                }
+                return achievements[achievements.Length - 1];
+            }
+        }
+
+        public bool Contains(int _achieve)
+        {
+            for (int i = 0; i < achievements.Length; i++)
+            {
+                if (achievements[i] == _achieve)
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+    }
+
     public struct FestivalRedpack
     {
         public int id;

--
Gitblit v1.8.0