From 45d3d873a7740886fa09f35c9fea2830f4563072 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期三, 11 二月 2026 11:04:37 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into h5version

---
 Main/Config/PartialConfigs/SkillSkinConfig.Partial.cs.meta                                  |    2 
 Main/System/BeautyMM/BeautyMMSkinActiveWin.cs                                               |   36 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA524_tagSCFamilyMemDel.cs.meta    |    2 
 Main/System/Battle/SkillEffect/NoEffect.cs                                                  |   20 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA524_tagSCFamilyMemDel.cs         |   12 
 Main/System/Battle/Motion/MotionBase.cs                                                     |   40 
 Main/System/Battle/BoneFieldBattleWin.cs                                                    |   28 
 Main/Config/Configs/SkillConfig.cs                                                          |   96 -
 Main/System/Guild/GuildJoinWin.cs                                                           |    6 
 Main/Core/NetworkPackage/ServerPack/HA5_Family/HA519_tagSCTagFamilyInfo.cs.meta             |    2 
 Main/System/Guild/GuildBossWin.cs                                                           |    8 
 Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs                                       |   10 
 Main/Core/NetworkPackage/ClientPack/CA1_Sys/CA131_tagCSSettingData.cs.meta                  |    2 
 Main/System/Message/RichText.cs                                                             |  126 +
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA505_tagSCFamilyCrossInfo.cs.meta |    2 
 Main/System/Guild/ServersSmallTipCell.cs                                                    |   29 
 Main/Core/NetworkPackage/ServerPack/HA5_Family/HA520_tagMCRoleFamilyInfo.cs                 |    2 
 Main/System/Battle/UIComp/BattleHeroInfoBar.cs                                              |   93 
 Main/System/Login/ServerForceExitHintWin.cs                                                 |   21 
 Main/Config/Configs/TimingGiftTypeConfig.cs                                                 |   44 
 Main/System/TimingGift/TimingGiftTabCell.cs                                                 |   33 
 Main/Utility/EnumHelper.cs                                                                  |    1 
 Main/System/InternalAffairs/AffairBaseWin.cs                                                |   27 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA519_tagSCTagFamilyInfo.cs        |   12 
 Main/System/WarlordPavilion/WarlordPavilionNPCItem.cs.meta                                  |    2 
 Main/Core/NetworkPackage/CustomServerPack/CustomHB426CombinePack.cs                         |    6 
 Main/System/Battle/BattleObject/HeroBattleObject.cs                                         |   12 
 Main/System/Battle/SkillEffect/BulletSkillEffect.cs                                         |   66 
 Main/System/Battle/StoryBossBattleWin.cs                                                    |   28 
 Main/System/Battle/Skill/SkillBase.cs                                                       |   58 
 Main/System/WarlordPavilion/WarlordPavilionNPCItem.cs                                       |   48 
 Main/Config/Configs/SkillSkinConfig.cs                                                      |  122 +
 Main/Utility/TimeUtility.cs                                                                 |   52 
 Main/System/Battle/UIComp/BattleBuffCell.cs                                                 |    8 
 Main/System/Login/LoginWin.cs                                                               |    3 
 Main/Core/NetworkPackage/ServerPack/HA5_Family/HA519_tagSCTagFamilyInfo.cs                  |   49 
 Main/Core/NetworkPackage/ServerPack/HA5_Family/HA505_tagSCFamilyCrossInfo.cs                |   21 
 Main/System/TimingGift/TimingGiftManager.cs                                                 |  530 +++++++
 Main/System/Battle/BaseBattleWin.cs                                                         |   42 
 Main/System/BeautyMM/BeautyMMShowWin.cs                                                     |   16 
 Main/System/Battle/Define/BattleDmgInfo.cs                                                  |    3 
 Main/Core/NetworkPackage/ClientPack/CA6_Family/CA619_tagCSViewTagFamily.cs                  |   20 
 Main/System/TimingGift/TimingGiftAwardCell.cs                                               |   20 
 Main/Core/NetworkPackage/ServerPack/HA1_Sys/HA131_tagSCSettingDataInfo.cs                   |   31 
 Main/System/Battle/SkillEffect/BulletCurve/BezierBulletCurve.cs                             |    6 
 Main/Core/NetworkPackage/ServerPack/HA5_Family/HA505_tagSCFamilyCrossInfo.cs.meta           |    2 
 Main/Config/PartialConfigs/TimingGiftConfig.cs.meta                                         |    2 
 Main/System/Mingge/MinggeManager.cs                                                         |   21 
 Main/System/TimingGift.meta                                                                 |    8 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA1_Sys/DTCA131_tagSCSettingDataInfo.cs.meta    |    2 
 Main/Config/PartialConfigs/SkillSkinConfig.Partial.cs                                       |   64 
 Main/System/Guild/GuildMemberCell.cs                                                        |    6 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA505_tagSCFamilyCrossInfo.cs      |   12 
 Main/System/HeroUI/HeroTrainWin.cs                                                          |   11 
 Main/System/Login/DisconnectHintWin.cs                                                      |    2 
 Main/System/Battle/SkillEffect/BulletCurve/BulletCurve.cs                                   |    7 
 Main/Core/NetworkPackage/ServerPack/HA1_Sys/HA131_tagSCSettingDataInfo.cs.meta              |    2 
 Main/Core/NetworkPackage/ClientPack/CA1_Sys/CA131_tagCSSettingData.cs                       |   22 
 Main/System/OtherPlayerDetail/OtherPlayerDetailManager.cs                                   |   16 
 Main/System/Equip/BlessLVManager.cs                                                         |    4 
 Main/System/Guild/GuildChangeNameWin.cs                                                     |    6 
 Main/System/BeautyMM/BeautyMMManager.cs                                                     |   24 
 Main/System/TimingGift/SettingDataManager.cs.meta                                           |    2 
 Main/Utility/UIHelper.cs                                                                    |   10 
 Main/System/BeautyMM/BeautyMMSkinWin.cs                                                     |   17 
 Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs                                        |    5 
 Main/System/Equip/ItemsOnFloor.cs                                                           |    4 
 Main/System/TimingGift/TimingGiftTabCell.cs.meta                                            |    2 
 Main/Config/PartialConfigs/MainLevelConfig.cs                                               |   10 
 Main/Core/NetworkPackage/ServerPack/HB0_Event/HB040_tagSCTravelInfo.cs                      |    4 
 Main/System/WarlordPavilion/WarlordPavilionManager.cs                                       |   41 
 Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0418_tagObjInfoRefresh.cs          |   25 
 Main/Core/NetworkPackage/ServerPack/HA5_Family/HA524_tagSCFamilyMemDel.cs                   |   23 
 Main/System/Guild/GuildBaseWin.cs                                                           |    1 
 Main/System/HeroUI/HeroUIManager.cs                                                         |    1 
 Main/System/TimingGift/TimingGiftAwardCell.cs.meta                                          |    2 
 Main/Core/GameEngine/Player/PlayerDatas.cs                                                  |    2 
 Main/System/BoneField/AdsManager.cs                                                         |    9 
 Main/System/Battle/SkillEffect/SkillEffectFactory.cs                                        |   18 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB420_tagMCTurnFightState.cs  |    7 
 Main/System/Guild/ServersSmallTipWin.cs                                                     |   66 
 Main/System/Battle/BattleObject/BattleObject.cs                                             |    6 
 Main/System/Battle/SkillEffect/BulletCurve/PenetrateBulletCurve.cs                          |    6 
 Main/System/WarlordPavilion/WarlordPavilionWin.cs                                           |   57 
 Main/System/TimingGift/TimingGiftWin.cs                                                     |  271 +++
 Main/System/ItemTip/ItemTipWayWin.cs                                                        |   11 
 Main/System/Mingge/MinggeWin.cs                                                             |   13 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA1_Sys/DTCA131_tagSCSettingDataInfo.cs         |   12 
 Main/System/Guild/GuildOPWin.cs                                                             |    1 
 Main/System/TimingGift/TimingGiftCell.cs                                                    |  137 ++
 Main/System/BillboardRank/GuildRankWin.cs                                                   |   48 
 Main/System/Battle/BattleResources/TeamResTracker.cs                                        |   61 
 Main/Config/Configs/TimingGiftTypeConfig.cs.meta                                            |    2 
 Main/System/PhantasmPavilion/AvatarHelper.cs                                                |    8 
 Main/System/Battle/WarlordPavilionBattleWin.cs                                              |   28 
 Main/System/BeautyMM/BeautyMMManager.Travel.cs                                              |    4 
 Main/System/Guild/GuildHallWin.cs                                                           |    1 
 Main/System/Guild/GuildManager.CrossServer.cs.meta                                          |    2 
 Main/System/WarlordPavilion/TowerBaseWin.cs.meta                                            |    2 
 Main/System/WarlordPavilion/TowerBaseWin.cs                                                 |   20 
 Main/System/BeautyMM/BeautyMMSkinActiveWin.cs.meta                                          |    2 
 Main/System/Guild/ServersSmallTipWin.cs.meta                                                |    2 
 Main/System/HeroUI/HeroGiftWashWin.cs                                                       |   10 
 Main/System/Guild/GuildPreviewWin.cs                                                        |   19 
 Main/Config/Configs/SkillSkinConfig.cs.meta                                                 |    2 
 Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA705_tagSCQueryPlayerCacheResult.cs    |   10 
 Main/Core/NetworkPackage/ServerPack/HA5_Family/HA524_tagSCFamilyMemDel.cs.meta              |    2 
 Main/System/Horse/HorseWin.cs                                                               |   39 
 Main/System/Battle/UIComp/BattleFloatingUIController.cs                                     |    2 
 Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs                           |    2 
 Main/System/Battle/SkillEffect/NormalSkillEffect.cs                                         |   20 
 Main/System/InternalAffairs/FuncNPCManager.cs                                               |   30 
 Main/Config/Configs/FBDJGLevelConfig.cs                                                     |    8 
 Main/Config/ConfigManager.cs                                                                |   12 
 Main/System/Gubao/GubaoDetailWin.cs                                                         |   23 
 Main/System/Battle/BattleObject/BattleObjectFactory.cs                                      |    3 
 Main/System/Guild/GuildHawkerWin.cs                                                         |    7 
 Main/System/Battle/BattleObject/MinggeBattleObject.cs                                       |    8 
 Main/System/Battle/SkillEffect/BulletCurve/BounceBulletCurve.cs                             |    6 
 Main/System/Battle/SkillEffect/BulletCurve/StraightBulletCurve.cs                           |    6 
 Main/Config/Configs/TimingGiftConfig.cs.meta                                                |    2 
 Main/System/Guild/ServersSmallTipCell.cs.meta                                               |    2 
 Main/System/TimingGift/TimingGiftCtgIdCell.cs.meta                                          |    2 
 Main/System/TimingGift/SettingDataManager.cs                                                |   75 +
 Main/System/Battle/Buff/BattleObjectBuffMgr.cs                                              |   54 
 Main/System/Gubao/GubaoCallWin.cs                                                           |   11 
 Main/System/Battle/SkillEffect/BulletCurve/BulletCurveFactory.cs                            |   13 
 Main/System/Battle/TianziBillboradBattleWin.cs                                              |   28 
 Main/Utility/OperationLogCollect.cs                                                         |    3 
 Main/System/Battle/BattleField/WarlordPavilionBattleField.cs                                |    4 
 Main/System/Battle/BattleField/BattleField.cs                                               |    4 
 Main/System/ItemTip/ItemBatchUseWin.cs                                                      |    7 
 Main/Config/PartialConfigs/SkillConfig.Partial.cs                                           |   81 
 Main/System/Main/HomeWin.cs                                                                 |   14 
 Main/System/TimingGift/TimingGiftManager.cs.meta                                            |    2 
 Main/System/Equip/BlessLVTimeUpWin.cs                                                       |    8 
 Main/Main.cs                                                                                |    2 
 Main/System/Battle/SkillEffect/DotSkillEffect.cs                                            |    6 
 Main/System/PhantasmPavilion/AvatarCell.cs                                                  |    2 
 Main/System/Guild/PlayerFairyData.cs                                                        |   65 
 Main/System/TimingGift/TimingGiftCtgIdCell.cs                                               |   35 
 Main/System/Guild/GuildManager.cs                                                           |  109 
 Main/System/Main/AutoFightModel.cs                                                          |   10 
 Main/System/BeautyMM/BeautyMMSkinCell.cs                                                    |   12 
 Main/System/ViewNPC/ViewNPCManager.cs                                                       |   12 
 Main/System/Mingge/MinggePrayWin.cs                                                         |   10 
 Main/System/Battle/BattleUtility.cs                                                         |   15 
 Main/System/HappyXB/HeroCallWin.cs                                                          |   10 
 Main/System/Guild/GuildManager.CrossServer.cs                                               |   28 
 Main/System/Equip/BlessLVADWin.cs                                                           |    5 
 Main/System/TimingGift/TimingGiftCell.cs.meta                                               |    2 
 Main/Core/NetworkPackage/ClientPack/CA6_Family/CA619_tagCSViewTagFamily.cs.meta             |    2 
 Main/System/BeautyMM/BeautyMMTravelCell.cs                                                  |    8 
 Main/System/TimingGift/TimingGiftWin.cs.meta                                                |    2 
 Main/System/Battle/SkillEffect/SkillEffect.cs                                               |   16 
 Main/System/Chat/ChatPlayerOtherCell.cs                                                     |    7 
 /dev/null                                                                                   |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA519_tagSCTagFamilyInfo.cs.meta   |    2 
 Main/Core/NetworkPackage/ClientPack/CA2_Interaction/CA212_tagCMViewPlayerInfo.cs            |    4 
 Main/Core/NetworkPackage/ServerPack/HA5_Family/HA523_tagMCFamilyViewList.cs                 |   10 
 Main/System/ChallengeTab/WarlordPavilionTabHandler.cs                                       |    2 
 Main/Config/Configs/TimingGiftConfig.cs                                                     |  104 +
 Main/System/Horse/HorseRankUPWin.cs                                                         |   15 
 Main/Config/PartialConfigs/TimingGiftConfig.cs                                              |   52 
 164 files changed, 3,208 insertions(+), 820 deletions(-)

diff --git a/Main/Config/ConfigManager.cs b/Main/Config/ConfigManager.cs
index 1f6c3ba..e673ab1 100644
--- a/Main/Config/ConfigManager.cs
+++ b/Main/Config/ConfigManager.cs
@@ -91,13 +91,15 @@
             typeof(PlayerAttrConfig),
             typeof(PlayerFaceConfig),
             typeof(PresetUnlockConfig),
-            typeof(PriorBundleConfig),
             typeof(RandomNameConfig),
             typeof(SignInConfig),
+            typeof(SkillSkinConfig),
             typeof(StoreConfig),
             typeof(SuccessConfig),
             typeof(SysInfoConfig),
             typeof(TianziConfig),
+            typeof(TimingGiftConfig),
+            typeof(TimingGiftTypeConfig),
             typeof(TitleConfig),
             typeof(TitleStarUpConfig),
             typeof(TravelEventConfig),
@@ -400,12 +402,12 @@
         ClearConfigDictionary<PlayerFaceConfig>();
         // 娓呯┖ PresetUnlockConfig 瀛楀吀
         ClearConfigDictionary<PresetUnlockConfig>();
-        // 娓呯┖ PriorBundleConfig 瀛楀吀
-        ClearConfigDictionary<PriorBundleConfig>();
         // 娓呯┖ RandomNameConfig 瀛楀吀
         ClearConfigDictionary<RandomNameConfig>();
         // 娓呯┖ SignInConfig 瀛楀吀
         ClearConfigDictionary<SignInConfig>();
+        // 娓呯┖ SkillSkinConfig 瀛楀吀
+        ClearConfigDictionary<SkillSkinConfig>();
         // 娓呯┖ StoreConfig 瀛楀吀
         ClearConfigDictionary<StoreConfig>();
         // 娓呯┖ SuccessConfig 瀛楀吀
@@ -414,6 +416,10 @@
         ClearConfigDictionary<SysInfoConfig>();
         // 娓呯┖ TianziConfig 瀛楀吀
         ClearConfigDictionary<TianziConfig>();
+        // 娓呯┖ TimingGiftConfig 瀛楀吀
+        ClearConfigDictionary<TimingGiftConfig>();
+        // 娓呯┖ TimingGiftTypeConfig 瀛楀吀
+        ClearConfigDictionary<TimingGiftTypeConfig>();
         // 娓呯┖ TitleConfig 瀛楀吀
         ClearConfigDictionary<TitleConfig>();
         // 娓呯┖ TitleStarUpConfig 瀛楀吀
diff --git a/Main/Config/Configs/FBDJGLevelConfig.cs b/Main/Config/Configs/FBDJGLevelConfig.cs
index 1c68374..ab1dc40 100644
--- a/Main/Config/Configs/FBDJGLevelConfig.cs
+++ b/Main/Config/Configs/FBDJGLevelConfig.cs
@@ -1,6 +1,6 @@
 锘�//--------------------------------------------------------
 //    [Author]:           YYL
-//    [  Date ]:           Tuesday, January 20, 2026
+//    [  Date ]:           Friday, February 6, 2026
 //--------------------------------------------------------
 
 using System.Collections.Generic;
@@ -22,8 +22,8 @@
 	public int[][] PassAwardList;
 	public int[][] AwardList;
 	public int[] LineupIDList;
+	public int NPCLV;
 	public long FightPower;
-	public int NPCID;
 	public int[] SkillIDExList;
 
     public override int LoadKey(string _key)
@@ -60,9 +60,9 @@
 				}
 			}
 
-			long.TryParse(tables[6],out FightPower); 
+			int.TryParse(tables[6],out NPCLV); 
 
-			int.TryParse(tables[7],out NPCID); 
+			long.TryParse(tables[7],out FightPower); 
 
 			if (tables[8].Contains("["))
 			{
diff --git a/Main/Config/Configs/SkillConfig.cs b/Main/Config/Configs/SkillConfig.cs
index e497188..3ff8a32 100644
--- a/Main/Config/Configs/SkillConfig.cs
+++ b/Main/Config/Configs/SkillConfig.cs
@@ -1,6 +1,6 @@
 锘�//--------------------------------------------------------
 //    [Author]:           YYL
-//    [  Date ]:           2025骞�12鏈�12鏃�
+//    [  Date ]:           2026骞�2鏈�7鏃�
 //--------------------------------------------------------
 
 using System.Collections.Generic;
@@ -35,34 +35,10 @@
 	public int[] BuffStateLimit;
 	public int BuffState;
 	public int FightPower;
-	public string SkillMotionName;
 	public string IconName;
 	public string BuffIconName;
 	public string SkillTipsName;
-	public int EffectType;
-	public int StartupFrames;
-	public int[] ActiveFrames;
-	public int RecoveryFrames;
-	public int LoopCount;
-	public int CastPosition;
-	public int CastIndexNum;
-	public float CastDistance;
-	public int[][] DamageDivide;
-	public int BulletEffectId;
-	public int BulletPath;
-	public float BulletFlySpeed;
 	public int Scattering;
-	public int ExplosionEffectId;
-	public int ExplosionEffect2;
-	public int ExplosionEffect3;
-	public int ExplosionEffect4;
-	public int EffectId;
-	public int EffectId2;
-	public int SkinllSFX1;
-	public int SkinllSFX2;
-	public int MStartEffectId;
-	public int BuffEffect;
-	public int TriggerEffect;
 	public int ClientTriggerTiming;
 
     public override int LoadKey(string _key)
@@ -125,75 +101,15 @@
 
 			int.TryParse(tables[18],out FightPower); 
 
-			SkillMotionName = tables[19];
+			IconName = tables[19];
 
-			IconName = tables[20];
+			BuffIconName = tables[20];
 
-			BuffIconName = tables[21];
+			SkillTipsName = tables[21];
 
-			SkillTipsName = tables[22];
+			int.TryParse(tables[22],out Scattering); 
 
-			int.TryParse(tables[23],out EffectType); 
-
-			int.TryParse(tables[24],out StartupFrames); 
-
-			if (tables[25].Contains("["))
-			{
-				ActiveFrames = JsonMapper.ToObject<int[]>(tables[25]);
-			}
-			else
-			{
-				string[] ActiveFramesStringArray = tables[25].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
-				ActiveFrames = new int[ActiveFramesStringArray.Length];
-				for (int i=0;i<ActiveFramesStringArray.Length;i++)
-				{
-					 int.TryParse(ActiveFramesStringArray[i],out ActiveFrames[i]);
-				}
-			}
-
-			int.TryParse(tables[26],out RecoveryFrames); 
-
-			int.TryParse(tables[27],out LoopCount); 
-
-			int.TryParse(tables[28],out CastPosition); 
-
-			int.TryParse(tables[29],out CastIndexNum); 
-
-			float.TryParse(tables[30],out CastDistance); 
-
-			DamageDivide = JsonMapper.ToObject<int[][]>(tables[31].Replace("(", "[").Replace(")", "]")); 
-
-			int.TryParse(tables[32],out BulletEffectId); 
-
-			int.TryParse(tables[33],out BulletPath); 
-
-			float.TryParse(tables[34],out BulletFlySpeed); 
-
-			int.TryParse(tables[35],out Scattering); 
-
-			int.TryParse(tables[36],out ExplosionEffectId); 
-
-			int.TryParse(tables[37],out ExplosionEffect2); 
-
-			int.TryParse(tables[38],out ExplosionEffect3); 
-
-			int.TryParse(tables[39],out ExplosionEffect4); 
-
-			int.TryParse(tables[40],out EffectId); 
-
-			int.TryParse(tables[41],out EffectId2); 
-
-			int.TryParse(tables[42],out SkinllSFX1); 
-
-			int.TryParse(tables[43],out SkinllSFX2); 
-
-			int.TryParse(tables[44],out MStartEffectId); 
-
-			int.TryParse(tables[45],out BuffEffect); 
-
-			int.TryParse(tables[46],out TriggerEffect); 
-
-			int.TryParse(tables[47],out ClientTriggerTiming); 
+			int.TryParse(tables[23],out ClientTriggerTiming); 
         }
         catch (Exception exception)
         {
diff --git a/Main/Config/Configs/SkillSkinConfig.cs b/Main/Config/Configs/SkillSkinConfig.cs
new file mode 100644
index 0000000..203e7bc
--- /dev/null
+++ b/Main/Config/Configs/SkillSkinConfig.cs
@@ -0,0 +1,122 @@
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           2026骞�2鏈�7鏃�
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class SkillSkinConfig : ConfigBase<string, SkillSkinConfig>
+{
+    static SkillSkinConfig()
+    {
+        // 璁块棶杩囬潤鎬佹瀯閫犲嚱鏁�
+        visit = true; 
+    }
+
+    public string SkillSkinID;
+	public string SkillMotionName;
+	public int EffectType;
+	public int CastPosition;
+	public int CastIndexNum;
+	public float CastDistance;
+	public int StartupFrames;
+	public int[] ActiveFrames;
+	public int RecoveryFrames;
+	public int LoopCount;
+	public int[][] DamageDivide;
+	public int BulletEffectId;
+	public int BulletPath;
+	public float BulletFlySpeed;
+	public int ExplosionEffectId;
+	public int ExplosionEffect2;
+	public int ExplosionEffect3;
+	public int ExplosionEffect4;
+	public int EffectId;
+	public int EffectId2;
+	public int SkinllSFX1;
+	public int SkinllSFX2;
+	public int MStartEffectId;
+	public int BuffEffect;
+	public int TriggerEffect;
+
+    public override string LoadKey(string _key)
+    {
+        string key = GetKey(_key);
+        return key;
+    }
+
+    public override void LoadConfig(string input)
+    {
+        try {
+        string[] tables = input.Split('\t');
+        SkillSkinID = tables[0];
+
+			SkillMotionName = tables[1];
+
+			int.TryParse(tables[2],out EffectType); 
+
+			int.TryParse(tables[3],out CastPosition); 
+
+			int.TryParse(tables[4],out CastIndexNum); 
+
+			float.TryParse(tables[5],out CastDistance); 
+
+			int.TryParse(tables[6],out StartupFrames); 
+
+			if (tables[7].Contains("["))
+			{
+				ActiveFrames = JsonMapper.ToObject<int[]>(tables[7]);
+			}
+			else
+			{
+				string[] ActiveFramesStringArray = tables[7].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				ActiveFrames = new int[ActiveFramesStringArray.Length];
+				for (int i=0;i<ActiveFramesStringArray.Length;i++)
+				{
+					 int.TryParse(ActiveFramesStringArray[i],out ActiveFrames[i]);
+				}
+			}
+
+			int.TryParse(tables[8],out RecoveryFrames); 
+
+			int.TryParse(tables[9],out LoopCount); 
+
+			DamageDivide = JsonMapper.ToObject<int[][]>(tables[10].Replace("(", "[").Replace(")", "]")); 
+
+			int.TryParse(tables[11],out BulletEffectId); 
+
+			int.TryParse(tables[12],out BulletPath); 
+
+			float.TryParse(tables[13],out BulletFlySpeed); 
+
+			int.TryParse(tables[14],out ExplosionEffectId); 
+
+			int.TryParse(tables[15],out ExplosionEffect2); 
+
+			int.TryParse(tables[16],out ExplosionEffect3); 
+
+			int.TryParse(tables[17],out ExplosionEffect4); 
+
+			int.TryParse(tables[18],out EffectId); 
+
+			int.TryParse(tables[19],out EffectId2); 
+
+			int.TryParse(tables[20],out SkinllSFX1); 
+
+			int.TryParse(tables[21],out SkinllSFX2); 
+
+			int.TryParse(tables[22],out MStartEffectId); 
+
+			int.TryParse(tables[23],out BuffEffect); 
+
+			int.TryParse(tables[24],out TriggerEffect); 
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/Config/Configs/SkillSkinConfig.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
copy to Main/Config/Configs/SkillSkinConfig.cs.meta
index 4c9b26c..379d9ca 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/Config/Configs/SkillSkinConfig.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: 16994c332e272e048a0ce72b27c91aaf
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Config/Configs/TimingGiftConfig.cs b/Main/Config/Configs/TimingGiftConfig.cs
new file mode 100644
index 0000000..c5d614f
--- /dev/null
+++ b/Main/Config/Configs/TimingGiftConfig.cs
@@ -0,0 +1,104 @@
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           2026骞�2鏈�7鏃�
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class TimingGiftConfig : ConfigBase<int, TimingGiftConfig>
+{
+    static TimingGiftConfig()
+    {
+        // 璁块棶杩囬潤鎬佹瀯閫犲嚱鏁�
+        visit = true; 
+    }
+
+    public int GiftID;
+	public string GiftName;
+	public int GiftType;
+	public int[] CTGIDs;
+	public int[] TopColor;
+	public int[] BottomColor;
+	public int[] OutlineColor;
+
+    public override int LoadKey(string _key)
+    {
+        int key = GetKey(_key);
+        return key;
+    }
+
+    public override void LoadConfig(string input)
+    {
+        try {
+        string[] tables = input.Split('\t');
+        int.TryParse(tables[0],out GiftID); 
+
+			GiftName = tables[1];
+
+			int.TryParse(tables[2],out GiftType); 
+
+			if (tables[3].Contains("["))
+			{
+				CTGIDs = JsonMapper.ToObject<int[]>(tables[3]);
+			}
+			else
+			{
+				string[] CTGIDsStringArray = tables[3].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				CTGIDs = new int[CTGIDsStringArray.Length];
+				for (int i=0;i<CTGIDsStringArray.Length;i++)
+				{
+					 int.TryParse(CTGIDsStringArray[i],out CTGIDs[i]);
+				}
+			}
+
+			if (tables[4].Contains("["))
+			{
+				TopColor = JsonMapper.ToObject<int[]>(tables[4]);
+			}
+			else
+			{
+				string[] TopColorStringArray = tables[4].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				TopColor = new int[TopColorStringArray.Length];
+				for (int i=0;i<TopColorStringArray.Length;i++)
+				{
+					 int.TryParse(TopColorStringArray[i],out TopColor[i]);
+				}
+			}
+
+			if (tables[5].Contains("["))
+			{
+				BottomColor = JsonMapper.ToObject<int[]>(tables[5]);
+			}
+			else
+			{
+				string[] BottomColorStringArray = tables[5].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				BottomColor = new int[BottomColorStringArray.Length];
+				for (int i=0;i<BottomColorStringArray.Length;i++)
+				{
+					 int.TryParse(BottomColorStringArray[i],out BottomColor[i]);
+				}
+			}
+
+			if (tables[6].Contains("["))
+			{
+				OutlineColor = JsonMapper.ToObject<int[]>(tables[6]);
+			}
+			else
+			{
+				string[] OutlineColorStringArray = tables[6].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				OutlineColor = new int[OutlineColorStringArray.Length];
+				for (int i=0;i<OutlineColorStringArray.Length;i++)
+				{
+					 int.TryParse(OutlineColorStringArray[i],out OutlineColor[i]);
+				}
+			}
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/Config/Configs/TimingGiftConfig.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
copy to Main/Config/Configs/TimingGiftConfig.cs.meta
index 4c9b26c..d2a9ef1 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/Config/Configs/TimingGiftConfig.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: 0d0f2d099d904734e8c8cdb9ffa748ad
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Config/Configs/TimingGiftTypeConfig.cs b/Main/Config/Configs/TimingGiftTypeConfig.cs
new file mode 100644
index 0000000..61c9ad1
--- /dev/null
+++ b/Main/Config/Configs/TimingGiftTypeConfig.cs
@@ -0,0 +1,44 @@
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           2026骞�2鏈�5鏃�
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class TimingGiftTypeConfig : ConfigBase<int, TimingGiftTypeConfig>
+{
+    static TimingGiftTypeConfig()
+    {
+        // 璁块棶杩囬潤鎬佹瀯閫犲嚱鏁�
+        visit = true; 
+    }
+
+    public int GiftType;
+	public int Duration;
+	public int TriggleChangeRate;
+
+    public override int LoadKey(string _key)
+    {
+        int key = GetKey(_key);
+        return key;
+    }
+
+    public override void LoadConfig(string input)
+    {
+        try {
+        string[] tables = input.Split('\t');
+        int.TryParse(tables[0],out GiftType); 
+
+			int.TryParse(tables[1],out Duration); 
+
+			int.TryParse(tables[2],out TriggleChangeRate); 
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/Config/Configs/TimingGiftTypeConfig.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
copy to Main/Config/Configs/TimingGiftTypeConfig.cs.meta
index 4c9b26c..3686a8e 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/Config/Configs/TimingGiftTypeConfig.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: 79fc1592c88c38746980c51334e7ec72
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Config/PartialConfigs/MainLevelConfig.cs b/Main/Config/PartialConfigs/MainLevelConfig.cs
index 2d54cef..a5d9b02 100644
--- a/Main/Config/PartialConfigs/MainLevelConfig.cs
+++ b/Main/Config/PartialConfigs/MainLevelConfig.cs
@@ -46,12 +46,16 @@
         return waveLineupLists.Count(list => list.Length > 0);
     }
 
+    static List<int> allLevels = new List<int>();
     // 鑾峰彇鐩爣鍏冲崱鐨勭储寮�
     public static int GetToTargetLevelIndex(int targetLevel)
     {
-        var levels = GetKeys();
-        levels.Sort();
-        return levels.IndexOf(targetLevel);
+        if (allLevels.IsNullOrEmpty())
+        {
+            allLevels = GetKeys();
+            allLevels.Sort();
+        }
+        return allLevels.IndexOf(targetLevel);
 
     }
 
diff --git a/Main/Config/PartialConfigs/SkillConfig.Partial.cs b/Main/Config/PartialConfigs/SkillConfig.Partial.cs
index 1f26680..764dd5d 100644
--- a/Main/Config/PartialConfigs/SkillConfig.Partial.cs
+++ b/Main/Config/PartialConfigs/SkillConfig.Partial.cs
@@ -21,9 +21,8 @@
 	public static readonly int[] DebuffSkillType = new int[] { 4, 6, 14 };
 
 	public SkillType skillType;
-	public SkillCastMode castMode;
 
-	public SkillEffectType effectType;
+	protected SkillSkinConfig originSkinConfig;
 
 	//鎶�鑳界被鍨嬶細鎶�鑳界瓑绾э細鎶�鑳�
 	static Dictionary<int, Dictionary<int, SkillConfig>> skillDics = new Dictionary<int, Dictionary<int, SkillConfig>>();
@@ -32,24 +31,6 @@
 		base.OnConfigParseCompleted();
 
 		skillType = (SkillType)SkillType;
-		castMode = (SkillCastMode)CastPosition;
-		effectType = (SkillEffectType)EffectType;
-
-		if (DamageDivide == null || DamageDivide.Length == 0)
-		{
-			DamageDivide = new int[1][];
-			DamageDivide[0] = new int[] { 10000 };
-		}
-		
-		// #if UNITY_EDITOR
-		// 		if (Launch.Instance.isOpenBattleDebug)
-		// 		{
-		// 			if (castMode == SkillCastMode.None)
-		// 			{
-		// 				castMode = SkillCastMode.Target;
-		// 			}
-		// 		}
-		// #endif
 
 		Dictionary<int, SkillConfig> tempDic = null;
 		if (!skillDics.TryGetValue((int)skillType, out tempDic))
@@ -58,6 +39,39 @@
 			skillDics.Add((int)skillType, tempDic);
 		}
 		tempDic[SkillLV] = this;
+	}
+
+	public SkillSkinConfig GetSkillSkinConfig(int skinID)
+	{
+		string key = skinID.ToString() + SkillID.ToString();
+
+		SkillSkinConfig skillSkinConfig = SkillSkinConfig.Get(key);
+
+		if (null == skillSkinConfig)
+		{
+			return GetOriginSkinConfig();
+		}
+		else
+		{
+			return skillSkinConfig;
+		}
+	} 
+
+	public SkillSkinConfig GetOriginSkinConfig()
+	{
+		if (originSkinConfig == null)
+		{
+			originSkinConfig = SkillSkinConfig.Get(SkillID.ToString());
+		}
+		if (null == originSkinConfig)
+		{
+			Debug.LogError("鎵句笉鍒版妧鑳界毊鑲ら厤缃� " + SkillID);
+			return null;
+		}
+		else
+		{
+			return originSkinConfig;
+		}
 	}
 
 	public bool IsGainBuff()
@@ -69,11 +83,6 @@
     {
         return Array.Exists(DebuffSkillType, type => type == (int)skillType);
     }
-
-	public MotionName GetMotionName()
-	{
-		return Enum.Parse<MotionName>(SkillMotionName);
-	}
 
 	public static SkillConfig GetSkillConfig(int skillType, int skillLv)
 	{
@@ -87,25 +96,5 @@
 		return config;
 	}
 
-	public List<int> GetDamageDivide(int _hitIndex)
-	{
-		List<int> damageDivide = new List<int>();
-		if (_hitIndex == 0 && DamageDivide.Length <= 0)
-		{
-			damageDivide.Add(10000);
-		}
-		else
-		{
-			if (DamageDivide.Length <= _hitIndex)
-			{
-				Debug.LogError("鎶�鑳戒激瀹冲垎甯冮厤缃敊璇� skillId: " + SkillID + " hitIndex: " + _hitIndex);
-				damageDivide.Add(10000);
-			}
-			else
-			{
-				damageDivide = DamageDivide[_hitIndex].ToList();
-			}
-		}
-		return damageDivide;
-    }
+
 }
diff --git a/Main/Config/PartialConfigs/SkillSkinConfig.Partial.cs b/Main/Config/PartialConfigs/SkillSkinConfig.Partial.cs
new file mode 100644
index 0000000..192e2a4
--- /dev/null
+++ b/Main/Config/PartialConfigs/SkillSkinConfig.Partial.cs
@@ -0,0 +1,64 @@
+//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           2026骞�2鏈�7鏃�
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+using System;
+using UnityEngine;
+using LitJson;
+using System.Linq;
+
+
+public partial class SkillSkinConfig : ConfigBase<string, SkillSkinConfig>
+{
+	public SkillCastMode castMode;
+
+	public SkillEffectType effectType;
+
+    protected override void OnConfigParseCompleted()
+	{
+		base.OnConfigParseCompleted();
+
+		castMode = (SkillCastMode)CastPosition;
+		effectType = (SkillEffectType)EffectType;
+
+
+		if (DamageDivide == null || DamageDivide.Length == 0)
+		{
+			DamageDivide = new int[1][];
+			DamageDivide[0] = new int[] { 10000 };
+		}
+
+		
+	}
+
+	public MotionName GetMotionName()
+	{
+		return Enum.Parse<MotionName>(SkillMotionName);
+	}
+
+    public List<int> GetDamageDivide(int _hitIndex)
+	{
+		List<int> damageDivide = new List<int>();
+		if (_hitIndex == 0 && DamageDivide.Length <= 0)
+		{
+			damageDivide.Add(10000);
+		}
+		else
+		{
+			if (DamageDivide.Length <= _hitIndex)
+			{
+				Debug.LogError("鎶�鑳戒激瀹冲垎甯冮厤缃敊璇� SkillSkinID: " + SkillSkinID + " hitIndex: " + _hitIndex);
+				damageDivide.Add(10000);
+			}
+			else
+			{
+				damageDivide = DamageDivide[_hitIndex].ToList();
+			}
+		}
+		return damageDivide;
+    }
+}
\ No newline at end of file
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/Config/PartialConfigs/SkillSkinConfig.Partial.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
copy to Main/Config/PartialConfigs/SkillSkinConfig.Partial.cs.meta
index 4c9b26c..10410cd 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/Config/PartialConfigs/SkillSkinConfig.Partial.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: 2e0292b891c625c45985eefa582a2463
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Config/PartialConfigs/TimingGiftConfig.cs b/Main/Config/PartialConfigs/TimingGiftConfig.cs
new file mode 100644
index 0000000..8e6765e
--- /dev/null
+++ b/Main/Config/PartialConfigs/TimingGiftConfig.cs
@@ -0,0 +1,52 @@
+using System.Collections.Generic;
+public partial class TimingGiftConfig : ConfigBase<int, TimingGiftConfig>
+{
+
+    public static Dictionary<int, List<int>> typeToGiftIdList = null;
+
+    private static void LoadTypeToGiftIdList()
+    {
+        if (typeToGiftIdList != null)
+            return;
+        typeToGiftIdList = new Dictionary<int, List<int>>();
+
+        foreach (var config in GetValues())
+        {
+            if (!typeToGiftIdList.ContainsKey(config.GiftType))
+            {
+                typeToGiftIdList[config.GiftType] = new List<int>();
+            }
+            if (!typeToGiftIdList[config.GiftType].Contains(config.GiftID))
+            {
+                typeToGiftIdList[config.GiftType].Add(config.GiftID);
+            }
+        }
+
+        foreach (var type in typeToGiftIdList.Keys)
+        {
+            typeToGiftIdList[type].Sort();
+        }
+    }
+
+    public static Dictionary<int, List<int>> GetTypeToGiftIdDict()
+    {
+        LoadTypeToGiftIdList();
+        return typeToGiftIdList;
+    }
+
+    public static bool TryGetTypeToGiftIdList(int type, out List<int> giftIdList)
+    {
+        giftIdList = null;
+        LoadTypeToGiftIdList();
+        return !typeToGiftIdList.IsNullOrEmpty() && typeToGiftIdList.TryGetValue(type, out giftIdList) && giftIdList != null;
+    }
+
+    public static bool TryGetTimingGiftConfig(int id, out TimingGiftConfig config)
+    {
+        config = null;
+        if (!HasKey(id))
+            return false;
+        config = Get(id);
+        return true;
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/Config/PartialConfigs/TimingGiftConfig.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
copy to Main/Config/PartialConfigs/TimingGiftConfig.cs.meta
index 4c9b26c..1f84a24 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/Config/PartialConfigs/TimingGiftConfig.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: 1dc8c2bc48ca2254aaa2efe08e81f5f8
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/GameEngine/Player/PlayerDatas.cs b/Main/Core/GameEngine/Player/PlayerDatas.cs
index ea98e19..c91b3a9 100644
--- a/Main/Core/GameEngine/Player/PlayerDatas.cs
+++ b/Main/Core/GameEngine/Player/PlayerDatas.cs
@@ -236,9 +236,11 @@
                 break;
             case PlayerDataType.ExAttr1:
                 baseData.ExAttr1 = Math.Max((int)value, 10100); //鏂板彿鍒濆澶勭悊
+                Debug.LogFormat("---- 鏀跺埌鏈嶅姟绔疎xAttr1: {0}", baseData.ExAttr1);
                 break;
             case PlayerDataType.ExAttr2:
                 baseData.ExAttr2 = Math.Max((int)value, 10101); //鏂板彿鍒濆澶勭悊
+                Debug.LogFormat("---- 鏀跺埌鏈嶅姟绔疎xAttr2: {0}", baseData.ExAttr2);
                 break;
             case PlayerDataType.ExAttr3://绉板彿
                 baseData.TitleID = (int)value;
diff --git a/Main/Core/NetworkPackage/ClientPack/CA1_Sys/CA131_tagCSSettingData.cs b/Main/Core/NetworkPackage/ClientPack/CA1_Sys/CA131_tagCSSettingData.cs
new file mode 100644
index 0000000..075ad69
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CA1_Sys/CA131_tagCSSettingData.cs
@@ -0,0 +1,22 @@
+using UnityEngine;
+using System.Collections;
+
+// A1 31 鍓嶇鑷畾涔変繚瀛樿缃唴瀹� #tagCSSettingData
+
+public class CA131_tagCSSettingData : GameNetPackBasic {
+    public byte KeyNum;    // 鑷畾涔塳ey缂栧彿锛屽悗绔娇鐢ㄦ暟瀛梜ey瀛樺偍锛屽墠绔嚜琛岃繘琛岃浆鎹㈠畾涔夛紝闄愬埗100涓�
+    public byte DataLen;
+    public string SetData;    //鑷畾涔変繚瀛樼殑鍐呭
+
+    public CA131_tagCSSettingData () {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xA131;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (KeyNum, NetDataType.BYTE);
+        WriteBytes (DataLen, NetDataType.BYTE);
+        WriteBytes (SetData, NetDataType.Chars, DataLen);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/Core/NetworkPackage/ClientPack/CA1_Sys/CA131_tagCSSettingData.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
copy to Main/Core/NetworkPackage/ClientPack/CA1_Sys/CA131_tagCSSettingData.cs.meta
index 4c9b26c..586fef8 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/Core/NetworkPackage/ClientPack/CA1_Sys/CA131_tagCSSettingData.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: f237c6f43939ca64894d301a44913fa7
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/ClientPack/CA2_Interaction/CA212_tagCMViewPlayerInfo.cs b/Main/Core/NetworkPackage/ClientPack/CA2_Interaction/CA212_tagCMViewPlayerInfo.cs
index 34cad61..8c89ec2 100644
--- a/Main/Core/NetworkPackage/ClientPack/CA2_Interaction/CA212_tagCMViewPlayerInfo.cs
+++ b/Main/Core/NetworkPackage/ClientPack/CA2_Interaction/CA212_tagCMViewPlayerInfo.cs
@@ -5,7 +5,7 @@
 
 public class CA212_tagCMViewPlayerInfo : GameNetPackBasic {
     public uint PlayerID;
-    public byte EquipClassLV;    //澶т簬0涓烘煡鐪嬫寚瀹氬鐣岄樁瑁呭淇℃伅,  0涓烘煡鐪嬮粯璁や俊鎭�
+    public uint ServerID;    //鐜╁鏈嶅姟鍣↖D锛屽彂0榛樿鏈湇鐜╁
 
     public CA212_tagCMViewPlayerInfo () {
         combineCmd = (ushort)0x03FE;
@@ -14,7 +14,7 @@
 
     public override void WriteToBytes () {
         WriteBytes (PlayerID, NetDataType.DWORD);
-        WriteBytes (EquipClassLV, NetDataType.BYTE);
+        WriteBytes (ServerID, NetDataType.DWORD);
     }
 
 }
diff --git a/Main/Core/NetworkPackage/ClientPack/CA6_Family/CA619_tagCSViewTagFamily.cs b/Main/Core/NetworkPackage/ClientPack/CA6_Family/CA619_tagCSViewTagFamily.cs
new file mode 100644
index 0000000..3e19628
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CA6_Family/CA619_tagCSViewTagFamily.cs
@@ -0,0 +1,20 @@
+using UnityEngine;
+using System.Collections;
+
+// A6 19 鏌ョ湅鐩爣鍏細 #tagCSViewTagFamily
+
+public class CA619_tagCSViewTagFamily : GameNetPackBasic {
+    public uint FamilyID;
+    public uint DataServerID;    //鏁版嵁鎵�鍦ㄦ湇鍔″櫒ID
+
+    public CA619_tagCSViewTagFamily () {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xA619;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (FamilyID, NetDataType.DWORD);
+        WriteBytes (DataServerID, NetDataType.DWORD);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/Core/NetworkPackage/ClientPack/CA6_Family/CA619_tagCSViewTagFamily.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
copy to Main/Core/NetworkPackage/ClientPack/CA6_Family/CA619_tagCSViewTagFamily.cs.meta
index 4c9b26c..a1cabda 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/Core/NetworkPackage/ClientPack/CA6_Family/CA619_tagCSViewTagFamily.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: 2bf49c967e6a89b4c93efd500fbd7583
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/ClientPack/CA6_Family/CA626_tagCMGetFamilyInfo.cs b/Main/Core/NetworkPackage/ClientPack/CA6_Family/CA626_tagCMGetFamilyInfo.cs
deleted file mode 100644
index 36a6ef6..0000000
--- a/Main/Core/NetworkPackage/ClientPack/CA6_Family/CA626_tagCMGetFamilyInfo.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-using UnityEngine;
-using System.Collections;
-
-// A6 26 璇锋眰瀹舵棌鎴愬憳鍒楄〃 #tagCMGetFamilyInfo
-
-public class CA626_tagCMGetFamilyInfo : GameNetPackBasic {
-
-    public CA626_tagCMGetFamilyInfo () {
-        combineCmd = (ushort)0x03FE;
-        _cmd = (ushort)0xA626;
-    }
-
-    public override void WriteToBytes () {
-    }
-
-}
diff --git a/Main/Core/NetworkPackage/ClientPack/CA6_Family/CA626_tagCMGetFamilyInfo.cs.meta b/Main/Core/NetworkPackage/ClientPack/CA6_Family/CA626_tagCMGetFamilyInfo.cs.meta
deleted file mode 100644
index 170af80..0000000
--- a/Main/Core/NetworkPackage/ClientPack/CA6_Family/CA626_tagCMGetFamilyInfo.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 32dffab7fe30a854694d5714937a2dfe
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/CustomServerPack/CustomHB426CombinePack.cs b/Main/Core/NetworkPackage/CustomServerPack/CustomHB426CombinePack.cs
index 6ea09d9..d6cdabe 100644
--- a/Main/Core/NetworkPackage/CustomServerPack/CustomHB426CombinePack.cs
+++ b/Main/Core/NetworkPackage/CustomServerPack/CustomHB426CombinePack.cs
@@ -417,7 +417,8 @@
         if (hB427_TagSCUseSkill != null)
         {
             SkillConfig scCfg = SkillConfig.Get((int)hB427_TagSCUseSkill.SkillID);
-            if (!string.IsNullOrEmpty(scCfg.SkillMotionName))
+            SkillSkinConfig skillSkinConfig = scCfg.GetOriginSkinConfig();
+            if (!string.IsNullOrEmpty(skillSkinConfig.SkillMotionName))
             {
                 needWaiting = true;
                 return needWaiting;
@@ -437,7 +438,8 @@
             if (pack is HB427_tagSCUseSkill skillPack && skillPack != hB427_TagSCUseSkill)
             {
                 SkillConfig ssc = SkillConfig.Get((int)skillPack.SkillID);
-                if (!string.IsNullOrEmpty(ssc.SkillMotionName))
+                SkillSkinConfig skillSkinConfig = ssc.GetOriginSkinConfig();
+                if (!string.IsNullOrEmpty(skillSkinConfig.SkillMotionName))
                 {
                     needWaiting = true;
                     break;
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0418_tagObjInfoRefresh.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0418_tagObjInfoRefresh.cs
index 08d7a75..5e38a8a 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0418_tagObjInfoRefresh.cs
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0418_tagObjInfoRefresh.cs
@@ -6,13 +6,11 @@
 
 public class DTC0418_tagObjInfoRefresh : DtcBasic {
     //绫诲瀷
-    static Dictionary<int, ulong> lastPackUIDDict = new Dictionary<int, ulong>()
+    static Dictionary<int, GameNetPackBasic> lastPackDict = new Dictionary<int, GameNetPackBasic>()
     {
-#if UNITY_EDITOR
-        {(int)PlayerDataType.ExAttr1, 0},
-        {(int)PlayerDataType.ExAttr2, 0},
-#endif
-        {(int)PlayerDataType.default26, 0},
+        {(int)PlayerDataType.ExAttr1, null},
+        {(int)PlayerDataType.ExAttr2, null},
+        {(int)PlayerDataType.default26, null},
     };
     public override void Done(GameNetPackBasic vNetPack)
     {
@@ -27,14 +25,19 @@
             case 1:
                 if (vNetData.packUID > DTC0102_tagCDBPlayer.loginPackUID)
                 {
-                    if (lastPackUIDDict.ContainsKey(vNetData.RefreshType))
+                    if (lastPackDict.ContainsKey(vNetData.RefreshType))
                     {
-                        if (vNetData.packUID < lastPackUIDDict[vNetData.RefreshType])
+                        var lastPack = lastPackDict[vNetData.RefreshType];
+                        if (lastPack != null && vNetData.packUID < lastPackDict[vNetData.RefreshType].packUID)
                         {
-                            Debug.LogWarning($"灏佸寘椤哄簭闂 0418 灏佸寘澶棫琚繃婊� {vNetData.packUID} > {lastPackUIDDict[vNetData.RefreshType]}");
-                            return;
+                            vNetData = lastPack as H0418_tagObjInfoRefresh;
+                            if (null == vNetData)
+                            {
+                                return;
+                            }
+                            Debug.LogError("閲嶇疆0418鏁版嵁涓轰笂涓�涓寘锛屽埛鏂版暟鎹� packUID:" + vNetData.packUID);
                         }
-                        lastPackUIDDict[vNetData.RefreshType] = vNetData.packUID;
+                        lastPackDict[vNetData.RefreshType] = vNetData;
                     }
                     //闃茶寖鏂嚎閲嶈繛鏃讹紝鎴樻枟涓殑鏃у寘褰卞搷鏁版嵁
                     Update0418(vNetData);
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA1_Sys/DTCA131_tagSCSettingDataInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA1_Sys/DTCA131_tagSCSettingDataInfo.cs
new file mode 100644
index 0000000..b38737a
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA1_Sys/DTCA131_tagSCSettingDataInfo.cs
@@ -0,0 +1,12 @@
+using UnityEngine;
+using System.Collections;
+
+// A1 31 鍓嶇鑷畾涔変繚瀛樼殑璁剧疆鍐呭淇℃伅 #tagSCSettingDataInfo
+
+public class DTCA131_tagSCSettingDataInfo : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack) {
+        base.Done(vNetPack);
+        HA131_tagSCSettingDataInfo vNetData = vNetPack as HA131_tagSCSettingDataInfo;
+        SettingDataManager.Instance.UpdateSettingData(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA1_Sys/DTCA131_tagSCSettingDataInfo.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
copy to Main/Core/NetworkPackage/DTCFile/ServerPack/HA1_Sys/DTCA131_tagSCSettingDataInfo.cs.meta
index 4c9b26c..3c4ee85 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA1_Sys/DTCA131_tagSCSettingDataInfo.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: 0eed7575356cfc54f9665f3f7653c520
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA505_tagSCFamilyCrossInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA505_tagSCFamilyCrossInfo.cs
new file mode 100644
index 0000000..ce0323e
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA505_tagSCFamilyCrossInfo.cs
@@ -0,0 +1,12 @@
+using UnityEngine;
+using System.Collections;
+
+// A5 05 鍏細璺ㄦ湇浜掗�氫俊鎭� #tagSCFamilyCrossInfo
+
+public class DTCA505_tagSCFamilyCrossInfo : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack) {
+        base.Done(vNetPack);
+        HA505_tagSCFamilyCrossInfo vNetData = vNetPack as HA505_tagSCFamilyCrossInfo;
+        GuildManager.Instance.OnRefreshCrossServerInfo(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA505_tagSCFamilyCrossInfo.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
copy to Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA505_tagSCFamilyCrossInfo.cs.meta
index 4c9b26c..6ba0999 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA505_tagSCFamilyCrossInfo.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: b6a841aca303f3d4bb7fa214596b9fb4
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA519_tagSCTagFamilyInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA519_tagSCTagFamilyInfo.cs
new file mode 100644
index 0000000..bf4e3d7
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA519_tagSCTagFamilyInfo.cs
@@ -0,0 +1,12 @@
+using UnityEngine;
+using System.Collections;
+
+// A5 19 鏌ョ湅鐩爣鍏細淇℃伅 #tagSCTagFamilyInfo
+
+public class DTCA519_tagSCTagFamilyInfo : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack) {
+        base.Done(vNetPack);
+        HA519_tagSCTagFamilyInfo vNetData = vNetPack as HA519_tagSCTagFamilyInfo;
+        GuildManager.Instance.UpdateViewFamilyInfo(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA519_tagSCTagFamilyInfo.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
copy to Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA519_tagSCTagFamilyInfo.cs.meta
index 4c9b26c..262def0 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA519_tagSCTagFamilyInfo.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: e31d54337b63cd94cb7faac99d8f1eaf
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs
deleted file mode 100644
index 22891b0..0000000
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using UnityEngine;
-using System.Collections;
-
-// A5 21 瀹舵棌鍙樻洿 #tagMCFamilyChange
-
-public class DTCA521_tagMCFamilyChange : DtcBasic {
-    public override void Done(GameNetPackBasic vNetPack) {
-        base.Done(vNetPack);
-        HA521_tagMCFamilyChange vNetData = vNetPack as HA521_tagMCFamilyChange;
-        GuildManager.Instance.UpdateGuildDataChangeMark(vNetData);
-    }
-}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA524_tagSCFamilyMemDel.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA524_tagSCFamilyMemDel.cs
new file mode 100644
index 0000000..730dd42
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA524_tagSCFamilyMemDel.cs
@@ -0,0 +1,12 @@
+using UnityEngine;
+using System.Collections;
+
+// A5 24 鍏細鎴愬憳鍒犻櫎 #tagSCFamilyMemDel
+
+public class DTCA524_tagSCFamilyMemDel : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack) {
+        base.Done(vNetPack);
+        HA524_tagSCFamilyMemDel vNetData = vNetPack as HA524_tagSCFamilyMemDel;
+        PlayerDatas.Instance.fairyData.DeleteMember(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA524_tagSCFamilyMemDel.cs.meta
similarity index 83%
rename from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
rename to Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA524_tagSCFamilyMemDel.cs.meta
index 4c9b26c..76bf18d 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA524_tagSCFamilyMemDel.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: de4a083265d8ebf438ab2e65d0925d9e
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB420_tagMCTurnFightState.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB420_tagMCTurnFightState.cs
index 83610a3..84065e7 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB420_tagMCTurnFightState.cs
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB420_tagMCTurnFightState.cs
@@ -1,6 +1,7 @@
 using UnityEngine;
 using System.Collections;
 using LitJson;
+using Codice.Client.BaseCommands;
 
 // B4 20 鍥炲悎鍒舵垬鏂楃姸鎬� #tagMCTurnFightState
 
@@ -19,7 +20,11 @@
 		if (battleField != null)
 		{
 			JsonData extendData = JsonMapper.ToObject(vNetData.Msg);
-    		battleField.OnTurnFightState(vNetData.TurnNum, vNetData.State, (int)vNetData.FuncLineID, extendData);
+			battleField.OnTurnFightState(vNetData.TurnNum, vNetData.State, (int)vNetData.FuncLineID, extendData);
+			if (vNetData.MapID == 1 && (vNetData.FuncLineID > PlayerDatas.Instance.baseData.ExAttr2))
+			{
+				Debug.LogErrorFormat("---- 鏀跺埌鏈嶅姟绔� DTCB420_tagMCTurnFightState 鐨� FuncLineID :{0} 澶т簬瀹㈡埛绔褰� ExAttr2 {1}", vNetData.FuncLineID, PlayerDatas.Instance.baseData.ExAttr2);
+			}
         }
     }
 }
diff --git a/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs b/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
index 01570dc..1a85761 100644
--- a/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
+++ b/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
@@ -110,7 +110,8 @@
         Register(typeof(HA512_tagMCFamilyZhenbaogeInfo), typeof(DTCA512_tagMCFamilyZhenbaogeInfo));
         Register(typeof(HA513_tagMCFamilyActionInfo), typeof(DTCA513_tagMCFamilyActionInfo));
         Register(typeof(HA520_tagMCRoleFamilyInfo), typeof(DTCA520_tagMCRoleFamilyInfo));
-        Register(typeof(HA521_tagMCFamilyChange), typeof(DTCA521_tagMCFamilyChange));
+        Register(typeof(HA524_tagSCFamilyMemDel), typeof(DTCA524_tagSCFamilyMemDel));
+        Register(typeof(HA505_tagSCFamilyCrossInfo), typeof(DTCA505_tagSCFamilyCrossInfo));
         Register(typeof(HA522_tagMCFamilyReqJoinInfo), typeof(DTCA522_tagMCFamilyReqJoinInfo));
         Register(typeof(HA523_tagMCFamilyViewList), typeof(DTCA523_tagMCFamilyViewList));
         Register(typeof(HA009_tagSCGameRecInfo), typeof(DTCA009_tagSCGameRecInfo));
@@ -148,6 +149,8 @@
         Register(typeof(HB162_tagSCFuncPresetSwitchInfo), typeof(DTCB162_tagSCFuncPresetSwitchInfo));
         Register(typeof(HB163_tagSCBatPresetSwitchInfo), typeof(DTCB163_tagSCBatPresetSwitchInfo));
         Register(typeof(HA001_tagBroadCastInfo), typeof(DTCA001_tagBroadCastInfo));
+        Register(typeof(HA519_tagSCTagFamilyInfo), typeof(DTCA519_tagSCTagFamilyInfo));
+        Register(typeof(HA131_tagSCSettingDataInfo), typeof(DTCA131_tagSCSettingDataInfo));
     }
 
     //涓诲伐绋嬫敞鍐屽皝鍖�
diff --git a/Main/Core/NetworkPackage/ServerPack/HA1_Sys/HA131_tagSCSettingDataInfo.cs b/Main/Core/NetworkPackage/ServerPack/HA1_Sys/HA131_tagSCSettingDataInfo.cs
new file mode 100644
index 0000000..b24ba8f
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA1_Sys/HA131_tagSCSettingDataInfo.cs
@@ -0,0 +1,31 @@
+using UnityEngine;
+using System.Collections;
+
+// A1 31 鍓嶇鑷畾涔変繚瀛樼殑璁剧疆鍐呭淇℃伅 #tagSCSettingDataInfo
+
+public class HA131_tagSCSettingDataInfo : GameNetPackBasic {
+    public ushort DataCnt;
+    public  tagSCSettingData[] SettingDataList;
+
+    public HA131_tagSCSettingDataInfo () {
+        _cmd = (ushort)0xA131;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out DataCnt, vBytes, NetDataType.WORD);
+        SettingDataList = new tagSCSettingData[DataCnt];
+        for (int i = 0; i < DataCnt; i ++) {
+            SettingDataList[i] = new tagSCSettingData();
+            TransBytes (out SettingDataList[i].KeyNum, vBytes, NetDataType.BYTE);
+            TransBytes (out SettingDataList[i].DataLen, vBytes, NetDataType.BYTE);
+            TransBytes (out SettingDataList[i].SetData, vBytes, NetDataType.Chars, SettingDataList[i].DataLen);
+        }
+    }
+
+    public class tagSCSettingData {
+        public byte KeyNum;        // 鑷畾涔塳ey缂栧彿锛屽悗绔娇鐢ㄦ暟瀛梜ey瀛樺偍锛屽墠绔嚜琛岃繘琛岃浆鎹㈠畾涔夛紝闄愬埗100涓�
+        public byte DataLen;
+        public string SetData;        //鑷畾涔変繚瀛樼殑鍐呭
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA1_Sys/HA131_tagSCSettingDataInfo.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
copy to Main/Core/NetworkPackage/ServerPack/HA1_Sys/HA131_tagSCSettingDataInfo.cs.meta
index 4c9b26c..91abcd4 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/Core/NetworkPackage/ServerPack/HA1_Sys/HA131_tagSCSettingDataInfo.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: 19c12567a8e6d994b823f21885a07bc2
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA505_tagSCFamilyCrossInfo.cs b/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA505_tagSCFamilyCrossInfo.cs
new file mode 100644
index 0000000..99b8181
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA505_tagSCFamilyCrossInfo.cs
@@ -0,0 +1,21 @@
+using UnityEngine;
+using System.Collections;
+
+// A5 05 鍏細璺ㄦ湇浜掗�氫俊鎭� #tagSCFamilyCrossInfo
+
+public class HA505_tagSCFamilyCrossInfo : GameNetPackBasic {
+    public byte ZoneID;    // 鎵�灞炲垎鍖�
+    public ushort ServerCnt;
+    public  uint[] ServerIDList;    // 浜掗�氭湇鍔″櫒ID鍒楄〃
+
+    public HA505_tagSCFamilyCrossInfo () {
+        _cmd = (ushort)0xA505;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out ZoneID, vBytes, NetDataType.BYTE);
+        TransBytes (out ServerCnt, vBytes, NetDataType.WORD);
+        TransBytes (out ServerIDList, vBytes, NetDataType.DWORD, ServerCnt);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA505_tagSCFamilyCrossInfo.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
copy to Main/Core/NetworkPackage/ServerPack/HA5_Family/HA505_tagSCFamilyCrossInfo.cs.meta
index 4c9b26c..f0abc6f 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA505_tagSCFamilyCrossInfo.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: 2975d104ad2db9747a57b40c35de08e2
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA519_tagSCTagFamilyInfo.cs b/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA519_tagSCTagFamilyInfo.cs
new file mode 100644
index 0000000..6ff152f
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA519_tagSCTagFamilyInfo.cs
@@ -0,0 +1,49 @@
+using UnityEngine;
+using System.Collections;
+
+// A5 19 鏌ョ湅鐩爣鍏細淇℃伅 #tagSCTagFamilyInfo
+
+public class HA519_tagSCTagFamilyInfo : GameNetPackBasic {
+    public uint FamilyID;    //瀹舵棌ID
+    public byte FamilyNameLen;
+    public string FamilyName;    //size = FamilyNameLen
+    public uint LeaderID;    //鏃忛暱ID
+    public byte LeaderNameLen;
+    public string LeaderName;    //size = LeaderNameLen
+    public uint LeaderServerID;    //浼氶暱鍖烘湇ID
+    public byte FamilyLV;    //瀹舵棌绛夌骇
+    public uint ServerID;    //鍖烘湇ID
+    public uint EmblemID;    //寰界珷ID
+    public string EmblemWord;    //寰界珷鏂囧瓧
+    public uint FightPower;    //鎬绘垬鍔涳紝姹備綑浜块儴鍒�
+    public uint FightPowerEx;    //鎬绘垬鍔涳紝鏁撮櫎浜块儴鍒�
+    public ushort BroadcastLen;    //鍏憡
+    public string Broadcast;    //size = BroadcastLen
+    public byte MemberCount;    //鎴愬憳浜烘暟
+    public uint DataServerID;    //鏁版嵁鎵�鍦ㄦ湇鍔″櫒ID
+
+    public HA519_tagSCTagFamilyInfo () {
+        _cmd = (ushort)0xA519;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out FamilyID, vBytes, NetDataType.DWORD);
+        TransBytes (out FamilyNameLen, vBytes, NetDataType.BYTE);
+        TransBytes (out FamilyName, vBytes, NetDataType.Chars, FamilyNameLen);
+        TransBytes (out LeaderID, vBytes, NetDataType.DWORD);
+        TransBytes (out LeaderNameLen, vBytes, NetDataType.BYTE);
+        TransBytes (out LeaderName, vBytes, NetDataType.Chars, LeaderNameLen);
+        TransBytes (out LeaderServerID, vBytes, NetDataType.DWORD);
+        TransBytes (out FamilyLV, vBytes, NetDataType.BYTE);
+        TransBytes (out ServerID, vBytes, NetDataType.DWORD);
+        TransBytes (out EmblemID, vBytes, NetDataType.DWORD);
+        TransBytes (out EmblemWord, vBytes, NetDataType.Chars, 3);
+        TransBytes (out FightPower, vBytes, NetDataType.DWORD);
+        TransBytes (out FightPowerEx, vBytes, NetDataType.DWORD);
+        TransBytes (out BroadcastLen, vBytes, NetDataType.WORD);
+        TransBytes (out Broadcast, vBytes, NetDataType.Chars, BroadcastLen);
+        TransBytes (out MemberCount, vBytes, NetDataType.BYTE);
+        TransBytes (out DataServerID, vBytes, NetDataType.DWORD);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA519_tagSCTagFamilyInfo.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
copy to Main/Core/NetworkPackage/ServerPack/HA5_Family/HA519_tagSCTagFamilyInfo.cs.meta
index 4c9b26c..686e993 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA519_tagSCTagFamilyInfo.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: 487779c3213b8a94e861c50bc592c1dd
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA520_tagMCRoleFamilyInfo.cs b/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA520_tagMCRoleFamilyInfo.cs
index 747ce8f..23e1d66 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA520_tagMCRoleFamilyInfo.cs
+++ b/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA520_tagMCRoleFamilyInfo.cs
@@ -20,6 +20,7 @@
     public uint LeaderID;    //鏃忛暱鐜╁ID
     public byte MemberCount;    //浜烘暟
     public  tagMCRoleFamilyMember[] MemberList;    //size = MemberCount
+    public uint Extra1;    //闄勫姞瀛楁1
 
     public HA520_tagMCRoleFamilyInfo () {
         _cmd = (ushort)0xA520;
@@ -64,6 +65,7 @@
             TransBytes (out MemberList[i].DonateCntDay, vBytes, NetDataType.BYTE);
             TransBytes (out MemberList[i].OffTime, vBytes, NetDataType.DWORD);
         }
+        TransBytes (out Extra1, vBytes, NetDataType.DWORD);
     }
 
     public class tagMCRoleFamilyMember {
diff --git a/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA521_tagMCFamilyChange.cs b/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA521_tagMCFamilyChange.cs
deleted file mode 100644
index 79786a7..0000000
--- a/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA521_tagMCFamilyChange.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using UnityEngine;
-using System.Collections;
-
-// A5 21 瀹舵棌鍙樻洿 #tagMCFamilyChange
-
-public class HA521_tagMCFamilyChange : GameNetPackBasic {
-    public byte Type;
-
-    public HA521_tagMCFamilyChange () {
-        _cmd = (ushort)0xA521;
-    }
-
-    public override void ReadFromBytes (byte[] vBytes) {
-        TransBytes (out Type, vBytes, NetDataType.BYTE);
-    }
-
-}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA521_tagMCFamilyChange.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA521_tagMCFamilyChange.cs.meta
deleted file mode 100644
index d1f2c26..0000000
--- a/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA521_tagMCFamilyChange.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 8aec250ed756e2e40a3fad27b904620d
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA523_tagMCFamilyViewList.cs b/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA523_tagMCFamilyViewList.cs
index 9f3c56e..41b053b 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA523_tagMCFamilyViewList.cs
+++ b/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA523_tagMCFamilyViewList.cs
@@ -1,6 +1,6 @@
-using UnityEngine;
-using System.Collections;
-
+using UnityEngine;
+using System.Collections;
+
 // A5 23 鎼滅储瀹舵棌杩斿洖鍒楄〃 #tagMCFamilyViewList
 
 public class HA523_tagMCFamilyViewList : GameNetPackBasic {
@@ -11,6 +11,7 @@
     public byte TotalPage;    //涓�鍏辨湁澶氬皯椤�
     public byte FamilyCount;
     public  tagMCFamilyView[] FamilyList;    //鏈〉瀹舵棌淇℃伅鍒楄〃
+    public uint Rank;    //鐜╁鍏細鎵�鍦ㄥ悕娆★紝0-娌℃湁鍏細鎴栨病鏈夊湪姒滀笂锛�>0-瀵瑰簲鎺掑悕
 
     public HA523_tagMCFamilyViewList () {
         _cmd = (ushort)0xA523;
@@ -33,6 +34,7 @@
             TransBytes (out FamilyList[i].LeaderID, vBytes, NetDataType.DWORD);
             TransBytes (out FamilyList[i].LeaderNameLen, vBytes, NetDataType.BYTE);
             TransBytes (out FamilyList[i].LeaderName, vBytes, NetDataType.Chars, FamilyList[i].LeaderNameLen);
+            TransBytes (out FamilyList[i].LeaderServerID, vBytes, NetDataType.DWORD);
             TransBytes (out FamilyList[i].FamilyLV, vBytes, NetDataType.BYTE);
             TransBytes (out FamilyList[i].JoinReview, vBytes, NetDataType.BYTE);
             TransBytes (out FamilyList[i].JoinLVMin, vBytes, NetDataType.WORD);
@@ -43,6 +45,7 @@
             TransBytes (out FamilyList[i].FightPowerEx, vBytes, NetDataType.DWORD);
             TransBytes (out FamilyList[i].MemberCount, vBytes, NetDataType.BYTE);
         }
+        TransBytes (out Rank, vBytes, NetDataType.DWORD);
     }
 
     public class tagMCFamilyView {
@@ -53,6 +56,7 @@
         public uint LeaderID;        //鏃忛暱ID
         public byte LeaderNameLen;
         public string LeaderName;        //size = LeaderNameLen
+        public uint LeaderServerID;        //鏃忛暱鏈嶅姟鍣↖D
         public byte FamilyLV;        //瀹舵棌绛夌骇
         public byte JoinReview;        //鎴愬憳鍔犲叆鏄惁闇�瑕佸鏍革紝榛樿0鑷姩鍔犲叆
         public ushort JoinLVMin;        //闄愬埗鏈�浣庡彲鍔犲叆鐨勭帺瀹剁瓑绾�
diff --git a/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA524_tagSCFamilyMemDel.cs b/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA524_tagSCFamilyMemDel.cs
new file mode 100644
index 0000000..08d664f
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA524_tagSCFamilyMemDel.cs
@@ -0,0 +1,23 @@
+using UnityEngine;
+using System.Collections;
+
+// A5 24 鍏細鎴愬憳鍒犻櫎 #tagSCFamilyMemDel
+
+public class HA524_tagSCFamilyMemDel : GameNetPackBasic {
+    public byte Type;    // 0-韪㈠嚭锛�1-涓诲姩閫�鍑�
+    public uint PlayerID;
+    public byte NameLen;
+    public string Name;
+
+    public HA524_tagSCFamilyMemDel () {
+        _cmd = (ushort)0xA524;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out Type, vBytes, NetDataType.BYTE);
+        TransBytes (out PlayerID, vBytes, NetDataType.DWORD);
+        TransBytes (out NameLen, vBytes, NetDataType.BYTE);
+        TransBytes (out Name, vBytes, NetDataType.Chars, NameLen);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA524_tagSCFamilyMemDel.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
copy to Main/Core/NetworkPackage/ServerPack/HA5_Family/HA524_tagSCFamilyMemDel.cs.meta
index 4c9b26c..a9bc564 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA524_tagSCFamilyMemDel.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: 824719d9672072944a5ff55b15e93e52
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA705_tagSCQueryPlayerCacheResult.cs b/Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA705_tagSCQueryPlayerCacheResult.cs
index bebac50..b3f4928 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA705_tagSCQueryPlayerCacheResult.cs
+++ b/Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA705_tagSCQueryPlayerCacheResult.cs
@@ -1,6 +1,6 @@
-using UnityEngine;
-using System.Collections;
-
+using UnityEngine;
+using System.Collections;
+
 //A7 05 鏌ヨ鐜╁璇︾粏淇℃伅缁撴灉#tagSCQueryPlayerCacheResult
 
 public class HA705_tagSCQueryPlayerCacheResult : GameNetPackBasic {
@@ -21,6 +21,7 @@
     public string FamilyName;
     public uint FamilyEmblemID;    //浠欑洘寰界珷ID
     public string FamilyEmblemWord;    //寰界珷鏂囧瓧
+    public uint FamilyDataServerID;    //鍏細鏁版嵁鎵�鍦ㄦ湇鍔″櫒ID锛孉619鏌ョ湅鍏細鐢�
     public uint PlusDataSize;
     public string PlusData;    //鎵╁睍璁板綍	
 
@@ -46,8 +47,9 @@
         TransBytes (out FamilyName, vBytes, NetDataType.Chars, 33);
         TransBytes (out FamilyEmblemID, vBytes, NetDataType.DWORD);
         TransBytes (out FamilyEmblemWord, vBytes, NetDataType.Chars, 3);
+        TransBytes (out FamilyDataServerID, vBytes, NetDataType.DWORD);
         TransBytes (out PlusDataSize, vBytes, NetDataType.DWORD);
         TransBytes (out PlusData, vBytes, NetDataType.Chars, PlusDataSize);
     }
 
-}
+}
\ No newline at end of file
diff --git a/Main/Core/NetworkPackage/ServerPack/HB0_Event/HB040_tagSCTravelInfo.cs b/Main/Core/NetworkPackage/ServerPack/HB0_Event/HB040_tagSCTravelInfo.cs
index c08a276..623a64a 100644
--- a/Main/Core/NetworkPackage/ServerPack/HB0_Event/HB040_tagSCTravelInfo.cs
+++ b/Main/Core/NetworkPackage/ServerPack/HB0_Event/HB040_tagSCTravelInfo.cs
@@ -4,7 +4,7 @@
 // B0 40 娓稿巻淇℃伅 #tagSCTravelInfo
 
 public class HB040_tagSCTravelInfo : GameNetPackBasic {
-    public byte Energy;    //鍓╀綑浣撳姏
+    public uint Energy;    //鍓╀綑浣撳姏
     public uint EnergyTime;    //涓婃鎭㈠浣撳姏鏃堕棿鎴�
     public uint TravelCnt;    //绱娓稿巻娆℃暟
     public byte SceneryType;    //鏅绫诲瀷
@@ -20,7 +20,7 @@
     }
 
     public override void ReadFromBytes (byte[] vBytes) {
-        TransBytes (out Energy, vBytes, NetDataType.BYTE);
+        TransBytes (out Energy, vBytes, NetDataType.DWORD);
         TransBytes (out EnergyTime, vBytes, NetDataType.DWORD);
         TransBytes (out TravelCnt, vBytes, NetDataType.DWORD);
         TransBytes (out SceneryType, vBytes, NetDataType.BYTE);
diff --git a/Main/Main.cs b/Main/Main.cs
index d14fce2..bd05988 100644
--- a/Main/Main.cs
+++ b/Main/Main.cs
@@ -114,6 +114,8 @@
         managers.Add(MinggeManager.Instance);
         managers.Add(FuncPresetManager.Instance);
         managers.Add(GMNotifyManager.Instance);
+        managers.Add(TimingGiftManager.Instance);
+        managers.Add(SettingDataManager.Instance);
 
         foreach (var manager in managers)
         {
diff --git a/Main/System/Battle/BaseBattleWin.cs b/Main/System/Battle/BaseBattleWin.cs
index 2caf743..8a7e672 100644
--- a/Main/System/Battle/BaseBattleWin.cs
+++ b/Main/System/Battle/BaseBattleWin.cs
@@ -59,6 +59,48 @@
         }
     }
 
+    protected void RefreshBuffCells(List<BattleBuffCell> cells, List<HB428_tagSCBuffRefresh> datas)
+    {
+        if (datas == null)
+        {
+            for (int i = 0; i < cells.Count; i++)
+            {
+                cells[i].SetActive(false);
+            }
+        }
+        else
+        {
+            if (battleField.battleSwitch.BuffIcon)
+            {
+                for (int i = 0; i < cells.Count; i++)
+                {
+                    var cell = cells[i];
+                    if (i < datas.Count)
+                    {
+                        cell.SetActive(true);
+                        HB428_tagSCBuffRefresh buffData = datas[i];
+                        SkillConfig skillConfig = SkillConfig.Get((int)buffData.SkillID);
+                        cell.Init(buffData, () =>
+                        {
+                            //  鐐瑰嚮buff鍥炬爣 鏄剧ずbuff鎻忚堪/褰撳墠韬笂鎵�鏈塨uff
+                        });
+                    }
+                    else
+                    {
+                        cell.SetActive(false);
+                    }
+                }
+            }
+            else
+            {
+                for (int i = 0; i < cells.Count; i++)
+                {
+                    cells[i].SetActive(false);
+                }
+            }
+
+        }
+    }
     protected virtual void BindMingge()
     {
         if (minggeObj == null)
diff --git a/Main/System/Battle/BattleField/BattleField.cs b/Main/System/Battle/BattleField/BattleField.cs
index b0b24ca..ea486e1 100644
--- a/Main/System/Battle/BattleField/BattleField.cs
+++ b/Main/System/Battle/BattleField/BattleField.cs
@@ -677,9 +677,9 @@
         return GetTeamNode(battleCamp, index);
     }
 
-    public RectTransform GetTeamNode(BattleCamp battleCamp, SkillConfig skillConfig)
+    public RectTransform GetTeamNode(BattleCamp battleCamp, SkillSkinConfig skillSkinConfig)
     {
-        int index = skillConfig.CastIndexNum - 1; // 鎶�鑳介厤缃殑index鏄粠1寮�濮嬬殑锛屾墍浠ヨ鍑�1
+        int index = skillSkinConfig.CastIndexNum - 1; // 鎶�鑳介厤缃殑index鏄粠1寮�濮嬬殑锛屾墍浠ヨ鍑�1
         return GetTeamNode(battleCamp, index);
     }
 
diff --git a/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs b/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs
index 1005937..d70c82b 100644
--- a/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs
+++ b/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs
@@ -175,7 +175,7 @@
 		if (isCast)
 			return;
 
-		if (skillBase.caster.CanCastSkillAnimation(skillBase.skillConfig))
+		if (skillBase.caster.CanCastSkillAnimation(skillBase.skillSkinConfig))
 		{
 			// Debug.LogError("cast skill id is " + skillBase.skillConfig.SkillID);
 
diff --git a/Main/System/Battle/BattleField/WarlordPavilionBattleField.cs b/Main/System/Battle/BattleField/WarlordPavilionBattleField.cs
index edf6be1..d9b5c39 100644
--- a/Main/System/Battle/BattleField/WarlordPavilionBattleField.cs
+++ b/Main/System/Battle/BattleField/WarlordPavilionBattleField.cs
@@ -94,9 +94,9 @@
         }
         fsBattleWin.SetBattleField(this);
 
-        if (UIManager.Instance.IsOpened<WarlordPavilionWin>())
+        if (UIManager.Instance.IsOpened<TowerBaseWin>())
         {
-            UIManager.Instance.CloseWindow<WarlordPavilionWin>();
+            UIManager.Instance.CloseWindow<TowerBaseWin>();
         }
     }
 
diff --git a/Main/System/Battle/BattleObject/BattleObject.cs b/Main/System/Battle/BattleObject/BattleObject.cs
index 90ba56a..b30a55c 100644
--- a/Main/System/Battle/BattleObject/BattleObject.cs
+++ b/Main/System/Battle/BattleObject/BattleObject.cs
@@ -93,7 +93,7 @@
     /// <summary>
     /// 鎾斁鎶�鑳藉姩鐢�
     /// </summary>
-    public abstract Spine.TrackEntry PlaySkillAnimation(SkillConfig skillConfig, SkillBase skillBase, bool isCounter, Action onComplete);
+    public abstract Spine.TrackEntry PlaySkillAnimation(SkillConfig skillConfig, SkillSkinConfig skillSkinConfig, SkillBase skillBase, bool isCounter, Action onComplete);
     
     /// <summary>
     /// 妫�鏌ユ槸鍚﹀彲浠ュ紑濮嬫浜�
@@ -103,7 +103,7 @@
     /// <summary>
     /// 妫�鏌ユ槸鍚﹀彲浠ラ噴鏀炬妧鑳�
     /// </summary>
-    public abstract bool CanCastSkillAnimation(SkillConfig skillConfig);
+    public abstract bool CanCastSkillAnimation(SkillSkinConfig skillSkinConfig);
     
     /// <summary>
     /// 鑾峰彇楠ㄩ鍔ㄧ敾缁勪欢锛堢敤浜庣壒鏁堟寕杞界瓑锛�
@@ -405,7 +405,7 @@
         }
 
         // ============ 搴旂敤鏂芥硶鑰呯殑琛�閲忓拰鎶ょ浘鍙樺寲 ============
-        bool isLastHit = battleHurtParam.hitIndex >= battleHurtParam.skillConfig.DamageDivide.Length - 1;
+        bool isLastHit = battleHurtParam.hitIndex >= battleHurtParam.skillSkinConfig.DamageDivide.Length - 1;
         ApplyHurtToCaster(battleHurtParam, isLastHit);
 
         // 鍜孒urt涓�鏍凤紝璋冪敤PopDamage澶勭悊鍚歌/鍙嶄激鐨勬樉绀�
diff --git a/Main/System/Battle/BattleObject/BattleObjectFactory.cs b/Main/System/Battle/BattleObject/BattleObjectFactory.cs
index 0cb40f5..dacfe8e 100644
--- a/Main/System/Battle/BattleObject/BattleObjectFactory.cs
+++ b/Main/System/Battle/BattleObject/BattleObjectFactory.cs
@@ -45,6 +45,9 @@
             Debug.LogError($"BattleObjectFactory: Failed to load SkeletonDataAsset for {skinCfg.SpineRes}");
             return null;
         }
+
+        // Debug.LogError($"{teamHero.SkinID} : {skinCfg.SpineRes}");
+
         // ==============================================
 
         #pragma warning disable CS0618
diff --git a/Main/System/Battle/BattleObject/HeroBattleObject.cs b/Main/System/Battle/BattleObject/HeroBattleObject.cs
index d26e314..8b6f0ad 100644
--- a/Main/System/Battle/BattleObject/HeroBattleObject.cs
+++ b/Main/System/Battle/BattleObject/HeroBattleObject.cs
@@ -186,9 +186,9 @@
         }
     }
     
-    public override Spine.TrackEntry PlaySkillAnimation(SkillConfig skillConfig, SkillBase skillBase, bool isCounter, Action onComplete)
+    public override Spine.TrackEntry PlaySkillAnimation(SkillConfig skillConfig, SkillSkinConfig skillSkinConfig, SkillBase skillBase, bool isCounter, Action onComplete)
     {
-        return motionBase.PlaySkillAnimation(skillConfig, skillBase, isCounter, onComplete);
+        return motionBase.PlaySkillAnimation(skillConfig, skillSkinConfig, skillBase, isCounter, onComplete);
     }
     
     public override bool CanStartDeath()
@@ -196,9 +196,9 @@
         return motionBase.CanStartDeath();
     }
     
-    public override bool CanCastSkillAnimation(SkillConfig skillConfig)
+    public override bool CanCastSkillAnimation(SkillSkinConfig skillSkinConfig)
     {
-        return motionBase.CanCastSkill(skillConfig);
+        return motionBase.CanCastSkill(skillSkinConfig);
     }
     
     public override SkeletonAnimation GetSkeletonAnimation()
@@ -339,7 +339,7 @@
     public override DeathRecordAction Hurt(BattleHurtParam battleHurtParam, SkillRecordAction _parentSkillAction = null)
     {
         DeathRecordAction recordAction = null;
-        bool isLastHit = battleHurtParam.hitIndex >= battleHurtParam.skillConfig.DamageDivide.Length - 1;
+        bool isLastHit = battleHurtParam.hitIndex >= battleHurtParam.skillSkinConfig.DamageDivide.Length - 1;
         bool firstHit = battleHurtParam.hitIndex == 0;
         
         // 娣诲姞璋冭瘯鏃ュ織
@@ -704,7 +704,7 @@
         }
 
         // ============ 搴旂敤鏂芥硶鑰呯殑琛�閲忓拰鎶ょ浘鍙樺寲 ============
-        bool isLastHit = battleHurtParam.hitIndex >= battleHurtParam.skillConfig.DamageDivide.Length - 1;
+        bool isLastHit = battleHurtParam.hitIndex >= battleHurtParam.skillSkinConfig.DamageDivide.Length - 1;
         ApplyHurtToCaster(battleHurtParam, isLastHit);
 
         // 鍜孒urt涓�鏍凤紝璋冪敤PopDamage澶勭悊鍚歌/鍙嶄激鐨勬樉绀�
diff --git a/Main/System/Battle/BattleObject/MinggeBattleObject.cs b/Main/System/Battle/BattleObject/MinggeBattleObject.cs
index 078f3bc..ce0dd1b 100644
--- a/Main/System/Battle/BattleObject/MinggeBattleObject.cs
+++ b/Main/System/Battle/BattleObject/MinggeBattleObject.cs
@@ -106,11 +106,11 @@
         // 鍛芥牸娌℃湁骞诲奖
     }
     
-    public override Spine.TrackEntry PlaySkillAnimation(SkillConfig skillConfig, SkillBase skillBase, bool isCounter, Action onComplete)
+    public override Spine.TrackEntry PlaySkillAnimation(SkillConfig skillConfig, SkillSkinConfig skillSkinConfig, SkillBase skillBase, bool isCounter, Action onComplete)
     {
         // 鍛芥牸娌℃湁鎶�鑳藉姩鐢伙紝绔嬪嵆瑙﹀彂鎵�鏈夊抚浜嬩欢
-        int loopCount = skillConfig.LoopCount + 1; //榛樿浼氭湁涓�娆�
-        int frameCount = skillConfig.ActiveFrames.Length;
+        int loopCount = skillSkinConfig.LoopCount + 1; //榛樿浼氭湁涓�娆�
+        int frameCount = skillSkinConfig.ActiveFrames.Length;
         
         // 1. 鎶�鑳藉紑濮�
         skillBase.OnSkillStart();
@@ -150,7 +150,7 @@
         return false;
     }
     
-    public override bool CanCastSkillAnimation(SkillConfig skillConfig)
+    public override bool CanCastSkillAnimation(SkillSkinConfig skillSkinConfig)
     {
         // 鍛芥牸鎬绘槸鍙互閲婃斁鎶�鑳斤紙浠庡姩鐢昏搴︼級
         return true;
diff --git a/Main/System/Battle/BattleResources/TeamResTracker.cs b/Main/System/Battle/BattleResources/TeamResTracker.cs
index 56e20fa..ef06205 100644
--- a/Main/System/Battle/BattleResources/TeamResTracker.cs
+++ b/Main/System/Battle/BattleResources/TeamResTracker.cs
@@ -71,56 +71,69 @@
         // 鏅敾鎶�鑳�
         if (teamHero.heroConfig.AtkSkillID > 0)
         {
-            AddSingleSkillResources(teamHero.heroConfig.AtkSkillID, info, isPersistent, ownerId);
+            SkillConfig skillConfig = SkillConfig.Get(teamHero.heroConfig.AtkSkillID);
+            if (null != skillConfig)
+            {
+                SkillSkinConfig skillSkinConfig = skillConfig.GetSkillSkinConfig(teamHero.SkinID);
+                if (null != skillSkinConfig)
+                {
+                    AddSingleSkillResources(skillSkinConfig, info, isPersistent, ownerId);
+                }
+            }
         }
         
         // 鎬掓皵鎶�鑳�
         if (teamHero.heroConfig.AngerSkillID > 0)
         {
-            AddSingleSkillResources(teamHero.heroConfig.AngerSkillID, info, isPersistent, ownerId);
+            SkillConfig skillConfig = SkillConfig.Get(teamHero.heroConfig.AngerSkillID);
+            if (null != skillConfig)
+            {
+                SkillSkinConfig skillSkinConfig = skillConfig.GetSkillSkinConfig(teamHero.SkinID);
+                if (null != skillSkinConfig)
+                {
+                    AddSingleSkillResources(skillSkinConfig, info, isPersistent, ownerId);
+                }
+            }
         }
     }
     
     /// <summary>
     /// 娣诲姞鍗曚釜鎶�鑳界殑璧勬簮
     /// </summary>
-    private static void AddSingleSkillResources(int skillId, TeamResourceInfo info, bool isPersistent, string ownerId)
+    private static void AddSingleSkillResources(SkillSkinConfig skillSkinConfig, TeamResourceInfo info, bool isPersistent, string ownerId)
     {
-        SkillConfig skillConfig = SkillConfig.Get(skillId);
-        if (skillConfig == null)
-            return;
         
-        AddSkillAudio(skillConfig, info, isPersistent, ownerId);
-        AddSkillEffects(skillConfig, info, isPersistent, ownerId);
+        AddSkillAudio(skillSkinConfig, info, isPersistent, ownerId);
+        AddSkillEffects(skillSkinConfig, info, isPersistent, ownerId);
     }
     
-    private static void AddSkillAudio(SkillConfig skillConfig, TeamResourceInfo info, bool isPersistent, string ownerId)
+    private static void AddSkillAudio(SkillSkinConfig skillSkinConfig, TeamResourceInfo info, bool isPersistent, string ownerId)
     {
-        if (skillConfig.SkinllSFX1 > 0)
+        if (skillSkinConfig.SkinllSFX1 > 0)
         {
-            AddAudioResource(skillConfig.SkinllSFX1, info, isPersistent, ownerId);
+            AddAudioResource(skillSkinConfig.SkinllSFX1, info, isPersistent, ownerId);
         }
         
-        if (skillConfig.SkinllSFX2 > 0)
+        if (skillSkinConfig.SkinllSFX2 > 0)
         {
-            AddAudioResource(skillConfig.SkinllSFX2, info, isPersistent, ownerId);
+            AddAudioResource(skillSkinConfig.SkinllSFX2, info, isPersistent, ownerId);
         }
     }
     
-    private static void AddSkillEffects(SkillConfig skillConfig, TeamResourceInfo info, bool isPersistent, string ownerId)
+    private static void AddSkillEffects(SkillSkinConfig skillSkinConfig, TeamResourceInfo info, bool isPersistent, string ownerId)
     {
         List<int> effectIds = new List<int>();
         
-        if (skillConfig.BulletEffectId > 0) effectIds.Add(skillConfig.BulletEffectId);
-        if (skillConfig.ExplosionEffectId > 0) effectIds.Add(skillConfig.ExplosionEffectId);
-        if (skillConfig.ExplosionEffect2 > 0) effectIds.Add(skillConfig.ExplosionEffect2);
-        if (skillConfig.ExplosionEffect3 > 0) effectIds.Add(skillConfig.ExplosionEffect3);
-        if (skillConfig.ExplosionEffect4 > 0) effectIds.Add(skillConfig.ExplosionEffect4);
-        if (skillConfig.EffectId > 0) effectIds.Add(skillConfig.EffectId);
-        if (skillConfig.EffectId2 > 0) effectIds.Add(skillConfig.EffectId2);
-        if (skillConfig.MStartEffectId > 0) effectIds.Add(skillConfig.MStartEffectId);
-        if (skillConfig.BuffEffect > 0) effectIds.Add(skillConfig.BuffEffect);
-        if (skillConfig.TriggerEffect > 0) effectIds.Add(skillConfig.TriggerEffect);
+        if (skillSkinConfig.BulletEffectId > 0) effectIds.Add(skillSkinConfig.BulletEffectId);
+        if (skillSkinConfig.ExplosionEffectId > 0) effectIds.Add(skillSkinConfig.ExplosionEffectId);
+        if (skillSkinConfig.ExplosionEffect2 > 0) effectIds.Add(skillSkinConfig.ExplosionEffect2);
+        if (skillSkinConfig.ExplosionEffect3 > 0) effectIds.Add(skillSkinConfig.ExplosionEffect3);
+        if (skillSkinConfig.ExplosionEffect4 > 0) effectIds.Add(skillSkinConfig.ExplosionEffect4);
+        if (skillSkinConfig.EffectId > 0) effectIds.Add(skillSkinConfig.EffectId);
+        if (skillSkinConfig.EffectId2 > 0) effectIds.Add(skillSkinConfig.EffectId2);
+        if (skillSkinConfig.MStartEffectId > 0) effectIds.Add(skillSkinConfig.MStartEffectId);
+        if (skillSkinConfig.BuffEffect > 0) effectIds.Add(skillSkinConfig.BuffEffect);
+        if (skillSkinConfig.TriggerEffect > 0) effectIds.Add(skillSkinConfig.TriggerEffect);
         
         foreach (int effectId in effectIds)
         {
diff --git a/Main/System/Battle/BattleUtility.cs b/Main/System/Battle/BattleUtility.cs
index f2021c7..91a4f31 100644
--- a/Main/System/Battle/BattleUtility.cs
+++ b/Main/System/Battle/BattleUtility.cs
@@ -379,24 +379,25 @@
     {
         long suckHp = GetSuckHp(skillBase.tagUseSkillAttack);
         SkillConfig skillConfig = skillBase.skillConfig;
+        SkillSkinConfig skillSkinConfig = skillBase.skillSkinConfig;
         long totalDamage = GeneralDefine.GetFactValue(hurt.HurtHP, hurt.HurtHPEx);
         long totalReflectHp = hurt.BounceHP;
 
         // 璁$畻浼ゅ鍒嗘
         long currentHitDamage = 0;
-        List<long> damageList = DivideDamageToList(skillConfig.DamageDivide, hitIndex, totalDamage, ref currentHitDamage);
+        List<long> damageList = DivideDamageToList(skillSkinConfig.DamageDivide, hitIndex, totalDamage, ref currentHitDamage);
 
         // 璁$畻鍚歌鍒嗘
         long currentHitSuckHp = 0;
         List<long> suckHpList = bSuckHp ? 
-            DivideDamageToList(skillConfig.DamageDivide, hitIndex, suckHp, ref currentHitSuckHp) : new List<long>();
+            DivideDamageToList(skillSkinConfig.DamageDivide, hitIndex, suckHp, ref currentHitSuckHp) : new List<long>();
 
         // 璁$畻鍙嶄激鍒嗘
         long currentHitReflectHp = 0;
-        List<long> reflectHpList = DivideDamageToList(skillConfig.DamageDivide, hitIndex, totalReflectHp, ref currentHitReflectHp);
+        List<long> reflectHpList = DivideDamageToList(skillSkinConfig.DamageDivide, hitIndex, totalReflectHp, ref currentHitReflectHp);
 
         // 鍒涘缓鐩爣鍙椾激瀵硅薄
-        BattleHurtObj hurter = CreateHurter(target, damageList, hurt, hitIndex, skillConfig, currentHitDamage);
+        BattleHurtObj hurter = CreateHurter(target, damageList, hurt, hitIndex, skillSkinConfig, currentHitDamage);
 
         // 鍒涘缓鏂芥硶鑰呭璞�
         BattleCastObj caster = CreateCaster(skillBase, suckHpList, reflectHpList, currentHitSuckHp, currentHitReflectHp);
@@ -411,11 +412,12 @@
         battleHurtParam.hitIndex = hitIndex;
         battleHurtParam.deadPack = deadPack;
         battleHurtParam.skillConfig = skillConfig;
+        battleHurtParam.skillSkinConfig = skillSkinConfig;
         battleHurtParam.packUID = skillBase.tagUseSkillAttack.packUID;
         return battleHurtParam;
     }
 
-    public static BattleHurtObj CreateHurter(BattleObject target, List<long> damageList, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, int hitIndex, SkillConfig skillConfig, long currentHitDamage)
+    public static BattleHurtObj CreateHurter(BattleObject target, List<long> damageList, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, int hitIndex, SkillSkinConfig skillSkinConfig, long currentHitDamage)
     {
         BattleHurtObj hurter = new BattleHurtObj();
         hurter.hurtObj = target;
@@ -425,7 +427,7 @@
         hurter.fromShieldValue = buffMgr != null ? buffMgr.GetShieldValue() : 0; // 鍛芥牸娌℃湁鎶ょ浘
 
         // 鍒ゆ柇鏄惁鏄渶鍚庝竴鍑�
-        bool isLastHit = hitIndex >= skillConfig.DamageDivide.Length - 1;
+        bool isLastHit = hitIndex >= skillSkinConfig.DamageDivide.Length - 1;
         
         // 鍒ゆ柇鏄不鐤楄繕鏄激瀹�
         bool isHealing = IsHealing(hurt);
@@ -729,6 +731,7 @@
                     {
                         var skillID = hB427_TagSCUseSkill.SkillID;
                         var skillConfig = SkillConfig.Get((int)skillID);
+                        var skillSkinConfig = skillConfig.GetOriginSkinConfig();
 
                         if (null == skillConfig)
                         {
diff --git a/Main/System/Battle/BoneFieldBattleWin.cs b/Main/System/Battle/BoneFieldBattleWin.cs
index 9d5df31..0a0c529 100644
--- a/Main/System/Battle/BoneFieldBattleWin.cs
+++ b/Main/System/Battle/BoneFieldBattleWin.cs
@@ -251,33 +251,7 @@
 
     public void RefreshBuff(List<HB428_tagSCBuffRefresh> datas)
     {
-        if (buffCells == null)
-        {
-            for (int i = 0; i < buffCells.Count; i++)
-            {
-                buffCells[i].SetActive(false);
-            }
-        }
-        else
-        {
-            for (int i = 0; i < buffCells.Count; i++)
-            {
-                if (i < datas.Count)
-                {
-                    buffCells[i].SetActive(true);
-                    HB428_tagSCBuffRefresh buffData = datas[i];
-                    SkillConfig skillConfig = SkillConfig.Get((int)buffData.SkillID);
-                    buffCells[i].Init(buffData, () =>
-                    {
-                        //  鐐瑰嚮buff鍥炬爣 鏄剧ずbuff鎻忚堪/褰撳墠韬笂鎵�鏈塨uff
-                    });
-                }
-                else
-                {
-                    buffCells[i].SetActive(false);
-                }
-            }
-        }
+        RefreshBuffCells(buffCells, datas);
     }
 
     bool IsOpenBattleChangeTab()
diff --git a/Main/System/Battle/Buff/BattleObjectBuffMgr.cs b/Main/System/Battle/Buff/BattleObjectBuffMgr.cs
index a1c406c..20013c0 100644
--- a/Main/System/Battle/Buff/BattleObjectBuffMgr.cs
+++ b/Main/System/Battle/Buff/BattleObjectBuffMgr.cs
@@ -101,6 +101,7 @@
         {
             HB428_tagSCBuffRefresh buffData = null;
 
+
             bool isRemove = false;
 
             if (buffDataDict.TryGetValue(tempvNetData.BuffID, out buffData))
@@ -114,22 +115,38 @@
                 return;
             }
 
+            BattleObject buffCaster = battleObject.battleField.battleObjMgr.GetBattleObject((int)buffData.OwnerID);
+            
+            if (null == buffCaster)
+            {
+                Debug.LogError("鎵句笉鍒癰uff caster 瀵硅薄 id is " + buffData.OwnerID + " buff id is " + tempvNetData.BuffID + " pack uid is " + vNetData.packUID);
+            }
+
             bool isRemoveEffect = false;
 
             int remainCnt = -1;
 
-            if (buffData != null)
+            if (buffData != null && buffCaster != null)
             {
                 SkillConfig skillConfig = SkillConfig.Get((int)buffData.SkillID);
+                SkillSkinConfig skillSkinConfig = null;
+                if (buffCaster is HeroBattleObject heroBattleObject)
+                {
+                    skillSkinConfig = skillConfig.GetSkillSkinConfig(heroBattleObject.teamHero.SkinID);
+                }
+                else
+                {
+                    skillSkinConfig = skillConfig.GetOriginSkinConfig();
+                }
 
-                if (null == skillConfig || skillConfig.BuffEffect <= 0)
+                if (null == skillConfig || skillSkinConfig.BuffEffect <= 0)
                 {
                     return;
                 }
 
                 KeyValuePair<BattleEffectPlayer, HashSet<uint>> effectPair;
 
-                if (buffEffectDict.TryGetValue(skillConfig.BuffEffect, out effectPair))
+                if (buffEffectDict.TryGetValue(skillSkinConfig.BuffEffect, out effectPair))
                 {
                     effectPair.Value.Remove(buffData.BuffID);
 
@@ -139,8 +156,8 @@
                     {
                         //  娌℃湁杩欎釜buff浜�
                         isRemoveEffect = true;
-                        battleObject.battleField.battleEffectMgr.RemoveEffect(skillConfig.BuffEffect, effectPair.Key);
-                        buffEffectDict.Remove(skillConfig.BuffEffect);
+                        battleObject.battleField.battleEffectMgr.RemoveEffect(skillSkinConfig.BuffEffect, effectPair.Key);
+                        buffEffectDict.Remove(skillSkinConfig.BuffEffect);
                     }
                 }
 
@@ -276,22 +293,41 @@
         if (battleObject.IsDead())
             return;
 
-        if (skillConfig.BuffEffect > 0)
+        BattleObject buffCaster = battleObject.battleField.battleObjMgr.GetBattleObject((int)buffRefresh.OwnerID);
+
+        if (null == buffCaster)
         {
-            if (buffEffectDict.TryGetValue(skillConfig.BuffEffect, out var pair))
+            Debug.LogError("鎵句笉鍒癰uff caster 瀵硅薄 id is " + buffRefresh.OwnerID + " buff id is " + buffRefresh.BuffID + " pack uid is " + buffRefresh.packUID);
+        }
+
+        SkillSkinConfig skillSkinConfig = null;
+
+        if (buffCaster is HeroBattleObject heroBattleObject)
+        {
+            skillSkinConfig = skillConfig.GetSkillSkinConfig(heroBattleObject.teamHero.SkinID);
+        }
+        else
+        {
+            skillSkinConfig = skillConfig.GetOriginSkinConfig();
+        }
+
+
+        if (skillSkinConfig.BuffEffect > 0)
+        {
+            if (buffEffectDict.TryGetValue(skillSkinConfig.BuffEffect, out var pair))
             {
                 pair.Value.Add(buffRefresh.BuffID);
             }
             else
             {
                 BattleEffectPlayer effect = battleObject.battleField.battleEffectMgr
-                    .PlayEffect(battleObject, skillConfig.BuffEffect, battleObject.GetRectTransform(), battleObject.Camp, battleObject.GetModelScale());
+                    .PlayEffect(battleObject, skillSkinConfig.BuffEffect, battleObject.GetRectTransform(), battleObject.Camp, battleObject.GetModelScale());
 
                 effect.BindBone(battleObject, effect.effectConfig.nodeName);
 
                 var buffIdSet = new HashSet<uint> { buffRefresh.BuffID };
                 buffEffectDict.Add(
-                    skillConfig.BuffEffect,
+                    skillSkinConfig.BuffEffect,
                     new KeyValuePair<BattleEffectPlayer, HashSet<uint>>(effect, buffIdSet));
             }
         }
diff --git a/Main/System/Battle/Define/BattleDmgInfo.cs b/Main/System/Battle/Define/BattleDmgInfo.cs
index d570f01..439ebe4 100644
--- a/Main/System/Battle/Define/BattleDmgInfo.cs
+++ b/Main/System/Battle/Define/BattleDmgInfo.cs
@@ -91,7 +91,7 @@
         this.battleFieldGuid = battleFieldGuid;
         this.battleHurtParam = battleHurtParam;
         this.isCasterView = _isCasterView;
-        this.isLastHit = battleHurtParam.hitIndex >= battleHurtParam.skillConfig.DamageDivide.Length - 1;
+        this.isLastHit = battleHurtParam.hitIndex >= battleHurtParam.skillSkinConfig.DamageDivide.Length - 1;
         this.isFirstHit = battleHurtParam.hitIndex == 0;
         
         m_rawAttackType = hurt == null ? 0 : hurt.AttackTypes;
@@ -605,6 +605,7 @@
     public int hitIndex;
     public BattleDeadPack deadPack;
     public SkillConfig skillConfig;
+    public SkillSkinConfig skillSkinConfig;
 
     public ulong packUID;
 }
\ No newline at end of file
diff --git a/Main/System/Battle/Motion/MotionBase.cs b/Main/System/Battle/Motion/MotionBase.cs
index d29a15d..ce84ec0 100644
--- a/Main/System/Battle/Motion/MotionBase.cs
+++ b/Main/System/Battle/Motion/MotionBase.cs
@@ -160,7 +160,7 @@
         return true;
     }
 
-    public Spine.TrackEntry PlaySkillAnimation(SkillConfig skillConfig, SkillBase skillBase, bool isSubSkill, Action onComplete = null)
+    public Spine.TrackEntry PlaySkillAnimation(SkillConfig skillConfig, SkillSkinConfig skillSkinConfig, SkillBase skillBase, bool isSubSkill, Action onComplete = null)
     {
         if (skillConfig == null)
         {
@@ -174,35 +174,35 @@
         }
 
         // 濡傛灉娌℃湁鍔ㄧ敾鍚嶇О锛屼娇鐢ㄦ棤鍔ㄧ敾妯″紡
-        if (string.IsNullOrEmpty(skillConfig.SkillMotionName))
+        if (string.IsNullOrEmpty(skillSkinConfig.SkillMotionName))
         {
-            PlaySkillNoAnim(skillConfig, skillBase, onComplete, isSubSkill);
+            PlaySkillNoAnim(skillConfig, skillSkinConfig, skillBase, onComplete, isSubSkill);
             return null;
         }
 
-        Spine.Animation targetAnim = FindAnim(skillConfig.SkillMotionName);
+        Spine.Animation targetAnim = FindAnim(skillSkinConfig.SkillMotionName);
         if (targetAnim == null)
         {
             skillBase.ForceFinished();
             return null;
         }
 
-        return ExecuteSkillAnim(skillConfig, skillBase, onComplete, targetAnim, true, isSubSkill);
+        return ExecuteSkillAnim(skillConfig, skillSkinConfig, skillBase, onComplete, targetAnim, true, isSubSkill);
     }
 
 
-    private Spine.TrackEntry ExecuteSkillAnim(SkillConfig skillConfig, SkillBase skillBase, Action onComplete,
+    private Spine.TrackEntry ExecuteSkillAnim(SkillConfig skillConfig, SkillSkinConfig skillSkinConfig, SkillBase skillBase, Action onComplete,
         Spine.Animation targetAnim, bool hasAnim, bool isSubSkill)
     {
 
-        int loopCount = skillConfig.LoopCount;
+        int loopCount = skillSkinConfig.LoopCount;
         //  鍓嶆憞
-        int startupFrames = skillConfig.StartupFrames;
+        int startupFrames = skillSkinConfig.StartupFrames;
         //  涓憞
-        int[] activeFrames = skillConfig.ActiveFrames ?? new int[0];
+        int[] activeFrames = skillSkinConfig.ActiveFrames ?? new int[0];
         int frameCount = activeFrames.Length;
         //  鍚庢憞
-        float recoveryFrame = skillConfig.RecoveryFrames;
+        float recoveryFrame = skillSkinConfig.RecoveryFrames;
 
         // 濡傛灉鍓嶄腑鍚庢憞娌℃湁閰嶇疆 閭d箞榛樿缁欎竴涓�1 2 3鐨勫抚鏁�
         if (startupFrames <= 0 && frameCount == 0 && recoveryFrame <= 0f)
@@ -227,7 +227,7 @@
             {
                 // 杞ㄩ亾姹犺�楀敖鎴栨湭鍒濆鍖栵紝鍥為��鍒版棤鍔ㄧ敾妯″紡
                 Debug.LogWarning($"瀛愭妧鑳借建閬撴睜宸叉弧鎴栨湭鍒濆鍖栵紝鎶�鑳絳skillConfig.SkillID}浣跨敤鏃犲姩鐢绘ā寮�");
-                PlaySkillNoAnim(skillConfig, skillBase, onComplete, isSubSkill);
+                PlaySkillNoAnim(skillConfig, skillSkinConfig, skillBase, onComplete, isSubSkill);
                 return null;
             }
         }
@@ -244,7 +244,7 @@
                 {
                     if (skillBase != null && !skillBase.IsFinished())
                     {
-                        PlaySkillAnimation(skillConfig, skillBase, isSubSkill, onComplete);
+                        PlaySkillAnimation(skillConfig, skillSkinConfig, skillBase, isSubSkill, onComplete);
                     }
                 });
                 return null;
@@ -405,13 +405,13 @@
             }
 
             // 鍚勯樁娈靛洖璋冿紙鍘熸湁閫昏緫锛�
-            if (!beginTriggered && currentFrame >= skillConfig.StartupFrames && currentLoop == 0)
+            if (!beginTriggered && currentFrame >= skillSkinConfig.StartupFrames && currentLoop == 0)
             {
                 beginTriggered = true;
                 skillBase.OnStartSkillFrameEnd();
             }
 
-            if (!middleStarted && currentFrame >= skillConfig.StartupFrames && currentLoop <= loopCount)
+            if (!middleStarted && currentFrame >= skillSkinConfig.StartupFrames && currentLoop <= loopCount)
             {
                 middleStarted = true;
                 skillBase.OnMiddleFrameStart(currentLoop);
@@ -440,12 +440,12 @@
                     {
                         if (hasAnim)
                         {
-                            skillTrack.TrackTime = skillConfig.StartupFrames / BattleConst.skillMotionFps;
+                            skillTrack.TrackTime = skillSkinConfig.StartupFrames / BattleConst.skillMotionFps;
                         }
                         else
                         {
                             // 涓轰笅涓� loop 閲嶇疆 startTime锛屽苟涓旀洿鏂� pausedAccumulatedAtStart锛堜互淇濇寔鍩虹嚎锛�
-                            startTime = Time.time - (skillConfig.StartupFrames / BattleConst.skillMotionFps);
+                            startTime = Time.time - (skillSkinConfig.StartupFrames / BattleConst.skillMotionFps);
                             pausedAccumulatedAtStart = pausedAccumulated;
                         }
                     }
@@ -538,8 +538,8 @@
         return targetAnim;
     }
 
-    private void PlaySkillNoAnim(SkillConfig skillConfig, SkillBase skillBase, Action onComplete, bool isSubSkill) => 
-        ExecuteSkillAnim(skillConfig, skillBase, onComplete, null, false, isSubSkill);
+    private void PlaySkillNoAnim(SkillConfig skillConfig, SkillSkinConfig skillSkinConfig, SkillBase skillBase, Action onComplete, bool isSubSkill) => 
+        ExecuteSkillAnim(skillConfig, skillSkinConfig, skillBase, onComplete, null, false, isSubSkill);
 
     protected virtual void SetupAnimationHandlers()
     {
@@ -748,9 +748,9 @@
         }
     }
 
-    public bool CanCastSkill(SkillConfig skillConfig)
+    public bool CanCastSkill(SkillSkinConfig skillSkinConfig)
     {
-        return !playingSkillWithAnim || string.IsNullOrEmpty(skillConfig.SkillMotionName);
+        return !playingSkillWithAnim || string.IsNullOrEmpty(skillSkinConfig.SkillMotionName);
     }
 
     public bool CanStartDeath()
diff --git a/Main/System/Battle/Skill/SkillBase.cs b/Main/System/Battle/Skill/SkillBase.cs
index 8f6daea..3988cad 100644
--- a/Main/System/Battle/Skill/SkillBase.cs
+++ b/Main/System/Battle/Skill/SkillBase.cs
@@ -19,6 +19,8 @@
     protected SkillEffect skillEffect;
     public HB427_tagSCUseSkill tagUseSkillAttack;
     public SkillConfig skillConfig;
+
+    public SkillSkinConfig skillSkinConfig;
     protected bool isFinished = false;
     protected BattleField battleField = null; // 鎴樺満
     protected RectTransform targetNode = null; // 鐩爣鑺傜偣
@@ -57,6 +59,21 @@
         tagUseSkillAttack = vNetData;
         battleField = _battleField;
         packList = _packList;
+
+        if (_caster is HeroBattleObject heroBattleObject)
+        {
+            skillSkinConfig = skillConfig.GetSkillSkinConfig(heroBattleObject.teamHero.SkinID);
+
+            if (null == skillSkinConfig)
+            {
+                Debug.LogError("鎵句笉鍒版妧鑳界毊鑲よ〃 " + "skillId: " + skillConfig.SkillID + " skinId: " + heroBattleObject.teamHero.SkinID);
+            }
+        }
+        else
+        {
+            skillSkinConfig = skillConfig.GetOriginSkinConfig();
+        }
+        
 
         // 娉ㄥ唽姝e湪閲婃斁鐨勬妧鑳�
         if (battleField != null && caster != null)
@@ -249,9 +266,9 @@
         // 鍛芥牸閲婃斁鎶�鑳芥椂 teamHero 涓� null锛岀洃鍚櫒浼氭纭鐞嗭紙宸叉湁 null 妫�鏌ワ級
         EventBroadcast.Instance.Broadcast<string, SkillConfig, TeamHero>(EventName.BATTLE_CAST_SKILL, guid, skillConfig, teamHero);
 
-        if (skillConfig.SkinllSFX1 != 0)
+        if (skillSkinConfig.SkinllSFX1 != 0)
         {
-            battleField.soundManager.PlayEffectSound(skillConfig.SkinllSFX1, false);
+            battleField.soundManager.PlayEffectSound(skillSkinConfig.SkinllSFX1, false);
         }
 
         if (caster != null)
@@ -280,7 +297,7 @@
         HighLightAllTargets();
 
         // 鏍规嵁閲婃斁妯″紡鎵ц鐩稿簲閫昏緫
-        switch (skillConfig.castMode)
+        switch (skillSkinConfig.castMode)
         {
             case SkillCastMode.None:
             case SkillCastMode.Self:
@@ -299,7 +316,7 @@
                 DashCast(OnAttackFinish);
                 break;
             default:
-                Debug.LogError("寮哄埗缁撴潫鎶�鑳� 鏆傛椂涓嶆敮鎸佸叾浠栫殑鏂瑰紡閲婃斁 鏈夐渶姹俻lease鑱旂郴绛栧垝 鎶�鑳絠d:" + skillConfig.SkillID + " cast position " + skillConfig.CastPosition);
+                Debug.LogError("寮哄埗缁撴潫鎶�鑳� 鏆傛椂涓嶆敮鎸佸叾浠栫殑鏂瑰紡閲婃斁 鏈夐渶姹俻lease鑱旂郴绛栧垝 鎶�鑳絠d:" + skillConfig.SkillID + " cast position " + skillSkinConfig.CastPosition);
                 ForceFinished();
                 break;
         }
@@ -323,7 +340,7 @@
     // 瀵规晫鏂归噴鏀炬妧鑳斤細绉诲姩鍒版晫鏂瑰尯鍩熻繘琛屾敾鍑�
     protected void CastToEnemy()
     {
-        RectTransform target = battleField.GetTeamNode(caster.GetEnemyCamp(), skillConfig);
+        RectTransform target = battleField.GetTeamNode(caster.GetEnemyCamp(), skillSkinConfig);
         ExecuteMoveAndCastSequence(target, () =>
         {
             if (skillConfig.ClientTriggerTiming == 1)
@@ -371,7 +388,7 @@
     // 瀵瑰弸鏂归噴鏀炬妧鑳斤細绉诲姩鍒板弸鏂瑰尯鍩熻繘琛屾不鐤楁垨澧炵泭
     protected void CastToAllies()
     {
-        RectTransform target = battleField.GetTeamNode(caster.Camp, skillConfig);
+        RectTransform target = battleField.GetTeamNode(caster.Camp, skillSkinConfig);
         ExecuteMoveAndCastSequence(target, () =>
         {
             if (skillConfig.ClientTriggerTiming == 1)
@@ -394,11 +411,11 @@
     private void ExecuteMoveAndCastSequence(RectTransform target, Action onReturnComplete)
     {
         ShadowIllutionCreate(true);
-        MoveToTarget(target, new Vector2(skillConfig.CastDistance, 0), () =>
+        MoveToTarget(target, new Vector2(skillSkinConfig.CastDistance, 0), () =>
         {
-            if (skillConfig.CastDistance < 9999 && skillConfig.SkinllSFX2 != 0)
+            if (skillSkinConfig.CastDistance < 9999 && skillSkinConfig.SkinllSFX2 != 0)
             {
-                battleField.soundManager.PlayEffectSound(skillConfig.SkinllSFX2, false);
+                battleField.soundManager.PlayEffectSound(skillSkinConfig.SkinllSFX2, false);
             }
 
             TurnBack(() =>
@@ -427,7 +444,7 @@
     // 绉诲姩鍒扮洰鏍囦綅缃細澶勭悊瑙掕壊鐨勭Щ鍔ㄥ姩鐢诲拰閫昏緫
     protected void MoveToTarget(RectTransform target, Vector2 offset, Action _onComplete = null, float speed = 750f)
     {
-        if (skillConfig.CastDistance >= 9999)
+        if (skillSkinConfig.CastDistance >= 9999)
         {
             _onComplete?.Invoke();
             return;
@@ -445,7 +462,7 @@
     // 杞韩閫昏緫锛氭牴鎹妧鑳介厤缃鐞嗚鑹茶浆鍚�
     protected void TurnBack(Action _onComplete, float forward)
     {
-        if (skillConfig.CastDistance < 0)
+        if (skillSkinConfig.CastDistance < 0)
         {
             caster.SetFacing(forward);
         }
@@ -476,7 +493,7 @@
     // 鎵ц鎶�鑳介噴鏀惧姩鐢诲拰閫昏緫锛氭挱鏀炬柦娉曞姩浣滃苟鎻愪緵鍥炶皟
     protected TrackEntry CastImpl(Action onComplete = null)
     {
-        return caster.PlaySkillAnimation(skillConfig, this, tagUseSkillAttack.BattleType == 4, onComplete);
+        return caster.PlaySkillAnimation(skillConfig, skillSkinConfig, this, tagUseSkillAttack.BattleType == 4, onComplete);
     }
 
     // 鎶�鑳藉紑濮嬪洖璋冿細澶勭悊姝讳骸銆佸瓙鎶�鑳姐�佹妧鑳芥晥鏋滃垵濮嬪寲
@@ -494,7 +511,7 @@
         //  鍐嶅鐞� 鍐呭祵鎶�鑳�
         ProcessSubSkill();
 
-        skillEffect = SkillEffectFactory.CreateSkillEffect(this, caster, skillConfig, tagUseSkillAttack);
+        skillEffect = SkillEffectFactory.CreateSkillEffect(this, caster, skillConfig, skillSkinConfig, tagUseSkillAttack);
         skillEffect.Play(OnHitTargets);
         
 
@@ -513,7 +530,8 @@
             if (pack is HB427_tagSCUseSkill skillPack)
             {
                 SkillConfig ssc = SkillConfig.Get((int)skillPack.SkillID);
-                if (!string.IsNullOrEmpty(ssc.SkillMotionName))
+                SkillSkinConfig sscSkin = ssc.GetOriginSkinConfig();
+                if (!string.IsNullOrEmpty(sscSkin.SkillMotionName))
                 {
                     break;
                 }
@@ -533,8 +551,8 @@
             {
                 HB427_tagSCUseSkill sp = combinePack.GetMainHB427SkillPack();
                 SkillConfig ssc = SkillConfig.Get((int)sp.SkillID);
-
-                if (!string.IsNullOrEmpty(ssc.SkillMotionName))
+                SkillSkinConfig sscSkin = ssc.GetOriginSkinConfig();
+                if (!string.IsNullOrEmpty(sscSkin.SkillMotionName))
                 {
                     break;
                 }
@@ -883,7 +901,7 @@
 #if UNITY_EDITOR
     private void PrintHurtParamDebugInfo(BattleHurtParam hurtParam)
     {
-        bool isLastHit = hurtParam.hitIndex >= hurtParam.skillConfig.DamageDivide.Length - 1;
+        bool isLastHit = hurtParam.hitIndex >= hurtParam.skillSkinConfig.DamageDivide.Length - 1;
         
         long currentHitDamage = hurtParam.hurter.damageList != null ? hurtParam.hurter.damageList.Sum() : 0;
         long currentHitSuckHp = hurtParam.caster.suckHpList != null ? hurtParam.caster.suckHpList.Sum() : 0;
@@ -898,7 +916,7 @@
             $"鏀诲嚮鑰�: {hurtParam.caster.casterObj.GetName()} (ObjID:{hurtParam.caster.casterObj.ObjID})\n" +
             $"鐩爣: {hurtParam.hurter.hurtObj.GetName()} (ObjID:{hurtParam.hurter.hurtObj.ObjID})\n" +
             $"鎶�鑳�: {hurtParam.skillConfig.SkillName} (ID:{hurtParam.skillConfig.SkillID})\n" +
-            $"鍑绘暟: 绗瑊hurtParam.hitIndex + 1}鍑� / 鍏眥hurtParam.skillConfig.DamageDivide.Length}鍑�" + (isLastHit ? " [鏈�鍚庝竴鍑籡" : " [涓棿鍑籡") + "\n" +
+            $"鍑绘暟: 绗瑊hurtParam.hitIndex + 1}鍑� / 鍏眥hurtParam.skillSkinConfig.DamageDivide.Length}鍑�" + (isLastHit ? " [鏈�鍚庝竴鍑籡" : " [涓棿鍑籡") + "\n" +
             $"\n" +
             $"========== 鐩爣鍙椾激鏁版嵁 ==========\n" +
             $"浼ゅ: {currentHitDamage} / 鎬讳激瀹�: {totalDamage}\n" +
@@ -1204,7 +1222,7 @@
         if (moveFinished)
         {
             //  濡傛灉鎶�鑳芥湁鍔ㄧ敾锛圫killMotionName涓嶄负绌猴級锛岄渶瑕佺瓑寰呭姩鐢绘挱鏀惧畬鎴�
-            if (skillConfig != null && !string.IsNullOrEmpty(skillConfig.SkillMotionName))
+            if (skillSkinConfig != null && !string.IsNullOrEmpty(skillSkinConfig.SkillMotionName))
             {
                 if (!isMotionCompleted)
                 {
@@ -1608,7 +1626,7 @@
             return false;
         }
 
-        if (string.IsNullOrEmpty(skillConfig.SkillMotionName))
+        if (string.IsNullOrEmpty(skillSkinConfig.SkillMotionName))
         {
             return true;
         }
diff --git a/Main/System/Battle/SkillEffect/BulletCurve/BezierBulletCurve.cs b/Main/System/Battle/SkillEffect/BulletCurve/BezierBulletCurve.cs
index db0849c..4c85b72 100644
--- a/Main/System/Battle/SkillEffect/BulletCurve/BezierBulletCurve.cs
+++ b/Main/System/Battle/SkillEffect/BulletCurve/BezierBulletCurve.cs
@@ -8,16 +8,16 @@
     private Vector2 end;
     private Vector2 control;
 
-    public BezierBulletCurve(BattleObject caster, SkillConfig skillConfig, BattleEffectPlayer effectPlayer,
+    public BezierBulletCurve(BattleObject caster, SkillConfig skillConfig, SkillSkinConfig _skillSkinConfig, BattleEffectPlayer effectPlayer,
         RectTransform target, List<HB427_tagSCUseSkill.tagSCUseSkillHurt> hurtList, int bulletIndex, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit)
-        : base(caster, skillConfig, effectPlayer, target, hurtList, bulletIndex, onHit) { }
+        : base(caster, skillConfig, _skillSkinConfig, effectPlayer, target, hurtList, bulletIndex, onHit) { }
 
     public override void Reset()
     {
         base.Reset();
         start = WorldToLocalAnchoredPosition(bulletTrans.position) + bulletOffset;
         end = WorldToLocalAnchoredPosition(target.position);
-        duration = Vector2.Distance(start, end) / skillConfig.BulletFlySpeed;
+        duration = Vector2.Distance(start, end) / skillSkinConfig.BulletFlySpeed;
         control = (start + end) / 2 + Vector2.up * 100f;
     }
 
diff --git a/Main/System/Battle/SkillEffect/BulletCurve/BounceBulletCurve.cs b/Main/System/Battle/SkillEffect/BulletCurve/BounceBulletCurve.cs
index 4e34c5d..6e624e5 100644
--- a/Main/System/Battle/SkillEffect/BulletCurve/BounceBulletCurve.cs
+++ b/Main/System/Battle/SkillEffect/BulletCurve/BounceBulletCurve.cs
@@ -14,9 +14,9 @@
     private float bounceTime = 0.2f; // 姣忔寮瑰皠鏃堕棿
     private float bounceElapsed = 0f;
 
-    public BounceBulletCurve(BattleObject caster, SkillConfig skillConfig, BattleEffectPlayer effectPlayer,
+    public BounceBulletCurve(BattleObject caster, SkillConfig skillConfig, SkillSkinConfig _skillSkinConfig, BattleEffectPlayer effectPlayer,
         RectTransform target, List<HB427_tagSCUseSkill.tagSCUseSkillHurt> hurtList, int bulletIndex, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit)
-        : base(caster, skillConfig, effectPlayer, target, hurtList, bulletIndex, onHit)
+        : base(caster, skillConfig, _skillSkinConfig, effectPlayer, target, hurtList, bulletIndex, onHit)
     {
         this.hurtList = hurtList;
     }
@@ -30,7 +30,7 @@
         {
             start = WorldToLocalAnchoredPosition(bulletTrans.position) + bulletOffset;
             end = WorldToLocalAnchoredPosition(target.position);
-            duration = Vector2.Distance(start, end) / skillConfig.BulletFlySpeed;
+            duration = Vector2.Distance(start, end) / skillSkinConfig.BulletFlySpeed;
         }
     }
 
diff --git a/Main/System/Battle/SkillEffect/BulletCurve/BulletCurve.cs b/Main/System/Battle/SkillEffect/BulletCurve/BulletCurve.cs
index 77e2fad..9901c4e 100644
--- a/Main/System/Battle/SkillEffect/BulletCurve/BulletCurve.cs
+++ b/Main/System/Battle/SkillEffect/BulletCurve/BulletCurve.cs
@@ -7,6 +7,8 @@
 {
     protected BattleObject caster;
     protected SkillConfig skillConfig;
+
+    protected SkillSkinConfig skillSkinConfig;
     protected BattleEffectPlayer bulletEffect;
     protected RectTransform bulletTrans; // 瀛愬脊鐨凴ectTransform
     protected RectTransform target;
@@ -22,11 +24,12 @@
 
     protected List<HB427_tagSCUseSkill.tagSCUseSkillHurt> hurts = new List<HB427_tagSCUseSkill.tagSCUseSkillHurt>();
 
-    public BulletCurve(BattleObject caster, SkillConfig skillConfig, BattleEffectPlayer bulletEffect, RectTransform target,
+    public BulletCurve(BattleObject caster, SkillConfig skillConfig, SkillSkinConfig _skillSkinConfig, BattleEffectPlayer bulletEffect, RectTransform target,
         List<HB427_tagSCUseSkill.tagSCUseSkillHurt> hurtList, int bulletIndex, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit)
     {
         this.caster = caster;
         this.skillConfig = skillConfig;
+        skillSkinConfig = _skillSkinConfig;
         this.bulletEffect = bulletEffect;
         this.target = target;
         this.onHit = onHit;
@@ -82,7 +85,7 @@
     {
         finished = true;
         onHit?.Invoke(mBulletIndex, hurts);
-        caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.BulletEffectId, bulletEffect);
+        caster.battleField.battleEffectMgr.RemoveEffect(skillSkinConfig.BulletEffectId, bulletEffect);
     }
 
     public virtual void ForceFinish()
diff --git a/Main/System/Battle/SkillEffect/BulletCurve/BulletCurveFactory.cs b/Main/System/Battle/SkillEffect/BulletCurve/BulletCurveFactory.cs
index b5c3202..dbb8501 100644
--- a/Main/System/Battle/SkillEffect/BulletCurve/BulletCurveFactory.cs
+++ b/Main/System/Battle/SkillEffect/BulletCurve/BulletCurveFactory.cs
@@ -13,6 +13,7 @@
     public static BulletCurve CreateBulletCurve(
         BattleObject caster,
         SkillConfig skillConfig,
+        SkillSkinConfig _skillSkinConfig,
         BattleEffectPlayer bulletEffect,
         RectTransform target,
         List<HB427_tagSCUseSkill.tagSCUseSkillHurt> hurtList,
@@ -20,22 +21,22 @@
         Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit)
     {
         BulletCurve curve = null;
-        switch (skillConfig.BulletPath)
+        switch (_skillSkinConfig.BulletPath)
         {
             case 1: // 鐩寸嚎娑堝け浜庣洰鏍�
-                curve = new StraightBulletCurve(caster, skillConfig, bulletEffect, target, hurtList, bulletIndex, onHit);
+                curve = new StraightBulletCurve(caster, skillConfig, _skillSkinConfig, bulletEffect, target, hurtList, bulletIndex, onHit);
                 break;
             case 2: // 鐩寸嚎璐┛娑堝け鍦ㄥ睆骞曞
-                curve = new PenetrateBulletCurve(caster, skillConfig, bulletEffect, target, hurtList, bulletIndex, onHit);
+                curve = new PenetrateBulletCurve(caster, skillConfig, _skillSkinConfig, bulletEffect, target, hurtList, bulletIndex, onHit);
                 break;
             case 3: // 鎶涚墿绾垮姬绾�
-                curve = new BezierBulletCurve(caster, skillConfig, bulletEffect, target, hurtList, bulletIndex, onHit);
+                curve = new BezierBulletCurve(caster, skillConfig, _skillSkinConfig, bulletEffect, target, hurtList, bulletIndex, onHit);
                 break;
             case 4: // 寮瑰皠
-                curve = new BounceBulletCurve(caster, skillConfig, bulletEffect, target, hurtList, bulletIndex, onHit);
+                curve = new BounceBulletCurve(caster, skillConfig, _skillSkinConfig, bulletEffect, target, hurtList, bulletIndex, onHit);
                 break;
             default:
-                curve = new BulletCurve(caster, skillConfig, bulletEffect, target, hurtList, bulletIndex, onHit);
+                curve = new BulletCurve(caster, skillConfig, _skillSkinConfig, bulletEffect, target, hurtList, bulletIndex, onHit);
                 break;
         }
 
diff --git a/Main/System/Battle/SkillEffect/BulletCurve/PenetrateBulletCurve.cs b/Main/System/Battle/SkillEffect/BulletCurve/PenetrateBulletCurve.cs
index b70d473..a98122b 100644
--- a/Main/System/Battle/SkillEffect/BulletCurve/PenetrateBulletCurve.cs
+++ b/Main/System/Battle/SkillEffect/BulletCurve/PenetrateBulletCurve.cs
@@ -9,8 +9,8 @@
     private Vector2 outPos;     // 灞忓箷澶栧欢闀跨偣锛堟湰鍦板潗鏍囷級
     private bool hitTriggered = false; // 鏄惁宸茶Е鍙憃nHit
 
-    public PenetrateBulletCurve(BattleObject caster, SkillConfig skillConfig, BattleEffectPlayer effectPlayer, RectTransform target, List<HB427_tagSCUseSkill.tagSCUseSkillHurt> hurtList, int bulletIndex, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit)
-        : base(caster, skillConfig, effectPlayer, target, hurtList, bulletIndex, onHit) { }
+    public PenetrateBulletCurve(BattleObject caster, SkillConfig skillConfig, SkillSkinConfig _skillSkinConfig, BattleEffectPlayer effectPlayer, RectTransform target, List<HB427_tagSCUseSkill.tagSCUseSkillHurt> hurtList, int bulletIndex, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit)
+        : base(caster, skillConfig, _skillSkinConfig, effectPlayer, target, hurtList, bulletIndex, onHit) { }
 
     /// <summary>
     /// 鍒濆鍖栧脊閬撳弬鏁�
@@ -21,7 +21,7 @@
         hitTriggered = false;
         start = WorldToLocalAnchoredPosition(bulletTrans.position) + bulletOffset;
         end = WorldToLocalAnchoredPosition(target.position);
-        duration = Vector2.Distance(start, end) / skillConfig.BulletFlySpeed;
+        duration = Vector2.Distance(start, end) / skillSkinConfig.BulletFlySpeed;
         Vector2 dir = (end - start).normalized;
         float extend = 500f; // 璐┛璺濈锛屽彲鏍规嵁闇�姹傝皟鏁�
         outPos = end + dir * extend;
diff --git a/Main/System/Battle/SkillEffect/BulletCurve/StraightBulletCurve.cs b/Main/System/Battle/SkillEffect/BulletCurve/StraightBulletCurve.cs
index 09c334f..c08b345 100644
--- a/Main/System/Battle/SkillEffect/BulletCurve/StraightBulletCurve.cs
+++ b/Main/System/Battle/SkillEffect/BulletCurve/StraightBulletCurve.cs
@@ -7,8 +7,8 @@
     private Vector2 start;
     private Vector2 end;
 
-    public StraightBulletCurve(BattleObject caster, SkillConfig skillConfig, BattleEffectPlayer bulletEffect, RectTransform target, List<HB427_tagSCUseSkill.tagSCUseSkillHurt> hurtList, int bulletIndex, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit)
-        : base(caster, skillConfig, bulletEffect, target, hurtList, bulletIndex, onHit)
+    public StraightBulletCurve(BattleObject caster, SkillConfig skillConfig, SkillSkinConfig _skillSkinConfig, BattleEffectPlayer bulletEffect, RectTransform target, List<HB427_tagSCUseSkill.tagSCUseSkillHurt> hurtList, int bulletIndex, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit)
+        : base(caster, skillConfig, _skillSkinConfig, bulletEffect, target, hurtList, bulletIndex, onHit)
     {
 
     }
@@ -18,7 +18,7 @@
         base.Reset();
         start = WorldToLocalAnchoredPosition(bulletTrans.position) + bulletOffset;
         end = WorldToLocalAnchoredPosition(target.position);
-        duration = Vector2.Distance(start, end) / skillConfig.BulletFlySpeed;
+        duration = Vector2.Distance(start, end) / skillSkinConfig.BulletFlySpeed;
         // BattleUtility.MarkStartAndEnd(bulletTrans, target);
     }
 
diff --git a/Main/System/Battle/SkillEffect/BulletSkillEffect.cs b/Main/System/Battle/SkillEffect/BulletSkillEffect.cs
index 8681814..1022169 100644
--- a/Main/System/Battle/SkillEffect/BulletSkillEffect.cs
+++ b/Main/System/Battle/SkillEffect/BulletSkillEffect.cs
@@ -18,8 +18,8 @@
     private int scatterTotalTargets = 0;
 
 
-    public BulletSkillEffect(SkillBase _skillBase, SkillConfig _skillConfig, BattleObject _caster, HB427_tagSCUseSkill _tagUseSkillAttack)
-        : base(_skillBase, _skillConfig, _caster, _tagUseSkillAttack)
+    public BulletSkillEffect(SkillBase _skillBase, SkillConfig _skillConfig, SkillSkinConfig _skillSkinConfig, BattleObject _caster, HB427_tagSCUseSkill _tagUseSkillAttack)
+        : base(_skillBase, _skillConfig, _skillSkinConfig, _caster, _tagUseSkillAttack)
     {
 
     }
@@ -30,7 +30,7 @@
     {
         base.OnMiddleFrameEnd(times, index);
         //  寮瑰皠 鍙﹀鐨勫仛娉曚簡
-        if (skillConfig.effectType == SkillEffectType.Bullet && skillConfig.BulletPath == 4)
+        if (skillSkinConfig.effectType == SkillEffectType.Bullet && skillSkinConfig.BulletPath == 4)
         {
             var hurt = tagUseSkillAttack.HurtList[0];
             BattleObject targetObject = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
@@ -172,22 +172,22 @@
     private void ShotToIndex(BattleCamp camp, int targetIndex, int bulletIndex)
     {
         RectTransform targetTransform = caster.battleField.GetTeamNode(camp, targetIndex);
-        BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.BulletEffectId, caster.GetRectTransform(), caster.Camp, caster.GetModelScale());
+        BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster, skillSkinConfig.BulletEffectId, caster.GetRectTransform(), caster.Camp, caster.GetModelScale());
 
         RectTransform effectTrans = effectPlayer.transform as RectTransform;
 
-        var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, effectPlayer, targetTransform, tagUseSkillAttack.HurtList.ToList(), bulletIndex, (index, hitList) =>
+        var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, skillSkinConfig, effectPlayer, targetTransform, tagUseSkillAttack.HurtList.ToList(), bulletIndex, (index, hitList) =>
         {
             if (isFinish)
                 return;
             // 鍑讳腑灏遍攢姣佸瓙寮�
-            caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.BulletEffectId, effectPlayer);
+            caster.battleField.battleEffectMgr.RemoveEffect(skillSkinConfig.BulletEffectId, effectPlayer);
             // 鎾斁瀛愬脊鐖嗙偢鐗规晥
 
             BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
             //  棣栧厛鏄洰鏍囪韩涓婄垎鐐�
-            PlayExplosionEffect(skillConfig.ExplosionEffectId, targetTransform, caster.Camp, 1f);
-            PlayExplosionEffect(skillConfig.ExplosionEffect2, targetTransform, caster.Camp, 1f);
+            PlayExplosionEffect(skillSkinConfig.ExplosionEffectId, targetTransform, caster.Camp, 1f);
+            PlayExplosionEffect(skillSkinConfig.ExplosionEffect2, targetTransform, caster.Camp, 1f);
 
             foreach (var hurt in hitList)
             {
@@ -198,8 +198,8 @@
                     continue;
                 }
 
-                PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
-                PlayExplosionEffect(skillConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                PlayExplosionEffect(skillSkinConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                PlayExplosionEffect(skillSkinConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
             }
 
             // 琛ㄧ幇瀛愬脊椋炶鍒扮洰鏍囦綅缃�
@@ -307,7 +307,7 @@
         {
             scatterHitCount = 0;
             // 鎬诲嚮涓暟 = 鍙戝皠娆℃暟 脳 鐩爣鏁伴噺
-            scatterTotalTargets = skillConfig.ActiveFrames.Length * tagUseSkillAttack.HurtList.Length;
+            scatterTotalTargets = skillSkinConfig.ActiveFrames.Length * tagUseSkillAttack.HurtList.Length;
         }
         
         // 澶勭悊鏁e皠閫昏緫
@@ -328,7 +328,7 @@
 
     private void ScatterShot(BattleObject target, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, int bulletIndex, int order)
     {
-        BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.BulletEffectId, caster.GetRectTransform(), caster.Camp, caster.GetModelScale());
+        BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster, skillSkinConfig.BulletEffectId, caster.GetRectTransform(), caster.Camp, caster.GetModelScale());
 
         bool shotToSelf = target.ObjID == caster.ObjID;
 
@@ -336,7 +336,7 @@
 
         var tempOrder = order;
 
-        var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, effectPlayer, target.GetRectTransform(),
+        var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, skillSkinConfig, effectPlayer, target.GetRectTransform(),
             new List<HB427_tagSCUseSkill.tagSCUseSkillHurt> { hurt }, bulletIndex, (index, hitList) =>
         {
             foreach (var hurt in hitList)
@@ -348,16 +348,16 @@
                     continue;
                 }
 
-                PlayExplosionEffect(skillConfig.ExplosionEffectId, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
-                PlayExplosionEffect(skillConfig.ExplosionEffect2, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
-                PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
-                PlayExplosionEffect(skillConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                PlayExplosionEffect(skillSkinConfig.ExplosionEffectId, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                PlayExplosionEffect(skillSkinConfig.ExplosionEffect2, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                PlayExplosionEffect(skillSkinConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                PlayExplosionEffect(skillSkinConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
             }
 
             // 琛ㄧ幇瀛愬脊椋炶鍒扮洰鏍囦綅缃�
             onHit?.Invoke(index, hitList);
             // 鍑讳腑灏遍攢姣佸瓙寮�
-            caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.BulletEffectId, effectPlayer);
+            caster.battleField.battleEffectMgr.RemoveEffect(skillSkinConfig.BulletEffectId, effectPlayer);
 
             // 澧炲姞鏁e皠鍑讳腑璁℃暟
             scatterHitCount++;
@@ -374,7 +374,7 @@
 
     protected void ShotToTarget(BattleObject target, int bulletIndex)
     {
-        BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.BulletEffectId, caster.GetRectTransform(), caster.Camp, caster.GetModelScale());
+        BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster, skillSkinConfig.BulletEffectId, caster.GetRectTransform(), caster.Camp, caster.GetModelScale());
 
         bool shotToSelf = target.ObjID == caster.ObjID;
 
@@ -384,9 +384,9 @@
 
         int tempBulletIndex = bulletIndex;
 
-        var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, effectPlayer, target.GetRectTransform(), tagUseSkillAttack.HurtList.ToList(), bulletIndex, (index, hitList) =>
+        var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, skillSkinConfig, effectPlayer, target.GetRectTransform(), tagUseSkillAttack.HurtList.ToList(), bulletIndex, (index, hitList) =>
         {
-            if (skillConfig.BulletPath == 4)
+            if (skillSkinConfig.BulletPath == 4)
             {
                 if (bounceHitIndex >= hitList.Count)
                 {
@@ -396,10 +396,10 @@
                 BattleObject targetObj = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
                 if (targetObj != null)
                 {
-                    PlayExplosionEffect(skillConfig.ExplosionEffectId, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
-                    PlayExplosionEffect(skillConfig.ExplosionEffect2, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
-                    PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
-                    PlayExplosionEffect(skillConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                    PlayExplosionEffect(skillSkinConfig.ExplosionEffectId, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                    PlayExplosionEffect(skillSkinConfig.ExplosionEffect2, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                    PlayExplosionEffect(skillSkinConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                    PlayExplosionEffect(skillSkinConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
                 }
                 else
                 {
@@ -411,13 +411,13 @@
 
                 if (bounceHitIndex >= tagUseSkillAttack.HurtList.Length)
                 {
-                    caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.BulletEffectId, effectPlayer);
+                    caster.battleField.battleEffectMgr.RemoveEffect(skillSkinConfig.BulletEffectId, effectPlayer);
                 }
 
                 if (isFinish)
                     return;
 
-                if (tempBulletIndex >= skillConfig.ActiveFrames.Length - 1 && bounceHitIndex >= hitList.Count)
+                if (tempBulletIndex >= skillSkinConfig.ActiveFrames.Length - 1 && bounceHitIndex >= hitList.Count)
                 {
                     isFinish = true;
                 }
@@ -433,22 +433,22 @@
                         continue;
                     }
 
-                    PlayExplosionEffect(skillConfig.ExplosionEffectId, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
-                    PlayExplosionEffect(skillConfig.ExplosionEffect2, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
-                    PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
-                    PlayExplosionEffect(skillConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                    PlayExplosionEffect(skillSkinConfig.ExplosionEffectId, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                    PlayExplosionEffect(skillSkinConfig.ExplosionEffect2, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                    PlayExplosionEffect(skillSkinConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                    PlayExplosionEffect(skillSkinConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
                 }
 
                 // 琛ㄧ幇瀛愬脊椋炶鍒扮洰鏍囦綅缃�
                 onHit?.Invoke(index, hitList);
                 // 鍑讳腑灏遍攢姣佸瓙寮�
 
-                caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.BulletEffectId, effectPlayer);
+                caster.battleField.battleEffectMgr.RemoveEffect(skillSkinConfig.BulletEffectId, effectPlayer);
 
                 if (isFinish)
                     return;
 
-                if (bulletIndex >= skillConfig.ActiveFrames.Length - 1)
+                if (bulletIndex >= skillSkinConfig.ActiveFrames.Length - 1)
                 {
                     isFinish = true;
                 }
diff --git a/Main/System/Battle/SkillEffect/DotSkillEffect.cs b/Main/System/Battle/SkillEffect/DotSkillEffect.cs
index 955e189..d1cdea6 100644
--- a/Main/System/Battle/SkillEffect/DotSkillEffect.cs
+++ b/Main/System/Battle/SkillEffect/DotSkillEffect.cs
@@ -13,8 +13,8 @@
     // protected BattleObject caster;
     // protected List<BattleObject> targets; // 鐩爣鍒楄〃
 
-    public DotSkillEffect(SkillBase _skillBase, SkillConfig _skillConfig, BattleObject _caster, HB427_tagSCUseSkill _tagUseSkillAttack)
-        : base(_skillBase, _skillConfig, _caster, _tagUseSkillAttack)
+    public DotSkillEffect(SkillBase _skillBase, SkillConfig _skillConfig, SkillSkinConfig _skillSkinConfig, BattleObject _caster, HB427_tagSCUseSkill _tagUseSkillAttack)
+        : base(_skillBase, _skillConfig, _skillSkinConfig, _caster, _tagUseSkillAttack)
     {
 
     }
@@ -31,7 +31,7 @@
                 Debug.LogError($"DotSkillEffect 鎵句笉鍒扮洰鏍囷紝GUID={hurtInfo.ObjID}");
                 continue;
             }
-            target.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.TriggerEffect, target.GetRectTransform(), caster.Camp, target.GetModelScale());
+            target.battleField.battleEffectMgr.PlayEffect(caster, skillSkinConfig.TriggerEffect, target.GetRectTransform(), caster.Camp, target.GetModelScale());
         }
 
         onHit?.Invoke(0, tagUseSkillAttack.HurtList.ToList());
diff --git a/Main/System/Battle/SkillEffect/NoEffect.cs b/Main/System/Battle/SkillEffect/NoEffect.cs
index 2f29323..f5f4a2f 100644
--- a/Main/System/Battle/SkillEffect/NoEffect.cs
+++ b/Main/System/Battle/SkillEffect/NoEffect.cs
@@ -13,8 +13,8 @@
     // protected BattleObject caster;
     // protected List<BattleObject> targets; // 鐩爣鍒楄〃
 
-    public NoEffect(SkillBase _skillBase, SkillConfig _skillConfig, BattleObject _caster, HB427_tagSCUseSkill _tagUseSkillAttack)
-        : base(_skillBase, _skillConfig, _caster, _tagUseSkillAttack)
+    public NoEffect(SkillBase _skillBase, SkillConfig _skillConfig, SkillSkinConfig _skillSkinConfig, BattleObject _caster, HB427_tagSCUseSkill _tagUseSkillAttack)
+        : base(_skillBase, _skillConfig, _skillSkinConfig, _caster, _tagUseSkillAttack)
     {
 
     }
@@ -28,14 +28,14 @@
 
         RectTransform targetTransform = caster.battleField.GetTeamNode(battleCamp, mainTargetIndex);
 
-        if (skillConfig.ExplosionEffectId > 0)
+        if (skillSkinConfig.ExplosionEffectId > 0)
         {
-            caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.ExplosionEffectId, targetTransform, caster.Camp, 1f);
+            caster.battleField.battleEffectMgr.PlayEffect(caster, skillSkinConfig.ExplosionEffectId, targetTransform, caster.Camp, 1f);
         }
 
-        if (skillConfig.ExplosionEffect2 > 0)
+        if (skillSkinConfig.ExplosionEffect2 > 0)
         {
-            caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.ExplosionEffect2, targetTransform, caster.Camp, 1f);
+            caster.battleField.battleEffectMgr.PlayEffect(caster, skillSkinConfig.ExplosionEffect2, targetTransform, caster.Camp, 1f);
         }
 
         for (int i = 0; i < tagUseSkillAttack.HurtList.Length; i++)
@@ -48,13 +48,13 @@
                 continue;
             }
 
-            if (skillConfig.ExplosionEffect3 > 0)
+            if (skillSkinConfig.ExplosionEffect3 > 0)
             {
-                caster.battleField.battleEffectMgr.PlayEffect(target, skillConfig.ExplosionEffect3, target.GetTransform(), caster.Camp, target.GetModelScale());
+                caster.battleField.battleEffectMgr.PlayEffect(target, skillSkinConfig.ExplosionEffect3, target.GetTransform(), caster.Camp, target.GetModelScale());
             }
-            if (skillConfig.ExplosionEffect4 > 0)
+            if (skillSkinConfig.ExplosionEffect4 > 0)
             {
-                caster.battleField.battleEffectMgr.PlayEffect(target, skillConfig.ExplosionEffect4, target.GetTransform(), caster.Camp, target.GetModelScale());
+                caster.battleField.battleEffectMgr.PlayEffect(target, skillSkinConfig.ExplosionEffect4, target.GetTransform(), caster.Camp, target.GetModelScale());
             }
         }
 
diff --git a/Main/System/Battle/SkillEffect/NormalSkillEffect.cs b/Main/System/Battle/SkillEffect/NormalSkillEffect.cs
index 45326f3..31b26ad 100644
--- a/Main/System/Battle/SkillEffect/NormalSkillEffect.cs
+++ b/Main/System/Battle/SkillEffect/NormalSkillEffect.cs
@@ -11,8 +11,8 @@
     // protected BattleObject caster;
     // protected List<BattleObject> targets; // 鐩爣鍒楄〃
 
-    public NormalSkillEffect(SkillBase _skillBase, SkillConfig _skillConfig, BattleObject _caster, HB427_tagSCUseSkill _tagUseSkillAttack)
-        : base(_skillBase, _skillConfig, _caster, _tagUseSkillAttack)
+    public NormalSkillEffect(SkillBase _skillBase, SkillConfig _skillConfig, SkillSkinConfig _skillSkinConfig, BattleObject _caster, HB427_tagSCUseSkill _tagUseSkillAttack)
+        : base(_skillBase, _skillConfig, _skillSkinConfig, _caster, _tagUseSkillAttack)
     {
 
     }
@@ -27,14 +27,14 @@
 
         RectTransform targetTransform = caster.battleField.GetTeamNode(battleCamp, mainTargetIndex);
 
-        if (skillConfig.ExplosionEffectId > 0)
+        if (skillSkinConfig.ExplosionEffectId > 0)
         {
-            caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.ExplosionEffectId, targetTransform, caster.Camp, 1f);
+            caster.battleField.battleEffectMgr.PlayEffect(caster, skillSkinConfig.ExplosionEffectId, targetTransform, caster.Camp, 1f);
         }
 
-        if (skillConfig.ExplosionEffect2 > 0)
+        if (skillSkinConfig.ExplosionEffect2 > 0)
         {
-            caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.ExplosionEffect2, targetTransform, caster.Camp, 1f);
+            caster.battleField.battleEffectMgr.PlayEffect(caster, skillSkinConfig.ExplosionEffect2, targetTransform, caster.Camp, 1f);
         }
 
         for (int i = 0; i < tagUseSkillAttack.HurtList.Length; i++)
@@ -47,13 +47,13 @@
                 continue;
             }
 
-            if (skillConfig.ExplosionEffect3 > 0)
+            if (skillSkinConfig.ExplosionEffect3 > 0)
             {
-                caster.battleField.battleEffectMgr.PlayEffect(target, skillConfig.ExplosionEffect3, target.GetTransform(), caster.Camp, target.GetModelScale());
+                caster.battleField.battleEffectMgr.PlayEffect(target, skillSkinConfig.ExplosionEffect3, target.GetTransform(), caster.Camp, target.GetModelScale());
             }
-            if (skillConfig.ExplosionEffect4 > 0)
+            if (skillSkinConfig.ExplosionEffect4 > 0)
             {
-                caster.battleField.battleEffectMgr.PlayEffect(target, skillConfig.ExplosionEffect4, target.GetTransform(), caster.Camp, target.GetModelScale());
+                caster.battleField.battleEffectMgr.PlayEffect(target, skillSkinConfig.ExplosionEffect4, target.GetTransform(), caster.Camp, target.GetModelScale());
             }
         }
 
diff --git a/Main/System/Battle/SkillEffect/SkillEffect.cs b/Main/System/Battle/SkillEffect/SkillEffect.cs
index 538dc6b..3fecf16 100644
--- a/Main/System/Battle/SkillEffect/SkillEffect.cs
+++ b/Main/System/Battle/SkillEffect/SkillEffect.cs
@@ -6,6 +6,7 @@
 {
     protected SkillBase skillBase;
     protected SkillConfig skillConfig;
+    protected SkillSkinConfig skillSkinConfig;
     protected BattleObject caster;
     protected HB427_tagSCUseSkill tagUseSkillAttack;// 鐩爣鍒楄〃
 
@@ -15,10 +16,11 @@
 
     protected Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit;
 
-    public SkillEffect(SkillBase _skillBase, SkillConfig _skillConfig, BattleObject _caster, HB427_tagSCUseSkill _tagUseSkillAttack)
+    public SkillEffect(SkillBase _skillBase, SkillConfig _skillConfig, SkillSkinConfig _skillSkinConfig, BattleObject _caster, HB427_tagSCUseSkill _tagUseSkillAttack)
     {
         skillBase = _skillBase;
         skillConfig = _skillConfig;
+        skillSkinConfig = _skillSkinConfig;
         caster = _caster;
         tagUseSkillAttack = _tagUseSkillAttack;
     }
@@ -27,13 +29,13 @@
     public virtual void Play(Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> _onHit)
     {
         onHit = _onHit;
-        if (skillConfig.EffectId > 0)
+        if (skillSkinConfig.EffectId > 0)
         {
-            caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.EffectId, caster.GetRectTransform(), caster.Camp, caster.GetModelScale());
+            caster.battleField.battleEffectMgr.PlayEffect(caster, skillSkinConfig.EffectId, caster.GetRectTransform(), caster.Camp, caster.GetModelScale());
         }
-        if (skillConfig.EffectId2 > 0)
+        if (skillSkinConfig.EffectId2 > 0)
         {
-            caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.EffectId2, caster.GetRectTransform(), caster.Camp, caster.GetModelScale());
+            caster.battleField.battleEffectMgr.PlayEffect(caster, skillSkinConfig.EffectId2, caster.GetRectTransform(), caster.Camp, caster.GetModelScale());
         }
      }
 
@@ -49,10 +51,10 @@
 
     public virtual void OnMiddleFrameStart(int times)
     {
-        if (skillConfig.MStartEffectId <= 0)
+        if (skillSkinConfig.MStartEffectId <= 0)
             return;
         //  涓憞鍥哄畾鐗规晥
-        caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.MStartEffectId, caster.GetTransform(), caster.Camp, caster.GetModelScale());
+        caster.battleField.battleEffectMgr.PlayEffect(caster, skillSkinConfig.MStartEffectId, caster.GetTransform(), caster.Camp, caster.GetModelScale());
     }
     
     /// <summary>
diff --git a/Main/System/Battle/SkillEffect/SkillEffectFactory.cs b/Main/System/Battle/SkillEffect/SkillEffectFactory.cs
index 7175020..c25adb1 100644
--- a/Main/System/Battle/SkillEffect/SkillEffectFactory.cs
+++ b/Main/System/Battle/SkillEffect/SkillEffectFactory.cs
@@ -4,27 +4,29 @@
 
 public static class SkillEffectFactory
 {
-    public static SkillEffect CreateSkillEffect(SkillBase skillBase, BattleObject caster, SkillConfig skillConfig, HB427_tagSCUseSkill tagUseSkillAttack)
+    public static SkillEffect CreateSkillEffect(SkillBase skillBase, BattleObject caster, SkillConfig skillConfig, SkillSkinConfig skillSkinConfig, HB427_tagSCUseSkill tagUseSkillAttack)
     {
 
-        switch (skillConfig.effectType)
+        switch (skillSkinConfig.effectType)
         {
             case SkillEffectType.Bullet:
-                return new BulletSkillEffect(skillBase,skillConfig, caster, tagUseSkillAttack);
+                return new BulletSkillEffect(skillBase,skillConfig, skillSkinConfig, caster, tagUseSkillAttack);
             case SkillEffectType.Direct:
-                return new NormalSkillEffect(skillBase, skillConfig, caster, tagUseSkillAttack);
+                return new NormalSkillEffect(skillBase, skillConfig, skillSkinConfig, caster, tagUseSkillAttack);
             // case SkillEffectType.BuffEffect:
             //     return new BuffSkillEffect(skillConfig, caster, targets);
             // case SkillEffectType.StageEffect:
             //     return new StageSkillEffect(skillConfig, caster, targets);
             case SkillEffectType.DOTEffect:
-                return new DotSkillEffect(skillBase,skillConfig, caster, tagUseSkillAttack);
+                return new DotSkillEffect(skillBase,skillConfig, skillSkinConfig, caster, tagUseSkillAttack);
             case SkillEffectType.NoEffect:
             case SkillEffectType.None:
-                return new NoEffect(skillBase, skillConfig, caster, tagUseSkillAttack);
+                return new NoEffect(skillBase, skillConfig, skillSkinConfig, caster, tagUseSkillAttack);
             default:
-                UnityEngine.Debug.LogError("Unknown Skill Effect Type " + skillConfig.effectType + " skill id is " + skillConfig.SkillID);
-                return new NoEffect(skillBase, skillConfig, caster, tagUseSkillAttack);
+                UnityEngine.Debug.LogError("Unknown Skill Effect Type " + skillSkinConfig.effectType + " skill id is " + skillConfig.SkillID);
+                return new NoEffect(skillBase, skillConfig, skillSkinConfig, caster, tagUseSkillAttack);
+                break;
         }
+        return null;
     }
 }
\ No newline at end of file
diff --git a/Main/System/Battle/StoryBossBattleWin.cs b/Main/System/Battle/StoryBossBattleWin.cs
index 7092850..b24b89f 100644
--- a/Main/System/Battle/StoryBossBattleWin.cs
+++ b/Main/System/Battle/StoryBossBattleWin.cs
@@ -231,33 +231,7 @@
 
     public void RefreshBuff(List<HB428_tagSCBuffRefresh> datas)
     {
-        if (buffCells == null)
-        {
-            for (int i = 0; i < buffCells.Count; i++)
-            {
-                buffCells[i].SetActive(false);
-            }
-        }
-        else
-        {
-            for (int i = 0; i < buffCells.Count; i++)
-            {
-                if (i < datas.Count)
-                {
-                    buffCells[i].SetActive(true);
-                    HB428_tagSCBuffRefresh buffData = datas[i];
-                    SkillConfig skillConfig = SkillConfig.Get((int)buffData.SkillID);
-                    buffCells[i].Init(buffData, () =>
-                    {
-                        //  鐐瑰嚮buff鍥炬爣 鏄剧ずbuff鎻忚堪/褰撳墠韬笂鎵�鏈塨uff
-                    });
-                }
-                else
-                {
-                    buffCells[i].SetActive(false);
-                }
-            }
-        }
+        RefreshBuffCells(buffCells, datas);
     }
     List<TeamHero> GetTeamHeroList(List<BattleObject> teams)
     {
diff --git a/Main/System/Battle/TianziBillboradBattleWin.cs b/Main/System/Battle/TianziBillboradBattleWin.cs
index 0b28f1f..8983e62 100644
--- a/Main/System/Battle/TianziBillboradBattleWin.cs
+++ b/Main/System/Battle/TianziBillboradBattleWin.cs
@@ -301,33 +301,7 @@
 
     public void RefreshBuff(List<HB428_tagSCBuffRefresh> datas)
     {
-        if (buffCells == null)
-        {
-            for (int i = 0; i < buffCells.Count; i++)
-            {
-                buffCells[i].SetActive(false);
-            }
-        }
-        else
-        {
-            for (int i = 0; i < buffCells.Count; i++)
-            {
-                if (i < datas.Count)
-                {
-                    buffCells[i].SetActive(true);
-                    HB428_tagSCBuffRefresh buffData = datas[i];
-                    SkillConfig skillConfig = SkillConfig.Get((int)buffData.SkillID);
-                    buffCells[i].Init(buffData, () =>
-                    {
-                        //  鐐瑰嚮buff鍥炬爣 鏄剧ずbuff鎻忚堪/褰撳墠韬笂鎵�鏈塨uff
-                    });
-                }
-                else
-                {
-                    buffCells[i].SetActive(false);
-                }
-            }
-        }
+        RefreshBuffCells(buffCells, datas);
     }
 
     bool IsOpenBattleChangeTab()
diff --git a/Main/System/Battle/UIComp/BattleBuffCell.cs b/Main/System/Battle/UIComp/BattleBuffCell.cs
index c5052ca..5376f81 100644
--- a/Main/System/Battle/UIComp/BattleBuffCell.cs
+++ b/Main/System/Battle/UIComp/BattleBuffCell.cs
@@ -44,10 +44,10 @@
         }
     }
 
-    void Awake()
-    {
-        LoadPrefab();
-    }
+    // void Start()
+    // {
+    //     LoadPrefab();
+    // }
 
     GameObject cellContainer;
 
diff --git a/Main/System/Battle/UIComp/BattleFloatingUIController.cs b/Main/System/Battle/UIComp/BattleFloatingUIController.cs
index bc1f775..56d474d 100644
--- a/Main/System/Battle/UIComp/BattleFloatingUIController.cs
+++ b/Main/System/Battle/UIComp/BattleFloatingUIController.cs
@@ -141,7 +141,7 @@
     /// </summary>
     public void Run()
     {
-        if (!gameObject.activeSelf || !ValidateConfig()) 
+        if (!ValidateConfig()) 
             return;
 
         // 妫�鏌ユ槸鍚﹀畬鎴�
diff --git a/Main/System/Battle/UIComp/BattleHeroInfoBar.cs b/Main/System/Battle/UIComp/BattleHeroInfoBar.cs
index 41d9323..6872a06 100644
--- a/Main/System/Battle/UIComp/BattleHeroInfoBar.cs
+++ b/Main/System/Battle/UIComp/BattleHeroInfoBar.cs
@@ -137,33 +137,7 @@
     
     public void RefreshBuff(List<HB428_tagSCBuffRefresh> datas)
     {
-        if (battleObject.battleField.battleSwitch.BuffIcon && datas != null && datas.Count > 0)
-        {
-            for (int i = 0; i < buffCells.Count; i++)
-            {
-                if (i < datas.Count)
-                {
-                    buffCells[i].SetActive(true);
-                    HB428_tagSCBuffRefresh buffData = datas[i];
-                    SkillConfig skillConfig = SkillConfig.Get((int)buffData.SkillID);
-                    buffCells[i].Init(buffData, () =>
-                    {
-                        //  鐐瑰嚮buff鍥炬爣 鏄剧ずbuff鎻忚堪/褰撳墠韬笂鎵�鏈塨uff
-                    });
-                }
-                else
-                {
-                    buffCells[i].SetActive(false);
-                }
-            }
-        }
-        else
-        {
-            for (int i = 0; i < buffCells.Count; i++)
-            {
-                buffCells[i].SetActive(false);
-            }
-        }
+        RefreshBuffCells(buffCells, datas);
 
         // check shield buff
         var buffMgr = battleObject.GetBuffMgr();
@@ -193,7 +167,49 @@
         // Debug.LogError($"[BattleHeroInfoBar.RefreshBuff] 璁剧疆鎶ょ浘 - curHp: {curHp}, shieldValue: {shieldValue}, maxHp: {maxHp}, shield1鍓�: {oldShield1Value}, shield1鍚�: {shield1Value}, shield2鍓�: {oldShield2Value}, shield2鍚�: {shield2Value}");
     }
     
-    
+    protected void RefreshBuffCells(List<BattleBuffCell> cells, List<HB428_tagSCBuffRefresh> datas)
+    {
+        if (datas == null)
+        {
+            for (int i = 0; i < cells.Count; i++)
+            {
+                cells[i].SetActive(false);
+            }
+        }
+        else
+        {
+            if (battleObject.battleField.battleSwitch.BuffIcon)
+            {
+                for (int i = 0; i < cells.Count; i++)
+                {
+                    var cell = cells[i];
+                    if (i < datas.Count)
+                    {
+                        cell.SetActive(true);
+                        HB428_tagSCBuffRefresh buffData = datas[i];
+                        SkillConfig skillConfig = SkillConfig.Get((int)buffData.SkillID);
+                        cell.Init(buffData, () =>
+                        {
+                            //  鐐瑰嚮buff鍥炬爣 鏄剧ずbuff鎻忚堪/褰撳墠韬笂鎵�鏈塨uff
+                        });
+                    }
+                    else
+                    {
+                        cell.SetActive(false);
+                    }
+                }
+            }
+            else
+            {
+                for (int i = 0; i < cells.Count; i++)
+                {
+                    cells[i].SetActive(false);
+                }
+            }
+
+        }
+    }
+
     /// <summary>
     /// 娣诲姞椋樺瓧鍒伴槦鍒�(闈炰激瀹抽瀛�)
     /// </summary>
@@ -216,9 +232,21 @@
     /// </summary>
     public void ShowTips(TipsInfo tipsInfo)
     {
-        if (battleObject.battleField.battleSwitch.NonDamageTips)
+        //  BUFF椋樺瓧
+        if (tipsInfo.useBuffColor)
         {
-            messages.Add(tipsInfo);
+            if (battleObject.battleField.battleSwitch.BuffAction)
+            {
+                messages.Add(tipsInfo);
+            }
+        }
+        else
+        {
+            //  闈炰激瀹抽瀛�
+            if (battleObject.battleField.battleSwitch.NonDamageTips)
+            {
+                messages.Add(tipsInfo);
+            }
         }
     }
     
@@ -812,10 +840,9 @@
     {
         messages.Clear();
         
-        foreach (var tip in tipsList)
+        for (int i = tipsList.Count - 1; i >= 0; i--)
         {
-            tip.OnFinish = null;
-            GameObject.DestroyImmediate(tip.gameObject);
+            RemoveTips(tipsList[i]);
         }
         
         tipsList.Clear();
diff --git a/Main/System/Battle/WarlordPavilionBattleWin.cs b/Main/System/Battle/WarlordPavilionBattleWin.cs
index fd81a7c..54d2d7b 100644
--- a/Main/System/Battle/WarlordPavilionBattleWin.cs
+++ b/Main/System/Battle/WarlordPavilionBattleWin.cs
@@ -254,33 +254,7 @@
 
     public void RefreshBuff(List<HB428_tagSCBuffRefresh> datas)
     {
-        if (buffCells == null)
-        {
-            for (int i = 0; i < buffCells.Count; i++)
-            {
-                buffCells[i].SetActive(false);
-            }
-        }
-        else
-        {
-            for (int i = 0; i < buffCells.Count; i++)
-            {
-                if (i < datas.Count)
-                {
-                    buffCells[i].SetActive(true);
-                    HB428_tagSCBuffRefresh buffData = datas[i];
-                    SkillConfig skillConfig = SkillConfig.Get((int)buffData.SkillID);
-                    buffCells[i].Init(buffData, () =>
-                    {
-                        //  鐐瑰嚮buff鍥炬爣 鏄剧ずbuff鎻忚堪/褰撳墠韬笂鎵�鏈塨uff
-                    });
-                }
-                else
-                {
-                    buffCells[i].SetActive(false);
-                }
-            }
-        }
+        RefreshBuffCells(buffCells, datas);
     }
 
     bool IsOpenBattleChangeTab()
diff --git a/Main/System/BeautyMM/BeautyMMManager.Travel.cs b/Main/System/BeautyMM/BeautyMMManager.Travel.cs
index 9d8a4cd..e20d061 100644
--- a/Main/System/BeautyMM/BeautyMMManager.Travel.cs
+++ b/Main/System/BeautyMM/BeautyMMManager.Travel.cs
@@ -8,7 +8,7 @@
 
 public partial class BeautyMMManager : GameSystemManager<BeautyMMManager>
 {
-    public byte m_Energy;    //鍓╀綑浣撳姏
+    public int m_Energy;    //鍓╀綑浣撳姏
     public uint m_EnergyTime;    //涓婃鎭㈠浣撳姏鏃堕棿鎴�
     public uint m_TravelCnt;    //绱娓稿巻娆℃暟
     public byte m_SceneryType;    //鏅绫诲瀷
@@ -29,7 +29,7 @@
 
     public void UpdateTravelInfo(HB040_tagSCTravelInfo netPack)
     {
-        m_Energy = netPack.Energy;
+        m_Energy = (int)netPack.Energy;
         m_EnergyTime = netPack.EnergyTime;
         m_TravelCnt = netPack.TravelCnt;
         m_SceneryType = netPack.SceneryType;
diff --git a/Main/System/BeautyMM/BeautyMMManager.cs b/Main/System/BeautyMM/BeautyMMManager.cs
index d0e8932..7fea852 100644
--- a/Main/System/BeautyMM/BeautyMMManager.cs
+++ b/Main/System/BeautyMM/BeautyMMManager.cs
@@ -92,10 +92,12 @@
     public void UpdateBeautyMMData(HB130_tagSCBeautyInfo data)
     {
         int activeMMID = 0;
+        int activeSkinID = 0;
         foreach (var beauty in data.BeautyList)
         {
-            if (DTC0403_tagPlayerLoginLoadOK.finishedLogin)
+            if (data.Count == 1)
             {
+                //data.Count == 1 鍙互鐞嗚В涓鸿В閿佸洖鎶�
                 if (beautyMMDataDict.ContainsKey(beauty.BeautyID))
                 {
                     if (beautyMMDataDict[beauty.BeautyID].State != beauty.State)
@@ -119,6 +121,22 @@
 
             foreach (var skin in beauty.SkinList)
             {
+                if (data.Count == 1)
+                {
+                    //data.Count == 1 鍙互鐞嗚В涓鸿В閿佸洖鎶�
+                    if (beautyMMSkinDataDict.ContainsKey(skin.SkinID))
+                    {
+                        if (beautyMMSkinDataDict[skin.SkinID].State != skin.State)
+                        {
+                            activeSkinID = skin.SkinID;
+                        }
+                    }
+                    else if (skin.State != 0)
+                    {
+                        activeSkinID = skin.SkinID;
+                    }
+                }
+
                 beautyMMSkinDataDict[skin.SkinID] = new BeautyMMSkinData()
                 {
                     State = skin.State,
@@ -135,6 +153,10 @@
         {
             UIManager.Instance.OpenWindow<BeautyMMActiveWin>(activeMMID);
         }
+        else if (activeSkinID > 0)
+        {
+            UIManager.Instance.OpenWindow<BeautyMMSkinActiveWin>(activeSkinID);
+        }
     }
 
     //0 鍏ㄩ儴 1 宸叉縺娲� 2 鏈縺娲�
diff --git a/Main/System/BeautyMM/BeautyMMShowWin.cs b/Main/System/BeautyMM/BeautyMMShowWin.cs
index 2984751..08c5fa3 100644
--- a/Main/System/BeautyMM/BeautyMMShowWin.cs
+++ b/Main/System/BeautyMM/BeautyMMShowWin.cs
@@ -17,6 +17,7 @@
     [SerializeField] Button leftBtn;
     [SerializeField] Button rightBtn;
     [SerializeField] Button skinBtn;
+    [SerializeField] Image skinRedImg;
 
     [SerializeField] Transform trainRect;
     [SerializeField] Transform activeRect;
@@ -117,7 +118,7 @@
         loveScroller.OnRefreshCell += OnRefreshCell;
         BeautyMMManager.Instance.OnBeautyMMDataUpdate += OnBeautyMMDataUpdate;
         PackManager.Instance.RefreshItemEvent += OnRefreshItemEvent;
-        
+
         Display(true);
     }
 
@@ -196,7 +197,7 @@
 
             needExp = nextLVConfig.LVNeedExp;
             expText.text = (mmData != null ? mmData.Exp.ToString() : "0") + "/" + needExp;
-            process.fillAmount = mmData != null ? mmData.Exp*1.0f / needExp : 0;
+            process.fillAmount = mmData != null ? mmData.Exp * 1.0f / needExp : 0;
             showAwardCell.SetActive(true);
             int itemID = nextLVConfig.AwardItemList[0][0];
             showAwardCell.Init(new ItemCellModel(itemID, false, nextLVConfig.AwardItemList[0][1]));
@@ -223,7 +224,7 @@
 
             ShowTalent();
             nextLVTalentTipRect.SetActive(isActive);
-            nextLVTalentTip.text = Language.Get("BeautyMM26", (beforeRank + 1)* BeautyMMManager.Instance.needLVForTalent);
+            nextLVTalentTip.text = Language.Get("BeautyMM26", (beforeRank + 1) * BeautyMMManager.Instance.needLVForTalent);
             giftOPRect.SetActive(true);
             fullRect.SetActive(false);
         }
@@ -234,7 +235,7 @@
             BeautyMMManager.Instance.selectLoveItemID = itemlist[0];
         }
         CreateScroller();
-
+        skinRedImg.SetActive(BeautyMMManager.Instance.IsMMSkinRed(mmID));
     }
 
 
@@ -424,6 +425,7 @@
         if (cnt == 0)
         {
             ItemTipUtility.Show(BeautyMMManager.Instance.selectLoveItemID, true);
+            TimingGiftManager.Instance.TryAddWhenInsufficient(5, PackType.Item, BeautyMMManager.Instance.selectLoveItemID, 1);
             return;
         }
         //浣跨敤鍒板彲鍗囩骇鐨勬暟閲忥紝鎴栬�呮�绘暟
@@ -452,6 +454,12 @@
             GameNetSystem.Instance.SendInfo(pack);
             roleUPEffect.Play();
             SysNotifyMgr.Instance.ShowTip("BeautyMM2", mmConfig.Name, useCnt * value);
+
+            // 濡傛灉姝eソ娑堣�楀畬锛屼笉瑙﹀彂鍥哄畾姒傜巼鐨勫垽瀹�
+            if (!TimingGiftManager.Instance.TryAddWhenExactConsumption(5, PackType.Item, BeautyMMManager.Instance.selectLoveItemID, onekeyToggle.isOn ? useCnt : 1))
+            {
+                TimingGiftManager.Instance.TryAddWithFixedProbabilityWhenSufficient(5, PackType.Item, BeautyMMManager.Instance.selectLoveItemID, onekeyToggle.isOn ? useCnt : 1);
+            }
         }
 
 
diff --git a/Main/System/BeautyMM/BeautyMMSkinActiveWin.cs b/Main/System/BeautyMM/BeautyMMSkinActiveWin.cs
new file mode 100644
index 0000000..eacf537
--- /dev/null
+++ b/Main/System/BeautyMM/BeautyMMSkinActiveWin.cs
@@ -0,0 +1,36 @@
+
+using UnityEngine;
+using UnityEngine.UI;
+
+public class BeautyMMSkinActiveWin : UIBase
+{
+    [SerializeField] Text nameText;
+    [SerializeField] ImageEx roleImg;
+
+    [SerializeField] Text attrText;
+
+    int skinID;
+
+
+    protected override void OnPreOpen()
+    {
+        skinID = functionOrder;
+        Display();
+    }
+
+
+
+    void Display()
+    {
+        var skinConfig = BeautySkinConfig.Get(skinID);
+        nameText.text = skinConfig.Name;
+        roleImg.SetOrgSprite(skinConfig.BigRole, "BeautyMMBigRole");
+        roleImg.SetNativeSize();
+
+        string format = "{0}" + UIHelper.AppendColor(TextColType.NavyYellow, "+{1}");
+        attrText.text = PlayerPropertyConfig.GetFullDescription(skinConfig.AttrIDList[0], skinConfig.InitAttrValueList[0], format);
+    }
+
+
+
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/System/BeautyMM/BeautyMMSkinActiveWin.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
copy to Main/System/BeautyMM/BeautyMMSkinActiveWin.cs.meta
index 4c9b26c..e3788ee 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/System/BeautyMM/BeautyMMSkinActiveWin.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: 25e9d541898b482469cf32bf0533a66b
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/BeautyMM/BeautyMMSkinCell.cs b/Main/System/BeautyMM/BeautyMMSkinCell.cs
index 0311c1e..212fbd7 100644
--- a/Main/System/BeautyMM/BeautyMMSkinCell.cs
+++ b/Main/System/BeautyMM/BeautyMMSkinCell.cs
@@ -26,10 +26,11 @@
         var skinData = BeautyMMManager.Instance.GetSkinData(skinID);
         var mmData = BeautyMMManager.Instance.GetBeautyMMData(mmID);
         var state = skinData.State;
-        if (mmData != null && mmData.State != 0 && skinConfig.UnlockWay == 1)
-        {
-            state = 1;
-        }
+        // if (mmData != null && mmData.State != 0 && skinConfig.UnlockWay == 1)
+        // {
+        //     //榛樿绛惧埌鑷繁瑙i攣
+        //     state = 1;
+        // }
         if (state != 0)
         {
             lockObj.SetActive(false);
@@ -41,7 +42,8 @@
         }
         usedText.SetActive(skinData.Used == 1);
         selectImg.SetActive(BeautyMMManager.Instance.selectSkinID == skinID);
-        redImg.SetActive(redState > 0);
+
+        redImg.SetActive(mmData != null && mmData.State != 0 && redState > 0);
 
         btn.AddListener(() =>
         {
diff --git a/Main/System/BeautyMM/BeautyMMSkinWin.cs b/Main/System/BeautyMM/BeautyMMSkinWin.cs
index 16a3e97..2a3027b 100644
--- a/Main/System/BeautyMM/BeautyMMSkinWin.cs
+++ b/Main/System/BeautyMM/BeautyMMSkinWin.cs
@@ -38,7 +38,8 @@
         mmID = functionOrder;
         BeautyMMManager.Instance.selectSkinID = BeautyMMManager.Instance.GetUsedSkinID(mmID);
         clothesScroller.OnRefreshCell += OnRefreshCell;
-        BeautyMMManager.Instance.OnSelectSkinIDChange += Display;
+        BeautyMMManager.Instance.OnSelectSkinIDChange += OnSelectSkinIDChange;
+        BeautyMMManager.Instance.OnBeautyMMDataUpdate += OnSelectSkinIDChange;
         CreateScroller();
         Display();
     }
@@ -46,9 +47,15 @@
     protected override void OnPreClose()
     {
         clothesScroller.OnRefreshCell -= OnRefreshCell;
-        BeautyMMManager.Instance.OnSelectSkinIDChange -= Display;
+        BeautyMMManager.Instance.OnSelectSkinIDChange -= OnSelectSkinIDChange;
+        BeautyMMManager.Instance.OnBeautyMMDataUpdate -= OnSelectSkinIDChange;
     }
 
+    void OnSelectSkinIDChange()
+    {
+        clothesScroller.m_Scorller.RefreshActiveCellViews();
+        Display();
+    }
 
     void Display()
     {
@@ -93,15 +100,15 @@
             if (skinData.State == 0)
             {
                 attrTipText.text = Language.Get("PhantasmPavilion11");
-                attrValueText.text = UIHelper.AppendColor(TextColType.lightYellow, PlayerPropertyConfig.GetFullDescription(skinConfig.AttrIDList[0], skinConfig.InitAttrValueList[0]));
+                attrValueText.text = UIHelper.AppendColor(TextColType.NavyYellow, PlayerPropertyConfig.GetFullDescription(skinConfig.AttrIDList[0], skinConfig.InitAttrValueList[0]));
             }
             else
             {
                 attrTipText.text = Language.Get("PhantasmPavilion07");
                 var value = skinConfig.InitAttrValueList[0] + skinData.Star * skinConfig.AttrPerStarAddList[0];
 
-                attrValueText.text = UIHelper.AppendColor(TextColType.lightYellow, PlayerPropertyConfig.GetFullDescription(skinConfig.AttrIDList[0], value)) +
-                    Language.Get("PhantasmPavilion12", UIHelper.AppendColor(TextColType.Green, "+" + PlayerPropertyConfig.GetValueDescription(skinConfig.AttrIDList[0], skinConfig.AttrPerStarAddList[0])));
+                attrValueText.text = UIHelper.AppendColor(TextColType.NavyYellow, PlayerPropertyConfig.GetFullDescription(skinConfig.AttrIDList[0], value)) +
+                    Language.Get("PhantasmPavilion12", UIHelper.AppendColor(TextColType.LightGreen, "+" + PlayerPropertyConfig.GetValueDescription(skinConfig.AttrIDList[0], skinConfig.AttrPerStarAddList[0])));
             }
         }
 
diff --git a/Main/System/BeautyMM/BeautyMMTravelCell.cs b/Main/System/BeautyMM/BeautyMMTravelCell.cs
index 1e12345..20464d9 100644
--- a/Main/System/BeautyMM/BeautyMMTravelCell.cs
+++ b/Main/System/BeautyMM/BeautyMMTravelCell.cs
@@ -126,10 +126,18 @@
             if (BeautyMMManager.Instance.m_Energy == 0)
             {
                 SysNotifyMgr.Instance.ShowTip("BeautyMM4");
+
+                TimingGiftManager.Instance.TryAddWhenInsufficient(5, BeautyMMManager.Instance.m_Energy, 1);
                 return;
             }
         }
 
+        // 濡傛灉姝eソ娑堣�楀畬锛屼笉瑙﹀彂鍥哄畾姒傜巼鐨勫垽瀹�
+        if (!TimingGiftManager.Instance.TryAddWhenExactConsumption(5, BeautyMMManager.Instance.m_Energy, 1))
+        {
+            TimingGiftManager.Instance.TryAddWithFixedProbabilityWhenSufficient(5, BeautyMMManager.Instance.m_Energy, 1);
+        }
+        
         if (grid.EventID == (int)GirdEventType.Empty)
         {
             // 绌烘牸瀛�
diff --git a/Main/System/BillboardRank/GuildRankWin.cs b/Main/System/BillboardRank/GuildRankWin.cs
index b70acbd..9ca08f4 100644
--- a/Main/System/BillboardRank/GuildRankWin.cs
+++ b/Main/System/BillboardRank/GuildRankWin.cs
@@ -1,13 +1,24 @@
-锘縰sing UnityEngine;
+锘縰sing System.Collections.Generic;
+using UnityEngine;
 
 public class GuildRankWin : UIBase
 {
+    [SerializeField] Transform empty;
     [SerializeField] GuildTop3Cell[] guildTop3Cells;
     [SerializeField] ScrollerController scroller;
     [SerializeField] TextEx rankText;
     [SerializeField] TextEx rankValueText;
+    [SerializeField] ButtonEx serversBtn;
 
     GuildManager manager { get { return GuildManager.Instance; } }
+    protected override void InitComponent()
+    {
+        serversBtn.AddListener(() =>
+        {
+            UIHelper.ShowServersPanel(GuildManager.Instance.crossServerIDList);
+        });
+    }
+
     protected override void OnPreOpen()
     {
         manager.OnRefreshFairyList += OnRefreshFairyList;
@@ -26,6 +37,7 @@
 
     public void Display()
     {
+        serversBtn.SetActive(GuildManager.Instance.zoneID != 0);
         ShowTop3();
         CreateScroller();
         ShowMyRank();
@@ -33,9 +45,21 @@
 
     void CreateScroller()
     {
-        scroller.Refresh();
-        var cnt = manager.rankShowMaxCnt;
-        for (int i = 3; i < cnt; i++)
+        if (GuildManager.Instance.pageIndexList.Count < 4)
+        {
+            empty.SetActive(true);
+            scroller.SetActive(false);
+            return;
+        }
+        empty.SetActive(false);
+        scroller.SetActive(true);
+
+        var startCount = scroller.GetCellTotalCount();
+        if (startCount > GuildManager.Instance.pageIndexList.Count)
+        {
+            scroller.Refresh();
+        }
+        for (int i = startCount + 3; i < GuildManager.Instance.pageIndexList.Count; i++)
         {
             scroller.AddCell(ScrollerDataType.Header, i);
         }
@@ -60,22 +84,16 @@
 
     void ShowMyRank()
     {
-        var mydata = manager.GetFairyData(PlayerDatas.Instance.fairyData.fairy.FamilyID);
-        if (mydata == null)
-        {
-            rankValueText.SetActive(false);
-            rankText.text = Language.Get("GuildRank04", Language.Get("L1045"));
-            return;
-        }
-        rankValueText.SetActive(true);
-        rankText.text = Language.Get("GuildRank04", mydata.Rank);
-        rankValueText.text = UIHelper.ReplaceLargeArtNum(mydata.totalFightPower);
+        int myFairyRank = manager.myFairyRank;
+        rankText.text = Language.Get("GuildRank04", myFairyRank > 0 ? myFairyRank : Language.Get("L1045"));
+        rankValueText.SetActive(PlayerDatas.Instance.fairyData.HasFairy && myFairyRank > 0);
+        rankValueText.text = UIHelper.ReplaceLargeArtNum(PlayerDatas.Instance.fairyData.fairy.totalFightPower);
     }
 
     void OnRefreshFairyList()
     {
         ShowTop3();
-        scroller.m_Scorller.RefreshActiveCellViews();
+        CreateScroller();
         ShowMyRank();
     }
 }
diff --git a/Main/System/BoneField/AdsManager.cs b/Main/System/BoneField/AdsManager.cs
index 1219506..25c3c99 100644
--- a/Main/System/BoneField/AdsManager.cs
+++ b/Main/System/BoneField/AdsManager.cs
@@ -78,7 +78,6 @@
                 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);
@@ -90,16 +89,22 @@
                     HeroUIManager.Instance.selectCallType = HappXBTitle.HeroCallAdvanced;
                     HeroUIManager.Instance.selectCallIndex = 0;
                     SendGetReward(ADID);
+                    TimingGiftManager.Instance.TryAddWhenAllAdsUsed(2, ADID);
                 });
                 break;
             case 4:
-            case 6:
+                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;
+
         }
     }
 
diff --git a/Main/System/ChallengeTab/WarlordPavilionTabHandler.cs b/Main/System/ChallengeTab/WarlordPavilionTabHandler.cs
index 175e498..2734406 100644
--- a/Main/System/ChallengeTab/WarlordPavilionTabHandler.cs
+++ b/Main/System/ChallengeTab/WarlordPavilionTabHandler.cs
@@ -41,7 +41,7 @@
         }
         else
         {
-            UIManager.Instance.OpenWindow<WarlordPavilionWin>();
+            UIManager.Instance.OpenWindow<TowerBaseWin>();
         }
     }
 
diff --git a/Main/System/Chat/ChatPlayerOtherCell.cs b/Main/System/Chat/ChatPlayerOtherCell.cs
index 246a2ff..af20b9c 100644
--- a/Main/System/Chat/ChatPlayerOtherCell.cs
+++ b/Main/System/Chat/ChatPlayerOtherCell.cs
@@ -22,7 +22,7 @@
         TalkData data = hasNewPlayerInfo ? newPlayerInfo : nowData;
 
         avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)data.PlayerID, (int)data.Face, (int)data.FacePic, data.Job));
-  
+
         title.InitUI(data.RealmLV, (int)data.TitleID);
         int bubbleID = ChatBubbleHelper.GetOtherChatBubbleID(data.Job, (int)data.BubbleBox);
         m_ChatBubble.DisplayBubble(bubbleID, (int)data.PlayerID);
@@ -42,6 +42,11 @@
             }
             m_PlayerName.text = Language.Get("Chat08", RichTextMsgReplaceConfig.GetRichReplace("FAMILY", fmlv), data.Name);
         }
+        
+        avatarCell.SetListener(() =>
+        {
+            AvatarHelper.TryViewOtherPlayerInfo((int)data.PlayerID, serverID: (int)data.ServerID, viewPlayerLineupType: (int)BattlePreSetType.Arena);
+        });
     }
 
     public float GetHeight(string content, ArrayList list)
diff --git a/Main/System/Equip/BlessLVADWin.cs b/Main/System/Equip/BlessLVADWin.cs
index c97e1cf..0a89059 100644
--- a/Main/System/Equip/BlessLVADWin.cs
+++ b/Main/System/Equip/BlessLVADWin.cs
@@ -11,7 +11,7 @@
     [SerializeField] Image moneyTypeImg;
     [SerializeField] Button adBtn;
     [SerializeField] Button useMoneyBtn;
-    
+
 
 
 
@@ -33,8 +33,9 @@
     {
         AdsManager.Instance.PlayAds(4);
         CloseWindow();
+        TimingGiftManager.Instance.TryAddWhenExactConsumption(1, BlessLVManager.Instance.m_Energy, 1);
     }
-    
+
     void OnUseMoney()
     {
         CloseWindow();
diff --git a/Main/System/Equip/BlessLVManager.cs b/Main/System/Equip/BlessLVManager.cs
index 4ea6914..72299f3 100644
--- a/Main/System/Equip/BlessLVManager.cs
+++ b/Main/System/Equip/BlessLVManager.cs
@@ -176,6 +176,10 @@
 
     void OnTimeEvent()
     {
+        if (!DTC0403_tagPlayerLoginLoadOK.finishedLogin)
+        {
+            return;
+        }
         //鍗囩骇涓鏌� 鍊掕鏃剁粨鏉燂紱闈炲崌绾т腑妫�鏌ュ厤璐规鏁版椂闂� 绾㈢偣
         if (m_LVUPState == 1)
         {
diff --git a/Main/System/Equip/BlessLVTimeUpWin.cs b/Main/System/Equip/BlessLVTimeUpWin.cs
index 9f7d249..1e5b15b 100644
--- a/Main/System/Equip/BlessLVTimeUpWin.cs
+++ b/Main/System/Equip/BlessLVTimeUpWin.cs
@@ -45,7 +45,7 @@
     }
 
     void OnTimeEvent()
-    { 
+    {
         var remainTime = BlessLVManager.Instance.GetLVUPRemainTime();
         int needCount = (int)Math.Ceiling((float)remainTime / BlessLVManager.Instance.timeUpTreeItemSubTime);
         RefreshCount(needCount, remainTime);
@@ -118,11 +118,15 @@
         CloseWindow();
         int count = (int)PackManager.Instance.GetItemCountByID(PackType.Item, BlessLVManager.Instance.timeUpTreeItemID);
         if (count <= 0)
-        { 
+        {
             SysNotifyMgr.Instance.ShowTip("ItemNotEnoughCommon");
             ItemTipUtility.Show(BlessLVManager.Instance.timeUpTreeItemID, true);
+            TimingGiftManager.Instance.TryAddWhenInsufficient(1,PackType.Item, BlessLVManager.Instance.timeUpTreeItemID, showCount);
             return;
         }
+
+        TimingGiftManager.Instance.TryAddWhenExactConsumption(1,PackType.Item, BlessLVManager.Instance.timeUpTreeItemID, showCount);
+
         var pack = new CB224_tagCMUseTreeLVUPTimeItem();
         pack.UseCount = (uint)showCount;
         GameNetSystem.Instance.SendInfo(pack);
diff --git a/Main/System/Equip/ItemsOnFloor.cs b/Main/System/Equip/ItemsOnFloor.cs
index 9f378a5..b948e62 100644
--- a/Main/System/Equip/ItemsOnFloor.cs
+++ b/Main/System/Equip/ItemsOnFloor.cs
@@ -13,8 +13,8 @@
     [SerializeField] MoneyMoveByPath moneyMoveByPathCell;     //鎺夎惤鐗╅噾閽�
     [SerializeField] RectTransform defaultDropRect;     //榛樿鎺夎惤浣嶇疆
     [SerializeField] Text[] expTexts;
-    FloorItemCell[] floorItemCells = new FloorItemCell[20];    //鍖呭惈闈炶澶囩殑鎴樺埄鍝佹帀钀�
-    MoneyMoveByPath[] moneyMoveByPathArr = new MoneyMoveByPath[20];  //鎺夎惤璐у竵锛岄噾閽憋紝缁忛獙绛�
+    FloorItemCell[] floorItemCells = new FloorItemCell[100];    //鍖呭惈闈炶澶囩殑鎴樺埄鍝佹帀钀�
+    MoneyMoveByPath[] moneyMoveByPathArr = new MoneyMoveByPath[100];  //鎺夎惤璐у竵锛岄噾閽憋紝缁忛獙绛�
 
 
     void Awake()
diff --git a/Main/System/Gubao/GubaoCallWin.cs b/Main/System/Gubao/GubaoCallWin.cs
index 5db6c15..7b6734b 100644
--- a/Main/System/Gubao/GubaoCallWin.cs
+++ b/Main/System/Gubao/GubaoCallWin.cs
@@ -8,6 +8,7 @@
 /// </summary>
 public class GubaoCallWin : UIBase
 {
+    [SerializeField] TimingGiftCell timingGiftCell;
     [SerializeField] OwnItemCell ownItemCell;
     [SerializeField] Toggle skipToggle;
     [SerializeField] Button call1Btn;
@@ -72,10 +73,12 @@
     {
         HappyXBModel.Instance.RefreshXBTypeInfoAct += Display;
         HappyXBModel.Instance.RefreshXBResultAct += ShowResult;
+        TimingGiftManager.Instance.OnShowGiftIdListAddEvent += OnShowGiftIdListAddEvent;
         skipToggle.isOn = LocalSave.GetBool(GubaoManager.skipKey + PlayerDatas.Instance.baseData.PlayerID, false);
         opObj.SetActive(true);
         resultObj.SetActive(false);
-
+        timingGiftCell.InitUI();
+        
         ShowVenderTalk(0).Forget();
         Display();
     }
@@ -84,6 +87,12 @@
     {
         HappyXBModel.Instance.RefreshXBTypeInfoAct -= Display;
         HappyXBModel.Instance.RefreshXBResultAct -= ShowResult;
+        TimingGiftManager.Instance.OnShowGiftIdListAddEvent -= OnShowGiftIdListAddEvent;
+    }
+
+    private void OnShowGiftIdListAddEvent()
+    {
+        timingGiftCell.InitUI();
     }
 
 
diff --git a/Main/System/Gubao/GubaoDetailWin.cs b/Main/System/Gubao/GubaoDetailWin.cs
index 30414c3..84b000f 100644
--- a/Main/System/Gubao/GubaoDetailWin.cs
+++ b/Main/System/Gubao/GubaoDetailWin.cs
@@ -586,10 +586,11 @@
         if (PackManager.Instance.GetItemCountByID(PackType.Item, lvConfig.LVUPNeedItemInfo[0][0]) < lvConfig.LVUPNeedItemInfo[0][1])
         {
             ItemTipUtility.Show(lvConfig.LVUPNeedItemInfo[0][0], true);
+            GubaoTryAdd(lvConfig.LVUPNeedItemInfo[0][0], lvConfig.LVUPNeedItemInfo[0][1]);
             return;
         }
-
         lvupEffect.Play();
+        GubaoTryAdd(lvConfig.LVUPNeedItemInfo[0][0], lvConfig.LVUPNeedItemInfo[0][1]);
         GubaoManager.Instance.UpgradeGubaoLV(gubaoID);
     }
 
@@ -605,4 +606,24 @@
         GubaoManager.Instance.ActiveGubao(gubaoID);
     }
 
+    void GubaoTryAdd(int itemId, long needCount)
+    {
+        int timingType = itemId switch
+        {
+            21 => 8,  // 鍦拌剦绮夊皹
+            27 => 9,  // 鏄熻緣绮夊皹
+            28 => 10, // 鏈堝崕绮夊皹
+            29 => 11, // 鏃ユ洔绮夊皹
+            _ => -1   // 榛樿鍊�
+        };
+
+        if (timingType >= 0)
+        {
+            if (TimingGiftManager.Instance.TryAddWhenInsufficient(timingType,PackType.Item, itemId, needCount))
+                return;
+            if (TimingGiftManager.Instance.TryAddWhenExactConsumption(timingType, PackType.Item,itemId, needCount))
+                return;
+            TimingGiftManager.Instance.TryAddWithFixedProbabilityWhenSufficient(timingType, PackType.Item,itemId, needCount);
+        }
+    }
 }
diff --git a/Main/System/Guild/GuildBaseWin.cs b/Main/System/Guild/GuildBaseWin.cs
index c0d66c1..a8f700e 100644
--- a/Main/System/Guild/GuildBaseWin.cs
+++ b/Main/System/Guild/GuildBaseWin.cs
@@ -72,7 +72,6 @@
         if (PlayerDatas.Instance.fairyData.fairy == null)
             return;
 
-        GuildManager.Instance.RequestGuildData();
         GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
         GlobalTimeEvent.Instance.fiveSecondEvent += OnFiveSecondEvent;
         ChatManager.Instance.OnUpdateTalkEvent += OnUpdateTalkEvent;
diff --git a/Main/System/Guild/GuildBossWin.cs b/Main/System/Guild/GuildBossWin.cs
index 079429a..f9fe965 100644
--- a/Main/System/Guild/GuildBossWin.cs
+++ b/Main/System/Guild/GuildBossWin.cs
@@ -138,7 +138,7 @@
 
     void Display()
     {
-        endTimeText.text = Language.Get("Arena14", TimeUtility.SecondsToHMS((int)(TimeUtility.GetTodayEndTime() - TimeUtility.ServerNow).TotalSeconds));
+        endTimeText.text = Language.Get("Arena14", TimeUtility.SecondsToHMS((int)(TimeUtility.GetCommTodayEndTime(GuildManager.Instance.zoneID) - TimeUtility.GetCommServerNow(GuildManager.Instance.zoneID)).TotalSeconds));
         fightPowerText.text = UIHelper.ReplaceLargeArtNum(PlayerDatas.Instance.baseData.FightPower);
         headCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
                                                         PlayerDatas.Instance.baseData.face,
@@ -271,7 +271,7 @@
         bzAttrText.text = GetAddAttrs(bossAction);
         var layer = bossAction == null ? 0 : bossAction.Value3;
         var bzTime = bossAction == null ? 0 : bossAction.Value2;
-        int remainTime = (int)Math.Max(0, bzTime - TimeUtility.AllSeconds);
+        int remainTime = (int)Math.Max(0, bzTime - TimeUtility.GetCommServerTick(GuildManager.Instance.zoneID));
         if (remainTime == 0)
         {
             //鏃堕棿鍒颁簡 瀹㈡埛绔嚜宸辨竻0
@@ -292,7 +292,7 @@
     {
         var layerNum = action == null ? 0 : action.Value3;
         var bzTime = action == null ? 0 : action.Value2;
-        int remainTime = (int)Math.Max(0, bzTime - TimeUtility.AllSeconds);
+        int remainTime = (int)Math.Max(0, bzTime - TimeUtility.GetCommServerTick(GuildManager.Instance.zoneID));
         if (remainTime == 0)
         {
             //鏃堕棿鍒颁簡 瀹㈡埛绔嚜宸辨竻0
@@ -310,7 +310,7 @@
 
     void OnSecondEvent()
     {
-        endTimeText.text = Language.Get("Arena14", TimeUtility.SecondsToHMS((int)(TimeUtility.GetTodayEndTime() - TimeUtility.ServerNow).TotalSeconds));
+        endTimeText.text = Language.Get("Arena14", TimeUtility.SecondsToHMS((int)(TimeUtility.GetCommTodayEndTime(GuildManager.Instance.zoneID) - TimeUtility.GetCommServerNow(GuildManager.Instance.zoneID)).TotalSeconds));
         var bossAction = GuildBossManager.Instance.GetGuildBossAction();
         ShowBzInfo(bossAction);
         OtherPlayerAnimation();
diff --git a/Main/System/Guild/GuildChangeNameWin.cs b/Main/System/Guild/GuildChangeNameWin.cs
index 8992a21..0b1e90b 100644
--- a/Main/System/Guild/GuildChangeNameWin.cs
+++ b/Main/System/Guild/GuildChangeNameWin.cs
@@ -46,10 +46,10 @@
 
     void ShowTime()
     {
-        if (GuildManager.Instance.TryGetFamilyActions(GuildManager.CustomyActionType, out var familyActions))
+        if (PlayerDatas.Instance.fairyData.fairy != null)
         {
-            var lastTime = familyActions.IsNullOrEmpty() ? 0 : familyActions[0].Value1;
-            var cdTime = GuildManager.Instance.renameFairyNameCD * 3600 - (TimeUtility.AllSeconds - (int)lastTime);
+            var lastTime = PlayerDatas.Instance.fairyData.fairy.lastChangeNameTick;
+            var cdTime = GuildManager.Instance.renameFairyNameCD * 3600 - (TimeUtility.AllSeconds - lastTime);
             if (cdTime <= 0)
             {
                 cdTimeText.text = Language.Get("Guild_51", GuildManager.Instance.renameFairyNameCD);
diff --git a/Main/System/Guild/GuildHallWin.cs b/Main/System/Guild/GuildHallWin.cs
index e98d296..7f34388 100644
--- a/Main/System/Guild/GuildHallWin.cs
+++ b/Main/System/Guild/GuildHallWin.cs
@@ -62,7 +62,6 @@
 
     protected override void OnPreOpen()
     {
-        GuildManager.Instance.RequestGuildData();
 
         GuildManager.Instance.memberOPIndex = -1;
         GuildManager.Instance.MemberOPIndexEvent += OnMemberOPIndexEvent;
diff --git a/Main/System/Guild/GuildHawkerWin.cs b/Main/System/Guild/GuildHawkerWin.cs
index c5face0..5439919 100644
--- a/Main/System/Guild/GuildHawkerWin.cs
+++ b/Main/System/Guild/GuildHawkerWin.cs
@@ -61,7 +61,8 @@
 
     void OnSecondEvent()
     {
-        timeText.text = Language.Get("Guild_74", TimeUtility.SecondsToShortDHMS((int)(TimeUtility.GetTodayEndTime() - TimeUtility.ServerNow).TotalSeconds));
+        timeText.text = Language.Get("Guild_74", TimeUtility.SecondsToShortDHMS((int)(TimeUtility.GetCommTodayEndTime(GuildManager.Instance.zoneID) -
+        TimeUtility.GetCommServerNow(GuildManager.Instance.zoneID)).TotalSeconds));
     }
 
     int index = 0;
@@ -199,9 +200,9 @@
     void OnCut()
     {
         //鐮嶄环鐨刢d闄愬埗: 鍏細娌℃湁璁板綍鑷繁鐮嶈繃浠凤紝浣嗕粖澶╂湁鐮嶄环璁板綍锛屼笖閫�鍑鸿繃鍏細
-        if (GuildManager.Instance.zhenbaogeCutState == 0 && GuildManager.Instance.needCheckCutCD && (TimeUtility.AllSeconds - PlayerDatas.Instance.baseData.leaveFamilyTime) / 60 < GuildManager.Instance.zbgChangFamilyCD )
+        if (GuildManager.Instance.zhenbaogeCutState == 0 && GuildManager.Instance.needCheckCutCD && (TimeUtility.GetCommServerTick(GuildManager.Instance.zoneID) - PlayerDatas.Instance.baseData.leaveFamilyTime) / 60 < GuildManager.Instance.zbgChangFamilyCD )
         {
-            SysNotifyMgr.Instance.ShowTip("ZhenbaogeCut1", GuildManager.Instance.zbgChangFamilyCD - (TimeUtility.AllSeconds - PlayerDatas.Instance.baseData.leaveFamilyTime) / 60);
+            SysNotifyMgr.Instance.ShowTip("ZhenbaogeCut1", GuildManager.Instance.zbgChangFamilyCD - (TimeUtility.GetCommServerTick(GuildManager.Instance.zoneID) - PlayerDatas.Instance.baseData.leaveFamilyTime) / 60);
             return;
         }
         if (GuildManager.Instance.zhenbaogeCutState == 0)
diff --git a/Main/System/Guild/GuildJoinWin.cs b/Main/System/Guild/GuildJoinWin.cs
index ce028c5..476e0c3 100644
--- a/Main/System/Guild/GuildJoinWin.cs
+++ b/Main/System/Guild/GuildJoinWin.cs
@@ -14,6 +14,7 @@
     [SerializeField] Button quicklyJoinGuildBtn;
     [SerializeField] ScrollerController guildListScroller;
     [SerializeField] Transform noGuildTf;
+    [SerializeField] Button serversBtn;
 
     string lastQuery = "";
     int lastPage = 0;
@@ -22,6 +23,10 @@
         findBtn.AddListener(() => OnFindBtnClick());
         createGuildBtn.AddListener(OnCreateGuildBtnClick);
         quicklyJoinGuildBtn.AddListener(OnQuicklyJoinGuildBtnClick);
+        serversBtn.AddListener(()=>
+        {
+            UIHelper.ShowServersPanel(GuildManager.Instance.crossServerIDList);
+        });
     }
     protected override void OnPreOpen()
     {
@@ -55,6 +60,7 @@
 
     void Display()
     {
+        serversBtn.SetActive(GuildManager.Instance.zoneID != 0);
         CreateScroller();
     }
 
diff --git a/Main/System/Guild/GuildManager.CrossServer.cs b/Main/System/Guild/GuildManager.CrossServer.cs
new file mode 100644
index 0000000..e967068
--- /dev/null
+++ b/Main/System/Guild/GuildManager.CrossServer.cs
@@ -0,0 +1,28 @@
+
+
+// 璺ㄦ湇鍏細
+using System;
+using System.Collections.Generic;
+
+public partial class GuildManager : GameSystemManager<GuildManager>
+{
+    public int zoneID;
+    public List<int> crossServerIDList = new List<int>();
+    public event Action OnRefreshCrossServerInfoEvent;
+
+    public void OnRefreshCrossServerInfo(HA505_tagSCFamilyCrossInfo vNetData)
+    {
+        zoneID = vNetData.ZoneID;
+        crossServerIDList.Clear();
+        for (int i = 0; i < vNetData.ServerCnt; i++)
+        {
+            crossServerIDList.Add((int)vNetData.ServerIDList[i]);
+        }
+        crossServerIDList.Sort();
+        OnRefreshCrossServerInfoEvent?.Invoke();
+    }
+
+   
+
+}
+
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/System/Guild/GuildManager.CrossServer.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
copy to Main/System/Guild/GuildManager.CrossServer.cs.meta
index 4c9b26c..4e8b895 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/System/Guild/GuildManager.CrossServer.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: 60391b6aaece70d44818911cfde90870
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Guild/GuildManager.cs b/Main/System/Guild/GuildManager.cs
index 9dd2295..4366d50 100644
--- a/Main/System/Guild/GuildManager.cs
+++ b/Main/System/Guild/GuildManager.cs
@@ -8,10 +8,9 @@
 using UnityEngine;
 
 
-public class GuildManager : GameSystemManager<GuildManager>
+public partial class GuildManager : GameSystemManager<GuildManager>
 {
     // 瀹舵棌鑷畾涔夎褰曠被鍨�
-    public const int CustomyActionType = 0;     //閫氱敤
     public const int MemberChangeActionType = 12;      //鍏細鍙樻洿璁板綍
     public const int FamilyActionsType = 15;     // 鍏細璁板綍寰界珷绫诲瀷15
     public const int ZBGFamilyActionType = 16;  // 鐝嶅疂闃佽褰曠被鍨�
@@ -69,13 +68,14 @@
 
     void OnBeforePlayerDataInitialize()
     {
+        zoneID = 0;
+        crossServerIDList.Clear();
         ClearGuildData();
         donateCntList = null;
     }
 
     void OnBeforePlayerDataInitializeEx()
     {
-        guildChanged = false;
         isQueryZBGYet = false;
     }
 
@@ -98,7 +98,6 @@
         PlayerDatas.Instance.baseData.FamilyId = 0;
         m_FairyRequesteds.Clear();
         familyActions.Clear();
-        guildChanged = false;
         applyList.Clear();
         PlayerDatas.Instance.fairyData.ClearData();
 
@@ -231,8 +230,8 @@
 
 
         config = FuncConfigConfig.Get("FamilyBillboardSet");
-        rankShowMaxCnt = int.Parse(config.Numerical1);
-        pageCnt = int.Parse(config.Numerical2);
+        pageCnt = int.Parse(config.Numerical1);
+        queryPointNum = int.Parse(config.Numerical2);
     }
 
 
@@ -352,7 +351,7 @@
                 punishTime = quitGuildPunishTime[Math.Min(quitCount, quitGuildPunishTime.Length - 1)];
         }
 
-        return punishTime * 60 - (TimeUtility.AllSeconds - PlayerDatas.Instance.baseData.leaveFamilyTime);
+        return punishTime * 60 - (TimeUtility.GetCommServerTick(zoneID)- PlayerDatas.Instance.baseData.leaveFamilyTime);
     }
 
 
@@ -536,6 +535,7 @@
 
     // 鏌ユ壘鐨勫叕浼欼D锛氬叕浼氭暟鎹�
     public Dictionary<int, FairyData> guildsDict = new Dictionary<int, FairyData>();
+    public int myFairyRank;
     // 鎸夋煡璇㈤〉瀛樺偍
     public List<int> pageIndexList = new List<int>();  //姝e父鏄寜椤垫煡璇紝椤哄簭娣诲姞鍗冲彲
     public int curPageIndex;
@@ -544,7 +544,6 @@
     public int lastPage = -1;
     public int pageCnt; //姣忛〉鏌ヨ鏉℃暟
     int queryPointNum;  //鏌ヨ鐐�
-    public int rankShowMaxCnt;
 
     public bool isPowerSort
     {
@@ -597,13 +596,6 @@
             if (lastPage >= page)
                 return;
             lastPage = page;
-
-            if (index >= rankShowMaxCnt)
-            {
-                //瓒呰繃鏈嶅姟鍣ㄥ凡涓婃鐨勬�绘暟閲忥紝姣斿鎬绘鍗曟槸100鍚嶏紝褰撳墠鍙湁8鍚嶇帺瀹朵笂姒滐紝寰�涓嬫粴鍔ㄥ氨涓嶅啀鏌ヨ
-                return;
-            }
-            //Debug.LogFormat("鍒嗛〉鏌ヨ锛氳姹傜 {0} 椤� (褰撳墠index:{1})", page + 1, index);
             SendFindGuild(string.Empty, page + 1, pageCnt);
         }
     }
@@ -621,7 +613,7 @@
             SetFairyViewData(data, guildInfo);
             pageIndexList.Add((int)guildInfo.FamilyID);
         }
-
+        myFairyRank = (int)vNetData.Rank;   //0-娌℃湁鍏細鎴栨病鏈夊湪姒滀笂锛�>0-瀵瑰簲鎺掑悕
 
         if (OnRefreshFairyList != null)
         {
@@ -654,28 +646,13 @@
         GameNetSystem.Instance.SendInfo(pack);
     }
 
-    public void SendFindGuildNoDecrypt(string msg, int pageIndex = 0, int pageSize = 20)
-    {
-        if (pageIndex == 0)
-        {
-            //榛樿鏌ヨ绗竴椤靛嵆浠h〃閲嶆柊寮�濮嬫煡璇紝娓呯┖涔嬪墠鐨勬暟鎹�
-            guildsDict.Clear();
-            pageIndexList.Clear();
-        }
-        var pack = new CA620_tagCMViewFamilyPage();
-        pack.Msg = msg;
-        pack.MsgLen = (byte)msg.Length;
-        pack.PageIndex = (byte)pageIndex;
-        pack.ShowCount = (byte)pageSize;
-        GameNetSystem.Instance.SendInfo(pack);
-    }
-
     public static void SetFairyViewData(FairyData data, HA523_tagMCFamilyViewList.tagMCFamilyView view)
     {
         data.Rank = view.Rank;
         data.FamilyID = (int)view.FamilyID;
         data.FamilyName = view.FamilyName;
         data.LeaderID = (int)view.LeaderID;
+        data.LeaderServerID = (int)view.LeaderServerID;
         data.LeaderName = view.LeaderName;
         data.FamilyLV = view.FamilyLV;
         data.JoinReview = view.JoinReview;
@@ -687,6 +664,43 @@
         data.MemberCount = view.MemberCount;
     }
 
+    #endregion
+
+    #region 鏌ョ湅鐩爣鍏細
+    public Dictionary<int, FairyData> viewGuildsDict = new Dictionary<int, FairyData>();
+
+    public event Action OnUpdateViewFamilyInfo;
+
+    public void UpdateViewFamilyInfo(HA519_tagSCTagFamilyInfo pack)
+    {
+        FairyData data = new FairyData();
+        SetFairyViewData(data, pack);
+        viewGuildsDict[(int)data.FamilyID] = data;
+        OnUpdateViewFamilyInfo?.Invoke();
+    }
+
+    public static void SetFairyViewData(FairyData data, HA519_tagSCTagFamilyInfo view)
+    {
+        data.FamilyID = (int)view.FamilyID;
+        data.FamilyName = view.FamilyName;
+        data.LeaderID = (int)view.LeaderID;
+        data.LeaderServerID = (int)view.LeaderServerID;
+        data.LeaderName = view.LeaderName;
+        data.FamilyLV = view.FamilyLV;
+        data.ServerID = (int)view.ServerID;
+        data.EmblemID = (int)view.EmblemID;
+        data.EmblemWord = view.EmblemWord;
+        data.totalFightPower = view.FightPowerEx * Constants.ExpPointValue + view.FightPower;
+        data.MemberCount = view.MemberCount;
+    }
+
+    public void SendViewGuild(int fairyID, int serverID)
+    {
+        var pack = new CA619_tagCSViewTagFamily();
+        pack.FamilyID = (uint)fairyID;
+        pack.DataServerID = (uint)serverID;
+        GameNetSystem.Instance.SendInfo(pack);
+    }
     #endregion
 
     #region 鐢宠鍒楄〃
@@ -871,35 +885,6 @@
     }
     #endregion
 
-    float lastChangeMarkTime = 0;   //鎵撳紑鐣岄潰鎯呭喌涓嬮伩鍏嶇煭鏃堕棿澶氭绔嬪嵆璇锋眰锛孋/S閫氫俊涔熸槸鏈夋椂闂撮棿闅�
-    public bool guildChanged = false;
-    //Type锛�0-鏃狅紱1-鎴愬憳鍔犲叆锛�2-鎴愬憳閫�鍑猴紱3-鏀朵汉璁剧疆淇敼锛�4-鍏憡淇敼锛�5-寰界珷淇敼锛�6-鐩熶富鍙樻洿锛�7-鎴愬憳鑱屼綅鍙樻洿锛�8-鎴愬憳涓婄嚎锛�9-鎴愬憳绂荤嚎锛�
-    //鍏細鏁版嵁鍙樺寲锛岃姹傛柊鐨勫叕浼氫俊鎭紝濡傚湪鎵撳紑鍏細鍒楄〃鏃惰姹傦紝鍏朵粬鍔熻兘鏍规嵁鑷韩鎯呭喌璇锋眰
-    public void UpdateGuildDataChangeMark(HA521_tagMCFamilyChange netPack)
-    {
-        guildChanged = true;
-        if (Time.time - lastChangeMarkTime < 0.2f)
-        {
-            //灏忎紭鍖� 濡傛灉鏈夐棶棰樹篃鍙互鍘婚櫎
-            return;
-        }
-        lastChangeMarkTime = Time.time;
-        if ((netPack.Type == 1 || netPack.Type == 2) && UIManager.Instance.IsOpened<GuildBaseWin>())
-        {
-            RequestGuildData();
-        }
-    }
-
-    public void RequestGuildData()
-    {
-        if (guildChanged)
-        {
-            guildChanged = false;
-            var pack = new CA626_tagCMGetFamilyInfo();
-            GameNetSystem.Instance.SendInfo(pack);
-
-        }
-    }
 
     public void SendKickFairy(uint playerID)
     {
@@ -1156,7 +1141,7 @@
         {
             return;
         }
-        if (TimeUtility.ServerNow.Hour < 10)
+        if (TimeUtility.GetCommServerNow(zoneID).Hour < 10)
             return;
 
         if (zhenbaogeCutState == 0)
diff --git a/Main/System/Guild/GuildMemberCell.cs b/Main/System/Guild/GuildMemberCell.cs
index 51c59fb..32cbf9c 100644
--- a/Main/System/Guild/GuildMemberCell.cs
+++ b/Main/System/Guild/GuildMemberCell.cs
@@ -9,7 +9,7 @@
 /// </summary>
 public class GuildMemberCell : CellView
 {
-    
+
     [SerializeField] AvatarCell avatarCell;
     [SerializeField] OfficialTitleCell titleCell;
     [SerializeField] Text lvText;
@@ -49,7 +49,7 @@
 
         avatarCell.AddListener(() =>
         {
-            OtherPlayerDetailManager.Instance.ViewPlayerDetail(playerID);
+            OtherPlayerDetailManager.Instance.ViewPlayerDetail(playerID, playerInfo.ServerID);
         });
 
         contribText.text = playerInfo.ContribDay + "/" + playerInfo.ContribTotal;
@@ -91,7 +91,7 @@
             showArrowImg.transform.localScale = new Vector3(1, -1, 1);
         }
     }
-    
+
     //渚嬪瓙 鍙栨暣澶勭悊锛� 1.5澶� 鏄剧ず1澶�; 鏈�澶�7澶╃壒娈婂鐞�
     //x澶�
     //x鏃�
diff --git a/Main/System/Guild/GuildOPWin.cs b/Main/System/Guild/GuildOPWin.cs
index aecd11e..7e272b7 100644
--- a/Main/System/Guild/GuildOPWin.cs
+++ b/Main/System/Guild/GuildOPWin.cs
@@ -50,7 +50,6 @@
 
     protected override void OnPreOpen()
     {
-        GuildManager.Instance.RequestGuildData();
 
         PlayerDatas.Instance.fairyData.OnRefreshFairyInfo += OnRefreshFairyInfo;
         Display();
diff --git a/Main/System/Guild/GuildPreviewWin.cs b/Main/System/Guild/GuildPreviewWin.cs
index fc4166c..bb219c9 100644
--- a/Main/System/Guild/GuildPreviewWin.cs
+++ b/Main/System/Guild/GuildPreviewWin.cs
@@ -29,6 +29,7 @@
 
     int guildID;
     int leaderID;
+    int leaderServerID;
     protected override void InitComponent()
     {
         opearteBtn.AddListener(() =>
@@ -47,7 +48,7 @@
 
         leaderAvatar.AddListener(() =>
         {
-            OtherPlayerDetailManager.Instance.ViewPlayerDetail(leaderID);
+            OtherPlayerDetailManager.Instance.ViewPlayerDetail(leaderID, leaderServerID);
         });
     }
 
@@ -67,10 +68,22 @@
 
     void Display()
     {
-        var guildInfo = GuildManager.Instance.guildsDict[guildID];
+        FairyData guildInfo = null;
+        if (GuildManager.Instance.guildsDict.ContainsKey(guildID))
+        {
+            guildInfo = GuildManager.Instance.guildsDict[guildID];
+        }
+        else
+        {
+            if (GuildManager.Instance.viewGuildsDict.ContainsKey(guildID))
+            {
+                guildInfo = GuildManager.Instance.viewGuildsDict[guildID];
+            }
+        }
         if (guildInfo == null) return;
         leaderID = guildInfo.LeaderID;
-        OtherPlayerDetailManager.Instance.ViewPlayerDetail(leaderID, (int)ViewPlayerType.viewGuildLeader);
+        leaderServerID = guildInfo.ServerID;
+        OtherPlayerDetailManager.Instance.ViewPlayerDetail(leaderID, leaderServerID, (int)ViewPlayerType.viewGuildLeader);
 
         var config = FamilyConfig.Get(guildInfo.FamilyLV);
         guildEmblem.Display(guildInfo.EmblemID, guildInfo.EmblemWord, 0.7f);
diff --git a/Main/System/Guild/PlayerFairyData.cs b/Main/System/Guild/PlayerFairyData.cs
index 29e2508..48909d9 100644
--- a/Main/System/Guild/PlayerFairyData.cs
+++ b/Main/System/Guild/PlayerFairyData.cs
@@ -30,11 +30,10 @@
     // 0-鎴愬憳锛�1-绮捐嫳锛�2-鍓洘涓伙紝3-鐩熶富
     public int leaderID;
     public string leaderName;
-    // // 绮捐嫳
-    public List<int> elitePlayerIDList = new List<int>();
     // // 鍓洘涓�
     public List<int> deputyLeaderPlayerIDList = new List<int>();
 
+    //宸紓鏇存柊 闇�澧炲垹鏀� memberDic memberIDList deputyLeaderPlayerIDList
     public void OnRefreshGuildInfo(HA520_tagMCRoleFamilyInfo vNetData)
     {
         if (fairy == null)
@@ -53,13 +52,10 @@
         fairy.totalFightPower = vNetData.FightPowerEx * Constants.ExpPointValue + vNetData.FightPower;
         fairy.Broadcast = vNetData.Broadcast;
         fairy.LeaderID = (int)vNetData.LeaderID;
-        fairy.MemberCount = vNetData.MemberCount;
 
-        mine = null;
+        fairy.lastChangeNameTick = (int)vNetData.Extra1;
 
-        memberDic.Clear();
-        memberIDList.Clear();
-        deputyLeaderPlayerIDList.Clear();
+
         for (int i = 0; i < vNetData.MemberCount; i++)
         {
             FairyMember member = new FairyMember();
@@ -90,27 +86,60 @@
                 OnRefreshFairyMine?.Invoke();
             }
 
+
+
             // 0-鎴愬憳锛�1-绮捐嫳锛�2-鍓洘涓伙紝3-鐩熶富
 
-            // if (member.FmLV == 1)
-            // {
-            //     elitePlayerIDList.Add(member.PlayerID);
-            // }
-            if (member.FmLV == 2)
+            if (deputyLeaderPlayerIDList.Contains(member.PlayerID) && member.FmLV != 2)
             {
+                deputyLeaderPlayerIDList.Remove(member.PlayerID);
+            }
+            else if (member.FmLV == 2 && !deputyLeaderPlayerIDList.Contains(member.PlayerID))
+            {
+                // 瀵瑰簲鐨勫彉鏇� 鍜� 閫�鍑洪渶鍚屾淇敼
                 deputyLeaderPlayerIDList.Add(member.PlayerID);
             }
+
+
             if (member.FmLV == 3)
             {
-                leaderID = (int)member.PlayerID;
+                leaderID = member.PlayerID;
                 leaderName = member.Name;
+
             }
         }
 
-        memberIDList.AddRange(memberDic.Keys);
-        memberIDList.Sort(SortMember);
+        if (mine.FmLV == 3 && mine.PlayerID != leaderID)
+        {
+            mine.FmLV = 0;
+        }
+        RefreshMemberIDList();
 
         if (OnRefreshFairyInfo != null) OnRefreshFairyInfo();
+    }
+
+
+    public void DeleteMember(HA524_tagSCFamilyMemDel netPack)
+    {
+        if (memberDic.ContainsKey((int)netPack.PlayerID))
+        {
+            memberDic.Remove((int)netPack.PlayerID);
+            RefreshMemberIDList();
+        }
+        if (deputyLeaderPlayerIDList.Contains((int)netPack.PlayerID))
+        {
+            deputyLeaderPlayerIDList.Remove((int)netPack.PlayerID);
+        }
+
+        OnRefreshFairyInfo?.Invoke();
+    }
+
+    void RefreshMemberIDList()
+    {
+        memberIDList.Clear();
+        memberIDList.AddRange(memberDic.Keys);
+        memberIDList.Sort(SortMember);
+        fairy.MemberCount = memberIDList.Count;
     }
 
     public FairyMember GetMember(int playerid)
@@ -187,7 +216,9 @@
     public long totalFightPower;
     public string Broadcast;
     public int LeaderID;    //鏃忛暱鐜╁ID
+    public int LeaderServerID;  //鏃忛暱鏈嶅姟鍣↖D
     public int MemberCount;
+    public int lastChangeNameTick;
 
     //鏌ユ壘澧炲姞鐨勫瓧娈�
     public string LeaderName;
@@ -218,7 +249,7 @@
 public class FairyApply
 {
     public int PlayerID;
-    public string Name;      
+    public string Name;
     public int ReqTime;        //鐢宠鏃堕棿鎴�
     public int LV;        //绛夌骇
     public int Job;        //鑱屼笟
@@ -226,7 +257,7 @@
     public int Face;        //鍩烘湰鑴稿瀷
     public int FacePic;        //澶村儚妗�
     public int TitleID;        //绉板彿
-    public long FightPower;     
+    public long FightPower;
     public int ServerID;        //鎵�灞炲尯鏈岻D
     public int IsOnLine;        //鏄惁鍦ㄧ嚎
 }
diff --git a/Main/System/Guild/ServersSmallTipCell.cs b/Main/System/Guild/ServersSmallTipCell.cs
new file mode 100644
index 0000000..bd0f1d8
--- /dev/null
+++ b/Main/System/Guild/ServersSmallTipCell.cs
@@ -0,0 +1,29 @@
+锘縰sing UnityEngine;
+using UnityEngine.UI;
+
+
+public class ServersSmallTipCell : CellView
+{
+    [SerializeField] Text[] serversText;
+
+
+
+    public void Display(int index)
+    {
+        for (int i = 0; i < serversText.Length; i++)
+        {
+            int listIndex = index + i;
+            if (listIndex >= ServersSmallTipWin.serverIDList.Count)
+            {
+                serversText[i].text = "";
+                continue;
+            }
+            serversText[i].SetActive(true);
+            var serverID = ServersSmallTipWin.serverIDList[index + i];
+            serversText[i].text = ServerListCenter.Instance.GetServerName(serverID);
+        }
+    }
+
+
+}
+
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/System/Guild/ServersSmallTipCell.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
copy to Main/System/Guild/ServersSmallTipCell.cs.meta
index 4c9b26c..f9fe205 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/System/Guild/ServersSmallTipCell.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: 36a723a4b576693468a90ba111d5b58c
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Guild/ServersSmallTipWin.cs b/Main/System/Guild/ServersSmallTipWin.cs
new file mode 100644
index 0000000..7c5fe49
--- /dev/null
+++ b/Main/System/Guild/ServersSmallTipWin.cs
@@ -0,0 +1,66 @@
+锘縰sing System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+public class ServersSmallTipWin : UIBase
+{
+    [SerializeField] RectTransform content;
+    [SerializeField] RectTransform arrow;
+    [SerializeField] ScrollerController serversScroller;
+
+    public static List<int> serverIDList;
+    protected override void OnPreOpen()
+    {
+        serversScroller.OnRefreshCell += OnRefreshCell;
+        Display();
+    }
+
+    protected override void OnPreClose()
+    {
+        serversScroller.OnRefreshCell -= OnRefreshCell;
+    }
+
+
+    protected override void NextFrameAfterOpen()
+    {
+        var worldPos = CameraManager.uiCamera.ScreenToWorldPoint(Input.mousePosition);
+
+
+        Vector2 screenAdjustedPos = CameraManager.uiCamera.WorldToScreenPoint(worldPos);
+
+        var beforePos = screenAdjustedPos;
+        var beforeAdjustedPos = CameraManager.uiCamera.ScreenToWorldPoint(beforePos);
+
+        var rectWidth = content.rect.width * Screen.width / canvasScaler.referenceResolution.x;
+        screenAdjustedPos.x = Mathf.Clamp(screenAdjustedPos.x, rectWidth * 0.5f, Screen.width - rectWidth * 0.5f);
+        screenAdjustedPos.y -= 40;
+        var adjustedPos = CameraManager.uiCamera.ScreenToWorldPoint(screenAdjustedPos);
+        adjustedPos.z = 0;
+        content.position = adjustedPos;
+
+        arrow.position = new Vector3(beforeAdjustedPos.x, arrow.position.y, 0);
+    }
+    
+
+    public void Display()
+    {
+        serversScroller.Refresh();
+        for (int i = 0; i < serverIDList.Count; i++)
+        {
+            if (i % 4 == 0)
+            {
+                serversScroller.AddCell(ScrollerDataType.Header, i);
+            }
+        }
+        serversScroller.Restart();
+    }
+
+    void OnRefreshCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell.GetComponent<ServersSmallTipCell>();
+        _cell.Display(cell.index);
+    }
+
+
+
+}
+
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/System/Guild/ServersSmallTipWin.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
copy to Main/System/Guild/ServersSmallTipWin.cs.meta
index 4c9b26c..26a8c36 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/System/Guild/ServersSmallTipWin.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: d3c0b72418f3c5345ba779c8382e0eb0
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/HappyXB/HeroCallWin.cs b/Main/System/HappyXB/HeroCallWin.cs
index a48b162..5a1ff18 100644
--- a/Main/System/HappyXB/HeroCallWin.cs
+++ b/Main/System/HappyXB/HeroCallWin.cs
@@ -1,3 +1,4 @@
+using System;
 using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
@@ -9,6 +10,7 @@
 /// </summary>
 public class HeroCallWin : UIBase
 {
+    [SerializeField] TimingGiftCell timingGiftCell;
     [SerializeField] Button ruleBtn;
     [SerializeField] OwnItemCell ownItemCell;
     [SerializeField] Button scoreBtn;
@@ -76,6 +78,8 @@
 
         HappyXBModel.Instance.RefreshXBTypeInfoAct += Refresh;
         InvestModel.Instance.onInvestUpdate += OnInvestUpdate;
+        TimingGiftManager.Instance.OnShowGiftIdListAddEvent += OnShowGiftIdListAddEvent;
+        timingGiftCell.InitUI();
         skipToggle.isOn = LocalSave.GetBool(HeroUIManager.skipKey + PlayerDatas.Instance.baseData.PlayerID, false);
         Refresh();
         openPrivilegeTip.SetActive(!InvestModel.Instance.IsInvested(InvestModel.foreverCardType));
@@ -85,6 +89,12 @@
     {
         HappyXBModel.Instance.RefreshXBTypeInfoAct -= Refresh;
         InvestModel.Instance.onInvestUpdate -= OnInvestUpdate;
+        TimingGiftManager.Instance.OnShowGiftIdListAddEvent -= OnShowGiftIdListAddEvent;
+    }
+
+    private void OnShowGiftIdListAddEvent()
+    {
+        timingGiftCell.InitUI();
     }
 
     void OnInvestUpdate(int type)
diff --git a/Main/System/HeroUI/HeroGiftWashWin.cs b/Main/System/HeroUI/HeroGiftWashWin.cs
index f0be3bd..697ede3 100644
--- a/Main/System/HeroUI/HeroGiftWashWin.cs
+++ b/Main/System/HeroUI/HeroGiftWashWin.cs
@@ -128,8 +128,10 @@
         if (!ItemLogicUtility.CheckItemCount(PackType.Item, HeroUIManager.Instance.washItemID,
         HeroUIManager.Instance.GetTalentLockUseWashCount(hero), 2))
         {
+            TimingGiftManager.Instance.TryAddWhenInsufficient(4, HeroUIManager.Instance.washItemID, HeroUIManager.Instance.GetTalentLockUseWashCount(hero));
             return;
         }
+
 
         for (int i = 0; i < currentGiftCells.Length; i++)
         {
@@ -156,8 +158,10 @@
         {
             return;
         }
-
-
+        if (!TimingGiftManager.Instance.TryAddWhenExactConsumption(4,PackType.Item, HeroUIManager.Instance.washItemID, HeroUIManager.Instance.GetTalentLockUseWashCount(hero)))
+        {
+            TimingGiftManager.Instance.TryAddWithFixedProbabilityWhenSufficient(4, PackType.Item,HeroUIManager.Instance.washItemID, HeroUIManager.Instance.GetTalentLockUseWashCount(hero));
+        }
         HeroUIManager.Instance.SendWash(hero, 0);
     }
 
@@ -241,7 +245,7 @@
 
 
     void ChangeLockEvent()
-    { 
+    {
         int useCount = HeroUIManager.Instance.GetTalentLockUseWashCount(hero);
         var itemCount = PackManager.Instance.GetItemCountByID(PackType.Item, HeroUIManager.Instance.washItemID);
         itemCountText.text = UIHelper.AppendColor(itemCount >= useCount ? TextColType.Green : TextColType.Red,
diff --git a/Main/System/HeroUI/HeroTrainWin.cs b/Main/System/HeroUI/HeroTrainWin.cs
index dae5d18..6677ab2 100644
--- a/Main/System/HeroUI/HeroTrainWin.cs
+++ b/Main/System/HeroUI/HeroTrainWin.cs
@@ -308,7 +308,7 @@
         deleteTip.SetActive(false);
         if (hero != null && hero.Quality == 1 && HeroUIManager.Instance.IsTheSameHeroFullStar(hero.heroId))
         {
-            
+
             deleteTip.SetActive(true);
         }
     }
@@ -580,7 +580,14 @@
                 });
 
                 HeroUIManager.Instance.lastFightPower = new KeyValuePair<string, long>(hero.itemHero.guid, hero.CalculateFightPower(false));
+                // 濡傛灉姝eソ娑堣�楀畬锛屼笉瑙﹀彂鍥哄畾姒傜巼鐨勫垽瀹�
+                if (!TimingGiftManager.Instance.TryAddWhenExactConsumption(3, PackType.Item,itemID, needCount))
+                {
+                    TimingGiftManager.Instance.TryAddWithFixedProbabilityWhenSufficient(3, PackType.Item,itemID, needCount);
+                }
+                return;
             }
+            TimingGiftManager.Instance.TryAddWhenInsufficient(3, itemID, needCount);
 
         }
 
@@ -927,7 +934,7 @@
         }
 
     }
-    
+
     #region 绐佺牬鍔熻兘
 
     void DisplayTrainOrBreak(HeroInfo hero)
diff --git a/Main/System/HeroUI/HeroUIManager.cs b/Main/System/HeroUI/HeroUIManager.cs
index a8aa796..68f9182 100644
--- a/Main/System/HeroUI/HeroUIManager.cs
+++ b/Main/System/HeroUI/HeroUIManager.cs
@@ -2,7 +2,6 @@
 using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
-using Jace.Operations;
 using LitJson;
 
 using UnityEngine;
diff --git a/Main/System/Horse/HorseRankUPWin.cs b/Main/System/Horse/HorseRankUPWin.cs
index 0ad3fe1..e21a8db 100644
--- a/Main/System/Horse/HorseRankUPWin.cs
+++ b/Main/System/Horse/HorseRankUPWin.cs
@@ -24,7 +24,7 @@
     [SerializeField] Image costItemImg;
     [SerializeField] Button rankUpBtn;
 
-    
+
     protected override void InitComponent()
     {
         rankUpBtn.AddListener(HorseRankUpgrade);
@@ -35,7 +35,7 @@
         PackManager.Instance.RefreshItemEvent += OnRefreshItemEvent;
         Display();
     }
-    
+
     protected override void OnPreClose()
     {
         PackManager.Instance.RefreshItemEvent -= OnRefreshItemEvent;
@@ -57,8 +57,8 @@
                 var curValue = HorseManager.Instance.attrDic[keys[i]];
                 attrNameTexts[i].text = PlayerPropertyConfig.Get(keys[i]).Name;
                 attrValueTexts[i].text = PlayerPropertyConfig.GetValueDescription(keys[i], curValue, 2);
-                
-                nextAttrValueTexts[i].text = PlayerPropertyConfig.GetValueDescription(keys[i], 
+
+                nextAttrValueTexts[i].text = PlayerPropertyConfig.GetValueDescription(keys[i],
                     curValue + nextConfig.ClassAttrValueList[i] + nextConfig.PerLVAttrValueList[i], 2);
             }
         }
@@ -100,11 +100,18 @@
         var config = HorseClassConfig.Get(HorseManager.Instance.classLV);
         if (!ItemLogicUtility.CheckItemCount(PackType.Item, HorseManager.Instance.rankUPItemID, config.ClassUPItemCnt, 2))
         {
+            TimingGiftManager.Instance.TryAddWhenInsufficient(12, PackType.Item, HorseManager.Instance.rankUPItemID, config.ClassUPItemCnt);
             return;
         }
+
         var pack = new CB202_tagCSHorseClassUP();
         GameNetSystem.Instance.SendInfo(pack);
         CloseWindow();
+        
+        if (!TimingGiftManager.Instance.TryAddWhenExactConsumption(12, PackType.Item, HorseManager.Instance.rankUPItemID, config.ClassUPItemCnt))
+        {
+            TimingGiftManager.Instance.TryAddWithFixedProbabilityWhenSufficient(12, PackType.Item, HorseManager.Instance.rankUPItemID, config.ClassUPItemCnt);
+        }
     }
 
     void OnRefreshItemEvent(PackType type, int index, int itemID)
diff --git a/Main/System/Horse/HorseWin.cs b/Main/System/Horse/HorseWin.cs
index 58e9f7a..4400858 100644
--- a/Main/System/Horse/HorseWin.cs
+++ b/Main/System/Horse/HorseWin.cs
@@ -41,7 +41,7 @@
         });
         lvupBtn.AddListener(HorseUpgrade);
         lvupBtn.onPress.AddListener(HorseUpgrade);
-        quickUpToggle.onValueChanged.AddListener((bool value)=>{ OnToggle(value);});
+        quickUpToggle.onValueChanged.AddListener((bool value) => { OnToggle(value); });
         rankUpBtn.AddListener(HorseRankUpgrade);
     }
 
@@ -83,8 +83,14 @@
         }
 
         if (!ItemLogicUtility.CheckItemCount(PackType.Item, HorseManager.Instance.lvUPItemID, 1, 2))
-        {   
+        {
+            TimingGiftManager.Instance.TryAddWhenInsufficient(12, PackType.Item, HorseManager.Instance.lvUPItemID, isQuick ? GetQuickUseCnt() : 1);
             return;
+        }
+
+        if (!TimingGiftManager.Instance.TryAddWhenExactConsumption(12, PackType.Item, HorseManager.Instance.lvUPItemID, isQuick ? GetQuickUseCnt() : 1))
+        {
+            TimingGiftManager.Instance.TryAddWithFixedProbabilityWhenSufficient(12, PackType.Item, HorseManager.Instance.lvUPItemID, isQuick ? GetQuickUseCnt() : 1);
         }
 
         var pack = new CB201_tagCSHorseLVUP();
@@ -114,7 +120,7 @@
         specialAttrText.text = GetSpecialAttr();
 
         var config = HorseClassConfig.Get(HorseManager.Instance.classLV);
-        lvText.text = Language.Get("Horse8",HorseManager.Instance.classLV, HorseManager.Instance.horseLV);
+        lvText.text = Language.Get("Horse8", HorseManager.Instance.classLV, HorseManager.Instance.horseLV);
         processImg.fillAmount = HorseManager.Instance.exp / (float)config.LVUPItemCnt;
         processText.text = HorseManager.Instance.exp + "/" + config.LVUPItemCnt;
 
@@ -192,9 +198,9 @@
     {
         if (HorseManager.Instance.specialAttrDic.Count == 0)
             return "";
-            
+
         List<string> attrList = new List<string>();
-        foreach(var attrID in HorseManager.Instance.specialAttrDic.Keys)
+        foreach (var attrID in HorseManager.Instance.specialAttrDic.Keys)
         {
             attrList.Add(UIHelper.AppendColor(TextColType.itemchuanqi, PlayerPropertyConfig.GetFullDescription(attrID, HorseManager.Instance.specialAttrDic[attrID])));
         }
@@ -204,20 +210,25 @@
     void OnToggle(bool value)
     {
         LocalSave.SetBool("HorseQuickUp" + PlayerDatas.Instance.baseData.PlayerID, !quickUpToggle.isOn);
-        var config = HorseClassConfig.Get(HorseManager.Instance.classLV);
         var state = HorseManager.Instance.GetHorseState();
         if (state == 0)
         {
-            int useCnt = 1;
-            if (HorseManager.Instance.classLV >= HorseManager.Instance.quickRankLV && quickUpToggle.isOn)
-            {
-                useCnt = config.LVUPItemCnt - HorseManager.Instance.exp;
-            }
+            int useCnt = GetQuickUseCnt();
             costText.text = UIHelper.ShowUseItem(PackType.Item, HorseManager.Instance.lvUPItemID, useCnt);
         }
-
-
     }
+
+    int GetQuickUseCnt()
+    {
+        int useCnt = 1;
+        if (HorseManager.Instance.classLV >= HorseManager.Instance.quickRankLV && quickUpToggle.isOn)
+        {
+            var config = HorseClassConfig.Get(HorseManager.Instance.classLV);
+            useCnt = config.LVUPItemCnt - HorseManager.Instance.exp;
+        }
+        return useCnt;
+    }
+
 
     void PlayerDataRefresh(PlayerDataType type)
     {
@@ -232,7 +243,7 @@
 
 
     }
-    
+
 
     void OnRefreshItemEvent(PackType type, int index, int itemID)
     {
diff --git a/Main/System/InternalAffairs/AffairBaseWin.cs b/Main/System/InternalAffairs/AffairBaseWin.cs
index e1d7be3..b2726f0 100644
--- a/Main/System/InternalAffairs/AffairBaseWin.cs
+++ b/Main/System/InternalAffairs/AffairBaseWin.cs
@@ -119,6 +119,20 @@
             autoBtn.SetActive(false);
             goldRushItemBtn.SetActive(false);
         }
+
+
+        foreach (var npc in funcNPCs)
+        {
+            var key = npc.heroSkinID;
+            if (!FuncOpen.Instance.IsFuncOpen(FuncNPCManager.Instance.funcNPCToFuncID[key]))
+            {
+                npc.SetActive(false);
+            }
+            else
+            {
+                npc.SetActive(true);
+            }
+        }
     }
 
 
@@ -172,8 +186,17 @@
 
     void OnFiveSecondEvent()
     {
-        var index = FuncNPCManager.Instance.GetRandomAffairNpcTalk();
-        var talk = FuncNPCManager.Instance.GetAffairTalk(funcNPCs[index].heroSkinID);
+        var skinID = FuncNPCManager.Instance.GetRandomAffairNpcTalk();
+        var talk = FuncNPCManager.Instance.GetAffairTalk(skinID);
+        var index = 0;
+        for (int i = 0; i < funcNPCs.Length; i++)
+        {
+            if (funcNPCs[i].heroSkinID == skinID)
+            {
+                index = i;
+                break;
+            }
+        }
         if (talk != null)
         {
             talkTexts[index].text = Language.Get(talk);
diff --git a/Main/System/InternalAffairs/FuncNPCManager.cs b/Main/System/InternalAffairs/FuncNPCManager.cs
index 6d482f2..6308d2d 100644
--- a/Main/System/InternalAffairs/FuncNPCManager.cs
+++ b/Main/System/InternalAffairs/FuncNPCManager.cs
@@ -8,6 +8,7 @@
     //鍐呮斂NPC
     Dictionary<int, string[]> affairNpcTalkDic = new Dictionary<int, string[]>();
     public List<int> affairTalkIndexList = new List<int>();
+    public Dictionary<int, int> funcNPCToFuncID = new Dictionary<int, int>();
     public float lastAffairTalkTime;
     public int lastAffiarRandomIndex;
 
@@ -38,10 +39,7 @@
             affairNpcTalkDic.Add(npcID, talkList);
         }
 
-        for (int i = 0; i < affairNpcTalkDic.Count; i++)
-        {
-            affairTalkIndexList.Add(i);
-        }
+
 
         json = JsonMapper.ToObject(config.Numerical2);
         keys = json.Keys.ToList();
@@ -56,19 +54,41 @@
             guildTalkIndexList.Add(i);
         }
 
+        funcNPCToFuncID = ConfigParse.ParseIntDict(config.Numerical3);
+    }
+
+
+    void RefreshAffairTalkIndexList()
+    {
+        affairTalkIndexList.Clear();
+        foreach (var key in affairNpcTalkDic.Keys)
+        {
+            if (!FuncOpen.Instance.IsFuncOpen(funcNPCToFuncID[key]))
+            {
+                continue;
+            }
+            if (funcNPCToFuncID[key] == 54 && MinggeManager.Instance.isStartAuto)
+            {
+                //绠楀懡涓笉鍙備笌鍠婅瘽
+                continue;
+            }
+            affairTalkIndexList.Add(key);
+        }
     }
 
 
     //闅忔満鏌愪釜NPC瀵硅瘽锛屼笌涓婁竴娆¢殢鏈虹殑NPC绱㈠紩涓嶉噸澶�
+    //杩斿洖NPCID
     public int GetRandomAffairNpcTalk()
     {
+        RefreshAffairTalkIndexList();
         int index = Random.Range(0, affairTalkIndexList.Count);
         if (index == lastAffiarRandomIndex)
         {
             index = (index + 1) % affairTalkIndexList.Count;
         }
         lastAffiarRandomIndex = index;
-        return index;
+        return affairTalkIndexList[index];
     }
 
     public int GetRandomGuildNpcTalk()
diff --git a/Main/System/ItemTip/ItemBatchUseWin.cs b/Main/System/ItemTip/ItemBatchUseWin.cs
index cdeb7e4..b5ee930 100644
--- a/Main/System/ItemTip/ItemBatchUseWin.cs
+++ b/Main/System/ItemTip/ItemBatchUseWin.cs
@@ -125,9 +125,14 @@
     void OnOK()
     {
         CloseWindow();
+        if (curUseCount == 0)
+        {
+            SysNotifyMgr.Instance.ShowTip("UseItem1");
+            return;
+        }
         if (ItemLogicUtility.CheckItemCount(PackType.Item, itemID, curUseCount, 2))
         {
-            ItemLogicUtility.Instance.UseItem(PackManager.Instance.GetItemGUIDByID(itemID));
+            ItemLogicUtility.Instance.UseItem(PackManager.Instance.GetItemGUIDByID(itemID), (int)curUseCount);
         }
     }
 }
diff --git a/Main/System/ItemTip/ItemTipWayWin.cs b/Main/System/ItemTip/ItemTipWayWin.cs
index 9d2828d..83e601e 100644
--- a/Main/System/ItemTip/ItemTipWayWin.cs
+++ b/Main/System/ItemTip/ItemTipWayWin.cs
@@ -119,6 +119,17 @@
                     UIManager.Instance.OpenWindow<StoreBaseWin>(1);
                 }
                 break;
+            case 3:
+                if (!TimingGiftManager.Instance.IsShowGiftIdListHasType(int.Parse(way.CustomValue)))
+                {
+                    SysNotifyMgr.Instance.ShowTip("ActivityNoOpen");
+                    return;
+                }
+                if (!UIManager.Instance.IsOpened<TimingGiftWin>())
+                {
+                    UIManager.Instance.OpenWindow<TimingGiftWin>(int.Parse(way.CustomValue));
+                }
+                break;
             case 0:
             default:
                 if (WindowSearchConfig.HasKey(way.WinJumpID))
diff --git a/Main/System/Login/DisconnectHintWin.cs b/Main/System/Login/DisconnectHintWin.cs
index 684a95c..9a5b8c5 100644
--- a/Main/System/Login/DisconnectHintWin.cs
+++ b/Main/System/Login/DisconnectHintWin.cs
@@ -30,12 +30,12 @@
 
     private void Confirm()
     {
+        CloseWindow();
         if (!(StageManager.Instance.currentStage == StageName.Login))
         {
             GameNetSystem.Instance.LoginOut();
         }
 
-        CloseWindow();
     }
 
 
diff --git a/Main/System/Login/LoginWin.cs b/Main/System/Login/LoginWin.cs
index d72f6fb..c844753 100644
--- a/Main/System/Login/LoginWin.cs
+++ b/Main/System/Login/LoginWin.cs
@@ -377,7 +377,8 @@
             return;
         }
 
-        if (GameNetSystem.Instance.netState == GameNetSystem.NetState.NerverConnect)
+        if (GameNetSystem.Instance.netState == GameNetSystem.NetState.NerverConnect ||
+            GameNetSystem.Instance.netState == GameNetSystem.NetState.DisConnected)
         {
             switch (VersionConfig.Get().versionAuthority)
             {
diff --git a/Main/System/Login/ServerForceExitHintWin.cs b/Main/System/Login/ServerForceExitHintWin.cs
index 6d31bd8..82fceb0 100644
--- a/Main/System/Login/ServerForceExitHintWin.cs
+++ b/Main/System/Login/ServerForceExitHintWin.cs
@@ -1,8 +1,4 @@
-锘�
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
+锘縰sing UnityEngine;
 using UnityEngine.UI;
 
 
@@ -39,20 +35,9 @@
     {
         reason = 0;
         CloseWindow();
-        switch (VersionConfig.Get().versionAuthority)
+        if (!(StageManager.Instance.currentStage == StageName.Login))
         {
-            case VersionAuthority.InterTest:
-                GameNotice.OpenGameNotice();
-                break;
-            case VersionAuthority.Release:
-                if (!VersionConfig.Get().isBanShu)
-                {
-                    if (!LoginManager.Instance.sdkLogined)
-                    {
-                        SDKUtils.Instance.FreePlatformLogin();
-                    }
-                }
-                break;
+            GameNetSystem.Instance.LoginOut();
         }
     }
 
diff --git a/Main/System/Main/AutoFightModel.cs b/Main/System/Main/AutoFightModel.cs
index 77415f9..5a97ca6 100644
--- a/Main/System/Main/AutoFightModel.cs
+++ b/Main/System/Main/AutoFightModel.cs
@@ -26,12 +26,16 @@
     {
         get
         {
-            int value = QuickSetting.Instance.GetQuickSettingValue<int>(QuickSettingType.AutoFight_Cost, 0);
-            return Math.Min(Math.Max(value, 1), maxCost);
+            string value = QuickSetting.Instance.GetQuickSetting(QuickSettingType.AutoFight_Cost, 0);
+            // value 鏄�16杩涘埗杞暟瀛�
+            int result = Convert.ToInt32(string.IsNullOrEmpty(value) ? "1" : value, 16);  // 16杩涘埗杞琲nt
+            return Math.Min(Math.Max(result, 1), maxCost);
         }
         set
         {
-            QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_Cost, value);
+            //鏁板瓧value 杞�16杩涘埗
+            string hexValue = Convert.ToString(value, 16);
+            QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_Cost, hexValue, 0);
         }
     }
 
diff --git a/Main/System/Main/HomeWin.cs b/Main/System/Main/HomeWin.cs
index 74c21df..e102de8 100644
--- a/Main/System/Main/HomeWin.cs
+++ b/Main/System/Main/HomeWin.cs
@@ -66,6 +66,7 @@
     [SerializeField] Button osMainLevelBtn;
     [SerializeField] Button osHeroCallBtn;
     [SerializeField] Button osGalaBtn;
+    [SerializeField] TimingGiftCell timingGiftCell;
 
     //鍧愰獞
     [SerializeField] Image horseBGImg;
@@ -267,11 +268,12 @@
         TimeMgr.Instance.OnDayEvent += OnDayEvent;
         ChatManager.Instance.OnUpdateTalkEvent += OnUpdateTalkEvent;
         UIManager.Instance.OnOpenWindow += OnOpenWindow;
+        TimingGiftManager.Instance.OnShowGiftIdListAddEvent += OnShowGiftIdListAddEvent;
         TryPlayAutoFightBoss();
         Display();
         DisplayFirstChargeBtn();
         DisplayOSActivity();
-
+        timingGiftCell.InitUI();
         // var battleWin = UIManager.Instance.OpenWindow<BattleWin>();
         // battleWin.SetBattleField(BattleManager.Instance.storyBattleField);
 
@@ -302,8 +304,14 @@
         TimeMgr.Instance.OnDayEvent -= OnDayEvent;
         ChatManager.Instance.OnUpdateTalkEvent -= OnUpdateTalkEvent;
         UIManager.Instance.OnOpenWindow -= OnOpenWindow;
+        TimingGiftManager.Instance.OnShowGiftIdListAddEvent -= OnShowGiftIdListAddEvent;
         //  鍏抽棴鐨勬椂鍊欐妸鎴樻枟鐣岄潰涔熺粰鍏充簡 铏界劧鏄湪澶栭潰寮�鐨�
         UIManager.Instance.CloseWindow<BattleWin>();
+    }
+
+    private void OnShowGiftIdListAddEvent()
+    {
+        timingGiftCell.InitUI();
     }
 
     private void OnAutoAttackEvent()
@@ -782,6 +790,10 @@
         {
             DisplayDailySpecialsBtn();
         }
+        else if (funcId == (int)FuncOpenEnum.TimingGift)
+        {
+            timingGiftCell.InitUI();
+        }
     }
 
     private void OnUpdateFirstChargeInfo()
diff --git a/Main/System/Message/RichText.cs b/Main/System/Message/RichText.cs
index 9b4fc8f..5bd0ba7 100644
--- a/Main/System/Message/RichText.cs
+++ b/Main/System/Message/RichText.cs
@@ -526,8 +526,26 @@
             {
                 font = FontUtility.preferred;
             }
+
+            // 娣诲姞 null 妫�鏌�
+            if (font == null || rectTransform == null || cachedTextGeneratorForLayout == null || string.IsNullOrEmpty(m_OutputText))
+            {
+                return 0f;
+            }
+
             var settings = GetGenerationSettings(Vector2.zero);
-            return cachedTextGeneratorForLayout.GetPreferredWidth(m_OutputText, settings) / pixelsPerUnit;
+
+            float width = 0f;
+            try
+            {
+                width = cachedTextGeneratorForLayout.GetPreferredWidth(m_OutputText, settings) / pixelsPerUnit;
+            }
+            catch (Exception ex)
+            {
+                Debug.LogError($"GetPreferredWidth failed: {ex.Message}");
+                width = 0f;
+            }
+            return width;
         }
     }
 
@@ -539,9 +557,26 @@
             {
                 font = FontUtility.preferred;
             }
+
+            // 娣诲姞 null 妫�鏌�
+            if (font == null || rectTransform == null || cachedTextGeneratorForLayout == null || string.IsNullOrEmpty(m_OutputText))
+            {
+                return 0f;
+            }
+
             var settings = GetGenerationSettings(new Vector2(rectTransform.rect.size.x, 0.0f));
-            float _height = cachedTextGeneratorForLayout.GetPreferredHeight(m_OutputText, settings) / pixelsPerUnit;
-            return _height;
+
+            float height = 0f;
+            try
+            {
+                height = cachedTextGeneratorForLayout.GetPreferredHeight(m_OutputText, settings) / pixelsPerUnit;
+            }
+            catch (Exception ex)
+            {
+                Debug.LogError($"GetPreferredHeight failed: {ex.Message}");
+                height = 0f;
+            }
+            return height;
         }
     }
     #endregion
@@ -688,6 +723,9 @@
 
     private Dictionary<int, Match> matchDics = new Dictionary<int, Match>();
 
+    // 瀛楃瀹藉害缂撳瓨锛岄伩鍏嶉噸澶嶈绠楃浉鍚屽瓧绗�
+    private Dictionary<string, float> charWidthCache = new Dictionary<string, float>();
+
     private bool IsModifySize(int _index,out int _size)
     {
         _size = 0;
@@ -746,6 +784,14 @@
         {
             font = FontUtility.preferred;
         }
+
+        // 娣诲姞 null 妫�鏌�
+        if (font == null || rectTransform == null || cachedTextGeneratorForLayout == null)
+        {
+            Debug.LogWarning("SetFitterSize: font, rectTransform or cachedTextGeneratorForLayout is null");
+            return;
+        }
+
         var settings = GetGenerationSettings(Vector2.zero);
 
         float cache = 0;
@@ -754,6 +800,7 @@
         float ratio = GetResolutionRatio();
 
         matchDics.Clear();
+        charWidthCache.Clear();
 
         foreach (Match match in ImgAnalysis.Unity_Img_Regex.Matches(fitterText))
         {
@@ -824,7 +871,8 @@
                 }
                 else
                 {
-                    cache = cachedTextGeneratorForLayout.GetPreferredWidth(match.Value, settings) * ratio;
+                    cache = GetCharWidthCached(match.Value, settings, ratio);
+
                     if (width + cache > (rectTransform.rect.width - 5))
                     {
                         CacluHrefAndImgIndex(Mathf.Max(0, i - 1));
@@ -842,19 +890,16 @@
             else
             {
                 var _size = 0;
-                var _cacheFontSize = fontSize;
+                // 涓嶅啀淇敼 fontSize锛屼娇鐢ㄤ复鏃� TextGenerator 璁$畻涓嶅悓瀛楀彿鐨勫搴�
                 if (_modifySize && IsModifySize(i, out _size))
                 {
-                    fontSize = _size;
-                    settings = GetGenerationSettings(Vector2.zero);
-                    cache = cachedTextGeneratorForLayout.GetPreferredWidth(fitterText[i].ToString(), settings) * ratio;
-                    fontSize = _cacheFontSize;
-                    settings = GetGenerationSettings(Vector2.zero);
+                    cache = GetCharWidthWithCustomSize(fitterText[i], _size, ratio);
                 }
                 else
                 {
-                    cache = cachedTextGeneratorForLayout.GetPreferredWidth(fitterText[i].ToString(), settings) * ratio;
+                    cache = GetCharWidthCached(fitterText[i].ToString(), settings, ratio);
                 }
+
                 if (width + cache > (rectTransform.rect.width - 5))
                 {
                     CacluHrefAndImgIndex(Mathf.Max(0, i - 1));
@@ -872,6 +917,65 @@
         m_OutputText = textBuilder.ToString();
     }
 
+    /// <summary>
+    /// 鑾峰彇瀛楃瀹藉害锛堝甫缂撳瓨锛�
+    /// </summary>
+    private float GetCharWidthCached(string charStr, TextGenerationSettings settings, float ratio)
+    {
+        string cacheKey = $"{fontSize}_{charStr}";
+
+        if (charWidthCache.ContainsKey(cacheKey))
+        {
+            return charWidthCache[cacheKey];
+        }
+
+        float width = 0;
+        try
+        {
+            width = cachedTextGeneratorForLayout.GetPreferredWidth(charStr, settings) * ratio;
+        }
+        catch (Exception ex)
+        {
+            Debug.LogError($"GetPreferredWidth failed for '{charStr}': {ex.Message}");
+            width = 0;
+        }
+
+        charWidthCache[cacheKey] = width;
+        return width;
+    }
+
+    /// <summary>
+    /// 浣跨敤鑷畾涔夊瓧鍙疯绠楀瓧绗﹀搴︼紙涓嶄慨鏀瑰師濮� Text 缁勪欢鐨� fontSize锛�
+    /// </summary>
+    private float GetCharWidthWithCustomSize(char c, int customFontSize, float ratio)
+    {
+        string charStr = c.ToString();
+        string cacheKey = $"{customFontSize}_{charStr}";
+
+        if (charWidthCache.ContainsKey(cacheKey))
+        {
+            return charWidthCache[cacheKey];
+        }
+
+        float width = 0;
+        try
+        {
+            // 鍒涘缓涓存椂鐨� TextGenerationSettings锛屼娇鐢ㄨ嚜瀹氫箟瀛楀彿
+            TextGenerationSettings tempSettings = GetGenerationSettings(Vector2.zero);
+            tempSettings.fontSize = customFontSize;
+
+            width = cachedTextGeneratorForLayout.GetPreferredWidth(charStr, tempSettings) * ratio;
+        }
+        catch (Exception ex)
+        {
+            Debug.LogError($"GetPreferredWidth failed for '{charStr}' with fontSize {customFontSize}: {ex.Message}");
+            width = 0;
+        }
+
+        charWidthCache[cacheKey] = width;
+        return width;
+    }
+
     private void CacluHrefAndImgIndex(int index)
     {
         for (int i = 0; i < m_ImgList.Count; i++)
diff --git a/Main/System/Mingge/MinggeManager.cs b/Main/System/Mingge/MinggeManager.cs
index 2376158..9c9ffed 100644
--- a/Main/System/Mingge/MinggeManager.cs
+++ b/Main/System/Mingge/MinggeManager.cs
@@ -441,7 +441,7 @@
             var diffRate = littleRateValue + (bigRateValue - littleRateValue) / (float)(bigValue - littleValue) * (value - littleValue);
             rateList.Add((int)diffRate);
         }
-        
+
         return rateList;
     }
 
@@ -613,7 +613,7 @@
     {
         if (isStart)
         {
-            
+
             bool canStart = false;
             for (int i = 0; i < autoSetList.Count; i++)
             {
@@ -634,11 +634,14 @@
             if (!ItemLogicUtility.CheckItemCount(PackType.Item, tyItemID, useAutoCostCnt, 2))
             {
                 isStartAuto = false;
+                TimingGiftManager.Instance.TryAddWhenInsufficient(6, PackType.Item, tyItemID, useAutoCostCnt);
                 return;
             }
             UIManager.Instance.CloseWindow<MinggeAutoSetWin>();
+            TimingGiftManager.Instance.TryAddWhenExactConsumption(6, PackType.Item, tyItemID, useAutoCostCnt);
+
         }
-        
+
         isStartAuto = isStart;
         if (isStartAuto)
         {
@@ -837,7 +840,7 @@
 
         return deFightAttrOK && fightAttrOK;
     }
-    
+
     bool IsFightPowerOK(ItemModel mgEquip, MinggeAutoSet autoSet)
     {
         long showFightPower = FightPowerManager.Instance.GetFightPowerMinggeChange(mgEquip, autoSet.presetID);
@@ -871,12 +874,16 @@
         {
             isStartAuto = false;
             SysNotifyMgr.Instance.ShowTip("MinggeAuto1");
+            TimingGiftManager.Instance.TryAddWhenInsufficient(6, PackType.Item, tyItemID, useAutoCostCnt);
             return;
         }
+
+        TimingGiftManager.Instance.TryAddWhenExactConsumption(6, PackType.Item, tyItemID, useAutoCostCnt);
+
         autoTYTime = Time.time;
         SendTY(useAutoCostCnt);
-        
-        
+
+
     }
 
     void OnMSEvent()
@@ -1040,5 +1047,5 @@
     }
 
 
-    
+
 }
\ No newline at end of file
diff --git a/Main/System/Mingge/MinggePrayWin.cs b/Main/System/Mingge/MinggePrayWin.cs
index e91f3f9..9b45e73 100644
--- a/Main/System/Mingge/MinggePrayWin.cs
+++ b/Main/System/Mingge/MinggePrayWin.cs
@@ -42,7 +42,7 @@
     {
         MinggeManager.Instance.OnMinggeInfoUpdate -= Display;
     }
-    
+
     public void Display()
     {
         var config = ItemConfig.Get(MinggeManager.Instance.qlItemID);
@@ -98,6 +98,7 @@
         }
         if (!ItemLogicUtility.CheckItemCount(PackType.Item, MinggeManager.Instance.qlItemID, useCnt, 2))
         {
+            TimingGiftManager.Instance.TryAddWhenInsufficient(6, PackType.Item, MinggeManager.Instance.qlItemID, useCnt);
             return;
         }
 
@@ -106,9 +107,14 @@
 
         GameNetSystem.Instance.SendInfo(pack);
         qlEffect.Play();
+        // 濡傛灉姝eソ娑堣�楀畬锛屼笉瑙﹀彂鍥哄畾姒傜巼鐨勫垽瀹�
+        if (!TimingGiftManager.Instance.TryAddWhenExactConsumption(6, PackType.Item, MinggeManager.Instance.qlItemID, useCnt))
+        {
+            TimingGiftManager.Instance.TryAddWithFixedProbabilityWhenSufficient(6, PackType.Item, MinggeManager.Instance.qlItemID, useCnt);
+        }
     }
 
 
-    
+
 }
 
diff --git a/Main/System/Mingge/MinggeWin.cs b/Main/System/Mingge/MinggeWin.cs
index 4666102..5bf1b64 100644
--- a/Main/System/Mingge/MinggeWin.cs
+++ b/Main/System/Mingge/MinggeWin.cs
@@ -64,7 +64,7 @@
         });
 
         autoBtn.AddListener(AutoTY);
-        funPresetBtn.AddListener(()=>
+        funPresetBtn.AddListener(() =>
         {
             FuncPresetManager.Instance.ClickBattlePreset((int)BattlePreSetType.Story);
         });
@@ -72,7 +72,7 @@
 
     protected override void OnPreOpen()
     {
-       
+
         PackManager.Instance.RefreshItemEvent += RefreshItemEvent;
         PackManager.Instance.DeleteItemEvent += DeleteDropItem;
         MinggeManager.Instance.OnMinggeInfoUpdate += OnMinggeInfoUpdate;
@@ -149,7 +149,7 @@
 
         funPresetBtn.SetActive(FuncPresetManager.Instance.IsPreShow());
         ChangeAutoEvent();
-        
+
     }
     void RefreshItemEvent(PackType type, int index, int itemID)
     {
@@ -290,9 +290,16 @@
 
         if (!ItemLogicUtility.CheckItemCount(PackType.Item, MinggeManager.Instance.tyItemID, 1, 2))
         {
+            TimingGiftManager.Instance.TryAddWhenInsufficient(6, PackType.Item, MinggeManager.Instance.tyItemID, 1);
             return;
         }
 
+        // 濡傛灉姝eソ娑堣�楀畬锛屼笉瑙﹀彂鍥哄畾姒傜巼鐨勫垽瀹�
+        if (!TimingGiftManager.Instance.TryAddWhenExactConsumption(6, PackType.Item, MinggeManager.Instance.tyItemID, 1))
+        {
+            TimingGiftManager.Instance.TryAddWithFixedProbabilityWhenSufficient(6, MinggeManager.Instance.tyItemID, 1);
+        }
+
         if (MinggeManager.Instance.isStartAuto)
         {
             MinggeManager.Instance.StartAuto(false);
diff --git a/Main/System/OtherPlayerDetail/OtherPlayerDetailManager.cs b/Main/System/OtherPlayerDetail/OtherPlayerDetailManager.cs
index 14d202c..7223cd5 100644
--- a/Main/System/OtherPlayerDetail/OtherPlayerDetailManager.cs
+++ b/Main/System/OtherPlayerDetail/OtherPlayerDetailManager.cs
@@ -49,8 +49,8 @@
         return viewPlayerData;
     }
 
-    // 鍚戞湇鍔$璇锋眰鍏朵粬鐜╁鏁版嵁
-    public void ViewPlayerDetail(int playerId, int viewType = (int)ViewPlayerType.viewPlayerData, int viewBattlePreSetType = (int)BattlePreSetType.Story)
+    // 鍚戞湇鍔$璇锋眰鍏朵粬鐜╁鏁版嵁 serverID鍙�0榛樿鏈湇鐜╁
+    public void ViewPlayerDetail(int playerId, int serverID, int viewType = (int)ViewPlayerType.viewPlayerData, int viewBattlePreSetType = (int)BattlePreSetType.Story)
     {
         // 鑷繁涓嶈兘鏌ョ湅鑷繁鐨勪俊鎭�
         if (playerId == PlayerDatas.Instance.baseData.PlayerID)
@@ -58,11 +58,11 @@
 
         viewPlayerType = viewType;
         viewPreSetType = viewBattlePreSetType;
-        ViewRoleParticulars(playerId);
+        ViewRoleParticulars(playerId, serverID);
     }
 
     // 鍚戞湇鍔$璇锋眰鐜╁鏁版嵁
-    void ViewRoleParticulars(int playerID)
+    void ViewRoleParticulars(int playerID, int serverID)
     {
         if (playerID <= 0)
             return;
@@ -81,6 +81,7 @@
 
         CA212_tagCMViewPlayerInfo pak = new CA212_tagCMViewPlayerInfo();
         pak.PlayerID = (uint)playerID;
+        pak.ServerID = (uint)serverID;
         GameNetSystem.Instance.SendInfo(pak);
     }
     public void OnRevRoleEquip(HA705_tagSCQueryPlayerCacheResult package)
@@ -110,6 +111,7 @@
         viewPlayerData.FamilyID = (int)package.FamilyID;
         viewPlayerData.FamilyName = UIHelper.ServerStringTrim(package.FamilyName);
         viewPlayerData.FamilyEmblemID = (int)package.FamilyEmblemID;
+        viewPlayerData.FamilyDataServerID = (int)package.FamilyDataServerID;
         viewPlayerData.FamilyEmblemWord = UIHelper.ServerStringTrim(package.FamilyEmblemWord);
 
 
@@ -132,10 +134,11 @@
     {
         if (viewPlayerType == (int)ViewPlayerType.viewPlayerData)
         {
-            if (!UIManager.Instance.IsOpened<OtherPlayerDetailWin>())
+            if (UIManager.Instance.IsOpened<OtherPlayerDetailWin>())
             {
-                UIManager.Instance.OpenWindow<OtherPlayerDetailWin>(viewPreSetType);
+                UIManager.Instance.CloseWindow<OtherPlayerDetailWin>();
             }
+            UIManager.Instance.OpenWindow<OtherPlayerDetailWin>(viewPreSetType);
         }
 
         OnRevPackage?.Invoke(viewPlayerType, playerID);
@@ -402,6 +405,7 @@
         public int ServerID;
         public long FightPower;
         public int FamilyID;
+        public int FamilyDataServerID;  //鍏細鏁版嵁鎵�鍦ㄦ湇鍔″櫒ID锛孉619鏌ョ湅鍏細鐢�
         public string FamilyName;
         public int FamilyEmblemID;
         public string FamilyEmblemWord;
diff --git a/Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs b/Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs
index 86fc9e7..5334d56 100644
--- a/Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs
+++ b/Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs
@@ -50,24 +50,24 @@
 
     protected override void OnPreOpen()
     {
-        GuildManager.Instance.OnRefreshFairyList += OnRefreshFairyList;
+        GuildManager.Instance.OnUpdateViewFamilyInfo += OnUpdateViewFamilyInfo;
         funcPresetID = OtherPlayerDetailManager.Instance.GetFuncPresetID(manager.viewPlayer, functionOrder, (int)FuncPresetType.Global);
         Display();
     }
 
     protected override void OnPreClose()
     {
-        GuildManager.Instance.OnRefreshFairyList -= OnRefreshFairyList;
+        GuildManager.Instance.OnUpdateViewFamilyInfo -= OnUpdateViewFamilyInfo;
     }
 
-    private void OnRefreshFairyList()
+    private void OnUpdateViewFamilyInfo()
     {
         if (viewPlayerData == null)
         {
             return;
         }
 
-        if (!GuildManager.Instance.guildsDict.ContainsKey(viewPlayerData.FamilyID))
+        if (!GuildManager.Instance.viewGuildsDict.ContainsKey(viewPlayerData.FamilyID))
         {
             return;
         }
@@ -268,7 +268,7 @@
             SysNotifyMgr.Instance.ShowTip("GuildTip01");
             return;
         }
-        GuildManager.Instance.SendFindGuildNoDecrypt(viewPlayerData.FamilyID.ToString());
+        GuildManager.Instance.SendViewGuild(viewPlayerData.FamilyID, viewPlayerData.FamilyDataServerID);
     }
 
     private void OnClickMM()
diff --git a/Main/System/PhantasmPavilion/AvatarCell.cs b/Main/System/PhantasmPavilion/AvatarCell.cs
index c76f52e..43edb69 100644
--- a/Main/System/PhantasmPavilion/AvatarCell.cs
+++ b/Main/System/PhantasmPavilion/AvatarCell.cs
@@ -247,7 +247,7 @@
             {
                 return;
             }
-            AvatarHelper.TryViewOtherPlayerInfo(avatarModel.playerID, (int)ViewPlayerType.viewPlayerData);
+            AvatarHelper.TryViewOtherPlayerInfo(avatarModel.playerID);
         });
     }
 
diff --git a/Main/System/PhantasmPavilion/AvatarHelper.cs b/Main/System/PhantasmPavilion/AvatarHelper.cs
index 6c6b7c6..b2c7411 100644
--- a/Main/System/PhantasmPavilion/AvatarHelper.cs
+++ b/Main/System/PhantasmPavilion/AvatarHelper.cs
@@ -2,13 +2,13 @@
 
 public static class AvatarHelper
 {
-    public static void TryViewOtherPlayerInfo(int _playerId, int viewType = (int)ViewPlayerType.viewPlayerData, int viewPlayerLineupType = (int)BattlePreSetType.Story)
+    //serverID鍙�0榛樿鏈湇鐜╁
+    public static void TryViewOtherPlayerInfo(int playerId, int serverID = 0, int viewType = (int)ViewPlayerType.viewPlayerData, int viewPlayerLineupType = (int)BattlePreSetType.Story)
     {
-        if (_playerId == PlayerDatas.Instance.PlayerId || UIManager.Instance.IsOpened<OtherPlayerDetailWin>())
+        if (playerId == PlayerDatas.Instance.PlayerId || UIManager.Instance.IsOpened<OtherPlayerDetailWin>())
             return;
-        OtherPlayerDetailManager.Instance.ViewPlayerDetail(_playerId, viewType, viewPlayerLineupType);
+        OtherPlayerDetailManager.Instance.ViewPlayerDetail(playerId, serverID, viewType, viewPlayerLineupType);
     }
-
     public static AvatarModel GetAvatarModel(int playerId, int face, int facePic, int job = 0)
     {
         bool isMyself = playerId == PlayerDatas.Instance.PlayerId;
diff --git a/Main/System/TimingGift.meta b/Main/System/TimingGift.meta
new file mode 100644
index 0000000..c03bf1f
--- /dev/null
+++ b/Main/System/TimingGift.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 12fd399fb4ee8f145bbe14cb76a38d03
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/TimingGift/SettingDataManager.cs b/Main/System/TimingGift/SettingDataManager.cs
new file mode 100644
index 0000000..8284c1f
--- /dev/null
+++ b/Main/System/TimingGift/SettingDataManager.cs
@@ -0,0 +1,75 @@
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+public class SettingDataManager : GameSystemManager<SettingDataManager>
+{
+    public override void Init()
+    {
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitializeEventOnRelogin;
+    }
+
+    public override void Release()
+    {
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitializeEventOnRelogin;
+    }
+
+    private void OnBeforePlayerDataInitializeEventOnRelogin()
+    {
+        settingDataDict.Clear();
+    }
+
+    public event Action OnUpdateSettingDataEvent;
+    Dictionary<int, string> settingDataDict = new Dictionary<int, string>();
+
+    public bool TryGetSettingData(int keyNum, out string setData)
+    {
+        return settingDataDict.TryGetValue(keyNum, out setData);
+    }
+
+    public Dictionary<int, string> GetSettingData()
+    {
+        return settingDataDict;
+    }
+
+    public void UpdateSettingData(HA131_tagSCSettingDataInfo pack)
+    {
+        if (pack == null || pack.SettingDataList.IsNullOrEmpty())
+            return;
+        for (int i = 0; i < pack.SettingDataList.Length; i++)
+        {
+            var info = pack.SettingDataList[i];
+            settingDataDict[info.KeyNum] = info.SetData;
+        }
+        OnUpdateSettingDataEvent?.Invoke();
+    }
+
+    public void ClearSettingData(int keyNum)
+    {
+        SendSettingData(keyNum, string.Empty);
+    }
+
+    public void SendSettingData(SettingDataKeyNum keyNum, string setData)
+    {
+        SendSettingData((int)keyNum, setData);
+    }
+
+    public void SendSettingData(int keyNum, string setData)
+    {
+        // 妫�鏌ユ暟鎹暱搴︽槸鍚﹁秴杩嘼yte鏈�澶у��
+        if (setData.Length > byte.MaxValue)
+        {
+            Debug.LogError($"璁剧疆鏁版嵁闀垮害({setData.Length})瓒呰繃byte鏈�澶у��({byte.MaxValue})");
+            return;
+        }
+        CA131_tagCSSettingData pack = new CA131_tagCSSettingData();
+        pack.KeyNum = (byte)keyNum;
+        pack.SetData = setData;
+        pack.DataLen = (byte)setData.Length;
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
+}
+public enum SettingDataKeyNum
+{
+    TimingGiftType = 1,
+}
\ No newline at end of file
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/System/TimingGift/SettingDataManager.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
copy to Main/System/TimingGift/SettingDataManager.cs.meta
index 4c9b26c..0d17e9d 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/System/TimingGift/SettingDataManager.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: 11efe5307ce944149977d11036bcd76a
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/TimingGift/TimingGiftAwardCell.cs b/Main/System/TimingGift/TimingGiftAwardCell.cs
new file mode 100644
index 0000000..ac56751
--- /dev/null
+++ b/Main/System/TimingGift/TimingGiftAwardCell.cs
@@ -0,0 +1,20 @@
+using UnityEngine;
+
+public class TimingGiftAwardCell : MonoBehaviour
+{
+    [SerializeField] ItemCell itemCell;
+    TimingGiftManager manager { get { return TimingGiftManager.Instance; } }
+    public void Display(int index, int[][] gainItemList)
+    {
+        if (gainItemList.IsNullOrEmpty() || index < 0 || index >= gainItemList.Length)
+            return;
+        int itemId = gainItemList[index][0];
+        int count = gainItemList[index][1];
+        itemCell.Init(new ItemCellModel(itemId, false, count));
+        itemCell.button.SetListener(() => { ItemTipUtility.Show(itemId); });
+    }
+}
+
+
+
+
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/System/TimingGift/TimingGiftAwardCell.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
copy to Main/System/TimingGift/TimingGiftAwardCell.cs.meta
index 4c9b26c..1555795 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/System/TimingGift/TimingGiftAwardCell.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: 9282d2427d5b8f349a85e3e53c6e92e6
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/TimingGift/TimingGiftCell.cs b/Main/System/TimingGift/TimingGiftCell.cs
new file mode 100644
index 0000000..25be424
--- /dev/null
+++ b/Main/System/TimingGift/TimingGiftCell.cs
@@ -0,0 +1,137 @@
+using UnityEngine;
+
+public class TimingGiftCell : MonoBehaviour
+{
+    private void Awake()
+    {
+        //濡傛灉鏈夐渶瑕佹寜閽偣鍑婚�昏緫锛屽湪澶栧眰鍒涘缓锛屾澶勪笉澶勭悊鐐瑰嚮閫昏緫
+        LoadPrefab();
+        button.SetListener(() =>
+        {
+            UIManager.Instance.OpenWindow<TimingGiftWin>(type);
+        });
+    }
+
+    ButtonEx m_button;
+    public ButtonEx button
+    {
+        get
+        {
+            if (m_button == null)
+            {
+                m_button = this.GetComponent<ButtonEx>("TimingGiftCell");
+            }
+            return m_button;
+        }
+    }
+
+    TextEx m_Time;
+    private TextEx time
+    {
+        get
+        {
+            if (m_Time == null)
+            {
+                m_Time = this.GetComponent<TextEx>("TimingGiftCell/bgImage/timeImage/timeText");
+            }
+            return m_Time;
+        }
+    }
+
+    public int type;
+    GameObject prefab;
+    TimingGiftManager manager { get { return TimingGiftManager.Instance; } }
+    void OnEnable()
+    {
+        FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
+        manager.OnShowGiftIdListAddEvent += OnShowGiftIdListAddEvent;
+        manager.OnRemoveExpiredEvent += OnRemoveExpiredEvent;
+        GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
+    }
+
+    void OnDisable()
+    {
+        FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
+        manager.OnShowGiftIdListAddEvent -= OnShowGiftIdListAddEvent;
+        manager.OnRemoveExpiredEvent -= OnRemoveExpiredEvent;
+        GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
+    }
+
+    private void OnFuncStateChangeEvent(int obj)
+    {
+        if (obj == (int)FuncOpenEnum.TimingGift)
+        {
+            Display();
+        }
+    }
+
+    private void OnSecondEvent()
+    {
+        Display();
+    }
+
+    private void OnShowGiftIdListAddEvent()
+    {
+        Display();
+    }
+    private void OnRemoveExpiredEvent()
+    {
+        Display();
+    }
+
+    public void Display()
+    {
+        //閰�0鏃舵槸涓荤晫闈㈠叆鍙�
+        if (type == 0)
+        {
+            var list = manager.GetCurrectTimingGiftIdList();
+            bool isNullOrEmpty = list.IsNullOrEmpty();
+            this.SetActive(!isNullOrEmpty);
+            if (isNullOrEmpty)
+                return;
+            int id = list[0];
+            if (!TimingGiftConfig.TryGetTimingGiftConfig(id, out var config))
+                return;
+            RefreshTime(config.GiftType);
+            return;
+        }
+        RefreshTime(type);
+    }
+
+    private void RefreshTime(int type)
+    {
+        bool isShow = manager.IsShowGiftIdListHasType(type);
+        this.SetActive(isShow);
+        if (isShow)
+        {
+            int times = manager.GetRemainingSecondsByType(type);
+            time.text = times <= 0 ? Language.Get("TimingGift04") : TimeUtility.SecondsToHMS(times);
+            time.colorType = times <= 0 ? TextColType.Red : TextColType.LightGreen;
+        }
+    }
+
+    protected void LoadPrefab()
+    {
+        if (prefab != null)
+            return;
+        var tmp = transform.Find("TimingGiftCell");
+
+        if (tmp != null)
+        {
+            prefab = tmp.gameObject;
+            return;
+        }
+        prefab = UIUtility.CreateWidget("TimingGiftCell", "TimingGiftCell");
+
+        prefab.transform.SetParentEx(this.transform, Vector3.zero, Quaternion.identity, Vector3.one);
+        prefab.transform.SetAsFirstSibling();
+
+    }
+
+    public void InitUI()
+    {
+        LoadPrefab();   //瀛樺湪琚嵏杞界殑鍙兘锛岄噸鏂板姞杞�
+        Display();
+    }
+
+}
\ No newline at end of file
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/System/TimingGift/TimingGiftCell.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
copy to Main/System/TimingGift/TimingGiftCell.cs.meta
index 4c9b26c..c16e65a 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/System/TimingGift/TimingGiftCell.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: 92affed6278f93648a3e7bff0e3f1eb8
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/TimingGift/TimingGiftCtgIdCell.cs b/Main/System/TimingGift/TimingGiftCtgIdCell.cs
new file mode 100644
index 0000000..6ec54b3
--- /dev/null
+++ b/Main/System/TimingGift/TimingGiftCtgIdCell.cs
@@ -0,0 +1,35 @@
+using UnityEngine;
+
+public class TimingGiftCtgIdCell : MonoBehaviour
+{
+    [SerializeField] TextEx moneyText;
+    [SerializeField] ButtonEx moneyButton;
+    [SerializeField] ImageEx tabIcon;
+    TimingGiftManager manager { get { return TimingGiftManager.Instance; } }
+    public void Display(int index, int[] ctgIds)
+    {
+        if (ctgIds.IsNullOrEmpty() || index < 0 || index >= ctgIds.Length)
+            return;
+        int ctgId = ctgIds[index];
+        if (!RechargeManager.Instance.TryGetOrderInfo(ctgId, out var orderInfoConfig))
+            return;
+        moneyText.text = Language.Get("PayMoneyNum", orderInfoConfig.PayRMBNumOnSale);
+
+        bool isChoose = manager.selectCtgIdIndex == index;
+        tabIcon.SetSprite(isChoose ? "TimingGiftTab2_Select" : "TimingGiftTab2_UnSelect");
+        moneyButton.SetListener(() =>
+        {
+            manager.selectCtgId = ctgId;
+            if (!CTGConfig.HasKey(manager.selectCtgId))
+                return;
+            CTGConfig ctgConfig = CTGConfig.Get(manager.selectCtgId);
+            manager.selectGainItemList = ctgConfig.GainItemList;
+            manager.selectCtgIdIndex = index;
+
+        });
+    }
+}
+
+
+
+
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/System/TimingGift/TimingGiftCtgIdCell.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
copy to Main/System/TimingGift/TimingGiftCtgIdCell.cs.meta
index 4c9b26c..a99c7f5 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/System/TimingGift/TimingGiftCtgIdCell.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: 755ed8982ee993644bfabedf48f2b80a
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/TimingGift/TimingGiftManager.cs b/Main/System/TimingGift/TimingGiftManager.cs
new file mode 100644
index 0000000..220ffcc
--- /dev/null
+++ b/Main/System/TimingGift/TimingGiftManager.cs
@@ -0,0 +1,530 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using LitJson;
+using UnityEngine;
+public class TimingGiftManager : GameSystemManager<TimingGiftManager>
+{
+
+    private int m_selectTabIndex;
+    public int selectTabIndex
+    {
+        get { return m_selectTabIndex; }
+        set
+        {
+            if (m_selectTabIndex == value)
+                return;
+            m_selectTabIndex = value;
+            OnSelectTabIndexChangeEvent?.Invoke();
+        }
+    }
+    public int selectTabGiftId;
+    public event Action OnSelectTabIndexChangeEvent;
+
+    private int m_selectCtgIdIndex;
+    public int selectCtgIdIndex
+    {
+        get { return m_selectCtgIdIndex; }
+        set
+        {
+            if (m_selectCtgIdIndex == value)
+                return;
+            m_selectCtgIdIndex = value;
+            OnSelectCtgIdIndexChangeEvent?.Invoke();
+        }
+    }
+    public int selectCtgId;
+
+    public int[] selectCtgIds;
+    public int[][] selectGainItemList;
+    public event Action OnSelectCtgIdIndexChangeEvent;
+
+    public bool isLogShow = true;
+    public override void Init()
+    {
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitializeEventOnRelogin;
+        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOk;
+        GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
+    }
+
+    public override void Release()
+    {
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitializeEventOnRelogin;
+        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOk;
+        GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
+    }
+
+
+
+    private void OnBeforePlayerDataInitializeEventOnRelogin()
+    {
+        showGiftIdList.Clear();
+        lastTriggerTimeDict.Clear();
+
+    }
+
+    private void OnPlayerLoginOk()
+    {
+        LoadData();
+    }
+
+    private void OnSecondEvent()
+    {
+        RemoveExpired();
+    }
+
+    public Color32 GetColor32(int[] colorArr)
+    {
+        if (colorArr == null || colorArr.Length < 3)
+            return Color.white;
+        return new Color32()
+        {
+            r = (byte)(colorArr.Length > 0 ? colorArr[0] : 0),
+            g = (byte)(colorArr.Length > 1 ? colorArr[1] : 0),
+            b = (byte)(colorArr.Length > 2 ? colorArr[2] : 0),
+            a = (byte)(colorArr.Length > 3 ? colorArr[3] : 255),
+        };
+    }
+
+    public static bool TryGetTimingGiftTypeConfig(int giftType, out TimingGiftTypeConfig config)
+    {
+        config = null;
+        if (!TimingGiftTypeConfig.HasKey(giftType))
+            return false;
+        config = TimingGiftTypeConfig.Get(giftType);
+        return true;
+    }
+
+    public bool IsBuy(int ctgId)
+    {
+        if (!CTGConfig.HasKey(ctgId))
+            return false;
+        CTGConfig ctgConfig = CTGConfig.Get(ctgId);
+        bool hasRechargeCount = RechargeManager.Instance.TryGetRechargeCount(ctgId, out RechargeCount _rechargeCount);
+        bool isBuy = hasRechargeCount && _rechargeCount.todayCount >= ctgConfig.DailyBuyCount;
+        return isBuy;
+    }
+
+    public bool IsListHasIndex(int index, List<int> list)
+    {
+        return list != null && index >= 0 && index < list.Count;
+    }
+
+    public int GetListValue(int index, List<int> list)
+    {
+        return IsListHasIndex(index, list) ? list[index] : 0;
+    }
+
+    public bool IsArrHasIndex(int index, int[] arr)
+    {
+        return arr != null && index >= 0 && index < arr.Length;
+    }
+
+    public int GetArrValue(int index, int[] arr)
+    {
+        return IsArrHasIndex(index, arr) ? arr[index] : 0;
+    }
+
+    public void OpenTimingGiftWin(int type)
+    {
+        if (!UIManager.Instance.IsOpened<TimingGiftWin>())
+        {
+            UIManager.Instance.OpenWindow<TimingGiftWin>(type);
+        }
+    }
+
+    List<int> showGiftIdList = new List<int>();
+
+    public event Action OnShowGiftIdListAddEvent;
+
+    public bool IsShowGiftIdListHasType(int type)
+    {
+        if (showGiftIdList.IsNullOrEmpty())
+            return false;
+        for (int i = 0; i < showGiftIdList.Count; i++)
+        {
+            int id = showGiftIdList[i];
+            if (TimingGiftConfig.TryGetTimingGiftConfig(id, out TimingGiftConfig config) && config.GiftType == type)
+                return true;
+        }
+        return false;
+    }
+
+    public List<int> GetCurrectTimingGiftIdList(bool isSort = false)
+    {
+        if (isSort)
+        {
+            // 鎸夊墿浣欐椂闂村皯鐨勬帓搴忛潬鍓�
+            showGiftIdList.Sort((a, b) =>
+            {
+                int remainingSecondsA = GetRemainingSeconds(a);
+                int remainingSecondsB = GetRemainingSeconds(b);
+                return remainingSecondsA.CompareTo(remainingSecondsB);
+            });
+        }
+        return showGiftIdList;
+    }
+
+    public void TryAdd(int type)
+    {
+
+        if (NewBieCenter.Instance.inGuiding)
+        {
+#if UNITY_EDITOR
+            if (isLogShow)
+            {
+                Debug.Log($"[TimingGift] TryPop:瑙﹀彂Return,姝e湪寮曞涓�");
+            }
+#endif
+            return;
+        }
+
+        if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.TimingGift))
+        {
+
+#if UNITY_EDITOR
+            if (isLogShow)
+            {
+                Debug.Log($"[TimingGift] TryPop:瑙﹀彂Return,鏃舵満绀煎寘鍔熻兘鏈紑鍚�");
+            }
+#endif
+            return;
+        }
+
+        if (!IsTodayUnlimited(type))
+        {
+#if UNITY_EDITOR
+            if (isLogShow)
+            {
+                int lastTriggerTime = lastTriggerTimeDict[type];
+                DateTime lastTime = TimeUtility.GetTime((uint)lastTriggerTime);
+                Debug.Log($"[TimingGift] TryPop:瑙﹀彂Return,浠婂ぉ宸插脊鍑鸿繃{type}绫诲瀷鐨勭ぜ鍖咃紝璇ョ被鍨嬩笂娆″脊鍑烘椂闂翠负{lastTime:yyyy-MM-dd HH:mm:ss}");
+            }
+#endif
+            return;
+        }
+
+        if (!TimingGiftConfig.TryGetTypeToGiftIdList(type, out List<int> giftIdList))
+        {
+#if UNITY_EDITOR
+            if (isLogShow)
+            {
+                Debug.Log($"[TimingGift] TryPop:瑙﹀彂Return,琛ㄦ牸涓病鏈夋壘鍒皗type}绫诲瀷鐨勭ぜ鍖匢D");
+            }
+#endif
+            return;
+        }
+
+        bool isChange = false;
+        for (int i = 0; i < giftIdList.Count; i++)
+        {
+            int id = giftIdList[i];
+            if (!TimingGiftConfig.TryGetTimingGiftConfig(id, out TimingGiftConfig config))
+                continue;
+            if (showGiftIdList.Contains(id))
+                continue;
+            isChange = true;
+            showGiftIdList.Add(id);
+            lastTriggerTimeDict[id] = TimeUtility.AllSeconds;
+        }
+
+        if (isChange)
+        {
+            SaveData();
+            OpenTimingGiftWin(type);
+            OnShowGiftIdListAddEvent?.Invoke();
+        }
+
+    }
+
+    public event Action OnRemoveExpiredEvent;
+    public void RemoveExpired()
+    {
+        if (showGiftIdList.IsNullOrEmpty())
+            return;
+        bool isChange = false;
+
+        // 浣跨敤鍊掑簭閬嶅巻锛岄伩鍏嶇Щ闄ゅ厓绱犳椂绱㈠紩閿欎綅
+        for (int i = showGiftIdList.Count - 1; i >= 0; i--)
+        {
+            int id = showGiftIdList[i];
+            // 宸茬粡杩囨湡鐨勭Щ闄�
+            if (IsExpired(id))
+            {
+                isChange = true;
+                showGiftIdList.RemoveAt(i);
+            }
+        }
+
+        if (isChange)
+        {
+#if UNITY_EDITOR
+            if (isLogShow)
+            {
+                Debug.Log($"[TimingGift] RemoveExpired:瑙﹀彂绉婚櫎杩囨湡绀煎寘,褰撳墠鏈夋椂鏁堢殑giftID鍒楄〃涓篬{string.Join(", ", showGiftIdList)}]");
+            }
+#endif
+            OnRemoveExpiredEvent?.Invoke();
+        }
+    }
+
+    //瑙﹀彂绫诲瀷 涓婃瑙﹀彂鏃堕棿
+    Dictionary<int, int> lastTriggerTimeDict = new Dictionary<int, int>();
+    public bool TryGetLastTriggerTime(int type, out int lastTriggerTime)
+    {
+        return lastTriggerTimeDict.TryGetValue(type, out lastTriggerTime);
+    }
+
+    public bool IsExpired(int id)
+    {
+        return GetRemainingSeconds(id) <= 0;
+    }
+
+    public int GetRemainingSecondsByType(int type)
+    {
+        if (!TryGetLastTriggerTime(type, out int lastTriggerTime))
+            return 0;
+        if (!TryGetTimingGiftTypeConfig(type, out TimingGiftTypeConfig typeConfig))
+            return 0;
+
+        // 璁$畻鍓╀綑绉掓暟
+        DateTime lastTime = TimeUtility.GetTime((uint)lastTriggerTime);
+        DateTime nowTime = TimeUtility.ServerNow;
+        double elapsedSeconds = (nowTime - lastTime).TotalSeconds;
+        int remainingSeconds = (int)(typeConfig.Duration - elapsedSeconds);
+
+        return remainingSeconds;
+    }
+
+    public int GetRemainingSeconds(int id)
+    {
+        if (!TimingGiftConfig.TryGetTimingGiftConfig(id, out TimingGiftConfig config))
+            return 0;
+        int type = config.GiftType;
+        return GetRemainingSecondsByType(type);
+    }
+
+    // 鍒ゆ柇鎸囧畾type鐨勭ぜ鍖呬粖鏃ユ槸鍚︿笉闄愬脊鍑�
+    // true:浠婃棩涓嶉檺寮瑰嚭 false:浠婃棩宸插脊鍑鸿繃
+    public bool IsTodayUnlimited(int type)
+    {
+        // 娌℃湁瑙﹀彂璁板綍锛岃鏄庤繕娌″脊鍑鸿繃
+        if (!TryGetLastTriggerTime(type, out int lastTriggerTime))
+            return true;
+
+        // 濡傛灉涓婃瑙﹀彂鏃堕棿鍦ㄤ粖澶�0鐐逛箣鍓嶏紝璇存槑浠婂ぉ杩樻病寮瑰嚭杩�
+        int todayStartTick = TimeUtility.GetTodayStartTick();
+        return lastTriggerTime < todayStartTick;
+    }
+
+    private bool IsTriggle(int type)
+    {
+        if (!TryGetTimingGiftTypeConfig(type, out TimingGiftTypeConfig config))
+        {
+#if UNITY_EDITOR
+            if (isLogShow)
+            {
+                Debug.Log($"[TimingGift] IsTriggle:鏈壘鍒皗type}绫诲瀷鐨凾riggleChangeRate閰嶇疆");
+            }
+#endif
+            return false;
+        }
+
+        int rangeNum = UnityEngine.Random.Range(0, 100);
+        bool res = rangeNum < config.TriggleChangeRate;
+#if UNITY_EDITOR
+        if (isLogShow)
+        {
+            Debug.Log($"[TimingGift] IsTriggle:鍒ゅ畾鍥哄畾姒傜巼锛岀粨鏋�={res}, type={type}, rangeNum={rangeNum}, TriggleChangeRate={config.TriggleChangeRate}");
+        }
+#endif
+        return res;
+
+    }
+
+
+
+    #region 绀煎寘寮瑰嚭鏉′欢
+
+    /// <summary>
+    /// 浣跨敤瀹屽箍鍛婃鏁版椂寮瑰嚭
+    /// </summary>
+    public bool TryAddWhenAllAdsUsed(int type, int adId)
+    {
+        if (!ADAwardConfig.HasKey(adId))
+            return false;
+        ADAwardConfig config = ADAwardConfig.Get(adId);
+        int maxCount = config.ADCntMax;
+        int haveCount = AdsManager.Instance.GetADCntByADID(adId) + 1;
+        TryAddWhenAllAdsUsed(type, haveCount, maxCount);
+        return true;
+    }
+
+    /// <summary>
+    /// 浣跨敤瀹屽箍鍛婃鏁版椂寮瑰嚭
+    /// </summary>
+    public bool TryAddWhenAllAdsUsed(int type, int haveCount, int maxCount)
+    {
+        if (maxCount == haveCount)
+        {
+            TryAdd(type);
+            return true;
+        }
+        return false;
+    }
+
+    /// <summary>
+    /// 鏁伴噺涓嶈冻鏃跺繀寮瑰嚭
+    /// </summary>
+    public bool TryAddWhenInsufficient(int type, PackType packType, int itemId, long needCount)
+    {
+        var haveCount = PackManager.Instance.GetItemCountByID(packType, itemId);
+        return TryAddWhenInsufficient(type, haveCount, needCount);
+    }
+
+    /// <summary>
+    /// 鏁伴噺涓嶈冻鏃跺繀寮瑰嚭
+    /// </summary>
+    public bool TryAddWhenInsufficient(int type, long haveCount, long needCount)
+    {
+        // 闇�瑕�0涓椂蹇呭脊
+        if (needCount <= 0)
+        {
+            TryAdd(type);
+            return true;
+        }
+
+        bool isEnough = haveCount >= needCount;
+
+        // 涓嶈冻鏃跺繀寮�
+        if (!isEnough)
+        {
+            TryAdd(type);
+            return true;
+        }
+        return false;
+    }
+
+    /// <summary>
+    /// 鏁伴噺姝eソ娑堣�楀畬鏃跺繀寮瑰嚭
+    /// </summary>
+    public bool TryAddWhenExactConsumption(int type, PackType packType, int itemId, long needCount)
+    {
+        var haveCount = PackManager.Instance.GetItemCountByID(packType, itemId);
+        return TryAddWhenExactConsumption(type, haveCount, needCount);
+    }
+
+    /// <summary>
+    /// 鏁伴噺姝eソ娑堣�楀畬鏃跺繀寮瑰嚭
+    /// </summary>
+    public bool TryAddWhenExactConsumption(int type, long haveCount, long needCount)
+    {
+        // 闇�瑕�0涓椂蹇呭脊
+        if (needCount <= 0)
+        {
+            TryAdd(type);
+            return true;
+        }
+
+        //姝eソ娑堣�楀畬x鏃跺繀寮�
+        if (haveCount - needCount == 0)
+        {
+            TryAdd(type);
+            return true;
+        }
+        return false;
+    }
+    /// <summary>
+    /// 鍏呰冻鏃跺浐瀹氭鐜囧脊鍑�
+    /// </summary>
+    public bool TryAddWithFixedProbabilityWhenSufficient(int type, PackType packType, int itemId, long needCount)
+    {
+        var haveCount = PackManager.Instance.GetItemCountByID(packType, itemId);
+        return TryAddWithFixedProbabilityWhenSufficient(type, haveCount, needCount);
+    }
+
+    /// <summary>
+    /// 鍏呰冻鏃跺浐瀹氭鐜囧脊鍑�
+    /// </summary>
+    public bool TryAddWithFixedProbabilityWhenSufficient(int type, long haveCount, long needCount)
+    {
+        bool isEnough = haveCount >= needCount;
+        if (!isEnough)
+        {
+            return false;
+        }
+
+        bool isTriggle = IsTriggle(type);
+        if (isTriggle)
+        {
+            TryAdd(type);
+            return true;
+        }
+        return false;
+    }
+
+    #endregion
+    #region 鏁版嵁淇濆瓨
+    private void LoadData()
+    {
+        lastTriggerTimeDict.Clear();
+
+        if (!SettingDataManager.Instance.TryGetSettingData((int)SettingDataKeyNum.TimingGiftType, out string data))
+            return;
+        // 浣跨敤 LocalSave 璇诲彇 JSON 瀛楃涓�
+        if (string.IsNullOrEmpty(data) || data == "{}")
+            return;
+        Dictionary<int, int> loadDict = ConfigParse.ParseIntDict(data);
+        if (loadDict == null)
+            return;
+
+        lastTriggerTimeDict = loadDict;
+        InitCurrectTimingGiftIdList(new List<int>(loadDict.Keys));
+        
+#if UNITY_EDITOR
+        if (isLogShow)
+        {
+            Debug.Log($"[TimingGift] LoadData:褰撳墠鏈夋椂鏁堢殑giftID鍒楄〃涓�: [{string.Join(", ", showGiftIdList)}]\n褰撳墠瑙﹀彂鏃堕棿瀛楀吀鍐呭:\n{string.Join("\n", lastTriggerTimeDict.Select(kv => $"  绫诲瀷{kv.Key}: {TimeUtility.GetTime((uint)kv.Value):yyyy-MM-dd HH:mm:ss}"))}");
+        }
+#endif
+    }
+
+    private void SaveData()
+    {
+        string jsonStr = JsonMapper.ToJson(lastTriggerTimeDict);
+        SettingDataManager.Instance.SendSettingData(SettingDataKeyNum.TimingGiftType, jsonStr);
+#if UNITY_EDITOR
+        if (isLogShow)
+        {
+            Debug.Log($"[TimingGift] SaveData:褰撳墠鏈夋椂鏁堢殑giftID鍒楄〃涓�: [{string.Join(", ", showGiftIdList)}]\n淇濆瓨鐨勮Е鍙戞椂闂村瓧鍏稿唴瀹�:\n{string.Join("\n", lastTriggerTimeDict.Select(kv => $"  绫诲瀷{kv.Key}: {TimeUtility.GetTime((uint)kv.Value):yyyy-MM-dd HH:mm:ss}"))}");
+        }
+#endif
+    }
+
+    public void InitCurrectTimingGiftIdList(List<int> list)
+    {
+        if (list == null)
+            return;
+        for (int i = 0; i < list.Count; i++)
+        {
+            int type = list[i];
+            if (!TimingGiftConfig.TryGetTypeToGiftIdList(type, out List<int> giftIdList))
+                continue;
+            for (int j = 0; j < giftIdList.Count; j++)
+            {
+                // 琛ㄤ腑娌℃湁鐨勪笉澶勭悊
+                if (!TimingGiftConfig.TryGetTimingGiftConfig(type, out TimingGiftConfig config))
+                    continue;
+                // 宸茬粡杩囨湡鐨勪笉澶勭悊
+                if (IsExpired(type))
+                    continue;
+                // 閲嶅鐨勪笉澶勭悊
+                if (showGiftIdList.Contains(type))
+                    continue;
+                showGiftIdList.Add(type);
+            }
+        }
+    }
+    #endregion
+
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/System/TimingGift/TimingGiftManager.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
copy to Main/System/TimingGift/TimingGiftManager.cs.meta
index 4c9b26c..8a3e2ab 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/System/TimingGift/TimingGiftManager.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: b10601b615e27b1409dbc408badbb1c1
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/TimingGift/TimingGiftTabCell.cs b/Main/System/TimingGift/TimingGiftTabCell.cs
new file mode 100644
index 0000000..8d11d9e
--- /dev/null
+++ b/Main/System/TimingGift/TimingGiftTabCell.cs
@@ -0,0 +1,33 @@
+using UnityEngine;
+
+public class TimingGiftTabCell : MonoBehaviour
+{
+    [SerializeField] Color selectColor;
+    [SerializeField] Color unSelectColor;
+    [SerializeField] TextEx tabNameText;
+    [SerializeField] ButtonEx tabButton;
+    [SerializeField] ImageEx tabIcon;
+    [SerializeField] Transform line;
+    TimingGiftManager manager { get { return TimingGiftManager.Instance; } }
+    public void Display(int index)
+    {
+        var currectTimingGiftIdList = manager.GetCurrectTimingGiftIdList();
+        if (currectTimingGiftIdList == null || index < 0 || index >= currectTimingGiftIdList.Count)
+            return;
+        int id = currectTimingGiftIdList[index];
+        if (!TimingGiftConfig.HasKey(id))
+            return;
+        line.SetActive(currectTimingGiftIdList.Count > 1 && index < currectTimingGiftIdList.Count - 1);
+        TimingGiftConfig config = TimingGiftConfig.Get(id);
+        tabNameText.text = config.GiftName;
+        bool isChoose = manager.selectTabIndex == index;
+        tabIcon.SetSprite(isChoose ? "TimingGiftTab1_Select" : "TimingGiftTab1_UnSelect");
+        tabIcon.SetNativeSize();
+        tabNameText.color = isChoose ? selectColor : unSelectColor;
+        tabButton.SetListener(() =>
+        {
+            manager.selectTabGiftId = id;
+            manager.selectTabIndex = index;
+        });
+    }
+}
\ No newline at end of file
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/System/TimingGift/TimingGiftTabCell.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
copy to Main/System/TimingGift/TimingGiftTabCell.cs.meta
index 4c9b26c..f75dd15 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/System/TimingGift/TimingGiftTabCell.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: 584a05a7f813e494990d0e3e0e6d3906
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/TimingGift/TimingGiftWin.cs b/Main/System/TimingGift/TimingGiftWin.cs
new file mode 100644
index 0000000..7f6ae67
--- /dev/null
+++ b/Main/System/TimingGift/TimingGiftWin.cs
@@ -0,0 +1,271 @@
+using System.Collections.Generic;
+using Cysharp.Threading.Tasks;
+using UnityEngine;
+
+public class TimingGiftWin : UIBase
+{
+    [SerializeField] ScrollerController tabScroller;
+    [SerializeField] ScrollerController awardScroller;
+
+    [SerializeField] TimingGiftCtgIdCell[] ctgIdCells;
+
+    [SerializeField] TextEx timeText;
+    [SerializeField] ImageEx bgImage;
+    [SerializeField] ImageEx IconImage;
+    [SerializeField] GradientText giftText; //"绀煎寘"
+    [SerializeField] OutlineEx giftTextOutline;
+    [SerializeField] GradientText giftNameText;
+    [SerializeField] TextEx rateText;
+    [SerializeField] GradientText rateNameText; //鍏呭�艰繑鍒�
+    [SerializeField] ButtonEx buyButton;
+    [SerializeField] ImageEx buyImage;
+    [SerializeField] TextEx buyText;
+    [SerializeField] ButtonEx leftButton;
+    [SerializeField] ButtonEx rightButton;
+    [SerializeField] ButtonEx closeButton;
+    TimingGiftManager manager { get { return TimingGiftManager.Instance; } }
+
+    int type;
+    List<int> currectTimingGiftIdList;
+
+    protected override void InitComponent()
+    {
+        buyButton.SetListener(() =>
+        {
+            RechargeManager.Instance.CTG(manager.selectCtgId);
+        });
+        leftButton.SetListener(() => UpdateTabSelection(-1));
+        rightButton.SetListener(() => UpdateTabSelection(1));
+        closeButton.SetListener(CloseWindow);
+    }
+
+    protected override void OnPreOpen()
+    {
+        type = functionOrder;
+#if UNITY_EDITOR
+        if (manager.isLogShow)
+        {
+            Debug.Log($"[TimingGift] 鎵撳紑鐣岄潰锛岃{type}绫诲瀷瑙﹀彂");
+        }
+#endif
+        tabScroller.OnRefreshCell += OnRefreshTabCell;
+        awardScroller.OnRefreshCell += OnRefreshAwardCell;
+        manager.OnSelectTabIndexChangeEvent += OnSelectTabIndexChangeEvent;
+        manager.OnSelectCtgIdIndexChangeEvent += OnSelectCtgIdIndexChangeEvent;
+        manager.OnRemoveExpiredEvent += OnRemoveExpiredEvent;
+        GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
+        RechargeManager.Instance.rechargeCountEvent += OnRechargeCountEvent;
+        CreateAll();
+    }
+
+    protected override void OnPreClose()
+    {
+        tabScroller.OnRefreshCell -= OnRefreshTabCell;
+        awardScroller.OnRefreshCell -= OnRefreshAwardCell;
+        manager.OnSelectTabIndexChangeEvent -= OnSelectTabIndexChangeEvent;
+        manager.OnSelectCtgIdIndexChangeEvent -= OnSelectCtgIdIndexChangeEvent;
+        manager.OnRemoveExpiredEvent -= OnRemoveExpiredEvent;
+        GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
+        RechargeManager.Instance.rechargeCountEvent -= OnRechargeCountEvent;
+    }
+
+    private void OnRechargeCountEvent(int obj)
+    {
+        DisplayGift();
+    }
+
+    private void OnSecondEvent()
+    {
+        RefreshTime();
+    }
+
+    private void OnRemoveExpiredEvent()
+    {
+        var list = manager.GetCurrectTimingGiftIdList();
+        if (list.IsNullOrEmpty())
+        {
+            DelayCloseWindow().Forget();
+            return;
+        }
+        CreateAll();
+    }
+
+    private void OnSelectTabIndexChangeEvent()
+    {
+
+        InitializeSelectedCtgConfig();
+        tabScroller.m_Scorller.RefreshActiveCellViews();
+        DisplayCtgIdCells();
+        CreateAwardScroller();
+        DisplayGift();
+    }
+
+    private void OnSelectCtgIdIndexChangeEvent()
+    {
+        DisplayCtgIdCells();
+        CreateAwardScroller();
+        DisplayGift();
+    }
+
+    private void InitializeSelectedCtgConfig()
+    {
+        if (!TimingGiftConfig.TryGetTimingGiftConfig(manager.selectTabGiftId, out TimingGiftConfig config))
+            return;
+        manager.selectCtgIds = config.CTGIDs;
+        int index = 0;
+        manager.selectCtgId = manager.GetArrValue(index, config.CTGIDs);
+
+        if (!CTGConfig.HasKey(manager.selectCtgId))
+            return;
+        CTGConfig ctgConfig = CTGConfig.Get(manager.selectCtgId);
+        manager.selectGainItemList = ctgConfig.GainItemList;
+        manager.selectCtgIdIndex = index;
+    }
+
+    private void UpdateTabSelection(int direction)
+    {
+        int maxIndex = currectTimingGiftIdList.Count - 1;
+        int tempIndex = manager.selectTabIndex + direction;
+        int realIndex = tempIndex < 0 ? maxIndex : (tempIndex > maxIndex ? 0 : tempIndex);
+
+        manager.selectTabGiftId = manager.GetListValue(realIndex, currectTimingGiftIdList);
+        manager.selectTabIndex = realIndex;
+        tabScroller.JumpIndex(manager.selectTabIndex);
+
+        InitializeSelectedCtgConfig();
+    }
+
+    private void RefreshTime()
+    {
+        int times = manager.GetRemainingSeconds(manager.selectTabGiftId);
+        timeText.text = times <= 0 ? Language.Get("TimingGift04") : Language.Get("TimingGift03", TimeUtility.SecondsToHMS(times));
+        timeText.colorType = times <= 0 ? TextColType.Red : TextColType.LightGreen;
+    }
+
+    private int FindTypeIndex(int type)
+    {
+        for (int i = 0; i < currectTimingGiftIdList.Count; i++)
+        {
+            int id = currectTimingGiftIdList[i];
+            if (!TimingGiftConfig.TryGetTimingGiftConfig(id, out TimingGiftConfig config))
+                continue;
+            if (config.GiftType == type)
+                return i;
+        }
+        return 0;
+    }
+
+    private void CreateAll()
+    {
+        currectTimingGiftIdList = manager.GetCurrectTimingGiftIdList(isSort: true);
+
+        int index = FindTypeIndex(type);
+        manager.selectTabGiftId = manager.GetListValue(index, currectTimingGiftIdList);
+        manager.selectTabIndex = index;
+        InitializeSelectedCtgConfig();
+
+        CreateTabScroller();
+        tabScroller.JumpIndex(manager.selectTabIndex);
+
+        DisplayCtgIdCells();
+        CreateAwardScroller();
+        DisplayGift();
+    }
+
+    private void CreateTabScroller()
+    {
+        if (currectTimingGiftIdList.Count < 2)
+        {
+            tabScroller.SetActive(false);
+            return;
+        }
+        tabScroller.SetActive(true);
+
+        tabScroller.Refresh();
+        for (int i = 0; i < currectTimingGiftIdList.Count; i++)
+        {
+            tabScroller.AddCell(ScrollerDataType.Header, i);
+        }
+        tabScroller.Restart();
+    }
+
+    private void CreateAwardScroller()
+    {
+        awardScroller.Refresh();
+        if (!manager.selectGainItemList.IsNullOrEmpty())
+        {
+            for (int i = 0; i < manager.selectGainItemList.Length; i++)
+            {
+                awardScroller.AddCell(ScrollerDataType.Header, i);
+            }
+        }
+        awardScroller.Restart();
+    }
+    public void DisplayCtgIdCells()
+    {
+        if (manager.selectCtgIds.IsNullOrEmpty())
+        {
+            for (int i = 0; i < ctgIdCells.Length; i++)
+            {
+                ctgIdCells[i].SetActive(false);
+            }
+            return;
+        }
+
+        for (int i = 0; i < ctgIdCells.Length; i++)
+        {
+            if (i < manager.selectCtgIds.Length)
+            {
+                ctgIdCells[i].SetActive(true);
+                ctgIdCells[i].Display(i, manager.selectCtgIds);
+            }
+            else
+            {
+                ctgIdCells[i].SetActive(false);
+            }
+        }
+    }
+    private void DisplayGift()
+    {
+        if (!TimingGiftConfig.TryGetTimingGiftConfig(manager.selectTabGiftId, out TimingGiftConfig config))
+            return;
+        if (!CTGConfig.HasKey(manager.selectCtgId))
+            return;
+        CTGConfig ctgConfig = CTGConfig.Get(manager.selectCtgId);
+        if (!RechargeManager.Instance.TryGetOrderInfo(manager.selectCtgId, out var orderInfoConfig))
+            return;
+        bool isShowSwitch = currectTimingGiftIdList.Count > 1;
+        leftButton.SetActive(isShowSwitch);
+        rightButton.SetActive(isShowSwitch);
+
+        bgImage.SetSprite($"TimingGiftBg_{manager.selectTabGiftId}");
+        bgImage.SetNativeSize();
+        IconImage.SetSprite($"TimingGiftIcon_{manager.selectTabGiftId}");
+        giftNameText.text = config.GiftName;
+        rateText.text = Language.Get("TimingGift02", ctgConfig.Percentage);
+        rateNameText.text = Language.Get("TimingGift05");
+        giftText.text = Language.Get("TimingGift01");
+        giftText.SetVerticalGradient(manager.GetColor32(config.TopColor), manager.GetColor32(config.BottomColor));
+        giftTextOutline.OutlineColor = manager.GetColor32(config.OutlineColor);
+        bool isBuy = manager.IsBuy(manager.selectCtgId);
+        buyText.text = !isBuy ? Language.Get("PayMoneyNum", orderInfoConfig.PayRMBNumOnSale) : Language.Get("L1133");
+        buyImage.SetSprite(isBuy ? "TimingGiftBuy" : "TimingGiftNoBuy");
+        buyImage.raycastTarget = !isBuy;
+        RefreshTime();
+    }
+
+    private void OnRefreshTabCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell.GetComponent<TimingGiftTabCell>();
+        _cell?.Display(cell.index);
+    }
+    private void OnRefreshAwardCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell.GetComponent<TimingGiftAwardCell>();
+        _cell?.Display(cell.index, manager.selectGainItemList);
+    }
+}
+
+
+
+
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/System/TimingGift/TimingGiftWin.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
copy to Main/System/TimingGift/TimingGiftWin.cs.meta
index 4c9b26c..32a28f0 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/System/TimingGift/TimingGiftWin.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: 6f6ea5c4c1921414dbc448656d693512
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/ViewNPC/ViewNPCManager.cs b/Main/System/ViewNPC/ViewNPCManager.cs
index 9460ebf..4a0e255 100644
--- a/Main/System/ViewNPC/ViewNPCManager.cs
+++ b/Main/System/ViewNPC/ViewNPCManager.cs
@@ -67,7 +67,7 @@
             {
                 case BattleConst.ArenaBattleField:
                     int playerId = (int)ArenaManager.Instance.atkPlayerId;
-                    OtherPlayerDetailManager.Instance.ViewPlayerDetail(playerId, (int)ViewPlayerType.viewArenaBattleEnemyHero, (int)BattlePreSetType.Arena);
+                    OtherPlayerDetailManager.Instance.ViewPlayerDetail(playerId, 0, (int)ViewPlayerType.viewArenaBattleEnemyHero, (int)BattlePreSetType.Arena);
                     break;
             }
             return;
@@ -123,8 +123,16 @@
         });
     }
 
+    public void TryOpenNPCDetailWin(uint mapID, uint funcLineID, uint npcID)
+    {
+        if (TryGetNPCAttr(mapID, funcLineID, npcID, out ViewNPCAttr attr))
+        {
+            OpenNPCDetailWin(attr);
+        }
+    }
+
     public ViewNPCAttr viewNPCAttr;
-    private void OpenNPCDetailWin(ViewNPCAttr viewNPCAttr)
+    public void OpenNPCDetailWin(ViewNPCAttr viewNPCAttr)
     {
         this.viewNPCAttr = viewNPCAttr;
         if (!UIManager.Instance.IsOpened<OtherNPCDetailWin>())
diff --git a/Main/System/WarlordPavilion/TowerBaseWin.cs b/Main/System/WarlordPavilion/TowerBaseWin.cs
new file mode 100644
index 0000000..40e5ab0
--- /dev/null
+++ b/Main/System/WarlordPavilion/TowerBaseWin.cs
@@ -0,0 +1,20 @@
+using UnityEngine;
+
+public class TowerBaseWin : OneLevelWin
+{
+    [SerializeField] Transform WarlordPavilionWinTop;
+    protected override void OpenSubUIByTabIndex()
+    {
+        WarlordPavilionWinTop.SetActive(functionOrder == 0);
+        switch (functionOrder)
+        {
+            case 0:
+                currentSubUI = UIManager.Instance.OpenWindow<WarlordPavilionWin>();
+                break;
+            default:
+                Debug.LogWarning("鏈煡鐨勬爣绛剧储寮�: " + functionOrder);
+                break;
+        }
+
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/System/WarlordPavilion/TowerBaseWin.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
copy to Main/System/WarlordPavilion/TowerBaseWin.cs.meta
index 4c9b26c..462fa96 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/System/WarlordPavilion/TowerBaseWin.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: 8849ec4f80ae3604db56ee7a9a1be0b6
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/WarlordPavilion/WarlordPavilionManager.cs b/Main/System/WarlordPavilion/WarlordPavilionManager.cs
index 8a6f053..179ce22 100644
--- a/Main/System/WarlordPavilion/WarlordPavilionManager.cs
+++ b/Main/System/WarlordPavilion/WarlordPavilionManager.cs
@@ -1,7 +1,6 @@
 using System;
 using System.Collections.Generic;
 using LitJson;
-using UnityEngine;
 
 public class WarlordPavilionManager : GameSystemManager<WarlordPavilionManager>
 {
@@ -652,17 +651,39 @@
         return true;
     }
 
-    public bool TryGetNPCConfig(int layerNum, int levelNum, out NPCConfig npcConfig)
+    public bool TryGetLineupConfig(int layerNum, int levelNum, out NPCLineupConfig npcLineupConfig)
     {
-        npcConfig = null;
+        npcLineupConfig = null;
         if (!FBDJGLevelConfig.TryGetFBDJGLevelConfig(layerNum, levelNum, out var config))
             return false;
-        int npcID = config.NPCID;
-        if (!NPCConfig.HasKey(npcID))
+        int lineupID = config.LineupIDList[0];
+        if (!NPCLineupConfig.HasKey(lineupID))
             return false;
-        npcConfig = NPCConfig.Get(npcID);
+        npcLineupConfig = NPCLineupConfig.Get(lineupID);
         return true;
     }
+
+    public int viewNPCID = 0;
+    // 鑾峰彇璇ラ樀瀹规寚瀹氫綅缃殑npcID锛� posNum鑼冨洿1-6
+    public bool TryGetNPCIDInLineupByPosNum(NPCLineupConfig config, int posNum, out int npcID)
+    {
+        npcID = 0;
+        if (config == null || posNum < 1 || posNum > 6)
+            return false;
+
+        npcID = posNum switch
+        {
+            1 => config.PosNPCID1,
+            2 => config.PosNPCID2,
+            3 => config.PosNPCID3,
+            4 => config.PosNPCID4,
+            5 => config.PosNPCID5,
+            6 => config.PosNPCID6,
+            _ => 0
+        };
+        return NPCConfig.HasKey(npcID);
+    }
+
 
     public bool IsTodayNoFight()
     {
@@ -726,7 +747,7 @@
 
         if (!IsAutoFuncOpen(false))
         {
-            UIManager.Instance.OpenWindow<WarlordPavilionWin>();
+            UIManager.Instance.OpenWindow<TowerBaseWin>();
             return;
         }
 
@@ -734,7 +755,7 @@
         bool hasNext = FBDJGLevelConfig.TryGetNextLevel(layerNum, levelNum, out int nextLayerNum, out int nextLevelNum);
         if (!hasNext)
         {
-            UIManager.Instance.OpenWindow<WarlordPavilionWin>();
+            UIManager.Instance.OpenWindow<TowerBaseWin>();
             return;
         }
 
@@ -742,14 +763,14 @@
         bool isAutoPresetOn = IsAutoPresetOn();
         if (hasBonusToSelect && !isAutoPresetOn)
         {
-            UIManager.Instance.OpenWindow<WarlordPavilionWin>();
+            UIManager.Instance.OpenWindow<TowerBaseWin>();
             UIManager.Instance.OpenWindow<WarlordPavilionSelectBonusWin>();
             return;
         }
 
         if (!isAutoNext)
         {
-            UIManager.Instance.OpenWindow<WarlordPavilionWin>();
+            UIManager.Instance.OpenWindow<TowerBaseWin>();
             return;
         }
 
diff --git a/Main/System/WarlordPavilion/WarlordPavilionNPCItem.cs b/Main/System/WarlordPavilion/WarlordPavilionNPCItem.cs
new file mode 100644
index 0000000..9a1f67b
--- /dev/null
+++ b/Main/System/WarlordPavilion/WarlordPavilionNPCItem.cs
@@ -0,0 +1,48 @@
+using UnityEngine;
+using UnityEngine.UI;
+public class WarlordPavilionNPCItem : MonoBehaviour
+{
+    public int posNum;
+    [SerializeField] UIHeroController uiHeroController;
+    [SerializeField] Button button;
+    [SerializeField] TextEx nameText;
+    [SerializeField] TextEx numText;
+    WarlordPavilionManager manager { get { return WarlordPavilionManager.Instance; } }
+
+    public void Display(NPCLineupConfig npcLineupConfig, float modelSize, int funcLineID, FBDJGLevelConfig config)
+    {
+        numText.text = posNum.ToString();
+        bool hasHero = manager.TryGetNPCIDInLineupByPosNum(npcLineupConfig, posNum, out int npcID);
+
+        uiHeroController.SetActive(hasHero);
+        nameText.SetActive(hasHero);
+        uiHeroController.SetActive(hasHero);
+
+        if (!NPCConfig.HasKey(npcID))
+            return;
+        NPCConfig npcConfig = NPCConfig.Get(npcID);
+        int heroID = npcConfig.RelatedHeroID;
+        if (!HeroConfig.HasKey(heroID))
+            return;
+        HeroConfig heroConfig = HeroConfig.Get(heroID);
+
+        uiHeroController.Create(npcConfig.SkinID, modelSize);
+
+        Color color = UIHelper.GetUIColorByFunc(heroConfig.Quality);
+        string name = UIHelper.AppendColor(color, heroConfig.Name);
+        nameText.text = config.NPCLV == 0 ? name : Language.Get("WarlordPavilion34", name, config.NPCLV);
+        numText.text = posNum.ToString();
+        button.SetListener(() =>
+        {
+            if (!hasHero)
+                return;
+            if (ViewNPCManager.Instance.TryGetNPCAttr((uint)manager.DataMapID, (uint)funcLineID, (uint)npcID, out var npcAttr))
+            {
+                ViewNPCManager.Instance.OpenNPCDetailWin(npcAttr);
+                return;
+            }
+            ViewNPCManager.Instance.SendViewNPCAttr((uint)manager.DataMapID, (uint)funcLineID, (uint)npcID);
+            manager.viewNPCID = npcID;
+        });
+    }
+}
\ No newline at end of file
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta b/Main/System/WarlordPavilion/WarlordPavilionNPCItem.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
copy to Main/System/WarlordPavilion/WarlordPavilionNPCItem.cs.meta
index 4c9b26c..7caafce 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA521_tagMCFamilyChange.cs.meta
+++ b/Main/System/WarlordPavilion/WarlordPavilionNPCItem.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 95872d70a4fcdaf47a7089e954db72fb
+guid: 89a6702338a7e464baff37bb3720cad9
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/WarlordPavilion/WarlordPavilionWin.cs b/Main/System/WarlordPavilion/WarlordPavilionWin.cs
index 2f788c1..d638622 100644
--- a/Main/System/WarlordPavilion/WarlordPavilionWin.cs
+++ b/Main/System/WarlordPavilion/WarlordPavilionWin.cs
@@ -1,3 +1,4 @@
+using System;
 using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.UI;
@@ -5,8 +6,7 @@
 {
     [SerializeField] float modelSize;
     [SerializeField] TextEx txtCurrentLevel;                //褰撳墠鍏冲崱
-    [SerializeField] TextEx txtBossName;
-    [SerializeField] UIHeroController uiHeroController;
+    [SerializeField] WarlordPavilionNPCItem[] heros;
     [SerializeField] List<SkillWordCell> skillWords;
     [SerializeField] ItemCell[] firstAwards;
     [SerializeField] ImageEx[] firstAwardMasks;
@@ -16,7 +16,6 @@
     [SerializeField] TextEx txtMax;
     [SerializeField] ButtonEx btnRank;
     [SerializeField] ButtonEx btnAward;
-    [SerializeField] ButtonEx btnBossInfo;
     [SerializeField] ButtonEx btnFormation;                 //甯冮樀
     [SerializeField] ButtonEx btnBonusPreset;               //鍔犳垚棰勮
     [SerializeField] TextEx txtBonusPreset;               //鍔犳垚棰勮
@@ -32,20 +31,6 @@
     WarlordPavilionManager manager { get { return WarlordPavilionManager.Instance; } }
     protected override void InitComponent()
     {
-        btnBossInfo.SetListener(() =>
-        {
-            if (npcConfig == null)
-                return;
-            uint mapID = (uint)manager.DataMapID;
-            uint funcLineID = (uint)manager.GetLineID(showLayerNum, showLevelNum);
-            uint npcID = (uint)npcConfig.NPCID;
-            if (ViewNPCManager.Instance.TryGetNPCAttr(mapID, funcLineID, npcID, out var npcAttr) && npcAttr != null && npcAttr.AttrDict != null)
-            {
-                AttributeManager.Instance.OpenTotalAttributeWin(npcAttr.AttrDict);
-                return;
-            }
-            ViewNPCManager.Instance.SendViewNPCAttr(mapID, funcLineID, npcID);
-        });
         btnRank.SetListener(() =>
         {
             UIManager.Instance.OpenWindow<WarlordPavilionRankWin>();
@@ -92,6 +77,7 @@
     {
         GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
         manager.OnUpdateDingjungeInfoEvent += OnUpdateDingjungeInfo;
+        ViewNPCManager.Instance.OnUpdateViewNPCAttrRet += OnUpdateViewNPCAttrRet;
         Display();
     }
 
@@ -99,6 +85,14 @@
     {
         GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
         manager.OnUpdateDingjungeInfoEvent -= OnUpdateDingjungeInfo;
+        ViewNPCManager.Instance.OnUpdateViewNPCAttrRet -= OnUpdateViewNPCAttrRet;
+    }
+
+    private void OnUpdateViewNPCAttrRet(uint mapID, uint funcLineID)
+    {
+        if (mapID != (uint)manager.DataMapID)
+            return;
+        ViewNPCManager.Instance.TryOpenNPCDetailWin(mapID, funcLineID, (uint)manager.viewNPCID);
     }
 
     private void OnUpdateDingjungeInfo(List<int> indexs)
@@ -126,8 +120,8 @@
 
     int showLayerNum;
     int showLevelNum;
+    int showFuncLineID;
     FBDJGLevelConfig config;
-    NPCConfig npcConfig;
     private void Display()
     {
         uIEffectPlayer.Stop();
@@ -139,12 +133,11 @@
             return;
         if (!FBDJGLevelConfig.TryGetFBDJGLevelConfig(showLayerNum, showLevelNum, out config))
             return;
-        if (!manager.TryGetNPCConfig(showLayerNum, showLevelNum, out npcConfig))
-            return;
 
+        showFuncLineID = manager.GetLineID(showLayerNum, showLevelNum);
         txtCurrentLevel.text = Language.Get("WarlordPavilion22", showLayerNum, showLevelNum);
-        txtBossName.text = npcConfig.NPCName;
-        uiHeroController.Create(npcConfig.SkinID, modelSize);
+
+        DisplayHeros(config);
         DisplaySkillWordsList(config.SkillIDExList);
         DisplayItemCell(firstAwards, config.PassAwardList);
         manager.DisplayItemCell(challengeAwards, config.AwardList);
@@ -161,6 +154,26 @@
         }
         funPresetBtn.SetActive(FuncPresetManager.Instance.IsPreShow());
     }
+
+    private void DisplayHeros(FBDJGLevelConfig config)
+    {
+        if (!manager.TryGetLineupConfig(config.LayerNum, config.LevelNum, out NPCLineupConfig npcLineupConfig))
+        {
+            for (int i = 0; i < heros.Length; i++)
+            {
+                var hero = heros[i];
+                hero.SetActive(false);
+            }
+            return;
+        }
+
+        for (int i = 0; i < heros.Length; i++)
+        {
+            var hero = heros[i];
+            hero.Display(npcLineupConfig, modelSize, showFuncLineID, config);
+        }
+    }
+
     private void DisplayButtons()
     {
         bool isPass = manager.IsPass();
diff --git a/Main/Utility/EnumHelper.cs b/Main/Utility/EnumHelper.cs
index 94aec5c..77b4e4b 100644
--- a/Main/Utility/EnumHelper.cs
+++ b/Main/Utility/EnumHelper.cs
@@ -848,6 +848,7 @@
     Mingge = 54, //鍛芥牸
     WarlordPavilion = 55, //瀹氬啗闃�
     FuncPreset = 56, //娴佹淳棰勮
+    TimingGift = 57, //鏃舵満绀煎寘
 }
 
 
diff --git a/Main/Utility/OperationLogCollect.cs b/Main/Utility/OperationLogCollect.cs
index 7b83620..f80ac79 100644
--- a/Main/Utility/OperationLogCollect.cs
+++ b/Main/Utility/OperationLogCollect.cs
@@ -144,6 +144,7 @@
 
     public void BugReportSys( string _content)
     {
+#if !UNITY_EDITOR
         try
         {
             var tables = new Dictionary<string, string>();
@@ -183,7 +184,7 @@
         {
             Debug.LogError("BugReportSys error" + ex);
         }
-
+#endif
     }
 
 
diff --git a/Main/Utility/TimeUtility.cs b/Main/Utility/TimeUtility.cs
index 709eb44..587220d 100644
--- a/Main/Utility/TimeUtility.cs
+++ b/Main/Utility/TimeUtility.cs
@@ -100,6 +100,15 @@
         }
     }
 
+    public static int AllSecondsCrossServer
+    {
+        get
+        {
+            TimeSpan t = CrossServerNow - OriginalTime;
+            return (int)t.TotalSeconds;
+        }
+    }
+
     //1骞翠腑鐨勭鍑犲懆锛屼互鏈嶅姟绔负鍑嗭紝python鍜宑#绠楀嚭鏉ヤ笉涓�鏍�
     public static int WeekOfYear
     {
@@ -184,8 +193,11 @@
             OnServerTimeRefresh();
         }
 
-        s_CrossServerTime = Convert.ToDateTime(vNetData.CrossServerTime);
-        _crossCheckTime = Time.realtimeSinceStartup;
+        if (!string.IsNullOrEmpty(vNetData.CrossServerTime))
+        {
+            s_CrossServerTime = Convert.ToDateTime(vNetData.CrossServerTime);
+            _crossCheckTime = Time.realtimeSinceStartup;
+        }
 
         TimeDownMgr.Instance.Begin(TimeDownMgr.CoolTimeType.SyncServerTime, 60, (float tick) =>
         {
@@ -538,4 +550,40 @@
     {
         return (int)(GetTodayEndTime() - ServerNow).TotalSeconds;
     }
+
+    #region 璺ㄦ湇鍜屾湰鏈嶅叕鐢ㄦ帴鍙�
+    //褰撴湁鐨勫姛鑳戒細浠庢湰鏈嶅姛鑳藉彉鎴愯法鏈嶅姛鑳界殑鏃跺�欑粺涓�鐢ㄨ繖浜涙帴鍙e鐞嗘椂闂�
+    //鍚勮嚜鐨勫姛鑳戒紶鑷繁鐨剒oneID
+
+    // 鑾峰彇褰撳墠鏃堕棿, 鍏細璺ㄥ尯鍓嶅彇鏈湇鏃堕棿锛岃法鏈嶅悗鍙栬法鏈嶆椂闂�
+    public static DateTime GetCommServerNow(int zoneID = 0)
+    {
+        if (zoneID == 0)
+        {
+            return ServerNow;
+        }
+        else
+        {
+            return CrossServerNow;
+        }
+    }
+
+    public static int GetCommServerTick(int zoneID = 0)
+    {
+        if (zoneID == 0)
+        {
+            return AllSeconds;
+        }
+        else
+        {
+            return AllSecondsCrossServer;
+        }
+    }
+
+    public static DateTime GetCommTodayEndTime(int zoneID = 0)
+    {
+        var now = GetCommServerNow(zoneID).AddDays(1);
+        return new DateTime(now.Year, now.Month, now.Day);
+    }
+    #endregion
 }
diff --git a/Main/Utility/UIHelper.cs b/Main/Utility/UIHelper.cs
index e4ebbab..15927ac 100644
--- a/Main/Utility/UIHelper.cs
+++ b/Main/Utility/UIHelper.cs
@@ -1509,4 +1509,14 @@
     }
 
 
+    public static void ShowServersPanel(List<int> serverIDList)
+    {
+        if (UIManager.Instance.IsOpened<ServersSmallTipWin>())
+        {
+            UIManager.Instance.CloseWindow<ServersSmallTipWin>();
+        }
+        ServersSmallTipWin.serverIDList = serverIDList;
+        UIManager.Instance.OpenWindow<ServersSmallTipWin>();
+    }
+
 }

--
Gitblit v1.8.0