From 6a105ff34adac6be5e71e17554e9eb3a3bc1b86c Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期一, 20 十月 2025 11:50:01 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_scripts

---
 Main/Core/GameEngine/Player/PlayerBaseData.cs                                                      |    2 
 Main/System/Arena/ArenaChallengeVoucher.cs.meta                                                    |    2 
 Main/System/Arena/ArenaPlayerRankCell.cs                                                           |   70 
 Main/Core/NetworkPackage/ServerPack/HA9_Function/HA922_tagSCArenaMatchList.cs                      |   43 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA923_tagSCArenaPlayerInfo.cs.meta      |    2 
 Main/System/Redpoint/MainRedDot.cs                                                                 |    3 
 Main/System/Guild/GuildJoinWin.cs                                                                  |   89 
 Main/System/HappyXB/HeroCallResultWin.cs                                                           |    2 
 Main/System/Arena/ArenaWin.cs.meta                                                                 |    2 
 Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB209_tagCSArenaMatch.cs                       |   18 
 Main/System/Arena/ArenaHeroHead.cs                                                                 |   30 
 Main/System/Arena/ArenaChallengeWin.cs                                                             |   91 +
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA705_tagSCQueryPlayerCacheResult.cs |    2 
 Main/Utility/EnumHelper.cs                                                                         |   36 
 Main/System/RoleParticulars/OtherPlayerDetailManager.cs                                            |  214 ++
 Main/System/Guild/GuildEmblemSelectListCell.cs                                                     |   27 
 Main/System/Arena/ArenaManager.cs                                                                  |  347 ++++
 Main/System/Battle/StoryBossBattleWin.cs                                                           |    3 
 Main/System/Guild/GuildEmblemCell.cs                                                               |   54 
 Main/System/Guild/GuildCreateWin.cs                                                                |   62 
 Main/System/Arena/ArenaChallengeVoucher.cs                                                         |   24 
 Main/System/Arena/ArenaAwardWin.cs                                                                 |  121 +
 Main/Core/NetworkPackage/ServerPack/HA0_Sys/HA009_tagSCGameRecInfo.cs.meta                         |    2 
 Main/Core/NetworkPackage/ServerPack/HA0_Sys/HA009_tagSCGameRecInfo.cs                              |   51 
 Main/System/Arena/ArenaPlayerTop3Cell.cs.meta                                                      |    2 
 Main/System/HeroUI/HeroAwakeSuccessWin.cs                                                          |    4 
 Main/Utility/TimeUtility.cs                                                                        |   12 
 Main/Core/NetworkPackage/ServerPack/HA9_Function/HA923_tagSCArenaPlayerInfo.cs                     |   17 
 Main/System/Battle/BattleConst.cs                                                                  |    1 
 Main/Config/PartialConfigs/FamilyEmblemConfig.cs                                                   |   27 
 Main/Config/PartialConfigs/FamilyEmblemConfig.cs.meta                                              |    2 
 Main/System/Equip/EquipExchangeCell.cs                                                             |    2 
 Main/System/Equip/EquipTipWin.cs                                                                   |    4 
 Main/System/Battle/BattleFieldFactory.cs                                                           |    3 
 Main/System/BillboardRank/PlayerTop3Cell.cs                                                        |    2 
 Main/System/Guild/GuildPreviewWin.cs.meta                                                          |    2 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA922_tagSCArenaMatchList.cs            |   12 
 Main/System/Arena/ArenaAwardCell.cs.meta                                                           |    2 
 Main/System/Arena/ArenaAwardWin.cs.meta                                                            |    2 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA0_Sys/DTCA009_tagSCGameRecInfo.cs                    |   12 
 Main/System/HeroUI/HeroTrainWin.cs                                                                 |    8 
 Main/System/Tip/MarqueeWin.cs                                                                      |    3 
 Main/System/Arena/HeroCountryComponent.cs                                                          |  131 +
 Main/System/Arena/ArenaRecordWin.cs.meta                                                           |    2 
 Main/Utility/UIHelper.cs                                                                           |   35 
 Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs                                               |    5 
 Main/System/Guild/GuildCreateWin.cs.meta                                                           |    2 
 Main/System/Arena/ArenaAwardCell.cs                                                                |   55 
 Main/System/Main/MainWin.cs                                                                        |   27 
 Main/System/Tip/ServerTipDetails.cs                                                                |   10 
 Main/System/Guild/GuildBaseWin.cs                                                                  |   34 
 Main/System/HeroUI/HeroLVBreakSuccessWin.cs                                                        |    4 
 Main/Core/GameEngine/Player/PlayerDatas.cs                                                         |    3 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA0_Sys/DTCA009_tagSCGameRecInfo.cs.meta               |    2 
 Main/System/Arena/ArenaRecordCell.cs                                                               |   98 +
 Main/System/Guild/GuildEmblemSelectCell.cs.meta                                                    |    2 
 Main/System/Guild/GuildEmblemModel.cs                                                              |  190 +-
 Main/Core/NetworkPackage/ServerPack/HA9_Function/HA923_tagSCArenaPlayerInfo.cs.meta                |    2 
 Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB209_tagCSArenaMatch.cs.meta                  |    2 
 Main/System/Guild/GuildEmblemWin.cs                                                                |  153 +
 Main/System/Arena/ArenaChallengeCell.cs.meta                                                       |    2 
 Main/System/Arena/ArenaPlayerTop3Cell.cs                                                           |   35 
 Main/System/Arena/BuyItemWin.cs.meta                                                               |    2 
 Main/System/Arena/ArenaBattleVictoryWin.cs                                                         |  170 ++
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA513_tagMCFamilyActionInfo.cs            |    7 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA923_tagSCArenaPlayerInfo.cs           |   12 
 Main/System/Arena.meta                                                                             |    8 
 Main/System/Arena/ArenaWin.cs                                                                      |  141 +
 Main/System/Guild/GuildViewListCell.cs                                                             |   40 
 Main/System/Arena/ArenaHeroHead.cs.meta                                                            |    2 
 Main/System/Guild/GuildPreviewWin.cs                                                               |  129 +
 Main/System/Guild/GuildEmblemCell.cs.meta                                                          |    2 
 Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA705_tagSCQueryPlayerCacheResult.cs           |    4 
 Main/System/Arena/ArenaRecordCell.cs.meta                                                          |    2 
 Main/System/Guild/GuildEmblemSelectCell.cs                                                         |   58 
 Main/System/Arena/ArenaChallengeCell.cs                                                            |   59 
 Main/System/Arena/ArenaBattleVictoryWin.cs.meta                                                    |    2 
 Main/System/Arena/ArenaBattleFailWin.cs                                                            |  110 +
 Main/System/Arena/ArenaManager.cs.meta                                                             |    2 
 Main/System/RoleParticulars/OtherPlayerDetailManager.cs.meta                                       |    0 
 Main/Core/NetworkPackage/ClientPack/CA0_Sys/CA008_tagCSViewGameRec.cs                              |   20 
 Main/Core/NetworkPackage/ServerPack/HA9_Function/HA922_tagSCArenaMatchList.cs.meta                 |    2 
 Main/System/HeroUI/HeroAwakePrivewWin.cs                                                           |    4 
 Main/Main.cs                                                                                       |    5 
 Main/System/Arena/BuyItemWin.cs                                                                    |  119 +
 Main/Core/NetworkPackage/ClientPack/CA0_Sys/CA008_tagCSViewGameRec.cs.meta                         |    2 
 Main/System/Guild/PlayerFairyData.cs                                                               |  118 
 Main/System/Arena/ArenaBattleFailWin.cs.meta                                                       |    2 
 Main/System/Battle/ArenaBattleWin.cs.meta                                                          |    2 
 Main/System/Guild/GuildManager.cs                                                                  |  364 +++
 Main/System/Arena/HeroCountryComponent.cs.meta                                                     |    2 
 Main/System/Guild/GuildEmblemWin.cs.meta                                                           |    2 
 Main/System/HappyXB/HeroCallWin.cs                                                                 |    2 
 Main/System/Battle/BattleField/ArenaBattleField.cs                                                 |  148 +
 Main/System/ChallengeTab/ChallengeTabWin.cs                                                        |   60 
 Main/System/HeroUI/HeroBestWin.cs                                                                  |    8 
 Main/System/Arena/ArenaPlayerRankCell.cs.meta                                                      |    2 
 Main/System/HeroUI/HeroLVBreakWin.cs                                                               |    4 
 /dev/null                                                                                          |  558 ------
 Main/System/Arena/ArenaRecordWin.cs                                                                |   87 +
 Main/System/Arena/ArenaChallengeWin.cs.meta                                                        |    2 
 Main/Core/NetworkPackage/ClientPack/CA2_Interaction/CA212_tagCMViewPlayerInfo.cs                   |   19 
 Main/System/Battle/BattleField/ArenaBattleField.cs.meta                                            |    2 
 Main/System/Guild/GuildEmblemSelectListCell.cs.meta                                                |    2 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA922_tagSCArenaMatchList.cs.meta       |    2 
 Main/System/Battle/ArenaBattleWin.cs                                                               |  285 +++
 106 files changed, 3,861 insertions(+), 920 deletions(-)

diff --git a/Main/Config/PartialConfigs/FamilyEmblemConfig.cs b/Main/Config/PartialConfigs/FamilyEmblemConfig.cs
new file mode 100644
index 0000000..81c96f0
--- /dev/null
+++ b/Main/Config/PartialConfigs/FamilyEmblemConfig.cs
@@ -0,0 +1,27 @@
+
+
+using System.Collections.Generic;
+
+public partial class FamilyEmblemConfig : ConfigBase<int, FamilyEmblemConfig>
+{
+    private static List<int> defaultEmblemList = new List<int>();
+    protected override void OnConfigParseCompleted()
+    {
+        if (UnlockFamilyLV == 1)
+        {
+            if (defaultEmblemList.Contains(EmblemID))
+                return;
+            defaultEmblemList.Add(EmblemID);
+        }
+    }
+
+    public static int GetRandomEmblem()
+    {
+        if (defaultEmblemList.Count == 0)
+            return -1; // 
+        System.Random random = new System.Random();
+        return defaultEmblemList[random.Next(defaultEmblemList.Count)];
+    }
+
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/Config/PartialConfigs/FamilyEmblemConfig.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/Config/PartialConfigs/FamilyEmblemConfig.cs.meta
index f878724..a6b7854 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/Config/PartialConfigs/FamilyEmblemConfig.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: 8ade65428632cd94681e3561a9e78cb5
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/GameEngine/Player/PlayerBaseData.cs b/Main/Core/GameEngine/Player/PlayerBaseData.cs
index 241dc1d..6d6beba 100644
--- a/Main/Core/GameEngine/Player/PlayerBaseData.cs
+++ b/Main/Core/GameEngine/Player/PlayerBaseData.cs
@@ -113,6 +113,7 @@
 
     public int mapRealmSelect;  //鍦板浘澧冪晫闅惧害
     public int leaveFamilyTime; //绂诲紑瀹舵棌鏃堕棿
+    public int leaveGuildInfo; //鍏細锛氫富鍔ㄧ寮�娆℃暟*100 + 琚涪娆℃暟*10  + 鏈�鍚庝竴娆℃槸鍚︿富鍔ㄧ寮�鐨勶紝鏆傛椂鏈�澶氱疮璁¤褰曞埌9娆�
 
     public bool IsActive90Off = true; //浠h〃榛樿婵�娲�0.1鎶�
     public long treasurePotentialSp
@@ -180,6 +181,7 @@
         spExtend = _serverInfo.ExAttr8;
         bubbleId = _serverInfo.ExAttr10;
         ExAttr11 = _serverInfo.ExAttr11;
+        leaveGuildInfo = (int)_serverInfo.ExAttr12;
         ExAttr16 = _serverInfo.ExAttr16;
         ServerGroupId = _serverInfo.ExAttr13;
         faction = _serverInfo.Faction;
diff --git a/Main/Core/GameEngine/Player/PlayerDatas.cs b/Main/Core/GameEngine/Player/PlayerDatas.cs
index 392d1b4..24fd57b 100644
--- a/Main/Core/GameEngine/Player/PlayerDatas.cs
+++ b/Main/Core/GameEngine/Player/PlayerDatas.cs
@@ -514,6 +514,9 @@
             case PlayerDataType.CDBPlayerRefresh_SkillReducePerG:
                 baseData.skillReducePerG = (int)value;
                 break;
+            case PlayerDataType.ExAttr12:
+                baseData.leaveGuildInfo = (int)value;
+                break;
             case PlayerDataType.default9:
                 baseData.mapRealmSelect = (int)value;
                 break;
diff --git a/Main/Core/NetworkPackage/ClientPack/CA0_Sys/CA008_tagCSViewGameRec.cs b/Main/Core/NetworkPackage/ClientPack/CA0_Sys/CA008_tagCSViewGameRec.cs
new file mode 100644
index 0000000..3750255
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CA0_Sys/CA008_tagCSViewGameRec.cs
@@ -0,0 +1,20 @@
+using UnityEngine;
+using System.Collections;
+
+// A0 08 鏌ョ湅閫氱敤璁板綍 #tagCSViewGameRec
+
+public class CA008_tagCSViewGameRec : GameNetPackBasic {
+    public ushort RecType;    //璁板綍绫诲瀷
+    public uint RecID;    //鑷畾涔夎褰旾D
+
+    public CA008_tagCSViewGameRec () {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xA008;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (RecType, NetDataType.WORD);
+        WriteBytes (RecID, NetDataType.DWORD);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/Core/NetworkPackage/ClientPack/CA0_Sys/CA008_tagCSViewGameRec.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/Core/NetworkPackage/ClientPack/CA0_Sys/CA008_tagCSViewGameRec.cs.meta
index f878724..f8a60d1 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/Core/NetworkPackage/ClientPack/CA0_Sys/CA008_tagCSViewGameRec.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: b6a48b9769ab25a47adb4313ea3e1711
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/ClientPack/CA2_Interaction/CA212_tagCMViewPlayerInfo.cs b/Main/Core/NetworkPackage/ClientPack/CA2_Interaction/CA212_tagCMViewPlayerInfo.cs
index b86ad91..34cad61 100644
--- a/Main/Core/NetworkPackage/ClientPack/CA2_Interaction/CA212_tagCMViewPlayerInfo.cs
+++ b/Main/Core/NetworkPackage/ClientPack/CA2_Interaction/CA212_tagCMViewPlayerInfo.cs
@@ -1,23 +1,20 @@
 using UnityEngine;
 using System.Collections;
 
-//A2 12 查看玩家详细信息#tagCMViewPlayerInfo
+//A2 12 鏌ョ湅鐜╁璇︾粏淇℃伅#tagCMViewPlayerInfo
 
-public class CA212_tagCMViewPlayerInfo : GameNetPackBasic
-{
+public class CA212_tagCMViewPlayerInfo : GameNetPackBasic {
     public uint PlayerID;
-    public byte EquipClassLV;    //大于0为查看指定境界阶装备信息,  0为查看默认信息
+    public byte EquipClassLV;    //澶т簬0涓烘煡鐪嬫寚瀹氬鐣岄樁瑁呭淇℃伅,  0涓烘煡鐪嬮粯璁や俊鎭�
 
-    public CA212_tagCMViewPlayerInfo()
-    {
+    public CA212_tagCMViewPlayerInfo () {
         combineCmd = (ushort)0x03FE;
         _cmd = (ushort)0xA212;
     }
 
-    public override void WriteToBytes()
-    {
-        WriteBytes(PlayerID, NetDataType.DWORD);
-        WriteBytes(EquipClassLV, NetDataType.BYTE);
+    public override void WriteToBytes () {
+        WriteBytes (PlayerID, NetDataType.DWORD);
+        WriteBytes (EquipClassLV, NetDataType.BYTE);
     }
 
-}
\ No newline at end of file
+}
diff --git a/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB209_tagCSArenaMatch.cs b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB209_tagCSArenaMatch.cs
new file mode 100644
index 0000000..3ce09a7
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB209_tagCSArenaMatch.cs
@@ -0,0 +1,18 @@
+using UnityEngine;
+using System.Collections;
+
+// B2 09 婕旀鍦哄尮閰嶇帺瀹� #tagCSArenaMatch
+
+public class CB209_tagCSArenaMatch : GameNetPackBasic {
+    public byte IsRefresh;    // 0-鎵撳紑鐣岄潰鏃犲尮閰嶆暟鎹椂鏌ヨ锛�1-寮哄埗鍒锋柊鍖归厤鍒楄〃
+
+    public CB209_tagCSArenaMatch () {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xB209;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (IsRefresh, NetDataType.BYTE);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB209_tagCSArenaMatch.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB209_tagCSArenaMatch.cs.meta
index f878724..788831c 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB209_tagCSArenaMatch.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: e768d709b4503ed47a18dad52f32422e
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA0_Sys/DTCA009_tagSCGameRecInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA0_Sys/DTCA009_tagSCGameRecInfo.cs
new file mode 100644
index 0000000..7a98be6
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA0_Sys/DTCA009_tagSCGameRecInfo.cs
@@ -0,0 +1,12 @@
+using UnityEngine;
+using System.Collections;
+
+// A0 09 閫氱敤璁板綍淇℃伅 #tagSCGameRecInfo
+
+public class DTCA009_tagSCGameRecInfo : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack) {
+        base.Done(vNetPack);
+        HA009_tagSCGameRecInfo vNetData = vNetPack as HA009_tagSCGameRecInfo;
+        ArenaManager.Instance.UpdateGameRecInfo(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA0_Sys/DTCA009_tagSCGameRecInfo.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/Core/NetworkPackage/DTCFile/ServerPack/HA0_Sys/DTCA009_tagSCGameRecInfo.cs.meta
index f878724..ebdf68d 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA0_Sys/DTCA009_tagSCGameRecInfo.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: ef9a2a1877a033e4198a1343e4eb8dea
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3A1_tagMCModuleFightPowerInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3A1_tagMCModuleFightPowerInfo.cs
deleted file mode 100644
index a90f023..0000000
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3A1_tagMCModuleFightPowerInfo.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-using UnityEngine;
-using System.Collections;
-
-//A3 A1 鍚勫姛鑳芥ā鍧楁垬鏂楀姏淇℃伅 #tagMCModuleFightPowerInfo
-
-public class DTCA3A1_tagMCModuleFightPowerInfo : DtcBasic {
-    public override void Done(GameNetPackBasic vNetPack)
-    {
-        base.Done(vNetPack);
-        HA3A1_tagMCModuleFightPowerInfo vNetData = vNetPack as HA3A1_tagMCModuleFightPowerInfo;
-        RoleParticularModel.Instance.OnRevRoleFuncPower(vNetData);
-    }
-}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3A1_tagMCModuleFightPowerInfo.cs.meta
deleted file mode 100644
index 936d0f5..0000000
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 28bea9968bf0d0e4e942a2872db6ae39
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA513_tagMCFamilyActionInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA513_tagMCFamilyActionInfo.cs
index d195a97..cdc9a56 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA513_tagMCFamilyActionInfo.cs
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA513_tagMCFamilyActionInfo.cs
@@ -1,11 +1,12 @@
-using UnityEngine;
-using System.Collections;
-
+using UnityEngine;
+using System.Collections;
+
 // A5 13 瀹舵棌琛屼负淇℃伅 #tagMCFamilyActionInfo
 
 public class DTCA513_tagMCFamilyActionInfo : DtcBasic {
     public override void Done(GameNetPackBasic vNetPack) {
         base.Done(vNetPack);
         HA513_tagMCFamilyActionInfo vNetData = vNetPack as HA513_tagMCFamilyActionInfo;
+        GuildManager.Instance.UpdateFamilyAction(vNetData);
     }
 }
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA705_tagSCQueryPlayerCacheResult.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA705_tagSCQueryPlayerCacheResult.cs
index 5a6623a..29a6bb6 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA705_tagSCQueryPlayerCacheResult.cs
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA705_tagSCQueryPlayerCacheResult.cs
@@ -8,6 +8,6 @@
     {
         base.Done(vNetPack);
         HA705_tagSCQueryPlayerCacheResult vNetData = vNetPack as HA705_tagSCQueryPlayerCacheResult;
-        RoleParticularModel.Instance.OnRevRoleEquip(vNetData);
+        OtherPlayerDetailManager.Instance.OnRevRoleEquip(vNetData);
     }
 }
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA922_tagSCArenaMatchList.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA922_tagSCArenaMatchList.cs
new file mode 100644
index 0000000..abee02c
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA922_tagSCArenaMatchList.cs
@@ -0,0 +1,12 @@
+using UnityEngine;
+using System.Collections;
+
+// A9 22 婕旀鍦哄尮閰嶇帺瀹跺垪琛� #tagSCArenaMatchList
+
+public class DTCA922_tagSCArenaMatchList : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack) {
+        base.Done(vNetPack);
+        HA922_tagSCArenaMatchList vNetData = vNetPack as HA922_tagSCArenaMatchList;
+        ArenaManager.Instance.OnArenaMatchList(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA922_tagSCArenaMatchList.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA922_tagSCArenaMatchList.cs.meta
index f878724..492c2a3 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA922_tagSCArenaMatchList.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: 3018194b7bdafa24c9855f1880bb15a2
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA923_tagSCArenaPlayerInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA923_tagSCArenaPlayerInfo.cs
new file mode 100644
index 0000000..2466a6a
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA923_tagSCArenaPlayerInfo.cs
@@ -0,0 +1,12 @@
+using UnityEngine;
+using System.Collections;
+
+// A9 23 婕旀鍦虹帺瀹朵俊鎭� #tagSCArenaPlayerInfo
+
+public class DTCA923_tagSCArenaPlayerInfo : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack) {
+        base.Done(vNetPack);
+        HA923_tagSCArenaPlayerInfo vNetData = vNetPack as HA923_tagSCArenaPlayerInfo;
+        ArenaManager.Instance.UpdateArenaPlayerInfo(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA923_tagSCArenaPlayerInfo.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA923_tagSCArenaPlayerInfo.cs.meta
index f878724..cd6823d 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA923_tagSCArenaPlayerInfo.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: fe3971f96b149f14b8adf6e9c4e1ba5f
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs b/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
index 523f758..4456a79 100644
--- a/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
+++ b/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
@@ -51,7 +51,6 @@
         Register(typeof(H0111_tagOnlineReply), typeof(DTC0111_tagOnlineReply));
         Register(typeof(H0608_tagNPCDie), typeof(DTC0608_tagNPCDie));
         Register(typeof(H0612_tagClearObjBuff), typeof(DTC0612_tagClearObjBuff));
-        Register(typeof(HA3A1_tagMCModuleFightPowerInfo), typeof(DTCA3A1_tagMCModuleFightPowerInfo));
         Register(typeof(HA110_tagMCCoinToGoldCountInfo), typeof(DTCA110_tagMCCoinToGoldCountInfo));
         Register(typeof(HA008_tagGCPlayerRecInfo), typeof(DTCA008_tagGCPlayerRecInfo));
         Register(typeof(HAA02_tagSCFirstChargeInfo), typeof(DTCAA02_tagSCFirstChargeInfo));
@@ -114,7 +113,9 @@
         Register(typeof(HA521_tagMCFamilyChange), typeof(DTCA521_tagMCFamilyChange));
         Register(typeof(HA522_tagMCFamilyReqJoinInfo), typeof(DTCA522_tagMCFamilyReqJoinInfo));
         Register(typeof(HA523_tagMCFamilyViewList), typeof(DTCA523_tagMCFamilyViewList));
-
+        Register(typeof(HA009_tagSCGameRecInfo), typeof(DTCA009_tagSCGameRecInfo));
+        Register(typeof(HA922_tagSCArenaMatchList), typeof(DTCA922_tagSCArenaMatchList));
+        Register(typeof(HA923_tagSCArenaPlayerInfo), typeof(DTCA923_tagSCArenaPlayerInfo));
     }
 
     //涓诲伐绋嬫敞鍐屽皝鍖�
diff --git a/Main/Core/NetworkPackage/ServerPack/HA0_Sys/HA009_tagSCGameRecInfo.cs b/Main/Core/NetworkPackage/ServerPack/HA0_Sys/HA009_tagSCGameRecInfo.cs
new file mode 100644
index 0000000..cbc6abf
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA0_Sys/HA009_tagSCGameRecInfo.cs
@@ -0,0 +1,51 @@
+using UnityEngine;
+using System.Collections;
+
+// A0 09 閫氱敤璁板綍淇℃伅 #tagSCGameRecInfo
+
+public class HA009_tagSCGameRecInfo : GameNetPackBasic {
+    public ushort RecType;    //璁板綍绫诲瀷
+    public uint RecID;    //鑷畾涔夎褰旾D
+    public ushort Count;    //鏁伴噺
+    public  tagSCGameRec[] RecList;
+
+    public HA009_tagSCGameRecInfo () {
+        _cmd = (ushort)0xA009;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out RecType, vBytes, NetDataType.WORD);
+        TransBytes (out RecID, vBytes, NetDataType.DWORD);
+        TransBytes (out Count, vBytes, NetDataType.WORD);
+        RecList = new tagSCGameRec[Count];
+        for (int i = 0; i < Count; i ++) {
+            RecList[i] = new tagSCGameRec();
+            TransBytes (out RecList[i].Time, vBytes, NetDataType.DWORD);
+            TransBytes (out RecList[i].Value1, vBytes, NetDataType.DWORD);
+            TransBytes (out RecList[i].Value2, vBytes, NetDataType.DWORD);
+            TransBytes (out RecList[i].Value3, vBytes, NetDataType.DWORD);
+            TransBytes (out RecList[i].Value4, vBytes, NetDataType.DWORD);
+            TransBytes (out RecList[i].Value5, vBytes, NetDataType.DWORD);
+            TransBytes (out RecList[i].Value6, vBytes, NetDataType.DWORD);
+            TransBytes (out RecList[i].Value7, vBytes, NetDataType.DWORD);
+            TransBytes (out RecList[i].Value8, vBytes, NetDataType.DWORD);
+            TransBytes (out RecList[i].UserDataLen, vBytes, NetDataType.WORD);
+            TransBytes (out RecList[i].UserData, vBytes, NetDataType.Chars, RecList[i].UserDataLen);
+        }
+    }
+
+    public class tagSCGameRec {
+        public uint Time;        //鏃堕棿
+        public uint Value1;        //鍊�1
+        public uint Value2;        //鍊�2
+        public uint Value3;        //鍊�3
+        public uint Value4;        //鍊�4
+        public uint Value5;        //鍊�5
+        public uint Value6;        //鍊�6
+        public uint Value7;        //鍊�7
+        public uint Value8;        //鍊�8
+        public ushort UserDataLen;        //鎵╁睍鏁版嵁闀垮害
+        public string UserData;        //鎵╁睍鏁版嵁
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA0_Sys/HA009_tagSCGameRecInfo.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/Core/NetworkPackage/ServerPack/HA0_Sys/HA009_tagSCGameRecInfo.cs.meta
index f878724..d67e677 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/Core/NetworkPackage/ServerPack/HA0_Sys/HA009_tagSCGameRecInfo.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: 77ee48f6b77c0f34499e2cbd2546a944
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs
deleted file mode 100644
index eff7d4d..0000000
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using UnityEngine;
-using System.Collections;
-
-//A3 A1 鍚勫姛鑳芥ā鍧楁垬鏂楀姏淇℃伅 #tagMCModuleFightPowerInfo
-
-public class HA3A1_tagMCModuleFightPowerInfo : GameNetPackBasic {
-    public uint TotalFightPower;    //鎬绘垬鏂楀姏锛屾眰浣欎嚎閮ㄥ垎
-    public uint TotalFightPoweEx;    //鎬绘垬鏂楀姏锛屾暣闄や嚎閮ㄥ垎锛�1浠h〃1浜�
-    public byte MFPCnt;    //妯″潡鎴樻枟鍔涙�绘暟
-    public  tagMCModuleFightPower[] MFPList;
-
-    public HA3A1_tagMCModuleFightPowerInfo () {
-        _cmd = (ushort)0xA3A1;
-    }
-
-    public override void ReadFromBytes (byte[] vBytes) {
-        TransBytes (out TotalFightPower, vBytes, NetDataType.DWORD);
-        TransBytes (out TotalFightPoweEx, vBytes, NetDataType.DWORD);
-        TransBytes (out MFPCnt, vBytes, NetDataType.BYTE);
-        MFPList = new tagMCModuleFightPower[MFPCnt];
-        for (int i = 0; i < MFPCnt; i ++) {
-            MFPList[i] = new tagMCModuleFightPower();
-            TransBytes (out MFPList[i].MfpType, vBytes, NetDataType.BYTE);
-            TransBytes (out MFPList[i].FightPower, vBytes, NetDataType.DWORD);
-            TransBytes (out MFPList[i].FightPowerEx, vBytes, NetDataType.DWORD);
-        }
-    }
-
-    public class tagMCModuleFightPower {
-        public byte MfpType;        //妯″潡缂栧彿绫诲瀷
-        public uint FightPower;        //鏈ā鍧楁垬鏂楀姏锛屾眰浣欎嚎閮ㄥ垎
-        public uint FightPowerEx;        //鏈ā鍧楁垬鏂楀姏锛屾暣闄や嚎閮ㄥ垎锛�1浠h〃1浜�
-    }
-
-}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA705_tagSCQueryPlayerCacheResult.cs b/Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA705_tagSCQueryPlayerCacheResult.cs
index 94bfb02..4e12fe7 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA705_tagSCQueryPlayerCacheResult.cs
+++ b/Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA705_tagSCQueryPlayerCacheResult.cs
@@ -11,6 +11,7 @@
     public byte RealmLV;
     public uint Face;
     public uint FacePic;
+    public uint ModelMark;    //鍙樺舰妯″瀷mark
     public uint TitleID;    //浣╂埓鐨勭О鍙�
     public uint ServerID;
     public uint FightPower;
@@ -18,6 +19,7 @@
     public uint FamilyID;
     public string FamilyName;
     public uint FamilyEmblemID;    //浠欑洘寰界珷ID
+    public string FamilyEmblemWord;    //寰界珷鏂囧瓧
     public uint PlusDataSize;
     public string PlusData;    //鎵╁睍璁板綍	
 
@@ -33,6 +35,7 @@
         TransBytes (out RealmLV, vBytes, NetDataType.BYTE);
         TransBytes (out Face, vBytes, NetDataType.DWORD);
         TransBytes (out FacePic, vBytes, NetDataType.DWORD);
+        TransBytes (out ModelMark, vBytes, NetDataType.DWORD);
         TransBytes (out TitleID, vBytes, NetDataType.DWORD);
         TransBytes (out ServerID, vBytes, NetDataType.DWORD);
         TransBytes (out FightPower, vBytes, NetDataType.DWORD);
@@ -40,6 +43,7 @@
         TransBytes (out FamilyID, vBytes, NetDataType.DWORD);
         TransBytes (out FamilyName, vBytes, NetDataType.Chars, 33);
         TransBytes (out FamilyEmblemID, vBytes, NetDataType.DWORD);
+        TransBytes (out FamilyEmblemWord, vBytes, NetDataType.Chars, 3);
         TransBytes (out PlusDataSize, vBytes, NetDataType.DWORD);
         TransBytes (out PlusData, vBytes, NetDataType.Chars, PlusDataSize);
     }
diff --git a/Main/Core/NetworkPackage/ServerPack/HA9_Function/HA922_tagSCArenaMatchList.cs b/Main/Core/NetworkPackage/ServerPack/HA9_Function/HA922_tagSCArenaMatchList.cs
new file mode 100644
index 0000000..2b09559
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA9_Function/HA922_tagSCArenaMatchList.cs
@@ -0,0 +1,43 @@
+using UnityEngine;
+using System.Collections;
+
+// A9 22 婕旀鍦哄尮閰嶇帺瀹跺垪琛� #tagSCArenaMatchList
+
+public class HA922_tagSCArenaMatchList : GameNetPackBasic {
+    public byte MatchCount;
+    public  tagSCArenaMatchInfo[] MatchList;    // 鍖归厤鍒楄〃锛屼粠楂樺垎鍒颁綆鍒�
+
+    public HA922_tagSCArenaMatchList () {
+        _cmd = (ushort)0xA922;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out MatchCount, vBytes, NetDataType.BYTE);
+        MatchList = new tagSCArenaMatchInfo[MatchCount];
+        for (int i = 0; i < MatchCount; i ++) {
+            MatchList[i] = new tagSCArenaMatchInfo();
+            TransBytes (out MatchList[i].PlayerID, vBytes, NetDataType.DWORD);
+            TransBytes (out MatchList[i].PlayerName, vBytes, NetDataType.Chars, 33);
+            TransBytes (out MatchList[i].LV, vBytes, NetDataType.WORD);
+            TransBytes (out MatchList[i].RealmLV, vBytes, NetDataType.WORD);
+            TransBytes (out MatchList[i].FightPower, vBytes, NetDataType.DWORD);
+            TransBytes (out MatchList[i].FightPowerEx, vBytes, NetDataType.DWORD);
+            TransBytes (out MatchList[i].Face, vBytes, NetDataType.DWORD);
+            TransBytes (out MatchList[i].FacePic, vBytes, NetDataType.DWORD);
+            TransBytes (out MatchList[i].TitleID, vBytes, NetDataType.DWORD);
+        }
+    }
+
+    public class tagSCArenaMatchInfo {
+        public uint PlayerID;        //鐩爣鐜╁ID
+        public string PlayerName;
+        public ushort LV;        // 鐜╁绛夌骇
+        public ushort RealmLV;        //澧冪晫锛屾満鍣ㄤ汉璇诲鐣岃〃鍙栫瓑绾у搴斿鐣�
+        public uint FightPower;        //鎴樺姏姹備綑浜块儴鍒�
+        public uint FightPowerEx;        //鎴樺姏鏁撮櫎浜块儴鍒�
+        public uint Face;        //鍩烘湰鑴稿瀷
+        public uint FacePic;        //澶村儚妗�
+        public uint TitleID;        //绉板彿
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA9_Function/HA922_tagSCArenaMatchList.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/Core/NetworkPackage/ServerPack/HA9_Function/HA922_tagSCArenaMatchList.cs.meta
index f878724..74bbceb 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/Core/NetworkPackage/ServerPack/HA9_Function/HA922_tagSCArenaMatchList.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: 2b4642cd36b59424c907081f1ea9e173
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/ServerPack/HA9_Function/HA923_tagSCArenaPlayerInfo.cs b/Main/Core/NetworkPackage/ServerPack/HA9_Function/HA923_tagSCArenaPlayerInfo.cs
new file mode 100644
index 0000000..cde9fad
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA9_Function/HA923_tagSCArenaPlayerInfo.cs
@@ -0,0 +1,17 @@
+using UnityEngine;
+using System.Collections;
+
+// A9 23 婕旀鍦虹帺瀹朵俊鎭� #tagSCArenaPlayerInfo
+
+public class HA923_tagSCArenaPlayerInfo : GameNetPackBasic {
+    public uint Score;    //褰撳墠绉垎
+
+    public HA923_tagSCArenaPlayerInfo () {
+        _cmd = (ushort)0xA923;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out Score, vBytes, NetDataType.DWORD);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA9_Function/HA923_tagSCArenaPlayerInfo.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/Core/NetworkPackage/ServerPack/HA9_Function/HA923_tagSCArenaPlayerInfo.cs.meta
index f878724..f7acb38 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/Core/NetworkPackage/ServerPack/HA9_Function/HA923_tagSCArenaPlayerInfo.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: 9a2b69f1fef30664080e787544234dab
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Main.cs b/Main/Main.cs
index c8d862c..d9cb64f 100644
--- a/Main/Main.cs
+++ b/Main/Main.cs
@@ -49,9 +49,8 @@
         // 鍒濆鍖栨父鎴忕郴缁�
         managers.Add(BattleManager.Instance);
         managers.Add(VirtualPackManager.Instance);
-        managers.Add(RoleParticularModel.Instance);
+        managers.Add(OtherPlayerDetailManager.Instance);
         managers.Add(RechargeManager.Instance);
-        managers.Add(RoleParticularModel.Instance);
         managers.Add(StoreModel.Instance);
         managers.Add(PhantasmPavilionModel.Instance);
         managers.Add(GuildManager.Instance);
@@ -83,7 +82,7 @@
         managers.Add(NewBieCenter.Instance);
         managers.Add(AdsManager.Instance);
         managers.Add(BoneFieldManager.Instance);
-
+        managers.Add(ArenaManager.Instance);
         foreach (var manager in managers)
         {
             manager.Init();
diff --git a/Main/System/Arena.meta b/Main/System/Arena.meta
new file mode 100644
index 0000000..f956f87
--- /dev/null
+++ b/Main/System/Arena.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 2bada89d61080494cadb1e44f3ea3bf3
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Arena/ArenaAwardCell.cs b/Main/System/Arena/ArenaAwardCell.cs
new file mode 100644
index 0000000..c9afcb9
--- /dev/null
+++ b/Main/System/Arena/ArenaAwardCell.cs
@@ -0,0 +1,55 @@
+using System.Collections.Generic;
+using System.Linq;
+using UnityEngine;
+
+public class ArenaAwardCell : CellView
+{
+    [SerializeField] ImageEx imgRank;
+    [SerializeField] TextEx txtRank;
+    [SerializeField] ItemCell[] itemCells;
+    public void Display(int index, CellView cellView)
+    {
+        int functionOrder = cellView.info.Value.infoInt1;
+        Dictionary<int, int[][]> rewardDict = ArenaManager.Instance.GetArenaAwardDict(functionOrder);
+        if (rewardDict.IsNullOrEmpty())
+            return;
+        var list = rewardDict.Keys.ToList();
+        list.Sort();
+
+
+        int rank = list[index];
+        
+        if (rank <= 3)
+        {
+            imgRank.SetActive(true);
+            txtRank.SetActive(false);
+            imgRank.SetSprite(StringUtility.Contact("Rank", rank));
+            txtRank.text = rank.ToString();
+        }
+        else
+        {
+            imgRank.SetActive(false);
+            txtRank.SetActive(true);
+            int lastIndex = index - 1;
+            txtRank.text = lastIndex > 0 && lastIndex < list.Count ? Language.Get("Arena15", list[lastIndex] + 1, rank) : string.Empty;
+        }
+
+        int key = list[index];
+        int[][] rewardArr = rewardDict[key];
+        for (int i = 0; i < itemCells.Length; i++)
+        {
+            var itemCell = itemCells[i];
+            if (!rewardArr.IsNullOrEmpty() && i < rewardArr.Length)
+            {
+                int itemCellIndex = i;
+                itemCell.SetActive(true);
+                itemCell.Init(new ItemCellModel(rewardArr[i][0], true, rewardArr[i][1]));
+                itemCell.button.SetListener(() => ItemTipUtility.Show(rewardArr[itemCellIndex][0], true));
+            }
+            else
+            {
+                itemCell.SetActive(false);
+            }
+        }
+    }
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/System/Arena/ArenaAwardCell.cs.meta
similarity index 83%
rename from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
rename to Main/System/Arena/ArenaAwardCell.cs.meta
index f878724..075584c 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/System/Arena/ArenaAwardCell.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: 1af032a349424c84fae27b64da3a604e
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Arena/ArenaAwardWin.cs b/Main/System/Arena/ArenaAwardWin.cs
new file mode 100644
index 0000000..22641f5
--- /dev/null
+++ b/Main/System/Arena/ArenaAwardWin.cs
@@ -0,0 +1,121 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEngine;
+
+public class ArenaAwardWin : FunctionsBaseWin
+{
+    [SerializeField] ButtonEx btnClose;
+    [SerializeField] TextEx txtCountdown;
+    [SerializeField] ScrollerController scrAward;
+    [SerializeField] ArenaPlayerRankCell myRankCell;
+    [HideInInspector] public string valueFormat = "{0}";
+    protected override void InitComponent()
+    {
+        base.InitComponent();
+        btnClose.SetListener(() => UIManager.Instance.CloseWindow<ArenaAwardWin>());
+    }
+
+    protected override void OnPreOpen()
+    {
+        base.OnPreOpen();
+        tabButtons[functionOrder].SelectBtn(true);
+        ArenaManager.Instance.OnArenaMatchListEvent += OnArenaMatchListEvent;
+        ArenaManager.Instance.OnUpdateArenaPlayerInfo += OnUpdateArenaPlayerInfo;
+        ArenaManager.Instance.OnUpdateGameRecInfo += OnUpdateGameRecInfo;
+        RankModel.Instance.onRankRefresh -= OnRankRefresh;
+        GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
+        scrAward.OnRefreshCell += OnRefreshCell;
+        Display();
+    }
+
+    protected override void OnPreClose()
+    {
+        base.OnPreClose();
+        ArenaManager.Instance.OnArenaMatchListEvent -= OnArenaMatchListEvent;
+        ArenaManager.Instance.OnUpdateArenaPlayerInfo -= OnUpdateArenaPlayerInfo;
+        ArenaManager.Instance.OnUpdateGameRecInfo -= OnUpdateGameRecInfo;
+        RankModel.Instance.onRankRefresh -= OnRankRefresh;
+        GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
+        scrAward.OnRefreshCell -= OnRefreshCell;
+    }
+
+    private void OnSecondEvent()
+    {
+        ArenaManager.Instance.GetCurrentSeasonDates(out DateTime seasonStartDate, out DateTime seasonEndDate);
+        TimeSpan remainingTime = seasonEndDate - TimeUtility.ServerNow;
+        int remainingSeconds = (int)remainingTime.TotalSeconds;
+        if (remainingSeconds > 0)
+        {
+            string countdownText = TimeUtility.SecondsToDHMSCHS(remainingSeconds);
+            txtCountdown.SetActive(true);
+            txtCountdown.text = Language.Get("Arena14", countdownText);
+        }
+        else
+        {
+            txtCountdown.SetActive(false);
+        }
+    }
+
+
+    protected override void OpenSubUIByTabIndex()
+    {
+        ArenaManager.Instance.nowAwardTabIndex = functionOrder;
+        Display();
+    }
+
+    private void OnRefreshCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell.GetComponent<ArenaAwardCell>();
+        _cell?.Display(cell.index, cell);
+    }
+
+    private void OnUpdateArenaPlayerInfo()
+    {
+        Display();
+    }
+
+    private void OnArenaMatchListEvent()
+    {
+        Display();
+    }
+
+    private void OnUpdateGameRecInfo()
+    {
+        Display();
+    }
+    void OnRankRefresh(int type)
+    {
+        DisplayMyRank();
+    }
+
+    private void Display()
+    {
+        CreateScroller();
+        DisplayMyRank();
+        OnSecondEvent();
+    }
+
+    private void CreateScroller()
+    {
+        scrAward.Refresh();
+        Dictionary<int, int[][]> rewardDict = ArenaManager.Instance.GetArenaAwardDict(functionOrder);
+        if (!rewardDict.IsNullOrEmpty())
+        {
+            var list = rewardDict.Keys.ToList();
+            list.Sort();
+            for (int i = 0; i < list.Count; i++)
+            {
+                CellInfo cellInfo = new CellInfo();
+                cellInfo.infoInt1 = (int)functionOrder;
+                scrAward.AddCell(ScrollerDataType.Header, i, cellInfo);
+            }
+        }
+        scrAward.Restart();
+    }
+
+    private void DisplayMyRank()
+    {
+        myRankCell.Display(ArenaManager.Instance.rankType, 0, valueFormat);
+    }
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/System/Arena/ArenaAwardWin.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/System/Arena/ArenaAwardWin.cs.meta
index f878724..91a3d66 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/System/Arena/ArenaAwardWin.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: 261402b40fdeef54b88c11e75dddd897
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Arena/ArenaBattleFailWin.cs b/Main/System/Arena/ArenaBattleFailWin.cs
new file mode 100644
index 0000000..4f5dcfc
--- /dev/null
+++ b/Main/System/Arena/ArenaBattleFailWin.cs
@@ -0,0 +1,110 @@
+using System.Collections.Generic;
+using Cysharp.Threading.Tasks;
+using LitJson;
+using UnityEngine;
+
+//鎴樺満缁撶畻鐣岄潰锛屽瓨鍦ㄥ涓殑鎯呭喌
+public class ArenaBattleFailWin : UIBase
+{
+    [SerializeField] AvatarCell myAvatarCell;
+    [SerializeField] AvatarCell enemyAvatarCell;
+    [SerializeField] TextEx txtMyName;
+    [SerializeField] TextEx txtEnemyName;
+    [SerializeField] TextEx txtMyScore;
+    [SerializeField] TextEx txtEnemyScore;
+    [SerializeField] ScrollerController scroller;
+    JsonData jsonData;
+    string guid;
+
+    protected override void InitComponent()
+    {
+
+    }
+
+    protected override void OnPreOpen()
+    {
+        scroller.OnRefreshCell += OnRefreshCell;
+        guid = BattleSettlementManager.Instance.notifyGuid;
+        jsonData = BattleSettlementManager.Instance.GetBattleSettlement(guid);
+        if (jsonData == null)
+        {
+            DelayCloseWindow().Forget();
+            return;
+        }
+        Display();
+        CreateScroller();
+    }
+
+    protected override void OnPreClose()
+    {
+        scroller.OnRefreshCell -= OnRefreshCell;
+        BattleSettlementManager.Instance.WinShowOver(guid);
+    }
+
+    // B4 20 鍥炲悎鍒舵垬鏂楃姸鎬� #tagMCTurnFightState  閫氱敤鐨勭粨绠楃姸鎬� State 4-缁撶畻濂栧姳
+    // Msg 涓澶栦俊鎭�
+    // "tagPlayerID":瀵规垬鐨勭洰鏍嘔D,
+    // "atkAddScore":鍙戣捣鏂瑰鍔犵殑绉垎锛屽彲鑳戒负0,
+    // "defDecScore":琚嚮鏂瑰噺灏戠殑绉垎锛屽彲鑳戒负0,
+    // itemInfo:濂栧姳鐗╁搧鍒楄〃锛屽彲鑳戒负绌�
+    void Display()
+    {
+        if (!jsonData.ContainsKey("tagPlayerID") || !jsonData.ContainsKey("atkAddScore") || !jsonData.ContainsKey("defDecScore"))
+            return;
+        uint tagPlayerID = (uint)jsonData["tagPlayerID"];
+        int atkAddScore = (int)jsonData["atkAddScore"];
+        int defDecScore = (int)jsonData["defDecScore"];
+        if (!ArenaManager.Instance.TryGetPlayerInfo(tagPlayerID, out ArenaMatchInfo info))
+            return;
+        uint enemyFace = info.Face;
+        uint enemyFacePic = info.FacePic;
+
+        myAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
+                                                PlayerDatas.Instance.baseData.face,
+                                                PlayerDatas.Instance.baseData.facePic));
+        enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)tagPlayerID, (int)enemyFace, (int)enemyFacePic));
+        txtMyName.text = PlayerDatas.Instance.baseData.PlayerName;
+        txtEnemyName.text = UIHelper.ServerStringTrim(info.PlayerName);
+        txtMyScore.text = Language.Get("Arena17", atkAddScore);
+        txtEnemyScore.text = Language.Get("Arena21", defDecScore);
+    }
+    List<Item> showItems = new List<Item>();
+    void CreateScroller()
+    {
+
+        showItems.Clear();
+        scroller.Refresh();
+
+        if (!jsonData.ContainsKey("itemInfo"))
+        {
+            return;
+        }
+
+        var resultStr = jsonData["itemInfo"];
+        for (int i = 0; i < resultStr.Count; i++)
+        {
+            showItems.Add(new Item((int)resultStr[i]["ItemID"], (long)resultStr[i]["Count"]));
+        }
+
+        showItems.Sort(SortItem);
+        for (int i = 0; i < showItems.Count; i++)
+        {
+            scroller.AddCell(ScrollerDataType.Header, i);
+        }
+        scroller.Restart();
+    }
+
+    int SortItem(Item itemA, Item itemB)
+    {
+        var itemConfigA = ItemConfig.Get(itemA.id);
+        var itemConfigB = ItemConfig.Get(itemB.id);
+        return itemConfigB.ItemColor - itemConfigA.ItemColor;
+    }
+
+    void OnRefreshCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell as SettlementAwardCell;
+        var item = showItems[cell.index];
+        _cell?.Display(item.id, item.countEx);
+    }
+}
\ No newline at end of file
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/System/Arena/ArenaBattleFailWin.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/System/Arena/ArenaBattleFailWin.cs.meta
index f878724..095f22e 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/System/Arena/ArenaBattleFailWin.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: e168451406b9e004180f67432eb30f58
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Arena/ArenaBattleVictoryWin.cs b/Main/System/Arena/ArenaBattleVictoryWin.cs
new file mode 100644
index 0000000..1cf0f76
--- /dev/null
+++ b/Main/System/Arena/ArenaBattleVictoryWin.cs
@@ -0,0 +1,170 @@
+using System.Collections.Generic;
+using Cysharp.Threading.Tasks;
+using LitJson;
+using UnityEngine;
+
+// 銆愭垬鏂楃粨绠椼��
+// 褰撴敹鍒� // B4 20 鍥炲悎鍒舵垬鏂楃姸鎬� #tagMCTurnFightState    State 涓� 4-缁撶畻锛屾椂锛屼唬琛ㄦ湰鍦烘垬鏂楀凡缁撴潫骞剁粨绠�
+// char Msg[Len]; //size = Len   Msg淇℃伅涓�
+// {"winFaction":鑾疯儨闃佃惀, "statInfo":缁熻淇℃伅, 鈥渋temInfo鈥�:[濂栧姳鐗╁搧淇℃伅鍒楄〃]}
+// 鑾疯儨闃佃惀:   涓�鑸负1鎴栬��2锛屽綋鐜╁鍙戣捣鐨勬垬鏂楁椂锛屽鏋滆幏鑳滈樀钀ヤ笉绛変簬1浠h〃鐜╁澶辫触浜�
+// 缁熻淇℃伅锛� 鏍煎紡  {"闃佃惀缂栧彿":{"闃靛缂栧彿":{"绔欎綅缂栧彿":{璇ユ灏嗙粺璁′俊鎭瓧鍏竲, ...}, ...}, ...}
+// 闃佃惀缂栧彿锛� 涓�鑸椂1鎴�2锛� 瀵瑰簲 B424 鍚屾涓嬪幓鐨勯樀钀�
+// 闃靛缂栧彿锛� 闅跺睘浜庢煇涓樀钀ョ殑闃靛缂栧彿锛屼竴鑸槸浠�1寮�濮嬶紝涓�涓樀钀ュ湪澶歏澶氱殑鎯呭喌涓嬪彲浠ユ湁澶氫釜闃靛
+// 绔欎綅缂栧彿锛� 鏌愪釜闃靛涓灏嗘垬鏂楀疄渚嬬殑绔欎綅缂栧彿锛屼竴鑸粠1寮�濮嬶紝浠h〃绔欎綅1
+// 姝﹀皢缁熻淇℃伅瀛楀吀锛� 鏍煎紡锛� {"ObjID":瀹炰緥ID, "HeroID":鐜╁闃靛姝﹀皢ID, "NPCID":npc琛↖D, "AtkHurt":鎬昏緭鍑�, "DefHurt":鎬绘壙浼�, "CureHP":鎬绘不鐤梷
+
+// 澶勭悊鎴樻枟缁撴潫閫昏緫
+// IsBattleFinish = true;
+// 缁撶畻閫昏緫
+
+// {
+// "itemInfo": [],
+// "winFaction": 1,//鑾疯儨闃佃惀:   涓�鑸负1鎴栬��2锛屽綋鐜╁鍙戣捣鐨勬垬鏂楁椂锛屽鏋滆幏鑳滈樀钀ヤ笉绛変簬1浠h〃鐜╁澶辫触浜�
+// "statInfo": {
+//     "1": {
+//     "1": {
+//         "5": {
+//         "NPCID": 0,
+//         "DefHurt": 633,
+//         "CureHP": 0,
+//         "AtkHurt": 169247,
+//         "ObjID": 1,
+//         "HeroID": 510006
+//         }
+//     }
+//     },
+//     "2": {
+//     "1": {
+//         "2": {
+//         "NPCID": 10101001,
+//         "DefHurt": 169246,
+//         "CureHP": 143096,
+//         "AtkHurt": 999952,
+//         "ObjID": 2,
+//         "HeroID": 0
+//         },
+//         "4": {
+//         "NPCID": 10101001,
+//         "DefHurt": 0,
+//         "CureHP": 0,
+//         "AtkHurt": 0,
+//         "ObjID": 3,
+//         "HeroID": 0
+//         },
+//         "6": {
+//         "NPCID": 10101001,
+//         "DefHurt": 1,
+//         "CureHP": 0,
+//         "AtkHurt": 0,
+//         "ObjID": 4,
+//         "HeroID": 0
+//         }
+//     }
+//     }
+// }
+// }
+
+//"Msg":{"itemInfo":[{"ItemID":5,"Count":2},{"ItemID":3,"Count":40}],"winFaction":1,"statInfo":{"1":{"1":{"1":{"NPCID":0,"DefHurt":727,"CureHP":0,"AtkHurt":1891,"ObjID":1,"HeroID":530004},"3":{"NPCID":0,"DefHurt":483,"CureHP":1511,"AtkHurt":782,"ObjID":6,"HeroID":520001},"2":{"NPCID":0,"DefHurt":953,"CureHP":0,"AtkHurt":1712,"ObjID":5,"HeroID":510003}}},"2":{"1":{"1":{"NPCID":10101091,"DefHurt":638,"CureHP":0,"AtkHurt":140,"ObjID":2,"HeroID":610001},"3":{"NPCID":10101092,"DefHurt":625,"CureHP":0,"AtkHurt":126,"ObjID":3,"HeroID":610001},"5":{"NPCID":10101093,"DefHurt":3122,"CureHP":0,"AtkHurt":1897,"ObjID":4,"HeroID":510003}}}}}
+
+//鎴樺満缁撶畻鐣岄潰锛屽瓨鍦ㄥ涓殑鎯呭喌
+public class ArenaBattleVictoryWin : UIBase
+{
+    [SerializeField] AvatarCell myAvatarCell;
+    [SerializeField] AvatarCell enemyAvatarCell;
+    [SerializeField] TextEx txtMyName;
+    [SerializeField] TextEx txtEnemyName;
+    [SerializeField] TextEx txtMyScore;
+    [SerializeField] TextEx txtEnemyScore;
+
+    [SerializeField] ScrollerController scroller;
+    JsonData jsonData;
+    string guid;
+    protected override void OnPreOpen()
+    {
+        scroller.OnRefreshCell += OnRefreshCell;
+        guid = BattleSettlementManager.Instance.notifyGuid;
+        jsonData = BattleSettlementManager.Instance.GetBattleSettlement(guid);
+        if (jsonData == null)
+        {
+            DelayCloseWindow().Forget();
+            return;
+        }
+        Display();
+        CreateScroller();
+    }
+
+
+    protected override void OnPreClose()
+    {
+        scroller.OnRefreshCell -= OnRefreshCell;
+        BattleSettlementManager.Instance.WinShowOver(guid);
+    }
+    // B4 20 鍥炲悎鍒舵垬鏂楃姸鎬� #tagMCTurnFightState  閫氱敤鐨勭粨绠楃姸鎬� State 4-缁撶畻濂栧姳
+    // Msg 涓澶栦俊鎭�
+    // "tagPlayerID":瀵规垬鐨勭洰鏍嘔D,
+    // "atkAddScore":鍙戣捣鏂瑰鍔犵殑绉垎锛屽彲鑳戒负0,
+    // "defDecScore":琚嚮鏂瑰噺灏戠殑绉垎锛屽彲鑳戒负0,
+    // itemInfo:濂栧姳鐗╁搧鍒楄〃锛屽彲鑳戒负绌�
+    void Display()
+    {
+        if (!jsonData.ContainsKey("tagPlayerID") || !jsonData.ContainsKey("atkAddScore") || !jsonData.ContainsKey("defDecScore"))
+            return;
+        uint tagPlayerID = (uint)jsonData["tagPlayerID"];
+        int atkAddScore = (int)jsonData["atkAddScore"];
+        int defDecScore = (int)jsonData["defDecScore"];
+        if (!ArenaManager.Instance.TryGetPlayerInfo(tagPlayerID, out ArenaMatchInfo info))
+            return;
+        uint enemyFace = info.Face;
+        uint enemyFacePic = info.FacePic;
+
+        myAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
+                                                PlayerDatas.Instance.baseData.face,
+                                                PlayerDatas.Instance.baseData.facePic));
+        enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)tagPlayerID, (int)enemyFace, (int)enemyFacePic));
+        txtMyName.text = PlayerDatas.Instance.baseData.PlayerName;
+        txtEnemyName.text = UIHelper.ServerStringTrim(info.PlayerName);
+        txtMyScore.text = Language.Get("Arena17", atkAddScore);
+        txtEnemyScore.text = Language.Get("Arena21", defDecScore);
+    }
+
+    List<Item> showItems = new List<Item>();
+    void CreateScroller()
+    {
+
+        showItems.Clear();
+        scroller.Refresh();
+
+        if (!jsonData.ContainsKey("itemInfo"))
+        {
+            return;
+        }
+
+        var resultStr = jsonData["itemInfo"];
+        for (int i = 0; i < resultStr.Count; i++)
+        {
+            showItems.Add(new Item((int)resultStr[i]["ItemID"], (long)resultStr[i]["Count"]));
+        }
+
+        showItems.Sort(SortItem);
+        for (int i = 0; i < showItems.Count; i++)
+        {
+            scroller.AddCell(ScrollerDataType.Header, i);
+        }
+        scroller.Restart();
+    }
+
+    int SortItem(Item itemA, Item itemB)
+    {
+        var itemConfigA = ItemConfig.Get(itemA.id);
+        var itemConfigB = ItemConfig.Get(itemB.id);
+        return itemConfigB.ItemColor - itemConfigA.ItemColor;
+    }
+
+    void OnRefreshCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell as SettlementAwardCell;
+        var item = showItems[cell.index];
+        _cell?.Display(item.id, item.countEx);
+    }
+}
\ No newline at end of file
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/System/Arena/ArenaBattleVictoryWin.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/System/Arena/ArenaBattleVictoryWin.cs.meta
index f878724..bda6a54 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/System/Arena/ArenaBattleVictoryWin.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: 4b85bbac1964abf45a57115812f0b39b
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Arena/ArenaChallengeCell.cs b/Main/System/Arena/ArenaChallengeCell.cs
new file mode 100644
index 0000000..159efcf
--- /dev/null
+++ b/Main/System/Arena/ArenaChallengeCell.cs
@@ -0,0 +1,59 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+public class ArenaChallengeCell : MonoBehaviour
+{
+    [SerializeField] AvatarCell avatarCell;
+    [SerializeField] TextEx txtName;
+    [SerializeField] TextEx txtAddScore;
+    [SerializeField] TextEx txtFightPoint;
+    [SerializeField] OfficialTitleCell officialTitleCell;
+    [SerializeField] List<ItemCell> itemCells;
+    [SerializeField] ButtonEx btnChallenge;
+    ArenaMatchInfo arenaMatchInfo;
+    void Start()
+    {
+        btnChallenge.SetListener(() =>
+        {
+            if (arenaMatchInfo == null)
+                return;
+            // 璐у竵涓嶈冻
+            if (!UIHelper.CheckMoneyCount(ArenaManager.Instance.ChallengeMoneyType, ArenaManager.Instance.NeedChallengeMoneyCnt, 1))
+                return;
+            ArenaManager.Instance.atkPlayerId = arenaMatchInfo.PlayerID;
+            ArenaManager.Instance.SendTurnFight(arenaMatchInfo.PlayerID);
+        });
+    }
+
+    public void Display(int index)
+    {
+        List<ArenaMatchInfo> list = ArenaManager.Instance.matchInfoList;
+        if (list.IsNullOrEmpty() || index < 0 || index >= list.Count)
+            return;
+        arenaMatchInfo = list[index];
+
+        avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)arenaMatchInfo.PlayerID, (int)arenaMatchInfo.Face, (int)arenaMatchInfo.FacePic));
+        txtName.text = UIHelper.ServerStringTrim(arenaMatchInfo.PlayerName);
+        txtFightPoint.text = UIHelper.ReplaceLargeArtNum(arenaMatchInfo.FightPower);
+        txtAddScore.text = Language.Get("Arena16", ArenaManager.Instance.GetChallengePoints(index));
+
+        officialTitleCell.InitUI(arenaMatchInfo.RealmLV, (int)arenaMatchInfo.TitleID);
+
+        int[][] rewards = ArenaManager.Instance.fixedChallengeRewards;
+        for (int i = 0; i < itemCells.Count; i++)
+        {
+            var itemCell = itemCells[i];
+            if (!rewards.IsNullOrEmpty() && i < rewards.Length)
+            {
+                int itemCellIndex = i;
+                itemCell.SetActive(true);
+                itemCell.Init(new ItemCellModel(rewards[i][0], true, rewards[i][1]));
+                itemCell.button.SetListener(() => ItemTipUtility.Show(rewards[itemCellIndex][0], true));
+            }
+            else
+            {
+                itemCell.SetActive(false);
+            }
+        }
+    }
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/System/Arena/ArenaChallengeCell.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/System/Arena/ArenaChallengeCell.cs.meta
index f878724..64c782c 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/System/Arena/ArenaChallengeCell.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: 241dd54b1d574284b97aeb85cfed40a2
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Arena/ArenaChallengeVoucher.cs b/Main/System/Arena/ArenaChallengeVoucher.cs
new file mode 100644
index 0000000..f2abeec
--- /dev/null
+++ b/Main/System/Arena/ArenaChallengeVoucher.cs
@@ -0,0 +1,24 @@
+using UnityEngine;
+
+public class ArenaChallengeVoucher : MonoBehaviour
+{
+    [SerializeField] ImageEx imgChallengeMoneyIcon;
+    [SerializeField] TextEx txtChallengeMoneyCount;
+    [SerializeField] ButtonEx btnBuy;
+
+    void Awake()
+    {
+        btnBuy.SetListener(() =>
+        {
+
+        });
+    }
+
+    public void Display()
+    {
+        int type = ArenaManager.Instance.ChallengeMoneyType;
+        int maxChallengeCount = ArenaManager.Instance.GetMaxChallengeCount();
+        imgChallengeMoneyIcon.SetIconWithMoneyType(type);
+        txtChallengeMoneyCount.text = Language.Get("BoneField09", UIHelper.GetMoneyCnt(type), maxChallengeCount);
+    }
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/System/Arena/ArenaChallengeVoucher.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/System/Arena/ArenaChallengeVoucher.cs.meta
index f878724..5460ffd 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/System/Arena/ArenaChallengeVoucher.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: 5aabcebb83427c645b22e283276e1d00
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Arena/ArenaChallengeWin.cs b/Main/System/Arena/ArenaChallengeWin.cs
new file mode 100644
index 0000000..4b74ad5
--- /dev/null
+++ b/Main/System/Arena/ArenaChallengeWin.cs
@@ -0,0 +1,91 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+public class ArenaChallengeWin : UIBase
+{
+    [SerializeField] ArenaChallengeVoucher voucher;
+    [SerializeField] ButtonEx btnRefresh;
+    [SerializeField] TextEx txtFightPoint;
+    [SerializeField] ImageEx imgMoneyIcon;
+    [SerializeField] TextEx txtMoneyCount;
+    [SerializeField] ScrollerController scrollerController;
+
+    protected override void InitComponent()
+    {
+        base.InitComponent();
+        btnRefresh.SetListener(() =>
+        {
+            // 璐у竵涓嶈冻
+            if (!UIHelper.CheckMoneyCount(ArenaManager.Instance.currencyType, ArenaManager.Instance.currencyValue, 1))
+                return;
+            ArenaManager.Instance.SendArenaMatch(true);
+        });
+
+    }
+
+    protected override void OnPreOpen()
+    {
+        base.OnPreOpen();
+        // RankModel.Instance.onRankRefresh += OnRankRefresh;
+        scrollerController.OnRefreshCell += OnRefreshCell;
+        ArenaManager.Instance.OnArenaMatchListEvent += OnArenaMatchListEvent;
+        PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefresh;
+        // ArenaManager.Instance.OnUpdateArenaPlayerInfo += OnUpdateArenaPlayerInfo;
+        // ArenaManager.Instance.OnUpdateGameRecInfo += OnUpdateGameRecInfo;
+        // Display();
+        Display();
+    }
+
+    protected override void OnPreClose()
+    {
+        base.OnPreClose();
+        // RankModel.Instance.onRankRefresh -= OnRankRefresh;
+        scrollerController.OnRefreshCell -= OnRefreshCell;
+        ArenaManager.Instance.OnArenaMatchListEvent -= OnArenaMatchListEvent;
+        PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefresh;
+        // ArenaManager.Instance.OnUpdateArenaPlayerInfo -= OnUpdateArenaPlayerInfo;
+        // ArenaManager.Instance.OnUpdateGameRecInfo -= OnUpdateGameRecInfo;
+    }
+
+    private void PlayerDataRefresh(PlayerDataType type)
+    {
+        if (type != PlayerDataType.ChallengeVoucher)
+            return;
+        Display();
+    }
+
+    private void OnArenaMatchListEvent()
+    {
+        Display();
+
+    }
+
+    private void CreateScroller()
+    {
+        scrollerController.Refresh();
+        List<ArenaMatchInfo> list = ArenaManager.Instance.matchInfoList;
+        if (!list.IsNullOrEmpty())
+        {
+            for (int i = 0; i < list.Count; i++)
+            {
+                scrollerController.AddCell(ScrollerDataType.Header, i);
+            }
+        }
+        scrollerController.Restart();
+    }
+    
+    void OnRefreshCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell.GetComponent<ArenaChallengeCell>();
+        _cell?.Display(cell.index);
+    }
+
+    void Display()
+    {
+        CreateScroller();
+        voucher.Display();
+        txtFightPoint.text = UIHelper.ReplaceLargeArtNum(PlayerDatas.Instance.baseData.FightPower);
+        imgMoneyIcon.SetIconWithMoneyType(ArenaManager.Instance.currencyType);
+        txtMoneyCount.text = UIHelper.ShowUseMoney(ArenaManager.Instance.currencyType, ArenaManager.Instance.currencyValue);
+    }
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/System/Arena/ArenaChallengeWin.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/System/Arena/ArenaChallengeWin.cs.meta
index f878724..e840e79 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/System/Arena/ArenaChallengeWin.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: 1ab89feb7fe3f5e4695c1cf39769fc60
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Arena/ArenaHeroHead.cs b/Main/System/Arena/ArenaHeroHead.cs
new file mode 100644
index 0000000..1895e49
--- /dev/null
+++ b/Main/System/Arena/ArenaHeroHead.cs
@@ -0,0 +1,30 @@
+using UnityEngine;
+
+public class ArenaHeroHead : MonoBehaviour
+{
+    [SerializeField] ImageEx imgQuality;
+    [SerializeField] ImageEx imgHeadIcon;
+    [SerializeField] TextEx txtHeroLv;
+
+    public void Display(int heroID, int skinID, int heroLv)
+    {
+        if (!HeroConfig.HasKey(heroID) || !HeroSkinConfig.HasKey(skinID))
+            return;
+        var heroConfig = HeroConfig.Get(heroID);
+        var heroSkinConfig = HeroSkinConfig.Get(skinID);
+        imgQuality.SetSprite("heroheadBG" + heroConfig.Quality);
+
+        var sprite = UILoader.LoadSprite("HeroHead", heroSkinConfig.SquareIcon);
+        if (sprite == null)
+        {
+            // 鍐呯綉鏈厤缃椂
+            imgHeadIcon.SetSprite("herohead_default");
+        }
+        else
+        {
+            imgHeadIcon.overrideSprite = sprite;
+        }
+
+        txtHeroLv.text = Language.Get("Arena22", heroLv);
+    }
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/System/Arena/ArenaHeroHead.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/System/Arena/ArenaHeroHead.cs.meta
index f878724..f714dab 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/System/Arena/ArenaHeroHead.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: f37aea19aa098294f825fa0dfea4a44e
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Arena/ArenaManager.cs b/Main/System/Arena/ArenaManager.cs
new file mode 100644
index 0000000..c1baa85
--- /dev/null
+++ b/Main/System/Arena/ArenaManager.cs
@@ -0,0 +1,347 @@
+using System.Collections.Generic;
+using UnityEngine;
+using LitJson;
+using System;
+
+public class ArenaManager : GameSystemManager<ArenaManager>
+{
+    public readonly int rankType = 1;    // 姒滃崟绫诲瀷
+    public readonly int funcId = 27;    // 鍔熻兘Id
+    public readonly int recType = 308;  // 婕旀鍦虹帺瀹舵寫鎴樿褰曠被鍨� 308
+    public readonly int ChallengeMoneyType = 53;
+    public readonly int NeedChallengeMoneyCnt = 1;
+    public readonly int RecordType = 308;   // 婕旀鍦虹帺瀹舵寫鎴樿褰�
+    public int initialPoints;   // 鐜╁鍒濆绉垎
+    public int challengeRecordCount;    // 琚寫鎴樿褰曟潯鏁帮紙涓嶈秴杩�50锛�
+    public int challengeTicketLimit;    // 鎸戞垬鍒稿熀纭�瀛樺偍涓婇檺
+    public int[][] fixedChallengeRewards;   // 鍥哄畾鎸戞垬濂栧姳 [[鐗╁搧ID,涓暟], ...]
+    public int[][] matchVictoryPoints;  // 鍖归厤浣嶇疆鎸戞垬鑳滃埄瀵瑰簲澧炲噺绉垎 [[鎸戞垬鏂瑰鍔犵Н鍒�, 闃插畧鏂规墸闄ょН鍒哴, ...]锛岄暱搴﹀嵆涓哄尮閰嶇殑浜烘暟锛屼粠鏈�楂樺垎寮�濮嬮厤缃�
+    public int lowerRankStart;  // 浠庢瘮鑷繁浣庡嚑涓鐨勫悕娆″紑濮嬪尮閰�
+    public int rankStep;    // 姣忎釜鍖归厤娈佃法x鍚嶏紝濡傞厤缃� 2|10锛屽嵆浠h〃浠庤嚜宸卞悕娆″悜鍚�20鍚嶅紑濮嬪尮閰嶏紝姣忚法10鍚嶅尮閰�1浜�
+    public Dictionary<int, int[]> robotMatchCounts; // 鐜╁鎵�鍦ㄥ皬浜庣瓑浜庤鍚嶆瀵瑰簲鍖归厤鏈哄櫒浜烘暟 {鍚嶆:[鍖归厤鏈哄櫒浜烘暟涓嬮檺, 涓婇檺], ...}
+    public int currencyType;    // 鍒锋柊鍖归厤鍥哄畾娑堣�楄揣甯佺被鍨�
+    public int currencyValue;   // 鍒锋柊鍖归厤鍥哄畾娑堣�楄揣甯佸��
+    public Dictionary<int, int[][]> dailyRankRewards; // 姣忔棩鎺掕濂栧姳 {"鍚嶆":[[鐗╁搧ID, 涓暟,鏄惁鎷嶅搧], ...], ...} 閰嶇疆鐨勫悕娆ey锛岃嚜鍔ㄦ寜灏忎簬绛変簬瀵瑰簲鍚嶆缁欏鍔�
+    public Dictionary<int, int[][]> seasonRankRewards;  // 璧涘鎺掕濂栧姳 {"鍚嶆":[[鐗╁搧ID, 涓暟,鏄惁鎷嶅搧], ...], ...}
+
+    public uint score;    // 褰撳墠绉垎
+
+    public List<ArenaMatchInfo> matchInfoList = new List<ArenaMatchInfo>();
+    //鐢ㄤ簬鐢ㄦ潵鎷挎垬鏂楄儨鍒╁け璐ョ殑澶村儚淇℃伅
+    public Dictionary<uint, ArenaMatchInfo> allFaceInfoDict = new Dictionary<uint, ArenaMatchInfo>();
+    public Dictionary<uint, List<ArenaGameRec>> gameRecDict = new Dictionary<uint, List<ArenaGameRec>>(); // <RecID,ArenaGameRec>
+    public uint atkPlayerId;
+    public Redpoint parentRedpoint = new Redpoint(MainRedDot.MainChallengeRedpoint, MainRedDot.ArenaRepoint);
+    public Redpoint challengeButtonRedpoint;
+    public int nowAwardTabIndex = 0;
+    public event Action OnArenaMatchListEvent;
+    public event Action OnUpdateArenaPlayerInfo;
+    public event Action OnUpdateGameRecInfo;
+    public override void Init()
+    {
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitializeEvent;
+        PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefresh;
+        InitTable();
+        InitRedpoint();
+    }
+
+    public override void Release()
+    {
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitializeEvent;
+        PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefresh;
+    }
+
+    public void OnBeforePlayerDataInitializeEvent()
+    {
+        matchInfoList.Clear();
+        gameRecDict.Clear();
+        allFaceInfoDict.Clear();
+    }
+
+    void InitRedpoint()
+    {
+        challengeButtonRedpoint = new Redpoint(MainRedDot.ArenaRepoint, GetRedPonitId(1));
+    }
+
+    void InitTable()
+    {
+        FuncConfigConfig config = FuncConfigConfig.Get("ArenaSet");
+        initialPoints = int.Parse(config.Numerical1);
+        challengeRecordCount = int.Parse(config.Numerical2);
+        challengeTicketLimit = int.Parse(config.Numerical3);
+        fixedChallengeRewards = JsonMapper.ToObject<int[][]>(config.Numerical4);
+
+        config = FuncConfigConfig.Get("ArenaMatch");
+        matchVictoryPoints = JsonMapper.ToObject<int[][]>(config.Numerical1);
+        string[] matchParams = config.Numerical2.Split('|');
+        lowerRankStart = int.Parse(matchParams[0]);
+        rankStep = int.Parse(matchParams[1]);
+        robotMatchCounts = ConfigParse.GetDic<int, int[]>(config.Numerical3);
+        string[] costParams = config.Numerical4.Split('|');
+        currencyType = int.Parse(costParams[0]);
+        currencyValue = int.Parse(costParams[1]);
+
+        config = FuncConfigConfig.Get("ArenaBillboradAward");
+        dailyRankRewards = ConfigParse.ParseIntArray2Dict(config.Numerical1);
+        seasonRankRewards = ConfigParse.ParseIntArray2Dict(config.Numerical2);
+    }
+    public void UpdateRedPonit()
+    {
+        parentRedpoint.state = RedPointState.None;
+        challengeButtonRedpoint.state = RedPointState.None;
+
+        if (!FuncOpen.Instance.IsFuncOpen(funcId))
+            return;
+
+        if (UIHelper.GetMoneyCnt(ChallengeMoneyType) > 0)
+        {
+            challengeButtonRedpoint.state = RedPointState.Simple;
+        }
+    }
+
+    public bool TryGetPlayerInfo(uint playerID, out ArenaMatchInfo info)
+    {
+        return allFaceInfoDict.TryGetValue(playerID, out info);
+    }
+
+    // 1 鎸戞垬鎸夐挳
+    public int GetRedPonitId(int num)
+    {
+        return MainRedDot.ArenaRepoint * 10 + num;
+    }
+
+    private void PlayerDataRefresh(PlayerDataType type)
+    {
+        if (type != PlayerDataType.ChallengeVoucher)
+            return;
+        UpdateRedPonit();
+    }
+
+    public int GetMaxChallengeCount()
+    {
+        return challengeTicketLimit;
+    }
+
+    public void OnArenaMatchList(HA922_tagSCArenaMatchList vNetData)
+    {
+        if (vNetData == null || vNetData.MatchList.IsNullOrEmpty())
+            return;
+
+        matchInfoList.Clear();
+
+        foreach (var item in vNetData.MatchList)
+        {
+            var matchInfo = new ArenaMatchInfo
+            {
+                PlayerID = item.PlayerID,
+                PlayerName = item.PlayerName,
+                Lv = item.LV,
+                RealmLV = item.RealmLV,
+                FightPower = (ulong)item.FightPowerEx * 100000000 + (ulong)item.FightPower,
+                Face = item.Face,
+                FacePic = item.FacePic
+            };
+            matchInfoList.Add(matchInfo);
+            allFaceInfoDict[item.PlayerID] = matchInfo;
+        }
+        matchInfoList.Reverse();
+        OnArenaMatchListEvent?.Invoke();
+    }
+
+
+    public void UpdateArenaPlayerInfo(HA923_tagSCArenaPlayerInfo vNetData)
+    {
+        if (vNetData == null)
+            return;
+        this.score = vNetData.Score;
+        OnUpdateArenaPlayerInfo?.Invoke();
+    }
+    public void UpdateGameRecInfo(HA009_tagSCGameRecInfo vNetData)
+    {
+        if (vNetData == null || vNetData.RecType != recType)
+            return;
+        gameRecDict.Clear();
+        uint recID = vNetData.RecID;
+        if (!gameRecDict.ContainsKey(recID))
+            gameRecDict[recID] = new List<ArenaGameRec>();
+        foreach (var rec in vNetData.RecList)
+        {
+            try
+            {
+                var userData = JsonMapper.ToObject(rec.UserData);
+                string name = userData["Name"].ToString();
+                int addScore = int.Parse(userData["AddScore"].ToString());
+                ulong fightPower = ulong.Parse(userData["FightPower"].ToString());
+
+                var arenaGameRec = new ArenaGameRec
+                {
+                    Time = rec.Time,
+                    Value1 = rec.Value1,
+                    Value2 = rec.Value2,
+                    Value3 = rec.Value3,
+                    Value4 = rec.Value4,
+                    Value5 = rec.Value5,
+                    Value6 = rec.Value6,
+                    Value7 = rec.Value7,
+                    Value8 = rec.Value8,
+                    Name = name,
+                    AddScore = addScore,
+                    FightPower = fightPower
+                };
+
+                gameRecDict[recID].Add(arenaGameRec);
+
+                if (recID == PlayerDatas.Instance.baseData.PlayerID)
+                {
+                    allFaceInfoDict[rec.Value3] = new ArenaMatchInfo
+                    {
+                        Face = rec.Value5,
+                        FacePic = rec.Value6,
+                        RealmLV = (ushort)rec.Value7,
+                        Lv = (ushort)rec.Value8,
+                        PlayerName = name,
+                        FightPower = fightPower,
+                    };
+                }
+
+            }
+            catch (Exception ex)
+            {
+                Debug.LogError($"JSON瑙f瀽閿欒: {ex.Message}, UserData: {rec.UserData}");
+                continue;
+            }
+        }
+        OnUpdateGameRecInfo?.Invoke();
+    }
+
+
+    public Dictionary<int, int[][]> GetArenaAwardDict(int functionOrder)
+    {
+        return functionOrder == 0 ? dailyRankRewards : seasonRankRewards;
+    }
+
+    public void SendViewGameRecPack()
+    {
+        CA008_tagCSViewGameRec pack = new CA008_tagCSViewGameRec();
+        pack.RecType = (ushort)RecordType;
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
+    public void SendArenaMatch(bool isRefresh = false)
+    {
+        CB209_tagCSArenaMatch pack = new CB209_tagCSArenaMatch();
+        pack.IsRefresh = isRefresh ? (byte)1 : (byte)0;
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
+    public void SendTurnFight(uint playerID)
+    {
+        CB410_tagCMTurnFight pack = new CB410_tagCMTurnFight();
+        pack.MapID = 3;
+        pack.TagType = 1;
+        pack.TagID = playerID;
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
+    public bool IsTimeInvalid(uint time)
+    {
+        DateTime dateTime = TimeUtility.GetTime(time);
+        GetCurrentSeasonDates(out DateTime seasonStartDate, out DateTime seasonEndDate);
+        return dateTime < seasonStartDate || dateTime > seasonEndDate;
+    }
+
+    /// <summary>
+    /// 鏍规嵁绱㈠紩鍜屾帓搴忔柟鍚戣幏鍙栫Н鍒�
+    /// </summary>
+    /// <param name="index">绱㈠紩浣嶇疆锛堜粠0寮�濮嬶級</param>
+    /// <param name="isAscending">true-姝e簭锛宖alse-鍊掑簭</param>
+    /// <param name="isChallenger">true-鎸戞垬鏂瑰鍔犵Н鍒嗭紝false-闃插畧鏂规墸闄ょН鍒�</param>
+    /// <returns>瀵瑰簲鐨勭Н鍒嗗��</returns>
+    public int GetChallengePoints(int index, bool isAscending = false, bool isChallenger = true)
+    {
+        // 妫�鏌ョ储寮曟槸鍚﹀湪鏈夋晥鑼冨洿鍐�
+        if (matchVictoryPoints.IsNullOrEmpty() || index < 0 || index >= matchVictoryPoints.Length)
+            return 0;
+        int targetIndex = isAscending ? index : matchVictoryPoints.Length - 1 - index;
+        return matchVictoryPoints[targetIndex][isChallenger ? 0 : 1];
+    }
+
+    /// <summary>
+    /// 鑾峰緱褰撳墠璧涘鐨勮捣姝㈡棩鏈熴�傝禌瀛d粠鍛ㄤ竴 00:00:00 寮�濮嬶紝鍒板懆鏃� 23:59:59 缁撴潫銆�
+    /// 鏈嶅姟绔畾涔夊懆涓�涓烘瘡鍛ㄧ殑绗竴澶┿��
+    /// </summary>
+    /// <param name="seasonStartDate">杈撳嚭鍙傛暟锛氳禌瀛g殑璧峰鏃ユ湡锛堟湰鍛ㄤ竴 00:00:00锛�</param>
+    /// <param name="seasonEndDate">杈撳嚭鍙傛暟锛氳禌瀛g殑缁撴潫鏃ユ湡锛堟湰鍛ㄦ棩 23:59:59锛�</param>
+    public void GetCurrentSeasonDates(out DateTime seasonStartDate, out DateTime seasonEndDate)
+    {
+        DateTime now = TimeUtility.ServerNow;
+        // 鍦� .NET 涓紝DayOfWeek 鏋氫妇 Sunday = 0, Monday = 1, ..., Saturday = 6銆�
+        // 涓轰簡绗﹀悎鍛ㄤ竴鏄竴鍛ㄧ涓�澶╃殑璁$畻鏍囧噯锛屾垜浠皢鍛ㄦ棩瑙嗕负涓�鍛ㄧ殑绗�7澶┿��
+        int currentDayOfWeek = (int)now.DayOfWeek;
+        if (currentDayOfWeek == 0) // 濡傛灉鏄懆鏃� (Sunday = 0)
+        {
+            currentDayOfWeek = 7;
+        }
+
+        // 浠庡綋鍓嶆棩鏈熷噺鍘荤浉搴旂殑澶╂暟锛屽緱鍒板懆涓�鐨勬棩鏈熴��
+        // 渚嬪锛屽鏋滄槸鍛ㄤ笁(3)锛屽垯闇�瑕佸噺鍘� 3-1=2 澶┿��
+        // 濡傛灉鏄懆鏃�(7)锛屽垯闇�瑕佸噺鍘� 7-1=6 澶┿��
+        DateTime monday = now.AddDays(-(currentDayOfWeek - 1));
+        // 璁剧疆璧涘鐨勮捣濮嬫椂闂翠负鍛ㄤ竴鐨� 0鐐�0鍒�0绉�
+        seasonStartDate = new DateTime(monday.Year, monday.Month, monday.Day, 0, 0, 0);
+        // 璧涘鐨勭粨鏉熸棩鏈熸槸寮�濮嬫棩鏈燂紙鍛ㄤ竴锛夊姞涓�6澶╋紝鍗冲懆鏃�
+        DateTime sunday = seasonStartDate.AddDays(6);
+        // 璁剧疆璧涘鐨勭粨鏉熸椂闂翠负鍛ㄦ棩鐨� 23鐐�59鍒�59绉�
+        seasonEndDate = new DateTime(sunday.Year, sunday.Month, sunday.Day, 23, 59, 59);
+    }
+
+    /// <summary>
+    /// 鏍规嵁recID鑾峰彇鎸夋椂闂翠粠澶у埌灏忔帓搴忕殑List<ArenaGameRec>
+    /// </summary>
+    /// <param name="recID">璁板綍ID</param>
+    /// <param name="sortedList">杈撳嚭鍙傛暟锛氭寜鏃堕棿浠庡ぇ鍒板皬鎺掑簭鐨凙renaGameRec鍒楄〃</param>
+    /// <returns>濡傛灉recID瀛樺湪涓旀垚鍔熻幏鍙栧垪琛ㄨ繑鍥瀟rue锛屽惁鍒欒繑鍥瀎alse</returns>
+    public bool TryGetSortedArenaGameRecList(uint recID, out List<ArenaGameRec> sortedList)
+    {
+        sortedList = null;
+        if (!gameRecDict.ContainsKey(recID))
+            return false;
+        sortedList = new List<ArenaGameRec>(gameRecDict[recID]);
+        sortedList.Sort((a, b) => b.Time.CompareTo(a.Time)); // 鎸夋椂闂翠粠澶у埌灏忔帓搴�
+        return true;
+    }
+}
+
+
+
+
+public class ArenaMatchInfo
+{
+    public uint PlayerID;        //鐩爣鐜╁ID
+    public string PlayerName;
+    public ushort Lv;             //绛夌骇
+    public ushort RealmLV;        //澧冪晫锛屾満鍣ㄤ汉璇诲鐣岃〃鍙栫瓑绾у搴斿鐣�
+    public uint TitleID;
+    public ulong FightPower;        //鎴樺姏
+    public uint Face;        //鍩烘湰鑴稿瀷
+    public uint FacePic;        //澶村儚妗�
+
+}
+
+public class ArenaGameRec
+{
+    public uint Time;        //鎴樻枟鏃堕棿鎴�
+    public uint Value1;        //鏇存柊绉垎锛屾垬鏂楀悗鐨勬渶缁堢Н鍒�
+    public uint Value2;        //鏀诲嚮绫诲瀷 1-鍙戣捣鏀诲嚮鐨勶紝2-琚敾鍑荤殑
+    public uint Value3;        //鐩稿鏀诲嚮绫诲瀷鐨勭洰鏍囩帺瀹禝D
+    public uint Value4;        //鏄惁鑾疯儨 1-鑾疯儨锛�2-澶辫触
+    public uint Value5;        //鐩爣澶村儚
+    public uint Value6;        //鐩爣澶村儚妗�
+    public uint Value7;        //鐩爣瀹樿亴
+    public uint Value8;        //鐩爣绛夌骇
+    public string Name;         //鐩爣鍚嶇О
+    public int AddScore;        //鏈鑷繁鍙樻洿鐨勭Н鍒嗭紝鏈夋璐�
+    public ulong FightPower;    //鐩爣鎴樺姏
+    public int TitileId; //鏈潵鎺ュ叆
+
+}
\ No newline at end of file
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/System/Arena/ArenaManager.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/System/Arena/ArenaManager.cs.meta
index f878724..a3aa48b 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/System/Arena/ArenaManager.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: 7a403f8e8b73bb443acd4352e1c1c00f
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Arena/ArenaPlayerRankCell.cs b/Main/System/Arena/ArenaPlayerRankCell.cs
new file mode 100644
index 0000000..917c711
--- /dev/null
+++ b/Main/System/Arena/ArenaPlayerRankCell.cs
@@ -0,0 +1,70 @@
+using UnityEngine;
+using UnityEngine.UI;
+
+public class ArenaPlayerRankCell : MonoBehaviour
+{
+    [SerializeField] AvatarCell avatarCell;
+    [SerializeField] Text rankText;
+    [SerializeField] Text rankValueText;    //鎺掑悕姣旇緝鍐呭
+    [SerializeField] Text nameText;
+    [SerializeField] OfficialTitleCell officialTitleCell;
+    [SerializeField] Button queryPlayerBtn; //鍚庣画娣诲姞鐐瑰嚮鏌ョ湅鐜╁璇︽儏
+
+
+    // rank 涓�0 浠h〃鐜╁鑷繁
+    public void Display(int rankType, int rank, string valueFormat)
+    {
+        RankData rankData = null;
+        if (rank != 0)
+        {
+            rankData = RankModel.Instance.GetRankDataByRank(rankType, rank);
+        }
+        else
+        {
+            rankData = RankModel.Instance.GetMyRank(rankType);
+            if (rankData == null)
+            {
+                //鍙栫帺瀹惰嚜宸辩殑鏁版嵁
+                avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
+                                                PlayerDatas.Instance.baseData.face,
+                                                PlayerDatas.Instance.baseData.facePic));
+                rankText.text = Language.Get("L1045");
+                rankValueText.text = ArenaManager.Instance.score.ToString();
+                nameText.text = PlayerDatas.Instance.baseData.PlayerName;
+                officialTitleCell.InitUI(PlayerDatas.Instance.baseData.realmLevel, PlayerDatas.Instance.baseData.TitleID);
+                return;
+            }
+            rank = rankData.rank;
+        }
+        if (rankData == null)
+        {
+            officialTitleCell.SetActive(false);
+            avatarCell.SetActive(false);
+            nameText.text = Language.Get("L1124");
+            rankValueText.text = "0";//Language.Get("L1125");
+        }
+        else
+        {
+            officialTitleCell.SetActive(true);
+            officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2);
+            avatarCell.SetActive(true);
+            avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)rankData.id, (int)rankData.value3, (int)rankData.value4));
+            nameText.text = rankData.name1;
+            rankValueText.text = string.Format(valueFormat, UIHelper.ReplaceLargeNum(rankData.cmpValue));
+        }
+
+        rankText.text = rank.ToString();
+        if (queryPlayerBtn != null)
+        {
+            queryPlayerBtn.AddListener(() =>
+            {
+
+            });
+        }
+    }
+}
+
+
+
+
+
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/System/Arena/ArenaPlayerRankCell.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/System/Arena/ArenaPlayerRankCell.cs.meta
index f878724..5ccd274 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/System/Arena/ArenaPlayerRankCell.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: 88b05b28e044ffc4cbe09e000d6a5a08
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Arena/ArenaPlayerTop3Cell.cs b/Main/System/Arena/ArenaPlayerTop3Cell.cs
new file mode 100644
index 0000000..a49221b
--- /dev/null
+++ b/Main/System/Arena/ArenaPlayerTop3Cell.cs
@@ -0,0 +1,35 @@
+using UnityEngine;
+using UnityEngine.UI;
+
+public class ArenaPlayerTop3Cell : MonoBehaviour
+{
+    //[SerializeField] Model 鏄剧ずNPC 姝﹀皢妯″瀷
+    [SerializeField] Text rankValueText;    //鎺掑悕姣旇緝鍐呭
+    [SerializeField] Text nameText;
+    [SerializeField] OfficialTitleCell officialTitleCell;
+    [SerializeField] Button queryPlayerBtn; //鍚庣画娣诲姞鐐瑰嚮鏌ョ湅鐜╁璇︽儏
+    [SerializeField] UIHeroController model;
+
+    public void Display(int rankType, int rank, string valueFormat = "{0}")
+    {
+        var rankData = RankModel.Instance.GetRankDataByRank(rankType, rank);
+        if (rankData == null)
+        {
+            rankValueText.text = "0";//Language.Get("L1125");
+            nameText.text = Language.Get("L1124");
+            officialTitleCell.SetActive(false);
+            return;
+        }
+        officialTitleCell.SetActive(true);
+        rankValueText.text = string.Format(valueFormat, UIHelper.ReplaceLargeNum(rankData.cmpValue));
+        nameText.text = rankData.name1;
+        officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2);
+        model.Create((int)rankData.value5, 1);
+    }
+
+
+}
+
+
+
+
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/System/Arena/ArenaPlayerTop3Cell.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/System/Arena/ArenaPlayerTop3Cell.cs.meta
index f878724..b767de8 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/System/Arena/ArenaPlayerTop3Cell.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: 478726dd88ca04047a63760c746634e5
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Arena/ArenaRecordCell.cs b/Main/System/Arena/ArenaRecordCell.cs
new file mode 100644
index 0000000..9e4470f
--- /dev/null
+++ b/Main/System/Arena/ArenaRecordCell.cs
@@ -0,0 +1,98 @@
+using System.Collections.Generic;
+using UnityEngine;
+using System;
+
+public class ArenaRecordCell : MonoBehaviour
+{
+    [SerializeField] AvatarCell avatarCell;
+    [SerializeField] TextEx txtName;
+    [SerializeField] TextEx txtDate;
+    [SerializeField] TextEx txtFightPoint;
+    [SerializeField] TextEx txtState;
+    [SerializeField] TextEx txtAdd;
+    [SerializeField] TextEx txtTimeInvalid;
+    [SerializeField] TextEx txtNeedCount;
+    [SerializeField] ImageEx imgMoneyIcon;
+    [SerializeField] ImageEx imgType;
+    [SerializeField] Transform transChallenge;
+    [SerializeField] OfficialTitleCell officialTitleCell;
+    [SerializeField] ButtonEx btnChallenge;
+    ArenaGameRec arenaGameRec;
+    void Start()
+    {
+        btnChallenge.SetListener(() =>
+        {
+            if (arenaGameRec == null)
+                return;
+            ArenaManager.Instance.SendTurnFight(arenaGameRec.Value3);
+            ArenaManager.Instance.atkPlayerId = arenaGameRec.Value3;
+        });
+    }
+
+    public void Display(int index)
+    {
+        uint playerID = PlayerDatas.Instance.baseData.PlayerID;
+        ArenaManager.Instance.TryGetSortedArenaGameRecList(playerID, out List<ArenaGameRec> sortedList);
+        if (sortedList.IsNullOrEmpty() || index < 0 || index >= sortedList.Count)
+            return;
+        arenaGameRec = sortedList[index];
+        imgType.SetSprite(arenaGameRec.Value2 == 1 ? "ArenaRecordTypeAtk" : "ArenaRecordTypeDef");
+        txtDate.text = FormatTime(arenaGameRec.Time);
+        // true 宸插け鏁� false 鏈け鏁�
+        bool isTimeInvalid = ArenaManager.Instance.IsTimeInvalid(arenaGameRec.Time);
+        // 鍙戣捣鏀诲嚮,鎵撹耽鏈夌Н鍒�,鎵撹緭娌℃湁
+        //琚敾鍑荤殑,鎵撹耽娌℃湁绉垎,鎵撹緭鎵gН鍒�
+        // 0 鎵撳埆浜鸿儨鍒� 1 鎵撳埆浜鸿緭 2 琚墦锛屾垜璧� 3 琚墦锛屾垜杈�
+        int state = GetState(arenaGameRec.Value2, arenaGameRec.Value4);
+        transChallenge.SetActive(!isTimeInvalid && state == 3);
+        txtTimeInvalid.SetActive(isTimeInvalid);
+        if (state == 0 || state == 2)
+        {
+            txtState.text = UIHelper.AppendColor(TextColType.Green, Language.Get("Arena09"));
+            txtAdd.text = UIHelper.AppendColor(TextColType.Green, Language.Get("Arena17", arenaGameRec.AddScore));
+        }
+        else
+        {
+            txtState.text = UIHelper.AppendColor(TextColType.Red, Language.Get("Arena10"));
+            if (arenaGameRec.AddScore == 0)
+            {
+                txtAdd.text = UIHelper.AppendColor(TextColType.Red, Language.Get("Arena21", arenaGameRec.AddScore));
+            }
+            else
+            {
+                txtAdd.text = UIHelper.AppendColor(TextColType.Red, Language.Get("Arena18", arenaGameRec.AddScore));
+            }
+
+        }
+        avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)arenaGameRec.Value3, (int)arenaGameRec.Value5, (int)arenaGameRec.Value6));
+        txtName.text = arenaGameRec.Name;
+        txtFightPoint.text = UIHelper.ReplaceLargeArtNum(arenaGameRec.FightPower);
+        officialTitleCell.InitUI(PlayerDatas.Instance.baseData.realmLevel, PlayerDatas.Instance.baseData.TitleID);
+        imgMoneyIcon.SetIconWithMoneyType(ArenaManager.Instance.ChallengeMoneyType);
+        txtNeedCount.text = ArenaManager.Instance.NeedChallengeMoneyCnt.ToString();
+    }
+
+    // 0 鎵撳埆浜鸿儨鍒� 1 鎵撳埆浜鸿緭 2 琚墦锛屾垜璧� 3 琚墦锛屾垜杈�
+    public int GetState(uint isAtk, uint isWin)
+    {
+        if (isAtk == 1) // 鍙戣捣鏀诲嚮
+        {
+            return isWin == 1 ? 0 : 1;
+        }
+        else // 琚敾鍑�
+        {
+            return isWin == 1 ? 2 : 3;
+        }
+    }
+
+    /// <summary>
+    /// 鏍煎紡鍖栨椂闂存埑涓� "鏈�-鏃� 鏃�:鍒�:绉�" 鏍煎紡
+    /// </summary>
+    /// <param name="timeStamp">鏃堕棿鎴�</param>
+    /// <returns>鏍煎紡鍖栧悗鐨勬椂闂村瓧绗︿覆</returns>
+    private string FormatTime(uint timeStamp)
+    {
+        DateTime dateTime = TimeUtility.GetTime(timeStamp);
+        return dateTime.ToString("MM-dd HH:mm:ss");
+    }
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/System/Arena/ArenaRecordCell.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/System/Arena/ArenaRecordCell.cs.meta
index f878724..547c228 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/System/Arena/ArenaRecordCell.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: e830b4133d825fc4086c135f1446b842
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Arena/ArenaRecordWin.cs b/Main/System/Arena/ArenaRecordWin.cs
new file mode 100644
index 0000000..5222834
--- /dev/null
+++ b/Main/System/Arena/ArenaRecordWin.cs
@@ -0,0 +1,87 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+public class ArenaRecordWin : UIBase
+{
+    [SerializeField] ArenaChallengeVoucher voucher;
+    [SerializeField] TextEx txtFightPoint;
+    [SerializeField] ScrollerController scrollerController;
+    [SerializeField] Transform transNoRecord;
+    protected override void InitComponent()
+    {
+        base.InitComponent();
+    }
+
+    protected override void OnPreOpen()
+    {
+        base.OnPreOpen();
+        scrollerController.OnRefreshCell += OnRefreshCell;
+        ArenaManager.Instance.OnArenaMatchListEvent += OnArenaMatchListEvent;
+        PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefresh;
+        ArenaManager.Instance.OnUpdateGameRecInfo += OnUpdateGameRecInfo;
+        GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
+        transNoRecord.SetActive(false);
+        Display();
+    }
+
+    protected override void OnPreClose()
+    {
+        base.OnPreClose();
+        scrollerController.OnRefreshCell -= OnRefreshCell;
+        ArenaManager.Instance.OnArenaMatchListEvent -= OnArenaMatchListEvent;
+        PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefresh;
+        ArenaManager.Instance.OnUpdateGameRecInfo -= OnUpdateGameRecInfo;
+        GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
+    }
+
+    private void OnSecondEvent()
+    {
+        scrollerController.m_Scorller.RefreshActiveCellViews();
+    }
+
+    private void OnUpdateGameRecInfo()
+    {
+        Display();
+    }
+
+    private void PlayerDataRefresh(PlayerDataType type)
+    {
+        if (type != PlayerDataType.ChallengeVoucher)
+            return;
+        Display();
+    }
+
+    private void OnArenaMatchListEvent()
+    {
+        Display();
+    }
+
+    void OnRefreshCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell.GetComponent<ArenaRecordCell>();
+        _cell?.Display(cell.index);
+    }
+
+    private void CreateScroller()
+    {
+        scrollerController.Refresh();
+        uint playerID = PlayerDatas.Instance.baseData.PlayerID;
+        ArenaManager.Instance.TryGetSortedArenaGameRecList(playerID, out List<ArenaGameRec> sortedList);
+        if (!sortedList.IsNullOrEmpty())
+        {
+            transNoRecord.SetActive(false);
+            for (int i = 0; i < sortedList.Count; i++)
+            {
+                scrollerController.AddCell(ScrollerDataType.Header, i);
+            }
+        }
+        scrollerController.Restart();
+    }
+
+    void Display()
+    {
+        CreateScroller();
+        voucher.Display();
+        txtFightPoint.text = UIHelper.ReplaceLargeArtNum(PlayerDatas.Instance.baseData.FightPower);
+    }
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/System/Arena/ArenaRecordWin.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/System/Arena/ArenaRecordWin.cs.meta
index f878724..59da7e5 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/System/Arena/ArenaRecordWin.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: 91107595693c34d46aeb83c7fac01f39
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Arena/ArenaWin.cs b/Main/System/Arena/ArenaWin.cs
new file mode 100644
index 0000000..33dd592
--- /dev/null
+++ b/Main/System/Arena/ArenaWin.cs
@@ -0,0 +1,141 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+public class ArenaWin : UIBase
+{
+    [SerializeField] ButtonEx btnClose;
+    [SerializeField] ButtonEx btnRecord;
+    [SerializeField] ButtonEx btnAward;
+    [SerializeField] ButtonEx btnChallage;
+    [SerializeField] RedpointBehaviour rpChallage;
+    [SerializeField] ButtonEx btnDeployTroops;
+    [SerializeField] List<ArenaPlayerTop3Cell> playerTop3Cells;
+    [SerializeField] ScrollerController scrollerController;
+    [SerializeField] ArenaPlayerRankCell myRankCell;
+    [SerializeField] ArenaChallengeVoucher voucher;
+    [HideInInspector] public int groupValue1 = 0;   //涓�鑸敤浜庤法鏈�
+    [HideInInspector] public int groupValue2 = 0;   //涓�鑸敤浜庤法鏈�
+    [HideInInspector] public string valueFormat = "{0}";
+
+    protected override void InitComponent()
+    {
+        base.InitComponent();
+        btnClose.SetListener(() => UIManager.Instance.CloseWindow<ArenaWin>());
+        btnAward.SetListener(() => UIManager.Instance.OpenWindow<ArenaAwardWin>());
+        btnRecord.SetListener(() =>
+        {
+            ArenaManager.Instance.SendViewGameRecPack();
+            UIManager.Instance.OpenWindow<ArenaRecordWin>();
+        });
+        btnChallage.SetListener(() =>
+        {
+            ArenaManager.Instance.SendArenaMatch();
+            UIManager.Instance.OpenWindow<ArenaChallengeWin>();
+        });
+        btnDeployTroops.SetListener(() =>
+        {
+            HeroUIManager.Instance.selectTeamType = TeamType.ArenaDefense;
+            UIManager.Instance.OpenWindow<HeroPosWin>();
+        });
+    }
+
+    protected override void OnPreOpen()
+    {
+        base.OnPreOpen();
+        RankModel.Instance.ResetQueryParam();
+        RankModel.Instance.QueryRankByPage(ArenaManager.Instance.rankType, watchID: (int)PlayerDatas.Instance.baseData.PlayerID);
+        rpChallage.redpointId = ArenaManager.Instance.GetRedPonitId(1);
+    }
+
+    protected override void NextFrameAfterOpen()
+    {
+        RankModel.Instance.onRankRefresh += OnRankRefresh;
+        scrollerController.OnRefreshCell += OnRefreshCell;
+        ArenaManager.Instance.OnArenaMatchListEvent += OnArenaMatchListEvent;
+        ArenaManager.Instance.OnUpdateArenaPlayerInfo += OnUpdateArenaPlayerInfo;
+        ArenaManager.Instance.OnUpdateGameRecInfo += OnUpdateGameRecInfo;
+        PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefresh;
+        Display();
+    }
+
+    protected override void OnPreClose()
+    {
+        base.OnPreClose();
+        RankModel.Instance.onRankRefresh -= OnRankRefresh;
+        scrollerController.OnRefreshCell -= OnRefreshCell;
+        ArenaManager.Instance.OnArenaMatchListEvent -= OnArenaMatchListEvent;
+        ArenaManager.Instance.OnUpdateArenaPlayerInfo -= OnUpdateArenaPlayerInfo;
+        ArenaManager.Instance.OnUpdateGameRecInfo -= OnUpdateGameRecInfo;
+        PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefresh;
+    }
+
+    private void PlayerDataRefresh(PlayerDataType type)
+    {
+        if (type != PlayerDataType.ChallengeVoucher)
+            return;
+        Display();
+    }
+
+    void OnRefreshCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell.GetComponent<ArenaPlayerRankCell>();
+        _cell.Display(ArenaManager.Instance.rankType, cell.index + 1, valueFormat);
+        RankModel.Instance.ListenRankPage(ArenaManager.Instance.rankType, cell.index, groupValue1, groupValue2);
+    }
+
+    private void OnUpdateArenaPlayerInfo()
+    {
+        Display();
+    }
+
+    private void OnArenaMatchListEvent()
+    {
+        Display();
+    }
+
+    private void OnUpdateGameRecInfo()
+    {
+        Display();
+    }
+
+    private void Display()
+    {
+        voucher.Display();
+        CreateScroller();
+        DisplayMyRank();
+        DisplayTop3();
+    }
+
+    void CreateScroller()
+    {
+        scrollerController.Refresh();
+        var cnt = RankModel.Instance.GetRankShowMaxCnt(ArenaManager.Instance.rankType);
+        for (int i = 3; i < cnt; i++)
+        {
+            scrollerController.AddCell(ScrollerDataType.Header, i);
+        }
+        scrollerController.Restart();
+    }
+
+    void DisplayMyRank()
+    {
+        myRankCell.Display(ArenaManager.Instance.rankType, 0, ArenaManager.Instance.score.ToString());
+    }
+
+    void DisplayTop3()
+    {
+        for (int i = 0; i < playerTop3Cells.Count; i++)
+        {
+            playerTop3Cells[i].Display(ArenaManager.Instance.rankType, i + 1);
+        }
+    }
+
+    void OnRankRefresh(int type)
+    {
+        if (type != ArenaManager.Instance.rankType)
+            return;
+        DisplayTop3();
+        scrollerController.m_Scorller.RefreshActiveCellViews();
+        DisplayMyRank();
+    }
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/System/Arena/ArenaWin.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/System/Arena/ArenaWin.cs.meta
index f878724..02c46a4 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/System/Arena/ArenaWin.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: c2491f5ebae5bc041a14d081fd07e801
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Arena/BuyItemWin.cs b/Main/System/Arena/BuyItemWin.cs
new file mode 100644
index 0000000..65dcb71
--- /dev/null
+++ b/Main/System/Arena/BuyItemWin.cs
@@ -0,0 +1,119 @@
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+public class BuyItemWin : UIBase
+{
+
+    [SerializeField] ItemCell itemCell;
+    [SerializeField] Text nameText;
+    [SerializeField] Text descText;
+    //[SerializeField] ScrollerController scroller;
+    [SerializeField] SliderPanel sliderPanel;
+    [SerializeField] Button openButton;
+
+    //[SerializeField] CellView _InitCell;
+
+    string guid;
+    int itemID;
+    int itemCount;
+    int useCnt;
+    List<Item> items;
+    protected override void InitComponent()
+    {
+        openButton.AddListener(() =>
+        {
+            if (useCnt == 0)
+            {
+                CloseWindow();
+                return;
+            }
+            if (ItemLogicUtility.Instance.UseItem(guid, useCnt))
+            {
+                CloseWindow();
+            }
+        });
+    }
+
+    protected override void Start()
+    {
+        //_InitCell.cellIdentifier = _InitCell.cellIdentifier + this.GetInstanceID().ToString();
+    }
+
+
+    protected override void OnPreOpen()
+    {
+        itemID = ItemTipUtility.mainTipData.baseInfo.itemId;
+        itemCount = ItemTipUtility.mainTipData.baseInfo.count;
+        guid = ItemTipUtility.mainTipData.guid;
+
+        itemCell.Init(new ItemCellModel(itemID, false, itemCount));
+        var itemConfig = ItemConfig.Get(itemID);
+        nameText.text = itemConfig.ItemName;
+        descText.text = itemConfig.Description;
+
+        if (string.IsNullOrEmpty(guid))
+        {
+            openButton.SetActive(false);
+            sliderPanel.SetActive(false);
+        }
+        else
+        {
+            openButton.SetActive(true);
+            sliderPanel.SetActive(true);
+        }
+
+        sliderPanel.Init((value) => { useCnt = value; }, itemCount);
+
+
+        // scroller.OnRefreshCell += OnRefreshCell;
+        items = BoxGetItemModel.Instance.GetBoxItems(itemID);
+        CreateScroller();
+    }
+
+    protected override void OnPreClose()
+    {
+        //scroller.OnRefreshCell -= OnRefreshCell;
+    }
+
+    void CreateScroller()
+    {
+        // scroller.Refresh();
+
+        for (int i = 0; i < items.Count; i++)
+        {
+            if (i % 4 == 0)
+            {
+                List<Item> tmpIDs = new List<Item>();
+                for (int j = 0; j < 4; j++)
+                {
+                    int index = i + j;
+                    if (index >= items.Count)
+                        break;
+                    tmpIDs.Add(items[index]);
+                }
+                //  scroller.AddCell(ScrollerDataType.Header, i);
+            }
+        }
+        // scroller.Restart();
+    }
+
+
+    void OnRefreshCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell as BoxItemLineCell;
+
+        List<Item> tmpIDs = new List<Item>();
+        for (int j = 0; j < 4; j++)
+        {
+            int index = cell.index + j;
+            if (index >= items.Count)
+                break;
+            tmpIDs.Add(items[index]);
+        }
+
+        _cell.Display(tmpIDs);
+    }
+
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/System/Arena/BuyItemWin.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/System/Arena/BuyItemWin.cs.meta
index f878724..a68efbc 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/System/Arena/BuyItemWin.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: 5627605d78de2a748b34bdb33137ab7c
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Arena/HeroCountryComponent.cs b/Main/System/Arena/HeroCountryComponent.cs
new file mode 100644
index 0000000..0f01ce0
--- /dev/null
+++ b/Main/System/Arena/HeroCountryComponent.cs
@@ -0,0 +1,131 @@
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+public class HeroCountryComponent : MonoBehaviour
+{
+    [SerializeField] Image countryOnImg;    //涓婇樀闃靛瀷婵�娲诲浗瀹�
+    [SerializeField] UIEffectPlayer countryEffect;
+    [SerializeField] List<Image> OnCountImgs;    //涓婇樀鏁伴噺婵�娲�
+
+    /// <summary>
+    /// 涓婇樀闃熶紞涓悇涓浗瀹剁殑姝﹀皢鏁伴噺
+    /// </summary>
+    public Dictionary<HeroCountry, int> GetCountryHeroCountByTeamType(List<TeamHero> teamHeroes)
+    {
+        Dictionary<HeroCountry, int> heroCountryCount = new Dictionary<HeroCountry, int>();
+        if (teamHeroes == null)
+        {
+            return heroCountryCount;
+        }
+        for (int i = 0; i < teamHeroes.Count; i++)
+        {
+            if (teamHeroes[i] == null)
+                continue;
+            var country = teamHeroes[i].Country;
+
+            if (!heroCountryCount.ContainsKey(country))
+            {
+                heroCountryCount.Add(country, 1);
+            }
+            else
+            {
+                heroCountryCount[country] += 1;
+            }
+
+        }
+
+
+        return heroCountryCount;
+    }
+
+    /// <summary>
+    /// 鑾峰緱涓婇樀涓灏嗘暟閲忔渶澶х殑鍥藉鍜屾暟閲�
+    /// </summary>
+    public Int2 GetMaxCountHeroCountry(List<TeamHero> teamType)
+    {
+        var countryCountDict = GetCountryHeroCountByTeamType(teamType);
+        //鎵惧埌鏈�澶х殑鍥藉鍜屾暟閲�
+        HeroCountry country = HeroCountry.None;
+        int maxValue = 0;
+        foreach (var data in countryCountDict)
+        {
+            if (data.Value > maxValue)
+            {
+                country = data.Key;
+                maxValue = data.Value;
+            }
+        }
+        return new Int2((int)country, maxValue);
+    }
+
+    //涓婇樀姝﹀皢鍥藉鍏夌幆婵�娲�
+    public void RefreshOnTeamCountry(List<TeamHero> teamType, bool playEffect = false)
+    {
+        Int2 result = GetMaxCountHeroCountry(teamType);
+
+        var config = HeroLineupHaloConfig.GetConfig(result.x, result.y);
+        if (config == null)
+        {
+            countryOnImg.SetSprite("heroTeamCountry0");
+            for (int i = 0; i < OnCountImgs.Count; i++)
+            {
+                OnCountImgs[i].SetActive(false);
+            }
+        }
+        else
+        {
+            countryOnImg.SetSprite("heroTeamCountry" + result.x);
+            for (int i = 0; i < OnCountImgs.Count; i++)
+            {
+                if (i < result.y)
+                {
+                    OnCountImgs[i].SetActive(true);
+                    OnCountImgs[i].SetSprite("heroTeamCountryPoint" + result.x);
+                }
+                else
+                {
+                    OnCountImgs[i].SetActive(false);
+                }
+            }
+            if (playEffect)
+                countryEffect.Play();
+        }
+
+    }
+
+    //涓婇樀姝﹀皢鍥藉鍏夌幆婵�娲�
+    public void RefreshOnTeamCountry(TeamType selectTeamType, bool playEffect = false)
+    {
+        Int2 result = HeroUIManager.Instance.GetMaxCountHeroCountry(selectTeamType, true);
+
+        var config = HeroLineupHaloConfig.GetConfig(result.x, result.y);
+        if (config == null)
+        {
+            countryOnImg.SetSprite("heroTeamCountry0");
+            for (int i = 0; i < OnCountImgs.Count; i++)
+            {
+                OnCountImgs[i].SetActive(false);
+            }
+        }
+        else
+        {
+            countryOnImg.SetSprite("heroTeamCountry" + result.x);
+            for (int i = 0; i < OnCountImgs.Count; i++)
+            {
+                if (i < result.y)
+                {
+                    OnCountImgs[i].SetActive(true);
+                    OnCountImgs[i].SetSprite("heroTeamCountryPoint" + result.x);
+                }
+                else
+                {
+                    OnCountImgs[i].SetActive(false);
+                }
+            }
+            if (playEffect)
+                countryEffect.Play();
+        }
+
+    }
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/System/Arena/HeroCountryComponent.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/System/Arena/HeroCountryComponent.cs.meta
index f878724..8df1af2 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/System/Arena/HeroCountryComponent.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: 3ac0bc04463e5ef45a04c61ca9698fe9
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Battle/ArenaBattleWin.cs b/Main/System/Battle/ArenaBattleWin.cs
new file mode 100644
index 0000000..4944e71
--- /dev/null
+++ b/Main/System/Battle/ArenaBattleWin.cs
@@ -0,0 +1,285 @@
+锘縰sing System.Collections.Generic;
+using LitJson;
+using UnityEngine;
+using UnityEngine.UI;
+
+public class ArenaBattleWin : UIBase
+{
+    // 缁勪欢寮曠敤
+    [SerializeField] Transform mountPoint;
+    [SerializeField] Button btnSpeed;
+    [SerializeField] Text textSpeed;
+    [SerializeField] Button btnPass;
+    [SerializeField] Button btnPause;
+    [SerializeField] RendererAdjuster buttonsAdjuster;
+    private BattleRootNode battleRootNode = null;
+    private BattleField battleField;
+
+    [SerializeField] HeroCountryComponent myCountry;
+    [SerializeField] TextEx txtMyLV;
+    [SerializeField] TextEx txtMyName;
+    [SerializeField] TextEx txtMyHp;
+    [SerializeField] ImageEx imgMyHp;
+    [SerializeField] TextEx txtMyFightPonit;
+    [SerializeField] AvatarCell myAvatarCell;
+    [SerializeField] List<ArenaHeroHead> myHeroHeads;
+
+    [SerializeField] HeroCountryComponent enemyCountry;
+    [SerializeField] TextEx txtEnemyLV;
+    [SerializeField] TextEx txtEnemyName;
+    [SerializeField] TextEx txtEnemyHp;
+    [SerializeField] ImageEx imgEnemyHp;
+    [SerializeField] TextEx txtEnemyFightPonit;
+    [SerializeField] AvatarCell enemyAvatarCell;
+    [SerializeField] List<ArenaHeroHead> enemyHeroHeads;
+
+    [SerializeField] TextEx txtWaveInfo;
+    // 鐢熷懡鍛ㄦ湡
+    protected override void InitComponent()
+    {
+        base.InitComponent();
+        // 鍒濆鍖栫粍浠跺紩鐢� 缁戝畾鎸夐挳绛塙I缁勪欢浜嬩欢
+        btnSpeed.AddListener(ChangeSpeed);
+        btnPass.AddListener(OnClickPass);
+        btnPause.AddListener(OnClickPause);
+    }
+
+    private void OnClickPause()
+    {
+        if (null == battleField)
+            return;
+        battleField.IsPause = !battleField.IsPause;
+    }
+
+    private void OnClickPass()
+    {
+        if (null == battleField)
+            return;
+        battleField.ForceFinish();
+    }
+
+    private void ChangeSpeed()
+    {
+        if (null == battleField)
+            return;
+        BattleManager.Instance.speedIndex = (BattleManager.Instance.speedIndex + 1) % BattleManager.Instance.speedGear.Length;
+        battleField.SetSpeedRatio(BattleManager.Instance.speedGear[BattleManager.Instance.speedIndex]);
+        textSpeed.text = (BattleManager.Instance.speedIndex + 1).ToString();
+    }
+
+    protected override void OnPreOpen()
+    {
+        base.OnPreOpen();
+        // SetBattleField(BattleManager.Instance.storyBattleField);
+        BattleManager.Instance.onBattleFieldCreate += OnCreateBattleField;
+        EventBroadcast.Instance.AddListener<BattleDmgInfo>(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken);
+        EventBroadcast.Instance.AddListener<string, JsonData>(EventName.BATTLE_END, OnBattleEnd);
+        //UIManager.Instance.CloseWindow<MainWin>();
+    }
+
+    protected override void OnPreClose()
+    {
+        base.OnPreClose();
+        UIManager.Instance.CloseWindow<BattleHUDWin>();
+        BattleManager.Instance.onBattleFieldCreate -= OnCreateBattleField;
+        EventBroadcast.Instance.RemoveListener<BattleDmgInfo>(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken);
+        EventBroadcast.Instance.RemoveListener<string, JsonData>(EventName.BATTLE_END, OnBattleEnd);
+        //UIManager.Instance.OpenWindow<MainWin>(0);
+    }
+    private void OnBattleEnd(string guid, JsonData endData)
+    {
+        if (battleField != null && guid == battleField.guid)
+        {
+            DisplayHpInfo();
+        }
+    }
+
+    private void OnDamageTaken(BattleDmgInfo damageInfo)
+    {
+        if (battleField == null)
+            return;
+        if (damageInfo.battleFieldGuid == battleField.guid)
+        {
+            DisplayHpInfo();
+        }
+    }
+
+    private void OnCreateBattleField(string arg1, BattleField field)
+    {
+        if (field.GetType() == battleField.GetType())
+        {
+            SetBattleField(field);
+        }
+    }
+
+    protected override void OnOpen()
+    {
+        base.OnOpen();
+    }
+
+    protected override void OnClose()
+    {
+        base.OnClose();
+        if (battleRootNode != null)
+        {
+            battleRootNode.transform.SetParent(Launch.Instance.transform);
+            battleRootNode.transform.localPosition = new Vector3(-10000, -10000, 0);
+        }
+        battleField = null;
+    }
+
+    protected override void NextFrameAfterOpen()
+    {
+        base.NextFrameAfterOpen();
+    }
+
+    protected override void CompleteClose()
+    {
+        base.CompleteClose();
+    }
+
+    public void SetBattleField(BattleField _battleField)
+    {
+        battleField = _battleField;
+        if (battleRootNode != null)
+        {
+            battleRootNode.transform.localPosition = Vector3.zero;
+            battleRootNode.transform.SetParent(Launch.Instance.transform);
+        }
+
+        battleRootNode = battleField.battleRootNode;
+        battleRootNode.transform.SetParent(mountPoint);
+        battleRootNode.transform.localPosition = Vector3.zero;
+        battleRootNode.transform.localScale = Vector3.one;
+        BattleHUDWin ui = UIManager.Instance.GetUI<BattleHUDWin>();
+
+        if (null == ui)
+        {
+            ui = UIManager.Instance.OpenWindow<BattleHUDWin>();
+        }
+        ui.SetBattleField(battleField);
+        battleField.UpdateCanvas(canvas);
+        buttonsAdjuster.SetSortingOrder(BattleConst.ActiveHeroActionSortingOrder);
+        textSpeed.text = (BattleManager.Instance.speedIndex + 1).ToString();
+        DisplayHpInfo();
+        DisplayPlayerInfo();
+    }
+    private void DisplayHpInfo()
+    {
+        if (battleField == null)
+            return;
+
+        // 鑾峰彇鎴戞柟锛堢孩鏂癸級闃熶紞鏁版嵁
+        List<BattleObject> myTeam = battleField.battleObjMgr.GetBattleObjList(BattleCamp.Red);
+        // 鑾峰彇鏁屾柟锛堣摑鏂癸級闃熶紞鏁版嵁
+        List<BattleObject> enemyTeam = battleField.battleObjMgr.GetBattleObjList(BattleCamp.Blue);
+
+        ulong myMaxHp = GetMaxHP(myTeam);
+        ulong enemyMaxHp = GetMaxHP(enemyTeam);
+
+        ulong myNowHp = GetNowHP(myTeam);
+        ulong enemyNowHp = GetNowHP(enemyTeam);
+        txtMyHp.text = Language.Get("BoneField09", UIHelper.ReplaceLargeArtNum(myNowHp), UIHelper.ReplaceLargeArtNum(myMaxHp));
+        txtEnemyHp.text = Language.Get("BoneField09", UIHelper.ReplaceLargeArtNum(enemyNowHp), UIHelper.ReplaceLargeArtNum(enemyMaxHp));
+        imgMyHp.fillAmount = Mathf.Clamp01((myMaxHp > 0) ? (float)myNowHp / myMaxHp : 0f);
+        imgEnemyHp.fillAmount = Mathf.Clamp01((enemyMaxHp > 0) ? (float)enemyNowHp / enemyMaxHp : 0f);
+
+    }
+
+    private void DisplayPlayerInfo()
+    {
+        if (battleField == null)
+            return;
+        if (!ArenaManager.Instance.TryGetPlayerInfo(ArenaManager.Instance.atkPlayerId, out ArenaMatchInfo info))
+            return;
+        // 鑾峰彇鎴戞柟锛堢孩鏂癸級闃熶紞鏁版嵁
+        List<BattleObject> myTeam = battleField.battleObjMgr.GetBattleObjList(BattleCamp.Red);
+        // 鑾峰彇鏁屾柟锛堣摑鏂癸級闃熶紞鏁版嵁
+        List<BattleObject> enemyTeam = battleField.battleObjMgr.GetBattleObjList(BattleCamp.Blue);
+
+
+        txtEnemyLV.text = Language.Get("Arena22", info.Lv);
+        txtEnemyName.text = UIHelper.ServerStringTrim(info.PlayerName);
+        txtEnemyFightPonit.text = UIHelper.ReplaceLargeArtNum(info.FightPower);
+        enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)info.PlayerID, (int)info.Face, (int)info.FacePic));
+
+        var team = GetTeamHeroList(enemyTeam);
+        enemyCountry.RefreshOnTeamCountry(team, true);
+
+        txtMyLV.text = Language.Get("Arena22", PlayerDatas.Instance.baseData.LV);
+        txtMyName.text = PlayerDatas.Instance.baseData.PlayerName;
+        txtMyFightPonit.text = UIHelper.ReplaceLargeArtNum(PlayerDatas.Instance.baseData.FightPower);
+        myAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID, PlayerDatas.Instance.baseData.face, PlayerDatas.Instance.baseData.facePic));
+        myCountry.RefreshOnTeamCountry(TeamType.Arena);
+
+        for (int i = 0; i < myHeroHeads.Count; i++)
+        {
+            if (i < myTeam.Count)
+            {
+                myHeroHeads[i].SetActive(true);
+                var teamHero = myTeam[i].teamHero;
+                myHeroHeads[i].Display(teamHero.heroId, teamHero.SkinID, teamHero.level);
+            }
+            else
+            {
+                myHeroHeads[i].SetActive(false);
+            }
+        }
+
+        // 鏁屾柟鑻遍泟鏄剧ず锛堜粠鍙冲埌宸︼級
+        for (int i = enemyHeroHeads.Count - 1; i >= 0; i--)
+        {
+            int teamIndex = enemyHeroHeads.Count - 1 - i;  // 寤虹珛鍙嶅悜鏄犲皠
+
+            if (teamIndex < enemyTeam.Count)
+            {
+                enemyHeroHeads[i].SetActive(true);
+                var teamHero = enemyTeam[teamIndex].teamHero;  // 浣跨敤鏄犲皠鍚庣殑绱㈠紩
+                enemyHeroHeads[i].Display(teamHero.heroId, teamHero.SkinID, teamHero.level);
+            }
+            else
+            {
+                enemyHeroHeads[i].SetActive(false);
+            }
+        }
+
+    }
+    ulong GetMaxHP(List<BattleObject> battleObjects)
+    {
+        ulong sun = 0;
+        if (!battleObjects.IsNullOrEmpty())
+        {
+            for (int i = 0; i < battleObjects.Count; i++)
+            {
+                sun += (ulong)battleObjects[i].teamHero.maxHp;
+            }
+        }
+        return sun;
+    }
+
+    ulong GetNowHP(List<BattleObject> battleObjects)
+    {
+        ulong sun = 0;
+        if (!battleObjects.IsNullOrEmpty())
+        {
+            for (int i = 0; i < battleObjects.Count; i++)
+            {
+                sun += (ulong)battleObjects[i].teamHero.curHp;
+            }
+        }
+        return sun;
+    }
+
+    List<TeamHero> GetTeamHeroList(List<BattleObject> teams)
+    {
+        List<TeamHero> teamHeroes = new List<TeamHero>();
+        if (teams.IsNullOrEmpty())
+            return teamHeroes;
+        foreach (var item in teams)
+        {
+            teamHeroes.Add(item.teamHero);
+        }
+        return teamHeroes;
+
+    }
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/System/Battle/ArenaBattleWin.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/System/Battle/ArenaBattleWin.cs.meta
index f878724..99f51d1 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/System/Battle/ArenaBattleWin.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: d2609ee6f8b8f4b4896c3963c15924d2
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Battle/BattleConst.cs b/Main/System/Battle/BattleConst.cs
index 713473a..397a394 100644
--- a/Main/System/Battle/BattleConst.cs
+++ b/Main/System/Battle/BattleConst.cs
@@ -8,6 +8,7 @@
     {
         typeof(BattleWin),
         typeof(StoryBossBattleWin),
+        typeof(ArenaBattleWin),
     };
 
     public const int BattleStartEffectID = 1001; // Example effect ID for battle start
diff --git a/Main/System/Battle/BattleField/ArenaBattleField.cs b/Main/System/Battle/BattleField/ArenaBattleField.cs
new file mode 100644
index 0000000..f0da66f
--- /dev/null
+++ b/Main/System/Battle/BattleField/ArenaBattleField.cs
@@ -0,0 +1,148 @@
+using System;
+using LitJson;
+using UnityEngine;
+using System.Collections.Generic;
+
+
+public class ArenaBattleField : BattleField
+{
+    protected int chapter;//   绔犺妭
+    protected int wave;//  娉㈡暟
+    protected int level;// 鍏冲崱
+    protected JsonData extendData;
+
+    protected MainChapterConfig chapterConfig;
+
+    protected MainLevelConfig levelConfig;
+
+    public ArenaBattleField(string _guid) : base(_guid)
+    {
+
+    }
+
+    public override void Init(int MapID, int FuncLineID, JsonData _extendData,
+        List<TeamBase> _redTeamList, List<TeamBase> _blueTeamList)
+    {
+        base.Init(MapID, FuncLineID, extendData, _redTeamList, _blueTeamList);
+
+        chapter = FuncLineID / 10000;
+        wave = MapID == 1 ? FuncLineID % 100 : 1;//绗嚑娉㈡��
+        level = (FuncLineID % 10000) / 100;
+
+        extendData = _extendData;
+        chapterConfig = MainChapterConfig.Get(chapter);
+        levelConfig = MainLevelConfig.Get(level);
+
+        SetBattleMode(BattleMode.Record);
+    }
+
+    public override void Release()
+    {
+        base.Release();
+    }
+
+
+    public override void AutoSetBattleMode()
+    {
+        SetBattleMode(BattleMode.Record);
+    }
+
+    public override void TurnFightState(int TurnNum, int State,
+        uint FuncLineID, JsonData extendData)
+    {
+        base.TurnFightState(TurnNum, State, FuncLineID, extendData);
+
+        switch (State)
+        {
+            //  璧峰鐘舵�佹爣璁�
+            case 0:
+                break;
+            case 1://鍑嗗瀹屾瘯
+                break;
+            case 2://鎴樻枟涓�
+                break;
+            case 3://鎴樻枟缁撴潫
+                break;
+            case 4://缁撶畻濂栧姳
+                break;
+            case 5://缁撴潫鐘舵�佹爣璁�
+                break;
+            default:
+                BattleDebug.LogError("recieve a unknown State");
+                break;
+        }
+    }
+
+    protected override void OnSettlement(JsonData turnFightStateData)
+    {
+        base.OnSettlement(turnFightStateData);
+    }
+
+    public override void WhaleFall()
+    {
+        UIManager.Instance.CloseWindow<ArenaBattleWin>();
+        AutoFightModel.Instance.isPause = false;
+        Destroy();
+        UIManager.Instance.OpenWindow<ArenaWin>();
+    }
+
+
+
+    public override void HaveRest()
+    {
+        //  涓荤嚎BOSS鎴樻枟娌℃湁浼戞伅
+    }
+
+
+    // public override void OnBattleEnd(JsonData turnFightStateData)
+    // {
+    //     base.OnBattleEnd(turnFightStateData);
+    //     // HaveRest();
+    // }
+
+    public override void Run()
+    {
+        if (operationAgent == null)
+        {
+            //闃茶寖寮傚父
+            return;
+        }
+        base.Run();
+    }
+
+    public override void DistributeNextPackage()
+    {
+        if (IsBattleFinish)
+            return;
+
+        //  涓嶈璋冪敤base鐨勫嚱鏁�
+        BattleManager.Instance.DistributeNextReportPackage(guid);
+    }
+
+
+
+    public override void ShowWindow(HB424_tagSCTurnFightInit vNetData)
+    {
+        ArenaBattleWin fsBattleWin = UIManager.Instance.GetUI<ArenaBattleWin>();// as FullScreenBattleWin;
+        if (null == fsBattleWin)
+        {
+            fsBattleWin = UIManager.Instance.OpenWindow<ArenaBattleWin>();
+        }
+        fsBattleWin.SetBattleField(this);
+
+        if (UIManager.Instance.IsOpened<ArenaRecordWin>())
+        {
+            UIManager.Instance.CloseWindow<ArenaRecordWin>();
+        }
+
+        if (UIManager.Instance.IsOpened<ArenaChallengeWin>())
+        {
+            UIManager.Instance.CloseWindow<ArenaChallengeWin>();
+        }
+
+        if (UIManager.Instance.IsOpened<ArenaWin>())
+        {
+            UIManager.Instance.CloseWindow<ArenaWin>();
+        }
+    }
+}
\ No newline at end of file
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/System/Battle/BattleField/ArenaBattleField.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/System/Battle/BattleField/ArenaBattleField.cs.meta
index f878724..ddfa0bf 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/System/Battle/BattleField/ArenaBattleField.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: c1f4142e50b5caf4cbdc39364d3c8f85
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Battle/BattleFieldFactory.cs b/Main/System/Battle/BattleFieldFactory.cs
index 8769276..35a7ad8 100644
--- a/Main/System/Battle/BattleFieldFactory.cs
+++ b/Main/System/Battle/BattleFieldFactory.cs
@@ -20,6 +20,9 @@
             case 2:
                 battleField = new StoryBossBattleField(guid);
                 break;
+            case 3:
+                battleField = new ArenaBattleField(guid);
+                break;
             case 30010:
                 battleField = new BoneBattleField(guid);
                 break;
diff --git a/Main/System/Battle/StoryBossBattleWin.cs b/Main/System/Battle/StoryBossBattleWin.cs
index 3042711..1c3db8a 100644
--- a/Main/System/Battle/StoryBossBattleWin.cs
+++ b/Main/System/Battle/StoryBossBattleWin.cs
@@ -94,7 +94,8 @@
         UIManager.Instance.CloseWindow<BattleHUDWin>();
         BattleManager.Instance.onBattleFieldCreate -= OnCreateBattleField;
 
-        UIManager.Instance.OpenWindow<MainWin>(0);
+        if (!UIManager.Instance.IsOpened<MainWin>())
+            UIManager.Instance.OpenWindow<MainWin>();
     }
 
     private void OnCreateBattleField(string arg1, BattleField field)
diff --git a/Main/System/BillboardRank/PlayerTop3Cell.cs b/Main/System/BillboardRank/PlayerTop3Cell.cs
index 2d7b5e4..d467f04 100644
--- a/Main/System/BillboardRank/PlayerTop3Cell.cs
+++ b/Main/System/BillboardRank/PlayerTop3Cell.cs
@@ -29,7 +29,7 @@
         rankValueText.text = string.Format(valueFormat, UIHelper.ReplaceLargeNum(rankData.cmpValue2 + rankData.cmpValue * Constants.ExpPointValue));
         nameText.text = rankData.name1;
         officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2);
-        model.Create(5100030, 1);  //娴嬭瘯
+        model.Create((int)rankData.value5, 1);
     }
 
 
diff --git a/Main/System/ChallengeTab/ChallengeTabWin.cs b/Main/System/ChallengeTab/ChallengeTabWin.cs
index 96b019b..60f67da 100644
--- a/Main/System/ChallengeTab/ChallengeTabWin.cs
+++ b/Main/System/ChallengeTab/ChallengeTabWin.cs
@@ -3,18 +3,12 @@
 
 public class ChallengeTabWin : UIBase
 {
-    [SerializeField] ClickScreenOtherSpace clickScreenOtherSpace;
     [SerializeField] ChallengeTabButton btnBoneField;
+    [SerializeField] ChallengeTabButton btnArena;
     public static Action OnCloseChallengeTabWin;
     protected override void InitComponent()
     {
         base.InitComponent();
-        clickScreenOtherSpace.RemoveAllListeners();
-        clickScreenOtherSpace.AddListener(() =>
-        {
-            UIManager.Instance.CloseWindow<ChallengeTabWin>();
-        });
-
     }
     protected override void OnPreOpen()
     {
@@ -23,10 +17,19 @@
         AdsManager.Instance.OnAdsInfoListUpdateEvent += OnAdsInfoListUpdateEvent;
         TimeMgr.Instance.OnDayEvent += OnDayEvent;
         FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
-
+        PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefresh;
         Display();
     }
-
+    protected override void OnPreClose()
+    {
+        base.OnPreClose();
+        DungeonManager.Instance.UpdateFBInfoChangeEvent -= OnUpdateFBInfoChangeEvent;
+        AdsManager.Instance.OnAdsInfoListUpdateEvent -= OnAdsInfoListUpdateEvent;
+        TimeMgr.Instance.OnDayEvent -= OnDayEvent;
+        FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
+        PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefresh;
+        OnCloseChallengeTabWin?.Invoke();
+    }
     private void OnDayEvent()
     {
         Display();
@@ -45,26 +48,50 @@
         }
 
     }
+
     public void OnFuncStateChangeEvent(int funcId)
     {
         if (funcId == BoneFieldManager.Instance.funcId)
         {
             DisplayBoneFieldButton();
         }
+        else if (funcId == ArenaManager.Instance.funcId)
+        {
+            DisplayArenaButton();
+        }
     }
 
-    protected override void OnPreClose()
+    private void PlayerDataRefresh(PlayerDataType type)
     {
-        base.OnPreClose();
-        DungeonManager.Instance.UpdateFBInfoChangeEvent -= OnUpdateFBInfoChangeEvent;
-        AdsManager.Instance.OnAdsInfoListUpdateEvent -= OnAdsInfoListUpdateEvent;
-        TimeMgr.Instance.OnDayEvent -= OnDayEvent;
-        FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
-        OnCloseChallengeTabWin?.Invoke();
+        if (type == PlayerDataType.ChallengeVoucher)
+        {
+            DisplayArenaButton();
+        }
     }
+
     public void Display()
     {
         DisplayBoneFieldButton();
+        DisplayArenaButton();
+    }
+
+    public void DisplayArenaButton()
+    {
+        int index = 1;
+        int funcId = ArenaManager.Instance.funcId;
+        int redpointId = MainRedDot.ArenaRepoint;
+        bool isLock = FuncOpen.Instance.IsFuncOpen(funcId);
+        int type = ArenaManager.Instance.ChallengeMoneyType;
+        long nowCount = UIHelper.GetMoneyCnt(type);
+        string countInfo = UIHelper.AppendColor(nowCount > 0 ? TextColType.Green : TextColType.Red, Language.Get("Challenge03", nowCount));
+        string lockInfo = !isLock ? Language.Get("Challenge02") : string.Empty;
+        btnArena.Display(index, redpointId, isLock, countInfo, lockInfo, () =>
+        {
+            UIManager.Instance.CloseWindow<ChallengeTabWin>();
+            if (!FuncOpen.Instance.IsFuncOpen(funcId, true))
+                return;
+            UIManager.Instance.OpenWindow<ArenaWin>();
+        });
     }
 
     public void DisplayBoneFieldButton()
@@ -79,6 +106,7 @@
         string lockInfo = !isLock ? Language.Get("Challenge02") : string.Empty;
         btnBoneField.Display(index, redpointId, isLock, countInfo, lockInfo, () =>
         {
+            UIManager.Instance.CloseWindow<ChallengeTabWin>();
             if (!FuncOpen.Instance.IsFuncOpen(funcId, true))
                 return;
             UIManager.Instance.OpenWindow<BoneFieldWin>();
diff --git a/Main/System/Equip/EquipExchangeCell.cs b/Main/System/Equip/EquipExchangeCell.cs
index b96bd11..c0703d1 100644
--- a/Main/System/Equip/EquipExchangeCell.cs
+++ b/Main/System/Equip/EquipExchangeCell.cs
@@ -71,7 +71,7 @@
 
         equipImage.SetOrgSprite(equip.config.IconKey);
         itemName.text = UIHelper.AppendColor(equip.config.ItemColor, equip.config.ItemName, true, 1);
-        qualityName.text = UIHelper.GetQualityNameWithColor(equip.config.ItemColor, Language.Get("equipQualityFormat"));
+        qualityName.text = UIHelper.GetQualityNameWithColor(equip.config.ItemColor, Language.Get("L1039"));
         itemNameOutline.OutlineColor = UIHelper.GetUIOutlineColor(equip.config.ItemColor);
         qualityNameOutline.OutlineColor = UIHelper.GetUIOutlineColor(equip.config.ItemColor);
         placeName.text = EquipModel.Instance.GetEquipPlaceName(equip.config.EquipPlace);
diff --git a/Main/System/Equip/EquipTipWin.cs b/Main/System/Equip/EquipTipWin.cs
index e6826cb..942df61 100644
--- a/Main/System/Equip/EquipTipWin.cs
+++ b/Main/System/Equip/EquipTipWin.cs
@@ -80,7 +80,7 @@
         equipImage.SetOrgSprite(equip.config.IconKey);
         itemName.text = UIHelper.AppendColor(equip.config.ItemColor, equip.config.ItemName, true, 1);
         itemNameOutline.OutlineColor = UIHelper.GetUIOutlineColor(equip.config.ItemColor);
-        qualityName.text = UIHelper.GetQualityNameWithColor(equip.config.ItemColor, Language.Get("equipQualityFormat"));
+        qualityName.text = UIHelper.GetQualityNameWithColor(equip.config.ItemColor, Language.Get("L1039"));
         qualityNameOutline.OutlineColor = UIHelper.GetUIOutlineColor(equip.config.ItemColor);
         placeName.text = EquipModel.Instance.GetEquipPlaceName(equip.config.EquipPlace);
         lvText.text = Language.Get("EquipExchangeWin7", EquipModel.Instance.GetEquipLV(equip));
@@ -136,7 +136,7 @@
         equipImage.SetOrgSprite(itemConfig.IconKey);
         itemName.text = UIHelper.AppendColor(itemConfig.ItemColor, itemConfig.ItemName, true, 1);
         itemNameOutline.OutlineColor = UIHelper.GetUIOutlineColor(itemConfig.ItemColor);
-        qualityName.text = UIHelper.GetQualityNameWithColor(itemConfig.ItemColor, Language.Get("equipQualityFormat"));
+        qualityName.text = UIHelper.GetQualityNameWithColor(itemConfig.ItemColor, Language.Get("L1039"));
         qualityNameOutline.OutlineColor = UIHelper.GetUIOutlineColor(itemConfig.ItemColor);
         placeName.text = EquipModel.Instance.GetEquipPlaceName(itemConfig.EquipPlace);
         lvText.text = Language.Get("EquipExchangeWin7", appointItemConfig.ItemLV);
diff --git a/Main/System/Guild/EmblemHelper.cs b/Main/System/Guild/EmblemHelper.cs
deleted file mode 100644
index 053105a..0000000
--- a/Main/System/Guild/EmblemHelper.cs
+++ /dev/null
@@ -1,57 +0,0 @@
-public static class EmblemHelper
-{
-
-    public static EmblemModel GetEmblemModel(int familyID, int id)
-    {
-        bool isMyself = familyID == PlayerDatas.Instance.fairyData.fairy.FamilyID;
-        return isMyself ? GetMyEmblemModel() : GetOtherEmblemModel(id);
-    }
-
-    public static EmblemModel GetOtherEmblemModel(int id)
-    {
-        int emblemID = GetOtherEmblemID(id);
-        int effectID = GetEmblemEffectID(emblemID);
-        return new EmblemModel(emblemID, effectID);
-    }
-
-    public static EmblemModel GetMyEmblemModel()
-    {
-        int emblemID = GetMyEmblemID();
-        int effectID = GetEmblemEffectID(emblemID);
-        return new EmblemModel(emblemID, effectID);
-    }
-
-    public static int GetEmblemID(int familyID, int id)
-    {
-        bool isMyself = familyID == PlayerDatas.Instance.fairyData.fairy.FamilyID;
-        return isMyself ? GetMyEmblemID() : GetOtherEmblemID(id);
-    }
-
-    public static int GetOtherEmblemID(int id)
-    {
-        if (FamilyEmblemConfig.HasKey(id))
-            return id;
-        return !FamilyEmblemConfig.HasKey(GuildEmblemModel.Instance.defaultFamilyEmblemId) ? 0 : GuildEmblemModel.Instance.defaultFamilyEmblemId;
-    }
-
-    public static int GetMyEmblemID()
-    {
-        int emblemID = (int)PlayerDatas.Instance.fairyData.fairy.EmblemID;
-        if (FamilyEmblemConfig.HasKey(emblemID) && GuildEmblemModel.Instance.IsUnLock(emblemID))
-            return emblemID;
-        return !FamilyEmblemConfig.HasKey(GuildEmblemModel.Instance.defaultFamilyEmblemId) ? 0 : GuildEmblemModel.Instance.defaultFamilyEmblemId;
-    }
-
-    public static int GetEmblemEffectID(int id)
-    {
-        GuildEmblemModel.Instance.TryGetEffectID(id, out int effectID);
-        return effectID;
-    }
-
-    public static int GetDefaultFamilyEmblemId()
-    {
-        return GuildEmblemModel.Instance.defaultFamilyEmblemId;
-    }
-}
-
-
diff --git a/Main/System/Guild/EmblemHelper.cs.meta b/Main/System/Guild/EmblemHelper.cs.meta
deleted file mode 100644
index 99ea203..0000000
--- a/Main/System/Guild/EmblemHelper.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 23ae5c264fec3024ca275ac0742c7bb2
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Main/System/Guild/GuildBaseWin.cs b/Main/System/Guild/GuildBaseWin.cs
index 0615870..49eedc0 100644
--- a/Main/System/Guild/GuildBaseWin.cs
+++ b/Main/System/Guild/GuildBaseWin.cs
@@ -8,16 +8,37 @@
 /// </summary>
 public class GuildBaseWin : UIBase
 {
+    [SerializeField] Button guildBtn;
+    [SerializeField] GuildEmblemCell emblemCell;
+    [SerializeField] Text guildNameText;
+    [SerializeField] Text guildMemberCountText;
     [SerializeField] Button rankBtn;
+
+
+
+    [SerializeField] Button requestBtn;
 
     protected override void InitComponent()
     {
-
+        guildBtn.AddListener(() =>
+        {
+            // UIManager.Instance.OpenWindow<GuildWin>();
+        });
+        
+        requestBtn.AddListener(() =>
+        {
+            // UIManager.Instance.OpenWindow<GuildRequestWin>();
+        });
     }
 
 
     protected override void OnPreOpen()
     {
+        if (PlayerDatas.Instance.fairyData.fairy == null)
+            return;
+
+
+        Display();
     }
 
     protected override void OnPreClose()
@@ -25,10 +46,17 @@
     }
 
 
-    public override void Refresh()
+    void Display()
     {
-
+        ShowGuildInfo();
     }
 
 
+    void ShowGuildInfo()
+    {
+        emblemCell.Display(PlayerDatas.Instance.fairyData.fairy.EmblemID, PlayerDatas.Instance.fairyData.fairy.EmblemWord);
+        guildNameText.text = PlayerDatas.Instance.fairyData.fairy.FamilyName;
+        var config = FamilyConfig.Get(PlayerDatas.Instance.fairyData.fairy.FamilyLV);
+        guildMemberCountText.text = PlayerDatas.Instance.fairyData.fairy.MemberCount + "/" + config.MemberMax;
+    }
 }
\ No newline at end of file
diff --git a/Main/System/Guild/GuildCreateWin.cs b/Main/System/Guild/GuildCreateWin.cs
new file mode 100644
index 0000000..25bf65b
--- /dev/null
+++ b/Main/System/Guild/GuildCreateWin.cs
@@ -0,0 +1,62 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+/// <summary>
+/// 鍒涘缓鍏細鐣岄潰
+/// </summary>
+public class GuildCreateWin : UIBase
+{
+    [SerializeField] GuildEmblemCell emblemCell;
+    [SerializeField] Button changeEmblemBtn;
+    [SerializeField] InputField guildNameText;
+    [SerializeField] Image moneyIcon;
+    [SerializeField] Text moneyText;
+    [SerializeField] Button createBtn;
+
+    protected override void InitComponent()
+    {
+        changeEmblemBtn.AddListener(() =>
+        {
+            UIManager.Instance.OpenWindow<GuildEmblemWin>(1);
+        });
+        createBtn.AddListener(CreateGuild);
+    }
+
+    protected override void OnPreOpen()
+    {
+        GuildEmblemModel.Instance.CreateSelectEmblemIdChangeEvent += CreateSelectEmblemEvent;
+        if (GuildEmblemModel.Instance.createEmblemWord == "")
+            GuildEmblemModel.Instance.createEmblemWord = PlayerDatas.Instance.baseData.PlayerName[0].ToString();
+        if (GuildEmblemModel.Instance.createSelectEmblemId <= 0)
+            GuildEmblemModel.Instance.createSelectEmblemId = FamilyEmblemConfig.GetRandomEmblem();
+
+
+        Display();
+    }
+
+    protected override void OnPreClose()
+    {
+        GuildEmblemModel.Instance.CreateSelectEmblemIdChangeEvent -= CreateSelectEmblemEvent;
+    }
+
+    void Display()
+    {
+        emblemCell.Display(GuildEmblemModel.Instance.createSelectEmblemId, GuildEmblemModel.Instance.createEmblemWord, 1.5f);
+        moneyIcon.SetIconWithMoneyType(GuildManager.Instance.createMoneyType);
+        moneyText.text = UIHelper.ShowUseMoney(GuildManager.Instance.createMoneyType, GuildManager.Instance.createFairyCost);
+    }
+
+    void CreateGuild()
+    {
+        GuildManager.Instance.CreateGuild(guildNameText.text,
+                    GuildEmblemModel.Instance.createSelectEmblemId,
+                    GuildEmblemModel.Instance.createEmblemWord);
+    }
+
+    void CreateSelectEmblemEvent()
+    {
+        Display();
+    }
+}
\ No newline at end of file
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/System/Guild/GuildCreateWin.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/System/Guild/GuildCreateWin.cs.meta
index f878724..bb97e30 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/System/Guild/GuildCreateWin.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: dd7026ea67a350847b14f34adc2d9090
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Guild/GuildEmblemCell.cs b/Main/System/Guild/GuildEmblemCell.cs
new file mode 100644
index 0000000..2f7690d
--- /dev/null
+++ b/Main/System/Guild/GuildEmblemCell.cs
@@ -0,0 +1,54 @@
+锘縰sing System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+//鍏細寰界珷
+//闇�澧炲姞UIFrame锛孶IEffectPlayer
+[RequireComponent(typeof(UIFrame))]
+[RequireComponent(typeof(UIEffectPlayer))]
+public class GuildEmblemCell : MonoBehaviour
+{
+    [SerializeField] ImageEx emblemIcon;
+    [SerializeField] UIFrame frame;
+    [SerializeField] UIEffectPlayer uiEffect;
+    [Header("瀛� F9E29F 鍖呰竟 683C00 瀛楀彿36 Y:-9")]
+    [SerializeField] Text emblemNameText;   //瀛� F9E29F 鍖呰竟 683C00 瀛楀彿36 Y-9
+
+    public void Display(int emblemID, string emblemName, float _scale = 1f)
+    {
+        FamilyEmblemConfig config = FamilyEmblemConfig.Get(emblemID);
+        if (config == null)
+        {
+            return;
+        }
+
+        // 寰界珷鍔ㄦ�佹晥鏋滄寜甯у鐞嗭紝濡傛灉鍚庣画瑕佹敼鎴恠pine鐗规晥锛屽垯鍐嶅晢璁慨鏀�
+        // 鐩墠鐗规晥涓洪檮鍔犺〃鐜�
+        if (GuildEmblemModel.Instance.TryGetEffectID(emblemID, out int effectID))
+        {
+            if (effectID != 0)
+            {
+                uiEffect.effectId = effectID;
+                uiEffect.isPlaySpineLoop = true;
+                uiEffect.Play();
+            }
+        }
+
+        if (UIFrameMgr.Inst.ContainsDynamicImage(config.Image))
+        {
+            frame.ResetFrame(config.Image);
+            frame.enabled = true;
+        }
+        else
+        {
+            if (frame != null)
+                frame.enabled = false;
+            emblemIcon.SetSprite(config.Image);
+            emblemIcon.SetNativeSize();
+        }
+        emblemIcon.rectTransform.localScale = new Vector3(_scale, _scale, _scale);
+        emblemNameText.text = emblemName;
+    }
+
+}
+
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/System/Guild/GuildEmblemCell.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/System/Guild/GuildEmblemCell.cs.meta
index f878724..9836a22 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/System/Guild/GuildEmblemCell.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: c2e9e5e7d4929dd42b4e441ae3c75190
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Guild/GuildEmblemModel.cs b/Main/System/Guild/GuildEmblemModel.cs
index 1d6d526..4c20f2f 100644
--- a/Main/System/Guild/GuildEmblemModel.cs
+++ b/Main/System/Guild/GuildEmblemModel.cs
@@ -13,14 +13,11 @@
 
 public class GuildEmblemModel : GameSystemManager<GuildEmblemModel>
 {
-    public readonly int MaxItemRowCount = 6;    // 涓�琛屽睍绀簒涓窘绔�
-    public readonly int FamilyActionsType = 15;     // 寰界珷绫诲瀷15
-    public readonly int FuncId = 237;
-    public int defaultFamilyEmblemId;           // 榛樿寰界珷ID
+    public readonly int FamilyActionsType = 15;     // 鍏細璁板綍寰界珷绫诲瀷15
 
-    public bool isSendA408Pack = false;
 
     private int m_NowChooseEmblemId;
+    public event Action ChooseEmblemIdChangeEvent;      //鍒囨崲寰界珷
     public int nowChooseEmblemId
     {
         get { return m_NowChooseEmblemId; }
@@ -32,19 +29,46 @@
     }
 
 
-    public event Action ChooseEmblemIdChangeEvent;      //鍒囨崲鏍囩椤�
+    //鍒涘缓鍏細鏃讹紝閫夋嫨鐨勫窘绔�
+    int m_CreateSelectEmblemId;
+    public event Action CreateSelectEmblemIdChangeEvent;
+    public int createSelectEmblemId
+    {
+        get { return m_CreateSelectEmblemId; }
+        set
+        {
+            m_CreateSelectEmblemId = value;
+            CreateSelectEmblemIdChangeEvent?.Invoke();
+        }
+    }
+    public string createEmblemWord = ""; //鍒涘缓鍏細鏃讹紝杈撳叆鐨勬棗鍙�
 
     Redpoint entranceRedPoint = new Redpoint(10702, MainRedDot.FairyEmbleManageRepoint); //浠欑洘绠$悊闈㈡澘鍏ュ彛绾㈢偣
+    // 鏃х殑鏄剧ず鍒楄〃锛岀敤浜庡垽鏂槸鍚︽湁鍙樺寲, 瀵规瘮绾㈢偣鏄剧ず
+    public List<int> oldShowActiveList = new List<int>();   // 鏃х殑婵�娲诲垪琛紝鐐瑰嚮鏂扮殑寰界珷鏃朵細鏇存柊锛屾垨鑰呭叧闂殑鏃跺�欐洿鏂�
+    public List<int> showList = new List<int>();
 
     public override void Init()
     {
         PlayerDatas.Instance.fairyData.OnRefreshFairyInfo += OnRefreshFairyInfo;
-        defaultFamilyEmblemId = int.Parse(FuncConfigConfig.Get("FairyEmblem").Numerical1);
+        GuildManager.Instance.FamilyActionInfoEvent += OnFamilyActionInfoEvent;
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize;
     }
 
     public override void Release()
     {
         PlayerDatas.Instance.fairyData.OnRefreshFairyInfo -= OnRefreshFairyInfo;
+        GuildManager.Instance.FamilyActionInfoEvent -= OnFamilyActionInfoEvent;
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize;
+    }
+
+    public void OnBeforePlayerDataInitialize()
+    {
+        m_NowChooseEmblemId = 0;
+        m_CreateSelectEmblemId = 0;
+        createEmblemWord = "";
+        oldShowActiveList.Clear();
+        showList.Clear();
     }
 
     private void OnRefreshFairyInfo()
@@ -59,97 +83,67 @@
         // 浠呯洘涓昏兘鐪嬪埌
         if (!IsCaptain())
             return;
-        // 浠欑洘2绾у嚭鐜�
-        if (PlayerDatas.Instance.fairyData == null || PlayerDatas.Instance.fairyData.fairy.FamilyLV != 2)
-            return;
-        // 鍙嚭鐜颁竴娆�
-        if (GetRedPointShow())
+        
+        if (!GetRedPointShow())
             return;
         entranceRedPoint.state = RedPointState.Simple;
     }
 
-    string localStr = "FairyEmblemEntranceRedPoint_";
-
+    // 鏂版棫鍒楄〃瀵规瘮鏄剧ず绾㈢偣
     public bool GetRedPointShow()
     {
-        return LocalSave.GetBool(localStr + PlayerDatas.Instance.PlayerId);
-    }
+        if (oldShowActiveList.IsNullOrEmpty())
+            return false;
 
-    public void SetRedPointShow()
-    {
-        LocalSave.SetBool(localStr + PlayerDatas.Instance.PlayerId, true);
-    }
-
-    public bool TryGetNowEmblemID(out int nowID)
-    {
-        nowID = 0;
-        int emblemID = (int)PlayerDatas.Instance.fairyData.fairy.EmblemID;
-        if (FamilyEmblemConfig.HasKey(emblemID) && IsUnLock(emblemID))
+        for (int i = 0; i < showList.Count; i++)
         {
-            nowID = (int)emblemID;
-            return true;
-        }
-
-        if (FamilyEmblemConfig.HasKey(defaultFamilyEmblemId))
-        {
-            nowID = defaultFamilyEmblemId;
-            return true;
-        }
-
-        nowID = 0;
-        return false;
-
-    }
-
-    // 灞曠ず鎸囧畾寰界珷 琛ㄤ腑鎵句笉鍒板窘绔犲氨鏄剧ず榛樿鐨�
-    public void ShowEmblem(int emblemID, ImageEx imgTitle, float scale = 1.0f)
-    {
-        int nowEmblemID = emblemID;
-        if (!FamilyEmblemConfig.HasKey(nowEmblemID))
-        {
-            nowEmblemID = defaultFamilyEmblemId;
-        }
-        FamilyEmblemConfig config = FamilyEmblemConfig.Get(nowEmblemID);
-        UIFrame frame = imgTitle.GetComponent<UIFrame>();
-        if (UIFrameMgr.Inst.ContainsDynamicImage(config.Image))
-        {
-            if (frame == null)
-                frame = imgTitle.gameObject.AddComponent<UIFrame>();
-
-            List<UnityEngine.Sprite> spriteList = UIFrameMgr.Inst.GetDynamicImage(config.Image);
-            if (!spriteList.IsNullOrEmpty())
+            //宸茶В閿佺殑
+            if (!oldShowActiveList.Contains(showList[i]) && IsUnLock(showList[i]))
             {
-                imgTitle.rectTransform.sizeDelta = new Vector2(spriteList[0].rect.width, spriteList[0].rect.height);
+                return true;
             }
-
-            imgTitle.raycastTarget = false;
-            frame.ResetFrame(config.Image);
-            frame.enabled = true;
         }
-        else
-        {
-            if (frame != null)
-                frame.enabled = false;
-            imgTitle.SetSprite(config.Image);
-            imgTitle.SetNativeSize();
-        }
-        imgTitle.rectTransform.localScale = new Vector3(scale, scale, scale);
+        return false;
     }
 
 
-
-
-    public List<int> GetShowList()
+    public List<int> SortShowList()
     {
-        List<int> showList = new List<int>();
-        List<int> keys = FamilyEmblemConfig.GetKeys();
-        for (int i = 0; i < keys.Count; i++)
+        if (showList.IsNullOrEmpty())
         {
-            showList.Add(keys[i]);
+            List<int> keys = FamilyEmblemConfig.GetKeys();
+            for (int i = 0; i < keys.Count; i++)
+            {
+                showList.Add(keys[i]);
+            }
         }
         showList.Sort(Cmp);
+
+        if (oldShowActiveList.IsNullOrEmpty())
+        {
+            // 鍒濆鍖栨椂锛屽埛鏂版棫鐨勬縺娲诲垪琛�
+            RefreshOldShowActiveList();
+        }
         return showList;
     }
+
+    // 鍒锋柊鏃х殑婵�娲诲垪琛紝鐢ㄤ簬瀵规瘮绾㈢偣鏄剧ず
+    public void RefreshOldShowActiveList()
+    {
+        for (int i = 0; i < showList.Count; i++)
+        {
+            //宸茶В閿佺殑
+            if (IsUnLock(showList[i]))
+            {
+                if (!oldShowActiveList.Contains(showList[i]))
+                {
+                    oldShowActiveList.Add(showList[i]);
+                }
+            }
+        }
+    }
+    
+
 
     // 宸叉縺娲�>鏈縺娲�
     private int Cmp(int a, int b)
@@ -180,12 +174,10 @@
         }
 
         return a.CompareTo(b);
-    }
+        }
 
     public int GetSortNum(int emblemID)
     {
-        if (!FamilyEmblemConfig.HasKey(emblemID))
-            return 0;
         return FamilyEmblemConfig.Get(emblemID).SortNum;
     }
 
@@ -200,7 +192,7 @@
         return config.UnlockFamilyLV > 0 ? FairyEmblemUnlockMethodType.LV : FairyEmblemUnlockMethodType.Active;
     }
 
-    // 鎸囧畾鐨勫窘绔犺В閿佷簡鍚�
+    // 寰界珷鏄惁瑙i攣锛屾湭鍔犲叆鍏細鐨勪篃鍙互璋冪敤鍒ゆ柇
     public bool IsUnLock(int emblemId)
     {
         FamilyEmblemConfig config = FamilyEmblemConfig.Get(emblemId);
@@ -220,8 +212,13 @@
                 return true;
 
             case FairyEmblemUnlockMethodType.LV:
+                int lv = 1; //娌℃湁鍏細鐨勬儏鍐�
+                if (PlayerDatas.Instance.fairyData.fairy != null)
+                {
+                    lv = PlayerDatas.Instance.fairyData.fairy.FamilyLV;
+                }
                 //鎵�鍦ㄤ粰鐩熺瓑绾у皬浜庡窘绔犺姹傜瓑绾� 鏈В閿�
-                if (PlayerDatas.Instance.fairyData.fairy.FamilyLV < config.UnlockFamilyLV)
+                if (lv < config.UnlockFamilyLV)
                     return false;
                 return true;
 
@@ -238,13 +235,10 @@
         }
     }
 
-    public bool IsUsing(int emblemId)
+
+    void OnFamilyActionInfoEvent(int familyId, int actionType)
     {
-        if (!TryGetNowEmblemID(out int Id))
-        {
-            return false;
-        }
-        return emblemId == Id;
+        UpdateRedPoint();
     }
 
     public bool IsLimitTime(int emblemId, out HA513_tagMCFamilyActionInfo.tagMCFamilyAction familyAction)
@@ -272,10 +266,10 @@
 
     public bool IsCaptain()
     {
-        return (int)PlayerDatas.Instance.fairyData.mine.FmLV == 3;
+        return PlayerDatas.Instance.fairyData.mine.FmLV == 3;
     }
 
-    // 灏濊瘯浠庡皝鍖呬腑寰楀埌鎸囧畾鐨勫窘绔犳椂鏁堜俊鎭紙娲诲姩閫斿緞鑾峰彇鐨勫窘绔�,瀹氬埗寰界珷锛�
+    // 鑾峰緱寰界珷璁板綍淇℃伅淇℃伅锛堟椿鍔ㄩ�斿緞鑾峰彇鐨勫窘绔�,瀹氬埗寰界珷锛夛紝value1鏄窘绔營D锛寁alue2鏄窘绔犲埌鏈熸椂闂�
     private bool TryGetfamilyAction(int emblemId, out HA513_tagMCFamilyActionInfo.tagMCFamilyAction familyAction)
     {
         familyAction = new HA513_tagMCFamilyActionInfo.tagMCFamilyAction();
@@ -297,8 +291,6 @@
     public bool TryGetEffectID(int emblemId, out int effectID)
     {
         effectID = 0;
-        if (!FamilyEmblemConfig.HasKey(emblemId))
-            return false;
         FamilyEmblemConfig config = FamilyEmblemConfig.Get(emblemId);
         if (!EffectConfig.HasKey(config.EffectID))
             return false;
@@ -308,15 +300,3 @@
 
 
 }
-
-public class EmblemModel
-{
-    public int emblemID { get; private set; }
-    public int emblemUIEffectID { get; private set; }
-
-    public EmblemModel(int emblemID, int emblemUIEffectID)
-    {
-        this.emblemID = emblemID;
-        this.emblemUIEffectID = emblemUIEffectID;
-    }
-}
\ No newline at end of file
diff --git a/Main/System/Guild/GuildEmblemSelectCell.cs b/Main/System/Guild/GuildEmblemSelectCell.cs
new file mode 100644
index 0000000..fc2e58b
--- /dev/null
+++ b/Main/System/Guild/GuildEmblemSelectCell.cs
@@ -0,0 +1,58 @@
+锘縰sing System.Collections.Generic;
+using System.Reflection;
+using UnityEngine;
+using UnityEngine.UI;
+
+//鍏細寰界珷 閫夋嫨鏌ョ湅
+public class GuildEmblemSelectCell : MonoBehaviour
+{
+    [SerializeField] GuildEmblemCell emblemIcon;
+    [SerializeField] Image useImg;
+    [SerializeField] Image lockImg;
+    [SerializeField] Image selectImg;
+    [SerializeField] Button selectBtn;
+    [SerializeField] Image redPoint;
+
+    public void Display(int index)
+    {
+        var id = GuildEmblemModel.Instance.showList[index];
+        emblemIcon.Display(id, "");
+        if (PlayerDatas.Instance.fairyData.fairy == null)
+        {
+            useImg.SetActive(false);
+        }
+        else
+        {
+            useImg.SetActive(id == PlayerDatas.Instance.fairyData.fairy.EmblemID);
+        }
+        lockImg.SetActive(!GuildEmblemModel.Instance.IsUnLock(id));
+        selectImg.SetActive(id == GuildEmblemModel.Instance.nowChooseEmblemId);
+        redPoint.SetActive(IsShowRedpoint(id));
+        selectBtn.AddListener(() => OnClick(id));
+
+    }
+
+
+    bool IsShowRedpoint(int emblemID)
+    {
+        if (GuildEmblemModel.Instance.oldShowActiveList.Contains(emblemID))
+        {
+            return false;
+        }
+
+        if (!GuildEmblemModel.Instance.IsUnLock(emblemID))
+        {
+            return false;
+        }
+
+        return true;
+    }
+
+    void OnClick(int id)
+    {
+        GuildEmblemModel.Instance.RefreshOldShowActiveList();
+        GuildEmblemModel.Instance.nowChooseEmblemId = id;
+    }
+
+}
+
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/System/Guild/GuildEmblemSelectCell.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/System/Guild/GuildEmblemSelectCell.cs.meta
index f878724..f1f11e9 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/System/Guild/GuildEmblemSelectCell.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: 824673e7b90bc33439e9e945e56eacfb
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Guild/GuildEmblemSelectListCell.cs b/Main/System/Guild/GuildEmblemSelectListCell.cs
new file mode 100644
index 0000000..2966376
--- /dev/null
+++ b/Main/System/Guild/GuildEmblemSelectListCell.cs
@@ -0,0 +1,27 @@
+锘縰sing System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+//鍏細寰界珷鍒楄〃
+public class GuildEmblemListCell : CellView
+{
+    [SerializeField] List<GuildEmblemSelectCell> cells;
+
+    public void Display(int index)
+    {
+        for (int i = 0; i < cells.Count; i++)
+        {
+            if (i + index < GuildEmblemModel.Instance.showList.Count)
+            {
+                cells[i].SetActive(true);
+                cells[i].Display(index + i);
+            }
+            else
+            {
+                cells[i].SetActive(false);
+            }
+        }
+    }
+
+}
+
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/System/Guild/GuildEmblemSelectListCell.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/System/Guild/GuildEmblemSelectListCell.cs.meta
index f878724..5f59176 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/System/Guild/GuildEmblemSelectListCell.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: 2246d0eca2920224aa0a20d7ca0e1767
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Guild/GuildEmblemWin.cs b/Main/System/Guild/GuildEmblemWin.cs
new file mode 100644
index 0000000..97ae72e
--- /dev/null
+++ b/Main/System/Guild/GuildEmblemWin.cs
@@ -0,0 +1,153 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+/// <summary>
+/// 鍏細寰界珷鐣岄潰 :functionOrder 0 浠h〃鏈夊叕浼氱殑鎯呭喌涓嬫墦寮�锛�1 浠h〃娌℃湁鍏細鐨勬儏鍐典笅鍒涘缓鏃舵墦寮�
+/// </summary>
+public class GuildEmblemWin : UIBase
+{
+    [SerializeField] GuildEmblemCell guildEmblem;
+    [SerializeField] ScrollerController emblemScroller;
+    [SerializeField] Text emblemInfoText;
+    [SerializeField] Text timeDescText;
+    [SerializeField] InputField flagNameText;
+    [SerializeField] Text nowTimeText;
+    [SerializeField] Button changeBtn;
+
+
+    string emblemWord;
+
+    protected override void InitComponent()
+    {
+        flagNameText.onValueChanged.AddListener(OnFlagNameChange);
+        changeBtn.AddListener(ChangeEmblem);
+    }
+    protected override void OnPreOpen()
+    {
+        GuildEmblemModel.Instance.ChooseEmblemIdChangeEvent += ChooseEmblemEvent;
+        emblemScroller.OnRefreshCell += OnRefreshCell;
+
+        if (functionOrder == 1)
+        {
+            GuildEmblemModel.Instance.nowChooseEmblemId = GuildEmblemModel.Instance.createSelectEmblemId;
+            emblemWord = GuildEmblemModel.Instance.createEmblemWord;
+        }
+        else
+        {
+            GuildEmblemModel.Instance.nowChooseEmblemId = PlayerDatas.Instance.fairyData.fairy.EmblemID;
+            emblemWord = PlayerDatas.Instance.fairyData.fairy.EmblemWord;
+        }
+
+        flagNameText.text = emblemWord;
+        GuildEmblemModel.Instance.SortShowList();
+
+        CreateEmblemScroller();
+        Display();
+    }
+
+    protected override void OnPreClose()
+    {
+
+        GuildEmblemModel.Instance.ChooseEmblemIdChangeEvent -= ChooseEmblemEvent;
+        emblemScroller.OnRefreshCell -= OnRefreshCell;
+        GuildEmblemModel.Instance.RefreshOldShowActiveList();
+    }
+
+    void CreateEmblemScroller()
+    {
+        emblemScroller.Refresh();
+        for (int i = 0; i < GuildEmblemModel.Instance.showList.Count; i++)
+        {
+            if (i % 5 == 0)
+            {
+                emblemScroller.AddCell(ScrollerDataType.Header, i);
+            }
+        }
+        emblemScroller.Restart();
+    }
+
+    void OnRefreshCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell.GetComponent<GuildEmblemListCell>();
+        _cell.Display(cell.index);
+    }
+
+    void Display()
+    {
+        guildEmblem.Display(GuildEmblemModel.Instance.nowChooseEmblemId, emblemWord, 2f);
+        emblemScroller.m_Scorller.RefreshActiveCellViews();
+        var config = FamilyEmblemConfig.Get(GuildEmblemModel.Instance.nowChooseEmblemId);
+        emblemInfoText.text = config.Descriptive;
+        if (config.ExpireMinutes == 0)
+        {
+            timeDescText.text = "";
+        }
+        else
+        {
+            timeDescText.text = Language.Get("Mail12", TimeUtility.SecondsToShortDHMS(config.ExpireMinutes * 60));
+        }
+
+        if (functionOrder == 1)
+        {
+            nowTimeText.text = "";
+        }
+        else
+        {
+            // 鍏細寰界珷杩囨湡鏃堕棿
+            if (GuildEmblemModel.Instance.IsLimitTime(GuildEmblemModel.Instance.nowChooseEmblemId, out var familyAction))
+            {
+                int time = (int)familyAction.Value2 - TimeUtility.AllSeconds;
+                if (time > 0)
+                    nowTimeText.text = Language.Get("GoldRush29", TimeUtility.SecondsToShortDHMS(time));
+                else
+                    nowTimeText.text = "";
+            }
+            else
+            {
+                nowTimeText.text = "";
+            }
+
+        }
+
+        if (functionOrder == 1)
+        {
+            changeBtn.SetInteractable(GuildEmblemModel.Instance.IsUnLock(GuildEmblemModel.Instance.nowChooseEmblemId));
+        }
+        else
+        {
+            changeBtn.SetInteractable(GuildEmblemModel.Instance.IsCaptain() && GuildEmblemModel.Instance.IsUnLock(GuildEmblemModel.Instance.nowChooseEmblemId));
+        }
+    }
+
+
+    void OnFlagNameChange(string value)
+    {
+        emblemWord = value;
+        guildEmblem.Display(GuildEmblemModel.Instance.nowChooseEmblemId, emblemWord, 2f);
+    }
+
+    void ChooseEmblemEvent()
+    {
+        Display();
+    }
+
+    void ChangeEmblem()
+    {
+        if (functionOrder == 1)
+        {
+            GuildEmblemModel.Instance.createEmblemWord = emblemWord;
+            GuildEmblemModel.Instance.createSelectEmblemId = GuildEmblemModel.Instance.nowChooseEmblemId;
+        }
+        else
+        {
+            var pack = new CA624_tagCMChangeFamilyEmblem();
+            pack.EmblemID = (byte)GuildEmblemModel.Instance.nowChooseEmblemId;
+            pack.EmblemWord = emblemWord;
+            GameNetSystem.Instance.SendInfo(pack);
+        }
+        
+        CloseWindow();
+    }
+}
\ No newline at end of file
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/System/Guild/GuildEmblemWin.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/System/Guild/GuildEmblemWin.cs.meta
index f878724..e19e1a6 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/System/Guild/GuildEmblemWin.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: 54febdd3c6a7d1c4cbc460b76e0aa240
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Guild/GuildJoinWin.cs b/Main/System/Guild/GuildJoinWin.cs
index db9a591..10aeb88 100644
--- a/Main/System/Guild/GuildJoinWin.cs
+++ b/Main/System/Guild/GuildJoinWin.cs
@@ -4,7 +4,7 @@
 using UnityEngine.UI;
 
 /// <summary>
-/// 鍔犲叆鍏細鐣岄潰
+/// 鍔犲叆鍏細鐣岄潰 锛氬叕浼氭煡鎵惧垪琛紝涔熸槸鎺掕姒�
 /// </summary>
 public class GuildJoinWin : UIBase
 {
@@ -19,7 +19,7 @@
     int lastPage = 0;
     protected override void InitComponent()
     {
-        findBtn.AddListener(OnFindBtnClick);
+        findBtn.AddListener(() => OnFindBtnClick());
         createGuildBtn.AddListener(OnCreateGuildBtnClick);
         quicklyJoinGuildBtn.AddListener(OnQuicklyJoinGuildBtnClick);
     }
@@ -27,9 +27,34 @@
     {
         findText.text = "";
         //鎵撳紑鐣岄潰榛樿璇锋眰锛屾粴鍔ㄧ殑鏃跺�欓渶瑕佸鐞嗛〉鏁�
-        OnFindBtnClick();
+        QueryGuild();
         GuildManager.Instance.OnRefreshFairyList += OnRefreshGuildList;
+        GuildManager.Instance.MyRequestJoinEvent += MyRequestJoinEvent;
+        PlayerDatas.Instance.fairyData.OnRefreshFairyInfo += OnRefreshFairyInfo;
+        guildListScroller.OnRefreshCell += RefreshCell;
         Display();
+    }
+
+    protected override void OnPreClose()
+    {
+        GuildManager.Instance.OnRefreshFairyList -= OnRefreshGuildList;
+        GuildManager.Instance.MyRequestJoinEvent -= MyRequestJoinEvent;
+        guildListScroller.OnRefreshCell -= RefreshCell;
+        PlayerDatas.Instance.fairyData.OnRefreshFairyInfo -= OnRefreshFairyInfo;
+
+        var win = UIManager.Instance.GetUI<MainWin>();
+        if (win)
+            win.RestoreFuncBtn();
+        
+    }
+
+    void OnRefreshFairyInfo()
+    {
+        //褰撳墠鐣岄潰涓嬫湁鍒锋柊鑷鐨勫叕浼氭暟鎹紝璇存槑涓�瀹氭槸鍔犲叆浜嗗叕浼氾紝闇�涓诲姩璺宠浆鍒板叕浼氱晫闈�
+        CloseWindow();
+        var win = UIManager.Instance.GetUI<MainWin>();
+        if (win)
+            win.ClickFunc(4);
     }
 
     void Display()
@@ -37,10 +62,24 @@
         CreateScroller();
     }
 
+    void MyRequestJoinEvent()
+    {
+        guildListScroller.m_Scorller.RefreshActiveCellViews();
+    }
+
     
     //鍒楄〃鍙樺皬鐨勮瘽 閲嶆柊鍒涘缓锛涘垪琛ㄥ彉澶х殑璇濓紝鍙坊鍔�
     void CreateScroller()
     {
+        if (GuildManager.Instance.pageIndexList.Count == 0)
+        {
+            noGuildTf.SetActive(true);
+            guildListScroller.SetActive(false);
+            return;
+        }
+        noGuildTf.SetActive(false);
+        guildListScroller.SetActive(true);
+
         var startCount = guildListScroller.GetNumberOfCells();
         if (startCount > GuildManager.Instance.pageIndexList.Count)
         {
@@ -53,12 +92,6 @@
         guildListScroller.Restart();
     }
 
-    protected override void OnPreClose()
-    {
-        GuildManager.Instance.OnRefreshFairyList -= OnRefreshGuildList;
-    }
-
-
 
 
     void OnRefreshGuildList()
@@ -66,9 +99,36 @@
         CreateScroller();
     }
 
+    void RefreshCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell.GetComponent<GuildViewListCell>();
+        _cell.Display(cell.index);
+    }
+
     private void OnFindBtnClick()
     {
-        lastQuery = findText.text;
+        var nowQuery = findText.text;
+        if (string.IsNullOrEmpty(nowQuery) && string.IsNullOrEmpty(lastQuery))
+        {
+            SysNotifyMgr.Instance.ShowTip("GuildSys5");
+            return;
+        }
+        if (nowQuery.Length < 2 && nowQuery.Length > 0)
+        {
+            SysNotifyMgr.Instance.ShowTip("GuildSys7");
+            return;
+        }
+
+        lastQuery = nowQuery;
+        lastPage = 0;
+        guildListScroller.Refresh();
+        GuildManager.Instance.SendFindGuild(lastQuery);
+    }
+
+
+    void QueryGuild()
+    {
+        lastQuery = "";
         lastPage = 0;
         guildListScroller.Refresh();
         GuildManager.Instance.SendFindGuild(lastQuery);
@@ -76,12 +136,17 @@
 
     private void OnCreateGuildBtnClick()
     {
-        // TODO: 瀹炵幇鍒涘缓鍏細閫昏緫
+        UIManager.Instance.OpenWindow<GuildCreateWin>();
     }
 
     private void OnQuicklyJoinGuildBtnClick()
     {
-        // TODO: 瀹炵幇蹇�熷姞鍏ュ叕浼氶�昏緫
+        if (GuildManager.Instance.pageIndexList.Count == 0)
+        {
+            SysNotifyMgr.Instance.ShowTip("QuickEnterFamilyFail");
+            return;
+        }
+        GuildManager.Instance.SendApplyGuild(0, 0);
 
     }
 
diff --git a/Main/System/Guild/GuildManager.cs b/Main/System/Guild/GuildManager.cs
index ef51011..1bb39f7 100644
--- a/Main/System/Guild/GuildManager.cs
+++ b/Main/System/Guild/GuildManager.cs
@@ -1,4 +1,4 @@
-锘縰sing System;
+using System;
 using System.Collections;
 using System.Collections.Generic;
 using System.Text;
@@ -10,10 +10,10 @@
 {
     // 鐢宠鐨勫叕浼氬垪琛�
     private List<int> m_FairyRequesteds = new List<int>();
-    // 鍏細闄勫姞鏁版嵁锛屾寜绫诲瀷瀛樺偍
+    // 鍏細鑷畾涔夎褰曢檮鍔犳暟鎹紝鎸夌被鍨嬪瓨鍌�
     // 鍏細ID锛� 绫诲瀷ID锛� 鏁版嵁
     public Dictionary<int, Dictionary<int, HA513_tagMCFamilyActionInfo.tagMCFamilyAction[]>> familyActions = new Dictionary<int, Dictionary<int, HA513_tagMCFamilyActionInfo.tagMCFamilyAction[]>>();
-    public event Action<int, int> FamilyActionInfoEvent;
+    public event Action<int, int> FamilyActionInfoEvent;    //鍏細鑷畾涔夎褰�, 鍏朵粬鍔熻兘浠庤繖鑾峰彇
 
     public override void Init()
     {
@@ -32,6 +32,9 @@
     {
         m_FairyRequesteds.Clear();
         familyActions.Clear();
+        guildChanged = false;
+        applyList.Clear();
+        PlayerDatas.Instance.fairyData.ClearData();
     }
 
 
@@ -46,40 +49,9 @@
     }
 
 
-    #region 鍙戝寘
-    public void SendKickFairy(uint playerID)
-    {
-        var pak = new CA605_tagCMDeleteFamilyMember();
-        pak.MemberID = playerID;
-        GameNetSystem.Instance.SendInfo(pak);
-    }
-
-
-
-    //鐢宠/鎾ら攢 鍔犲叆鍏細
-    public void SendApplyFairy(uint id, int type)
-    {
-        if (FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Fairy, true))
-        {
-            return;
-        }
-        if (PlayerDatas.Instance.fairyData.HasFairy)
-        {
-            ServerTipDetails.DisplayNormalTip(Language.Get("HasFairyTip"));
-            return;
-        }
-        CA602_tagCMRequesJoinFamily rqPack = new CA602_tagCMRequesJoinFamily();
-        rqPack.Type = (byte)type;
-        rqPack.TagFamilyID = id;
-        GameNetSystem.Instance.SendInfo(rqPack);
-    }
-    #endregion
-
-
-
 
     #region 閰嶇疆
- 
+
     public int createFairyCost
     {
         get;
@@ -93,6 +65,18 @@
     // 鏉冮檺ID: 1-鏀朵汉锛�2-鍙樻洿鑱屼綅锛�3-鍙戝竷鍏憡锛�4-韪汉
     // 鑱屼綅锛� 0-鎴愬憳锛�1-绮捐嫳锛�2-鍓洘涓伙紝3-鐩熶富
     public Dictionary<int, int> guildWorkToLevel = new Dictionary<int, int>();
+
+    //閫�鍑烘儵缃�
+    public int[] quitGuildPunishTime;
+    public int[] beQuitGuildPunishTime;
+    public int quitGuildPunishMoneyType;
+    public int[] quitGuildPunishMoney;
+    public int[] beQuitGuildPunishMoney;
+
+    //鏀瑰悕
+    public int renameFairyNameCD;
+    public int renameFairyNameCost;
+    public int renameFairyNameMoneyType;
 
     void ParseConfig()
     {
@@ -110,13 +94,27 @@
         config = FuncConfigConfig.Get("FamilyPower");
         guildWorkToLevel = ConfigParse.ParseIntDict(config.Numerical1);
 
+        config = FuncConfigConfig.Get("FamilyLeave");
+        quitGuildPunishTime = JsonMapper.ToObject<int[]>(config.Numerical1);
+        beQuitGuildPunishTime = JsonMapper.ToObject<int[]>(config.Numerical2);
+        quitGuildPunishMoneyType = int.Parse(config.Numerical3);
+        quitGuildPunishMoney = JsonMapper.ToObject<int[]>(config.Numerical4);
+        beQuitGuildPunishMoney = JsonMapper.ToObject<int[]>(config.Numerical5);
+
+        config = FuncConfigConfig.Get("FamilyRename");
+        renameFairyNameCD = int.Parse(config.Numerical2);
+        var arr = ConfigParse.GetMultipleStr<int>(config.Numerical1);
+        renameFairyNameCost = arr[0];
+        renameFairyNameMoneyType = arr[1];
+
     }
 
 
     #endregion
 
 
-
+    //鎴戠殑璇锋眰鍔犲叆鍏細鐨勫垪琛�
+    public event Action MyRequestJoinEvent;
     public void UpdateFairyRequested(HA501_tagMCNotifyRequestJoinFamilyInfo _package)
     {
         m_FairyRequesteds.Clear();
@@ -124,10 +122,11 @@
         {
             m_FairyRequesteds.Add((int)_package.RequestJoinFamilyIDList[i]);
         }
+        MyRequestJoinEvent?.Invoke();
     }
 
 
-    public bool FairyRequested(int _fairyId)
+    public bool IsGuildRequested(int _fairyId)
     {
         return m_FairyRequesteds.Contains(_fairyId);
     }
@@ -145,7 +144,7 @@
 
 
 
-    #region 浠欑洘鍚嶉檺鍒�
+    #region 鍒涘缓鍏細 鏀瑰悕
     public bool CheckFairyNameLimit(string _name, out int errorCode)
     {
         errorCode = 0;
@@ -160,19 +159,30 @@
             errorCode = 1;
             return false;
         }
+        if (UIHelper.IsNumeric(_name))
+        {
+            errorCode = 2;
+            return false;
+        }
         return true;
     }
-    
-    
+
+
     public void ShowFairyNameErrorTip(int _errorCode)
     {
         switch (_errorCode)
         {
             case 0:
+                //绌�
                 SysNotifyMgr.Instance.ShowTip("FamilyNameChangeNoNull");
                 break;
             case 1:
-                SysNotifyMgr.Instance.ShowTip("FamilyNameChangeUnlegal");
+                // 鑴忓瓧
+                SysNotifyMgr.Instance.ShowTip("NameSensitive");
+                break;
+            case 2:
+                // 涓嶈兘绾暟瀛�
+                SysNotifyMgr.Instance.ShowTip("NameError3");
                 break;
         }
     }
@@ -190,9 +200,90 @@
     }
 
 
+
+
+    int GetJoinCD()
+    {
+        if (PlayerDatas.Instance.baseData.leaveFamilyTime == 0)
+            return 0;
+        var quitType = PlayerDatas.Instance.baseData.leaveGuildInfo % 10;
+        int quitCount = 0;
+        int punishTime = 0;
+        if (quitType == 0)
+        {
+            //琚涪
+            quitCount = PlayerDatas.Instance.baseData.leaveGuildInfo / 10 % 10;
+            if (beQuitGuildPunishTime.Length != 0)
+                punishTime = beQuitGuildPunishTime[Math.Min(quitCount, beQuitGuildPunishTime.Length - 1)];
+        }
+        else if (quitType == 1)
+        {
+            //涓诲姩閫�鍑�
+            quitCount = PlayerDatas.Instance.baseData.leaveGuildInfo / 100;
+            if (quitGuildPunishTime.Length != 0)
+                punishTime = quitGuildPunishTime[Math.Min(quitCount, quitGuildPunishTime.Length - 1)];
+        }
+
+        return TimeUtility.AllSeconds - PlayerDatas.Instance.baseData.leaveFamilyTime - punishTime * 60;
+    }
+
+
+    // 鍒涘缓鍏細
+    public void CreateGuild(string name, int emblemID, string emblemWord)
+    {
+        var cdSeconds = GetJoinCD();
+        if (cdSeconds > 0)
+        {
+            SysNotifyMgr.Instance.ShowTip("GuildSys4", TimeUtility.SecondsToHMSEx(cdSeconds));
+            return;
+        }
+
+        if (!UIHelper.CheckMoneyCount(createMoneyType, createFairyCost, 2))
+        {
+            return;
+        }
+
+        if (emblemWord.Length > 1)
+        {
+            //棰勫埗浣撹緭鍏ユ闄愬埗锛屼笉闄愪换鎰忓瓧绗﹂兘鍙兘杈撳叆1涓瓧
+            return;
+        }
+
+        int error;
+
+        //鑾峰彇name鐨勫瓧鑺傞暱搴︼紝name鍙兘鏄腑鏂� 鎴栬�呭叾浠栧崰鐢�3涓瓧绗︾殑绗﹀彿
+        if (!UIHelper.SatisfyNameLength(name, out error))
+        {
+            // TODO 鏆傛椂鎸変腑鏂囬暱搴︽彁绀�, 涓嶅悓璇█鍙牴鎹儏鍐典慨鏀�
+            if (error == 1)
+            {
+                SysNotifyMgr.Instance.ShowTip("NameError2", 7);
+                return;
+            }
+            else if (error == 2)
+            {
+                SysNotifyMgr.Instance.ShowTip("NameError1", 2);
+                return;
+            }
+        }
+
+        if (!CheckFairyNameLimit(name, out error))
+        {
+            ShowFairyNameErrorTip(error);
+            return;
+        }
+
+        var pack = new CA604_tagCMCreateFamily();
+        pack.Name = name;
+        pack.EmblemID = (ushort)emblemID;
+        pack.EmblemWord = emblemWord;
+        GameNetSystem.Instance.SendInfo(pack);
+
+    }
+
     #endregion
 
-   
+
 
 
     #region 浠欑洘鍟嗗簵寮�鍚�
@@ -229,7 +320,7 @@
 
 
 
-
+    // 鍏細鑷畾涔夎褰�
     public void UpdateFamilyAction(HA513_tagMCFamilyActionInfo _package)
     {
 
@@ -258,7 +349,7 @@
             return false;
         return true;
     }
-    
+
 
 
     #region 浠欑洘鍒楄〃
@@ -305,6 +396,11 @@
         }
         var pack = new CA620_tagCMViewFamilyPage();
 
+        if (!string.IsNullOrEmpty(msg) && UIHelper.IsNumeric(msg))
+        {
+            msg = DecryptGuildID(msg);
+        }
+
         pack.Msg = msg;
         pack.MsgLen = (byte)msg.Length;
         pack.PageIndex = (byte)pageIndex;
@@ -317,15 +413,15 @@
     public static void SetFairyViewData(FairyData data, HA523_tagMCFamilyViewList.tagMCFamilyView view)
     {
         data.Rank = view.Rank;
-        data.FamilyID = view.FamilyID;
+        data.FamilyID = (int)view.FamilyID;
         data.FamilyName = view.FamilyName;
-        data.LeaderID = view.LeaderID;
+        data.LeaderID = (int)view.LeaderID;
         data.LeaderName = view.LeaderName;
         data.FamilyLV = view.FamilyLV;
         data.JoinReview = view.JoinReview;
         data.JoinLVMin = view.JoinLVMin;
-        data.ServerID = view.ServerID;
-        data.EmblemID = view.EmblemID;
+        data.ServerID = (int)view.ServerID;
+        data.EmblemID = (int)view.EmblemID;
         data.EmblemWord = view.EmblemWord;
         data.totalFightPower = view.FightPowerEx * Constants.ExpPointValue + view.FightPower;
         data.MemberCount = view.MemberCount;
@@ -348,16 +444,16 @@
         {
             FairyApply apply = new FairyApply();
             apply.Name = vNetData.ReqJoinList[i].Name;
-            apply.PlayerID = vNetData.ReqJoinList[i].PlayerID;
-            apply.ReqTime = vNetData.ReqJoinList[i].ReqTime;
+            apply.PlayerID = (int)vNetData.ReqJoinList[i].PlayerID;
+            apply.ReqTime = (int)vNetData.ReqJoinList[i].ReqTime;
             apply.LV = vNetData.ReqJoinList[i].LV;
             apply.Job = vNetData.ReqJoinList[i].Job;
             apply.RealmLV = vNetData.ReqJoinList[i].RealmLV;
-            apply.Face = vNetData.ReqJoinList[i].Face;
-            apply.FacePic = vNetData.ReqJoinList[i].FacePic;
-            apply.TitleID = vNetData.ReqJoinList[i].TitleID;
+            apply.Face = (int)vNetData.ReqJoinList[i].Face;
+            apply.FacePic = (int)vNetData.ReqJoinList[i].FacePic;
+            apply.TitleID = (int)vNetData.ReqJoinList[i].TitleID;
             apply.FightPower = vNetData.ReqJoinList[i].FightPower + vNetData.ReqJoinList[i].FightPowerEx * Constants.ExpPointValue;
-            apply.ServerID = vNetData.ReqJoinList[i].ServerID;
+            apply.ServerID = (int)vNetData.ReqJoinList[i].ServerID;
             apply.IsOnLine = vNetData.ReqJoinList[i].IsOnLine;
             applyList.Add(apply);
         }
@@ -384,7 +480,167 @@
     {
         return applyList;
     }
+
+    //type 0鐢宠/1鎾ら攢 鍔犲叆鍏細
+    //id 0 浠h〃涓�閿姞鍏�
+    public void SendApplyGuild(int id, int type)
+    {
+        if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Fairy, true))
+        {
+            return;
+        }
+
+        if (PlayerDatas.Instance.fairyData.HasFairy)
+        {
+            SysNotifyMgr.Instance.ShowTip("GeRen_chenxin_85890");
+            return;
+        }
+
+        if (type == 0)
+        {
+            var cdSeconds = GetJoinCD();
+            if (cdSeconds > 0)
+            {
+                SysNotifyMgr.Instance.ShowTip("GuildSys2", TimeUtility.SecondsToHMSEx(cdSeconds));
+                return;
+            }
+
+            if (id != 0 && guildsDict.ContainsKey(id))
+            {
+                if (guildsDict[id].MemberCount >= FamilyConfig.Get(guildsDict[id].FamilyLV).MemberMax)
+                {
+                    SysNotifyMgr.Instance.ShowTip("jiazu_lhs_202580");
+                    return;
+                }
+            }
+        }
+
+        CA602_tagCMRequesJoinFamily rqPack = new CA602_tagCMRequesJoinFamily();
+        rqPack.Type = (byte)type;
+        rqPack.TagFamilyID = (uint)id;
+        GameNetSystem.Instance.SendInfo(rqPack);
+    }
+
+
+
+    //0 鍔犲叆锛�1 鐢宠 2 宸茬敵璇�
+    public int GetRequestState(FairyData guildInfo)
+    {
+        if (IsGuildRequested(guildInfo.FamilyID))
+        {
+            return 2;
+        }
+
+        if (guildInfo.JoinReview != 0)
+        {
+            return 1;
+        }
+
+        return 0;
+    }
+
+
+
     #endregion
 
 
+    public bool guildChanged = false;
+    //鍏細鏁版嵁鍙樺寲锛岃姹傛柊鐨勫叕浼氫俊鎭紝濡傚湪鎵撳紑鍏細鍒楄〃鏃惰姹傦紝鍏朵粬鍔熻兘鏍规嵁鑷韩鎯呭喌璇锋眰
+    public void UpdateGuildDataChangeMark(HA521_tagMCFamilyChange netPack)
+    {
+        if (netPack.Type > 0)
+        {
+            guildChanged = true;
+        }
+    }
+
+    public void RequestGuildData()
+    {
+        if (guildChanged)
+        {
+            guildChanged = false;
+            var pack = new CA626_tagCMGetFamilyInfo();
+            GameNetSystem.Instance.SendInfo(pack);
+
+        }
+    }
+
+    public void SendKickFairy(uint playerID)
+    {
+        var pak = new CA605_tagCMDeleteFamilyMember();
+        pak.MemberID = playerID;
+        GameNetSystem.Instance.SendInfo(pak);
+    }
+
+
+    #region 鍔犲瘑鏁板瓧
+
+    //1. 灏嗘暟瀛楄ˉ鍏呭埌10浣嶏紝涓嶈冻琛�0
+    //2. 灏嗘瘡涓綅鐨勬暟瀛楃粨鍚堢储寮� 鏄犲皠鍒版槧灏勮〃涓�
+    //3. 灏嗘槧灏勫悗鐨勬暟瀛楁嫾鎺ユ垚瀛楃涓�
+    //4. 鍙﹀涓�涓В瀵嗗嚱鏁帮紝灏嗗瓧绗︿覆杩樺師鎴愭暟瀛�
+
+    int[] map = { 5, 2, 9, 1, 8, 3, 7, 0, 6, 4 };
+    int[] reverseMap;
+
+    public string EncryptGuildID(int num)
+    {
+        if (num < 0)
+        {
+            Debug.LogError("Invalid number: " + num);
+            return "";
+        }
+
+        string str = num.ToString().PadLeft(10, '0');
+        StringBuilder result = new StringBuilder();
+
+        for (int i = 0; i < str.Length; i++)
+        {
+            int digit = int.Parse(str[i].ToString());
+            int encryptedDigit = map[(digit + i) % 10]; // 缁撳悎浣嶇疆鏌ヨ〃
+            result.Append(encryptedDigit);
+        }
+        return "6" + result.ToString();
+    }
+
+    public string DecryptGuildID(string encryptedStr)
+    {
+        if (string.IsNullOrEmpty(encryptedStr) || encryptedStr.Length != 11)
+        {
+            // Debug.LogError("Invalid encrypted string: " + encryptedStr);
+            SysNotifyMgr.Instance.ShowTip("GuildSys6");
+            return "";
+        }
+        
+        encryptedStr = encryptedStr.Substring(1);
+
+        if (reverseMap.IsNullOrEmpty())
+        {
+            reverseMap = new int[10];
+            reverseMap = GenerateReverseMap(map);
+        }
+        StringBuilder originalStr = new StringBuilder();
+
+        for (int i = 0; i < encryptedStr.Length; i++)
+        {
+            int encryptedDigit = int.Parse(encryptedStr[i].ToString());
+            int originalDigit = (reverseMap[encryptedDigit] - i + 10) % 10; // 鍙嶅悜鏌ヨ〃骞惰皟鏁翠綅缃�
+            originalStr.Append(originalDigit);
+        }
+        return originalStr.ToString().TrimStart('0'); // 鍘婚櫎鍓嶅闆�
+    }
+    
+    
+    int[] GenerateReverseMap(int[] map)
+    {
+        for (int i = 0; i < map.Length; i++)
+        {
+            reverseMap[map[i]] = i; // 鍙嶅悜鏄犲皠锛歮ap[i] -> i
+        }
+        return reverseMap;
+    }
+
+
+    #endregion
+
 }
\ No newline at end of file
diff --git a/Main/System/Guild/GuildPreviewWin.cs b/Main/System/Guild/GuildPreviewWin.cs
new file mode 100644
index 0000000..eb15938
--- /dev/null
+++ b/Main/System/Guild/GuildPreviewWin.cs
@@ -0,0 +1,129 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+/// <summary>
+/// 鏌ョ湅鍏朵粬鍏細鐣岄潰
+/// </summary>
+public class GuildPreviewWin : UIBase
+{
+    [SerializeField] GuildEmblemCell guildEmblem;
+    [SerializeField] Text guildMemberCountText;
+    [SerializeField] Text totalFightPowerText;
+    [SerializeField] Text guildLevelText;
+    [SerializeField] Text guildNameText; //鍔犳湇鍔″櫒淇℃伅
+    [SerializeField] Text guildNumText; //鍔犲叕浼氱紪鍙�
+    [SerializeField] Button copyBtn;
+    [SerializeField] Text noticeText; //鍏憡
+    [SerializeField] AvatarCell leaderAvatar;
+    [SerializeField] OfficialTitleCell leaderTitle;
+    [SerializeField] Text leaderLevelText;
+    [SerializeField] Text guildJobText;
+    [SerializeField] Text leaderNameText;
+    [SerializeField] Text leaderFightPowerText;
+    [SerializeField] Button seePlayerBtn;
+
+    [SerializeField] Button opearteBtn;
+    [SerializeField] Text opearteBtnText;
+
+
+    int guildID;
+    int leaderID;
+    protected override void InitComponent()
+    {
+        opearteBtn.AddListener(() =>
+        {
+            var guildInfo = GuildManager.Instance.guildsDict[guildID];
+            if (guildInfo == null) return;
+            var state = GuildManager.Instance.GetRequestState(guildInfo);
+            GuildManager.Instance.SendApplyGuild(guildID, state == 2 ? 1 : 0);
+        });
+
+        copyBtn.AddListener(() =>
+        {
+            var guildInfo = GuildManager.Instance.guildsDict[guildID];
+            if (guildInfo == null) return;
+            UIHelper.CopyToClipboard(guildNumText.text);
+            SysNotifyMgr.Instance.ShowTip("GuildSys8");
+        });
+
+        seePlayerBtn.AddListener(() =>
+        {
+            OtherPlayerDetailManager.Instance.ViewPlayerDetail(leaderID);
+        });
+    }
+
+    protected override void OnPreOpen()
+    {
+        OtherPlayerDetailManager.Instance.OnRevPackage += OnRevLeaderPackage;
+        guildID = functionOrder;
+
+        Display();
+    }
+
+    protected override void OnPreClose()
+    {
+        OtherPlayerDetailManager.Instance.OnRevPackage -= OnRevLeaderPackage;
+
+    }
+
+    void Display()
+    {
+        var guildInfo = GuildManager.Instance.guildsDict[guildID];
+        if (guildInfo == null) return;
+        leaderID = guildInfo.LeaderID;
+        OtherPlayerDetailManager.Instance.ViewPlayerDetail(leaderID, (int)ViewPlayerType.viewGuildLeader);
+
+        var config = FamilyConfig.Get(guildInfo.FamilyLV);
+        guildEmblem.Display(guildInfo.EmblemID, guildInfo.EmblemWord, 1.3f);
+        guildMemberCountText.text = guildInfo.MemberCount + "/" + config.MemberMax;
+        totalFightPowerText.text = UIHelper.ReplaceLargeArtNum(guildInfo.totalFightPower);
+        guildLevelText.text = Language.Get("L1094") + guildInfo.FamilyLV;
+        guildNameText.text = guildInfo.FamilyName + Language.Get("L1039", ServerListCenter.Instance.GetServerName(guildInfo.ServerID));
+        guildNumText.text = GuildManager.Instance.EncryptGuildID(guildInfo.FamilyID);
+        leaderNameText.text = guildInfo.LeaderName;
+        noticeText.text = guildInfo.Broadcast;
+
+
+        var state = GuildManager.Instance.GetRequestState(guildInfo);
+
+        string key = "";
+        switch (state)
+        {
+            case 1:
+                key = "Guild_17";
+                break;
+            case 2:
+                key = "Guild_21";
+                break;
+            default:
+                key = "Guild_22";
+                break;
+        }
+        opearteBtnText.text = Language.Get(key);
+
+    }
+
+
+
+    void OnRevLeaderPackage(int viewType, int playerID)
+    {
+        if (viewType != (int)ViewPlayerType.viewGuildLeader)
+        {
+            return;
+        }
+        if (playerID != leaderID)
+        {
+            return;
+        }
+        var leaderInfo = OtherPlayerDetailManager.Instance.GetViewPlayerData(playerID);
+
+        leaderAvatar.InitUI(AvatarHelper.GetAvatarModel(0, leaderInfo.Face, leaderInfo.FacePic));
+        leaderTitle.InitUI(leaderInfo.RealmLV, leaderInfo.TitleID);
+        leaderLevelText.text = leaderInfo.LV.ToString();
+        guildJobText.text = RichTextMsgReplaceConfig.GetRichReplace("FAMILY", 3);
+        leaderFightPowerText.text = UIHelper.ReplaceLargeArtNum(leaderInfo.FightPower);
+    }
+
+}
\ No newline at end of file
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta b/Main/System/Guild/GuildPreviewWin.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
copy to Main/System/Guild/GuildPreviewWin.cs.meta
index f878724..4e627b5 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
+++ b/Main/System/Guild/GuildPreviewWin.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 6fb2c77abf75d964d82b4b15659602b9
+guid: fd9c288ff11ce574fa551ef39869d5ea
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Guild/GuildViewListCell.cs b/Main/System/Guild/GuildViewListCell.cs
index 2cd56f6..663f07c 100644
--- a/Main/System/Guild/GuildViewListCell.cs
+++ b/Main/System/Guild/GuildViewListCell.cs
@@ -2,20 +2,21 @@
 using UnityEngine.UI;
 
 
+//鍏細鏌ユ壘鍒楄〃锛屼篃鏄帓琛屾
 public class GuildViewListCell : CellView
 {
     [SerializeField] Image rankImg;
     [SerializeField] Transform rankTextTf;
     [SerializeField] Text rankText;
-    [SerializeField] Image guildEmblemImg;
+    [SerializeField] GuildEmblemCell guildEmblem;
     [SerializeField] Text guildLevelText;
     [SerializeField] Text guildNameText;
     [SerializeField] Text leaderNameText;
     [SerializeField] Text totalFightPowerText;
-    [SerializeField] Text limitText;
     [SerializeField] Button opearteBtn;
     [SerializeField] Text opearteBtnText;
     [SerializeField] Text guildMemberCountText;
+    [SerializeField] Button seeGuildBtn;
 
 
     public void Display(int index)
@@ -27,6 +28,7 @@
         {
             rankImg.SetActive(true);
             rankImg.SetSprite("guildnum" + guildInfo.Rank);
+            rankImg.SetNativeSize();
             rankTextTf.SetActive(false);
         }
         else
@@ -35,12 +37,44 @@
             rankTextTf.SetActive(true);
             rankText.text = guildInfo.Rank.ToString();
         }
+        guildEmblem.Display(guildInfo.EmblemID, guildInfo.EmblemWord);
         guildLevelText.text = Language.Get("L1094") + guildInfo.FamilyLV;
         guildNameText.text = guildInfo.FamilyName;
         leaderNameText.text = guildInfo.LeaderName;
-        totalFightPowerText.text = guildInfo.totalFightPower.ToString();
+        totalFightPowerText.text = UIHelper.ReplaceLargeArtNum(guildInfo.totalFightPower);
 
+        var config = FamilyConfig.Get(guildInfo.FamilyLV);
+        guildMemberCountText.text = guildInfo.MemberCount + "/" + config.MemberMax;
+
+        var state = GuildManager.Instance.GetRequestState(guildInfo);
+
+        string key = "";
+        switch (state)
+        {
+            case 1:
+                key = "Guild_17";
+                break;
+            case 2:
+                key = "Guild_21";
+                break;
+            default:
+                key = "Guild_22";
+                break;
+        }
+        opearteBtnText.text = Language.Get(key);
+
+        int familyID = guildInfo.FamilyID;
+        opearteBtn.AddListener(() =>
+        {
+            GuildManager.Instance.SendApplyGuild(familyID, state == 2 ? 1 : 0);
+        });
+
+        seeGuildBtn.AddListener(() =>
+        {
+            UIManager.Instance.OpenWindow<GuildPreviewWin>(guildID);
+        });
     }
 
+
 }
 
diff --git a/Main/System/Guild/PlayerFairyData.cs b/Main/System/Guild/PlayerFairyData.cs
index f3ea866..d058ee8 100644
--- a/Main/System/Guild/PlayerFairyData.cs
+++ b/Main/System/Guild/PlayerFairyData.cs
@@ -7,17 +7,22 @@
 /** 鐜╁浠欑洘鐩稿叧淇℃伅缂撳瓨鏁版嵁 */
 public class PlayerFairyData
 {
-    private bool hasFairy = false;
+
     public bool HasFairy
     {
-        get { return hasFairy; }
+        get
+        {
+            if (fairy == null) return false;
+            if (fairy.FamilyID == 0) return false;
+            return true;
+        }
     }
 
 
     public FairyData fairy = null;  //鑷繁鐨勫叕浼氭暟鎹�
     public FairyMember mine = null;
     public event Action OnRefreshFairyInfo;
-    public event Action OnRefreshFairyMine;
+    public event Action OnRefreshFairyMine; //鐜╁鍦ㄥ叕浼氶噷鐨勬暟鎹�
     private Dictionary<int, FairyMember> memberDic = new Dictionary<int, FairyMember>();
 
     // 0-鎴愬憳锛�1-绮捐嫳锛�2-鍓洘涓伙紝3-鐩熶富
@@ -33,19 +38,18 @@
         {
             fairy = new FairyData();
         }
-        fairy.FamilyID = vNetData.FamilyID;
-        if (fairy.FamilyID != 0) hasFairy = true;
+        fairy.FamilyID = (int)vNetData.FamilyID;
         fairy.FamilyName = UIHelper.ServerStringTrim(vNetData.FamilyName);
         fairy.FamilyLV = vNetData.FamilyLV;
-        fairy.FamilyLVExp = vNetData.FamilyLVExp;
+        fairy.FamilyLVExp = (int)vNetData.FamilyLVExp;
         fairy.JoinReview = vNetData.JoinReview;
         fairy.JoinLVMin = vNetData.JoinLVMin;
-        fairy.ServerID = vNetData.ServerID;
-        fairy.EmblemID = vNetData.EmblemID;
+        fairy.ServerID = (int)vNetData.ServerID;
+        fairy.EmblemID = (int)vNetData.EmblemID;
         fairy.EmblemWord = vNetData.EmblemWord;
         fairy.totalFightPower = vNetData.FightPowerEx * Constants.ExpPointValue + vNetData.FightPower;
         fairy.Broadcast = vNetData.Broadcast;
-        fairy.LeaderID = vNetData.LeaderID;
+        fairy.LeaderID = (int)vNetData.LeaderID;
         fairy.MemberCount = vNetData.MemberCount;
 
         mine = null;
@@ -56,28 +60,29 @@
             FairyMember member = new FairyMember();
             memberDic[(int)vNetData.MemberList[i].PlayerID] = member;
 
-            member.PlayerID = vNetData.MemberList[i].PlayerID;
+            member.PlayerID = (int)vNetData.MemberList[i].PlayerID;
             member.Name = vNetData.MemberList[i].Name;
-            member.JoinTime = vNetData.MemberList[i].JoinTime;
+            member.JoinTime = (int)vNetData.MemberList[i].JoinTime;
             member.FmLV = vNetData.MemberList[i].FmLV;
             member.LV = vNetData.MemberList[i].LV;
             member.Job = vNetData.MemberList[i].Job;
             member.RealmLV = vNetData.MemberList[i].RealmLV;
-            member.Face = vNetData.MemberList[i].Face;
-            member.FacePic = vNetData.MemberList[i].FacePic;
-            member.TitleID = vNetData.MemberList[i].TitleID;
+            member.Face = (int)vNetData.MemberList[i].Face;
+            member.FacePic = (int)vNetData.MemberList[i].FacePic;
+            member.TitleID = (int)vNetData.MemberList[i].TitleID;
             member.FightPower = vNetData.MemberList[i].FightPower + vNetData.MemberList[i].FightPowerEx * Constants.ExpPointValue;
-            member.ServerID = vNetData.MemberList[i].ServerID;
-            member.ContribTotal = vNetData.MemberList[i].ContribTotal;
-            member.ContribDay = vNetData.MemberList[i].ContribDay;
-            member.DonateCntTotal = vNetData.MemberList[i].DonateCntTotal;
+            member.ServerID = (int)vNetData.MemberList[i].ServerID;
+            member.ContribTotal = (int)vNetData.MemberList[i].ContribTotal;
+            member.ContribDay = (int)vNetData.MemberList[i].ContribDay;
+            member.DonateCntTotal = (int)vNetData.MemberList[i].DonateCntTotal;
             member.DonateCntDay = vNetData.MemberList[i].DonateCntDay;
-            member.OffTime = vNetData.MemberList[i].OffTime;
+            member.OffTime = (int)vNetData.MemberList[i].OffTime;
 
             if (member.PlayerID == PlayerDatas.Instance.baseData.PlayerID)
             {
                 //鑷繁
                 mine = member;
+                OnRefreshFairyMine?.Invoke();
             }
 
             // 0-鎴愬憳锛�1-绮捐嫳锛�2-鍓洘涓伙紝3-鐩熶富
@@ -118,6 +123,13 @@
     }
     #endregion
 
+    public void ClearData()
+    {
+        fairy = null;
+        mine = null;
+        memberDic.Clear();
+        leaderID = 0;
+    }
 
 }
 
@@ -125,19 +137,19 @@
 //鍏細鏁版嵁
 public class FairyData
 {
-    public ushort Rank;        //鍚嶆锛屼粠1寮�濮�
-    public uint FamilyID;
+    public int Rank;        //鍚嶆锛屼粠1寮�濮�
+    public int FamilyID;
     public string FamilyName;    //瀹舵棌鍚嶇О
-    public byte FamilyLV;    //瀹舵棌绛夌骇
-    public uint FamilyLVExp;    //瀹舵棌绛夌骇缁忛獙
-    public byte JoinReview;    //鎴愬憳鍔犲叆鏄惁闇�瑕佸鏍革紝榛樿0鑷姩鍔犲叆
-    public ushort JoinLVMin;    //闄愬埗鏈�浣庡彲鍔犲叆鐨勭帺瀹剁瓑绾�
-    public uint ServerID;    //鍖烘湇ID锛屽垱寤烘椂浠ユ棌闀跨殑鍖烘湇ID璧嬪��
-    public uint EmblemID;    //寰界珷ID
+    public int FamilyLV;    //瀹舵棌绛夌骇
+    public int FamilyLVExp;    //瀹舵棌绛夌骇缁忛獙
+    public int JoinReview;    //鎴愬憳鍔犲叆鏄惁闇�瑕佸鏍革紝榛樿0鑷姩鍔犲叆
+    public int JoinLVMin;    //闄愬埗鏈�浣庡彲鍔犲叆鐨勭帺瀹剁瓑绾�
+    public int ServerID;    //鍖烘湇ID锛屽垱寤烘椂浠ユ棌闀跨殑鍖烘湇ID璧嬪��
+    public int EmblemID;    //寰界珷ID
     public string EmblemWord;    //寰界珷鏂囧瓧
     public long totalFightPower;
     public string Broadcast;
-    public uint LeaderID;    //鏃忛暱鐜╁ID
+    public int LeaderID;    //鏃忛暱鐜╁ID
     public int MemberCount;
 
     //鏌ユ壘澧炲姞鐨勫瓧娈�
@@ -147,39 +159,39 @@
 
 public class FairyMember
 {
-    public uint PlayerID;
+    public int PlayerID;
     public string Name;        //size = NameLen
-    public uint JoinTime;        //鍔犲叆瀹舵棌鏃舵椂闂存埑
-    public byte FmLV;        //瀹舵棌鑱屼綅: 0-鎴愬憳锛�1-绮捐嫳锛�2-鍓棌闀匡紱3-鏃忛暱
-    public ushort LV;        //绛夌骇
-    public byte Job;        //鑱屼笟
-    public byte RealmLV;        //澧冪晫
-    public uint Face;        //鍩烘湰鑴稿瀷
-    public uint FacePic;        //澶村儚妗�
-    public uint TitleID;        //绉板彿
+    public int JoinTime;        //鍔犲叆瀹舵棌鏃舵椂闂存埑
+    public int FmLV;        //瀹舵棌鑱屼綅: 0-鎴愬憳锛�1-绮捐嫳锛�2-鍓棌闀匡紱3-鏃忛暱
+    public int LV;        //绛夌骇
+    public int Job;        //鑱屼笟
+    public int RealmLV;        //澧冪晫
+    public int Face;        //鍩烘湰鑴稿瀷
+    public int FacePic;        //澶村儚妗�
+    public int TitleID;        //绉板彿
     public long FightPower;        //鎴樺姏锛屾眰浣欎嚎閮ㄥ垎
-    public uint ServerID;        //鎵�灞炲尯鏈岻D
-    public uint ContribTotal;        //鎬昏础鐚害
-    public uint ContribDay;        //鏃ヨ础鐚害
-    public uint DonateCntTotal;        //鎬绘崘鐚鏁�
-    public byte DonateCntDay;        //鏃ユ崘鐚鏁�
-    public uint OffTime;        // 0-鍦ㄧ嚎; >0-/绂荤嚎鏃堕棿鎴�
+    public int ServerID;        //鎵�灞炲尯鏈岻D
+    public int ContribTotal;        //鎬昏础鐚害
+    public int ContribDay;        //鏃ヨ础鐚害
+    public int DonateCntTotal;        //鎬绘崘鐚鏁�
+    public int DonateCntDay;        //鏃ユ崘鐚鏁�
+    public int OffTime;        // 0-鍦ㄧ嚎; >0-/绂荤嚎鏃堕棿鎴�
 }
 
 public class FairyApply
 {
-    public uint PlayerID;
+    public int PlayerID;
     public string Name;      
-    public uint ReqTime;        //鐢宠鏃堕棿鎴�
-    public ushort LV;        //绛夌骇
-    public byte Job;        //鑱屼笟
-    public byte RealmLV;        //澧冪晫
-    public uint Face;        //鍩烘湰鑴稿瀷
-    public uint FacePic;        //澶村儚妗�
-    public uint TitleID;        //绉板彿
+    public int ReqTime;        //鐢宠鏃堕棿鎴�
+    public int LV;        //绛夌骇
+    public int Job;        //鑱屼笟
+    public int RealmLV;        //澧冪晫
+    public int Face;        //鍩烘湰鑴稿瀷
+    public int FacePic;        //澶村儚妗�
+    public int TitleID;        //绉板彿
     public long FightPower;     
-    public uint ServerID;        //鎵�灞炲尯鏈岻D
-    public byte IsOnLine;        //鏄惁鍦ㄧ嚎
+    public int ServerID;        //鎵�灞炲尯鏈岻D
+    public int IsOnLine;        //鏄惁鍦ㄧ嚎
 }
 
 //鏉冮檺ID: 1-鏀朵汉锛�2-鍙樻洿鑱屼綅锛�3-鍙戝竷鍏憡锛�4-韪汉
diff --git a/Main/System/HappyXB/HeroCallResultWin.cs b/Main/System/HappyXB/HeroCallResultWin.cs
index db7ed8f..2240f72 100644
--- a/Main/System/HappyXB/HeroCallResultWin.cs
+++ b/Main/System/HappyXB/HeroCallResultWin.cs
@@ -334,7 +334,7 @@
         List<string> qualityStrList = new List<string>();
         for (int i = 0; i < qualityList.Count; i++)
         {
-            qualityStrList.Add(UIHelper.AppendColor(qualityList[i], Language.Get("equipQualityFormat", Language.Get("CommonQuality" + qualityList[i]))));
+            qualityStrList.Add(UIHelper.AppendColor(qualityList[i], Language.Get("L1039", Language.Get("CommonQuality" + qualityList[i]))));
         }
         callTip.text = Language.Get("HeroCall6", needCount, string.Join(Language.Get("L1130"), qualityStrList.ToArray()));
     }
diff --git a/Main/System/HappyXB/HeroCallWin.cs b/Main/System/HappyXB/HeroCallWin.cs
index e1212dd..a65236c 100644
--- a/Main/System/HappyXB/HeroCallWin.cs
+++ b/Main/System/HappyXB/HeroCallWin.cs
@@ -106,7 +106,7 @@
         List<string> qualityStrList = new List<string>();
         for (int i = 0; i < qualityList.Count; i++)
         {
-            qualityStrList.Add(UIHelper.AppendColor(qualityList[i], Language.Get("equipQualityFormat", Language.Get("CommonQuality" + qualityList[i]))));
+            qualityStrList.Add(UIHelper.AppendColor(qualityList[i], Language.Get("L1039", Language.Get("CommonQuality" + qualityList[i]))));
         }
         callTip.text = Language.Get("HeroCall6", needCount, string.Join(Language.Get("L1130"), qualityStrList.ToArray()));
     }
diff --git a/Main/System/HeroUI/HeroAwakePrivewWin.cs b/Main/System/HeroUI/HeroAwakePrivewWin.cs
index 12ede47..180c7fc 100644
--- a/Main/System/HeroUI/HeroAwakePrivewWin.cs
+++ b/Main/System/HeroUI/HeroAwakePrivewWin.cs
@@ -61,13 +61,13 @@
             else if (type == 2)
             {
                 var skill = SkillConfig.Get(config.SkillID);
-                awakeStr = Language.Get("equipQualityFormat", skill.SkillName) + skill.Description;
+                awakeStr = Language.Get("L1039", skill.SkillName) + skill.Description;
             }
             else
             {
                 for (int k = 0; k < config.AttrIDList.Length; k++)
                 {
-                    awakeStr += (string.IsNullOrEmpty(config.SkillIName) ? string.Empty : Language.Get("equipQualityFormat", config.SkillIName)) +PlayerPropertyConfig.GetFullDescription(config.AttrIDList[k], config.AttrValueList[k], "{0}+" + UIHelper.AppendColor(TextColType.Green, "{1}")) +
+                    awakeStr += (string.IsNullOrEmpty(config.SkillIName) ? string.Empty : Language.Get("L1039", config.SkillIName)) +PlayerPropertyConfig.GetFullDescription(config.AttrIDList[k], config.AttrValueList[k], "{0}+" + UIHelper.AppendColor(TextColType.Green, "{1}")) +
                         (k == config.AttrIDList.Length - 1 ? "" : "\n");
                 }
             }
diff --git a/Main/System/HeroUI/HeroAwakeSuccessWin.cs b/Main/System/HeroUI/HeroAwakeSuccessWin.cs
index bdb3747..9001d87 100644
--- a/Main/System/HeroUI/HeroAwakeSuccessWin.cs
+++ b/Main/System/HeroUI/HeroAwakeSuccessWin.cs
@@ -68,10 +68,10 @@
             else
             {
                 var beforeSkill = SkillConfig.GetSkillConfig(skill.SkillType, skill.SkillLV - 1);
-                beforeSkillText.text = Language.Get("equipQualityFormat", beforeSkill.SkillName) + beforeSkill.Description;
+                beforeSkillText.text = Language.Get("L1039", beforeSkill.SkillName) + beforeSkill.Description;
             }
 
-            afterSkillText.text = Language.Get("equipQualityFormat", skill.SkillName) + skill.Description;
+            afterSkillText.text = Language.Get("L1039", skill.SkillName) + skill.Description;
 
         }
         else
diff --git a/Main/System/HeroUI/HeroBestWin.cs b/Main/System/HeroUI/HeroBestWin.cs
index 256aa58..f6db6d3 100644
--- a/Main/System/HeroUI/HeroBestWin.cs
+++ b/Main/System/HeroUI/HeroBestWin.cs
@@ -312,7 +312,7 @@
                 if (nextQualityBreakConfig.AttrIDList[j] == 0)
                     continue;
                 string format = i < breakLevel ? "{0}" + UIHelper.AppendColor(TextColType.Green, "+{1}") : "{0}+{1}";
-                attrStrArr.Add((string.IsNullOrEmpty(nextQualityBreakConfig.SkillIName) ? string.Empty : Language.Get("equipQualityFormat", nextQualityBreakConfig.SkillIName)) +
+                attrStrArr.Add((string.IsNullOrEmpty(nextQualityBreakConfig.SkillIName) ? string.Empty : Language.Get("L1039", nextQualityBreakConfig.SkillIName)) +
                 PlayerPropertyConfig.GetFullDescription(nextQualityBreakConfig.AttrIDList[j], nextQualityBreakConfig.AttrValueList[j], format));
             }
 
@@ -321,7 +321,7 @@
                 var skill = SkillConfig.Get(nextQualityBreakConfig.SkillID);
                 if (skill != null)
                 {
-                    attrStrArr.Add(Language.Get("equipQualityFormat", skill.SkillName) + skill.Description);
+                    attrStrArr.Add(Language.Get("L1039", skill.SkillName) + skill.Description);
                 }
                 else
                 {
@@ -452,13 +452,13 @@
             else if (type == 2)
             {
                 var skill = SkillConfig.Get(config.SkillID);
-                awakeStr = Language.Get("equipQualityFormat", skill.SkillName) + skill.Description;
+                awakeStr = Language.Get("L1039", skill.SkillName) + skill.Description;
             }
             else
             {
                 for (int k = 0; k < config.AttrIDList.Length; k++)
                 {
-                    awakeStr += (string.IsNullOrEmpty(config.SkillIName) ? string.Empty : Language.Get("equipQualityFormat", config.SkillIName)) +
+                    awakeStr += (string.IsNullOrEmpty(config.SkillIName) ? string.Empty : Language.Get("L1039", config.SkillIName)) +
                     PlayerPropertyConfig.GetFullDescription(config.AttrIDList[k], config.AttrValueList[k], "{0}+" + UIHelper.AppendColor(TextColType.Green, "{1}"))
                     + (k == config.AttrIDList.Length - 1 ? "" : "\n");
                 }
diff --git a/Main/System/HeroUI/HeroLVBreakSuccessWin.cs b/Main/System/HeroUI/HeroLVBreakSuccessWin.cs
index 53c0aee..18db587 100644
--- a/Main/System/HeroUI/HeroLVBreakSuccessWin.cs
+++ b/Main/System/HeroUI/HeroLVBreakSuccessWin.cs
@@ -76,13 +76,13 @@
             var id = nextQualityBreakConfig.AttrIDList[i];
             if (id == 0)
                 continue;
-            attrStrArr.Add((string.IsNullOrEmpty(nextQualityBreakConfig.SkillIName) ? string.Empty : Language.Get("equipQualityFormat", nextQualityBreakConfig.SkillIName)) +
+            attrStrArr.Add((string.IsNullOrEmpty(nextQualityBreakConfig.SkillIName) ? string.Empty : Language.Get("L1039", nextQualityBreakConfig.SkillIName)) +
             PlayerPropertyConfig.GetFullDescription(id, nextQualityBreakConfig.AttrValueList[i]));
         }
         if (nextQualityBreakConfig.SkillID != 0)
         {
             var skill = SkillConfig.Get(nextQualityBreakConfig.SkillID);
-            attrStrArr.Add(Language.Get("equipQualityFormat", skill.SkillName) + skill.Description);
+            attrStrArr.Add(Language.Get("L1039", skill.SkillName) + skill.Description);
         }
         potentialText.text = Language.Get("L1100", Language.Get("herocard56"), string.Join(Language.Get("L1112"), attrStrArr));
     }
diff --git a/Main/System/HeroUI/HeroLVBreakWin.cs b/Main/System/HeroUI/HeroLVBreakWin.cs
index 52b13c6..9677eea 100644
--- a/Main/System/HeroUI/HeroLVBreakWin.cs
+++ b/Main/System/HeroUI/HeroLVBreakWin.cs
@@ -81,7 +81,7 @@
             {
                 continue;
             }
-            attrStrArr.Add((string.IsNullOrEmpty(nextQualityBreakConfig.SkillIName) ? string.Empty : Language.Get("equipQualityFormat", nextQualityBreakConfig.SkillIName)) +
+            attrStrArr.Add((string.IsNullOrEmpty(nextQualityBreakConfig.SkillIName) ? string.Empty : Language.Get("L1039", nextQualityBreakConfig.SkillIName)) +
             PlayerPropertyConfig.GetFullDescription(nextQualityBreakConfig.AttrIDList[i], nextQualityBreakConfig.AttrValueList[i]));
         }
         if (nextQualityBreakConfig.SkillID != 0)
@@ -89,7 +89,7 @@
             var skill = SkillConfig.Get(nextQualityBreakConfig.SkillID);
             if (skill != null)
             {
-                attrStrArr.Add(Language.Get("equipQualityFormat", skill.SkillName) + skill.Description);
+                attrStrArr.Add(Language.Get("L1039", skill.SkillName) + skill.Description);
             }
             else
             { 
diff --git a/Main/System/HeroUI/HeroTrainWin.cs b/Main/System/HeroUI/HeroTrainWin.cs
index 9859c31..c77ce4d 100644
--- a/Main/System/HeroUI/HeroTrainWin.cs
+++ b/Main/System/HeroUI/HeroTrainWin.cs
@@ -513,7 +513,7 @@
                 if (nextQualityBreakConfig.AttrIDList[j] == 0)
                     continue;
                 string format = i < hero.breakLevel ? "{0}" + UIHelper.AppendColor(TextColType.Green, "+{1}") : "{0}+{1}";
-                attrStrArr.Add((string.IsNullOrEmpty(nextQualityBreakConfig.SkillIName) ? string.Empty : Language.Get("equipQualityFormat", nextQualityBreakConfig.SkillIName)) +
+                attrStrArr.Add((string.IsNullOrEmpty(nextQualityBreakConfig.SkillIName) ? string.Empty : Language.Get("L1039", nextQualityBreakConfig.SkillIName)) +
                 PlayerPropertyConfig.GetFullDescription(nextQualityBreakConfig.AttrIDList[j], nextQualityBreakConfig.AttrValueList[j], format));
             }
 
@@ -522,7 +522,7 @@
                 var skill = SkillConfig.Get(nextQualityBreakConfig.SkillID);
                 if (skill != null)
                 {
-                    attrStrArr.Add(Language.Get("equipQualityFormat", skill.SkillName) + skill.Description);
+                    attrStrArr.Add(Language.Get("L1039", skill.SkillName) + skill.Description);
                 }
                 else
                 {
@@ -682,13 +682,13 @@
             else if (type == 2)
             {
                 var skill = SkillConfig.Get(config.SkillID);
-                awakeStr = Language.Get("equipQualityFormat", skill.SkillName) + skill.Description;
+                awakeStr = Language.Get("L1039", skill.SkillName) + skill.Description;
             }
             else
             {
                 for (int k = 0; k < config.AttrIDList.Length; k++)
                 {
-                    awakeStr += (string.IsNullOrEmpty(config.SkillIName) ? string.Empty : Language.Get("equipQualityFormat", config.SkillIName)) +
+                    awakeStr += (string.IsNullOrEmpty(config.SkillIName) ? string.Empty : Language.Get("L1039", config.SkillIName)) +
                     PlayerPropertyConfig.GetFullDescription(config.AttrIDList[k], config.AttrValueList[k], "{0}+" + UIHelper.AppendColor(TextColType.Green, "{1}"))
                     + (k == config.AttrIDList.Length - 1 ? "" : "\n");
                 }
diff --git a/Main/System/Main/MainWin.cs b/Main/System/Main/MainWin.cs
index 993e17d..6c3c56d 100644
--- a/Main/System/Main/MainWin.cs
+++ b/Main/System/Main/MainWin.cs
@@ -36,7 +36,6 @@
         base.InitComponent();
 
         avatarCell.button.AddListener(() => { });
-
     }
 
     public override void Refresh()
@@ -71,6 +70,18 @@
         tabButtons[3].UpdateButtonState();
     }
 
+    //澶栭儴璋冪敤鐐瑰嚮鍔熻兘
+    public void ClickFunc(int functionOrder)
+    {
+        tabButtons[functionOrder].onClick.Invoke();
+    }
+
+    //鎭㈠鍔熻兘鎸夐挳鐘舵��
+    public void RestoreFuncBtn()
+    {
+        tabButtons[functionOrder].SelectBtn();
+    }
+
     protected override void SelectBottomTab(int index)
     {
         if (index == 3)
@@ -98,6 +109,7 @@
         OpenSubUIByTabIndex();
     }
 
+    //鎴樻枟鎸夐挳鍔ㄧ敾
     void ClickAnimation(int index)
     {
         if (isFirstOpen || (functionOrder != 0 && index == 0))
@@ -183,6 +195,14 @@
                 AutoFightModel.Instance.StartFight();
             }
         }
+        else if (index == 4 && !PlayerDatas.Instance.fairyData.HasFairy)
+        {
+            //鏈姞鍏ュ叕浼氫笉鍒囨崲鏍囩锛屾墦寮�鐢宠鐣岄潰
+            UIManager.Instance.OpenWindow<GuildJoinWin>();
+            return;
+        }
+
+
         SelectBottomTab(index);
     }
 
@@ -211,18 +231,15 @@
                     battleWin.SetBattleField(BattleManager.Instance.storyBattleField);
                 }
                 currentSubUI = UIManager.Instance.OpenWindow<HomeWin>();
-                Debug.Log("鎵撳紑涓诲煄鐣岄潰");
                 break;
             case 1:
                 currentSubUI = UIManager.Instance.OpenWindow<AffairBaseWin>();
-                Debug.Log("鎵撳紑鍐呮斂鐣岄潰");
                 break;
             case 2:
                 currentSubUI = UIManager.Instance.OpenWindow<HeroBaseWin>(0);
-                Debug.Log("鎵撳紑姝﹀皢鐣岄潰");
                 break;
             // case 3:
-            //     // currentSubUI = UIManager.Instance.OpenUI<QuestUI>();
+            //     鎸戞垬鐣岄潰涓嶈烦杞�
             //     Debug.Log("鎵撳紑鎸戞垬鐣岄潰");
             //     break;
             case 4:
diff --git a/Main/System/Redpoint/MainRedDot.cs b/Main/System/Redpoint/MainRedDot.cs
index 4f3fec5..1f37023 100644
--- a/Main/System/Redpoint/MainRedDot.cs
+++ b/Main/System/Redpoint/MainRedDot.cs
@@ -97,8 +97,7 @@
     public const int MailRepoint = 467; //閭
     public const int FirstChargeRepoint = 468; //棣栧厖
     public const int BoneFieldRepoint = 469; //鐧介鐩堥噹
-
-
+    public const int ArenaRepoint = 470; //婕旀鍦�
     public void Register()
     {
 
diff --git a/Main/System/RoleParticulars/OtherPlayerDetailManager.cs b/Main/System/RoleParticulars/OtherPlayerDetailManager.cs
new file mode 100644
index 0000000..63bcb49
--- /dev/null
+++ b/Main/System/RoleParticulars/OtherPlayerDetailManager.cs
@@ -0,0 +1,214 @@
+锘縰sing System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using LitJson;
+using System.Linq;
+
+
+//鏌ョ湅鍏朵粬鐜╁鐨勭畝鐭俊鎭�, 璇ユā鍧楀鐞嗘暟鎹紝鍏朵粬鐢卞悇鑷姛鑳芥ā鍧楀鐞� 閫氳繃OnRevPackage
+public class OtherPlayerDetailManager : GameSystemManager<OtherPlayerDetailManager>
+{
+
+    public override void Init()
+    {
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize;
+    }
+
+    public override void Release()
+    {
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize;
+    }
+
+
+    public void OnBeforePlayerDataInitialize()
+    {
+        viewPlayerType = -1;
+    }
+
+    public int viewPlayer { get; private set; }
+
+    // 鏌ヨ绫诲瀷锛氭牴鎹被鍨嬪仛涓嶅悓澶勭悊
+    // 鎸夊姛鑳借嚜瀹氫箟鏋氫妇鍊� EnumHelper鐨� ViewPlayerType
+    public int viewPlayerType { get; private set; }
+
+    private Dictionary<int, ViewPlayerData> viewPlayerDataDic = new Dictionary<int, ViewPlayerData>();
+    
+    // 鏌ョ湅绫诲瀷锛岀帺瀹禝D
+    public event Action<int, int> OnRevPackage; //灏介噺涓嶈鐢ㄧ涓�涓弬鏁皏iewtype鍋氬垽鏂紝瀹规槗鍑洪敊
+
+    // 鑾峰彇鍏朵粬鐜╁鏈湴缂撳瓨鏁版嵁
+    public ViewPlayerData GetViewPlayerData(int player)
+    {
+        ViewPlayerData viewPlayerData = null;
+        viewPlayerDataDic.TryGetValue(player, out viewPlayerData);
+        return viewPlayerData;
+    }
+
+
+    // 鍚戞湇鍔$璇锋眰鍏朵粬鐜╁鏁版嵁
+    public void ViewPlayerDetail(int _playerId, int viewType = (int)ViewPlayerType.viewPlayerData)
+    {
+        if (_playerId == PlayerDatas.Instance.baseData.PlayerID)
+        {
+            return;
+        }
+        viewPlayerType = viewType;
+        ViewRoleParticulars(_playerId);
+    }
+
+    // 鍚戞湇鍔$璇锋眰鐜╁鏁版嵁
+    void ViewRoleParticulars(int playerID)
+    {
+        if (playerID == 0)
+        {
+            return;
+        }
+        viewPlayer = playerID;
+        if (viewPlayerDataDic.ContainsKey(playerID))
+        {
+            ViewPlayerData viewPlayerData = viewPlayerDataDic[playerID];
+            if ((DateTime.Now - viewPlayerData.getTime).TotalSeconds < 30)
+            {
+                ShowRoleParticulars(playerID);
+                return;
+            }
+        }
+        
+        //CC002_tagCGViewCrossPlayerInfo c002 = new CC002_tagCGViewCrossPlayerInfo();
+
+        CA212_tagCMViewPlayerInfo pak = new CA212_tagCMViewPlayerInfo();
+        pak.PlayerID = (uint)playerID;
+        GameNetSystem.Instance.SendInfo(pak);
+    }
+
+
+    //鏈湇绔炴妧鍦哄亣鏌ヨ妯℃嫙灏佸寘锛岃繑鍥炴煡鐪嬫満鍣ㄤ汉鏁版嵁 鎵撳紑RoleParticularsWin鐣岄潰锛屼笓鐢ㄦ帴鍙e叾浠栧湴鏂逛笉瑕佽皟鐢�
+    public void ViewFairyArenaRobot(int playerID, ViewPlayerData _viewPlayerData)
+    {
+        ViewPlayerData viewPlayerData = null;
+        viewPlayer = playerID;
+        if (!viewPlayerDataDic.TryGetValue(playerID, out viewPlayerData))
+        {
+            viewPlayerDataDic.Add(playerID, _viewPlayerData);
+        }
+        else
+        {
+            viewPlayerDataDic[playerID] = _viewPlayerData;
+        }
+
+        viewPlayerType = (int)ViewPlayerType.viewPlayerData;
+        ShowRoleParticulars(playerID);
+    }
+
+
+
+    public void OnRevRoleEquip(HA705_tagSCQueryPlayerCacheResult package)
+    {
+
+        ViewPlayerData viewPlayerData = null;
+        if (!viewPlayerDataDic.TryGetValue((int)package.PlayerID, out viewPlayerData))
+        {
+            viewPlayerData = new ViewPlayerData();
+            viewPlayerData.getTime = DateTime.Now;
+            viewPlayerDataDic.Add((int)package.PlayerID, viewPlayerData);
+        }
+
+        viewPlayerData.getTime = DateTime.Now;
+        viewPlayerData.PlayerID = (int)package.PlayerID;
+        viewPlayerData.Name = package.PlayerName;
+        viewPlayerData.LV = package.LV;
+        viewPlayerData.Job = package.Job;
+        viewPlayerData.RealmLV = package.RealmLV;
+        viewPlayerData.Face = (int)package.Face;
+        viewPlayerData.FacePic = (int)package.FacePic;
+        viewPlayerData.TitleID = (int)package.TitleID;
+        viewPlayerData.ServerID = (int)package.ServerID;
+        viewPlayerData.FightPower = package.FightPower + package.FightPowerEx * (long)Constants.ExpPointValue;
+        viewPlayerData.FamilyID = (int)package.FamilyID;
+        viewPlayerData.FamilyName = package.FamilyName;
+        viewPlayerData.FamilyEmblemID = (int)package.FamilyEmblemID;
+
+
+        if (viewPlayerData.rolePlusData == null)
+        {
+            //绗竴娆″垵濮嬪寲
+            viewPlayerData.rolePlusData = new RolePlusData();
+        }
+        if (package.PlusDataSize != 0)
+        {
+            viewPlayerData.rolePlusData.AnalysisRolePlusData(package.PlusData);
+        }
+
+
+        ShowRoleParticulars((int)package.PlayerID);
+    }
+
+
+
+
+
+    //灏介噺涓嶈鐢ㄧ涓�涓弬鏁皏iewtype鍋氬垽鏂紝瀹规槗鍑洪敊锛屾瘮濡傚悓鏃跺彂閫佷袱涓笉鍚岀殑viewPlayerType璇锋眰鐨勬椂鍊�
+    private void ShowRoleParticulars(int playerID)
+    {
+        // if (viewPlayerType == (int)ViewPlayerType.viewPlayerData)
+        // {
+        //     if (!WindowCenter.Instance.IsOpen<RoleParticularsWin>())
+        //     {
+        //         RoleParticularsWin.viewType = viewPlayerType;
+        //         WindowCenter.Instance.Open<RoleParticularsWin>();
+        //     }
+        // }
+
+
+        
+        OnRevPackage?.Invoke(viewPlayerType, playerID);
+        viewPlayerType = -1;
+    }
+
+    public class ViewPlayerData
+    {
+        public int PlayerID;
+        public int LV;
+        public int RealmLV;
+        public string Name;
+        public string FamilyName;
+        public int Job;
+        public int FamilyID;
+        public long FightPower;
+        public int TitleID;
+        public int ServerID;
+        public int FamilyEmblemID;
+        public int Face;    //鑴稿瀷
+        public int FacePic;    //鑴稿瀷澶栨
+
+        public RolePlusData rolePlusData;
+
+        public DateTime getTime;
+
+
+    }
+
+
+
+
+    public class RolePlusData
+    {
+
+        public void AnalysisRolePlusData(string jsonStr)
+        {
+            try
+            {
+                
+                
+            }
+            catch (Exception e)
+            {
+                Debug.Log(e.StackTrace);
+            }
+        }
+
+    }
+
+}
+
diff --git a/Main/System/RoleParticulars/RoleParticularModel.cs.meta b/Main/System/RoleParticulars/OtherPlayerDetailManager.cs.meta
similarity index 100%
rename from Main/System/RoleParticulars/RoleParticularModel.cs.meta
rename to Main/System/RoleParticulars/OtherPlayerDetailManager.cs.meta
diff --git a/Main/System/RoleParticulars/RoleParticularModel.cs b/Main/System/RoleParticulars/RoleParticularModel.cs
deleted file mode 100644
index ac99679..0000000
--- a/Main/System/RoleParticulars/RoleParticularModel.cs
+++ /dev/null
@@ -1,558 +0,0 @@
-锘縰sing System;
-using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-using LitJson;
-using System.Linq;
-
-
-//鏌ョ湅鍏朵粬鐜╁鐨勭畝鐭俊鎭�, 璇ユā鍧楀鐞嗘暟鎹紝鍏朵粬鐢卞悇鑷姛鑳芥ā鍧楀鐞� 閫氳繃OnRevPackage
-public class RoleParticularModel : GameSystemManager<RoleParticularModel>
-{
-
-    public override void Init()
-    {
-        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize;
-    }
-
-    public override void Release()
-    {
-        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize;
-    }
-
-
-    public void OnBeforePlayerDataInitialize()
-    {
-        viewPlayerType = -1;
-    }
-
-    public int viewPlayer { get; private set; }
-
-    // 鏌ヨ鏈湇锛�0-鏌ョ湅鍏朵粬鐜╁鐨勭畝娲佷俊鎭晫闈� 1-鏌ョ湅鎴樺姏鐣岄潰 2锛堜互涓婂皬浜�100锛�-杩斿洖鏁版嵁涓嶅仛澶勭悊锛岀敱璋冪敤鑰呰嚜琛屽鐞嗛�昏緫
-    // 鏌ヨ璺ㄦ湇锛�100-鏌ョ湅鍏朵粬鐜╁鐨勭畝娲佷俊鎭晫闈� 101-鏌ョ湅鎴樺姏鐣岄潰 102浠ヤ笂-杩斿洖鏁版嵁涓嶅仛澶勭悊锛岀敱璋冪敤鑰呰嚜琛屽鐞嗛�昏緫
-    // 璋冪敤鑰呴渶瑕佺殑璇濊嚜瀹氫箟鏋氫妇鍊� EnumHelper鐨刅iewPlayerType
-    public int viewPlayerType { get; private set; }  
-
-    private Dictionary<int, ViewPlayerData> viewPlayerDataDic = new Dictionary<int, ViewPlayerData>();
-    private Dictionary<int, long> funcFightPowerDict = new Dictionary<int, long>();
-    public event Action PowerUpdate;
-    public static Action<int, int, ViewPlayerData> OnRevPackage; //灏介噺涓嶈鐢ㄧ涓�涓弬鏁皏iewtype鍋氬垽鏂紝瀹规槗鍑洪敊
-
-    public ViewPlayerData GetViewPlayerData(int player)
-    {
-        ViewPlayerData viewPlayerData = null;
-        viewPlayerDataDic.TryGetValue(player, out viewPlayerData);
-        return viewPlayerData;
-    }
-
-    // 鏌ョ湅鐜╁妯″瀷灞曠ず锛屾煡鐜╁瑁呭璇︽儏闇�鍙﹀澶勭悊
-    // 鏈湇鏌ヨ锛氳繑鍥炴椂鎵撳紑鏌ョ湅鍏朵粬鐜╁鐨勭畝娲佷俊鎭晫闈紙鍙煡鐪嬭澶囷紝瀹犵墿锛屽潗楠戠瓑鍏蜂綋淇℃伅锛塕oleParticularsWin
-    public void ViewRoleEquip(int playerID)
-    {
-        if (playerID == PlayerDatas.Instance.baseData.PlayerID)
-        {
-            return;
-        }
-        viewPlayerType = (int)ViewPlayerType.viewPlayerEquip;
-        ViewRoleParticulars(playerID);
-    }
-
-    // 鏈湇鏌ヨ锛氳繑鍥炴椂鎵撳紑鏌ョ湅鍏朵粬鐜╁鎴樺姏鐣岄潰锛堟垬鍔涘垎甯冿級ViewFuncPowerWin
-    public void ViewRoleFightPower(int playerID)
-    {
-        if (playerID == PlayerDatas.Instance.baseData.PlayerID)
-        {
-            return;
-        }
-        viewPlayerType = (int)ViewPlayerType.viewPlayerFightPower;
-        ViewRoleParticulars(playerID);
-    }
-
-    // 杩斿洖鏃朵笉鍋氫换浣曟搷浣滐紝鐢辫皟鐢ㄨ�呰嚜琛屽鐞嗛�昏緫
-    public void ViewPlayerCacheData(int _playerId, int viewType = (int)ViewPlayerType.viewPlayerData)
-    {
-        viewPlayerType = viewType;
-        ViewRoleParticulars(_playerId);
-    }
-
-    // 鏌ョ湅鐜╁妯″瀷灞曠ず锛屾煡鐜╁瑁呭璇︽儏闇�鍙﹀澶勭悊
-    // 璺ㄦ湇鏌ヨ锛氳繑鍥炴椂鎵撳紑鏌ョ湅鍏朵粬鐜╁鐨勭畝娲佷俊鎭晫闈紙鍙煡鐪嬭澶囷紝瀹犵墿锛屽潗楠戠瓑鍏蜂綋淇℃伅锛塕oleParticularsWin
-    public void ViewCrossServerPlayerEquip(int _playerId)
-    {
-        if (_playerId == PlayerDatas.Instance.baseData.PlayerID)
-        {
-            return;
-        }
-        viewPlayerType = (int)ViewPlayerType.viewCrossPlayerEquip;
-        ViewRoleParticulars(_playerId);
-    }
-
-    public void ViewCrossPlayerFightPower(int _playerId)
-    {
-        if (_playerId == PlayerDatas.Instance.baseData.PlayerID)
-        {
-            return;
-        }
-        viewPlayerType = (int)ViewPlayerType.viewCrossPlayerFightPower;
-        ViewRoleParticulars(_playerId);
-    }
-
-    // 杩斿洖鏃朵笉鍋氫换浣曟搷浣滐紝鐢辫皟鐢ㄨ�呰嚜琛屽鐞嗛�昏緫
-    public void ViewCrossPlayerCacheData(int _playerId, int viewType = (int)ViewPlayerType.viewCrossPlayerData)
-    {
-        viewPlayerType = viewType;
-        ViewRoleParticulars(_playerId);
-    }
-
-    public void ViewRoleParticulars(int playerID)
-    {
-        if (playerID == 0)
-        {
-            return;
-        }
-        viewPlayer = playerID;
-        if (viewPlayerDataDic.ContainsKey(playerID))
-        {
-            ViewPlayerData viewPlayerData = viewPlayerDataDic[playerID];
-            if ((DateTime.Now - viewPlayerData.getTime).TotalSeconds < 30)
-            {
-                ShowRoleParticulars(viewPlayerData, playerID);
-                return;
-            }
-        }
-        if (viewPlayerType >= (int)ViewPlayerType.viewCrossPlayerEquip)
-        {
-            //鐢卞瓙鏈嶆湇鍔″櫒鍚戣法鏈嶆湇鍔″櫒鏌ヨ; 浼氫紭鍏堟煡鏈湇鏁版嵁(gameserver)
-            CC002_tagCGViewCrossPlayerInfo c002 = new CC002_tagCGViewCrossPlayerInfo();
-            c002.PlayerID = (uint)playerID;
-            GameNetSystem.Instance.SendInfo(c002);
-        }
-        else
-        {
-            //鍙煡鏈湇鏁版嵁锛屾湁鍙兘鏈湴鍥炬湁鏁版嵁锛屽氨涓嶆煡gameserver
-            CA212_tagCMViewPlayerInfo pak = new CA212_tagCMViewPlayerInfo();
-            pak.PlayerID = (uint)playerID;
-            GameNetSystem.Instance.SendInfo(pak);
-        }
-    }
-
-
-    //鏈湇绔炴妧鍦哄亣鏌ヨ妯℃嫙灏佸寘锛岃繑鍥炴煡鐪嬫満鍣ㄤ汉鏁版嵁 鎵撳紑RoleParticularsWin鐣岄潰锛屼笓鐢ㄦ帴鍙e叾浠栧湴鏂逛笉瑕佽皟鐢�
-    public void ViewFairyArenaRobot(int playerID, ViewPlayerData _viewPlayerData)
-    {
-        ViewPlayerData viewPlayerData = null;
-        viewPlayer = playerID;
-        if (!viewPlayerDataDic.TryGetValue(playerID, out viewPlayerData))
-        {
-            viewPlayerDataDic.Add(playerID, _viewPlayerData);
-        }
-        else
-        {
-            viewPlayerDataDic[playerID] = _viewPlayerData;
-        }
-
-        viewPlayerType = (int)ViewPlayerType.viewCrossPlayerEquip;
-        ShowRoleParticulars(_viewPlayerData, playerID);
-    }
-
-
-
-    public void OnRevRoleEquip(HA705_tagSCQueryPlayerCacheResult package)
-    {
-
-        ViewPlayerData viewPlayerData = null;
-        if (!viewPlayerDataDic.TryGetValue((int)package.PlayerID, out viewPlayerData))
-        {
-            viewPlayerData = new ViewPlayerData();
-            viewPlayerData.getTime = DateTime.Now;
-            viewPlayerDataDic.Add((int)package.PlayerID, viewPlayerData);
-        }
-
-        viewPlayerData.getTime = DateTime.Now;
-        viewPlayerData.rolePropData.PlayerID = (int)package.PlayerID;
-        viewPlayerData.rolePropData.Name = package.PlayerName;
-        viewPlayerData.rolePropData.LV = package.LV;
-        viewPlayerData.rolePropData.Job = package.Job;
-        viewPlayerData.rolePropData.RealmLV = package.RealmLV;
-        viewPlayerData.rolePropData.Face = (int)package.Face;
-        viewPlayerData.rolePropData.FacePic = (int)package.FacePic;
-        viewPlayerData.rolePropData.TitleID = (int)package.TitleID;
-        viewPlayerData.rolePropData.ServerID = (int)package.ServerID;
-        viewPlayerData.rolePropData.FightPower = package.FightPower + package.FightPowerEx * (long)Constants.ExpPointValue;
-        viewPlayerData.rolePropData.FamilyID = (int)package.FamilyID;
-        viewPlayerData.rolePropData.FamilyName = package.FamilyName;
-        viewPlayerData.rolePropData.FamilyEmblemID = (int)package.FamilyEmblemID;
-
-
-        if (viewPlayerData.rolePlusData == null)
-        {
-            //绗竴娆″垵濮嬪寲
-            viewPlayerData.rolePlusData = new RolePlusData();
-        }
-        if (package.PlusDataSize != 0)
-        {
-            viewPlayerData.rolePlusData.AnalysisRolePlusData(package.PlusData);
-        }
-
-
-        ShowRoleParticulars(viewPlayerData, (int)package.PlayerID);
-    }
-
-    public void OnRevRoleFuncPower(HA3A1_tagMCModuleFightPowerInfo package)
-    {
-        if (package.MFPCnt == 0)
-            return;
-        for (int i = 0; i < package.MFPList.Length; i++)
-        {
-            funcFightPowerDict[package.MFPList[i].MfpType] = package.MFPList[i].FightPowerEx * Constants.ExpPointValue + package.MFPList[i].FightPower;
-        }
-        if (PowerUpdate != null)
-        {
-            PowerUpdate();
-        }
-    }
-
-    public long GetFuncFightPower(int type)
-    {
-        if (funcFightPowerDict.ContainsKey(type))
-        {
-            return funcFightPowerDict[type];
-        }
-        return 0;
-    }
-
-    #region 鏌ョ湅鐜╁鍧愰獞鐏靛疇灞炴��
-    
-
-    // int[] qualitys;
-    // string[] qualityTitles;
-    // public string GetQualityDisplay(int quality)
-    // {
-    //     if (qualitys == null)
-    //     {
-    //         var config = FuncConfigConfig.Get("PetQuality");
-    //         qualitys = ConfigParse.GetMultipleStr<int>(config.Numerical1);
-    //         qualityTitles = ConfigParse.GetMultipleStr(config.Numerical2);
-    //     }
-    //     for (int i = 0; i < qualitys.Length; i++)
-    //     {
-    //         if (quality == qualitys[i])
-    //         {
-    //             return qualityTitles[i];
-    //         }
-    //     }
-    //     return string.Empty;
-    // }
-
-
-    // public int GetPetFightPower(List<PetInfo> pets)
-    // {
-    //     var fightPower = 0;
-    //     for (int i = 0; i < pets.Count; i++)
-    //     {
-    //         fightPower += GetPetFightPower(pets[i].id, pets[i].lv);
-    //     }
-    //     return fightPower;
-    // }
-
-    // public int GetPetFightPower(int id, int lv)
-    // {
-    //     var fightPower = 0;
-    //     var config = PetInfoConfig.Get(id);
-    //     var _init_fightpower = 0;
-    //     int.TryParse(config.InitFightPower, out _init_fightpower);
-    //     fightPower += _init_fightpower;
-    //     PetInfoConfig.GetPetSkills(id, lv, true, ref skills);
-    //     var petUpConfig = PetClassCostConfig.GetPetIdAndRank(id, lv);
-    //     if (petUpConfig != null)
-    //     {
-    //         Dictionary<int, int> propertyDict = new Dictionary<int, int>();
-    //         propertyDict.Add(77, petUpConfig.AtkAdd);
-    //         propertyDict.Add(78, petUpConfig.AtkAdd);
-    //         fightPower += UIHelper.GetFightPower(propertyDict);// Mathf.FloorToInt(petUpConfig.AtkAdd * 2.5f);
-    //     }
-    //     for (int i = 0; i < skills.Count; i++)
-    //     {
-    //         var skillConfig = SkillConfig.Get(skills[i]);
-    //         if (skillConfig != null)
-    //         {
-    //             fightPower += skillConfig.FightPower;
-    //         }
-    //     }
-    //     return fightPower;
-    // }
-
-    // public int GetPetAtkProperty(List<PetInfo> pets)
-    // {
-    //     var atk = 0;
-    //     for (int i = 0; i < pets.Count; i++)
-    //     {
-    //         atk += GetPetAtkProperty(pets[i].id, pets[i].lv, pets);
-    //     }
-    //     return atk;
-    // }
-
-    // public int GetPetAtkProperty(int id, int lv, List<PetInfo> pets)
-    // {
-    //     var atk = 0;
-    //     var petUpConfig = PetClassCostConfig.GetPetIdAndRank(id, lv);
-    //     if (petUpConfig != null)
-    //     {
-    //         atk += petUpConfig.AtkAdd;
-    //     }
-    //     PetInfoConfig.GetPetSkills(id, lv, true, ref skills);
-    //     for (int i = 0; i < skills.Count; i++)
-    //     {
-    //         atk += GetPetAtkSkillProperty(skills[i], pets);
-    //     }
-    //     return atk;
-    // }
-
-    // public int GetPetAtkSkillProperty(int skillId, List<PetInfo> pets)
-    // {
-    //     SkillConfig skillconfig = SkillConfig.Get(skillId);
-    //     if (skillconfig == null)
-    //     {
-    //         return 0;
-    //     }
-    //     if (skillconfig.Effect1 == (int)RidingAndPetActivationModel.RidingAndPetProperty.PetAttack)
-    //     {
-    //         return GetPetAttack(skillconfig.EffectValue11, skillconfig.EffectValue12, pets);
-    //     }
-    //     else if (skillconfig.Effect2 == (int)RidingAndPetActivationModel.RidingAndPetProperty.PetAttack)
-    //     {
-    //         return GetPetAttack(skillconfig.EffectValue21, skillconfig.EffectValue22, pets);
-    //     }
-    //     else if (skillconfig.Effect3 == (int)RidingAndPetActivationModel.RidingAndPetProperty.PetAttack)
-    //     {
-    //         return GetPetAttack(skillconfig.EffectValue31, skillconfig.EffectValue32, pets);
-    //     }
-    //     else if (skillconfig.Effect4 == (int)RidingAndPetActivationModel.RidingAndPetProperty.PetAttack)
-    //     {
-    //         return GetPetAttack(skillconfig.EffectValue41, skillconfig.EffectValue42, pets);
-    //     }
-    //     else if (skillconfig.Effect5 == (int)RidingAndPetActivationModel.RidingAndPetProperty.PetAttack)
-    //     {
-    //         return GetPetAttack(skillconfig.EffectValue51, skillconfig.EffectValue52, pets);
-    //     }
-    //     else if (skillconfig.Effect6 == (int)RidingAndPetActivationModel.RidingAndPetProperty.PetAttack)
-    //     {
-    //         return GetPetAttack(skillconfig.EffectValue61, skillconfig.EffectValue62, pets);
-    //     }
-    //     return 0;
-    // }
-
-    // int GetPetAttack(int quality, int value, List<PetInfo> pets)
-    // {
-    //     var atk = 0;
-    //     for (int i = 0; i < pets.Count; i++)
-    //     {
-    //         var config = PetInfoConfig.Get(pets[i].id);
-    //         if (config != null && config.Quality == quality)
-    //         {
-    //             var petUpConfig = PetClassCostConfig.GetPetIdAndRank(pets[i].id, pets[i].lv);
-    //             atk += petUpConfig == null ? 0 : petUpConfig.AtkAdd;
-    //         }
-    //     }
-    //     return (int)(atk * ((float)value / 10000));
-    // }
-
-    public bool viewPetStone { get; set; }
-    #endregion
-
-    //灏介噺涓嶈鐢ㄧ涓�涓弬鏁皏iewtype鍋氬垽鏂紝瀹规槗鍑洪敊锛屾瘮濡傚悓鏃跺彂閫佷袱涓笉鍚岀殑viewPlayerType璇锋眰鐨勬椂鍊�
-    private void ShowRoleParticulars(ViewPlayerData _viewPlayerData, int playerID)
-    {
-        // if (viewPlayerType == (int)ViewPlayerType.viewPlayerEquip || viewPlayerType == (int)ViewPlayerType.viewCrossPlayerEquip)
-        // {
-        //     if (!WindowCenter.Instance.IsOpen<RoleParticularsWin>())
-        //     {
-        //         RoleParticularsWin.viewType = viewPlayerType;
-        //         WindowCenter.Instance.Open<RoleParticularsWin>();
-        //     }
-        // }
-        // else if (viewPlayerType == (int)ViewPlayerType.viewPlayerFightPower || viewPlayerType == (int)ViewPlayerType.viewCrossPlayerFightPower)
-        // {
-        //     if (!WindowCenter.Instance.IsOpen<ViewFuncPowerWin>())
-        //     {
-        //         WindowCenter.Instance.Open<ViewFuncPowerWin>();
-        //     }
-        // }
-
-        
-        OnRevPackage?.Invoke(viewPlayerType, playerID, _viewPlayerData);
-        viewPlayerType = -1;
-    }
-
-    public class ViewPlayerData
-    {
-        public RolePropData rolePropData;
-        public RolePlusData rolePlusData;
-
-        public DateTime getTime;
-
-        public int GetEquipSuitLevel()
-        {
-            return 0;
-        }
-
-
-    }
-
-
-    [Serializable]
-    public struct RolePropData
-    {
-        public int PlayerID;
-        public int LV;
-        public int RealmLV;
-        public string Name;
-        public string FamilyName;
-        public int Job;
-        public int FamilyID;
-        public long FightPower;
-        public int TitleID;
-        public int ServerID;
-        public int FamilyEmblemID;
-        public int Face;    //鑴稿瀷
-        public int FacePic;    //鑴稿瀷澶栨
-    }
-
-
-    public class RolePlusData
-    {
-        Dictionary<int, ulong> fightPowerDict = new Dictionary<int, ulong>();
-        Dictionary<int, int> godWeaponDict = new Dictionary<int, int>();
-        Dictionary<int, int> treasureDict = new Dictionary<int, int>();
-        public List<HorseInfo> horses = new List<HorseInfo>();
-        public List<PetInfo> pets = new List<PetInfo>();
-        public List<AlchemyDrug> alchemyDrugs = new List<AlchemyDrug>();
-        public int Horse { get; private set; } //鏀逛负绛夌骇
-        public int Pet { get; private set; }
-
-        public int AtkSpeed { get; private set; }
-        public int Rune { get; private set; }
-        public int orangeEquipsCount { get; private set; }
-        public int totalGemsLevel { get; private set; }
-        public int totalEquipWashLevel { get; private set; }
-        public int totalEquipStarLevel { get; private set; }
-        public int totalEquipStrengthLevel { get; private set; }
-        public int totalEquipEvolveLevel { get; private set; }
-        public int totalSkillLevel { get; private set; }
-
-        public ulong GetFightPower(int type)
-        {
-            if (fightPowerDict != null && fightPowerDict.ContainsKey(type))
-            {
-                return fightPowerDict[type];
-            }
-            return 0;
-        }
-
-
-
-        public void AnalysisRolePlusData(string jsonStr)
-        {
-            try
-            {
-                var jsonData = JsonMapper.ToObject(jsonStr);
-                if (jsonData.Keys.Contains("FightPowerDict"))
-                {
-                    var jsonPlusData = jsonData["FightPowerDict"];
-                    if (jsonPlusData.IsObject)
-                    {
-                        foreach (var key in jsonPlusData.Keys)
-                        {
-                            int type = int.Parse(key);
-                            fightPowerDict.Add(type, ulong.Parse(jsonPlusData[key].ToString()));
-                        }
-                    }
-                }
-
-                
-                // if (jsonData.Keys.Contains("Pet"))
-                // {
-                //     var jsonPlusData = jsonData["Pet"];
-                //     if (jsonPlusData.IsObject)
-                //     {
-                //         foreach (var _key in jsonPlusData.Keys)
-                //         {
-                //             if (_key.Equals("AtkSpeed"))
-                //             {
-                //                 AtkSpeed = int.Parse(jsonPlusData[_key].ToString());
-                //             }
-                //             else if (_key.Equals("PetLV"))
-                //             {
-                //                 var petInfos = JsonMapper.ToObject<PetInfo[]>(jsonPlusData[_key].ToJson());
-                //                 if (petInfos != null && petInfos.Length > 0)
-                //                 {
-                //                     for (int i = 0; i < petInfos.Length; i++)
-                //                     {
-                //                         var petInfo = petInfos[i];
-                //                         pets.Add(new PetInfo()
-                //                         {
-                //                             id = petInfo.id,
-                //                             lv = petInfo.lv + 1,
-                //                         });
-                //                     }
-                //                 }
-                //             }
-                //         }
-                //         pets.Sort(Compare);
-                //     }
-                //     Pet = pets.Count;
-                // }
-                // else
-                // {
-                //     Pet = 0;
-                // }
-                
-            }
-            catch (Exception e)
-            {
-                Debug.Log(e.StackTrace);
-            }
-        }
-
-        // int Compare(PetInfo x, PetInfo y)
-        // {
-        //     var config_x = PetInfoConfig.Get(x.id);
-        //     var config_y = PetInfoConfig.Get(y.id);
-        //     if (config_x == null || config_y == null)
-        //     {
-        //         return 0;
-        //     }
-        //     return -config_x.Sort.CompareTo(config_y.Sort);
-        // }
-
-        // int Compare(HorseInfo x, HorseInfo y)
-        // {
-        //     var config_x = HorseConfig.Get(x.id);
-        //     var config_y = HorseConfig.Get(y.id);
-        //     if (config_x == null || config_y == null)
-        //     {
-        //         return 0;
-        //     }
-        //     return -config_x.Sort.CompareTo(config_y.Sort);
-        // }
-    }
-
-    public struct HorseInfo
-    {
-        public int id;
-        public int lv;
-    }
-
-    public struct PetInfo
-    {
-        public int id;
-        public int lv;
-    }
-
-    public struct AlchemyDrug
-    {
-        public int item;
-        public int count;
-    }
-}
-
diff --git a/Main/System/Tip/MarqueeWin.cs b/Main/System/Tip/MarqueeWin.cs
index bbaf59b..b4fe9f2 100644
--- a/Main/System/Tip/MarqueeWin.cs
+++ b/Main/System/Tip/MarqueeWin.cs
@@ -61,7 +61,8 @@
     {
         base.OnOpen();
         // 绐楀彛鎵撳紑鏃剁殑閫昏緫
-        m_Effect.Play();
+        if (m_Effect.effectId > 0)
+            m_Effect.Play();
         cacheCoroutine = StartCoroutine(Co_StartTween());
     }
 
diff --git a/Main/System/Tip/ServerTipDetails.cs b/Main/System/Tip/ServerTipDetails.cs
index 0bc95db..370d149 100644
--- a/Main/System/Tip/ServerTipDetails.cs
+++ b/Main/System/Tip/ServerTipDetails.cs
@@ -27,10 +27,10 @@
             return;
         }
 
-        if (!UIManager.Instance.IsOpened<MarqueeWin>())
-        {
-            UIManager.Instance.OpenWindow<MarqueeWin>();
-        }
+        // if (!UIManager.Instance.IsOpened<MarqueeWin>())
+        // {
+        //     UIManager.Instance.OpenWindow<MarqueeWin>();
+        // }
     }
 
     public static void OnStageLoadFinish()
@@ -40,7 +40,7 @@
         //     m_Marquees.Clear();
         //     return;
         // }
-        Co_StageLoadFinish().Forget();
+        // Co_StageLoadFinish().Forget();
     }
 
     private static async UniTask Co_StageLoadFinish()
diff --git a/Main/Utility/EnumHelper.cs b/Main/Utility/EnumHelper.cs
index b6bcfc4..fde5a01 100644
--- a/Main/Utility/EnumHelper.cs
+++ b/Main/Utility/EnumHelper.cs
@@ -419,7 +419,7 @@
     Wristband = 8,              //鎶よ厱
     Shawl = 9,               //鎶偐
     Neck = 10,      //椤归摼
-    Ring= 11,      //鎴掓寚
+    Ring = 11,      //鎴掓寚
     Amulet = 12,              //鎶ょ
 
     retMax,
@@ -557,7 +557,7 @@
     ModelMark = 119,                       //鍙樺舰妯″瀷Mark  119
     PrizeCoin = 120,                       //濂栧姳鐐瑰埜鏁�   120
     ExAttr11 = 121,                       //鎵╁睍灞炴��11  121 鐜伴噾浠e竵锛堜唬閲戝埜锛�
-    ExAttr12 = 122,                       //鎵╁睍灞炴��12 閫�鍑轰粰鐩熸椂闂�
+    ExAttr12 = 122,                       //鎵╁睍灞炴��12 璁板綍绂诲紑淇℃伅锛屼富鍔ㄧ寮�娆℃暟*100 + 琚涪娆℃暟*10  + 鏈�鍚庝竴娆℃槸鍚︿富鍔ㄧ寮�鐨勶紝鏆傛椂鏈�澶氱疮璁¤褰曞埌9娆�
     ExAttr13 = 123,                       //鎵╁睍灞炴��13 鏈嶅姟鍣ㄧ粍ID
     ExAttr14 = 124,                       //鎵╁睍灞炴��14  124
 
@@ -671,10 +671,10 @@
     default4,   //  鐜繚鍊� 232
     default5,   // 233浠欑帀璐熸暟 
     default6,   // 234鐏电煶璐熸暟
-    default7,   
+    default7,
     default8,
     default9,   // 237 鍦板浘澧冪晫闅惧害
-    default10,  // 238 绂诲紑浠欑洘鏃堕棿鎴筹紙鍖呭惈涓诲姩閫�鍑烘垨琚涪
+    default10,  // 238 璁板綍绂诲紑鏃堕棿鎴筹紝琚涪鎴栦富鍔ㄩ��鍑哄潎浼氭洿鏂拌鍊�
     default11,  // 239 浠h〃榄呭姏绛夌骇
     default12,
     default13,  // 241 鍙ょ璐у竵
@@ -691,7 +691,7 @@
     default24,
     default25,
     default26,  // 254 鎴橀敜
-    default27,  
+    default27,
     default28,
     default29,
     default30,
@@ -710,6 +710,7 @@
     default43,  // 271 骞诲闃佺Н鍒�
     default44,  // 272 姝﹀皢鎷涘嫙绉垎
     GoldRush = 285, // 娣橀噾浠�
+    ChallengeVoucher = 286,//鎸戞垬鍑瘉
 };
 
 
@@ -775,7 +776,7 @@
     Guard_1 = 114,                  // 鐏靛畧 1
     Guard_2 = 115,                   //鐏靛畧 2
     Hero = 150,                 //姝﹀皢
-    
+
 }
 
 
@@ -1152,7 +1153,7 @@
     BatchAlchemyFairy = 36,//鎵归噺鐐煎埗浠欎腹
     BossHomeBuyTimes = 37,//boss涔嬪璐拱娆℃暟
     SelfBossBuyTims = 38, //涓汉boss璐拱娆℃暟
-    
+
 }
 
 
@@ -1229,7 +1230,7 @@
 
     Def_RewardType_HolidayLogin = 37,//鑺傛棩鐧诲綍濂栧姳
     Def_RewardType_HolidayTravel = 38,//鑺傛棩娓稿巻濂栧姳
-    
+
 }
 
 
@@ -1282,7 +1283,7 @@
     FashionDress = 24,//鏃惰
     JadeDynastyEquip = 25, //璇涗粰瑁呭
 
-    
+
 }
 
 
@@ -1343,7 +1344,7 @@
     RushAttack = 34,//34 鍐查攱+浼ゅ锛岀劧鍚庢晥鏋滃崐寰勯厤0鏃�=鍗曟敾浼ゅ锛岄厤>0鏃�=缇ゆ敾鏍煎瓙鏁帮紝閰�5灏辩瓑浜庤缇ゆ敾5*5
     //35 钃勫姏妯℃澘锛屾惌閰嶆晥鏋滃�� 鏁堟灉ID 1206  A鍊间负鑳介噺娆℃暟 
     default35,
-    
+
 }
 
 
@@ -1649,7 +1650,7 @@
     default1, //鍗囬樁
     default2,
     default3,
-    
+
 }
 
 
@@ -1817,16 +1818,7 @@
 //鏌ヨ鍏朵粬鐜╁鏁版嵁 鐢ㄩ�旂被鍨�
 public enum ViewPlayerType
 {
-    viewPlayerEquip = 0,    //鏌ョ湅鐜╁鍩烘湰淇℃伅锛堣澶囩敱璇锋眰澶у鐣岄樁鍐冲畾锛夛紝骞舵墦寮�鐣岄潰
-    viewPlayerFightPower = 1,  //鏌ョ湅鐜╁鎴樺姏璇︽儏锛屽苟鎵撳紑鐣岄潰
-    viewPlayerData = 2,  //鏌ョ湅鐜╁鍩烘湰淇℃伅锛屽叕鐢�
-    viewPlayerDataZZ = 3,  //鍔╂垬鍦烘櫙浣跨敤
-    viewPlayerDataArena = 4,  //鏈湇绔炴妧鍦哄満鏅娇鐢�
-    viewPlayerDataFairyKing = 5,  //浠欑洘鑱旇禌鐜嬭�匲I浣跨敤
+    viewPlayerData = 0,  //鏌ョ湅鐜╁鍩烘湰淇℃伅锛屽叕鐢ㄦ墦寮�鐣岄潰
+    viewGuildLeader = 1,  //鏌ョ湅鐜╁鐨勫叕浼氭棌闀夸俊鎭�
 
-    //鏌ヨ璺ㄦ湇鏁版嵁浠�100寮�濮�
-    viewCrossPlayerEquip = 100,    //鏌ョ湅鐜╁鍩烘湰淇℃伅锛堣澶囩敱璇锋眰澶у鐣岄樁鍐冲畾锛夛紝骞舵墦寮�鐣岄潰
-    viewCrossPlayerFightPower = 101,  //鏌ョ湅鐜╁鎴樺姏璇︽儏锛屽苟鎵撳紑鐣岄潰
-    viewCrossPlayerData = 102,  //鏌ョ湅鐜╁鍩烘湰淇℃伅锛屽叕鐢�
-    viewCrossPlayerDataBlessedLand = 103,  //绂忓湴椹辫刀
 }
\ No newline at end of file
diff --git a/Main/Utility/TimeUtility.cs b/Main/Utility/TimeUtility.cs
index d1aa684..22c4141 100644
--- a/Main/Utility/TimeUtility.cs
+++ b/Main/Utility/TimeUtility.cs
@@ -369,8 +369,8 @@
     }
 
     //鏋佺畝鏄剧ず
-    // x澶﹛灏忔椂
-    // x灏忔椂x鍒�
+    // x澶� 鎴栬�� x澶﹛灏忔椂
+    // x灏忔椂 鎴栬�� x灏忔椂x鍒�
     // x鍒�
     // x绉�
     public static string SecondsToShortDHMS(int _seconds)
@@ -381,10 +381,18 @@
         int seconds = _seconds % 60;
         if (days > 0)
         {
+            if (hours == 0)
+            {
+                return StringUtility.Contact(days, Language.Get("L1074"));
+            }
             return StringUtility.Contact(days, Language.Get("L1074"), hours, Language.Get("L1072"));
         }
         else if (hours > 0)
         {
+            if (mins == 0)
+            {
+                return StringUtility.Contact(hours, Language.Get("L1072"));
+            }
             return StringUtility.Contact(hours, Language.Get("L1072"), mins, Language.Get("L1073"));
         }
         else if (mins > 0)
diff --git a/Main/Utility/UIHelper.cs b/Main/Utility/UIHelper.cs
index 6757b45..8c204df 100644
--- a/Main/Utility/UIHelper.cs
+++ b/Main/Utility/UIHelper.cs
@@ -325,6 +325,13 @@
         return false;
     }
 
+    // 妫�鏌ュ瓧绗︿覆鏄笉鏄函鏁存暟
+    public static bool IsNumeric(string input)
+    {
+        return int.TryParse(input, out _);
+    }
+
+
     public static string GetColorNameByItemColor(int itemColor)
     {
         switch (itemColor)
@@ -969,7 +976,7 @@
         {3, PlayerDataType.Silver},
         {41, PlayerDataType.default26},
         {42, PlayerDataType.default33},
-
+        {53, PlayerDataType.ChallengeVoucher},
     };
 
     public static long GetMoneyCnt(int moneyType)
@@ -1110,6 +1117,11 @@
                 {
                     //娣橀噾浠�
                     return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.GoldRush);
+                }
+            case 53:
+                {
+                    //鎸戞垬鍑瘉
+                    return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.ChallengeVoucher);
                 }
             case 98:
                 {
@@ -1256,13 +1268,15 @@
         return content;
     }
 
+    //妫�鏌ュ悕瀛楅暱搴︼紝鐜╁鍚嶅拰鍏細鍚�
+    //涓嶅悓鍥藉闀垮害涓嶅悓锛屾帓鐗堜笉鍚�
     public static bool SatisfyNameLength(string name, out int error)
     {
         error = 0;
         //bool pureChinese = Regex.IsMatch(name, "^[\u4e00-\u9fa5]+$");
         //var chsCount = GetChsCount(name);
         int length = Encoding.Default.GetBytes(name).Length;
-        var maxlength = 20;
+        var maxlength = 14;  //绾腑鏂囦笉寤鸿瓒呰繃7涓瓧
         var minlength = 3;
         if (length > maxlength)
         {
@@ -1362,9 +1376,24 @@
 
 
     public static string RemoveColor(string content)
-    { 
+    {
         content = WordAnalysis.Color_Start_Regex.Replace(content, string.Empty);
         content = WordAnalysis.Color_End_Regex.Replace(content, string.Empty);
         return content;
     }
+
+    //澶嶅埗鍒板壀璐存澘
+    // TODO 鏆備笉鏀寔web鍚庣画琛ュ厖
+    public static void CopyToClipboard(string text)
+    {
+        GUIUtility.systemCopyBuffer = text;
+        Debug.Log("鏂囧瓧宸插鍒跺埌鍓创鏉�: " + text);
+    }
+    
+    //鑾峰彇鍓垏鏉垮唴瀹�
+    public static string GetClipboardText()
+    {
+        return GUIUtility.systemCopyBuffer;
+    }
+    
 }

--
Gitblit v1.8.0