From 78bfe524ea4776c47f6314e56e97f39970b00fce Mon Sep 17 00:00:00 2001
From: client_linchunjie <461730578@qq.com>
Date: 星期二, 25 九月 2018 15:07:07 +0800
Subject: [PATCH] Merge branch 'master' into 1871天赋功能

---
 Core/GameEngine/Model/ConfigManager.cs                                                    |    5 
 Fight/GameActor/GActorNpcNoFight.cs                                                       |    5 
 Plugins/Trails/Range.cs                                                                   |   15 
 Plugins/Trails/VersionInformation.cs                                                      |   42 
 System/WorldMap/LocalMapFindPath.cs                                                       |   14 
 Plugins/Trails/SmoothTrail.cs                                                             |  213 ++
 System/Dungeon/DungeonNuwaVictoryWin.cs                                                   |   28 
 System/Dungeon/TrialDungeonEntranceWin.cs                                                 |   21 
 Core/SFX/SFXPlayUtility.cs                                                                |   10 
 System/FindPrecious/BossHomeWin.cs                                                        |    4 
 Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0405_tagPlayerDisappear.cs            |    5 
 System/Role/RolePanel.cs                                                                  |    4 
 System/FairyAu/FairyLeagueNoticeWin.cs.meta                                               |   12 
 System/MainInterfacePanel/SkillTaskWin.cs                                                 |   38 
 System/Market/PutawayWin.cs                                                               |    1 
 UI/Common/UI3DShowHero.cs                                                                 |   18 
 System/Treasure/DragSelectComponent.cs                                                    |    3 
 System/FindPrecious/BossIntroduceBehaviour.cs                                             |    6 
 System/DailyQuest/DailyQuestData.cs                                                       |   23 
 Fight/Stage/MapEditor/GuideDialogueWin.cs                                                 |    4 
 Fight/Actor/Status/Status_Base.cs                                                         |   45 
 System/KnapSack/Logic/ModelShowPerfab.cs                                                  |    4 
 System/FairyAu/FairyLeagueNoticeWin.cs                                                    |  111 +
 System/Strengthening/GodBeastReinforcementWin.cs                                          |   90 
 Utility/TimeUtility.cs                                                                    |   30 
 System/Vip/FirstChargeTrialWin.cs                                                         |    2 
 System/MainInterfacePanel/PlayerTaskDatas.cs                                              |   16 
 Fight/MapTransferUtility.cs                                                               |    2 
 System/Strengthening/GodBeastAttributes.cs                                                |  185 +
 Core/GameEngine/Model/Config/WHYJRewardConfig.cs.meta                                     |   12 
 Plugins/Trails/SmokePlume.cs.meta                                                         |   15 
 System/MainInterfacePanel/MainInterfaceWin.cs                                             |    2 
 Core/GameEngine/Model/Config/WHYJRewardConfig.cs                                          |   44 
 Core/NetworkPackage/DTCFile/ServerPack/HB4_Fight/DTCB401_tagMCSkillHurtList.cs            |   27 
 System/DailyQuest/DailyQuestWin.cs                                                        |   12 
 System/FairyAu/FairyLeagueModel.cs                                                        |  130 +
 Fight/Actor/Skill/XRayShadow.cs                                                           |    2 
 System/Treasure/TreasureSoulModel.cs                                                      |   36 
 Core/Camera/CameraController.cs                                                           |   29 
 System/MainInterfacePanel/TipPanel.cs                                                     |    3 
 Utility/EnumHelper.cs                                                                     |    2 
 Plugins/Trails/VersionInformation.cs.meta                                                 |    8 
 System/Chat/ChatCenter.cs                                                                 |   12 
 System/Dungeon/DungenWHYJ.cs                                                              |  107 +
 Plugins/Trails/GizmosExtra.cs.meta                                                        |    8 
 System/Compose/New/ComposeWin.cs                                                          |    9 
 System/OpenServerActivity/FlashSaleCoolDown.cs                                            |    1 
 System/RoleParticulars/ViewPetDetailWin.cs                                                |    2 
 System/MainInterfacePanel/FeaturesType1.cs                                                |    4 
 Utility/LayerUtility.cs                                                                   |    8 
 Plugins/Trails/TrailRenderer_Base.cs                                                      |  666 +++++++
 System/Chat/FairyChatWin.cs                                                               |    6 
 Fight/GameActor/BattleEffectPlayRule.cs.meta                                              |   12 
 System/Team/TeamModel.cs                                                                  |    9 
 Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0434_tagAreaPlayerAppearEx.cs         |    5 
 Fight/Stage/StageManager.cs                                                               |   32 
 Plugins/Trails/CircularBuffer.cs                                                          |  287 +++
 System/WindowBase/WindowCenter.cs                                                         |   18 
 Fight/GameActor/GAMgr.cs                                                                  |    4 
 System/MainInterfacePanel/DialogueDuidanceWin.cs                                          |    4 
 System/Chat/ChatCtrl.cs                                                                   |   82 
 UI/Common/UI3DModelFactory.cs                                                             |    5 
 Core/NetworkPackage/ClientPack/ClientToMapServer/CA5_Function/CA5C4_tagCMDogzEquipPlus.cs |    1 
 Plugins/Trails/Range.cs.meta                                                              |    8 
 System/Treasure/TreasurePotentialPanel.cs                                                 |   84 
 Fight/PreFightMission.cs                                                                  |    7 
 System/Pet/RidingAndPetActivationWin.cs                                                   |    8 
 System/Dungeon/DungenWHYJ.cs.meta                                                         |   12 
 System/Treasure/FairyTreasureCollectPanelPattern5.cs                                      |   45 
 Plugins/Trails/SmokeTrail.cs.meta                                                         |   15 
 System/Treasure/PotentialItemBehaviour.cs                                                 |   18 
 System/Dogz/DogzModel.cs                                                                  |  422 +++
 Fight/Actor/State/SMB/STM_NormalAttack.cs                                                 |    5 
 System/MainInterfacePanel/HighSettingFadeInFadeOut.cs                                     |    2 
 System/Message/WordAnalysis.cs                                                            |    4 
 System/AssetVersion/AssetVersionUtility.cs                                                |   63 
 System/Vip/FirstRechargeWin.cs                                                            |    4 
 System/SystemSetting/SetPrivateModel.cs                                                   |   25 
 System/FairyAu/FairyGrabBossWin.cs                                                        |   23 
 System/PlayerDead/PlayerDeadModel.cs                                                      |   16 
 Core/NetworkPackage/DTCFile/ServerPack/H06_PlayerVsNPC/DTC0614_tagUseSkillPos.cs          |   55 
 System/SystemSetting/ActivityPushCell.cs                                                  |   21 
 Core/GameEngine/Model/Config/DogzConfig.cs                                                |    7 
 System/FairyAu/FairyBoss.cs                                                               |    4 
 System/HttpRequest/HttpRequest.cs                                                         |   67 
 System/DailyQuest/DayRemind.cs                                                            |    2 
 System/FairyAu/KingTempleWin.cs                                                           |   15 
 System/Welfare/OperationTimeHepler.cs                                                     |   36 
 System/Mount/MountWin.cs                                                                  |    2 
 System/Realm/RealmUpWin.cs                                                                |  113 
 System/FriendSystem/MailAllModel.cs                                                       |   12 
 Fight/GameActor/BattleEffectPlayRule.cs                                                   |  106 +
 System/PlayerDead/RebornWin.cs                                                            |    2 
 System/MainInterfacePanel/TaskAllocation.cs                                               |    2 
 Core/GameEngine/Model/Config/DogzConfig.cs.meta                                           |    2 
 System/Chat/TeamChatWin.cs                                                                |    4 
 Fight/Actor/AI/AI_BossDSX.cs                                                              |    2 
 Plugins/Trails/Trail.cs                                                                   |   60 
 System/Dungeon/DungeonRuneTowerVictoryWin.cs                                              |    2 
 System/Dogz/DogzWin.cs                                                                    |    3 
 System/KnapSack/New/RoleEquipWin.cs                                                       |    8 
 System/Realm/RealmPropertyUpWin.cs                                                        |    4 
 System/Chat/ChatTip.cs                                                                    |    6 
 Plugins/Trails/SmokeTrail.cs                                                              |   76 
 System/FairyAu/FairyGrabBossHelpBehaviour.cs                                              |    7 
 System/KnapSack/New/BagWin.cs                                                             |    2 
 System/HappyXB/HappyXBModel.cs                                                            |   40 
 System/Store/StoreModel.cs                                                                |   14 
 Fight/Actor/Skill/FlyObject/FoTransmit.cs                                                 |   26 
 System/OpenServerActivity/OpenServerActivityWin.cs                                        |   48 
 System/RoleParticulars/ViewHorseDetailWin.cs                                              |    2 
 System/Strengthening/WashTips.cs                                                          |   12 
 System/Treasure/TreasurePotentialBriefInfo.cs                                             |    2 
 System/Vip/FirstTimeRechargeWin.cs                                                        |   24 
 System/Voice/SpeechTranslate.cs                                                           |    2 
 Core/NetworkPackage/ServerPack/HA0_Sys/HA005_tagOpenServerDay.cs                          |   57 
 Core/GameEngine/Model/Config/RuneTowerFloorConfig.cs.meta                                 |    2 
 System/Dogz/DogzActiveWin.cs                                                              |   86 
 System/Dogz/DogzPackWin.cs                                                                |   53 
 System/OpenServerActivity/ImpactRankModel.cs                                              |    4 
 System/Store/PetAndMountPushWin.cs                                                        |    7 
 System/Login/LoginModel.cs                                                                |    6 
 Plugins/Trails/TrailRenderer_Base.cs.meta                                                 |   15 
 Plugins/Trails/CircularBuffer.cs.meta                                                     |    8 
 System/DailyQuest/DailyQuestBehaviour.cs                                                  |   15 
 System/Strengthening/WingsRefined.cs                                                      |    4 
 Plugins/Trails/GizmosExtra.cs                                                             |   33 
 System/DogzDungeon/DogzEliteMonsterBehaviour.cs                                           |    4 
 System/Mount/MountPanelAssignment.cs                                                      |    2 
 System/Dungeon/TrialExchangeWin.cs                                                        |   71 
 System/RuneTower/RuneTowerWin.cs                                                          |    4 
 System/DogzDungeon/DogzBoxBehaviour.cs                                                    |    4 
 System/Dungeon/TrialDungeonModel.cs                                                       |   43 
 System/Treasure/TreasureSoulWin.cs                                                        |    7 
 System/Treasure/TreasureModel.cs                                                          |    2 
 Fight/GameActor/GActorPlayerBase.cs                                                       |    9 
 Utility/UIHelper.cs                                                                       |    2 
 Fight/Actor/State/SMB/STM_BaseAttack.cs                                                   |    5 
 System/KnapSack/Logic/ItemTipsModel.cs                                                    |   10 
 Core/GameEngine/Model/Config/RuneTowerFloorConfig.cs                                      |   53 
 System/Dungeon/DungeonModel.cs                                                            |   25 
 System/Strengthening/GodBeastModel.cs                                                     |   75 
 Plugins.meta                                                                              |    9 
 Core/NetworkPackage/DTCFile/ServerPack/H01_System/DTC0102_tagCDBPlayer.cs                 |   12 
 Core/SDK/SDKUtility.cs                                                                    |   34 
 System/DailyQuest/DailyQuestModel.cs                                                      |   10 
 System/MainInterfacePanel/FeatureNoticeWin.cs                                             |   28 
 Plugins/Trails/Trail.cs.meta                                                              |   15 
 System/WorldMap/WorldMapWin.cs                                                            |    3 
 System/MainInterfacePanel/FeaturesType2.cs                                                |    4 
 System/Pet/PetAttributeMethods.cs                                                         |    2 
 System/WindowJump/WindowJumpMgr.cs                                                        |   13 
 Plugins/Trails.meta                                                                       |    9 
 System/RoleParticulars/RoleParticularsWin.cs                                              |   13 
 Plugins/Trails/SmoothTrail.cs.meta                                                        |   15 
 System/Dogz/DogzCell.cs                                                                   |    2 
 Plugins/Trails/SmokePlume.cs                                                              |   74 
 UI/Common/UI3DModelExhibition.cs                                                          |  213 +
 System/Vip/LimitedTimePackageTime.cs                                                      |    1 
 System/Dungeon/DungeonFightWin.cs                                                         |   36 
 System/BlastFurnace/StoveUpgradWin.cs                                                     |    2 
 System/DogzDungeon/DogzDungeonModel.cs                                                    |   71 
 System/Dungeon/NormalDungeonEntranceWin.cs                                                |   15 
 163 files changed, 4,375 insertions(+), 923 deletions(-)

diff --git a/Core/Camera/CameraController.cs b/Core/Camera/CameraController.cs
index fe94908..8a319eb 100644
--- a/Core/Camera/CameraController.cs
+++ b/Core/Camera/CameraController.cs
@@ -61,6 +61,35 @@
         originalRotX = rotationX;
         originalRotY = rotationY;
         DontDestroyOnLoad(this);
+
+        SystemSetting.Instance.qualityLevelChangeEvent += QualityLevelChanged;
+    }
+
+    public void QualityLevelChanged()
+    {
+        if (CameraObject == null)
+        {
+            return;
+        }
+
+        if (SystemSetting.Instance.GetCurrentQualityLevel() == GameQuality.Low)
+        {
+            CameraObject.cullingMask |= LayerUtility.BattleEffectLowMask;
+            CameraObject.cullingMask &= ~LayerUtility.BattleEffectMidMask;
+            CameraObject.cullingMask &= ~LayerUtility.BattleEffectHighMask;
+        }
+        else if (SystemSetting.Instance.GetCurrentQualityLevel() == GameQuality.Medium)
+        {
+            CameraObject.cullingMask |= LayerUtility.BattleEffectLowMask;
+            CameraObject.cullingMask |= LayerUtility.BattleEffectMidMask;
+            CameraObject.cullingMask &= ~LayerUtility.BattleEffectHighMask;
+        }
+        else if (SystemSetting.Instance.GetCurrentQualityLevel() == GameQuality.High)
+        {
+            CameraObject.cullingMask |= LayerUtility.BattleEffectLowMask;
+            CameraObject.cullingMask |= LayerUtility.BattleEffectMidMask;
+            CameraObject.cullingMask |= LayerUtility.BattleEffectHighMask;
+        }
     }
 
     public void PlayAnimationClip(string name)
diff --git a/Core/GameEngine/Model/Config/DogzConfig.cs b/Core/GameEngine/Model/Config/DogzConfig.cs
index fd635a1..1bd92e6 100644
--- a/Core/GameEngine/Model/Config/DogzConfig.cs
+++ b/Core/GameEngine/Model/Config/DogzConfig.cs
@@ -1,6 +1,6 @@
 锘�//--------------------------------------------------------
 //    [Author]:			绗簩涓栫晫
-//    [  Date ]:		   Friday, August 17, 2018
+//    [  Date ]:		   Friday, September 21, 2018
 //--------------------------------------------------------
 
 using UnityEngine;
@@ -17,6 +17,7 @@
 		public int[] BaseAttrTypes;
 		public int[] BaseAttrValues;
 		public int[] HelpBattleSkills;
+		public int FightPowerEx { get ; private set ; }
 		public int[] EquipPlaceColorList;
 
 		public override string getKey()
@@ -54,7 +55,9 @@
 					 int.TryParse(HelpBattleSkillsStringArray[i],out HelpBattleSkills[i]);
 				}
 			
-				string[] EquipPlaceColorListStringArray = rawContents[6].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				FightPowerEx=IsNumeric(rawContents[6]) ? int.Parse(rawContents[6]):0; 
+			
+				string[] EquipPlaceColorListStringArray = rawContents[7].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
 				EquipPlaceColorList = new int[EquipPlaceColorListStringArray.Length];
 				for (int i=0;i<EquipPlaceColorListStringArray.Length;i++)
 				{
diff --git a/Core/GameEngine/Model/Config/DogzConfig.cs.meta b/Core/GameEngine/Model/Config/DogzConfig.cs.meta
index f32a209..67830f4 100644
--- a/Core/GameEngine/Model/Config/DogzConfig.cs.meta
+++ b/Core/GameEngine/Model/Config/DogzConfig.cs.meta
@@ -1,6 +1,6 @@
 fileFormatVersion: 2
 guid: 940b0f1e335cf3749bb18fbee7090526
-timeCreated: 1534489434
+timeCreated: 1537530330
 licenseType: Pro
 MonoImporter:
   serializedVersion: 2
diff --git a/Core/GameEngine/Model/Config/RuneTowerFloorConfig.cs b/Core/GameEngine/Model/Config/RuneTowerFloorConfig.cs
index 413fa5a..758406e 100644
--- a/Core/GameEngine/Model/Config/RuneTowerFloorConfig.cs
+++ b/Core/GameEngine/Model/Config/RuneTowerFloorConfig.cs
@@ -1,14 +1,14 @@
-锘�//--------------------------------------------------------
-//    [Author]:			绗簩涓栫晫
-//    [  Date ]:		   Friday, August 10, 2018
-//--------------------------------------------------------
-
-using UnityEngine;
-using System;
-
-namespace TableConfig {
-
-    
+锘�//--------------------------------------------------------
+//    [Author]:			绗簩涓栫晫
+//    [  Date ]:		   Friday, September 21, 2018
+//--------------------------------------------------------
+
+using UnityEngine;
+using System;
+
+namespace TableConfig {
+
+    
 	public partial class RuneTowerFloorConfig : ConfigBase {
 
 		public int ID { get ; private set ; }
@@ -24,13 +24,14 @@
 		public int UnLockCompose { get ; private set ; }
 		public int RuneDrop { get ; private set ; }
 		public int Fixed { get ; private set ; }
-
+		public int AutoExit { get ; private set ; }
+
 		public override string getKey()
         {
             return ID.ToString();
-        }
-
-		public override void Parse() {
+        }
+
+		public override void Parse() {
 			try
             {
                 ID=IsNumeric(rawContents[0]) ? int.Parse(rawContents[0]):0; 
@@ -58,17 +59,19 @@
 				RuneDrop=IsNumeric(rawContents[11]) ? int.Parse(rawContents[11]):0; 
 			
 				Fixed=IsNumeric(rawContents[12]) ? int.Parse(rawContents[12]):0; 
+			
+				AutoExit=IsNumeric(rawContents[13]) ? int.Parse(rawContents[13]):0; 
             }
             catch (Exception ex)
             {
                 DebugEx.Log(ex);
-            }
-		}
-	
-	}
-
-}
-
-
-
-
+            }
+		}
+	
+	}
+
+}
+
+
+
+
diff --git a/Core/GameEngine/Model/Config/RuneTowerFloorConfig.cs.meta b/Core/GameEngine/Model/Config/RuneTowerFloorConfig.cs.meta
index 682b94b..bb67cc4 100644
--- a/Core/GameEngine/Model/Config/RuneTowerFloorConfig.cs.meta
+++ b/Core/GameEngine/Model/Config/RuneTowerFloorConfig.cs.meta
@@ -1,6 +1,6 @@
 fileFormatVersion: 2
 guid: eb8552f7e3b6ad843878daecebc9eb01
-timeCreated: 1533871891
+timeCreated: 1537535813
 licenseType: Pro
 MonoImporter:
   serializedVersion: 2
diff --git a/Core/GameEngine/Model/Config/WHYJRewardConfig.cs b/Core/GameEngine/Model/Config/WHYJRewardConfig.cs
new file mode 100644
index 0000000..6eb4a0f
--- /dev/null
+++ b/Core/GameEngine/Model/Config/WHYJRewardConfig.cs
@@ -0,0 +1,44 @@
+锘�//--------------------------------------------------------
+//    [Author]:			绗簩涓栫晫
+//    [  Date ]:		   Friday, September 21, 2018
+//--------------------------------------------------------
+
+using UnityEngine;
+using System;
+
+namespace TableConfig {
+
+    
+	public partial class WHYJRewardConfig : ConfigBase {
+
+		public int ID { get ; private set ; }
+		public string Reward { get ; private set; } 
+		public string Quantity { get ; private set; } 
+
+		public override string getKey()
+        {
+            return ID.ToString();
+        }
+
+		public override void Parse() {
+			try
+            {
+                ID=IsNumeric(rawContents[0]) ? int.Parse(rawContents[0]):0; 
+			
+				Reward = rawContents[1].Trim();
+			
+				Quantity = rawContents[2].Trim();
+            }
+            catch (Exception ex)
+            {
+                DebugEx.Log(ex);
+            }
+		}
+	
+	}
+
+}
+
+
+
+
diff --git a/Core/GameEngine/Model/Config/WHYJRewardConfig.cs.meta b/Core/GameEngine/Model/Config/WHYJRewardConfig.cs.meta
new file mode 100644
index 0000000..015701e
--- /dev/null
+++ b/Core/GameEngine/Model/Config/WHYJRewardConfig.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 00dab7d472dcc5644902b144de22ce01
+timeCreated: 1537529264
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Core/GameEngine/Model/ConfigManager.cs b/Core/GameEngine/Model/ConfigManager.cs
index 4515c91..8358d24 100644
--- a/Core/GameEngine/Model/ConfigManager.cs
+++ b/Core/GameEngine/Model/ConfigManager.cs
@@ -191,7 +191,7 @@
         AddAsyncTask<FairyGrabBossConfig>();
         AddAsyncTask<DungeonSpecialStateTimeConfig>();
         AddAsyncTask<DailyQuestSpecialOpenTimeConfig>();
-
+        AddAsyncTask<WHYJRewardConfig>();
         while (!AllCompleted())
         {
             var completedCount = 0;
@@ -523,8 +523,7 @@
                 lines = File.ReadAllLines(path, Encoding.UTF8);
                 break;
             case AssetPath.External:
-                var assetVersion = AssetVersionUtility.GetAssetVersion(StringUtility.Contact("config/", fileName, ".txt"));
-                path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, assetVersion.relativePath);
+                path = AssetVersionUtility.GetAssetFilePath(StringUtility.Contact("config/", fileName, ".txt"));
                 lines = File.ReadAllLines(path, Encoding.UTF8);
                 break;
         }
diff --git a/Core/NetworkPackage/ClientPack/ClientToMapServer/CA5_Function/CA5C4_tagCMDogzEquipPlus.cs b/Core/NetworkPackage/ClientPack/ClientToMapServer/CA5_Function/CA5C4_tagCMDogzEquipPlus.cs
index 1c86ad8..95b6feb 100644
--- a/Core/NetworkPackage/ClientPack/ClientToMapServer/CA5_Function/CA5C4_tagCMDogzEquipPlus.cs
+++ b/Core/NetworkPackage/ClientPack/ClientToMapServer/CA5_Function/CA5C4_tagCMDogzEquipPlus.cs
@@ -11,6 +11,7 @@
     public byte IsDouble;    //是否双倍强化

 

     public CA5C4_tagCMDogzEquipPlus () {

+        combineCmd = (ushort)0x03FE;

         _cmd = (ushort)0xA5C4;

     }

 

diff --git a/Core/NetworkPackage/DTCFile/ServerPack/H01_System/DTC0102_tagCDBPlayer.cs b/Core/NetworkPackage/DTCFile/ServerPack/H01_System/DTC0102_tagCDBPlayer.cs
index f21e090..53194fe 100644
--- a/Core/NetworkPackage/DTCFile/ServerPack/H01_System/DTC0102_tagCDBPlayer.cs
+++ b/Core/NetworkPackage/DTCFile/ServerPack/H01_System/DTC0102_tagCDBPlayer.cs
@@ -21,11 +21,6 @@
 
         H0102_tagCDBPlayer vNetData = vNetPack as H0102_tagCDBPlayer;
 
-        SDKUtility.Instance.RoleLogin(vNetData.PlayerID.ToString(),
-                                      vNetData.PlayerName,
-                                      vNetData.LV.ToString(),
-                                      vNetData.VIPLv.ToString());
-
         DEBUG_0102 = true;
         DTC0403_tagPlayerLoginLoadOK.finishedLogin = false;
         DEBUG_STEP = 0;
@@ -52,6 +47,12 @@
         }
 
         PlayerDatas.Instance.InitPlayerData(vNetData);
+
+        SDKUtility.Instance.RoleLogin(vNetData.PlayerID.ToString(),
+                                      vNetData.PlayerName,
+                                      vNetData.LV.ToString(),
+                                      vNetData.VIPLv.ToString());
+
         var _mapConfig = Config.Instance.Get<MapConfig>(vNetData.MapID);
 
         DTCA127_tagMCStartChangeMap.LineID = 0;
@@ -164,6 +165,7 @@
             UnityEngine.Object.Instantiate(Resources.Load<GameObject>("Prefabs/GameCamera"));
             CameraController.Instance.AcceptInput = false;
             CameraController.Instance.CameraObject.enabled = false;
+            CameraController.Instance.QualityLevelChanged();
         }
 
         var hudRoot = HUDCenter.hudRoot;
diff --git a/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0405_tagPlayerDisappear.cs b/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0405_tagPlayerDisappear.cs
index 876dc65..4d70954 100644
--- a/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0405_tagPlayerDisappear.cs
+++ b/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0405_tagPlayerDisappear.cs
@@ -24,6 +24,11 @@
 
         for (int i = 0; i < vNetData.Players.Length; ++i)
         {
+            if (BattleEffectPlayRule.Instance.sortPlayerList.Contains(vNetData.Players[i]))
+            {
+                BattleEffectPlayRule.Instance.sortPlayerList.Remove(vNetData.Players[i]);
+            }
+
             _actor = GAMgr.Instance.GetBySID(vNetData.Players[i]);
 
             if (_actor != null)
diff --git a/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0434_tagAreaPlayerAppearEx.cs b/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0434_tagAreaPlayerAppearEx.cs
index 5ba7bad..5d3dabd 100644
--- a/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0434_tagAreaPlayerAppearEx.cs
+++ b/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0434_tagAreaPlayerAppearEx.cs
@@ -25,6 +25,11 @@
             // 寮傚父
         }
 
+        if (!BattleEffectPlayRule.Instance.sortPlayerList.Contains(vNetData.PlayerID))
+        {
+            BattleEffectPlayRule.Instance.sortPlayerList.Add(vNetData.PlayerID);
+        }
+
         // 绂荤嚎鐜╁
         if (vNetData.State == 1)
         {
diff --git a/Core/NetworkPackage/DTCFile/ServerPack/H06_PlayerVsNPC/DTC0614_tagUseSkillPos.cs b/Core/NetworkPackage/DTCFile/ServerPack/H06_PlayerVsNPC/DTC0614_tagUseSkillPos.cs
index c2d302d..0bf7a49 100644
--- a/Core/NetworkPackage/DTCFile/ServerPack/H06_PlayerVsNPC/DTC0614_tagUseSkillPos.cs
+++ b/Core/NetworkPackage/DTCFile/ServerPack/H06_PlayerVsNPC/DTC0614_tagUseSkillPos.cs
@@ -57,46 +57,49 @@
             StatusMgr.Instance.GetBuffIds(vNetData.ObjID, ref _skill.cacheBuffList);
             _skill.OnRecv_SkillCast();
 
-            // 杩欓噷鎾斁閰嶇疆鐨勬妧鑳界壒鏁�
-            if (_skill.skillInfo.config.EffectName > 0)
+            if (!(_attacker is GA_Player) || BattleEffectPlayRule.Instance.CanPlay(vNetData.ObjID))
             {
-                bool _playEffect = true;
-
-                if (vNetData.ObjID != PlayerDatas.Instance.PlayerId)
+                // 杩欓噷鎾斁閰嶇疆鐨勬妧鑳界壒鏁�
+                if (_skill.skillInfo.config.EffectName > 0)
                 {
-                    if (!_attacker.ShowOrHide
-                     || SystemSetting.Instance.GetCurrentQualityLevel() == GameQuality.Low)
-                    {
-                        _playEffect = false;
-                    }
-                }
+                    bool _playEffect = true;
 
-                if (_playEffect)
-                {
-                    if (_skill.warnPosList.Count > 1)
+                    if (vNetData.ObjID != PlayerDatas.Instance.PlayerId)
                     {
-                        for (int i = 0; i < _skill.warnPosList.Count; ++i)
+                        if (!_attacker.ShowOrHide
+                         || SystemSetting.Instance.GetCurrentQualityLevel() == GameQuality.Low)
                         {
-                            SFXPlayUtility.Instance.PlayBattleEffect(_skill.skillInfo.config.EffectName, _skill.warnPosList[i], Vector3.forward);
+                            _playEffect = false;
                         }
                     }
-                    else
+
+                    if (_playEffect)
                     {
-                        if ((_skill.skillInfo.config.Tag % 10) == 0 || (_skill.skillInfo.config.Tag % 10) == 1 || _attacker is GActorNpcFight)
+                        if (_skill.warnPosList.Count > 1)
                         {
-                            SFXPlayUtility.Instance.PlayBattleEffect(_skill.skillInfo.config.EffectName, _attacker);
+                            for (int i = 0; i < _skill.warnPosList.Count; ++i)
+                            {
+                                SFXPlayUtility.Instance.PlayBattleEffect(_skill.skillInfo.config.EffectName, _skill.warnPosList[i], Vector3.forward);
+                            }
                         }
                         else
                         {
-                            Vector3 _pos = new Vector3((vNetData.PosX - GA_Hero.MapOffset.x) * .5f,
-                                            _attacker.Pos.y,
-                                            (vNetData.PosY - GA_Hero.MapOffset.z) * .5f);
+                            if ((_skill.skillInfo.config.Tag % 10) == 0 || (_skill.skillInfo.config.Tag % 10) == 1 || _attacker is GActorNpcFight)
+                            {
+                                SFXPlayUtility.Instance.PlayBattleEffect(_skill.skillInfo.config.EffectName, _attacker);
+                            }
+                            else
+                            {
+                                Vector3 _pos = new Vector3((vNetData.PosX - GA_Hero.MapOffset.x) * .5f,
+                                                _attacker.Pos.y,
+                                                (vNetData.PosY - GA_Hero.MapOffset.z) * .5f);
 
-                            Vector3 _dir = MathUtility.ForwardXZ(_pos, _attacker.Pos);
+                                Vector3 _dir = MathUtility.ForwardXZ(_pos, _attacker.Pos);
 
-                            SFXPlayUtility.Instance.PlayBattleEffect(_skill.skillInfo.config.EffectName,
-                                                                     _pos,
-                                                                     _dir);
+                                SFXPlayUtility.Instance.PlayBattleEffect(_skill.skillInfo.config.EffectName,
+                                                                         _pos,
+                                                                         _dir);
+                            }
                         }
                     }
                 }
diff --git a/Core/NetworkPackage/DTCFile/ServerPack/HB4_Fight/DTCB401_tagMCSkillHurtList.cs b/Core/NetworkPackage/DTCFile/ServerPack/HB4_Fight/DTCB401_tagMCSkillHurtList.cs
index a814003..4aaea9d 100644
--- a/Core/NetworkPackage/DTCFile/ServerPack/HB4_Fight/DTCB401_tagMCSkillHurtList.cs
+++ b/Core/NetworkPackage/DTCFile/ServerPack/HB4_Fight/DTCB401_tagMCSkillHurtList.cs
@@ -41,23 +41,26 @@
             }
         }
 
-        if (_skill.skillInfo.config.EffectName != 0)
+        if (!(_attacker is GA_Player) || BattleEffectPlayRule.Instance.CanPlay(vNetData.ObjID))
         {
-            bool _playEffect = true;
-
-            if (vNetData.ObjID != PlayerDatas.Instance.PlayerId)
+            if (_skill.skillInfo.config.EffectName != 0)
             {
-                if (!_attacker.ShowOrHide
-                 || SystemSetting.Instance.GetCurrentQualityLevel() == GameQuality.Low)
+                bool _playEffect = true;
+
+                if (vNetData.ObjID != PlayerDatas.Instance.PlayerId)
                 {
-                    _playEffect = false;
+                    if (!_attacker.ShowOrHide
+                     || SystemSetting.Instance.GetCurrentQualityLevel() == GameQuality.Low)
+                    {
+                        _playEffect = false;
+                    }
+
                 }
 
-            }
-
-            if (_playEffect)
-            {
-                SFXPlayUtility.Instance.PlayBattleEffect(_skill.skillInfo.config.EffectName, _attacker);
+                if (_playEffect)
+                {
+                    SFXPlayUtility.Instance.PlayBattleEffect(_skill.skillInfo.config.EffectName, _attacker);
+                }
             }
         }
 
diff --git a/Core/NetworkPackage/ServerPack/HA0_Sys/HA005_tagOpenServerDay.cs b/Core/NetworkPackage/ServerPack/HA0_Sys/HA005_tagOpenServerDay.cs
index 300073e..4dd30db 100644
--- a/Core/NetworkPackage/ServerPack/HA0_Sys/HA005_tagOpenServerDay.cs
+++ b/Core/NetworkPackage/ServerPack/HA0_Sys/HA005_tagOpenServerDay.cs
@@ -1,26 +1,37 @@
 using UnityEngine;
 using System.Collections;
 
-//A0 05 鍚屾寮�鏈嶅ぉ鏁� #tagOpenServerDay
-
-public class HA005_tagOpenServerDay : GameNetPackBasic
-{
-    public ushort Day;    // 宸插紑鏈嶅ぉ鏁帮紝浠�0寮�濮�
-    public byte IsMixServer;    //鏄惁鏄悎鏈嶆湇鍔″櫒
-    public ushort MixDay;    // 宸插悎鏈嶅ぉ鏁帮紝浠�0寮�濮�
-    public string OpenServerTime;    //寮�鏈嶆椂闂磞yyy-MM-dd HH:mm:ss
-
-    public HA005_tagOpenServerDay()
-    {
-        _cmd = (ushort)0xA005;
-    }
-
-    public override void ReadFromBytes(byte[] vBytes)
-    {
-        TransBytes(out Day, vBytes, NetDataType.WORD);
-        TransBytes(out IsMixServer, vBytes, NetDataType.BYTE);
-        TransBytes(out MixDay, vBytes, NetDataType.WORD);
-        TransBytes(out OpenServerTime, vBytes, NetDataType.Chars, 19);
-    }
-
-}
\ No newline at end of file
+//A0 05 同步开服天数 #tagOpenServerDay

+

+public class HA005_tagOpenServerDay : GameNetPackBasic {

+    public ushort Day;    // 已开服天数,从0开始

+    public byte IsMixServer;    //是否是合服服务器

+    public ushort MixDay;    // 已合服天数,从0开始

+    public byte OpenWeekday;    //开服是周几,1代表周一

+    public ushort NowYear;    //服务器当前时间 - 年

+    public byte NowMonth;

+    public byte NowDay;

+    public byte NowHour;

+    public byte NowMinute;

+    public byte NowSecond;

+    public uint NowMicSecond;

+

+    public HA005_tagOpenServerDay () {

+        _cmd = (ushort)0xA005;

+    }

+

+    public override void ReadFromBytes (byte[] vBytes) {

+        TransBytes (out Day, vBytes, NetDataType.WORD);

+        TransBytes (out IsMixServer, vBytes, NetDataType.BYTE);

+        TransBytes (out MixDay, vBytes, NetDataType.WORD);

+        TransBytes (out OpenWeekday, vBytes, NetDataType.BYTE);

+        TransBytes (out NowYear, vBytes, NetDataType.WORD);

+        TransBytes (out NowMonth, vBytes, NetDataType.BYTE);

+        TransBytes (out NowDay, vBytes, NetDataType.BYTE);

+        TransBytes (out NowHour, vBytes, NetDataType.BYTE);

+        TransBytes (out NowMinute, vBytes, NetDataType.BYTE);

+        TransBytes (out NowSecond, vBytes, NetDataType.BYTE);

+        TransBytes (out NowMicSecond, vBytes, NetDataType.DWORD);

+    }

+

+}

diff --git a/Core/SDK/SDKUtility.cs b/Core/SDK/SDKUtility.cs
index 565df5f..444c47f 100644
--- a/Core/SDK/SDKUtility.cs
+++ b/Core/SDK/SDKUtility.cs
@@ -655,6 +655,10 @@
         {
             m_PaymentTable["RechargeChannel"] = "1";
         }
+        else if (ChannelPlatform == E_ChannelPlatform.Sp)
+        {
+            m_PaymentTable["RechargeChannel"] = "2";
+        }
 
         var _stringBuilder = new System.Text.StringBuilder();
         var _md5Body = _stringBuilder.Append(m_PaymentTable["AppID"]).
@@ -896,11 +900,37 @@
     {
         m_Json.Clear();
         m_Json["code"] = CodeU2A.RoleLogin;
+
         m_Json["roleID"] = roleID;
         m_Json["roleName"] = roleName;
         m_Json["sid"] = "s" + ServerListCenter.Instance.currentServer.region_flag;
-        m_Json["level"] = lv;
-        m_Json["vipLevel"] = vipLV;
+        m_Json["serverName"] = ServerListCenter.Instance.currentServer.name;
+        m_Json["familyName"] = PlayerDatas.Instance.baseData.FamilyName;
+        m_Json["level"] = PlayerDatas.Instance.baseData.LV;
+        m_Json["job"] = PlayerDatas.Instance.baseData.Job.ToString();
+        m_Json["money"] = PlayerDatas.Instance.baseData.Gold.ToString();
+        m_Json["gameName"] = VersionConfig.Get().productName;
+        m_Json["vipLevel"] = PlayerDatas.Instance.baseData.VIPLv.ToString();
+
+        SendMessageToSDK(m_Json);
+    }
+
+    public void RoleLevelUp()
+    {
+        m_Json.Clear();
+        m_Json["code"] = CodeU2A.RoleLevelUp;
+
+        m_Json["roleID"] = PlayerDatas.Instance.PlayerId.ToString();
+        m_Json["roleName"] = PlayerDatas.Instance.baseData.PlayerName;
+        m_Json["sid"] = "s" + ServerListCenter.Instance.currentServer.region_flag;
+        m_Json["serverName"] = ServerListCenter.Instance.currentServer.name;
+        m_Json["familyName"] = PlayerDatas.Instance.baseData.FamilyName;
+        m_Json["level"] = PlayerDatas.Instance.baseData.LV;
+        m_Json["job"] = PlayerDatas.Instance.baseData.Job.ToString();
+        m_Json["money"] = PlayerDatas.Instance.baseData.Gold.ToString();
+        m_Json["gameName"] = VersionConfig.Get().productName;
+        m_Json["vipLevel"] = PlayerDatas.Instance.baseData.VIPLv.ToString();
+
         SendMessageToSDK(m_Json);
     }
 
diff --git a/Core/SFX/SFXPlayUtility.cs b/Core/SFX/SFXPlayUtility.cs
index 8e951c7..ef5f1d5 100644
--- a/Core/SFX/SFXPlayUtility.cs
+++ b/Core/SFX/SFXPlayUtility.cs
@@ -21,11 +21,6 @@
 
         SFXController _controller = Play(id, parent, scale);
 
-        if (_controller != null)
-        {
-            _controller.gameObject.SetLayer(LayerUtility.BattleEffect, true);
-        }
-
         return _controller;
     }
 
@@ -79,11 +74,6 @@
     public SFXController PlayBattleEffect(int id, Vector3 position, Vector3 forward, float scale = 1f)
     {
         SFXController _controller = Play(id, position, forward, scale);
-
-        if (_controller != null)
-        {
-            _controller.gameObject.SetLayer(LayerUtility.BattleEffect, true);
-        }
 
         return _controller;
     }
diff --git a/Fight/Actor/AI/AI_BossDSX.cs b/Fight/Actor/AI/AI_BossDSX.cs
index 2d9a885..47bd814 100644
--- a/Fight/Actor/AI/AI_BossDSX.cs
+++ b/Fight/Actor/AI/AI_BossDSX.cs
@@ -322,6 +322,8 @@
 
             Transform _temp1 = WindowCenter.Instance.uiRoot.baseCanvas.Find("MainInterfaceWin/JoyStick");
             _temp1.gameObject.SetActive(true);
+
+            WindowCenter.Instance.Close<NewGuideWin>();
         }
     }
 
diff --git a/Fight/Actor/Skill/FlyObject/FoTransmit.cs b/Fight/Actor/Skill/FlyObject/FoTransmit.cs
index 32fd1fc..dfd21b5 100644
--- a/Fight/Actor/Skill/FlyObject/FoTransmit.cs
+++ b/Fight/Actor/Skill/FlyObject/FoTransmit.cs
@@ -108,21 +108,23 @@
 
                     if (m_FoTransMit.ammoEffectId > 0)
                     {
-                        SFXController _sfx = SFXPlayUtility.Instance.PlayBattleEffect(m_FoTransMit.ammoEffectId, _fight);
-                        if (_sfx)
+                        if (BattleEffectPlayRule.Instance.CanPlay(m_InitInfo.casterServerObjID))
                         {
-                            _sfx.duration = m_FoTransMit.eachLastTime;
-                            FoTransmitController _controller = _sfx.AddMissingComponent<FoTransmitController>();
-                            _controller.start = _start;
-                            _controller.end = _end;
-                            _controller.transmit = _sfx;
-                            _controller.enabled = true;
-                            _sfx.m_OnFinished += OnSFXDisable;
+                            SFXController _sfx = SFXPlayUtility.Instance.PlayBattleEffect(m_FoTransMit.ammoEffectId, _fight);
+                            if (_sfx)
+                            {
+                                _sfx.duration = m_FoTransMit.eachLastTime;
+                                FoTransmitController _controller = _sfx.AddMissingComponent<FoTransmitController>();
+                                _controller.start = _start;
+                                _controller.end = _end;
+                                _controller.transmit = _sfx;
+                                _controller.enabled = true;
+                                _sfx.m_OnFinished += OnSFXDisable;
 
-                            m_CacheAllEffect.Add(_sfx);
+                                m_CacheAllEffect.Add(_sfx);
+                            }
+                            //Debug.LogFormat("鎾斁鐗规晥: 寮�濮�: {0}, 缁撴潫: {1}", _start, _end);
                         }
-
-                        //Debug.LogFormat("鎾斁鐗规晥: 寮�濮�: {0}, 缁撴潫: {1}", _start, _end);
                     }
 
                     if (_target2 != null)
diff --git a/Fight/Actor/Skill/XRayShadow.cs b/Fight/Actor/Skill/XRayShadow.cs
index f38a2ce..88f7c9a 100644
--- a/Fight/Actor/Skill/XRayShadow.cs
+++ b/Fight/Actor/Skill/XRayShadow.cs
@@ -32,7 +32,7 @@
         _xayShadow.transform.localScale = requester.transform.localScale;
         _xayShadow.transform.position = requester.transform.position;
         _xayShadow.transform.rotation = requester.transform.rotation;
-        _xayShadow.layer = LayerUtility.BattleEffect;
+        _xayShadow.layer = LayerUtility.BattleEffectLow;
 
         XRayShadowController _controller = _xayShadow.AddComponent<XRayShadowController>();
         _controller.duration = lastTime;
diff --git a/Fight/Actor/State/SMB/STM_BaseAttack.cs b/Fight/Actor/State/SMB/STM_BaseAttack.cs
index 72930ad..c6a66d8 100644
--- a/Fight/Actor/State/SMB/STM_BaseAttack.cs
+++ b/Fight/Actor/State/SMB/STM_BaseAttack.cs
@@ -934,6 +934,11 @@
             }
         }
 
+        if (owner is GA_Player && !BattleEffectPlayRule.Instance.CanPlay(owner.ServerInstID))
+        {
+            return;
+        }
+
         SFXController _controller = SFXPlayUtility.Instance.PlayBattleEffect(id, owner);
         if (_controller)
         {
diff --git a/Fight/Actor/State/SMB/STM_NormalAttack.cs b/Fight/Actor/State/SMB/STM_NormalAttack.cs
index a54c4e2..1d4473e 100644
--- a/Fight/Actor/State/SMB/STM_NormalAttack.cs
+++ b/Fight/Actor/State/SMB/STM_NormalAttack.cs
@@ -79,7 +79,10 @@
                 {
                     if (_player.SelectTarget != null)
                     {
-                        m_StartHeadEffect = SFXPlayUtility.Instance.PlayBattleEffect(m_CacheSkill.skillInfo.soFile.effectOnTargetHead, _player.SelectTarget);
+                        if (BattleEffectPlayRule.Instance.CanPlay(_player.ServerInstID))
+                        {
+                            m_StartHeadEffect = SFXPlayUtility.Instance.PlayBattleEffect(m_CacheSkill.skillInfo.soFile.effectOnTargetHead, _player.SelectTarget);
+                        }
                     }
                 }
             }
diff --git a/Fight/Actor/Status/Status_Base.cs b/Fight/Actor/Status/Status_Base.cs
index 5050ed0..3351646 100644
--- a/Fight/Actor/Status/Status_Base.cs
+++ b/Fight/Actor/Status/Status_Base.cs
@@ -32,32 +32,35 @@
 
         GActorFight _target = GAMgr.Instance.GetBySID(data.ObjID) as GActorFight;
 
-        if (_target != null)
+        if (!(_target is GA_Player) || BattleEffectPlayRule.Instance.CanPlay(data.ObjID))
         {
-            if (m_SkillConfig.BuffEffectID > 0)
+            if (_target != null)
             {
-                if (m_Effect)
+                if (m_SkillConfig.BuffEffectID > 0)
                 {
-                    SFXPlayUtility.Instance.Release(m_Effect);
-                }
-
-                bool _playEffect = true;
-
-                if (h0605.ObjID != PlayerDatas.Instance.PlayerId)
-                {
-                    if (!_target.ShowOrHide
-                     || SystemSetting.Instance.GetCurrentQualityLevel() == GameQuality.Low)
-                    {
-                        _playEffect = false;
-                    }
-                }
-
-                if (_playEffect)
-                {
-                    m_Effect = SFXPlayUtility.Instance.PlayBattleEffect(m_SkillConfig.BuffEffectID, _target);
                     if (m_Effect)
                     {
-                        m_Effect.m_OnFinished += OnEffectOver;
+                        SFXPlayUtility.Instance.Release(m_Effect);
+                    }
+
+                    bool _playEffect = true;
+
+                    if (h0605.ObjID != PlayerDatas.Instance.PlayerId)
+                    {
+                        if (!_target.ShowOrHide
+                         || SystemSetting.Instance.GetCurrentQualityLevel() == GameQuality.Low)
+                        {
+                            _playEffect = false;
+                        }
+                    }
+
+                    if (_playEffect)
+                    {
+                        m_Effect = SFXPlayUtility.Instance.PlayBattleEffect(m_SkillConfig.BuffEffectID, _target);
+                        if (m_Effect)
+                        {
+                            m_Effect.m_OnFinished += OnEffectOver;
+                        }
                     }
                 }
             }
diff --git a/Fight/GameActor/BattleEffectPlayRule.cs b/Fight/GameActor/BattleEffectPlayRule.cs
new file mode 100644
index 0000000..f1cba8b
--- /dev/null
+++ b/Fight/GameActor/BattleEffectPlayRule.cs
@@ -0,0 +1,106 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+public class BattleEffectPlayRule : Singleton<BattleEffectPlayRule>
+{
+    public List<uint> sortPlayerList = new List<uint>();
+
+    private int limit
+    {
+        get
+        {
+            if (SystemSetting.Instance.GetCurrentQualityLevel() == GameQuality.High)
+            {
+                return 7;
+            }
+            else if (SystemSetting.Instance.GetCurrentQualityLevel() == GameQuality.Medium)
+            {
+                return 3;
+            }
+            else
+            {
+                return 0;
+            }
+        }
+    }
+
+    public float timeEscape;
+
+    public void Update()
+    {
+        if (Time.realtimeSinceStartup - timeEscape > .5f)
+        {
+            GA_Hero _hero = PlayerDatas.Instance.hero;
+            if (_hero == null)
+            {
+                return;
+            }
+
+            sortPlayerList.Sort((id1, id2) =>
+            {
+                GActor _actor1 = GAMgr.Instance.GetBySID(id1);
+                GActor _actor2 = GAMgr.Instance.GetBySID(id2);
+
+                float _dis1 = 0f;
+                float _dis2 = 0f;
+                
+                if (_actor1 != null)
+                {
+                    _dis1 = MathUtility.DistanceSqrtXZ(_hero.Pos, _actor1.Pos);
+                }
+
+                if (_actor2 != null)
+                {
+                    _dis2 = MathUtility.DistanceSqrtXZ(_hero.Pos, _actor2.Pos);
+                }
+
+                return _dis2 > _dis1 ? -1 : 1;
+            });
+
+            timeEscape = Time.realtimeSinceStartup;
+        }
+    }
+
+    public bool CanPlay(uint sid)
+    {
+        GA_Hero _hero = PlayerDatas.Instance.hero;
+        if (_hero == null)
+        {
+            return false;
+        }
+
+        // 閫変腑鑻遍泟蹇呮樉绀�
+        if (_hero.SelectTarget != null)
+        {
+            if (_hero.SelectTarget.ServerInstID == sid)
+            {
+                return true;
+            }
+        }
+
+        if (_hero.LockTarget != null)
+        {
+            if (_hero.LockTarget.ServerInstID == sid)
+            {
+                return true;
+            }
+        }
+
+        // 鑾峰彇浼犲叆鐨勭帺瀹跺湪鎺掑簭鍚庣殑闃熷垪涓殑绱㈠紩
+        int _index = sortPlayerList.IndexOf(sid);
+
+        // 涓嶅瓨鍦ㄥ彲鑳芥槸寮傚父,涓嶆挱鏀�
+        if (_index < 0)
+        {
+            return false;
+        }
+
+        // 鍦ㄩ檺瀹氱殑鏁伴噺鍐�,鍏佽鎾斁
+        if (_index < limit)
+        {
+            return true;
+        }
+
+        return false;
+    }
+}
\ No newline at end of file
diff --git a/Fight/GameActor/BattleEffectPlayRule.cs.meta b/Fight/GameActor/BattleEffectPlayRule.cs.meta
new file mode 100644
index 0000000..fb58141
--- /dev/null
+++ b/Fight/GameActor/BattleEffectPlayRule.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 52c66c7311d7af341b7bdb32f3cd7096
+timeCreated: 1537445788
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Fight/GameActor/GAMgr.cs b/Fight/GameActor/GAMgr.cs
index 1072535..ef79311 100644
--- a/Fight/GameActor/GAMgr.cs
+++ b/Fight/GameActor/GAMgr.cs
@@ -12,6 +12,8 @@
     public Dictionary<int, string> s_NpcID2BundleName = new Dictionary<int, string>();
     public Dictionary<int, string> s_NpcID2Assetname = new Dictionary<int, string>();
 
+
+
     public event UnityAction<uint> OnGActorRequest;
     public event UnityAction<uint> OnGActorServerDie;
 
@@ -923,6 +925,8 @@
         }
 
         UpdateOffLinePlayer();
+
+        BattleEffectPlayRule.Instance.Update();
     }
 
     public void DoLateUpdate()
diff --git a/Fight/GameActor/GActorNpcNoFight.cs b/Fight/GameActor/GActorNpcNoFight.cs
index 9dc616c..0c93cd9 100644
--- a/Fight/GameActor/GActorNpcNoFight.cs
+++ b/Fight/GameActor/GActorNpcNoFight.cs
@@ -140,6 +140,11 @@
             Object.Destroy(m_Dig.gameObject);
             m_Dig = null;
         }
+
+        if(Root)
+        {
+            Root.localScale = Vector3.one;
+        }
     }
 
     public override void Destroy()
diff --git a/Fight/GameActor/GActorPlayerBase.cs b/Fight/GameActor/GActorPlayerBase.cs
index 2a1a3ec..c74caee 100644
--- a/Fight/GameActor/GActorPlayerBase.cs
+++ b/Fight/GameActor/GActorPlayerBase.cs
@@ -2323,10 +2323,13 @@
         SetAnimatorSpeed(JobSetup.RushAnimatorSpeed * Constants.F_DELTA);
         m_LastRushTime = Time.time;
 
-        if (m_RushEffect == null)
+        if (this is GA_Hero || BattleEffectPlayRule.Instance.CanPlay(ServerInstID))
         {
-            m_RushEffect = SFXPlayUtility.Instance.PlayBattleEffect(50401, this);
-            m_RushEffect.duration = 0;
+            if (m_RushEffect == null)
+            {
+                m_RushEffect = SFXPlayUtility.Instance.PlayBattleEffect(50401, this);
+                m_RushEffect.duration = 0;
+            }
         }
     }
 
diff --git a/Fight/MapTransferUtility.cs b/Fight/MapTransferUtility.cs
index 1352753..3e5888d 100644
--- a/Fight/MapTransferUtility.cs
+++ b/Fight/MapTransferUtility.cs
@@ -752,7 +752,7 @@
             var mapResConfig = DTCA127_tagMCStartChangeMap.GetMapResourcesConfig(mapId, 0);
             var assetVersion = AssetVersionUtility.GetAssetVersion(StringUtility.Contact("maps/", mapResConfig.MapResources.ToLower()));
 
-            if (!assetVersion.IsPriorAsset())
+            if (assetVersion != null && !assetVersion.IsPriorAsset())
             {
                 InGameDownLoad.Instance.TryDownLoad(InGameDownLoad.Dominant.Whole);
                 return false;
diff --git a/Fight/PreFightMission.cs b/Fight/PreFightMission.cs
index 4fc6349..46fde17 100644
--- a/Fight/PreFightMission.cs
+++ b/Fight/PreFightMission.cs
@@ -631,7 +631,8 @@
 
         if (GA_Hero.s_MapSwitching)
         {
-            if (PlayerDatas.Instance.hero.IsRun())
+            if (PlayerDatas.Instance.hero != null
+             && PlayerDatas.Instance.hero.IsRun())
             {
                 PlayerDatas.Instance.hero.IdleImmediate();
             }
@@ -1555,7 +1556,9 @@
         {
             yield break;
         }
-
+        
+        CameraController.Instance.MaskCamera.gameObject.SetActive(false);
+        
         if (m_MoveToEffect)
         {
             SFXPlayUtility.Instance.Release(m_MoveToEffect);
diff --git a/Fight/Stage/MapEditor/GuideDialogueWin.cs b/Fight/Stage/MapEditor/GuideDialogueWin.cs
index aa144a1..f19d0da 100644
--- a/Fight/Stage/MapEditor/GuideDialogueWin.cs
+++ b/Fight/Stage/MapEditor/GuideDialogueWin.cs
@@ -142,7 +142,7 @@
             playerName.text = PlayerDatas.Instance.baseData.PlayerName;
             playerContent.text = m_DialogConfig.content;
 
-            UI3DModelExhibition.Instance.BeginShowPlayer(playerIcon, PlayerDatas.Instance.baseData.Job, true);
+            UI3DModelExhibition.Instance.ShowPlayer(playerIcon, PlayerDatas.Instance.baseData.Job, true);
         }
         else
         {
@@ -153,7 +153,7 @@
             npcContent.text = m_DialogConfig.content;
 
             var npcConfig = Config.Instance.Get<NPCConfig>(m_DialogConfig.npcId);
-            UI3DModelExhibition.Instance.BeginShowNPC(m_DialogConfig.npcId, npcConfig.UIModeLOffset, npcConfig.UIModelRotation, npcIcon, false, true);
+            UI3DModelExhibition.Instance.ShowNPC(m_DialogConfig.npcId, npcConfig.UIModeLOffset, npcConfig.UIModelRotation, npcIcon, false, true);
         }
 
         if (m_DialogConfig.TalkID != 0)
diff --git a/Fight/Stage/StageManager.cs b/Fight/Stage/StageManager.cs
index 1fbd82a..adf8ca8 100644
--- a/Fight/Stage/StageManager.cs
+++ b/Fight/Stage/StageManager.cs
@@ -17,40 +17,32 @@
     public event Action<float> loadingProgressEvent;
 
     bool m_IsServerPreparing = false;
-    public bool isServerPreparing
-    {
+    public bool isServerPreparing {
         get { return m_IsServerPreparing; }
         set { m_IsServerPreparing = value; }
     }
 
-    public Stage.E_StageType StageType
-    {
-        get
-        {
+    public Stage.E_StageType StageType {
+        get {
             return m_StageType;
         }
     }
 
-    public Stage CurrentStage
-    {
-        get
-        {
+    public Stage CurrentStage {
+        get {
             return m_CurrentStage;
         }
     }
 
     int m_CurrentMapId;
-    public int currentMapId
-    {
+    public int currentMapId {
         get { return m_CurrentMapId; }
         private set { m_CurrentMapId = value; }
     }
 
     int m_CurrentMapResID;
-    public int currentMapResId
-    {
-        get
-        {
+    public int currentMapResId {
+        get {
             return m_CurrentMapResID;
         }
         private set { m_CurrentMapResID = value; }
@@ -61,11 +53,9 @@
 
 
     float m_LoadingProgress = 0f;
-    float loadingProgress
-    {
+    float loadingProgress {
         get { return m_LoadingProgress; }
-        set
-        {
+        set {
             m_LoadingProgress = value;
             if (loadingProgressEvent != null)
             {
@@ -98,7 +88,7 @@
         else
         {
             var assetVersion = AssetVersionUtility.GetAssetVersion(StringUtility.Contact("maps/", mapResConfig.MapResources.ToLower()));
-            if (assetVersion.IsPriorAsset())
+            if (assetVersion != null && assetVersion.IsPriorAsset())
             {
                 SnxxzGame.Instance.StartCoroutine(LoadCoroutine<T>(stageId, mapResConfig.ID, mapResConfig.MapResources, true));
             }
diff --git a/Plugins.meta b/Plugins.meta
new file mode 100644
index 0000000..2f4cbc0
--- /dev/null
+++ b/Plugins.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: d463e02633381cd46902c21b8d51f83e
+folderAsset: yes
+timeCreated: 1537519875
+licenseType: Pro
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Plugins/Trails.meta b/Plugins/Trails.meta
new file mode 100644
index 0000000..c303732
--- /dev/null
+++ b/Plugins/Trails.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 77d1032b5eb62ce4da86e600bc8884c8
+folderAsset: yes
+timeCreated: 1537519883
+licenseType: Pro
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Plugins/Trails/CircularBuffer.cs b/Plugins/Trails/CircularBuffer.cs
new file mode 100644
index 0000000..8055a0f
--- /dev/null
+++ b/Plugins/Trails/CircularBuffer.cs
@@ -0,0 +1,287 @@
+锘縰sing System;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace PigeonCoopToolkit.Utillities
+{
+	public class CircularBuffer<T> : IList<T>, ICollection<T>, 
+                                IEnumerable<T>, IEnumerable
+	{
+      /// <summary>
+      /// Creates a new instance of a <see cref="RingBuffer&lt;T&gt;"/> with a 
+      /// specified cache size.
+      // http://florianreischl.blogspot.com/2010/01/generic-c-ringbuffer.html
+      /// </summary>
+      /// <param name="capacity">The maximal count of items to be stored within 
+      /// the ring buffer.</param>
+        public CircularBuffer(int capacity)
+        {
+         // validate capacity
+         if (capacity <= 0)
+            throw new ArgumentException("Must be greater than zero", "capacity");
+         // set capacity and init the cache
+         Capacity = capacity;
+         _buffer = new T[capacity];
+      }
+
+      /// <summary>
+      /// the internal buffer
+      /// </summary>
+      T[] _buffer;
+      /// <summary>
+      /// The all-over position within the ring buffer. The position 
+      /// increases continously by adding new items to the buffer. This 
+      /// value is needed to calculate the current relative position within the 
+      /// buffer.
+      /// </summary>
+      int _position;
+      /// <summary>
+      /// The current version of the buffer, this is required for a correct 
+      /// exception handling while enumerating over the items of the buffer.
+      /// </summary>
+      long _version;
+
+      /// <summary>
+      /// Gets or sets an item for a specified position within the ring buffer.
+      /// </summary>
+      /// <param name="index">The position to get or set an item.</param>
+      /// <returns>The fond item at the specified position within the ring buffer.
+      /// </returns>
+      /// <exception cref="IndexOutOfRangeException"></exception>
+      public T this[int index] {
+         get {
+            // validate the index
+            if (index < 0 || index >= Count)
+               throw new IndexOutOfRangeException();
+            // calculate the relative position within the rolling base array
+            int index2 = (_position - Count + index) % Capacity;
+            return _buffer[index2]; 
+         }
+         set { Insert(index, value); }
+      }
+
+      /// <summary>
+      /// Gets the maximal count of items within the ring buffer.
+      /// </summary>
+      public int Capacity { get; private set; }
+      /// <summary>
+      /// Get the current count of items within the ring buffer.
+      /// </summary>
+      public int Count { get; private set; }
+      
+      /// <summary>
+      /// Adds a new item to the buffer.
+      /// </summary>
+      /// <param name="item">The item to be added to the buffer.</param>
+      public void Add(T item) {
+         // add a new item to the current relative position within the
+         // buffer and increase the position
+         _buffer[_position++ % Capacity] = item;
+         // increase the count if capacity is not yet reached
+         if (Count < Capacity) Count++;
+         // buffer changed; next version
+         _version++;
+      }
+
+      /// <summary>
+      /// Clears the whole buffer and releases all referenced objects 
+      /// currently stored within the buffer.
+      /// </summary>
+      public void Clear() {
+         for (int i = 0; i < Count; i++)
+            _buffer[i] = default(T);
+         _position = 0;
+         Count = 0;
+         _version++;
+      }
+
+      /// <summary>
+      /// Determines if a specified item is currently present within
+      /// the buffer.
+      /// </summary>
+      /// <param name="item">The item to search for within the current
+      /// buffer.</param>
+      /// <returns>True if the specified item is currently present within 
+      /// the buffer; otherwise false.</returns>
+      public bool Contains(T item) {
+         int index = IndexOf(item);
+         return index != -1;
+      }
+
+      /// <summary>
+      /// Copies the current items within the buffer to a specified array.
+      /// </summary>
+      /// <param name="array">The target array to copy the items of 
+      /// the buffer to.</param>
+      /// <param name="arrayIndex">The start position witihn the target
+      /// array to start copying.</param>
+      public void CopyTo(T[] array, int arrayIndex) {
+         for (int i = 0; i < Count; i++) {
+            array[i + arrayIndex] = _buffer[(_position - Count + i) % Capacity];
+         }
+      }
+
+      /// <summary>
+      /// Gets an enumerator over the current items within the buffer.
+      /// </summary>
+      /// <returns>An enumerator over the current items within the buffer.
+      /// </returns>
+      public IEnumerator<T> GetEnumerator() {
+         long version = _version;
+         for (int i = 0; i < Count; i++) {
+            if (version != _version)
+               throw new InvalidOperationException("Collection changed");
+            yield return this[i];
+         }
+      }
+
+      /// <summary>
+      /// Gets the position of a specied item within the ring buffer.
+      /// </summary>
+      /// <param name="item">The item to get the current position for.</param>
+      /// <returns>The zero based index of the found item within the 
+      /// buffer. If the item was not present within the buffer, this
+      /// method returns -1.</returns>
+      public int IndexOf(T item) {
+         // loop over the current count of items
+         for (int i = 0; i < Count; i++) {
+            // get the item at the relative position within the internal array
+            T item2 = _buffer[(_position - Count + i) % Capacity];
+            // if both items are null, return true
+            if (null == item && null == item2)
+               return i;
+            // if equal return the position
+            if (item != null && item.Equals(item2))
+               return i;
+         }
+         // nothing found
+         return -1;
+      }
+
+      /// <summary>
+      /// Inserts an item at a specified position into the buffer.
+      /// </summary>
+      /// <param name="index">The position within the buffer to add 
+      /// the new item.</param>
+      /// <param name="item">The new item to be added to the buffer.</param>
+      /// <exception cref="IndexOutOfRangeException"></exception>
+      /// <remarks>
+      /// If the specified index is equal to the current count of items
+      /// within the buffer, the specified item will be added.
+      /// 
+      /// <b>Warning</b>
+      /// Frequent usage of this method might become a bad idea if you are 
+      /// working with a large buffer capacity. The insertion of an item
+      /// at a specified position within the buffer causes causes all present 
+      /// items below the specified position to be moved one position.
+      /// </remarks>
+      public void Insert(int index, T item) {
+         // validate index
+         if (index < 0 || index > Count)
+            throw new IndexOutOfRangeException();
+         // add if index equals to count
+         if (index == Count) {
+            Add(item);
+            return;
+         }
+
+         // get the maximal count of items to be moved
+         int count = Math.Min(Count, Capacity - 1) - index;
+         // get the relative position of the new item within the buffer
+         int index2 = (_position - Count + index) % Capacity;
+
+         // move all items below the specified position
+         for (int i = index2 + count; i > index2; i--) {
+            int to = i % Capacity;
+            int from = (i - 1) % Capacity;
+            _buffer[to] = _buffer[from];
+         }
+
+         // set the new item
+         _buffer[index2] = item;
+
+         // adjust storage information
+         if (Count < Capacity) {
+            Count++;
+            _position++;
+         }
+         // buffer changed; next version
+         _version++;
+      }
+
+      /// <summary>
+      /// Removes a specified item from the current buffer.
+      /// </summary>
+      /// <param name="item">The item to be removed.</param>
+      /// <returns>True if the specified item was successfully removed
+      /// from the buffer; otherwise false.</returns>
+      /// <remarks>
+      /// <b>Warning</b>
+      /// Frequent usage of this method might become a bad idea if you are 
+      /// working with a large buffer capacity. The removing of an item 
+      /// requires a scan of the buffer to get the position of the specified
+      /// item. If the item was found, the deletion requires a move of all 
+      /// items stored abouve the found position.
+      /// </remarks>
+      public bool Remove(T item) {
+         // find the position of the specified item
+         int index = IndexOf(item);
+         // item was not found; return false
+         if (index == -1)
+            return false;
+         // remove the item at the specified position
+         RemoveAt(index);
+         return true;
+      }
+
+      /// <summary>
+      /// Removes an item at a specified position within the buffer.
+      /// </summary>
+      /// <param name="index">The position of the item to be removed.</param>
+      /// <exception cref="IndexOutOfRangeException"></exception>
+      /// <remarks>
+      /// <b>Warning</b>
+      /// Frequent usage of this method might become a bad idea if you are 
+      /// working with a large buffer capacity. The deletion requires a move 
+      /// of all items stored abouve the found position.
+      /// </remarks>
+      public void RemoveAt(int index) {
+         // validate the index
+         if (index < 0 || index >= Count)
+            throw new IndexOutOfRangeException();
+         // move all items above the specified position one step
+         // closer to zeri
+         for (int i = index; i < Count - 1; i++) {
+            // get the next relative target position of the item
+            int to = (_position - Count + i) % Capacity;
+            // get the next relative source position of the item
+            int from = (_position - Count + i + 1) % Capacity;
+            // move the item
+            _buffer[to] = _buffer[from];
+         }
+         // get the relative position of the last item, which becomes empty
+         // after deletion and set the item as empty
+         int last = (_position - 1) % Capacity;
+         _buffer[last] = default(T);
+         // adjust storage information
+         _position--;
+         Count--;
+         // buffer changed; next version
+         _version++;
+      }
+
+      /// <summary>
+      /// Gets if the buffer is read-only. This method always returns false.
+      /// </summary>
+      bool ICollection<T>.IsReadOnly { get { return false; } }
+
+      /// <summary>
+      /// See generic implementation of <see cref="GetEnumerator"/>.
+      /// </summary>
+      /// <returns>See generic implementation of <see cref="GetEnumerator"/>.
+      /// </returns>
+      IEnumerator IEnumerable.GetEnumerator() {
+         return this.GetEnumerator();
+      }
+   }
+}
\ No newline at end of file
diff --git a/Plugins/Trails/CircularBuffer.cs.meta b/Plugins/Trails/CircularBuffer.cs.meta
new file mode 100644
index 0000000..eb81254
--- /dev/null
+++ b/Plugins/Trails/CircularBuffer.cs.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 51a19be087405654c8b4b50c67fa9200
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
diff --git a/Plugins/Trails/GizmosExtra.cs b/Plugins/Trails/GizmosExtra.cs
new file mode 100644
index 0000000..05fa3c4
--- /dev/null
+++ b/Plugins/Trails/GizmosExtra.cs
@@ -0,0 +1,33 @@
+using UnityEngine;
+
+namespace PigeonCoopToolkit.Utillities
+{
+    public static class GizmosExtra
+    {
+
+        public static void GizmosDrawCircle(Vector3 position, Vector3 up, float size, int divisions)
+        {
+            Vector3 offset = (Quaternion.Euler(90,0,0) * (up* size)) ;
+
+            for (int i = 0; i < divisions; i++)
+            {
+
+                Vector3 newOffset = Quaternion.AngleAxis(360f / divisions, up) * offset;
+                Gizmos.DrawLine(position + offset, position + newOffset);
+                offset = newOffset;
+            }
+        }
+
+        public static void GizmosDrawArrow(Vector3 from, Vector3 to, float arrowSize)
+        {
+            Gizmos.DrawLine(from, to);
+
+            Vector3 dir = to - from;
+            dir = dir.normalized*arrowSize;
+
+            Gizmos.DrawLine(to, to - Quaternion.Euler(0, 0, 45)*dir);
+            Gizmos.DrawLine(to, to - Quaternion.Euler(0, 0, -45)*dir);
+
+        }
+    }
+}
diff --git a/Plugins/Trails/GizmosExtra.cs.meta b/Plugins/Trails/GizmosExtra.cs.meta
new file mode 100644
index 0000000..dd47c41
--- /dev/null
+++ b/Plugins/Trails/GizmosExtra.cs.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ac8be081485ba1141bd28334fe9eabec
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
diff --git a/Plugins/Trails/Range.cs b/Plugins/Trails/Range.cs
new file mode 100644
index 0000000..99a8e7a
--- /dev/null
+++ b/Plugins/Trails/Range.cs
@@ -0,0 +1,15 @@
+锘縩amespace PigeonCoopToolkit.Utillities
+{
+    [System.Serializable]
+    public class Range
+    {
+        public float Min;
+        public float Max;
+
+        public bool WithinRange(float value)
+        {
+            return Min <= value && Max >= value;
+        }
+    }
+
+}
diff --git a/Plugins/Trails/Range.cs.meta b/Plugins/Trails/Range.cs.meta
new file mode 100644
index 0000000..991f43d
--- /dev/null
+++ b/Plugins/Trails/Range.cs.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: db4c92c149ebf004a83b3776345ca8d4
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
diff --git a/Plugins/Trails/SmokePlume.cs b/Plugins/Trails/SmokePlume.cs
new file mode 100644
index 0000000..c198fa6
--- /dev/null
+++ b/Plugins/Trails/SmokePlume.cs
@@ -0,0 +1,74 @@
+锘縰sing UnityEngine;
+
+namespace PigeonCoopToolkit.Effects.Trails
+{
+    [AddComponentMenu("Pigeon Coop Toolkit/Effects/Smoke Plume")]
+    public class SmokePlume : TrailRenderer_Base
+    {
+        public float TimeBetweenPoints = 0.1f;
+        public Vector3 ConstantForce = Vector3.up * 0.5f;
+        public float RandomForceScale = 0.05f;
+        public int MaxNumberOfPoints = 50;
+        private float _timeSincePoint;
+
+        protected override void Start()
+        {
+            base.Start();
+            _timeSincePoint = 0;
+        }
+
+        protected override void OnStartEmit()
+        {
+            _timeSincePoint = 0;
+        }
+
+        protected override void Reset()
+        {
+            base.Reset();
+            TrailData.SizeOverLife = new AnimationCurve(new Keyframe(0, 0), new Keyframe(0.5f, 0.2f), new Keyframe(1, 0.2f));
+            TrailData.Lifetime = 6f;
+            ConstantForce = Vector3.up*0.5f;
+            TimeBetweenPoints = 0.1f;
+            RandomForceScale = 0.05f;
+            MaxNumberOfPoints = 50;
+        }
+
+        protected override void Update()
+        {
+            if (_emit)
+            {
+                _timeSincePoint += _noDecay ? 0 : Time.deltaTime;
+
+                if (_timeSincePoint >= TimeBetweenPoints)
+                {
+                    AddPoint(new SmokeTrailPoint(), _t.position);
+                    _timeSincePoint = 0;
+                }
+            }
+
+            base.Update();
+        }
+
+        protected override void InitialiseNewPoint(PCTrailPoint newPoint)
+        {
+            ((SmokeTrailPoint)newPoint).RandomVec = Random.onUnitSphere * RandomForceScale;
+        }
+
+        protected override void UpdateTrail(PCTrail trail, float deltaTime)
+        {
+            if (_noDecay)
+                return;
+
+            foreach (PCTrailPoint point in trail.Points)
+            {
+                point.Position += ConstantForce * deltaTime;
+            }
+        }
+        protected override int GetMaxNumberOfPoints()
+        {
+            return MaxNumberOfPoints;
+        }
+    }
+
+    
+}
diff --git a/Plugins/Trails/SmokePlume.cs.meta b/Plugins/Trails/SmokePlume.cs.meta
new file mode 100644
index 0000000..bb417f2
--- /dev/null
+++ b/Plugins/Trails/SmokePlume.cs.meta
@@ -0,0 +1,15 @@
+fileFormatVersion: 2
+guid: b5748bb800508004a81afe3d7526bcb1
+labels:
+- BetterTrails
+- TrailRenderer
+- Smoke
+- Trail
+- Effects
+- skidmarks
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 1000
+  icon: {fileID: 2800000, guid: 9c8d55a9e91d98e4e925cd09f877adc5, type: 3}
+  userData: 
diff --git a/Plugins/Trails/SmokeTrail.cs b/Plugins/Trails/SmokeTrail.cs
new file mode 100644
index 0000000..d692b08
--- /dev/null
+++ b/Plugins/Trails/SmokeTrail.cs
@@ -0,0 +1,76 @@
+锘縰sing UnityEngine;
+
+namespace PigeonCoopToolkit.Effects.Trails
+{
+    [AddComponentMenu("Pigeon Coop Toolkit/Effects/Smoke Trail")]
+    public class SmokeTrail : TrailRenderer_Base
+    {
+        public float MinVertexDistance = 0.1f;
+        public int MaxNumberOfPoints = 50;
+        private Vector3 _lastPosition;
+        private float _distanceMoved;
+        public float RandomForceScale = 1;
+
+        protected override void Start()
+        {
+            base.Start();
+            _lastPosition = _t.position;
+        }
+
+        protected override void Update()
+        {
+            if (_emit)
+            {
+                _distanceMoved += Vector3.Distance(_t.position, _lastPosition);
+
+                if (_distanceMoved != 0 && _distanceMoved >= MinVertexDistance)
+                {
+                    AddPoint(new SmokeTrailPoint(), _t.position);
+                    _distanceMoved = 0;
+                }
+                _lastPosition = _t.position;
+
+            }
+
+            base.Update();
+        }
+
+        protected override void OnStartEmit()
+        {
+            _lastPosition = _t.position;
+            _distanceMoved = 0;
+        }
+
+        protected override void Reset()
+        {
+            base.Reset();
+            MinVertexDistance = 0.1f;
+            RandomForceScale = 1;
+        }
+
+        protected override void InitialiseNewPoint(PCTrailPoint newPoint)
+        {
+            ((SmokeTrailPoint)newPoint).RandomVec = Random.onUnitSphere * RandomForceScale;
+        }
+        protected override void OnTranslate(Vector3 t)
+        {
+            _lastPosition += t;
+        }
+
+        protected override int GetMaxNumberOfPoints()
+        {
+            return MaxNumberOfPoints;
+        }
+    }
+
+    public class SmokeTrailPoint : PCTrailPoint
+    {
+        public Vector3 RandomVec;
+
+        public override void Update(float deltaTime)
+        {
+            base.Update(deltaTime);
+            Position += RandomVec * deltaTime;
+        }
+    }
+}
diff --git a/Plugins/Trails/SmokeTrail.cs.meta b/Plugins/Trails/SmokeTrail.cs.meta
new file mode 100644
index 0000000..0e0f2b0
--- /dev/null
+++ b/Plugins/Trails/SmokeTrail.cs.meta
@@ -0,0 +1,15 @@
+fileFormatVersion: 2
+guid: 98335f20237e3de42a9f0b6415312e23
+labels:
+- BetterTrails
+- TrailRenderer
+- Smoke
+- Trail
+- Effects
+- skidmarks
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 1000
+  icon: {fileID: 2800000, guid: f99224b2104474d47b91284e88f8af87, type: 3}
+  userData: 
diff --git a/Plugins/Trails/SmoothTrail.cs b/Plugins/Trails/SmoothTrail.cs
new file mode 100644
index 0000000..0171c2a
--- /dev/null
+++ b/Plugins/Trails/SmoothTrail.cs
@@ -0,0 +1,213 @@
+锘縰sing PigeonCoopToolkit.Utillities;
+using UnityEngine;
+
+namespace PigeonCoopToolkit.Effects.Trails
+{
+    [AddComponentMenu("Pigeon Coop Toolkit/Effects/Smooth Trail")]
+    public class SmoothTrail : TrailRenderer_Base
+    {
+        public float MinControlPointDistance = 0.1f;
+        public int MaxControlPoints = 15;
+        public int PointsBetweenControlPoints = 4;
+
+        private Vector3 _lastPosition;
+        private float _distanceMoved;
+        private CircularBuffer<ControlPoint> _controlPoints;
+
+        private class ControlPoint
+        {
+            public Vector3 p;
+            public Vector3 forward;
+        }
+        
+        protected override void Start()
+        {
+            base.Start();
+            _lastPosition = _t.position;
+        }
+
+        protected override void Update()
+        {
+            if (_emit)
+            {
+                _distanceMoved += Vector3.Distance(_t.position, _lastPosition);
+
+                if (!Mathf.Approximately(_distanceMoved, 0) && _distanceMoved >= MinControlPointDistance)
+                {
+                    AddControlPoint(_t.position);
+                    _distanceMoved = 0;
+                }
+                else
+                {
+                    _controlPoints[_controlPoints.Count - 1].p = _t.position;
+
+                    if (TrailData.UseForwardOverride)
+                    {
+                        _controlPoints[_controlPoints.Count - 1].forward = TrailData.ForwardOverrideRelative
+                                       ? _t.TransformDirection(TrailData.ForwardOverride.normalized)
+                                       : TrailData.ForwardOverride.normalized;
+                    }
+
+                }
+
+                _lastPosition = _t.position;
+            }
+
+            base.Update();
+        }
+
+        protected override void OnStartEmit()
+        {
+            _lastPosition = _t.position;
+            _distanceMoved = 0;
+            _controlPoints = new CircularBuffer<ControlPoint>(MaxControlPoints);
+
+            _controlPoints.Add(new ControlPoint { p = _lastPosition });
+
+            if (TrailData.UseForwardOverride)
+            {
+                _controlPoints[0].forward = TrailData.ForwardOverrideRelative
+                               ? _t.TransformDirection(TrailData.ForwardOverride.normalized)
+                               : TrailData.ForwardOverride.normalized;
+            }
+
+            AddPoint(new PCTrailPoint(), _lastPosition);
+
+            AddControlPoint(_lastPosition);
+        }
+
+        protected override void UpdateTrail(PCTrail trail, float deltaTime)
+        {
+            if (trail.IsActiveTrail == false)
+                return;
+
+            //TODO Must optimize this further, I don't need to keep recalculating point positions unless we are
+            //dealng with the points between the last and 2nd last CP (+ the last CP itself)
+            int trailPointIndex = 0;
+            for (int i = 0; i < _controlPoints.Count; i++)
+            {
+                trail.Points[trailPointIndex].Position = _controlPoints[i].p;
+
+                if (TrailData.UseForwardOverride)
+                {
+                    trail.Points[trailPointIndex].Forward = _controlPoints[i].forward;
+                }
+
+                trailPointIndex++;
+
+                if (i < _controlPoints.Count - 1)
+                {
+                    Vector3 Handle1, Handle2;
+                    float distanceBetween = Vector3.Distance(_controlPoints[i].p, _controlPoints[i + 1].p) / 2;
+                    if (i == 0)
+                    {
+                        Handle1 = _controlPoints[i].p + (_controlPoints[i + 1].p - _controlPoints[i].p).normalized * distanceBetween;
+                    }
+                    else
+                    {
+                        Handle1 = _controlPoints[i].p + (_controlPoints[i + 1].p - _controlPoints[i - 1].p).normalized * distanceBetween;
+                    }
+
+                    int nextI = i + 1;
+
+                    if (nextI == _controlPoints.Count - 1)
+                    {
+                        Handle2 = _controlPoints[nextI].p + (_controlPoints[nextI - 1].p - _controlPoints[nextI].p).normalized * distanceBetween;
+                    }
+                    else
+                    {
+                        Handle2 = _controlPoints[nextI].p + (_controlPoints[nextI - 1].p - _controlPoints[nextI + 1].p).normalized * distanceBetween;
+                    }
+
+                    PCTrailPoint currentHandle = trail.Points[trailPointIndex-1];
+                    PCTrailPoint nextHandle = trail.Points[(trailPointIndex-1) + PointsBetweenControlPoints+1];
+
+                    
+                    for (int pointBetween = 0; pointBetween < PointsBetweenControlPoints; pointBetween++)
+                    {
+                        float t= (((float)pointBetween + 1f) / ((float)PointsBetweenControlPoints + 1f));
+                        trail.Points[trailPointIndex].Position = GetPointAlongCurve(_controlPoints[i].p, Handle1, _controlPoints[i + 1].p, Handle2, t, 0.3f);
+                        trail.Points[trailPointIndex].SetTimeActive(Mathf.Lerp(currentHandle.TimeActive(), nextHandle.TimeActive(), t));
+
+                        if (TrailData.UseForwardOverride)
+                        {
+                            trail.Points[trailPointIndex].Forward = Vector3.Lerp(currentHandle.Forward, nextHandle.Forward, t);
+                        }
+
+
+                        trailPointIndex++;
+                    }
+
+                }
+            }
+
+            int lastControlPointPointIndex = ((_controlPoints.Count - 1) + ((_controlPoints.Count - 1) * PointsBetweenControlPoints));
+            int prevControlPointPointIndex = lastControlPointPointIndex - PointsBetweenControlPoints - 1;
+            int activePointCount = lastControlPointPointIndex + 1;
+
+            float distanceFromStart = trail.Points[prevControlPointPointIndex].GetDistanceFromStart();
+            for (int i = prevControlPointPointIndex + 1; i < activePointCount; i++)
+            {
+                distanceFromStart += Vector3.Distance(trail.Points[i - 1].Position, trail.Points[i].Position);
+                trail.Points[i].SetDistanceFromStart(distanceFromStart);
+            }
+
+        }
+
+        protected override void Reset()
+        {
+            base.Reset();
+            MinControlPointDistance = 0.1f;
+            MaxControlPoints = 15;
+            PointsBetweenControlPoints = 4;
+        }
+
+        protected override void OnTranslate(Vector3 t)
+        {
+            _lastPosition += t;
+
+            for (int i = 0; i < _controlPoints.Count; i++)
+                _controlPoints[i].p += t;
+        }
+
+        private void AddControlPoint(Vector3 position)
+        {
+            for (int i = 0; i < PointsBetweenControlPoints; i++)
+            {
+                AddPoint(new PCTrailPoint(), position);
+            }
+
+            AddPoint(new PCTrailPoint(), position);
+
+            ControlPoint newCP = new ControlPoint { p = position };
+
+            if (TrailData.UseForwardOverride)
+            {
+                newCP.forward = TrailData.ForwardOverrideRelative
+                               ? _t.TransformDirection(TrailData.ForwardOverride.normalized)
+                               : TrailData.ForwardOverride.normalized;
+            }
+
+            _controlPoints.Add(newCP);
+        }
+
+        protected override int GetMaxNumberOfPoints()
+        {
+            return ((MaxControlPoints) + ((MaxControlPoints) * PointsBetweenControlPoints));
+        }
+
+        public Vector3 GetPointAlongCurve(Vector3 curveStart, Vector3 curveStartHandle, Vector3 curveEnd, Vector3 curveEndHandle, float t, float crease)
+        {
+            float oneMinT = 1 - t;
+            float oneMinTPow3 = Mathf.Pow(oneMinT, 3);
+            float oneMinTPow2 = Mathf.Pow(oneMinT, 2);
+
+            float oneMinCrease = 1 - crease;
+            return ((oneMinTPow3 * curveStart * oneMinCrease) + (3 * oneMinTPow2 * t * curveStartHandle * crease) + (3 * oneMinT * Mathf.Pow(t, 2) * curveEndHandle * crease) +
+                   (Mathf.Pow(t, 3) * curveEnd * oneMinCrease))
+                   /
+                   ((oneMinTPow3 * oneMinCrease) + (3 * oneMinTPow2 * t * crease) + (3 * oneMinT * Mathf.Pow(t, 2) * crease) +
+                   (Mathf.Pow(t, 3) * oneMinCrease));
+        }
+    }
+}
diff --git a/Plugins/Trails/SmoothTrail.cs.meta b/Plugins/Trails/SmoothTrail.cs.meta
new file mode 100644
index 0000000..28d7220
--- /dev/null
+++ b/Plugins/Trails/SmoothTrail.cs.meta
@@ -0,0 +1,15 @@
+fileFormatVersion: 2
+guid: 62cd7e0b3a08cf84e82658d9a3eaeb32
+labels:
+- BetterTrails
+- TrailRenderer
+- Smoke
+- Trail
+- Effects
+- skidmarks
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 1000
+  icon: {fileID: 2800000, guid: 8d56c6f37ee95884baa3b4f7e4837399, type: 3}
+  userData: 
diff --git a/Plugins/Trails/Trail.cs b/Plugins/Trails/Trail.cs
new file mode 100644
index 0000000..e1b5273
--- /dev/null
+++ b/Plugins/Trails/Trail.cs
@@ -0,0 +1,60 @@
+锘縰sing UnityEngine;
+
+namespace PigeonCoopToolkit.Effects.Trails
+{
+    [AddComponentMenu("Pigeon Coop Toolkit/Effects/Trail")]
+    public class Trail : TrailRenderer_Base
+    {
+        public float MinVertexDistance = 0.1f;
+        public int MaxNumberOfPoints = 50;
+        private Vector3 _lastPosition;
+        private float _distanceMoved;
+
+        protected override void Start()
+        {
+            base.Start();
+            _lastPosition = _t.position;
+        }
+
+        protected override void Update()
+        {
+            if(_emit)
+            {
+                _distanceMoved += Vector3.Distance(_t.position, _lastPosition);
+
+                if (_distanceMoved != 0 && _distanceMoved >= MinVertexDistance)
+                {
+                    AddPoint(new PCTrailPoint(), _t.position);
+                    _distanceMoved = 0;
+                }
+
+                _lastPosition = _t.position;
+
+            }
+
+            base.Update();
+        }
+
+        protected override void OnStartEmit()
+        {
+            _lastPosition = _t.position;
+            _distanceMoved = 0;
+        }
+
+        protected override void Reset()
+        {
+            base.Reset();
+            MinVertexDistance = 0.1f;
+        }
+
+        protected override void OnTranslate(Vector3 t)
+        {
+            _lastPosition += t;
+        }
+
+        protected override int GetMaxNumberOfPoints()
+        {
+            return MaxNumberOfPoints;
+        }
+    }
+}
diff --git a/Plugins/Trails/Trail.cs.meta b/Plugins/Trails/Trail.cs.meta
new file mode 100644
index 0000000..77c2ac8
--- /dev/null
+++ b/Plugins/Trails/Trail.cs.meta
@@ -0,0 +1,15 @@
+fileFormatVersion: 2
+guid: 5f742ccbd25717e438dd6fdea4d66bad
+labels:
+- BetterTrails
+- TrailRenderer
+- Smoke
+- Trail
+- Effects
+- skidmarks
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 1000
+  icon: {fileID: 2800000, guid: 888165c9c85ad6b429824b89f1f4f698, type: 3}
+  userData: 
diff --git a/Plugins/Trails/TrailRenderer_Base.cs b/Plugins/Trails/TrailRenderer_Base.cs
new file mode 100644
index 0000000..8274971
--- /dev/null
+++ b/Plugins/Trails/TrailRenderer_Base.cs
@@ -0,0 +1,666 @@
+using System.Collections.Generic;
+using System.Linq;
+using PigeonCoopToolkit.Utillities;
+using UnityEngine;
+using System;
+
+namespace PigeonCoopToolkit.Effects.Trails
+{
+    public abstract class TrailRenderer_Base : MonoBehaviour
+    {
+        public PCTrailRendererData TrailData;
+        public bool Emit = false;
+
+        protected bool _emit;
+        protected bool _noDecay;
+
+        private PCTrail _activeTrail;
+        private List<PCTrail> _fadingTrails;
+        protected Transform _t;
+
+
+        private static Dictionary<Material, List<PCTrail>> _matToTrailList;
+        private static List<Mesh> _toClean; 
+ 
+        private static bool _hasRenderer = false;
+        private static int GlobalTrailRendererCount = 0;
+
+        protected virtual void Awake()
+        {
+            GlobalTrailRendererCount++;
+
+            if(GlobalTrailRendererCount == 1)
+            {
+                _matToTrailList = new Dictionary<Material, List<PCTrail>>();
+                _toClean = new List<Mesh>();
+            }
+
+            
+            _fadingTrails = new List<PCTrail>();
+            _t = transform;
+            _emit = Emit;
+
+            if (_emit)
+            {
+                _activeTrail = new PCTrail(GetMaxNumberOfPoints());
+                _activeTrail.IsActiveTrail = true;
+                OnStartEmit();
+            }
+        }
+
+        protected virtual void Start()
+        {
+            
+        }
+
+        protected virtual void LateUpdate()
+        {
+            if(_hasRenderer)
+                return;
+
+
+            _hasRenderer = true;
+            
+
+            foreach (KeyValuePair<Material, List<PCTrail>> keyValuePair in _matToTrailList)
+            {
+                CombineInstance[] combineInstances = new CombineInstance[keyValuePair.Value.Count];
+
+                for (int i = 0; i < keyValuePair.Value.Count; i++)
+                {
+                    combineInstances[i] = new CombineInstance
+                    {
+                        mesh = keyValuePair.Value[i].Mesh,
+                        subMeshIndex = 0,
+                        transform = Matrix4x4.identity
+                    };
+                }
+
+                Mesh combinedMesh = new Mesh();
+                combinedMesh.CombineMeshes(combineInstances, true, false);
+                _toClean.Add(combinedMesh);
+
+                DrawMesh(combinedMesh, keyValuePair.Key);
+
+                keyValuePair.Value.Clear();
+            }
+        }
+
+        protected virtual void Update()
+        {
+            if (_hasRenderer)
+            {
+                _hasRenderer = false;
+
+                if (_toClean.Count > 0)
+                {
+                    foreach (Mesh mesh in _toClean)
+                    {
+                        if (Application.isEditor)
+                            DestroyImmediate(mesh, true);
+                        else
+                            Destroy(mesh);
+                    }
+                }
+
+                _toClean.Clear();
+
+            }
+
+            if (_matToTrailList.ContainsKey(TrailData.TrailMaterial) == false)
+            {
+                _matToTrailList.Add(TrailData.TrailMaterial, new List<PCTrail>());
+            }
+            
+
+            if(_activeTrail != null)
+            {
+                UpdatePoints(_activeTrail, Time.deltaTime);
+                UpdateTrail(_activeTrail, Time.deltaTime);
+                GenerateMesh(_activeTrail);
+                _matToTrailList[TrailData.TrailMaterial].Add(_activeTrail);
+            }
+             
+            for (int i = _fadingTrails.Count-1; i >= 0; i--)
+            {
+                if (_fadingTrails[i] == null || _fadingTrails[i].Points.Any(a => a.TimeActive() < TrailData.Lifetime) == false)
+                {
+                    if (_fadingTrails[i] != null)
+                        _fadingTrails[i].Dispose();
+
+                    _fadingTrails.RemoveAt(i);
+                    continue;
+                }
+
+                UpdatePoints(_fadingTrails[i], Time.deltaTime);
+                UpdateTrail(_fadingTrails[i], Time.deltaTime);
+                GenerateMesh(_fadingTrails[i]);
+                _matToTrailList[TrailData.TrailMaterial].Add(_fadingTrails[i]);
+            }
+
+            CheckEmitChange();
+        }
+
+        protected virtual void OnDestroy()
+        {
+            GlobalTrailRendererCount--;
+
+            if(GlobalTrailRendererCount == 0)
+            {
+                if(_toClean != null && _toClean.Count > 0)
+                {
+                    foreach (Mesh mesh in _toClean)
+                    {
+                        if (Application.isEditor)
+                            DestroyImmediate(mesh, true);
+                        else
+                            Destroy(mesh);
+                    }
+                }
+
+                _toClean = null;
+                _matToTrailList.Clear();
+                _matToTrailList = null;
+            }
+
+            if (_activeTrail != null)
+            {
+                _activeTrail.Dispose();
+                _activeTrail = null;
+            }
+
+            if (_fadingTrails != null)
+            {
+                foreach (PCTrail fadingTrail in _fadingTrails)
+                {
+                    if (fadingTrail != null)
+                        fadingTrail.Dispose();
+                }
+
+                _fadingTrails.Clear();
+            }
+        }
+
+        protected virtual void OnStopEmit()
+        {
+            
+        }
+
+        protected virtual void OnStartEmit()
+        {
+        }
+
+        protected virtual void OnTranslate(Vector3 t)
+        {
+        }
+
+        protected abstract int GetMaxNumberOfPoints();
+
+        protected virtual void Reset()
+        {
+            if(TrailData == null)
+                TrailData = new PCTrailRendererData();
+
+            TrailData.Lifetime = 1;
+
+            TrailData.UsingSimpleColor = false;
+            TrailData.UsingSimpleSize = false;
+
+            TrailData.ColorOverLife = new Gradient();
+            TrailData.SimpleColorOverLifeStart = Color.white;
+            TrailData.SimpleColorOverLifeEnd = new Color(1, 1, 1, 0);
+
+            TrailData.SizeOverLife = new AnimationCurve(new Keyframe(0, 1), new Keyframe(1, 0));
+            TrailData.SimpleSizeOverLifeStart = 1;
+            TrailData.SimpleSizeOverLifeEnd = 0;
+        }
+
+        protected virtual void InitialiseNewPoint(PCTrailPoint newPoint)
+        {
+
+        }
+
+        protected virtual void UpdateTrail(PCTrail trail, float deltaTime)
+        {
+
+        }
+
+        protected void AddPoint(PCTrailPoint newPoint, Vector3 pos)
+        {
+            if (_activeTrail == null)
+                return;
+
+            newPoint.Position = pos;
+            newPoint.PointNumber = _activeTrail.Points.Count == 0 ? 0 : _activeTrail.Points[_activeTrail.Points.Count - 1].PointNumber + 1;
+            InitialiseNewPoint(newPoint);
+
+            newPoint.SetDistanceFromStart(_activeTrail.Points.Count == 0
+                                              ? 0
+                                              : _activeTrail.Points[_activeTrail.Points.Count - 1].GetDistanceFromStart() + Vector3.Distance(_activeTrail.Points[_activeTrail.Points.Count - 1].Position, pos));
+
+            if(TrailData.UseForwardOverride)
+            {
+                newPoint.Forward = TrailData.ForwardOverrideRelative
+                                       ? _t.TransformDirection(TrailData.ForwardOverride.normalized)
+                                       : TrailData.ForwardOverride.normalized;
+            }
+
+            _activeTrail.Points.Add(newPoint);
+        }
+
+        private void GenerateMesh(PCTrail trail)
+        {
+            trail.Mesh.Clear(false);
+
+            Vector3 camForward = Camera.main != null ? Camera.main.transform.forward : Vector3.forward;
+
+            if(TrailData.UseForwardOverride)
+            {
+                camForward = TrailData.ForwardOverride.normalized;
+            }
+
+            trail.activePointCount = NumberOfActivePoints(trail);
+
+            if (trail.activePointCount < 2)
+                return;
+
+
+            int vertIndex = 0;
+            for (int i = 0; i < trail.Points.Count; i++)
+            {
+                PCTrailPoint p = trail.Points[i];
+                float timeAlong = p.TimeActive()/TrailData.Lifetime;
+
+                if(p.TimeActive() > TrailData.Lifetime)
+                {
+                    continue;
+                }
+
+                if (TrailData.UseForwardOverride && TrailData.ForwardOverrideRelative)
+                    camForward = p.Forward;
+
+                Vector3 cross = Vector3.zero;
+
+                if (i < trail.Points.Count - 1)
+                {
+                    cross =
+                        Vector3.Cross((trail.Points[i + 1].Position - p.Position).normalized, camForward).
+                            normalized;
+                }
+                else
+                {
+                    cross =
+                        Vector3.Cross((p.Position - trail.Points[i - 1].Position).normalized, camForward).
+                            normalized;
+                }
+
+
+                //yuck! lets move these into their own functions some time
+                Color c = TrailData.StretchColorToFit ?
+                    (TrailData.UsingSimpleColor ? Color.Lerp(TrailData.SimpleColorOverLifeStart, TrailData.SimpleColorOverLifeEnd, 1 - ((float)vertIndex / (float)trail.activePointCount / 2f)) : TrailData.ColorOverLife.Evaluate(1 - ((float)vertIndex / (float)trail.activePointCount / 2f))) :
+                    (TrailData.UsingSimpleColor ? Color.Lerp(TrailData.SimpleColorOverLifeStart,TrailData.SimpleColorOverLifeEnd,timeAlong) : TrailData.ColorOverLife.Evaluate(timeAlong));
+                
+                float s = TrailData.StretchSizeToFit ? 
+                    (TrailData.UsingSimpleSize ? Mathf.Lerp(TrailData.SimpleSizeOverLifeStart,TrailData.SimpleSizeOverLifeEnd,1 - ((float)vertIndex / (float)trail.activePointCount / 2f)) : TrailData.SizeOverLife.Evaluate(1 - ((float)vertIndex / (float)trail.activePointCount / 2f))) : 
+                    (TrailData.UsingSimpleSize ? Mathf.Lerp(TrailData.SimpleSizeOverLifeStart,TrailData.SimpleSizeOverLifeEnd, timeAlong) : TrailData.SizeOverLife.Evaluate(timeAlong));
+                
+                
+                trail.verticies[vertIndex] = p.Position + cross * s;
+
+                if(TrailData.MaterialTileLength <= 0)
+                {
+                    trail.uvs[vertIndex] = new Vector2((float)vertIndex / (float)trail.activePointCount / 2f, 0);
+                }
+                else
+                {
+                    trail.uvs[vertIndex] = new Vector2(p.GetDistanceFromStart() / TrailData.MaterialTileLength, 0);
+                }
+
+                trail.normals[vertIndex] = camForward;
+                trail.colors[vertIndex] = c;
+                vertIndex++;
+                trail.verticies[vertIndex] = p.Position - cross * s;
+
+                if (TrailData.MaterialTileLength <= 0)
+                {
+                    trail.uvs[vertIndex] = new Vector2((float)vertIndex / (float)trail.activePointCount / 2f, 1);
+                }
+                else
+                {
+                    trail.uvs[vertIndex] = new Vector2(p.GetDistanceFromStart() / TrailData.MaterialTileLength, 1);
+                }
+
+                trail.normals[vertIndex] = camForward;
+                trail.colors[vertIndex] = c;
+
+                vertIndex++;
+            }
+
+            Vector2 finalPosition = trail.verticies[vertIndex-1];
+            for(int i = vertIndex; i < trail.verticies.Length; i++)
+            {
+                trail.verticies[i] = finalPosition;
+            }
+
+            int indIndex = 0;
+            for (int pointIndex = 0; pointIndex < 2 * (trail.activePointCount - 1); pointIndex++)
+            {
+                if(pointIndex%2==0)
+                {
+                    trail.indicies[indIndex] = pointIndex;
+                    indIndex++;
+                    trail.indicies[indIndex] = pointIndex + 1;
+                    indIndex++;
+                    trail.indicies[indIndex] = pointIndex + 2;
+                }
+                else
+                {
+                    trail.indicies[indIndex] = pointIndex + 2;
+                    indIndex++;
+                    trail.indicies[indIndex] = pointIndex + 1;
+                    indIndex++;
+                    trail.indicies[indIndex] = pointIndex;
+                }
+
+                indIndex++;
+            }
+
+            int finalIndex = trail.indicies[indIndex-1];
+            for (int i = indIndex; i < trail.indicies.Length; i++)
+            {
+                trail.indicies[i] = finalIndex;
+            }
+
+            trail.Mesh.vertices = trail.verticies;
+            trail.Mesh.SetIndices(trail.indicies, MeshTopology.Triangles, 0);
+            trail.Mesh.uv = trail.uvs;
+            trail.Mesh.normals = trail.normals;
+            trail.Mesh.colors = trail.colors;
+        }
+
+        private void DrawMesh(Mesh trailMesh, Material trailMaterial)
+        {
+            Graphics.DrawMesh(trailMesh, Matrix4x4.identity, trailMaterial, gameObject.layer);
+        }
+
+        private void UpdatePoints(PCTrail line, float deltaTime)
+        {
+            for (int i = 0; i < line.Points.Count; i++)
+            {
+                line.Points[i].Update(_noDecay ? 0 : deltaTime);
+            }
+        }
+
+        [Obsolete("UpdatePoint is deprecated, you should instead override UpdateTrail and loop through the individual points yourself (See Smoke or Smoke Plume scripts for how to do this).", true)]
+        protected virtual void UpdatePoint(PCTrailPoint pCTrailPoint, float deltaTime)
+        {
+        }
+
+        private void CheckEmitChange()
+        {
+            if (_emit != Emit)
+            {
+                _emit = Emit;
+                if (_emit)
+                {
+                    _activeTrail = new PCTrail(GetMaxNumberOfPoints());
+                    _activeTrail.IsActiveTrail = true;
+                    
+                    OnStartEmit();
+                }
+                else
+                {
+                    OnStopEmit();
+                    _activeTrail.IsActiveTrail = false;
+                    _fadingTrails.Add(_activeTrail);
+                    _activeTrail = null;
+                }
+            }
+        }
+
+        private int NumberOfActivePoints(PCTrail line)
+        {
+            int count = 0;
+            for (int index = 0; index < line.Points.Count; index++)
+            {
+                if (line.Points[index].TimeActive() < TrailData.Lifetime) count++;
+            }
+            return count;
+        }
+
+        [UnityEngine.ContextMenu("Toggle inspector size input method")]
+        protected void ToggleSizeInputStyle()
+        {
+            TrailData.UsingSimpleSize = !TrailData.UsingSimpleSize;
+        }
+        [UnityEngine.ContextMenu("Toggle inspector color input method")]
+        protected void ToggleColorInputStyle()
+        {
+            TrailData.UsingSimpleColor = !TrailData.UsingSimpleColor;
+        }
+
+        public void LifeDecayEnabled(bool enabled)
+        {
+            _noDecay = !enabled;
+        }
+
+        /// <summary>
+        /// Translates every point in the vector t
+        /// </summary>
+        public void Translate(Vector3 t)
+        {
+            if (_activeTrail != null)
+            {
+                for (int i = 0; i < _activeTrail.Points.Count; i++)
+                {
+                    _activeTrail.Points[i].Position += t;
+                }
+            }
+
+            if (_fadingTrails != null)
+            {
+                foreach (PCTrail fadingTrail in _fadingTrails)
+                {
+                    for (int i = 0; i < fadingTrail.Points.Count; i++)
+                    {
+                        fadingTrail.Points[i].Position += t;
+                    }
+                }
+            }
+
+            OnTranslate(t);
+        }
+
+        /// <summary>
+        /// Insert a trail into this trail renderer. 
+        /// </summary>
+        /// <param name="from">The start position of the trail.</param>
+        /// <param name="to">The end position of the trail.</param>
+        /// <param name="distanceBetweenPoints">Distance between each point on the trail</param>
+        public void CreateTrail(Vector3 from, Vector3 to, float distanceBetweenPoints)
+        {
+            float distanceBetween = Vector3.Distance(from, to);
+
+            Vector3 dirVector = to - from;
+            dirVector = dirVector.normalized;
+
+            float currentLength = 0;
+
+            CircularBuffer<PCTrailPoint> newLine = new CircularBuffer<PCTrailPoint>(GetMaxNumberOfPoints());
+            int pointNumber = 0;
+            while (currentLength < distanceBetween) 
+            {
+                PCTrailPoint newPoint = new PCTrailPoint();
+                newPoint.PointNumber = pointNumber;
+                newPoint.Position = from + dirVector*currentLength;
+                newLine.Add(newPoint);
+                InitialiseNewPoint(newPoint);
+
+                pointNumber++;
+
+                if (distanceBetweenPoints <= 0)
+                    break;
+                else
+                    currentLength += distanceBetweenPoints;
+            }
+
+            PCTrailPoint lastPoint = new PCTrailPoint();
+            lastPoint.PointNumber = pointNumber;
+            lastPoint.Position = to;
+            newLine.Add(lastPoint);
+            InitialiseNewPoint(lastPoint);
+
+            PCTrail newTrail = new PCTrail(GetMaxNumberOfPoints());
+            newTrail.Points = newLine;
+
+            _fadingTrails.Add(newTrail);
+        }
+        
+        /// <summary>
+        /// Clears all active trails from the system.
+        /// </summary>
+        /// <param name="emitState">Desired emit state after clearing</param>
+        public void ClearSystem(bool emitState)
+        {
+            if(_activeTrail != null)
+            {
+                _activeTrail.Dispose();
+                _activeTrail = null;
+            }
+
+            if (_fadingTrails != null)
+            {
+                foreach (PCTrail fadingTrail in _fadingTrails)
+                {
+                    if (fadingTrail != null)
+                        fadingTrail.Dispose();
+                }
+
+                _fadingTrails.Clear();
+            }
+
+            Emit = emitState;
+            _emit = !emitState;
+
+            CheckEmitChange();
+        }
+
+        /// <summary>
+        /// Get the number of active seperate trail segments.
+        /// </summary>
+        public int NumSegments()
+        {
+            int num = 0;
+            if (_activeTrail != null && NumberOfActivePoints(_activeTrail) != 0)
+                num++;
+
+            num += _fadingTrails.Count;
+            return num;
+        }
+    }
+
+    public class PCTrail : System.IDisposable
+    {
+        public CircularBuffer<PCTrailPoint> Points;
+        public Mesh Mesh;
+
+        public Vector3[] verticies;
+        public Vector3[] normals;
+        public Vector2[] uvs; 
+        public Color[] colors; 
+        public int[] indicies;
+        public int activePointCount;
+
+        public bool IsActiveTrail = false;
+
+        public PCTrail(int numPoints)
+        {
+            Mesh = new Mesh();
+            Mesh.MarkDynamic();
+
+            verticies = new Vector3[2 * numPoints];
+            normals = new Vector3[2 * numPoints];
+            uvs = new Vector2[2 * numPoints];
+            colors = new Color[2 * numPoints];
+            indicies = new int[2 * (numPoints) * 3];
+
+            Points = new CircularBuffer<PCTrailPoint>(numPoints);
+        }
+
+        #region Implementation of IDisposable
+
+        public void Dispose()
+        {
+            if(Mesh != null)
+            {
+                if(Application.isEditor)
+                    UnityEngine.Object.DestroyImmediate(Mesh, true);
+                else
+                    UnityEngine.Object.Destroy(Mesh);
+            }
+
+            Points.Clear();
+            Points = null;
+        }
+
+        #endregion
+    }
+
+    public class PCTrailPoint  
+    {
+        public Vector3 Forward;
+        public Vector3 Position;
+        public int PointNumber;
+
+        private float _timeActive = 0;
+        private float _distance;
+
+        public virtual void Update(float deltaTime)
+        {
+            _timeActive += deltaTime;
+        }
+
+        public float TimeActive()
+        {
+            return _timeActive;
+        }
+
+        public void SetTimeActive(float time)
+        {
+            _timeActive = time;
+        }
+
+        public void SetDistanceFromStart(float distance)
+        {
+            _distance = distance;
+        }
+
+        public float GetDistanceFromStart()
+        {
+            return _distance;
+        }
+    }
+
+    [System.Serializable]
+    public class PCTrailRendererData
+    {
+        public Material TrailMaterial;
+        public float Lifetime = 1;
+        public bool UsingSimpleSize = false;
+        public float SimpleSizeOverLifeStart;
+        public float SimpleSizeOverLifeEnd;
+        public AnimationCurve SizeOverLife = new AnimationCurve();
+        public bool UsingSimpleColor = false;
+        public Color SimpleColorOverLifeStart;
+        public Color SimpleColorOverLifeEnd;
+        public Gradient ColorOverLife;
+        public bool StretchSizeToFit;
+        public bool StretchColorToFit;
+        public float MaterialTileLength = 0;
+        public bool UseForwardOverride;
+        public Vector3 ForwardOverride;
+        public bool ForwardOverrideRelative;
+    }
+}
+
+
diff --git a/Plugins/Trails/TrailRenderer_Base.cs.meta b/Plugins/Trails/TrailRenderer_Base.cs.meta
new file mode 100644
index 0000000..e265fb6
--- /dev/null
+++ b/Plugins/Trails/TrailRenderer_Base.cs.meta
@@ -0,0 +1,15 @@
+fileFormatVersion: 2
+guid: 87716fa8801130a4994e129a3b6b2fa6
+labels:
+- BetterTrails
+- TrailRenderer
+- Smoke
+- Trail
+- Effects
+- skidmarks
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 1000
+  icon: {instanceID: 0}
+  userData: 
diff --git a/Plugins/Trails/VersionInformation.cs b/Plugins/Trails/VersionInformation.cs
new file mode 100644
index 0000000..0ca2cb9
--- /dev/null
+++ b/Plugins/Trails/VersionInformation.cs
@@ -0,0 +1,42 @@
+锘縩amespace PigeonCoopToolkit.Generic
+{
+    [System.Serializable]
+    public class VersionInformation
+    {
+        public string Name;
+        public int Major = 1;
+        public int Minor = 0;
+        public int Patch = 0;
+
+        public VersionInformation(string name, int major, int minor, int patch)
+        {
+            Name = name;
+            Major = major;
+            Minor = minor;
+            Patch = patch;
+        }
+
+        public override string ToString()
+        {
+            return string.Format("{0} {1}.{2}.{3}", Name, Major, Minor, Patch);
+        }
+
+        public bool Match(VersionInformation other, bool looseMatch)
+        {
+            if(looseMatch)
+            {
+                return other.Name == Name &&
+                       other.Major == Major &&
+                       other.Minor == Minor;
+            }
+            else
+            {
+                return other.Name == Name &&
+                       other.Major == Major &&
+                       other.Minor == Minor &&
+                       other.Patch == Patch;
+            }
+        }
+
+    }
+}
diff --git a/Plugins/Trails/VersionInformation.cs.meta b/Plugins/Trails/VersionInformation.cs.meta
new file mode 100644
index 0000000..c5b4e1a
--- /dev/null
+++ b/Plugins/Trails/VersionInformation.cs.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 1d58a7e753bea0e4c84779d092563363
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
diff --git a/System/AssetVersion/AssetVersionUtility.cs b/System/AssetVersion/AssetVersionUtility.cs
index 4164c18..69aa9f5 100644
--- a/System/AssetVersion/AssetVersionUtility.cs
+++ b/System/AssetVersion/AssetVersionUtility.cs
@@ -18,16 +18,23 @@
     static bool m_PriorAssetDownLoadDone = false;
     public static bool priorAssetDownLoadDone {
         get {
-            switch (VersionConfig.Get().assetAccess)
+            if (VersionUtility.Instance.versionInfo != null && VersionUtility.Instance.versionInfo.downAsset == 0)
+            {
+                return true;
+            }
+            else
             {
-                case InstalledAsset.NullAsset:
-                case InstalledAsset.HalfAsset:
-                case InstalledAsset.FullAsset:
-                    return m_PriorAssetDownLoadDone;
-                case InstalledAsset.IngoreDownLoad:
-                    return true;
-                default:
-                    return true;
+                switch (VersionConfig.Get().assetAccess)
+                {
+                    case InstalledAsset.NullAsset:
+                    case InstalledAsset.HalfAsset:
+                    case InstalledAsset.FullAsset:
+                        return m_PriorAssetDownLoadDone;
+                    case InstalledAsset.IngoreDownLoad:
+                        return true;
+                    default:
+                        return true;
+                }
             }
         }
     }
@@ -35,16 +42,23 @@
     static bool m_UnPriorAssetDownLoadDone = false;
     public static bool unPriorAssetDownLoadDone {
         get {
-            switch (VersionConfig.Get().assetAccess)
+            if (VersionUtility.Instance.versionInfo != null && VersionUtility.Instance.versionInfo.downAsset == 0)
+            {
+                return true;
+            }
+            else
             {
-                case InstalledAsset.NullAsset:
-                case InstalledAsset.HalfAsset:
-                case InstalledAsset.FullAsset:
-                    return m_UnPriorAssetDownLoadDone;
-                case InstalledAsset.IngoreDownLoad:
-                    return true;
-                default:
-                    return true;
+                switch (VersionConfig.Get().assetAccess)
+                {
+                    case InstalledAsset.NullAsset:
+                    case InstalledAsset.HalfAsset:
+                    case InstalledAsset.FullAsset:
+                        return m_UnPriorAssetDownLoadDone;
+                    case InstalledAsset.IngoreDownLoad:
+                        return true;
+                    default:
+                        return true;
+                }
             }
         }
     }
@@ -179,7 +193,7 @@
         }
         else
         {
-            path = StringUtility.Contact(ResourcesPath.Instance.StreamingAssetPath, _assetKey);
+            path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, _assetKey);
         }
 
         return path;
@@ -187,13 +201,18 @@
 
     public static bool IsUnpriorAssetDownLoadOk()
     {
+        if (VersionUtility.Instance.versionInfo != null && VersionUtility.Instance.versionInfo.downAsset == 0)
+        {
+            return true;
+        }
+
         if (VersionConfig.Get().assetAccess == InstalledAsset.IngoreDownLoad)
         {
             return true;
         }
 
         return unPriorAssetDownLoadDone;
-    }
-
-    
+    }
+
+
 }
diff --git a/System/BlastFurnace/StoveUpgradWin.cs b/System/BlastFurnace/StoveUpgradWin.cs
index 847cc09..fbc74f8 100644
--- a/System/BlastFurnace/StoveUpgradWin.cs
+++ b/System/BlastFurnace/StoveUpgradWin.cs
@@ -66,7 +66,7 @@
 
         protected override void OnPreClose()
         {
-            UI3DModelExhibition.Instance.StopShowPlayer();
+            UI3DModelExhibition.Instance.StopShow();
             UI3DTreasureExhibition.Instance.StopShow();
         }
 
diff --git a/System/Chat/ChatCenter.cs b/System/Chat/ChatCenter.cs
index 16f48d2..fb300b6 100644
--- a/System/Chat/ChatCenter.cs
+++ b/System/Chat/ChatCenter.cs
@@ -708,7 +708,7 @@
             CheckChatFloatOpen();
             if (win is MainInterfaceWin)
             {
-                CheckOpenChatAfterCollect();
+                SnxxzGame.Instance.StartCoroutine(Co_CheckAfterCollect());
             }
         }
 
@@ -744,6 +744,12 @@
             CheckOpenChatAfterCollect();
         }
 
+        IEnumerator Co_CheckAfterCollect()
+        {
+            yield return null;
+            CheckOpenChatAfterCollect();
+        }
+
         void CheckOpenChatAfterCollect()
         {
             if (!openChatAfterCollect)
@@ -754,7 +760,7 @@
             {
                 return;
             }
-            if (!WindowCenter.Instance.Open<MainInterfaceWin>()
+            if (!WindowCenter.Instance.CheckOpen<MainInterfaceWin>()
                 || WindowCenter.Instance.ExitAnyFullScreenOrMaskWin()
                 || StageManager.Instance.isLoading
                 || NewBieCenter.Instance.inGuiding)
@@ -766,7 +772,7 @@
             {
                 ChatCtrl.Inst.presentChatType = ChatInfoType.Fairy;
                 WindowCenter.Instance.CloseImmediately<MainInterfaceWin>();
-                WindowCenter.Instance.Open<SocialWin>(false, 2);
+                WindowCenter.Instance.Open<SocialWin>();
             }
         }
         #endregion
diff --git a/System/Chat/ChatCtrl.cs b/System/Chat/ChatCtrl.cs
index 220b877..b8eca6c 100644
--- a/System/Chat/ChatCtrl.cs
+++ b/System/Chat/ChatCtrl.cs
@@ -179,6 +179,9 @@
 
         DTC0102_tagCDBPlayer.switchAccountEvent += SwitchAccountEvent;
         StageManager.Instance.onStageLoadFinish += OnStageLoadFinish;
+        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += PlayerLoginOkEvent;
+
+        InitChatRedpoints();
 
         FuncConfigConfig _cfg = Config.Instance.Get<FuncConfigConfig>("RandomWord");
         try
@@ -192,12 +195,20 @@
         }
     }
 
+    private void PlayerLoginOkEvent()
+    {
+        UpdateRedpoint(ChatInfoType.Team);
+        UpdateRedpoint(ChatInfoType.Fairy);
+    }
+
     private void OnStageLoadFinish()
     {
         bool isDungeon = StageManager.Instance.CurrentStage is DungeonStage;
         if (!isDungeon)
         {
             ClearAllChatInfo();
+            unReadChatCounts[ChatInfoType.Fairy] = 0;
+            unReadChatCounts[ChatInfoType.Team] = 0;
         }
     }
 
@@ -430,6 +441,7 @@
     {
         ChatData chatData = new ChatFamilyData(vNetData.Content, (int)vNetData.PlayerID, vNetData.Name, vNetData.Extras);
         KeepChatInfo(chatData);
+        ReceiveNewChat(ChatInfoType.Fairy);
     }
     /// <summary>
     /// 濂藉弸绉佽亰
@@ -494,6 +506,7 @@
     {
         ChatData chatData = new ChatTeamData(vNetData.Content, (int)vNetData.PlayerID, vNetData.Name, vNetData.Extras);
         KeepChatInfo(chatData);
+        ReceiveNewChat(ChatInfoType.Team);
     }
     /// <summary>
     /// GM
@@ -990,6 +1003,75 @@
         return string.Empty;
     }
     #endregion
+
+    #region 浠欑紭绾㈢偣
+    Dictionary<ChatInfoType, Redpoint> chatSocialRedpoints = new Dictionary<ChatInfoType, Redpoint>();
+    Dictionary<ChatInfoType, int> unReadChatCounts = new Dictionary<ChatInfoType, int>();
+    public void InitChatRedpoints()
+    {
+        chatSocialRedpoints.Add(ChatInfoType.Fairy, new Redpoint(MainRedDot.RedPoint_FriendChatKey, 2502));
+        chatSocialRedpoints.Add(ChatInfoType.Team, new Redpoint(MainRedDot.RedPoint_FriendChatKey, 2503));
+        unReadChatCounts.Add(ChatInfoType.Fairy, 0);
+        unReadChatCounts.Add(ChatInfoType.Team, 0);
+    }
+
+    public void ViewChat(ChatInfoType type)
+    {
+        if (unReadChatCounts.ContainsKey(type))
+        {
+            unReadChatCounts[type] = 0;
+            UpdateRedpoint(type);
+        }
+    }
+
+    void ReceiveNewChat(ChatInfoType type)
+    {
+        switch (type)
+        {
+            case ChatInfoType.Team:
+                if (!WindowCenter.Instance.CheckOpen<TeamChatWin>())
+                {
+                    unReadChatCounts[ChatInfoType.Team] = Mathf.Min(unReadChatCounts[ChatInfoType.Team] + 1, 99);
+                }
+                break;
+            case ChatInfoType.Fairy:
+                if (!WindowCenter.Instance.CheckOpen<FairyChatWin>())
+                {
+                    unReadChatCounts[ChatInfoType.Fairy] = Mathf.Min(unReadChatCounts[ChatInfoType.Fairy] + 1, 99);
+                }
+                break;
+        }
+        UpdateRedpoint(type);
+    }
+
+    public void UpdateRedpoint(ChatInfoType type)
+    {
+        if (chatSocialRedpoints.ContainsKey(type))
+        {
+            var redpoint = chatSocialRedpoints[type];
+            if (unReadChatCounts[type] > 0)
+            {
+                redpoint.state = RedPointState.Quantity;
+                redpoint.count = unReadChatCounts[type];
+            }
+            else
+            {
+                redpoint.state = RedPointState.None;
+            }
+        }
+        var socialRed = MainRedDot.Instance.redPointFriendChat;
+        if (chatSocialRedpoints[ChatInfoType.Fairy].state == RedPointState.Quantity
+            || chatSocialRedpoints[ChatInfoType.Team].state == RedPointState.Quantity)
+        {
+            socialRed.count = unReadChatCounts[ChatInfoType.Fairy] > 0 ?
+                unReadChatCounts[ChatInfoType.Fairy] : unReadChatCounts[ChatInfoType.Team];
+        }
+        else
+        {
+            socialRed.count = 0;
+        }
+    }
+    #endregion
 }
 public struct ChatExtraData
 {
diff --git a/System/Chat/ChatTip.cs b/System/Chat/ChatTip.cs
index abe1422..bfb9a37 100644
--- a/System/Chat/ChatTip.cs
+++ b/System/Chat/ChatTip.cs
@@ -155,7 +155,7 @@
         {
             ChatCtrl.Inst.presentChatType = ChatInfoType.Fairy;
             WindowCenter.Instance.CloseImmediately<MainInterfaceWin>();
-            WindowCenter.Instance.Open<SocialWin>(false, 2);
+            WindowCenter.Instance.Open<SocialWin>();
             return;
         }
         WindowCenter.Instance.Open<ChatWin>();
@@ -228,11 +228,11 @@
         {
             case ChatInfoType.Team:
                 WindowCenter.Instance.CloseImmediately<MainInterfaceWin>();
-                WindowCenter.Instance.Open<SocialWin>(false, 1);
+                WindowCenter.Instance.Open<SocialWin>(false, 2);
                 break;
             case ChatInfoType.Fairy:
                 WindowCenter.Instance.CloseImmediately<MainInterfaceWin>();
-                WindowCenter.Instance.Open<SocialWin>(false, 2);
+                WindowCenter.Instance.Open<SocialWin>();
                 break;
             default:
                 WindowCenter.Instance.Open<ChatWin>();
diff --git a/System/Chat/FairyChatWin.cs b/System/Chat/FairyChatWin.cs
index 8bfea90..c39676d 100644
--- a/System/Chat/FairyChatWin.cs
+++ b/System/Chat/FairyChatWin.cs
@@ -18,6 +18,9 @@
         [SerializeField] ChatContentBehaviour m_ChatContent;
         [SerializeField] RectTransform m_ContainerNoFairy;
         [SerializeField] Button m_JoinFairy;
+
+        ChatCenter chatCenter { get { return ModelCenter.Instance.GetModel<ChatCenter>(); } }
+
         #region Built-in
         protected override void BindController()
         {
@@ -36,6 +39,9 @@
             ChatCtrl.Inst.presentChatType = ChatInfoType.Fairy;
             m_ChatContent.chatType = ChatInfoType.Fairy;
             MyFairyRefresh();
+            ChatCtrl.Inst.ViewChat(ChatInfoType.Fairy);
+            ChatCtrl.Inst.lockUpdate = false;
+            chatCenter.UpdateChatContentPos();
         }
 
         protected override void OnActived()
diff --git a/System/Chat/TeamChatWin.cs b/System/Chat/TeamChatWin.cs
index 812c682..f30097c 100644
--- a/System/Chat/TeamChatWin.cs
+++ b/System/Chat/TeamChatWin.cs
@@ -17,6 +17,7 @@
         [SerializeField] ChatContentBehaviour m_ChatContent;
         [SerializeField] RectTransform m_NoTeamContainer;
         TeamModel team { get { return ModelCenter.Instance.GetModel<TeamModel>(); } }
+        ChatCenter chatCenter { get { return ModelCenter.Instance.GetModel<ChatCenter>(); } }
         #region Built-in
         protected override void BindController()
         {
@@ -33,6 +34,9 @@
             ChatCtrl.Inst.presentChatType = ChatInfoType.Team;
             m_ChatContent.chatType = ChatInfoType.Team;
             MyTeamRefresh();
+            ChatCtrl.Inst.ViewChat(ChatInfoType.Team);
+            ChatCtrl.Inst.lockUpdate = false;
+            chatCenter.UpdateChatContentPos();
         }
 
         protected override void OnActived()
diff --git a/System/Compose/New/ComposeWin.cs b/System/Compose/New/ComposeWin.cs
index 68bfa55..74a40bc 100644
--- a/System/Compose/New/ComposeWin.cs
+++ b/System/Compose/New/ComposeWin.cs
@@ -67,7 +67,7 @@
         protected override void OnPreOpen()
         {
             ComposeModel.ResetModel();
-            if(WindowJumpMgr.Instance.IsJumpState)
+            if(WindowJumpMgr.Instance.IsJumpState && WindowJumpMgr.Instance.jumpType == 1)
             {
                 if(ComposeModel.CurComposeModel != null)
                 {
@@ -154,14 +154,19 @@
         {
             ComposeModel.ResetJumpToModel();
             selectModel.ClearSelectModel();
+          
         }
 
         protected override void OnAfterClose()
         {
-
             if (!WindowJumpMgr.Instance.IsJumpState)
             {
                 WindowCenter.Instance.Open<MainInterfaceWin>();
+               
+            }
+            if(WindowJumpMgr.Instance.jumpType != 1)
+            {
+                ComposeModel.SetCurComposeModel(null);
             }
         }
         #endregion
diff --git a/System/DailyQuest/DailyQuestBehaviour.cs b/System/DailyQuest/DailyQuestBehaviour.cs
index 8a540ee..6262cdd 100644
--- a/System/DailyQuest/DailyQuestBehaviour.cs
+++ b/System/DailyQuest/DailyQuestBehaviour.cs
@@ -15,6 +15,7 @@
     {
         [SerializeField] Text m_Title;
         [SerializeField] RectTransform m_ContainerTimes;
+        [SerializeField] Text m_TimesUnit;
         [SerializeField] TextEx m_Times;
         [SerializeField] Text m_PracticePoint;
         [SerializeField] Text m_UnLockCondition;
@@ -189,6 +190,17 @@
             else
             {
                 m_ContainerTimes.gameObject.SetActive(true);
+
+                switch ((DailyQuestType)this.data.id)
+                {
+                    case DailyQuestType.KillMonster:
+                        m_TimesUnit.text = Language.Get("DailyQuestMonster");
+                        break;
+                    default:
+                        m_TimesUnit.text = Language.Get("DailyQuestTimes");
+                        break;
+                }
+
                 m_Times.text = StringUtility.Contact(completedTimes, "/", totalTimes);
                 m_Times.colorType = completedTimes >= totalTimes ? TextColType.DarkGreen : TextColType.NavyBrown;
             }
@@ -318,6 +330,9 @@
 
             switch ((DailyQuestType)data.id)
             {
+                case DailyQuestType.KillMonster:
+                    m_PracticePoint.text = Language.Get("DailyQuestPerPoint2", config.OnceActivity, config.OnceActivityTime);
+                    break;
                 case DailyQuestType.BlastStove:
                     m_PracticePoint.text = Language.Get("DailyQuestLiandan", config.OnceActivity);
                     break;
diff --git a/System/DailyQuest/DailyQuestData.cs b/System/DailyQuest/DailyQuestData.cs
index a44ca39..da10ba2 100644
--- a/System/DailyQuest/DailyQuestData.cs
+++ b/System/DailyQuest/DailyQuestData.cs
@@ -152,6 +152,11 @@
             for (int i = 0; i < configs.Count; i++)
             {
                 var config = configs[i];
+                if (config.CanEnter == 0)
+                {
+                    continue;
+                }
+
                 if (config.StartWeekday == 0 && config.EndWeekday == 0)
                 {
                     for (int j = 0; j < 7; j++)
@@ -188,6 +193,11 @@
 
         foreach (var config in configs)
         {
+            if (config.CanEnter == 0)
+            {
+                continue;
+            }
+
             var openDayWeek = config.OpenServerWeek % 7;
             if (!specialOpenTimes.ContainsKey(openDayWeek))
             {
@@ -206,7 +216,6 @@
         }
     }
 
-
     public bool IsValidServerOpenTime()
     {
         return true;
@@ -220,9 +229,9 @@
         }
 
         var isSpecialDay = TimeUtility.OpenWeekCnt <= 1;
-        var openDayWeek = (int)TimeUtility.openServerTime.DayOfWeek;
+        var openDayWeek = (int)TimeUtility.openServerDayOfWeek;
         var dayIndex = TimeUtility.OpenDay + 1;
-        if (isSpecialDay && specialOpenTimes.ContainsKey(openDayWeek) && specialOpenTimes[openDayWeek].ContainsKey(dayIndex))
+        if (isSpecialDay)
         {
             if (specialOpenTimes.ContainsKey(openDayWeek) && specialOpenTimes[openDayWeek].ContainsKey(dayIndex))
             {
@@ -269,7 +278,7 @@
     public bool TryGetTodayNearestOpenTime(out HourMinute _hourMinute)
     {
         var isSpecialDay = TimeUtility.OpenWeekCnt <= 1;
-        var openDayWeek = (int)TimeUtility.openServerTime.DayOfWeek;
+        var openDayWeek = (int)TimeUtility.openServerDayOfWeek;
         var dayIndex = TimeUtility.OpenDay + 1;
         if (isSpecialDay)
         {
@@ -327,7 +336,7 @@
 
     public bool ContainTimeNode(int week, int timeNode)
     {
-        var openDayWeek = (int)TimeUtility.openServerTime.DayOfWeek;
+        var openDayWeek = (int)TimeUtility.openServerDayOfWeek;
 
         List<HourMinute> hourMinutes = null;
         var dayDelta = (week == 0 ? 7 : week) - (openDayWeek == 0 ? 7 : openDayWeek);
@@ -356,7 +365,7 @@
 
     private bool ContainWeek(int week)
     {
-        var openDayWeek = (int)TimeUtility.openServerTime.DayOfWeek;
+        var openDayWeek = (int)TimeUtility.openServerDayOfWeek;
         var todayWeek = (int)TimeUtility.ServerNow.DayOfWeek;
         var dayDelta = (week == 0 ? 7 : week) - (openDayWeek == 0 ? 7 : openDayWeek);
 
@@ -421,7 +430,7 @@
         var isSpecificDay = TimeUtility.OpenWeekCnt <= 1;
         if (isSpecificDay)
         {
-            var openDayWeek = (int)TimeUtility.openServerTime.DayOfWeek;
+            var openDayWeek = (int)TimeUtility.openServerDayOfWeek;
             var todayWeek = (int)TimeUtility.ServerNow.DayOfWeek;
             var dayDelta = ((week == 0 ? 7 : week) - (todayWeek == 0 ? 7 : todayWeek));
             var dayIndex = TimeUtility.OpenDay + 1 + dayDelta;
diff --git a/System/DailyQuest/DailyQuestModel.cs b/System/DailyQuest/DailyQuestModel.cs
index deea82a..294b00a 100644
--- a/System/DailyQuest/DailyQuestModel.cs
+++ b/System/DailyQuest/DailyQuestModel.cs
@@ -146,6 +146,11 @@
             UpdateRedpoints();
         }
 
+        public List<int> GetDailyQuests()
+        {
+            return new List<int>(dailyQuests.Keys);
+        }
+
         public List<int> GetDailyQuests(DailyQuestCategory _category)
         {
             var quests = new List<int>();
@@ -499,11 +504,6 @@
         private void OnFairyLeagueBattle()
         {
             UpdateDailyActionRedpoint((int)DailyQuestType.FairyLeague);
-        }
-
-        public Dictionary<int, DailyQuestData> GetDailyQuestlist()
-        {
-            return dailyQuests;
         }
 
         public void UpdateRedpoints()
diff --git a/System/DailyQuest/DailyQuestWin.cs b/System/DailyQuest/DailyQuestWin.cs
index 52fc4a0..4b4d934 100644
--- a/System/DailyQuest/DailyQuestWin.cs
+++ b/System/DailyQuest/DailyQuestWin.cs
@@ -32,6 +32,7 @@
         DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel<DungeonModel>(); } }
         PlayerTaskDatas taskModel { get { return ModelCenter.Instance.GetModel<PlayerTaskDatas>(); } }
         TreasureModel treasureModel { get { return ModelCenter.Instance.GetModel<TreasureModel>(); } }
+        MapModel mapModel { get { return ModelCenter.Instance.GetModel<MapModel>(); } }
 
         public int guidingDailyQuestId = 0;
 
@@ -84,8 +85,8 @@
             if (guidingDailyQuestId != 0)
             {
                 var preferTimeLimit = false;
-                var dailyQuests = model.GetDailyQuestlist();
-                foreach (var quest in dailyQuests.Keys)
+                var dailyQuests = model.GetDailyQuests();
+                foreach (var quest in dailyQuests)
                 {
                     var dailyQuestState = model.GetQuestState(quest);
                     DailyQuestOpenTime openTime;
@@ -295,6 +296,13 @@
                     WindowCenter.Instance.CloseImmediately<DailyQuestWin>();
                     WindowCenter.Instance.Open<PetWin>(false, 2);
                     break;
+                case DailyQuestType.KillMonster:
+                    var point = mapModel.GetRecommendHangPoint();
+                    var mapEventConfig = Config.Instance.Get<MapEventPointConfig>(point);
+                    mapModel.wannaLookLocalMap = mapEventConfig.MapID;
+                    WindowCenter.Instance.CloseImmediately<DailyQuestWin>();
+                    WindowCenter.Instance.Open<LocalMapWin>();
+                    break;
                 default:
                     break;
             }
diff --git a/System/DailyQuest/DayRemind.cs b/System/DailyQuest/DayRemind.cs
index 6230862..59f3fc4 100644
--- a/System/DailyQuest/DayRemind.cs
+++ b/System/DailyQuest/DayRemind.cs
@@ -45,6 +45,7 @@
     public const string OSGIFT_REDPOINT = "OSGitf_Redpoint";
     public const string TASK_SKILL_HOLE = "TaskSkillHole";
     public const string RUNE_SPECIAL_HOLE = "RuneSpecialHole";
+    public const string LEAGUE_NOTICE_REDPOINT = "LeagueNoticeRedpoint";
     public Dictionary<string, int[]> dayRemindDic = new Dictionary<string, int[]>();
 
     public bool GetDayRemind(string _remindKey)
@@ -98,6 +99,7 @@
         SetDayRemind(OSGIFT_REDPOINT);
         SetDayRemind(TASK_SKILL_HOLE);
         SetDayRemind(RUNE_SPECIAL_HOLE);
+        SetDayRemind(LEAGUE_NOTICE_REDPOINT);
     }
 
     private void SetDayRemind(string _key)
diff --git a/System/Dogz/DogzActiveWin.cs b/System/Dogz/DogzActiveWin.cs
index 632a3f7..e39c5e4 100644
--- a/System/Dogz/DogzActiveWin.cs
+++ b/System/Dogz/DogzActiveWin.cs
@@ -16,7 +16,7 @@
         [SerializeField] ScrollerController m_Controller;
         [SerializeField] List<DogzSkillData> m_DogzSkills;
         [SerializeField] List<DogzEquip> m_DogzEquips;
-        [SerializeField] List<Button> m_DogzUnEquipBtns;
+        [SerializeField] List<DogzUnEquip> m_DogzUnEquipBtns;
         [SerializeField] List<Text> m_PropertyTypes;
         [SerializeField] List<Text> m_PropertyValues;
         [SerializeField] Image m_DogzHeadIcon;
@@ -25,7 +25,11 @@
         [SerializeField] Button m_TakeOffEquipBtn;
         [SerializeField] Button m_EquipPackBtn;
         [SerializeField] Button m_CallBackBtn;
+        [SerializeField] RedpointBehaviour assistBtnRedBehav;
         [SerializeField] Text m_CallBackBtnTxt;
+        [SerializeField] UIEffect alreadyAssistEffect;
+        [SerializeField] UIEffect assistEffect;
+        [SerializeField] UIEffect assistTextEffect;
         DogzModel m_Model;
         DogzModel model
         {
@@ -51,7 +55,7 @@
             for (int i = 0; i < m_DogzUnEquipBtns.Count; i++)
             {
                 var _index = i;
-                m_DogzUnEquipBtns[i].onClick.AddListener(() =>
+                m_DogzUnEquipBtns[i].DogzUnEquipBtn.AddListener(() =>
                 {
                     OpenDogzEquip(_index);
                 });
@@ -66,8 +70,6 @@
             model.UpdateSelectDogzEvent += UpdateSelectDogzEvent;
             model.UpdateAssistDogzEvent += UpdateDogzAssistCnt;
             model.RefreshDogzEquipAct += RefreshDogzEquipEvent;
-
-
         }
 
         protected override void OnAfterOpen()
@@ -98,6 +100,8 @@
                 }
                 m_Controller.Restart();
             }
+            int jumpIndex = model.presentSelectDogz - 1 > 0 ? model.presentSelectDogz - 1 : 0;
+            m_Controller.JumpIndex(jumpIndex);
         }
         private void UpdateSelectDogzEvent()
         {
@@ -106,6 +110,7 @@
             UpdateDogzEquip();
             UpdateDogzProperty();
             UpdateDogzBtn();
+            assistBtnRedBehav.redpointId = model.GetDogzAssistRedpointById(model.presentSelectDogz).id;
         }
         private void UpdateDogzSkill()
         {
@@ -144,9 +149,12 @@
         private void RefreshDogzEquipEvent(int dogzId)
         {
             if (dogzId != model.presentSelectDogz) return;
+
+            m_Controller.m_Scorller.RefreshActiveCellViews();
             UpdateDogzEquip();
             UpdateDogzProperty();
             UpdateDogzBtn();
+
         }
 
         private void UpdateDogzEquip()
@@ -154,11 +162,30 @@
             var _dogzCfg = Config.Instance.Get<DogzConfig>(model.presentSelectDogz);
             m_DogzHeadIcon.SetSprite(_dogzCfg.HeadIcon);
             m_DogzHeadIcon.SetNativeSize();
+            var _dogzEquips = model.GetDogzEquips(model.presentSelectDogz);
+            alreadyAssistEffect.Stop();
+            if (_dogzEquips != null && _dogzEquips.Count == 5)
+            {
+                m_DogzHeadIcon.material = MaterialUtility.GetUIDefaultGraphicMaterial();
+                if(model.TryGetAssistDogzState(model.presentSelectDogz))
+                {
+                    if(!alreadyAssistEffect.IsPlaying)
+                    {
+                        alreadyAssistEffect.Play();
+                    }
+                }
+            }
+            else
+            {
+                m_DogzHeadIcon.material = MaterialUtility.GetDefaultSpriteGrayMaterial();
+            }
+
             for (int i = 0; i < m_DogzEquips.Count; i++)
             {
                 ItemModel _data;
                 bool _equiped = model.TryGetDogzEquip(model.presentSelectDogz, i+101, out _data);
-                m_DogzUnEquipBtns[i].gameObject.SetActive(!_equiped);
+                m_DogzUnEquipBtns[i].DogzUnEquipBtn.gameObject.SetActive(!_equiped);
+                m_DogzUnEquipBtns[i].RedpointBeh.redpointId = model.GetDogzEquipPlaceRedpointById(model.presentSelectDogz,i).id;
                 m_DogzEquips[i].gameObject.SetActive(_equiped);
                 if (_equiped)
                 {
@@ -178,21 +205,25 @@
             {
                 m_PropertyTypes[i].gameObject.SetActive(i < _dogzCfg.BaseAttrTypes.Length);
                 m_PropertyValues[i].gameObject.SetActive(i < _dogzCfg.BaseAttrTypes.Length);
+                string addAttrStr = "";
+                string baseAttrStr = "";
                 if (i < _dogzCfg.BaseAttrTypes.Length)
                 {
                     var _propertyCfg = Config.Instance.Get<PlayerPropertyConfig>(_dogzCfg.BaseAttrTypes[i]);
                     m_PropertyTypes[i].text = _propertyCfg.Name;
                     int attrValue = _dogzCfg.BaseAttrValues[i];
-
                     if (isAddAttr && model.m_DogzEquipAttrDict[_propertyCfg.ID] > 0)
                     {
-                        m_PropertyValues[i].text = StringUtility.Contact(UIHelper.ReplacePercentage(_dogzCfg.BaseAttrValues[i], _propertyCfg.ISPercentage)
-                      , _propertyCfg.ISPercentage == 1 ? "%" : string.Empty,"+",UIHelper.ReplacePercentage(model.m_DogzEquipAttrDict[_propertyCfg.ID], _propertyCfg.ISPercentage)
+                     
+                        baseAttrStr = StringUtility.Contact(UIHelper.ReplacePercentage(_dogzCfg.BaseAttrValues[i], _propertyCfg.ISPercentage)
                       , _propertyCfg.ISPercentage == 1 ? "%" : string.Empty);
+
+                        addAttrStr = StringUtility.Contact("+", UIHelper.ReplacePercentage(model.m_DogzEquipAttrDict[_propertyCfg.ID], _propertyCfg.ISPercentage)
+                   , _propertyCfg.ISPercentage == 1 ? "%" : string.Empty);
                     }
                     else
                     {
-                        m_PropertyValues[i].text = StringUtility.Contact(UIHelper.ReplacePercentage(_dogzCfg.BaseAttrValues[i], _propertyCfg.ISPercentage)
+                        baseAttrStr = StringUtility.Contact(UIHelper.ReplacePercentage(_dogzCfg.BaseAttrValues[i], _propertyCfg.ISPercentage)
                       , _propertyCfg.ISPercentage == 1 ? "%" : string.Empty);
                     }
                   
@@ -200,22 +231,40 @@
 
                 if(model.TryGetAssistDogzState(model.presentSelectDogz))
                 {
-                    m_PropertyTypes[i].material = MaterialUtility.GetUIDefaultGraphicMaterial();
-                    m_PropertyValues[i].material = MaterialUtility.GetUIDefaultGraphicMaterial();
+                    m_PropertyTypes[i].color = UIHelper.s_NavyBrown;
+                    if(addAttrStr != "")
+                    {
+                        m_PropertyValues[i].text = StringUtility.Contact("<color=#401c06>", baseAttrStr, "</color>", "<color=#109d06>", addAttrStr, "</color>");
+                    }
+                    else
+                    {
+                        m_PropertyValues[i].text = StringUtility.Contact("<color=#401c06>", baseAttrStr, "</color>");
+                    }
                 }
                 else
                 {
-                    m_PropertyTypes[i].material = MaterialUtility.GetDefaultSpriteGrayMaterial();
-                    m_PropertyValues[i].material = MaterialUtility.GetDefaultSpriteGrayMaterial();
+                    m_PropertyTypes[i].color = UIHelper.s_BrightWhiteColor;
+                    if (addAttrStr != "")
+                    {
+                        m_PropertyValues[i].text = StringUtility.Contact("<color=#686868>", baseAttrStr, "</color>", "<color=#109d06>", addAttrStr, "</color>");
+                    }
+                    else
+                    {
+                        m_PropertyValues[i].text = StringUtility.Contact("<color=#686868>", baseAttrStr, "</color>");
+                    }
                 }
             }
         }
+
         private void UpdateDogzAssistCnt()
         {
             m_Controller.m_Scorller.RefreshActiveCellViews();
             m_DogzAssistCnt.text = Language.Get("TreasurePrivilege_Dogz_1", StringUtility.Contact(model.GetAssistDogzCount(), "/", model.DogzAssistDefaultCnt));
             UpdateDogzBtn();
+            UpdateDogzProperty();
+            UpdateDogzEquip();
         }
+
         private void UpdateDogzBtn()
         {
             var _dogzEquips = model.GetDogzEquips(model.presentSelectDogz);
@@ -250,6 +299,8 @@
                 {
                     if(model.GetAssistDogzCount() < model.DogzAssistDefaultCnt)
                     {
+                        assistEffect.Play();
+                        assistTextEffect.Play();
                         model.SendChangeDogzAssist(1);
                     }
                     else
@@ -283,6 +334,15 @@
             [SerializeField] Button m_SkillBtn;
             public Button SkillBtn { get { return m_SkillBtn; } }
         }
+
+        [Serializable]
+        public class DogzUnEquip
+        {
+            [SerializeField] Button m_DogzUnEquipBtn;
+            public Button DogzUnEquipBtn { get { return m_DogzUnEquipBtn; } }
+            [SerializeField] RedpointBehaviour m_RedpointBeh;
+            public RedpointBehaviour RedpointBeh { get { return m_RedpointBeh; } }
+        }
     }
 }
 
diff --git a/System/Dogz/DogzCell.cs b/System/Dogz/DogzCell.cs
index 734b370..ec1bf90 100644
--- a/System/Dogz/DogzCell.cs
+++ b/System/Dogz/DogzCell.cs
@@ -14,6 +14,7 @@
         [SerializeField] Text m_DogzName;
         [SerializeField] Text m_DogzGrade;
         [SerializeField] Button m_DogzBtn;
+        [SerializeField] RedpointBehaviour redpointBehav;
 
         DogzModel m_Model;
         DogzModel model
@@ -34,6 +35,7 @@
             bool isActive = (_dogzEquips == null || _dogzEquips.Count < 5) ? false : true;
             m_DogzName.text = _dogzCfg.Name;
             m_DogzGrade.text = StringUtility.Contact("璇勫垎锛�", 100);
+            redpointBehav.redpointId = model.GetSingleDogzRedpointById(_dogzCfg.ID).id;
             if (isActive)
             {
                 m_DogzIcon.material = MaterialUtility.GetUIDefaultGraphicMaterial();
diff --git a/System/Dogz/DogzModel.cs b/System/Dogz/DogzModel.cs
index 25fc8c0..d33c8ad 100644
--- a/System/Dogz/DogzModel.cs
+++ b/System/Dogz/DogzModel.cs
@@ -14,6 +14,7 @@
         public override void Init()
         {
             ParseConfig();
+            SetDogzAndEquipPlaceRedKey();
         }
 
         public void OnBeforePlayerDataInitialize()
@@ -37,6 +38,9 @@
             SetDogzEquipInfo();
             playerPack.RefreshItemCountAct -= RefreshDogzEquipInfo;
             playerPack.RefreshItemCountAct += RefreshDogzEquipInfo;
+            UpdateDogzAssistRed();
+            UpdateDogzEquipPlaceRed();
+            UpdateAssistNumRed();
         }
 
         public override void UnInit()
@@ -104,15 +108,15 @@
             switch (_index)
             {
                 case 0:
-                    return "鍏借";
+                    return Language.Get("DogzEquip1");
                 case 1:
-                    return "榄旂溂";
+                    return Language.Get("DogzEquip2");
                 case 2:
-                    return "鐛犵墮";
+                    return Language.Get("DogzEquip3");
                 case 3:
-                    return "鍏界埅";
+                    return Language.Get("DogzEquip4");
                 case 4:
-                    return "槌炵敳";
+                    return Language.Get("DogzEquip5");
                 default:
                     return string.Empty;
             }
@@ -124,15 +128,17 @@
             {
                 case 0:
                 case 1:
-                    return "鐧借壊";
+                    return Language.Get("DogzWhite");
                 case 2:
-                    return "钃濊壊";
+                    return Language.Get("DogzBlue");
                 case 3:
-                    return "绱壊";
+                    return Language.Get("DogzPurple");
                 case 4:
-                    return "姗欒壊";
+                    return Language.Get("DogzOrange");
                 case 5:
-                    return "绾㈣壊";
+                    return Language.Get("DogzRed");
+                case 6:
+                    return Language.Get("DogzPink");
                 default:
                     return string.Empty;
             }
@@ -155,13 +161,23 @@
             }
         }
 
-        public event Action<int> OpenFuncEvent;
-        public void OpenDogzFuncEvent(int functionOrder)
+        public event Action<int,int> OpenFuncEvent;
+        public void OpenDogzFuncEvent(int functionOrder,int equipIndex)
         {
             if(OpenFuncEvent != null)
             {
-                OpenFuncEvent(functionOrder);
+                OpenFuncEvent(functionOrder,equipIndex);
             }
+        }
+
+        public bool CheckIsAddAssistNum()
+        {
+            var _itemConfig = Config.Instance.Get<ItemConfig>(AddAssistItem);
+            if(GetAssistItemCnt() <= playerPack.GetItemCountByID(PackType.rptItem, AddAssistItem))
+            {
+                return true;
+            }
+            return false;
         }
 
         #region 鍗忚
@@ -175,6 +191,8 @@
             {
                 UpdateAssistDogzEvent();
             }
+            UpdateDogzAssistRed();
+            UpdateDogzEquipPlaceRed();
         }
 
         public event Action UpdateAssistDogzEvent;
@@ -194,6 +212,9 @@
             {
                 UpdateAssistDogzEvent();
             }
+
+            UpdateDogzAssistRed();
+            UpdateDogzEquipPlaceRed();
         }
 
         public int GetAssistDogzCount()
@@ -218,7 +239,7 @@
 
         public void SetDogzEquipInfo()
         {
-            m_DogzEquipDict = new Dictionary<int, List<ItemModel>>();
+            m_DogzEquipDict.Clear();
             SinglePackModel singlePack = playerPack.GetSinglePackModel(PackType.rptDogzEquip);
             if (singlePack == null) return;
 
@@ -244,63 +265,75 @@
         public Action<int> RefreshDogzEquipAct;
         private void RefreshDogzEquipInfo(PackType type, int index, int id)
         {
-            if (type != PackType.rptDogzEquip) return;
-
-            ItemModel itemModel = playerPack.GetItemModelByIndex(type, index);
-            int dogzId = GetDogzIDByIndex(index);
-            List<ItemModel> modellist = GetDogzEquips(dogzId);
-            if(modellist != null)
+            if(type == PackType.rptItem && id == AddAssistItem)
             {
-                if (itemModel != null)
+                UpdateAssistNumRed();
+            }
+            else if(type == PackType.rptDogzItem)
+            {
+                UpdateDogzAssistRed();
+                UpdateDogzEquipPlaceRed();
+            }
+            else if(type == PackType.rptDogzEquip)
+            {
+                ItemModel itemModel = playerPack.GetItemModelByIndex(type, index);
+                int dogzId = GetDogzIDByIndex(index);
+                List<ItemModel> modellist = GetDogzEquips(dogzId);
+                if (modellist != null)
                 {
-                    bool isAdd = true;
-                    for (int i = 0; i < modellist.Count; i++)
+                    if (itemModel != null)
                     {
-                        if (modellist[i].itemInfo.ItemPlace == index)
+                        bool isAdd = true;
+                        for (int i = 0; i < modellist.Count; i++)
                         {
-                            isAdd = false;
-                            modellist[i] = itemModel;
-                            break;
+                            if (modellist[i].itemInfo.ItemPlace == index)
+                            {
+                                isAdd = false;
+                                modellist[i] = itemModel;
+                                break;
+                            }
+                        }
+                        if (isAdd)
+                        {
+                            modellist.Add(itemModel);
                         }
                     }
-                    if(isAdd)
+                    else
                     {
-                       modellist.Add(itemModel);
+                        for (int i = 0; i < modellist.Count; i++)
+                        {
+                            if (modellist[i].itemInfo.ItemPlace == index)
+                            {
+                                modellist.RemoveAt(i);
+                                break;
+                            }
+                        }
                     }
                 }
                 else
                 {
-                    for (int i = 0; i < modellist.Count; i++)
+                    if (itemModel != null)
                     {
-                        if (modellist[i].itemInfo.ItemPlace == index)
-                        {
-                            modellist.RemoveAt(i);
-                            break;
-                        }
+                        List<ItemModel> equipDatas = new List<ItemModel>();
+                        equipDatas.Add(itemModel);
+                        m_DogzEquipDict.Add(dogzId, equipDatas);
                     }
                 }
-            }
-            else
-            {
-                if(itemModel != null)
-                {
-                    List<ItemModel> equipDatas = new List<ItemModel>();
-                    equipDatas.Add(itemModel);
-                    m_DogzEquipDict.Add(dogzId,equipDatas);
-                }
-            }
-          
 
-            if(RefreshDogzEquipAct != null)
-            {
-                RefreshDogzEquipAct(dogzId);
+                if (RefreshDogzEquipAct != null)
+                {
+                    RefreshDogzEquipAct(dogzId);
+                }
+
+                UpdateDogzAssistRed();
+                UpdateDogzEquipPlaceRed();
             }
         }
 
         /// <summary>
         /// 鑾峰緱绁炲吔绌挎埓鐨勮澶囨暟鎹�
         /// </summary>
-        public Dictionary<int, List<ItemModel>> m_DogzEquipDict { get; private set; }
+        private Dictionary<int, List<ItemModel>> m_DogzEquipDict = new Dictionary<int, List<ItemModel>>();
 
         public List<ItemModel> GetDogzEquips(int _dogzId)
         {
@@ -510,13 +543,13 @@
         }
 
         public List<ItemModel> selectEquipPlacelist { get; private set; }
-        public List<ItemModel> GetDogzItemListByIndex(int index)
+        public List<ItemModel> GetDogzItemListByIndex(int dogzId,int index)
         {
             SinglePackModel singlePack = playerPack.GetSinglePackModel(PackType.rptDogzItem);
             selectEquipPlacelist.Clear();
             if (singlePack == null) return selectEquipPlacelist;
 
-            var _itemColor = GetDogzEquipLimitByIndex(presentSelectDogz, index);
+            var _itemColor = GetDogzEquipLimitByIndex(dogzId, index);
             var _equipPlace = GetDogzEquipPlaceByIndex(index);
             Dictionary<int, ItemModel> pairs = singlePack.GetPackModelIndexDict();
             foreach (var value in pairs.Values)
@@ -547,41 +580,276 @@
         }
         #endregion
 
-        #region 瑁呭璇︾粏淇℃伅
-        public DogzEquipData viewDetailData { get; private set; }
-
-        public bool viewDetailCompare { get; private set; }
-
-        public void ViewDetail(int _itemId, bool compare = false)
-        {
-            //viewDetailData = new DogzEquipData(_itemId);
-            //viewDetailCompare = compare;
-            //if (!WindowCenter.Instance.CheckOpen<DogzDetailsWin>())
-            //{
-            //    WindowCenter.Instance.Open<DogzDetailsWin>();
-            //}
-        }
-
-        public int DogzEquipScore(DogzEquipData data)
-        {
-            return 0;
-        }
-        #endregion
-
         #region 榛樿閫夋嫨閫昏緫澶勭悊
         public void SetDefaultSelectDogz()
         {
             var configs = Config.Instance.GetAllValues<DogzConfig>();
             presentSelectDogz = configs[0].ID;
-            foreach (var key in dogzAssistStateDict.Keys)
+            foreach (var key in m_DogzEquipLimit.Keys)
             {
-                if(dogzAssistStateDict[key] == 1)
+                Redpoint redpoint = GetSingleDogzRedpointById(key);
+                if (redpoint.state == RedPointState.Simple)
                 {
-                    if(presentSelectDogz < key)
+                    presentSelectDogz = key;
+                    break;
+                }
+            }
+        }
+        #endregion
+
+        #region 绾㈢偣閫昏緫澶勭悊
+        public const int MAINDOGZ_REDKEY = 112;
+        public const int DOGZFUNC_REDKEY = 11201;
+        public const int ADDASSISTDOGZ_REDKEY = 1120100002;
+        public Redpoint mainDogzRedpoint = new Redpoint(MainRedDot.RedPoint_key, MAINDOGZ_REDKEY);
+        public Redpoint dogzFuncRedpoint = new Redpoint(MAINDOGZ_REDKEY,DOGZFUNC_REDKEY);
+        public Redpoint addAssistDogzRedpoint = new Redpoint(DOGZFUNC_REDKEY,ADDASSISTDOGZ_REDKEY);
+        private Dictionary<int, Redpoint> singleDogzRedDict = new Dictionary<int, Redpoint>();
+        private Dictionary<int, Redpoint> dogzAssistRedDict = new Dictionary<int, Redpoint>();
+        private Dictionary<int, Dictionary<int, Redpoint>> dogzEquipPlaceRedDict = new Dictionary<int, Dictionary<int, Redpoint>>();
+        public void SetDogzAndEquipPlaceRedKey()
+        {
+            singleDogzRedDict.Clear();
+            dogzEquipPlaceRedDict.Clear();
+            dogzAssistRedDict.Clear();
+            int i = 0;
+            foreach(var dogzId in m_DogzEquipLimit.Keys)
+            {
+                i += 1;
+                int dogzRedKey = DOGZFUNC_REDKEY * 100 + i;
+                Redpoint dogzRedPoint = new Redpoint(DOGZFUNC_REDKEY,dogzRedKey);
+                singleDogzRedDict.Add(dogzId, dogzRedPoint);
+                int dogzAssistRedKey = dogzRedKey * 100 + i;
+                Redpoint dogzAssistRedPoint = new Redpoint(dogzRedKey, dogzAssistRedKey);
+                dogzAssistRedDict.Add(dogzId,dogzAssistRedPoint);
+                Dictionary<int, Redpoint> equipPlaceRedDict = new Dictionary<int, Redpoint>();
+                dogzEquipPlaceRedDict.Add(dogzId,equipPlaceRedDict);
+                int equipPlaceNum = m_DogzEquipLimit[dogzId].Count;
+                for (int j = 0; j < equipPlaceNum; j++)
+                {
+                    int equipPlaceRedKey = dogzRedKey * 10 + j;
+                    Redpoint equipPlaceRedpoint = new Redpoint(dogzRedKey,equipPlaceRedKey);
+                    equipPlaceRedDict.Add(j, equipPlaceRedpoint);
+                }
+
+            }
+        }
+
+        public Redpoint GetSingleDogzRedpointById(int dogzId)
+        {
+            Redpoint redpoint = null;
+            singleDogzRedDict.TryGetValue(dogzId, out redpoint);
+            return redpoint;
+        }
+
+        public Redpoint GetDogzAssistRedpointById(int dogzId)
+        {
+            Redpoint redpoint = null;
+            dogzAssistRedDict.TryGetValue(dogzId,out redpoint);
+            return redpoint;
+        }
+
+        public Redpoint GetDogzEquipPlaceRedpointById(int dogzId,int index)
+        {
+            Redpoint redpoint = null;
+            if(dogzEquipPlaceRedDict.ContainsKey(dogzId))
+            {
+                dogzEquipPlaceRedDict[dogzId].TryGetValue(index, out redpoint);
+            }
+            return redpoint;
+        }
+
+        public void UpdateDogzAssistRed()
+        {
+            foreach(var value in dogzAssistRedDict.Values)
+            {
+                value.state = RedPointState.None;
+            }
+            bool isMaxAssistNum = GetAssistDogzCount() >= DogzAssistDefaultCnt ? true : false;
+            if(!isMaxAssistNum)
+            {
+                int maxDogzId = 0;
+                foreach(var dogzId in m_DogzEquipLimit.Keys)
+                {
+                    var equips = GetDogzEquips(dogzId);
+                    int equipNum = equips == null ? 0 : equips.Count;
+                    if(equipNum >= 5 && maxDogzId < dogzId
+                        && !TryGetAssistDogzState(dogzId))
                     {
-                        presentSelectDogz = key;
+                        maxDogzId = dogzId;
                     }
                 }
+                if(maxDogzId > 0)
+                {
+                    Redpoint assistRedpoint = GetDogzAssistRedpointById(maxDogzId);
+                    if(assistRedpoint.state == RedPointState.None)
+                    {
+                        assistRedpoint.state = RedPointState.Simple;
+                    }
+                }
+            }
+            else
+            {
+                foreach (var dogzId in m_DogzEquipLimit.Keys)
+                {
+                    var equips = GetDogzEquips(dogzId);
+                    int equipNum = equips == null ? 0 : equips.Count;
+                    if(!TryGetAssistDogzState(dogzId) && equipNum == 5)
+                    {
+                        Redpoint assistRedpoint = GetDogzAssistRedpointById(dogzId);
+                        if (assistRedpoint.state == RedPointState.None)
+                        {
+                            assistRedpoint.state = RedPointState.Simple;
+                        }
+                        break;
+                    }
+                }
+            }
+        }
+
+        public void UpdateDogzEquipPlaceRed()
+        {
+            foreach(var value in dogzEquipPlaceRedDict.Values)
+            {
+                foreach(var value2 in value.Values)
+                {
+                    value2.state = RedPointState.None;
+                }
+            }
+
+            foreach(var value in dogzAssistRedDict.Values)
+            {
+                if(value.state == RedPointState.Simple)
+                {
+                    return;
+                }
+            }
+            bool isMaxAssistNum = GetAssistDogzCount() >= DogzAssistDefaultCnt ? true : false;
+            if (!isMaxAssistNum)
+            {
+                int maxEquipNum = 0;
+                int spaceDogzId = 0;
+                foreach (var dogzId in m_DogzEquipLimit.Keys)
+                {
+                    var equips = GetDogzEquips(dogzId);
+                    int equipNum = equips == null ? 0 : equips.Count;
+                    if (equipNum < 5)
+                    {
+                        if (spaceDogzId == 0)
+                        {
+                            if (maxEquipNum <= equipNum)
+                            {
+                                maxEquipNum = equipNum;
+                                spaceDogzId = dogzId;
+                            }
+                        }
+                        else
+                        {
+                            if (maxEquipNum < equipNum)
+                            {
+                                maxEquipNum = equipNum;
+                                spaceDogzId = dogzId;
+                            }
+                        }
+                    }
+                }
+
+                if(spaceDogzId != 0)
+                {
+                    for(int i = 0; i < 5; i++)
+                    {
+                        ItemModel _data;
+                        bool _equiped = TryGetDogzEquip(spaceDogzId, i + 101, out _data);
+                        if(!_equiped)
+                        {
+                            GetDogzItemListByIndex(spaceDogzId,i);
+                            if (selectEquipPlacelist.Count > 0)
+                            {
+                                Redpoint equipPlaceRedpoint = GetDogzEquipPlaceRedpointById(spaceDogzId,i);
+                                if(equipPlaceRedpoint.state == RedPointState.None)
+                                {
+                                    equipPlaceRedpoint.state = RedPointState.Simple;
+                                }
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+            else
+            {
+                int minAlreadyAssistId = 0;
+                foreach (var dogzId in m_DogzEquipLimit.Keys)
+                {
+                    if(TryGetAssistDogzState(dogzId)
+                        && minAlreadyAssistId != 0
+                        && minAlreadyAssistId < dogzId)
+                    {
+                        minAlreadyAssistId = dogzId;
+                    }
+                }
+
+                foreach (var dogzId in m_DogzEquipLimit.Keys)
+                {
+                    var equips = GetDogzEquips(dogzId);
+                    int equipNum = equips == null ? 0 : equips.Count;
+                    bool isBetterDogz = true;
+                    if(!TryGetAssistDogzState(dogzId) && dogzId > minAlreadyAssistId && equipNum < 5)
+                    {
+                        for (int i = 0; i < 5; i++)
+                        {
+                            ItemModel _data;
+                            bool _equiped = TryGetDogzEquip(dogzId, i + 101, out _data);
+                            if (!_equiped)
+                            {
+                                GetDogzItemListByIndex(dogzId,i);
+                                if (selectEquipPlacelist.Count < 1)
+                                {
+                                    isBetterDogz = false;
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                    else
+                    {
+                        isBetterDogz = false;
+                    }
+
+                    if(isBetterDogz)
+                    {
+                        for (int i = 0; i < 5; i++)
+                        {
+                            ItemModel _data;
+                            bool _equiped = TryGetDogzEquip(dogzId, i + 101, out _data);
+                            if (!_equiped)
+                            {
+                                Redpoint equipPlaceRedpoint = GetDogzEquipPlaceRedpointById(dogzId, i);
+                                if (equipPlaceRedpoint.state == RedPointState.None)
+                                {
+                                    equipPlaceRedpoint.state = RedPointState.Simple;
+                                    break;
+                                }
+                            }
+                        }
+                        break;
+                    }
+                }
+            }
+        }
+
+        public void UpdateAssistNumRed()
+        {
+          if(CheckIsAddAssistNum())
+           {
+                if(addAssistDogzRedpoint.state == RedPointState.None)
+                {
+                    addAssistDogzRedpoint.state = RedPointState.Simple;
+                }
+            }
+          else
+            {
+                addAssistDogzRedpoint.state = RedPointState.None;
             }
         }
         #endregion
diff --git a/System/Dogz/DogzPackWin.cs b/System/Dogz/DogzPackWin.cs
index b9db389..61ffb22 100644
--- a/System/Dogz/DogzPackWin.cs
+++ b/System/Dogz/DogzPackWin.cs
@@ -16,7 +16,7 @@
     public class DogzPackWin : Window
     {
         [SerializeField] List<DogzEquip> m_DogzEquips;
-        [SerializeField] List<Button> m_DogzUnEquipBtns;
+        [SerializeField] List<DogzUnEquip> m_DogzUnEquipBtns;
         [SerializeField] List<Text> m_DogzUnEquipContents;
         [SerializeField] Image m_DogzHeadIcon;
         [SerializeField] Button m_CloseBtn;
@@ -24,6 +24,8 @@
         [SerializeField] ScrollerController m_PackController;
         [SerializeField] Button qualitySelectBtn;
         [SerializeField] Button starSelectBtn;
+        [SerializeField] Transform qualityArrow;
+        [SerializeField] Transform starArrow;
         [SerializeField] SortTable qualitySort;
         [SerializeField] SortTable starSort;
 
@@ -63,14 +65,19 @@
             playerPack.RefreshItemCountAct += RefreshDogzItemEvent;
             qualitySort.onSelectSortEvent += RefreshDogzSelectEvent;
             starSort.onSelectSortEvent += RefreshDogzSelectEvent;
+            qualitySort.onSortCloseEvent += CloseQualitySort;
+            starSort.onSortCloseEvent += CloseStarSort;
             dogzModel.SelectDogzItemQuality = 0;
             dogzModel.SelectDogzItemStart = 0;
+
             starSort.SetDefault();
             qualitySort.SetDefault();
             UpdateDogzEquip();
             UpdateDogzPack();
             starSort.gameObject.SetActive(false);
             qualitySort.gameObject.SetActive(false);
+            starArrow.localRotation = Quaternion.Euler(0, 0, 180);
+            qualityArrow.localRotation = Quaternion.Euler(0, 0, 180);
         }
 
         protected override void OnAfterOpen()
@@ -83,6 +90,8 @@
             playerPack.RefreshItemCountAct -= RefreshDogzItemEvent;
             qualitySort.onSelectSortEvent -= RefreshDogzSelectEvent;
             starSort.onSelectSortEvent -= RefreshDogzSelectEvent;
+            qualitySort.onSortCloseEvent -= CloseQualitySort;
+            starSort.onSortCloseEvent -= CloseStarSort;
         }
 
         protected override void OnAfterClose()
@@ -106,7 +115,8 @@
                 ItemModel _data;
                 int index = i;
                 bool _equiped = dogzModel.TryGetDogzEquip(dogzModel.presentSelectDogz, i+101, out _data);
-                m_DogzUnEquipBtns[i].gameObject.SetActive(!_equiped);
+                m_DogzUnEquipBtns[i].DogzUnEquipBtn.gameObject.SetActive(!_equiped);
+                m_DogzUnEquipBtns[i].RedpointBeh.redpointId = dogzModel.GetDogzEquipPlaceRedpointById(dogzModel.presentSelectDogz,i).id;
                 m_DogzEquips[i].gameObject.SetActive(_equiped);
                 if (_equiped)
                 {
@@ -118,15 +128,15 @@
                     m_DogzUnEquipContents[i].text = StringUtility.Contact(DogzModel.GetItemColorName(_itemColor),
                         DogzModel.GetDogzPartNameByIndex(i));
                     m_DogzUnEquipContents[i].color = UIHelper.GetUIColor(_itemColor);
-                    m_DogzUnEquipBtns[i].RemoveAllListeners();
-                    m_DogzUnEquipBtns[i].AddListener(() => { ClickEquipIndex(index); });
+                    m_DogzUnEquipBtns[i].DogzUnEquipBtn.RemoveAllListeners();
+                    m_DogzUnEquipBtns[i].DogzUnEquipBtn.AddListener(() => { ClickEquipIndex(index); });
                 }
             }
         }
 
         private void ClickEquipIndex(int index)
         {
-            dogzModel.GetDogzItemListByIndex(index);
+            dogzModel.GetDogzItemListByIndex(dogzModel.presentSelectDogz,index);
             if(dogzModel.selectEquipPlacelist.Count > 0)
             {
                 WindowCenter.Instance.Open<SelectDogzItemWin>();
@@ -177,16 +187,45 @@
         private void GetEquipBtn()
         {
             //--鐣岄潰璺宠浆
+            WindowJumpMgr.Instance.WindowJumpTo(JumpUIType.DogzDungeon);
         }
 
         private void ClickStarSelect()
         {
-            starSort.gameObject.SetActive(!starSort.gameObject.activeInHierarchy);
+            starArrow.localRotation = Quaternion.Euler(0, 0, 0);
+            if (!starSort.gameObject.activeInHierarchy)
+            {
+                starSort.gameObject.SetActive(true);
+            }
         }
 
         private void ClickQualitySelect()
         {
-            qualitySort.gameObject.SetActive(!qualitySort.gameObject.activeInHierarchy);
+            qualityArrow.localRotation = Quaternion.Euler(0, 0, 0);
+            if (!qualitySort.gameObject.activeInHierarchy)
+            {
+                qualitySort.gameObject.SetActive(true);
+            }
+        }
+
+
+        private void CloseQualitySort()
+        {
+            qualityArrow.localRotation = Quaternion.Euler(0, 0, 180);
+        }
+
+        private void CloseStarSort()
+        {
+            starArrow.localRotation = Quaternion.Euler(0, 0, 180);
+        }
+
+        [Serializable]
+        public class DogzUnEquip
+        {
+            [SerializeField] Button m_DogzUnEquipBtn;
+            public Button DogzUnEquipBtn { get { return m_DogzUnEquipBtn; } }
+            [SerializeField] RedpointBehaviour m_RedpointBeh;
+            public RedpointBehaviour RedpointBeh { get { return m_RedpointBeh; } }
         }
     }
 
diff --git a/System/Dogz/DogzWin.cs b/System/Dogz/DogzWin.cs
index d324829..e76ab14 100644
--- a/System/Dogz/DogzWin.cs
+++ b/System/Dogz/DogzWin.cs
@@ -70,8 +70,9 @@
         }
 
 
-        private void OnOpenFuncEvent(int order)
+        private void OnOpenFuncEvent(int order,int equipIndex)
         {
+            ModelCenter.Instance.GetModel<GodBeastModel>().ItemPlace = equipIndex;
             funcBtnGroup.TriggerByOrder(order);
             if(WindowCenter.Instance.CheckOpen<DogzPackWin>())
             {
diff --git a/System/DogzDungeon/DogzBoxBehaviour.cs b/System/DogzDungeon/DogzBoxBehaviour.cs
index 82cbd47..d0291e1 100644
--- a/System/DogzDungeon/DogzBoxBehaviour.cs
+++ b/System/DogzDungeon/DogzBoxBehaviour.cs
@@ -20,7 +20,7 @@
         public void Display()
         {
             timer = 0f;
-            UI3DModelExhibition.Instance.BeginShowNPC(model.bigBoxNpcId, Vector3.zero, m_RawImage);
+            UI3DModelExhibition.Instance.ShowNPC(model.bigBoxNpcId, Vector3.zero, m_RawImage);
             DisplayBoxSurplusInfo();
             model.boxSurplusChangeEvent += OnBoxInfoUpdate;
         }
@@ -28,7 +28,7 @@
         public void Dispose()
         {
             model.boxSurplusChangeEvent -= OnBoxInfoUpdate;
-            UI3DModelExhibition.Instance.StopShowNPC();
+            UI3DModelExhibition.Instance.StopShow();
         }
 
         private void OnBoxInfoUpdate()
diff --git a/System/DogzDungeon/DogzDungeonModel.cs b/System/DogzDungeon/DogzDungeonModel.cs
index 9708931..987270f 100644
--- a/System/DogzDungeon/DogzDungeonModel.cs
+++ b/System/DogzDungeon/DogzDungeonModel.cs
@@ -13,14 +13,11 @@
         public const int DATA_MAPID = 21110;
 
         int m_SelectedBoss = 0;
-        public int selectedBoss
-        {
-            get
-            {
+        public int selectedBoss {
+            get {
                 return this.m_SelectedBoss;
             }
-            set
-            {
+            set {
                 if (this.m_SelectedBoss != value)
                 {
                     this.m_SelectedBoss = value;
@@ -33,11 +30,9 @@
         }
 
         int m_WearyValue = 0;
-        public int wearyValue
-        {
+        public int wearyValue {
             get { return m_WearyValue; }
-            set
-            {
+            set {
                 if (m_WearyValue != value)
                 {
                     m_WearyValue = value;
@@ -50,11 +45,9 @@
         }
 
         int m_BigBoxCollectCount = 0;
-        public int bigBoxCollectCount
-        {
+        public int bigBoxCollectCount {
             get { return m_BigBoxCollectCount; }
-            set
-            {
+            set {
                 if (m_BigBoxCollectCount != value)
                 {
                     m_BigBoxCollectCount = value;
@@ -67,8 +60,7 @@
         }
 
         int m_SmallBoxCollectCount = 0;
-        public int smallBoxCollectCount
-        {
+        public int smallBoxCollectCount {
             get { return m_SmallBoxCollectCount; }
             set { m_SmallBoxCollectCount = value; }
         }
@@ -272,18 +264,47 @@
 
         public void UpdateBoxOrEliteRefreshTime(HA904_tagGCDogzNPCRefreshTime _refreshTimes)
         {
+            var containBox = false;
+            var boxRefreshSecond = 0;
+
+            var containElite = false;
+            var eliteRefreshSecond = 0;
+
             for (int i = 0; i < _refreshTimes.InfoList.Length; i++)
             {
                 var info = _refreshTimes.InfoList[i];
                 if (bigBoxNpcId == info.NPCID || smallBoxNpcId == info.NPCID)
                 {
-                    dogzDungeonBox.UpdateBoxRefreshTime((int)info.RefreshSecond);
-                    RequestBoxSurplusInfo();
+                    containBox = true;
+                    boxRefreshSecond = (int)info.RefreshSecond;
                 }
 
                 if (eliteMonsters.Contains((int)info.NPCID))
                 {
-                    dogzDungeonElite.UpdateEliteRefreshTime((int)info.RefreshSecond);
+                    containElite = true;
+                    eliteRefreshSecond = (int)info.RefreshSecond;
+                }
+            }
+
+            if (containBox)
+            {
+                dogzDungeonBox.UpdateBoxRefreshTime(boxRefreshSecond);
+            }
+
+            if (containElite)
+            {
+                dogzDungeonElite.UpdateEliteRefreshTime(eliteRefreshSecond);
+            }
+
+            if (WindowCenter.Instance.CheckOpen("DogzDungeonWin"))
+            {
+                if (containBox)
+                {
+                    RequestBoxSurplusInfo();
+                }
+
+                if (containElite)
+                {
                     RequestEliteSurplusInfo();
                 }
             }
@@ -344,10 +365,8 @@
     public class DogzDungeonElite
     {
         public Dictionary<int, int> eliteCounts = new Dictionary<int, int>();
-        public int eliteSurplus
-        {
-            get
-            {
+        public int eliteSurplus {
+            get {
                 var count = 0;
                 foreach (var eliteCount in eliteCounts.Values)
                 {
@@ -392,10 +411,8 @@
     public class DogzDungeonBossData
     {
         public int id { get; private set; }
-        public bool isUnLocked
-        {
-            get
-            {
+        public bool isUnLocked {
+            get {
                 var config = Config.Instance.Get<NPCConfig>(id);
                 return PlayerDatas.Instance.baseData.LV >= config.NPCLV;
             }
diff --git a/System/DogzDungeon/DogzEliteMonsterBehaviour.cs b/System/DogzDungeon/DogzEliteMonsterBehaviour.cs
index 92542fb..d42af15 100644
--- a/System/DogzDungeon/DogzEliteMonsterBehaviour.cs
+++ b/System/DogzDungeon/DogzEliteMonsterBehaviour.cs
@@ -19,7 +19,7 @@
         public void Display()
         {
             timer = 0f;
-            UI3DModelExhibition.Instance.BeginShowNPC(model.eliteMonsters[0], Vector3.zero, m_RawImage);
+            UI3DModelExhibition.Instance.ShowNPC(model.eliteMonsters[0], Vector3.zero, m_RawImage);
             DisplayGuardSurplusInfo();
             model.boxSurplusChangeEvent += OnGuardInfoUpdate;
         }
@@ -27,7 +27,7 @@
         public void Dispose()
         {
             model.boxSurplusChangeEvent -= OnGuardInfoUpdate;
-            UI3DModelExhibition.Instance.StopShowNPC();
+            UI3DModelExhibition.Instance.StopShow();
         }
 
         private void OnGuardInfoUpdate()
diff --git a/System/Dungeon/DungenWHYJ.cs b/System/Dungeon/DungenWHYJ.cs
new file mode 100644
index 0000000..47d7cdb
--- /dev/null
+++ b/System/Dungeon/DungenWHYJ.cs
@@ -0,0 +1,107 @@
+锘�//--------------------------------------------------------
+//    [Author]:           绗簩涓栫晫
+//    [  Date ]:           Friday, September 21, 2018
+//--------------------------------------------------------
+using UnityEngine;
+using System.Collections;
+using UnityEngine.UI;
+using TableConfig;
+using System;
+
+namespace Snxxz.UI
+{
+
+    public class DungenWHYJ : MonoBehaviour
+    {
+
+        [SerializeField] Button m_WHYJButton;
+        [SerializeField] GameObject m_Container_WHYJ;
+        [SerializeField] Transform m_Horizontal;
+        DungeonModel model { get { return ModelCenter.Instance.GetModel<DungeonModel>(); } }
+
+        public void Init()
+        {
+            model.dungeonFightStageChangeEevent -= dungeonFightStageChangeEevent;
+            model.dungeonFightStageChangeEevent += dungeonFightStageChangeEevent;
+            model.updateMissionEvent -= updateMissionEvent;
+            model.updateMissionEvent += updateMissionEvent;
+            if (model.dungeonFightStage == DungeonFightStage.Prepare)
+            {
+                m_Container_WHYJ.SetActive(true);
+            }
+            else
+            {
+                m_Container_WHYJ.SetActive(false);
+            }
+            SetTranItemCell();
+        }
+
+        private void updateMissionEvent()
+        {
+            SetTranItemCell();
+        }
+
+        private void Start()
+        {
+            m_WHYJButton.AddListener(OnClickButton);
+        }
+        private void OnEnable()
+        {
+           
+        }
+        private void OnDisable()
+        {
+           
+        }
+
+        private void dungeonFightStageChangeEevent(DungeonFightStage obj)
+        {
+            if (obj == DungeonFightStage.Prepare)
+            {
+                if (!m_Container_WHYJ.activeSelf)
+                {
+                    m_Container_WHYJ.SetActive(true);
+                }
+            }
+            else if(obj == DungeonFightStage.Normal)
+            {
+                if (m_Container_WHYJ.activeSelf)
+                {
+                    m_Container_WHYJ.SetActive(false);
+                }
+            }
+        }
+
+        private void SetTranItemCell()
+        {
+            int lineID = model.mission.lineID;
+            var WHYJConfig = Config.Instance.Get<WHYJRewardConfig>(lineID+1);
+            int[] RewardList = ConfigParse.GetMultipleStr<int>(WHYJConfig.Reward);
+            int[] QuantityList = ConfigParse.GetMultipleStr<int>(WHYJConfig.Quantity);
+            for (int i = 0; i < m_Horizontal.childCount; i++)
+            {
+                if (i < RewardList.Length)
+                {
+                    m_Horizontal.GetChild(i).gameObject.SetActive(true);
+                    ItemCell ItemCell = m_Horizontal.GetChild(i).GetComponent<ItemCell>();
+                    ItemCellModel cellModel = new ItemCellModel(RewardList[i], true, (ulong)QuantityList[i], 0);
+                    ItemCell.Init(cellModel);
+                }
+                else
+                {
+                    m_Horizontal.GetChild(i).gameObject.SetActive(false);
+                }
+
+            }
+
+        }
+        private void OnClickButton()
+        {
+            m_Container_WHYJ.SetActive(!m_Container_WHYJ.activeSelf);
+        }
+    }
+
+}
+
+
+
diff --git a/System/Dungeon/DungenWHYJ.cs.meta b/System/Dungeon/DungenWHYJ.cs.meta
new file mode 100644
index 0000000..db335aa
--- /dev/null
+++ b/System/Dungeon/DungenWHYJ.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 979d7cffed796d145bb0cc4290a14943
+timeCreated: 1537527871
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/System/Dungeon/DungeonFightWin.cs b/System/Dungeon/DungeonFightWin.cs
index 3d4fa8b..85643da 100644
--- a/System/Dungeon/DungeonFightWin.cs
+++ b/System/Dungeon/DungeonFightWin.cs
@@ -30,7 +30,8 @@
         [SerializeField] DungeonItemCollect m_ItemCollect;
         [SerializeField] DungeonGuardSkyBehaviour m_GuardSky;
         [SerializeField] DungeonBossBriefInfoContainer m_BossInfosContainer;
-
+        [SerializeField] GameObject m_Container_WHYJ;
+        [SerializeField] DungenWHYJ m_DungenWHYJ;
         bool excutedAutoExit = false;
         float timer = 0f;
         DateTime endTime = DateTime.Now;
@@ -97,6 +98,15 @@
 
             model.dungeonCoolDownEvent += OnLeaveMapTimeEvent;
             MainInterfaceWin.Event_Duplicates += OnChangeFuncBtnPosEvent;
+            if (WHYJBool())
+            {
+                m_Container_WHYJ.SetActive(true);
+                m_DungenWHYJ.Init();
+            }
+            else
+            {
+                m_Container_WHYJ.SetActive(false);
+            }
         }
 
         protected override void OnAfterOpen()
@@ -120,10 +130,10 @@
             MainInterfaceWin.Event_Duplicates -= OnChangeFuncBtnPosEvent;
             model.dungeonCoolDownEvent -= OnLeaveMapTimeEvent;
 
+            var mapId = PlayerDatas.Instance.baseData.MapID;
+            var mapConfig = Config.Instance.Get<MapConfig>(mapId);
             try
             {
-                var mapId = PlayerDatas.Instance.baseData.MapID;
-                var mapConfig = Config.Instance.Get<MapConfig>(mapId);
                 if (mapConfig != null && mapConfig.MapFBType != (int)MapType.OpenCountry)
                 {
                     throw new NullReferenceException();
@@ -131,10 +141,10 @@
             }
             catch (Exception ex)
             {
-                Debug.Log(ex.Message);
-                ExceptionCatcher.ReportException("鍓湰鎴樻枟鐣岄潰寮傚父鍏抽棴", ex.Message);
+                Debug.Log(ex);
+                var content = StringUtility.Contact("褰撳墠鍦板浘锛�", PlayerDatas.Instance.baseData.MapID, ";鍫嗘爤淇℃伅锛�", ex.StackTrace);
+                ExceptionCatcher.ReportException("鍓湰鎴樻枟鐣岄潰寮傚父鍏抽棴", content);
             }
-
         }
 
         protected override void OnAfterClose()
@@ -265,7 +275,7 @@
                         var config = Config.Instance.Get<RuneTowerFloorConfig>(runeTowerModel.currentFloor);
                         var lastFloor = (int)ModelCenter.Instance.GetModel<RuneModel>().RuneTowerOpenLV;
                         var lastFloorConfig = Config.Instance.Get<RuneTowerFloorConfig>(lastFloor);
-                        if (model.dungeonResult.isPass == 1 && config.TowerId == lastFloorConfig.TowerId)
+                        if (model.dungeonResult.isPass == 1 && config.TowerId == lastFloorConfig.TowerId && lastFloorConfig.AutoExit == 0)
                         {
                             var runeTowerStage = StageManager.Instance.CurrentStage as RuneTowerDungeonStage;
                             runeTowerStage.PerformChallengeNextLevel();
@@ -365,6 +375,18 @@
 
         }
 
+        private bool WHYJBool()//鍒ゆ柇鏄惁鍦ㄥú鐨囬仐杩瑰壇鏈�
+        {
+            var dataMapId = model.GetDataMapIdByMapId(PlayerDatas.Instance.baseData.MapID);
+            if (dataMapId == GeneralConfig.Instance.ruinsTranscriptMapId)
+            {
+                return true;
+            }
+            else
+            {
+                return false;
+            }
+        }
     }
 
 }
diff --git a/System/Dungeon/DungeonModel.cs b/System/Dungeon/DungeonModel.cs
index dba8087..d4c2aa7 100644
--- a/System/Dungeon/DungeonModel.cs
+++ b/System/Dungeon/DungeonModel.cs
@@ -453,7 +453,7 @@
                             }
                             else
                             {
-                                CancelGroupEnter(_dungeon.mapId);
+                                CancelGroupEnter(_dungeon);
                             }
                         });
                     }
@@ -479,9 +479,9 @@
             }
         }
 
-        private void CancelGroupEnter(int _mapId)
+        private void CancelGroupEnter(Dungeon _dungeon)
         {
-            switch (_mapId)
+            switch (_dungeon.mapId)
             {
                 case RealmModel.REALM_DUNGEON_ID:
                     if (!WindowCenter.Instance.CheckOpen<TeamFrameWin>())
@@ -491,20 +491,19 @@
                         WindowCenter.Instance.Open<TeamFrameWin>(false, teamModel.myTeam.inTeam ? 1 : 0);
                     }
                     break;
+                default:
+                    if (!WindowCenter.Instance.CheckOpen<TeamFrameWin>())
+                    {
+                        var teamModel = ModelCenter.Instance.GetModel<TeamModel>();
+                        teamModel.missionBuf = teamModel.currentMission = new TeamMission(_dungeon.mapId, _dungeon.lineId);
+                        WindowCenter.Instance.Open<TeamFrameWin>(false, teamModel.myTeam.inTeam ? 1 : 0);
+                    }
+                    break;
             }
         }
 
         private string GroupChallengeOnlyOneTip(int _mapId)
         {
-            switch (_mapId)
-            {
-                case 60010:
-                    if (PlayerDatas.Instance.baseData.LV < GeneralConfig.Instance.trialDungeonGroupChallengeTipLv)
-                    {
-                        return Language.Get("SingleIntoFB");
-                    }
-                    break;
-            }
             return Language.Get("FBEnter_OnlyYou");
         }
 
@@ -1168,7 +1167,7 @@
                 var mapResConfig = DTCA127_tagMCStartChangeMap.GetMapResourcesConfig(_dataMapId, _lineId);
                 var assetVersion = AssetVersionUtility.GetAssetVersion(StringUtility.Contact("maps/", mapResConfig.MapResources.ToLower()));
 
-                if (!assetVersion.IsPriorAsset())
+                if (assetVersion != null && !assetVersion.IsPriorAsset())
                 {
                     InGameDownLoad.Instance.TryDownLoad(InGameDownLoad.Dominant.Whole);
                     return;
diff --git a/System/Dungeon/DungeonNuwaVictoryWin.cs b/System/Dungeon/DungeonNuwaVictoryWin.cs
index f9bd41b..3d75273 100644
--- a/System/Dungeon/DungeonNuwaVictoryWin.cs
+++ b/System/Dungeon/DungeonNuwaVictoryWin.cs
@@ -147,11 +147,18 @@
                 m_NumberOfPliesText.text = Language.Get("DungeonVictoryWin_NumberOfPliesText", str);
             }
         }
-
+        List<ServerItem> Serveritem = new List<ServerItem>();
         protected override void DrawItemRewards()
         {
-            var merged = false;
+            Serveritem.Clear();
+               var merged = false;
             var serveritems = dungeonModel.dungeonResult.itemInfo;
+
+            for (int i = 0; i < serveritems.Length; i++)
+            {
+                Serveritem.Add(serveritems[i]);
+            }
+            Serveritem.Sort(Compare);
             var hasReward = (serveritems != null && serveritems.Length > 0) || dungeonModel.specialItemCollectRecord.count > 0;
 
             m_RewardIndexs.Clear();
@@ -164,12 +171,12 @@
             }
             m_ContainerReward.gameObject.SetActive(hasReward);
 
-            if (serveritems != null)
+            if (Serveritem != null)
             {
                 var items = new List<ItemModel>();
-                for (int i = 0; i < serveritems.Length; i++)
+                for (int i = 0; i < Serveritem.Count; i++)
                 {
-                    var serverItem = serveritems[i];
+                    var serverItem = Serveritem[i];
                     var itemModel = new ItemModel(PackType.rptItem);
                     var itemInfo = new ItemInfo();
                     itemInfo.ItemID = serverItem.ItemID;
@@ -190,7 +197,8 @@
                     itemModel.SetItemModel(itemInfo);
                     items.Add(itemModel);
                 }
-                items.Sort(Compare);
+             //   items.Sort(Compare);
+
                 for (int i = 0; i < passRewardBehaviours.Length; i++)
                 {
                     var behaviour = passRewardBehaviours[i];
@@ -198,7 +206,7 @@
                     {
                         behaviour.transform.parent.gameObject.SetActive(true);
                         behaviour.gameObject.SetActive(false);
-                        behaviour.serverItem = serveritems[i];
+                        behaviour.serverItem = Serveritem[i];
                         behaviour.Init(items[i]);
                         m_RewardIndexs.Add(m_SpecialItemCollect == null ? i : i + 1);
                     }
@@ -231,10 +239,10 @@
             }
         }
 
-        int Compare(ItemModel x, ItemModel y)//鏁扮粍鎺掑垪
+        int Compare(ServerItem x, ServerItem y)//鏁扮粍鎺掑垪
         {
-            ItemConfig itemConfigx = Config.Instance.Get<ItemConfig>(x.itemId);
-            ItemConfig itemConfigy = Config.Instance.Get<ItemConfig>(y.itemId);
+            ItemConfig itemConfigx = Config.Instance.Get<ItemConfig>(x.ItemID);
+            ItemConfig itemConfigy = Config.Instance.Get<ItemConfig>(y.ItemID);
             if (itemConfigx.ItemColor.CompareTo(itemConfigy.ItemColor) != 0)
                 return -itemConfigx.ItemColor.CompareTo(itemConfigy.ItemColor);
             return 1;
diff --git a/System/Dungeon/DungeonRuneTowerVictoryWin.cs b/System/Dungeon/DungeonRuneTowerVictoryWin.cs
index 041c9a5..3f597b6 100644
--- a/System/Dungeon/DungeonRuneTowerVictoryWin.cs
+++ b/System/Dungeon/DungeonRuneTowerVictoryWin.cs
@@ -46,7 +46,7 @@
                 var config = Config.Instance.Get<RuneTowerFloorConfig>(runeTowerModel.currentFloor);
                 var lastFloor = (int)ModelCenter.Instance.GetModel<RuneModel>().RuneTowerOpenLV;
                 var lastFloorConfig = Config.Instance.Get<RuneTowerFloorConfig>(lastFloor);
-                m_RuneTowerNext.gameObject.SetActive(config.TowerId == lastFloorConfig.TowerId);
+                m_RuneTowerNext.gameObject.SetActive(lastFloorConfig.AutoExit == 0 && config.TowerId == lastFloorConfig.TowerId);
 
                 DisplayRunesUnLock(lastFloor);
             }
diff --git a/System/Dungeon/NormalDungeonEntranceWin.cs b/System/Dungeon/NormalDungeonEntranceWin.cs
index ebf8705..c0a495f 100644
--- a/System/Dungeon/NormalDungeonEntranceWin.cs
+++ b/System/Dungeon/NormalDungeonEntranceWin.cs
@@ -46,7 +46,10 @@
         [SerializeField] ButtonEx m_GroupStart;
         [SerializeField] ButtonEx m_SingleStart;
         [SerializeField] ButtonEx m_AutoGroupStart;
+        [SerializeField] ButtonEx m_Group;
         [SerializeField] Button m_CloseWin;
+
+        [SerializeField] RectTransform m_ContainerGroup;
 
         DungeonModel model { get { return ModelCenter.Instance.GetModel<DungeonModel>(); } }
         TeamModel teamModel { get { return ModelCenter.Instance.GetModel<TeamModel>(); } }
@@ -63,6 +66,7 @@
             m_SingleStart.AddListener(ChallengeDungeon);
             m_AutoGroupStart.AddListener(AutoGroupChallenge);
             m_Sweep.AddListener(SweepDungeon);
+            m_Group.AddListener(OpenGroup);
             m_CloseWin.AddListener(CloseClick);
         }
 
@@ -99,6 +103,12 @@
         }
         #endregion
 
+        private void OpenGroup()
+        {
+            var openGroup = m_ContainerGroup.gameObject.activeSelf;
+            m_ContainerGroup.gameObject.SetActive(!openGroup);
+        }
+
         private void UpdateDungeonEnterCD()
         {
             var dungeonId = model.GetDungeonId(model.currentDungeon);
@@ -118,6 +128,9 @@
             m_SingleStart.gameObject.SetActive(fbType == 1 || fbType == 2);
             m_AutoGroupStart.gameObject.SetActive(fbType == 2 || fbType == 3);
 
+            m_ContainerGroup.gameObject.SetActive(false);
+            m_Group.gameObject.SetActive(fbType == 2 || fbType == 3);
+
             m_EntranceBG.SetSprite(dungeonOpenTimeConfig.PanelImg);
 
             m_DungeonTitle.text = dungeonConfig.FBName;
@@ -133,7 +146,7 @@
                 }
                 else
                 {
-                    UI3DModelExhibition.Instance.BeginShowNPC(dungeonConfig.BossActorID[0], Vector3.zero, m_BossPortrayal);
+                    UI3DModelExhibition.Instance.ShowNPC(dungeonConfig.BossActorID[0], Vector3.zero, m_BossPortrayal);
                 }
 
             }
diff --git a/System/Dungeon/TrialDungeonEntranceWin.cs b/System/Dungeon/TrialDungeonEntranceWin.cs
index 2214828..7b5370f 100644
--- a/System/Dungeon/TrialDungeonEntranceWin.cs
+++ b/System/Dungeon/TrialDungeonEntranceWin.cs
@@ -40,6 +40,9 @@
         [SerializeField] Image m_BossRealm;
         [SerializeField] Text m_BossName;
 
+        [SerializeField] RectTransform m_ContainerGroup;
+        [SerializeField] Button m_Group;
+
         [SerializeField] TrialRewardsBehaviour[] m_RewardBehaviours;
         [SerializeField] ScrollRect m_RewardScroller;
 
@@ -72,6 +75,7 @@
             m_SingleStart.AddListener(ChallengeDungeon);
             m_AutoGroupStart.AddListener(AutoGroupChallenge);
             m_CloseWin.AddListener(CloseClick);
+            m_Group.AddListener(OpenGroup);
         }
 
         protected override void OnPreOpen()
@@ -81,6 +85,9 @@
             m_GroupStart.image.material = CheckChallenge() ? MaterialUtility.GetUIDefaultGraphicMaterial() : MaterialUtility.GetDefaultSpriteGrayMaterial();
             m_SingleStart.image.material = CheckChallenge() ? MaterialUtility.GetUIDefaultGraphicMaterial() : MaterialUtility.GetDefaultSpriteGrayMaterial();
             m_AutoGroupStart.image.material = CheckChallenge() ? MaterialUtility.GetUIDefaultGraphicMaterial() : MaterialUtility.GetDefaultSpriteGrayMaterial();
+            m_Group.image.material = CheckChallenge() ? MaterialUtility.GetUIDefaultGraphicMaterial() : MaterialUtility.GetDefaultSpriteGrayMaterial();
+            m_ContainerGroup.gameObject.SetActive(false);
+
             DrawDungeonBaseInfo();
             DrawRewards();
         }
@@ -92,7 +99,7 @@
         protected override void OnPreClose()
         {
             model.dungeonRecordChangeEvent -= UpdateDungeonTimes;
-            UI3DModelExhibition.Instance.StopShowNPC();
+            UI3DModelExhibition.Instance.StopShow();
         }
 
         protected override void OnAfterClose()
@@ -100,6 +107,15 @@
         }
         #endregion
 
+        private void OpenGroup()
+        {
+            if (!CheckChallenge())
+            {
+                return;
+            }
+            var openGroup = m_ContainerGroup.gameObject.activeSelf;
+            m_ContainerGroup.gameObject.SetActive(!openGroup);
+        }
 
         private void DrawDungeonBaseInfo()
         {
@@ -113,6 +129,7 @@
             m_GroupStart.gameObject.SetActive(fbType == 2 || fbType == 3);
             m_SingleStart.gameObject.SetActive(fbType == 1 || fbType == 2);
             m_AutoGroupStart.gameObject.SetActive(fbType == 2 || fbType == 3);
+            m_Group.gameObject.SetActive(fbType == 2 || fbType == 3);
 
             var playerLevel = PlayerDatas.Instance.baseData.LV;
             m_LevelLimit.gameObject.SetActive(playerLevel < dungeonConfig.LVLimitMin);
@@ -151,7 +168,7 @@
         void DisplayBossInfo(int _npcId)
         {
             m_BossName.gameObject.SetActive(true);
-            UI3DModelExhibition.Instance.BeginShowNPC(_npcId, Vector3.zero, m_BossPortrayal);
+            UI3DModelExhibition.Instance.ShowNPC(_npcId, Vector3.zero, m_BossPortrayal);
             var npcConfig = Config.Instance.Get<NPCConfig>(_npcId);
             if (npcConfig != null)
             {
diff --git a/System/Dungeon/TrialDungeonModel.cs b/System/Dungeon/TrialDungeonModel.cs
index f477264..46b97dc 100644
--- a/System/Dungeon/TrialDungeonModel.cs
+++ b/System/Dungeon/TrialDungeonModel.cs
@@ -113,9 +113,17 @@
 
         private void RefreshItemCountAct(PackType packType, int arg2, int itemId)
         {
-            if (packType == PackType.rptItem && trialTokens.Contains(itemId))
+            var config = Config.Instance.Get<ItemConfig>(itemId);
+            if (config == null)
             {
-                UpdateRedpoint();
+                return;
+            }
+            if (packType == PackType.rptItem)
+            {
+                if (trialTokens.Contains(itemId) || config.EquipPlace > 0)
+                {
+                    UpdateRedpoint();
+                }
             }
             else if (packType == PackType.rptEquip)
             {
@@ -263,7 +271,29 @@
             {
                 return 0;
             }
-            var singlepack = packModel.GetSinglePackModel(PackType.rptEquip);
+            var singlepack = packModel.GetSinglePackModel(PackType.rptItem);
+            if (singlepack != null)
+            {
+                var dict = singlepack.GetPackModelIndexDict();
+                if (dict != null)
+                {
+                    foreach (var itemModel in dict.Values)
+                    {
+                        if (itemModel.chinItemModel.EquipPlace == config.EquipPlace
+                            && (itemModel.chinItemModel.JobLimit / 100 == PlayerDatas.Instance.baseData.Job
+                            || itemModel.chinItemModel.JobLimit == 0)
+                            && !ModelCenter.Instance.GetModel<PackModelInterface>().IsOverdue(itemModel.itemInfo.ItemGUID, itemModel.itemId, itemModel.useDataDict))
+                        {
+                            var compare = EquipCompare(itemModel, config);
+                            if (compare == -1 || compare == 0)
+                            {
+                                return compare;
+                            }
+                        }
+                    }
+                }
+            }
+            singlepack = packModel.GetSinglePackModel(PackType.rptEquip);
             if (singlepack == null)
             {
                 return 1;
@@ -273,7 +303,12 @@
             {
                 return 1;
             }
-            var compareConfig = Config.Instance.Get<ItemConfig>(equipItem.itemId);
+            return EquipCompare(equipItem, config);
+        }
+
+        int EquipCompare(ItemModel compareItem, ItemConfig config)
+        {
+            var compareConfig = Config.Instance.Get<ItemConfig>(compareItem.itemId);
             if (compareConfig == null)
             {
                 return 1;
diff --git a/System/Dungeon/TrialExchangeWin.cs b/System/Dungeon/TrialExchangeWin.cs
index 8dc8e8d..96b6686 100644
--- a/System/Dungeon/TrialExchangeWin.cs
+++ b/System/Dungeon/TrialExchangeWin.cs
@@ -82,6 +82,7 @@
             model.SelectEquipClassEvent += SelectEquipClassEvent;
             packModel.RefreshItemCountAct += RefreshItemCountAct;
             Display();
+            JumpToRedpoint();
         }
 
         protected override void OnAfterOpen()
@@ -170,10 +171,18 @@
 
         private void RefreshItemCountAct(PackType packtype, int arg2, int itemId)
         {
-            if (packtype == PackType.rptItem && model.trialTokens.Contains(itemId))
+            var config = Config.Instance.Get<ItemConfig>(itemId);
+            if (config == null)
             {
-                m_Controller.m_Scorller.RefreshActiveCellViews();
-                DisplayTokens();
+                return;
+            }
+            if (packtype == PackType.rptItem)
+            {
+                if (model.trialTokens.Contains(itemId) || config.EquipPlace > 0)
+                {
+                    m_Controller.m_Scorller.RefreshActiveCellViews();
+                    DisplayTokens();
+                }
             }
             else if (packtype == PackType.rptEquip)
             {
@@ -215,6 +224,62 @@
             DisplayTokens();
             bool _up = m_SelectClassBehaviour.gameObject.activeSelf;
             m_SelectClassUp.transform.localEulerAngles = Vector3.zero.SetZ(_up ? 0 : 180);
+            JumpToRedpoint();
+        }
+
+        private void JumpToRedpoint()
+        {
+            if (model.selectEquipClass == 1)
+            {
+                var trialClasses = model.GetTotalClass();
+                var index = 0;
+                for (int i = 0; i < trialClasses.Count; i++)
+                {
+                    var line = 0;
+                    index += 1;
+                    if (JumpToRedpoint(trialClasses[i], out line))
+                    {
+                        m_Controller.JumpIndex(index + line);
+                        return;
+                    }
+                    else
+                    {
+                        List<TrialExchangeConfig> list;
+                        if (model.TryGetTrialExchanges(trialClasses[i], out list))
+                        {
+                            index += Mathf.CeilToInt((float)list.Count / 3);
+                        }
+                    }
+                }
+            }
+            else
+            {
+                var line = 0;
+                JumpToRedpoint(model.selectEquipClass, out line);
+                m_Controller.JumpIndex(line);
+            }
+        }
+
+        private bool JumpToRedpoint(int _class, out int line)
+        {
+            var itemId = 0;
+            line = 0;
+            if (model.IsAnySatisfyExchangeBetterEquip(_class, out itemId))
+            {
+                List<TrialExchangeConfig> list;
+                if (model.TryGetTrialExchanges(_class, out list))
+                {
+                    for (int i = 0; i < list.Count; i++)
+                    {
+                        if (list[i].id == itemId)
+                        {
+                            line = i / 3;
+                            return true;
+                        }
+                    }
+                }
+            }
+            return false;
         }
     }
 
diff --git a/System/FairyAu/FairyBoss.cs b/System/FairyAu/FairyBoss.cs
index d09abe9..d6784c4 100644
--- a/System/FairyAu/FairyBoss.cs
+++ b/System/FairyAu/FairyBoss.cs
@@ -159,7 +159,7 @@
 
         void OnShowFairyBossModel()
         {
-            UI3DModelExhibition.Instance.BeginShowNPC(fairyBossModel.fairyBossNpcId, Vector3.zero, model);
+            UI3DModelExhibition.Instance.ShowNPC(fairyBossModel.fairyBossNpcId, Vector3.zero, model);
         }
 
         private void OnFoodGetWay()
@@ -323,7 +323,7 @@
 
         protected override void OnAfterClose()
         {
-            UI3DModelExhibition.Instance.StopShowNPC();
+            UI3DModelExhibition.Instance.StopShow();
             PlayerDatas.Instance.fairyData.OnRefreshFairyInfo -= OnRefreshFairyBoss;
             PlayerDatas.Instance.fairyData.OnRefreshFairyBoss -= OnRefreshFairyBoss;
             TimeMgr.Instance.OnHourEvent -= OnRefreshFairyBoss;
diff --git a/System/FairyAu/FairyGrabBossHelpBehaviour.cs b/System/FairyAu/FairyGrabBossHelpBehaviour.cs
index 4a10051..6bcdf10 100644
--- a/System/FairyAu/FairyGrabBossHelpBehaviour.cs
+++ b/System/FairyAu/FairyGrabBossHelpBehaviour.cs
@@ -73,6 +73,12 @@
                     model.RemoveHelp();
                     return;
                 }
+                if (PlayerDatas.Instance.extersion.bossState == 1)
+                {
+                    SysNotifyMgr.Instance.ShowTip("Boss_Leave");
+                    model.RemoveHelp();
+                    return;
+                }
                 if (!model.IsBossAlive(help.npcId))
                 {
                     ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"), Language.Get("FairyGrabBossNotAlive"), (bool isOk) =>
@@ -85,6 +91,7 @@
                       });
                     return;
                 }
+                model.RemoveHelp();
                 MapTransferUtility.Instance.MoveToNPC(help.npcId);
             }
         }
diff --git a/System/FairyAu/FairyGrabBossWin.cs b/System/FairyAu/FairyGrabBossWin.cs
index 7bbeee6..e82125d 100644
--- a/System/FairyAu/FairyGrabBossWin.cs
+++ b/System/FairyAu/FairyGrabBossWin.cs
@@ -23,11 +23,13 @@
         [SerializeField] RectTransform m_ContainerUnOpen;
         [SerializeField] RectTransform m_ContainerOpen;
         [SerializeField] Text m_SurplusTime;
+        [SerializeField] Text m_OpenDate;
 
         FairyGrabBossModel model { get { return ModelCenter.Instance.GetModel<FairyGrabBossModel>(); } }
         DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel<DungeonModel>(); } }
         BossHomeModel bossHomeModel { get { return ModelCenter.Instance.GetModel<BossHomeModel>(); } }
         FindPreciousModel findPreciousModel { get { return ModelCenter.Instance.GetModel<FindPreciousModel>(); } }
+        DailyQuestModel dailyQuestModel { get { return ModelCenter.Instance.GetModel<DailyQuestModel>(); } }
 
         float m_Timer = 0f;
         const float Interval = 10f;
@@ -51,11 +53,13 @@
             DisplaySurplusTime();
             DisplayBossInfo();
             DisplayHighestFairy();
+            DisplayOpenDate();
             GlobalTimeEvent.Instance.secondEvent += SecondEvent;
             model.bossSelectedEvent += BossSelectedEvent;
             model.bossProgressUpdate += BossProgressUpdate;
             model.bossAllProgressUpdate += BossAllProgressUpdate;
             model.stateUpdate += StateUpdate;
+            TimeUtility.OnServerOpenDayRefresh += OnServerOpenDayRefresh;
             m_Timer = 0;
         }
 
@@ -79,6 +83,7 @@
             model.bossProgressUpdate -= BossProgressUpdate;
             model.bossAllProgressUpdate -= BossAllProgressUpdate;
             model.stateUpdate -= StateUpdate;
+            TimeUtility.OnServerOpenDayRefresh -= OnServerOpenDayRefresh;
         }
 
         protected override void OnAfterClose()
@@ -97,6 +102,11 @@
         }
         #endregion
 
+        private void OnServerOpenDayRefresh()
+        {
+            DisplayOpenDate();
+        }
+
         void DisplayBosses()
         {
             var bosses = new List<int>();
@@ -106,6 +116,19 @@
             m_Bosses.MoveToCenter(bosses.IndexOf(model.selectBoss));
         }
 
+        void DisplayOpenDate()
+        {
+            DailyQuestOpenTime dailyQuestOpenTime;
+            if (dailyQuestModel.TryGetOpenTime((int)DailyQuestType.FairyGrabBoss, out dailyQuestOpenTime))
+            {
+                m_OpenDate.text = Language.Get("FairyGrabBossOpenDate", dailyQuestOpenTime.ToOpenTimeString());
+            }
+            else
+            {
+                m_OpenDate.text = string.Empty;
+            }
+        }
+
         void DisplayBossInfo()
         {
             List<Item> dropItems;
diff --git a/System/FairyAu/FairyLeagueModel.cs b/System/FairyAu/FairyLeagueModel.cs
index eed633f..4bd36dd 100644
--- a/System/FairyAu/FairyLeagueModel.cs
+++ b/System/FairyAu/FairyLeagueModel.cs
@@ -9,7 +9,7 @@
 
 namespace Snxxz.UI
 {
-    public class FairyLeagueModel : Model, IAfterPlayerDataInitialize, IBeforePlayerDataInitialize, IPlayerLoginOk
+    public class FairyLeagueModel : Model, IAfterPlayerDataInitialize, IBeforePlayerDataInitialize, IPlayerLoginOk,IOpenServerActivity
     {
         public event Action OnRefreshFairyLeagueEvent;
 
@@ -17,8 +17,7 @@
         {
             get
             {
-                var openServerTime = TimeUtility.openServerTime;
-                var openServerWeekDay = openServerTime.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)openServerTime.DayOfWeek;
+                var openServerWeekDay = TimeUtility.openServerDayOfWeek == DayOfWeek.Sunday ? 7 : (int)TimeUtility.openServerDayOfWeek;
                 if (specialLeagueTimes.ContainsKey(openServerWeekDay))
                 {
                     var dict = specialLeagueTimes[openServerWeekDay];
@@ -40,8 +39,7 @@
         {
             get
             {
-                var openServerTime = TimeUtility.openServerTime;
-                var openServerWeekDay = openServerTime.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)openServerTime.DayOfWeek;
+                var openServerWeekDay = TimeUtility.openServerDayOfWeek == DayOfWeek.Sunday ? 7 : (int)TimeUtility.openServerDayOfWeek;
                 if (specialLeagueTimes.ContainsKey(openServerWeekDay))
                 {
                     var dict = specialLeagueTimes[openServerWeekDay];
@@ -123,9 +121,11 @@
             DTCA003_tagUniversalGameRecInfo.onGetUniversalGameInfo += OnGetUniversalGameInfo;
             PlayerDatas.Instance.PlayerDataRefreshInfoEvent += PlayerDataRefreshInfoEvent;
             StageManager.Instance.onStageLoadFinish += OnStageLoadFinish;
+            FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
             TimeMgr.Instance.OnMinuteEvent += MinuteEvent;
             TimeMgr.Instance.OnDayEvent += DayEvent;
             fairyLeagueHelp = new FairyLeagueHelp();
+            OpenServerActivityCenter.Instance.Register((int)OpenServerActivityCenter.OSActivityType.FairyLeagueNotice, this);
         }
 
         public override void UnInit()
@@ -154,6 +154,7 @@
             cacheLeagueStage = fairyLeagueStage;
             CheckFairyLeagueData();
             UpdateRedpoint();
+            UpdateNoticeRedpoint();
             serverInited = true;
         }
 
@@ -244,6 +245,7 @@
         readonly List<int> fairyLeagueStateValues = new List<int>() { 11, 12, 13, 21, 22, 23 };
         FairyLeagueWeekTime fairyLeagueWeekTime = new FairyLeagueWeekTime();
         Dictionary<int, Dictionary<int, FairyLeagueWeekTime>> specialLeagueTimes = new Dictionary<int, Dictionary<int, FairyLeagueWeekTime>>();
+        public Dictionary<int,int> leagueNoticeWeapons { get; private set; }
         private void ParseConfig()
         {
             FuncConfigConfig cfg = Config.Instance.Get<FuncConfigConfig>("FamilyMatchGuide");
@@ -351,12 +353,15 @@
             integralAddition = int.Parse(cfg.Numerical5);
             cfg = Config.Instance.Get<FuncConfigConfig>("FamilyMatchResourcePoint1");
             crystalRateDict = ConfigParse.GetDic<int, float>(cfg.Numerical1);
+            cfg = Config.Instance.Get<FuncConfigConfig>("FamilyForcast");
+            leagueNoticeWeapons = ConfigParse.GetDic<int, int>(cfg.Numerical1);
         }
 
         int GetIndexOfWeek(int _openWeekDay, int _openDays, out int dayOfWeek)
         {
-            var index = (_openWeekDay + _openDays - 1) / 7;
+            var index = (_openWeekDay + _openDays - 2) / 7;
             dayOfWeek = (_openWeekDay + _openDays - 1) % 7;
+            dayOfWeek = dayOfWeek == 0 ? 7 : dayOfWeek;
             return index;
         }
 
@@ -905,6 +910,7 @@
         #region 绾㈢偣
         private Redpoint m_LeagueRedpoint = new Redpoint(107, 10704);
         public Redpoint m_JoinFairyLeagueRedpoint { get; private set; }
+
         public void UpdateRedpoint()
         {
             m_JoinFairyLeagueRedpoint.state = RedPointState.None;
@@ -918,6 +924,114 @@
                 return;
             }
             m_JoinFairyLeagueRedpoint.state = RedPointState.Simple;
+        }
+        #endregion
+
+        #region 浠欑洘鑱旇禌棰勫憡
+        private void OnFuncStateChangeEvent(int func)
+        {
+            if (func == 142)
+            {
+                if (onStateUpate != null)
+                {
+                    onStateUpate((int)OpenServerActivityCenter.OSActivityType.FairyLeagueNotice);
+                }
+                UpdateNoticeRedpoint();
+            }
+        }
+
+        public event Action<int> onStateUpate;
+        public bool IsOpen
+        {
+            get
+            {
+                return FuncOpen.Instance.IsFuncOpen(142) && !IsAfterFirstLeague();
+            }
+        }
+        public bool IsAdvance
+        {
+            get { return false; }
+        }
+
+        public bool priorityOpen
+        {
+            get { return false; }
+        }
+
+        public int GetBeforeFirstLeagueTime()
+        {
+            var seconds = 0;
+            if (TimeUtility.OpenWeekCnt <= 1)
+            {
+                if (IsAfterFirstLeague())
+                {
+                    return 0;
+                }
+                var weekTime = currentWeekTime == null ? nextWeekTime : currentWeekTime;
+                var ring = weekTime.rings[0];
+                var session = ring.sessions[0];
+                var fightStage = session.stages.Find((x) =>
+                {
+                    return x.stage == FairyLeagueStage.Fight;
+                });
+                var time = TimeUtility.ServerNow.AddTicks((weekTime.rings[0].openServerDay - TimeUtility.OpenDay - 1) * TimeSpan.TicksPerDay);
+                time = new DateTime(time.Year, time.Month, time.Day, fightStage.startHour, fightStage.startMinute, 0);
+                seconds = (int)(time - TimeUtility.ServerNow).TotalSeconds;
+                seconds = Mathf.Max(seconds, 0);
+            }
+            return seconds;
+        }
+
+        public bool IsAfterFirstLeague()
+        {
+            if (TimeUtility.OpenWeekCnt <= 1)
+            {
+                var openServerWeekDay = TimeUtility.openServerDayOfWeek == DayOfWeek.Sunday ? 7 : (int)TimeUtility.openServerDayOfWeek;
+                if (specialLeagueTimes.ContainsKey(openServerWeekDay))
+                {
+                    var dict = specialLeagueTimes[openServerWeekDay];
+                    var weekCount = TimeUtility.OpenWeekCnt;
+                    if (dict.ContainsKey(0) && weekCount > 0)
+                    {
+                        return true;
+                    }
+                    if (currentWeekTime == null)
+                    {
+                        return false;
+                    }
+                    var weekTime = currentWeekTime == null ? nextWeekTime : currentWeekTime;
+                    if (weekTime.IsNextWeek)
+                    {
+                        return true;
+                    }
+                    if (weekTime.rings.Count > 1 && weekTime.currentRing == 1)
+                    {
+                        return true;
+                    }
+                    return weekTime.currentSession == 1 && weekTime.fairyLeagueStage == FairyLeagueStage.Over;
+                }
+            }
+            return true;
+        }
+
+        Redpoint fairyLeagueNoticeRedpoint = new Redpoint(MainRedDot.REDPOINT_OPENSERVER, 20912);
+        void UpdateNoticeRedpoint()
+        {
+            fairyLeagueNoticeRedpoint.state = RedPointState.None;
+            if (!DayRemind.Instance.GetDayRemind(DayRemind.LEAGUE_NOTICE_REDPOINT)
+                && IsOpen)
+            {
+                fairyLeagueNoticeRedpoint.state = RedPointState.Simple;
+            }
+        }
+
+        public void SetViewLeagueNotice()
+        {
+            if (fairyLeagueNoticeRedpoint.state == RedPointState.Simple)
+            {
+                DayRemind.Instance.SetDayRemind(DayRemind.LEAGUE_NOTICE_REDPOINT, true);
+                UpdateNoticeRedpoint();
+            }
         }
         #endregion
     }
@@ -1093,6 +1207,8 @@
 
             public int dayOfWeek { get; set; }
 
+            public int openServerDay { get; private set; }
+
             public void Sort()
             {
                 sessions.Sort((Session x, Session y) =>
@@ -1122,6 +1238,8 @@
 
             public void ParseConfig(DungeonSpecialStateTimeConfig config, int dayOfWeek)
             {
+                openServerDay = config.OpenServerDay;
+
                 var session = sessions.Find((x) =>
                 {
                     return x.session == (config.StateValue < 20 ? 0 : 1);
diff --git a/System/FairyAu/FairyLeagueNoticeWin.cs b/System/FairyAu/FairyLeagueNoticeWin.cs
new file mode 100644
index 0000000..65adf03
--- /dev/null
+++ b/System/FairyAu/FairyLeagueNoticeWin.cs
@@ -0,0 +1,111 @@
+锘�//--------------------------------------------------------
+//    [Author]:           绗簩涓栫晫
+//    [  Date ]:           Friday, September 21, 2018
+//--------------------------------------------------------
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using TableConfig;
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace Snxxz.UI {
+
+    public class FairyLeagueNoticeWin : Window
+    {
+        [SerializeField] RectTransform m_ContainerNoFairy;
+        [SerializeField] RectTransform m_ContainerHasFairy;
+        [SerializeField] Button m_JoinFairy;
+        [SerializeField] Button m_Goto;
+        [SerializeField] RawImage[] m_RawWeapons;
+        [SerializeField, Header("姝﹀櫒瑙掑害锛岃亴涓�1锛�2锛�3")] Vector3[] m_WeaponAngles;
+
+        FairyLeagueModel model { get { return ModelCenter.Instance.GetModel<FairyLeagueModel>(); } }
+        #region Built-in
+        protected override void BindController()
+        {
+        }
+
+        protected override void AddListeners()
+        {
+            m_JoinFairy.onClick.AddListener(JoinFairy);
+            m_Goto.onClick.AddListener(Goto);
+        }
+
+        protected override void OnPreOpen()
+        {
+            PlayerDatas.Instance.fairyData.OnRefreshFairyInfo += OnRefreshFairyInfo;
+            PlayerDatas.Instance.fairyData.OnRefreshFairyMine += OnRefreshFairyInfo;
+            model.SetViewLeagueNotice();
+            Display();
+            DisplayWeapons();
+        }
+
+        protected override void OnAfterOpen()
+        {
+
+        }
+
+        protected override void OnPreClose()
+        {
+            PlayerDatas.Instance.fairyData.OnRefreshFairyInfo -= OnRefreshFairyInfo;
+            PlayerDatas.Instance.fairyData.OnRefreshFairyMine -= OnRefreshFairyInfo;
+            UI3DModelExhibition.Instance.StopShow();
+        }
+
+        protected override void OnAfterClose()
+        {
+
+        }
+        #endregion
+
+        void Display()
+        {
+            m_ContainerNoFairy.gameObject.SetActive(!PlayerDatas.Instance.fairyData.HasFairy);
+            m_ContainerHasFairy.gameObject.SetActive(PlayerDatas.Instance.fairyData.HasFairy);
+        }
+
+        private void Goto()
+        {
+            WindowJumpMgr.Instance.WindowJumpTo(JumpUIType.UnionFunc4);
+        }
+        private void JoinFairy()
+        {
+            WindowJumpMgr.Instance.WindowJumpTo(JumpUIType.UnionFunc3);
+        }
+
+        private void OnRefreshFairyInfo()
+        {
+            Display();
+        }
+
+        void DisplayWeapons()
+        {
+            var job = PlayerDatas.Instance.baseData.Job;
+            var _rawImage = m_RawWeapons[0];
+            var _angle = m_WeaponAngles[0];
+            var _weaponId = model.leagueNoticeWeapons.ContainsKey(job) ? model.leagueNoticeWeapons[job] : 0;
+            if (_weaponId == 0)
+            {
+                return;
+            }
+            for (int i = 0; i < m_RawWeapons.Length; i++)
+            {
+                m_RawWeapons[i].gameObject.SetActive(job == (i + 1));
+                if ((i + 1) == job)
+                {
+                    _rawImage = m_RawWeapons[i];
+                    _angle = m_WeaponAngles[i];
+                }
+            }
+            var config = Config.Instance.Get<ItemConfig>(_weaponId);
+            UI3DModelExhibition.Instance.ShowEquipment(config.ChangeOrd, _angle, _rawImage);
+        }
+    }
+
+}
+
+
+
+
diff --git a/System/FairyAu/FairyLeagueNoticeWin.cs.meta b/System/FairyAu/FairyLeagueNoticeWin.cs.meta
new file mode 100644
index 0000000..c14fabf
--- /dev/null
+++ b/System/FairyAu/FairyLeagueNoticeWin.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: c1c8b96d40cac8741ab435102d9d4549
+timeCreated: 1537498840
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/System/FairyAu/KingTempleWin.cs b/System/FairyAu/KingTempleWin.cs
index 6a61cc1..85ee998 100644
--- a/System/FairyAu/KingTempleWin.cs
+++ b/System/FairyAu/KingTempleWin.cs
@@ -82,7 +82,7 @@
         protected override void OnPreClose()
         {
             model.UpdateKingFairyEvent -= UpdateKingFairyEvent;
-            UI3DModelExhibition.Instance.StopShowPlayer();
+            UI3DModelExhibition.Instance.StopShow();
         }
 
         protected override void OnAfterClose()
@@ -181,7 +181,18 @@
                     itemData = _leaderData.roleEquipDataDic[RoleEquipType.retWeapon2];
                     weapon2 = itemData.ItemID;
                 }
-                UI3DModelExhibition.Instance.BeginShowOtherPlayer(m_LeaderMob, _leaderData.rolePropData.Job,  clothes, _suitEffect, weapon, wing, weapon2);
+
+                var data = new UI3DModelExhibition.UI3DPlayerExhibitionData
+                {
+                    job = _leaderData.rolePropData.Job,
+                    clothesId = clothes,
+                    suitLevel = _suitEffect,
+                    weaponId = weapon,
+                    wingsId = wing,
+                    secondaryId = weapon2,
+                };
+
+                UI3DModelExhibition.Instance.ShowOtherPlayer(m_LeaderMob, data);
                 m_LeaderNameTxt.text = _leaderData.rolePropData.Name;
                 m_LeaderRealmImg.gameObject.SetActive(_leaderData.rolePropData.RealmLV > 0);
                 var _realmCfg = Config.Instance.Get<RealmConfig>(_leaderData.rolePropData.RealmLV);
diff --git a/System/FindPrecious/BossHomeWin.cs b/System/FindPrecious/BossHomeWin.cs
index eb36327..7fb3164 100644
--- a/System/FindPrecious/BossHomeWin.cs
+++ b/System/FindPrecious/BossHomeWin.cs
@@ -103,7 +103,7 @@
                         m_BossIntroduce.gameObject.SetActive(false);
                         m_ContainerMonster.gameObject.SetActive(true);
                         m_BossIntroduce.Dispose();
-                        UI3DModelExhibition.Instance.BeginShowNPC(model.selectedBoss, npcConfig.UIModeLOffset, npcConfig.UIModelRotation, m_MonsterPortrait);
+                        UI3DModelExhibition.Instance.ShowNPC(model.selectedBoss, npcConfig.UIModeLOffset, npcConfig.UIModelRotation, m_MonsterPortrait);
                         m_MonsterLevel.text = Language.Get("Z1024", npcConfig.NPCLV);
                         break;
                     case 2:
@@ -193,7 +193,7 @@
                     m_ContainerMonster.gameObject.SetActive(true);
                     m_BossIntroduce.Dispose();
                     var npcConfig = Config.Instance.Get<NPCConfig>(_bossId);
-                    UI3DModelExhibition.Instance.BeginShowNPC(_bossId, npcConfig.UIModeLOffset, npcConfig.UIModelRotation, m_MonsterPortrait);
+                    UI3DModelExhibition.Instance.ShowNPC(_bossId, npcConfig.UIModeLOffset, npcConfig.UIModelRotation, m_MonsterPortrait);
                     m_MonsterLevel.text = Language.Get("Z1024", npcConfig.NPCLV);
                     break;
                 case 2:
diff --git a/System/FindPrecious/BossIntroduceBehaviour.cs b/System/FindPrecious/BossIntroduceBehaviour.cs
index 08ac38f..e5c7577 100644
--- a/System/FindPrecious/BossIntroduceBehaviour.cs
+++ b/System/FindPrecious/BossIntroduceBehaviour.cs
@@ -51,7 +51,7 @@
 
         public void Dispose()
         {
-            UI3DModelExhibition.Instance.StopShowNPC();
+            UI3DModelExhibition.Instance.StopShow();
         }
 
         private void LateUpdate()
@@ -89,13 +89,13 @@
             var config = Config.Instance.Get<NPCConfig>(bossId);
             m_BossName.text = config.charName;
             m_BossLevel.text = Language.Get("Z1024", config.NPCLV);
-            UI3DModelExhibition.Instance.BeginShowNPC(bossId, config.UIModeLOffset, config.UIModelRotation, m_BossPortrait);
+            UI3DModelExhibition.Instance.ShowNPC(bossId, config.UIModeLOffset, config.UIModelRotation, m_BossPortrait);
             m_BossAbility.Display(bossId);
         }
 
         protected virtual void DrawReward()
         {
-            UI3DModelExhibition.Instance.StopShowNPC();
+            UI3DModelExhibition.Instance.StopShow();
             m_ViewType = ViewType.Reward;
             m_ContainerReward.gameObject.SetActive(true);
             m_ContainerBossInfo.gameObject.SetActive(false);
diff --git a/System/FriendSystem/MailAllModel.cs b/System/FriendSystem/MailAllModel.cs
index d38ac28..61414ad 100644
--- a/System/FriendSystem/MailAllModel.cs
+++ b/System/FriendSystem/MailAllModel.cs
@@ -89,6 +89,8 @@
     private Dictionary<string, MailInfo> mailModelDict = new Dictionary<string,MailInfo>();
     private List<MailInfo> timeOrderMailInfo = new List<MailInfo>();
     private Regex smatch = new Regex(@"<MailTemplate>([^>.\n]*)</MailTemplate>([^>.\n]*)", RegexOptions.Singleline);
+    private Regex smatchSystem = new Regex(@"[\\]*\/[\\]*", RegexOptions.Singleline);
+
     public string mailTitleStr = "";
     public string mailContentstr = "";
     public string mailSendPersonStr = "";
@@ -345,6 +347,7 @@
     public void GetReciveMailContent(MailInfo info)
     {
         Debug.Log(info.Text);
+        info.Text = smatchSystem.Replace(info.Text, "/");
         if (smatch.IsMatch(info.Text))
         {
             Match match = smatch.Match(info.Text);
@@ -422,7 +425,7 @@
            
                 if(mailContentArray.Length > 2)
                 {
-                    string mailDes = Regex.Replace(mailContentArray[2], @"<[\\]+/r>", "</r>");
+                    string mailDes = mailContentArray[2];
                     mailContentstr = mailDes;
                 }
             }
@@ -472,8 +475,10 @@
     }
 
     StringBuilder todayDailySB = new StringBuilder();
+    List<int> dailyIdlist = new List<int>();
     public string GetTodayDailyNotify(DateTime getTime)
     {
+        dailyIdlist.Clear();
         todayDailySB.Length = 0;
         var dayOfWeek = (int)getTime.DayOfWeek;
         var quests = dailyModel.GetQuestByWeekTime(dayOfWeek % 7);
@@ -484,6 +489,11 @@
             int openTime = openTimelist[i];
             for (int j = 0;j < quests[openTime].Count; j++)
             {
+                if(dailyIdlist.Contains(quests[openTime][j]))
+                {
+                    continue;
+                }
+                dailyIdlist.Add(quests[openTime][j]);
                 DailyQuestOpenTime dailyQuestOpenTime;
                 dailyModel.TryGetOpenTime(quests[openTime][j], out dailyQuestOpenTime);
                 if (dailyQuestOpenTime.IsValidServerOpenTime())
diff --git a/System/HappyXB/HappyXBModel.cs b/System/HappyXB/HappyXBModel.cs
index c518dbb..1be026a 100644
--- a/System/HappyXB/HappyXBModel.cs
+++ b/System/HappyXB/HappyXBModel.cs
@@ -611,39 +611,47 @@
                 int needToolCnt = 0;
                 if (IsHaveManyXBTool(xbType, out toolCnt, out needToolCnt))
                 {
-                    needToolCnt = needToolCnt - toolCnt;
-                    int needMoney = needToolCnt * funcSet.xbPrices[0];
-                    if (needMoney > 0)
+                    if(toolCnt >= needToolCnt)
                     {
-                        ItemConfig itemConfig = Config.Instance.Get<ItemConfig>(funcSet.costToolIds[1]);
-                        ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"), Language.Get("HappyXBCostTools", funcSet.costToolNums[1], itemConfig.ItemName, needMoney, needToolCnt), (bool isOk) =>
-                        {
-                            if (isOk)
-                            {
-                                CheckXBManyLimit(needMoney, xbType);
-                            }
-                            return;
-                        });
+                        CheckXBManyLimit(0, xbType, 2);
                     }
                     else
                     {
-                        CheckXBManyLimit(0, xbType);
+                        CheckXBManyLimit(funcSet.xbPrices[1], xbType,0);
                     }
+                    //needToolCnt = needToolCnt - toolCnt;
+                    //int needMoney = needToolCnt * funcSet.xbPrices[0];
+                    //if (needMoney > 0)
+                    //{
+                    //    ItemConfig itemConfig = Config.Instance.Get<ItemConfig>(funcSet.costToolIds[1]);
+                    //    ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"), Language.Get("HappyXBCostTools", funcSet.costToolNums[1], itemConfig.ItemName, needMoney, needToolCnt), (bool isOk) =>
+                    //    {
+                    //        if (isOk)
+                    //        {
+                    //            CheckXBManyLimit(needMoney, xbType,0);
+                    //        }
+                    //        return;
+                    //    });
+                    //}
+                    //else
+                    //{
+                    //    CheckXBManyLimit(0, xbType,2);
+                    //}
 
                 }
                 else
                 {
-                    CheckXBManyLimit(funcSet.xbPrices[1],xbType);
+                    CheckXBManyLimit(funcSet.xbPrices[1],xbType,0);
                 }
 
             }
         }
 
-        public void CheckXBManyLimit(int needMoney,int xbtype)
+        public void CheckXBManyLimit(int needMoney,int xbtype,int costType)
         {
             if (UIHelper.GetMoneyCnt(1) >= (ulong)needMoney)
             {
-                SendXBQuest(xbtype, 1, 2);
+                SendXBQuest(xbtype, 1, costType);
             }
             else
             {
diff --git a/System/HttpRequest/HttpRequest.cs b/System/HttpRequest/HttpRequest.cs
index 328ce41..3998e4a 100644
--- a/System/HttpRequest/HttpRequest.cs
+++ b/System/HttpRequest/HttpRequest.cs
@@ -11,73 +11,6 @@
     public const string defaultHttpContentType = "application/x-www-form-urlencoded";
     public const string jsonHttpContentType = "application/json ; charset=utf-8";
 
-    public void RequestWWW(string _url, int _retry = 3, Action<bool, string> _result = null)
-    {
-        StartCoroutine(Co_RequestWWW(_url, null, _retry, _result));
-    }
-
-    public void RequestWWW(string _url, IDictionary<string, string> _parameters, int _retry = 3, Action<bool, string> _result = null)
-    {
-        StartCoroutine(Co_RequestWWW(_url, _parameters, _retry, _result));
-    }
-
-    IEnumerator Co_RequestWWW(string _url, IDictionary<string, string> _parameters, int _retry = 3, Action<bool, string> _result = null)
-    {
-        if (_url == null || _url.Length == 0)
-        {
-            DebugEx.LogError("PHPDataComm post 鍙傛暟鏈夐敊");
-            if (_result != null)
-            {
-                _result(false, string.Empty);
-                _result = null;
-            }
-            yield break;
-        }
-
-        int i = 0;
-        bool isSuccess = false;
-
-        byte[] data = null;
-        if (_parameters != null)
-        {
-            data = Encoding.UTF8.GetBytes(HashtablaToString(_parameters));
-        }
-
-        var PostData = data == null ? new WWW(_url) : new WWW(_url, data);
-
-        while (!PostData.isDone)
-        {
-            yield return null;
-        }
-
-        if (PostData.error != null)
-        {
-            Debug.LogErrorFormat("WWW 鏁版嵁閫氫俊,璇锋眰鏁版嵁澶辫触锛歿0},宸茬粡灏濊瘯,{1},娆�", PostData.error, i);
-        }
-        else
-        {
-            if (!string.IsNullOrEmpty(PostData.text))
-            {
-                DebugEx.LogFormat("WWW 鏁版嵁閫氫俊,璇锋眰鏁版嵁鎴愬姛锛歿0}", PostData.text);
-                isSuccess = true;
-                if (_result != null)
-                {
-                    _result(true, PostData.text);
-                    _result = null;
-                }
-            }
-        }
-
-        if (!isSuccess)
-        {
-            if (_result != null)
-            {
-                _result(false, string.Empty);
-                _result = null;
-            }
-        }
-    }
-
     public void RequestHttpPost(string _url, IDictionary<string, string> _parameters, string _contentType, int _retry = 3, Action<bool, string> _result = null)
     {
         var content = HashtablaToString(_parameters);
diff --git a/System/KnapSack/Logic/ItemTipsModel.cs b/System/KnapSack/Logic/ItemTipsModel.cs
index 16117ef..ea499fc 100644
--- a/System/KnapSack/Logic/ItemTipsModel.cs
+++ b/System/KnapSack/Logic/ItemTipsModel.cs
@@ -742,9 +742,13 @@
                dogzModel.CheckPutOff(dogzModel.GetDogzEquipPlaceByIndex(attrData.index));
             });
 
-            attrData.SetTipsFuncBtn(ItemWinBtnType.strength, (ItemWinBtnType, ItemAttrData) => {
-                dogzModel.OpenDogzFuncEvent(1);
-            });
+            if(dogzModel.TryGetAssistDogzState(dogzModel.presentSelectDogz))
+            {
+                attrData.SetTipsFuncBtn(ItemWinBtnType.strength, (ItemWinBtnType, ItemAttrData) => {
+                    dogzModel.OpenDogzFuncEvent(1, attrData.index);
+                });
+            }
+          
         }
 
         /// <summary>
diff --git a/System/KnapSack/Logic/ModelShowPerfab.cs b/System/KnapSack/Logic/ModelShowPerfab.cs
index 7abaeb2..b0b93b9 100644
--- a/System/KnapSack/Logic/ModelShowPerfab.cs
+++ b/System/KnapSack/Logic/ModelShowPerfab.cs
@@ -37,11 +37,11 @@
                     UI3DTreasureExhibition.Instance.BeginShowTreasure(id, modelImg);
                     break;
                 case ModelShowType.mount:
-                    UI3DModelExhibition.Instance.BeginShowHourse(id, modelImg);
+                    UI3DModelExhibition.Instance.ShowHourse(id, modelImg);
                     break;
                 case ModelShowType.pet:
                     var config = Config.Instance.Get<NPCConfig>(id);
-                    UI3DModelExhibition.Instance.BeginShowNPC(id, config.UIModeLOffset, config.UIModelRotation, modelImg);
+                    UI3DModelExhibition.Instance.ShowNPC(id, config.UIModeLOffset, config.UIModelRotation, modelImg);
                     break;
             }
 
diff --git a/System/KnapSack/New/BagWin.cs b/System/KnapSack/New/BagWin.cs
index 68b140d..e9bb17a 100644
--- a/System/KnapSack/New/BagWin.cs
+++ b/System/KnapSack/New/BagWin.cs
@@ -94,7 +94,7 @@
         }
 
         protected override void OnAfterClose() {
-            UI3DModelExhibition.Instance.StopShowPlayer();
+            UI3DModelExhibition.Instance.StopShow();
         }
         #endregion
 
diff --git a/System/KnapSack/New/RoleEquipWin.cs b/System/KnapSack/New/RoleEquipWin.cs
index 42942ac..d25b025 100644
--- a/System/KnapSack/New/RoleEquipWin.cs
+++ b/System/KnapSack/New/RoleEquipWin.cs
@@ -120,7 +120,7 @@
 
         protected override void OnPreOpen()
         {
-            UI3DModelExhibition.Instance.BeginShowPlayer(RoleShowBG, PlayerDatas.Instance.baseData.Job);
+            UI3DModelExhibition.Instance.ShowPlayer(RoleShowBG, PlayerDatas.Instance.baseData.Job);
             playerPack.RefreshAttrActiveAct += ControlEffect;
             playerPack.ItemCntAddAct += PutOnEquip;
             playerPack.ItemCntReduceAct += PutOffEquip;
@@ -157,7 +157,7 @@
         {
             if (typeof(PetMatInfoWin).Name != window.name && typeof(ItemInfoWin).Name != window.name) return;
 
-            UI3DModelExhibition.Instance.BeginShowPlayer(RoleShowBG, PlayerDatas.Instance.baseData.Job);
+            UI3DModelExhibition.Instance.ShowPlayer(RoleShowBG, PlayerDatas.Instance.baseData.Job);
         }
 
         protected override void OnAfterOpen()
@@ -256,7 +256,7 @@
             {
                 _roleEquipDict.Add(itemModel.itemInfo.ItemPlace,itemModel);
             }
-            UI3DModelExhibition.Instance.BeginShowPlayer(RoleShowBG, PlayerDatas.Instance.baseData.Job);
+            UI3DModelExhibition.Instance.ShowPlayer(RoleShowBG, PlayerDatas.Instance.baseData.Job);
 
         }
 
@@ -266,7 +266,7 @@
 
             ClearEquipInfo(place);
             equipArealist[(RoleEquipType)place].transform.Find("ItemCell").gameObject.SetActive(false);
-            UI3DModelExhibition.Instance.BeginShowPlayer(RoleShowBG, PlayerDatas.Instance.baseData.Job);
+            UI3DModelExhibition.Instance.ShowPlayer(RoleShowBG, PlayerDatas.Instance.baseData.Job);
         }
 
         private void OnClickEquipIntensify(GameObject go)
diff --git a/System/Login/LoginModel.cs b/System/Login/LoginModel.cs
index 0f6b94b..427405a 100644
--- a/System/Login/LoginModel.cs
+++ b/System/Login/LoginModel.cs
@@ -286,6 +286,8 @@
                     else if (SDKUtility.Instance.ChannelPlatform == SDKUtility.E_ChannelPlatform.Sp)
                     {
                         send.IDType = 3;
+                        send.ExtraLen = (byte)SDKUtility.Instance.FreePlatformInfo.sessionID.Length;
+                        send.Extra = SDKUtility.Instance.FreePlatformInfo.sessionID;
                     }
                     send.AccID = sdkLoginResult.account;
                     send.Password = sdkLoginResult.token;
@@ -295,6 +297,10 @@
                     send.AppID = VersionConfig.Get().appId;
                     send.AccountID = (uint)sdkLoginResult.accountID;// 鍐呴儴鐧婚檰鐨勬椂鍊欑殑id
                     send.TokenExpire = sdkLoginResult.tokenExpire;// 鍐呴儴鐧婚檰鐨勬椂闀�,鏃犳墍璋撶殑
+                    if (SDKUtility.Instance.ChannelPlatform == SDKUtility.E_ChannelPlatform.Sp)
+                    {
+                        send.TokenExpire = SDKUtility.Instance.FreePlatformInfo.timeStamp;
+                    }
                     send.Phone = (byte)sdkLoginResult.phone;
                     send.ServerID = (uint)ServerListCenter.Instance.currentServer.region_flag;
                     if (sdkIDCheckIDAuthentication.type == "1")
diff --git a/System/MainInterfacePanel/DialogueDuidanceWin.cs b/System/MainInterfacePanel/DialogueDuidanceWin.cs
index 3126124..88eefee 100644
--- a/System/MainInterfacePanel/DialogueDuidanceWin.cs
+++ b/System/MainInterfacePanel/DialogueDuidanceWin.cs
@@ -253,7 +253,7 @@
 
                 int playerJob = PlayerDatas.Instance.baseData.Job;
 
-                UI3DModelExhibition.Instance.BeginShowPlayer(m_playerIcon, playerJob, true);
+                UI3DModelExhibition.Instance.ShowPlayer(m_playerIcon, playerJob, true);
 
                 m_PlayerNameText.text = PlayerDatas.Instance.baseData.PlayerName;
 
@@ -297,7 +297,7 @@
 
                 string npcIcon = configStoryMissions.NpcIcon[IsMultistage];
 
-                UI3DModelExhibition.Instance.BeginShowNPC(npcId, npcConfig.UIModeLOffset, npcConfig.UIModelRotation, m_NPCIcon, false, true);
+                UI3DModelExhibition.Instance.ShowNPC(npcId, npcConfig.UIModeLOffset, npcConfig.UIModelRotation, m_NPCIcon, false, true);
             }
             typesPeaker = type;
         }
diff --git a/System/MainInterfacePanel/FeatureNoticeWin.cs b/System/MainInterfacePanel/FeatureNoticeWin.cs
index a573ec1..c504631 100644
--- a/System/MainInterfacePanel/FeatureNoticeWin.cs
+++ b/System/MainInterfacePanel/FeatureNoticeWin.cs
@@ -19,7 +19,7 @@
         Pet = 6,//鐏靛疇
         Horse = 8,//鍧愰獞
         Wing = 97,//缈呰唨
-        GossipFurnace = 87,//鍏崷鐐�
+        GossipFurnace = 143,//鍏崷鐐�
     }
 
     public class FeatureNoticeWin : Window
@@ -97,9 +97,9 @@
         }
         protected override void OnPreClose()
         {
-            UI3DModelExhibition.Instance.StopShowNPC();
-            UI3DModelExhibition.Instance.StopShowHourse();
-            UI3DModelExhibition.Instance.StopShowWing();
+            UI3DModelExhibition.Instance.StopShow();
+            UI3DModelExhibition.Instance.StopShow();
+            UI3DModelExhibition.Instance.StopShow();
             UI3DTreasureExhibition.Instance.StopShow();
         }
         protected override void OnAfterClose()
@@ -256,6 +256,7 @@
                 m_TextShowB.gameObject.SetActive(false);
                 m_TextShowC.gameObject.SetActive(false);
                 m_TextShowD.gameObject.SetActive(false);
+                m_TextAdvanceName.text = "?";
             }
             else
             {
@@ -263,8 +264,9 @@
                 m_TextShowB.gameObject.SetActive(true);
                 m_TextShowC.gameObject.SetActive(true);
                 m_TextShowD.gameObject.SetActive(true);
+                m_TextAdvanceName.text = functionForecastConfig.FuncName;
             }
-            m_TextAdvanceName.text = functionForecastConfig.FuncName;
+            
             DisplayIcon(ClickFuncID);
             string[] StrList = ConfigParse.GetMultipleStr(functionForecastConfig.Content);
             if (StrList.Length > 0)
@@ -294,9 +296,9 @@
             m_RawImage3.gameObject.SetActive(false);
             m_RawImage4.gameObject.SetActive(false);
             m_FeaturesImage.gameObject.SetActive(false);
-            UI3DModelExhibition.Instance.StopShowNPC();
-            UI3DModelExhibition.Instance.StopShowHourse();
-            UI3DModelExhibition.Instance.StopShowWing();
+            UI3DModelExhibition.Instance.StopShow();
+            UI3DModelExhibition.Instance.StopShow();
+            UI3DModelExhibition.Instance.StopShow();
             UI3DTreasureExhibition.Instance.StopShow();
             var functionForecastConfig = Config.Instance.Get<FunctionForecastConfig>(ClickFuncID);
             bool Type = false;
@@ -319,12 +321,12 @@
                 case (int)FeatureNoticeEnum.Pet:
                     m_RawImage1.gameObject.SetActive(true);
                     var npcConfig = Config.Instance.Get<NPCConfig>(50106001);
-                    UI3DModelExhibition.Instance.BeginShowNPC(50106001, npcConfig.UIModeLOffset, npcConfig.UIModelRotation, m_RawImage1);
+                    UI3DModelExhibition.Instance.ShowNPC(50106001, npcConfig.UIModeLOffset, npcConfig.UIModelRotation, m_RawImage1);
                     break;
                 case (int)FeatureNoticeEnum.Horse:
                     m_RawImage2.gameObject.SetActive(true);
                     HorseConfig _model = Config.Instance.Get<HorseConfig>(100);
-                    UI3DModelExhibition.Instance.BeginShowHourse(_model.Model, m_RawImage2);
+                    UI3DModelExhibition.Instance.ShowHourse(_model.Model, m_RawImage2);
                     break;
                 case (int)FeatureNoticeEnum.Wing:
                     m_RawImage3.gameObject.SetActive(true);
@@ -334,13 +336,13 @@
                     {
                         var config = Config.Instance.Get<WingRefineExpConfig>(3711);
                         int _modelID = config.Model;
-                        UI3DModelExhibition.Instance.BeginShowWing(_modelID, vec3, m_RawImage3);
+                        UI3DModelExhibition.Instance.ShowWing(_modelID, vec3, m_RawImage3);
                     }
                     else if (job == 2)
                     {
                         var config = Config.Instance.Get<WingRefineExpConfig>(3721);
                         int _modelID = config.Model;
-                        UI3DModelExhibition.Instance.BeginShowWing(_modelID, vec3, m_RawImage3);
+                        UI3DModelExhibition.Instance.ShowWing(_modelID, vec3, m_RawImage3);
                     }
                     break;
                 case (int)FeatureNoticeEnum.GossipFurnace:
@@ -383,7 +385,7 @@
                     }
                 }
                 m_TextUnopened.gameObject.SetActive(true);
-                m_TextUnopened.text = string.Format(Language.Get("NextYGLimit"), NeedLv, functionForecastConfig.FuncName);
+                m_TextUnopened.text = string.Format(Language.Get("NextYGLimit"), NeedLv);
                 return;
             }
             if (funcoPenConfig.LimitMagicWeapon != 0 || funcoPenConfig.LimitMissionID != 0)
diff --git a/System/MainInterfacePanel/FeaturesType1.cs b/System/MainInterfacePanel/FeaturesType1.cs
index 7fac5a6..402c241 100644
--- a/System/MainInterfacePanel/FeaturesType1.cs
+++ b/System/MainInterfacePanel/FeaturesType1.cs
@@ -38,7 +38,7 @@
             {
                 return;
             }
-            m_FunctionName.text = functionForecastConfig.FuncName;
+           
             m_FunctionalLevel.text = functionForecastConfig.DisplayLevel.ToString()+ Language.Get("Z1041");
 
             bool Type = false;
@@ -51,10 +51,12 @@
             }
             if (!FuncOpen.Instance.IsFuncOpen(funcId) && Type && NeedLv > playerLv)
             {
+                m_FunctionName.text = "?";
                 m_FeaturesTypeIcon.SetSprite("UnKnowIcon");
             }
             else
             {
+                m_FunctionName.text = functionForecastConfig.FuncName;
                 m_FeaturesTypeIcon.SetSprite(functionForecastConfig.FuncIconKey);
             }
            
diff --git a/System/MainInterfacePanel/FeaturesType2.cs b/System/MainInterfacePanel/FeaturesType2.cs
index c0be9a7..6b7c0a1 100644
--- a/System/MainInterfacePanel/FeaturesType2.cs
+++ b/System/MainInterfacePanel/FeaturesType2.cs
@@ -37,7 +37,7 @@
             {
                 return;
             }
-            m_FunctionName.text = functionForecastConfig.FuncName;
+           
             m_FunctionalLevel.text = functionForecastConfig.DisplayLevel.ToString()+Language.Get("Z1041");
             bool  Type = false;
             int NeedLv = 0;
@@ -50,9 +50,11 @@
             if (!FuncOpen.Instance.IsFuncOpen(funcId) && Type && NeedLv> playerLv)
             {
                 m_FeaturesTypeIcon.SetSprite("UnKnowIcon");
+                m_FunctionName.text = "?";
             }
             else
             {
+                m_FunctionName.text = functionForecastConfig.FuncName;
                 m_FeaturesTypeIcon.SetSprite(functionForecastConfig.FuncIconKey);
             }
             if (PlayerDatas.Instance.baseData.LV >= functionForecastConfig.DisplayLevel)
diff --git a/System/MainInterfacePanel/HighSettingFadeInFadeOut.cs b/System/MainInterfacePanel/HighSettingFadeInFadeOut.cs
index 3acb6fe..5367881 100644
--- a/System/MainInterfacePanel/HighSettingFadeInFadeOut.cs
+++ b/System/MainInterfacePanel/HighSettingFadeInFadeOut.cs
@@ -498,7 +498,7 @@
                         }
                         if (!AnimationFadeOutDicLow.ContainsKey(highBtnRecord.Index))
                         {
-                            if (isPlayerUIeffect.RedPointId == 201 || isPlayerUIeffect.RedPointId == 210)
+                            if (isPlayerUIeffect.RedPointId == 201 /*|| isPlayerUIeffect.RedPointId == 210*/)//201(绂忓埄)锛�210锛堜粰瀹濆涓伙級
                             {
                                 if (RedpointCenter.Instance.GetRedpointState(isPlayerUIeffect.RedPointId) == RedPointState.GetReward)
                                 {
diff --git a/System/MainInterfacePanel/MainInterfaceWin.cs b/System/MainInterfacePanel/MainInterfaceWin.cs
index f374c3d..1d4ba02 100644
--- a/System/MainInterfacePanel/MainInterfaceWin.cs
+++ b/System/MainInterfacePanel/MainInterfaceWin.cs
@@ -716,7 +716,7 @@
         void DownButton(GameObject go)
         {
             _ExpRate.gameObject.SetActive(true);
-
+          //  WindowCenter.Instance.Open<WheelOfFortuneWin>();
         }
         void UpButton(GameObject go)
         {
diff --git a/System/MainInterfacePanel/PlayerTaskDatas.cs b/System/MainInterfacePanel/PlayerTaskDatas.cs
index bd9f0ab..579e58a 100644
--- a/System/MainInterfacePanel/PlayerTaskDatas.cs
+++ b/System/MainInterfacePanel/PlayerTaskDatas.cs
@@ -229,6 +229,7 @@
 
             if (allMissionDict.ContainsKey(MissionID))
             {
+                int missionState = allMissionDict[MissionID].MissionState;
                 if (allMissionDict[MissionID].MissionState != MissionState && MissionState == 3 && AutomaticityBool)
                 {
                     if (CompletionOfTaskEvent != null)
@@ -238,10 +239,21 @@
                 }
                 TaskChanges(MissionID, MissionState, DiscriptionIndex);//浠诲姟鐨勭姸鎬佷慨鏀�
 
-                if (Event_TaskRefreshes != null)//鍒锋柊浠诲姟
+                if (missionState == 0 && (MissionState == 1 || MissionState==2))
                 {
-                    Event_TaskRefreshes(MissionID);
+                    if (Event_TaskToAdd != null)//浠诲姟娣诲姞锛堢敤浜庡瓨鍌ㄤ簬韬笂鐨勬湭鎺ュ彇浠诲姟鐨勭壒娈婂鐞嗭級
+                    {
+                        Event_TaskToAdd(MissionID, MissionState, DiscriptionIndex);
+                    }
                 }
+                else
+                {
+                    if (Event_TaskRefreshes != null)//鍒锋柊浠诲姟
+                    {
+                        Event_TaskRefreshes(MissionID);
+                    }
+                }
+                
             }
             else
             {
diff --git a/System/MainInterfacePanel/SkillTaskWin.cs b/System/MainInterfacePanel/SkillTaskWin.cs
index f477aec..33be1b8 100644
--- a/System/MainInterfacePanel/SkillTaskWin.cs
+++ b/System/MainInterfacePanel/SkillTaskWin.cs
@@ -22,6 +22,7 @@
         [SerializeField] Button m_OpenNowBtn;
         [SerializeField] Button m_GoToBtn;
         [SerializeField] Button m_ClaoseBtn;
+        [SerializeField] Image m_Image;//瀛旀暟
         PlayerMainDate m_MainModel;
         PlayerMainDate mainModel { get { return m_MainModel ?? (m_MainModel = ModelCenter.Instance.GetModel<PlayerMainDate>()); } }
         PlayerTaskDatas m_TaskModel;
@@ -51,11 +52,20 @@
             if (taskinfo != null)
             {
                 m_Text_Condition_1.text = taskinfo.show_writing;
+                if (taskmodel._DicTaskInformation.ContainsKey(mainModel.TaskSkillID))
+                {
+                    Dictionary<string, string> SkillDic = new Dictionary<string, string>();
+                    SkillDic = taskmodel._DicTaskInformation[mainModel.TaskSkillID];
+                    string strA = "on_kill_" + mainModel.TaskSkillID.ToString();
+                    string strB = "get_byid_" + mainModel.TaskSkillID.ToString();
+                    m_Text_Condition_1.SetReplaceInfo(SkillDic);
+                }
             }
             if (mainModel.TaskId_Skill.Contains(mainModel.TaskSkillID))
             {
                 int Index = mainModel.TaskId_Skill.IndexOf(mainModel.TaskSkillID);
                 m_Text_Reward_1.text = string.Format(Language.Get("PassiveSkillTask1"), (mainModel.SkillIndex[Index] + 1));
+                SetImageSprite(mainModel.SkillIndex[Index] + 1);
                 m_NeedMoney_Text.text = string.Format(Language.Get("PassiveSkillTask2"), mainModel.NeedFairyJade[Index]);
             }
         }
@@ -97,7 +107,7 @@
                         if (Gold >= NeedMoney)
                         {
                             taskmodel.CompletionOfTask(mainModel.TaskSkillID);
-                            WindowJumpMgr.Instance.WindowJumpTo(JumpUIType.SkillFunc2);
+                            WindowJumpMgr.Instance.WindowJumpTo(JumpUIType.SkillFunc2Type2);
                         }
                         else
                         {
@@ -118,6 +128,32 @@
             m_Text_Condition_1.ExcuteHref();
 
             // Close();
+        }
+
+        private void SetImageSprite(int Index)
+        {
+            switch (Index)
+            {
+                case 1:
+                    m_Image.SetSprite("Slot_1");
+                    break;
+                case 2:
+                    m_Image.SetSprite("Slot_2");
+                    break;
+                case 3:
+                    m_Image.SetSprite("Slot_3");
+                    break;
+                case 4:
+                    m_Image.SetSprite("Slot_4");
+                    break;
+                case 5:
+                    m_Image.SetSprite("Slot_5");
+                    break;
+                case 6:
+                    m_Image.SetSprite("Slot_6");
+                    break;
+
+            }
         }
         #endregion
 
diff --git a/System/MainInterfacePanel/TaskAllocation.cs b/System/MainInterfacePanel/TaskAllocation.cs
index 87b4f0b..24c4dca 100644
--- a/System/MainInterfacePanel/TaskAllocation.cs
+++ b/System/MainInterfacePanel/TaskAllocation.cs
@@ -137,7 +137,7 @@
                             {
                                 return;
                             }
-                            WindowJumpMgr.Instance.WindowJumpTo(JumpUIType.SkillFunc2);
+                            WindowJumpMgr.Instance.WindowJumpTo(JumpUIType.SkillFunc2Type2);
                         }
                         else
                         {
diff --git a/System/MainInterfacePanel/TipPanel.cs b/System/MainInterfacePanel/TipPanel.cs
index 9684d0c..c50def1 100644
--- a/System/MainInterfacePanel/TipPanel.cs
+++ b/System/MainInterfacePanel/TipPanel.cs
@@ -91,7 +91,8 @@
             {
                 firstTimeRechargeModel.OpenFirstChargeTrialWin();
             }
-            else if(!WindowCenter.Instance.CheckOpen<PetAndMountPushWin>()) //鐏靛疇鍧愰獞鎺ㄩ��
+            else if(!WindowCenter.Instance.CheckOpen<PetAndMountPushWin>()
+                && !WindowCenter.Instance.CheckOpen<OffLineOnHookWin>()) //鐏靛疇鍧愰獞鎺ㄩ��
             {
                 storeModel.SetPushPetAndMountWinState();
             }
diff --git a/System/Market/PutawayWin.cs b/System/Market/PutawayWin.cs
index deb941d..49781a5 100644
--- a/System/Market/PutawayWin.cs
+++ b/System/Market/PutawayWin.cs
@@ -514,6 +514,7 @@
             if (PutawayData.Instance.itemModel == null) return;
             if (PlayerDatas.Instance.market.putawayCnt >= model.totalPutawayCnt)
             {
+                SysNotifyMgr.Instance.ShowTip("MarketNoPutaway4", model.totalPutawayCnt);
                 return;
             }
             if (PutawayData.Instance.priceCnt == 0)
diff --git a/System/Message/WordAnalysis.cs b/System/Message/WordAnalysis.cs
index 941899a..254983a 100644
--- a/System/Message/WordAnalysis.cs
+++ b/System/Message/WordAnalysis.cs
@@ -10,8 +10,8 @@
     public static Regex Color_Start_Regex = new Regex(@"<color=#[0-9a-zA-Z]+>", RegexOptions.Singleline);
     public static Regex Color_End_Regex = new Regex(@"</color>", RegexOptions.Singleline);
     public static Regex Space_Regex = new Regex(@"<Space=([0-9]*)>", RegexOptions.Singleline);
-    public static Regex Size_Start_Regex = new Regex(@"<Size=([0-9]+)>", RegexOptions.Singleline);
-    public static Regex Size_End_Regex = new Regex(@"</Size>", RegexOptions.Singleline);
+    public static Regex Size_Start_Regex = new Regex(@"<[Ss]ize=([0-9]+)>", RegexOptions.Singleline);
+    public static Regex Size_End_Regex = new Regex(@"</[Ss]ize>", RegexOptions.Singleline);
 
     private static RichTextEventEnum eventType = RichTextEventEnum.TABLE;
 
diff --git a/System/Mount/MountPanelAssignment.cs b/System/Mount/MountPanelAssignment.cs
index 8ed5334..b1f2c02 100644
--- a/System/Mount/MountPanelAssignment.cs
+++ b/System/Mount/MountPanelAssignment.cs
@@ -195,7 +195,7 @@
             if (HorseID != mount_ID)
             {
                 HorseConfig _model = Config.Instance.Get<HorseConfig>(HorseID);
-                UI3DModelExhibition.Instance.BeginShowHourse(_model.Model, m_MountRawImg);
+                UI3DModelExhibition.Instance.ShowHourse(_model.Model, m_MountRawImg);
                 mount_ID = HorseID;
                 if (UI3DModelExhibition.Instance.NpcModelHorse != null)
                 {
diff --git a/System/Mount/MountWin.cs b/System/Mount/MountWin.cs
index 160e5ba..7e18b2d 100644
--- a/System/Mount/MountWin.cs
+++ b/System/Mount/MountWin.cs
@@ -111,7 +111,7 @@
             RidingAndPetActivationWin.FairyJadeDEvent -= FairyJadeDEvent;
             FlySkillIconWin.FairyJadeDEvent -= FairyJadeDEvent;
             OnClickStopDomesticateBtn();
-            UI3DModelExhibition.Instance.StopShowHourse();
+            UI3DModelExhibition.Instance.StopShow();
         }
 
         protected override void LateUpdate()
diff --git a/System/OpenServerActivity/FlashSaleCoolDown.cs b/System/OpenServerActivity/FlashSaleCoolDown.cs
index 95bd19c..6f81624 100644
--- a/System/OpenServerActivity/FlashSaleCoolDown.cs
+++ b/System/OpenServerActivity/FlashSaleCoolDown.cs
@@ -78,6 +78,7 @@
         {
             GlobalTimeEvent.Instance.secondEvent -= SecondEvent;
             OperationTimeHepler.Instance.dayResetEvent -= DayResetEvent;
+            m_Time.gameObject.SetActive(false);
         }
 
         void DisplayTime(int seconds)
diff --git a/System/OpenServerActivity/ImpactRankModel.cs b/System/OpenServerActivity/ImpactRankModel.cs
index a3efdac..670d42e 100644
--- a/System/OpenServerActivity/ImpactRankModel.cs
+++ b/System/OpenServerActivity/ImpactRankModel.cs
@@ -781,7 +781,9 @@
             [Header("浠欑帀鎶曡祫")]
             FairyInvest,
             [Header("VIP鎶曡祫")]
-            VipInvest
+            VipInvest,
+            [Header("浠欑洘鑱旇禌棰勫憡")]
+            FairyLeagueNotice,
         }
     }
 
diff --git a/System/OpenServerActivity/OpenServerActivityWin.cs b/System/OpenServerActivity/OpenServerActivityWin.cs
index ee7fa88..31d45e1 100644
--- a/System/OpenServerActivity/OpenServerActivityWin.cs
+++ b/System/OpenServerActivity/OpenServerActivityWin.cs
@@ -29,6 +29,7 @@
                 return m_OSRedEnvelopeModel ?? (m_OSRedEnvelopeModel = ModelCenter.Instance.GetModel<OSRedEnvelopeModel>());
             }
         }
+        FairyLeagueModel fairyLeagueModel { get { return ModelCenter.Instance.GetModel<FairyLeagueModel>(); } }
 
         List<int> openActivitys = new List<int>();
         List<int> priorityActivitys = new List<int>();
@@ -64,6 +65,7 @@
             impactRankModel.presentSelectType = impactDefaultType;
             impactRankModel.gotoImpactRankType = 0;
             envelopeModel.selectType = 1;
+            GlobalTimeEvent.Instance.secondEvent += SecondEvent;
             CheckAlreadyOpen();
             UpdateFunctionBtns();
         }
@@ -121,6 +123,7 @@
             TimeUtility.OnServerOpenDayRefresh -= OnStepServerDayEvent;
             OperationTimeHepler.Instance.operationTimeUpdateEvent -= OperationTimeUpdateEvent;
             OpenServerActivityCenter.Instance.openServerActivityStateChange -= OpenServerActivityStateChange;
+            GlobalTimeEvent.Instance.secondEvent -= SecondEvent;
             CloseOtherWin();
             impactRankModel.gotoImpactRankType = 0;
         }
@@ -165,6 +168,24 @@
             {
                 openActivitys.Sort(Compare);
                 return openActivitys[0];
+            }
+        }
+
+        private void SecondEvent()
+        {
+            var cell = m_ActivityCtrl.GetActiveCellView((int)OpenServerActivityCenter.OSActivityType.FairyLeagueNotice);
+            if (cell != null)
+            {
+                var activityCell = cell as OpenServerActivityCell;
+                var seconds = fairyLeagueModel.GetBeforeFirstLeagueTime();
+                if (seconds > 0)
+                {
+                    activityCell.title.text = UIHelper.ReplaceNewLine(Language.Get("FairyLeagueForcast", TimeUtility.SecondsToHMS(seconds)));
+                }
+                else
+                {
+                    activityCell.title.text = Language.Get("FamilyMatchName");
+                }
             }
         }
 
@@ -224,6 +245,17 @@
                     if (OperationTimeHepler.Instance.TryGetOperationTime(Operation.MultipRealmPoint, out operationBase))
                     {
                         _cell.title.text = Language.Get("MultipleRealmPoint", Language.Get(StringUtility.Contact("Num_CHS_", (operationBase as OperationMultipleRealmPoint).multiplePractice)));
+                    }
+                    break;
+                case 12:
+                    var seconds = fairyLeagueModel.GetBeforeFirstLeagueTime();
+                    if (seconds > 0)
+                    {
+                        _cell.title.text = UIHelper.ReplaceNewLine(Language.Get("FairyLeagueForcast", TimeUtility.SecondsToHMS(seconds)));
+                    }
+                    else
+                    {
+                        _cell.title.text = Language.Get("FamilyMatchName");
                     }
                     break;
                 default:
@@ -471,7 +503,7 @@
                     }
                     else
                     {
-                        WindowCenter.Instance.Open<FairyJadeInvestmentWin>();
+                        WindowCenter.Instance.Open<FairyJadeInvestmentWin>(true);
                     }
                     break;
                 case 11:
@@ -481,10 +513,19 @@
                     }
                     else
                     {
-                        WindowCenter.Instance.Open<VipInvestWin>();
+                        WindowCenter.Instance.Open<VipInvestWin>(true);
                     }
                     break;
-
+                case 12:
+                    if (windowState == WindowState.Opened)
+                    {
+                        WindowCenter.Instance.OpenWithoutAnimation<FairyLeagueNoticeWin>();
+                    }
+                    else
+                    {
+                        WindowCenter.Instance.Open<FairyLeagueNoticeWin>(true);
+                    }
+                    break;
             }
         }
 
@@ -518,6 +559,7 @@
             WindowCenter.Instance.CloseImmediately<LimitedTimePackageWin>();
             WindowCenter.Instance.CloseImmediately<FairyJadeInvestmentWin>();
             WindowCenter.Instance.CloseImmediately<VipInvestWin>();
+            WindowCenter.Instance.CloseImmediately<FairyLeagueNoticeWin>();
         }
 
         private int Compare(int order_x, int order_y)
diff --git a/System/Pet/PetAttributeMethods.cs b/System/Pet/PetAttributeMethods.cs
index 6908bf4..34234d2 100644
--- a/System/Pet/PetAttributeMethods.cs
+++ b/System/Pet/PetAttributeMethods.cs
@@ -612,7 +612,7 @@
                 typePetID = PetID;
                 timePlay = 0;
                 var npcConfig = Config.Instance.Get<NPCConfig>(PetID);
-                UI3DModelExhibition.Instance.BeginShowNPC(PetID, npcConfig.UIModeLOffset, npcConfig.UIModelRotation, _rawImage);
+                UI3DModelExhibition.Instance.ShowNPC(PetID, npcConfig.UIModeLOffset, npcConfig.UIModelRotation, _rawImage);
                 if (UI3DModelExhibition.Instance.NpcModelPet != null)
                 {
                     var animator = UI3DModelExhibition.Instance.NpcModelPet.GetComponent<Animator>();
diff --git a/System/Pet/RidingAndPetActivationWin.cs b/System/Pet/RidingAndPetActivationWin.cs
index 0512ff7..39a2e8c 100644
--- a/System/Pet/RidingAndPetActivationWin.cs
+++ b/System/Pet/RidingAndPetActivationWin.cs
@@ -155,7 +155,7 @@
             HorseConfig Horseconfig = Config.Instance.Get<HorseConfig>(ActivateID);
             int InitFightPower = 0;
             InitFightPower += Horseconfig.InitFightPower;
-            UI3DModelExhibition.Instance.BeginShowHourse(Horseconfig.Model, m_RawImageMount);
+            UI3DModelExhibition.Instance.ShowHourse(Horseconfig.Model, m_RawImageMount);
             MountSkills.Clear();
             foreach (var key in mountModel.GetMountSkillAndItem.Keys)
             {
@@ -228,7 +228,7 @@
             HorseConfig Horseconfig = Config.Instance.Get<HorseConfig>(ActivateID);
             int InitFightPower = 0;
             InitFightPower += Horseconfig.InitFightPower;
-            UI3DModelExhibition.Instance.BeginShowHourse(Horseconfig.Model, m_RawImageMount);
+            UI3DModelExhibition.Instance.ShowHourse(Horseconfig.Model, m_RawImageMount);
             MountSkills.Clear();
             foreach (var key in mountModel.GetMountSkillAndItem.Keys)
             {
@@ -267,7 +267,7 @@
             m_RawImagePet.gameObject.SetActive(true);
             m_RawImageMount.gameObject.SetActive(false);
             var npcConfig = Config.Instance.Get<NPCConfig>(ActivateID);
-            UI3DModelExhibition.Instance.BeginShowNPC(ActivateID, npcConfig.UIModeLOffset, npcConfig.UIModelRotation, m_RawImagePet);
+            UI3DModelExhibition.Instance.ShowNPC(ActivateID, npcConfig.UIModeLOffset, npcConfig.UIModelRotation, m_RawImagePet);
             PetInfoConfig petInfoConfig = Config.Instance.Get<PetInfoConfig>(ActivateID);
             int InitFightPower = int.Parse(petInfoConfig.InitFightPower);
             string StrPetSkill = petInfoConfig.SkillID;
@@ -317,7 +317,7 @@
             m_RawImageMount.gameObject.SetActive(false);
 
             var npcConfig = Config.Instance.Get<NPCConfig>(ActivateID);
-            UI3DModelExhibition.Instance.BeginShowNPC(ActivateID, npcConfig.UIModeLOffset, npcConfig.UIModelRotation, m_RawImagePet);
+            UI3DModelExhibition.Instance.ShowNPC(ActivateID, npcConfig.UIModeLOffset, npcConfig.UIModelRotation, m_RawImagePet);
             // StartCoroutine("FrameDelay");
             PetInfoConfig petInfoConfig = Config.Instance.Get<PetInfoConfig>(ActivateID);
             int InitFightPower = int.Parse(petInfoConfig.InitFightPower);
diff --git a/System/PlayerDead/PlayerDeadModel.cs b/System/PlayerDead/PlayerDeadModel.cs
index 532cffb..5a12a6a 100644
--- a/System/PlayerDead/PlayerDeadModel.cs
+++ b/System/PlayerDead/PlayerDeadModel.cs
@@ -26,7 +26,7 @@
         IsCanReborn = false;
         isOpenPrompting = true;
         this.deadCD = 0;
-        localBossState = 0;
+        localBossState = false;
         playerIsDie = false;
     }
 
@@ -81,13 +81,14 @@
     private DungeonOpenTimeConfig _dungeonOpenTimeModel;
 
     public bool IsCanReborn { get; private set; }
-    public int localBossState { get; private set;}
+    public bool localBossState { get; private set;}
     public string killerName { get; private set; }
     public bool isKillByPlayer { get; private set; }
     public int npcRealmLv { get; private set; }
     private void RefreshPlayerDieInfo(string key, ArrayList infolist)
     {
         npcRealmLv = 0;
+        localBossState = false;
         switch (key)
         {
             case "PK_lhs_318691":
@@ -100,11 +101,16 @@
             case "GeRen_chenxin_279029":
                 if(infolist.Count > 0)
                 {
+                    WorldBossConfig bossConfig = Config.Instance.Get<WorldBossConfig>(int.Parse(infolist[0].ToString()));
                     NPCConfig nPCConfig = Config.Instance.Get<NPCConfig>(int.Parse(infolist[0].ToString()));
                     if(nPCConfig != null)
                     {
                         killerName = nPCConfig.charName;
                         npcRealmLv = nPCConfig.Realm;
+                    }
+                    if(bossConfig != null)
+                    {
+                        localBossState = true;
                     }
                     isKillByPlayer = false;
                 }
@@ -141,8 +147,6 @@
         {
             return;
         }
-
-        localBossState = PlayerDatas.Instance.extersion.bossState;
         playerIsDie = true;
         _tagMapModel = Config.Instance.Get<MapConfig>(PlayerDatas.Instance.baseData.MapID);
         if (_tagMapModel.MapFBType == 0)
@@ -151,7 +155,7 @@
             rebornTiredNum = RebornConditions[0];
             rebornPrice = RebornConditions[2];
             //isBossKill = StatusManager.Instance.IsExist((int)playerId,20022);
-            if (!isKillByPlayer && localBossState == 1)
+            if (!isKillByPlayer && localBossState)
             {
                 autoRebornTime = RebornConditions[3];
             }
@@ -253,7 +257,7 @@
         if (PlayerDatas.Instance.baseData.PlayerID != data.PlayerID)
             return;
 
-        localBossState = 0;
+        localBossState = false;
         this.deadCD = 0;
         isKillByPlayer = false;
         playerIsDie = false;
diff --git a/System/PlayerDead/RebornWin.cs b/System/PlayerDead/RebornWin.cs
index 01f26a9..ae4b4cb 100644
--- a/System/PlayerDead/RebornWin.cs
+++ b/System/PlayerDead/RebornWin.cs
@@ -79,7 +79,7 @@
         {
             questTimes = 0;
             _rebornPriceText.text = 1.ToString();
-            if(DeadModel.isKillByPlayer || DeadModel.localBossState != 1)
+            if(DeadModel.isKillByPlayer || !DeadModel.localBossState)
             {
                 OnShowBtnlist();
             }
diff --git a/System/Realm/RealmPropertyUpWin.cs b/System/Realm/RealmPropertyUpWin.cs
index ebf65c9..38ecdbf 100644
--- a/System/Realm/RealmPropertyUpWin.cs
+++ b/System/Realm/RealmPropertyUpWin.cs
@@ -95,7 +95,7 @@
 
         protected override void OnPreClose()
         {
-            UI3DModelExhibition.Instance.StopShowPlayer();
+            UI3DModelExhibition.Instance.StopShow();
             UI3DTreasureExhibition.Instance.StopShow();
             flying = false;
         }
@@ -248,7 +248,7 @@
                 case ActivateShow.ActivateFunc.Realm:
                     m_ModelRawImage.gameObject.SetActive(true);
                     m_ModelRawImage.rectTransform.sizeDelta = new Vector2(680, 510);
-                    UI3DModelExhibition.Instance.BeginShowPlayer(m_ModelRawImage, PlayerDatas.Instance.baseData.Job, RoleEquipType.retWing);
+                    UI3DModelExhibition.Instance.ShowPlayer(m_ModelRawImage, PlayerDatas.Instance.baseData.Job, RoleEquipType.retWing);
                     break;
                 case ActivateShow.ActivateFunc.GodWeapon:
                     m_ModelRawImage.gameObject.SetActive(true);
diff --git a/System/Realm/RealmUpWin.cs b/System/Realm/RealmUpWin.cs
index ebb2a97..db6af7f 100644
--- a/System/Realm/RealmUpWin.cs
+++ b/System/Realm/RealmUpWin.cs
@@ -41,9 +41,12 @@
 
         [SerializeField] UIEffect m_RealmDungeonSfx;
 
+        [SerializeField] RectTransform m_ContainerGroup;
+        [SerializeField] Button m_Group;
+        [SerializeField] Button m_AutoGroup;
+        [SerializeField] Button m_GroupDungeon;
         [SerializeField] Button m_SingleDungeon;
         [SerializeField] Button m_FuncButton;
-        [SerializeField] Text m_FuncButtonTxt;
         [SerializeField] Text m_RealmStageTip;
 
         [SerializeField] RectTransform m_ContainerFightPower;
@@ -77,6 +80,9 @@
             m_SingleDungeon.onClick.AddListener(SingleDungeon);
             m_FuncButton.onClick.AddListener(OnFunctionClick);
             m_RealmPreview.onClick.AddListener(OnRealmPreview);
+            m_Group.onClick.AddListener(OpenGroup);
+            m_AutoGroup.onClick.AddListener(AutoGroup);
+            m_GroupDungeon.onClick.AddListener(GroupDungeon);
         }
 
         protected override void OnPreOpen()
@@ -86,6 +92,7 @@
             cacheRealmPoint = PlayerDatas.Instance.extersion.realmPoint;
             m_RawBoss.gameObject.SetActive(false);
             m_RawPlayer.gameObject.SetActive(false);
+            m_ContainerGroup.gameObject.SetActive(false);
             overdueTime = DateTime.Now;
             Display();
         }
@@ -98,7 +105,7 @@
                 StopBoss();
                 m_RawBoss.gameObject.SetActive(false);
                 m_RawPlayer.gameObject.SetActive(true);
-                UI3DModelExhibition.Instance.BeginShowSitDownPlayer(m_RawPlayer, PlayerDatas.Instance.baseData.Job);
+                UI3DModelExhibition.Instance.ShowSitDownPlayer(m_RawPlayer, PlayerDatas.Instance.baseData.Job);
             }
         }
 
@@ -126,7 +133,7 @@
             PlayerDatas.Instance.PlayerDataRefreshInfoEvent -= PlayerDataRefreshInfoEvent;
             WindowCenter.Instance.windowAfterCloseEvent -= WindowAfterCloseEvent;
             StopBoss();
-            UI3DModelExhibition.Instance.StopShowPlayer();
+            UI3DModelExhibition.Instance.StopShow();
             realmModel.realmDungeonState = false;
             if (cacheCoroutine != null)
             {
@@ -153,7 +160,7 @@
             yield return WaitingForSecondConst.WaitMS800;
             var config = Config.Instance.Get<RealmConfig>(PlayerDatas.Instance.baseData.realmLevel);
             m_RawPlayer.gameObject.SetActive(false);
-            UI3DModelExhibition.Instance.StopShowPlayer();
+            UI3DModelExhibition.Instance.StopShow();
             yield return WaitingForSecondConst.GetWaitForSeconds(m_DelayEnterTime > 0 ? m_DelayEnterTime : 1f);
             StartBoss(config, true);
         }
@@ -275,28 +282,28 @@
                 m_RawPlayer.gameObject.SetActive(true);
                 StopBoss();
                 m_RawBoss.gameObject.SetActive(false);
-                UI3DModelExhibition.Instance.BeginShowSitDownPlayer(m_RawPlayer, PlayerDatas.Instance.baseData.Job);
+                UI3DModelExhibition.Instance.ShowSitDownPlayer(m_RawPlayer, PlayerDatas.Instance.baseData.Job);
             }
             else if (_realmPoint >= config.NeedGood)
             {
                 m_RawBoss.gameObject.SetActive(true);
                 m_RawPlayer.gameObject.SetActive(false);
-                UI3DModelExhibition.Instance.StopShowPlayer();
+                UI3DModelExhibition.Instance.StopShow();
                 StartBoss(config);
             }
         }
 
         private void StopBoss()
         {
-            UI3DModelExhibition.Instance.StopShowNPC();
+            UI3DModelExhibition.Instance.StopShow();
         }
 
         private void StartBoss(RealmConfig config, bool act = false)
         {
             StopBoss();
             m_RawBoss.gameObject.SetActive(true);
-            UI3DModelExhibition.Instance.StopShowPlayer();
-            UI3DModelExhibition.Instance.BeginShowNPC(config.BossID, config.IsBigRealm == 1 ? Vector3.zero : direction, m_RawBoss, false);
+            UI3DModelExhibition.Instance.StopShow();
+            UI3DModelExhibition.Instance.ShowNPC(config.BossID, config.IsBigRealm == 1 ? Vector3.zero : direction, m_RawBoss, false);
             var npcConfig = Config.Instance.Get<NPCConfig>(config.BossID);
             var npcModel = UI3DModelExhibition.Instance.NpcModelPet;
             m_RawBoss.transform.localPosition = config.IsBigRealm == 1 ? m_BossPositions[1] : m_BossPositions[0];
@@ -326,56 +333,70 @@
         {
             var _realmPoint = PlayerDatas.Instance.extersion.realmPoint;
             var config = Config.Instance.Get<RealmConfig>(PlayerDatas.Instance.baseData.realmLevel);
-            m_FuncButton.gameObject.SetActive(!realmModel.IsRealmHighest);
-            m_SingleDungeon.gameObject.SetActive(false);
-            if (_realmPoint >= config.NeedPoint)
-            {
-                m_FuncButtonTxt.text = Language.Get(config.IsBigRealm == 1 ? "RealmWin_Bewrite_13" : "RealmWin_Bewrite_12");
-                m_SingleDungeon.gameObject.SetActive(config.IsBigRealm == 1 && !realmModel.IsRealmHighest);
-            }
-            else
-            {
-                m_FuncButtonTxt.text = Language.Get("RealmWin_Bewrite_1");
-            }
+            bool satisfyChallenge = _realmPoint >= config.NeedPoint;
+            m_Group.gameObject.SetActive(!realmModel.IsRealmHighest && config.IsBigRealm == 1 && satisfyChallenge);
+            m_SingleDungeon.gameObject.SetActive(!realmModel.IsRealmHighest && satisfyChallenge);
+            m_FuncButton.gameObject.SetActive(!realmModel.IsRealmHighest && !satisfyChallenge);
         }
 
         private void OnFunctionClick()
         {
-            var _realmPoint = PlayerDatas.Instance.extersion.realmPoint;
-            var config = Config.Instance.Get<RealmConfig>(PlayerDatas.Instance.baseData.realmLevel);
-            if (_realmPoint >= config.NeedPoint)
+            WindowJumpMgr.Instance.WindowJumpTo(JumpUIType.DailyQuestFunc1);
+        }
+
+        private void GroupDungeon()
+        {
+            if (DateTime.Now < overdueTime)
             {
-                if (DateTime.Now < overdueTime)
-                {
-                    return;
-                }
-                PlayerDatas.Instance.realm.realmHelpList.Clear();
-                if (config.IsBigRealm == 1)
-                {
-                    var teamModel = ModelCenter.Instance.GetModel<TeamModel>();
-                    if (teamModel.myTeam.inTeam && teamModel.myTeam.iamCaptainer)
-                    {
-                        ModelCenter.Instance.GetModel<DungeonModel>().GroupChallenge(RealmModel.REALM_DUNGEON_ID, 1);
-                    }
-                    else
-                    {
-                        teamModel.missionBuf = teamModel.currentMission = new TeamMission(31110, 1);
-                        WindowCenter.Instance.Open<TeamFrameWin>(false, teamModel.myTeam.inTeam ? 1 : 0);
-                    }
-                }
-                else
-                {
-                    ModelCenter.Instance.GetModel<DungeonModel>().SingleChallenge(RealmModel.REALM_DUNGEON_ID);
-                }
+                return;
+            }
+            if (PlayerDatas.Instance.baseData.MapID == RealmModel.REALM_DUNGEON_ID)
+            {
+                return;
+            }
+            var teamModel = ModelCenter.Instance.GetModel<TeamModel>();
+            if (teamModel.myTeam.inTeam && teamModel.myTeam.iamCaptainer)
+            {
+                ModelCenter.Instance.GetModel<DungeonModel>().GroupChallenge(RealmModel.REALM_DUNGEON_ID, 1);
             }
             else
             {
-                WindowJumpMgr.Instance.WindowJumpTo(JumpUIType.DailyQuestFunc1);
+                teamModel.missionBuf = teamModel.currentMission = new TeamMission(31110, 1);
+                WindowCenter.Instance.Open<TeamFrameWin>(false, teamModel.myTeam.inTeam ? 1 : 0);
+            }
+        }
+
+        private void AutoGroup()
+        {
+            if (DateTime.Now < overdueTime)
+            {
+                return;
+            }
+            var teamModel = ModelCenter.Instance.GetModel<TeamModel>();
+            teamModel.RequestAutoMatchTeam(new TeamMission(RealmModel.REALM_DUNGEON_ID, 1));
+            WindowCenter.Instance.Open<TeamFrameWin>(false, 1);
+        }
+
+        private void OpenGroup()
+        {
+            var opened = m_ContainerGroup.gameObject.activeSelf;
+            if (!opened)
+            {
+                m_ContainerGroup.gameObject.SetActive(true);
             }
         }
 
         private void SingleDungeon()
         {
+            if (DateTime.Now < overdueTime)
+            {
+                return;
+            }
+            if (PlayerDatas.Instance.baseData.MapID == RealmModel.REALM_DUNGEON_ID)
+            {
+                return;
+            }
+            PlayerDatas.Instance.realm.realmHelpList.Clear();
             var _realmPoint = PlayerDatas.Instance.extersion.realmPoint;
             var config = Config.Instance.Get<RealmConfig>(PlayerDatas.Instance.baseData.realmLevel);
             if (_realmPoint >= config.NeedPoint)
diff --git a/System/Role/RolePanel.cs b/System/Role/RolePanel.cs
index 0a9dd4c..e70ecda 100644
--- a/System/Role/RolePanel.cs
+++ b/System/Role/RolePanel.cs
@@ -194,7 +194,7 @@
             OnUpdateSpecialAttr();
             OnUpdateLvExp();
             m_PlayerFightPower.text = PlayerDatas.Instance.baseData.FightPoint.ToString();
-            UI3DModelExhibition.Instance.BeginShowPlayer(m_PlayerShowModel, PlayerDatas.Instance.baseData.Job);
+            UI3DModelExhibition.Instance.ShowPlayer(m_PlayerShowModel, PlayerDatas.Instance.baseData.Job);
             OnRefreshRealm();
             OnRefreshWorldLv();
         }
@@ -253,7 +253,7 @@
 
         void OnDisableRole()
         {
-            UI3DModelExhibition.Instance.StopShowPlayer();
+            UI3DModelExhibition.Instance.StopShow();
         }
 
         protected override void BindController()
diff --git a/System/RoleParticulars/RoleParticularsWin.cs b/System/RoleParticulars/RoleParticularsWin.cs
index f4eb20e..aaf05ab 100644
--- a/System/RoleParticulars/RoleParticularsWin.cs
+++ b/System/RoleParticulars/RoleParticularsWin.cs
@@ -136,7 +136,7 @@
 
         protected override void OnAfterClose()
         {
-            UI3DModelExhibition.Instance.StopShowPlayer();
+            UI3DModelExhibition.Instance.StopShow();
         }
         #endregion
 
@@ -248,7 +248,16 @@
                 {
                     weapon2 = itemData.ItemID;
                 }
-                UI3DModelExhibition.Instance.BeginShowOtherPlayer(roleModel, viewPlayerData.rolePropData.Job, clothes, _suitLevel, weapon, wing, weapon2);
+
+                var data = new UI3DModelExhibition.UI3DPlayerExhibitionData {
+                    job = viewPlayerData.rolePropData.Job,
+                    clothesId = clothes,
+                    suitLevel = _suitLevel,
+                    weaponId=weapon,
+                    wingsId=wing,
+                    secondaryId=weapon2,
+                };
+                UI3DModelExhibition.Instance.ShowOtherPlayer(roleModel, data);
             }
         }
 
diff --git a/System/RoleParticulars/ViewHorseDetailWin.cs b/System/RoleParticulars/ViewHorseDetailWin.cs
index 81d1817..ac0e1af 100644
--- a/System/RoleParticulars/ViewHorseDetailWin.cs
+++ b/System/RoleParticulars/ViewHorseDetailWin.cs
@@ -176,7 +176,7 @@
         {
             m_RawModel.gameObject.SetActive(true);
             var config = Config.Instance.Get<HorseConfig>(id);
-            UI3DModelExhibition.Instance.BeginShowHourse(config.Model, m_RawModel);
+            UI3DModelExhibition.Instance.ShowHourse(config.Model, m_RawModel);
             if (UI3DModelExhibition.Instance.NpcModelHorse != null)
             {
                 var animator = UI3DModelExhibition.Instance.NpcModelHorse.GetComponent<Animator>();
diff --git a/System/RoleParticulars/ViewPetDetailWin.cs b/System/RoleParticulars/ViewPetDetailWin.cs
index 77c4f3e..9bb98a6 100644
--- a/System/RoleParticulars/ViewPetDetailWin.cs
+++ b/System/RoleParticulars/ViewPetDetailWin.cs
@@ -162,7 +162,7 @@
         {
             m_RawModel.gameObject.SetActive(true);
             var npcConfig = Config.Instance.Get<NPCConfig>(id);
-            UI3DModelExhibition.Instance.BeginShowNPC(id, npcConfig.UIModeLOffset, npcConfig.UIModelRotation, m_RawModel);
+            UI3DModelExhibition.Instance.ShowNPC(id, npcConfig.UIModeLOffset, npcConfig.UIModelRotation, m_RawModel);
             if (UI3DModelExhibition.Instance.NpcModelPet != null)
             {
                 var animator = UI3DModelExhibition.Instance.NpcModelPet.GetComponent<Animator>();
diff --git a/System/RuneTower/RuneTowerWin.cs b/System/RuneTower/RuneTowerWin.cs
index ff92132..c3c3678 100644
--- a/System/RuneTower/RuneTowerWin.cs
+++ b/System/RuneTower/RuneTowerWin.cs
@@ -102,7 +102,7 @@
             guideSweep = false;
             WindowCenter.Instance.uiRoot.eventSystem.enabled = true;
             m_Tower.Dispose();
-            UI3DModelExhibition.Instance.StopShowNPC();
+            UI3DModelExhibition.Instance.StopShow();
             model.selectedFloorEvent -= OnSelectedFloorChange;
             dailyQuestModel.dailyQuestProgressUpdateEvent -= OnRuneTowerSweepResult;
         }
@@ -192,7 +192,7 @@
             m_BossName.text = npcConfig.charName;
             m_BossLevel.text = Language.Get("HeadUpName_Monster", npcConfig.NPCLV);
 
-            UI3DModelExhibition.Instance.BeginShowNPC(towerFloorConfig.BossId, new Vector3(0, 30, 0), m_BossPortrait);
+            UI3DModelExhibition.Instance.ShowNPC(towerFloorConfig.BossId, new Vector3(0, 30, 0), m_BossPortrait);
 
             var challengable = !model.allTowerCompleted && model.selectedFloor == model.currentFloor;
             if (challengable)
diff --git a/System/Store/PetAndMountPushWin.cs b/System/Store/PetAndMountPushWin.cs
index a836a2a..4ab0a23 100644
--- a/System/Store/PetAndMountPushWin.cs
+++ b/System/Store/PetAndMountPushWin.cs
@@ -11,6 +11,7 @@
         [SerializeField] RawImage rawImag;
         [SerializeField] Button closeBtn;
         [SerializeField] RichText m_Goto;
+        [SerializeField] Text fightPower;
 
         StoreModel storeModel { get { return ModelCenter.Instance.GetModel<StoreModel>(); } }
         ItemTipsModel tipsModel { get { return ModelCenter.Instance.GetModel<ItemTipsModel>(); } }
@@ -65,12 +66,14 @@
                             titleText.text = Language.Get("StorePetPush");
                             PetInfoConfig petInfo = tipsModel.unlockPetDict[storeConfig.ItemID];
                             var config = Config.Instance.Get<NPCConfig>(petInfo.ID);
-                            UI3DModelExhibition.Instance.BeginShowNPC(petInfo.ID, config.UIModeLOffset, config.UIModelRotation,rawImag);
+                            fightPower.text = petInfo.ShowFightPower.ToString();
+                            UI3DModelExhibition.Instance.ShowNPC(petInfo.ID, config.UIModeLOffset, config.UIModelRotation,rawImag);
                             break;
                         case 41:
                             titleText.text = Language.Get("StoreMountPush");
                             HorseConfig horseConfig = tipsModel.unlockMountDict[storeConfig.ItemID];
-                            UI3DModelExhibition.Instance.BeginShowHourse(horseConfig.Model,rawImag);
+                            fightPower.text = horseConfig.ShowFightPower.ToString();
+                            UI3DModelExhibition.Instance.ShowHourse(horseConfig.Model,rawImag);
                             break;
                     }
                 }
diff --git a/System/Store/StoreModel.cs b/System/Store/StoreModel.cs
index 890ca6e..8586001 100644
--- a/System/Store/StoreModel.cs
+++ b/System/Store/StoreModel.cs
@@ -69,6 +69,7 @@
         NewBieCenter.Instance.guideBeginEvent -= GuidBegin;
         shopItemlimitDict.Clear();
         petAndMountPushlist.Clear();
+        ClearPushData();
         tagTowerModel = null;
         storeFuncType = StoreFunc.WeekStore;
         tcbRefreshDict.Clear();
@@ -1118,12 +1119,19 @@
 
     private void GuidBegin()
     {
-        SetPushPetAndMountWinState(true,true);
+        PetAndMountPushWin pushWin = WindowCenter.Instance.Get<PetAndMountPushWin>();
+        if(pushWin != null)
+        {
+            SetPushPetAndMountWinState(true, true);
+        }
     }
 
     private void OnMoveTopPart(bool isMove)
     {
-        SetPushPetAndMountWinState(!isMove);
+        if(!isLogin)
+        {
+            SetPushPetAndMountWinState(!isMove);
+        }
     }
 
     private void windowAfterOpen(Window win)
@@ -1136,6 +1144,8 @@
 
     private void windowAfterClose(Window win)
     {
+        if (isLogin) return;
+
         if(win is MainInterfaceWin)
         {
             SetPushPetAndMountWinState(true);
diff --git a/System/Strengthening/GodBeastAttributes.cs b/System/Strengthening/GodBeastAttributes.cs
index bbbfb5a..03cf1f7 100644
--- a/System/Strengthening/GodBeastAttributes.cs
+++ b/System/Strengthening/GodBeastAttributes.cs
@@ -35,9 +35,13 @@
 
         [SerializeField] UIAlphaTween m_UIAlphaTween;
         [SerializeField] Slider m_Slider;
+
+        [SerializeField] GameObject m_Text_two;//涓嬬骇灞炴��
+        [SerializeField] Button m_StrengthenDoubleBtn;//鍙屽�嶅己鍖栨寜閽�
+        [SerializeField] Text m_NeedFairy;//鎵�闇�鐨勪粰鐜�
+        [SerializeField] GameObject m_BottomBox;
         DogzModel Dogz_model;
-        DogzModel dogz_model { get { return Dogz_model ?? (Dogz_model = ModelCenter.Instance.GetModel<DogzModel>()); } }
-        private Dictionary<int, int> QualityLimit = new Dictionary<int, int>();
+        DogzModel dogz_model { get { return Dogz_model ?? (Dogz_model = ModelCenter.Instance.GetModel<DogzModel>()); } }
         PlayerPackModel _playerPack;
         PlayerPackModel playerPack { get { return _playerPack ?? (_playerPack = ModelCenter.Instance.GetModel<PlayerPackModel>()); } }
         ItemTipsModel _itemTipsModel;
@@ -57,6 +61,7 @@
         {
             m_DoubleToggle.onValueChanged.AddListener(OnClickToggle);
             m_StrengthenBtn.AddListener(OnClickStrengthBtn);
+            m_StrengthenDoubleBtn.AddListener(OnClickStrengthBtn);
         }
         private void OnEnable()
         {
@@ -69,17 +74,15 @@
         }
         private void OnDisable()
         {
+            GodBeast_Number = 0;
+            GodBeast_Part = 0;
+            
             GodBeastReinforcementWin.ChooseToModify -= ChooseToModify;
             godBeastModel.AbsorbEvent -= AbsorbEvent;
         }
 
         public void Init()
         {
-            if (QualityLimit.Count <= 0)
-            {
-                string DogzAssist = Config.Instance.Get<FuncConfigConfig>("DogzAssist").Numerical4;//鑾峰彇涓嶅悓鍝佽川鐨勭鍏藉己鍖栦笂闄�
-                QualityLimit = ConfigParse.GetDic<int, int>(DogzAssist);
-            }
         }
 
         public void Unit()
@@ -89,7 +92,11 @@
 
         private void OnClickToggle(bool Isbool)
         {
-            AttributeAssignment();
+            if (GodBeastNumber != 0 && GodBeastPart != 0)
+            {
+                AttributeAssignment();
+            }
+          
         }
         private void OnClickStrengthBtn()
         {
@@ -102,19 +109,28 @@
                 ListCount.Add(DicAb[key]);
             }
             if (m_DoubleToggle.isOn)
-            {                
+            {
+                if (ListIndex.Count <= 0)
+                {
+                    return;
+                }
                 dogz_model.SendDogzEquipStrength(m_DogZItemModel.itemInfo.ItemPlace, ListIndex, ListCount, 1);
             }
             else
             {
+                if (ListIndex.Count <= 0)
+                {
+                    return;
+                }
                 dogz_model.SendDogzEquipStrength(m_DogZItemModel.itemInfo.ItemPlace, ListIndex, ListCount, 0);
             }
         }
+
         private void ChooseToModify(int locationMarker)
         {
             GetGodBeastLocationMarker(locationMarker);
         }
-        private void AbsorbEvent()//閫変腑鍙栨秷鐨勬暟鎹埛鏂�
+        private void AbsorbEvent()//閫変腑涓庡彇娑堢殑鏁版嵁鍒锋柊
         {
             GetDogZLevelAndExp();
             AttributeAssignment();
@@ -144,21 +160,32 @@
                         }
                     }
                 }
+                m_UIAlphaTween.gameObject.SetActive(true);
                 m_FrameNull.SetActive(true);
-                m_FullLevel.SetActive(false);
+                m_FullLevel.SetActive(false);            
                 GetDogZLevelAndExp();
                 AttributeAssignment();
             }
             else
             {
+                GodBeastNumber = 0;
+                GodBeastPart = 0;
                 m_ItemCell.gameObject.SetActive(false);
                 m_ExpSlider.stage = 0;
                 m_ExpSlider.delay = 0f;
                 m_ExpSlider.ResetStage();
                 m_ExpSlider.value = 0;
                 m_ExpNum.text = "0/0";
+                m_TextAttributes1.gameObject.SetActive(false);
+                m_TextAttributes2.gameObject.SetActive(false);
+                m_TextAttributesAdd1.gameObject.SetActive(false);
+                m_TextAttributesAdd2.gameObject.SetActive(false);
+                m_StrengthenDoubleBtn.gameObject.SetActive(false);
+                m_Text_two.SetActive(false);
                 m_FrameNull.SetActive(false);
                 m_FullLevel.SetActive(false);
+                m_UIAlphaTween.gameObject.SetActive(false);
+                m_BottomBox.SetActive(false);
             }
         }
 
@@ -169,43 +196,71 @@
                 return;
             }
             GainProficiency();//鑾峰彇鐔熺粌搴�
+            m_BottomBox.SetActive(true);
             var IudetDogzEquipPlus = m_DogZItemModel.GetUseDataModel((int)ItemUseDataKey.Def_IudetDogzEquipPlus);
             if (IudetDogzEquipPlus != null)
             {
-                int lv = QualityLimit[m_DogZItemModel.chinItemModel.ItemColor];
+                int lv = godBeastModel.QualityLimit[m_DogZItemModel.chinItemModel.ItemColor];
                 var DogzEquipConfig = DogzEquipPlusConfig.GetEquipplaceAndLevel(GodBeastPart, lv);
                 if (DogZLv >= lv)
                 {
+                    m_BottomBox.SetActive(false);
+                    m_Text_two.SetActive(false);
                     m_FrameNull.SetActive(false);
+                    m_TextAttributes1.gameObject.SetActive(false);
+                    m_TextAttributes2.gameObject.SetActive(false);
+                    m_TextAttributesAdd1.gameObject.SetActive(false);
+                    m_TextAttributesAdd2.gameObject.SetActive(false);
                     m_FullLevel.SetActive(true);
+                    GodBeast_Number = GodBeastNumber;
+                    GodBeast_Part = GodBeastPart;
                     m_ExpSlider.stage = lv;
                     m_ExpSlider.delay = 0f;
                     m_ExpSlider.ResetStage();
                     m_ExpSlider.value = 1;
                     m_Slider.gameObject.SetActive(false);
-                    m_ExpNum.text = DogzEquipConfig.upExpTotal + "/" + DogzEquipConfig.upExpTotal;
+                    int NeedExp = DogzEquipConfig.upExpTotal;
+                    if (DogZLv > 0)
+                    {
+                        var Dogz_EquipConfig = DogzEquipPlusConfig.GetEquipplaceAndLevel(GodBeastPart, DogZLv - 1);
+                        NeedExp -= Dogz_EquipConfig.upExpTotal;
+                    }
+                    m_ExpNum.text = NeedExp + "/" + NeedExp;
                 }
                 else
                 {
+                  
+                    m_StrengthenDoubleBtn.interactable = true;
+                    m_StrengthenBtn.interactable = true;
+                    m_Text_two.SetActive(true);
                     if (m_DoubleToggle.isOn)
                     {
+                        m_StrengthenBtn.gameObject.SetActive(false);
+                        m_StrengthenDoubleBtn.gameObject.SetActive(true);
+                        m_NeedFairy.text = NeedFairyJade.ToString();
                         PropertySetting(DogZExp, DoubleProficiency);
                     }
                     else
                     {
+                        m_StrengthenBtn.gameObject.SetActive(true);
+                        m_StrengthenDoubleBtn.gameObject.SetActive(false);
                         PropertySetting(DogZExp, SingleProficiency);
                     }
-
                 }
             }
             else
             {
                 if (m_DoubleToggle.isOn)
                 {
+                    m_StrengthenBtn.gameObject.SetActive(false);
+                    m_StrengthenDoubleBtn.gameObject.SetActive(true);
+                    m_NeedFairy.text = NeedFairyJade.ToString();
                     PropertySetting(0, DoubleProficiency);
                 }
                 else
                 {
+                    m_StrengthenBtn.gameObject.SetActive(true);
+                    m_StrengthenDoubleBtn.gameObject.SetActive(false);
                     PropertySetting(0, SingleProficiency);
                 }
             }
@@ -256,6 +311,12 @@
                 m_LvNextText.text = "+" + toLv.ToString();
             }
             var DogzEquipConfig = DogzEquipPlusConfig.GetEquipplaceAndLevel(GodBeastPart, DogZLv);
+            int NeedExp = DogzEquipConfig.upExpTotal;
+            if (DogZLv > 0)
+            {
+                var Dogz_EquipConfig = DogzEquipPlusConfig.GetEquipplaceAndLevel(GodBeastPart, DogZLv - 1);
+                NeedExp -= Dogz_EquipConfig.upExpTotal;
+            }
             int[] AttType = ConfigParse.GetMultipleStr<int>(DogzEquipConfig.attType);
             int[] AttValue = ConfigParse.GetMultipleStr<int>(DogzEquipConfig.attValue);
             if (ToExpTotal == 0)
@@ -263,8 +324,9 @@
                 m_Slider.gameObject.SetActive(false);
                 m_TextAttributesAdd1.gameObject.SetActive(false);
                 m_TextAttributesAdd2.gameObject.SetActive(false);
-                m_ExpNum.text = DogZExp + "/" + DogzEquipConfig.upExpTotal;
-                float value = (float)DogZExp / DogzEquipConfig.upExpTotal;
+
+                m_ExpNum.text = DogZExp + "/" + NeedExp;
+                float value = (float)DogZExp / NeedExp;
                 SetExperienceBar(DogZLv, value);
                 if (AttType.Length > 1)
                 {
@@ -285,54 +347,30 @@
             else
             {
                 m_Slider.gameObject.SetActive(true);
-                if (DogZExp + ToExpTotal >= DogzEquipConfig.upExpTotal)
+                if (DogZExp + ToExpTotal >= NeedExp)
                 {
                     m_Slider.value = 1f;
                 }
                 else
                 {
-                    m_Slider.value = (float)(DogZExp + ToExpTotal) / (float)(DogzEquipConfig.upExpTotal);
+                    m_Slider.value = (float)(DogZExp + ToExpTotal) / (float)(NeedExp);
                 }
                 m_UIAlphaTween.Play();
-                var DogzEquipToConfig = DogzEquipPlusConfig.GetEquipplaceAndLevel(GodBeastPart, toLv);
-                int[] AttTypeTo = ConfigParse.GetMultipleStr<int>(DogzEquipToConfig.attType);
-                int[] AttValueTo = ConfigParse.GetMultipleStr<int>(DogzEquipToConfig.attValue);
                 string strColor = string.Format(Language.Get("DogzGreenText"), ToExpTotal);
-                m_ExpNum.text = DogZExp + strColor + "/" + DogzEquipConfig.upExpTotal;
-                float value= (float)DogZExp / DogzEquipConfig.upExpTotal;
+                m_ExpNum.text = DogZExp + strColor + "/" + NeedExp;
+                float value = (float)DogZExp / NeedExp;
                 SetExperienceBar(DogZLv, value);
-                if (AttType.Length > 1)
-                {
-                    m_TextAttributes1.gameObject.SetActive(true);
-                    m_TextAttributes2.gameObject.SetActive(true);
-                    m_TextAttributesAdd1.gameObject.SetActive(true);
-                    m_TextAttributesAdd2.gameObject.SetActive(true);
-                    string StrName1 = Config.Instance.Get<PlayerPropertyConfig>(AttType[0]).Name;
-                    string StrName2 = Config.Instance.Get<PlayerPropertyConfig>(AttType[1]).Name;
-                    m_TextAttributes1.text = StrName1 + ":" + AttValue[0];
-                    m_TextAttributes2.text = StrName2 + ":" + AttValue[1];
-                    m_TextAttributesAdd1.text = "+" + (AttValueTo[0] - AttValue[0]);
-                    m_TextAttributesAdd2.text = "+" + (AttValueTo[1] - AttValue[1]);
-                }
-                else
-                {
-                    m_TextAttributes1.gameObject.SetActive(true);
-                    m_TextAttributesAdd1.gameObject.SetActive(true);
-                    m_TextAttributes2.gameObject.SetActive(false);
-                    m_TextAttributesAdd2.gameObject.SetActive(false);
-                    string StrName1 = Config.Instance.Get<PlayerPropertyConfig>(AttType[0]).Name;
-                    m_TextAttributes1.text = StrName1 + ":" + AttValue[0];
-                    m_TextAttributesAdd1.text = "+" + (AttValueTo[0] - AttValue[0]);
-                }
             }
-
+            SetAddAttributes(DogzEquipConfig, GodBeastPart, toLv);//璁剧疆棰勮鐨勫睘鎬�
             if (ToExpTotal == 0)
             {
                 m_StrengthenBtn.interactable = false;
+                m_StrengthenDoubleBtn.interactable = false;
             }
             else
             {
                 m_StrengthenBtn.interactable = true;
+                m_StrengthenDoubleBtn.interactable = true;
             }
         }
 
@@ -343,7 +381,12 @@
             {
                 return DogzLv;
             }
-            int lv = QualityLimit[m_DogZItemModel.chinItemModel.ItemColor];
+            int lv = godBeastModel.QualityLimit[m_DogZItemModel.chinItemModel.ItemColor];
+            var IudetDogzEquipPlus = m_DogZItemModel.GetUseDataModel((int)ItemUseDataKey.Def_IudetDogzEquipPlus);
+            if (IudetDogzEquipPlus != null)
+            {
+                ToExpTotal+= IudetDogzEquipPlus[1];
+            }
             for (int i = lv; i >= 0; i--)
             {
                 var DogzEquipConfig = DogzEquipPlusConfig.GetEquipplaceAndLevel(GodBeastPart, i);
@@ -386,14 +429,23 @@
             if (IudetDogzEquipPlus != null)
             {
                 DogZLv = IudetDogzEquipPlus[0];
-                DogZExp = IudetDogzEquipPlus[1];
+                if (DogZLv > 0)
+                {
+                    var Dogz_EquipConfig = DogzEquipPlusConfig.GetEquipplaceAndLevel(GodBeastPart, DogZLv - 1);
+                    DogZExp = IudetDogzEquipPlus[1] - Dogz_EquipConfig.upExpTotal;
+                }
+                else
+                {
+                    DogZExp = IudetDogzEquipPlus[1];
+                }
+
             }
         }
 
 
         int GodBeast_Number = 0;
         int GodBeast_Part = 0;
-        private void SetExperienceBar(int lv,float value)//璁剧疆缁忛獙鏉�
+        private void SetExperienceBar(int lv, float value)//璁剧疆缁忛獙鏉�
         {
             if (GodBeast_Number != GodBeastNumber || GodBeast_Part != GodBeastPart)
             {
@@ -411,6 +463,39 @@
                 m_ExpSlider.value = value;
             }
         }
+
+        private void SetAddAttributes(DogzEquipPlusConfig DogzEquipConfig, int GodBeastPart, int toLv)//璁剧疆棰勮鐨勫睘鎬�
+        {
+            int[] AttType = ConfigParse.GetMultipleStr<int>(DogzEquipConfig.attType);
+            int[] AttValue = ConfigParse.GetMultipleStr<int>(DogzEquipConfig.attValue);
+            var DogzEquipToConfig = DogzEquipPlusConfig.GetEquipplaceAndLevel(GodBeastPart, toLv);
+            int[] AttTypeTo = ConfigParse.GetMultipleStr<int>(DogzEquipToConfig.attType);
+            int[] AttValueTo = ConfigParse.GetMultipleStr<int>(DogzEquipToConfig.attValue);
+            if (AttType.Length > 1)
+            {
+                m_TextAttributes1.gameObject.SetActive(true);
+                m_TextAttributes2.gameObject.SetActive(true);
+                m_TextAttributesAdd1.gameObject.SetActive(true);
+                m_TextAttributesAdd2.gameObject.SetActive(true);
+                string StrName1 = Config.Instance.Get<PlayerPropertyConfig>(AttType[0]).Name;
+                string StrName2 = Config.Instance.Get<PlayerPropertyConfig>(AttType[1]).Name;
+                m_TextAttributes1.text = StrName1 + ":" + AttValue[0];
+                m_TextAttributes2.text = StrName2 + ":" + AttValue[1];
+                m_TextAttributesAdd1.text = "+" + (AttValueTo[0] - AttValue[0]);
+                m_TextAttributesAdd2.text = "+" + (AttValueTo[1] - AttValue[1]);
+            }
+            else
+            {
+                m_TextAttributes1.gameObject.SetActive(true);
+                m_TextAttributesAdd1.gameObject.SetActive(true);
+                m_TextAttributes2.gameObject.SetActive(false);
+                m_TextAttributesAdd2.gameObject.SetActive(false);
+                string StrName1 = Config.Instance.Get<PlayerPropertyConfig>(AttType[0]).Name;
+                m_TextAttributes1.text = StrName1 + ":" + AttValue[0];
+                m_TextAttributesAdd1.text = "+" + (AttValueTo[0] - AttValue[0]);
+            }
+
+        }
     }
 
 }
diff --git a/System/Strengthening/GodBeastModel.cs b/System/Strengthening/GodBeastModel.cs
index 0864a34..eac4735 100644
--- a/System/Strengthening/GodBeastModel.cs
+++ b/System/Strengthening/GodBeastModel.cs
@@ -16,14 +16,20 @@
     public Dictionary<int, int> Absorption_Dic = new Dictionary<int, int>();//鑾峰彇閫夋嫨鐨勭墿鍝�
     public event Action AbsorbEvent;
     public int ItemInde = 0;//鐗╁搧涓嬫爣
-    public ItemModel Crystal_ItemModel;
+    public ItemModel Crystal_ItemModel;//褰撳墠鎵�閫変腑鐨勬按鏅剁墿鍝�
+    public int ItemPlace = -1;//绁炲吔瑁呭浣嶇疆淇℃伅
+    public  Dictionary<int, int> QualityLimit = new Dictionary<int, int>();//瀵瑰簲鍝佽川鎵�鑳介�夋嫨鐨勬渶澶у己鍖栫瓑绾�
     DogzModel Dogz_model;
     DogzModel dogz_model { get { return Dogz_model ?? (Dogz_model = ModelCenter.Instance.GetModel<DogzModel>()); } }
     PlayerPackModel _playerPack;
     PlayerPackModel playerPack { get { return _playerPack ?? (_playerPack = ModelCenter.Instance.GetModel<PlayerPackModel>()); } }
     public override void Init()
     {
-
+        if (QualityLimit.Count <= 0)
+        {
+            string DogzAssist = Config.Instance.Get<FuncConfigConfig>("DogzAssist").Numerical4;//鑾峰彇涓嶅悓鍝佽川鐨勭鍏藉己鍖栦笂闄�
+            QualityLimit = ConfigParse.GetDic<int, int>(DogzAssist);
+        }
     }
 
     public void OnBeforePlayerDataInitialize()
@@ -117,7 +123,72 @@
         return SiteEnhancementAttributeDic;
     }
 
+    public int DogZBagIndex = 0;
+    public bool IsFullLevel()//鏄兘婊$骇鑳藉缁х画鍚告敹
+    {
+        bool IsBool = false;
+        int DogZLV = 0;//鑾峰彇褰撳墠绁炲吔绛夌骇
+        int DogProficiency = 0;//褰撳墠绁炲吔鐨勭啛缁冨害
+        int SingleProficiency = 0;//鍗曞�嶇啛缁冨害
+        int DoubleProficiency = 0;//鍙屽�嶇啛缁冨害
+        ItemModel itemModel = playerPack.GetItemModelByIndex(PackType.rptDogzEquip, DogZBagIndex);
+        if (itemModel == null)
+        {
+            return false;
+        }
+        int lv = QualityLimit[itemModel.chinItemModel.ItemColor];
+        var DogzEquipMaxConfig = DogzEquipPlusConfig.GetEquipplaceAndLevel(itemModel.chinItemModel.EquipPlace, lv);    
+        var IudetDogzEquipPlus = itemModel.GetUseDataModel((int)ItemUseDataKey.Def_IudetDogzEquipPlus);
 
+        if (IudetDogzEquipPlus != null)
+        {
+            DogZLV = IudetDogzEquipPlus[0];
+            DogProficiency = IudetDogzEquipPlus[1];
+        }
+        foreach (var key in Absorption_Dic.Keys)
+        {
+            ItemModel item_Model = playerPack.GetItemModelByIndex(PackType.rptDogzItem, key);
+            if (item_Model != null)
+            {
+                if (item_Model.chinItemModel.Effect1 == 235)
+                {
+                    var _IudetDogzEquipPlus = item_Model.GetUseDataModel((int)ItemUseDataKey.Def_IudetDogzEquipPlus);
+                    SingleProficiency += item_Model.chinItemModel.EffectValueA1 * Absorption_Dic[key];
+                    if (_IudetDogzEquipPlus != null)
+                    {
+                        SingleProficiency += _IudetDogzEquipPlus[1];
+                        DoubleProficiency += item_Model.chinItemModel.EffectValueA1;
+                    }
+                    else
+                    {
+                        DoubleProficiency += item_Model.chinItemModel.EffectValueA1 * 2 * Absorption_Dic[key];
+                    }
+                }
+            }
+        }
+        if (true)
+        {
+            if (DogProficiency + DoubleProficiency >= DogzEquipMaxConfig.upExpTotal)
+            {
+                return true;
+            }
+            else
+            {
+                return false;
+            }         
+        }
+        else
+        {
+            if (DogProficiency + SingleProficiency >= DogzEquipMaxConfig.upExpTotal)
+            {
+                return true;
+            }
+            else
+            {
+                return false;
+            }
+        }
+    }
 }
 
 
diff --git a/System/Strengthening/GodBeastReinforcementWin.cs b/System/Strengthening/GodBeastReinforcementWin.cs
index 1d4769e..8b00ff1 100644
--- a/System/Strengthening/GodBeastReinforcementWin.cs
+++ b/System/Strengthening/GodBeastReinforcementWin.cs
@@ -21,6 +21,7 @@
         public int GodBeastStar;//绁炲吔鏄熺骇
         public int LocationMarker;//浣嶇疆鏍囪
         public int EquipScore;//瑁呭璇勫垎
+        public int ItemPlace;//鑳屽寘瑁呭浣嶇疆
     }
     public class GodBeastReinforcementWin : Window
     {
@@ -28,13 +29,17 @@
         [SerializeField] GodBeastSlidingList m_GodBeastSlidingList;
         [SerializeField] GameObject m_Listprompt_Text;
         [SerializeField] GodBeastAttributes m_GodBeastAttributes;
+        [SerializeField] UIEffect m_UIEffect;
         DogzModel Dogz_model;
         DogzModel dogz_model { get { return Dogz_model ?? (Dogz_model = ModelCenter.Instance.GetModel<DogzModel>()); } }
         PlayerPackModel _playerPack;
         PlayerPackModel playerPack { get { return _playerPack ?? (_playerPack = ModelCenter.Instance.GetModel<PlayerPackModel>()); } }
+        GodBeastModel GodBeastModel;
+        GodBeastModel godBeastModel { get { return GodBeastModel ?? (GodBeastModel = ModelCenter.Instance.GetModel<GodBeastModel>()); } }
         public static event Action<int> ChooseToModify;
         private List<GodBeastClass> GodBeastList = new List<GodBeastClass>();
         private int CurrentlySelected = 0;
+        private int JumpIndex = 0;
         #region Built-in
         protected override void BindController()
         {
@@ -49,34 +54,73 @@
         {
             CurrentlySelected = 0;
             GetGodBeast();//鑾峰彇绁炲吔寮哄寲瑁呭淇℃伅
-            if (GodBeastList.Count > 0)
-            {
-                CurrentlySelected = GodBeastList[0].LocationMarker;
-                m_ScrollerController.JumpIndex(0);
-            }
             m_ScrollerController.OnRefreshCell += OnRefreshGridCell;
-            OnCreateGridLineCell(m_ScrollerController);          
+            if (godBeastModel.ItemPlace != -1)
+            {
+                for (int i = 0; i < GodBeastList.Count; i++)
+                {
+                    if (GodBeastList[i].ItemPlace == godBeastModel.ItemPlace)
+                    {
+                        CurrentlySelected = GodBeastList[i].LocationMarker;
+                        GetDogZBagIndex();
+                        int Index = 0;
+                        Index = GodBeastList.FindIndex((x) =>
+                        {
+                            return x.ItemPlace == godBeastModel.ItemPlace;
+                        });
+                        JumpIndex = Index;
+                    }
+                }
+            }
+            else
+            {
+                if (GodBeastList.Count > 0)
+                {
+                    CurrentlySelected = GodBeastList[0].LocationMarker;
+                    GetDogZBagIndex();
+                    JumpIndex = 0;                 
+                }
+            }
+            OnCreateGridLineCell(m_ScrollerController);
             m_GodBeastSlidingList.Init();
             m_GodBeastAttributes.Init();
-            m_GodBeastAttributes.GetGodBeastLocationMarker(CurrentlySelected);
+            m_GodBeastAttributes.GetGodBeastLocationMarker(CurrentlySelected);
+            m_ScrollerController.JumpIndex(JumpIndex);
+
+
+
         }
 
         protected override void OnAfterOpen()
         {
-            playerPack.RefreshItemCountAct += RefreshItemCountAct;
+            playerPack.RefreshItemCountAct += RefreshItemCountAct;
+            DTC0721_tagMakeItemAnswer.MakeItemAnswerEvent += MakeItemAnswerEvent;
         }
 
         protected override void OnPreClose()
         {
+            JumpIndex = 0;
+            godBeastModel.ItemPlace = -1;
+           // godBeastModel.Absorption_Dic.Clear();
             playerPack.RefreshItemCountAct -= RefreshItemCountAct;
-            m_ScrollerController.OnRefreshCell -= OnRefreshGridCell;
+            m_ScrollerController.OnRefreshCell -= OnRefreshGridCell;
+            DTC0721_tagMakeItemAnswer.MakeItemAnswerEvent -= MakeItemAnswerEvent;
+        }
+
+        private void MakeItemAnswerEvent(H0721_tagMakeItemAnswer obj)
+        {
+            if ((int)obj.MakeType == (int)MakeType.Def_mitDogzEquipPlus)
+            {
+                m_UIEffect.Play();
+            }
         }
 
         private void RefreshItemCountAct(PackType arg1, int arg2, int arg3)
         {
             if (arg1 == PackType.rptDogzEquip)
             {
-                OnCreateGridLineCell(m_ScrollerController);
+                //OnCreateGridLineCell(m_ScrollerController);
+                m_ScrollerController.m_Scorller.RefreshActiveCellViews();//鍒锋柊鍙
                 m_GodBeastSlidingList.Init();
                 m_GodBeastAttributes.Init();
                 m_GodBeastAttributes.GetGodBeastLocationMarker(CurrentlySelected);
@@ -96,7 +140,7 @@
             {
                 if (DogzEquipDict[key] == 1)
                 {
-                   
+
                     List<ItemModel> itemModel = dogz_model.GetDogzEquips(key);
                     for (int i = 0; i < itemModel.Count; i++)
                     {
@@ -106,6 +150,7 @@
                         godBeastClass.GodBeastQuality = itemModel[i].chinItemModel.ItemColor;
                         godBeastClass.GodBeastStar = itemModel[i].chinItemModel.StarLevel;
                         godBeastClass.EquipScore = itemModel[i].equipScore;
+                        godBeastClass.ItemPlace = itemModel[i].itemInfo.ItemPlace;
                         var IudetDogzEquipPlus = itemModel[i].GetUseDataModel((int)ItemUseDataKey.Def_IudetDogzEquipPlus);// 绁炲吔瑁呭寮哄寲淇℃伅鍒楄〃 [寮哄寲绛夌骇, 寮哄寲鐔熺粌搴
                         if (IudetDogzEquipPlus == null)
                         {
@@ -116,8 +161,8 @@
                         {
                             godBeastClass.GodBeastLv = IudetDogzEquipPlus[0];
                             godBeastClass.GodBeasProficiency = IudetDogzEquipPlus[1];
-                        }                                  
-                        godBeastClass.LocationMarker=itemModel[i].EquipPlace*100+key;
+                        }
+                        godBeastClass.LocationMarker = itemModel[i].EquipPlace * 100 + key;
                         GodBeastList.Add(godBeastClass);
                     }
                 }
@@ -177,19 +222,34 @@
             int locationMarker = cell.index;
             godBeastEntry.GetGodBeastLocationMarker(locationMarker, CurrentlySelected);
             godBeastEntry.GodBeastButton.RemoveAllListeners();
-            godBeastEntry.GodBeastButton.AddListener(()=> 
+            godBeastEntry.GodBeastButton.AddListener(() =>
             {
                 if (locationMarker != CurrentlySelected)
                 {
                     CurrentlySelected = locationMarker;
+                    GetDogZBagIndex();
                     m_ScrollerController.m_Scorller.RefreshActiveCellViews();//鍒锋柊鍙
                     if (ChooseToModify != null)
                     {
                         ChooseToModify(CurrentlySelected);
                     }
-                }             
+                }
             });
         }
+
+        private void GetDogZBagIndex()//鑾峰彇閫夋嫨鐨勭鍏借澶囩殑瑁呭涓嬫爣
+        {
+            for (int i = 0; i < GodBeastList.Count; i++)
+            {
+                if (CurrentlySelected == GodBeastList[i].LocationMarker)
+                {
+                    godBeastModel.DogZBagIndex = GodBeastList[i].ItemPlace;
+                   // DebugEx.LogError(godBeastModel.DogZBagIndex);
+                    return;
+                }
+            }
+
+        }
     }
 
 }
diff --git a/System/Strengthening/WashTips.cs b/System/Strengthening/WashTips.cs
index 3883b45..66b73f8 100644
--- a/System/Strengthening/WashTips.cs
+++ b/System/Strengthening/WashTips.cs
@@ -490,7 +490,15 @@
                 {
                     if (equipWashModel.IsWashFull(_itemModel, _washProModel, _tagWashModel))
                     {
-                        _washFullLvText.text = Language.Get("EquipWash113", _itemModel.chinItemModel.LV, equipWashModel.GetWashFullLv(_itemModel.chinItemModel.LV));
+                        if(_washProModel.XLAttrLV  >= equipWashModel.GetMaxWashLv()
+                            && _washProModel.XLAttrLV <= equipWashModel.GetWashFullLv(_itemModel.chinItemModel.LV))
+                        {
+                            _washFullLvText.text = Language.Get("WashLevelFulled");
+                        }
+                        else
+                        {
+                            _washFullLvText.text = Language.Get("EquipWash113", _itemModel.chinItemModel.LV, equipWashModel.GetWashFullLv(_itemModel.chinItemModel.LV));
+                        }
                         ObjHideOrShow(false, false, false, false, true);
                     }
                     else
@@ -532,6 +540,8 @@
                 ObjHideOrShow(false, false, false, false, true);
 
             }
+
+
         }
         else
         {
diff --git a/System/Strengthening/WingsRefined.cs b/System/Strengthening/WingsRefined.cs
index a2892f5..4a758d6 100644
--- a/System/Strengthening/WingsRefined.cs
+++ b/System/Strengthening/WingsRefined.cs
@@ -134,7 +134,7 @@
         PlusNum1.gameObject.SetActive(false);
         PlusNum2.gameObject.SetActive(false);
         StopCoroutine("AkeyRefining");
-        UI3DModelExhibition.Instance.StopShowWing();
+        UI3DModelExhibition.Instance.StopShow();
         // RoleCameraCtrl.GetInstance().OnDestroyModel();
         playerPack.RefreshPackAct -= ItemsToRefresh;//鑳屽寘鐗╁搧鍒锋柊
         playerPack.ItemCntReduceAct -= BackpackRefresh;//鑳屽寘鐗╁搧娓呯悊
@@ -592,7 +592,7 @@
         _wingRawImage.gameObject.SetActive(true);
         var config = Config.Instance.Get<WingRefineExpConfig>((int)itemModel.itemInfo.ItemID);
         int _modelID = config.Model;
-        UI3DModelExhibition.Instance.BeginShowWing(_modelID, Vec, _wingRawImage);
+        UI3DModelExhibition.Instance.ShowWing(_modelID, Vec, _wingRawImage);
     }
 
 
diff --git a/System/SystemSetting/ActivityPushCell.cs b/System/SystemSetting/ActivityPushCell.cs
index a725677..3481223 100644
--- a/System/SystemSetting/ActivityPushCell.cs
+++ b/System/SystemSetting/ActivityPushCell.cs
@@ -12,20 +12,22 @@
         [SerializeField] GameObject bgObj;
 
         SetPrivateModel privateModel { get { return ModelCenter.Instance.GetModel<SetPrivateModel>(); } }
+        DailyQuestModel dailyQuestModel { get { return ModelCenter.Instance.GetModel<DailyQuestModel>(); } }
 
         public void SetModel(int dailyId)
         {
             string title = "";
             string weekDay = "";
             string openTime = "";
-            privateModel.GetDailyInfoById(dailyId,out title,out weekDay,out openTime);
+            privateModel.GetDailyInfoById(dailyId, out title, out weekDay, out openTime);
             nameText.text = title;
             weekDayText.text = weekDay;
             timeText.text = openTime;
-            int index = privateModel.GetSwitchIndexById(dailyId);
-            pushBtn.SetInit(index,privateModel.GetSwitchStateByIndex(index));
-            pushBtn.switchBtn.RemoveAllListeners();
-            pushBtn.switchBtn.AddListener(() =>
+
+            var quests = dailyQuestModel.GetDailyQuests(DailyQuestModel.DailyQuestCategory.TimeLimit);
+            int index = privateModel.GetSwitchIndexById(dailyId, quests);
+            pushBtn.SetInit(index, privateModel.GetSwitchStateByIndex(index));
+            pushBtn.switchBtn.SetListener(() =>
             {
                 if (pushBtn.onObj.activeInHierarchy)
                 {
@@ -41,14 +43,7 @@
                 }
             });
 
-            if(this.index % 2 == 0)
-            {
-                bgObj.SetActive(true);
-            }
-            else
-            {
-                bgObj.SetActive(false);
-            }
+            bgObj.SetActive(this.index % 2 == 0);
         }
     }
 }
diff --git a/System/SystemSetting/SetPrivateModel.cs b/System/SystemSetting/SetPrivateModel.cs
index 5fae90a..dde2b51 100644
--- a/System/SystemSetting/SetPrivateModel.cs
+++ b/System/SystemSetting/SetPrivateModel.cs
@@ -9,11 +9,7 @@
 {
     public class SetPrivateModel : Model, IBeforePlayerDataInitialize, IAfterPlayerDataInitialize, IPlayerLoginOk
     {
-        DailyQuestModel m_dailyModel;
-        DailyQuestModel dailyModel
-        {
-            get { return m_dailyModel ?? (m_dailyModel = ModelCenter.Instance.GetModel<DailyQuestModel>()); }
-        }
+        DailyQuestModel dailyModel { get { return ModelCenter.Instance.GetModel<DailyQuestModel>(); } }
         VipModel vipModel { get { return ModelCenter.Instance.GetModel<VipModel>(); } }
 
         public List<int> hangUpPushlist = new List<int>();
@@ -146,7 +142,7 @@
             List<int> dailyIdlist = GetOpenDailyIdlist(true);
             for (int i = 0; i < dailyIdlist.Count; i++)
             {
-                bool isOpen = GetSwitchStateByIndex(GetSwitchIndexById(dailyIdlist[i]));
+                bool isOpen = GetSwitchStateByIndex(GetSwitchIndexById(dailyIdlist[i], dailyIdlist));
                 if (isOpen)
                 {
                     List<JsonData> pushNotifylist = GetPushJsonData(dailyIdlist[i]);
@@ -459,9 +455,8 @@
             }
         }
 
-        public int GetSwitchIndexById(int id)
+        public int GetSwitchIndexById(int id, List<int> quests)
         {
-            var quests = dailyModel.GetDailyQuests(DailyQuestModel.DailyQuestCategory.TimeLimit);
             for (int i = 0; i < quests.Count; i++)
             {
                 if (quests[i] == id)
@@ -513,15 +508,17 @@
 
         private void RefreshDailyQuest()
         {
-            foreach (var dailyQuest in dailyModel.GetDailyQuestlist().Values)
+            var quests = dailyModel.GetDailyQuests(DailyQuestModel.DailyQuestCategory.TimeLimit);
+            foreach (var dailyQuest in dailyModel.GetDailyQuests())
             {
-                var isUnLocked = TestDailyQuestUnLock(dailyQuest.id);
+                var isUnLocked = TestDailyQuestUnLock(dailyQuest);
                 if (isUnLocked)
                 {
-                    ModelCenter.Instance.GetModel<SetPrivateModel>().CheckActivityOpenTime(dailyQuest.id);
+                    CheckActivityOpenTime(dailyQuest, quests);
                 }
             }
         }
+
         public bool TestDailyQuestUnLock(int _dailyQuestId)
         {
             switch ((DailyQuestType)_dailyQuestId)
@@ -541,9 +538,11 @@
         }
 
 
-        public void CheckActivityOpenTime(int dailyId)
+        public void CheckActivityOpenTime(int dailyId, List<int> quests)
         {
-            bool isOpen = GetSwitchStateByIndex(GetSwitchIndexById(dailyId));
+
+            bool isOpen = GetSwitchStateByIndex(GetSwitchIndexById(dailyId, quests));
+
             if (!isOpen)
                 return;
 
diff --git a/System/Team/TeamModel.cs b/System/Team/TeamModel.cs
index a652817..90ea8d6 100644
--- a/System/Team/TeamModel.cs
+++ b/System/Team/TeamModel.cs
@@ -563,7 +563,7 @@
             }
 
             var minLevel = 1;
-            var maxLevel = 1;
+            var maxLevel = GeneralConfig.Instance.playerMaxLevel;
 
             if (_mission != myTeam.mission)
             {
@@ -580,8 +580,11 @@
                 {
                     var dungeonId = ModelCenter.Instance.GetModel<DungeonModel>().GetDungeonId(_mission.mapId, _mission.mapEx);
                     var dungeonConfig = Config.Instance.Get<DungeonConfig>(dungeonId);
-                    minLevel = dungeonConfig.LVLimitMin;
-                    maxLevel = dungeonConfig.LVLimitMax;
+                    if (dungeonConfig != null)
+                    {
+                        minLevel = dungeonConfig.LVLimitMin;
+                        maxLevel = dungeonConfig.LVLimitMax;
+                    }
                 }
 
                 missionBuf = _mission;
diff --git a/System/Treasure/DragSelectComponent.cs b/System/Treasure/DragSelectComponent.cs
index 36ca0a6..be074fa 100644
--- a/System/Treasure/DragSelectComponent.cs
+++ b/System/Treasure/DragSelectComponent.cs
@@ -24,7 +24,8 @@
             if (Input.touchCount > 1 || NewBieCenter.Instance.inGuiding
                 || WindowCenter.Instance.CheckOpen<TreasureNewStageWin>()
                 || WindowCenter.Instance.CheckOpen<PotentialItemUseWin>()
-                || WindowCenter.Instance.CheckOpen<TreasureSoulActiveWin>())
+                || WindowCenter.Instance.CheckOpen<TreasureSoulActiveWin>()
+                || WindowCenter.Instance.CheckOpen<GetItemPathWin>())
             {
                 m_StartDrag = false;
                 return;
diff --git a/System/Treasure/FairyTreasureCollectPanelPattern5.cs b/System/Treasure/FairyTreasureCollectPanelPattern5.cs
index 8fe4798..573f938 100644
--- a/System/Treasure/FairyTreasureCollectPanelPattern5.cs
+++ b/System/Treasure/FairyTreasureCollectPanelPattern5.cs
@@ -276,32 +276,43 @@
             GetCurrentAchievement();
             if (treasure.state != TreasureState.Collected)
             {
-                int unlocktreasureId = 0;
-                var list = model.GetTreasureCategory(TreasureCategory.Human);
-                for (int i = 0; i < list.Count; i++)
+                //int unlocktreasureId = 0;
+                //var list = model.GetTreasureCategory(TreasureCategory.Human);
+                //for (int i = 0; i < list.Count; i++)
+                //{
+                //    Treasure _treasure;
+                //    if(model.TryGetTreasure(list[i], out _treasure))
+                //    {
+                //        var index = _treasure.treasureStages.FindIndex((x) =>
+                //        {
+                //            return x.unlockType == TreasureStageUnlock.Treasure && x.treasure == treasure.id;
+                //        });
+                //        if (index != -1)
+                //        {
+                //            unlocktreasureId = list[i];
+                //            break;
+                //        }
+                //    }
+                //}
+
+                //var unlockTreasureConfig = Config.Instance.Get<TreasureConfig>(unlocktreasureId);
+
+                var config = Config.Instance.Get<TreasureConfig>(treasure.id);
+                var requireCondition = 0;
+                if (config != null)
                 {
-                    Treasure _treasure;
-                    if(model.TryGetTreasure(list[i], out _treasure))
+                    var successConfig = Config.Instance.Get<SuccessConfig>(config.Achievements.Length > 0 ? config.Achievements[0] : 0);
+                    if (successConfig != null)
                     {
-                        var index = _treasure.treasureStages.FindIndex((x) =>
-                        {
-                            return x.unlockType == TreasureStageUnlock.Treasure && x.treasure == treasure.id;
-                        });
-                        if (index != -1)
-                        {
-                            unlocktreasureId = list[i];
-                            break;
-                        }
+                        requireCondition = successConfig.NeedCnt;
                     }
                 }
-
-                var unlockTreasureConfig = Config.Instance.Get<TreasureConfig>(unlocktreasureId);
 
                 m_AchievementGetBtn.gameObject.SetActive(false);
                 m_ActiveBtn.gameObject.SetActive(false);
                 m_GotoGet.gameObject.SetActive(false);
                 m_ContainerLocked.gameObject.SetActive(true);
-                m_LockedDescription.text = Language.Get("BlastFurnaceGet", unlockTreasureConfig == null ? string.Empty : unlockTreasureConfig.Name);
+                m_LockedDescription.text = Language.Get("BlastFurnaceGet", requireCondition);
                 m_ContainerAchievement.gameObject.SetActive(false);
             }
             else if (currentAchievement == null || treasure.stage >= 1)
diff --git a/System/Treasure/PotentialItemBehaviour.cs b/System/Treasure/PotentialItemBehaviour.cs
index a569f2e..6e33d1f 100644
--- a/System/Treasure/PotentialItemBehaviour.cs
+++ b/System/Treasure/PotentialItemBehaviour.cs
@@ -51,9 +51,9 @@
             m_ItemBehaviour.SetItem(potentialBook.itemId, 1);
             m_CostCount.text = StringUtility.Contact(own, "/", need);
             m_CostCount.color = own >= need ? UIHelper.GetUIColor(TextColType.White) : UIHelper.GetUIColor(TextColType.Red);
-            m_Click.interactable = own >= need;
+            //m_Click.interactable = own >= need;
             m_AddBtnText.color = own >= need ? UIHelper.GetUIColor(TextColType.NavyBrown) : UIHelper.GetUIColor(TextColType.White);
-            m_Click.image.material = own >= need ? m_SmoothMask.imageMaterials[0] : m_SmoothMask.imageMaterials[1];
+            //m_Click.image.material = own >= need ? m_SmoothMask.imageMaterials[0] : m_SmoothMask.imageMaterials[1];
             var config = Config.Instance.Get<TreasureSkillConfig>(potentialBook.levelUpId);
             var upRate = potentialBook.successRate - config.InitialRate;
             m_SuccessRatio.text = Language.Get("HallowsWin_UpSuccess", StringUtility.Contact((upRate * 0.01f).ToString("f0"), "%"));
@@ -61,15 +61,15 @@
 
         private void SelectPotentialBook()
         {
-            if (own >= need)
-            {
+            //if (own >= need)
+            //{
                 model.selectedPotentialBook = potentialBook.itemId;
                 WindowCenter.Instance.Close<PotentialItemUseWin>();
-            }
-            else
-            {
-                SysNotifyMgr.Instance.ShowTip("SPItemNotEnough");
-            }
+            //}
+            //else
+            //{
+            //    SysNotifyMgr.Instance.ShowTip("SPItemNotEnough");
+            //}
         }
 
         private void Awake()
diff --git a/System/Treasure/TreasureModel.cs b/System/Treasure/TreasureModel.cs
index 3578b34..c332573 100644
--- a/System/Treasure/TreasureModel.cs
+++ b/System/Treasure/TreasureModel.cs
@@ -17,7 +17,6 @@
         public const int TREASURE_DATAMAPID = 41110;
         public const int TREASURE_MAPID = 41110;
         public const int TREASURE_GUIDE_ID = 102;
-        public const int TREASURE_SOUL_ID = 115;
 
         const int TREASURE_REDPOINTID = 7000;
         readonly static int[] CATEGORY_REDPOINTIDS = { 7001, 7002, 7003, 7004, 7005 };
@@ -33,7 +32,6 @@
         Redpoint zergRedpoint = new Redpoint(TREASURE_REDPOINTID, CATEGORY_REDPOINTIDS[(int)TreasureCategory.Zerg - 1]);
 
         public Redpoint stoveRedpoint = new Redpoint(CATEGORY_REDPOINTIDS[(int)TreasureCategory.Fairy - 1], 7200);
-        public Redpoint treasureSoulRedpoint = new Redpoint(1, TREASURE_SOUL_ID);
 
         public event Action<int> treasureCollectProgressUpdateEvent;
         public event Action<int> treasureSelectedEvent;
diff --git a/System/Treasure/TreasurePotentialBriefInfo.cs b/System/Treasure/TreasurePotentialBriefInfo.cs
index 57414d2..7e004c9 100644
--- a/System/Treasure/TreasurePotentialBriefInfo.cs
+++ b/System/Treasure/TreasurePotentialBriefInfo.cs
@@ -80,7 +80,7 @@
 
         private void SelectPotential()
         {
-            if (potential == null || !model.IsPotentialUnlock(model.selectedTreasure, potential.id))
+            if (potential == null/* || !model.IsPotentialUnlock(model.selectedTreasure, potential.id)*/)
             {
                 return;
             }
diff --git a/System/Treasure/TreasurePotentialPanel.cs b/System/Treasure/TreasurePotentialPanel.cs
index 042fc48..4a83448 100644
--- a/System/Treasure/TreasurePotentialPanel.cs
+++ b/System/Treasure/TreasurePotentialPanel.cs
@@ -84,7 +84,8 @@
                     var level = potential.level;
                     var isMax = level >= config.SkillMaxLV;
                     m_PotentialMaxLevelTip.gameObject.SetActive(isMax);
-                    m_ContainerUpgrade.gameObject.SetActive(!isMax && FuncOpen.Instance.IsFuncOpen(82));
+                    m_ContainerUpgrade.gameObject.SetActive(!isMax &&
+                        FuncOpen.Instance.IsFuncOpen(82) && model.IsPotentialUnlock(m_Treasure.id, selectedPotential));
                     m_ContainerRequirement.gameObject.SetActive(!isMax);
 
                     if (!isMax)
@@ -93,7 +94,6 @@
                         DisplayUpgradeCost();
                         DisplayGetSkill();
                         DisplaySuccessRatio();
-                        m_UpgradeImage.gray = !TestPotentialLevelUp();
                     }
                     else
                     {
@@ -526,13 +526,18 @@
             {
                 return;
             }
+            if (config.InitialRate >= 100)
+            {
+                model.selectedPotentialBook = 0;
+                return;
+            }
             var itemId = config.Meterial2ID.Length > 0 ? config.Meterial2ID[0] : 0;
             if (itemId != 0)
             {
-                var own = playerPack.GetItemCountByID(PackType.rptItem, itemId);
-                var need = config.MeterialNum2[0];
+                //var own = playerPack.GetItemCountByID(PackType.rptItem, itemId);
+                //var need = config.MeterialNum2[0];
                 var rate = config.Rate[0];
-                if (rate >= 60 && own >= need)
+                if (rate >= 60)
                 {
                     model.selectedPotentialBook = itemId;
                 }
@@ -550,7 +555,6 @@
             m_SPOwn.text = UIHelper.ReplaceLargeNum(spOwn);
             m_SPNeed.text = StringUtility.Contact("/", UIHelper.ReplaceLargeNum(spNeed));
             m_SPOwn.color = spOwn >= spNeed ? UIHelper.GetUIColor(TextColType.DarkGreen) : UIHelper.GetUIColor(TextColType.Red);
-            m_UpgradeImage.gray = spOwn < spNeed;
         }
 
         private void DisplayGetSkill(bool _levelUp = false)
@@ -591,9 +595,11 @@
         {
             var levelUpConfig = GetPotentialLevelUpConfig();
             m_SuccessRatio.text = StringUtility.Contact((levelUpConfig.rate * 0.01f).ToString("f0"), "%");
-            m_RatioUp.gameObject.SetActive(model.selectedPotentialBook != 0);
-            m_SuccessRatio.color = UIHelper.GetUIColor(model.selectedPotentialBook != 0 ? TextColType.DarkGreen : TextColType.LightYellow);
-            m_UpgradeImage.gray = !TestPotentialLevelUp();
+            m_RatioUp.gameObject.SetActive(model.selectedPotentialBook != 0 && levelUpConfig.rate > 0 && levelUpConfig.materilaKind > 1);
+            m_SuccessRatio.color = UIHelper.GetUIColor(model.selectedPotentialBook != 0 && levelUpConfig.rate > 0
+                ? TextColType.DarkGreen : TextColType.LightYellow);
+            m_UpgradeImage.gray = levelUpConfig.rate == 0 && model.selectedPotentialBook == 0;
+            m_Upgrade.interactable = levelUpConfig.rate != 0 || model.selectedPotentialBook != 0;
         }
 
         private void DisplayAddBookRedpoint()
@@ -616,14 +622,25 @@
         private void OnSpNeedItem()
         {
             var levelUpConfig = GetPotentialLevelUpConfig();
-            if (levelUpConfig.rate < 10000 || model.selectedPotentialBook != 0)
+            if (levelUpConfig.rate >= 10000)
+            {
+                SysNotifyMgr.Instance.ShowTip("SPSuccessHint");
+                return;
+            }
+            if (model.selectedPotentialBook == 0)
             {
                 WindowCenter.Instance.Open<PotentialItemUseWin>();
             }
             else
             {
-                SysNotifyMgr.Instance.ShowTip("SPSuccessHint");
-                //DesignDebug.Log("鎴愬姛鐜囧凡缁忓楂樹簡锛屼笉闇�瑕佸啀澧炲姞姒傜巼浜嗭紒");
+                if (levelUpConfig.materilaKind > 1)
+                {
+                    WindowCenter.Instance.Open<PotentialItemUseWin>();
+                }
+                else
+                {
+                    ModelCenter.Instance.GetModel<GetItemPathModel>().SetChinItemModel(model.selectedPotentialBook);
+                }
             }
         }
 
@@ -636,7 +653,7 @@
         {
             m_PotentialBook.gameObject.SetActive(_potentialBookId != 0);
             m_PotentialCount.gameObject.SetActive(_potentialBookId != 0);
-            m_RemoveBook.gameObject.SetActive(_potentialBookId != 0);
+            m_RemoveBook.gameObject.SetActive(false);
             m_AddBookSign.gameObject.SetActive(_potentialBookId == 0);
             if (_potentialBookId != 0)
             {
@@ -644,7 +661,10 @@
                 m_PotentialBook.SetItem(_potentialBookId, 1);
 
                 var levelUpConfig = GetPotentialLevelUpConfig();
-                m_PotentialCount.text = StringUtility.Contact(levelUpConfig.own, "/", levelUpConfig.need);
+                bool satisfy = levelUpConfig.own >= levelUpConfig.need;
+                m_PotentialCount.text = StringUtility.Contact(UIHelper.GetTextColorByItemColor(satisfy ?
+                    TextColType.LightYellow : TextColType.Red, levelUpConfig.own.ToString()), "/", levelUpConfig.need);
+                m_RemoveBook.gameObject.SetActive(levelUpConfig.materilaKind > 1);
             }
 
             DisplaySuccessRatio();
@@ -657,10 +677,14 @@
             if (packType == PackType.rptItem && config != null && config.Type == 6)
             {
                 var levelUpConfig = GetPotentialLevelUpConfig();
-                if (levelUpConfig.own < levelUpConfig.need)
+                if (_id == model.selectedPotentialBook)
                 {
-                    model.selectedPotentialBook = 0;
+                    DisplayPotentialBook(model.selectedPotentialBook);
                 }
+                //if (levelUpConfig.own < levelUpConfig.need)
+                //{
+                //    model.selectedPotentialBook = 0;
+                //}
             }
         }
 
@@ -687,13 +711,21 @@
                         }
                         break;
                     case 3:
-                        MessageWin.Inst.ShowFixedTip(Language.Get("Hallows_SpUnEnough"));
+                        ModelCenter.Instance.GetModel<GetItemPathModel>().SetChinItemModel(148);
+                        //MessageWin.Inst.ShowFixedTip(Language.Get("Hallows_SpUnEnough"));
                         break;
                     case 4:
                         SysNotifyMgr.Instance.ShowTip("TreasureUnsealed");
                         break;
                     case 6:
-                        SysNotifyMgr.Instance.ShowTip("LevelUpZeroRate");
+                        if (model.selectedPotentialBook != 0)
+                        {
+                            ModelCenter.Instance.GetModel<GetItemPathModel>().SetChinItemModel(model.selectedPotentialBook);
+                        }
+                        else
+                        {
+                            SysNotifyMgr.Instance.ShowTip("LevelUpZeroRate");
+                        }
                         break;
                 }
 
@@ -742,11 +774,11 @@
             var config = Config.Instance.Get<TreasureSkillConfig>(levelupId);
             if (config == null)
             {
-                return new PotentialLevelUpConfig(0, 0, 0, 0);
+                return new PotentialLevelUpConfig(0, 0, 0, 0, 0);
             }
             if (model.selectedPotentialBook == 0)
             {
-                return new PotentialLevelUpConfig(config.InitialRate, 0, 0, 0);
+                return new PotentialLevelUpConfig(config.InitialRate, 0, 0, 0, 0);
             }
             else
             {
@@ -764,7 +796,7 @@
                 var need = config.MeterialNum2[index];
                 var ratio = own >= need ? config.Rate[index] : config.InitialRate;
 
-                return new PotentialLevelUpConfig(ratio, index + 1, own, need);
+                return new PotentialLevelUpConfig(ratio, index + 1, own, need, config.Meterial2ID.Length);
             }
         }
 
@@ -840,9 +872,10 @@
             }
 
             var levelUpConfig = GetPotentialLevelUpConfig();
-            if (levelUpConfig.own < levelUpConfig.need || !ContainsPotentialBook(model.selectedPotentialBook))
+            if (!ContainsPotentialBook(model.selectedPotentialBook))
             {
-                model.selectedPotentialBook = 0;
+                AutoSelectPotentialBook();
+                //model.selectedPotentialBook = 0;
             }
 
             var curconfig = Config.Instance.Get<SkillConfig>(potential.id);
@@ -924,7 +957,6 @@
                     m_SPOwn.text = UIHelper.ReplaceLargeNum(spOwn);
                     m_SPNeed.text = StringUtility.Contact("/", UIHelper.ReplaceLargeNum(spNeed));
                     m_SPOwn.color = spOwn >= spNeed ? UIHelper.GetUIColor(TextColType.DarkGreen) : UIHelper.GetUIColor(TextColType.Red);
-                    m_UpgradeImage.gray = !TestPotentialLevelUp();
                     break;
             }
         }
@@ -1030,13 +1062,15 @@
             public int rate;
             public int need;
             public int own;
+            public int materilaKind;
 
-            public PotentialLevelUpConfig(int _rate, int _materilaIndex, int _own, int _need)
+            public PotentialLevelUpConfig(int _rate, int _materilaIndex, int _own, int _need,int materilaKind)
             {
                 this.rate = _rate;
                 this.materilaIndex = _materilaIndex;
                 this.need = _need;
                 this.own = _own;
+                this.materilaKind = materilaKind;
             }
         }
         [Serializable]
diff --git a/System/Treasure/TreasureSoulModel.cs b/System/Treasure/TreasureSoulModel.cs
index 0b6bace..9ad7298 100644
--- a/System/Treasure/TreasureSoulModel.cs
+++ b/System/Treasure/TreasureSoulModel.cs
@@ -8,6 +8,10 @@
 {
     public class TreasureSoulModel : Model, IBeforePlayerDataInitialize, IPlayerLoginOk
     {
+        public const int TREASURE_SOUL_ID = 115;
+        Redpoint treasureSoulRedpoint = new Redpoint(1, TREASURE_SOUL_ID);
+        Redpoint treasureSoulNewGotRedpoint = new Redpoint(TREASURE_SOUL_ID, 115100);
+
         Dictionary<int, TreasureSpecialData> treasureSoulDict = new Dictionary<int, TreasureSpecialData>();
         List<int> treasureSouls = new List<int>();
         public Dictionary<int, int> signAddProperty = new Dictionary<int, int>();
@@ -32,6 +36,8 @@
 
         public int gotoSoul { get; set; }
 
+        public int newGotSoul { get; set; }
+
         public bool serverInited { get; private set; }
 
         PlayerPackModel packModel { get { return ModelCenter.Instance.GetModel<PlayerPackModel>(); } }
@@ -41,6 +47,7 @@
         {
             packModel.RefreshItemCountAct += RefreshItemCountAct;
             PlayerStrengthengDatas.RefreshEquipUpgradLvAct += RefreshEquipSTRLv;
+            FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
             ParseConfig();
         }
 
@@ -54,6 +61,7 @@
                 special.itemGet = false;
                 special.active = false;
             }
+            treasureSoulNewGotRedpoint.state = RedPointState.None;
         }
 
         public void OnPlayerLoginOk()
@@ -66,6 +74,7 @@
         {
             packModel.RefreshItemCountAct -= RefreshItemCountAct;
             PlayerStrengthengDatas.RefreshEquipUpgradLvAct -= RefreshEquipSTRLv;
+            FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
         }
 
         void ParseConfig()
@@ -88,6 +97,11 @@
             {
                 signAddProperty.Add(int.Parse(_key), int.Parse(jsonData[_key].ToString()));
             }
+        }
+
+        public void SetViewTreasureNewGot()
+        {
+            treasureSoulNewGotRedpoint.state = RedPointState.None;
         }
 
         public List<int> GetTreasureSouls()
@@ -152,6 +166,14 @@
             }
         }
 
+        private void OnFuncStateChangeEvent(int func)
+        {
+            if (func == 126)
+            {
+                UpdateRedpoints();
+            }
+        }
+
         public void UpdateTreasurePrivilege(HA353_tagMCMWPrivilegeDataInfo package)
         {
             for (int i = 0; i < package.Count; i++)
@@ -164,12 +186,12 @@
                 }
                 bool beforeActived = special.active;
                 special.active = _data.State == 1;
-                //if (!beforeActived && special.active && serverInited && WindowCenter.Instance.CheckOpen<TreasureSoulWin>()
-                //    && !WindowCenter.Instance.CheckOpen<TreasureSoulActiveWin>() && !NewBieCenter.Instance.inGuiding)
-                //{
-                //    TreasureSoulActiveWin.treasureSoulId = (int)_data.PriID;
-                //    WindowCenter.Instance.Open<TreasureSoulActiveWin>();
-                //}
+                if (!beforeActived && special.active && serverInited
+                    && !WindowCenter.Instance.CheckOpen<TreasureSoulWin>())
+                {
+                    treasureSoulNewGotRedpoint.state = RedPointState.Simple;
+                    newGotSoul = (int)_data.PriID;
+                }
                 if ((TreasurePrivilege)_data.PriID == TreasurePrivilege.StrengthenAdd)
                 {
                     if (treasureSoulEvent != null)
@@ -363,7 +385,7 @@
                 totalProgress = configs[configs.Count - 1].countNeed;
             }
 
-            redpoint = new Redpoint(TreasureModel.TREASURE_SOUL_ID, TreasureModel.TREASURE_SOUL_ID * 100 + (int)type);
+            redpoint = new Redpoint(TreasureSoulModel.TREASURE_SOUL_ID, TreasureSoulModel.TREASURE_SOUL_ID * 100 + (int)type);
             switch (_type)
             {
                 case TreasurePrivilege.DemonJarAtk:
diff --git a/System/Treasure/TreasureSoulWin.cs b/System/Treasure/TreasureSoulWin.cs
index 0285684..98c492f 100644
--- a/System/Treasure/TreasureSoulWin.cs
+++ b/System/Treasure/TreasureSoulWin.cs
@@ -83,6 +83,7 @@
             model.treasureSoulEvent += TreasureSoulEvent;
             m_TreasureSoulBtn.state = TitleBtnState.Click;
             Display();
+            model.SetViewTreasureNewGot();
         }
 
         protected override void OnActived()
@@ -113,6 +114,7 @@
                 m_TreasureSouls[i].Dispose();
             }
             m_SelectSoul = model.selectSoul;
+            model.newGotSoul = 0;
         }
 
         protected override void OnAfterClose()
@@ -179,6 +181,11 @@
                     _select = sortSouls[i];
                 }
             }
+            if (model.newGotSoul != 0 && sortSouls.Contains(model.newGotSoul))
+            {
+                _select = model.newGotSoul;
+                model.newGotSoul = 0;
+            }
             _select = _select == 0 ? sortSouls[0] : _select;
             return _select;
         }
diff --git a/System/Vip/FirstChargeTrialWin.cs b/System/Vip/FirstChargeTrialWin.cs
index 889ac59..0d864a3 100644
--- a/System/Vip/FirstChargeTrialWin.cs
+++ b/System/Vip/FirstChargeTrialWin.cs
@@ -69,7 +69,7 @@
             {
                 int _weaponId = firstTimeRechargeModel.TryOutDic[job];
                 var config = Config.Instance.Get<ItemConfig>(_weaponId);
-                UI3DModelExhibition.Instance.BeginShowEquipment(config.ChangeOrd, _angle, _rawImage);
+                UI3DModelExhibition.Instance.ShowEquipment(config.ChangeOrd, _angle, _rawImage);
                 ItemCellModel ItemModel = new ItemCellModel(_weaponId,true,0,1);
                 m_ItemCell.Init(ItemModel);
                 m_ItemCell.cellBtn.RemoveAllListeners();
diff --git a/System/Vip/FirstRechargeWin.cs b/System/Vip/FirstRechargeWin.cs
index 91ad1f8..7f144a9 100644
--- a/System/Vip/FirstRechargeWin.cs
+++ b/System/Vip/FirstRechargeWin.cs
@@ -104,7 +104,7 @@
         {
             model.firstChargeRewardEvent -= UpdateButtonState;
             PlayerDatas.Instance.PlayerDataRefreshInfoEvent -= PlayerDataRefreshInfoEvent;
-            UI3DModelExhibition.Instance.StopShowEquipment();
+            UI3DModelExhibition.Instance.StopShow();
         }
 
         protected override void OnAfterClose()
@@ -205,7 +205,7 @@
                 }
             }
             var config = Config.Instance.Get<ItemConfig>(_weaponId);
-            UI3DModelExhibition.Instance.BeginShowEquipment(config.ChangeOrd, _angle, _rawImage);
+            UI3DModelExhibition.Instance.ShowEquipment(config.ChangeOrd, _angle, _rawImage);
         }
     }
 
diff --git a/System/Vip/FirstTimeRechargeWin.cs b/System/Vip/FirstTimeRechargeWin.cs
index 5644ce4..11eacfe 100644
--- a/System/Vip/FirstTimeRechargeWin.cs
+++ b/System/Vip/FirstTimeRechargeWin.cs
@@ -78,7 +78,7 @@
             }
             else
             {
-                UI3DModelExhibition.Instance.StopShowEquipment();
+                UI3DModelExhibition.Instance.StopShow();
                 m_RewardInformationImage.SetActive(false);
             }
 
@@ -89,13 +89,13 @@
                 {
                     m_RawImageBoy.gameObject.SetActive(true);
                     m_RawImageGirl.gameObject.SetActive(false);
-                    UI3DModelExhibition.Instance.BeginShowEquipment(itemConfig.ChangeOrd, Vec3, m_RawImageBoy);
+                    UI3DModelExhibition.Instance.ShowEquipment(itemConfig.ChangeOrd, Vec3, m_RawImageBoy);
                 }
                 else
                 {
                     m_RawImageBoy.gameObject.SetActive(false);
                     m_RawImageGirl.gameObject.SetActive(true);
-                    UI3DModelExhibition.Instance.BeginShowEquipment(itemConfig.ChangeOrd, Vec3, m_RawImageGirl);
+                    UI3DModelExhibition.Instance.ShowEquipment(itemConfig.ChangeOrd, Vec3, m_RawImageGirl);
                 }
             }
 
@@ -108,7 +108,7 @@
 
         protected override void OnPreClose()
         {
-            UI3DModelExhibition.Instance.StopShowEquipment();
+            UI3DModelExhibition.Instance.StopShow();
             MainInterfaceWin.IsCopyOfThePanel -= IsCopyOfThePanel;
             FirstTimeRechargeModel.FirstTimeRechargeTiime -= FirstTimeRechargeTiime;
             FirstTimeRechargeModel.FirstTimeRecharEffect -= FirstTimeRecharEffect;
@@ -143,25 +143,25 @@
                     {
                         m_RawImageBoy.gameObject.SetActive(true);
                         m_RawImageGirl.gameObject.SetActive(false);
-                        UI3DModelExhibition.Instance.BeginShowEquipment(itemConfig.ChangeOrd, Vec3, m_RawImageBoy);
+                        UI3DModelExhibition.Instance.ShowEquipment(itemConfig.ChangeOrd, Vec3, m_RawImageBoy);
                     }
                     else
                     {
                         m_RawImageBoy.gameObject.SetActive(false);
                         m_RawImageGirl.gameObject.SetActive(true);
-                        UI3DModelExhibition.Instance.BeginShowEquipment(itemConfig.ChangeOrd, Vec3, m_RawImageGirl);
+                        UI3DModelExhibition.Instance.ShowEquipment(itemConfig.ChangeOrd, Vec3, m_RawImageGirl);
                     }
 
                 }
                 else
                 {
-                    UI3DModelExhibition.Instance.StopShowEquipment();
+                    UI3DModelExhibition.Instance.StopShow();
                     m_RewardInformationImage.SetActive(false);
                 }
             }
             else
             {
-                UI3DModelExhibition.Instance.StopShowEquipment();
+                UI3DModelExhibition.Instance.StopShow();
                 m_RewardInformationImage.SetActive(false);
             }
         }
@@ -174,18 +174,18 @@
         {
             LocalSave.SetBool("FirstTimeRechargeBool", false);
             m_RewardInformationImage.SetActive(false);
-            UI3DModelExhibition.Instance.StopShowEquipment();
+            UI3DModelExhibition.Instance.StopShow();
         }
         private void OnClickFirstFlush()
         {
             LocalSave.SetBool("FirstTimeRechargeBool", false);
-            UI3DModelExhibition.Instance.StopShowEquipment();
+            UI3DModelExhibition.Instance.StopShow();
             m_RewardInformationImage.SetActive(false);
             if (WindowCenter.Instance.CheckOpen<MainInterfaceWin>() && !NewBieCenter.Instance.inGuiding)
             {
                 WindowCenter.Instance.CloseImmediately<MainInterfaceWin>();
             }
-            UI3DModelExhibition.Instance.StopShowEquipment();
+            UI3DModelExhibition.Instance.StopShow();
             if (WindowCenter.Instance.CheckOpen<FirstTimeRechargeWin>())
             {
                 WindowCenter.Instance.CloseImmediately<FirstTimeRechargeWin>();
@@ -200,7 +200,7 @@
             m_TimeText.text = obj;
             if (NewBieCenter.Instance.inGuiding || ModelCenter.Instance.GetModel<TreasureModel>().newGotShowing)
             {
-                UI3DModelExhibition.Instance.StopShowEquipment();
+                UI3DModelExhibition.Instance.StopShow();
                 m_RewardInformationImage.SetActive(false);
             }
         }
diff --git a/System/Vip/LimitedTimePackageTime.cs b/System/Vip/LimitedTimePackageTime.cs
index 13043c5..a99e6da 100644
--- a/System/Vip/LimitedTimePackageTime.cs
+++ b/System/Vip/LimitedTimePackageTime.cs
@@ -24,6 +24,7 @@
         {
             GlobalTimeEvent.Instance.secondEvent -= secondEvent;
             OperationTimeHepler.Instance.dayResetEvent -= DayResetEvent;
+            m_Time.gameObject.SetActive(false);
         }
 
         private void DayResetEvent(int resetType)
diff --git a/System/Voice/SpeechTranslate.cs b/System/Voice/SpeechTranslate.cs
index 41e4318..13c3be6 100644
--- a/System/Voice/SpeechTranslate.cs
+++ b/System/Voice/SpeechTranslate.cs
@@ -26,7 +26,7 @@
     public void RequestGetToken()
     {
         var url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials" + "&client_id=" + apiKey + "&client_secret=" + secretKey;
-        HttpRequest.Instance.RequestWWW(url, 2, OnGetToken);
+        HttpRequest.Instance.RequestHttpGet(url, HttpRequest.defaultHttpContentType, 2, OnGetToken);
     }
 
     private void OnGetToken(bool _ok, string _result)
diff --git a/System/Welfare/OperationTimeHepler.cs b/System/Welfare/OperationTimeHepler.cs
index 867222c..6ffca8e 100644
--- a/System/Welfare/OperationTimeHepler.cs
+++ b/System/Welfare/OperationTimeHepler.cs
@@ -476,24 +476,24 @@
                     day = int.Parse(dateArray[2].Trim())
                 };
             }
-            else if (dateArray != null && dateArray.Length == 1)
-            {
-                var time = TimeUtility.openServerTime;
-                if (time.Equals(default(DateTime)))
-                {
-                    DebugEx.Log("鏈嶅姟鏈熷紑鏈嶆椂闂翠笅鍙戦『搴忔湁闂");
-                }
-                var days = 0;
-                int.TryParse(date, out days);
-                days = Mathf.Max(1, days);
-                time = time.AddDays(days - 1);
-                return new OperationDate()
-                {
-                    year = time.Year,
-                    month = time.Month,
-                    day = time.Day,
-                };
-            }
+            //else if (dateArray != null && dateArray.Length == 1)
+            //{
+            //    var time = TimeUtility.openServerTime;
+            //    if (time.Equals(default(DateTime)))
+            //    {
+            //        DebugEx.Log("鏈嶅姟鏈熷紑鏈嶆椂闂翠笅鍙戦『搴忔湁闂");
+            //    }
+            //    var days = 0;
+            //    int.TryParse(date, out days);
+            //    days = Mathf.Max(1, days);
+            //    time = time.AddDays(days - 1);
+            //    return new OperationDate()
+            //    {
+            //        year = time.Year,
+            //        month = time.Month,
+            //        day = time.Day,
+            //    };
+            //}
             return default(OperationDate);
         }
 
diff --git a/System/WindowBase/WindowCenter.cs b/System/WindowBase/WindowCenter.cs
index ba3afe0..33a4290 100644
--- a/System/WindowBase/WindowCenter.cs
+++ b/System/WindowBase/WindowCenter.cs
@@ -72,7 +72,7 @@
                 }
                 else
                 {
-                    DebugEx.Log(string.Format("{0} 绐楀彛宸茬粡鎵撳紑锛�", typeof(T)));
+                    DebugEx.LogFormat("{0} 绐楀彛宸茬粡鎵撳紑锛�", typeof(T));
                 }
             }
             else
@@ -146,7 +146,7 @@
                 }
                 else
                 {
-                    DebugEx.Log(string.Format("{0} 绐楀彛宸茬粡鎵撳紑锛�", typeof(T)));
+                    DebugEx.LogFormat("{0} 绐楀彛宸茬粡鎵撳紑锛�", typeof(T));
                 }
 
                 return (T)win;
@@ -201,13 +201,13 @@
                 }
                 else
                 {
-                    DebugEx.Log(string.Format("{0} 绐楀彛宸茬粡鍏抽棴锛�", typeof(T)));
+                    DebugEx.LogFormat("{0} 绐楀彛宸茬粡鍏抽棴锛�", typeof(T));
                 }
             }
             else
             {
                 asyncLoad.StopTask(typeof(T).Name);
-                DebugEx.Log(string.Format("{0} 绐楀彛鏃犳硶鑾峰緱锛�", typeof(T)));
+                DebugEx.LogFormat("{0} 绐楀彛鏃犳硶鑾峰緱锛�", typeof(T));
             }
 
             return win;
@@ -224,13 +224,13 @@
                 }
                 else
                 {
-                    DebugEx.Log(string.Format("{0} 绐楀彛宸茬粡鍏抽棴锛�", typeof(T)));
+                    DebugEx.LogFormat("{0} 绐楀彛宸茬粡鍏抽棴锛�", typeof(T));
                 }
             }
             else
             {
                 asyncLoad.StopTask(typeof(T).Name);
-                DebugEx.Log(string.Format("{0} 绐楀彛鏃犳硶鑾峰緱锛�", typeof(T)));
+                DebugEx.LogFormat("{0} 绐楀彛鏃犳硶鑾峰緱锛�", typeof(T));
             }
 
             return win;
@@ -385,7 +385,7 @@
             }
             else
             {
-                DebugEx.Log(string.Format("{0} 绐楀彛鏃犳硶鑾峰緱锛�", typeof(T)));
+                DebugEx.LogFormat("{0} 绐楀彛鏃犳硶鑾峰緱锛�", typeof(T));
             }
         }
 
@@ -544,7 +544,7 @@
                 }
                 else
                 {
-                    DebugEx.Log(string.Format("{0} 绐楀彛宸茬粡鎵撳紑锛�", typeof(T)));
+                    DebugEx.LogFormat("{0} 绐楀彛宸茬粡鎵撳紑锛�", typeof(T));
                 }
 
                 return (T)win;
@@ -577,7 +577,7 @@
                             }
                             else
                             {
-                                DebugEx.Log(string.Format("{0} 绐楀彛宸茬粡鎵撳紑锛�", typeof(T)));
+                                DebugEx.LogFormat("{0} 绐楀彛宸茬粡鎵撳紑锛�", typeof(T));
                             }
                         }
                     }
diff --git a/System/WindowJump/WindowJumpMgr.cs b/System/WindowJump/WindowJumpMgr.cs
index 25ce56f..08b9a4d 100644
--- a/System/WindowJump/WindowJumpMgr.cs
+++ b/System/WindowJump/WindowJumpMgr.cs
@@ -49,7 +49,7 @@
 
     public bool IsJumpState { get; private set; }
     private int jumpPhase = 0;
-
+    public int jumpType { get; private set; }
     public void GetPreAllOpenWin()
     {
         jumpPhase += 1;
@@ -79,6 +79,7 @@
     {
         IsJumpState = false;
         jumpPhase = 0;
+        jumpType = 0;
         openWindows.Clear();
         jumpWinNameDict.Clear();
         WindowCenter.Instance.jumpWindowCloseEvent -= CloseWindow;
@@ -363,6 +364,7 @@
             case JumpUIType.SkillFunc1:
             case JumpUIType.SkillFunc2:
             case JumpUIType.SkillFunc3:
+            case JumpUIType.SkillFunc2Type2:
                 SetJumpLogic<SkillPanel>(_tagWinSearchModel.TABID);
                 break;
             case JumpUIType.StrengthFunc1:
@@ -557,6 +559,7 @@
                 SetJumpLogic<FindPreciousFrameWin>(_tagWinSearchModel.TABID);
                 break;
             case JumpUIType.LootPreciousFrameFunc1:
+            case JumpUIType.DogzDungeon:
                 SetJumpLogic<LootPreciousFrameWin>(_tagWinSearchModel.TABID);
                 break;
             case JumpUIType.LootPreciousFrameSpec:
@@ -702,6 +705,7 @@
                 SetJumpLogic<TreasureLevelUpWin>(0);
                 break;
             case JumpUIType.Kylin:
+                dungeonModel.currentDungeon = new Dungeon(31190, 0);
                 SetJumpLogic<MultipleDifficultyDungeonWin>(0);
                 break;
             case JumpUIType.Kylin1:
@@ -833,6 +837,7 @@
                 IsJumpState = false;
                 openWindows.Clear();
                 jumpWinNameDict.Clear();
+                jumpType = 0;
                 jumpPhase = 0;
                 break;
         }
@@ -876,9 +881,9 @@
 
     private void SetJumpLogic<T>(int _functionalOrder = 0, bool _forceSync = true) where T : Window
     {
-
         string curOpenWin = typeof(T).Name;
         jumpWinNameDict.Add(jumpPhase, curOpenWin);
+        jumpType = _tagWinSearchModel.Type;
         switch (_tagWinSearchModel.Type)
         {
             case 1:
@@ -921,7 +926,7 @@
         }
         DebugEx.Log("鍏抽棴鐣岄潰绫诲瀷锛�" + _tagWinSearchModel.Type);
         WindowCenter.Instance.jumpWindowCloseEvent -= CloseWindow;
-
+        jumpType = _tagWinSearchModel.Type;
         int i = 0;
         List<string> openWinlist = null;
         switch (_tagWinSearchModel.Type)
@@ -1106,6 +1111,7 @@
     KnapSackFunc4 = 8,
     SkillFunc1 = 9,
     SkillFunc2 = 10,
+    SkillFunc2Type2 = 243, //琚姩鎶�鑳界晫闈�
     SkillFunc3 = 11,
     StrengthFunc1 = 12,
     StrengthFunc2 = 13,
@@ -1178,6 +1184,7 @@
     WelfareFunc1 = 102, //绛惧埌
     WelfareFunc2 = 103,  //绁堟効
     LootPreciousFrameFunc1 = 104, //灏侀瓟鍧�
+    DogzDungeon = 242, //寮傚吔涔嬪湴
     SystemSettingFunc1 = 109,//鎸傛満璁剧疆
 
     RebornOpenBag = 113,//姝讳骸澶嶆椿鎵撳紑鑳屽寘
diff --git a/System/WorldMap/LocalMapFindPath.cs b/System/WorldMap/LocalMapFindPath.cs
index 983b798..fc21a24 100644
--- a/System/WorldMap/LocalMapFindPath.cs
+++ b/System/WorldMap/LocalMapFindPath.cs
@@ -27,7 +27,7 @@
         private List<GameObject> pathNodeBehaviours = new List<GameObject>(); //瀵昏矾鐐规睜
         List<LocalMapTag> tagBehaviours = new List<LocalMapTag>();
 
-        MapModel model { get { return  ModelCenter.Instance.GetModel<MapModel>(); } }
+        MapModel model { get { return ModelCenter.Instance.GetModel<MapModel>(); } }
 
         int mapId = 0;
         public void Init(int _mapId)
@@ -42,7 +42,17 @@
 
             mapId = _mapId;
             var tagChinMap = Config.Instance.Get<MapConfig>(mapId);
-            var mapResConfig = DTCA127_tagMCStartChangeMap.GetMapResourcesConfig();
+
+            MapResourcesConfig mapResConfig = null;
+            if (mapId == PlayerDatas.Instance.baseData.MapID)
+            {
+                mapResConfig = DTCA127_tagMCStartChangeMap.GetMapResourcesConfig();
+            }
+            else
+            {
+                mapResConfig = DTCA127_tagMCStartChangeMap.GetMapResourcesConfig(mapId, 0);
+            }
+
             var mapWidth = mapResConfig.MapScale.x;
             var mapHeight = mapResConfig.MapScale.y;
 
diff --git a/System/WorldMap/WorldMapWin.cs b/System/WorldMap/WorldMapWin.cs
index 4906a0a..20a6f1d 100644
--- a/System/WorldMap/WorldMapWin.cs
+++ b/System/WorldMap/WorldMapWin.cs
@@ -92,7 +92,7 @@
 
             WorldMapAreaBehaviour playerAtBehaviour = null;
             var currentMapId = PlayerDatas.Instance.baseData.MapID;
-
+            m_ContainerPlayerHead.gameObject.SetActive(false);
             for (int i = 0; i < m_AreaBehaviours.Length; i++)
             {
                 var behaviourTable = m_AreaBehaviours[i];
@@ -104,6 +104,7 @@
                     behaviourTable.areaBehaviour.Init(area);
                     if (behaviourTable.id == currentMapId.ToString())
                     {
+                        m_ContainerPlayerHead.gameObject.SetActive(true);
                         playerAtBehaviour = behaviourTable.areaBehaviour;
                         m_ContainerPlayerHead.SetParentEx(behaviourTable.areaBehaviour.playerHead, Vector3.zero, Vector3.zero, Vector3.one);
                     }
diff --git a/UI/Common/UI3DModelExhibition.cs b/UI/Common/UI3DModelExhibition.cs
index 571b2d7..4a54afd 100644
--- a/UI/Common/UI3DModelExhibition.cs
+++ b/UI/Common/UI3DModelExhibition.cs
@@ -26,12 +26,8 @@
         [SerializeField] ColorCorrectionCurves m_CameraColor;
 
         public bool interactable {
-            get {
-                return m_Interactable;
-            }
-            set {
-                m_Interactable = value;
-            }
+            get { return m_Interactable; }
+            set { m_Interactable = value; }
         }
 
         UI3DShowHero playerModel = new UI3DShowHero();
@@ -47,13 +43,10 @@
         GameObject npcModel = null;
         SFXController m_NpcEffect;
         public GameObject NpcModelPet {
-            get {
-                return npcModel;
-            }
-            set {
-                npcModel = value;
-            }
+            get { return npcModel; }
+            set { npcModel = value; }
         }
+
         int m_WingModelId = 0;
         GameObject wingModel = null;
 
@@ -70,13 +63,12 @@
 
         PlayerPackModel playerPack { get { return ModelCenter.Instance.GetModel<PlayerPackModel>(); } }
 
-        public static UI3DModelExhibition Instance {
-            get; set;
-        }
+        public static UI3DModelExhibition Instance { get; private set; }
 
         public static void CreateStage()
         {
-            var gameObject = GameObject.Instantiate(Resources.Load<GameObject>("UI/Prefabs/UI3DModelExhibitionStage"));
+            var prefab = Resources.Load<GameObject>("UI/Prefabs/UI3DModelExhibitionStage");
+            var gameObject = GameObject.Instantiate(prefab);
             Instance = gameObject.GetComponent<UI3DModelExhibition>();
             Instance.transform.position = new Vector3(1000, 2000, 3000);
             Instance.name = "UI3DModelExhibitionStage";
@@ -85,14 +77,15 @@
             DontDestroyOnLoad(gameObject);
         }
 
-        public void BeginShowLoginPlayer(RawImage _rawImage, int _job)
+        public void ShowLoginPlayer(RawImage _rawImage, int _job)
         {
             var clothesItemId = 0;
             var weaponItemId = 0;
             var wingsItemId = 0;
             var secondaryItemId = 0;
-            var _suitLevel = 0;
+            var suitLevel = 0;
             var equipInfos = PlayerDatas.Instance.loginInfo.EquipInfo;
+
             for (int i = 0; i < equipInfos.Length; i++)
             {
                 var equipInfo = equipInfos[i];
@@ -106,10 +99,10 @@
 
                         if (equipInfo.IsSuite == 1)
                         {
-                            Dictionary<int, List<int>> _userDataDict = ConfigParse.Analysis(equipInfo.UserData);
-                            if (_userDataDict.ContainsKey(30))
+                            var userDataDict = ConfigParse.Analysis(equipInfo.UserData);
+                            if (userDataDict.ContainsKey(30))
                             {
-                                _suitLevel = _userDataDict[30][0];
+                                suitLevel = userDataDict[30][0];
                             }
                         }
                         break;
@@ -122,10 +115,21 @@
                 }
             }
 
-            BeginShowPlayer(_rawImage, _job, clothesItemId, _suitLevel, weaponItemId, wingsItemId, secondaryItemId, false);
+            var data = new UI3DPlayerExhibitionData
+            {
+                job = _job,
+                clothesId = clothesItemId,
+                suitLevel = suitLevel,
+                weaponId = weaponItemId,
+                wingsId = wingsItemId,
+                secondaryId = secondaryItemId,
+                isDialogue = false,
+            };
+
+            ShowPlayer(_rawImage, data);
         }
 
-        public void BeginShowPlayer(RawImage _rawImage, int _job, bool _isDialogue = false)
+        public void ShowPlayer(RawImage _rawImage, int _job, bool _isDialogue = false)
         {
             var clothes = playerPack.GetItemModelByIndex(PackType.rptEquip, (int)RoleEquipType.retClothes);
             var clothesId = clothes == null ? 0 : (int)clothes.itemInfo.ItemID;
@@ -152,10 +156,21 @@
                 }
             }
 
-            BeginShowPlayer(_rawImage, _job, clothesId, _suitLevel, weaponId, wingsId, secondaryId, _isDialogue);
+            var data = new UI3DPlayerExhibitionData
+            {
+                job = _job,
+                clothesId = clothesId,
+                suitLevel = _suitLevel,
+                weaponId = weaponId,
+                wingsId = wingsId,
+                secondaryId = secondaryId,
+                isDialogue = _isDialogue,
+            };
+
+            ShowPlayer(_rawImage, data);
         }
 
-        public void BeginShowPlayer(RawImage _rawImage, int _job, RoleEquipType _exceptEquip)
+        public void ShowPlayer(RawImage _rawImage, int _job, RoleEquipType _exceptEquip)
         {
             var clothes = _exceptEquip == RoleEquipType.retClothes ?
                 null : playerPack.GetItemModelByIndex(PackType.rptEquip, (int)RoleEquipType.retClothes);
@@ -186,19 +201,38 @@
                 }
             }
 
-            BeginShowPlayer(_rawImage, _job, clothesId, _suitLevel, weaponId, wingsId, secondaryId, false);
+            var data = new UI3DPlayerExhibitionData
+            {
+                job = _job,
+                clothesId = clothesId,
+                suitLevel = _suitLevel,
+                weaponId = weaponId,
+                wingsId = wingsId,
+                secondaryId = secondaryId,
+                isDialogue = false,
+            };
+
+            ShowPlayer(_rawImage, data);
         }
 
-        public void BeginShowPlayer(RawImage _rawImage, int _job, int _clothesId, int suitLevel, int _weaponId, int _wingsId, int _secondaryId, bool _isDialogue = false)
+        public void ShowPlayer(RawImage _rawImage, UI3DPlayerExhibitionData data)
         {
             StopShow();
 
-            var instance = playerModel.Show(_job, _clothesId, suitLevel, _weaponId, _wingsId, _secondaryId, _isDialogue ? m_DialogPoint : m_PlayerShowPoint);
+            var job = data.job;
+            var clothesId = data.clothesId;
+            var suitLevel = data.suitLevel;
+            var weaponId = data.weaponId;
+            var wingsId = data.wingsId;
+            var secondaryId = data.secondaryId;
+            var isDialogue = data.isDialogue;
 
-            interactable = !_isDialogue;
+            var instance = playerModel.Show(job, clothesId, suitLevel, weaponId, wingsId, secondaryId, isDialogue ? m_DialogPoint : m_PlayerShowPoint);
+
+            interactable = !isDialogue;
             m_PlayerShowPoint.localEulerAngles = Vector3.zero;
 
-            if (_isDialogue)
+            if (isDialogue)
             {
                 instance.transform.localPosition = GeneralConfig.Instance.heroDialogueOffset;
                 instance.transform.localEulerAngles = GeneralConfig.Instance.heroDialogueRotation;
@@ -216,20 +250,29 @@
 
             if (_rawImage != null)
             {
-                _rawImage.rectTransform.sizeDelta = new Vector2(_rawImage.rectTransform.rect.height * 4f / 3, _rawImage.rectTransform.rect.height);
-                m_InteractProcessor.rectTransform = _rawImage.rectTransform;
+                var x = _rawImage.rectTransform.rect.height * 4f / 3;
+                var y = _rawImage.rectTransform.rect.height;
+                _rawImage.rectTransform.sizeDelta = new Vector2(x, y);
                 _rawImage.texture = m_ShowCamera.targetTexture;
                 _rawImage.material = MaterialUtility.GetGUIRenderTextureMaterial();
+                m_InteractProcessor.rectTransform = _rawImage.rectTransform;
             }
         }
 
-        public void BeginShowOtherPlayer(RawImage _rawImage, int _job, int _clothesId, int suitEffect, int _weaponId, int _wingsId, int _secondaryId)
+        public void ShowOtherPlayer(RawImage _rawImage, UI3DPlayerExhibitionData data)
         {
             StopShow();
 
-            playerModel.Show(_job, _clothesId, suitEffect, _weaponId, _wingsId, _secondaryId, m_PlayerShowPoint);
+            var job = data.job;
+            var clothesId = data.clothesId;
+            var suitLevel = data.suitLevel;
+            var weaponId = data.weaponId;
+            var wingsId = data.wingsId;
+            var secondaryId = data.secondaryId;
+
+            playerModel.Show(job, clothesId, suitLevel, weaponId, wingsId, secondaryId, m_PlayerShowPoint);
             playerModel.UnloadClothedEffect();
-            playerModel.PutOnEffect(suitEffect);
+            playerModel.PutOnEffect(suitLevel);
 
             interactable = true;
             m_PlayerShowPoint.localEulerAngles = Vector3.zero;
@@ -244,38 +287,37 @@
 
             if (_rawImage != null)
             {
-                _rawImage.rectTransform.sizeDelta = new Vector2(_rawImage.rectTransform.rect.height * 4f / 3, _rawImage.rectTransform.rect.height);
-                m_InteractProcessor.rectTransform = _rawImage.rectTransform;
+                var x = _rawImage.rectTransform.rect.height * 4f / 3;
+                var y = _rawImage.rectTransform.rect.height;
+                _rawImage.rectTransform.sizeDelta = new Vector2(x, y);
                 _rawImage.texture = m_ShowCamera.targetTexture;
                 _rawImage.material = MaterialUtility.GetGUIRenderTextureMaterial();
+                m_InteractProcessor.rectTransform = _rawImage.rectTransform;
             }
         }
 
-        public void BeginShowSitDownPlayer(RawImage _rawImage, int _job)
+        public void ShowSitDownPlayer(RawImage _rawImage, int _job)
         {
-            BeginShowPlayer(_rawImage, _job);
+            ShowPlayer(_rawImage, _job);
             if (playerModel != null)
             {
                 playerModel.SitDown();
             }
         }
 
-        public void StopShowPlayer()
-        {
-            StopShow();
-        }
-
-        public void BeginShowHourse(int _modelId, RawImage _rawImage)
+        public void ShowHourse(int _modelId, RawImage _rawImage)
         {
             StopShow();
             m_ShowCamera.enabled = true;
 
             if (_rawImage != null)
             {
-                _rawImage.rectTransform.sizeDelta = new Vector2(_rawImage.rectTransform.rect.height * 4f / 3, _rawImage.rectTransform.rect.height);
-                m_InteractProcessor.rectTransform = _rawImage.rectTransform;
+                var x = _rawImage.rectTransform.rect.height * 4f / 3;
+                var y = _rawImage.rectTransform.rect.height;
+                _rawImage.rectTransform.sizeDelta = new Vector2(x, y);
                 _rawImage.texture = m_ShowCamera.targetTexture;
                 _rawImage.material = MaterialUtility.GetGUIRenderTextureMaterial();
+                m_InteractProcessor.rectTransform = _rawImage.rectTransform;
             }
 
             var instance = UI3DModelFactory.LoadUIHorse(_modelId);
@@ -291,19 +333,18 @@
             horseModel = instance;
 
             m_HorseShowPoint.rotation = Quaternion.identity;
+
             var modelConfig = Config.Instance.Get<ModelResConfig>(_modelId);
-            instance.transform.SetParentEx(m_HorseShowPoint, modelConfig.UIOffset, modelConfig.UIRotation, Vector3.one * modelConfig.UIScale);
+            var position = modelConfig.UIOffset;
+            var rotation = modelConfig.UIRotation;
+            var scale = Vector3.one * modelConfig.UIScale;
+            instance.transform.SetParentEx(m_HorseShowPoint, position, rotation, scale);
             instance.SetActive(true);
             ResetCameraColor();
         }
 
-        public void StopShowHourse()
-        {
-            StopShow();
-        }
-
         private GameObject ObjEquipment;
-        public void BeginShowEquipment(int _modelId, Vector3 _localEulerAngles, RawImage _rawImage)
+        public void ShowEquipment(int _modelId, Vector3 _localEulerAngles, RawImage _rawImage)
         {
             var instance = UI3DModelFactory.LoadUIWing(_modelId);
             ObjEquipment = instance;
@@ -324,29 +365,27 @@
             ResetCameraColor();
             if (_rawImage != null)
             {
-                _rawImage.rectTransform.sizeDelta = new Vector2(_rawImage.rectTransform.rect.height * 4f / 3, _rawImage.rectTransform.rect.height);
-                m_InteractProcessor.rectTransform = _rawImage.rectTransform;
+                var x = _rawImage.rectTransform.rect.height * 4f / 3;
+                var y = _rawImage.rectTransform.rect.height;
+                _rawImage.rectTransform.sizeDelta = new Vector2(x, y);
                 _rawImage.texture = m_ShowCamera.targetTexture;
                 _rawImage.material = MaterialUtility.GetGUIRenderTextureMaterial();
+                m_InteractProcessor.rectTransform = _rawImage.rectTransform;
             }
         }
 
-        public void StopShowEquipment()
+        public void ShowWing(int _modelId, Vector3 _localEulerAngles, RawImage _rawImage)
         {
             StopShow();
-        }
-
-        public void BeginShowWing(int _modelId, Vector3 _localEulerAngles, RawImage _rawImage)
-        {
-            StopShow();
-            m_ShowCamera.enabled = true;
 
             if (_rawImage != null)
             {
-                _rawImage.rectTransform.sizeDelta = new Vector2(_rawImage.rectTransform.rect.height * 4f / 3, _rawImage.rectTransform.rect.height);
-                m_InteractProcessor.rectTransform = _rawImage.rectTransform;
+                var x = _rawImage.rectTransform.rect.height * 4f / 3;
+                var y = _rawImage.rectTransform.rect.height;
+                _rawImage.rectTransform.sizeDelta = new Vector2(x, y);
                 _rawImage.texture = m_ShowCamera.targetTexture;
                 _rawImage.material = MaterialUtility.GetGUIRenderTextureMaterial();
+                m_InteractProcessor.rectTransform = _rawImage.rectTransform;
             }
 
             var instance = UI3DModelFactory.LoadUIWing(_modelId);
@@ -355,6 +394,7 @@
                 return;
             }
 
+            m_ShowCamera.enabled = true;
             isShowWing = true;
             interactable = true;
 
@@ -363,7 +403,11 @@
 
             m_WingShowPoint.rotation = Quaternion.identity;
             var modelConfig = Config.Instance.Get<ModelResConfig>(_modelId);
-            instance.transform.SetParentEx(m_WingShowPoint, modelConfig.UIOffset, modelConfig.UIRotation, Vector3.one * modelConfig.UIScale);
+            var position = modelConfig.UIOffset;
+            var rotation = modelConfig.UIRotation;
+            var scale = Vector3.one * modelConfig.UIScale;
+            instance.transform.SetParentEx(m_WingShowPoint, position, rotation, scale);
+
             instance.SetActive(true);
             ResetCameraColor();
             var animator = instance.GetComponent<Animator>();
@@ -373,27 +417,24 @@
             }
         }
 
-        public void StopShowWing()
+        public void ShowNPC(int _npcId, Vector3 _localEulerAngles, RawImage _rawImage, bool _gray = false, bool _isDialogue = false)
         {
-            StopShow();
+            ShowNPC(_npcId, Vector3.zero, _localEulerAngles, _rawImage, _gray, _isDialogue);
         }
 
-        public void BeginShowNPC(int _npcId, Vector3 _localEulerAngles, RawImage _rawImage, bool _gray = false, bool _isDialogue = false)
-        {
-            BeginShowNPC(_npcId, Vector3.zero, _localEulerAngles, _rawImage, _gray, _isDialogue);
-        }
-
-        public void BeginShowNPC(int _npcId, Vector3 _offset, Vector3 _localEulerAngles, RawImage _rawImage, bool _gray = false, bool _isDialogue = false)
+        public void ShowNPC(int _npcId, Vector3 _offset, Vector3 _localEulerAngles, RawImage _rawImage, bool _gray = false, bool _isDialogue = false)
         {
             StopShow();
             m_ShowCamera.enabled = true;
 
             if (_rawImage != null)
             {
-                _rawImage.rectTransform.sizeDelta = new Vector2(_rawImage.rectTransform.rect.height * 4f / 3, _rawImage.rectTransform.rect.height);
-                m_InteractProcessor.rectTransform = _rawImage.rectTransform;
+                var x = _rawImage.rectTransform.rect.height * 4f / 3;
+                var y = _rawImage.rectTransform.rect.height;
+                _rawImage.rectTransform.sizeDelta = new Vector2(x, y);
                 _rawImage.texture = m_ShowCamera.targetTexture;
                 _rawImage.material = MaterialUtility.GetGUIRenderTextureMaterial();
+                m_InteractProcessor.rectTransform = _rawImage.rectTransform;
             }
 
             var instance = UI3DModelFactory.LoadUINPC(_npcId);
@@ -434,11 +475,6 @@
             ResetCameraColor(_gray);
             m_CameraColor.saturation = _gray ? 0.08f : 1f;
 
-        }
-
-        public void StopShowNPC()
-        {
-            StopShow();
         }
 
         public void StopShow()
@@ -535,11 +571,11 @@
         {
             if (isShowinEquipment && ObjEquipment != null)
             {
-                if (WindowCenter.Instance.CheckOpen<FirstTimeRechargeWin>())
+                if (WindowCenter.Instance.CheckOpen("FirstTimeRechargeWin"))
                 {
                     ObjEquipment.transform.Rotate(WindowCenter.Instance.Get<FirstTimeRechargeWin>().RotateVector * 1f, Space.Self);
                 }
-                if (WindowCenter.Instance.CheckOpen<FirstChargeTrialWin>())
+                if (WindowCenter.Instance.CheckOpen("FirstChargeTrialWin"))
                 {
                     ObjEquipment.transform.Rotate(WindowCenter.Instance.Get<FirstChargeTrialWin>().RotateVector * 1f, Space.Self);
                 }
@@ -596,9 +632,18 @@
             {
                 return;
             }
-
         }
 
+        public struct UI3DPlayerExhibitionData
+        {
+            public int job;
+            public int clothesId;
+            public int suitLevel;
+            public int weaponId;
+            public int wingsId;
+            public int secondaryId;
+            public bool isDialogue;
+        }
     }
 
 }
diff --git a/UI/Common/UI3DModelFactory.cs b/UI/Common/UI3DModelFactory.cs
index 2a2d348..c21fdd0 100644
--- a/UI/Common/UI3DModelFactory.cs
+++ b/UI/Common/UI3DModelFactory.cs
@@ -100,6 +100,11 @@
             animator.enabled = false;
         }
 
+        if (model)
+        {
+            model.transform.localScale = Vector3.one;
+        }
+
         var prefab = InstanceResourcesLoader.LoadNpcPrefab(id);
         if (prefab)
         {
diff --git a/UI/Common/UI3DShowHero.cs b/UI/Common/UI3DShowHero.cs
index e738f6f..b8a89dd 100644
--- a/UI/Common/UI3DShowHero.cs
+++ b/UI/Common/UI3DShowHero.cs
@@ -26,7 +26,6 @@
         RuntimeAnimatorController cacheClothedAC;
 
         Transform showPoint;
-
         List<SFXController> closthesSFXList = new List<SFXController>();
 
         public GameObject Show(int _job, int _clothes, int suitID, int _weaponId, int _wingsId, int _secondaryId, Transform _showPoint)
@@ -450,21 +449,8 @@
             wingsId = newWings;
         }
 
-        private PlayerSuitModel _suitModel;
-        private PlayerSuitModel SuitModel
-        {
-            get { return _suitModel ?? (_suitModel = ModelCenter.Instance.GetModel<PlayerSuitModel>()); }
-        }
-
-        private PlayerPackModel m_PlayerBackModel;
-        private PlayerPackModel PlayerBackModel
-        {
-            get
-            {
-                return m_PlayerBackModel ?? (m_PlayerBackModel = ModelCenter.Instance.GetModel<PlayerPackModel>());
-            }
-        }
-
+        private PlayerSuitModel SuitModel { get { return ModelCenter.Instance.GetModel<PlayerSuitModel>(); } }
+        private PlayerPackModel PlayerBackModel { get { return ModelCenter.Instance.GetModel<PlayerPackModel>(); } }
 
         public void LoadClothesEffect(int clothedID, int suitLevel)
         {
diff --git a/Utility/EnumHelper.cs b/Utility/EnumHelper.cs
index 5e4e87b..a9107df 100644
--- a/Utility/EnumHelper.cs
+++ b/Utility/EnumHelper.cs
@@ -309,6 +309,7 @@
     PersonalBoss = 25,
     ElderGodArea = 26,
     FairyGrabBoss = 27,
+    KillMonster=28,
 }
 
 public enum ActivityPrepareType
@@ -787,6 +788,7 @@
     Def_mitRefine = 18,            // 鐐间腹
     Def_mitMWUpLevel = 19,         //娉曞疂杩涢樁
     Def_DanRecycle = 20, //涓硅嵂鍥炴敹
+    Def_mitDogzEquipPlus=21,// 绁炲吔瑁呭寮哄寲 
 }
 /// <summary>
 /// 閲戦挶绫诲瀷(铏氭嫙鐗╁搧)
diff --git a/Utility/LayerUtility.cs b/Utility/LayerUtility.cs
index 5e30f74..0346f9f 100644
--- a/Utility/LayerUtility.cs
+++ b/Utility/LayerUtility.cs
@@ -46,8 +46,12 @@
     public static readonly int BossShow = LayerMask.NameToLayer("BossShow");
     public static readonly int BossShowMask = 1 << BossShow;
 
-    public static readonly int BattleEffect = LayerMask.NameToLayer("BattleEffect");
-    public static readonly int BattleEffectMask = 1 << BattleEffect;
+    public static readonly int BattleEffectLow = LayerMask.NameToLayer("BattleEffectLow");
+    public static readonly int BattleEffectLowMask = 1 << BattleEffectLow;
+    public static readonly int BattleEffectMid = LayerMask.NameToLayer("BattleEffectMid");
+    public static readonly int BattleEffectMidMask = 1 << BattleEffectMid;
+    public static readonly int BattleEffectHigh = LayerMask.NameToLayer("BattleEffectHigh");
+    public static readonly int BattleEffectHighMask = 1 << BattleEffectHigh;
 
     public static readonly int Hide = LayerMask.NameToLayer("Hide");
     public static readonly int HideMask = 1 << Hide;
diff --git a/Utility/TimeUtility.cs b/Utility/TimeUtility.cs
index 1771abf..3ce6601 100644
--- a/Utility/TimeUtility.cs
+++ b/Utility/TimeUtility.cs
@@ -4,7 +4,7 @@
 
 public static class TimeUtility
 {
-    private static DateTime _serverTime = DateTime.Now;
+    private static DateTime s_ServerTime = DateTime.Now;
 
     private static float _checkTime = 0;
     /// <summary>
@@ -15,10 +15,10 @@
         get
         {
             float tick = Time.realtimeSinceStartup - _checkTime;
-            DateTime real = _serverTime.AddSeconds(tick);
+            DateTime real = s_ServerTime.AddSeconds(tick);
             return real;
         }
-        private set { _serverTime = value; }
+        private set { s_ServerTime = value; }
     }
 
     /// <summary>
@@ -95,7 +95,7 @@
         get; private set;
     }
 
-    public static DateTime openServerTime;
+    public static DayOfWeek openServerDayOfWeek;
 
     public static int OpenWeekCnt
     {
@@ -138,10 +138,13 @@
     public static void OnRefreshServerTime(HA004_tagServerDateTime vNetData)
     {
         DateTime n = new DateTime(vNetData.Year, vNetData.Month, vNetData.Day, vNetData.Hour, vNetData.Minute, vNetData.Second);
-        _serverTime = n;
-        DebugEx.Log("OnRefreshServerTime鏈堜唤锛�" + _serverTime.Month);
+        s_ServerTime = n;
+        DebugEx.Log("OnRefreshServerTime鏈堜唤锛�" + s_ServerTime.Month);
         _checkTime = Time.realtimeSinceStartup;
-        if (OnServerTimeRefresh != null) OnServerTimeRefresh();
+        if (OnServerTimeRefresh != null)
+        {
+            OnServerTimeRefresh();
+        }
         TimeDownMgr.Instance.Begin(TimeDownMgr.CoolTimeType.SyncServerTime, 60, (float tick) =>
         {
             SyncServerTime();
@@ -153,7 +156,18 @@
         OpenDay = package.Day;
         IsMixServer = package.IsMixServer == 1;
         MixOpenDay = package.MixDay;
-        DateTime.TryParse(package.OpenServerTime, out openServerTime);
+        openServerDayOfWeek = package.OpenWeekday == 7 ? DayOfWeek.Sunday : (DayOfWeek)package.OpenWeekday;
+        OnRefreshServerTime(new HA004_tagServerDateTime()
+        {
+            Year = package.NowYear,
+            Month = package.NowMonth,
+            Day = package.NowDay,
+            Hour = package.NowHour,
+            Minute = package.NowMinute,
+            Second = package.NowSecond,
+            MicSecond = package.NowMicSecond,
+        });
+        //DateTime.TryParse(package.OpenServerTime, out openServerTime);
         if (OnServerOpenDayRefresh != null)
         {
             OnServerOpenDayRefresh();
diff --git a/Utility/UIHelper.cs b/Utility/UIHelper.cs
index c3e3f14..732bd00 100644
--- a/Utility/UIHelper.cs
+++ b/Utility/UIHelper.cs
@@ -359,7 +359,7 @@
     public static readonly Color32 s_BrightBlueColor = new Color32(0, 107, 227, 255);
     public static readonly Color32 s_BrightOrangeColor = new Color32(255, 103, 1, 255); //FF6701FF
     public static readonly Color32 s_BrightWhiteColor = new Color32(104, 104, 104, 255); //686868
-    public static readonly Color32 s_BrightGreenColor = new Color32(16, 157, 6, 255);
+    public static readonly Color32 s_BrightGreenColor = new Color32(16, 157, 6, 255); //109d06
 
     public static readonly Color32 s_DarkPinkColor = new Color32(255, 124, 124, 255);
     public static readonly Color32 s_DarkRedColor = new Color32(250, 1, 1, 255);

--
Gitblit v1.8.0