From c60913b816a5d3e132ba17b9353df7ad7d1e6e4e Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期三, 18 六月 2025 22:20:12 +0800
Subject: [PATCH] 50 【主界面】核心主体

---
 Main/System/PhantasmPavilion/PhantasmPavilionTabCell.cs.meta                                            |   11 
 Main/System/PhantasmPavilion/PhantasmPavilionTabCell.cs                                                 |   30 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3BD_tagMCBuyEnterInfo.cs.meta              |   11 
 Main/System/PhantasmPavilion/AvatarCell.cs.meta                                                         |   11 
 Main/System/Recharge/DailySpecialsModel.cs.meta                                                         |   11 
 Main/Config/Configs/ChatBubbleBoxConfig.cs.meta                                                         |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family/DTC0F05_tagFamilyChange.cs.meta                  |   11 
 Main/Core/NetworkPackage/ClientPack/CA6_Family.meta                                                     |    8 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA501_tagMCNotifyRequestJoinFamilyInfo.cs      |   13 
 Main/System/PhantasmPavilion/IPhantasmPavilionTabHandler.cs                                             |   31 
 Main/Core/NetworkPackage/ClientPack/C0F_Family.meta                                                     |    8 
 Main/Core/NetworkPackage/ServerPack/HA3_Function/HA350_tagMCTreasureResult.cs                           |   25 
 Main/Core/NetworkPackage/ClientPack/CA4_Family.meta                                                     |    8 
 Main/System/PhantasmPavilion/ChatBubbleHelper.cs.meta                                                   |   11 
 Main/System/Store.meta                                                                                  |    8 
 Main/Core/NetworkPackage/ClientPack/CA2_Interaction/CA230_tagCMSetChatBubbleBox.cs                      |   30 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA302_tagMCFuncOpenStateList.cs              |   13 
 Main/Core/NetworkPackage/ClientPack/C0F_Family/C0F09_tagCDeleteFamilyMember.cs.meta                     |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family/DTC0F05_tagFamilyChange.cs                       |   13 
 Main/Config/Configs/DailyQuestOpenTimeConfig.cs.meta                                                    |   11 
 Main/Core/NetworkPackage/ClientPack/CA3_Item/CA323_tagCMUseItems.cs                                     |   34 
 Main/Core/NetworkPackage/ServerPack/HA3_Function/HA302_tagMCFuncOpenStateList.cs                        |   84 
 Main/Config/Configs/FamilyConfig.cs                                                                     |  103 
 Main/System/PhantasmPavilion/PhantasmPavilionModel.cs.meta                                              |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs               |   13 
 Main/Config/PartialConfigs/FaceConfig.cs                                                                |   28 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA8_Item/DTCA802_tagMCShopItemDayBuyCntInfo.cs              |   13 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA40D_tagGCServerCreatFamilyTimes.cs           |   11 
 Main/System/PhantasmPavilion/PhantasmPavilionAvatarHandler.cs                                           |   95 
 Main/System/PhantasmPavilion/PhantasmPavilionAvatarHandler.cs.meta                                      |   11 
 Main/Config/Configs/FamilyEmblemConfig.cs                                                               |   59 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA2_Package/DTCA204_tagMCVPackRefresh.cs                    |    7 
 Main/Core/NetworkPackage/ClientPack/CA3_Item/CA323_tagCMUseItems.cs.meta                                |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family/DTC0F03_tagRoleFamilyInfo.cs                     |   13 
 Main/System/OpenServerActivity/OpenServerActivityCenter.cs                                              |   32 
 Main/Core/NetworkPackage/ServerPack/HA4_Family.meta                                                     |    8 
 Main/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA03_tagMCDailyPackBuyGiftInfo.cs                 |   21 
 Main/System/FairyUnion/PlayerFairyData.cs                                                               |  437 +
 Main/Core/NetworkPackage/ServerPack/H04_Scene/H0430_tagPlayerInFamilyInfoRefresh.cs.meta                |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB120_tagMCZhanlingInfo.cs                       |   11 
 Main/Core/NetworkPackage/ServerPack/H0F_Family.meta                                                     |    8 
 Main/Core/NetworkPackage/ServerPack/HA3_Function/HA320_tagMCPlayerFBInfoData.cs.meta                    |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB117_tagMCFaceInfo.cs.meta                      |   11 
 Main/Core/NetworkPackage/ServerPack/HA5_Family.meta                                                     |    8 
 Main/System/PhantasmPavilion/PhantasmPavilionAvatarFrameHandler.cs.meta                                 |   11 
 Main/Config/PartialConfigs/EquipGSParamConfig.cs.meta                                                   |   11 
 Main/Core/NetworkPackage/ClientPack/CA6_Family/CA611_tagCMRenameFamily.cs                               |   22 
 Main/System/ItemTip/ItemTipUtility.cs                                                                   |  442 -
 Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB118_tagMCFacePicInfo.cs                        |   13 
 Main/System/FairyUnion/FairyModel.cs.meta                                                               |   12 
 Main/Core/NetworkPackage/ClientPack/CA6_Family/CA602_tagCMRequesJoinFamily.cs                           |   20 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA408_tagGCPyAllFamilyView.cs                  |   13 
 Main/Config/Configs/DailyQuestOpenTimeConfig.cs                                                         |   92 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA351_tagMCTreasureInfo.cs.meta              |   11 
 Main/System/Dungeon/DungeonModel.cs.meta                                                                |   11 
 Main/Core/NetworkPackage/ClientPack/C0F_Family/C0F09_tagCDeleteFamilyMember.cs                          |   17 
 Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family/DTC0F07_tagFamilyRenameResult.cs                 |   13 
 Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3BD_tagMCBuyEnterInfo.cs.meta                        |   11 
 Main/Core/NetworkPackage/ServerPack/H03_MainCharacter/H0316_tagPackResetOK.cs                           |   32 
 Main/Core/NetworkPackage/ServerPack/HA8_Item/HA811_tagMCShoppingResult.cs.meta                          |   11 
 Main/System/Equip/EquipFightPower.cs                                                                    |  159 
 Main/Core/GameEngine/Player/PlayerDatas.cs                                                              |   85 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA315_tagMCDailyActionCnt.cs.meta            |   11 
 Main/System/Equip/EquipSet.cs                                                                           |  107 
 Main/Core/NetworkPackage/ServerPack/HB1_Role/HB117_tagMCFaceInfo.cs.meta                                |   11 
 Main/System/HappyXB/HappyXBModel.cs                                                                     | 1074 ++++
 Main/Core/NetworkPackage/ServerPack/HA2_Package/HA204_tagMCVPackRefresh.cs                              |   84 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA333_tagMCDailyActivityInfoList.cs.meta     |   11 
 Main/System/PhantasmPavilion/AvatarHelper.cs.meta                                                       |   11 
 Main/Config/PartialConfigs/EquipGSParamConfig.cs                                                        |   81 
 Main/Config/PartialConfigs/EquipPlaceMapConfig.cs.meta                                                  |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA302_tagMCFuncOpenStateList.cs.meta         |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3BD_tagMCBuyEnterInfo.cs                   |   13 
 Main/Core/NetworkPackage/ServerPack/HA3_Function/HA351_tagMCTreasureInfo.cs                             |   51 
 Main/Config/PartialConfigs/PlayerPropertyConfig.cs                                                      |  141 
 Main/Core/NetworkPackage/DTCFile/ServerPack/H02_PlayerTalk/DTC0212_tagNotifyCode.cs                     |   41 
 Main/System/Store/StoreModel.cs                                                                         | 1698 +++++++
 Main/Core/NetworkPackage/ClientPack/CA4_Family/CA401_tagCGViewFamilyPage.cs.meta                        |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0430_tagPlayerInFamilyInfoRefresh.cs.meta      |   11 
 Main/Core/NetworkPackage/ServerPack/HB1_Role/HB117_tagMCFaceInfo.cs                                     |   33 
 Main/Core/NetworkPackage/ServerPack/HB1_Role/HB120_tagMCZhanlingInfo.cs.meta                            |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA408_tagGCPyAllFamilyView.cs.meta             |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA8_Item/DTCA802_tagMCShopItemDayBuyCntInfo.cs.meta         |   11 
 Main/System/DailyQuest.meta                                                                             |    8 
 Main/System/Equip/EquipSlot.cs.meta                                                                     |   12 
 Main/System/MainInterfacePanel/MainRedDot.cs                                                            |  136 
 Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB228_tagCMFacePicChange.cs                         |   18 
 Main/System/FairyEmblem/FairyEmblemModel.cs.meta                                                        |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family.meta                                             |    8 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB118_tagMCFacePicInfo.cs.meta                   |   11 
 Main/System/KnapSack/Logic/ItemLogicUtility.cs                                                          |  236 
 Main/System/Dungeon/DungeonData.cs.meta                                                                 |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA2_Package/DTCA205_tagMCVPackClear.cs                      |   12 
 Main/System/PhantasmPavilion/PhantasmPavilionChatExpressionHandler.cs                                   |   91 
 Main/Core/NetworkPackage/ClientPack/C0F_Family/C0F07_tagCGetFamilyInfo.cs.meta                          |   11 
 Main/System/DailyQuest/DailyQuestModel.cs.meta                                                          |   11 
 Main/System/PhantasmPavilion/IPhantasmPavilionTabHandler.cs.meta                                        |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA350_tagMCTreasureResult.cs.meta            |   11 
 Main/System/FairyEmblem/EmblemHelper.cs.meta                                                            |   11 
 Main/System/Recharge/DailySpecialsModel.cs                                                              |  183 
 Main/Core/NetworkPackage/ServerPack/HA5_Family/HA501_tagMCNotifyRequestJoinFamilyInfo.cs                |   19 
 Main/Core/NetworkPackage/ClientPack/CA5_Function/CA568_tagCMRequestTreasure.cs.meta                     |   11 
 Main/System/FairyUnion/FairyModel.cs                                                                    |  558 ++
 Main/Config/PartialConfigs/EquipPlaceMapConfig.cs                                                       |   26 
 Main/Core/NetworkPackage/ClientPack/CA6_Family/CA602_tagCMRequesJoinFamily.cs.meta                      |   11 
 Main/Core/NetworkPackage/ServerPack/H0F_Family/H0F03_tagRoleFamilyInfo.cs                               |  117 
 Main/Core/NetworkPackage/ServerPack/HA5_Family/HA501_tagMCNotifyRequestJoinFamilyInfo.cs.meta           |   11 
 Main/Core/NetworkPackage/ServerPack/HA2_Package/HA205_tagMCVPackClear.cs                                |   40 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA401_tagGCViewFamilyRequestInfo.cs.meta       |   11 
 Main/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA01_tagMCTotalLoginDayCntInfo.cs                 |   19 
 Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB228_tagCMFacePicChange.cs.meta                    |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA8_Item/DTCA811_tagMCShoppingResult.cs.meta                |   11 
 Main/System/PhantasmPavilion/PhantasmPavilionAvatarFrameHandler.cs                                      |   95 
 Main/System/Store/BuyItemController.cs.meta                                                             |   12 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA01_tagMCTotalLoginDayCntInfo.cs.meta  |   11 
 Main/Core/NetworkPackage/ServerPack/H0F_Family/H0F05_tagFamilyChange.cs.meta                            |   11 
 Main/System/Equip/EquipSet.cs.meta                                                                      |   12 
 Main/Core/NetworkPackage/ServerPack/H04_Scene/H0430_tagPlayerInFamilyInfoRefresh.cs                     |   23 
 Main/Core/NetworkPackage/ServerPack/HA4_Family/HA408_tagGCPyAllFamilyView.cs                            |   61 
 Main/Core/NetworkPackage/ServerPack/HA4_Family/HA40D_tagGCServerCreatFamilyTimes.cs                     |   17 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA8_Item/DTCA811_tagMCShoppingResult.cs                     |   13 
 Main/Core/NetworkPackage/ClientPack/CA4_Family/CA413_tagCGChangeFamilyEmblem.cs                         |   18 
 Main/Core/NetworkPackage/ServerPack/HA8_Item/HA811_tagMCShoppingResult.cs                               |   19 
 Main/Core/NetworkPackage/ServerPack/HA4_Family/HA401_tagGCViewFamilyRequestInfo.cs.meta                 |   11 
 Main/System/Equip/EquipSlot.cs                                                                          |   20 
 Main/Core/NetworkPackage/ServerPack/HA3_Function/HA333_tagMCDailyActivityInfoList.cs.meta               |   11 
 Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB226_tagCMFaceChange.cs                            |   18 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3A1_tagMCModuleFightPowerInfo.cs           |   10 
 Main/Core/NetworkPackage/ClientPack/CA5_Function/CA568_tagCMRequestTreasure.cs                          |   22 
 Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB226_tagCMFaceChange.cs.meta                       |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA403_tagGCFamilyActionInfo.cs                 |   14 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA401_tagGCViewFamilyRequestInfo.cs            |   13 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA03_tagMCDailyPackBuyGiftInfo.cs.meta  |   11 
 Main/Core/NetworkPackage/ServerPack/HA4_Family/HA408_tagGCPyAllFamilyView.cs.meta                       |   11 
 Main/Utility/Logic.cs.meta                                                                              |   12 
 Main/Core/NetworkPackage/ServerPack/HA3_Function/HA315_tagMCDailyActionCnt.cs                           |   35 
 Main/System/FairyUnion/PlayerFairyData.cs.meta                                                          |    8 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA403_tagGCFamilyActionInfo.cs.meta            |   11 
 Main/Config/PartialConfigs/DirtyNameConfig.cs                                                           |  199 
 Main/Core/NetworkPackage/ServerPack/H0F_Family/H0F07_tagFamilyRenameResult.cs.meta                      |   11 
 Main/System/Equip/EquipModel.cs                                                                         |   75 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA721_tagMCEmojiPackInfo.cs.meta          |   11 
 Main/Core/NetworkPackage/ServerPack/H02_PlayerTalk/H0212_tagNotifyCode.cs                               |   95 
 Main/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA01_tagMCTotalLoginDayCntInfo.cs.meta            |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA721_tagMCEmojiPackInfo.cs               |   13 
 Main/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA03_tagMCDailyPackBuyGiftInfo.cs.meta            |   11 
 Main/Config/Configs/DailyQuestConfig.cs.meta                                                            |   11 
 Main/Core/NetworkPackage/ServerPack/H0F_Family/C0F09_tagFamilyWarBillboardResult.cs                     |   33 
 Main/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0316_tagPackResetOK.cs                 |   11 
 Main/Core/NetworkPackage/ServerPack/HA4_Family/HA40D_tagGCServerCreatFamilyTimes.cs.meta                |   11 
 Main/System/Equip/EquipFightPower.cs.meta                                                               |   12 
 Main/System/PhantasmPavilion/PhantasmPavilionChatExpressionHandler.cs.meta                              |   11 
 Main/System/FairyEmblem/EmblemHelper.cs                                                                 |   57 
 Main/Config/Configs/DailyLivenessRewardConfig.cs                                                        |  101 
 Main/Core/NetworkPackage/ServerPack/HA8_Item/HA802_tagMCShopItemDayBuyCntInfo.cs                        |   31 
 Main/Core/NetworkPackage/ServerPack/HB1_Role/HB118_tagMCFacePicInfo.cs                                  |   33 
 Main/System/DailyQuest/DailyQuestModel.cs                                                               |  216 
 Main/System/PhantasmPavilion/PhantasmPavilionChatBubbleHandler.cs                                       |   90 
 Main/Core/NetworkPackage/ClientPack/CA6_Family/CA611_tagCMRenameFamily.cs.meta                          |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA350_tagMCTreasureResult.cs                 |   13 
 Main/System/FairyUnion.meta                                                                             |    8 
 Main/System/PhantasmPavilion/PhantasmPavilionModel.cs                                                   |  893 ++++
 Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs                                                    |   32 
 Main/Core/NetworkPackage/ServerPack/H0F_Family/C0F09_tagFamilyWarBillboardResult.cs.meta                |   11 
 Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA721_tagMCEmojiPackInfo.cs                         |   31 
 Main/System/FairyEmblem/FairyEmblemModel.cs                                                             |  348 +
 Main/System/FairyEmblem.meta                                                                            |    8 
 Main/System/Dungeon.meta                                                                                |    8 
 Main/System/PhantasmPavilion/PhantasmPavilionChatBubbleHandler.cs.meta                                  |   11 
 Main/Config/Configs/FamilyEmblemConfig.cs.meta                                                          |   11 
 Main/Core/NetworkPackage/ServerPack/HA3_Function/HA350_tagMCTreasureResult.cs.meta                      |   11 
 Main/Core/NetworkPackage/ClientPack/CA4_Family/CA408_tagCGQueryFamilyAction.cs.meta                     |   11 
 Main/Core/NetworkPackage/ServerPack/H0F_Family/H0F05_tagFamilyChange.cs                                 |   17 
 Main/System/HappyXB.meta                                                                                |    8 
 Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family/DTC0F03_tagRoleFamilyInfo.cs.meta                |   11 
 Main/System/Store/StoreModel.cs.meta                                                                    |   12 
 Main/Config/PartialConfigs/PlayerPropertyConfig.cs.meta                                                 |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA40D_tagGCServerCreatFamilyTimes.cs.meta      |   11 
 Main/Core/NetworkPackage/ServerPack/HB1_Role/HB118_tagMCFacePicInfo.cs.meta                             |   11 
 Main/Core/NetworkPackage/ServerPack/HA3_Function/HA320_tagMCPlayerFBInfoData.cs                         |   41 
 Main/System/Equip/EquipModel.cs.meta                                                                    |   12 
 Main/System/PhantasmPavilion/ChatBubbleHelper.cs                                                        |   20 
 Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0430_tagPlayerInFamilyInfoRefresh.cs           |   13 
 Main/Core/NetworkPackage/ServerPack/H0F_Family/H0F07_tagFamilyRenameResult.cs                           |   21 
 Main/System/Message/SysNotifyMgr.cs                                                                     |    1 
 Main/Config/Configs/ChatBubbleBoxConfig.cs                                                              |  152 
 Main/Utility/Logic.cs                                                                                   |  417 +
 Main/Config/PartialConfigs/DirtyNameConfig.cs.meta                                                      |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA03_tagMCDailyPackBuyGiftInfo.cs       |   14 
 Main/Core/NetworkPackage/ServerPack/HA3_Function/HA351_tagMCTreasureInfo.cs.meta                        |   11 
 Main/Core/NetworkPackage/ServerPack/HB1_Role/HB120_tagMCZhanlingInfo.cs                                 |   43 
 Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA721_tagMCEmojiPackInfo.cs.meta                    |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB120_tagMCZhanlingInfo.cs.meta                  |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB117_tagMCFaceInfo.cs                           |   13 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA315_tagMCDailyActionCnt.cs                 |   13 
 Main/Core/NetworkPackage/ServerPack/HA4_Family/HA401_tagGCViewFamilyRequestInfo.cs                      |   43 
 Main/Core/NetworkPackage/ClientPack/CA3_Item/CA310_tagCMBuyItem.cs.meta                                 |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA333_tagMCDailyActivityInfoList.cs          |   13 
 Main/Config/Configs/DailyQuestConfig.cs                                                                 |   86 
 Main/Core/NetworkPackage/ServerPack/HA3_Function/HA333_tagMCDailyActivityInfoList.cs                    |   25 
 Main/System/PhantasmPavilion/AvatarHelper.cs                                                            |  119 
 Main/System/Dungeon/DungeonModel.cs                                                                     |   71 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA501_tagMCNotifyRequestJoinFamilyInfo.cs.meta |   11 
 Main/Core/NetworkPackage/ClientPack/CA4_Family/CA413_tagCGChangeFamilyEmblem.cs.meta                    |   11 
 Main/System/HappyXB/HappyXBModel.cs.meta                                                                |   12 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta          |   11 
 Main/Core/NetworkPackage/ServerPack/H0F_Family/H0F03_tagRoleFamilyInfo.cs.meta                          |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA01_tagMCTotalLoginDayCntInfo.cs       |   11 
 Main/Core/NetworkPackage/ServerPack/HA4_Family/HA403_tagGCFamilyActionInfo.cs                           |   51 
 Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family/DTC0F07_tagFamilyRenameResult.cs.meta            |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA351_tagMCTreasureInfo.cs                   |   13 
 Main/Config/ConfigManager.cs                                                                            |   23 
 Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family.meta                                             |    8 
 Main/System/PhantasmPavilion.meta                                                                       |    8 
 Main/Config/PartialConfigs/FaceConfig.cs.meta                                                           |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family.meta                                             |    8 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role.meta                                               |    8 
 Main/Core/NetworkPackage/ClientPack/CA3_Item/CA310_tagCMBuyItem.cs                                      |   20 
 Main/Core/NetworkPackage/ServerPack/HA4_Family/HA403_tagGCFamilyActionInfo.cs.meta                      |   11 
 Main/Main.cs                                                                                            |   19 
 Main/System/PhantasmPavilion/AvatarCell.cs                                                              |  255 +
 Main/Core/NetworkPackage/ClientPack/CA4_Family/CA408_tagCGQueryFamilyAction.cs                          |   20 
 Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3BD_tagMCBuyEnterInfo.cs                             |   29 
 Main/Core/NetworkPackage/ClientPack/CA4_Family/CA401_tagCGViewFamilyPage.cs                             |   24 
 Main/Config/Configs/DailyLivenessRewardConfig.cs.meta                                                   |   11 
 Main/System/Dungeon/DungeonData.cs                                                                      |  327 +
 Main/System/DailyQuest/DailyQuestData.cs                                                                |  314 +
 /dev/null                                                                                               |   11 
 Main/Core/NetworkPackage/ServerPack/HA8_Item/HA802_tagMCShopItemDayBuyCntInfo.cs.meta                   |   11 
 Main/System/DailyQuest/DailyQuestData.cs.meta                                                           |   11 
 Main/Core/NetworkPackage/ServerPack/HA3_Function/HA315_tagMCDailyActionCnt.cs.meta                      |   11 
 Main/Core/NetworkPackage/ClientPack/C0F_Family/C0F07_tagCGetFamilyInfo.cs                               |   17 
 Main/System/Store/BuyItemController.cs                                                                  |  214 
 233 files changed, 12,223 insertions(+), 907 deletions(-)

diff --git a/Main/Config/ConfigManager.cs b/Main/Config/ConfigManager.cs
index 28f5a32..cb9c38e 100644
--- a/Main/Config/ConfigManager.cs
+++ b/Main/Config/ConfigManager.cs
@@ -33,14 +33,18 @@
         isLoadFinished = false;
 
         // 鍔犺浇閰嶇疆鏂囦欢
-        int totalConfigs = 57;
+        int totalConfigs = 60;
         Type[] configTypes = new Type[] {
             typeof(AppointItemConfig),
             typeof(AudioConfig),
+            typeof(ChatBubbleBoxConfig),
             typeof(ChestsAwardConfig),
             typeof(ChestsConfig),
             typeof(CTGConfig),
             typeof(CTGSelectItemConfig),
+            typeof(DailyLivenessRewardConfig),
+            typeof(DailyQuestConfig),
+            typeof(DailyQuestOpenTimeConfig),
             typeof(DienstgradConfig),
             typeof(DirtyNameConfig),
             typeof(DirtyWordConfig),
@@ -50,6 +54,7 @@
             typeof(EquipPlaceMapConfig),
             typeof(FaceConfig),
             typeof(FamilyConfig),
+            typeof(FamilyEmblemConfig),
             typeof(FirstGoldConfig),
             typeof(FuncConfigConfig),
             typeof(FuncOpenLVConfig),
@@ -76,8 +81,6 @@
             typeof(OrderInfoConfig),
             typeof(PlayerFaceConfig),
             typeof(PlayerFacePicConfig),
-            typeof(PlayerFacePicStarConfig),
-            typeof(PlayerFaceStarConfig),
             typeof(PlayerLVConfig),
             typeof(PlayerPropertyConfig),
             typeof(priorbundleConfig),
@@ -192,6 +195,8 @@
         ClearConfigDictionary<AppointItemConfig>();
         // 娓呯┖ AudioConfig 瀛楀吀
         ClearConfigDictionary<AudioConfig>();
+        // 娓呯┖ ChatBubbleBoxConfig 瀛楀吀
+        ClearConfigDictionary<ChatBubbleBoxConfig>();
         // 娓呯┖ ChestsAwardConfig 瀛楀吀
         ClearConfigDictionary<ChestsAwardConfig>();
         // 娓呯┖ ChestsConfig 瀛楀吀
@@ -200,6 +205,12 @@
         ClearConfigDictionary<CTGConfig>();
         // 娓呯┖ CTGSelectItemConfig 瀛楀吀
         ClearConfigDictionary<CTGSelectItemConfig>();
+        // 娓呯┖ DailyLivenessRewardConfig 瀛楀吀
+        ClearConfigDictionary<DailyLivenessRewardConfig>();
+        // 娓呯┖ DailyQuestConfig 瀛楀吀
+        ClearConfigDictionary<DailyQuestConfig>();
+        // 娓呯┖ DailyQuestOpenTimeConfig 瀛楀吀
+        ClearConfigDictionary<DailyQuestOpenTimeConfig>();
         // 娓呯┖ DienstgradConfig 瀛楀吀
         ClearConfigDictionary<DienstgradConfig>();
         // 娓呯┖ DirtyNameConfig 瀛楀吀
@@ -218,6 +229,8 @@
         ClearConfigDictionary<FaceConfig>();
         // 娓呯┖ FamilyConfig 瀛楀吀
         ClearConfigDictionary<FamilyConfig>();
+        // 娓呯┖ FamilyEmblemConfig 瀛楀吀
+        ClearConfigDictionary<FamilyEmblemConfig>();
         // 娓呯┖ FirstGoldConfig 瀛楀吀
         ClearConfigDictionary<FirstGoldConfig>();
         // 娓呯┖ FuncConfigConfig 瀛楀吀
@@ -270,10 +283,6 @@
         ClearConfigDictionary<PlayerFaceConfig>();
         // 娓呯┖ PlayerFacePicConfig 瀛楀吀
         ClearConfigDictionary<PlayerFacePicConfig>();
-        // 娓呯┖ PlayerFacePicStarConfig 瀛楀吀
-        ClearConfigDictionary<PlayerFacePicStarConfig>();
-        // 娓呯┖ PlayerFaceStarConfig 瀛楀吀
-        ClearConfigDictionary<PlayerFaceStarConfig>();
         // 娓呯┖ PlayerLVConfig 瀛楀吀
         ClearConfigDictionary<PlayerLVConfig>();
         // 娓呯┖ PlayerPropertyConfig 瀛楀吀
diff --git a/Main/Config/Configs/ChatBubbleBoxConfig.cs b/Main/Config/Configs/ChatBubbleBoxConfig.cs
new file mode 100644
index 0000000..491df6c
--- /dev/null
+++ b/Main/Config/Configs/ChatBubbleBoxConfig.cs
@@ -0,0 +1,152 @@
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           2025骞�6鏈�18鏃�
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class ChatBubbleBoxConfig : ConfigBase<int, ChatBubbleBoxConfig>
+{
+
+    public int ID;
+	public string Name;
+	public int NeedLV;
+	public int SortNum;
+	public int UnlockDefault;
+	public int ExpireMinutes;
+	public int[][] UnlockNeedItemList;
+	public int[] LightAttrType;
+	public int[] LightAttrValue;
+	public int LightFightPower;
+	public string leftBubbleIcon;
+	public string rightBubbleIcon;
+	public int[] leftOffset;
+	public int[] rightOffset;
+	public string Icon;
+	public int Jump;
+	public string GainTip;
+	public int[] color;
+	public int top;
+	public string Descriptive;
+
+    public override int LoadKey(string _key)
+    {
+        int key = GetKey(_key);
+        return key;
+    }
+
+    public override void LoadConfig(string input)
+    {
+        try {
+        string[] tables = input.Split('\t');
+        int.TryParse(tables[0],out ID); 
+
+			Name = tables[1];
+
+			int.TryParse(tables[2],out NeedLV); 
+
+			int.TryParse(tables[3],out SortNum); 
+
+			int.TryParse(tables[4],out UnlockDefault); 
+
+			int.TryParse(tables[5],out ExpireMinutes); 
+
+			UnlockNeedItemList = JsonMapper.ToObject<int[][]>(tables[6].Replace("(", "[").Replace(")", "]")); 
+
+			if (tables[7].Contains("["))
+			{
+				LightAttrType = JsonMapper.ToObject<int[]>(tables[7]);
+			}
+			else
+			{
+				string[] LightAttrTypeStringArray = tables[7].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				LightAttrType = new int[LightAttrTypeStringArray.Length];
+				for (int i=0;i<LightAttrTypeStringArray.Length;i++)
+				{
+					 int.TryParse(LightAttrTypeStringArray[i],out LightAttrType[i]);
+				}
+			}
+
+			if (tables[8].Contains("["))
+			{
+				LightAttrValue = JsonMapper.ToObject<int[]>(tables[8]);
+			}
+			else
+			{
+				string[] LightAttrValueStringArray = tables[8].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				LightAttrValue = new int[LightAttrValueStringArray.Length];
+				for (int i=0;i<LightAttrValueStringArray.Length;i++)
+				{
+					 int.TryParse(LightAttrValueStringArray[i],out LightAttrValue[i]);
+				}
+			}
+
+			int.TryParse(tables[9],out LightFightPower); 
+
+			leftBubbleIcon = tables[10];
+
+			rightBubbleIcon = tables[11];
+
+			if (tables[12].Contains("["))
+			{
+				leftOffset = JsonMapper.ToObject<int[]>(tables[12]);
+			}
+			else
+			{
+				string[] leftOffsetStringArray = tables[12].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				leftOffset = new int[leftOffsetStringArray.Length];
+				for (int i=0;i<leftOffsetStringArray.Length;i++)
+				{
+					 int.TryParse(leftOffsetStringArray[i],out leftOffset[i]);
+				}
+			}
+
+			if (tables[13].Contains("["))
+			{
+				rightOffset = JsonMapper.ToObject<int[]>(tables[13]);
+			}
+			else
+			{
+				string[] rightOffsetStringArray = tables[13].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				rightOffset = new int[rightOffsetStringArray.Length];
+				for (int i=0;i<rightOffsetStringArray.Length;i++)
+				{
+					 int.TryParse(rightOffsetStringArray[i],out rightOffset[i]);
+				}
+			}
+
+			Icon = tables[14];
+
+			int.TryParse(tables[15],out Jump); 
+
+			GainTip = tables[16];
+
+			if (tables[17].Contains("["))
+			{
+				color = JsonMapper.ToObject<int[]>(tables[17]);
+			}
+			else
+			{
+				string[] colorStringArray = tables[17].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				color = new int[colorStringArray.Length];
+				for (int i=0;i<colorStringArray.Length;i++)
+				{
+					 int.TryParse(colorStringArray[i],out color[i]);
+				}
+			}
+
+			int.TryParse(tables[18],out top); 
+
+			Descriptive = tables[19];
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Config/Configs/ChatBubbleBoxConfig.cs.meta b/Main/Config/Configs/ChatBubbleBoxConfig.cs.meta
new file mode 100644
index 0000000..9988d5c
--- /dev/null
+++ b/Main/Config/Configs/ChatBubbleBoxConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 67486172f11dcdc4cac741efdc641413
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/Configs/DailyLivenessRewardConfig.cs b/Main/Config/Configs/DailyLivenessRewardConfig.cs
new file mode 100644
index 0000000..c0b1c08
--- /dev/null
+++ b/Main/Config/Configs/DailyLivenessRewardConfig.cs
@@ -0,0 +1,101 @@
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           2025骞�6鏈�18鏃�
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class DailyLivenessRewardConfig : ConfigBase<int, DailyLivenessRewardConfig>
+{
+
+    public int id;
+	public int Liveness;
+	public int[] StageLV;
+	public int[] ItemID;
+	public int[] ItemCount;
+	public int[] ItemBind;
+	public string Description;
+
+    public override int LoadKey(string _key)
+    {
+        int key = GetKey(_key);
+        return key;
+    }
+
+    public override void LoadConfig(string input)
+    {
+        try {
+        string[] tables = input.Split('\t');
+        int.TryParse(tables[0],out id); 
+
+			int.TryParse(tables[1],out Liveness); 
+
+			if (tables[2].Contains("["))
+			{
+				StageLV = JsonMapper.ToObject<int[]>(tables[2]);
+			}
+			else
+			{
+				string[] StageLVStringArray = tables[2].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				StageLV = new int[StageLVStringArray.Length];
+				for (int i=0;i<StageLVStringArray.Length;i++)
+				{
+					 int.TryParse(StageLVStringArray[i],out StageLV[i]);
+				}
+			}
+
+			if (tables[3].Contains("["))
+			{
+				ItemID = JsonMapper.ToObject<int[]>(tables[3]);
+			}
+			else
+			{
+				string[] ItemIDStringArray = tables[3].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				ItemID = new int[ItemIDStringArray.Length];
+				for (int i=0;i<ItemIDStringArray.Length;i++)
+				{
+					 int.TryParse(ItemIDStringArray[i],out ItemID[i]);
+				}
+			}
+
+			if (tables[4].Contains("["))
+			{
+				ItemCount = JsonMapper.ToObject<int[]>(tables[4]);
+			}
+			else
+			{
+				string[] ItemCountStringArray = tables[4].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				ItemCount = new int[ItemCountStringArray.Length];
+				for (int i=0;i<ItemCountStringArray.Length;i++)
+				{
+					 int.TryParse(ItemCountStringArray[i],out ItemCount[i]);
+				}
+			}
+
+			if (tables[5].Contains("["))
+			{
+				ItemBind = JsonMapper.ToObject<int[]>(tables[5]);
+			}
+			else
+			{
+				string[] ItemBindStringArray = tables[5].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				ItemBind = new int[ItemBindStringArray.Length];
+				for (int i=0;i<ItemBindStringArray.Length;i++)
+				{
+					 int.TryParse(ItemBindStringArray[i],out ItemBind[i]);
+				}
+			}
+
+			Description = tables[6];
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Config/Configs/DailyLivenessRewardConfig.cs.meta b/Main/Config/Configs/DailyLivenessRewardConfig.cs.meta
new file mode 100644
index 0000000..bfe415c
--- /dev/null
+++ b/Main/Config/Configs/DailyLivenessRewardConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 8a0f64a88bd389c47904a1cd0ea06667
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/Configs/DailyQuestConfig.cs b/Main/Config/Configs/DailyQuestConfig.cs
new file mode 100644
index 0000000..b7f3917
--- /dev/null
+++ b/Main/Config/Configs/DailyQuestConfig.cs
@@ -0,0 +1,86 @@
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           2025骞�6鏈�18鏃�
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class DailyQuestConfig : ConfigBase<int, DailyQuestConfig>
+{
+
+    public int ID;
+	public string Title;
+	public int RelatedType;
+	public int RelatedID;
+	public int UnLockFuncID;
+	public int OnceActivityTime;
+	public int OnceActivity;
+	public int TotalActiveValue;
+	public int[] RewardID;
+	public string Icon;
+	public string Description;
+	public string QuestTypeDescribe;
+	public int order;
+	public string AwardImg;
+
+    public override int LoadKey(string _key)
+    {
+        int key = GetKey(_key);
+        return key;
+    }
+
+    public override void LoadConfig(string input)
+    {
+        try {
+        string[] tables = input.Split('\t');
+        int.TryParse(tables[0],out ID); 
+
+			Title = tables[1];
+
+			int.TryParse(tables[2],out RelatedType); 
+
+			int.TryParse(tables[3],out RelatedID); 
+
+			int.TryParse(tables[4],out UnLockFuncID); 
+
+			int.TryParse(tables[5],out OnceActivityTime); 
+
+			int.TryParse(tables[6],out OnceActivity); 
+
+			int.TryParse(tables[7],out TotalActiveValue); 
+
+			if (tables[8].Contains("["))
+			{
+				RewardID = JsonMapper.ToObject<int[]>(tables[8]);
+			}
+			else
+			{
+				string[] RewardIDStringArray = tables[8].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				RewardID = new int[RewardIDStringArray.Length];
+				for (int i=0;i<RewardIDStringArray.Length;i++)
+				{
+					 int.TryParse(RewardIDStringArray[i],out RewardID[i]);
+				}
+			}
+
+			Icon = tables[9];
+
+			Description = tables[10];
+
+			QuestTypeDescribe = tables[11];
+
+			int.TryParse(tables[12],out order); 
+
+			AwardImg = tables[13];
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Config/Configs/DailyQuestConfig.cs.meta b/Main/Config/Configs/DailyQuestConfig.cs.meta
new file mode 100644
index 0000000..4ccedac
--- /dev/null
+++ b/Main/Config/Configs/DailyQuestConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f71474ebc1d8c7c48acd1e49c1152689
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/Configs/DailyQuestOpenTimeConfig.cs b/Main/Config/Configs/DailyQuestOpenTimeConfig.cs
new file mode 100644
index 0000000..9c8539f
--- /dev/null
+++ b/Main/Config/Configs/DailyQuestOpenTimeConfig.cs
@@ -0,0 +1,92 @@
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           2025骞�6鏈�18鏃�
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class DailyQuestOpenTimeConfig : ConfigBase<int, DailyQuestOpenTimeConfig>
+{
+
+    public int ID;
+	public string ActionName;
+	public int OpenServerDay;
+	public string OpenTime;
+	public int Duration;
+	public int DayTimes;
+	public int DayBuyTimes;
+	public int BuyTimesPrivilegeID;
+	public int MoneyType;
+	public int[] BuyNeedMoney;
+	public int DayItemAddTimes;
+	public int DayItemID;
+	public int DayReKind;
+	public int WeekTimes;
+	public int WeekReKind;
+	public int OpenUI;
+
+    public override int LoadKey(string _key)
+    {
+        int key = GetKey(_key);
+        return key;
+    }
+
+    public override void LoadConfig(string input)
+    {
+        try {
+        string[] tables = input.Split('\t');
+        int.TryParse(tables[0],out ID); 
+
+			ActionName = tables[1];
+
+			int.TryParse(tables[2],out OpenServerDay); 
+
+			OpenTime = tables[3];
+
+			int.TryParse(tables[4],out Duration); 
+
+			int.TryParse(tables[5],out DayTimes); 
+
+			int.TryParse(tables[6],out DayBuyTimes); 
+
+			int.TryParse(tables[7],out BuyTimesPrivilegeID); 
+
+			int.TryParse(tables[8],out MoneyType); 
+
+			if (tables[9].Contains("["))
+			{
+				BuyNeedMoney = JsonMapper.ToObject<int[]>(tables[9]);
+			}
+			else
+			{
+				string[] BuyNeedMoneyStringArray = tables[9].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				BuyNeedMoney = new int[BuyNeedMoneyStringArray.Length];
+				for (int i=0;i<BuyNeedMoneyStringArray.Length;i++)
+				{
+					 int.TryParse(BuyNeedMoneyStringArray[i],out BuyNeedMoney[i]);
+				}
+			}
+
+			int.TryParse(tables[10],out DayItemAddTimes); 
+
+			int.TryParse(tables[11],out DayItemID); 
+
+			int.TryParse(tables[12],out DayReKind); 
+
+			int.TryParse(tables[13],out WeekTimes); 
+
+			int.TryParse(tables[14],out WeekReKind); 
+
+			int.TryParse(tables[15],out OpenUI); 
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Config/Configs/DailyQuestOpenTimeConfig.cs.meta b/Main/Config/Configs/DailyQuestOpenTimeConfig.cs.meta
new file mode 100644
index 0000000..7ffb5d8
--- /dev/null
+++ b/Main/Config/Configs/DailyQuestOpenTimeConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 383c61a70812a76479a044197b841eb7
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/Configs/FamilyConfig.cs b/Main/Config/Configs/FamilyConfig.cs
index 4f55b1f..c09d921 100644
--- a/Main/Config/Configs/FamilyConfig.cs
+++ b/Main/Config/Configs/FamilyConfig.cs
@@ -1,56 +1,47 @@
-锘�//--------------------------------------------------------
-//    [Author]:           YYL
-//    [  Date ]:           2025骞�5鏈�22鏃�
-//--------------------------------------------------------
-
-using System.Collections.Generic;
-using System.IO;
-using System.Threading;
-using System;
-using UnityEngine;
-using LitJson;
-
-public partial class FamilyConfig : ConfigBase<int, FamilyConfig>
-{
-
-    public int familyLV;
-	public int memberCnt;
-	public int deputyLeaderCnt;
-	public int eliteCnt;
-	public int needMoney;
-	public int weekMissionMoneyMax;
-	public int bossFBCnt;
-	public int ZhenbaogeWeights;
-
-    public override int LoadKey(string _key)
-    {
-        int key = GetKey(_key);
-        return key;
-    }
-
-    public override void LoadConfig(string input)
-    {
-        try {
-        string[] tables = input.Split('\t');
-        int.TryParse(tables[0],out familyLV); 
-
-			int.TryParse(tables[1],out memberCnt); 
-
-			int.TryParse(tables[2],out deputyLeaderCnt); 
-
-			int.TryParse(tables[3],out eliteCnt); 
-
-			int.TryParse(tables[4],out needMoney); 
-
-			int.TryParse(tables[5],out weekMissionMoneyMax); 
-
-			int.TryParse(tables[6],out bossFBCnt); 
-
-			int.TryParse(tables[7],out ZhenbaogeWeights); 
-        }
-        catch (Exception exception)
-        {
-            Debug.LogError(exception);
-        }
-    }
-}
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           Wednesday, June 18, 2025
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class FamilyConfig : ConfigBase<int, FamilyConfig>
+{
+
+    public int FamilyLV;
+	public int MemberMax;
+	public int DeputyLeaderMax;
+	public int EliteMax;
+	public int NeedExp;
+
+    public override int LoadKey(string _key)
+    {
+        int key = GetKey(_key);
+        return key;
+    }
+
+    public override void LoadConfig(string input)
+    {
+        try {
+        string[] tables = input.Split('\t');
+        int.TryParse(tables[0],out FamilyLV); 
+
+			int.TryParse(tables[1],out MemberMax); 
+
+			int.TryParse(tables[2],out DeputyLeaderMax); 
+
+			int.TryParse(tables[3],out EliteMax); 
+
+			int.TryParse(tables[4],out NeedExp); 
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Config/Configs/FamilyEmblemConfig.cs b/Main/Config/Configs/FamilyEmblemConfig.cs
new file mode 100644
index 0000000..a4a3fdf
--- /dev/null
+++ b/Main/Config/Configs/FamilyEmblemConfig.cs
@@ -0,0 +1,59 @@
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           2025骞�6鏈�18鏃�
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class FamilyEmblemConfig : ConfigBase<int, FamilyEmblemConfig>
+{
+
+    public int EmblemID;
+	public string Name;
+	public int UnlockFamilyLV;
+	public int ExpireMinutes;
+	public int CustomFamilyID;
+	public string Image;
+	public int EffectID;
+	public int SortNum;
+	public string Descriptive;
+
+    public override int LoadKey(string _key)
+    {
+        int key = GetKey(_key);
+        return key;
+    }
+
+    public override void LoadConfig(string input)
+    {
+        try {
+        string[] tables = input.Split('\t');
+        int.TryParse(tables[0],out EmblemID); 
+
+			Name = tables[1];
+
+			int.TryParse(tables[2],out UnlockFamilyLV); 
+
+			int.TryParse(tables[3],out ExpireMinutes); 
+
+			int.TryParse(tables[4],out CustomFamilyID); 
+
+			Image = tables[5];
+
+			int.TryParse(tables[6],out EffectID); 
+
+			int.TryParse(tables[7],out SortNum); 
+
+			Descriptive = tables[8];
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Config/Configs/FamilyEmblemConfig.cs.meta b/Main/Config/Configs/FamilyEmblemConfig.cs.meta
new file mode 100644
index 0000000..f4493ef
--- /dev/null
+++ b/Main/Config/Configs/FamilyEmblemConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 193d83e8986b6f94d920a13012975030
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/Configs/PlayerFacePicStarConfig.cs b/Main/Config/Configs/PlayerFacePicStarConfig.cs
deleted file mode 100644
index c4c58a0..0000000
--- a/Main/Config/Configs/PlayerFacePicStarConfig.cs
+++ /dev/null
@@ -1,74 +0,0 @@
-锘�//--------------------------------------------------------
-//    [Author]:           YYL
-//    [  Date ]:           2025骞�5鏈�22鏃�
-//--------------------------------------------------------
-
-using System.Collections.Generic;
-using System.IO;
-using System.Threading;
-using System;
-using UnityEngine;
-using LitJson;
-
-public partial class PlayerFacePicStarConfig : ConfigBase<int, PlayerFacePicStarConfig>
-{
-
-    public int index;
-	public int FacePicID;
-	public int FacePicStar;
-	public int[][] StarUpNeedItemList;
-	public int[] StarAttrType;
-	public int[] StarAttrValue;
-
-    public override int LoadKey(string _key)
-    {
-        int key = GetKey(_key);
-        return key;
-    }
-
-    public override void LoadConfig(string input)
-    {
-        try {
-        string[] tables = input.Split('\t');
-        int.TryParse(tables[0],out index); 
-
-			int.TryParse(tables[1],out FacePicID); 
-
-			int.TryParse(tables[2],out FacePicStar); 
-
-			StarUpNeedItemList = JsonMapper.ToObject<int[][]>(tables[3].Replace("(", "[").Replace(")", "]")); 
-
-			if (tables[4].Contains("["))
-			{
-				StarAttrType = JsonMapper.ToObject<int[]>(tables[4]);
-			}
-			else
-			{
-				string[] StarAttrTypeStringArray = tables[4].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
-				StarAttrType = new int[StarAttrTypeStringArray.Length];
-				for (int i=0;i<StarAttrTypeStringArray.Length;i++)
-				{
-					 int.TryParse(StarAttrTypeStringArray[i],out StarAttrType[i]);
-				}
-			}
-
-			if (tables[5].Contains("["))
-			{
-				StarAttrValue = JsonMapper.ToObject<int[]>(tables[5]);
-			}
-			else
-			{
-				string[] StarAttrValueStringArray = tables[5].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
-				StarAttrValue = new int[StarAttrValueStringArray.Length];
-				for (int i=0;i<StarAttrValueStringArray.Length;i++)
-				{
-					 int.TryParse(StarAttrValueStringArray[i],out StarAttrValue[i]);
-				}
-			}
-        }
-        catch (Exception exception)
-        {
-            Debug.LogError(exception);
-        }
-    }
-}
diff --git a/Main/Config/Configs/PlayerFacePicStarConfig.cs.meta b/Main/Config/Configs/PlayerFacePicStarConfig.cs.meta
deleted file mode 100644
index 36742e8..0000000
--- a/Main/Config/Configs/PlayerFacePicStarConfig.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 0c54dff18d881a14c8bd594ad7bc889b
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Main/Config/Configs/PlayerFaceStarConfig.cs b/Main/Config/Configs/PlayerFaceStarConfig.cs
deleted file mode 100644
index bb0dc76..0000000
--- a/Main/Config/Configs/PlayerFaceStarConfig.cs
+++ /dev/null
@@ -1,74 +0,0 @@
-锘�//--------------------------------------------------------
-//    [Author]:           YYL
-//    [  Date ]:           2025骞�5鏈�22鏃�
-//--------------------------------------------------------
-
-using System.Collections.Generic;
-using System.IO;
-using System.Threading;
-using System;
-using UnityEngine;
-using LitJson;
-
-public partial class PlayerFaceStarConfig : ConfigBase<int, PlayerFaceStarConfig>
-{
-
-    public int index;
-	public int FaceID;
-	public int FaceStar;
-	public int[][] StarUpNeedItemList;
-	public int[] StarAttrType;
-	public int[] StarAttrValue;
-
-    public override int LoadKey(string _key)
-    {
-        int key = GetKey(_key);
-        return key;
-    }
-
-    public override void LoadConfig(string input)
-    {
-        try {
-        string[] tables = input.Split('\t');
-        int.TryParse(tables[0],out index); 
-
-			int.TryParse(tables[1],out FaceID); 
-
-			int.TryParse(tables[2],out FaceStar); 
-
-			StarUpNeedItemList = JsonMapper.ToObject<int[][]>(tables[3].Replace("(", "[").Replace(")", "]")); 
-
-			if (tables[4].Contains("["))
-			{
-				StarAttrType = JsonMapper.ToObject<int[]>(tables[4]);
-			}
-			else
-			{
-				string[] StarAttrTypeStringArray = tables[4].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
-				StarAttrType = new int[StarAttrTypeStringArray.Length];
-				for (int i=0;i<StarAttrTypeStringArray.Length;i++)
-				{
-					 int.TryParse(StarAttrTypeStringArray[i],out StarAttrType[i]);
-				}
-			}
-
-			if (tables[5].Contains("["))
-			{
-				StarAttrValue = JsonMapper.ToObject<int[]>(tables[5]);
-			}
-			else
-			{
-				string[] StarAttrValueStringArray = tables[5].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
-				StarAttrValue = new int[StarAttrValueStringArray.Length];
-				for (int i=0;i<StarAttrValueStringArray.Length;i++)
-				{
-					 int.TryParse(StarAttrValueStringArray[i],out StarAttrValue[i]);
-				}
-			}
-        }
-        catch (Exception exception)
-        {
-            Debug.LogError(exception);
-        }
-    }
-}
diff --git a/Main/Config/Configs/PlayerFaceStarConfig.cs.meta b/Main/Config/Configs/PlayerFaceStarConfig.cs.meta
deleted file mode 100644
index 0324809..0000000
--- a/Main/Config/Configs/PlayerFaceStarConfig.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 2c1c3498f7ea21a4db39ffc6bf1c48d8
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Main/Config/PartialConfigs/DirtyNameConfig.cs b/Main/Config/PartialConfigs/DirtyNameConfig.cs
new file mode 100644
index 0000000..361927f
--- /dev/null
+++ b/Main/Config/PartialConfigs/DirtyNameConfig.cs
@@ -0,0 +1,199 @@
+using System;
+using System.Collections.Generic;
+using System.Text.RegularExpressions;
+using UnityEngine;
+using System.Threading;
+
+public partial class DirtyNameConfig : ConfigBase<int, DirtyNameConfig>
+{
+
+    private static WordGroup[] DIRTYWORLD = new WordGroup[(int)char.MaxValue];
+
+    private static List<string> memoryList = new List<string>();
+
+    private static bool dirtyNameInited = false;
+
+    static int cursor = 0;
+
+    static int wordlenght = 0;
+
+    static int nextCursor = 0;
+
+    protected override void OnConfigParseCompleted()
+    {
+        if (string.IsNullOrEmpty(word))
+        {
+            Debug.LogErrorFormat("灞忚斀鍚嶅瓧 id = {0} 鐨勫唴瀹逛负绌� 闇�瑕佷慨鏀�", id);
+            return;
+        }
+        string key = ToDBC(word);
+        memoryList.Add(key);
+    }
+
+    private static string ToDBC(string input)
+    {
+        char[] c = input.ToCharArray();
+        for (int i = 0; i < c.Length; i++)
+        {
+            if (c[i] == 12288)
+            {
+                c[i] = (char)32;
+                continue;
+            }
+            if (c[i] > 65280 && c[i] < 65375)
+                c[i] = (char)(c[i] - 65248);
+        }
+        return new string(c).ToLower();
+    }
+
+    public static bool IsDirtName(string source)
+    {
+        if (source != string.Empty)
+        {
+            cursor = 0;
+            nextCursor = 0;
+            for (int i = 0; i < source.Length; i++)
+            {
+                //鏌ヨ浠ヨ瀛椾负棣栧瓧绗︾殑璇嶇粍
+                WordGroup group = DIRTYWORLD[(int)ToDBC(source)[i]];
+                if (group != null)
+                {
+                    for (int z = 0; z < group.Count(); z++)
+                    {
+                        string word = group.GetWord(z);
+                        if (word.Length == 0 || Check(word, source))
+                        {
+                            return true;
+                        }
+                    }
+                }
+                cursor++;
+            }
+        }
+        return false;
+    }
+
+    private static bool Check(string blackWord, string source)
+    {
+        wordlenght = 0;
+        int wordCnt = 0;
+        //妫�娴嬫簮涓嬩竴浣嶆父鏍�
+        nextCursor = cursor + 1;
+        bool found = false;
+        //閬嶅巻璇嶇殑姣忎竴浣嶅仛鍖归厤
+        for (int i = 0; i < blackWord.Length; i++)
+        {
+            //鐗规畩瀛楃鍋忕Щ娓告爣
+            int offset = 0;
+            if (nextCursor >= source.Length)
+            {
+                break;
+            }
+            else
+            {
+                //妫�娴嬩笅浣嶅瓧绗﹀鏋滀笉鏄眽瀛� 鏁板瓧 瀛楃 鍋忕Щ閲忓姞1,,杩囨护鐗规畩瀛楃
+                for (int y = nextCursor; y < source.Length; y++)
+                {
+                    //if (!IsCHS(source[y]) && !IsNum(source[y]) && !IsAlphabet(source[y])) {
+                    if (IsSpecial(source[y]))
+                    {
+                        offset++;
+                        //閬胯鐗规畩瀛楃锛屼笅浣嶆父鏍囧鏋�>=瀛楃涓查暱搴� 璺冲嚭
+                        if (nextCursor + offset >= source.Length) break;
+                        wordlenght++;
+
+                    }
+                    else break;
+                }
+                if (nextCursor + offset >= source.Length)
+                {
+                    break;
+                }
+                if ((int)blackWord[i] == (int)source[nextCursor + offset])
+                {
+                    wordCnt++;
+                    found = true;
+                }
+                else
+                {
+                    found = false;
+                    break;
+                }
+            }
+            nextCursor = nextCursor + 1 + offset;
+            wordlenght++;
+        }
+        if (blackWord.Length != wordCnt) return false;
+        return found;
+    }
+
+    private static bool IsSpecial(char character)
+    {
+        if (character == ' ')
+        {
+            return true;
+        }
+        return false;
+    }
+
+    static public void DirtyNameInit()
+    {
+        if (dirtyNameInited)
+        {
+            return;
+        }
+
+        dirtyNameInited = true;
+
+        ThreadPool.QueueUserWorkItem((object aaa) =>
+        {
+            memoryList.Sort((string x, string y) =>
+            {
+                return x.CompareTo(y);
+            });
+            for (int i = memoryList.Count - 1; i > 0; i--)
+            {
+                if (memoryList[i].ToString() == memoryList[i - 1].ToString())
+                {
+                    memoryList.RemoveAt(i);
+                }
+            }
+            foreach (string word in memoryList)
+            {
+                WordGroup group = DIRTYWORLD[(int)word[0]];
+                if (group == null)
+                {
+                    group = new WordGroup();
+                    DIRTYWORLD[(int)word[0]] = group;
+                }
+                group.Add(word.Substring(1));
+            }
+        });
+    }
+
+    public static bool IsCHS(char character)
+    {
+        //  涓枃琛ㄦ剰瀛楃鐨勮寖鍥� 4E00-9FA5
+        int charVal = (int)character;
+        return (charVal >= 0x4e00 && charVal <= 0x9fa5);
+    }
+
+    private static bool IsNum(char character)
+    {
+        int charVal = (int)character;
+        return (charVal >= 48 && charVal <= 57);
+    }
+
+    private static bool IsAlphabet(char character)
+    {
+        int charVal = (int)character;
+        return ((charVal >= 97 && charVal <= 122) || (charVal >= 65 && charVal <= 90));
+    }
+
+    private const string FACE_REPLACE = @"#~[0-9a-zA-Z]{1,3}";
+    private static Regex FaceRegex = new Regex(FACE_REPLACE, RegexOptions.Singleline);
+    public static string FitterSpecial(string source)
+    {
+        return FaceRegex.Replace(source, "     ");
+    }
+}
diff --git a/Main/Config/PartialConfigs/DirtyNameConfig.cs.meta b/Main/Config/PartialConfigs/DirtyNameConfig.cs.meta
new file mode 100644
index 0000000..6575707
--- /dev/null
+++ b/Main/Config/PartialConfigs/DirtyNameConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 561f81832be9f9f499057d4f05b5f27c
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/PartialConfigs/EquipGSParamConfig.cs b/Main/Config/PartialConfigs/EquipGSParamConfig.cs
new file mode 100644
index 0000000..bd48e95
--- /dev/null
+++ b/Main/Config/PartialConfigs/EquipGSParamConfig.cs
@@ -0,0 +1,81 @@
+锘縰sing System.Collections.Generic;
+
+public partial class EquipGSParamConfig : ConfigBase<int, EquipGSParamConfig>
+{
+    private static Dictionary<string, EquipGSParamConfig> s_tagGSModelDict = new Dictionary<string, EquipGSParamConfig>();//鐢ㄤ簬璁板綍瑁呭璇勫垎鏁版嵁
+    private static Dictionary<PropertyType, int> _tagGsProValueDict = new Dictionary<PropertyType, int>();
+
+    protected override void OnConfigParseCompleted()
+    {
+        string key = StringUtility.Contact(EquipClass, EquipColor, IsSuit, Star);
+        s_tagGSModelDict.Add(key, this);
+    }
+
+    public static EquipGSParamConfig GetGSModel(int lv, int color, int isSuit, int star)
+    {
+        string key = StringUtility.Contact(lv, color, isSuit, star);
+        EquipGSParamConfig gsModel = null;
+        s_tagGSModelDict.TryGetValue(key, out gsModel);
+        return gsModel;
+    }
+
+    public static Dictionary<PropertyType, int> GetTagGsProValueDict(int lv, int color, int isSuit, int star)
+    {
+        _tagGsProValueDict.Clear();
+        EquipGSParamConfig gsModel = GetGSModel(lv, color, isSuit, star);
+        if (gsModel == null)
+            return null;
+
+        _tagGsProValueDict.Add(PropertyType.CritHurtPercent, gsModel.SuperHitPerC);
+        _tagGsProValueDict.Add(PropertyType.HeartHit, gsModel.LuckyHitRateC);
+        _tagGsProValueDict.Add(PropertyType.EveryLvAddAtk, gsModel.PerLVAtkC);
+        _tagGsProValueDict.Add(PropertyType.EveryLvAddHp, gsModel.PerLVMaxHPC);
+        _tagGsProValueDict.Add(PropertyType.AddCoinsPrecent, gsModel.DropMoneyPerC);
+        _tagGsProValueDict.Add(PropertyType.CritResis, gsModel.SuperHitReduceC);
+        _tagGsProValueDict.Add(PropertyType.HIT, gsModel.HitC);
+        _tagGsProValueDict.Add(PropertyType.MISS, gsModel.MissC);
+        _tagGsProValueDict.Add(PropertyType.LuckPer, gsModel.LuckPerC);
+        _tagGsProValueDict.Add(PropertyType.WeaponAtkPer, gsModel.BaseEquipAtkAddPerC);
+        _tagGsProValueDict.Add(PropertyType.ArmorMaxHPPer, gsModel.BaseEquipMaxHPAddPerC);
+        _tagGsProValueDict.Add(PropertyType.HeartResis, gsModel.LuckyHitRateReduceC);
+        _tagGsProValueDict.Add(PropertyType.CritHurt, gsModel.SuperHitC);
+        _tagGsProValueDict.Add(PropertyType.PetAddHurt, gsModel.PetDamPerC);
+        _tagGsProValueDict.Add(PropertyType.ReduceCrit, gsModel.SuperHitRateReduceC);
+
+        _tagGsProValueDict.Add(PropertyType.HpPercent, gsModel.MaxHPPerC);
+        _tagGsProValueDict.Add(PropertyType.AtkPercent, gsModel.AtkPerC);
+        _tagGsProValueDict.Add(PropertyType.SkillHurt, gsModel.SkillAtkRateC);
+        _tagGsProValueDict.Add(PropertyType.ReduceSkillHurtPercent, gsModel.SkillAtkRateReduceC);
+
+        _tagGsProValueDict.Add(PropertyType.SkillAddPerA, gsModel.SkillAddPerAC);
+        _tagGsProValueDict.Add(PropertyType.SkillAddPerB, gsModel.SkillAddPerBC);
+        _tagGsProValueDict.Add(PropertyType.SkillAddPerC, gsModel.SkillAddPerCC);
+        _tagGsProValueDict.Add(PropertyType.SkillAddPerD, gsModel.SkillAddPerDC);
+        _tagGsProValueDict.Add(PropertyType.SkillAddPerE, gsModel.SkillAddPerEC);
+        _tagGsProValueDict.Add(PropertyType.SkillAddPerF, gsModel.SkillAddPerFC);
+        _tagGsProValueDict.Add(PropertyType.SkillAddPerG, gsModel.SkillAddPerGC);
+        _tagGsProValueDict.Add(PropertyType.SkillReducePerA, gsModel.SkillReducePerAC);
+        _tagGsProValueDict.Add(PropertyType.SkillReducePerB, gsModel.SkillReducePerBC);
+        _tagGsProValueDict.Add(PropertyType.SkillReducePerC, gsModel.SkillReducePerCC);
+        _tagGsProValueDict.Add(PropertyType.SkillReducePerD, gsModel.SkillReducePerDC);
+        _tagGsProValueDict.Add(PropertyType.SkillReducePerE, gsModel.SkillReducePerEC);
+        _tagGsProValueDict.Add(PropertyType.SkillReducePerF, gsModel.SkillReducePerFC);
+        _tagGsProValueDict.Add(PropertyType.SkillReducePerG, gsModel.SkillReducePerGC);
+        _tagGsProValueDict.Add(PropertyType.ReduceSkillCDPer, gsModel.ReduceSkillCDPerC);
+        _tagGsProValueDict.Add(PropertyType.AddHeartHurtPer, gsModel.LuckyHitPerC);
+        _tagGsProValueDict.Add(PropertyType.CtrlResis, gsModel.FaintDefRateC);
+        _tagGsProValueDict.Add(PropertyType.CritChance, gsModel.SuperHitRateC);
+
+        _tagGsProValueDict.Add(PropertyType.DefyDef, gsModel.IgnoreDefRateC);
+        _tagGsProValueDict.Add(PropertyType.DefyDefResis, gsModel.IgnoreDefRateReduceC);
+        _tagGsProValueDict.Add(PropertyType.ProDefHPPer, gsModel.ProDefPerC);
+        _tagGsProValueDict.Add(PropertyType.AddFinalHurtPer, gsModel.FinalHurtPerC);
+        _tagGsProValueDict.Add(PropertyType.ReduceFinalHurtPer, gsModel.FinalHurtReducePerC);
+
+
+
+        return _tagGsProValueDict;
+    }
+}
+
+
diff --git a/Main/Config/PartialConfigs/EquipGSParamConfig.cs.meta b/Main/Config/PartialConfigs/EquipGSParamConfig.cs.meta
new file mode 100644
index 0000000..f4478c8
--- /dev/null
+++ b/Main/Config/PartialConfigs/EquipGSParamConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 2dd2a25da7cc3f8468c1237a08cff49f
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/PartialConfigs/EquipPlaceMapConfig.cs b/Main/Config/PartialConfigs/EquipPlaceMapConfig.cs
new file mode 100644
index 0000000..2bbd47e
--- /dev/null
+++ b/Main/Config/PartialConfigs/EquipPlaceMapConfig.cs
@@ -0,0 +1,26 @@
+using System.Collections.Generic;
+using UnityEngine;
+using LitJson;
+
+public partial class EquipPlaceMapConfig : ConfigBase<int, EquipPlaceMapConfig>
+{
+    static Dictionary<int, int> clientPlaceToServerPlace = new Dictionary<int, int>();
+
+    protected override void OnConfigParseCompleted()
+    {
+        clientPlaceToServerPlace[LV * 100 + EquipPlace] = PackIndex;
+    }
+
+    public static int GetServerPlace(int level, int equipPlace)
+    {
+        var key = level * 100 + equipPlace;
+        if (clientPlaceToServerPlace.ContainsKey(key))
+        {
+            return clientPlaceToServerPlace[key];
+        }
+        else
+        {
+            return 0;
+        }
+    }
+}
\ No newline at end of file
diff --git a/Main/Config/PartialConfigs/EquipPlaceMapConfig.cs.meta b/Main/Config/PartialConfigs/EquipPlaceMapConfig.cs.meta
new file mode 100644
index 0000000..76f99a3
--- /dev/null
+++ b/Main/Config/PartialConfigs/EquipPlaceMapConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d1c0c8007bcb91343b4581382b97c181
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/PartialConfigs/FaceConfig.cs b/Main/Config/PartialConfigs/FaceConfig.cs
new file mode 100644
index 0000000..eb839fb
--- /dev/null
+++ b/Main/Config/PartialConfigs/FaceConfig.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Text.RegularExpressions;
+using UnityEngine;
+using System.Threading;
+
+public partial class FaceConfig : ConfigBase<string, FaceConfig>
+{
+    //<琛ㄦ儏鍖匢D,List<Name>>
+    private static Dictionary<int, List<string>> resultDict = new Dictionary<int, List<string>>();
+
+    protected override void OnConfigParseCompleted()
+    {
+        if (frameType == 1)
+        {
+            if (!resultDict.ContainsKey(EmojiPackID))
+            {
+                resultDict[EmojiPackID] = new List<string>();
+            }
+            resultDict[EmojiPackID].Add(name);
+        }
+    }
+
+    public static Dictionary<int, List<string>> GetEmojiPackList()
+    {
+        return resultDict;
+    }
+}
diff --git a/Main/Config/PartialConfigs/FaceConfig.cs.meta b/Main/Config/PartialConfigs/FaceConfig.cs.meta
new file mode 100644
index 0000000..6424954
--- /dev/null
+++ b/Main/Config/PartialConfigs/FaceConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: afdf4592a038af24e9257dc039e0d9a6
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/PartialConfigs/PlayerPropertyConfig.cs b/Main/Config/PartialConfigs/PlayerPropertyConfig.cs
new file mode 100644
index 0000000..4ea1bcb
--- /dev/null
+++ b/Main/Config/PartialConfigs/PlayerPropertyConfig.cs
@@ -0,0 +1,141 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text.RegularExpressions;
+
+public partial class PlayerPropertyConfig : ConfigBase<int, PlayerPropertyConfig>
+{
+    private static Dictionary<int, List<PlayerPropertyConfig>> m_PropCfgs = new Dictionary<int, List<PlayerPropertyConfig>>();
+    private static Dictionary<int, List<int>> outputDict = new Dictionary<int, List<int>>();
+
+    protected override void OnConfigParseCompleted()
+    {
+        List<PlayerPropertyConfig> list = null;
+        m_PropCfgs.TryGetValue(type, out list);
+        if (list != null)
+        {
+            list.Add(this);
+        }
+        else
+        {
+            list = new List<PlayerPropertyConfig>();
+            list.Add(this);
+            m_PropCfgs.Add(type, list);
+        }
+    }
+    public static Dictionary<int, List<int>> GetShowDict()
+    {
+        if (outputDict.IsNullOrEmpty())
+        {
+            var keys = GetKeys();
+            for (int i = 0; i < keys.Count; i++)
+            {
+                int id = keys[i];
+                int showType = Get(id).showType;
+                if (showType == 0)  //涓�0鏃朵笉鏄剧ず
+                    continue;
+                if (!outputDict.ContainsKey(showType))
+                {
+                    outputDict[showType] = new List<int> { id };
+                }
+                else
+                {
+                    outputDict[showType].Add(id);
+                }
+            }
+            var outputList = outputDict.Keys.ToList();
+            for (int i = 0; i < outputList.Count; i++)
+            {
+                int showType = outputList[i];
+                outputDict[showType].Sort(cmp);
+            }
+        }
+        return outputDict;
+    }
+
+    static int cmp(int id1, int id2)
+    {
+        var config1 = Get(id1);
+        var config2 = Get(id2);
+
+        return config1.showSequence.CompareTo(config2.showSequence);
+    }
+
+    public static List<PlayerPropertyConfig> GetPropByType(int type)
+    {
+        List<PlayerPropertyConfig> list = null;
+        m_PropCfgs.TryGetValue(type, out list);
+        return list;
+    }
+
+
+    public static string GetFullDescription(Int2 property)
+    {
+        return GetFullDescription(property.x, property.y);
+    }
+
+    public static string GetFullDescription(int id, long value)
+    {
+        var config = Get(id);
+        if (config == null)
+        {
+            return string.Empty;
+        }
+
+        if (config.Name.Contains("%s"))
+        {
+            if (id == 52)
+            {
+                return Regex.Replace(config.Name, "%s", (value * 0.0001f).ToString("f2"));
+            }
+            else
+            {
+                return Regex.Replace(config.Name, "%s", value.ToString());
+            }
+        }
+        else
+        {
+            return string.Format("{0} +{1}", config.Name, GetValueDescription(id, value));
+        }
+    }
+
+    public static string GetValueDescription(int id, long value)
+    {
+        return GetValueDescription(id, value, false);
+    }
+
+    public static string GetValueDescription(int id, long value, bool largeValue)
+    {
+        var config = Get(id);
+        if (config == null)
+        {
+            return string.Empty;
+        }
+
+        double result = 0f;
+        if (config.ISPercentage == 0)
+        {
+            result = value;
+        }
+        else if (config.ISPercentage == 1)
+        {
+            result = (double)Math.Round(value / 100f, config.decimalCount);
+        }
+        else if (config.ISPercentage == 2)
+        {
+            result = (double)Math.Round(value / 100f, config.decimalCount);
+        }
+
+        var label = string.Empty;
+        if (largeValue)
+        {
+            label = UIHelper.ReplaceLargeNum(result);
+        }
+        else
+        {
+            label = result.ToString();
+        }
+
+        return config.ISPercentage == 1 ? (label + "%") : label;
+    }
+}
diff --git a/Main/Config/PartialConfigs/PlayerPropertyConfig.cs.meta b/Main/Config/PartialConfigs/PlayerPropertyConfig.cs.meta
new file mode 100644
index 0000000..c37bc1d
--- /dev/null
+++ b/Main/Config/PartialConfigs/PlayerPropertyConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 6ec99567b14eb034bb1ffffc2203669b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/GameEngine/Player/PlayerDatas.cs b/Main/Core/GameEngine/Player/PlayerDatas.cs
index 34bb5ac..f20f80e 100644
--- a/Main/Core/GameEngine/Player/PlayerDatas.cs
+++ b/Main/Core/GameEngine/Player/PlayerDatas.cs
@@ -14,7 +14,8 @@
     PlayerExtersionData m_Extersion = new PlayerExtersionData();
     public PlayerExtersionData extersion { get { return m_Extersion; } }
 
-    // public PlayerFairyData fairyData = new PlayerFairyData();
+    //浠欑洘
+    public PlayerFairyData fairyData = new PlayerFairyData();
 
     // PlayerSkillDatas m_Skill = new PlayerSkillDatas();
     // public PlayerSkillDatas skill { get { return m_Skill; } }
@@ -40,11 +41,11 @@
     private Dictionary<PlayerDataType, ulong> PlayerDataDict = new Dictionary<PlayerDataType, ulong>();
 
     public void InitPlayerData(H0102_tagCDBPlayer data)
-    {
-        baseData.UpdateData(data);
-        if (playerDataUpdateEvent != null)
-        {
-            playerDataUpdateEvent();
+    {
+        baseData.UpdateData(data);
+        if (playerDataUpdateEvent != null)
+        {
+            playerDataUpdateEvent();
         }
     }
 
@@ -79,35 +80,35 @@
     }
 
     public void RefreshPlayerData(H0418_tagObjInfoRefresh vNetData)
-    {
-        UpdatePlayerData(vNetData);
-        //StoreModel.RefreshTCBPlayerData(vNetData);
-        if (playerDataUpdateEvent != null)
-        {
-            playerDataUpdateEvent();
+    {
+        UpdatePlayerData(vNetData);
+        //StoreModel.RefreshTCBPlayerData(vNetData);
+        if (playerDataUpdateEvent != null)
+        {
+            playerDataUpdateEvent();
         }
     }
 
 
     private void UpdatePlayerData(H0418_tagObjInfoRefresh vNetData)
-    {
-        if (baseData != null && vNetData.ObjID == baseData.PlayerID)
-        {
-            RefreshProperty((PlayerDataType)vNetData.RefreshType, vNetData.Value, vNetData.ValueEx);
-
-            if (PlayerDataDict.ContainsKey((PlayerDataType)vNetData.RefreshType))
-            {
-                PlayerDataDict[(PlayerDataType)vNetData.RefreshType] = vNetData.Value + vNetData.ValueEx * Constants.ExpPointValue;
-            }
-            else
-            {
-                PlayerDataDict.Add((PlayerDataType)vNetData.RefreshType, vNetData.Value + vNetData.ValueEx * Constants.ExpPointValue);
-            }
-
-            if (playerDataRefreshEvent != null)
-            {
-                playerDataRefreshEvent((PlayerDataType)vNetData.RefreshType);
-            }
+    {
+        if (baseData != null && vNetData.ObjID == baseData.PlayerID)
+        {
+            RefreshProperty((PlayerDataType)vNetData.RefreshType, vNetData.Value, vNetData.ValueEx);
+
+            if (PlayerDataDict.ContainsKey((PlayerDataType)vNetData.RefreshType))
+            {
+                PlayerDataDict[(PlayerDataType)vNetData.RefreshType] = vNetData.Value + vNetData.ValueEx * Constants.ExpPointValue;
+            }
+            else
+            {
+                PlayerDataDict.Add((PlayerDataType)vNetData.RefreshType, vNetData.Value + vNetData.ValueEx * Constants.ExpPointValue);
+            }
+
+            if (playerDataRefreshEvent != null)
+            {
+                playerDataRefreshEvent((PlayerDataType)vNetData.RefreshType);
+            }
         }
     }
 
@@ -239,16 +240,16 @@
                 break;
             case PlayerDataType.Tick:
 #if UNITY_EDITOR
-                Debug.LogFormat("---- 鏀跺埌鏈嶅姟绔疶ick: {0}", value);
-                if (extersion.Tick != 0)
-                {
-                    uint _curWorldTick = GetWorldTick();
-                    uint _diffValue = value > _curWorldTick ? value - _curWorldTick : _curWorldTick - value;
-                    Debug.LogFormat(" |-------- 褰撳墠瀹㈡埛绔疶ick: {0}, 宸紓: {1}", _curWorldTick, _diffValue);
-                    if (_diffValue > 5000)
-                    {
-                        Debug.LogFormat(" |-------- <color=red>鏀跺埌鏈嶅姟绔疻orldTick涓庡綋鍓嶇殑瀹㈡埛绔疶ick宸紓瓒呰繃5绉�</color>");
-                    }
+                Debug.LogFormat("---- 鏀跺埌鏈嶅姟绔疶ick: {0}", value);
+                if (extersion.Tick != 0)
+                {
+                    uint _curWorldTick = GetWorldTick();
+                    uint _diffValue = value > _curWorldTick ? value - _curWorldTick : _curWorldTick - value;
+                    Debug.LogFormat(" |-------- 褰撳墠瀹㈡埛绔疶ick: {0}, 宸紓: {1}", _curWorldTick, _diffValue);
+                    if (_diffValue > 5000)
+                    {
+                        Debug.LogFormat(" |-------- <color=red>鏀跺埌鏈嶅姟绔疻orldTick涓庡綋鍓嶇殑瀹㈡埛绔疶ick宸紓瓒呰繃5绉�</color>");
+                    }
                 }
 #endif
                 extersion.Tick = value;
@@ -637,8 +638,8 @@
     }
 
     public void RequestWorldTick()
-    {
-        CA102_tagCMWorldTick _proto = new CA102_tagCMWorldTick();
+    {
+        CA102_tagCMWorldTick _proto = new CA102_tagCMWorldTick();
         GameNetSystem.Instance.SendInfo(_proto);
     }
 
diff --git a/Main/Core/NetworkPackage/ClientPack/C0F_Family.meta b/Main/Core/NetworkPackage/ClientPack/C0F_Family.meta
new file mode 100644
index 0000000..0a3d6aa
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/C0F_Family.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b925e834e02741a4295b3de53fe23835
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ClientPack/C0F_Family/C0F07_tagCGetFamilyInfo.cs b/Main/Core/NetworkPackage/ClientPack/C0F_Family/C0F07_tagCGetFamilyInfo.cs
new file mode 100644
index 0000000..4bf3b40
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/C0F_Family/C0F07_tagCGetFamilyInfo.cs
@@ -0,0 +1,17 @@
+using UnityEngine;
+using System.Collections;
+
+//0F 07 璇锋眰瀹舵棌鎴愬憳鍒楄〃#tagCGetFamilyInfo
+
+public class C0F07_tagCGetFamilyInfo : GameNetPackBasic {
+    public byte Type;
+
+    public C0F07_tagCGetFamilyInfo () {
+        _cmd = (ushort)0x0F07;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (Type, NetDataType.BYTE);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ClientPack/C0F_Family/C0F07_tagCGetFamilyInfo.cs.meta b/Main/Core/NetworkPackage/ClientPack/C0F_Family/C0F07_tagCGetFamilyInfo.cs.meta
new file mode 100644
index 0000000..fefc1b4
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/C0F_Family/C0F07_tagCGetFamilyInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 519299938c0f4354ca90af1c7fa6584d
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ClientPack/C0F_Family/C0F09_tagCDeleteFamilyMember.cs b/Main/Core/NetworkPackage/ClientPack/C0F_Family/C0F09_tagCDeleteFamilyMember.cs
new file mode 100644
index 0000000..b5effd7
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/C0F_Family/C0F09_tagCDeleteFamilyMember.cs
@@ -0,0 +1,17 @@
+using UnityEngine;
+using System.Collections;
+
+//0F 09 鍒犻櫎瀹舵棌鎴愬憳#tagCDeleteFamilyMember
+
+public class C0F09_tagCDeleteFamilyMember : GameNetPackBasic {
+    public uint MemberID;
+
+    public C0F09_tagCDeleteFamilyMember () {
+        _cmd = (ushort)0x0F09;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (MemberID, NetDataType.DWORD);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ClientPack/C0F_Family/C0F09_tagCDeleteFamilyMember.cs.meta b/Main/Core/NetworkPackage/ClientPack/C0F_Family/C0F09_tagCDeleteFamilyMember.cs.meta
new file mode 100644
index 0000000..4a30dfe
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/C0F_Family/C0F09_tagCDeleteFamilyMember.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 9dd10e31f4bed53489fbc74351a3aeac
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ClientPack/CA2_Interaction/CA230_tagCMSetChatBubbleBox.cs b/Main/Core/NetworkPackage/ClientPack/CA2_Interaction/CA230_tagCMSetChatBubbleBox.cs
index 1f13e87..099b347 100644
--- a/Main/Core/NetworkPackage/ClientPack/CA2_Interaction/CA230_tagCMSetChatBubbleBox.cs
+++ b/Main/Core/NetworkPackage/ClientPack/CA2_Interaction/CA230_tagCMSetChatBubbleBox.cs
@@ -1,18 +1,18 @@
 using UnityEngine;
 using System.Collections;
 
-// A2 30 设置聊天气泡框 #tagCMSetChatBubbleBox

-

-public class CA230_tagCMSetChatBubbleBox : GameNetPackBasic {

-    public byte BubbleBoxType;    //气泡框类型

-

-    public CA230_tagCMSetChatBubbleBox () {

-        combineCmd = (ushort)0x03FE;

-        _cmd = (ushort)0xA230;

-    }

-

-    public override void WriteToBytes () {

-        WriteBytes (BubbleBoxType, NetDataType.BYTE);

-    }

-

-}

+// A2 30 璁剧疆鑱婂ぉ姘旀场妗� #tagCMSetChatBubbleBox
+
+public class CA230_tagCMSetChatBubbleBox : GameNetPackBasic {
+    public byte BubbleBoxType;    //姘旀场妗嗙被鍨�
+
+    public CA230_tagCMSetChatBubbleBox () {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xA230;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (BubbleBoxType, NetDataType.BYTE);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ClientPack/CA2_Interaction/CA236_tagCMChatBubbleBoxStarUP.cs b/Main/Core/NetworkPackage/ClientPack/CA2_Interaction/CA236_tagCMChatBubbleBoxStarUP.cs
deleted file mode 100644
index b586767..0000000
--- a/Main/Core/NetworkPackage/ClientPack/CA2_Interaction/CA236_tagCMChatBubbleBoxStarUP.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using UnityEngine;
-using System.Collections;
-
-// A2 36 鑱婂ぉ姘旀场妗嗗崌鏄� #tagCMChatBubbleBoxStarUP
-
-public class CA236_tagCMChatBubbleBoxStarUP : GameNetPackBasic {
-    public byte BoxID;    //姘旀场ID
-
-    public CA236_tagCMChatBubbleBoxStarUP () {
-        combineCmd = (ushort)0x03FE;
-        _cmd = (ushort)0xA236;
-    }
-
-    public override void WriteToBytes () {
-        WriteBytes (BoxID, NetDataType.BYTE);
-    }
-
-}
diff --git a/Main/Core/NetworkPackage/ClientPack/CA2_Interaction/CA236_tagCMChatBubbleBoxStarUP.cs.meta b/Main/Core/NetworkPackage/ClientPack/CA2_Interaction/CA236_tagCMChatBubbleBoxStarUP.cs.meta
deleted file mode 100644
index beac235..0000000
--- a/Main/Core/NetworkPackage/ClientPack/CA2_Interaction/CA236_tagCMChatBubbleBoxStarUP.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: cfc606a6bfea0af4bbd3563512f33410
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ClientPack/CA3_Item/CA310_tagCMBuyItem.cs b/Main/Core/NetworkPackage/ClientPack/CA3_Item/CA310_tagCMBuyItem.cs
new file mode 100644
index 0000000..0590a8e
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CA3_Item/CA310_tagCMBuyItem.cs
@@ -0,0 +1,20 @@
+using UnityEngine;
+using System.Collections;
+
+// A3 10 璐拱鍟嗗煄鐗╁搧 #tagCMBuyItem
+
+public class CA310_tagCMBuyItem : GameNetPackBasic {
+    public ushort BuyItemIndex;    //璐拱鐨勭墿鍝佺储寮�
+    public uint BuyCount;    //璐拱鏁伴噺
+
+    public CA310_tagCMBuyItem () {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xA310;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (BuyItemIndex, NetDataType.WORD);
+        WriteBytes (BuyCount, NetDataType.DWORD);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ClientPack/CA3_Item/CA310_tagCMBuyItem.cs.meta b/Main/Core/NetworkPackage/ClientPack/CA3_Item/CA310_tagCMBuyItem.cs.meta
new file mode 100644
index 0000000..8e8cbf7
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CA3_Item/CA310_tagCMBuyItem.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 164792ae07cbd5445aeb4d834ed6f3a2
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ClientPack/CA3_Item/CA323_tagCMUseItems.cs b/Main/Core/NetworkPackage/ClientPack/CA3_Item/CA323_tagCMUseItems.cs
new file mode 100644
index 0000000..b39aa7e
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CA3_Item/CA323_tagCMUseItems.cs
@@ -0,0 +1,34 @@
+using UnityEngine;
+using System.Collections;
+
+// A3 23 浣跨敤鐗╁搧 #tagCMUseItems
+
+public class CA323_tagCMUseItems : GameNetPackBasic {
+    public byte ItemIndex;    //鐗╁搧鍦ㄨ儗鍖呬腑绱㈠紩
+    public ushort UseCnt;    //浣跨敤涓暟锛�0琛ㄧず鍏ㄩ儴浣跨敤
+    public uint ExData;    //浣跨敤鎵╁睍鍊�, 榛樿0, 閫夋嫨鐗╁搧瀹濈鏃跺彂閫侀�夋嫨鐨勭墿鍝両D
+    public byte SelectCount;    //鎸囧畾閫夋嫨椤癸紝褰撴壒閲忎娇鐢ㄥ崟涓瀛愰渶瑕佸悓鏃堕�変腑澶氱閫夐」鏃朵娇鐢ㄨ鍊�
+    public  tagCMUseItemsSelect[] SelectList;
+
+    public CA323_tagCMUseItems () {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xA323;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (ItemIndex, NetDataType.BYTE);
+        WriteBytes (UseCnt, NetDataType.WORD);
+        WriteBytes (ExData, NetDataType.DWORD);
+        WriteBytes (SelectCount, NetDataType.BYTE);
+        for (int i = 0; i < SelectCount; i ++) {
+            WriteBytes (SelectList[i].SelectID, NetDataType.DWORD);
+            WriteBytes (SelectList[i].SelectCnt, NetDataType.WORD);
+        }
+    }
+
+    public struct tagCMUseItemsSelect {
+        public uint SelectID;        //閫夋嫨椤笽D
+        public ushort SelectCnt;        //閫夋嫨鏁�
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ClientPack/CA3_Item/CA323_tagCMUseItems.cs.meta b/Main/Core/NetworkPackage/ClientPack/CA3_Item/CA323_tagCMUseItems.cs.meta
new file mode 100644
index 0000000..cfb05c5
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CA3_Item/CA323_tagCMUseItems.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f7cabbfd76e753a42a624faac38591f4
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ClientPack/CA4_Family.meta b/Main/Core/NetworkPackage/ClientPack/CA4_Family.meta
new file mode 100644
index 0000000..3db4eba
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CA4_Family.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 2b21c54aeec142641aa836a23fc11a01
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ClientPack/CA4_Family/CA401_tagCGViewFamilyPage.cs b/Main/Core/NetworkPackage/ClientPack/CA4_Family/CA401_tagCGViewFamilyPage.cs
new file mode 100644
index 0000000..7bd6294
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CA4_Family/CA401_tagCGViewFamilyPage.cs
@@ -0,0 +1,24 @@
+using UnityEngine;
+using System.Collections;
+
+//A4 01  鏌ョ湅瀹舵棌绗琋椤�#tagCGViewFamilyPage
+
+public class CA401_tagCGViewFamilyPage : GameNetPackBasic {
+    public ushort PageIndex;    //鏌ヨ椤垫暟
+    public byte ShowCount;    //姣忛〉鏄剧ず鏁伴噺
+    public byte SortRulex;    //鎺掑簭瑙勫垯
+    public byte ViewType;    //鏌ョ湅绫诲瀷
+
+    public CA401_tagCGViewFamilyPage () {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xA401;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (PageIndex, NetDataType.WORD);
+        WriteBytes (ShowCount, NetDataType.BYTE);
+        WriteBytes (SortRulex, NetDataType.BYTE);
+        WriteBytes (ViewType, NetDataType.BYTE);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ClientPack/CA4_Family/CA401_tagCGViewFamilyPage.cs.meta b/Main/Core/NetworkPackage/ClientPack/CA4_Family/CA401_tagCGViewFamilyPage.cs.meta
new file mode 100644
index 0000000..1f8dab5
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CA4_Family/CA401_tagCGViewFamilyPage.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 7ed0be7b6caa4414e9e6013625eadca3
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ClientPack/CA4_Family/CA408_tagCGQueryFamilyAction.cs b/Main/Core/NetworkPackage/ClientPack/CA4_Family/CA408_tagCGQueryFamilyAction.cs
new file mode 100644
index 0000000..f97e4a5
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CA4_Family/CA408_tagCGQueryFamilyAction.cs
@@ -0,0 +1,20 @@
+using UnityEngine;
+using System.Collections;
+
+// A4 08 鏌ヨ瀹舵棌琛屼负淇℃伅 #tagCGQueryFamilyAction
+
+public class CA408_tagCGQueryFamilyAction : GameNetPackBasic {
+    public byte ActionType;    // 琛屼负绫诲瀷
+    public uint FamilyID;    // 瀹舵棌ID
+
+    public CA408_tagCGQueryFamilyAction () {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xA408;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (ActionType, NetDataType.BYTE);
+        WriteBytes (FamilyID, NetDataType.DWORD);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ClientPack/CA4_Family/CA408_tagCGQueryFamilyAction.cs.meta b/Main/Core/NetworkPackage/ClientPack/CA4_Family/CA408_tagCGQueryFamilyAction.cs.meta
new file mode 100644
index 0000000..de2bef8
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CA4_Family/CA408_tagCGQueryFamilyAction.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 7de8804e1b0e993469f4b97a1edee59c
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ClientPack/CA4_Family/CA413_tagCGChangeFamilyEmblem.cs b/Main/Core/NetworkPackage/ClientPack/CA4_Family/CA413_tagCGChangeFamilyEmblem.cs
new file mode 100644
index 0000000..d02e0f5
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CA4_Family/CA413_tagCGChangeFamilyEmblem.cs
@@ -0,0 +1,18 @@
+using UnityEngine;
+using System.Collections;
+
+// A4 13 淇敼瀹舵棌寰界珷 #tagCGChangeFamilyEmblem
+
+public class CA413_tagCGChangeFamilyEmblem : GameNetPackBasic {
+    public byte EmblemID;    // 鏇存崲鐨勫窘绔營D
+
+    public CA413_tagCGChangeFamilyEmblem () {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xA413;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (EmblemID, NetDataType.BYTE);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ClientPack/CA4_Family/CA413_tagCGChangeFamilyEmblem.cs.meta b/Main/Core/NetworkPackage/ClientPack/CA4_Family/CA413_tagCGChangeFamilyEmblem.cs.meta
new file mode 100644
index 0000000..acf902c
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CA4_Family/CA413_tagCGChangeFamilyEmblem.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 44870dc02eafc9743bd91242794fa52d
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ClientPack/CA5_Function/CA568_tagCMRequestTreasure.cs b/Main/Core/NetworkPackage/ClientPack/CA5_Function/CA568_tagCMRequestTreasure.cs
new file mode 100644
index 0000000..6eb3c88
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CA5_Function/CA568_tagCMRequestTreasure.cs
@@ -0,0 +1,22 @@
+using UnityEngine;
+using System.Collections;
+
+// A5 68 璇锋眰瀵诲疂 #tagCMRequestTreasure
+
+public class CA568_tagCMRequestTreasure : GameNetPackBasic {
+    public byte TreasureType;    //瀵诲疂绫诲瀷
+    public byte TreasureIndex;    //瀵诲疂绱㈠紩
+    public byte CostType;    //娑堣�楃被鍨嬶細0-榛樿浠欑帀锛�1-鍏嶈垂娆℃暟锛�2-瀵诲疂閬撳叿
+
+    public CA568_tagCMRequestTreasure () {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xA568;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (TreasureType, NetDataType.BYTE);
+        WriteBytes (TreasureIndex, NetDataType.BYTE);
+        WriteBytes (CostType, NetDataType.BYTE);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ClientPack/CA5_Function/CA568_tagCMRequestTreasure.cs.meta b/Main/Core/NetworkPackage/ClientPack/CA5_Function/CA568_tagCMRequestTreasure.cs.meta
new file mode 100644
index 0000000..7695880
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CA5_Function/CA568_tagCMRequestTreasure.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 4c03c34aa3e88af4fb69a93dfa85b061
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ClientPack/CA6_Family.meta b/Main/Core/NetworkPackage/ClientPack/CA6_Family.meta
new file mode 100644
index 0000000..8fa8f59
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CA6_Family.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: c0c49911c55b96046b71ac45b72f13a2
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ClientPack/CA6_Family/CA602_tagCMRequesJoinFamily.cs b/Main/Core/NetworkPackage/ClientPack/CA6_Family/CA602_tagCMRequesJoinFamily.cs
new file mode 100644
index 0000000..9efa288
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CA6_Family/CA602_tagCMRequesJoinFamily.cs
@@ -0,0 +1,20 @@
+using UnityEngine;
+using System.Collections;
+
+// A6 02 鐢宠鍔犲叆瀹舵棌#tagCMRequesJoinFamily
+
+public class CA602_tagCMRequesJoinFamily : GameNetPackBasic {
+    public byte Type;    //鐢宠绫诲瀷锛�0-鐢宠锛�1-鎾ら攢
+    public uint TagFamilyID;    //鐩爣瀹舵棌ID锛岀敵璇锋椂涓�0浠h〃涓�閿敵璇峰鏃忎换鎰忓鏃�
+
+    public CA602_tagCMRequesJoinFamily () {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xA602;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (Type, NetDataType.BYTE);
+        WriteBytes (TagFamilyID, NetDataType.DWORD);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ClientPack/CA6_Family/CA602_tagCMRequesJoinFamily.cs.meta b/Main/Core/NetworkPackage/ClientPack/CA6_Family/CA602_tagCMRequesJoinFamily.cs.meta
new file mode 100644
index 0000000..ace0c33
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CA6_Family/CA602_tagCMRequesJoinFamily.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: b823d5814c32e6e4a85e26eeec0faa7d
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ClientPack/CA6_Family/CA611_tagCMRenameFamily.cs b/Main/Core/NetworkPackage/ClientPack/CA6_Family/CA611_tagCMRenameFamily.cs
new file mode 100644
index 0000000..8b5b1eb
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CA6_Family/CA611_tagCMRenameFamily.cs
@@ -0,0 +1,22 @@
+using UnityEngine;
+using System.Collections;
+
+// A6 11 瀹舵棌鏀瑰悕 #tagCMRenameFamily
+
+public class CA611_tagCMRenameFamily : GameNetPackBasic {
+    public byte NewNameLen;
+    public string NewName;
+    public byte ItemIndex;    //鏀瑰悕鐗╁搧鍦ㄨ儗鍖呬腑鐨勪綅缃�
+
+    public CA611_tagCMRenameFamily () {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xA611;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (NewNameLen, NetDataType.BYTE);
+        WriteBytes (NewName, NetDataType.Chars, NewNameLen);
+        WriteBytes (ItemIndex, NetDataType.BYTE);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ClientPack/CA6_Family/CA611_tagCMRenameFamily.cs.meta b/Main/Core/NetworkPackage/ClientPack/CA6_Family/CA611_tagCMRenameFamily.cs.meta
new file mode 100644
index 0000000..c199a13
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CA6_Family/CA611_tagCMRenameFamily.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 4f522c9e27318154db996888f280f91b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB226_tagCMFaceChange.cs b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB226_tagCMFaceChange.cs
new file mode 100644
index 0000000..6c75905
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB226_tagCMFaceChange.cs
@@ -0,0 +1,18 @@
+using UnityEngine;
+using System.Collections;
+
+// B2 26 澶村儚骞诲寲 #tagCMFaceChange
+
+public class CB226_tagCMFaceChange : GameNetPackBasic {
+    public uint FaceID;    // 骞诲寲鐨処D
+
+    public CB226_tagCMFaceChange () {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xB226;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (FaceID, NetDataType.DWORD);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB226_tagCMFaceChange.cs.meta b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB226_tagCMFaceChange.cs.meta
new file mode 100644
index 0000000..c9602e9
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB226_tagCMFaceChange.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 042dc115cedb16645883ab6af37fea1c
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB228_tagCMFacePicChange.cs b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB228_tagCMFacePicChange.cs
new file mode 100644
index 0000000..ad7e9c7
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB228_tagCMFacePicChange.cs
@@ -0,0 +1,18 @@
+using UnityEngine;
+using System.Collections;
+
+// B2 28 澶村儚妗嗗够鍖� #tagCMFacePicChange
+
+public class CB228_tagCMFacePicChange : GameNetPackBasic {
+    public uint FacePicID;    // 骞诲寲鐨処D
+
+    public CB228_tagCMFacePicChange () {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xB228;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (FacePicID, NetDataType.DWORD);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB228_tagCMFacePicChange.cs.meta b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB228_tagCMFacePicChange.cs.meta
new file mode 100644
index 0000000..61e1780
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB228_tagCMFacePicChange.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 13ff6fad4eb84dd4ea3e3a09e8d8f474
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/H02_PlayerTalk/DTC0212_tagNotifyCode.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/H02_PlayerTalk/DTC0212_tagNotifyCode.cs
index 72e08ed..3e8e37f 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/H02_PlayerTalk/DTC0212_tagNotifyCode.cs
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/H02_PlayerTalk/DTC0212_tagNotifyCode.cs
@@ -1,28 +1,13 @@
-using UnityEngine;
-using System.Collections;
-
-//02 12 锟斤拷锟斤拷锟斤拷示#tagNotifyCode
-
-
-
-public class DTC0212_tagNotifyCode : DtcBasic
-{
-
-    public override void Done(GameNetPackBasic vNetPack)
-    {
-
-        base.Done(vNetPack);
-
-        H0212_tagNotifyCode vNetData = vNetPack as H0212_tagNotifyCode;
-
-        //锟介奖时锟斤拷锟斤拷 锟斤拷没锟斤拷锟斤拷锟较�
-        if (vNetData.Msg == "GetMoney" && ItemLogicUtility.Instance.hidePickItem)
-            return;
-
-        //SysNotifyMgr.Instance.ReceiveNotifyCode(vNetData);
-        Debug.Log(vNetData.Msg);
-
-    }
-
-}
-
+using UnityEngine;
+using System.Collections;
+
+//02 12 浠g爜鎻愮ず#tagNotifyCode
+
+public class DTC0212_tagNotifyCode : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+        base.Done(vNetPack);
+        H0212_tagNotifyCode vNetData = vNetPack as H0212_tagNotifyCode;
+        SysNotifyMgr.Instance.ReceiveNotifyCode(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0316_tagPackResetOK.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0316_tagPackResetOK.cs
index 15cc47c..c62e1d2 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0316_tagPackResetOK.cs
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0316_tagPackResetOK.cs
@@ -1,18 +1,13 @@
 using UnityEngine;
 using System.Collections;
-//03 16 锟斤拷锟斤拷锟斤拷锟斤拷锟缴癸拷#tagPackResetOK
 
-
+//03 16 鑳屽寘閲嶆暣鎴愬姛#tagPackResetOK
 
 public class DTC0316_tagPackResetOK : DtcBasic {
-
-    public override void Done(GameNetPackBasic vNetPack) {
-
+    public override void Done(GameNetPackBasic vNetPack)
+    {
         base.Done(vNetPack);
-
         H0316_tagPackResetOK vNetData = vNetPack as H0316_tagPackResetOK;
         PackManager.Instance.PackResetOk(vNetData);
     }
-
 }
-
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0430_tagPlayerInFamilyInfoRefresh.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0430_tagPlayerInFamilyInfoRefresh.cs
new file mode 100644
index 0000000..40a9e46
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0430_tagPlayerInFamilyInfoRefresh.cs
@@ -0,0 +1,13 @@
+using UnityEngine;
+using System.Collections;
+
+//04 30 鐜╁瀹舵棌鍚嶅瓧鑱屼綅绛変俊鎭埛鏂�#tagPlayerInFamilyInfoRefresh
+
+public class DTC0430_tagPlayerInFamilyInfoRefresh : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+        base.Done(vNetPack);
+        H0430_tagPlayerInFamilyInfoRefresh vNetData = vNetPack as H0430_tagPlayerInFamilyInfoRefresh;
+        PlayerDatas.Instance.fairyData.OnRefreshFairy(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0430_tagPlayerInFamilyInfoRefresh.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0430_tagPlayerInFamilyInfoRefresh.cs.meta
new file mode 100644
index 0000000..da315f2
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0430_tagPlayerInFamilyInfoRefresh.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: cea43bcc43e708f438eec5f38119a63e
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family.meta
new file mode 100644
index 0000000..f2024e4
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: fe3590e36bf456543b5a24ea6bea71f0
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family/DTC0F03_tagRoleFamilyInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family/DTC0F03_tagRoleFamilyInfo.cs
new file mode 100644
index 0000000..a95b812
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family/DTC0F03_tagRoleFamilyInfo.cs
@@ -0,0 +1,13 @@
+using UnityEngine;
+using System.Collections;
+
+//0F 03 瀹舵棌鍩烘湰淇℃伅#tagRoleFamilyInfo
+
+public class DTC0F03_tagRoleFamilyInfo : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+        base.Done(vNetPack);
+        H0F03_tagRoleFamilyInfo vNetData = vNetPack as H0F03_tagRoleFamilyInfo;
+        PlayerDatas.Instance.fairyData.OnRefreshFairy(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family/DTC0F03_tagRoleFamilyInfo.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family/DTC0F03_tagRoleFamilyInfo.cs.meta
new file mode 100644
index 0000000..c979d23
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family/DTC0F03_tagRoleFamilyInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ec87f6995d8549f48afeba58664313f2
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family/DTC0F05_tagFamilyChange.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family/DTC0F05_tagFamilyChange.cs
new file mode 100644
index 0000000..8c8ae7f
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family/DTC0F05_tagFamilyChange.cs
@@ -0,0 +1,13 @@
+using UnityEngine;
+using System.Collections;
+
+//0F 05 瀹舵棌鍙樻洿#tagFamilyChange
+
+public class DTC0F05_tagFamilyChange : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+        base.Done(vNetPack);
+        H0F05_tagFamilyChange vNetData = vNetPack as H0F05_tagFamilyChange;
+        PlayerDatas.Instance.fairyData.OnRefreshFairy(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family/DTC0F05_tagFamilyChange.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family/DTC0F05_tagFamilyChange.cs.meta
new file mode 100644
index 0000000..8335004
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family/DTC0F05_tagFamilyChange.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 3d4f5226983a2974a81c3682c0340f41
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family/DTC0F07_tagFamilyRenameResult.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family/DTC0F07_tagFamilyRenameResult.cs
new file mode 100644
index 0000000..bba21d0
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family/DTC0F07_tagFamilyRenameResult.cs
@@ -0,0 +1,13 @@
+using UnityEngine;
+using System.Collections;
+
+//0F 07 瀹舵棌鍚嶇О鏀瑰悕缁撴灉#tagFamilyRenameResult
+
+public class DTC0F07_tagFamilyRenameResult : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+        base.Done(vNetPack);
+        H0F07_tagFamilyRenameResult vNetData = vNetPack as H0F07_tagFamilyRenameResult;
+        FairyModel.Instance.UpdateFairyChangeName(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family/DTC0F07_tagFamilyRenameResult.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family/DTC0F07_tagFamilyRenameResult.cs.meta
new file mode 100644
index 0000000..f18f325
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/H0F_Family/DTC0F07_tagFamilyRenameResult.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 3b439ca743a409a44b82dcaeafadd547
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA2_Package/DTCA204_tagMCVPackRefresh.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA2_Package/DTCA204_tagMCVPackRefresh.cs
index a2fc02a..fbbcb0c 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA2_Package/DTCA204_tagMCVPackRefresh.cs
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA2_Package/DTCA204_tagMCVPackRefresh.cs
@@ -1,16 +1,13 @@
 using UnityEngine;
 using System.Collections;
 
-// A2 04 锟斤拷锟解背锟斤拷锟斤拷品刷锟斤拷 #tagMCVPackRefresh
+// A2 04 铏氭嫙鑳屽寘鐗╁搧鍒锋柊 #tagMCVPackRefresh
 
-public class DTCA204_tagMCVPackRefresh : DtcBasic
-{
+public class DTCA204_tagMCVPackRefresh : DtcBasic {
     public override void Done(GameNetPackBasic vNetPack)
     {
         base.Done(vNetPack);
         HA204_tagMCVPackRefresh vNetData = vNetPack as HA204_tagMCVPackRefresh;
         VirtualPackManager.Instance.OnReceiveServerPack(vNetData);
     }
-
 }
-
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA2_Package/DTCA205_tagMCVPackClear.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA2_Package/DTCA205_tagMCVPackClear.cs
index 924b3c1..f768e3b 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA2_Package/DTCA205_tagMCVPackClear.cs
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA2_Package/DTCA205_tagMCVPackClear.cs
@@ -1,18 +1,12 @@
 using UnityEngine;
 using System.Collections;
 
-// A2 05 锟斤拷锟解背锟斤拷锟斤拷品锟斤拷锟� #tagMCVPackClear
+// A2 05 铏氭嫙鑳屽寘鐗╁搧娓呯┖ #tagMCVPackClear
 
-
-
-public class DTCA205_tagMCVPackClear : DtcBasic
-{
-    public override void Done(GameNetPackBasic vNetPack)
-    {
+public class DTCA205_tagMCVPackClear : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack) {
         base.Done(vNetPack);
         HA205_tagMCVPackClear vNetData = vNetPack as HA205_tagMCVPackClear;
         VirtualPackManager.Instance.OnReceiveServerPack(vNetData);
     }
-
 }
-
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA302_tagMCFuncOpenStateList.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA302_tagMCFuncOpenStateList.cs
new file mode 100644
index 0000000..8b60d86
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA302_tagMCFuncOpenStateList.cs
@@ -0,0 +1,13 @@
+using UnityEngine;
+using System.Collections;
+
+//A3 02 鍔熻兘寮�閫氱姸鎬� #tagMCFuncOpenStateList
+
+public class DTCA302_tagMCFuncOpenStateList : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+        base.Done(vNetPack);
+        HA302_tagMCFuncOpenStateList vNetData = vNetPack as HA302_tagMCFuncOpenStateList;
+        FuncOpen.Instance.UpdateFuncState(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA302_tagMCFuncOpenStateList.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA302_tagMCFuncOpenStateList.cs.meta
new file mode 100644
index 0000000..db21f45
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA302_tagMCFuncOpenStateList.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f2a758138188d2a47be10d589b12c18a
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA315_tagMCDailyActionCnt.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA315_tagMCDailyActionCnt.cs
new file mode 100644
index 0000000..c8a1742
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA315_tagMCDailyActionCnt.cs
@@ -0,0 +1,13 @@
+using UnityEngine;
+using System.Collections;
+
+// A3 15 鏃ュ父娲诲姩娆℃暟閫氱煡 #tagMCDailyActionCnt
+
+public class DTCA315_tagMCDailyActionCnt : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+        base.Done(vNetPack);
+        HA315_tagMCDailyActionCnt vNetData = vNetPack as HA315_tagMCDailyActionCnt;
+        DailyQuestModel.Instance.OnDailyQuestCompletedTimesUpdate(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA315_tagMCDailyActionCnt.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA315_tagMCDailyActionCnt.cs.meta
new file mode 100644
index 0000000..dfaec27
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA315_tagMCDailyActionCnt.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 614cbf82d2da4144b84142734e88ea8f
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs
new file mode 100644
index 0000000..9ceefea
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs
@@ -0,0 +1,13 @@
+using UnityEngine;
+using System.Collections;
+
+// A3 20 鐜╁鍓湰鐩稿叧淇℃伅 #tagMCPlayerFBInfoData
+
+public class DTCA320_tagMCPlayerFBInfoData : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+        base.Done(vNetPack);
+        HA320_tagMCPlayerFBInfoData vNetData = vNetPack as HA320_tagMCPlayerFBInfoData;
+        DungeonModel.Instance.UpdateRecords(vNetData.FBDataList);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
new file mode 100644
index 0000000..0ec0b24
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 56cd057c8501b0246b3887eaa785e5f4
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA333_tagMCDailyActivityInfoList.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA333_tagMCDailyActivityInfoList.cs
new file mode 100644
index 0000000..beb7615
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA333_tagMCDailyActivityInfoList.cs
@@ -0,0 +1,13 @@
+using UnityEngine;
+using System.Collections;
+
+//A3 33 鐜╁姣忔棩娲昏穬搴� #tagMCDailyActivityInfoList
+
+public class DTCA333_tagMCDailyActivityInfoList : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+        base.Done(vNetPack);
+        HA333_tagMCDailyActivityInfoList vNetData = vNetPack as HA333_tagMCDailyActivityInfoList;
+        DailyQuestModel.Instance.OnDailyQuestActiveValueInfoUpdate(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA333_tagMCDailyActivityInfoList.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA333_tagMCDailyActivityInfoList.cs.meta
new file mode 100644
index 0000000..8bd07bb
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA333_tagMCDailyActivityInfoList.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: af0fbf5fece008640bb9c73851b2523f
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA350_tagMCTreasureResult.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA350_tagMCTreasureResult.cs
new file mode 100644
index 0000000..2c51dce
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA350_tagMCTreasureResult.cs
@@ -0,0 +1,13 @@
+using UnityEngine;
+using System.Collections;
+
+// A3 50 閫氱煡瀵诲疂缁撴灉 #tagMCTreasureResult
+
+public class DTCA350_tagMCTreasureResult : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+        base.Done(vNetPack);
+        HA350_tagMCTreasureResult vNetData = vNetPack as HA350_tagMCTreasureResult;
+        HappyXBModel.Instance.GetServerXBResult(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA350_tagMCTreasureResult.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA350_tagMCTreasureResult.cs.meta
new file mode 100644
index 0000000..2358261
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA350_tagMCTreasureResult.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 92e6d065753934a458731e0949c64c21
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA351_tagMCTreasureInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA351_tagMCTreasureInfo.cs
new file mode 100644
index 0000000..ab882ed
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA351_tagMCTreasureInfo.cs
@@ -0,0 +1,13 @@
+using UnityEngine;
+using System.Collections;
+
+// A3 51 瀵诲疂鍔熻兘淇℃伅 #tagMCTreasureInfo
+
+public class DTCA351_tagMCTreasureInfo : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+        base.Done(vNetPack);
+        HA351_tagMCTreasureInfo vNetData = vNetPack as HA351_tagMCTreasureInfo;
+        HappyXBModel.Instance.GetServerXBInfo(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA351_tagMCTreasureInfo.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA351_tagMCTreasureInfo.cs.meta
new file mode 100644
index 0000000..2592e53
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA351_tagMCTreasureInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 02d2cd493a3537b4094b44f667687070
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3A1_tagMCModuleFightPowerInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3A1_tagMCModuleFightPowerInfo.cs
index 2a8a353..a90f023 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3A1_tagMCModuleFightPowerInfo.cs
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3A1_tagMCModuleFightPowerInfo.cs
@@ -1,11 +1,13 @@
-using UnityEngine;
-using System.Collections;
-
+using UnityEngine;
+using System.Collections;
+
 //A3 A1 鍚勫姛鑳芥ā鍧楁垬鏂楀姏淇℃伅 #tagMCModuleFightPowerInfo
 
 public class DTCA3A1_tagMCModuleFightPowerInfo : DtcBasic {
-    public override void Done(GameNetPackBasic vNetPack) {
+    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/DTCA3BD_tagMCBuyEnterInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3BD_tagMCBuyEnterInfo.cs
new file mode 100644
index 0000000..baa3dc1
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3BD_tagMCBuyEnterInfo.cs
@@ -0,0 +1,13 @@
+using UnityEngine;
+using System.Collections;
+
+// A3 BD 閫氱煡鐜╁璐拱鍓湰杩涘叆娆℃暟 #tagMCBuyEnterInfo
+
+public class DTCA3BD_tagMCBuyEnterInfo : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+        base.Done(vNetPack);
+        HA3BD_tagMCBuyEnterInfo vNetData = vNetPack as HA3BD_tagMCBuyEnterInfo;
+        DungeonModel.Instance.UpdateRecords(vNetData.FBInfo);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3BD_tagMCBuyEnterInfo.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3BD_tagMCBuyEnterInfo.cs.meta
new file mode 100644
index 0000000..b37bec8
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3BD_tagMCBuyEnterInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 70c0c289e8698c940977966591e44d4a
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family.meta
new file mode 100644
index 0000000..c9c01ae
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 2bd48faf09f890a4d861428203d7c475
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA401_tagGCViewFamilyRequestInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA401_tagGCViewFamilyRequestInfo.cs
new file mode 100644
index 0000000..6a6fdfc
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA401_tagGCViewFamilyRequestInfo.cs
@@ -0,0 +1,13 @@
+using UnityEngine;
+using System.Collections;
+
+//A4 01  鏌ョ湅鐢宠鍏ヤ細鐨勭帺瀹朵俊鎭� #tagGCViewFamilyRequestInfo
+
+public class DTCA401_tagGCViewFamilyRequestInfo : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+        base.Done(vNetPack);
+        HA401_tagGCViewFamilyRequestInfo vNetData = vNetPack as HA401_tagGCViewFamilyRequestInfo;
+        PlayerDatas.Instance.fairyData.OnRefreshFairy(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA401_tagGCViewFamilyRequestInfo.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA401_tagGCViewFamilyRequestInfo.cs.meta
new file mode 100644
index 0000000..eca1ea1
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA401_tagGCViewFamilyRequestInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 00bbdba49f0dd6843bf7a80970de18b4
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA403_tagGCFamilyActionInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA403_tagGCFamilyActionInfo.cs
new file mode 100644
index 0000000..8b57b3d
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA403_tagGCFamilyActionInfo.cs
@@ -0,0 +1,14 @@
+using UnityEngine;
+using System.Collections;
+
+// A4 03 瀹舵棌琛屼负淇℃伅 #tagGCFamilyActionInfo
+
+public class DTCA403_tagGCFamilyActionInfo : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+        base.Done(vNetPack);
+        HA403_tagGCFamilyActionInfo vNetData = vNetPack as HA403_tagGCFamilyActionInfo;
+        FairyModel.Instance.UpdateFamilyAction(vNetData);
+        FairyEmblemModel.Instance.UpdateFamilyAction(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA403_tagGCFamilyActionInfo.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA403_tagGCFamilyActionInfo.cs.meta
new file mode 100644
index 0000000..bd22e85
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA403_tagGCFamilyActionInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 634e86ec38141754980e79f2da01cbab
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA408_tagGCPyAllFamilyView.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA408_tagGCPyAllFamilyView.cs
new file mode 100644
index 0000000..320f7a6
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA408_tagGCPyAllFamilyView.cs
@@ -0,0 +1,13 @@
+using UnityEngine;
+using System.Collections;
+
+// A4 08 鏌ョ湅瀹舵棌 #tagGCPyAllFamilyView
+
+public class DTCA408_tagGCPyAllFamilyView : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+        base.Done(vNetPack);
+        HA408_tagGCPyAllFamilyView vNetData = vNetPack as HA408_tagGCPyAllFamilyView;
+        PlayerDatas.Instance.fairyData.OnRefreshFairy(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA408_tagGCPyAllFamilyView.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA408_tagGCPyAllFamilyView.cs.meta
new file mode 100644
index 0000000..89c320c
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA408_tagGCPyAllFamilyView.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 569325b108f533a41a508b18461d7c88
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA40D_tagGCServerCreatFamilyTimes.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA40D_tagGCServerCreatFamilyTimes.cs
new file mode 100644
index 0000000..02dbaf4
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA40D_tagGCServerCreatFamilyTimes.cs
@@ -0,0 +1,11 @@
+using UnityEngine;
+using System.Collections;
+
+// A4 0D 閫氱煡寤虹洘娆℃暟 #tagGCServerCreatFamilyTimes
+
+public class DTCA40D_tagGCServerCreatFamilyTimes : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack) {
+        base.Done(vNetPack);
+        HA40D_tagGCServerCreatFamilyTimes vNetData = vNetPack as HA40D_tagGCServerCreatFamilyTimes;
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA40D_tagGCServerCreatFamilyTimes.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA40D_tagGCServerCreatFamilyTimes.cs.meta
new file mode 100644
index 0000000..59b8ec3
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA40D_tagGCServerCreatFamilyTimes.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 78bdf08c9accc8c4abaeb617365caec4
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family.meta
new file mode 100644
index 0000000..af594e2
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 9c5b285d8ec93e843bde3b8ac615fa25
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA501_tagMCNotifyRequestJoinFamilyInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA501_tagMCNotifyRequestJoinFamilyInfo.cs
new file mode 100644
index 0000000..09f9d1b
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA501_tagMCNotifyRequestJoinFamilyInfo.cs
@@ -0,0 +1,13 @@
+using UnityEngine;
+using System.Collections;
+
+//A5 01 宸茬敵璇峰姞鍏ョ殑瀹舵棌淇℃伅 #tagMCNotifyRequestJoinFamilyInfo
+
+public class DTCA501_tagMCNotifyRequestJoinFamilyInfo : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+        base.Done(vNetPack);
+        HA501_tagMCNotifyRequestJoinFamilyInfo vNetData = vNetPack as HA501_tagMCNotifyRequestJoinFamilyInfo;
+        FairyModel.Instance.UpdateFairyRequested(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA501_tagMCNotifyRequestJoinFamilyInfo.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA501_tagMCNotifyRequestJoinFamilyInfo.cs.meta
new file mode 100644
index 0000000..fb3887c
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA501_tagMCNotifyRequestJoinFamilyInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: eaf67c27be3d78a49a4cf9496e4d1111
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA721_tagMCEmojiPackInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA721_tagMCEmojiPackInfo.cs
new file mode 100644
index 0000000..3091ffb
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA721_tagMCEmojiPackInfo.cs
@@ -0,0 +1,13 @@
+using UnityEngine;
+using System.Collections;
+
+// A7 21 琛ㄦ儏鍖呬俊鎭� #tagMCEmojiPackInfo
+
+public class DTCA721_tagMCEmojiPackInfo : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+        base.Done(vNetPack);
+        HA721_tagMCEmojiPackInfo vNetData = vNetPack as HA721_tagMCEmojiPackInfo;
+        PhantasmPavilionModel.Instance.UpdateEmojiPackInfo(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA721_tagMCEmojiPackInfo.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA721_tagMCEmojiPackInfo.cs.meta
new file mode 100644
index 0000000..c2693b5
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA721_tagMCEmojiPackInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 01710fb61664f4c4c8f7bfb47fe1c6b0
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA8_Item/DTCA802_tagMCShopItemDayBuyCntInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA8_Item/DTCA802_tagMCShopItemDayBuyCntInfo.cs
new file mode 100644
index 0000000..5f91d18
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA8_Item/DTCA802_tagMCShopItemDayBuyCntInfo.cs
@@ -0,0 +1,13 @@
+using UnityEngine;
+using System.Collections;
+
+// A8 02 閫氱煡NPC鍟嗗簵鐗╁搧浠婃棩宸茶喘涔版鏁� #tagMCShopItemDayBuyCntInfo
+
+public class DTCA802_tagMCShopItemDayBuyCntInfo : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+        base.Done(vNetPack);
+        HA802_tagMCShopItemDayBuyCntInfo vNetData = vNetPack as HA802_tagMCShopItemDayBuyCntInfo;
+        StoreModel.Instance.RefreshBuyShopLimitModel(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA8_Item/DTCA802_tagMCShopItemDayBuyCntInfo.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA8_Item/DTCA802_tagMCShopItemDayBuyCntInfo.cs.meta
new file mode 100644
index 0000000..81e2b01
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA8_Item/DTCA802_tagMCShopItemDayBuyCntInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 5b4ee9607394bd446b2fb9ff4f29488b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA8_Item/DTCA811_tagMCShoppingResult.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA8_Item/DTCA811_tagMCShoppingResult.cs
new file mode 100644
index 0000000..e8fbf43
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA8_Item/DTCA811_tagMCShoppingResult.cs
@@ -0,0 +1,13 @@
+using UnityEngine;
+using System.Collections;
+
+// A8 11 鍟嗗簵璐拱缁撴灉 #tagMCShoppingResult
+
+public class DTCA811_tagMCShoppingResult : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+        base.Done(vNetPack);
+        HA811_tagMCShoppingResult vNetData = vNetPack as HA811_tagMCShoppingResult;
+        StoreModel.Instance.GetBuyResult(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA8_Item/DTCA811_tagMCShoppingResult.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA8_Item/DTCA811_tagMCShoppingResult.cs.meta
new file mode 100644
index 0000000..fe67285
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA8_Item/DTCA811_tagMCShoppingResult.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 6fc2d2e8163f66f4fa1e4cc97b9df1f7
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA01_tagMCTotalLoginDayCntInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA01_tagMCTotalLoginDayCntInfo.cs
new file mode 100644
index 0000000..7686c04
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA01_tagMCTotalLoginDayCntInfo.cs
@@ -0,0 +1,11 @@
+using UnityEngine;
+using System.Collections;
+
+//AA 01 绱鐧婚檰澶╂暟淇℃伅 #tagMCTotalLoginDayCntInfo
+
+public class DTCAA01_tagMCTotalLoginDayCntInfo : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack) {
+        base.Done(vNetPack);
+        HAA01_tagMCTotalLoginDayCntInfo vNetData = vNetPack as HAA01_tagMCTotalLoginDayCntInfo;
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA01_tagMCTotalLoginDayCntInfo.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA01_tagMCTotalLoginDayCntInfo.cs.meta
new file mode 100644
index 0000000..96d8715
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA01_tagMCTotalLoginDayCntInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 3442dd4c171e8ae48b8769c65b85eb0e
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA03_tagMCDailyPackBuyGiftInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA03_tagMCDailyPackBuyGiftInfo.cs
new file mode 100644
index 0000000..07cd47c
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA03_tagMCDailyPackBuyGiftInfo.cs
@@ -0,0 +1,14 @@
+using UnityEngine;
+using System.Collections;
+
+// AA 03 姣忔棩鎵撳寘鐩磋喘绀煎寘 #tagMCDailyPackBuyGiftInfo
+
+public class DTCAA03_tagMCDailyPackBuyGiftInfo : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+        base.Done(vNetPack);
+        HAA03_tagMCDailyPackBuyGiftInfo vNetData = vNetPack as HAA03_tagMCDailyPackBuyGiftInfo;
+        //姣忔棩鐗规儬绀煎寘
+        DailySpecialsModel.Instance.UpdateGiftState(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA03_tagMCDailyPackBuyGiftInfo.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA03_tagMCDailyPackBuyGiftInfo.cs.meta
new file mode 100644
index 0000000..b993c17
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HAA_SaleActivity/DTCAA03_tagMCDailyPackBuyGiftInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: a35fe32256762fe459a5e7e58007969a
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role.meta
new file mode 100644
index 0000000..3529a6b
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 8163c4bed71ec094bb3b730028d00357
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB117_tagMCFaceInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB117_tagMCFaceInfo.cs
new file mode 100644
index 0000000..8ddbe6f
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB117_tagMCFaceInfo.cs
@@ -0,0 +1,13 @@
+using UnityEngine;
+using System.Collections;
+
+// B1 17 澶村儚淇℃伅 #tagMCFaceInfo
+
+public class DTCB117_tagMCFaceInfo : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+        base.Done(vNetPack);
+        HB117_tagMCFaceInfo vNetData = vNetPack as HB117_tagMCFaceInfo;
+        PhantasmPavilionModel.Instance.UpdateFaceInfo(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB117_tagMCFaceInfo.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB117_tagMCFaceInfo.cs.meta
new file mode 100644
index 0000000..a48c6c6
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB117_tagMCFaceInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: a730bf04a288faf488f07720cfafd86b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB118_tagMCFacePicInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB118_tagMCFacePicInfo.cs
new file mode 100644
index 0000000..235694d
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB118_tagMCFacePicInfo.cs
@@ -0,0 +1,13 @@
+using UnityEngine;
+using System.Collections;
+
+// B1 18 澶村儚妗嗕俊鎭� #tagMCFacePicInfo
+
+public class DTCB118_tagMCFacePicInfo : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+        base.Done(vNetPack);
+        HB118_tagMCFacePicInfo vNetData = vNetPack as HB118_tagMCFacePicInfo;
+        PhantasmPavilionModel.Instance.UpdateFacePicInfo(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB118_tagMCFacePicInfo.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB118_tagMCFacePicInfo.cs.meta
new file mode 100644
index 0000000..2f57692
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB118_tagMCFacePicInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 8c5558cffa773094c8d32c01bf2228d8
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB120_tagMCZhanlingInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB120_tagMCZhanlingInfo.cs
new file mode 100644
index 0000000..a62b0ca
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB120_tagMCZhanlingInfo.cs
@@ -0,0 +1,11 @@
+using UnityEngine;
+using System.Collections;
+
+// B1 20 鎴樹护淇℃伅 #tagMCZhanlingInfo
+
+public class DTCB120_tagMCZhanlingInfo : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack) {
+        base.Done(vNetPack);
+        HB120_tagMCZhanlingInfo vNetData = vNetPack as HB120_tagMCZhanlingInfo;
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB120_tagMCZhanlingInfo.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB120_tagMCZhanlingInfo.cs.meta
new file mode 100644
index 0000000..a8d5fea
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB120_tagMCZhanlingInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 024c874eb5d8fc241b0ce55491335087
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs b/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
index 761726b..df73d8a 100644
--- a/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
+++ b/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
@@ -59,6 +59,38 @@
         Register(typeof(HA110_tagMCCoinToGoldCountInfo), typeof(DTCA110_tagMCCoinToGoldCountInfo));
         Register(typeof(HA008_tagGCPlayerRecInfo), typeof(DTCA008_tagGCPlayerRecInfo));
         Register(typeof(HAA02_tagMCFirstGoldInfo), typeof(DTCAA02_tagMCFirstGoldInfo));
+        Register(typeof(HAA03_tagMCDailyPackBuyGiftInfo), typeof(DTCAA03_tagMCDailyPackBuyGiftInfo));
+        Register(typeof(HA302_tagMCFuncOpenStateList), typeof(DTCA302_tagMCFuncOpenStateList));
+        Register(typeof(HA320_tagMCPlayerFBInfoData), typeof(DTCA320_tagMCPlayerFBInfoData));
+        Register(typeof(H0F03_tagRoleFamilyInfo), typeof(DTC0F03_tagRoleFamilyInfo));
+        Register(typeof(H0F05_tagFamilyChange), typeof(DTC0F05_tagFamilyChange));
+        Register(typeof(H0F07_tagFamilyRenameResult), typeof(DTC0F07_tagFamilyRenameResult));
+        Register(typeof(H0212_tagNotifyCode), typeof(DTC0212_tagNotifyCode));
+        Register(typeof(H0316_tagPackResetOK), typeof(DTC0316_tagPackResetOK));
+        Register(typeof(H0430_tagPlayerInFamilyInfoRefresh), typeof(DTC0430_tagPlayerInFamilyInfoRefresh));
+        Register(typeof(HA3BD_tagMCBuyEnterInfo), typeof(DTCA3BD_tagMCBuyEnterInfo));
+        Register(typeof(HA315_tagMCDailyActionCnt), typeof(DTCA315_tagMCDailyActionCnt));
+        Register(typeof(HA333_tagMCDailyActivityInfoList), typeof(DTCA333_tagMCDailyActivityInfoList));
+        Register(typeof(HA350_tagMCTreasureResult), typeof(DTCA350_tagMCTreasureResult));
+        Register(typeof(HA351_tagMCTreasureInfo), typeof(DTCA351_tagMCTreasureInfo));
+        Register(typeof(HA362_tagMCMailList), typeof(DTCA362_tagMCMailList));
+        Register(typeof(HA363_tagMCMailStateChange), typeof(DTCA363_tagMCMailStateChange));
+        Register(typeof(HA40D_tagGCServerCreatFamilyTimes), typeof(DTCA40D_tagGCServerCreatFamilyTimes));
+        Register(typeof(HA401_tagGCViewFamilyRequestInfo), typeof(DTCA401_tagGCViewFamilyRequestInfo));
+        Register(typeof(HA403_tagGCFamilyActionInfo), typeof(DTCA403_tagGCFamilyActionInfo));
+        Register(typeof(HA408_tagGCPyAllFamilyView), typeof(DTCA408_tagGCPyAllFamilyView));
+        Register(typeof(HA501_tagMCNotifyRequestJoinFamilyInfo), typeof(DTCA501_tagMCNotifyRequestJoinFamilyInfo));
+        Register(typeof(HA705_tagSCQueryPlayerCacheResult), typeof(DTCA705_tagSCQueryPlayerCacheResult));
+        Register(typeof(HA801_tagMCGiveAwardInfo), typeof(DTCA801_tagMCGiveAwardInfo));
+        Register(typeof(HA802_tagMCShopItemDayBuyCntInfo), typeof(DTCA802_tagMCShopItemDayBuyCntInfo));
+        Register(typeof(HA809_tagMCItemDayUseCntInfo), typeof(DTCA809_tagMCItemDayUseCntInfo));
+        Register(typeof(HA811_tagMCShoppingResult), typeof(DTCA811_tagMCShoppingResult));
+        Register(typeof(HA721_tagMCEmojiPackInfo), typeof(DTCA721_tagMCEmojiPackInfo));
+        Register(typeof(HB117_tagMCFaceInfo), typeof(DTCB117_tagMCFaceInfo));
+        Register(typeof(HB118_tagMCFacePicInfo), typeof(DTCB118_tagMCFacePicInfo));
+        Register(typeof(HB120_tagMCZhanlingInfo), typeof(DTCB120_tagMCZhanlingInfo));
+
+
     }
 
 
diff --git a/Main/Core/NetworkPackage/ServerPack/H02_PlayerTalk/H0212_tagNotifyCode.cs b/Main/Core/NetworkPackage/ServerPack/H02_PlayerTalk/H0212_tagNotifyCode.cs
index 4886721..ad8ae66 100644
--- a/Main/Core/NetworkPackage/ServerPack/H02_PlayerTalk/H0212_tagNotifyCode.cs
+++ b/Main/Core/NetworkPackage/ServerPack/H02_PlayerTalk/H0212_tagNotifyCode.cs
@@ -1,66 +1,35 @@
 using UnityEngine;
 using System.Collections;
 
-//02 12 代码提示#tagNotifyCode
-
-
-
-public class H0212_tagNotifyCode : GameNetPackBasic {
-
-    public byte MsgLen;    //表中的msg信息
-
-    public string Msg;    //size = MsgLen
-
-    public byte ParCount;
-
-    public  tagNotifyStr[] Pars = null;    //size = ParCount
-
-
-
-    public H0212_tagNotifyCode () {
-
-        _cmd = (ushort)0x0212;
-
-    }
-
-
-
-    public override void ReadFromBytes (byte[] vBytes) {
-
-        TransBytes (out MsgLen, vBytes, NetDataType.BYTE);
-
-        TransBytes (out Msg, vBytes, NetDataType.Chars, MsgLen);
-
-        TransBytes (out ParCount, vBytes, NetDataType.BYTE);
-
-        Pars = new tagNotifyStr[ParCount];
-
-        for (int i = 0; i < ParCount; i++) {
-
-            Pars[i] = new tagNotifyStr();
-
-            TransBytes (out Pars[i].MsgInt, vBytes, NetDataType.DWORD);
-
-            TransBytes (out Pars[i].Len, vBytes, NetDataType.BYTE);
-
-            TransBytes (out Pars[i].Msg, vBytes, NetDataType.Chars, Pars[i].Len);
-        }
-
-    }
-
-
-
-    public class tagNotifyStr {
-
-        public uint MsgInt;        //int类型
-
-        public byte Len;
-
-        public string Msg;        //size = Len
-
-    }
-
-
-
-}
-
+//02 12 浠g爜鎻愮ず#tagNotifyCode
+
+public class H0212_tagNotifyCode : GameNetPackBasic {
+    public byte MsgLen;    //琛ㄤ腑鐨刴sg淇℃伅
+    public string Msg;    //size = MsgLen
+    public byte ParCount;
+    public  tagNotifyStr[] Pars;    //size = ParCount
+
+    public H0212_tagNotifyCode () {
+        _cmd = (ushort)0x0212;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out MsgLen, vBytes, NetDataType.BYTE);
+        TransBytes (out Msg, vBytes, NetDataType.Chars, MsgLen);
+        TransBytes (out ParCount, vBytes, NetDataType.BYTE);
+        Pars = new tagNotifyStr[ParCount];
+        for (int i = 0; i < ParCount; i ++) {
+            Pars[i] = new tagNotifyStr();
+            TransBytes (out Pars[i].MsgInt, vBytes, NetDataType.DWORD);
+            TransBytes (out Pars[i].Len, vBytes, NetDataType.BYTE);
+            TransBytes (out Pars[i].Msg, vBytes, NetDataType.Chars, Pars[i].Len);
+        }
+    }
+
+    public struct tagNotifyStr {
+        public uint MsgInt;        //int绫诲瀷
+        public byte Len;
+        public string Msg;        //size = Len
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/H03_MainCharacter/H0316_tagPackResetOK.cs b/Main/Core/NetworkPackage/ServerPack/H03_MainCharacter/H0316_tagPackResetOK.cs
index e49cf73..a9448ea 100644
--- a/Main/Core/NetworkPackage/ServerPack/H03_MainCharacter/H0316_tagPackResetOK.cs
+++ b/Main/Core/NetworkPackage/ServerPack/H03_MainCharacter/H0316_tagPackResetOK.cs
@@ -1,17 +1,17 @@
-using UnityEngine;
-using System.Collections;
+using UnityEngine;
+using System.Collections;
+
+//03 16 鑳屽寘閲嶆暣鎴愬姛#tagPackResetOK
 
-//03 16 背包重整成功#tagPackResetOK

-

-public class H0316_tagPackResetOK : GameNetPackBasic {

-    public byte Type;

-

-    public H0316_tagPackResetOK () {

-        _cmd = (ushort)0x0316;

-    }

-

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

-        TransBytes (out Type, vBytes, NetDataType.BYTE);

-    }

-

-}

+public class H0316_tagPackResetOK : GameNetPackBasic {
+    public byte Type;
+
+    public H0316_tagPackResetOK () {
+        _cmd = (ushort)0x0316;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out Type, vBytes, NetDataType.BYTE);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/H04_Scene/H0430_tagPlayerInFamilyInfoRefresh.cs b/Main/Core/NetworkPackage/ServerPack/H04_Scene/H0430_tagPlayerInFamilyInfoRefresh.cs
new file mode 100644
index 0000000..aadbd57
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/H04_Scene/H0430_tagPlayerInFamilyInfoRefresh.cs
@@ -0,0 +1,23 @@
+using UnityEngine;
+using System.Collections;
+
+//04 30 鐜╁瀹舵棌鍚嶅瓧鑱屼綅绛変俊鎭埛鏂�#tagPlayerInFamilyInfoRefresh
+
+public class H0430_tagPlayerInFamilyInfoRefresh : GameNetPackBasic {
+    public uint PlayerID;
+    public byte FamilyNameLen;
+    public string FamilyName;    //size = FamilyNameLen
+    public byte FamilyMemberLV;    //鐜╁鍦ㄥ鏃忎腑鐨勮亴浣�	
+
+    public H0430_tagPlayerInFamilyInfoRefresh () {
+        _cmd = (ushort)0x0430;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out PlayerID, vBytes, NetDataType.DWORD);
+        TransBytes (out FamilyNameLen, vBytes, NetDataType.BYTE);
+        TransBytes (out FamilyName, vBytes, NetDataType.Chars, FamilyNameLen);
+        TransBytes (out FamilyMemberLV, vBytes, NetDataType.BYTE);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/H04_Scene/H0430_tagPlayerInFamilyInfoRefresh.cs.meta b/Main/Core/NetworkPackage/ServerPack/H04_Scene/H0430_tagPlayerInFamilyInfoRefresh.cs.meta
new file mode 100644
index 0000000..a09a482
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/H04_Scene/H0430_tagPlayerInFamilyInfoRefresh.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: cce6076ca0d0a3b448bff2a02ee77f3b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/H0F_Family.meta b/Main/Core/NetworkPackage/ServerPack/H0F_Family.meta
new file mode 100644
index 0000000..91d0d68
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/H0F_Family.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: fd8f397972094f9499bf0aea26250d38
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/H0F_Family/C0F09_tagFamilyWarBillboardResult.cs b/Main/Core/NetworkPackage/ServerPack/H0F_Family/C0F09_tagFamilyWarBillboardResult.cs
new file mode 100644
index 0000000..bafcf4c
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/H0F_Family/C0F09_tagFamilyWarBillboardResult.cs
@@ -0,0 +1,33 @@
+using UnityEngine;
+using System.Collections;
+
+//0F 09 瀹舵棌鎴樻帓琛屾淇℃伅#tagFamilyWarBillboardResult
+
+public class C0F09_tagFamilyWarBillboardResult : GameNetPackBasic {
+    public byte ResultCount;
+    public  tagFamilyWarBillboardInfo[] Result;    //size = ResultCount
+
+    public C0F09_tagFamilyWarBillboardResult () {
+        _cmd = (ushort)0x0F09;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (ResultCount, NetDataType.BYTE);
+        for (int i = 0; i < ResultCount; i ++) {
+            WriteBytes (Result[i].FamilyID, NetDataType.DWORD);
+            WriteBytes (Result[i].FamilyNameLen, NetDataType.BYTE);
+            WriteBytes (Result[i].FamilyName, NetDataType.Chars, Result[i].FamilyNameLen);
+            WriteBytes (Result[i].Billboard, NetDataType.DWORD);
+            WriteBytes (Result[i].FamilyCountry, NetDataType.BYTE);
+        }
+    }
+
+    public struct tagFamilyWarBillboardInfo {
+        public uint FamilyID;        //瀹舵棌ID
+        public byte FamilyNameLen;
+        public string FamilyName;        //size = FamilyNameLen
+        public uint Billboard;        //鎺掑悕
+        public byte FamilyCountry;        //鍥界睄
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/H0F_Family/C0F09_tagFamilyWarBillboardResult.cs.meta b/Main/Core/NetworkPackage/ServerPack/H0F_Family/C0F09_tagFamilyWarBillboardResult.cs.meta
new file mode 100644
index 0000000..fd64263
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/H0F_Family/C0F09_tagFamilyWarBillboardResult.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 79a41e81b1f4ae547b59bc6d8bbb024e
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/H0F_Family/H0F03_tagRoleFamilyInfo.cs b/Main/Core/NetworkPackage/ServerPack/H0F_Family/H0F03_tagRoleFamilyInfo.cs
new file mode 100644
index 0000000..758c9c8
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/H0F_Family/H0F03_tagRoleFamilyInfo.cs
@@ -0,0 +1,117 @@
+using UnityEngine;
+using System.Collections;
+
+//0F 03 瀹舵棌鍩烘湰淇℃伅#tagRoleFamilyInfo
+
+public class H0F03_tagRoleFamilyInfo : GameNetPackBasic {
+    public uint FamilyID;
+    public string FamilyName;    //瀹舵棌鍚嶇О
+    public ushort FamilyLV;    //瀹舵棌绛夌骇
+    public uint FamilyMoney;    //璧勯噾
+    public uint FamilyHornor;    //鑽h獕
+    public ushort MemberCount;    //浜烘暟
+    public ushort BroadcastLen;    //鍏憡
+    public uint Point;    //瀹舵棌鎴樼Н鍒�
+    public string Broadcast;    //size = BroadcastLen
+    public uint FamilyActiveValue;    //鏈懆瀹舵棌娲昏穬搴�
+    public uint LastWeekFamilyActiveValue;    //涓婂懆瀹舵棌娲昏穬搴�	
+    public  tagRoleFamilyMember[] Member;    //size = MemberCount
+    public uint Extra1;    //闄勫姞瀛楁1
+    public uint Extra2;    //闄勫姞瀛楁2
+    public uint Extra3;    //闄勫姞瀛楁3
+    public uint Extra4;    //闄勫姞瀛楁4
+    public uint Extra5;    //闄勫姞瀛楁5
+    public uint Extra6;    //闄勫姞瀛楁6
+    public uint Extra7;    //闄勫姞瀛楁7
+    public uint Extra8;    //闄勫姞瀛楁8
+    public uint Extra9;    //闄勫姞瀛楁
+    public uint Extra10;    //闄勫姞瀛楁
+    public uint ServerID;    //鍖烘湇ID锛屽垱寤烘椂浠ョ洘涓荤殑ID璧嬪�硷紝鐩墠鐢ㄤ簬鏄剧ず
+    public byte AcceptJoin;    //鏄惁鎺ュ彈鐢宠
+
+    public H0F03_tagRoleFamilyInfo () {
+        _cmd = (ushort)0x0F03;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out FamilyID, vBytes, NetDataType.DWORD);
+        TransBytes (out FamilyName, vBytes, NetDataType.Chars, 33);
+        TransBytes (out FamilyLV, vBytes, NetDataType.WORD);
+        TransBytes (out FamilyMoney, vBytes, NetDataType.DWORD);
+        TransBytes (out FamilyHornor, vBytes, NetDataType.DWORD);
+        TransBytes (out MemberCount, vBytes, NetDataType.WORD);
+        TransBytes (out BroadcastLen, vBytes, NetDataType.WORD);
+        TransBytes (out Point, vBytes, NetDataType.DWORD);
+        TransBytes (out Broadcast, vBytes, NetDataType.Chars, BroadcastLen);
+        TransBytes (out FamilyActiveValue, vBytes, NetDataType.DWORD);
+        TransBytes (out LastWeekFamilyActiveValue, vBytes, NetDataType.DWORD);
+        Member = new tagRoleFamilyMember[MemberCount];
+        for (int i = 0; i < MemberCount; i ++) {
+            Member[i] = new tagRoleFamilyMember();
+            TransBytes (out Member[i].PlayerID, vBytes, NetDataType.DWORD);
+            TransBytes (out Member[i].Sex, vBytes, NetDataType.BYTE);
+            TransBytes (out Member[i].NameLen, vBytes, NetDataType.BYTE);
+            TransBytes (out Member[i].Name, vBytes, NetDataType.Chars, Member[i].NameLen);
+            TransBytes (out Member[i].LV, vBytes, NetDataType.WORD);
+            TransBytes (out Member[i].ReincarnationLv, vBytes, NetDataType.WORD);
+            TransBytes (out Member[i].FamilyLV, vBytes, NetDataType.BYTE);
+            TransBytes (out Member[i].FamilyNameLen, vBytes, NetDataType.BYTE);
+            TransBytes (out Member[i].FamilyName, vBytes, NetDataType.Chars, Member[i].FamilyNameLen);
+            TransBytes (out Member[i].Job, vBytes, NetDataType.BYTE);
+            TransBytes (out Member[i].Face, vBytes, NetDataType.DWORD);
+            TransBytes (out Member[i].FacePic, vBytes, NetDataType.DWORD);
+            TransBytes (out Member[i].FamilyActiveValue, vBytes, NetDataType.DWORD);
+            TransBytes (out Member[i].LastWeekFamilyActiveValue, vBytes, NetDataType.DWORD);
+            TransBytes (out Member[i].OfficialRank, vBytes, NetDataType.BYTE);
+            TransBytes (out Member[i].Exattr1, vBytes, NetDataType.DWORD);
+            TransBytes (out Member[i].Exattr2, vBytes, NetDataType.DWORD);
+            TransBytes (out Member[i].Exattr3, vBytes, NetDataType.DWORD);
+            TransBytes (out Member[i].Exattr4, vBytes, NetDataType.DWORD);
+            TransBytes (out Member[i].Exattr5, vBytes, NetDataType.DWORD);
+            TransBytes (out Member[i].Exattr6, vBytes, NetDataType.DWORD);
+            TransBytes (out Member[i].Exattr7, vBytes, NetDataType.DWORD);
+            TransBytes (out Member[i].Exattr8, vBytes, NetDataType.DWORD);
+            TransBytes (out Member[i].OperateInfo, vBytes, NetDataType.DWORD);
+        }
+        TransBytes (out Extra1, vBytes, NetDataType.DWORD);
+        TransBytes (out Extra2, vBytes, NetDataType.DWORD);
+        TransBytes (out Extra3, vBytes, NetDataType.DWORD);
+        TransBytes (out Extra4, vBytes, NetDataType.DWORD);
+        TransBytes (out Extra5, vBytes, NetDataType.DWORD);
+        TransBytes (out Extra6, vBytes, NetDataType.DWORD);
+        TransBytes (out Extra7, vBytes, NetDataType.DWORD);
+        TransBytes (out Extra8, vBytes, NetDataType.DWORD);
+        TransBytes (out Extra9, vBytes, NetDataType.DWORD);
+        TransBytes (out Extra10, vBytes, NetDataType.DWORD);
+        TransBytes (out ServerID, vBytes, NetDataType.DWORD);
+        TransBytes (out AcceptJoin, vBytes, NetDataType.BYTE);
+    }
+
+    public struct tagRoleFamilyMember {
+        public uint PlayerID;
+        public byte Sex;        //鎬у埆
+        public byte NameLen;
+        public string Name;        //size = NameLen
+        public ushort LV;
+        public ushort ReincarnationLv;
+        public byte FamilyLV;        //瀹舵棌绛夌骇
+        public byte FamilyNameLen;
+        public string FamilyName;        //size = FamilyNameLen
+        public byte Job;        //鑱屼笟
+        public uint Face;        //澶村儚
+        public uint FacePic;        //澶村儚澶栨
+        public uint FamilyActiveValue;        //鏈懆瀹舵棌娲昏穬搴�
+        public uint LastWeekFamilyActiveValue;        //涓婂懆瀹舵棌娲昏穬搴�	
+        public byte OfficialRank;        //澧冪晫
+        public uint Exattr1;        //鎵╁睍灞炴��
+        public uint Exattr2;        //鎵╁睍灞炴��
+        public uint Exattr3;        //鎵╁睍灞炴��
+        public uint Exattr4;        //鎵╁睍灞炴��
+        public uint Exattr5;        //鎵╁睍灞炴��
+        public uint Exattr6;        //鎵╁睍灞炴��
+        public uint Exattr7;        //鎵╁睍灞炴��
+        public uint Exattr8;        //鎵╁睍灞炴��
+        public uint OperateInfo;        //鐜╁闄勫姞杩愯惀鍟嗕俊鎭�
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/H0F_Family/H0F03_tagRoleFamilyInfo.cs.meta b/Main/Core/NetworkPackage/ServerPack/H0F_Family/H0F03_tagRoleFamilyInfo.cs.meta
new file mode 100644
index 0000000..7db7cef
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/H0F_Family/H0F03_tagRoleFamilyInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 263f331422a345143b145301e9eb939f
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/H0F_Family/H0F05_tagFamilyChange.cs b/Main/Core/NetworkPackage/ServerPack/H0F_Family/H0F05_tagFamilyChange.cs
new file mode 100644
index 0000000..9a11a21
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/H0F_Family/H0F05_tagFamilyChange.cs
@@ -0,0 +1,17 @@
+using UnityEngine;
+using System.Collections;
+
+//0F 05 瀹舵棌鍙樻洿#tagFamilyChange
+
+public class H0F05_tagFamilyChange : GameNetPackBasic {
+    public byte Type;
+
+    public H0F05_tagFamilyChange () {
+        _cmd = (ushort)0x0F05;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out Type, vBytes, NetDataType.BYTE);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/H0F_Family/H0F05_tagFamilyChange.cs.meta b/Main/Core/NetworkPackage/ServerPack/H0F_Family/H0F05_tagFamilyChange.cs.meta
new file mode 100644
index 0000000..0fdcf4d
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/H0F_Family/H0F05_tagFamilyChange.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 950225d931d9acd419622d2966418220
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/H0F_Family/H0F07_tagFamilyRenameResult.cs b/Main/Core/NetworkPackage/ServerPack/H0F_Family/H0F07_tagFamilyRenameResult.cs
new file mode 100644
index 0000000..5d03a15
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/H0F_Family/H0F07_tagFamilyRenameResult.cs
@@ -0,0 +1,21 @@
+using UnityEngine;
+using System.Collections;
+
+//0F 07 瀹舵棌鍚嶇О鏀瑰悕缁撴灉#tagFamilyRenameResult
+
+public class H0F07_tagFamilyRenameResult : GameNetPackBasic {
+    public byte FamilyNameLen;
+    public string FamilyName;    //size = FamilyNameLen
+    public byte Reasult;
+
+    public H0F07_tagFamilyRenameResult () {
+        _cmd = (ushort)0x0F07;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out FamilyNameLen, vBytes, NetDataType.BYTE);
+        TransBytes (out FamilyName, vBytes, NetDataType.Chars, FamilyNameLen);
+        TransBytes (out Reasult, vBytes, NetDataType.BYTE);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/H0F_Family/H0F07_tagFamilyRenameResult.cs.meta b/Main/Core/NetworkPackage/ServerPack/H0F_Family/H0F07_tagFamilyRenameResult.cs.meta
new file mode 100644
index 0000000..e07c24a
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/H0F_Family/H0F07_tagFamilyRenameResult.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: af71867a0bf85044ab07e9ef954a630f
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/HA2_Package/HA204_tagMCVPackRefresh.cs b/Main/Core/NetworkPackage/ServerPack/HA2_Package/HA204_tagMCVPackRefresh.cs
index 4f4583e..b70a129 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA2_Package/HA204_tagMCVPackRefresh.cs
+++ b/Main/Core/NetworkPackage/ServerPack/HA2_Package/HA204_tagMCVPackRefresh.cs
@@ -1,59 +1,31 @@
 using UnityEngine;
 using System.Collections;
 
-// A2 04 虚拟背包物品刷新 #tagMCVPackRefresh
-
-
-
-public class HA204_tagMCVPackRefresh : GameNetPackBasic {
-
-    public byte PackType;    //背包类型
-
-    public ushort Count;    // 刷新个数
-
-    public  tagMCVPackItem[] VPacklItemList = null;    // 物品信息列表
-
-
-
-    public HA204_tagMCVPackRefresh () {
-
-        _cmd = (ushort)0xA204;
-
-    }
-
-
-
-    public override void ReadFromBytes (byte[] vBytes) {
-
-        TransBytes (out PackType, vBytes, NetDataType.BYTE);
-
-        TransBytes (out Count, vBytes, NetDataType.WORD);
-
-        VPacklItemList = new tagMCVPackItem[Count];
-
-        for (int i = 0; i < Count; i ++) {
-
-            VPacklItemList[i] = new tagMCVPackItem();
-
-            TransBytes (out VPacklItemList[i].ItemPlace, vBytes, NetDataType.WORD);
-
-            TransBytes (out VPacklItemList[i].ItemData, vBytes, NetDataType.DWORD);
-
-        }
-
-    }
-
-
-
-    public class tagMCVPackItem {
-
-        public ushort ItemPlace;        // 背包物品位置索引
-
-        public uint ItemData;        // 物品数据,根据不同背包类型自定义
-
-    }
-
-
-
-}
-
+// A2 04 铏氭嫙鑳屽寘鐗╁搧鍒锋柊 #tagMCVPackRefresh
+
+public class HA204_tagMCVPackRefresh : GameNetPackBasic {
+    public byte PackType;    //鑳屽寘绫诲瀷
+    public ushort Count;    // 鍒锋柊涓暟
+    public  tagMCVPackItem[] VPacklItemList;    // 鐗╁搧淇℃伅鍒楄〃
+
+    public HA204_tagMCVPackRefresh () {
+        _cmd = (ushort)0xA204;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out PackType, vBytes, NetDataType.BYTE);
+        TransBytes (out Count, vBytes, NetDataType.WORD);
+        VPacklItemList = new tagMCVPackItem[Count];
+        for (int i = 0; i < Count; i ++) {
+            VPacklItemList[i] = new tagMCVPackItem();
+            TransBytes (out VPacklItemList[i].ItemPlace, vBytes, NetDataType.WORD);
+            TransBytes (out VPacklItemList[i].ItemData, vBytes, NetDataType.DWORD);
+        }
+    }
+
+    public struct tagMCVPackItem {
+        public ushort ItemPlace;        // 鑳屽寘鐗╁搧浣嶇疆绱㈠紩
+        public uint ItemData;        // 鐗╁搧鏁版嵁锛屾牴鎹笉鍚岃儗鍖呯被鍨嬭嚜瀹氫箟
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA2_Package/HA205_tagMCVPackClear.cs b/Main/Core/NetworkPackage/ServerPack/HA2_Package/HA205_tagMCVPackClear.cs
index 0cb719a..bfbda4c 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA2_Package/HA205_tagMCVPackClear.cs
+++ b/Main/Core/NetworkPackage/ServerPack/HA2_Package/HA205_tagMCVPackClear.cs
@@ -1,21 +1,21 @@
-using UnityEngine;
-using System.Collections;
+using UnityEngine;
+using System.Collections;
+
+// A2 05 铏氭嫙鑳屽寘鐗╁搧娓呯┖ #tagMCVPackClear
 
-// A2 05 虚拟背包物品清空 #tagMCVPackClear

-

-public class HA205_tagMCVPackClear : GameNetPackBasic {

-    public byte PackType;    //背包类型

-    public ushort Count;

-    public  ushort[] ItemPlaceList = null;    //清空格子索引列表, size = Count

-

-    public HA205_tagMCVPackClear () {

-        _cmd = (ushort)0xA205;

-    }

-

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

-        TransBytes (out PackType, vBytes, NetDataType.BYTE);

-        TransBytes (out Count, vBytes, NetDataType.WORD);

-        TransBytes (out ItemPlaceList, vBytes, NetDataType.WORD, Count);

-    }

-

-}

+public class HA205_tagMCVPackClear : GameNetPackBasic {
+    public byte PackType;    //鑳屽寘绫诲瀷
+    public ushort Count;
+    public  ushort[] ItemPlaceList;    //娓呯┖鏍煎瓙绱㈠紩鍒楄〃, size = Count
+
+    public HA205_tagMCVPackClear () {
+        _cmd = (ushort)0xA205;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out PackType, vBytes, NetDataType.BYTE);
+        TransBytes (out Count, vBytes, NetDataType.WORD);
+        TransBytes (out ItemPlaceList, vBytes, NetDataType.WORD, Count);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA302_tagMCFuncOpenStateList.cs b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA302_tagMCFuncOpenStateList.cs
index 90513bd..f8ad960 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA302_tagMCFuncOpenStateList.cs
+++ b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA302_tagMCFuncOpenStateList.cs
@@ -1,59 +1,31 @@
 using UnityEngine;
 using System.Collections;
 
-//A3 02 鍔熻兘寮�閫氱姸鎬� #tagMCFuncOpenStateList
-
-
-
-public class HA302_tagMCFuncOpenStateList : GameNetPackBasic {
-
-    public byte FuncCount;    // 鍔熻兘涓暟
-
-    public  tagMCFuncOpenState[] FuncStateList;    // 鍔熻兘鐘舵�佸垪琛�
-
-
-
-    public HA302_tagMCFuncOpenStateList () {
-
-        _cmd = (ushort)0xA302;
-
-    }
-
-
-
-    public override void ReadFromBytes (byte[] vBytes) {
-
-        TransBytes (out FuncCount, vBytes, NetDataType.BYTE);
-
-        FuncStateList = new tagMCFuncOpenState[FuncCount];
-
-        for (int i = 0; i < FuncCount; i ++) {
-
-            FuncStateList[i] = new tagMCFuncOpenState();
-
-            TransBytes (out FuncStateList[i].FuncID, vBytes, NetDataType.BYTE);
-
-            TransBytes (out FuncStateList[i].State, vBytes, NetDataType.BYTE);
-
-            TransBytes (out FuncStateList[i].AwardState, vBytes, NetDataType.BYTE);
-
-        }
-
-    }
-
-
-
-    public struct tagMCFuncOpenState {
-
-        public byte FuncID;        // 鍔熻兘ID
-
-        public byte State;        // 鏄惁寮�鍚�
-
-        public byte AwardState;        // 鏄惁宸查濂栧姳
-
-    }
-
-
-
-}
-
+//A3 02 鍔熻兘寮�閫氱姸鎬� #tagMCFuncOpenStateList
+
+public class HA302_tagMCFuncOpenStateList : GameNetPackBasic {
+    public byte FuncCount;    // 鍔熻兘涓暟
+    public  tagMCFuncOpenState[] FuncStateList;    // 鍔熻兘鐘舵�佸垪琛�
+
+    public HA302_tagMCFuncOpenStateList () {
+        _cmd = (ushort)0xA302;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out FuncCount, vBytes, NetDataType.BYTE);
+        FuncStateList = new tagMCFuncOpenState[FuncCount];
+        for (int i = 0; i < FuncCount; i ++) {
+            FuncStateList[i] = new tagMCFuncOpenState();
+            TransBytes (out FuncStateList[i].FuncID, vBytes, NetDataType.BYTE);
+            TransBytes (out FuncStateList[i].State, vBytes, NetDataType.BYTE);
+            TransBytes (out FuncStateList[i].AwardState, vBytes, NetDataType.BYTE);
+        }
+    }
+
+    public struct tagMCFuncOpenState {
+        public byte FuncID;        // 鍔熻兘ID
+        public byte State;        // 鏄惁寮�鍚�
+        public byte AwardState;        // 鏄惁宸查濂栧姳
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA315_tagMCDailyActionCnt.cs b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA315_tagMCDailyActionCnt.cs
new file mode 100644
index 0000000..cd8dbd1
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA315_tagMCDailyActionCnt.cs
@@ -0,0 +1,35 @@
+using UnityEngine;
+using System.Collections;
+
+// A3 15 鏃ュ父娲诲姩娆℃暟閫氱煡 #tagMCDailyActionCnt
+
+public class HA315_tagMCDailyActionCnt : GameNetPackBasic {
+    public byte Count;    // 涓暟
+    public  tagMCDailyActionInfo[] ActionInfo;    // 娲诲姩淇℃伅
+
+    public HA315_tagMCDailyActionCnt () {
+        _cmd = (ushort)0xA315;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out Count, vBytes, NetDataType.BYTE);
+        ActionInfo = new tagMCDailyActionInfo[Count];
+        for (int i = 0; i < Count; i ++) {
+            ActionInfo[i] = new tagMCDailyActionInfo();
+            TransBytes (out ActionInfo[i].ActionID, vBytes, NetDataType.DWORD);
+            TransBytes (out ActionInfo[i].DayFinishCnt, vBytes, NetDataType.WORD);
+            TransBytes (out ActionInfo[i].DayBuyTimes, vBytes, NetDataType.BYTE);
+            TransBytes (out ActionInfo[i].DayItemTimes, vBytes, NetDataType.BYTE);
+            TransBytes (out ActionInfo[i].WeekFinishCnt, vBytes, NetDataType.DWORD);
+        }
+    }
+
+    public struct tagMCDailyActionInfo {
+        public uint ActionID;        // ID
+        public ushort DayFinishCnt;        // 浠婃棩宸插畬鎴愭鏁�
+        public byte DayBuyTimes;        // 浠婃棩璐拱娆℃暟
+        public byte DayItemTimes;        // 浠婃棩鐗╁搧澧炲姞娆℃暟
+        public uint WeekFinishCnt;        // 鏈懆宸插畬鎴愭鏁�
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA315_tagMCDailyActionCnt.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA315_tagMCDailyActionCnt.cs.meta
new file mode 100644
index 0000000..0a8b0d6
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA315_tagMCDailyActionCnt.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d1154c0080ab1f644a04be89788e19a8
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA320_tagMCPlayerFBInfoData.cs b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA320_tagMCPlayerFBInfoData.cs
new file mode 100644
index 0000000..515b01a
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA320_tagMCPlayerFBInfoData.cs
@@ -0,0 +1,41 @@
+using UnityEngine;
+using System.Collections;
+
+// A3 20 鐜╁鍓湰鐩稿叧淇℃伅 #tagMCPlayerFBInfoData
+
+public class HA320_tagMCPlayerFBInfoData : GameNetPackBasic {
+    public byte FBDataCnt;    // 鍓湰鏁版嵁涓暟
+    public  tagMCFBInfo[] FBDataList;    // 鍓湰鏁版嵁鍒楄〃
+
+    public HA320_tagMCPlayerFBInfoData () {
+        _cmd = (ushort)0xA320;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out FBDataCnt, vBytes, NetDataType.BYTE);
+        FBDataList = new tagMCFBInfo[FBDataCnt];
+        for (int i = 0; i < FBDataCnt; i ++) {
+            FBDataList[i] = new tagMCFBInfo();
+            TransBytes (out FBDataList[i].FBID, vBytes, NetDataType.DWORD);
+            TransBytes (out FBDataList[i].EnterCnt, vBytes, NetDataType.WORD);
+            TransBytes (out FBDataList[i].RecoverCnt, vBytes, NetDataType.WORD);
+            TransBytes (out FBDataList[i].ItemAddCnt, vBytes, NetDataType.WORD);
+            TransBytes (out FBDataList[i].PassGradeCnt, vBytes, NetDataType.BYTE);
+            TransBytes (out FBDataList[i].PassGrade, vBytes, NetDataType.DWORD, FBDataList[i].PassGradeCnt);
+            TransBytes (out FBDataList[i].EnterCntTotal, vBytes, NetDataType.DWORD);
+            TransBytes (out FBDataList[i].PassLineID, vBytes, NetDataType.DWORD);
+        }
+    }
+
+    public struct tagMCFBInfo {
+        public uint FBID;        //fbId
+        public ushort EnterCnt;        //褰撴棩杩涘叆娆℃暟
+        public ushort RecoverCnt;        //鎵惧洖娆℃暟
+        public ushort ItemAddCnt;        //鐗╁搧澧炲姞娆℃暟
+        public byte PassGradeCnt;        //鏄熺骇鍊煎搴斾釜鏁�, 姣忎釜key瀛�9涓猯ineID
+        public  uint[] PassGrade;        //鍓湰绾胯矾瀵瑰簲鏄熺骇鍊煎垪琛�
+        public uint EnterCntTotal;        //绱杩涘叆娆℃暟
+        public uint PassLineID;        //宸茶繃鍏冲埌鐨刲ineID
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA320_tagMCPlayerFBInfoData.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA320_tagMCPlayerFBInfoData.cs.meta
new file mode 100644
index 0000000..6edd4e2
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA320_tagMCPlayerFBInfoData.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 708297d42528f9040923687ac7ad8ed8
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA333_tagMCDailyActivityInfoList.cs b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA333_tagMCDailyActivityInfoList.cs
new file mode 100644
index 0000000..ecba836
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA333_tagMCDailyActivityInfoList.cs
@@ -0,0 +1,25 @@
+using UnityEngine;
+using System.Collections;
+
+//A3 33 鐜╁姣忔棩娲昏穬搴� #tagMCDailyActivityInfoList
+
+public class HA333_tagMCDailyActivityInfoList : GameNetPackBasic {
+    public uint CurValue;    // 褰撳墠鎬绘椿璺冨害
+    public uint RealmPoint;    // 鍙鍙栦慨琛岀偣
+    public byte StageIndex;    // 褰撳墠闃舵绱㈠紩
+    public uint AwardRecord;    // 棰嗗璁板綍 鎸変綅瀛樺偍
+    public uint ExtraPoint;    // 澶氬�嶆椿鍔ㄨ幏寰楃殑棰濆淇鐐�
+
+    public HA333_tagMCDailyActivityInfoList () {
+        _cmd = (ushort)0xA333;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out CurValue, vBytes, NetDataType.DWORD);
+        TransBytes (out RealmPoint, vBytes, NetDataType.DWORD);
+        TransBytes (out StageIndex, vBytes, NetDataType.BYTE);
+        TransBytes (out AwardRecord, vBytes, NetDataType.DWORD);
+        TransBytes (out ExtraPoint, vBytes, NetDataType.DWORD);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA333_tagMCDailyActivityInfoList.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA333_tagMCDailyActivityInfoList.cs.meta
new file mode 100644
index 0000000..7a5213c
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA333_tagMCDailyActivityInfoList.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d9268bc57bc1f774c918ea4708963d44
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA350_tagMCTreasureResult.cs b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA350_tagMCTreasureResult.cs
new file mode 100644
index 0000000..2788cbe
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA350_tagMCTreasureResult.cs
@@ -0,0 +1,25 @@
+using UnityEngine;
+using System.Collections;
+
+// A3 50 閫氱煡瀵诲疂缁撴灉 #tagMCTreasureResult
+
+public class HA350_tagMCTreasureResult : GameNetPackBasic {
+    public byte AddMoneyType;    // 鏈瀵诲疂澧炲姞鐨勭Н鍒嗚揣甯佺被鍨嬶紝鍙兘涓�0
+    public ushort AddMoneyValue;    // 鏈瀵诲疂澧炲姞鐨勭Н鍒嗚揣甯佸�硷紝鍙兘涓�0
+    public ushort AddTreasureLuck;    // 鏈瀵诲疂澧炲姞鐨勫垢杩愬��
+    public ushort TreasureResultLen;
+    public string TreasureResult;    //  鑾峰緱鐗╁搧缁撴灉[[鏍煎瓙缂栧彿, 鐗╁搧ID,涓暟,鏄惁缁戝畾], ...]
+
+    public HA350_tagMCTreasureResult () {
+        _cmd = (ushort)0xA350;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out AddMoneyType, vBytes, NetDataType.BYTE);
+        TransBytes (out AddMoneyValue, vBytes, NetDataType.WORD);
+        TransBytes (out AddTreasureLuck, vBytes, NetDataType.WORD);
+        TransBytes (out TreasureResultLen, vBytes, NetDataType.WORD);
+        TransBytes (out TreasureResult, vBytes, NetDataType.Chars, TreasureResultLen);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA350_tagMCTreasureResult.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA350_tagMCTreasureResult.cs.meta
new file mode 100644
index 0000000..c8c3b42
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA350_tagMCTreasureResult.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: a3fdc43cd98308c46bd83a042aacd858
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA351_tagMCTreasureInfo.cs b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA351_tagMCTreasureInfo.cs
new file mode 100644
index 0000000..0d21cb5
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA351_tagMCTreasureInfo.cs
@@ -0,0 +1,51 @@
+using UnityEngine;
+using System.Collections;
+
+// A3 51 瀵诲疂鍔熻兘淇℃伅 #tagMCTreasureInfo
+
+public class HA351_tagMCTreasureInfo : GameNetPackBasic {
+    public byte InfoCount;    // 瀵诲疂绫诲瀷淇℃伅鏁�
+    public  tagMCTreasureTypeInfo[] TreasuerInfoList;    // 瀵诲疂绫诲瀷淇℃伅鍒楄〃
+
+    public HA351_tagMCTreasureInfo () {
+        _cmd = (ushort)0xA351;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out InfoCount, vBytes, NetDataType.BYTE);
+        TreasuerInfoList = new tagMCTreasureTypeInfo[InfoCount];
+        for (int i = 0; i < InfoCount; i ++) {
+            TreasuerInfoList[i] = new tagMCTreasureTypeInfo();
+            TransBytes (out TreasuerInfoList[i].TreasureType, vBytes, NetDataType.BYTE);
+            TransBytes (out TreasuerInfoList[i].LuckValue, vBytes, NetDataType.WORD);
+            TransBytes (out TreasuerInfoList[i].TreasureCount, vBytes, NetDataType.DWORD);
+            TransBytes (out TreasuerInfoList[i].TreasureCountToday, vBytes, NetDataType.DWORD);
+            TransBytes (out TreasuerInfoList[i].FreeCountToday, vBytes, NetDataType.WORD);
+            TransBytes (out TreasuerInfoList[i].TreasureCntAward, vBytes, NetDataType.DWORD);
+            TransBytes (out TreasuerInfoList[i].GridLimitCnt, vBytes, NetDataType.BYTE);
+            TreasuerInfoList[i].GridLimitCntList = new tagMCTreasureGridLimit[TreasuerInfoList[i].GridLimitCnt];
+            for (int j = 0; j < TreasuerInfoList[i].GridLimitCnt; j ++) {
+                TreasuerInfoList[i].GridLimitCntList[j] = new tagMCTreasureGridLimit();
+                TransBytes (out TreasuerInfoList[i].GridLimitCntList[j].GridNum, vBytes, NetDataType.BYTE);
+                TransBytes (out TreasuerInfoList[i].GridLimitCntList[j].GridCnt, vBytes, NetDataType.WORD);
+            }
+        }
+    }
+
+    public struct tagMCTreasureTypeInfo {
+        public byte TreasureType;        //瀵诲疂绫诲瀷
+        public ushort LuckValue;        //褰撳墠骞歌繍鍊�
+        public uint TreasureCount;        //宸插瀹濇�绘鏁�
+        public uint TreasureCountToday;        //浠婃棩宸插瀹濇�绘鏁�
+        public ushort FreeCountToday;        //浠婃棩宸插厤璐瑰瀹濇鏁�
+        public uint TreasureCntAward;        //绱瀵诲疂娆℃暟瀵瑰簲濂栧姳棰嗗鐘舵�侊紝鎸夊鍔辫褰曠储寮曚簩杩涘埗璁板綍鏄惁宸查鍙�
+        public byte GridLimitCnt;
+        public  tagMCTreasureGridLimit[] GridLimitCntList;        //鏈夐檺鍒舵娊鍙栨鏁扮殑鏍煎瓙娆℃暟淇℃伅
+    }
+
+    public struct tagMCTreasureGridLimit {
+        public byte GridNum;        // 鏈夐檺鍒舵娊鍙栨鏁扮殑鏍煎瓙缂栧彿
+        public ushort GridCnt;        // 宸叉娊鍒版鏁�
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA351_tagMCTreasureInfo.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA351_tagMCTreasureInfo.cs.meta
new file mode 100644
index 0000000..38fce29
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA351_tagMCTreasureInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: bda573ae76c7498489f0b11e1cdc7e72
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3BD_tagMCBuyEnterInfo.cs b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3BD_tagMCBuyEnterInfo.cs
new file mode 100644
index 0000000..91342ba
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3BD_tagMCBuyEnterInfo.cs
@@ -0,0 +1,29 @@
+using UnityEngine;
+using System.Collections;
+
+// A3 BD 閫氱煡鐜╁璐拱鍓湰杩涘叆娆℃暟 #tagMCBuyEnterInfo
+
+public class HA3BD_tagMCBuyEnterInfo : GameNetPackBasic {
+    public byte FBCount;    // 鍓湰涓暟
+    public  tagMCBuyInfo[] FBInfo;    // 鍓湰淇℃伅
+
+    public HA3BD_tagMCBuyEnterInfo () {
+        _cmd = (ushort)0xA3BD;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out FBCount, vBytes, NetDataType.BYTE);
+        FBInfo = new tagMCBuyInfo[FBCount];
+        for (int i = 0; i < FBCount; i ++) {
+            FBInfo[i] = new tagMCBuyInfo();
+            TransBytes (out FBInfo[i].FBID, vBytes, NetDataType.DWORD);
+            TransBytes (out FBInfo[i].BuyCount, vBytes, NetDataType.BYTE);
+        }
+    }
+
+    public struct tagMCBuyInfo {
+        public uint FBID;        // 鍓湰ID
+        public byte BuyCount;        // 宸茶喘涔版鏁�
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3BD_tagMCBuyEnterInfo.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3BD_tagMCBuyEnterInfo.cs.meta
new file mode 100644
index 0000000..27b656b
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3BD_tagMCBuyEnterInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 80576833514e12944a49e79b60783a0b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/HA4_Family.meta b/Main/Core/NetworkPackage/ServerPack/HA4_Family.meta
new file mode 100644
index 0000000..060d171
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA4_Family.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 0104877468a82854e89b3b06fae86dde
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/HA4_Family/HA401_tagGCViewFamilyRequestInfo.cs b/Main/Core/NetworkPackage/ServerPack/HA4_Family/HA401_tagGCViewFamilyRequestInfo.cs
new file mode 100644
index 0000000..68b1473
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA4_Family/HA401_tagGCViewFamilyRequestInfo.cs
@@ -0,0 +1,43 @@
+using UnityEngine;
+using System.Collections;
+
+//A4 01  鏌ョ湅鐢宠鍏ヤ細鐨勭帺瀹朵俊鎭� #tagGCViewFamilyRequestInfo
+
+public class HA401_tagGCViewFamilyRequestInfo : GameNetPackBasic {
+    public byte RequestMemberCount;    //鐢宠鎴愬憳鐨勬暟閲�
+    public  tagtMemberInfo[] MemberInfo;    //size = RequestMemberCount
+
+    public HA401_tagGCViewFamilyRequestInfo () {
+        _cmd = (ushort)0xA401;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out RequestMemberCount, vBytes, NetDataType.BYTE);
+        MemberInfo = new tagtMemberInfo[RequestMemberCount];
+        for (int i = 0; i < RequestMemberCount; i ++) {
+            MemberInfo[i] = new tagtMemberInfo();
+            TransBytes (out MemberInfo[i].PlayerID, vBytes, NetDataType.DWORD);
+            TransBytes (out MemberInfo[i].NameLen, vBytes, NetDataType.BYTE);
+            TransBytes (out MemberInfo[i].Name, vBytes, NetDataType.Chars, MemberInfo[i].NameLen);
+            TransBytes (out MemberInfo[i].PlayerLV, vBytes, NetDataType.WORD);
+            TransBytes (out MemberInfo[i].PlayeJob, vBytes, NetDataType.BYTE);
+            TransBytes (out MemberInfo[i].PlayeFightPower, vBytes, NetDataType.DWORD);
+            TransBytes (out MemberInfo[i].PlayeFightPowerEx, vBytes, NetDataType.DWORD);
+            TransBytes (out MemberInfo[i].RequestTime, vBytes, NetDataType.DWORD);
+            TransBytes (out MemberInfo[i].IsOnLine, vBytes, NetDataType.BYTE);
+        }
+    }
+
+    public struct tagtMemberInfo {
+        public uint PlayerID;        //鐜╁ID
+        public byte NameLen;        //鍚嶅瓧闀垮害
+        public string Name;        //size=NameLen
+        public ushort PlayerLV;        //鐜╁绛夌骇
+        public byte PlayeJob;        //鐜╁鑱屼笟
+        public uint PlayeFightPower;        //鐜╁鎴樻枟鍔涳紝姹備綑浜块儴鍒�
+        public uint PlayeFightPowerEx;        //鐜╁鎴樻枟鍔涳紝鏁撮櫎浜块儴鍒嗭紝1浠h〃1浜�
+        public uint RequestTime;        //鐢宠鏃堕棿
+        public byte IsOnLine;        //鏄惁鍦ㄧ嚎
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA4_Family/HA401_tagGCViewFamilyRequestInfo.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA4_Family/HA401_tagGCViewFamilyRequestInfo.cs.meta
new file mode 100644
index 0000000..a3b5943
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA4_Family/HA401_tagGCViewFamilyRequestInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: fb779807ef5c5d645bb800c1be9540f1
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/HA4_Family/HA403_tagGCFamilyActionInfo.cs b/Main/Core/NetworkPackage/ServerPack/HA4_Family/HA403_tagGCFamilyActionInfo.cs
new file mode 100644
index 0000000..d0d1237
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA4_Family/HA403_tagGCFamilyActionInfo.cs
@@ -0,0 +1,51 @@
+using UnityEngine;
+using System.Collections;
+
+// A4 03 瀹舵棌琛屼负淇℃伅 #tagGCFamilyActionInfo
+
+public class HA403_tagGCFamilyActionInfo : GameNetPackBasic {
+    public uint FamilyID;    //瀹舵棌ID
+    public byte ActionType;    //绫诲瀷
+    public ushort Count;    //鏁伴噺
+    public  tagGCFamilyAction[] FamilyActionList;    //size = Count	
+
+    public HA403_tagGCFamilyActionInfo () {
+        _cmd = (ushort)0xA403;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out FamilyID, vBytes, NetDataType.DWORD);
+        TransBytes (out ActionType, vBytes, NetDataType.BYTE);
+        TransBytes (out Count, vBytes, NetDataType.WORD);
+        FamilyActionList = new tagGCFamilyAction[Count];
+        for (int i = 0; i < Count; i ++) {
+            FamilyActionList[i] = new tagGCFamilyAction();
+            TransBytes (out FamilyActionList[i].Time, vBytes, NetDataType.DWORD);
+            TransBytes (out FamilyActionList[i].NameLen, vBytes, NetDataType.BYTE);
+            TransBytes (out FamilyActionList[i].Name, vBytes, NetDataType.Chars, FamilyActionList[i].NameLen);
+            TransBytes (out FamilyActionList[i].Value1, vBytes, NetDataType.DWORD);
+            TransBytes (out FamilyActionList[i].Value2, vBytes, NetDataType.DWORD);
+            TransBytes (out FamilyActionList[i].Value3, vBytes, NetDataType.DWORD);
+            TransBytes (out FamilyActionList[i].Value4, vBytes, NetDataType.DWORD);
+            TransBytes (out FamilyActionList[i].Value5, vBytes, NetDataType.DWORD);
+            TransBytes (out FamilyActionList[i].Value6, vBytes, NetDataType.DWORD);
+            TransBytes (out FamilyActionList[i].UseDataLen, vBytes, NetDataType.WORD);
+            TransBytes (out FamilyActionList[i].UseData, vBytes, NetDataType.Chars, FamilyActionList[i].UseDataLen);
+        }
+    }
+
+    public struct tagGCFamilyAction {
+        public uint Time;        //鏃堕棿
+        public byte NameLen;
+        public string Name;
+        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 ushort UseDataLen;
+        public string UseData;
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA4_Family/HA403_tagGCFamilyActionInfo.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA4_Family/HA403_tagGCFamilyActionInfo.cs.meta
new file mode 100644
index 0000000..e2d07c0
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA4_Family/HA403_tagGCFamilyActionInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 0cad2776dfad50f46b1afb2e93b10603
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/HA4_Family/HA408_tagGCPyAllFamilyView.cs b/Main/Core/NetworkPackage/ServerPack/HA4_Family/HA408_tagGCPyAllFamilyView.cs
new file mode 100644
index 0000000..564ff73
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA4_Family/HA408_tagGCPyAllFamilyView.cs
@@ -0,0 +1,61 @@
+using UnityEngine;
+using System.Collections;
+
+// A4 08 鏌ョ湅瀹舵棌 #tagGCPyAllFamilyView
+
+public class HA408_tagGCPyAllFamilyView : GameNetPackBasic {
+    public uint TotalCount;    //涓�鍏辨湁澶氬皯椤�
+    public ushort CurPage;    //褰撳墠绗嚑椤�, 姣忛〉涓暟:FAMILY_VIEW_PAGE_COUNT
+    public byte PageCount;    //杩欎竴椤垫湁澶氬皯鏁扮洰
+    public  tagGCPyFamilyView[] Family;    //size = PageCount
+    public byte IsSearching;    //鏄惁鍦ㄦā绯婃悳绱㈢姸鎬佷笅
+
+    public HA408_tagGCPyAllFamilyView () {
+        _cmd = (ushort)0xA408;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out TotalCount, vBytes, NetDataType.DWORD);
+        TransBytes (out CurPage, vBytes, NetDataType.WORD);
+        TransBytes (out PageCount, vBytes, NetDataType.BYTE);
+        Family = new tagGCPyFamilyView[PageCount];
+        for (int i = 0; i < PageCount; i ++) {
+            Family[i] = new tagGCPyFamilyView();
+            TransBytes (out Family[i].FamilyIndex, vBytes, NetDataType.WORD);
+            TransBytes (out Family[i].FamilyID, vBytes, NetDataType.DWORD);
+            TransBytes (out Family[i].FamilyNameLen, vBytes, NetDataType.BYTE);
+            TransBytes (out Family[i].FamilyName, vBytes, NetDataType.Chars, Family[i].FamilyNameLen);
+            TransBytes (out Family[i].LeaderID, vBytes, NetDataType.DWORD);
+            TransBytes (out Family[i].LeaderNameLen, vBytes, NetDataType.BYTE);
+            TransBytes (out Family[i].LeaderName, vBytes, NetDataType.Chars, Family[i].LeaderNameLen);
+            TransBytes (out Family[i].LeaderOfficialRank, vBytes, NetDataType.BYTE);
+            TransBytes (out Family[i].FamilyLV, vBytes, NetDataType.WORD);
+            TransBytes (out Family[i].FamilyMemberCount, vBytes, NetDataType.WORD);
+            TransBytes (out Family[i].JoinAccept, vBytes, NetDataType.BYTE);
+            TransBytes (out Family[i].WarRank, vBytes, NetDataType.BYTE);
+            TransBytes (out Family[i].TotalFightPower, vBytes, NetDataType.DWORD);
+            TransBytes (out Family[i].TotalFightPowerEx, vBytes, NetDataType.DWORD);
+            TransBytes (out Family[i].EmblemID, vBytes, NetDataType.BYTE);
+        }
+        TransBytes (out IsSearching, vBytes, NetDataType.BYTE);
+    }
+
+    public struct tagGCPyFamilyView {
+        public ushort FamilyIndex;
+        public uint FamilyID;        //瀹舵棌ID
+        public byte FamilyNameLen;
+        public string FamilyName;        //size = FamilyNameLen
+        public uint LeaderID;        //鏃忛暱ID
+        public byte LeaderNameLen;
+        public string LeaderName;        //size = LeaderNameLen
+        public byte LeaderOfficialRank;        //澧冪晫
+        public ushort FamilyLV;        //瀹舵棌绛夌骇
+        public ushort FamilyMemberCount;        //瀹舵棌浜烘暟
+        public byte JoinAccept;        //鐢宠鐘舵��
+        public byte WarRank;        //鑱旇禌鎺掑悕
+        public uint TotalFightPower;        //鎬绘垬鍔涳紝涓嶈冻1涓嚎鐨勯儴鍒�
+        public uint TotalFightPowerEx;        //鎬绘垬鍔涚偣锛�1鐐�=1浜�
+        public byte EmblemID;        //寰界珷ID
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA4_Family/HA408_tagGCPyAllFamilyView.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA4_Family/HA408_tagGCPyAllFamilyView.cs.meta
new file mode 100644
index 0000000..678fa24
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA4_Family/HA408_tagGCPyAllFamilyView.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: b51502160c7609d4887c91c073d3c368
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/HA4_Family/HA40D_tagGCServerCreatFamilyTimes.cs b/Main/Core/NetworkPackage/ServerPack/HA4_Family/HA40D_tagGCServerCreatFamilyTimes.cs
new file mode 100644
index 0000000..7e90940
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA4_Family/HA40D_tagGCServerCreatFamilyTimes.cs
@@ -0,0 +1,17 @@
+using UnityEngine;
+using System.Collections;
+
+// A4 0D 閫氱煡寤虹洘娆℃暟 #tagGCServerCreatFamilyTimes
+
+public class HA40D_tagGCServerCreatFamilyTimes : GameNetPackBasic {
+    public uint Times;    //寤虹洘娆℃暟
+
+    public HA40D_tagGCServerCreatFamilyTimes () {
+        _cmd = (ushort)0xA40D;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out Times, vBytes, NetDataType.DWORD);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA4_Family/HA40D_tagGCServerCreatFamilyTimes.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA4_Family/HA40D_tagGCServerCreatFamilyTimes.cs.meta
new file mode 100644
index 0000000..390e73e
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA4_Family/HA40D_tagGCServerCreatFamilyTimes.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f2706ea0c5db130479182de47640b14b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/HA5_Family.meta b/Main/Core/NetworkPackage/ServerPack/HA5_Family.meta
new file mode 100644
index 0000000..ac92f33
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA5_Family.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 8cb3012ef0278a84386a3d2333385eb8
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA501_tagMCNotifyRequestJoinFamilyInfo.cs b/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA501_tagMCNotifyRequestJoinFamilyInfo.cs
new file mode 100644
index 0000000..ef7e9af
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA501_tagMCNotifyRequestJoinFamilyInfo.cs
@@ -0,0 +1,19 @@
+using UnityEngine;
+using System.Collections;
+
+//A5 01 宸茬敵璇峰姞鍏ョ殑瀹舵棌淇℃伅 #tagMCNotifyRequestJoinFamilyInfo
+
+public class HA501_tagMCNotifyRequestJoinFamilyInfo : GameNetPackBasic {
+    public byte RequestCount;    //鐢宠鐨勬暟閲�
+    public  uint[] RequestJoinFamilyIDList;    //size = RequestCount
+
+    public HA501_tagMCNotifyRequestJoinFamilyInfo () {
+        _cmd = (ushort)0xA501;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out RequestCount, vBytes, NetDataType.BYTE);
+        TransBytes (out RequestJoinFamilyIDList, vBytes, NetDataType.DWORD, RequestCount);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA501_tagMCNotifyRequestJoinFamilyInfo.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA501_tagMCNotifyRequestJoinFamilyInfo.cs.meta
new file mode 100644
index 0000000..e757ee1
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA5_Family/HA501_tagMCNotifyRequestJoinFamilyInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ad5cdc672228430469644d061e23152f
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA721_tagMCEmojiPackInfo.cs b/Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA721_tagMCEmojiPackInfo.cs
new file mode 100644
index 0000000..38c4349
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA721_tagMCEmojiPackInfo.cs
@@ -0,0 +1,31 @@
+using UnityEngine;
+using System.Collections;
+
+// A7 21 琛ㄦ儏鍖呬俊鎭� #tagMCEmojiPackInfo
+
+public class HA721_tagMCEmojiPackInfo : GameNetPackBasic {
+    public byte Count;
+    public  tagMCEmojiPack[] EmojiPackList;
+
+    public HA721_tagMCEmojiPackInfo () {
+        _cmd = (ushort)0xA721;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out Count, vBytes, NetDataType.BYTE);
+        EmojiPackList = new tagMCEmojiPack[Count];
+        for (int i = 0; i < Count; i ++) {
+            EmojiPackList[i] = new tagMCEmojiPack();
+            TransBytes (out EmojiPackList[i].PackID, vBytes, NetDataType.BYTE);
+            TransBytes (out EmojiPackList[i].State, vBytes, NetDataType.BYTE);
+            TransBytes (out EmojiPackList[i].EndTime, vBytes, NetDataType.DWORD);
+        }
+    }
+
+    public struct tagMCEmojiPack {
+        public byte PackID;        //琛ㄦ儏鍖匢D
+        public byte State;        //鏄惁宸叉縺娲�
+        public uint EndTime;        //鍒版湡鏃堕棿鎴筹紝0涓烘案涔�
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA721_tagMCEmojiPackInfo.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA721_tagMCEmojiPackInfo.cs.meta
new file mode 100644
index 0000000..1e6bcbf
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA721_tagMCEmojiPackInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: c33dee2148092354f9d6f8404713ea4a
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/HA8_Item/HA802_tagMCShopItemDayBuyCntInfo.cs b/Main/Core/NetworkPackage/ServerPack/HA8_Item/HA802_tagMCShopItemDayBuyCntInfo.cs
new file mode 100644
index 0000000..901abf8
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA8_Item/HA802_tagMCShopItemDayBuyCntInfo.cs
@@ -0,0 +1,31 @@
+using UnityEngine;
+using System.Collections;
+
+// A8 02 閫氱煡NPC鍟嗗簵鐗╁搧浠婃棩宸茶喘涔版鏁� #tagMCShopItemDayBuyCntInfo
+
+public class HA802_tagMCShopItemDayBuyCntInfo : GameNetPackBasic {
+    public ushort Count;    //閫氱煡涓暟锛屾敞鎰忎笉闄愬埗姣忔棩璐拱娆℃暟鐨勯粯璁や笉閫氱煡
+    public  tagMCShopItemDayBuyCnt[] DayBuyCntList;
+
+    public HA802_tagMCShopItemDayBuyCntInfo () {
+        _cmd = (ushort)0xA802;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out Count, vBytes, NetDataType.WORD);
+        DayBuyCntList = new tagMCShopItemDayBuyCnt[Count];
+        for (int i = 0; i < Count; i ++) {
+            DayBuyCntList[i] = new tagMCShopItemDayBuyCnt();
+            TransBytes (out DayBuyCntList[i].ItemIndex, vBytes, NetDataType.DWORD);
+            TransBytes (out DayBuyCntList[i].BuyCnt, vBytes, NetDataType.DWORD);
+            TransBytes (out DayBuyCntList[i].IsReset, vBytes, NetDataType.BYTE);
+        }
+    }
+
+    public struct tagMCShopItemDayBuyCnt {
+        public uint ItemIndex;
+        public uint BuyCnt;        // 浠婃棩宸茶喘涔版鏁�
+        public byte IsReset;        //鏄惁閲嶇疆
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA8_Item/HA802_tagMCShopItemDayBuyCntInfo.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA8_Item/HA802_tagMCShopItemDayBuyCntInfo.cs.meta
new file mode 100644
index 0000000..80dfcd7
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA8_Item/HA802_tagMCShopItemDayBuyCntInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: cbdb66c5b2f98534ca9f73a2b9b281e0
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/HA8_Item/HA811_tagMCShoppingResult.cs b/Main/Core/NetworkPackage/ServerPack/HA8_Item/HA811_tagMCShoppingResult.cs
new file mode 100644
index 0000000..a0592ff
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA8_Item/HA811_tagMCShoppingResult.cs
@@ -0,0 +1,19 @@
+using UnityEngine;
+using System.Collections;
+
+// A8 11 鍟嗗簵璐拱缁撴灉 #tagMCShoppingResult
+
+public class HA811_tagMCShoppingResult : GameNetPackBasic {
+    public uint ItemIndex;
+    public uint ItemCnt;    //璐拱鏁伴噺
+
+    public HA811_tagMCShoppingResult () {
+        _cmd = (ushort)0xA811;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out ItemIndex, vBytes, NetDataType.DWORD);
+        TransBytes (out ItemCnt, vBytes, NetDataType.DWORD);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA8_Item/HA811_tagMCShoppingResult.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA8_Item/HA811_tagMCShoppingResult.cs.meta
new file mode 100644
index 0000000..19048ca
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA8_Item/HA811_tagMCShoppingResult.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d60a47c2cc066fd4591828a8598e0759
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA01_tagMCTotalLoginDayCntInfo.cs b/Main/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA01_tagMCTotalLoginDayCntInfo.cs
new file mode 100644
index 0000000..ef3672f
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA01_tagMCTotalLoginDayCntInfo.cs
@@ -0,0 +1,19 @@
+using UnityEngine;
+using System.Collections;
+
+//AA 01 绱鐧婚檰澶╂暟淇℃伅 #tagMCTotalLoginDayCntInfo
+
+public class HAA01_tagMCTotalLoginDayCntInfo : GameNetPackBasic {
+    public ushort DayCnt;    //绱鐧婚檰澶╂暟
+    public ushort AwardInfo;    //鐧婚檰棰嗗彇鎯呭喌
+
+    public HAA01_tagMCTotalLoginDayCntInfo () {
+        _cmd = (ushort)0xAA01;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out DayCnt, vBytes, NetDataType.WORD);
+        TransBytes (out AwardInfo, vBytes, NetDataType.WORD);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA01_tagMCTotalLoginDayCntInfo.cs.meta b/Main/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA01_tagMCTotalLoginDayCntInfo.cs.meta
new file mode 100644
index 0000000..75cd5ad
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA01_tagMCTotalLoginDayCntInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 9850c1ba7bfe50241a3fc316683f425b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA03_tagMCDailyPackBuyGiftInfo.cs b/Main/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA03_tagMCDailyPackBuyGiftInfo.cs
new file mode 100644
index 0000000..c5ace0d
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA03_tagMCDailyPackBuyGiftInfo.cs
@@ -0,0 +1,21 @@
+using UnityEngine;
+using System.Collections;
+
+// AA 03 姣忔棩鎵撳寘鐩磋喘绀煎寘 #tagMCDailyPackBuyGiftInfo
+
+public class HAA03_tagMCDailyPackBuyGiftInfo : GameNetPackBasic {
+    public uint PackBuyTime;    // 鎵撳寘璐拱鐨勬椂闂存埑锛屽鏋滄湁璇ュ�硷紝浠h〃宸茬粡涓�娆℃�ф墦鍖呰喘涔颁簡锛屽彲鏍规嵁娆℃椂闂存埑绠楀嚭褰撳墠鏄鍑犲ぉ
+    public uint BuyStateToday;    // 浠婃棩绀煎寘璐拱鐘舵�侊紝鎸夌ぜ鍖呯储寮曚簩杩涘埗浣嶈绠椾唬琛ㄦ槸鍚﹀凡璐拱锛屼粎闈炴墦鍖呰喘涔扮姸鎬佷笅鏈夌敤
+    public uint AwardState;    // 浠婃棩绀煎寘棰嗗鐘舵�侊紝鎸夌ぜ鍖呯储寮曚簩杩涘埗浣嶈绠椾唬琛ㄦ槸鍚﹀凡棰嗗彇
+
+    public HAA03_tagMCDailyPackBuyGiftInfo () {
+        _cmd = (ushort)0xAA03;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out PackBuyTime, vBytes, NetDataType.DWORD);
+        TransBytes (out BuyStateToday, vBytes, NetDataType.DWORD);
+        TransBytes (out AwardState, vBytes, NetDataType.DWORD);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA03_tagMCDailyPackBuyGiftInfo.cs.meta b/Main/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA03_tagMCDailyPackBuyGiftInfo.cs.meta
new file mode 100644
index 0000000..353869e
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HAA_SaleActivity/HAA03_tagMCDailyPackBuyGiftInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 3251d66348da046409ba03bd7a29e5cc
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/HB1_Role/HB117_tagMCFaceInfo.cs b/Main/Core/NetworkPackage/ServerPack/HB1_Role/HB117_tagMCFaceInfo.cs
new file mode 100644
index 0000000..6f64ecb
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HB1_Role/HB117_tagMCFaceInfo.cs
@@ -0,0 +1,33 @@
+using UnityEngine;
+using System.Collections;
+
+// B1 17 澶村儚淇℃伅 #tagMCFaceInfo
+
+public class HB117_tagMCFaceInfo : GameNetPackBasic {
+    public byte Count;
+    public  tagMCFace[] FaceList;
+
+    public HB117_tagMCFaceInfo () {
+        _cmd = (ushort)0xB117;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out Count, vBytes, NetDataType.BYTE);
+        FaceList = new tagMCFace[Count];
+        for (int i = 0; i < Count; i ++) {
+            FaceList[i] = new tagMCFace();
+            TransBytes (out FaceList[i].FaceID, vBytes, NetDataType.DWORD);
+            TransBytes (out FaceList[i].State, vBytes, NetDataType.BYTE);
+            TransBytes (out FaceList[i].EndTime, vBytes, NetDataType.DWORD);
+            TransBytes (out FaceList[i].Star, vBytes, NetDataType.BYTE);
+        }
+    }
+
+    public struct tagMCFace {
+        public uint FaceID;        //澶村儚ID
+        public byte State;        //鏄惁宸叉縺娲�
+        public uint EndTime;        //鍒版湡鏃堕棿鎴筹紝0涓烘案涔�
+        public byte Star;        //鏄熺骇
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HB1_Role/HB117_tagMCFaceInfo.cs.meta b/Main/Core/NetworkPackage/ServerPack/HB1_Role/HB117_tagMCFaceInfo.cs.meta
new file mode 100644
index 0000000..1603b46
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HB1_Role/HB117_tagMCFaceInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 2f4717fe26fb26a4ca7383abc2c6c325
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/HB1_Role/HB118_tagMCFacePicInfo.cs b/Main/Core/NetworkPackage/ServerPack/HB1_Role/HB118_tagMCFacePicInfo.cs
new file mode 100644
index 0000000..aa27131
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HB1_Role/HB118_tagMCFacePicInfo.cs
@@ -0,0 +1,33 @@
+using UnityEngine;
+using System.Collections;
+
+// B1 18 澶村儚妗嗕俊鎭� #tagMCFacePicInfo
+
+public class HB118_tagMCFacePicInfo : GameNetPackBasic {
+    public byte Count;
+    public  tagMCFacePic[] FacePicList;
+
+    public HB118_tagMCFacePicInfo () {
+        _cmd = (ushort)0xB118;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out Count, vBytes, NetDataType.BYTE);
+        FacePicList = new tagMCFacePic[Count];
+        for (int i = 0; i < Count; i ++) {
+            FacePicList[i] = new tagMCFacePic();
+            TransBytes (out FacePicList[i].FacePicID, vBytes, NetDataType.DWORD);
+            TransBytes (out FacePicList[i].State, vBytes, NetDataType.BYTE);
+            TransBytes (out FacePicList[i].EndTime, vBytes, NetDataType.DWORD);
+            TransBytes (out FacePicList[i].Star, vBytes, NetDataType.BYTE);
+        }
+    }
+
+    public struct tagMCFacePic {
+        public uint FacePicID;        //澶村儚妗咺D
+        public byte State;        //鏄惁宸叉縺娲�
+        public uint EndTime;        //鍒版湡鏃堕棿鎴筹紝0涓烘案涔�
+        public byte Star;        //鏄熺骇
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HB1_Role/HB118_tagMCFacePicInfo.cs.meta b/Main/Core/NetworkPackage/ServerPack/HB1_Role/HB118_tagMCFacePicInfo.cs.meta
new file mode 100644
index 0000000..e861c73
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HB1_Role/HB118_tagMCFacePicInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: b394ab9b3d94b834d9d549a52fcd7aca
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/HB1_Role/HB120_tagMCZhanlingInfo.cs b/Main/Core/NetworkPackage/ServerPack/HB1_Role/HB120_tagMCZhanlingInfo.cs
new file mode 100644
index 0000000..54c82cd
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HB1_Role/HB120_tagMCZhanlingInfo.cs
@@ -0,0 +1,43 @@
+using UnityEngine;
+using System.Collections;
+
+// B1 20 鎴樹护淇℃伅 #tagMCZhanlingInfo
+
+public class HB120_tagMCZhanlingInfo : GameNetPackBasic {
+    public byte ZhanlingType;    // 鎴樹护绫诲瀷
+    public byte IsActivite;    // 鏅�氭垬浠ゆ槸鍚﹀凡婵�娲�
+    public byte IsActiviteH;    // 楂樼骇鎴樹护鏄惁宸叉縺娲�
+    public uint AllFinishTime;    // 鍏ㄩ儴濂栧姳棰嗗彇瀹屾瘯鐨勬椂闂存埑锛屾湭瀹屾瘯鏃惰鍊间负0锛屽悗绔細鍦�0鐐硅繃澶╂椂妫�鏌ュ彲鍚﹂噸缃紝鍓嶇鑷鍋氬�掕鏃惰〃鐜板嵆鍙�
+    public uint Value1;    // 鎴樹护瀵瑰簲鐨勮嚜瀹氫箟鍊硷紝鍙�夛紝濡傜櫥褰曟垬浠や唬琛ㄥ紑濮嬭绠楁棩鏈熸椂闂存埑
+    public ushort RewardCount;
+    public  tagMCZhanling[] RewardList;
+
+    public HB120_tagMCZhanlingInfo () {
+        _cmd = (ushort)0xB120;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out ZhanlingType, vBytes, NetDataType.BYTE);
+        TransBytes (out IsActivite, vBytes, NetDataType.BYTE);
+        TransBytes (out IsActiviteH, vBytes, NetDataType.BYTE);
+        TransBytes (out AllFinishTime, vBytes, NetDataType.DWORD);
+        TransBytes (out Value1, vBytes, NetDataType.DWORD);
+        TransBytes (out RewardCount, vBytes, NetDataType.WORD);
+        RewardList = new tagMCZhanling[RewardCount];
+        for (int i = 0; i < RewardCount; i ++) {
+            RewardList[i] = new tagMCZhanling();
+            TransBytes (out RewardList[i].NeedValue, vBytes, NetDataType.DWORD);
+            TransBytes (out RewardList[i].FreeRewardState, vBytes, NetDataType.BYTE);
+            TransBytes (out RewardList[i].ZLRewardState, vBytes, NetDataType.BYTE);
+            TransBytes (out RewardList[i].ZLRewardStateH, vBytes, NetDataType.BYTE);
+        }
+    }
+
+    public struct tagMCZhanling {
+        public uint NeedValue;        // 濂栧姳鎵�闇�鍊�
+        public byte FreeRewardState;        // 鍏嶈垂鎴樹护濂栧姳鏄惁宸查鍙�
+        public byte ZLRewardState;        // 鏅�氭垬浠ゅ鍔辨槸鍚﹀凡棰嗗彇
+        public byte ZLRewardStateH;        // 楂樼骇鎴樹护濂栧姳鏄惁宸查鍙�
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HB1_Role/HB120_tagMCZhanlingInfo.cs.meta b/Main/Core/NetworkPackage/ServerPack/HB1_Role/HB120_tagMCZhanlingInfo.cs.meta
new file mode 100644
index 0000000..7fa2e84
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HB1_Role/HB120_tagMCZhanlingInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 0e071807fae559549967fa314e4a8105
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Main.cs b/Main/Main.cs
index 6260096..9500691 100644
--- a/Main/Main.cs
+++ b/Main/Main.cs
@@ -48,6 +48,25 @@
         managers.Add(RoleParticularModel.Instance);
         managers.Add(RechargeManager.Instance);
         managers.Add(RoleParticularModel.Instance);
+        managers.Add(StoreModel.Instance);
+        managers.Add(PhantasmPavilionModel.Instance);
+        managers.Add(FairyModel.Instance);
+        managers.Add(TeamManager.Instance);
+        managers.Add(TaskManager.Instance);
+        managers.Add(DailySpecialsModel.Instance);
+        managers.Add(MailManager.Instance);
+        managers.Add(PackManager.Instance);
+        managers.Add(HappyXBModel.Instance);
+        managers.Add(HeroManager.Instance);
+        managers.Add(GMCmdManager.Instance);
+        managers.Add(FairyEmblemModel.Instance);
+        managers.Add(EquipModel.Instance);
+        managers.Add(DungeonModel.Instance);
+        managers.Add(DailyQuestModel.Instance);
+        managers.Add(CustomizedRechargeModel.Instance);
+        managers.Add(CustomizedGiftModel.Instance);
+        managers.Add(ChatManager.Instance);
+        managers.Add(ChatBubbleManager.Instance);
 
         foreach (var manager in managers)
         {
diff --git a/Main/System/DailyQuest.meta b/Main/System/DailyQuest.meta
new file mode 100644
index 0000000..8bb3338
--- /dev/null
+++ b/Main/System/DailyQuest.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: d0cbf67f727be8d4cb2114b8c96e9d04
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/DailyQuest/DailyQuestData.cs b/Main/System/DailyQuest/DailyQuestData.cs
new file mode 100644
index 0000000..b3a96ec
--- /dev/null
+++ b/Main/System/DailyQuest/DailyQuestData.cs
@@ -0,0 +1,314 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using System;
+using System.Text.RegularExpressions;
+
+
+using LitJson;
+
+public class DailyQuestData
+{
+    public int id { get; private set; }
+    public Redpoint redpoint { get; private set; }
+
+    public DailyQuestData(int _id)
+    {
+        this.id = _id;
+    }
+
+    public DailyQuestData(int _id, int _redpointId, int _parentRedpoint)
+    {
+        this.id = _id;
+        this.redpoint = new Redpoint(_parentRedpoint, _redpointId);
+    }
+
+    public void UpdateRedpointState(RedPointState _redpointState)
+    {
+        if (this.redpoint != null)
+        {
+            this.redpoint.state = _redpointState;
+        }
+    }
+
+}
+
+public class DailyQuestActiveValueReward
+{
+    public int id { get; private set; }
+
+    bool m_Got = false;
+    public bool got {
+        get { return this.m_Got; }
+        set { this.m_Got = value; }
+    }
+
+    public DailyQuestActiveValueReward(int _id)
+    {
+        this.id = _id;
+    }
+}
+
+public struct DailyQuestTimes
+{
+    public int completeTimes;
+    public int dayBuyTimes;
+    public int dayUseItemTimes;
+}
+
+public class DailyQuestOpenTime
+{
+    public int id;
+    public bool always;
+
+    //甯歌鐨勬椿鍔ㄦ椂闂达紝key鏄槦鏈焫
+    Dictionary<int, List<HourMinute>> openTimes = new Dictionary<int, List<HourMinute>>();
+
+    public DailyQuestOpenTime(int _id)
+    {
+        this.id = _id;
+    }
+
+    public void ParseQuestNormalOpenTime(DailyQuestOpenTimeConfig activityOpenTime)
+    {
+        string timeString = activityOpenTime.OpenTime;
+        int duration = activityOpenTime.Duration;
+        var matches = Regex.Matches(timeString, "\\\"[0-9]\\\":\\[[0-9|,|\\[|\\]]+");
+        always = matches.Count == 0;
+
+        for (int i = 0; i < matches.Count; i++)
+        {
+            var match = matches[i];
+            var stringArray = match.Value.Split(':');
+
+            var week = 0;
+            var weekMatch = Regex.Match(stringArray[0], "[0-9]");
+            int.TryParse(weekMatch.Value, out week);
+
+            if (week == 0)
+            {
+                var subMatches = Regex.Matches(stringArray[1], "[0-9]{1,2},[0-9]{1,2}");
+                var tempHourMinutes = new List<HourMinute>();
+
+                for (int j = 0; j < subMatches.Count; j++)
+                {
+                    tempHourMinutes.Add(new HourMinute(subMatches[j].Value, duration));
+                }
+
+                tempHourMinutes.Sort((HourMinute a, HourMinute b) => { return HourMinute.Compare(a, b); });
+
+                for (int j = 0; j < 7; j++)
+                {
+                    var hourMinutes = openTimes[j] = new List<HourMinute>(tempHourMinutes);
+                }
+            }
+            else
+            {
+                var hourMinutes = openTimes[week % 7] = new List<HourMinute>();
+                var subMatches = Regex.Matches(stringArray[1], "[0-9]{1,2},[0-9]{1,2}");
+
+                for (int j = 0; j < subMatches.Count; j++)
+                {
+                    hourMinutes.Add(new HourMinute(subMatches[j].Value, duration));
+                }
+
+                hourMinutes.Sort((HourMinute a, HourMinute b) => { return HourMinute.Compare(a, b); });
+            }
+        }
+    }
+
+    
+
+
+
+    // 鏀规垚鍒ゆ柇鏃ュ父娲诲姩ID涓嶅湪瀹氬埗涓厤缃垯瀹氬埗鏈熼棿姝e父寮�鍚�
+    public bool InOpenTime()
+    {
+        if (always)
+        {
+            return true;
+        }
+
+        
+        return IsNormalOpenTime();
+
+    }
+
+    //鏃ュ父娲诲姩寮�鍚垽鏂�
+    private bool IsNormalOpenTime()
+    {
+        var dayOfWeek = (int)TimeUtility.ServerNow.DayOfWeek;
+        if (!openTimes.ContainsKey(dayOfWeek))
+        {
+            return false;
+        }
+        else
+        {
+            var hourMinutes = openTimes[dayOfWeek];
+            for (int i = 0; i < hourMinutes.Count; i++)
+            {
+                if (hourMinutes[i].InOpenTime())
+                {
+                    return true;
+                }
+            }
+
+            return false;
+        }
+    }
+
+
+    public bool TryGetTodayNearestOpenTime(out HourMinute _hourMinute)
+    {
+        
+        var dayOfWeek = (int)TimeUtility.ServerNow.DayOfWeek;
+        if (!openTimes.ContainsKey(dayOfWeek))
+        {
+            _hourMinute = default(HourMinute);
+            return false;
+        }
+
+        var hour = TimeUtility.ServerNow.Hour;
+        var minute = TimeUtility.ServerNow.Minute;
+        var hourMinutes = openTimes[dayOfWeek];
+        _hourMinute = hourMinutes[hourMinutes.Count - 1];
+        for (int i = 0; i < hourMinutes.Count; i++)
+        {
+            var hourMinute = hourMinutes[i];
+            if (hour < hourMinute.hourEnd || (hour == hourMinute.hourEnd && minute <= hourMinute.minuteEnd))
+            {
+                _hourMinute = hourMinute;
+                break;
+            }
+        }
+
+        return true;
+
+    }
+
+
+
+    public List<HourMinute> GetNormalHourMinutes()
+    {
+        foreach (var hourMinutes in openTimes.Values)
+        {
+            if (hourMinutes != null)
+            {
+                return hourMinutes;
+            }
+        }
+        return null;
+    }
+}
+
+public struct HourMinute
+{
+    public int hourBegin;
+    public int minuteBegin;
+    public int hourEnd;
+    public int minuteEnd;
+    public bool wholeDay;
+
+    public HourMinute(string _input, int _duration)
+    {
+        var matches = Regex.Matches(_input, "[0-9]{1,2}");
+        if (matches.Count >= 2)
+        {
+            hourBegin = int.Parse(matches[0].Value);
+            minuteBegin = int.Parse(matches[1].Value);
+
+            hourEnd = hourBegin + _duration / 60;
+            minuteEnd = minuteBegin + _duration % 60;
+            if (minuteEnd >= 60)
+            {
+                minuteEnd = minuteEnd % 60;
+                hourEnd += 1;
+            }
+
+            wholeDay = false;
+        }
+        else
+        {
+            hourBegin = 0;
+            minuteBegin = 0;
+            hourEnd = 0;
+            minuteEnd = 0;
+
+            wholeDay = true;
+        }
+    }
+
+    public HourMinute(int _hourBegin, int _minuteBegin, int _hourEnd, int _minuteEnd)
+    {
+        hourBegin = _hourBegin;
+        minuteBegin = _minuteBegin;
+        hourEnd = _hourEnd;
+        minuteEnd = _minuteEnd;
+
+        wholeDay = hourBegin == 0 && minuteBegin == 0 && hourEnd == 0 && minuteEnd == 0;
+
+    }
+
+    public bool InOpenTime()
+    {
+        if (wholeDay)
+        {
+            return true;
+        }
+        else
+        {
+            var minutes = TimeUtility.ServerNow.Hour * 60 + TimeUtility.ServerNow.Minute;
+            if ((hourBegin * 60 + minuteBegin) <= minutes && (hourEnd * 60 + minuteEnd) > minutes)
+            {
+                return true;
+            }
+            else
+            {
+                return false;
+            }
+        }
+    }
+
+    public bool AfterOpenTime(int hour, int minute)
+    {
+        if (wholeDay)
+        {
+            return false;
+        }
+        else
+        {
+            var minutes = hour * 60 + minute;
+            return (hourEnd * 60 + minuteEnd) <= minutes;
+        }
+    }
+
+    public override string ToString()
+    {
+        var minuteBeginStr = minuteBegin > 9 ? minuteBegin.ToString() : StringUtility.Contact("0", minuteBegin);
+        var minuteEndStr = minuteEnd > 9 ? minuteEnd.ToString() : StringUtility.Contact("0", minuteEnd);
+        return StringUtility.Contact(hourBegin, ":", minuteBeginStr, "--", hourEnd, ":", minuteEndStr);
+    }
+
+    public string ToOpenTime()
+    {
+        if (minuteBegin < 10)
+        {
+            return StringUtility.Contact(hourBegin, ":0", minuteBegin);
+        }
+        else
+        {
+            return StringUtility.Contact(hourBegin, ":", minuteBegin);
+        }
+    }
+
+    public static int Compare(HourMinute _lhs, HourMinute _rhs)
+    {
+        return (_lhs.hourBegin * 60 + _lhs.minuteBegin) < (_rhs.hourBegin * 60 + _rhs.minuteBegin) ? -1 : 1;
+    }
+
+}
+
+
+
+
+
diff --git a/Main/System/DailyQuest/DailyQuestData.cs.meta b/Main/System/DailyQuest/DailyQuestData.cs.meta
new file mode 100644
index 0000000..fd15056
--- /dev/null
+++ b/Main/System/DailyQuest/DailyQuestData.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: bb67339815cd5aa4db4f68442219a4b3
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/DailyQuest/DailyQuestModel.cs b/Main/System/DailyQuest/DailyQuestModel.cs
new file mode 100644
index 0000000..d517c5d
--- /dev/null
+++ b/Main/System/DailyQuest/DailyQuestModel.cs
@@ -0,0 +1,216 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using System;
+using LitJson;
+
+
+public class DailyQuestModel : GameSystemManager<DailyQuestModel>
+{
+    const int EVERYDAY_REDPOINTID = 78001;
+    const int DAILYQUEST_REDPOINTIDBASE = 78100;
+    const int ACTIVEVALUE_REDPOINT = 78004;
+
+    Redpoint activeValueRedpoint = new Redpoint(EVERYDAY_REDPOINTID, ACTIVEVALUE_REDPOINT); //娲昏穬搴﹀鍔辩孩鐐�
+
+    int m_DailyQuestTotalActiveValue = 0;
+    public int dailyQuestTotalActiveValue
+    {
+        get { return m_DailyQuestTotalActiveValue; }
+    }
+
+    Dictionary<int, DailyQuestTimes> dailyQuestTimes = new Dictionary<int, DailyQuestTimes>();//闄や簡鍓湰鐨勫叾浠栦换鍔℃斁鍦ㄨ繖閲�
+    Dictionary<int, int> dailyActionToDailyQuestTable = new Dictionary<int, int>();
+    List<int> DailyQuestLVList = new List<int>();
+    Dictionary<int, DailyQuestOpenTime> dailyQuestOpenTimes = new Dictionary<int, DailyQuestOpenTime>();
+    Dictionary<int, DailyQuestData> dailyQuests = new Dictionary<int, DailyQuestData>();
+    List<DailyQuestActiveValueReward> dailyQuestActiveValueRewards = new List<DailyQuestActiveValueReward>();
+
+
+    int m_CurrentRewardStageIndex = 0;
+    public int currentRewardStageIndex
+    {
+        get { return m_CurrentRewardStageIndex; }
+        private set { m_CurrentRewardStageIndex = value; }
+    }
+
+    int m_CurrentActiveValue = 0;
+    public int currentActiveValue
+    {
+        get { return m_CurrentActiveValue; }
+        private set
+        {
+            if (m_CurrentActiveValue != value)
+            {
+                m_CurrentActiveValue = value;
+
+                if (currentActiveValueUpdateEvent != null)
+                {
+                    currentActiveValueUpdateEvent();
+                }
+            }
+        }
+    }
+
+    public event Action<int> dailyQuestProgressUpdateEvent;
+    public event Action currentActiveValueUpdateEvent;
+
+    public override void Init()
+    {
+        ParseConfig();
+    }
+
+    public override void Release()
+    {
+    }
+
+    private void ParseConfig()
+    {
+        var allConfigs = DailyQuestConfig.GetValues();
+        var redpointIndex = 1;
+        foreach (var config in allConfigs)
+        {
+            if (VersionConfig.Get().isBanShu && config.ID == 12)
+            {
+                continue;
+            }
+
+            var openTime = default(DailyQuestOpenTime);
+
+            switch (config.RelatedType)
+            {
+                case 1:
+                    var NeedLV = GetDailyQuestLV(config.ID);
+                    if (!DailyQuestLVList.Contains(NeedLV))
+                    {
+                        bool bIsAdd = false;
+                        for (int i = 0; i < DailyQuestLVList.Count; i++)
+                        {
+                            if (NeedLV < DailyQuestLVList[i])
+                            {
+                                DailyQuestLVList.Insert(i, NeedLV);
+                                bIsAdd = true;
+                                break;
+                            }
+                        }
+                        if (!bIsAdd)
+                        {
+                            DailyQuestLVList.Add(NeedLV);
+                        }
+
+                    }
+
+                    var activityOpenTime = DailyQuestOpenTimeConfig.Get(config.RelatedID);
+                    openTime = dailyQuestOpenTimes[config.ID] = new DailyQuestOpenTime(config.ID);
+                    openTime.ParseQuestNormalOpenTime(activityOpenTime);
+                    dailyActionToDailyQuestTable[config.RelatedID] = config.ID;
+                    break;
+                case 2:
+
+                    break;
+            }
+
+            dailyQuests[config.ID] = new DailyQuestData(config.ID, DAILYQUEST_REDPOINTIDBASE + redpointIndex++, EVERYDAY_REDPOINTID);
+        }
+
+        var allRewardKeys = DailyLivenessRewardConfig.GetKeys();
+        m_DailyQuestTotalActiveValue = DailyLivenessRewardConfig.Get(allRewardKeys[allRewardKeys.Count - 1]).Liveness;
+
+        var values = DailyLivenessRewardConfig.GetValues();
+        for (int i = 0; i < allRewardKeys.Count; i++)
+        {
+            var config = DailyLivenessRewardConfig.Get(allRewardKeys[i]);
+            dailyQuestActiveValueRewards.Add(new DailyQuestActiveValueReward(config.id));
+        }
+
+        dailyQuestActiveValueRewards.Sort((x, y) => { return x.id.CompareTo(y.id); });
+
+    }
+
+
+
+
+    public void OnDailyQuestCompletedTimesUpdate(HA315_tagMCDailyActionCnt _serverInfo)
+    {
+        for (int i = 0; i < _serverInfo.Count; i++)
+        {
+            var dailyAction = _serverInfo.ActionInfo[i];
+            if (dailyAction.DayFinishCnt > 0)
+            {
+                dailyQuestTimes[(int)dailyAction.ActionID] = new DailyQuestTimes()
+                {
+                    completeTimes = dailyAction.DayFinishCnt,
+                    dayBuyTimes = dailyAction.DayBuyTimes,
+                    dayUseItemTimes = dailyAction.DayItemTimes,
+                };
+            }
+            else
+            {
+                dailyQuestTimes[(int)dailyAction.ActionID] = new DailyQuestTimes()
+                {
+                    completeTimes = (int)dailyAction.WeekFinishCnt,
+                };
+            }
+
+            if (dailyActionToDailyQuestTable.ContainsKey((int)dailyAction.ActionID))
+            {
+                var dailyQuestId = dailyActionToDailyQuestTable[(int)dailyAction.ActionID];
+                //UpdateDailyActionRedpoint(dailyQuestId);
+            }
+
+            if (dailyQuestProgressUpdateEvent != null)
+            {
+                dailyQuestProgressUpdateEvent((int)dailyAction.ActionID);
+            }
+        }
+    }
+
+    public int GetDailyQuestLV(int id)
+    {
+        var QuestConfig = DailyQuestConfig.Get(id);
+        var LVConfig = FuncOpenLVConfig.Get(QuestConfig.UnLockFuncID);
+        int NeedLV = 0;
+        if (LVConfig.LimitLV != 0)
+        {
+            NeedLV = LVConfig.LimitLV;
+        }
+        else if (LVConfig.LimitMissionID != 0)
+        {
+
+        }
+        return NeedLV;
+    }
+
+    public void OnDailyQuestActiveValueInfoUpdate(HA333_tagMCDailyActivityInfoList _activeValueInfo)
+    {
+        int OldCurrentActiveValue = currentActiveValue;
+        currentActiveValue = (int)_activeValueInfo.CurValue;
+        currentRewardStageIndex = (int)_activeValueInfo.StageIndex;
+
+        UpdateActiveValueRedpoint();
+    }
+    
+    private void UpdateActiveValueRedpoint()
+    {
+        var count = dailyQuestActiveValueRewards.Count;
+        var anyAwardable = false;
+        for (int i = 0; i < count; i++)
+        {
+            var reward = dailyQuestActiveValueRewards[i];
+            if (!reward.got)
+            {
+                var config = DailyLivenessRewardConfig.Get(reward.id);
+                if (currentActiveValue >= config.Liveness)
+                {
+                    anyAwardable = true;
+                    break;
+                }
+            }
+        }
+
+        activeValueRedpoint.state = anyAwardable ? RedPointState.Simple : RedPointState.None;
+    }
+
+
+}
+
diff --git a/Main/System/DailyQuest/DailyQuestModel.cs.meta b/Main/System/DailyQuest/DailyQuestModel.cs.meta
new file mode 100644
index 0000000..71f4982
--- /dev/null
+++ b/Main/System/DailyQuest/DailyQuestModel.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: c625d462938840044bd47268f81da57a
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Dungeon.meta b/Main/System/Dungeon.meta
new file mode 100644
index 0000000..1d39911
--- /dev/null
+++ b/Main/System/Dungeon.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 46646361254e846438b76518ad3da8eb
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Dungeon/DungeonData.cs b/Main/System/Dungeon/DungeonData.cs
new file mode 100644
index 0000000..7aac149
--- /dev/null
+++ b/Main/System/Dungeon/DungeonData.cs
@@ -0,0 +1,327 @@
+锘縰sing System.Collections.Generic;
+using System;
+using LitJson;
+using UnityEngine;
+
+
+public struct Dungeon
+{
+    public int mapId;
+    public int lineId;
+
+    public Dungeon(int _mapId, int _lineId)
+    {
+        this.mapId = _mapId;
+        this.lineId = _lineId;
+    }
+
+    public static bool operator ==(Dungeon _lhs, Dungeon _rhs)
+    {
+        return _lhs.mapId == _rhs.mapId && _lhs.lineId == _rhs.lineId;
+    }
+
+    public static bool operator !=(Dungeon _lhs, Dungeon _rhs)
+    {
+        return _lhs.mapId != _rhs.mapId || _lhs.lineId != _rhs.lineId;
+    }
+
+}
+
+public struct DungeonResult
+{
+    public int conWinCnt;  //鑳滃埄鐨勫満鏁�
+    public int extraExp; //棰濆鐨勭粡楠屽姞鎴�
+    public int extraExpPoint;//棰濆鐨勭粡楠岀偣鏁�
+    public int score; //鑾峰緱绉垎 
+    public int extrScore; //棰濆鑾峰緱绉垎
+
+    public int addScore; //澧炲姞鐨勭Н鍒嗭紝鏈夋璐�
+    public int updScore; //鏇存柊鍚庣殑绉垎
+    public int curOrder; // 涔嬪墠鎺掑悕
+    public int updOrder; //鏇存柊鍚庢帓鍚�
+
+    public int quickPass; //蹇�熼�氬叧
+    public int isSweep;
+    public int dataMapID;
+    public int lineID;
+    public int upPer;
+    public int costTime; //姣
+    public int isPass;
+    public int isAssist;
+    public int rank;
+    public int grade;
+    public int gradeExp;
+    public int gradeExpPoint;
+    public int scoreExp;
+    public int scoreExpPoint;
+    public int npcTotal;
+    public int expPoint;
+    public int exp;
+    public DungeonGotMoney[] money;
+    public int runeEssence;
+    public int runeMagicEssence;
+    public ServerItem[] itemInfo;
+    public ServerItem[] succItemInfo;
+    public ServerItem[] AuctionItem;
+    public ServerItem[] firstPassItem;
+    public int[] xianyuanCoin;
+    public int sp;
+    public int startRewardLineID;
+    public int enterLV;
+    public int leaderID;
+    public int wheel;
+    public Dictionary<string, AssistPlayer> helpPlayer;
+    public int memberCnt;
+    public uint ownerID;
+    public string ownerName;
+    public int isWin;
+
+    public long totalExp
+    {
+        get
+        {
+            return (long)((ulong)exp + (ulong)expPoint * Constants.ExpPointValue);
+        }
+    }
+
+    public long extraTotalExp
+    {
+        get { return (long)((ulong)extraExp + (ulong)extraExpPoint * Constants.ExpPointValue); }
+    }
+
+    public long totalScoreExp
+    {
+        get { return (long)((ulong)scoreExp + (ulong)scoreExpPoint * Constants.ExpPointValue); }
+    }
+
+    public long totalGradeExp
+    {
+        get { return (long)((ulong)gradeExp + (ulong)gradeExpPoint * Constants.ExpPointValue); }
+    }
+}
+
+
+public struct DungeonMissionData
+{
+    public int lineID;
+    public int missionID;
+    public int step;
+    public int wheel;
+    public int expPoint;
+    public int exp;
+    public int grade;
+    public int npcTotal;
+    public int npcTotalNeed;
+    public int hasCollect;
+    public int passAllCnt;
+    public DungeonNPCInfo[] npc;
+    public DungeonGotMoney[] money;
+    public int score;
+    public int remainHPPer;
+    public int hpReduceSpeed;
+    public int talkOver;
+    public int winCnt;
+    public int KillBOSS;
+    public DungeonHurt[] hurtInfo;
+    public int myHurt;
+    public int myHurtEx;
+    public int myRank;
+    public int myMenberCnt;
+    public string topName;
+    public int topScore;
+    public int isFullExp;
+    public int leaderID;
+    public FairyFeastRank[] familyPartyRank;
+    public FairyFeastTop familyPartyTop;
+    public int topPlayerID;
+    public int enemyID;
+    public int hasSit;
+    public int isHelp;
+    public int helpCount;
+    public int[] relation; 
+    public int roundNum;            //璺ㄦ湇1Vs1 褰撳墠鍥炲悎
+    public int[] roundWinerIDList;  //璺ㄦ湇1Vs1 鍥炲悎鑳滃埄鐨処d鍒楄〃
+    public int prepareTime;     //璺ㄦ湇1Vs1 鍥炲悎缁撴潫鍊掕鏃�
+    public int isStart;        //璺ㄦ湇1Vs1鍥炲悎寮�濮�
+    public int PlayerEnterMap; //鍒ゆ柇鐜╁ID涓嶆槸鑷繁鍒欐竻闄ょ瓑寰呮椂闂存樉绀�
+    public int IsEncourage;//鏄惁榧撹垶
+    public long totalExp
+    {
+        get
+        {
+            return (long)((ulong)exp + (ulong)expPoint * Constants.ExpPointValue);
+        }
+    }
+
+    public long myHurtTotal
+    {
+        get
+        {
+            return (long)((ulong)myHurt + (ulong)myHurtEx * Constants.ExpPointValue);
+        }
+    }
+}
+
+public struct DungeonNPCInfo
+{
+    public int NPCID;
+    public int killCnt;
+    public int HPPer;
+}
+
+public struct DungeonGotMoney
+{
+    public int moneyType;
+    public int moneyValue;
+}
+
+public struct DungeonHurt
+{
+    public string playerName;
+    public int hurt;
+    public int rank;
+    public int hurtEx;
+    public long totalHurt
+    {
+        get
+        {
+            return (long)((ulong)hurt + (ulong)hurtEx * Constants.ExpPointValue);
+        }
+    }
+}
+
+public struct FairyFeastRank
+{
+    public int rank;
+    public string name;
+    public int cnt;
+}
+
+public struct FairyFeastTop
+{
+    public string name;
+    public int cnt;
+}
+
+public struct ServerItem
+{
+    public int ItemID;
+    public int Count;
+    public int IsAuctionItem;
+    public string UserData;
+}
+
+public struct AssistPlayer
+{
+    public string Name;
+    public int LV;
+    public int Job;
+    public int Face;
+    public int FacePic;
+    public int Relation;
+    public int RealmLV;
+    public int FightPower;
+}
+
+public class DungeonRecord
+{
+    public int id { get; private set; }                        //鍓湰id
+    public int enterTimes { get; private set; }        //褰撴棩杩涘叆娆℃暟
+    public int buyTimes { get; private set; }              //褰撴棩宸茶喘涔版鏁�
+    public int extraTimes { get; private set; }           //浣跨敤鐗╁搧澧炲姞鐨勯澶栨鏁�
+    public int recoverTimes { get; private set; }        //鎵惧洖娆℃暟
+    public Dictionary<int, int> lineGrades;             //鍓湰绾胯矾瀵瑰簲鏄熺骇鍊煎垪琛�
+    public int enterCntTotal { get; private set; }        //鎵惧洖娆℃暟
+
+    public int passLineID;
+
+    public DungeonRecord(HA320_tagMCPlayerFBInfoData.tagMCFBInfo _serverInfo)
+    {
+        this.id = (int)_serverInfo.FBID;
+        this.enterTimes = (int)_serverInfo.EnterCnt;
+        this.recoverTimes = (int)_serverInfo.RecoverCnt;
+        this.extraTimes = (int)_serverInfo.ItemAddCnt;
+        this.lineGrades = new Dictionary<int, int>();
+        this.passLineID = (int)_serverInfo.PassLineID;
+        for (int i = 0; i < _serverInfo.PassGrade.Length; i++)
+        {
+            var tempValue = (int)_serverInfo.PassGrade[i];
+            for (int j = 0; j < 9; j++)
+            {
+                var a = MathUtility.Power(10, j);
+                var b = MathUtility.Power(10, j + 1);
+                this.lineGrades[i * 9 + j] = (tempValue % b) / a;
+            }
+        }
+        this.enterCntTotal = (int)_serverInfo.EnterCntTotal;
+    }
+
+    public DungeonRecord(HA3BD_tagMCBuyEnterInfo.tagMCBuyInfo _serverInfo)
+    {
+        this.id = (int)_serverInfo.FBID;
+        this.buyTimes = _serverInfo.BuyCount;
+    }
+
+    public void UpdateRecord(HA320_tagMCPlayerFBInfoData.tagMCFBInfo _serverInfo)
+    {
+        this.enterTimes = (int)_serverInfo.EnterCnt;
+        this.recoverTimes = (int)_serverInfo.RecoverCnt;
+        this.extraTimes = (int)_serverInfo.ItemAddCnt;
+        this.passLineID = (int)_serverInfo.PassLineID;
+        for (int i = 0; i < _serverInfo.PassGrade.Length; i++)
+        {
+            var tempValue = (int)_serverInfo.PassGrade[i];
+            for (int j = 0; j < 9; j++)
+            {
+                var a = MathUtility.Power(10, j);
+                var b = MathUtility.Power(10, j + 1);
+                this.lineGrades[i * 9 + j] = (tempValue % b) / a;
+            }
+        }
+        this.enterCntTotal = (int)_serverInfo.EnterCntTotal;
+    }
+
+    public void UpdateRecord(HA3BD_tagMCBuyEnterInfo.tagMCBuyInfo _serverInfo)
+    {
+        this.buyTimes = _serverInfo.BuyCount;
+    }
+
+}
+
+public class DungeonEnterCoolDown
+{
+    public int mapId;
+    public int level;
+    public int duration;
+    public int clearCoolDownCost;
+    public DateTime endCoolDownTime;
+
+    public void SetEnterTime(uint tick)
+    {
+        endCoolDownTime = TimeUtility.GetTime(tick);
+        endCoolDownTime = endCoolDownTime.AddTicks(duration * TimeSpan.TicksPerSecond);
+    }
+
+    public int suplursSeconds
+    {
+        get
+        {
+            return Mathf.Max(0, (int)(endCoolDownTime - TimeUtility.ServerNow).TotalSeconds);
+        }
+    }
+}
+
+public struct DungeonTarget
+{
+    public DungeonTargetType targetType;
+    public int targetCondition;
+    public int targetValue;
+
+    public DungeonTarget(DungeonTargetType _type, int _condition, int _targetValue)
+    {
+        this.targetType = _type;
+        this.targetCondition = _condition;
+        this.targetValue = _targetValue;
+    }
+
+}
diff --git a/Main/System/Dungeon/DungeonData.cs.meta b/Main/System/Dungeon/DungeonData.cs.meta
new file mode 100644
index 0000000..68ade5c
--- /dev/null
+++ b/Main/System/Dungeon/DungeonData.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 6ab6bc03ed79b6e4a8531f460d1b7363
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Dungeon/DungeonModel.cs b/Main/System/Dungeon/DungeonModel.cs
new file mode 100644
index 0000000..c6942c9
--- /dev/null
+++ b/Main/System/Dungeon/DungeonModel.cs
@@ -0,0 +1,71 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using System;
+using LitJson;
+
+
+public class DungeonModel : GameSystemManager<DungeonModel>
+{
+
+    Dictionary<int, DungeonRecord> dungeonRecords = new Dictionary<int, DungeonRecord>();
+
+    public event Action<int> dungeonRecordChangeEvent;
+    public event Action updateDungeonBuyCnt;
+
+    public override void Init()
+    {
+
+    }
+
+    public override void Release()
+    {
+    }
+
+    public void UpdateRecords(HA320_tagMCPlayerFBInfoData.tagMCFBInfo[] _serverInfos)
+    {
+        for (int i = 0; i < _serverInfos.Length; i++)
+        {
+            var info = _serverInfos[i];
+            var dungeonId = (int)info.FBID;
+            if (dungeonRecords.ContainsKey(dungeonId))
+            {
+                dungeonRecords[dungeonId].UpdateRecord(info);
+            }
+            else
+            {
+                dungeonRecords[dungeonId] = new DungeonRecord(info);
+            }
+
+            if (dungeonRecordChangeEvent != null)
+            {
+                dungeonRecordChangeEvent(dungeonId);
+            }
+        }
+
+    }
+    
+    public void UpdateRecords(HA3BD_tagMCBuyEnterInfo.tagMCBuyInfo[] vNetDatas)
+    {
+        for (int i = 0; i < vNetDatas.Length; i++)
+        {
+            var info = vNetDatas[i];
+            var dungeonId = (int)info.FBID;
+            if (dungeonRecords.ContainsKey(dungeonId))
+            {
+                dungeonRecords[dungeonId].UpdateRecord(info);
+            }
+            else
+            {
+                dungeonRecords[dungeonId] = new DungeonRecord(info);
+            }
+        }
+        if (updateDungeonBuyCnt != null)
+        {
+            updateDungeonBuyCnt();
+        }
+    }
+
+}
+
+
diff --git a/Main/System/Dungeon/DungeonModel.cs.meta b/Main/System/Dungeon/DungeonModel.cs.meta
new file mode 100644
index 0000000..9d1607e
--- /dev/null
+++ b/Main/System/Dungeon/DungeonModel.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 7054c8785e96d9f49a3948ed09eebb7b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Equip/EquipFightPower.cs b/Main/System/Equip/EquipFightPower.cs
new file mode 100644
index 0000000..0809790
--- /dev/null
+++ b/Main/System/Equip/EquipFightPower.cs
@@ -0,0 +1,159 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+
+public class EquipFightPower : Singleton<EquipFightPower>
+{
+    string scoreFormula;
+    string propertyFormula;
+
+    public EquipFightPower()
+    {
+        var config = FuncConfigConfig.Get("FightpowerFormula");
+        propertyFormula = config.Numerical1;
+        scoreFormula = config.Numerical2;
+    }
+
+    public int GetSpiritWeaponPower(int itemId)
+    {
+        var score = ItemLogicUtility.Instance.GetEquipScore(itemId);
+        Equation.Instance.Clear();
+        Equation.Instance.AddKeyValue("equipScoreTotal", score);
+        return Equation.Instance.Eval<int>(scoreFormula);
+    }
+
+    public int CalculatePower(int level)
+    {
+        Equation.Instance.Clear();
+        Equation.Instance.AddKeyValue("equipScoreTotal", CountEquipScore(level));
+        var power = Equation.Instance.Eval<int>(scoreFormula);
+
+        var propertyContainer = new Properties();
+
+        Equation.Instance.Clear();
+        var keys = propertyContainer.keys;
+        for (int i = 0; i < keys.Count; i++)
+        {
+            var id = keys[i];
+            var value = propertyContainer[id];
+            var config = PlayerPropertyConfig.Get(id);
+            Equation.Instance.AddKeyValue(config.Parameter, value);
+        }
+
+        var propertyPower = Equation.Instance.Eval<int>(propertyFormula);
+        power += propertyPower;
+
+
+        return power;
+    }
+
+    private int CountEquipScore(int level)
+    {
+        var score = 0;
+        // for (int i = 1; i <= 12; i++)
+        // {
+        //     var equipPosition = new Int2(level, i);
+        //     var guid = equipModel.GetEquip(equipPosition);
+        //     if (string.IsNullOrEmpty(guid))
+        //     {
+        //         continue;
+        //     }
+
+        //     var equip = packModel.GetItemByGuid(guid);
+        //     if (equip == null)
+        //     {
+        //         continue;
+        //     }
+
+        //     score += equip.score;
+        // }
+
+        return score;
+    }
+
+
+
+    public int CalculatePower(int job, int level, List<EquipInfo> equipInfos)
+    {
+        var propertyContainer = new Properties();
+        var totalScore = 0;
+
+
+        Equation.Instance.Clear();
+        Equation.Instance.AddKeyValue("equipScoreTotal", totalScore);
+        var power = Equation.Instance.Eval<int>(scoreFormula);
+
+        Equation.Instance.Clear();
+        var keys = propertyContainer.keys;
+        for (int i = 0; i < keys.Count; i++)
+        {
+            var id = keys[i];
+            var value = propertyContainer[id];
+            var config = PlayerPropertyConfig.Get(id);
+            if (config != null)
+            {
+                Equation.Instance.AddKeyValue(config.Parameter, value);
+            }
+
+        }
+
+        power += Equation.Instance.Eval<int>(propertyFormula);
+
+        return power;
+    }
+
+    class Properties
+    {
+        Dictionary<int, int> tables = new Dictionary<int, int>();
+
+        public List<int> keys { get { return new List<int>(tables.Keys); } }
+
+        public int this[int id] { get { return tables[id]; } }
+
+        public void Add(int id, int value)
+        {
+            if (id == 7)
+            {
+                Add(67, value);
+                Add(68, value);
+            }
+            else
+            {
+                if (tables.ContainsKey(id))
+                {
+                    tables[id] = tables[id] + value;
+                }
+                else
+                {
+                    tables[id] = value;
+                }
+            }
+        }
+
+        public void AddRange(List<int> ids, List<int> values)
+        {
+            if (ids.IsNullOrEmpty() || values.IsNullOrEmpty())
+            {
+                return;
+            }
+
+            var count = Mathf.Min(ids.Count, values.Count);
+            for (int i = 0; i < count; i++)
+            {
+                Add(ids[i], values[i]);
+            }
+        }
+
+    }
+
+    public struct EquipInfo
+    {
+        public int itemId;
+        public int score;
+
+    }
+
+}
+
+
diff --git a/Main/System/Equip/EquipFightPower.cs.meta b/Main/System/Equip/EquipFightPower.cs.meta
new file mode 100644
index 0000000..d9b9a17
--- /dev/null
+++ b/Main/System/Equip/EquipFightPower.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 0bf4ddb4117ea2f4b8d9d341d0e980dc
+timeCreated: 1554174994
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Equip/EquipModel.cs b/Main/System/Equip/EquipModel.cs
new file mode 100644
index 0000000..bf04d84
--- /dev/null
+++ b/Main/System/Equip/EquipModel.cs
@@ -0,0 +1,75 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using System;
+using LitJson;
+
+
+public class EquipModel : GameSystemManager<EquipModel>
+{
+    
+
+
+    public void OnPlayerLoginOk()
+    {
+
+    }
+
+    public override void Init()
+    {
+
+    }
+
+    public override void Release()
+    {
+    }
+
+    public Dictionary<int, int> EquipLevelFuncID = new Dictionary<int, int>();
+
+
+    public void OnAfterPlayerDataInitialize()
+    {
+
+    }
+
+
+
+    public static int GetItemServerEquipPlace(int itemId)
+    {
+        var config = ItemConfig.Get(itemId);
+        if (config == null)
+        {
+            return -1;
+        }
+
+        var serverEquipPlace = -1;
+        switch ((RoleEquipType)config.EquipPlace)
+        {
+            case RoleEquipType.Weapon:
+            case RoleEquipType.Weapon2:
+            case RoleEquipType.Hat:
+            case RoleEquipType.Clothes:
+            case RoleEquipType.Belt:
+            case RoleEquipType.Trousers:
+            case RoleEquipType.Shoes:
+            case RoleEquipType.Neck:
+            case RoleEquipType.FairyCan1:
+            case RoleEquipType.FairyCan2:
+            case RoleEquipType.Glove:
+            case RoleEquipType.Jade:
+                serverEquipPlace = EquipSet.ClientPlaceToServerPlace(new Int2(config.LV, config.EquipPlace));
+                break;
+            case RoleEquipType.Wing:
+            case RoleEquipType.Guard:
+            case RoleEquipType.PeerlessWeapon1:
+            case RoleEquipType.PeerlessWeapon2:
+                serverEquipPlace = EquipSet.ClientPlaceToServerPlace(new Int2(0, config.EquipPlace));
+                break;
+        }
+
+        return serverEquipPlace;
+    }
+
+}
+
+
diff --git a/Main/System/Equip/EquipModel.cs.meta b/Main/System/Equip/EquipModel.cs.meta
new file mode 100644
index 0000000..4d2a3cd
--- /dev/null
+++ b/Main/System/Equip/EquipModel.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: f3ee6b5bd5b76714b87a241feedd3937
+timeCreated: 1551096748
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Equip/EquipSet.cs b/Main/System/Equip/EquipSet.cs
new file mode 100644
index 0000000..2b7a7fe
--- /dev/null
+++ b/Main/System/Equip/EquipSet.cs
@@ -0,0 +1,107 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+//涓诲姛鑳芥暣濂楄澶�
+public class EquipSet
+{
+    public readonly int maxEquipCnt = 12; //鏈�澶ц澶囨牸瀛愭暟
+    public readonly int level;  //澶氬鎯呭喌锛屾垨鑰呭娴佹淳瀛樺偍
+    public bool unLocked { get { return true; } }   //鍚庣画鏍规嵁鐜╂硶瑙i攣鐨勬儏鍐碉紝濡傝喘涔板瓨鍌ㄦ祦娲句綅
+
+    public int fightPower {
+        get {
+            return EquipFightPower.Instance.CalculatePower(level);
+        }
+    }
+
+    Dictionary<int, EquipSlot> equipSlots = new Dictionary<int, EquipSlot>();
+
+    public EquipSet(int level)
+    {
+        this.level = level;
+
+        for (var i = 1; i <= maxEquipCnt; i++)
+        {
+            equipSlots[i] = new EquipSlot(i);
+        }
+
+    }
+
+    public void UpdateEquipSlot(int place, string equipGuid)
+    {
+        if (equipSlots.ContainsKey(place))
+        {
+            equipSlots[place].equip.value = equipGuid;
+        }
+    }
+
+
+
+    public EquipSlot GetEquipSlot(int place)
+    {
+        if (!equipSlots.ContainsKey(place))
+        {
+            return null;
+        }
+
+        return equipSlots[place];
+    }
+
+    public string GetEquip(int place)
+    {
+        if (!equipSlots.ContainsKey(place))
+        {
+            return null;
+        }
+
+        return equipSlots[place].equip.value;
+    }
+
+    
+
+    public int CompareToCurrent(string equipGuid)
+    {
+        var item = PackManager.Instance.GetItemByGuid(equipGuid);   //闇�鏀规垚鍦版澘鐗╁搧
+        if (item == null)
+        {
+            return 0;
+        }
+
+        var place = item.config.EquipPlace;
+        if (!equipSlots.ContainsKey(place))
+        {
+            return 0;
+        }
+
+        var slot = equipSlots[place];
+        var currentEquip = PackManager.Instance.GetItemByGuid(slot.equip.value);
+        if (currentEquip == null)
+        {
+            return 1;
+        }
+
+        return item.score.CompareTo(currentEquip.score);
+    }
+
+    public static Int2 ServerPlaceToClientPlace(int serverPlace)
+    {
+        var config = EquipPlaceMapConfig.Get(serverPlace);
+        if (config != null)
+        {
+            return new Int2(config.LV, config.EquipPlace);
+        }
+        else
+        {
+            return Int2.zero;
+        }
+    }
+
+    public static int ClientPlaceToServerPlace(Int2 equipPosition)
+    {
+        return EquipPlaceMapConfig.GetServerPlace(equipPosition.x, equipPosition.y);
+    }
+
+}
+
+
diff --git a/Main/System/Equip/EquipSet.cs.meta b/Main/System/Equip/EquipSet.cs.meta
new file mode 100644
index 0000000..78440b6
--- /dev/null
+++ b/Main/System/Equip/EquipSet.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 5e6ca401fb2c59844b89e981c4a58bc0
+timeCreated: 1551096917
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Equip/EquipSlot.cs b/Main/System/Equip/EquipSlot.cs
new file mode 100644
index 0000000..599a32c
--- /dev/null
+++ b/Main/System/Equip/EquipSlot.cs
@@ -0,0 +1,20 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+//瑁呭浣嶇疆涓婄殑淇℃伅锛堝崟鏍煎瓙锛夛紝澶氭祦娲惧彲鐢�
+public class EquipSlot
+{
+    public int equipPosition;
+    public readonly LogicString equip = new LogicString();
+    public int itemId; 
+
+    public EquipSlot(int equipPosition)
+    {
+        this.equipPosition = equipPosition;
+    }
+
+
+}
+
+
diff --git a/Main/System/Equip/EquipSlot.cs.meta b/Main/System/Equip/EquipSlot.cs.meta
new file mode 100644
index 0000000..e03634b
--- /dev/null
+++ b/Main/System/Equip/EquipSlot.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: e1fa9aacd2e109c4c954083ce08738e4
+timeCreated: 1551097235
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/FairyEmblem.meta b/Main/System/FairyEmblem.meta
new file mode 100644
index 0000000..2e89140
--- /dev/null
+++ b/Main/System/FairyEmblem.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 397588e2bd67d3a4b894aa3f530728ff
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/FairyEmblem/EmblemHelper.cs b/Main/System/FairyEmblem/EmblemHelper.cs
new file mode 100644
index 0000000..b56819f
--- /dev/null
+++ b/Main/System/FairyEmblem/EmblemHelper.cs
@@ -0,0 +1,57 @@
+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(FairyEmblemModel.Instance.defaultFamilyEmblemId) ? 0 : FairyEmblemModel.Instance.defaultFamilyEmblemId;
+    }
+
+    public static int GetMyEmblemID()
+    {
+        int emblemID = (int)PlayerDatas.Instance.fairyData.fairy.Extra6;
+        if (FamilyEmblemConfig.HasKey(emblemID) && FairyEmblemModel.Instance.IsUnLock(emblemID))
+            return emblemID;
+        return !FamilyEmblemConfig.HasKey(FairyEmblemModel.Instance.defaultFamilyEmblemId) ? 0 : FairyEmblemModel.Instance.defaultFamilyEmblemId;
+    }
+
+    public static int GetEmblemEffectID(int id)
+    {
+        FairyEmblemModel.Instance.TryGetEffectID(id, out int effectID);
+        return effectID;
+    }
+
+    public static int GetDefaultFamilyEmblemId()
+    {
+        return FairyEmblemModel.Instance.defaultFamilyEmblemId;
+    }
+}
+
+
diff --git a/Main/System/FairyEmblem/EmblemHelper.cs.meta b/Main/System/FairyEmblem/EmblemHelper.cs.meta
new file mode 100644
index 0000000..99ea203
--- /dev/null
+++ b/Main/System/FairyEmblem/EmblemHelper.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 23ae5c264fec3024ca275ac0742c7bb2
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/FairyEmblem/FairyEmblemModel.cs b/Main/System/FairyEmblem/FairyEmblemModel.cs
new file mode 100644
index 0000000..ec2065c
--- /dev/null
+++ b/Main/System/FairyEmblem/FairyEmblemModel.cs
@@ -0,0 +1,348 @@
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+
+
+//浠欑洘寰界珷 瑙i攣閫斿緞绫诲瀷
+public enum FairyEmblemUnlockMethodType
+{
+    Custom,     // 0 - 瀹氬埗
+    LV,         // 1 - 绛夌骇鑷姩瑙i攣
+    Active,     // 2 - 娲诲姩鑾峰緱
+}
+
+public class FairyEmblemModel : GameSystemManager<FairyEmblemModel>
+{
+    public readonly int MaxItemRowCount = 6;    // 涓�琛屽睍绀簒涓窘绔�
+    public readonly int FamilyActionsType = 15;     // 瀹舵棌琛屼负绫诲瀷15
+    public readonly int FuncId = 237;
+    public int defaultFamilyEmblemId;           // 榛樿寰界珷ID
+
+    public bool isSendA408Pack = false;
+
+    private int m_NowChooseEmblemId;
+    public int nowChooseEmblemId
+    {
+        get { return m_NowChooseEmblemId; }
+        set
+        {
+            m_NowChooseEmblemId = value;
+            ChooseEmblemIdChangeEvent?.Invoke();
+        }
+    }
+
+    //<EmblemId,FamilyAction>
+    Dictionary<int, HA403_tagGCFamilyActionInfo.tagGCFamilyAction> familyActions = new Dictionary<int, HA403_tagGCFamilyActionInfo.tagGCFamilyAction>();
+
+    public event Action ChooseEmblemIdChangeEvent;      //鍒囨崲鏍囩椤�
+    public event Action<int, int> UpdateFamilyActionEvent;
+
+    Redpoint entranceRedPoint = new Redpoint(10702, MainRedDot.FairyEmbleManageRepoint); //浠欑洘绠$悊闈㈡澘鍏ュ彛绾㈢偣
+
+    public override void Init()
+    {
+        PlayerDatas.Instance.fairyData.OnRefreshFairyInfo += OnRefreshFairyInfo;
+        defaultFamilyEmblemId = int.Parse(FuncConfigConfig.Get("FairyEmblem").Numerical1);
+    }
+
+    public override void Release()
+    {
+        PlayerDatas.Instance.fairyData.OnRefreshFairyInfo -= OnRefreshFairyInfo;
+    }
+
+    private void OnRefreshFairyInfo()
+    {
+        UpdateRedPoint();
+    }
+
+    public void OnBeforePlayerDataInitialize()
+    {
+        familyActions.Clear();
+    }
+
+    public void UpdateRedPoint()
+    {
+        entranceRedPoint.state = RedPointState.None;
+        // 浠呯洘涓昏兘鐪嬪埌
+        if (!IsCaptain())
+            return;
+        // 浠欑洘2绾у嚭鐜�
+        if (PlayerDatas.Instance.fairyData == null || PlayerDatas.Instance.fairyData.fairy.FamilyLV != 2)
+            return;
+        // 鍙嚭鐜颁竴娆�
+        if (GetRedPointShow())
+            return;
+        entranceRedPoint.state = RedPointState.Simple;
+    }
+
+    string localStr = "FairyEmblemEntranceRedPoint_";
+
+    public bool GetRedPointShow()
+    {
+        return LocalSave.GetBool(localStr + PlayerDatas.Instance.PlayerId);
+    }
+
+    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.Extra6;
+        if (FamilyEmblemConfig.HasKey(emblemID) && IsUnLock(emblemID))
+        {
+            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())
+            {
+                imgTitle.rectTransform.sizeDelta = new Vector2(spriteList[0].rect.width, spriteList[0].rect.height);
+            }
+
+            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);
+    }
+
+    //鍙戝寘 鏌ヨ鐜╁褰撳墠浠欑洘寰界珷
+    public void TrySendA408EmblemInfoPack()
+    {
+        //宸茬粡鍙戣繃鍖呬簡
+        if (isSendA408Pack)
+            return;
+        isSendA408Pack = true;
+        var pack = new CA408_tagCGQueryFamilyAction();
+        pack.ActionType = 15;
+        pack.FamilyID = PlayerDatas.Instance.baseData.FamilyId;
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
+    //鍙戝寘 鏇存敼浠欑洘寰界珷
+    public void SendCA413ChangeFamilyEmblemPack(int emblemId)
+    {
+        var pack = new CA413_tagCGChangeFamilyEmblem();
+        pack.EmblemID = (byte)emblemId;
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
+    public List<int> GetShowList()
+    {
+        List<int> showList = new List<int>();
+        List<int> keys = FamilyEmblemConfig.GetKeys();
+        for (int i = 0; i < keys.Count; i++)
+        {
+            showList.Add(keys[i]);
+        }
+        showList.Sort(Cmp);
+        return showList;
+    }
+
+    // 宸叉縺娲�>鏈縺娲�
+    private int Cmp(int a, int b)
+    {
+        bool isUnlock1 = IsUnLock(a);
+        bool isUnlock2 = IsUnLock(b);
+
+        if (isUnlock1 != isUnlock2)
+        {
+            return isUnlock2.CompareTo(isUnlock1);
+        }
+
+        // 濡傛灉婵�娲荤姸鎬佺浉鍚岋紝姣旇緝鏄惁涓洪檺鏃讹細闄愭椂 (true) > 姘镐箙 (false)
+        bool isLimitA = IsLimitTime(a, out var familyAction1);
+        bool isLimitB = IsLimitTime(b, out var familyAction2);
+
+        if (isLimitA != isLimitB)
+        {
+            return isLimitB.CompareTo(isLimitA);
+        }
+
+        // 闄愭椂鐘舵�佺浉鍚岋紝姣旇緝 SortNum
+        int sortNumA = GetSortNum(a);
+        int sortNumB = GetSortNum(b);
+        if (sortNumA != sortNumB)
+        {
+            return sortNumA.CompareTo(sortNumB);
+        }
+
+        return a.CompareTo(b);
+    }
+
+    public int GetSortNum(int emblemID)
+    {
+        if (!FamilyEmblemConfig.HasKey(emblemID))
+            return 0;
+        return FamilyEmblemConfig.Get(emblemID).SortNum;
+    }
+
+    // 鑾峰緱寰界珷鏉ユ簮绫诲瀷
+    public FairyEmblemUnlockMethodType GetFairyEmblemUnlockType(int emblemID)
+    {
+        FamilyEmblemConfig config = FamilyEmblemConfig.Get(emblemID);
+        if (config == null)
+            return FairyEmblemUnlockMethodType.LV;
+        if (config.CustomFamilyID > 0)
+            return FairyEmblemUnlockMethodType.Custom;
+        return config.UnlockFamilyLV > 0 ? FairyEmblemUnlockMethodType.LV : FairyEmblemUnlockMethodType.Active;
+    }
+
+    // 鎸囧畾鐨勫窘绔犺В閿佷簡鍚�
+    public bool IsUnLock(int emblemId)
+    {
+        FamilyEmblemConfig config = FamilyEmblemConfig.Get(emblemId);
+        FairyEmblemUnlockMethodType type = GetFairyEmblemUnlockType(emblemId);
+        HA403_tagGCFamilyActionInfo.tagGCFamilyAction familyAction;
+        switch (type)
+        {
+            case FairyEmblemUnlockMethodType.Custom:
+                //鎵�鍦ㄤ粰鐩熶笉鏄寚瀹氱殑瀹氬埗浠欑洘 鏈В閿�
+                if (PlayerDatas.Instance.baseData.FamilyId != config.CustomFamilyID)
+                    return false;
+                //灏佸寘涓病鏈夊氨绠楁湭瑙i攣
+                if (!TryGetfamilyAction(emblemId, out familyAction))
+                    return false;
+                if (familyAction.Value2 > 0 && familyAction.Value2 < TimeUtility.AllSeconds)
+                    return false;
+                return true;
+
+            case FairyEmblemUnlockMethodType.LV:
+                //鎵�鍦ㄤ粰鐩熺瓑绾у皬浜庡窘绔犺姹傜瓑绾� 鏈В閿�
+                if (PlayerDatas.Instance.fairyData.fairy.FamilyLV < config.UnlockFamilyLV)
+                    return false;
+                return true;
+
+            case FairyEmblemUnlockMethodType.Active:
+                //灏佸寘涓病鏈夊氨绠楁湭瑙i攣
+                if (!TryGetfamilyAction(emblemId, out familyAction))
+                    return false;
+                if (familyAction.Value2 > 0 && familyAction.Value2 < TimeUtility.AllSeconds)
+                    return false;
+                return true;
+
+            default:
+                return false;
+        }
+    }
+
+    public bool IsUsing(int emblemId)
+    {
+        if (!TryGetNowEmblemID(out int Id))
+        {
+            return false;
+        }
+        return emblemId == Id;
+    }
+
+    public bool IsLimitTime(int emblemId, out HA403_tagGCFamilyActionInfo.tagGCFamilyAction familyAction)
+    {
+        familyAction = new HA403_tagGCFamilyActionInfo.tagGCFamilyAction();
+        FamilyEmblemConfig config = FamilyEmblemConfig.Get(emblemId);
+        FairyEmblemUnlockMethodType type = GetFairyEmblemUnlockType(emblemId);
+        switch (type)
+        {
+            case FairyEmblemUnlockMethodType.LV:
+                return false;
+
+            case FairyEmblemUnlockMethodType.Custom:
+            case FairyEmblemUnlockMethodType.Active:
+                if (config.ExpireMinutes <= 0)
+                    return false;
+                if (!TryGetfamilyAction(emblemId, out familyAction))
+                    return false;
+                return true;
+
+            default:
+                return false;
+        }
+    }
+
+    public bool IsCaptain()
+    {
+        return (int)PlayerDatas.Instance.fairyData.mine.FamilyLV == 3;
+    }
+
+    // 灏濊瘯浠庡皝鍖呬腑寰楀埌鎸囧畾鐨勫窘绔犳椂鏁堜俊鎭紙娲诲姩閫斿緞鑾峰彇鐨勫窘绔�,瀹氬埗寰界珷锛�
+    private bool TryGetfamilyAction(int emblemId, out HA403_tagGCFamilyActionInfo.tagGCFamilyAction familyAction)
+    {
+        familyAction = new HA403_tagGCFamilyActionInfo.tagGCFamilyAction();
+        if (!familyActions.TryGetValue(emblemId, out var info))
+            return false;
+        familyAction = info;
+        return true;
+    }
+
+    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;
+        effectID = config.EffectID;
+        return true;
+    }
+
+    public void UpdateFamilyAction(HA403_tagGCFamilyActionInfo vNetData)
+    {
+        if (vNetData.ActionType != FamilyActionsType || PlayerDatas.Instance.baseData == null || (int)vNetData.FamilyID != (int)PlayerDatas.Instance.baseData.FamilyId)
+            return;
+        for (int i = 0; i < vNetData.FamilyActionList.Length; i++)
+        {
+            HA403_tagGCFamilyActionInfo.tagGCFamilyAction familyAction = vNetData.FamilyActionList[i];
+            familyActions[(int)familyAction.Value1] = familyAction;
+        }
+        UpdateFamilyActionEvent?.Invoke((int)vNetData.FamilyID, vNetData.ActionType);
+    }
+}
+
+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/FairyEmblem/FairyEmblemModel.cs.meta b/Main/System/FairyEmblem/FairyEmblemModel.cs.meta
new file mode 100644
index 0000000..2a1fb8e
--- /dev/null
+++ b/Main/System/FairyEmblem/FairyEmblemModel.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 892fb40a637f86f458d1d31439ead14d
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/FairyUnion.meta b/Main/System/FairyUnion.meta
new file mode 100644
index 0000000..c46908e
--- /dev/null
+++ b/Main/System/FairyUnion.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 18f8f54b46f01384bac4a0f425d83966
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/FairyUnion/FairyModel.cs b/Main/System/FairyUnion/FairyModel.cs
new file mode 100644
index 0000000..379a138
--- /dev/null
+++ b/Main/System/FairyUnion/FairyModel.cs
@@ -0,0 +1,558 @@
+锘縰sing System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Text;
+
+using UnityEngine;
+
+
+public class FairyModel : GameSystemManager<FairyModel>
+{
+
+    
+    public Dictionary<int, Dictionary<int, HA403_tagGCFamilyActionInfo.tagGCFamilyAction[]>> familyActions = new Dictionary<int, Dictionary<int, HA403_tagGCFamilyActionInfo.tagGCFamilyAction[]>>();
+    public event Action<int, int> FamilyActionInfoEvent;
+
+    public event Action fairyCreateTimesUpdate;
+    public override void Init()
+    {
+        ParseConfig();
+        PlayerDatas.Instance.fairyData.OnRefreshFairyInfo += OnRefreshFairyInfo;
+        PlayerDatas.Instance.fairyData.OnRefreshFairyMine += OnRefreshFairyMine;
+        TimeMgr.Instance.OnSyntonyEvent += OnSyntonyEvent;
+        FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
+    }
+
+    private void OnSyntonyEvent(TimeMgr.SyntonyType _type)
+    {
+        if (_type == TimeMgr.SyntonyType.GetFairyInfo)
+        {
+            if (m_RequestFairyInfoCount > 1)
+            {
+                C0F07_tagCGetFamilyInfo pack = new C0F07_tagCGetFamilyInfo();
+                pack.Type = 0;
+                GameNetSystem.Instance.SendInfo(pack);
+                TimeMgr.Instance.Register(TimeMgr.SyntonyType.GetFairyInfo, 1);
+                m_RequestFairyInfoCount = 1;
+            }
+            else
+            {
+                m_RequestFairyInfoCount = 0;
+            }
+        }
+    }
+
+    
+
+    public void OnBeforePlayerDataInitialize()
+    {
+        m_FairyRequesteds.Clear();
+        m_RequestFairyInfoCount = 0;
+        fairyCreateTimes = 0;
+        familyActions.Clear();
+    }
+
+
+
+    private void OnRefreshFairyInfo()
+    {
+        UpdateAddFairyRedpoint();
+    }
+
+    private void OnRefreshFairyMine()
+    {
+        if (!PlayerDatas.Instance.fairyData.HasFairy)
+        {
+            familyActions.Clear();
+        }
+    }
+
+    public void GotoFairyWin(int functionOrder = 0)
+    {
+        if (functionOrder == 0)
+        {
+            if (PlayerDatas.Instance.fairyData.HasFairy)
+            {
+                functionOrder = 1;
+                if (RedpointCenter.Instance.GetRedpointState(10701) == RedPointState.Simple)
+                {
+                    functionOrder = 1;
+                }
+                else if (RedpointCenter.Instance.GetRedpointState(10702) == RedPointState.Simple)
+                {
+                    functionOrder = 2;
+                }
+                else if (RedpointCenter.Instance.GetRedpointState(10704) == RedPointState.Simple)
+                {
+                    functionOrder = 4;
+                }
+                else if (RedpointCenter.Instance.GetRedpointState(10705) == RedPointState.Simple)
+                {
+                    functionOrder = 5;
+                }
+            }
+            else
+            {
+                functionOrder = 3;
+            }
+        }
+        // WindowCenter.Instance.Open<UnionPanel>(false, functionOrder);
+    }
+
+    #region 鍙戝寘
+    public void SendKickFairy(uint playerID)
+    {
+
+        var pak = new C0F09_tagCDeleteFamilyMember();
+        pak.MemberID = playerID;
+        GameNetSystem.Instance.SendInfo(pak);
+    }
+
+    public void SendApplyFairy(uint id)
+    {
+        int limit = FuncOpenLVConfig.Get((int)FuncOpenEnum.Fairy).LimitLV;
+        if (PlayerDatas.Instance.baseData.LV < limit)
+        {
+            ServerTipDetails.DisplayNormalTip(Language.Get("L1106", limit));
+            return;
+        }
+        if (PlayerDatas.Instance.fairyData.HasFairy)
+        {
+            ServerTipDetails.DisplayNormalTip(Language.Get("HasFairyTip"));
+            return;
+        }
+        CA602_tagCMRequesJoinFamily rqPack = new CA602_tagCMRequesJoinFamily();
+        rqPack.Type = 0;
+        rqPack.TagFamilyID = id;
+        GameNetSystem.Instance.SendInfo(rqPack);
+    }
+    #endregion
+
+    public int presentChangeMember
+    {
+        get;
+        set;
+    }
+    private bool m_IsOnAllot = false;
+    public bool IsOnAllot
+    {
+        get
+        {
+            return m_IsOnAllot;
+        }
+        set
+        {
+            m_IsOnAllot = value;
+        }
+    }
+
+    private int m_RequestFairyInfoCount = 0;
+
+    #region 閰嶇疆
+ 
+    public int createFairyCost
+    {
+        get;
+        private set;
+    }
+    public int createFairyFreeCount
+    {
+        get;
+        private set;
+    }
+    public readonly int changeFairyNameItem = 947;
+    public int freeNotifyCount { get; private set; }
+    public int changeNotifyCost { get; private set; }
+    public int fairyFeastDeskNpc { get; private set; }
+    public int fairyCreateTimes { get; private set; }
+    void ParseConfig()
+    {
+        var config = FuncConfigConfig.Get("CreateFamily");
+        createFairyCost = int.Parse(config.Numerical1);
+        config = FuncConfigConfig.Get("FamilyBroadcast");
+        freeNotifyCount = int.Parse(config.Numerical1);
+        changeNotifyCost = int.Parse(config.Numerical2);
+        config = FuncConfigConfig.Get("FamilyShop");
+        fairyStoreLimit = int.Parse(config.Numerical2);
+        config = FuncConfigConfig.Get("FamilyPartyDeskNpcID");
+        fairyFeastDeskNpc = int.Parse(config.Numerical1);
+        config = FuncConfigConfig.Get("FamilyMatchSet");
+        fairyLeagueLimit = int.Parse(config.Numerical1);
+    }
+
+    public static string GetFairyGradeLabel(int rank)
+    {
+        rank = Mathf.CeilToInt((float)rank / 4);
+        switch (rank)
+        {
+            case 1:
+                return Language.Get("Fairy_S");
+            case 2:
+                return Language.Get("Fairy_A");
+            case 3:
+                return Language.Get("Fairy_B");
+            case 4:
+                return Language.Get("Fairy_C");
+            default:
+                return Language.Get("Fairy_D");
+        }
+    }
+    #endregion
+
+    public List<PlayerFairyData.FairyData> fairyList = new List<PlayerFairyData.FairyData>();
+    public int page = 0;
+    public int presentFairy = -1;
+
+
+    public void OnSearchPageList()
+    {
+        SendSearchFairyList(page, PlayerFairyData.PageCnt);
+    }
+    public void SendSearchFairyList(int _page, int _pageCnt)
+    {
+        CA401_tagCGViewFamilyPage searchPack = new CA401_tagCGViewFamilyPage();
+        searchPack.PageIndex = (ushort)_page;
+        searchPack.ShowCount = (byte)_pageCnt;
+        searchPack.SortRulex = 0;
+        searchPack.ViewType = 3;
+        GameNetSystem.Instance.SendInfo(searchPack);
+    }
+
+
+
+    private List<int> m_FairyRequesteds = new List<int>();
+    public void UpdateFairyRequested(HA501_tagMCNotifyRequestJoinFamilyInfo _package)
+    {
+        m_FairyRequesteds.Clear();
+        for (int i = 0; i < _package.RequestCount; i++)
+        {
+            m_FairyRequesteds.Add((int)_package.RequestJoinFamilyIDList[i]);
+        }
+    }
+
+    public void ReceivePackage(HA40D_tagGCServerCreatFamilyTimes package)
+    {
+        fairyCreateTimes = (int)package.Times;
+        if (fairyCreateTimesUpdate != null)
+        {
+            fairyCreateTimesUpdate();
+        }
+    }
+
+    public bool FairyRequested(int _fairyId)
+    {
+        return m_FairyRequesteds.Contains(_fairyId);
+    }
+
+    public void UpdateFairyInfo()
+    {
+        if (m_RequestFairyInfoCount == 0)
+        {
+            C0F07_tagCGetFamilyInfo pack = new C0F07_tagCGetFamilyInfo();
+            pack.Type = 0;
+            GameNetSystem.Instance.SendInfo(pack);
+            TimeMgr.Instance.Register(TimeMgr.SyntonyType.GetFairyInfo, 1);
+        }
+        m_RequestFairyInfoCount++;
+    }
+
+    public bool InSameFairy(int playerId)
+    {
+        if (!PlayerDatas.Instance.fairyData.HasFairy)
+        {
+            return false;
+        }
+        return PlayerDatas.Instance.fairyData.GetMember(playerId) != null;
+    }
+
+    #region 鎴愬憳鍒楄〃鎺掑簭
+    private int m_SortType = 4;
+    public int sortType
+    {
+        get
+        {
+            return m_SortType;
+        }
+        set
+        {
+            m_SortType = value;
+        }
+    }
+    private bool m_Up = false;
+    public bool up
+    {
+        get
+        {
+            return m_Up;
+        }
+        set
+        {
+            m_Up = value;
+        }
+    }
+    public List<PlayerFairyData.FairyMember> sortFairyMembers = new List<PlayerFairyData.FairyMember>();
+    public void OnSort(int type)
+    {
+        if (sortType == type)
+        {
+            up = !up;
+        }
+        else
+        {
+            up = false;
+        }
+        sortType = type;
+        if (sortFairyMembers.Count > 0)
+        {
+            sortFairyMembers.Sort(Compare);
+        }
+    }
+    public int Compare(PlayerFairyData.FairyMember x, PlayerFairyData.FairyMember y)
+    {
+        int attach = up ? 1 : -1;
+        //鍦ㄧ嚎0 鎸傛満1 绂荤嚎2
+        uint olx = 2 - (x.Exattr2 > 1 ? 2 : x.Exattr2);
+        uint oly = 2 - (y.Exattr2 > 1 ? 2 : y.Exattr2);
+        switch (sortType)
+        {
+            case 1:
+                {
+                    if (x.LV.CompareTo(y.LV) != 0)
+                        return attach * x.LV.CompareTo(y.LV);
+                    if (olx.CompareTo(oly) != 0)
+                        return -olx.CompareTo(oly);
+                    if (x.Exattr2.CompareTo(y.Exattr2) != 0)
+                        return x.Exattr2.CompareTo(y.Exattr2);
+                    if (x.FamilyLV.CompareTo(y.FamilyLV) != 0)
+                        return -x.FamilyLV.CompareTo(y.FamilyLV);
+                    if (x.FamilyActiveValue.CompareTo(y.FamilyActiveValue) != 0)
+                        return -x.FamilyActiveValue.CompareTo(y.FamilyActiveValue);
+                }
+                break;
+            case 2:
+                {
+                    if (x.FamilyLV.CompareTo(y.FamilyLV) != 0)
+                        return attach * x.FamilyLV.CompareTo(y.FamilyLV);
+                    if (olx.CompareTo(oly) != 0)
+                        return -olx.CompareTo(oly);
+                    if (x.Exattr2.CompareTo(y.Exattr2) != 0)
+                        return x.Exattr2.CompareTo(y.Exattr2);
+                    if (x.LV.CompareTo(y.LV) != 0)
+                        return -x.LV.CompareTo(y.LV);
+                    if (x.FamilyActiveValue.CompareTo(y.FamilyActiveValue) != 0)
+                        return -x.FamilyActiveValue.CompareTo(y.FamilyActiveValue);
+                }
+                break;
+            case 3:
+                {
+                    if (x.FamilyActiveValue.CompareTo(y.FamilyActiveValue) != 0)
+                        return attach * x.FamilyActiveValue.CompareTo(y.FamilyActiveValue);
+                    if (olx.CompareTo(oly) != 0)
+                        return -olx.CompareTo(oly);
+                    if (x.Exattr2.CompareTo(y.Exattr2) != 0)
+                        return x.Exattr2.CompareTo(y.Exattr2);
+                    if (x.FamilyLV.CompareTo(y.FamilyLV) != 0)
+                        return -x.FamilyLV.CompareTo(y.FamilyLV);
+                    if (x.LV.CompareTo(y.LV) != 0)
+                        return -x.LV.CompareTo(y.LV);
+                }
+                break;
+            case 4:
+                {
+                    if (olx.CompareTo(oly) != 0)
+                        return attach * olx.CompareTo(oly);
+                    if (x.Exattr2.CompareTo(y.Exattr2) != 0)
+                        return attach * x.Exattr2.CompareTo(y.Exattr2);
+                    if (x.FamilyLV.CompareTo(y.FamilyLV) != 0)
+                        return -x.FamilyLV.CompareTo(y.FamilyLV);
+                    if (x.LV.CompareTo(y.LV) != 0)
+                        return -x.LV.CompareTo(y.LV);
+                    if (x.FamilyActiveValue.CompareTo(y.FamilyActiveValue) != 0)
+                        return -x.FamilyActiveValue.CompareTo(y.FamilyActiveValue);
+                }
+                break;
+        }
+        return 1;
+    }
+    #endregion
+
+    
+    #region 浠欑洘鍚嶉檺鍒�
+    public bool CheckFairyNameLimit(string _name, out int errorCode)
+    {
+        errorCode = 0;
+        if (string.IsNullOrEmpty(_name))
+        {
+            errorCode = 0;
+            return false;
+        }
+        if (DirtyWordConfig.IsDirtWord(_name) || UIHelper.HasSpecialCharac(_name)
+            || DirtyNameConfig.IsDirtName(_name))
+        {
+            errorCode = 1;
+            return false;
+        }
+        return true;
+    }
+    public void ShowFairyNameErrorTip(int _errorCode)
+    {
+        switch (_errorCode)
+        {
+            case 0:
+                SysNotifyMgr.Instance.ShowTip("FamilyNameChangeNoNull");
+                break;
+            case 1:
+                SysNotifyMgr.Instance.ShowTip("FamilyNameChangeUnlegal");
+                break;
+        }
+    }
+
+    public void SendChangeFairyName(string _name, int _itemIndex)
+    {
+        LanguageVerify.Instance.VerifyFairy(_name, 2, PlayerDatas.Instance.fairyData.fairy.FamilyName, PlayerDatas.Instance.fairyData.mine.FamilyLV, (bool ok, string content) =>
+        {
+            CA611_tagCMRenameFamily _pak = new CA611_tagCMRenameFamily();
+            _pak.NewName = content;
+            _pak.ItemIndex = (byte)_itemIndex;
+            _pak.NewNameLen = (byte)Encoding.UTF8.GetBytes(content).Length;
+            GameNetSystem.Instance.SendInfo(_pak);
+        });
+    }
+
+    public event Action<int> UpdateFairyChangeNameEvent;
+    public void UpdateFairyChangeName(H0F07_tagFamilyRenameResult _package)
+    {
+        if (UpdateFairyChangeNameEvent != null)
+        {
+            UpdateFairyChangeNameEvent(_package.Reasult);
+        }
+    }
+    #endregion
+
+   
+
+    #region 绾㈢偣
+
+
+    private void OnFuncStateChangeEvent(int _id)
+    {
+        if (_id == (int)FuncOpenEnum.Fairy)
+        {
+            UpdateAddFairyRedpoint();
+        }
+    }
+
+    private Redpoint m_FairyListRedpoint = new Redpoint(107, 10703);
+    private Redpoint m_AddFairyRedpoint = new Redpoint(10703, 1070301);
+    private const string FairyKey = "FairyAdd";
+    public void UpdateAddFairyRedpoint()
+    {
+        m_AddFairyRedpoint.state = RedPointState.None;
+        if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Fairy))
+        {
+            return;
+        }
+        if (PlayerDatas.Instance.fairyData.HasFairy)
+        {
+            return;
+        }
+        var _list = PlayerDatas.Instance.fairyData.GetFairyListByPage(0);
+        if (_list != null && _list.Count > 0)
+        {
+            for (int i = 0; i < _list.Count; i++)
+            {
+                var _cfg = FamilyConfig.Get(_list[i].FamilyLV);
+                if (_cfg != null)
+                {
+                    if (_list[i].AcceptJoin == 1 && _list[i].MemberCount < _cfg.MemberMax)
+                    {
+                        m_AddFairyRedpoint.state = RedPointState.Simple;
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
+    public void OnPlayerLoginOk()
+    {
+        page = 0;
+        OnSearchPageList();
+        UpdateFairyInfo();
+    }
+    #endregion
+
+
+    #region 浠欑洘鍟嗗簵寮�鍚�
+    public int fairyStoreLimit { get; private set; }
+    public bool fairyStoreOpen
+    {
+        get
+        {
+            if (PlayerDatas.Instance.fairyData.HasFairy)
+            {
+                var fairy = PlayerDatas.Instance.fairyData.fairy;
+                if (fairy != null && fairy.FamilyLV >= fairyStoreLimit)
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+    }
+
+    public void ProcessErrorTip()
+    {
+        if (!PlayerDatas.Instance.fairyData.HasFairy)
+        {
+            SysNotifyMgr.Instance.ShowTip("DailyQuestwinUnionLimit");
+        }
+        else if (PlayerDatas.Instance.fairyData.fairy.FamilyLV < fairyStoreLimit)
+        {
+            SysNotifyMgr.Instance.ShowTip("FairyStoreOpenLimit", fairyStoreLimit);
+        }
+    }
+    #endregion
+
+
+
+    #region 浠欑洘鑱旇禌寮�鍚�
+    public int fairyLeagueLimit
+    {
+        get; private set;
+    }
+
+    public bool SatisfyOpenFairyLeagueLv()
+    {
+        if (PlayerDatas.Instance.fairyData.HasFairy)
+        {
+            var fairy = PlayerDatas.Instance.fairyData.fairy;
+            if (fairy != null && fairy.FamilyLV >= fairyLeagueLimit)
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+    #endregion
+
+
+
+    
+
+    //瀹舵棌琛屼负鏁版嵁 鍥爐ype涓嶅悓鑰岄�昏緫涓嶅悓锛屼娇鐢ㄨ鏍规嵁鍔熻兘闇�姹傚悇鑷帴鏀跺鐞�
+    public void UpdateFamilyAction(HA403_tagGCFamilyActionInfo _package)
+    {
+        if (_package.ActionType != 13 && _package.ActionType != 14)
+            return;
+
+        if (!familyActions.ContainsKey((int)_package.FamilyID))
+        {
+
+            familyActions.Add((int)_package.FamilyID, new Dictionary<int, HA403_tagGCFamilyActionInfo.tagGCFamilyAction[]>());
+        }
+
+        familyActions[(int)_package.FamilyID][_package.ActionType] = _package.FamilyActionList;
+        FamilyActionInfoEvent?.Invoke((int)_package.FamilyID, _package.ActionType);
+    }
+}
\ No newline at end of file
diff --git a/Main/System/FairyUnion/FairyModel.cs.meta b/Main/System/FairyUnion/FairyModel.cs.meta
new file mode 100644
index 0000000..f445af5
--- /dev/null
+++ b/Main/System/FairyUnion/FairyModel.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 3be9797073d3cfc44b79252a1a0fa647
+timeCreated: 1508843329
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/FairyUnion/PlayerFairyData.cs b/Main/System/FairyUnion/PlayerFairyData.cs
new file mode 100644
index 0000000..7ca4ba6
--- /dev/null
+++ b/Main/System/FairyUnion/PlayerFairyData.cs
@@ -0,0 +1,437 @@
+锘縰sing System;
+using UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+
+
+/** 鐜╁浠欑洘鐩稿叧淇℃伅缂撳瓨鏁版嵁 */
+public class PlayerFairyData
+{
+    private bool hasFairy = false;
+    public bool HasFairy
+    {
+        get { return hasFairy; }
+    }
+
+    public int presentFairyCount { get; set; }
+
+
+
+    public FairyData fairy = null;
+    public FairyMember mine = null;
+    public event Action OnRefreshFairyInfo;
+    public event Action OnRefreshFairyMine;
+    private Dictionary<int, FairyMember> memberDic = new Dictionary<int, FairyMember>();
+    private List<FairyMember> eliteList = new List<FairyMember>();
+    public List<FairyMember> GetEliteList()
+    {
+        return eliteList;
+    }
+    /// <summary>
+    /// 鍓洘涓�
+    /// </summary>
+    private List<FairyMember> deputyLeaderList = new List<FairyMember>();
+    public List<FairyMember> GetDeputyLeaderList()
+    {
+        return deputyLeaderList;
+    }
+
+    public void OnRefreshFairy(H0F03_tagRoleFamilyInfo vNetData)
+    {
+        if (fairy == null)
+        {
+            fairy = new FairyData();
+        }
+        fairy.FamilyID = vNetData.FamilyID;
+        if (fairy.FamilyID != 0) hasFairy = true;
+        fairy.FamilyName = vNetData.FamilyName;
+        fairy.FamilyLV = vNetData.FamilyLV;
+        fairy.FamilyMoney = vNetData.FamilyMoney;
+        fairy.FamilyHornor = vNetData.FamilyHornor;
+        fairy.MemberCount = vNetData.MemberCount;
+        fairy.Broadcast = vNetData.Broadcast;
+        fairy.WarRank = vNetData.Point;
+        fairy.FamilyActiveValue = vNetData.FamilyActiveValue;
+        fairy.LastWeekFamilyActiveValue = vNetData.LastWeekFamilyActiveValue;
+        fairy.Extra1 = vNetData.Extra1;
+        fairy.Extra2 = vNetData.Extra2;
+        fairy.Extra3 = vNetData.Extra3;
+        fairy.Extra4 = vNetData.Extra4;
+        fairy.Extra5 = vNetData.Extra5;
+        fairy.Extra6 = vNetData.Extra6;
+        fairy.AcceptJoin = vNetData.AcceptJoin;
+
+        if (fairy.Member == null)
+        {
+            fairy.Member = new List<FairyMember>();
+        }
+
+        mine = null;
+
+        memberDic.Clear();
+        deputyLeaderList.Clear();
+        eliteList.Clear();
+        for (int i = 0; i < vNetData.MemberCount; i++)
+        {
+            FairyMember member = null;
+            if (i >= fairy.Member.Count)
+            {
+                member = new FairyMember();
+                fairy.Member.Add(member);
+            }
+            else
+            {
+                member = fairy.Member[i];
+            }
+            member.PlayerID = vNetData.Member[i].PlayerID;
+            member.Sex = vNetData.Member[i].Sex;
+            member.Name = UIHelper.ServerStringTrim(vNetData.Member[i].Name);
+            member.LV = vNetData.Member[i].LV;
+            member.ReincarnationLv = vNetData.Member[i].ReincarnationLv;
+            member.FamilyLV = vNetData.Member[i].FamilyLV;
+            member.FamilyName = UIHelper.ServerStringTrim(vNetData.Member[i].FamilyName);
+            member.Job = vNetData.Member[i].Job;
+            member.Face = vNetData.Member[i].Face;
+            member.FacePic = vNetData.Member[i].FacePic;
+            member.FamilyActiveValue = vNetData.Member[i].FamilyActiveValue;
+            member.LastWeekFamilyActiveValue = vNetData.Member[i].LastWeekFamilyActiveValue;
+            member.OperateInfo = vNetData.Member[i].OperateInfo;
+            member.OfficialRank = vNetData.Member[i].OfficialRank;
+            member.Exattr1 = vNetData.Member[i].Exattr1;
+            member.Exattr2 = vNetData.Member[i].Exattr2;
+            member.Exattr3 = vNetData.Member[i].Exattr3 + vNetData.Member[i].Exattr5 * (long)Constants.ExpPointValue;
+            member.Exattr4 = vNetData.Member[i].Exattr4;
+            member.Exattr5 = vNetData.Member[i].Exattr5;
+
+            memberDic.Add((int)member.PlayerID, member);
+
+            if (member.PlayerID == PlayerDatas.Instance.baseData.PlayerID)
+            {//鑷繁
+                mine = member;
+            }
+
+            if (member.FamilyLV == 1)
+            {
+                eliteList.Add(member);
+            }
+            else if (member.FamilyLV == 2)
+            {
+                deputyLeaderList.Add(member);
+            }
+            else if (member.FamilyLV == 3)
+            {
+                Leader = member;
+            }
+        }
+
+        for (int i = fairy.Member.Count - 1; i >= vNetData.MemberCount; i--)
+        {
+            FairyMember member = fairy.Member[i];
+            fairy.Member.RemoveAt(i);
+            member = null;
+        }
+
+        if (OnRefreshFairyInfo != null) OnRefreshFairyInfo();
+    }
+
+    public FairyMember GetMember(int playerid)
+    {
+        FairyMember member = null;
+        memberDic.TryGetValue(playerid, out member);
+        return member;
+    }
+
+    public FairyMember Leader
+    {
+        get;
+        private set;
+    }
+    #region 浠欑洘鍒楄〃
+    private bool isSearching = false;
+    public bool IsSearching
+    {
+        get { return isSearching; }
+    }
+    public const int PageCnt = 20;
+
+
+    public event Action OnRefreshFairyList;
+    public event Action OnRefreshFairySearch;
+
+    private Dictionary<int, List<FairyData>> fairyList = new Dictionary<int, List<FairyData>>();
+
+    private List<FairyData> searchList = new List<FairyData>();
+    public void OnRefreshFairy(HA408_tagGCPyAllFamilyView vNetData)
+    {
+        if (vNetData.IsSearching == 100)
+        {
+            return;
+        }
+
+        isSearching = vNetData.IsSearching == 1;
+
+        if (isSearching)
+        {
+            searchList.Clear();
+            for (int i = 0; i < vNetData.PageCount; i++)
+            {
+                FairyData data = null;
+                if (i >= searchList.Count)
+                {
+                    data = new FairyData();
+                    searchList.Add(data);
+                }
+                HA408_tagGCPyAllFamilyView.tagGCPyFamilyView view = vNetData.Family[i];
+                SetFairyViewData(data, view);
+            }
+            if (OnRefreshFairySearch != null) OnRefreshFairySearch();
+            return;
+        }
+        List<FairyData> list = null;
+        fairyList.TryGetValue(vNetData.CurPage, out list);
+        if (list == null)
+        {
+            list = new List<FairyData>(PageCnt);
+            fairyList.Add(vNetData.CurPage, list);
+        }
+        list.Clear();
+        for (int i = 0; i < vNetData.PageCount; i++)
+        {
+            FairyData data = null;
+            if (i >= list.Count)
+            {
+                data = new FairyData();
+                list.Add(data);
+            }
+            HA408_tagGCPyAllFamilyView.tagGCPyFamilyView view = vNetData.Family[i];
+            SetFairyViewData(data, view);
+        }
+        presentFairyCount = 0;
+        foreach (var _list in fairyList.Values)
+        {
+            presentFairyCount += _list.Count;
+        }
+        if (OnRefreshFairyList != null)
+        {
+            OnRefreshFairyList();
+        }
+        FairyModel.Instance.UpdateAddFairyRedpoint();
+    }
+
+    public List<FairyData> GetSearchFairy()
+    {
+        return searchList;
+    }
+
+    public static void SetFairyViewData(FairyData data, HA408_tagGCPyAllFamilyView.tagGCPyFamilyView view)
+    {
+        data.FamilyID = view.FamilyID;
+        data.FamilyIndex = view.FamilyIndex;
+        data.FamilyName = view.FamilyName;
+        data.leaderID = view.LeaderID;
+        data.leaderName = view.LeaderName;
+        data.FamilyLV = view.FamilyLV;
+        data.MemberCount = view.FamilyMemberCount;
+        data.OfficialRank = view.LeaderOfficialRank;
+        data.AcceptJoin = view.JoinAccept;
+        data.totalFightPower = (ulong)view.TotalFightPowerEx * Constants.ExpPointValue + view.TotalFightPower;
+        data.WarRank = view.WarRank;
+        data.EmblemID = view.EmblemID;
+}
+
+    public void OnRefreshFairy(H0430_tagPlayerInFamilyInfoRefresh vNetData)
+    {
+        if (vNetData.FamilyNameLen > 0)
+        {
+            if (fairy == null)
+            {
+                fairy = new FairyData();
+            }
+
+            if (mine != null)
+            {
+                mine.FamilyLV = vNetData.FamilyMemberLV;
+            }
+        }
+        else
+        {
+            ClearFairyData();
+            LocalChatHistory.Clear(ChatInfoType.Fairy);
+            // WindowCenter.Instance.Close<UnionPanel>();
+        }
+        if (OnRefreshFairyMine != null)
+        {
+            OnRefreshFairyMine();
+        }
+        UpdateRequestRedpoint();
+    }
+
+    public void OnRefreshFairy(H0F05_tagFamilyChange vNetData)
+    {
+        FairyModel.Instance.UpdateFairyInfo();
+    }
+
+    public void ClearFairyList()
+    {
+        fairyList.Clear();
+    }
+
+    public List<FairyData> GetFairyListByPage(int page)
+    {
+        List<FairyData> list = null;
+        fairyList.TryGetValue(page, out list);
+        return list;
+    }
+
+    public void ClearFairyData()
+    {
+        hasFairy = false;
+        fairy = null;
+        mine = null;
+        applyList.Clear();
+        //ChatCtrl.Inst.ClearChatInfo(ChatInfoType.Fairy);
+    }
+    #endregion
+
+    #region 鐢宠鍒楄〃
+    public event Action OnRefreshApplyList;
+    private List<FairyApply> applyList = new List<FairyApply>();
+    private Redpoint applyRedpoint = new Redpoint(10702, 1070201);
+    private Redpoint memberRedpoint = new Redpoint(107, 10702);
+    public void OnRefreshFairy(HA401_tagGCViewFamilyRequestInfo vNetData)
+    {
+        applyList.Clear();
+        for (int i = 0; i < vNetData.RequestMemberCount; i++)
+        {
+            FairyApply apply = new FairyApply();
+            apply.Name = vNetData.MemberInfo[i].Name;
+            apply.PlayerID = vNetData.MemberInfo[i].PlayerID;
+            apply.PlayerLV = vNetData.MemberInfo[i].PlayerLV;
+            apply.PlayeJob = vNetData.MemberInfo[i].PlayeJob;
+            apply.PlayeFightPower = vNetData.MemberInfo[i].PlayeFightPower + vNetData.MemberInfo[i].PlayeFightPowerEx * (long)Constants.ExpPointValue;
+            apply.RequestTime = vNetData.MemberInfo[i].RequestTime;
+            apply.IsOnLine = vNetData.MemberInfo[i].IsOnLine;
+            applyList.Add(apply);
+        }
+        if (OnRefreshApplyList != null)
+        {
+            OnRefreshApplyList();
+        }
+        UpdateRequestRedpoint();
+    }
+
+    void UpdateRequestRedpoint()
+    {
+        if (HasFairy && IsCanFunc(LimitFunc.CanCall))
+        {
+            applyRedpoint.state = applyList.Count > 0 ? RedPointState.Simple : RedPointState.None;
+        }
+        else
+        {
+            applyRedpoint.state = RedPointState.None;
+        }
+    }
+
+    public List<FairyApply> GetApplyList()
+    {
+        return applyList;
+    }
+    #endregion
+
+
+
+    #region 浠欑洘鏉冨姏寮�鍚潯浠�
+    public int[] funcArray = null;
+    public bool IsCanFunc(LimitFunc funcType)
+    {
+        if (funcArray == null)
+        {
+            funcArray = ConfigParse.GetMultipleStr<int>(FuncConfigConfig.Get("FamilyPurview").Numerical1);
+        }
+        if (funcArray != null && funcArray.Length > 6)
+        {
+            if (mine != null)
+            {
+                return mine.FamilyLV >= funcArray[(int)funcType];
+            }
+        }
+        return false;
+    }
+    #endregion
+
+    public class FairyData
+    {
+        public uint FamilyID;
+        public string FamilyName;    //瀹舵棌鍚嶇О
+        public ushort FamilyLV;    //瀹舵棌绛夌骇
+        public uint FamilyMoney;    //璧勯噾
+        public uint FamilyHornor;    //鑽h獕
+        public ushort MemberCount;    //浜烘暟
+        public uint Point;    //瀹舵棌鎴樼Н鍒�
+        public string Broadcast;    //size = BroadcastLen
+        public uint FamilyActiveValue;    //鏈懆瀹舵棌娲昏穬搴�
+        public uint LastWeekFamilyActiveValue;    //涓婂懆瀹舵棌娲昏穬搴�	
+        public List<FairyMember> Member = null;    //size = MemberCount
+        public uint Extra1;    //闄勫姞瀛楁1
+        public uint Extra2;    //闄勫姞瀛楁2
+        public uint Extra3;    //闄勫姞瀛楁3
+        public uint Extra4;    //闄勫姞瀛楁4
+        public uint Extra5;    //闄勫姞瀛楁5
+        public uint Extra6;    //闄勫姞瀛楁6 浠欑洘褰撳墠浣╂埓鐨勫窘绔營D
+        public byte AcceptJoin;    //鏄惁鎺ュ彈鐢宠
+        public uint WarRank;  //浠欑洘鑱旇禌鎺掑悕
+        public ulong totalFightPower;
+        public int EmblemID;  //浠欑洘寰界珷ID
+        #region 鏌ユ壘涓撶敤瀛楁
+        public ushort FamilyIndex;
+        public uint leaderID;
+        public string leaderName;
+        public byte OfficialRank;        //澧冪晫
+        #endregion
+    }
+
+    public class FairyMember
+    {
+        public uint PlayerID;
+        public byte Sex;        //鎬у埆
+        public string Name;        //size = NameLen
+        public ushort LV;
+        public ushort ReincarnationLv;
+        public byte FamilyLV;        //瀹舵棌绛夌骇
+        public string FamilyName;        //size = FamilyNameLen
+        public byte Job;        //鑱屼笟
+        public uint Face;        //澶村儚
+        public uint FacePic;        //澶村儚澶栨
+        public byte OfficialRank;        //澧冪晫
+        public uint FamilyActiveValue;        //鏈懆瀹舵棌娲昏穬搴�
+        public uint LastWeekFamilyActiveValue;        //涓婂懆瀹舵棌娲昏穬搴�	
+        public uint Exattr1;        //鎵╁睍灞炴��
+        public uint Exattr2;        //姣忓懆浠欑洘璧勯噾涓婇檺
+        public long Exattr3;        //鎵╁睍灞炴��
+        public uint Exattr4;        //鎵╁睍灞炴��
+        public uint Exattr5;        //鎵╁睍灞炴��
+        public uint OperateInfo;        //鐜╁闄勫姞杩愯惀鍟嗕俊鎭�
+    }
+
+    public class FairyApply
+    {
+        public uint PlayerID;        //鐜╁ID
+        public string Name;        //size=NameLen
+        public ushort PlayerLV;        //鐜╁绛夌骇
+        public byte PlayeJob;        //鐜╁鑱屼笟
+        public long PlayeFightPower;        //鐜╁鎴樻枟鍔�
+        public uint RequestTime;        //鐢宠鏃堕棿
+        public byte IsOnLine;        //鏄惁鍦ㄧ嚎
+    }
+
+    public enum LimitFunc
+    {
+        CanCall = 0,
+        CanJobTitle = 1,
+        CanNotify = 2,
+        CanLvUp = 3,
+        CanClearTreasury = 4,
+        CanKick = 5,
+        CanOpenBoss = 6,
+    }
+}
\ No newline at end of file
diff --git a/Main/System/FairyUnion/PlayerFairyData.cs.meta b/Main/System/FairyUnion/PlayerFairyData.cs.meta
new file mode 100644
index 0000000..b1ce92e
--- /dev/null
+++ b/Main/System/FairyUnion/PlayerFairyData.cs.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 1e7db462662fa3f41b9b1051315190eb
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
diff --git a/Main/System/HappyXB.meta b/Main/System/HappyXB.meta
new file mode 100644
index 0000000..7217b16
--- /dev/null
+++ b/Main/System/HappyXB.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 6010e3ebc98aac2408a40f41efe92c38
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/HappyXB/HappyXBModel.cs b/Main/System/HappyXB/HappyXBModel.cs
new file mode 100644
index 0000000..a0e2efe
--- /dev/null
+++ b/Main/System/HappyXB/HappyXBModel.cs
@@ -0,0 +1,1074 @@
+锘縰sing LitJson;
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEngine;
+
+
+public class HappyXBModel : GameSystemManager<HappyXBModel>
+{
+    private Dictionary<string, XBGetItemConfig> xbGetItemDict = new Dictionary<string, XBGetItemConfig>();
+    private Dictionary<int, List<XBGetItemConfig>> xbTypeItemDict = new Dictionary<int, List<XBGetItemConfig>>();
+    private Dictionary<string, Dictionary<int, XBGetItem>> jobXBItemDict = new Dictionary<string, Dictionary<int, XBGetItem>>();
+    private Dictionary<int, XBFuncSet> xbFuncSetDict = new Dictionary<int, XBFuncSet>();
+    public Dictionary<int, int> XBCostTypeDict = new Dictionary<int, int>();
+    public HappXBTitle title = HappXBTitle.Best;
+
+
+    public string USETOOLXBKey = string.Empty;
+    public static string HAPPYXBITEMKEY;
+    public List<ArrayList> XBNotifyParms = new List<ArrayList>();
+    public bool isXBCoolTime { get; set; }
+
+    public bool isJumpBestXB { get; set; }
+    public bool isJumpRuneXB { get; set; }
+    public bool isJumpGubaoXB { get; set; }
+    public bool isJumpGatherSoulXB { get; set; } //鑱氶瓊瀵诲疂锛氭槸鍚﹁烦杩囧姩鐢�
+
+    public override void Init()
+    {
+        isJumpBestXB = false;
+        isJumpRuneXB = false;
+        isJumpGubaoXB = false;
+        isJumpGatherSoulXB = false;
+        xbGetItemDict.Clear();
+        xbTypeItemDict.Clear();
+        xbFuncSetDict.Clear();
+        List<XBGetItemConfig> list = XBGetItemConfig.GetValues();
+        for (int i = 0; i < list.Count; i++)
+        {
+            string key = StringUtility.Contact(list[i].TreasureType, list[i].MinLV);
+            if (!xbGetItemDict.ContainsKey(key))
+            {
+                xbGetItemDict.Add(key, list[i]);
+            }
+
+            if (!xbTypeItemDict.ContainsKey(list[i].TreasureType))
+            {
+                List<XBGetItemConfig> typeItemlist = new List<XBGetItemConfig>();
+                typeItemlist.Add(list[i]);
+                xbTypeItemDict.Add(list[i].TreasureType, typeItemlist);
+            }
+            else
+            {
+                xbTypeItemDict[list[i].TreasureType].Add(list[i]);
+            }
+        }
+
+        SetXBFuncDict(1);
+        SetXBFuncDict(2);
+        var treasureIDArr = JsonMapper.ToObject<int[]>(FuncConfigConfig.Get("TreasureLuckyDraw").Numerical1);
+        for (int i = 0; i < treasureIDArr.Length; i++)
+        {
+            int type = XBGetItemConfig.Get(treasureIDArr[i]).TreasureType;
+            SetXBFuncDict(type);
+        }
+
+        SetXBFuncDict(105);
+        SetXBFuncDict(106);
+        SetXBFuncDict(107);
+        SetXBFuncDict(108);
+        SysNotifyMgr.Instance.RegisterCondition("HappyXB", SatisfyNotifyCondition);
+
+        XBCostTypeDict.Clear();
+
+        XBCostTypeDict[(int)HappXBTitle.Best] = TreasureSetConfig.Get(1).CostMoneyType;
+        XBCostTypeDict[(int)HappXBTitle.Rune] = TreasureSetConfig.Get(2).CostMoneyType;
+        for (int i = 0; i < treasureIDArr.Length; i++)
+        {
+            int type = XBGetItemConfig.Get(treasureIDArr[i]).TreasureType;
+            XBCostTypeDict[(int)HappXBTitle.Gubao1 + i] = TreasureSetConfig.Get(type).CostMoneyType;
+        }
+        XBCostTypeDict[(int)HappXBTitle.YunShi1] = TreasureSetConfig.Get(105).CostMoneyType;
+        XBCostTypeDict[(int)HappXBTitle.YunShi2] = TreasureSetConfig.Get(106).CostMoneyType;
+        XBCostTypeDict[(int)HappXBTitle.YunShi3] = TreasureSetConfig.Get(107).CostMoneyType;
+        XBCostTypeDict[(int)HappXBTitle.YunShi4] = TreasureSetConfig.Get(108).CostMoneyType;
+    }
+
+
+
+    public void OnBeforePlayerDataInitialize()
+    {
+        PlayerDatas.Instance.playerDataRefreshEvent -= RefreshStoreScore;
+        FuncOpen.Instance.OnFuncStateChangeEvent -= UpdateFuncState;
+        PackManager.Instance.refreshItemCountEvent -= RefreshXBTool;
+        isXBCoolTime = false;
+        XBNotifyParms.Clear();
+        xbTypeInfoDict.Clear();
+    }
+    public void OnAfterPlayerDataInitialize()
+    {
+        SetXBGetItemModel();
+    }
+    public void OnPlayerLoginOk()
+    {
+        int playerId = (int)PlayerDatas.Instance.baseData.PlayerID;
+        HAPPYXBITEMKEY = StringUtility.Contact(playerId, "HappyXBItemTime");
+        USETOOLXBKey = StringUtility.Contact(playerId, "UseToolXB");
+        XBWarehouseRedPoint();
+        PlayerDatas.Instance.playerDataRefreshEvent += RefreshStoreScore;
+        PackManager.Instance.refreshItemCountEvent += RefreshXBTool;
+        FuncOpen.Instance.OnFuncStateChangeEvent += UpdateFuncState;
+    }
+
+
+    /// <summary>
+    /// 妫�娴嬭嚜韬帺瀹舵槸鍚﹂渶瑕佷俊鎭彁绀�
+    /// </summary>
+    /// <param name="key"></param>
+    /// <param name="paramArray"></param>
+    /// <returns></returns>
+    private bool SatisfyNotifyCondition(string key, ArrayList paramArray)
+    {
+        switch (title)
+        {
+            case HappXBTitle.Best:
+                if (isJumpBestXB)
+                {
+                    return true;
+                }
+                break;
+            case HappXBTitle.Rune:
+                if (isJumpRuneXB)
+                {
+                    return true;
+                }
+                break;
+            case HappXBTitle.Gubao1:
+            case HappXBTitle.Gubao2:
+            case HappXBTitle.Gubao3:
+            case HappXBTitle.Gubao4:
+                if (isJumpGubaoXB)
+                {
+                    return true;
+                }
+                break;
+            case HappXBTitle.GatherSoul:
+                if (isJumpGatherSoulXB)
+                {
+                    return true;
+                }
+                break;
+            case HappXBTitle.YunShi1:
+            case HappXBTitle.YunShi2:
+            case HappXBTitle.YunShi3:
+            case HappXBTitle.YunShi4:
+                // if (ModelCenter.Instance.GetModelEx<YunShiXBActModel>().isSkipXB)
+                // {
+                //     return true;
+                // }
+                break;
+        }
+
+        XBNotifyParms.Add(new ArrayList(paramArray));
+        if (paramArray != null && paramArray.Count > 0 &&
+            paramArray[0].Equals(UIHelper.ServerStringTrim(PlayerDatas.Instance.baseData.PlayerName)))
+        {
+            return false;
+        }
+        return true;
+    }
+
+    public void GetNotifyResult(int itemId, int itemCount)
+    {
+        int notifyIndex = 0;
+        if (CheckNotifyItemByIdAndCnt(itemId, itemCount, out notifyIndex))
+        {
+            SysNotifyMgr.Instance.ShowTip("HappyXB", XBNotifyParms[notifyIndex].ToArray());
+        }
+    }
+
+    private bool CheckNotifyItemByIdAndCnt(int itemId, int itemCnt, out int notifyIndex)
+    {
+        notifyIndex = 0;
+        for (int i = 0; i < XBNotifyParms.Count; i++)
+        {
+            if (XBNotifyParms[i] != null && XBNotifyParms[i].Count > 3)
+            {
+                int notifyItemId = 0;
+                int.TryParse(XBNotifyParms[i][1].ToString(), out notifyItemId);
+                int notifyItemCnt = 0;
+                int.TryParse(XBNotifyParms[i][3].ToString(), out notifyItemCnt);
+                if (notifyItemId == itemId && notifyItemCnt == itemCnt)
+                {
+                    notifyIndex = i;
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    private void SetXBFuncDict(int type)
+    {
+        var treasureSetCfg = TreasureSetConfig.Get(type);
+        if (!xbFuncSetDict.ContainsKey(type))
+        {
+            XBFuncSet funcSet = new XBFuncSet();
+            funcSet.xbType = type;
+            funcSet.xbNums = treasureSetCfg.TreasureCountList;
+
+            funcSet.xbPrices = treasureSetCfg.CostMoneyList;
+
+            funcSet.costToolIds = new int[] { treasureSetCfg.CostItemID, treasureSetCfg.CostItemID };
+            funcSet.costToolNums = treasureSetCfg.CostItemCountList;
+            funcSet.dailyFreeCount = treasureSetCfg.DailyFreeCount;
+            funcSet.xbScores = new int[] { treasureSetCfg.AwardMoneyValue, treasureSetCfg.AwardMoneyValue * treasureSetCfg.TreasureCountList[1] };
+
+            xbFuncSetDict.Add(funcSet.xbType, funcSet);
+        }
+    }
+
+    public XBFuncSet GetXBFuncSet(int type)
+    {
+        XBFuncSet funcSet = null;
+        xbFuncSetDict.TryGetValue(type, out funcSet);
+        return funcSet;
+    }
+
+    //榛樿浼樺厛浣跨敤閬撳叿瀵诲疂
+    public bool IsUseToolXB()
+    {
+        return true;
+        //if (!PlayerPrefs.HasKey(USETOOLXBKey))
+        //{
+        //    LocalSave.SetBool(USETOOLXBKey, true);
+        //    return true;
+        //}
+        //else
+        //{
+        //    return LocalSave.GetBool(USETOOLXBKey);
+        //}
+    }
+
+    public void SetUseToolXB(bool isToolXB)
+    {
+        //LocalSave.SetBool(USETOOLXBKey, isToolXB);
+    }
+
+    private void SetXBGetItemModel()
+    {
+        jobXBItemDict.Clear();
+        Dictionary<int, XBGetItem> getItemDict = new Dictionary<int, XBGetItem>();
+        Dictionary<int, List<int>> jobItemDict = new Dictionary<int, List<int>>();
+        int playerJob = PlayerDatas.Instance.baseData.Job;
+        foreach (var key in xbGetItemDict.Keys)
+        {
+
+            getItemDict.Clear();
+            jobItemDict.Clear();
+            Dictionary<int, XBGetItem> jobGetItemDict = new Dictionary<int, XBGetItem>();
+            XBGetItemConfig getItemConfig = xbGetItemDict[key];
+            jobXBItemDict.Add(key, jobGetItemDict);
+            JsonData getItemJson = JsonMapper.ToObject(getItemConfig.GridItemInfo);
+            foreach (var grid in getItemJson.Keys)
+            {
+                int id = int.Parse(getItemJson[grid][0].ToString());
+                int count = int.Parse(getItemJson[grid][1].ToString());
+                XBGetItem getItem = new XBGetItem();
+                getItem.SetModel(int.Parse(grid), id, count);
+                getItemDict.Add(getItem.gridIndex, getItem);
+            }
+            JsonData jobReplaceJson = JsonMapper.ToObject(getItemConfig.JobItemList);
+            if (jobReplaceJson.IsArray)
+            {
+                for (int i = 0; i < jobReplaceJson.Count; i++)
+                {
+                    List<int> itemIdlist = new List<int>();
+                    jobItemDict.Add(i, itemIdlist);
+                    if (jobReplaceJson[i].IsArray)
+                    {
+                        for (int j = 0; j < jobReplaceJson[i].Count; j++)
+                        {
+                            int id = int.Parse(jobReplaceJson[i][j].ToString());
+                            itemIdlist.Add(id);
+                        }
+                    }
+                }
+            }
+
+            foreach (var model in getItemDict.Values)
+            {
+                ItemConfig itemConfig = ItemConfig.Get(model.itemId);
+                if (itemConfig.JobLimit == 0)
+                {
+                    jobGetItemDict.Add(model.gridIndex, model);
+                }
+                else
+                {
+                    bool isReplace = false;
+                    foreach (var list in jobItemDict.Values)
+                    {
+                        if (list.Contains(model.itemId))
+                        {
+                            for (int i = 0; i < list.Count; i++)
+                            {
+                                int equipJob = int.Parse(list[i].ToString().Substring(0, 1));
+                                if (playerJob == equipJob)
+                                {
+                                    isReplace = true;
+                                    XBGetItem getItem = new XBGetItem();
+                                    getItem.SetModel(model.gridIndex, list[i], model.count);
+                                    jobGetItemDict.Add(getItem.gridIndex, getItem);
+                                    break;
+                                }
+                            }
+                            break;
+                        }
+                    }
+                    if (!isReplace)
+                    {
+                        jobGetItemDict.Add(model.gridIndex, model);
+                    }
+                }
+
+            }
+
+        }
+
+    }
+
+    public Dictionary<int, XBGetItem> GetXBGetItemByID(int type)
+    {
+        int lv = 0;
+        List<XBGetItemConfig> configlist = null;
+        xbTypeItemDict.TryGetValue(type, out configlist);
+        if (configlist != null)
+        {
+            for (int i = configlist.Count - 1; i > -1; i--)
+            {
+                if (PlayerDatas.Instance.baseData.LV >= configlist[i].MinLV)
+                {
+                    lv = configlist[i].MinLV;
+                    break;
+                }
+            }
+        }
+        string key = StringUtility.Contact(type, lv);
+        Dictionary<int, XBGetItem> dict = null;
+        jobXBItemDict.TryGetValue(key, out dict);
+        return dict;
+    }
+
+    public XBGetItemConfig GetXBItemConfigByType(int type)
+    {
+        int lv = 0;
+        List<XBGetItemConfig> configlist = null;
+        xbTypeItemDict.TryGetValue(type, out configlist);
+        if (configlist != null)
+        {
+            for (int i = configlist.Count - 1; i > -1; i--)
+            {
+                if (PlayerDatas.Instance.baseData.LV >= configlist[i].MinLV)
+                {
+                    lv = configlist[i].MinLV;
+                    break;
+                }
+            }
+        }
+        XBGetItemConfig xbItemConfig = null;
+        string key = StringUtility.Contact(type, lv);
+        xbGetItemDict.TryGetValue(key, out xbItemConfig);
+        return xbItemConfig;
+    }
+
+    #region 澶勭悊鏈嶅姟绔暟鎹�
+    public event Action RefreshXBTypeInfoAct;
+    public event Action RefreshXBResultAct;
+    public int addXBScore { get; private set; }
+    public int addXBScoreType { get; private set; } //瀵诲疂绉垎璐у竵绫诲瀷
+    public int addXBLuckValue { get; private set; }
+    private Dictionary<int, XBGetItem> xbResultDict = new Dictionary<int, XBGetItem>();
+    public void GetServerXBResult(HA350_tagMCTreasureResult result)
+    {
+        XBNotifyParms.Clear();
+        xbResultDict.Clear();
+        addXBScore = result.AddMoneyValue;
+        addXBScoreType = result.AddMoneyType;
+        addXBLuckValue = result.AddTreasureLuck;
+        JsonData resultData = JsonMapper.ToObject(result.TreasureResult);
+        if (resultData.IsArray)
+        {
+            for (int i = 0; i < resultData.Count; i++)
+            {
+                if (resultData[i].IsArray)
+                {
+                    int index = int.Parse(resultData[i][0].ToString());
+                    int itemId = int.Parse(resultData[i][1].ToString());
+                    int count = int.Parse(resultData[i][2].ToString());
+                    XBGetItem getItem = new XBGetItem();
+                    getItem.SetModel(index, itemId, count);
+                    if (!xbResultDict.ContainsKey(i))
+                    {
+                        xbResultDict.Add(i, getItem);
+                    }
+                    else
+                    {
+                        xbResultDict[i] = getItem;
+                    }
+                }
+            }
+        }
+        SetXBResultRecord();
+        isXBCoolTime = false;
+        if (RefreshXBResultAct != null)
+        {
+            RefreshXBResultAct();
+        }
+    }
+
+    List<string> itemGetTimeArray = new List<string>();
+    List<string> getNewItemLoglist = new List<string>();
+    List<XBGetItem> xbItemRecordlist = new List<XBGetItem>();
+    public void SetXBResultRecord()
+    {
+        if (PlayerPrefs.HasKey(HAPPYXBITEMKEY))
+        {
+            itemGetTimeArray = LocalSave.GeStringArray(HappyXBModel.HAPPYXBITEMKEY).ToList();
+        }
+        else
+        {
+            itemGetTimeArray.Clear();
+        }
+        xbItemRecordlist.Clear();
+        getNewItemLoglist.Clear();
+        xbItemRecordlist.AddRange(GetXBResultlist());
+        if (xbItemRecordlist != null)
+        {
+            int remianLogNum = (itemGetTimeArray.Count + xbItemRecordlist.Count) - 30;
+            if (remianLogNum > 0)
+            {
+                int startIndex = itemGetTimeArray.Count - remianLogNum;
+                itemGetTimeArray.RemoveRange(startIndex, remianLogNum);
+            }
+            xbItemRecordlist.Sort(CompareByTime);
+            for (int i = 0; i < xbItemRecordlist.Count; i++)
+            {
+                string log = Language.Get("HappyXBGetItemTime", xbItemRecordlist[i].createTimeStr, UIHelper.ServerStringTrim(PlayerDatas.Instance.baseData.PlayerName),
+                    xbItemRecordlist[i].itemId, xbItemRecordlist[i].count);
+                getNewItemLoglist.Add(log);
+            }
+            if (getNewItemLoglist.Count > 0)
+            {
+                itemGetTimeArray.InsertRange(0, getNewItemLoglist);
+                LocalSave.SetStringArray(HappyXBModel.HAPPYXBITEMKEY, itemGetTimeArray.ToArray());
+            }
+
+        }
+    }
+
+    public int CompareByTime(XBGetItem start, XBGetItem end)
+    {
+        DateTime startTime = start.createTime;
+        DateTime endTime = end.createTime;
+        if (startTime.CompareTo(endTime) != 0) return -startTime.CompareTo(endTime);
+
+        return 0;
+    }
+
+    public List<XBGetItem> rangelist = new List<XBGetItem>();
+    List<int> index = new List<int>();
+    public List<XBGetItem> GetXBResultlist()
+    {
+        rangelist.Clear();
+        index.Clear();
+        List<XBGetItem> xbItemlist = xbResultDict.Values.ToList();
+        for (int i = 0; i < xbItemlist.Count; i++)
+        {
+            index.Add(i);
+        }
+        SetRandomList(xbItemlist);
+        return rangelist;
+    }
+
+    public void SetRandomList(List<XBGetItem> xbItemlist)
+    {
+        int currentRandom = UnityEngine.Random.Range(0, index.Count);
+        XBGetItem current = xbItemlist[index[currentRandom]];
+        if (!rangelist.Contains(current))
+        {
+            rangelist.Add(current);
+            index.Remove(index[currentRandom]);
+
+        }
+        if (index.Count > 0)
+        {
+            SetRandomList(xbItemlist);
+        }
+    }
+
+    public Dictionary<int, XBGetItem> GetXbResultDict()
+    {
+        return xbResultDict;
+    }
+
+    public void ClearXBRusltData()
+    {
+        xbResultDict.Clear();
+    }
+
+    private Dictionary<int, XBTypeInfo> xbTypeInfoDict = new Dictionary<int, XBTypeInfo>();
+    public void GetServerXBInfo(HA351_tagMCTreasureInfo info)
+    {
+        for (int i = 0; i < info.InfoCount; i++)
+        {
+            if (!xbTypeInfoDict.ContainsKey(info.TreasuerInfoList[i].TreasureType))
+            {
+                XBTypeInfo typeInfo = new XBTypeInfo();
+                typeInfo.xbType = info.TreasuerInfoList[i].TreasureType;
+                typeInfo.luckValue = info.TreasuerInfoList[i].LuckValue;
+                typeInfo.freeCountToday = info.TreasuerInfoList[i].FreeCountToday;
+                typeInfo.treasureCount = (int)info.TreasuerInfoList[i].TreasureCount;
+                typeInfo.treasureCountToday = (int)info.TreasuerInfoList[i].TreasureCountToday;
+                typeInfo.treasureCntAward = (int)info.TreasuerInfoList[i].TreasureCntAward;
+                if (typeInfo.gridLimitCntDict == null)
+                    typeInfo.gridLimitCntDict = new Dictionary<int, int>();
+                for (int j = 0; j < info.TreasuerInfoList[i].GridLimitCntList.Length; j++)
+                {
+                    int num = info.TreasuerInfoList[i].GridLimitCntList[j].GridNum;
+                    int cnt = info.TreasuerInfoList[i].GridLimitCntList[j].GridCnt;
+                    typeInfo.gridLimitCntDict[num] = cnt;
+                }
+                xbTypeInfoDict.Add(info.TreasuerInfoList[i].TreasureType, typeInfo);
+            }
+            else
+            {
+                xbTypeInfoDict[info.TreasuerInfoList[i].TreasureType].luckValue = info.TreasuerInfoList[i].LuckValue;
+                xbTypeInfoDict[info.TreasuerInfoList[i].TreasureType].freeCountToday = info.TreasuerInfoList[i].FreeCountToday;
+                xbTypeInfoDict[info.TreasuerInfoList[i].TreasureType].treasureCount = (int)info.TreasuerInfoList[i].TreasureCount;
+                xbTypeInfoDict[info.TreasuerInfoList[i].TreasureType].treasureCountToday = (int)info.TreasuerInfoList[i].TreasureCountToday;
+                xbTypeInfoDict[info.TreasuerInfoList[i].TreasureType].treasureCntAward = (int)info.TreasuerInfoList[i].TreasureCntAward;
+                if (xbTypeInfoDict[info.TreasuerInfoList[i].TreasureType].gridLimitCntDict == null)
+                    xbTypeInfoDict[info.TreasuerInfoList[i].TreasureType].gridLimitCntDict = new Dictionary<int, int>();
+                for (int j = 0; j < info.TreasuerInfoList[i].GridLimitCntList.Length; j++)
+                {
+                    int num = info.TreasuerInfoList[i].GridLimitCntList[j].GridNum;
+                    int cnt = info.TreasuerInfoList[i].GridLimitCntList[j].GridCnt;
+                    xbTypeInfoDict[info.TreasuerInfoList[i].TreasureType].gridLimitCntDict[num] = cnt;
+                }
+            }
+        }
+
+
+        if (RefreshXBTypeInfoAct != null)
+        {
+            RefreshXBTypeInfoAct();
+        }
+
+        BestAndRuneXBRedPoint();
+    }
+
+    public XBTypeInfo GetXBInfoByType(int type)
+    {
+        XBTypeInfo typeInfo = null;
+        xbTypeInfoDict.TryGetValue(type, out typeInfo);
+        return typeInfo;
+    }
+
+    /// <summary>
+    /// type 1 鏋佸搧瀵诲疂 2 绗﹀嵃瀵诲疂  index 0 鍗曟瀵诲疂 1 澶氭瀵诲疂
+    ///costType 0-榛樿浠欑帀锛�1-鍏嶈垂娆℃暟锛�2-瀵诲疂閬撳叿
+    /// </summary>
+    /// <param name="type"></param>
+    /// <param name="index"></param>
+    public event Action<int> StartXBEvent;
+    public void SendXBQuest(int type, int index, int costType)
+    {
+        isXBCoolTime = true;
+        CA568_tagCMRequestTreasure treasure = new CA568_tagCMRequestTreasure();
+        treasure.TreasureType = (byte)type;
+        treasure.TreasureIndex = (byte)index;
+        treasure.CostType = (byte)costType;
+        GameNetSystem.Instance.SendInfo(treasure);
+        if (StartXBEvent != null)
+        {
+            StartXBEvent(index);
+        }
+    }
+
+
+
+    public bool CheckIsEmptyGrid(PackType type, int needGrid = 1)
+    {
+        switch (type)
+        {
+            case PackType.Treasure:
+                SinglePack singlePack = PackManager.Instance.GetSinglePack(type);
+                if (GeneralDefine.maxXBGridCount - singlePack.GetAllItems().Count < needGrid)
+                {
+                    SysNotifyMgr.Instance.ShowTip("XBWarehouseFull");
+                    return false;
+                }
+                break;
+            case PackType.Item:
+                if (PackManager.Instance.GetEmptyGridCount(type) < needGrid)
+                {
+                    SysNotifyMgr.Instance.ShowTip("BagFull");
+                    return false;
+                }
+                break;
+        }
+        return true;
+    }
+
+    public void SendOneXBQuest(PackType type, int xbType)
+    {
+        var config = TreasureSetConfig.Get(xbType);
+        if (GetXBInfoByType(xbType).treasureCountToday + config.TreasureCountList[0] > config.DailyMaxCount)
+        {
+            SysNotifyMgr.Instance.ShowTip("XBTodayMax");
+            return;
+        }
+
+        var funcSet = GetXBFuncSet(xbType);
+        if (CheckIsEmptyGrid(type))
+        {
+            if (IsHaveOneXBTool(xbType))
+            {
+                SendXBQuest(xbType, 0, 2);
+                return;
+            }
+
+
+
+            int moneyType = XBCostTypeDict[xbType];
+            int xbOneMoney = funcSet.xbPrices[0];
+
+            if (UIHelper.GetMoneyCnt(moneyType) >= (ulong)xbOneMoney)
+            {
+                StoreModel.Instance.UseMoneyCheck(xbOneMoney, () =>
+                {
+                    SendXBQuest(xbType, 0, 0);
+                }, xbType == 1 ? 5 : 6, fullTip: Language.Get("TreasurePavilion08", xbOneMoney, moneyType, funcSet.costToolIds[0], 1));
+            }
+            else
+            {
+                SysNotifyMgr.Instance.ShowTip("LackMoney", moneyType);
+
+            }
+        }
+    }
+
+
+    public void SendXBManyQuest(PackType type, int xbType)
+    {
+        var config = TreasureSetConfig.Get(xbType);
+        if (GetXBInfoByType(xbType).treasureCountToday + config.TreasureCountList[1] > config.DailyMaxCount)
+        {
+            SysNotifyMgr.Instance.ShowTip("XBTodayMax");
+            return;
+        }
+
+        var funcSet = GetXBFuncSet(xbType);
+        if (CheckIsEmptyGrid(type))
+        {
+            int toolCnt = 0;
+            int needToolCnt = 0;
+            int needMoney = 0;
+            if (IsHaveManyXBToolEx(xbType, out toolCnt, out needToolCnt, out needMoney))
+            {
+                if (toolCnt >= needToolCnt)
+                {
+                    CheckXBManyLimit(0, xbType, 2);
+
+                    return;
+                }
+
+            }
+
+            int moneyType = XBCostTypeDict[xbType];
+            int xbManyMoney = needMoney == 0 ? funcSet.xbPrices[1] : needMoney;
+
+            if (UIHelper.GetMoneyCnt(moneyType) >= (ulong)xbManyMoney)
+            {
+                StoreModel.Instance.UseMoneyCheck(xbManyMoney, () =>
+                {
+                    SendXBQuest(xbType, 1, toolCnt > 0 ? 2 : 0);
+                }, xbType == 1 ? 5 : 6, fullTip: Language.Get("TreasurePavilion08", xbManyMoney, moneyType, funcSet.costToolIds[1], needToolCnt - toolCnt));
+            }
+            else
+            {
+                SysNotifyMgr.Instance.ShowTip("LackMoney", moneyType);
+
+            }
+
+        }
+    }
+
+    public void CheckXBManyLimit(int needMoney, int xbtype, int costType)
+    {
+        int moneyType = XBCostTypeDict[xbtype];
+        if (UIHelper.GetMoneyCnt(moneyType) >= (ulong)needMoney)
+        {
+            SendXBQuest(xbtype, 1, costType);
+        }
+        else
+        {
+            //WindowCenter.Instance.Open<RechargeTipWin>();
+            SysNotifyMgr.Instance.ShowTip("LackMoney", moneyType);
+        }
+    }
+    #endregion
+
+    public bool IsHaveFreeXB(int type)
+    {
+        XBTypeInfo typeInfo = GetXBInfoByType(type);
+        if (typeInfo == null)
+        {
+            typeInfo = new XBTypeInfo()
+            {
+                xbType = type,
+                luckValue = 0,
+                freeCountToday = 0,
+                treasureCount = 0,
+            };
+        }
+
+        //鍒ゆ柇鏄惁鏈夊厤璐规鏁帮紝涓斿厤璐规鏁版槸鍚︾敤瀹�
+        var funcSet = GetXBFuncSet(type);
+        return typeInfo.freeCountToday < funcSet.dailyFreeCount;
+    }
+
+
+    public bool CheckIsXBTool(int itemId, int type)
+    {
+        XBFuncSet funcSet = GetXBFuncSet(type);
+        if (funcSet == null) return false;
+
+        if (funcSet.costToolIds.Contains(itemId))
+        {
+            return true;
+        }
+        return false;
+    }
+    public bool IsHaveOneXBTool(int type)
+    {
+        XBFuncSet funcSet = GetXBFuncSet(type);
+        if (funcSet == null) return false;
+
+        int toolCnt = PackManager.Instance.GetItemCountByID(PackType.Item, funcSet.costToolIds[0]);
+        if (toolCnt >= funcSet.costToolNums[0])
+        {
+            return true;
+        }
+
+        return false;
+    }
+
+    //needToolCnt 涓洪厤琛ㄤ腑闇�瑕佺殑閬撳叿鏁伴噺
+    public bool IsHaveManyXBTool(int type, out int toolCnt, out int needToolCnt)
+    {
+        toolCnt = 0;
+        needToolCnt = 0;
+        XBFuncSet funcSet = GetXBFuncSet(type);
+        if (funcSet == null) return false;
+
+        toolCnt = PackManager.Instance.GetItemCountByID(PackType.Item, funcSet.costToolIds[1]);
+        needToolCnt = funcSet.costToolNums[1];
+        if (toolCnt > 0)
+        {
+            return true;
+        }
+        return false;
+    }
+
+    //needToolCnt 涓洪厤琛ㄤ腑闇�瑕佺殑閬撳叿鏁伴噺
+    // 鍙幏寰楃湡姝i渶瑕佽ˉ瓒宠喘涔伴亾鍏风殑閲戦
+    public bool IsHaveManyXBToolEx(int type, out int toolCnt, out int needToolCnt, out int needMoney)
+    {
+        toolCnt = 0;
+        needToolCnt = 0;    //閰嶇疆涓渶瑕佺殑閬撳叿鏁伴噺
+        needMoney = 0;  //鐪熸闇�瑕佽ˉ瓒宠喘涔伴亾鍏风殑閲戦
+        XBFuncSet funcSet = GetXBFuncSet(type);
+        if (funcSet == null) return false;
+
+        toolCnt = PackManager.Instance.GetItemCountByID(PackType.Item, funcSet.costToolIds[1]);
+        needToolCnt = funcSet.costToolNums[1];
+
+        if (toolCnt > 0)
+        {
+            if (toolCnt < needToolCnt)
+            {
+                needMoney = funcSet.xbPrices[1] / needToolCnt * (needToolCnt - toolCnt);
+            }
+
+            return true;
+        }
+        return false;
+    }
+
+
+
+    public event Action<float> RefreshBestXBTimeAct;
+    public event Action<float> RefreshRuneXBTimeAct;
+    public void RefreshBestXBTime(float time)
+    {
+        if (RefreshBestXBTimeAct != null)
+        {
+            RefreshBestXBTimeAct(time);
+        }
+
+        if (time <= 0)
+        {
+            BestAndRuneXBRedPoint();
+        }
+    }
+    public void RefreshRuneXBTime(float time)
+    {
+        if (RefreshRuneXBTimeAct != null)
+        {
+            RefreshRuneXBTimeAct(time);
+        }
+
+        if (time <= 0)
+        {
+            BestAndRuneXBRedPoint();
+        }
+    }
+
+    public event Action<HappXBTitle, int> RefreshAgainXBAct;
+    /// <summary>
+    /// xbtype 0-鍗曟 1 澶氭
+    /// </summary>
+    /// <param name="xBTitle"></param>
+    /// <param name="xbType"></param>
+    public void SetAgainXBEvent(HappXBTitle xBTitle, int xbType)
+    {
+        if (RefreshAgainXBAct != null)
+        {
+            RefreshAgainXBAct(xBTitle, xbType);
+        }
+    }
+
+    #region 绾㈢偣閫昏緫
+    public const int HappyXB_RedKey = 203;
+    public const int BestXB_RedKey = 20301;
+    public const int RuneXB_RedKey = 20302;
+    public const int XBStore_RedKey = 20303;
+    public const int XBWarehouse_RedKey = 20304;
+    public const int BestXB_OneRedKey = 20301001;
+    public const int BestXB_ManyRedKey = 20301002;
+    public const int BestXB_FreeRedKey = 20301003;
+    public const int RuneXB_OneRedKey = 20302001;
+    public const int RuneXB_ManyRedKey = 20302002;
+    public const int RuneXB_FreeRedKey = 20302003;
+
+    public Redpoint happyXBRed = new Redpoint(HappyXB_RedKey);
+    public Redpoint bestXBRed = new Redpoint(HappyXB_RedKey, BestXB_RedKey);
+    public Redpoint runeXBRed = new Redpoint(HappyXB_RedKey, RuneXB_RedKey);
+    public Redpoint xbStoreRed = new Redpoint(HappyXB_RedKey, XBStore_RedKey);
+    public Redpoint xbWarehouseRed = new Redpoint(HappyXB_RedKey, XBWarehouse_RedKey);
+    public Redpoint bestXBOneRed = new Redpoint(BestXB_RedKey, BestXB_OneRedKey);
+    public Redpoint bestXBManyRed = new Redpoint(BestXB_RedKey, BestXB_ManyRedKey);
+    public Redpoint bestXBFreeRed = new Redpoint(BestXB_RedKey, BestXB_FreeRedKey);
+    public Redpoint runeXBOneRed = new Redpoint(RuneXB_RedKey, RuneXB_OneRedKey);
+    public Redpoint runeXBManyRed = new Redpoint(RuneXB_RedKey, RuneXB_ManyRedKey);
+    public Redpoint runeXBFreeRed = new Redpoint(RuneXB_RedKey, RuneXB_FreeRedKey);
+
+    private void UpdateFuncState(int funcId)
+    {
+        if (funcId == (int)FuncOpenEnum.HappyFindTreasure
+            || funcId == 184)
+        {
+            XBWarehouseRedPoint();
+            BestAndRuneXBRedPoint();
+            XBStoreRedPoint();
+        }
+    }
+
+    public void RefreshXBWarehouse()
+    {
+        if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.HappyFindTreasure)) return;
+
+        xbWarehouseRed.state = RedPointState.Simple;
+    }
+
+    public void XBWarehouseRedPoint()
+    {
+        if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.HappyFindTreasure)) return;
+
+        SinglePack singlePack = PackManager.Instance.GetSinglePack(PackType.Treasure);
+        if (singlePack == null) return;
+
+        if (singlePack.GetAllItems().Count > 0)
+        {
+            xbWarehouseRed.state = RedPointState.Simple;
+        }
+        else
+        {
+            xbWarehouseRed.state = RedPointState.None;
+        }
+    }
+
+    private void RefreshXBTool(PackType type, int index, int id)
+    {
+        if (type != PackType.Item) return;
+        if (!CheckIsXBTool(id, 1) && !CheckIsXBTool(id, 2)) return;
+        BestAndRuneXBRedPoint();
+    }
+
+    public void BestAndRuneXBRedPoint()
+    {
+        if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.HappyFindTreasure)) return;
+
+        int xbtoolCnt = 0;
+        int needtoolCnt = 0;
+        if (IsHaveFreeXB(1))
+        {
+            bestXBFreeRed.state = RedPointState.Simple;
+        }
+        else
+        {
+            bestXBFreeRed.state = RedPointState.None;
+        }
+
+        if (IsHaveManyXBTool(1, out xbtoolCnt, out needtoolCnt))
+        {
+            if (xbtoolCnt >= needtoolCnt)
+            {
+                bestXBManyRed.state = RedPointState.Simple;
+            }
+            else
+            {
+                bestXBManyRed.state = RedPointState.None;
+            }
+            bestXBOneRed.state = RedPointState.Simple;
+        }
+        else
+        {
+            bestXBOneRed.state = RedPointState.None;
+            bestXBManyRed.state = RedPointState.None;
+        }
+
+        if (FuncOpen.Instance.IsFuncOpen(184) && IsHaveFreeXB(2))
+        {
+            runeXBFreeRed.state = RedPointState.Simple;
+        }
+        else
+        {
+            runeXBFreeRed.state = RedPointState.None;
+        }
+
+        if (FuncOpen.Instance.IsFuncOpen(184) &&
+            IsHaveManyXBTool(2, out xbtoolCnt, out needtoolCnt))
+        {
+            if (xbtoolCnt >= needtoolCnt)
+            {
+                runeXBManyRed.state = RedPointState.Simple;
+            }
+            else
+            {
+                runeXBManyRed.state = RedPointState.None;
+            }
+            runeXBOneRed.state = RedPointState.Simple;
+        }
+        else
+        {
+            runeXBOneRed.state = RedPointState.None;
+            runeXBManyRed.state = RedPointState.None;
+        }
+    }
+
+
+    private void RefreshStoreScore(PlayerDataType type)
+    {
+        if (type != PlayerDataType.CDBPlayerRefresh_TreasureScore) return;
+
+        XBStoreRedPoint();
+    }
+
+    private List<StoreModel.StoreData> storelist = null;
+    public void XBStoreRedPoint()
+    {
+        if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.HappyFindTreasure)) return;
+
+        ulong moneyNum = UIHelper.GetMoneyCnt(25);
+        for (int i = 11; i < 14; i++)
+        {
+            storelist = StoreModel.Instance.TryGetStoreDatas((StoreFunc)i);
+            if (storelist.Count > 0)
+            {
+                List<StoreModel.StoreData> orderlist = new List<StoreModel.StoreData>();
+                orderlist.AddRange(storelist);
+                orderlist.Sort(CompareByMoney);
+                if (moneyNum >= (ulong)orderlist[0].storeConfig.MoneyNumber)
+                {
+                    xbStoreRed.state = RedPointState.Simple;
+                    return;
+                }
+            }
+        }
+        xbStoreRed.state = RedPointState.None;
+    }
+
+    public int CompareByMoney(StoreModel.StoreData start, StoreModel.StoreData end)
+    {
+        int money1 = start.storeConfig.MoneyNumber;
+        int money2 = end.storeConfig.MoneyNumber;
+        if (money1.CompareTo(money2) != 0) return money1.CompareTo(money2);
+        int index1 = storelist.IndexOf(start);
+        int index2 = storelist.IndexOf(end);
+        if (index1.CompareTo(index2) != 0) return index1.CompareTo(index2);
+        return 0;
+    }
+    #endregion
+}
+
+public class XBTypeInfo
+{
+    public int xbType;   // 1 鏋佸搧瀵诲疂 2 绗﹀嵃瀵诲疂 
+    public int luckValue;
+    public int freeCountToday;      //浠婃棩宸插厤璐瑰瀹濇鏁�
+    public int treasureCount;        //宸插瀹濇�绘鏁�
+    public int treasureCountToday;        //浠婃棩宸插瀹濇�绘鏁�
+    public int treasureCntAward;        //绱瀵诲疂娆℃暟瀵瑰簲濂栧姳棰嗗鐘舵�侊紝鎸夊鍔辫褰曠储寮曚簩杩涘埗璁板綍鏄惁宸查鍙�
+    public Dictionary<int, int> gridLimitCntDict;        //<鏈夐檺鍒舵娊鍙栨鏁扮殑鏍煎瓙缂栧彿,宸叉娊鍒版鏁�> 鏈夐檺鍒舵娊鍙栨鏁扮殑鏍煎瓙娆℃暟淇℃伅
+}
+
+public class XBFuncSet
+{
+    public int xbType;// 1 鏋佸搧瀵诲疂 2 绗﹀嵃瀵诲疂 
+    public int[] xbNums;
+    public int[] xbPrices;
+    public int[] costToolIds;
+    public int[] costToolNums;
+    public int[] xbFreeCDs;
+    public int[] xbScores;
+    public int dailyFreeCount;
+}
+
+public class XBGetItem
+{
+    public int gridIndex;
+    public int itemId;
+    public int count;
+    public DateTime createTime;
+    public string createTimeStr;
+
+    public void SetModel(int index, int id, int count)
+    {
+        this.gridIndex = index;
+        this.itemId = id;
+        this.count = count;
+        createTime = TimeUtility.ServerNow;
+        createTimeStr = TimeUtility.ServerNow.ToString("yyyy-MM-dd HH:mm:ss");
+    }
+}
+
+public enum HappXBTitle
+{
+    Best = 1,
+    Rune = 2,
+    //Store = 3,
+    //Warehouse = 4,
+    GatherSoul = 4, //鑱氶瓊瀵诲疂
+    Gubao1 = 5,
+    Gubao2 = 6,
+    Gubao3 = 7,
+    Gubao4 = 8,
+    YunShi1 = 105,
+    YunShi2 = 106,
+    YunShi3 = 107,
+    YunShi4 = 108,
+}
diff --git a/Main/System/HappyXB/HappyXBModel.cs.meta b/Main/System/HappyXB/HappyXBModel.cs.meta
new file mode 100644
index 0000000..68c447a
--- /dev/null
+++ b/Main/System/HappyXB/HappyXBModel.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 0e1f243eb9d07704c8bd44faec9f12c0
+timeCreated: 1524575267
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/ItemTip/ItemTipUtility.cs b/Main/System/ItemTip/ItemTipUtility.cs
index ce8e618..fd63253 100644
--- a/Main/System/ItemTip/ItemTipUtility.cs
+++ b/Main/System/ItemTip/ItemTipUtility.cs
@@ -442,54 +442,51 @@
 
         // }
 
-        // public static void ShowGood(int goodId, int itemId)
-        // {
-        //     secondaryData = null;
+        public static void ShowGood(int goodId, int itemId)
+        {
+            secondaryData = null;
 
-        //     var isEquip = ItemLogicUtility.Instance.IsRealmEquip(itemId);
-        //     if (isEquip)
-        //     {
-        //         mainTipData = CreateGoodEquipData(itemId, goodId);
-        //     }
-        //     else
-        //     {
-        //         mainTipData = CreateGoodItemData(itemId, goodId);
-        //     }
+            var isEquip = ItemLogicUtility.Instance.IsRealmEquip(itemId);
+            if (isEquip)
+            {
+                mainTipData = CreateGoodEquipData(itemId, goodId);
+            }
+            else
+            {
+                mainTipData = CreateGoodItemData(itemId, goodId);
+            }
 
-        //     BuyItemController.Instance.SetGood(goodId);
-        //     var itemConfig = ItemConfig.Get(itemId);
-        //     if (isEquip)
-        //     {
-        //         WindowCenter.Instance.Open<EquipTipWin>();
-        //     }
-        //     else
-        //     {
-        //         var tipType = GetTipType(itemId);
+            BuyItemController.Instance.SetGood(goodId);
+            var itemConfig = ItemConfig.Get(itemId);
+            if (isEquip)
+            {
+                // WindowCenter.Instance.Open<EquipTipWin>();
+            }
+            else
+            {
+                var tipType = GetTipType(itemId);
 
-        //         switch (tipType)
-        //         {
-        //             case TipType.PetMount:
-        //                 WindowCenter.Instance.Open<PetMountTipWin>();
-        //                 break;
-        //             case TipType.SpiritWeapon:
-        //                 WindowCenter.Instance.Open<SpiritWeaponTipWin>();
-        //                 break;
-        //             case TipType.BoxItem:
-        //                 if (WindowCenter.Instance.IsOpen<ItemBoxTipWin>())
-        //                 {
-        //                     WindowCenter.Instance.Open<ItemTipWin>();
-        //                 }
-        //                 else
-        //                 {
-        //                     WindowCenter.Instance.Open<ItemBoxTipWin>();
-        //                 }
-        //                 break;
-        //             default:
-        //                 WindowCenter.Instance.Open<ItemTipWin>();
-        //                 break;
-        //         }
-        //     }
-        // }
+                // switch (tipType)
+                // {
+                //     case TipType.PetMount:
+                //         WindowCenter.Instance.Open<PetMountTipWin>();
+                //         break;
+                //     case TipType.BoxItem:
+                //         if (WindowCenter.Instance.IsOpen<ItemBoxTipWin>())
+                //         {
+                //             WindowCenter.Instance.Open<ItemTipWin>();
+                //         }
+                //         else
+                //         {
+                //             WindowCenter.Instance.Open<ItemBoxTipWin>();
+                //         }
+                //         break;
+                //     default:
+                //         WindowCenter.Instance.Open<ItemTipWin>();
+                //         break;
+                // }
+            }
+        }
 
         // public static void ShowCustomEquip(CustomEquipInfo info)
         // {
@@ -736,26 +733,26 @@
         //     };
         // }
 
-        // static TipData CreateGoodEquipData(int itemId, int goodId)
-        // {
-        //     return new TipData()
-        //     {
-        //         itemId = itemId,
-        //         guid = string.Empty,
-        //         goodId = goodId,
+        static TipData CreateGoodEquipData(int itemId, int goodId)
+        {
+            return new TipData()
+            {
+                itemId = itemId,
+                guid = string.Empty,
+                goodId = goodId,
 
-        //         baseInfo = GetBaseInfo(itemId),
-        //         baseProperty = GetBaseProperty(itemId),
-        //         spiritWeaponProperty = GetSpiritWeaponProperty(itemId),
-        //         legendProperty = GetLegendProperty(itemId),
-        //         skillInfo = GetSkillInfo(itemId),
-        //         suitInfo = GetSuitInfo(itemId),
-        //         gemInfo = GetGemInfo(itemId),
-        //         starInfo = GetStarInfo(itemId),
-        //         operates = GetGoodOperates(goodId),
-        //         shenProperty = GetShenProperty(itemId)
-        //     };
-        // }
+                baseInfo = GetBaseInfo(itemId),
+                baseProperty = GetBaseProperty(itemId),
+                //spiritWeaponProperty = GetSpiritWeaponProperty(itemId),
+                //legendProperty = GetLegendProperty(itemId),
+                skillInfo = GetSkillInfo(itemId),
+                //suitInfo = GetSuitInfo(itemId),
+                //gemInfo = GetGemInfo(itemId),
+                //starInfo = GetStarInfo(itemId),
+                operates = GetGoodOperates(goodId),
+                //shenProperty = GetShenProperty(itemId)
+            };
+        }
 
         // static TipData CreateEquipAuctionData(string guid, bool operatable)
         // {
@@ -830,21 +827,21 @@
         //     };
         // }
 
-        // static TipData CreateGoodItemData(int itemId, int goodId)
-        // {
-        //     return new TipData()
-        //     {
-        //         itemId = itemId,
-        //         goodId = goodId,
-        //         baseInfo = GetBaseInfo(itemId),
-        //         baseProperty = GetBaseProperty(itemId),
-        //         legendProperty = GetLegendProperty(itemId),
-        //         spiritWeaponProperty = GetSpiritWeaponProperty(itemId),
-        //         petMountBaseProperty = GetPetMountBaseProperty(itemId),
-        //         operates = GetGoodOperates(goodId),
-        //         shenProperty = GetShenProperty(itemId)
-        //     };
-        // }
+        static TipData CreateGoodItemData(int itemId, int goodId)
+        {
+            return new TipData()
+            {
+                itemId = itemId,
+                goodId = goodId,
+                baseInfo = GetBaseInfo(itemId),
+                baseProperty = GetBaseProperty(itemId),
+                // legendProperty = GetLegendProperty(itemId),
+                // spiritWeaponProperty = GetSpiritWeaponProperty(itemId),
+                // petMountBaseProperty = GetPetMountBaseProperty(itemId),
+                operates = GetGoodOperates(goodId),
+                // shenProperty = GetShenProperty(itemId)
+            };
+        }
 
         
         
@@ -929,31 +926,31 @@
         // }
 
 
-        // private static BaseInfo GetBaseInfo(int itemId)
-        // {
-        //     var config = ItemConfig.Get(itemId);
-        //     var money = 0;
-        //     if (config.Type == 81)
-        //     {
-        //         var chestConfig = ChestsConfig.Get(itemId);
-        //         money = chestConfig.OpenMoney;
-        //     }
+        private static BaseInfo GetBaseInfo(int itemId)
+        {
+            var config = ItemConfig.Get(itemId);
+            var money = 0;
+            if (config.Type == 81)
+            {
+                var chestConfig = ChestsConfig.Get(itemId);
+                money = chestConfig.OpenMoney;
+            }
 
-        //     var baseInfo = new BaseInfo()
-        //     {
-        //         itemId = itemId,
-        //         isAuction = false,
-        //         isEquiped = false,
-        //         isPreview = true,
-        //         score = ItemLogicUtility.Instance.GetEquipScore(itemId, null, true),
-        //         auctionSurplusTime = 0,
-        //         levelLimit = config.UseLV,
-        //         realmLimit = config.RealmLimit,
-        //         moneyLimit = money,
-        //     };
+            var baseInfo = new BaseInfo()
+            {
+                itemId = itemId,
+                isAuction = false,
+                isEquiped = false,
+                isPreview = true,
+                //score = ItemLogicUtility.Instance.GetEquipScore(itemId, null, true),
+                auctionSurplusTime = 0,
+                levelLimit = config.UseLV,
+                realmLimit = config.RealmLimit,
+                moneyLimit = money,
+            };
 
-        //     return baseInfo;
-        // }
+            return baseInfo;
+        }
 
         // private static BaseInfo GetBaseInfo(string guid)
         // {
@@ -997,78 +994,78 @@
         //     return baseInfo;
         // }
 
-        // private static BaseProperty GetBaseProperty(int itemId)
-        // {
-        //     var baseProperties = new List<Int2>();
-        //     var config = ItemConfig.Get(itemId);
+        private static BaseProperty GetBaseProperty(int itemId)
+        {
+            var baseProperties = new List<Int2>();
+            var config = ItemConfig.Get(itemId);
 
-        //     if (config.Effect1 == 220)
-        //     {
-        //         return GetBaseProperty(config.EffectValueA1);
-        //     }
+            if (config.Effect1 == 220)
+            {
+                return GetBaseProperty(config.EffectValueA1);
+            }
 
-        //     if (!ItemLogicUtility.Instance.IsDogzEquip(itemId))
-        //     {
-        //         if (config.Effect1 != 0)
-        //         {
-        //             baseProperties.Add(new Int2(config.Effect1, config.EffectValueA1));
-        //         }
-        //     }
+            if (!ItemLogicUtility.Instance.IsDogzEquip(itemId))
+            {
+                if (config.Effect1 != 0)
+                {
+                    baseProperties.Add(new Int2(config.Effect1, config.EffectValueA1));
+                }
+            }
 
-        //     if (config.Effect2 != 0)
-        //     {
-        //         baseProperties.Add(new Int2(config.Effect2, config.EffectValueA2));
-        //     }
+            if (config.Effect2 != 0)
+            {
+                baseProperties.Add(new Int2(config.Effect2, config.EffectValueA2));
+            }
 
-        //     if (config.Effect3 != 0)
-        //     {
-        //         baseProperties.Add(new Int2(config.Effect3, config.EffectValueA3));
-        //     }
+            if (config.Effect3 != 0)
+            {
+                baseProperties.Add(new Int2(config.Effect3, config.EffectValueA3));
+            }
 
-        //     if (config.Effect4 != 0)
-        //     {
-        //         baseProperties.Add(new Int2(config.Effect4, config.EffectValueA4));
-        //     }
+            if (config.Effect4 != 0)
+            {
+                baseProperties.Add(new Int2(config.Effect4, config.EffectValueA4));
+            }
 
-        //     if (config.Effect5 != 0)
-        //     {
-        //         baseProperties.Add(new Int2(config.Effect5, config.EffectValueA5));
-        //     }
+            if (config.Effect5 != 0)
+            {
+                baseProperties.Add(new Int2(config.Effect5, config.EffectValueA5));
+            }
 
-        //     var baseProperty = new BaseProperty()
-        //     {
-        //         baseProperties = baseProperties,
-        //     };
+            var baseProperty = new BaseProperty()
+            {
+                baseProperties = baseProperties,
+            };
 
-        //     return baseProperty;
-        // }
+            return baseProperty;
+        }
 
-        // private static BaseProperty GetBaseProperty(string guid)
-        // {
-        //     var item = packModel.GetItemByGuid(guid);
-        //     var equipPosition = new Int2(item.config.LV, item.config.EquipPlace);
-        //     var equiped = equipModel.GetEquip(equipPosition) == guid;
+        private static BaseProperty GetBaseProperty(string guid)
+        {
+            var item = PackManager.Instance.GetItemByGuid(guid);
+            var equipPosition = new Int2(item.config.LV, item.config.EquipPlace);
+            var equiped = true;//equipModel.GetEquip(equipPosition) == guid;
 
-        //     var baseProperty = GetBaseProperty(item.itemId);
+            var baseProperty = GetBaseProperty(item.itemId);
 
-        //     if (equiped)
-        //     {
-        //         var starProperties = new List<Int2>();
-        //         var currentStar = starModel.GetEquipStarLevel(equipPosition);
-        //         var maxStar = EquipStarModel.GetMaxStarLevel(item.config.ItemColor, item.config.LV);
-        //         var star = Mathf.Min(currentStar, maxStar);
-        //         if (star > 0)
-        //         {
-        //             baseProperty.star = star;
-        //             var starConfig = EquipStarConfig.Get(item.config.LV, item.config.EquipPlace, star);
-        //             starProperties.AddRange(starConfig.BaseAttrInfo);
-        //         }
+            if (equiped)
+            {
+                var starProperties = new List<Int2>();
+                // var currentStar = starModel.GetEquipStarLevel(equipPosition);
+                // var maxStar = EquipStarModel.GetMaxStarLevel(item.config.ItemColor, item.config.LV);
+                // var star = Mathf.Min(currentStar, maxStar);
+                // if (star > 0)
+                // {
+                //     baseProperty.star = star;
+                //     var starConfig = EquipStarConfig.Get(item.config.LV, item.config.EquipPlace, star);
+                //     starProperties.AddRange(starConfig.BaseAttrInfo);
+                // }
 
-        //         baseProperty.starProperties = starProperties;
-        //     }
+                baseProperty.starProperties = starProperties;
+            }
 
-        //     return baseProperty;
-        // }
+            return baseProperty;
+        }
 
         // private static BaseProperty GetPetMountBaseProperty(int itemId)
         // {
@@ -1913,26 +1910,26 @@
 
         
 
-        // private static List<ItemOperateType> GetGoodOperates(int goodId)
-        // {
-        //     var operates = new List<ItemOperateType>();
-        //     var countLimit = BuyItemController.Instance.GetBuyCountLimit(goodId, PlayerDatas.Instance.baseData.VIPLv);
-        //     if (countLimit == -1 || countLimit > 0)
-        //     {
-        //         var config = StoreConfig.Get(goodId);
-        //         int curVipIndex = -1;
-        //         int nextVipIndex = -1;
-        //         bool isVipBuy = BuyItemController.Instance.CheckIsVipBuy(config, out curVipIndex, out nextVipIndex);
+        private static List<ItemOperateType> GetGoodOperates(int goodId)
+        {
+            var operates = new List<ItemOperateType>();
+            var countLimit = BuyItemController.Instance.GetBuyCountLimit(goodId, PlayerDatas.Instance.baseData.VIPLv);
+            if (countLimit == -1 || countLimit > 0)
+            {
+                var config = StoreConfig.Get(goodId);
+                int curVipIndex = -1;
+                int nextVipIndex = -1;
+                bool isVipBuy = BuyItemController.Instance.CheckIsVipBuy(config, out curVipIndex, out nextVipIndex);
 
-        //         if ((isVipBuy && curVipIndex == -1) || PlayerDatas.Instance.baseData.LV < config.LV)
-        //         {
-        //             return operates;
-        //         }
-        //         operates.Add(ItemOperateType.buy);
-        //     }
+                if ((isVipBuy && curVipIndex == -1) || PlayerDatas.Instance.baseData.LV < config.LV)
+                {
+                    return operates;
+                }
+                operates.Add(ItemOperateType.buy);
+            }
 
-        //     return operates;
-        // }
+            return operates;
+        }
 
         // private static bool IsEquipGemHoleOpen(Int2 equipPosition, int maxStar, int hole)
         // {
@@ -1955,60 +1952,45 @@
         //     return true;
         // }
 
-        // private static TipType GetTipType(int itemId)
-        // {
-        //     if (GeneralDefine.chestDisplayItems.Contains(itemId))
-        //     {
-        //         return TipType.PeerlessChest;
-        //     }
+        private static TipType GetTipType(int itemId)
+        {
+            if (GeneralDefine.chestDisplayItems.Contains(itemId))
+            {
+                return TipType.PeerlessChest;
+            }
 
-        //     if (ChestsAwardConfig.IsBox(itemId))
-        //     {
-        //         return TipType.BoxItem;
-        //     }
+            // if (ChestsAwardConfig.IsBox(itemId))
+            // {
+            //     return TipType.BoxItem;
+            // }
 
-        //     var config = ItemConfig.Get(itemId);
-        //     switch (config.Type)
-        //     {
-        //         case 101:
-        //         case 102:
-        //         case 103:
-        //         case 104:
-        //         case 105:
-        //         case 106:
-        //         case 107:
-        //         case 108:
-        //         case 109:
-        //         case 110:
-        //         case 111:
-        //         case 112:
-        //             return TipType.Equip;
-        //         case 119:
-        //         case 120:
-        //         case 121:
-        //         case 122:
-        //         case 123:
-        //             return TipType.Dogz;
-        //         case 53:
-        //             return TipType.KingTreasure;
-        //         case 56:
-        //             return TipType.TreasureShow;
-        //         case 26:
-        //         case 41:
-        //         case 42:
-        //             return TipType.PetMount;
-        //         case 113:
-        //         case 114:
-        //         case 116:
-        //         case 117:
-        //             return TipType.SpiritWeapon;
-        //         case 147:
-        //             return TipType.TreasurePavilion;
-        //         default:
-        //             return TipType.Item;
-        //     }
+            var config = ItemConfig.Get(itemId);
+            switch (config.Type)
+            {
+                case 101:
+                case 102:
+                case 103:
+                case 104:
+                case 105:
+                case 106:
+                case 107:
+                case 108:
+                case 109:
+                case 110:
+                case 111:
+                case 112:
+                    return TipType.Equip;
+                case 26:
+                case 41:
+                case 42:
+                    return TipType.PetMount;
+                case 147:
+                    return TipType.TreasurePavilion;
+                default:
+                    return TipType.Item;
+            }
 
-        // }
+        }
 
         [System.Diagnostics.Conditional("UNITY_EDITOR")]
         private static void PrintItemBrief(int itemId)
diff --git a/Main/System/KnapSack/Logic/ItemLogicUtility.cs b/Main/System/KnapSack/Logic/ItemLogicUtility.cs
index 829d8c5..5d228e6 100644
--- a/Main/System/KnapSack/Logic/ItemLogicUtility.cs
+++ b/Main/System/KnapSack/Logic/ItemLogicUtility.cs
@@ -213,63 +213,42 @@
 
         }
 
-        // public int GetEquipScore(int itemId, Dictionary<int, List<int>> useDataDic = null, bool isPreview = false)
-        // {
-        //     var config = ItemConfig.Get(itemId);
-        //     if (config == null) return 0;
-        //     if (config.EquipPlace == 0)
-        //     {
-        //         return 0;
-        //     }
+        public int GetEquipScore(int itemId, Dictionary<int, List<int>> useDataDic = null, bool isPreview = false)
+        {
+            var config = ItemConfig.Get(itemId);
+            if (config == null) return 0;
+            if (config.EquipPlace == 0)
+            {
+                return 0;
+            }
 
-        //     var properties = new EquipSorceProperties();
+            var properties = new EquipSorceProperties();
 
-        //     if (IsCustomItem(itemId))
-        //     {
-        //         properties.AddBaseProperties(config.EffectValueA1, equipBaseProperties);
-        //         properties.AddCustomProperties(itemId);
-        //         return CalculateEquipScore(config.EffectValueA1, properties);
-        //     }
+            if (IsCustomItem(itemId))
+            {
+                properties.AddBaseProperties(config.EffectValueA1, equipBaseProperties);
+                properties.AddCustomProperties(itemId);
+                return CalculateEquipScore(config.EffectValueA1, properties);
+            }
 
-        //     properties.AddBaseProperties(itemId, equipBaseProperties);
-        //     if (isPreview)
-        //     {
-        //         switch ((RoleEquipType)config.EquipPlace)
-        //         {
-        //             case RoleEquipType.Weapon:
-        //             case RoleEquipType.Weapon2:
-        //             case RoleEquipType.Hat:
-        //             case RoleEquipType.Clothes:
-        //             case RoleEquipType.Belt:
-        //             case RoleEquipType.Trousers:
-        //             case RoleEquipType.Shoes:
-        //             case RoleEquipType.Glove:
-        //             case RoleEquipType.Neck:
-        //             case RoleEquipType.FairyCan1:
-        //             case RoleEquipType.FairyCan2:
-        //             case RoleEquipType.Jade:
-        //                 properties.AddRange(GetEquipLegendProperties(itemId));
-        //                 break;
-        //         }
+            properties.AddBaseProperties(itemId, equipBaseProperties);
 
-        //         return CalculateEquipScore(itemId, properties);
-        //     }
 
-        //     if (useDataDic != null)
-        //     {
-        //         if (useDataDic.ContainsKey((int)ItemUseDataKey.legendAttrID))
-        //         {
-        //             properties.AddRange(useDataDic[(int)ItemUseDataKey.legendAttrID], useDataDic[(int)ItemUseDataKey.legendAttrValue]);
-        //         }
+            if (useDataDic != null)
+            {
+                if (useDataDic.ContainsKey((int)ItemUseDataKey.legendAttrID))
+                {
+                    properties.AddRange(useDataDic[(int)ItemUseDataKey.legendAttrID], useDataDic[(int)ItemUseDataKey.legendAttrValue]);
+                }
 
-        //         if (useDataDic.ContainsKey((int)ItemUseDataKey.outOfPrintAttrID))
-        //         {
-        //             properties.AddRange(useDataDic[(int)ItemUseDataKey.outOfPrintAttrID], useDataDic[(int)ItemUseDataKey.outOfPrintAttrValue]);
-        //         }
-        //     }
+                if (useDataDic.ContainsKey((int)ItemUseDataKey.outOfPrintAttrID))
+                {
+                    properties.AddRange(useDataDic[(int)ItemUseDataKey.outOfPrintAttrID], useDataDic[(int)ItemUseDataKey.outOfPrintAttrValue]);
+                }
+            }
 
-        //     return CalculateEquipScore(itemId, properties, useDataDic);
-        // }
+            return CalculateEquipScore(itemId, properties, useDataDic);
+        }
 
         // private Dictionary<int, int> GetEquipLegendProperties(int itemId)
         // {
@@ -319,103 +298,90 @@
         /// <param name="itemId"></param>
         /// <returns></returns>
         private Dictionary<PropertyType, float> curEquipAttrDict = new Dictionary<PropertyType, float>(); //瀛樺偍褰撳墠瑁呭灞炴�у搴旂殑鏁板�� key 灞炴�� value 灞炴�у��
-        // private int CalculateEquipScore(int itemId, EquipSorceProperties properties, Dictionary<int, List<int>> useDataDic = null)
-        // {
-        //     var config = ItemConfig.Get(itemId);
-        //     if (config == null || !GeneralDefine.CompareEquipPlaces.Contains(config.EquipPlace))
-        //     {
-        //         return 0;
-        //     }
+        private int CalculateEquipScore(int itemId, EquipSorceProperties properties, Dictionary<int, List<int>> useDataDic = null)
+        {
+            var config = ItemConfig.Get(itemId);
+            if (config == null || !GeneralDefine.CompareEquipPlaces.Contains(config.EquipPlace))
+            {
+                return 0;
+            }
 
-        //     properties.AddRange(GetEquipShenProperties(itemId));
+            //properties.AddRange(GetEquipShenProperties(itemId));
 
-        //     var minAttack = properties.ContainsKey((int)PropertyType.MinAtk) ? properties[(int)PropertyType.MinAtk] : 0;
-        //     var maxAttack = properties.ContainsKey((int)PropertyType.MaxAtk) ? properties[(int)PropertyType.MaxAtk] : 0;
-        //     var attack = properties.ContainsKey((int)PropertyType.ATK) ? properties[(int)PropertyType.ATK] : 0;
+            var minAttack = properties.ContainsKey((int)PropertyType.MinAtk) ? properties[(int)PropertyType.MinAtk] : 0;
+            var maxAttack = properties.ContainsKey((int)PropertyType.MaxAtk) ? properties[(int)PropertyType.MaxAtk] : 0;
+            var attack = properties.ContainsKey((int)PropertyType.ATK) ? properties[(int)PropertyType.ATK] : 0;
 
-        //     properties[(int)PropertyType.MinAtk] = minAttack + attack;
-        //     properties[(int)PropertyType.MaxAtk] = maxAttack + attack;
+            properties[(int)PropertyType.MinAtk] = minAttack + attack;
+            properties[(int)PropertyType.MaxAtk] = maxAttack + attack;
 
-        //     Equation.Instance.Clear();
-        //     curEquipAttrDict.Clear();
+            Equation.Instance.Clear();
+            curEquipAttrDict.Clear();
 
-        //     var GSProValueDict = EquipGSParamConfig.GetTagGsProValueDict(config.LV, config.ItemColor, config.SuiteiD > 0 ? 1 : 0, config.StarLevel);
-        //     foreach (var key in properties.Keys)
-        //     {
-        //         var attrType = (PropertyType)key;
-        //         switch (attrType)
-        //         {
-        //             case PropertyType.ATKSPEED:
-        //             case PropertyType.OnlyFinalHurt:
-        //             case PropertyType.PVPAtkBackHP:
-        //             case PropertyType.MinAtk:
-        //             case PropertyType.MaxAtk:
-        //             case PropertyType.AddFinalHurt:
-        //             case PropertyType.ReduceFinalHurt:
-        //                 curEquipAttrDict.Add(attrType, properties[key]);
-        //                 break;
-        //             default:
-        //                 if (GSProValueDict != null && GSProValueDict.ContainsKey(attrType))
-        //                 {
-        //                     var curProValue = properties[key] * GSProValueDict[attrType];
-        //                     curEquipAttrDict.Add(attrType, curProValue);
-        //                 }
-        //                 else
-        //                 {
-        //                     curEquipAttrDict.Add(attrType, properties[key]);
-        //                 }
-        //                 break;
-        //         }
-        //     }
+            var GSProValueDict = EquipGSParamConfig.GetTagGsProValueDict(config.LV, config.ItemColor, config.SuiteiD > 0 ? 1 : 0, config.StarLevel);
+            foreach (var key in properties.Keys)
+            {
+                var attrType = (PropertyType)key;
+                switch (attrType)
+                {
+                    case PropertyType.ATKSPEED:
+                    case PropertyType.OnlyFinalHurt:
+                    case PropertyType.PVPAtkBackHP:
+                    case PropertyType.MinAtk:
+                    case PropertyType.MaxAtk:
+                    case PropertyType.AddFinalHurt:
+                    case PropertyType.ReduceFinalHurt:
+                        curEquipAttrDict.Add(attrType, properties[key]);
+                        break;
+                    default:
+                        if (GSProValueDict != null && GSProValueDict.ContainsKey(attrType))
+                        {
+                            var curProValue = properties[key] * GSProValueDict[attrType];
+                            curEquipAttrDict.Add(attrType, curProValue);
+                        }
+                        else
+                        {
+                            curEquipAttrDict.Add(attrType, properties[key]);
+                        }
+                        break;
+                }
+            }
 
-        //     foreach (var key in curEquipAttrDict.Keys)
-        //     {
-        //         var propertyConfig = PlayerPropertyConfig.Get((int)key);
-        //         if (propertyConfig != null)
-        //         {
-        //             Equation.Instance.AddKeyValue(propertyConfig.Parameter, curEquipAttrDict[key]);
-        //         }
-        //     }
+            foreach (var key in curEquipAttrDict.Keys)
+            {
+                var propertyConfig = PlayerPropertyConfig.Get((int)key);
+                if (propertyConfig != null)
+                {
+                    Equation.Instance.AddKeyValue(propertyConfig.Parameter, curEquipAttrDict[key]);
+                }
+            }
 
-        //     var skillScore = 0;
-        //     if (useDataDic != null && useDataDic.ContainsKey((int)ItemUseDataKey.equipSkills))
-        //     {
-        //         for (int i = 0; i < useDataDic[(int)ItemUseDataKey.equipSkills].Count; i++)
-        //         {
-        //             skillScore += equipSkillScores[useDataDic[(int)ItemUseDataKey.equipSkills][i]];
-        //         }
-        //     }
-        //     else
-        //     {
+            var skillScore = 0;
+            if (useDataDic != null && useDataDic.ContainsKey((int)ItemUseDataKey.equipSkills))
+            {
+                for (int i = 0; i < useDataDic[(int)ItemUseDataKey.equipSkills].Count; i++)
+                {
+                    skillScore += equipSkillScores[useDataDic[(int)ItemUseDataKey.equipSkills][i]];
+                }
+            }
+            else
+            {
 
-        //         if (config.AddSkill1 != 0 && equipSkillScores.ContainsKey(config.AddSkill1))
-        //         {
-        //             skillScore += equipSkillScores[config.AddSkill1];
-        //         }
+                if (config.AddSkill1 != 0 && equipSkillScores.ContainsKey(config.AddSkill1))
+                {
+                    skillScore += equipSkillScores[config.AddSkill1];
+                }
 
-        //         if (config.AddSkill2 != 0 && equipSkillScores.ContainsKey(config.AddSkill2))
-        //         {
-        //             skillScore += equipSkillScores[config.AddSkill2];
-        //         }
+                if (config.AddSkill2 != 0 && equipSkillScores.ContainsKey(config.AddSkill2))
+                {
+                    skillScore += equipSkillScores[config.AddSkill2];
+                }
 
-        //     }
+            }
 
 
-        //     var spiritWeaponScore = 0;
-        //     if (SpiritWeaponConfig.Has(itemId))
-        //     {
-        //         spiritWeaponScore = SpiritWeaponConfig.Get(itemId).AttrScore;
-        //     }
-
-        //     if (IsDogzEquip(itemId))
-        //     {
-        //         return Equation.Instance.Eval<int>(dogzGSFormula);
-        //     }
-        //     else
-        //     {
-        //         return spiritWeaponScore + skillScore + Equation.Instance.Eval<int>(normalGSFormula);
-        //     }
-        // }
+            return skillScore + Equation.Instance.Eval<int>(normalGSFormula);
+        }
 
         #endregion
 
diff --git a/Main/System/MainInterfacePanel/MainRedDot.cs b/Main/System/MainInterfacePanel/MainRedDot.cs
index 0aecf9f..34d981b 100644
--- a/Main/System/MainInterfacePanel/MainRedDot.cs
+++ b/Main/System/MainInterfacePanel/MainRedDot.cs
@@ -2,36 +2,18 @@
 //    [Author]:           绗簩涓栫晫
 //    [  Date ]:           Thursday, November 16, 2017
 //--------------------------------------------------------
-using UnityEngine;
-using System.Collections;
-using UnityEngine.UI;
-using System.Collections.Generic;
-using System;
+
 
 
     public class MainRedDot : Singleton<MainRedDot>
     {
         public const int RedPoint_key = 1;
         public const int FAIRY_REDPOINT_KEY1 = 107;
-        public const int RedPoint_key1 = 106;
         public const int RedPoint_UpFuncBase = 2;
-        public const int RedPoint_VipDot = 35;//VIP鐣岄潰
-        public const int RedPoint_Share = 66; //sdk鍒嗕韩绛�
 
         private Redpoint rightTopRedpint = new Redpoint(RedPoint_UpFuncBase);
-
         private Redpoint redPointStrePrentOne = new Redpoint(RedPoint_key);
-        private Redpoint redPointStrePrent = new Redpoint(RedPoint_key, RedPoint_key1);
-        private Redpoint welfareRedPoint = new Redpoint(201);
-        private Redpoint realmRedpoint = new Redpoint(114);
-        private Redpoint redPointVipDot = new Redpoint(RedPoint_VipDot);
 
-        public Redpoint rankActRepoint = new Redpoint(RankActRepoint);
-
-        #region 瑙掕壊绾㈢偣
-        public Redpoint roleRedpoint = new Redpoint(RedPoint_key, 101);
-        public Redpoint roleTagRedpoint = new Redpoint(101, 10101);
-        #endregion
 
         //public Redpoint jadeDynastyRedpoint = new Redpoint(1, 117);
 
@@ -58,15 +40,8 @@
         public Redpoint redPointDepotFunc = new Redpoint(RedPoint_MainPackKey, RedPoint_DepotFuncKey);
         #endregion
 
-        #region 娲楃偧绾㈢偣
-        public const int RedPoint_WashFuncKey = 10605;
-        public Redpoint redPointWashFunc = new Redpoint(RedPoint_key1, RedPoint_WashFuncKey);
-        #endregion
 
-        #region 濂楄绾㈢偣
-        public const int RedPoint_SuitFuncKey = 10604;
-        public Redpoint redPointSuitFunc = new Redpoint(RedPoint_key1, RedPoint_SuitFuncKey);
-        #endregion
+
 
         #region 浠欑洘鍏敤绾㈢偣
         public const int FAIRY_REDPOINT_KEY2 = 10701;
@@ -74,10 +49,7 @@
         public Redpoint fairyBaseFuncRedPoint = new Redpoint(FAIRY_REDPOINT_KEY1, FAIRY_REDPOINT_KEY2);
         #endregion
 
-        #region 浠欑洘娲昏穬绾㈢偣
-        public const int FAIRYLiven_REDPOINT_KEY3 = 1070107;
-        public Redpoint fairyLivenRedPoint = new Redpoint(FAIRY_REDPOINT_KEY2, FAIRYLiven_REDPOINT_KEY3);
-        #endregion
+
 
         #region 浠欑洘鍟嗗簵绾㈢偣
         public const int FAIRYStore_REDPOINT_KEY3 = 1070106;
@@ -85,15 +57,7 @@
         #endregion
 
 
-        #region 鍧愰獞绾㈢偣/鐏靛疇绾㈢偣
 
-        public const int RedPoint_PetKey = 105;
-        public Redpoint redPointPetKeyFunc = new Redpoint(RedPoint_key, RedPoint_PetKey);
-        public const int RedPoint_MountPackKey = 10501;
-        public Redpoint redPointMountFunc = new Redpoint(RedPoint_PetKey, RedPoint_MountPackKey);
-        public const int RedPoint_PetKey2 = 10502;
-        public Redpoint redPonintPetFunc2 = new Redpoint(RedPoint_PetKey, RedPoint_PetKey2);
-        #endregion
 
         #region 寮�鏈嶆椿鍔ㄧ孩鐐�
         public const int REDPOINT_OPENSERVER = 209;
@@ -110,115 +74,29 @@
         public readonly Redpoint fairyActivityRedpoint = new Redpoint(218);
         #endregion
 
-        //IL绾㈢偣 浠�400寮�濮嬩娇鐢紝鍗曠孩鐐癸紙400-599锛夊敖閲忔寜椤哄簭鎺�
-        public static int jpbnRedPoint = 401;       //鏋佸搧鐧芥嬁
-        public static int zxthRedPoint = 402;       //鍦ㄧ嚎鐗规儬
-        public static int gntqRedPoint = 403;       //鍔熻兘鐗规潈鍗�
-        public static int hfhdRedPoint = 406;       //鍚堟湇娲诲姩
-        public static int faqiRedPoint = 408;       //淇偧锛堟硶鍣級绾㈢偣
-        public static int wfqzRedPoint = 409;       //鐜╂硶鍓嶇灮
-        public static int QYRedPoint = 410;       //鎯呯紭
-        public static int SugarRedPoint = 411;       //鍠滅硸
-        public static int CharmRedPoint = 412;       //鎻愬崌榄呭姏
-        public static int XYYGRedPoint = 413;       //骞歌繍浜戣喘
-        public static int GSCJRedPoint = 416;       //鍙ょ鎴愬氨
-        public static int TTLRedPoint = 418;       //閫氬ぉ浠�
-        public static int TDLBRedPoint = 421;       //澶╁笣绀煎寘
-        public static int CrossServerQualifyingRedPoint = 423;   //璺ㄦ湇锛堜竾鐣岋級浜夐湼
-        public static int cbgRedpoint = 428;       //钘忓疂闃佺孩鐐�
-        public static int achievementRedpoint = 431;       //鎴愬氨绾㈢偣
-        public static int buy1Free5Redpoint = 433;       //涔�1閫�5绾㈢偣
-        public static int RechargeGenerousGiftWinRedpoint = 434;       //鍏呭�艰豹绀煎叆鍙�
-        public static int LvZhanlingRedpoint = 435; //绛夌骇鎴樹护鍏ュ彛绾㈢偣
-        public static int RealmLvZhanlingRedpoint = 436;  //澧冪晫鎴樹护鍏ュ彛绾㈢偣
-        public static int CelestialStarTowerRedpoint = 437;  //澶╂槦濉旀垬浠ゅ叆鍙g孩鐐�
-        public static int GuBaoTotalStarsRedpoint = 438;  //鍙ゅ疂鎴樹护鍏ュ彛绾㈢偣
         public static int DailySpecialsRedpoint = 439;  //姣忔棩鐗规儬鍏ュ彛绾㈢偣
-        public static int CZBMRedpoint = 440;  //鎴愰暱蹇呬拱鍏ュ彛绾㈢偣
-
-        // boss棣栨潃
-        public const int REDPOINT_BOSSFIRSTKILL = 600;
-        public const int ForeverCardRedPoint = 441; //缁堣韩鍗$孩鐐�
-        public const int BossTrialRepoint = 442; //boss鍑瘉
-        public const int NewDayActionRedPoint = 443; //鏃ユ湡鍨嬶紙绫昏妭鏃ワ級娲诲姩
 
         public static int BlessedLandRedpoint = 444; //绂忓湴绾㈢偣
-        public const int FuyuanSumRechargeRedpoint = 445; //绂忕紭- 绱厖
-        public const int OnHookRedpoint = 446; //鎸傛満
-        public const int RedPoint_FamilyRecharge = 447; //浠欑洘鍏呭�煎崗鍔�
         public const int CustomizedGiftRedpoint = 448; //鑷�夌ぜ鍖�
         public const int LoginZhanLingRedpoint = 449; //鐧诲綍鎴樹护
-        public const int GatheringSoulZhanLingRedpoint = 450; //鑱氶瓊鎴樹护
-        public const int TreasureLuckyDrawRedpoint = 451; //鍙ゅ疂鎶藉
-        public const int MjxbRedpoint = 452; //绉樺瀵诲疂
-        public const int CrossServerGodBattleFieldAssort = 453; //鍙ょ鎴樺満缁勯槦
-        public const int GatherSourRedpointEnter = 454; //鑱氶瓊鍏ュ彛绾㈢偣
-        public const int QCTrainActRedpoint = 455; //楠戝疇鍏绘垚娲诲姩
-        public const int RankActRepoint = 456; //鎺掕姒滄椿鍔ㄧ殑涓粙绾㈢偣
-        public const int TreasurePavilionRankActRepoint = 457; //鍙ゅ疂鍏绘垚鎺掕姒滄椿鍔�
-        public const int CelestialPalaceRepoint = 458; //浠欏
         public const int PhantasmPavilionRepoint = 459; //骞诲闃�
-        public const int PhantasmPavilionZhanLingRepoint = 460; //骞诲鎴樹护
-        public const int FairyAffinityRepoint = 461; //浠欑紭
         public const int FairyEmbleManageRepoint = 462;//浠欑洘寰界珷绠$悊鍏ュ彛绾㈢偣
         public const int CycleHallRepoint = 463; //杞洖娈�
         public const int YunShiRepoint = 464; //杩愬娍
         public const int LianQiRepoint = 465; //浠欏尃澶т細
         public const int FairySiegeRepoint = 466; //浠欑洘鏀诲煄鎴�
         public const int MailRepoint = 467; //閭
-        public const int RedPoint_MR648 = 900; // BT鍔熻兘绾㈢偣 - 姣忔棩648
+        
 
 
 
         public void Register()
-        {
-            RedpointCenter.Instance.redpointValueChangeEvent -= OnRedpointChange;
-            RedpointCenter.Instance.redpointValueChangeEvent += OnRedpointChange;
-        }
+    {
 
-        public List<int> rightTopHideRedpoints = new List<int>()
-        {
-            203,
-            209,
-            210,
-            212,
-            213,
-            214,
-            216,
-            280,
-            401,
-            402,
-            403,
-            406,
-            413,
-            421,
-            423,
-            433,
-            434,
-            443,
-            452,
-            500,
-            900,
-        };
+    }
 
-        private void OnRedpointChange(int id)
-        {
-            if (rightTopHideRedpoints.Contains(id))
-            {
-                var redpiontState = RedPointState.None;
-                for (int i = 0; i < rightTopHideRedpoints.Count; i++)
-                {
-                    var redpointId = rightTopHideRedpoints[i];
-                    if (RedpointCenter.Instance.GetRedpointState(redpointId) != RedPointState.None)
-                    {
-                        redpiontState = RedPointState.Simple;
-                        break;
-                    }
-                }
 
-                rightTopRedpint.state = redpiontState;
-            }
-        }
+
 
     }
 
diff --git a/Main/System/Message/SysNotifyMgr.cs b/Main/System/Message/SysNotifyMgr.cs
index 849ff29..414ed80 100644
--- a/Main/System/Message/SysNotifyMgr.cs
+++ b/Main/System/Message/SysNotifyMgr.cs
@@ -72,7 +72,6 @@
         ServerTipDetails.ClearHint();
     }
 
-    // // TODO YYL
     public void ReceiveNotifyCode(H0212_tagNotifyCode vNetData)
     {
         if (vNetData != null)
diff --git a/Main/System/OpenServerActivity/OpenServerActivityCenter.cs b/Main/System/OpenServerActivity/OpenServerActivityCenter.cs
index 8abb28f..3f7cf55 100644
--- a/Main/System/OpenServerActivity/OpenServerActivityCenter.cs
+++ b/Main/System/OpenServerActivity/OpenServerActivityCenter.cs
@@ -133,22 +133,22 @@
     //AT_Activity2 鏃ユ湡鍨嬫椿鍔�-榛樿璁捐閮芥槸鍚屼竴涓叆鍙o紝鏍规嵁娲诲姩鏇挎崲鍥炬爣鍜屽悕绉帮紝鎵撳紑涓嶅悓鐣岄潰
     public NewDayActivityInfo GetNewDayActionEnterInfo()
     {
-        if (IsActivityOpen((int)NewDayActivityID.BossTrial, (int)ActivityType.AT_Activity2))
-        {
-            return new NewDayActivityInfo() { activityID = (int)NewDayActivityID.BossTrial, redpointID = MainRedDot.BossTrialRepoint, winName = "BossTrialActWin" };
-        }
-        else if (IsActivityOpen((int)NewDayActivityID.SecretPlaceXB, (int)ActivityType.AT_Activity2))
-        {
-            return new NewDayActivityInfo() { activityID = (int)NewDayActivityID.SecretPlaceXB, redpointID = MainRedDot.MjxbRedpoint, winName = "SecretPlaceActWin" };
-        }
-        else if (IsActivityOpen((int)NewDayActivityID.PetHorseAct, (int)ActivityType.AT_Activity2))
-        {
-            return new NewDayActivityInfo() { activityID = (int)NewDayActivityID.PetHorseAct, redpointID = MainRedDot.QCTrainActRedpoint, winName = "PetHorseActWin" };
-        }
-        else if (IsActivityOpen((int)NewDayActivityID.TreasurePavilionAct, (int)ActivityType.AT_Activity2))
-        {
-            return new NewDayActivityInfo() { activityID = (int)NewDayActivityID.TreasurePavilionAct, redpointID = MainRedDot.TreasurePavilionRankActRepoint, winName = "TreasurePavilionRankActWin" };
-        }
+        // if (IsActivityOpen((int)NewDayActivityID.BossTrial, (int)ActivityType.AT_Activity2))
+        // {
+        //     return new NewDayActivityInfo() { activityID = (int)NewDayActivityID.BossTrial, redpointID = MainRedDot.BossTrialRepoint, winName = "BossTrialActWin" };
+        // }
+        // else if (IsActivityOpen((int)NewDayActivityID.SecretPlaceXB, (int)ActivityType.AT_Activity2))
+        // {
+        //     return new NewDayActivityInfo() { activityID = (int)NewDayActivityID.SecretPlaceXB, redpointID = MainRedDot.MjxbRedpoint, winName = "SecretPlaceActWin" };
+        // }
+        // else if (IsActivityOpen((int)NewDayActivityID.PetHorseAct, (int)ActivityType.AT_Activity2))
+        // {
+        //     return new NewDayActivityInfo() { activityID = (int)NewDayActivityID.PetHorseAct, redpointID = MainRedDot.QCTrainActRedpoint, winName = "PetHorseActWin" };
+        // }
+        // else if (IsActivityOpen((int)NewDayActivityID.TreasurePavilionAct, (int)ActivityType.AT_Activity2))
+        // {
+        //     return new NewDayActivityInfo() { activityID = (int)NewDayActivityID.TreasurePavilionAct, redpointID = MainRedDot.TreasurePavilionRankActRepoint, winName = "TreasurePavilionRankActWin" };
+        // }
 
         return new NewDayActivityInfo() { activityID = 0 };
     }
diff --git a/Main/System/PhantasmPavilion.meta b/Main/System/PhantasmPavilion.meta
new file mode 100644
index 0000000..f025c0d
--- /dev/null
+++ b/Main/System/PhantasmPavilion.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7cf953fa805a45343b556c89fa68bbdb
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/PhantasmPavilion/AvatarCell.cs b/Main/System/PhantasmPavilion/AvatarCell.cs
new file mode 100644
index 0000000..f10574b
--- /dev/null
+++ b/Main/System/PhantasmPavilion/AvatarCell.cs
@@ -0,0 +1,255 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+public class AvatarCell : MonoBehaviour
+{
+    public float scale = 1.0f;
+
+    ImageEx m_BgImage;
+    public ImageEx bgImage
+    {
+        get
+        {
+            if (m_BgImage == null)
+            {
+                LoadPrefab();
+                m_BgImage = this.GetComponent<ImageEx>("AvatarCell/Img_BG");
+            }
+            return m_BgImage;
+        }
+    }
+
+    ImageEx m_AvatarImage;
+    public ImageEx avatarImage
+    {
+        get
+        {
+            if (m_AvatarImage == null)
+            {
+                LoadPrefab();
+                m_AvatarImage = this.GetComponent<ImageEx>("AvatarCell/Img_Avatar");
+            }
+            return m_AvatarImage;
+        }
+    }
+
+    ImageEx m_AvatarFrameImage;
+    public ImageEx avatarFrameImage
+    {
+        get
+        {
+            if (m_AvatarFrameImage == null)
+            {
+                LoadPrefab();
+                m_AvatarFrameImage = this.GetComponent<ImageEx>("AvatarCell/Img_AvatarFrame");
+            }
+            return m_AvatarFrameImage;
+        }
+    }
+
+    ButtonEx m_button;
+    public ButtonEx button
+    {
+        get
+        {
+            if (m_button == null)
+            {
+                LoadPrefab();
+                m_button = this.GetComponent<ButtonEx>("AvatarCell/Img_AvatarFrame");
+            }
+            return m_button;
+        }
+    }
+
+    UIFrame m_AvatarUIFrame;
+    public UIFrame avatarUIFrame
+    {
+        get
+        {
+            if (m_AvatarUIFrame == null)
+            {
+                LoadPrefab();
+                m_AvatarUIFrame = this.GetComponent<UIFrame>("AvatarCell/Img_Avatar");
+            }
+            return m_AvatarUIFrame;
+        }
+    }
+
+    UIFrame m_AvatarFrameUIFrame;
+    public UIFrame avatarFrameUIFrame
+    {
+        get
+        {
+            if (m_AvatarFrameUIFrame == null)
+            {
+                LoadPrefab();
+                m_AvatarFrameUIFrame = this.GetComponent<UIFrame>("AvatarCell/Img_AvatarFrame");
+            }
+            return m_AvatarFrameUIFrame;
+        }
+    }
+
+    UIEffect m_AvatarUIEffect;
+    public UIEffect avatarUIEffect
+    {
+        get
+        {
+            if (m_AvatarUIEffect == null)
+            {
+                LoadPrefab();
+                m_AvatarUIEffect = this.GetComponent<UIEffect>("AvatarCell/Img_Avatar");
+            }
+            return m_AvatarUIEffect;
+        }
+    }
+
+    UIEffect m_AvatarFrameUIEffect;
+    public UIEffect avatarFrameUIEffect
+    {
+        get
+        {
+            if (m_AvatarFrameUIEffect == null)
+            {
+                LoadPrefab();
+                m_AvatarFrameUIEffect = this.GetComponent<UIEffect>("AvatarCell/Img_AvatarFrame");
+            }
+            return m_AvatarFrameUIEffect;
+        }
+    }
+
+    GameObject prefab;
+
+
+    protected void LoadPrefab()
+    {
+        var tmp = transform.Find("AvatarCell");
+
+        if (tmp != null)
+        {
+            prefab = tmp.gameObject;
+            return;
+        }
+        if (prefab == null)
+        {
+            prefab = UIUtility.CreateWidget("AvatarCell", "AvatarCell");
+
+            if (prefab != null)
+            {
+                prefab.transform.SetParentEx(this.transform, Vector3.zero, Quaternion.identity, Vector3.one);
+                prefab.transform.SetAsFirstSibling();
+
+                RectTransform prefabRect = prefab.GetComponent<RectTransform>();
+                RectTransform parentRect = GetComponent<RectTransform>();
+                if (prefabRect != null && parentRect != null)
+                {
+                    prefabRect.anchorMin = new Vector2(0.5f, 0.5f);
+                    prefabRect.anchorMax = new Vector2(0.5f, 0.5f);
+                    prefabRect.sizeDelta = new Vector2(parentRect.rect.width, parentRect.rect.height);
+                    prefabRect.localScale = new Vector3(scale, scale, scale);
+                }
+            }
+        }
+    }
+
+    public void InitUI(AvatarModel model)
+    {
+        if (model == null)
+            return;
+        string img = AvatarHelper.GetAvatarBgColorStr(model.avatarID);
+        bgImage.SetSprite(img);
+        InitUI(model.avatarID, model.avatarUIEffectID, model.avatarFrameID, model.avatarFrameUIEffectID);
+    }
+
+    private void InitUI(int avatarID, int avatarUIEffectID, int avatarFrameID, int avatarFrameUIEffectID)
+    {
+        InitAvatarUI(avatarID, avatarUIEffectID);
+        InitAvatarFrameUI(avatarFrameID, avatarFrameUIEffectID);
+    }
+
+    private void InitAvatarUI(int avatarID, int avatarUIEffectID)
+    {
+        avatarUIEffect.Stop();
+        avatarUIFrame.enabled = false;
+        if (!PlayerFaceConfig.HasKey(avatarID))
+            return;
+
+        PlayerFaceConfig config = PlayerFaceConfig.Get(avatarID);
+        string imgStr = config.Image;
+        if (UIFrameMgr.Inst.ContainsDynamicImage(imgStr))
+        {
+            avatarUIFrame.ResetFrame(imgStr);
+
+            List<UnityEngine.Sprite> spriteList = UIFrameMgr.Inst.GetDynamicImage(imgStr);
+            if (!spriteList.IsNullOrEmpty())
+            {
+                avatarImage.rectTransform.sizeDelta = new Vector2(spriteList[0].rect.width, spriteList[0].rect.height);
+            }
+
+            avatarUIFrame.enabled = true;
+        }
+        else
+        {
+            avatarImage.SetSprite(imgStr);
+            avatarImage.SetNativeSize();
+            avatarUIFrame.enabled = false;
+        }
+
+        if (!EffectConfig.HasKey(avatarUIEffectID))
+            return;
+        avatarUIEffect.effect = avatarUIEffectID;
+        avatarUIEffect.loop = true;
+        avatarUIEffect.Play();
+    }
+
+    private void InitAvatarFrameUI(int avatarFrameID, int avatarFrameUIEffectID)
+    {
+        avatarFrameUIEffect.Stop();
+        avatarFrameUIFrame.enabled = false;
+        if (!PlayerFacePicConfig.HasKey(avatarFrameID))
+            return;
+
+        PlayerFacePicConfig config = PlayerFacePicConfig.Get(avatarFrameID);
+        string imgStr = config.Image;
+        if (UIFrameMgr.Inst.ContainsDynamicImage(imgStr))
+        {
+            avatarFrameUIFrame.ResetFrame(imgStr);
+
+            List<UnityEngine.Sprite> spriteList = UIFrameMgr.Inst.GetDynamicImage(imgStr);
+            if (!spriteList.IsNullOrEmpty())
+            {
+                avatarFrameImage.rectTransform.sizeDelta = new Vector2(spriteList[0].rect.width, spriteList[0].rect.height);
+            }
+
+            avatarFrameUIFrame.enabled = true;
+        }
+        else
+        {
+            avatarFrameImage.SetSprite(imgStr);
+            avatarFrameImage.SetNativeSize();
+            avatarFrameUIFrame.enabled = false;
+        }
+
+        if (!EffectConfig.HasKey(avatarFrameUIEffectID))
+            return;
+        avatarUIEffect.effect = avatarFrameUIEffectID;
+        avatarUIEffect.loop = true;
+        avatarUIEffect.Play();
+    }
+}
+
+public class AvatarModel
+{
+    public int avatarID { get; private set; }
+    public int avatarFrameID { get; private set; }
+    public int avatarUIEffectID { get; private set; }
+    public int avatarFrameUIEffectID { get; private set; }
+    public float scale { get; private set; }
+
+    public AvatarModel(int avatarID, int avatarFrameID, int avatarUIEffectID = 0, int avatarFrameUIEffectID = 0)
+    {
+        this.avatarID = avatarID;
+        this.avatarFrameID = avatarFrameID;
+        this.avatarUIEffectID = avatarUIEffectID;
+        this.avatarFrameUIEffectID = avatarFrameUIEffectID;
+    }
+}
\ No newline at end of file
diff --git a/Main/System/PhantasmPavilion/AvatarCell.cs.meta b/Main/System/PhantasmPavilion/AvatarCell.cs.meta
new file mode 100644
index 0000000..21fb257
--- /dev/null
+++ b/Main/System/PhantasmPavilion/AvatarCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 10e0c2965f0f23249b69c5a19f2e235b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/PhantasmPavilion/AvatarHelper.cs b/Main/System/PhantasmPavilion/AvatarHelper.cs
new file mode 100644
index 0000000..bafbb2a
--- /dev/null
+++ b/Main/System/PhantasmPavilion/AvatarHelper.cs
@@ -0,0 +1,119 @@
+public static class AvatarHelper
+{
+
+    public static AvatarModel GetAvatarModel(int playerId, int face, int facePic, int job = 0)
+    {
+        bool isMyself = playerId == PlayerDatas.Instance.PlayerId;
+        return isMyself ? GetMyAvatarModel() : GetOtherAvatarModel(face, facePic, job);
+    }
+
+    //鑾峰彇澶村儚淇℃伅锛堝鏋滆〃涓笉瀛樺湪锛岃繑鍥為粯璁ょ殑锛�
+    public static AvatarModel GetOtherAvatarModel(int face, int facePic, int job = 0)
+    {
+        int nowFace = GetOtherAvatarID(face, job);
+        int nowfacePic = GetOtherAvatarFrameID(facePic, job);
+        int faceEffectID = GetAvatarEffectID(nowFace);
+        int facePicEffectID = GetAvatarFrameDefaultID(nowfacePic);
+        return new AvatarModel(nowFace, nowfacePic, faceEffectID, facePicEffectID);
+    }
+
+    //鑾峰彇鎴戠殑澶村儚淇℃伅锛堝鏋滆〃涓笉瀛樺湪 鎴� 宸茶繃鏈燂紝杩斿洖榛樿鐨勶級
+    public static AvatarModel GetMyAvatarModel()
+    {
+        int nowFace = GetMyAvatarID();
+        int nowfacePic = GetMyAvatarFrameID();
+        int faceEffectID = GetAvatarEffectID(nowFace);
+        int facePicEffectID = GetAvatarFrameDefaultID(nowfacePic);
+        return new AvatarModel(nowFace, nowfacePic, faceEffectID, facePicEffectID);
+    }
+
+    public static AvatarModel GetDefaultAvatarModel(int job = 0)
+    {
+        int nowFace = GetAvatarDefaultID(job);
+        int nowfacePic = GetAvatarFrameDefaultID(job);
+        int faceEffectID = GetAvatarEffectID(nowFace);
+        int facePicEffectID = GetAvatarFrameDefaultID(nowfacePic);
+        return new AvatarModel(nowFace, nowfacePic, faceEffectID, facePicEffectID);
+    }
+
+    public static int GetAvatarID(int playerId, int nowID, int job)
+    {
+        bool isMyself = playerId == PlayerDatas.Instance.PlayerId;
+        return isMyself ? GetMyAvatarID() : GetOtherAvatarID(nowID, job);
+    }
+
+    public static int GetAvatarFrameID(int playerId, int nowID, int job)
+    {
+        bool isMyself = playerId == PlayerDatas.Instance.PlayerId;
+        return isMyself ? GetMyAvatarFrameID() : GetOtherAvatarFrameID(nowID, job);
+    }
+
+    // 鑾峰彇鍏朵粬鐜╁澶村儚id(灏佸寘涓殑id鍦ㄨ〃涓笉瀛樺湪鏄剧ず榛樿鐨�)
+    public static int GetOtherAvatarID(int nowID, int job)
+    {
+        if (PlayerFaceConfig.HasKey(nowID))
+            return nowID;
+        return PhantasmPavilionModel.Instance.TryGetDefaultID(PhantasmPavilionTab.Avatar, job, out int defaultID) ? defaultID : 0;
+    }
+
+    public static int GetOtherAvatarFrameID(int nowID, int job)
+    {
+        if (PlayerFaceConfig.HasKey(nowID))
+            return nowID;
+        return PhantasmPavilionModel.Instance.TryGetDefaultID(PhantasmPavilionTab.AvatarFrame, job, out int defaultID) ? defaultID : 0;
+    }
+
+    //杩斿洖鐜╁澶村儚id(褰撳墠瑁呭鐨勮繃鏈熶簡鏄剧ず榛樿鐨�)
+    public static int GetMyAvatarID()
+    {
+        PhantasmPavilionModel.Instance.TryGetNowShowID(PhantasmPavilionTab.Avatar, out int defaultID);
+        return defaultID;
+    }
+
+    public static int GetMyAvatarFrameID()
+    {
+        PhantasmPavilionModel.Instance.TryGetNowShowID(PhantasmPavilionTab.AvatarFrame, out int defaultID);
+        return defaultID;
+    }
+
+    //鏍规嵁job 鐩存帴杩斿洖瀵瑰簲鐨勯粯璁ゅご鍍廼d
+    public static int GetAvatarDefaultID(int job)
+    {
+        PhantasmPavilionModel.Instance.TryGetDefaultID(PhantasmPavilionTab.Avatar, job, out int defaultID);
+        return defaultID;
+    }
+
+    public static int GetAvatarFrameDefaultID(int job)
+    {
+        PhantasmPavilionModel.Instance.TryGetDefaultID(PhantasmPavilionTab.AvatarFrame, job, out int defaultID);
+        return defaultID;
+    }
+
+    public static int GetAvatarEffectID(int id)
+    {
+        PhantasmPavilionModel.Instance.TryGetEffectID(PhantasmPavilionTab.Avatar, id, out int effectID);
+        return effectID;
+    }
+
+    public static int GetAvatarFrameEffectID(int id)
+    {
+        PhantasmPavilionModel.Instance.TryGetEffectID(PhantasmPavilionTab.AvatarFrame, id, out int effectID);
+        return effectID;
+    }
+
+    //鑾峰彇鎸囧畾澶村儚搴曞浘鍝佽川
+    public static int GetAvatarBgColor(int faceID)
+    {
+        int defaultColor = 1;//榛樿鍝佽川鏄櫧鑹�
+        if (!PlayerFaceConfig.HasKey(faceID))
+            return defaultColor;
+        return PlayerFaceConfig.Get(faceID).BgColor;
+    }
+
+    //鑾峰彇鎸囧畾澶村儚鍥剧墖鍚�
+    public static string GetAvatarBgColorStr(int faceID)
+    {
+        int bgColor = GetAvatarBgColor(faceID);
+        return StringUtility.Contact("AvatarBgColor", bgColor);
+    }
+}
\ No newline at end of file
diff --git a/Main/System/PhantasmPavilion/AvatarHelper.cs.meta b/Main/System/PhantasmPavilion/AvatarHelper.cs.meta
new file mode 100644
index 0000000..e279c3e
--- /dev/null
+++ b/Main/System/PhantasmPavilion/AvatarHelper.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 3cb54d39bd61368488bdd1689fbc9257
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/PhantasmPavilion/ChatBubbleHelper.cs b/Main/System/PhantasmPavilion/ChatBubbleHelper.cs
new file mode 100644
index 0000000..7beaa1e
--- /dev/null
+++ b/Main/System/PhantasmPavilion/ChatBubbleHelper.cs
@@ -0,0 +1,20 @@
+public static class ChatBubbleHelper
+{
+
+
+    public static int GetOtherChatBubbleID(int nowID)
+    {
+        return PhantasmPavilionModel.Instance.GetNowOtherChatBubbleID(nowID);
+    }
+
+    public static int GetMyChatBubbleID()
+    {
+        return PhantasmPavilionModel.Instance.GetNowChatBubbleID();
+    }
+
+    public static int GetChatBubbleDefaultID()
+    {
+        PhantasmPavilionModel.Instance.TryGetDefaultID(PhantasmPavilionTab.ChatBubble, 0, out int defaultID);
+        return defaultID;
+    }
+}
\ No newline at end of file
diff --git a/Main/System/PhantasmPavilion/ChatBubbleHelper.cs.meta b/Main/System/PhantasmPavilion/ChatBubbleHelper.cs.meta
new file mode 100644
index 0000000..f254096
--- /dev/null
+++ b/Main/System/PhantasmPavilion/ChatBubbleHelper.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f54eef33aa8e30646b6700f6e03db119
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/PhantasmPavilion/IPhantasmPavilionTabHandler.cs b/Main/System/PhantasmPavilion/IPhantasmPavilionTabHandler.cs
new file mode 100644
index 0000000..9acbc7e
--- /dev/null
+++ b/Main/System/PhantasmPavilion/IPhantasmPavilionTabHandler.cs
@@ -0,0 +1,31 @@
+using System.Collections.Generic;
+
+public interface IPhantasmPavilionTabHandler
+{
+    string GetDescriptive(int id);
+
+    int GetSortNum(int id);
+
+    int GetExpireMinutes(int id);
+
+    string GetImage(int id);
+
+    string GetName(int id);
+
+    List<int> GetTableKeys();
+
+    int GetUnlockDefault(int id);
+
+    bool Has(int id);
+
+
+    void SendUsePack(int id);
+
+
+    bool TryGetEffectID(int id, out int effectID);
+
+
+    bool TryGetUnLockAttr(int id, out int[] lightAttrTypeArr, out int[] lightAttrValueArr);
+
+    bool TryGetUnLockNeedItem(int id, out int itemId, out int count);
+}
\ No newline at end of file
diff --git a/Main/System/PhantasmPavilion/IPhantasmPavilionTabHandler.cs.meta b/Main/System/PhantasmPavilion/IPhantasmPavilionTabHandler.cs.meta
new file mode 100644
index 0000000..d9167aa
--- /dev/null
+++ b/Main/System/PhantasmPavilion/IPhantasmPavilionTabHandler.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 37f2ad437f021474abf3e1eaa501a86c
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/PhantasmPavilion/PhantasmPavilionAvatarFrameHandler.cs b/Main/System/PhantasmPavilion/PhantasmPavilionAvatarFrameHandler.cs
new file mode 100644
index 0000000..4950bab
--- /dev/null
+++ b/Main/System/PhantasmPavilion/PhantasmPavilionAvatarFrameHandler.cs
@@ -0,0 +1,95 @@
+using System.Collections.Generic;
+
+public class PhantasmPavilionAvatarFrameHandler : IPhantasmPavilionTabHandler
+{
+
+    public string GetDescriptive(int id)
+    {
+        return PlayerFacePicConfig.Get(id).Descriptive;
+    }
+
+    public int GetExpireMinutes(int id)
+    {
+        return PlayerFacePicConfig.Get(id).ExpireMinutes;
+    }
+
+    public string GetImage(int id)
+    {
+        return PlayerFacePicConfig.Get(id).Image;
+    }
+
+    public string GetName(int id)
+    {
+        return PlayerFacePicConfig.Get(id).Name;
+    }
+
+    public int GetSortNum(int id)
+    {
+        return PlayerFacePicConfig.Get(id).SortNum;
+    }
+
+    public List<int> GetTableKeys()
+    {
+        return PlayerFacePicConfig.GetKeys();
+    }
+
+    public int GetUnlockDefault(int id)
+    {
+        return PlayerFacePicConfig.Get(id).UnlockDefault;
+    }
+
+    public bool Has(int id)
+    {
+        return PlayerFacePicConfig.HasKey(id);
+    }
+
+
+
+    public void SendUsePack(int id)
+    {
+        PhantasmPavilionModel.Instance.SendCB228FacePicChange(id);
+    }
+
+
+    public bool TryGetEffectID(int id, out int effectID)
+    {
+        effectID = 0;
+        if (!PlayerFacePicConfig.HasKey(id))
+            return false;
+        PlayerFacePicConfig config = PlayerFacePicConfig.Get(id);
+        if (!EffectConfig.HasKey(config.EffectID))
+            return false;
+        effectID = config.EffectID;
+        return true;
+    }
+
+
+    public bool TryGetUnLockAttr(int id, out int[] lightAttrTypeArr, out int[] lightAttrValueArr)
+    {
+        lightAttrTypeArr = new int[0];
+        lightAttrValueArr = new int[0];
+        if (!PlayerFacePicConfig.HasKey(id))
+            return false;
+        PlayerFacePicConfig config = PlayerFacePicConfig.Get(id);
+        if (config.LightAttrType.IsNullOrEmpty() || config.LightAttrValue.IsNullOrEmpty() || config.LightAttrType.Length != config.LightAttrValue.Length)
+            return false;
+        lightAttrTypeArr = config.LightAttrType;
+        lightAttrValueArr = config.LightAttrValue;
+        return true;
+    }
+
+    public bool TryGetUnLockNeedItem(int id, out int itemId, out int count)
+    {
+        itemId = 0;
+        count = 0;
+        if (!PlayerFacePicConfig.HasKey(id))
+            return false;
+        PlayerFacePicConfig config = PlayerFacePicConfig.Get(id);
+
+        if (config.UnlockNeedItemList.IsNullOrEmpty())
+            return false;
+        itemId = config.UnlockNeedItemList[0][0];
+        count = config.UnlockNeedItemList[0][1];
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/Main/System/PhantasmPavilion/PhantasmPavilionAvatarFrameHandler.cs.meta b/Main/System/PhantasmPavilion/PhantasmPavilionAvatarFrameHandler.cs.meta
new file mode 100644
index 0000000..ba92fcd
--- /dev/null
+++ b/Main/System/PhantasmPavilion/PhantasmPavilionAvatarFrameHandler.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 58f6eca69a5754f47ac01e67cdd1aa42
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/PhantasmPavilion/PhantasmPavilionAvatarHandler.cs b/Main/System/PhantasmPavilion/PhantasmPavilionAvatarHandler.cs
new file mode 100644
index 0000000..d62dfbe
--- /dev/null
+++ b/Main/System/PhantasmPavilion/PhantasmPavilionAvatarHandler.cs
@@ -0,0 +1,95 @@
+using System.Collections.Generic;
+
+public class PhantasmPavilionAvatarHandler : IPhantasmPavilionTabHandler
+{
+
+    public string GetDescriptive(int id)
+    {
+        return PlayerFaceConfig.Get(id).Descriptive;
+    }
+
+    public int GetExpireMinutes(int id)
+    {
+        return PlayerFaceConfig.Get(id).ExpireMinutes;
+    }
+
+    public string GetImage(int id)
+    {
+        return PlayerFaceConfig.Get(id).Image;
+    }
+
+    public string GetName(int id)
+    {
+        return PlayerFaceConfig.Get(id).Name;
+    }
+
+    public int GetSortNum(int id)
+    {
+        return PlayerFaceConfig.Get(id).BgColor;
+    }
+
+    public List<int> GetTableKeys()
+    {
+        return PlayerFaceConfig.GetKeys();
+    }
+
+    public int GetUnlockDefault(int id)
+    {
+        return PlayerFaceConfig.Get(id).UnlockDefault;
+    }
+
+    public bool Has(int id)
+    {
+        return PlayerFaceConfig.HasKey(id);
+    }
+
+
+    public void SendUsePack(int id)
+    {
+        PhantasmPavilionModel.Instance.SendCB226FaceChange(id);
+    }
+
+
+    public bool TryGetEffectID(int id, out int effectID)
+    {
+        effectID = 0;
+        if (!PlayerFaceConfig.HasKey(id))
+            return false;
+        PlayerFaceConfig config = PlayerFaceConfig.Get(id);
+        if (!EffectConfig.HasKey(config.EffectID))
+            return false;
+        effectID = config.EffectID;
+        return true;
+    }
+
+
+
+    public bool TryGetUnLockAttr(int id, out int[] lightAttrTypeArr, out int[] lightAttrValueArr)
+    {
+        lightAttrTypeArr = new int[0];
+        lightAttrValueArr = new int[0];
+        if (!PlayerFaceConfig.HasKey(id))
+            return false;
+        PlayerFaceConfig config = PlayerFaceConfig.Get(id);
+        if (config.LightAttrType.IsNullOrEmpty() || config.LightAttrValue.IsNullOrEmpty() || config.LightAttrType.Length != config.LightAttrValue.Length)
+            return false;
+        lightAttrTypeArr = config.LightAttrType;
+        lightAttrValueArr = config.LightAttrValue;
+        return true;
+    }
+
+    public bool TryGetUnLockNeedItem(int id, out int itemId, out int count)
+    {
+        itemId = 0;
+        count = 0;
+        if (!PlayerFaceConfig.HasKey(id))
+            return false;
+        PlayerFaceConfig config = PlayerFaceConfig.Get(id);
+
+        if (config.UnlockNeedItemList.IsNullOrEmpty())
+            return false;
+        itemId = config.UnlockNeedItemList[0][0];
+        count = config.UnlockNeedItemList[0][1];
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/Main/System/PhantasmPavilion/PhantasmPavilionAvatarHandler.cs.meta b/Main/System/PhantasmPavilion/PhantasmPavilionAvatarHandler.cs.meta
new file mode 100644
index 0000000..68bc6dc
--- /dev/null
+++ b/Main/System/PhantasmPavilion/PhantasmPavilionAvatarHandler.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 86b74289e945f41478304281d8fd7943
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/PhantasmPavilion/PhantasmPavilionChatBubbleHandler.cs b/Main/System/PhantasmPavilion/PhantasmPavilionChatBubbleHandler.cs
new file mode 100644
index 0000000..8d305ff
--- /dev/null
+++ b/Main/System/PhantasmPavilion/PhantasmPavilionChatBubbleHandler.cs
@@ -0,0 +1,90 @@
+using System.Collections.Generic;
+
+public class PhantasmPavilionChatBubbleHandler : IPhantasmPavilionTabHandler
+{
+
+
+    public string GetDescriptive(int id)
+    {
+        return ChatBubbleBoxConfig.Get(id).Descriptive;
+    }
+
+    public int GetExpireMinutes(int id)
+    {
+        return ChatBubbleBoxConfig.Get(id).ExpireMinutes;
+    }
+
+    public string GetImage(int id)
+    {
+        return ChatBubbleBoxConfig.Get(id).Icon;
+    }
+
+    public string GetName(int id)
+    {
+        return ChatBubbleBoxConfig.Get(id).Name;
+    }
+
+    public int GetSortNum(int id)
+    {
+        return ChatBubbleBoxConfig.Get(id).SortNum;
+    }
+
+    public List<int> GetTableKeys()
+    {
+        return ChatBubbleBoxConfig.GetKeys();
+    }
+
+    public int GetUnlockDefault(int id)
+    {
+        return ChatBubbleBoxConfig.Get(id).UnlockDefault;
+    }
+
+    public bool Has(int id)
+    {
+        return ChatBubbleBoxConfig.HasKey(id);
+    }
+
+
+
+    public void SendUsePack(int id)
+    {
+        PhantasmPavilionModel.Instance.SendCA230SetChatBubbleBox(id);
+    }
+
+    public bool TryGetEffectID(int id, out int effectID)
+    {
+        effectID = 0;
+        return false;
+    }
+
+ 
+
+    public bool TryGetUnLockAttr(int id, out int[] lightAttrTypeArr, out int[] lightAttrValueArr)
+    {
+        lightAttrTypeArr = new int[0];
+        lightAttrValueArr = new int[0];
+        if (!ChatBubbleBoxConfig.HasKey(id))
+            return false;
+        ChatBubbleBoxConfig config = ChatBubbleBoxConfig.Get(id);
+        if (config.LightAttrType.IsNullOrEmpty() || config.LightAttrValue.IsNullOrEmpty() || config.LightAttrType.Length != config.LightAttrValue.Length)
+            return false;
+        lightAttrTypeArr = config.LightAttrType;
+        lightAttrValueArr = config.LightAttrValue;
+        return true;
+    }
+
+    public bool TryGetUnLockNeedItem(int id, out int itemId, out int count)
+    {
+        itemId = 0;
+        count = 0;
+        if (!ChatBubbleBoxConfig.HasKey(id))
+            return false;
+        ChatBubbleBoxConfig config = ChatBubbleBoxConfig.Get(id);
+
+        if (config.UnlockNeedItemList.IsNullOrEmpty())
+            return false;
+        itemId = config.UnlockNeedItemList[0][0];
+        count = config.UnlockNeedItemList[0][1];
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/Main/System/PhantasmPavilion/PhantasmPavilionChatBubbleHandler.cs.meta b/Main/System/PhantasmPavilion/PhantasmPavilionChatBubbleHandler.cs.meta
new file mode 100644
index 0000000..48d7138
--- /dev/null
+++ b/Main/System/PhantasmPavilion/PhantasmPavilionChatBubbleHandler.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: cf722846804928a4a90fd214baeb5295
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/PhantasmPavilion/PhantasmPavilionChatExpressionHandler.cs b/Main/System/PhantasmPavilion/PhantasmPavilionChatExpressionHandler.cs
new file mode 100644
index 0000000..fb9a723
--- /dev/null
+++ b/Main/System/PhantasmPavilion/PhantasmPavilionChatExpressionHandler.cs
@@ -0,0 +1,91 @@
+using System.Collections.Generic;
+
+public class PhantasmPavilionChatExpressionHandler : IPhantasmPavilionTabHandler
+{
+
+    public string GetDescriptive(int id)
+    {
+        return EmojiPackConfig.Get(id).Descriptive;
+    }
+
+    public int GetExpireMinutes(int id)
+    {
+        return EmojiPackConfig.Get(id).ExpireMinutes;
+    }
+
+    public string GetImage(int id)
+    {
+        return EmojiPackConfig.Get(id).Image;
+    }
+
+    public string GetName(int id)
+    {
+        return EmojiPackConfig.Get(id).Name;
+    }
+
+    public int GetSortNum(int id)
+    {
+        return EmojiPackConfig.Get(id).SortNum;
+    }
+
+    public List<int> GetTableKeys()
+    {
+        return EmojiPackConfig.GetKeys();
+    }
+
+    public int GetUnlockDefault(int id)
+    {
+        return EmojiPackConfig.Get(id).UnlockDefault;
+    }
+
+    public bool Has(int id)
+    {
+        return EmojiPackConfig.HasKey(id);
+    }
+
+
+
+    public void SendUsePack(int id)
+    {
+        PhantasmPavilionModel.Instance.SendCA230SetChatBubbleBox(id);
+    }
+
+
+
+    public bool TryGetEffectID(int id, out int effectID)
+    {
+        effectID = 0;
+        if (!EmojiPackConfig.HasKey(id))
+            return false;
+        EmojiPackConfig config = EmojiPackConfig.Get(id);
+        if (!EffectConfig.HasKey(config.EffectID))
+            return false;
+        effectID = config.EffectID;
+        return true;
+    }
+
+
+
+
+    public bool TryGetUnLockAttr(int id, out int[] lightAttrTypeArr, out int[] lightAttrValueArr)
+    {
+        lightAttrTypeArr = new int[0];
+        lightAttrValueArr = new int[0];
+        return false;
+    }
+
+    public bool TryGetUnLockNeedItem(int id, out int itemId, out int count)
+    {
+        itemId = 0;
+        count = 0;
+        if (!EmojiPackConfig.HasKey(id))
+            return false;
+        EmojiPackConfig config = EmojiPackConfig.Get(id);
+
+        if (config.UnlockNeedItemList.IsNullOrEmpty())
+            return false;
+        itemId = config.UnlockNeedItemList[0][0];
+        count = config.UnlockNeedItemList[0][1];
+        return true;
+    }
+}
diff --git a/Main/System/PhantasmPavilion/PhantasmPavilionChatExpressionHandler.cs.meta b/Main/System/PhantasmPavilion/PhantasmPavilionChatExpressionHandler.cs.meta
new file mode 100644
index 0000000..9410d9b
--- /dev/null
+++ b/Main/System/PhantasmPavilion/PhantasmPavilionChatExpressionHandler.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 787bf856f1279b8478b2d596060cd4d9
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/PhantasmPavilion/PhantasmPavilionModel.cs b/Main/System/PhantasmPavilion/PhantasmPavilionModel.cs
new file mode 100644
index 0000000..89ce304
--- /dev/null
+++ b/Main/System/PhantasmPavilion/PhantasmPavilionModel.cs
@@ -0,0 +1,893 @@
+using LitJson;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEngine;
+
+public enum PhantasmPavilionTab
+{
+    Avatar,                 // 0 - 澶村儚
+    AvatarFrame,            // 1 - 澶村儚妗�
+    ChatExpression,         // 2 - 鑱婂ぉ琛ㄦ儏
+    ChatBubble              // 3 - 鑱婂ぉ姘旀场
+}
+
+public class PhantasmPavilionModel : GameSystemManager<PhantasmPavilionModel>
+{
+    public readonly int MaxItemRowCount = 2;    // 涓�琛屽睍绀簒涓墿鍝�
+    public readonly int MaxEmojiCount = 10;
+    public readonly int FuncId = 236;
+    private PhantasmPavilionTab m_SelectTab;
+    //褰撳墠閫変腑鐨勬爣绛鹃〉
+    public PhantasmPavilionTab selectTab
+    {
+        get { return m_SelectTab; }
+        set
+        {
+            m_SelectTab = value;
+            TabChangeEvent?.Invoke();
+        }
+    }
+
+    private int m_selectItemId;
+    public int selectItemId
+    {
+        get { return m_selectItemId; }
+        set
+        {
+            m_selectItemId = value;
+            ItemIdChangeEvent?.Invoke();
+        }
+    }
+
+    //褰撳墠閫変腑鐨勮〃鎯呭寘缁�
+
+    private int m_SelectEmojiPackID;
+    public int selectEmojiPackID
+    {
+        get { return m_SelectEmojiPackID; }
+        set
+        {
+            m_SelectEmojiPackID = value;
+            EmojiPackIDChangeEvent?.Invoke();
+        }
+    }
+
+    private Dictionary<PhantasmPavilionTab, IPhantasmPavilionTabHandler> handlers = new Dictionary<PhantasmPavilionTab, IPhantasmPavilionTabHandler>();
+    public Dictionary<PhantasmPavilionTab, Dictionary<int, PhantasmPavilionInfo>> infoDict = new Dictionary<PhantasmPavilionTab, Dictionary<int, PhantasmPavilionInfo>>();
+    public Dictionary<PhantasmPavilionTab, Dictionary<int, int>> defaultIDDict = new Dictionary<PhantasmPavilionTab, Dictionary<int, int>>();
+    public Dictionary<PhantasmPavilionTab, int> nowIDDict = new Dictionary<PhantasmPavilionTab, int>();
+
+    // 骞诲闃佸叆鍙g孩鐐� 459
+    Redpoint mainRedPoint = new Redpoint(10101, MainRedDot.PhantasmPavilionRepoint);
+
+    //鏍囩椤电孩鐐� 4591 - 4594
+    public Dictionary<PhantasmPavilionTab, Redpoint> tabRedPointDict = new Dictionary<PhantasmPavilionTab, Redpoint>();
+
+    public Dictionary<PhantasmPavilionTab, Dictionary<int, Redpoint>> itemRedPointDict = new Dictionary<PhantasmPavilionTab, Dictionary<int, Redpoint>>();
+
+    public event Action TabChangeEvent;         //鍒囨崲鏍囩椤�
+    public event Action ItemIdChangeEvent;      //鍒囨崲閫変腑椤�
+    public event Action EmojiPackIDChangeEvent;      //鍒囨崲閫変腑椤�
+    public event Action UpdateFaceInfoEvent;
+    public event Action UpdateFacePicInfoEvent;
+    public event Action UpdateEmojiPackInfoEvent;
+    public event Action UpdateChatBubbleBoxInfoEvent;
+    public Action<string> SendChatAction;
+
+
+    public override void Init()
+    {
+        PlayerDatas.Instance.playerDataRefreshEvent += OnPlayerDataRefreshEvent;
+        PackManager.Instance.refreshItemCountEvent += OnRefreshItemCountEvent;
+        GlobalTimeEvent.Instance.secondEvent += CheckRedPoint;
+        InitHandler();
+        InitTable();
+        InitRedPoint();
+    }
+
+    public override void Release()
+    {
+        PlayerDatas.Instance.playerDataRefreshEvent -= OnPlayerDataRefreshEvent;
+        PackManager.Instance.refreshItemCountEvent -= OnRefreshItemCountEvent;
+        GlobalTimeEvent.Instance.fiveSecondEvent -= CheckRedPoint;
+    }
+
+    private void OnRefreshItemCountEvent(PackType type, int arg2, int arg3)
+    {
+        m_CheckRedPoint = true;
+    }
+
+    bool m_CheckRedPoint = false;
+    void CheckRedPoint()
+    {
+        if (m_CheckRedPoint)
+        {
+            UpdateRedPoint();
+            m_CheckRedPoint = false;
+        }
+    }
+
+
+    public void OnBeforePlayerDataInitialize()
+    {
+        infoDict.Clear();
+    }
+
+    public void OnPlayerLoginOk()
+    {
+        selectTab = PhantasmPavilionTab.Avatar;
+        var list = ShowItemList(selectTab, out int fristIndex);
+        if (!list.IsNullOrEmpty())
+            selectItemId = fristIndex;
+
+        nowIDDict[PhantasmPavilionTab.Avatar] = PlayerDatas.Instance.baseData.face;
+        nowIDDict[PhantasmPavilionTab.AvatarFrame] = PlayerDatas.Instance.baseData.facePic;
+        nowIDDict[PhantasmPavilionTab.ChatBubble] = (int)PlayerDatas.Instance.baseData.bubbleId;
+    }
+
+    private void OnPlayerDataRefreshEvent(PlayerDataType type)
+    {
+        if (type == PlayerDataType.Face)
+        {
+            nowIDDict[PhantasmPavilionTab.Avatar] = (int)PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.Face);
+        }
+        else if (type == PlayerDataType.HairColor)
+        {
+            nowIDDict[PhantasmPavilionTab.AvatarFrame] = (int)PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.HairColor);
+        }
+        else if (type == PlayerDataType.ExAttr10)
+        {
+            nowIDDict[PhantasmPavilionTab.ChatBubble] = (int)PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.ExAttr10);
+        }
+
+        if (type == PlayerDataType.LV)
+        {
+            UpdateRedPoint();
+        }
+    }
+
+    private void InitHandler()
+    {
+        handlers = new Dictionary<PhantasmPavilionTab, IPhantasmPavilionTabHandler>();
+        handlers[PhantasmPavilionTab.Avatar] = new PhantasmPavilionAvatarHandler();
+        handlers[PhantasmPavilionTab.AvatarFrame] = new PhantasmPavilionAvatarFrameHandler();
+        handlers[PhantasmPavilionTab.ChatExpression] = new PhantasmPavilionChatExpressionHandler();
+        handlers[PhantasmPavilionTab.ChatBubble] = new PhantasmPavilionChatBubbleHandler();
+    }
+
+    private void InitTable()
+    {
+        InitDefault();
+    }
+
+    private void InitRedPoint()
+    {
+        InitTabRedPoint();
+        InitItemRedPoint(PhantasmPavilionTab.Avatar, PlayerFaceConfig.GetKeys());
+        InitItemRedPoint(PhantasmPavilionTab.AvatarFrame, PlayerFacePicConfig.GetKeys());
+        InitItemRedPoint(PhantasmPavilionTab.ChatExpression, EmojiPackConfig.GetKeys());
+        InitItemRedPoint(PhantasmPavilionTab.ChatBubble, ChatBubbleBoxConfig.GetKeys());
+    }
+
+    private void InitDefault()
+    {
+        var tabValues = Enum.GetValues(typeof(PhantasmPavilionTab));
+        for (int i = 0; i < tabValues.Length; i++)
+        {
+            PhantasmPavilionTab tab = (PhantasmPavilionTab)tabValues.GetValue(i);
+            if (!defaultIDDict.ContainsKey(tab))
+            {
+                defaultIDDict[tab] = new Dictionary<int, int>();
+            }
+        }
+
+        var config = FuncConfigConfig.Get("PhantasmPavilion");
+        var jsonData = JsonMapper.ToObject(config.Numerical1);
+        List<string> keyList = jsonData.Keys.ToList();
+        for (int i = 0; i < keyList.Count; i++)
+        {
+            int key = int.Parse(keyList[i]);
+            int value = int.Parse(jsonData[keyList[i]].ToString());
+            defaultIDDict[PhantasmPavilionTab.Avatar][key] = value;
+        }
+
+        jsonData = JsonMapper.ToObject(config.Numerical2);
+        keyList = jsonData.Keys.ToList();
+        for (int i = 0; i < keyList.Count; i++)
+        {
+            int key = int.Parse(keyList[i]);
+            int value = int.Parse(jsonData[keyList[i]].ToString());
+            defaultIDDict[PhantasmPavilionTab.AvatarFrame][key] = value;
+        }
+        //defaultIDDict[PhantasmPavilionTab.ChatExpression][0] = int.Parse(config.Numerical3);
+        defaultIDDict[PhantasmPavilionTab.ChatBubble][0] = int.Parse(config.Numerical3);
+    }
+
+    private void InitTabRedPoint()
+    {
+        var values = Enum.GetValues(typeof(PhantasmPavilionTab));
+        for (int i = 0; i < values.Length; i++)
+        {
+            PhantasmPavilionTab tab = (PhantasmPavilionTab)values.GetValue(i);
+            int id = MainRedDot.PhantasmPavilionRepoint * 10 + (int)tab + 1;
+            tabRedPointDict[tab] = new Redpoint(MainRedDot.PhantasmPavilionRepoint, id);
+        }
+    }
+
+    private void InitItemRedPoint(PhantasmPavilionTab tab, List<int> idList)
+    {
+        if (!infoDict.ContainsKey(tab))
+            itemRedPointDict[tab] = new Dictionary<int, Redpoint>();
+
+        for (int i = 0; i < idList.Count; i++)
+        {
+            int id = idList[i];
+            int baseValue = MainRedDot.PhantasmPavilionRepoint * 10 + (int)tab + 1;
+            itemRedPointDict[tab][id] = new Redpoint(baseValue, baseValue * 10000 + id);
+        }
+    }
+
+    public void UpdateRedPoint()
+    {
+        var values = Enum.GetValues(typeof(PhantasmPavilionTab));
+        for (int i = 0; i < values.Length; i++)
+        {
+            PhantasmPavilionTab key = (PhantasmPavilionTab)values.GetValue(i);
+            tabRedPointDict[key].state = RedPointState.None;
+            var keyList = itemRedPointDict[key].Keys.ToList();
+            for (int j = 0; j < keyList.Count; j++)
+            {
+                int id = keyList[j];
+                itemRedPointDict[key][id].state = RedPointState.None;
+                //鍙縺娲�
+                if (GetUnLockState(key, id) == 1)
+                {
+                    itemRedPointDict[key][id].state = RedPointState.Simple;
+
+                    if (selectTab != key)
+                    {
+                        tabRedPointDict[key].state = RedPointState.Simple;
+                    }
+                }
+
+            }
+        }
+    }
+
+
+    public bool IsCustom(int faceID, out int customPlayerID)
+    {
+        customPlayerID = 0;
+        if (!PlayerFaceConfig.HasKey(faceID))
+            return false;
+        customPlayerID = PlayerFaceConfig.Get(faceID).CustomPlayerID;
+        if (customPlayerID <= 0)
+            return false;
+        return true;
+    }
+
+
+    //鑾峰彇涓嶅悓鑱屼笟瀵瑰簲鐨勯粯璁ゅ��
+    public bool TryGetDefaultID(PhantasmPavilionTab key, int job, out int defaultID)
+    {
+        defaultID = 0;
+        if (defaultIDDict == null || !defaultIDDict.TryGetValue(key, out var dict) || dict == null)
+            return false;
+        // 灏濊瘯鑾峰彇 job 瀵瑰簲鐨勫�硷紝濡傛灉娌℃湁鍒欒幏鍙� key 涓� 0 鐨勫��
+        return dict.TryGetValue(job, out defaultID) || dict.TryGetValue(0, out defaultID);
+    }
+
+    public bool TryGetNowShowID(PhantasmPavilionTab key, out int result)
+    {
+        result = 0;
+        int job = PlayerDatas.Instance.baseData.Job;
+        // 濡傛灉 nowIDDict 涓虹┖鎴栨病鏈夊綋鍓� ID锛岀洿鎺ュ皾璇曡幏鍙栭粯璁� ID
+        if (nowIDDict == null || !TryGetDefaultID(key, job, out int defaultID))
+            return false;
+
+        // 鑾峰彇褰撳墠 ID锛屽鏋滃瓨鍦ㄥ垯璧嬪�肩粰 result
+        if (nowIDDict.TryGetValue(key, out int nowID) && IsUnlock(key, nowID))
+        {
+            result = nowID;
+        }
+        else
+        {
+            result = defaultID;
+        }
+
+        return true;
+    }
+
+    public bool TryGetInfo(PhantasmPavilionTab tab, int id, out PhantasmPavilionInfo info)
+    {
+        info = new PhantasmPavilionInfo();
+        if (!Has(tab, id))
+            return false;
+        if (infoDict == null || !infoDict.TryGetValue(tab, out var tempInfoDict))
+        {
+            // 瀹氬埗鐨勯粯璁ゆ縺娲�0鏄�
+            if (IsCustom(id, out int customPlayerID))
+            {
+                if (customPlayerID == PlayerDatas.Instance.baseData.PlayerID)
+                {
+                    info = new PhantasmPavilionInfo()
+                    {
+                        ID = id,
+                        Star = 0,
+                        State = true 
+                    };
+                    return true;
+                }
+            }
+            return false;
+        }
+        if (tempInfoDict == null || !tempInfoDict.TryGetValue(id, out info))
+        {
+            // 瀹氬埗鐨勯粯璁ゆ縺娲�0鏄�
+            if (IsCustom(id, out int customPlayerID))
+            {
+                if (customPlayerID == PlayerDatas.Instance.baseData.PlayerID)
+                {
+                    info = new PhantasmPavilionInfo()
+                    {
+                        ID = id,
+                        Star = 0,
+                        State = true
+                    };
+                    return true;
+                }
+            }
+            return false;
+        }
+        return true;
+    }
+
+
+    public List<int> ShowItemList(PhantasmPavilionTab tab, out int fristIndex)
+    {
+        fristIndex = 0;
+        if (!handlers.TryGetValue(tab, out var handler))
+            return new List<int>();
+
+        var resList = handler.GetTableKeys();
+        resList.Sort((int a, int b) => Cmp(a, b, tab));
+
+        if (tab == PhantasmPavilionTab.Avatar)
+        {
+            for (int i = resList.Count - 1; i >= 0; i--)
+            {
+                int id = resList[i];
+                int[] JobShowList = PlayerFaceConfig.Get(id).JobShowList;
+                if (JobShowList != null && !JobShowList.Contains(PlayerDatas.Instance.baseData.Job) && resList.Contains(id))
+                {
+                    resList.Remove(id);
+                }
+            }
+        }
+
+        fristIndex = resList.First();
+        return resList;
+    }
+
+    public int Cmp(int a, int b, PhantasmPavilionTab tab)
+    {
+        // 鑾峰彇 a 鍜� b 鐨勮В閿佺姸鎬�
+        int stateA = GetUnLockState(tab, a);
+        int stateB = GetUnLockState(tab, b);
+
+        // 灏嗙姸鎬侀噸鏂板畾涔変负浼樺厛绾ф帓搴忔暟鍊硷細鍙縺娲� > 宸叉縺娲� > 鏈縺娲绘渶鍚�
+        int priorityA = stateA == 1 ? 0 : (stateA == 2 ? 1 : 2);
+        int priorityB = stateB == 1 ? 0 : (stateB == 2 ? 1 : 2);
+
+        if (priorityA != priorityB)
+        {
+            return priorityA.CompareTo(priorityB);
+        }
+
+        // 濡傛灉婵�娲荤姸鎬佺浉鍚岋紝姣旇緝 SortNum
+        int sortNumA = GetSortNum(tab, a);
+        int sortNumB = GetSortNum(tab, b);
+
+        if (sortNumA != sortNumB)
+        {
+            if (tab == PhantasmPavilionTab.Avatar)
+            {
+                return sortNumB.CompareTo(sortNumA);
+            }
+            else
+            {
+                return sortNumA.CompareTo(sortNumB);
+            }
+        }
+
+        return a.CompareTo(b);
+    }
+
+    ////鑾峰緱褰撳墠鐘舵�� 0 - 鏈縺娲� 1 - 鍙縺娲� 2 - 宸叉縺娲�
+    public int GetUnLockState(PhantasmPavilionTab tab, int id)
+    {
+        if (!Has(tab, id))
+            return 0;
+
+        if (IsCustom(id, out int customPlayerID))
+        {
+            if (customPlayerID == PlayerDatas.Instance.baseData.PlayerID)
+                return 2;
+            return 0;
+        }
+
+        //娌℃縺娲�
+        if (!IsUnlock(tab, id))
+        {
+            //娌℃湁濉縺娲荤墿鍝�
+            if (!TryGetUnLockNeedItem(tab, id, out int itemId, out int count))
+                return 0;
+            if (!ItemConfig.HasKey(itemId))
+                return 0;
+            ItemConfig itemConfig = ItemConfig.Get(itemId);
+            if (itemConfig.UseLV > PlayerDatas.Instance.baseData.LV)
+                return 0;
+            //婵�娲荤墿鍝佹暟閲忎笉瓒�
+            int hasCnt = PackManager.Instance.GetItemCountByID(PackType.Item, itemId);
+            if (hasCnt < count)
+                return 0;
+            return 1;
+        }
+        return 2;
+    }
+
+    //鑾峰緱灞炴�у睍绀烘牱寮忕被鍨�  0 鍔犲彿 1 绠ご false涓嶅睍绀�
+    public bool TryGetAttrShowType(PhantasmPavilionTab tab, int faceId, out int type)
+    {
+        type = 0;
+        //int unLockState = GetUnLockState(tab, faceId);// 0 - 鏈縺娲� 1 - 鍙縺娲� 2 - 宸叉縺娲�
+        // bool isHaveUnLockAttr = TryGetUnLockAttr(tab, selectItemId, out int[] lightAttrTypeArr, out int[] lightAttrValueArr);
+
+        // if (!isHaveUnLockAttr)
+        //     return false;
+
+        return false;
+    }
+
+    
+    #region 琛ㄦ儏鍖呮帴鍏ョ浉鍏�
+
+    public List<int> GetUnlockIDList()
+    {
+        List<int> allList = EmojiPackConfig.GetKeys();
+        List<int> result = new List<int>();
+        for (int i = 0; i < allList.Count; i++)
+        {
+            int id = allList[i];
+            if (IsUnlock(PhantasmPavilionTab.ChatExpression, id))
+            {
+                result.Add(id);
+            }
+        }
+        return result;
+    }
+
+    public List<string> GetEmojiList(int id)
+    {
+        var info = FaceConfig.GetEmojiPackList();
+        if (info == null || !info.TryGetValue(id, out var list) || list == null)
+            return new List<string>();
+        return list;
+    }
+
+    public int GetShowEmojiInfo(float itemWidth, int id, out int rowCount, out int emojiCount, out int space)
+    {
+        emojiCount = 0;
+        rowCount = 0;
+        space = 0; // 榛樿鍊�
+
+        int minSpace = 5; // 鏈�灏忛棿闅�
+        int maxSpace = 50; // 鏈�澶ч棿闅�
+        int width = Mathf.CeilToInt(itemWidth);
+
+        GetEmojiShowSize(id, out int emojiWidth, out int emojiHeight);
+        List<string> emojiList = GetEmojiList(id);
+        if (emojiList == null || emojiList.Count == 0 || emojiWidth == 0)
+            return 0;
+
+        int listCount = emojiList.Count;
+        emojiCount = Mathf.Min(MaxEmojiCount, Mathf.Min(width / emojiWidth, listCount));
+
+        if (emojiCount > 1)
+        {
+            int availableWidthForSpaces = width - (emojiCount * emojiWidth);
+            space = availableWidthForSpaces / (emojiCount - 1);
+            space = Mathf.Clamp(space, minSpace, maxSpace);
+        }
+        else
+        {
+            space = 0; // 娌℃湁绌洪棿鍙垎閰嶉棿闅旀垨鑰呴棿闅斾箣闂村彧鏈変竴涓〃鎯�
+        }
+
+        rowCount = Mathf.CeilToInt((float)listCount / emojiCount);
+        return 0;
+    }
+
+    // 鑾峰緱琛ㄦ儏鍖呬腑琛ㄦ儏鏈�澶х殑灏哄
+    public void GetEmojiShowSize(int id, out int width, out int height)
+    {
+        width = 0;
+        height = 0;
+
+        List<string> emojiList = GetEmojiList(id);
+        if (emojiList.IsNullOrEmpty())
+            return;
+
+        for (int i = 0; i < emojiList.Count; i++)
+        {
+            string imgSrc = emojiList[i];
+
+            if (UIFrameMgr.Inst.ContainsDynamicImage(imgSrc))
+            {
+                List<UnityEngine.Sprite> spriteList = UIFrameMgr.Inst.GetDynamicImage(imgSrc);
+                if (!spriteList.IsNullOrEmpty())
+                {
+                    for (int j = 0; j < spriteList.Count; j++)
+                    {
+                        UpdateMaxSize(spriteList[j], ref width, ref height);
+                    }
+                }
+            }
+            else if (IconConfig.HasKey(imgSrc))
+            {
+                UnityEngine.Sprite sprite = UILoader.LoadSprite(imgSrc);
+                UpdateMaxSize(sprite, ref width, ref height);
+            }
+        }
+    }
+
+    // 鏇存柊鏈�澶у昂瀵哥殑鏂规硶
+    private void UpdateMaxSize(UnityEngine.Sprite sprite, ref int width, ref int height)
+    {
+        float nowWidth = sprite.rect.width;
+        float nowHeight = sprite.rect.height;
+        if (width < nowWidth)
+            width = Mathf.CeilToInt(nowWidth);
+        if (height < nowHeight)
+            height = Mathf.CeilToInt(nowHeight);
+    }
+
+    #endregion
+
+    //鑾峰緱鑷繁鐨勮亰澶╂皵娉D
+    public int GetNowChatBubbleID()
+    {
+        PhantasmPavilionTab key = PhantasmPavilionTab.ChatBubble;
+        int job = 0;
+        // 灏濊瘯鑾峰彇褰撳墠 ID
+        if (nowIDDict.TryGetValue(key, out int nowID) && ChatBubbleBoxConfig.HasKey(nowID) && IsUnlock(key, nowID))
+            return nowID;
+        // 濡傛灉褰撳墠 ID 涓嶅瓨鍦ㄦ垨鏈В閿侊紝灏濊瘯鑾峰彇榛樿 ID
+        return TryGetDefaultID(key, job, out int defaultID) ? defaultID : -1;
+    }
+
+    //鑾峰緱鍏朵粬鐜╁鐨勮亰澶╂皵娉D
+    public int GetNowOtherChatBubbleID(int nowID)
+    {
+        PhantasmPavilionTab key = PhantasmPavilionTab.AvatarFrame;
+        // 灏濊瘯鑾峰彇褰撳墠 ID
+        if (ChatBubbleBoxConfig.HasKey(nowID))
+            return nowID;
+        // 濡傛灉褰撳墠 ID 涓嶅瓨鍦ㄦ垨鏈В閿侊紝灏濊瘯鑾峰彇榛樿 ID
+        return TryGetDefaultID(key, 0, out int defaultID) ? defaultID : -1;
+    }
+
+    public bool IsUnlock(PhantasmPavilionTab tab, int id)
+    {
+        if (!Has(tab, id))
+            return false;
+        int unlockDefault = GetUnlockDefault(tab, id);
+        //閰嶉粯璁ゆ縺娲荤殑 涓嶅仛鍏朵粬鍒ゅ畾鐩存帴婵�娲�
+        if (unlockDefault == 1)
+            return true;
+        // 灏佸寘涓病鏈�
+        if (!TryGetInfo(tab, id, out var info))
+            return false;
+        // 鐘舵�佹槸鏈縺娲�
+        if (!info.State)
+            return false;
+        // 鏃舵晥涓嶄负姘镐箙 涓旀椂鏁堢敤瀹�
+        if (info.EndTime > 0 && info.EndTime < TimeUtility.AllSeconds)
+            return false;
+        return true;
+    }
+
+    //鏄惁鏈夋椂鏁� true 鏈夋椂闂撮檺鍒� false 姘镐箙锛堟棤鏃堕棿闄愬埗锛�
+    public bool IsLimitTime(PhantasmPavilionTab tab, int id)
+    {
+        if (!Has(tab, id))
+            return false;
+        int unlockDefault = GetUnlockDefault(tab, id);
+        int expireMinutes = GetExpireMinutes(tab, id);
+        //娌℃壘鍒�
+        if (unlockDefault == -1 || expireMinutes == -1)
+            return false;
+        //榛樿婵�娲荤殑閮芥槸姘镐箙鐨�,娌℃湁鏃舵晥闄愬埗
+        if (unlockDefault == 1)
+            return false;
+        //鏃舵晥鍒嗛挓閰�0鐨勯兘鏄案涔呯殑,娌℃湁鏃舵晥闄愬埗
+        if (expireMinutes <= 0)
+            return false;
+        return true;
+    }
+
+    
+
+    public void ShowImage(PhantasmPavilionTab tab, int id, ImageEx imgTitle)
+    {
+        if (!Has(tab, id))
+            return;
+        string image = GetImage(tab, id);
+        UIFrame frame = imgTitle.GetComponent<UIFrame>();
+        if (UIFrameMgr.Inst.ContainsDynamicImage(image))
+        {
+            if (frame == null)
+                frame = imgTitle.gameObject.AddComponent<UIFrame>();
+
+            List<UnityEngine.Sprite> spriteList = UIFrameMgr.Inst.GetDynamicImage(image);
+            if (!spriteList.IsNullOrEmpty())
+            {
+                imgTitle.rectTransform.sizeDelta = new Vector2(spriteList[0].rect.width, spriteList[0].rect.height);
+            }
+
+            imgTitle.raycastTarget = false;
+            frame.ResetFrame(image);
+            frame.enabled = true;
+        }
+        else
+        {
+            if (frame != null)
+                frame.enabled = false;
+            imgTitle.SetSprite(image);
+            imgTitle.SetNativeSize();
+        }
+    }
+
+
+
+    #region handler鐩稿叧
+
+    public bool Has(PhantasmPavilionTab tab, int id)
+    {
+        if (!handlers.TryGetValue(tab, out var handler))
+            return false;
+        return handler.Has(id);
+    }
+    public string GetDescriptive(PhantasmPavilionTab tab, int id)
+    {
+        if (!Has(tab, id))
+            return string.Empty;
+        if (!handlers.TryGetValue(tab, out var handler))
+            return string.Empty;
+        return handler.GetDescriptive(id);
+    }
+
+    public int GetSortNum(PhantasmPavilionTab tab, int id)
+    {
+        if (!Has(tab, id))
+            return 0;
+        if (!handlers.TryGetValue(tab, out var handler))
+            return 0;
+        return handler.GetSortNum(id);
+    }
+
+    public string GetName(PhantasmPavilionTab tab, int id)
+    {
+        if (!Has(tab, id))
+            return string.Empty;
+        if (!handlers.TryGetValue(tab, out var handler))
+            return string.Empty;
+        return handler.GetName(id);
+    }
+
+    public string GetImage(PhantasmPavilionTab tab, int id)
+    {
+        if (!Has(tab, id))
+            return string.Empty;
+        if (!handlers.TryGetValue(tab, out var handler))
+            return string.Empty;
+        return handler.GetImage(id);
+    }
+
+    public int GetUnlockDefault(PhantasmPavilionTab tab, int id)
+    {
+        if (!Has(tab, id))
+            return 0;
+        if (!handlers.TryGetValue(tab, out var handler))
+            return 0;
+        return handler.GetUnlockDefault(id);
+    }
+
+    public int GetExpireMinutes(PhantasmPavilionTab tab, int id)
+    {
+        if (!Has(tab, id))
+            return 0;
+        if (!handlers.TryGetValue(tab, out var handler))
+            return 0;
+        return handler.GetExpireMinutes(id);
+    }
+
+    public bool IsUsing(PhantasmPavilionTab tab, int id)
+    {
+        if (!Has(tab, id))
+            return false;
+        if (!TryGetNowShowID(tab, out int result))
+            return false;
+        return result == id;
+    }
+
+    public bool TryGetUnLockAttr(PhantasmPavilionTab tab, int id, out int[] lightAttrTypeArr, out int[] lightAttrValueArr)
+    {
+        lightAttrTypeArr = null;
+        lightAttrValueArr = null;
+        if (!Has(tab, id))
+            return false;
+        if (!handlers.TryGetValue(tab, out var handler))
+            return false;
+        return handler.TryGetUnLockAttr(id, out lightAttrTypeArr, out lightAttrValueArr);
+    }
+
+    public bool TryGetUnLockNeedItem(PhantasmPavilionTab tab, int id, out int itemId, out int count)
+    {
+        itemId = 0;
+        count = 0;
+        if (!Has(tab, id))
+            return false;
+        if (!handlers.TryGetValue(tab, out var handler))
+            return false;
+        return handler.TryGetUnLockNeedItem(id, out itemId, out count);
+    }
+
+
+
+    public bool TryGetEffectID(PhantasmPavilionTab tab, int id, out int effectID)
+    {
+        effectID = 0;
+        if (!Has(tab, id))
+            return false;
+        if (!handlers.TryGetValue(tab, out var handler))
+            return false;
+        return handler.TryGetEffectID(id, out effectID);
+    }
+
+
+
+
+    public void SendUsePack(PhantasmPavilionTab tab, int id)
+    {
+        if (!Has(tab, id))
+            return;
+        if (!handlers.TryGetValue(tab, out var handler))
+            return;
+        handler.SendUsePack(id);
+    }
+
+    #endregion
+
+    #region 鍙戝皝鍖�
+
+    public void SendCA323UnLockPack(int itemIndex, int count)
+    {
+        var pack = new CA323_tagCMUseItems();
+        pack.ItemIndex = (byte)itemIndex;
+        pack.UseCnt = (ushort)count;
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
+    public void SendCB226FaceChange(int faceId)
+    {
+        var pack = new CB226_tagCMFaceChange();
+        pack.FaceID = (uint)faceId;
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
+
+
+    public void SendCB228FacePicChange(int facePicId)
+    {
+        var pack = new CB228_tagCMFacePicChange();
+        pack.FacePicID = (uint)facePicId;
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
+
+
+    public void SendCA230SetChatBubbleBox(int id)
+    {
+        CA230_tagCMSetChatBubbleBox pak = new CA230_tagCMSetChatBubbleBox();
+        pak.BubbleBoxType = (byte)id;
+        GameNetSystem.Instance.SendInfo(pak);
+    }
+
+
+    #endregion
+
+    #region 鏀跺皝鍖�
+
+    public void UpdateFaceInfo(HB117_tagMCFaceInfo vNetData)
+    {
+        if (!infoDict.ContainsKey(PhantasmPavilionTab.Avatar))
+            infoDict[PhantasmPavilionTab.Avatar] = new Dictionary<int, PhantasmPavilionInfo>();
+        for (int i = 0; i < vNetData.FaceList.Length; i++)
+        {
+            HB117_tagMCFaceInfo.tagMCFace tagMCFaces = vNetData.FaceList[i];
+            if (!infoDict[PhantasmPavilionTab.Avatar].ContainsKey((int)tagMCFaces.FaceID))
+                infoDict[PhantasmPavilionTab.Avatar][(int)tagMCFaces.FaceID] = new PhantasmPavilionInfo();
+            infoDict[PhantasmPavilionTab.Avatar][(int)tagMCFaces.FaceID].ID = (int)tagMCFaces.FaceID;
+            infoDict[PhantasmPavilionTab.Avatar][(int)tagMCFaces.FaceID].State = tagMCFaces.State == 1;
+            infoDict[PhantasmPavilionTab.Avatar][(int)tagMCFaces.FaceID].EndTime = tagMCFaces.EndTime;
+        }
+        UpdateRedPoint();
+        UpdateFaceInfoEvent?.Invoke();
+    }
+
+    public void UpdateFacePicInfo(HB118_tagMCFacePicInfo vNetData)
+    {
+        if (!infoDict.ContainsKey(PhantasmPavilionTab.AvatarFrame))
+            infoDict[PhantasmPavilionTab.AvatarFrame] = new Dictionary<int, PhantasmPavilionInfo>();
+
+        for (int i = 0; i < vNetData.FacePicList.Length; i++)
+        {
+            HB118_tagMCFacePicInfo.tagMCFacePic tagMCFacePics = vNetData.FacePicList[i];
+            if (!infoDict[PhantasmPavilionTab.AvatarFrame].ContainsKey((int)tagMCFacePics.FacePicID))
+                infoDict[PhantasmPavilionTab.AvatarFrame][(int)tagMCFacePics.FacePicID] = new PhantasmPavilionInfo();
+            infoDict[PhantasmPavilionTab.AvatarFrame][(int)tagMCFacePics.FacePicID].ID = (int)tagMCFacePics.FacePicID;
+            infoDict[PhantasmPavilionTab.AvatarFrame][(int)tagMCFacePics.FacePicID].State = tagMCFacePics.State == 1;
+            infoDict[PhantasmPavilionTab.AvatarFrame][(int)tagMCFacePics.FacePicID].EndTime = tagMCFacePics.EndTime;
+        }
+        UpdateRedPoint();
+        UpdateFacePicInfoEvent?.Invoke();
+    }
+
+    public void UpdateEmojiPackInfo(HA721_tagMCEmojiPackInfo vNetData)
+    {
+        if (!infoDict.ContainsKey(PhantasmPavilionTab.ChatExpression))
+            infoDict[PhantasmPavilionTab.ChatExpression] = new Dictionary<int, PhantasmPavilionInfo>();
+
+        for (int i = 0; i < vNetData.EmojiPackList.Length; i++)
+        {
+            HA721_tagMCEmojiPackInfo.tagMCEmojiPack emojiPack = vNetData.EmojiPackList[i];
+            if (!infoDict[PhantasmPavilionTab.ChatExpression].ContainsKey((int)emojiPack.PackID))
+                infoDict[PhantasmPavilionTab.ChatExpression][(int)emojiPack.PackID] = new PhantasmPavilionInfo();
+            infoDict[PhantasmPavilionTab.ChatExpression][(int)emojiPack.PackID].ID = (int)emojiPack.PackID;
+            infoDict[PhantasmPavilionTab.ChatExpression][(int)emojiPack.PackID].State = emojiPack.State == 1;
+            infoDict[PhantasmPavilionTab.ChatExpression][(int)emojiPack.PackID].EndTime = emojiPack.EndTime;
+        }
+        UpdateRedPoint();
+        UpdateEmojiPackInfoEvent?.Invoke();
+    }
+
+    public void UpdateChatBubbleBoxInfo(HA717_tagMCChatBubbleBoxState vNetData)
+    {
+        if (!infoDict.ContainsKey(PhantasmPavilionTab.ChatBubble))
+            infoDict[PhantasmPavilionTab.ChatBubble] = new Dictionary<int, PhantasmPavilionInfo>();
+
+        for (int i = 0; i < vNetData.BoxList.Length; i++)
+        {
+            HA717_tagMCChatBubbleBoxState.tagMCChatBubbleBox chatBubbleBox = vNetData.BoxList[i];
+            if (!infoDict[PhantasmPavilionTab.ChatBubble].ContainsKey((int)chatBubbleBox.BoxID))
+                infoDict[PhantasmPavilionTab.ChatBubble][(int)chatBubbleBox.BoxID] = new PhantasmPavilionInfo();
+            infoDict[PhantasmPavilionTab.ChatBubble][(int)chatBubbleBox.BoxID].ID = (int)chatBubbleBox.BoxID;
+            infoDict[PhantasmPavilionTab.ChatBubble][(int)chatBubbleBox.BoxID].State = chatBubbleBox.State == 1;
+            infoDict[PhantasmPavilionTab.ChatBubble][(int)chatBubbleBox.BoxID].EndTime = chatBubbleBox.EndTime;
+        }
+        UpdateRedPoint();
+        UpdateChatBubbleBoxInfoEvent?.Invoke();
+    }
+
+    #endregion
+}
+
+public class PhantasmPavilionInfo
+{
+    public int ID;                  //ID
+    public bool State;              //鏄惁宸叉縺娲�
+    public uint EndTime;            //鍒版湡鏃堕棿鎴筹紝0涓烘案涔�
+    public int Star;               //鏄熺骇
+}
\ No newline at end of file
diff --git a/Main/System/PhantasmPavilion/PhantasmPavilionModel.cs.meta b/Main/System/PhantasmPavilion/PhantasmPavilionModel.cs.meta
new file mode 100644
index 0000000..92b5bf0
--- /dev/null
+++ b/Main/System/PhantasmPavilion/PhantasmPavilionModel.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 336548bbdf51c6844a76be570ae7becc
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/PhantasmPavilion/PhantasmPavilionTabCell.cs b/Main/System/PhantasmPavilion/PhantasmPavilionTabCell.cs
new file mode 100644
index 0000000..1038192
--- /dev/null
+++ b/Main/System/PhantasmPavilion/PhantasmPavilionTabCell.cs
@@ -0,0 +1,30 @@
+锘縰sing System;
+using UnityEngine;
+
+public class PhantasmPavilionTabCell : CellView
+{
+    [SerializeField] ButtonEx btnTab;
+    [SerializeField] TextEx txtTab;
+    [SerializeField] ImageEx imgChoose;
+    [SerializeField] RedpointBehaviour redpointBehaviour;
+    int iIndex;
+
+    public void Display(int index)
+    {
+        this.iIndex = index;
+        redpointBehaviour.redpointId = MainRedDot.PhantasmPavilionRepoint * 10 + index + 1;
+        txtTab.text = Language.Get(StringUtility.Contact("PhantasmPavilionTab", index));
+        imgChoose.SetActive(index == (int)PhantasmPavilionModel.Instance.selectTab);
+        btnTab.SetListener(OnTabClick);
+    }
+
+    private void OnTabClick()
+    {
+        if (!Enum.IsDefined(typeof(PhantasmPavilionTab), iIndex))
+            return;
+        PhantasmPavilionTab tab = (PhantasmPavilionTab)iIndex;
+        if (tab == PhantasmPavilionModel.Instance.selectTab)
+            return;
+        PhantasmPavilionModel.Instance.selectTab = tab;
+    }
+}
\ No newline at end of file
diff --git a/Main/System/PhantasmPavilion/PhantasmPavilionTabCell.cs.meta b/Main/System/PhantasmPavilion/PhantasmPavilionTabCell.cs.meta
new file mode 100644
index 0000000..9526b6b
--- /dev/null
+++ b/Main/System/PhantasmPavilion/PhantasmPavilionTabCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 399fb03614c78844794580ff4c8cb06f
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Recharge/DailySpecialsModel.cs b/Main/System/Recharge/DailySpecialsModel.cs
new file mode 100644
index 0000000..31dc062
--- /dev/null
+++ b/Main/System/Recharge/DailySpecialsModel.cs
@@ -0,0 +1,183 @@
+锘縰sing System.Collections.Generic;
+using UnityEngine.UI;
+using System.Linq;
+using LitJson;
+using System;
+using System.Reflection;
+
+
+public class DailySpecialsModel  : GameSystemManager<DailySpecialsModel>
+{
+    public uint PackBuyTime;    // 鎵撳寘璐拱鐨勬椂闂存埑锛屽鏋滄湁璇ュ�硷紝浠h〃宸茬粡涓�娆℃�ф墦鍖呰喘涔颁簡锛屽彲鏍规嵁娆℃椂闂存埑绠楀嚭褰撳墠鏄鍑犲ぉ
+    public uint BuyStateToday;    // 浠婃棩绀煎寘璐拱鐘舵�侊紝鎸夌ぜ鍖呯储寮曚簩杩涘埗浣嶈绠椾唬琛ㄦ槸鍚﹀凡璐拱锛屼粎闈炴墦鍖呰喘涔扮姸鎬佷笅鏈夌敤
+    public uint AwardState;    // 浠婃棩绀煎寘棰嗗鐘舵�侊紝鎸夌ぜ鍖呯储寮曚簩杩涘埗浣嶈绠椾唬琛ㄦ槸鍚﹀凡棰嗗彇
+    public int maxDay; //鎬诲叡鍙互棰嗗彇鍑犲ぉ
+    public int giftLvRestrict; //绀煎寘绛夌骇闄愬埗
+
+    public Dictionary<int, List<List<int>>> giftInfoDict = new Dictionary<int, List<List<int>>>();
+    public Dictionary<int, List<int>> ctgIdDict = new Dictionary<int, List<int>>();
+    public List<int> packRechargeIdList = new List<int>();
+    public List<List<Item>> itemAllList = new List<List<Item>>();
+    Redpoint redpoint = new Redpoint(MainRedDot.DailySpecialsRedpoint);
+    Dictionary<int, Redpoint> childRedpointDict = new Dictionary<int, Redpoint>();
+    public event Action UpdateGiftStateEvent;
+
+    public override void Init()
+    {
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnbeforePlayerDataInitialize;
+        FuncOpen.Instance.OnFuncStateChangeEvent += OnFunctionStateChange;
+        var tempDict = JsonMapper.ToObject(FuncConfigConfig.Get("DailyPackBuyGift").Numerical1);
+        var keyList = tempDict.Keys.ToList();
+        for (int i = 0; i < keyList.Count; i++)
+        {
+            List<List<int>> giftInfoList = new List<List<int>>();
+            for (int j = 0; j < tempDict[i].Count; j++)
+            {
+                List<int> giftInfo = JsonMapper.ToObject<List<int>>(tempDict[keyList[i]][j].ToJson());
+                giftInfoList.Add(giftInfo);
+            }
+            giftInfoDict.Add(int.Parse(keyList[i]), giftInfoList);
+        }
+
+        tempDict = JsonMapper.ToObject(FuncConfigConfig.Get("DailyPackBuyGift").Numerical2);
+        keyList = tempDict.Keys.ToList();
+        for (int i = 0; i < keyList.Count; i++)
+        {
+            ctgIdDict[int.Parse(keyList[i])] = JsonMapper.ToObject<List<int>>(tempDict[keyList[i]].ToJson());
+        }
+
+        packRechargeIdList = JsonMapper.ToObject<List<int>>(FuncConfigConfig.Get("DailyPackBuyGift").Numerical3);
+        maxDay = int.Parse(FuncConfigConfig.Get("DailyPackBuyGift").Numerical4);
+
+        List<int> giftInfokeyList = giftInfoDict.Keys.ToList();
+        for (int i = 0; i < giftInfoDict.Count; i++)
+        {
+            List<Item> itemList = new List<Item>();
+            for (int j = 0; j < giftInfoDict[giftInfokeyList[i]].Count; j++)
+            {
+                Item item = new Item(giftInfoDict[giftInfokeyList[i]][j][0], giftInfoDict[giftInfokeyList[i]][j][1]);
+                itemList.Add(item);
+            }
+            itemAllList.Add(itemList);
+        }
+        List<int> keyList2 = giftInfoDict.Keys.ToList();
+        for (int i = 0; i < giftInfoDict.Count; i++)
+        {
+            childRedpointDict[keyList2[i]] = new Redpoint(MainRedDot.DailySpecialsRedpoint, MainRedDot.DailySpecialsRedpoint * 100 + i);
+        }
+
+    }
+
+    public override void Release()
+    {
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnbeforePlayerDataInitialize;
+        FuncOpen.Instance.OnFuncStateChangeEvent -= OnFunctionStateChange;
+    }
+
+    public void OnbeforePlayerDataInitialize()
+    {
+        PackBuyTime = 0;
+        BuyStateToday = 0;
+        AwardState = 0;
+    }
+
+
+    private void OnFunctionStateChange(int id)
+    {
+        if (id == 222)
+        {
+            UpdateRedpoint();
+        }
+    }
+
+
+    public void UpdateGiftState(HAA03_tagMCDailyPackBuyGiftInfo vNetData)
+    {
+        this.PackBuyTime = vNetData.PackBuyTime;
+        this.BuyStateToday = vNetData.BuyStateToday;
+        this.AwardState = vNetData.AwardState;
+        UpdateGiftStateEvent?.Invoke();
+        UpdateRedpoint();
+
+    }
+
+    // 鍦ㄥ姛鑳藉紑鍚殑鏃跺�欏垽鏂槸鍚︽瘡鏃ョ壒鎯犲紑鍚�, 瑙﹀彂UpdateRedpoint
+
+    //姣忔棩鐗规儬
+    //1. 鍔熻兘鏄惁寮�鍚�
+    //2. 鍏嶈垂鏄惁宸查鍙�
+    //3. 璐拱鍚庢槸鍚﹀彲棰嗗彇
+    void UpdateRedpoint()
+    {
+        redpoint.state = RedPointState.None;
+        if (!FuncOpen.Instance.IsFuncOpen(222))
+            return;
+
+        List<int> keyList = childRedpointDict.Keys.ToList();
+
+        for (int i = 0; i < childRedpointDict.Count; i++)
+        {
+            childRedpointDict[keyList[i]].state = RedPointState.None;
+            if (GetGiftState(i) == 2)
+            {
+                childRedpointDict[keyList[i]].state = RedPointState.Simple;
+            }
+        }
+    }
+
+    //鑾峰緱鎸夐挳鐘舵��
+    //0 鏈喘涔� 1 宸茶喘涔� 2 鍙鍙� 3 宸查鍙�
+    public int GetGiftState(int index)
+    {
+        if (index == 0)
+        {
+            return IsHavePack(index) ? 3 : 2;
+        }
+        else
+        {
+            if (IsBuyAllPack())
+            {
+                return IsHavePack(index) ? 3 : 2;
+            }
+            else
+            {
+                if (IsBuyPack(index))
+                {
+                    return IsHavePack(index) ? 3 : 2;
+                }
+                else
+                {
+                    return 0;
+                }
+            }
+        }
+    }
+
+    //鏄惁璐拱鎬诲寘
+    public bool IsBuyAllPack()
+    {
+
+        if (PackBuyTime == 0)
+        {
+            return false;
+        }
+        else
+        {
+            return (TimeUtility.ServerNow - TimeUtility.GetTime(PackBuyTime)).Days < maxDay;
+        }
+    }
+
+    //鏄惁璐拱鍒嗗寘
+    public bool IsBuyPack(int index)
+    {
+        return ((int)Math.Pow(2, index) & BuyStateToday) != 0;
+    }
+
+    //鍒嗗寘鏄惁宸查鍙�
+    public bool IsHavePack(int index)
+    {
+        return ((int)Math.Pow(2, index) & AwardState) != 0;
+    }
+
+}
+
diff --git a/Main/System/Recharge/DailySpecialsModel.cs.meta b/Main/System/Recharge/DailySpecialsModel.cs.meta
new file mode 100644
index 0000000..f176e9f
--- /dev/null
+++ b/Main/System/Recharge/DailySpecialsModel.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 2e39e10a6edb4a84daee6a829b6bc647
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Store.meta b/Main/System/Store.meta
new file mode 100644
index 0000000..040ccea
--- /dev/null
+++ b/Main/System/Store.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 4fc5215db0b4d9e40bf585115834dfa0
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Store/BuyItemController.cs b/Main/System/Store/BuyItemController.cs
new file mode 100644
index 0000000..909a317
--- /dev/null
+++ b/Main/System/Store/BuyItemController.cs
@@ -0,0 +1,214 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using UnityEngine;
+
+
+public class BuyItemController : Singleton<BuyItemController>
+{
+
+    Dictionary<int, int> vipBuyCntDict = new Dictionary<int, int>();
+
+    public bool CheckIsVipBuy(StoreConfig model, out int curVipIndex, out int nextVipIndex)
+    {
+        vipBuyCntDict.Clear();
+        curVipIndex = -1;
+        nextVipIndex = -1;
+        bool isVipBuy = false;
+        if (model == null) return isVipBuy;
+
+        if (model.VIPLV.Length < 2)
+        {
+            if (model.VIPLV[0] != 0)
+            {
+                isVipBuy = true;
+            }
+            else
+            {
+                isVipBuy = false;
+            }
+        }
+        else
+        {
+            isVipBuy = true;
+        }
+
+        if (isVipBuy)
+        {
+            for (int i = model.VIPLV.Length - 1; i > -1; i--)
+            {
+                vipBuyCntDict.Add(model.VIPLV[i], model.GoumaiNumber[i]);
+            }
+            int playerVip = PlayerDatas.Instance.baseData.VIPLv;
+            for (int i = model.VIPLV.Length - 1; i > -1; i--)
+            {
+                if (model.VIPLV[i] > playerVip)
+                {
+                    nextVipIndex = i;
+                }
+                else if (model.VIPLV[i] <= playerVip)
+                {
+                    curVipIndex = i;
+                    break;
+                }
+            }
+
+        }
+
+        return isVipBuy;
+    }
+
+    public bool CheckIsLimitBuyCnt(StoreConfig model, out int canBuyCnt, out int addBuyCnt)
+    {
+        canBuyCnt = 0;
+        addBuyCnt = 0;
+        if (model == null) return false;
+
+        int[] canBuyNums = model.GoumaiNumber;
+        int curVipIndex = -1;
+        int nexVipIndex = -1;
+        bool isVipBuy = CheckIsVipBuy(model, out curVipIndex, out nexVipIndex);
+        if (isVipBuy)
+        {
+            if (curVipIndex != -1)
+            {
+                canBuyCnt = canBuyNums[curVipIndex];
+            }
+
+            if (nexVipIndex != -1)
+            {
+                addBuyCnt = canBuyNums[nexVipIndex] - canBuyCnt;
+            }
+            return true;
+        }
+        else
+        {
+            if (canBuyNums[0] != 0)
+            {
+                canBuyCnt = canBuyNums[0];
+                return true;
+            }
+            else
+            {
+                return false;
+            }
+        }
+    }
+
+    public int goodId { get; private set; }
+    public readonly LogicInt wannaBuyCount = new LogicInt();
+
+
+    public void SetGood(int goodId)
+    {
+        this.goodId = goodId;
+        wannaBuyCount.value = 1;
+    }
+
+    public void SetBuyCount(int goodId, int count)
+    {
+        var countLimit = GetBuyCountLimit(goodId, PlayerDatas.Instance.baseData.VIPLv);
+        if (countLimit == -1)
+        {
+            wannaBuyCount.value = Mathf.Clamp(count, 1, 999);
+        }
+        else
+        {
+            wannaBuyCount.value = Mathf.Clamp(count, 1, countLimit);
+        }
+    }
+
+    public bool IsVipLimitGood(int goodId)
+    {
+        var config = StoreConfig.Get(goodId);
+        return config != null && config.VIPLV.Length > 1 && config.VIPLV[0] > 0;
+    }
+
+    /// <summary>
+    /// 杩斿洖鍊间负-1锛岃〃绀烘病鏈塿ip闄愬埗锛岃繑鍥炲�间负999琛ㄧず宸茬粡娌℃湁涓嬩竴涓獀ip闄愬埗
+    /// </summary>
+    /// <param name="goodId"></param>
+    /// <param name="vipLevel"></param>
+    /// <returns></returns>
+    public int GetNextCanbuyVipLevel(int goodId, int vipLevel)
+    {
+        if (!IsVipLimitGood(goodId))
+        {
+            return -1;
+        }
+
+        var config = StoreConfig.Get(goodId);
+        var nextLevel = 999;
+        for (int i = 0; i < config.VIPLV.Length; i++)
+        {
+            if (config.VIPLV[i] > vipLevel)
+            {
+                nextLevel = config.VIPLV[i];
+                break;
+            }
+        }
+
+        return nextLevel;
+    }
+
+    /// <summary>
+    /// 杩斿洖鍊煎鏋滄槸-1锛岃〃绀烘棤闄愬埗
+    /// </summary>
+    /// <param name="goodId"></param>
+    /// <returns></returns>
+    public int GetBuyCountLimit(int goodId, int vipLevel)
+    {
+        var config = StoreConfig.Get(goodId);
+        if (config.GoumaiNumber.Length == 0 || config.GoumaiNumber[0] == 0)
+        {
+            return -1;
+        }
+
+        var isVipLimitGood = config != null && config.VIPLV.Length > 1;
+        var canBuy = 0;
+        if (isVipLimitGood)
+        {
+            var index = -1;
+            for (var i = config.VIPLV.Length - 1; i >= 0; i--)
+            {
+                if (config.VIPLV[i] <= vipLevel)
+                {
+                    index = i;
+                    break;
+                }
+            }
+           
+            if (index != -1)
+            {
+                canBuy = config.GoumaiNumber[index];
+            }
+            else
+            {
+                canBuy = 0;
+            }
+        }
+        else
+        {
+            canBuy = config.GoumaiNumber[0];
+        }
+
+        var goodLimit = StoreModel.Instance.GetBuyShopLimit((uint)goodId);
+        var haveBuy = goodLimit != null ? goodLimit.BuyCnt : 0;
+        return canBuy - haveBuy;
+    }
+
+    public bool IsSellOut(int goodId, int vipLevel)
+    {
+        var limitCount = GetBuyCountLimit(goodId, vipLevel);
+        return limitCount != -1 && limitCount <= 0;
+    }
+
+    public int GetTotalPrice(int goodId, int count)
+    {
+        var config = StoreConfig.Get(goodId);
+        return config.MoneyNumber * count;
+    }
+
+
+}
diff --git a/Main/System/Store/BuyItemController.cs.meta b/Main/System/Store/BuyItemController.cs.meta
new file mode 100644
index 0000000..25724b9
--- /dev/null
+++ b/Main/System/Store/BuyItemController.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: dc23e302e8daefe418c0a4baeaedb9f1
+timeCreated: 1556020061
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Store/StoreModel.cs b/Main/System/Store/StoreModel.cs
new file mode 100644
index 0000000..17c4166
--- /dev/null
+++ b/Main/System/Store/StoreModel.cs
@@ -0,0 +1,1698 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+
+using UnityEngine;
+using LitJson;
+using System.Collections;
+
+public class BuyShopItemLimit
+{
+    public uint ItemIndex;
+    public int BuyCnt;        // 浠婃棩宸茶喘涔版鏁�
+    public int isReset;         //鏄惁灞炰簬姣忔湀閲嶇疆  0 涓嶉噸缃� 1閲嶇疆
+}
+
+public struct ShopItemInfo
+{
+    public int itemId;
+    public int count;
+
+    public ShopItemInfo(int id, int count)
+    {
+        this.itemId = id;
+        this.count = count;
+    }
+}
+
+public class StoreModel : GameSystemManager<StoreModel>
+{
+
+    public int[] normalBuyCoinsTypes { get; private set; }
+    public string UNIONSTORESAVE_KEY { get; private set; }
+    public string MUSTBUYSAVE_KEY { get; private set; }
+    public string StoreEffectRecord_Key { get; private set; }
+    public Dictionary<int, Dictionary<int, int>> JobReplaceIdDict = new Dictionary<int, Dictionary<int, int>>();
+    public Dictionary<int, string> resetTimeDict { get; private set; }
+    public Dictionary<int, int> showCoinsUIDict { get; private set; }
+    public int storeTrailerLv { get; private set; }
+
+
+    public int fairyStoreJumpShopId = 0;
+
+    int m_SelectClassifyId = 0;
+    public int selectSecondType
+    {
+        get { return m_SelectClassifyId; }
+        set
+        {
+            if (m_SelectClassifyId != value)
+            {
+                m_SelectClassifyId = value;
+                if (selectClassifyRefresh != null)
+                {
+                    selectClassifyRefresh();
+                }
+            }
+        }
+    }
+
+    public event Action selectClassifyRefresh;
+
+
+    private bool isUpdatePlayerLv;
+
+    //鎺掕姒滄椿鍔ㄧ殑鍟嗗簵
+    public int rankActStore_MoneyType;
+    public int rankActStore_StoreType;
+    public Operation rankActStore_ActType;
+
+    public override void Init()
+    {
+        ParseFuncConfig();
+        ParseStoreConfig();
+        SetShopRedpoint();
+        FuncConfigConfig buyItemHinit = FuncConfigConfig.Get("BuyItemHinit");
+        normalBuyCoinsTypes = ConfigParse.GetMultipleStr<int>(buyItemHinit.Numerical1);
+        FuncConfigConfig restTimeConfig = FuncConfigConfig.Get("RefreshText");
+        resetTimeDict = ConfigParse.GetDic<int, string>(restTimeConfig.Numerical1);
+        FuncConfigConfig mallCurrency = FuncConfigConfig.Get("MallCurrency");
+        showCoinsUIDict = ConfigParse.GetDic<int, int>(mallCurrency.Numerical1);
+        FuncConfigConfig mallPush = FuncConfigConfig.Get("MallPush");
+        storeTrailerLv = int.Parse(mallPush.Numerical1);
+
+    }
+
+    public void OnBeforePlayerDataInitialize()
+    {
+        isUpdatePlayerLv = false;
+        IsMustBuyDay = false;
+        sortStoreSecondType = true;
+        ClearJump();
+        FuncOpen.Instance.OnFuncStateChangeEvent -= FuncStateChange;
+        PlayerDatas.Instance.fairyData.OnRefreshFairyMine -= RefreshServerHour;
+        PlayerDatas.Instance.fairyData.OnRefreshFairyInfo -= RefreshFamilyLv;
+        PlayerDatas.Instance.playerDataRefreshEvent -= RefreshPlayerData;
+        TimeMgr.Instance.OnHourEvent -= RefreshServerHour;
+        GlobalTimeEvent.Instance.secondEvent -= UpdateSecond;
+        shopItemlimitDict.Clear();
+        storeFuncType = StoreFunc.DayStore;
+    }
+
+    public void OnAfterPlayerDataInitialize()
+    {
+        UNIONSTORESAVE_KEY = StringUtility.Contact(PlayerDatas.Instance.baseData.PlayerID, LocalSaveStoreType.UnionStore);
+        StoreEffectRecord_Key = StringUtility.Contact(PlayerDatas.Instance.baseData.PlayerID, "StoreEffectRecord");
+        MUSTBUYSAVE_KEY = StringUtility.Contact(PlayerDatas.Instance.baseData.PlayerID, "MustBuy");
+        buyItemCheckDict.Clear();
+    }
+
+    public void OnPlayerLoginOk()
+    {
+        PlayerDatas.Instance.fairyData.OnRefreshFairyInfo += RefreshFamilyLv;
+        PlayerDatas.Instance.fairyData.OnRefreshFairyMine += RefreshServerHour;
+        FuncOpen.Instance.OnFuncStateChangeEvent += FuncStateChange;
+        PlayerDatas.Instance.playerDataRefreshEvent += RefreshPlayerData;
+        TimeMgr.Instance.OnHourEvent += RefreshServerHour;
+        GlobalTimeEvent.Instance.secondEvent += UpdateSecond;
+
+        UpdateShowStore();
+        SetIsMustBuyDay();
+        ControllerRedPoint();
+        UpdateFreeShopRedpoint();
+        UpdateCanBuyRedpoint();
+        UpdateMustBuyRedpoint();
+        UpdateDailyRedpoinit();
+    }
+
+
+
+
+
+    #region 瑙f瀽鏈湴鏁版嵁
+    public Dictionary<int, List<int>> storeRedRuleDict { get; private set; } //绾㈢偣绫诲瀷 1,鍏嶈垂鍟嗗搧  2,蹇呬拱鍟嗗搧  3,鍧愰獞鐏靛疇 4,鍙喘涔扮墿鍝侊紙绉垎鍏戞崲锛�
+    private void ParseFuncConfig()
+    {
+        storeRedRuleDict = new Dictionary<int, List<int>>();
+        FuncConfigConfig storeRedRules = FuncConfigConfig.Get("StoreRedRules");
+        if (storeRedRules != null)
+        {
+            JsonData redRules = JsonMapper.ToObject(storeRedRules.Numerical1);
+            foreach (var type in redRules.Keys)
+            {
+                int redType = 0;
+                int.TryParse(type, out redType);
+                JsonData shops = redRules[type];
+                if (!storeRedRuleDict.ContainsKey(redType))
+                {
+                    List<int> shopIdlist = new List<int>();
+                    if (shops.IsArray)
+                    {
+                        for (int i = 0; i < shops.Count; i++)
+                        {
+                            int shopId = 0;
+                            int.TryParse(shops[i].ToString(), out shopId);
+                            shopIdlist.Add(shopId);
+                        }
+                    }
+                    storeRedRuleDict.Add(redType, shopIdlist);
+                }
+            }
+
+            
+        }
+    }
+
+    public Dictionary<int, List<StoreData>> storeTypeDict { get; private set; }
+    public Dictionary<int, List<StoreData>> theOnlyShopDict { get; private set; } //key 鐗╁搧id
+    public Dictionary<string, List<StoreData>> limitValueShopDict { get; private set; } //key 鍟嗗搧绫诲瀷鍜岄檺鍒舵潯浠�
+    private void ParseStoreConfig()
+    {
+        storeTypeDict = new Dictionary<int, List<StoreData>>();
+        theOnlyShopDict = new Dictionary<int, List<StoreData>>();
+        limitValueShopDict = new Dictionary<string, List<StoreData>>();
+        List<StoreConfig> storeConfigs = StoreConfig.GetValues();
+        for (int i = 0; i < storeConfigs.Count; i++)
+        {
+            var config = storeConfigs[i];
+            if (config.ShopType != 0)
+            {
+                StoreData storeData = new StoreData();
+                storeData.shopId = config.ID;
+                storeData.storeConfig = config;
+                storeData.jobReplaceDict = AnalysisJobReplace(config);
+                if (!storeTypeDict.ContainsKey(config.ShopType))
+                {
+                    List<StoreData> storeDatas = new List<StoreData>();
+                    storeDatas.Add(storeData);
+                    storeTypeDict.Add(config.ShopType, storeDatas);
+                }
+                else
+                {
+                    storeTypeDict[config.ShopType].Add(storeData);
+                }
+
+                if (config.TheOnlyShop == 1)
+                {
+                    if (!theOnlyShopDict.ContainsKey(config.ItemID))
+                    {
+                        List<StoreData> storeDatas = new List<StoreData>();
+                        storeDatas.Add(storeData);
+                        theOnlyShopDict.Add(config.ItemID, storeDatas);
+                    }
+                    else
+                    {
+                        theOnlyShopDict[config.ItemID].Add(storeData);
+                    }
+                }
+
+                string key = StringUtility.Contact(config.ShopType, config.LimitValue);
+                if (!limitValueShopDict.ContainsKey(key))
+                {
+                    List<StoreData> storeDatas = new List<StoreData>();
+                    storeDatas.Add(storeData);
+                    limitValueShopDict.Add(key, storeDatas);
+                }
+                else
+                {
+                    limitValueShopDict[key].Add(storeData);
+                }
+            }
+        }
+
+        foreach (var type in storeTypeDict.Keys)
+        {
+            var configs = storeTypeDict[type];
+            configs.Sort(CompareByShopSort);
+        }
+    }
+
+    private Dictionary<int, List<int>> AnalysisJobReplace(StoreConfig storeConfig)
+    {
+        if (storeConfig == null || string.IsNullOrEmpty(storeConfig.JobItem)) return null;
+
+        Dictionary<int, List<int>> replaceDict = new Dictionary<int, List<int>>();
+        JsonData jsonData = JsonMapper.ToObject(storeConfig.JobItem);
+        if (jsonData.IsArray)
+        {
+            for (int i = 0; i < jsonData.Count; i++)
+            {
+                List<int> idlist = new List<int>();
+                replaceDict.Add(i, idlist);
+                if (jsonData[i].IsArray)
+                {
+                    for (int j = 0; j < jsonData[i].Count; j++)
+                    {
+                        int itemId = int.Parse(jsonData[i][j].ToString());
+                        idlist.Add(itemId);
+                    }
+                }
+            }
+        }
+        return replaceDict;
+    }
+
+    public int CompareByShopSort(StoreData start, StoreData end)
+    {
+        int sort1 = start.storeConfig.ShopSort;
+        int sort2 = end.storeConfig.ShopSort;
+
+        return sort1.CompareTo(sort2);
+    }
+
+    public class StoreData
+    {
+        public int shopId;
+        public StoreConfig storeConfig;
+        public Dictionary<int, List<int>> jobReplaceDict;
+    }
+    #endregion
+
+    #region 鑾峰彇鏁版嵁
+
+    private Dictionary<int, List<StoreData>> showStoreTypeDict = new Dictionary<int, List<StoreData>>();
+
+    private Dictionary<int, Dictionary<int, List<StoreData>>> showStoreSecondTypeDict = new Dictionary<int, Dictionary<int, List<StoreData>>>();
+
+
+    // 鏂拌鍒欏垎浜岀骇鏍囩锛屾鍑芥暟淇濈暀锛屽彟澧炲姞UpdateShowStoreEx鍑芥暟
+    public void UpdateShowStore()
+    {
+        showStoreTypeDict.Clear();
+        int playeLv = PlayerDatas.Instance.baseData.LV;
+        //int vipLevel = PlayerDatas.Instance.baseData.VIPLv;
+        foreach (var type in storeTypeDict.Keys)
+        {
+            var storeDatas = storeTypeDict[type];
+            List<StoreData> showStoreDatas = new List<StoreData>();
+            if (!showStoreTypeDict.ContainsKey(type))
+            {
+                for (int i = 0; i < storeDatas.Count; i++)
+                {
+                    var storeData = storeDatas[i];
+                    bool isReachLv = playeLv >= storeData.storeConfig.LVSee ? true : false;
+
+                    bool isReach = isReachLv;
+                    if (isReach)
+                    {
+                        int remainNum = 0;
+                        bool isSellOut = TryGetIsSellOut(storeData.storeConfig, out remainNum);
+                        if (storeData.storeConfig.IsHideSellOut != 1)
+                        {
+                            showStoreDatas.Add(storeData);
+                        }
+                        else
+                        {
+                            if (storeData.storeConfig.TheOnlyShop == 1)
+                            {
+                                if (!CheckTheOnlyShopSellOut(storeData.shopId))
+                                {
+                                    showStoreDatas.Add(storeData);
+                                }
+                            }
+                            else
+                            {
+                                if (!isSellOut)
+                                {
+                                    showStoreDatas.Add(storeData);
+                                }
+                            }
+                        }
+                    }
+
+                }
+                showStoreTypeDict.Add(type, showStoreDatas);
+            }
+        }
+        UpdateShowStoreEx();
+    }
+
+    // 鍟嗗煄鍒嗕簩绾ф爣绛�
+    public void UpdateShowStoreEx()
+    {
+        sortStoreSecondType = true;
+        showStoreSecondTypeDict.Clear();
+        foreach (var type in showStoreTypeDict.Keys)
+        {
+            if (!showStoreSecondTypeDict.ContainsKey(type))
+                showStoreSecondTypeDict[type] = new Dictionary<int, List<StoreData>>();
+
+            foreach (var storeData in showStoreTypeDict[type])
+            {
+
+                foreach (var secondType in storeData.storeConfig.SecondType)
+                {
+                    if (!showStoreSecondTypeDict[type].ContainsKey(secondType))
+                        showStoreSecondTypeDict[type][secondType] = new List<StoreData>();
+
+                    showStoreSecondTypeDict[type][secondType].Add(storeData);
+                }
+
+            }
+        }
+
+    }
+
+    bool sortStoreSecondType = true;
+
+    public void SortStoreSecondType()
+    {
+        //ArrayList lst = new ArrayList(showStoreSecondTypeDict.Keys);
+        if (!sortStoreSecondType)
+            return;
+
+        foreach (var type in showStoreSecondTypeDict.Keys)
+        {
+            foreach (var secondType in showStoreSecondTypeDict[type].Keys)
+            {
+                var storeList = showStoreSecondTypeDict[type][secondType];
+                storeList.Sort(CompareSecondShop);
+            }
+        }
+
+        sortStoreSecondType = false;
+    }
+
+    private bool IsSellOut(StoreData storeData)
+    {
+        int remainNum = 0;
+        if (TryGetIsSellOut(storeData.storeConfig, out remainNum))
+            return true;
+
+        if (storeData.storeConfig.TheOnlyShop == 1 && CheckTheOnlyShopSellOut(storeData.shopId))
+            return true;
+
+        return false;
+    }
+
+    private int CompareSecondShop(StoreData start, StoreData end)
+    {
+        bool isSellOut1 = IsSellOut(start);
+        bool isSellOut2 = IsSellOut(end);
+
+        if (isSellOut1 != isSellOut2)
+            return isSellOut1.CompareTo(isSellOut2);
+        int sort1 = start.storeConfig.ShopSort;
+        int sort2 = end.storeConfig.ShopSort;
+
+        return sort1.CompareTo(sort2);
+    }
+
+    /// <summary>
+    /// 妫�娴嬪敮涓�鍟嗗搧鏄惁宸插敭缃�
+    /// </summary>
+    /// <param name="shopIndex"></param>
+    /// <param name="isTheOnlyShop"></param>
+    /// <returns></returns>
+    public bool CheckTheOnlyShopSellOut(int shopIndex)
+    {
+        StoreConfig storeConfig = StoreConfig.Get(shopIndex);
+        if (storeConfig == null || storeConfig.TheOnlyShop != 1) return false;
+
+        if (theOnlyShopDict.ContainsKey(storeConfig.ItemID))
+        {
+            List<StoreData> datas = theOnlyShopDict[storeConfig.ItemID];
+            for (int i = 0; i < datas.Count; i++)
+            {
+                var data = datas[i];
+                int remainNum = 0;
+                if (TryGetIsSellOut(data.storeConfig, out remainNum))
+                {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
+    public List<StoreData> TryGetStoreDatas(StoreFunc type)
+    {
+        var results = new List<StoreData>();
+        List<StoreData> datas = null;
+        if (showStoreTypeDict.TryGetValue((int)type, out datas))
+        {
+            results.AddRange(datas);
+            //switch (type)
+            //{
+            //    case StoreFunc.MysteryStore:
+            //        foreach (var item in datas)
+            //        {
+            //            if (mysteryCommondities.Contains(item.storeConfig.ID))
+            //            {
+            //                results.Add(item);
+            //            }
+            //        }
+
+            //        results.Sort((StoreData x, StoreData y) => { return x.storeConfig.MoneyType < y.storeConfig.MoneyType ? -1 : 1; });
+            //        break;
+            //    default:
+            //        results.AddRange(datas);
+            //        break;
+            //}
+        }
+
+        return results;
+    }
+
+    // 鑾峰彇浜岀骇鏍囩鍟嗗搧
+    public List<StoreData> TryGetStoreDatasBySecondType(int type, int secondType)
+    {
+        if (!showStoreSecondTypeDict.ContainsKey(type))
+            return null;
+
+        if (!showStoreSecondTypeDict[type].ContainsKey(secondType))
+            return null;
+
+        SortStoreSecondType();
+        return showStoreSecondTypeDict[type][secondType];
+    }
+
+    // 鑾峰緱浜岀骇鏍囩鐨勭涓�涓爣绛剧被鍨�
+    public int GetFirstStoreSecondType(int type, bool jump = true)
+    {
+        if (jump && jumpToItemId != 0)
+        {
+            if (selectSecondType == 0) selectSecondType = 1;
+            return selectSecondType;
+        }
+        if (!showStoreSecondTypeDict.ContainsKey(type))
+            return 1;
+
+        ArrayList sortList = new ArrayList(showStoreSecondTypeDict[type].Keys);
+        sortList.Sort();
+        return (int)sortList[0];
+    }
+
+    // 鑾峰緱浜岀骇鏍囩鐨勭涓�涓爣绛剧被鍨�
+    public ArrayList GetStoreSecondTypeList(int type)
+    {
+        if (!showStoreSecondTypeDict.ContainsKey(type))
+            return null;
+
+        ArrayList sortList = new ArrayList(showStoreSecondTypeDict[type].Keys);
+        sortList.Sort();
+        return sortList;
+    }
+
+    public StoreData GetStoreData(int shopId)
+    {
+        StoreConfig storeConfig = StoreConfig.Get(shopId);
+        if (storeConfig == null) return null;
+
+        List<StoreData> storeDatas = null;
+        storeTypeDict.TryGetValue(storeConfig.ShopType, out storeDatas);
+        if (storeDatas != null)
+        {
+            for (int i = 0; i < storeDatas.Count; i++)
+            {
+                var storeData = storeDatas[i];
+                if (storeData.shopId == shopId)
+                {
+                    return storeData;
+                }
+            }
+        }
+        return null;
+    }
+
+    // 涓嶅悓鑱屼笟鏄剧ず涓嶅悓鐗╁搧鐨勬儏鍐�
+    public int GetReplaceId(int shopId, int itemId)
+    {
+        var storeData = GetStoreData(shopId);
+        if (storeData == null) return 0;
+
+        int job = PlayerDatas.Instance.baseData.Job;
+        var replaceDict = storeData.jobReplaceDict;
+        if (replaceDict != null)
+        {
+            foreach (var index in replaceDict.Keys)
+            {
+                var idlist = replaceDict[index];
+                if (idlist.Contains(itemId))
+                {
+                    int replaceIndex = job - 1;
+                    return idlist[replaceIndex];
+                }
+            }
+        }
+
+        return itemId;
+    }
+
+    public bool TryGetRedTypeByShopId(int shopId, out int type)
+    {
+        type = 0;
+        foreach (var key in storeRedRuleDict.Keys)
+        {
+            List<int> idlist = storeRedRuleDict[key];
+            if (idlist.Contains(shopId))
+            {
+                type = key;
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+
+    public bool TryGetIsSellOut(StoreConfig storeConfig, out int remainCnt)
+    {
+        int canBuyCnt = 0;
+        int addBuyCnt = 0;
+        remainCnt = 0;
+        bool isLimitBuy = TryGetLimitBuy(storeConfig, out canBuyCnt, out addBuyCnt);
+        if (!isLimitBuy) return false;
+
+        remainCnt = canBuyCnt;
+        BuyShopItemLimit shopItemLimit = GetBuyShopLimit((uint)storeConfig.ID);
+        if (shopItemLimit != null)
+        {
+            remainCnt -= shopItemLimit.BuyCnt;
+        }
+
+        if (remainCnt <= 0)
+        {
+            return true;
+        }
+        return false;
+    }
+
+    /// <summary>
+    /// 
+    /// </summary>
+    /// <param name="config"></param>
+    /// <param name="canBuyCnt"> 鍙喘涔颁笂闄�</param>
+    /// <param name="addBuyCnt"> 涓嬩竴绾IP澧炲姞鐨勫彲璐拱娆℃暟</param>
+    /// <returns></returns>
+    public bool TryGetLimitBuy(StoreConfig config, out int canBuyCnt, out int addBuyCnt)
+    {
+        canBuyCnt = 0;
+        addBuyCnt = 0;
+        if (config == null) return false;
+
+        int[] canBuyNums = config.GoumaiNumber;
+        if (canBuyNums == null || canBuyNums.Length < 1) return false;
+
+        int curVipIndex = -1;
+        int nexVipIndex = -1;
+        bool isVipBuy = TryGetVipBuy(config, out curVipIndex, out nexVipIndex);
+        if (isVipBuy)
+        {
+            if (curVipIndex != -1)
+            {
+                canBuyCnt = canBuyNums[curVipIndex];
+            }
+
+            if (nexVipIndex != -1)
+            {
+                addBuyCnt = canBuyNums[nexVipIndex] - canBuyCnt;
+            }
+            return true;
+        }
+        else
+        {
+            if (canBuyNums[0] != 0)
+            {
+                canBuyCnt = canBuyNums[0];
+                return true;
+            }
+            else
+            {
+                return false;
+            }
+        }
+    }
+
+    public bool TryGetVipBuy(StoreConfig config, out int curVipIndex, out int nextVipIndex)
+    {
+        curVipIndex = -1;
+        nextVipIndex = -1;
+        bool isVipBuy = false;
+        if (config == null) return false;
+
+        var vipLvs = config.VIPLV;
+        if (vipLvs == null || vipLvs.Length < 1) return false;
+
+        for (int i = 0; i < vipLvs.Length; i++)
+        {
+            var vipLv = vipLvs[i];
+            if (vipLv != 0)
+            {
+                isVipBuy = true;
+            }
+        }
+
+        if (isVipBuy)
+        {
+            int playerVip = PlayerDatas.Instance.baseData.VIPLv;
+            for (int i = vipLvs.Length - 1; i > -1; i--)
+            {
+                var vipLv = vipLvs[i];
+                if (vipLv > playerVip)
+                {
+                    nextVipIndex = i;
+                }
+                else if (vipLv <= playerVip)
+                {
+                    curVipIndex = i;
+                    break;
+                }
+            }
+
+        }
+
+        return isVipBuy;
+    }
+
+
+
+    public List<StoreData> TryGetStoreDatasByLimit(int type, int limitValue)
+    {
+        string key = StringUtility.Contact(type, limitValue);
+        List<StoreData> datas = null;
+        limitValueShopDict.TryGetValue(key, out datas);
+        return datas;
+    }
+    #endregion
+
+    public string GetStoreRefreshTimeByType(int type)
+    {
+        if (resetTimeDict == null || !resetTimeDict.ContainsKey(type)) return string.Empty;
+
+        switch (type)
+        {
+            case 7:
+                int willRefreshTime = GetWillRefreshTime();
+                return Language.Get(resetTimeDict[type], UIHelper.AppendColor(TextColType.Green, TimeUtility.SecondsToHMS(willRefreshTime), true));
+            default:
+                return Language.Get(resetTimeDict[type]);
+        }
+    }
+
+    public string GetMysteryStoreRefreshTime()
+    {
+        if (GeneralDefine.mysteryShopRefreshInterval == 0)
+        {
+            return "";
+        }
+        var seconds = GeneralDefine.mysteryShopRefreshInterval -
+             (int)((TimeUtility.ServerNow - TimeUtility.createRoleTime).TotalSeconds) % GeneralDefine.mysteryShopRefreshInterval;
+        return Language.Get("StoreWin200", TimeUtility.SecondsToHMS(seconds));
+    }
+
+    private int GetWillRefreshTime()
+    {
+        int willRefresh = (3 - TimeUtility.OpenDay % 3);
+        if (willRefresh == 3)
+        {
+            if (TimeUtility.ServerNow.Hour < 5)
+            {
+                willRefresh = 0;
+            }
+        }
+        int remainHour = 5 - TimeUtility.ServerNow.Hour;
+        int remainMinute = 0 - TimeUtility.ServerNow.Minute;
+        int remainSecond = willRefresh * 24 * 60 * 60 + remainHour * 60 * 60 + remainMinute * 60 - TimeUtility.ServerNow.Second;
+        return remainSecond;
+    }
+
+    int refreshTime = 0;
+    private void UpdateSecond()
+    {
+        if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Store)) return;
+        if (isUpdatePlayerLv)
+        {
+            UpdatePlayerLv();
+            isUpdatePlayerLv = false;
+        }
+    }
+
+    private void UpdatePlayerLv()
+    {
+        UpdateShowStore();
+        UpdateFreeShopRedpoint();
+        UpdateCanBuyRedpoint();
+        UpdateMustBuyRedpoint();
+    }
+
+    private void RefreshPlayerData(PlayerDataType type)
+    {
+        if (type == PlayerDataType.VIPLv)
+        {
+            UpdateShowStore();
+        }
+
+        switch (type)
+        {
+            case PlayerDataType.LV:
+                isUpdatePlayerLv = true;
+                break;
+            case PlayerDataType.VIPLv:
+            case PlayerDataType.Gold:
+            case PlayerDataType.GoldPaper:
+                UpdateFreeShopRedpoint();
+                UpdateCanBuyRedpoint();
+                UpdateDailyRedpoinit();
+                break;
+            case PlayerDataType.UnionLiven:
+                UpdateDailyRedpoinit();
+                break;
+            case PlayerDataType.FBHelpPoint:
+                UpdateFreeShopRedpoint();
+                UpdateCanBuyRedpoint();
+                break;
+        }
+    }
+
+    private void RefreshFamilyLv()
+    {
+        int familyLv = PlayerDatas.Instance.fairyData.fairy.FamilyLV;
+        if (familyLv > GetSaveFairyLV())
+        {
+            ControllerRedPoint();
+        }
+        UpdateDailyRedpoinit();
+    }
+
+    private void RefreshServerHour()
+    {
+        ControllerRedPoint();
+        if (PlayerPrefs.HasKey(MUSTBUYSAVE_KEY))
+        {
+            int[] records = LocalSave.GetIntArray(MUSTBUYSAVE_KEY);
+            if (TimeUtility.ServerNow.Hour >= 5
+                && ((TimeUtility.ServerNow.Day == records[0] && records[1] < 5)
+                || TimeUtility.ServerNow.Day != records[0]))
+            {
+                saveTimes[0] = TimeUtility.ServerNow.Day;
+                saveTimes[1] = TimeUtility.ServerNow.Hour;
+                IsMustBuyDay = true;
+                LocalSave.SetIntArray(MUSTBUYSAVE_KEY, saveTimes);
+                UpdateMustBuyRedpoint();
+            }
+        }
+        if (!PlayerDatas.Instance.fairyData.HasFairy)
+        {
+            PlayerPrefs.DeleteKey(UNIONSTORESAVE_KEY);
+        }
+
+        UpdateDailyRedpoinit();
+    }
+
+    public event Action RefreshBuyShopLimitEvent;
+
+    public StoreFunc storeFuncType = StoreFunc.DayStore;
+    public int jumpStoreFuncType { get; set; }
+    private Dictionary<uint, BuyShopItemLimit> shopItemlimitDict = new Dictionary<uint, BuyShopItemLimit>();
+
+    /// <summary>
+    /// 寰楀埌鐗╁搧璐拱娆℃暟
+    /// </summary>
+    /// <param name="buylimit"></param>
+    public void RefreshBuyShopLimitModel(HA802_tagMCShopItemDayBuyCntInfo buylimit)
+    {
+        Debug.Log("RefreshBuyShopLimitModel" + buylimit.Count);
+        if (buylimit.Count > 0)
+        {
+            int i = 0;
+            for (i = 0; i < buylimit.Count; i++)
+            {
+                if (!shopItemlimitDict.ContainsKey(buylimit.DayBuyCntList[i].ItemIndex))
+                {
+                    BuyShopItemLimit shopItemLimit = new BuyShopItemLimit();
+                    shopItemLimit.ItemIndex = buylimit.DayBuyCntList[i].ItemIndex;
+                    shopItemLimit.BuyCnt = (int)buylimit.DayBuyCntList[i].BuyCnt;
+                    shopItemLimit.isReset = buylimit.DayBuyCntList[i].IsReset;
+                    shopItemlimitDict.Add(shopItemLimit.ItemIndex, shopItemLimit);
+                }
+                else
+                {
+                    shopItemlimitDict[buylimit.DayBuyCntList[i].ItemIndex].BuyCnt = (int)buylimit.DayBuyCntList[i].BuyCnt;
+                    shopItemlimitDict[buylimit.DayBuyCntList[i].ItemIndex].isReset = buylimit.DayBuyCntList[i].IsReset;
+                }
+            }
+
+        }
+
+        sortStoreSecondType = true;
+        UpdateShowStore();
+        UpdateFreeShopRedpoint();
+        UpdateCanBuyRedpoint();
+        UpdateMustBuyRedpoint();
+        UpdateDailyRedpoinit();
+        if (RefreshBuyShopLimitEvent != null)
+            RefreshBuyShopLimitEvent();
+    }
+
+    public BuyShopItemLimit GetBuyShopLimit(uint itemIndex)
+    {
+        if (shopItemlimitDict.ContainsKey(itemIndex))
+        {
+            return shopItemlimitDict[itemIndex];
+        }
+        return null;
+    }
+
+
+
+    //鍜孏etShopItemlistEx 涓�鏍� 鑾峰彇鍟嗗簵鐗╁搧鍒楄〃锛屽彧鏄繑鍥炵被鍨嬩笉鍚�
+    List<ShopItemInfo> shopItemlist = new List<ShopItemInfo>();
+    public List<ShopItemInfo> GetShopItemlistByIndex(StoreConfig storeConfig)
+    {
+        if (storeConfig == null) return null;
+
+        shopItemlist.Clear();
+        if (storeConfig.ItemID != 0)
+        {
+            int replaceId = GetReplaceId(storeConfig.ID, storeConfig.ItemID);
+            ShopItemInfo shopItem = new ShopItemInfo(replaceId, storeConfig.ItemCnt);
+            shopItemlist.Add(shopItem);
+        }
+        JsonData extraItem = JsonMapper.ToObject(storeConfig.ItemListEx);
+        if (extraItem.IsArray)
+        {
+            for (int i = 0; i < extraItem.Count; i++)
+            {
+                if (extraItem[i].IsArray)
+                {
+                    if (extraItem[i].Count > 0)
+                    {
+                        int itemId = int.Parse(extraItem[i][0].ToString());
+                        int itemCount = int.Parse(extraItem[i][1].ToString());
+                        if (itemId != 0)
+                        {
+                            int extraReplaceId = GetReplaceId(storeConfig.ID, itemId);
+                            ShopItemInfo shop = new ShopItemInfo(extraReplaceId, itemCount);
+                            shopItemlist.Add(shop);
+                        }
+                    }
+                }
+            }
+        }
+        return shopItemlist;
+    }
+
+    //鍜孏etShopItemlistByIndex 涓�鏍� 鑾峰彇鍟嗗簵鐗╁搧鍒楄〃锛屽彧鏄繑鍥炵被鍨嬩笉鍚�
+    public List<int[]> GetShopItemlistEx(StoreConfig storeConfig)
+    {
+        if (storeConfig == null) return null;
+
+        List<int[]> shopItemlist = new List<int[]>();
+        if (storeConfig.ItemID != 0)
+        {
+            int replaceId = GetReplaceId(storeConfig.ID, storeConfig.ItemID);
+            shopItemlist.Add(new int[] { replaceId, storeConfig.ItemCnt, 0 });
+        }
+        var extraItem = JsonMapper.ToObject<int[][]>(storeConfig.ItemListEx);
+        for (int i = 0; i < extraItem.Length; i++)
+        {
+            shopItemlist.Add(extraItem[i]);
+        }
+        return shopItemlist;
+    }
+
+    public bool TryGetShopItemInfo(StoreFunc _type, int _id, out List<ShopItemInfo> _shopItems)
+    {
+        _shopItems = null;
+        var _list = TryGetStoreDatas(_type);
+        var _index = _list.FindIndex((x) =>
+        {
+            return x.shopId == _id;
+        });
+        if (_index == -1)
+        {
+            return false;
+        }
+        _shopItems = GetShopItemlistByIndex(_list[_index].storeConfig);
+        return _shopItems != null;
+    }
+
+
+    #region 鐐瑰嚮鍟嗗簵鐗╁搧閫昏緫
+    public void OnClickShopCell(StoreConfig shopInfo)
+    {
+        int itemId = GetReplaceId(shopInfo.ID, shopInfo.ItemID);
+        ItemTipUtility.ShowGood(shopInfo.ID, itemId);
+    }
+
+    public int BuyCnt { get; private set; }
+    public void SetBuyCnt(int buyCnt)
+    {
+        BuyCnt = buyCnt;
+    }
+
+    #endregion
+
+    private ulong _price;
+    public void SendBuyShopItem(StoreConfig model, int count)
+    {
+
+        _price = (ulong)(model.MoneyNumber * count);
+
+        if (MoneyIsEnough(model.MoneyType, _price))
+        {
+            var vipLv = PlayerDatas.Instance.baseData.VIPLv;
+            var itemMinLv = model.VIPLV[0];
+            if (vipLv < itemMinLv)
+            {
+                SysNotifyMgr.Instance.ShowTip("VIPNotEnough", itemMinLv);
+            }
+            else
+            {
+                CA310_tagCMBuyItem buyShop = new CA310_tagCMBuyItem();
+                buyShop.BuyItemIndex = (ushort)model.ID;
+                buyShop.BuyCount = (uint)count;
+                GameNetSystem.Instance.SendInfo(buyShop);
+            }
+        }
+        else
+        {
+            switch (model.MoneyType)
+            {
+                case 1:
+                    if (VersionConfig.Get().isBanShu)
+                    {
+                        SysNotifyMgr.Instance.ShowTip("GoldErr");
+                        return;
+                    }
+                    // WindowCenter.Instance.Open<RechargeTipWin>();
+                    break;
+                case 25:
+                    SysNotifyMgr.Instance.ShowTip("LackXBMoney", model.MoneyType);
+                    break;
+                default:
+                    SysNotifyMgr.Instance.ShowTip("LackMoney", model.MoneyType);
+                    break;
+            }
+        }
+
+    }
+
+    //浠欑帀璐拱鐗╁搧鐨勪簩娆$‘璁ゆ锛屼竴绾ц揣甯佸彧鏈変粰鐜� 榛樿涓轰粰鐜夊嵆鍙�
+    Dictionary<int, bool> buyItemCheckDict = new Dictionary<int, bool>();
+    //type 瀵瑰簲鏋氫妇 BuyStoreItemCheckType 鏂逛究璁板繂
+    public void SendBuyShopItemWithPopCheck(StoreConfig model, int count, int type = 0)
+    {
+        if (model.MoneyNumber == 0)
+        {
+            //鍏嶈垂鐨�
+            SendBuyShopItem(model, count);
+            return;
+        }
+
+        if (buyItemCheckDict.ContainsKey(type) && buyItemCheckDict[type])
+        {
+            SendBuyShopItem(model, count);
+            return;
+        }
+
+        ConfirmCancel.ToggleConfirmCancel(Language.Get("Mail101"), Language.Get("OSTimeLimitGiftConfirm", model.MoneyNumber),
+        Language.Get("ConfirmCancel102"), (Action<bool, bool>)((bool isOk, bool isToggle) =>
+        {
+            if (isOk)
+            {
+                SendBuyShopItem(model, count);
+                buyItemCheckDict[type] = isToggle;
+            }
+            
+        }));
+    }
+
+    //鑺变粰鐜夎喘涔扮殑浜屾纭妗�(鏈鐧诲綍) 榛樿鎻愮ず MysticalQG104	鏄惁鑺辫垂<color=#109d06>{0}</color>浠欑帀杩涜璐拱锛�
+    //type 瀵瑰簲鏋氫妇 BuyStoreItemCheckType 鏂逛究璁板繂
+    public void UseMoneyCheck(int money, Action func, int type = 0, string tip = "MysticalQG104", string fullTip = "")
+    {
+        if (money == 0)
+        {
+            //鍏嶈垂鐨�
+            func?.Invoke();
+            return;
+        }
+
+        if (buyItemCheckDict.ContainsKey(type) && buyItemCheckDict[type])
+        {
+            func?.Invoke();
+            return;
+        }
+
+        ConfirmCancel.ToggleConfirmCancel(Language.Get("Mail101"), fullTip == "" ? Language.Get(tip, money) : fullTip,
+            Language.Get("ConfirmCancel102"), (bool isOk, bool isToggle) =>
+            {
+                if (isOk)
+                {
+                    func?.Invoke();
+                    buyItemCheckDict[type] = isToggle;
+                }
+
+            });
+    }
+
+
+
+    public event Action<int> RefreshBuyResultEvent;
+
+    public void GetBuyResult(HA811_tagMCShoppingResult result)
+    {
+
+        Debug.Log("GetBuyResult");
+        StoreConfig tagStore = StoreConfig.Get((int)result.ItemIndex);
+
+        if (tagStore != null)
+        {
+            ItemConfig chinModel = ItemConfig.Get(GetReplaceId(tagStore.ID, tagStore.ItemID));
+            if (!normalBuyCoinsTypes.Contains(tagStore.MoneyType))
+            {
+                if (tagStore.RemindSuccess == 0)
+                {
+                    return;
+                }
+                // BuySuccessModel.Instance.SetBuySuccessModel(chinModel.ID, (int)result.ItemCnt);
+                // if (!WindowCenter.Instance.IsOpen<BuySuccessWin>())
+                // {
+                //     WindowCenter.Instance.Open<BuySuccessWin>();
+                // }
+            }
+            else
+            {
+                float costMoney = tagStore.MoneyNumber;
+                SysNotifyMgr.Instance.ShowTip("BuyItemHinit", costMoney, tagStore.MoneyType, chinModel.ItemName);
+            }
+
+            if (RefreshBuyResultEvent != null)
+            {
+                RefreshBuyResultEvent(chinModel.ID);
+            }
+        }
+    }
+
+
+    public bool MoneyIsEnough(int moneyType, ulong money)
+    {
+        if (UIHelper.GetMoneyCnt(moneyType) < money)
+        {
+            return false;
+        }
+        else
+        {
+            return true;
+        }
+    }
+
+    public int funcOrder { get; private set; }
+    public int jumpToItemId { get; set; }
+
+    /// <summary>
+    /// 浼氬厛娓呬箣鍓嶇殑璺宠浆锛岃皟鐢ㄨ�呰娉ㄦ剰 ClearJump
+    /// </summary>
+    /// <param name="itemId"></param>
+    public void SetJumpToModel(int itemId)
+    {
+        ClearJump();
+        jumpToItemId = itemId;
+    }
+
+    public void ClearJump()
+    {
+        funcOrder = -1;
+        jumpToItemId = 0;
+    }
+
+    public void SetWinOrder(int order)
+    {
+        funcOrder = order;
+    }
+
+    public void OpenStoreWin(bool forceSync = false, int functionOrder = 0, bool useJump = false)
+    {
+        if (useJump && funcOrder != -1)
+        {
+            // WindowCenter.Instance.Open<StoreWin>(forceSync, funcOrder);
+        }
+        else
+        { 
+            ClearJump();
+            // WindowCenter.Instance.Open<StoreWin>(forceSync, functionOrder);
+        }
+    }
+
+    public event Action StoreFuncOpenAct;
+
+    private void FuncStateChange(int funcId)
+    {
+        switch ((FuncOpenEnum)funcId)
+        {
+            case FuncOpenEnum.Store:
+                if (StoreFuncOpenAct != null)
+                {
+                    StoreFuncOpenAct();
+                }
+                UpdateFreeShopRedpoint();
+                UpdateCanBuyRedpoint();
+                UpdateMustBuyRedpoint();
+                UpdateDailyRedpoinit();
+                break;
+            case FuncOpenEnum.BlastFurnace:
+                ControllerRedPoint();
+                break;
+        }
+    }
+
+    public bool IsNewDay(string recordKey)
+    {
+        if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Store)) return false;
+
+        if (PlayerPrefs.HasKey(recordKey))
+        {
+            int day = LocalSave.GetInt(recordKey);
+            if (day != TimeUtility.ServerNow.Day)
+            {
+                LocalSave.SetInt(recordKey, TimeUtility.ServerNow.Day);
+                return true;
+            }
+            else
+            {
+                return false;
+            }
+        }
+        else
+        {
+            LocalSave.SetInt(recordKey, TimeUtility.ServerNow.Day);
+            return true;
+        }
+    }
+
+    public bool IsRequireDailyRedRemind(int shopId)
+    {
+        var config = StoreConfig.Get(shopId);
+        if (config == null)
+        {
+            return false;
+        }
+        var key = StringUtility.Contact("Store_", config.ShopType, "_", "Daily", shopId);
+        var array = LocalSave.GetIntArray(key);
+        if (array != null && array.Length == 2)
+        {
+            if (array[0] < TimeUtility.Day - 1)
+            {
+                return true;
+            }
+            else if (array[0] == TimeUtility.Day - 1)
+            {
+                return array[1] < 5 || TimeUtility.Hour >= 5;
+            }
+            else if (array[0] == TimeUtility.Day)
+            {
+                return array[1] < 5 && TimeUtility.Hour >= 5;
+            }
+        }
+        return true;
+    }
+
+    public void SetDailyRedRedmind(int shopId)
+    {
+        var config = StoreConfig.Get(shopId);
+        if (config == null)
+        {
+            return;
+        }
+        var key = StringUtility.Contact("Store_", config.ShopType, "_", "Daily", shopId);
+        LocalSave.SetIntArray(key, new int[2] { TimeUtility.Day, TimeUtility.Hour });
+        UpdateDailyRedpoinit();
+    }
+    #region 鍟嗗煄绾㈢偣
+
+    #region 浠欑洘绾㈢偣閫昏緫澶勭悊
+
+    private bool CheckIsBuyNewItem(int fairyLv)
+    {
+        if (fairyLv > GetSaveFairyLV())
+        {
+            var toolStoreDatas = TryGetStoreDatasByLimit((int)StoreFunc.ToolStore, fairyLv);
+            var mountStoreDatas = TryGetStoreDatasByLimit((int)StoreFunc.MountStoneStore, fairyLv);
+            var skillBookStoreData = TryGetStoreDatasByLimit((int)StoreFunc.MountSkillBookStore, fairyLv);
+            if ((toolStoreDatas != null && toolStoreDatas.Count > 0)
+                || (mountStoreDatas != null && mountStoreDatas.Count > 0)
+                || (skillBookStoreData != null && skillBookStoreData.Count > 0))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private bool CheckIsNewMonth()
+    {
+        GetSaveDateTime();
+        if (datelist.Count > 0)
+        {
+            if (TimeUtility.ServerNow.Month == datelist[0])
+            {
+                if (TimeUtility.ServerNow.Day >= 1
+                    && TimeUtility.ServerNow.Hour >= 5
+                    && datelist[1] <= 1 && datelist[2] < 5)
+                {
+                    return true;
+                }
+            }
+            else
+            {
+                if (TimeUtility.ServerNow.Day >= 1
+                    && TimeUtility.ServerNow.Hour >= 5)
+                {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    List<int> datelist = new List<int>();
+    public List<int> GetSaveDateTime()
+    {
+        datelist.Clear();
+        int[] unionArray = LocalSave.GetIntArray(UNIONSTORESAVE_KEY);
+        if (unionArray != null && unionArray.Length >= 4)
+        {
+            datelist.Add(unionArray[1]);
+            datelist.Add(unionArray[2]);
+            datelist.Add(unionArray[3]);
+        }
+        return datelist;
+    }
+
+    public int GetSaveFairyLV()
+    {
+        int[] unionArray = LocalSave.GetIntArray(UNIONSTORESAVE_KEY);
+        int fairyLv = 0;
+        if (unionArray != null)
+        {
+            return unionArray[0];
+        }
+        return fairyLv;
+    }
+
+
+    //1浠欑洘绛夌骇 2 鏈堜唤 3 鍙� 4 鍑犵偣
+    public void SetStoreLocalSave(LocalSaveStoreType saveStoreType, params int[] infos)
+    {
+        string key = StringUtility.Contact(PlayerDatas.Instance.baseData.PlayerID, saveStoreType);
+        LocalSave.SetIntArray(key, infos);
+    }
+
+    public void ControllerRedPoint(bool isLook = false)
+    {
+        fairyStoreRemindRedpoint.state = RedPointState.None;
+        if (!FairyModel.Instance.fairyStoreOpen
+            || !FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.BlastFurnace))
+        {
+            return;
+        }
+
+        int familyLv = PlayerDatas.Instance.fairyData.fairy.FamilyLV;
+        if (!isLook)
+        {
+            if (CheckIsBuyNewItem(familyLv))
+            {
+                fairyStoreRemindRedpoint.state = RedPointState.Simple;
+                return;
+            }
+
+            if (CheckIsNewMonth())
+            {
+                fairyStoreRemindRedpoint.state = RedPointState.Simple;
+                return;
+            }
+        }
+
+        SetStoreLocalSave(LocalSaveStoreType.UnionStore, familyLv, TimeUtility.ServerNow.Month,
+                TimeUtility.ServerNow.Day, TimeUtility.ServerNow.Hour);
+    }
+
+    #endregion
+
+    public const int StoreFunc_RedKey = 22;
+    public const int StoreFunc1_RedKey = 2201;
+    public const int StoreFunc2_RedKey = 2202;
+    public const int StoreFunc3_RedKey = 2203;
+    public const int StoreFunc4_RedKey = 2204;
+    public const int StoreFunc5_RedKey = 2205;
+    public const int StoreFunc8_RedKey = 2208;
+    public const int FairyStoreRemind_RedKey = 107010601;
+    public Redpoint storeFuncPoint = new Redpoint(StoreFunc_RedKey);
+    public Redpoint storeFunc1Point = new Redpoint(StoreFunc_RedKey, StoreFunc1_RedKey);
+    public Redpoint storeFunc2Point = new Redpoint(StoreFunc_RedKey, StoreFunc2_RedKey);
+    public Redpoint storeFunc3Point = new Redpoint(StoreFunc_RedKey, StoreFunc3_RedKey);
+    public Redpoint storeFunc4Point = new Redpoint(StoreFunc_RedKey, StoreFunc4_RedKey);
+    public Redpoint storeFunc5Point = new Redpoint(StoreFunc_RedKey, StoreFunc5_RedKey);
+    public Redpoint storeFunc8Point = new Redpoint(MainRedDot.FAIRYStore_REDPOINT_KEY3, StoreFunc8_RedKey);
+    public Redpoint fairyStoreRemindRedpoint = new Redpoint(MainRedDot.FAIRYStore_REDPOINT_KEY3, FairyStoreRemind_RedKey);
+    public Dictionary<int, Redpoint> shopRedDict = new Dictionary<int, Redpoint>();
+    public void SetShopRedpoint()
+    {
+        shopRedDict.Clear();
+        List<StoreConfig> storelist = StoreConfig.GetValues();
+        for (int i = 0; i < storelist.Count; i++)
+        {
+            StoreConfig storeConfig = storelist[i];
+            int redKey = 0;
+            Redpoint redpoint = null;
+            switch (storeConfig.ShopType)
+            {
+                //case 1:
+                //    redKey = StoreFunc1_RedKey * 10000 + storeConfig.ID;
+                //    redpoint = new Redpoint(StoreFunc1_RedKey, redKey);
+                //    shopRedDict.Add(storeConfig.ID, redpoint);
+                //    break;
+                //case 2:
+                //    redKey = StoreFunc2_RedKey * 10000 + storeConfig.ID;
+                //    redpoint = new Redpoint(StoreFunc2_RedKey, redKey);
+                //    shopRedDict.Add(storeConfig.ID, redpoint);
+                //    break;
+                //case 3:
+                //    redKey = StoreFunc3_RedKey * 10000 + storeConfig.ID;
+                //    redpoint = new Redpoint(StoreFunc3_RedKey, redKey);
+                //    shopRedDict.Add(storeConfig.ID, redpoint);
+                //    break;
+                //case 4:
+                //    redKey = StoreFunc4_RedKey * 10000 + storeConfig.ID;
+                //    redpoint = new Redpoint(StoreFunc4_RedKey, redKey);
+                //    shopRedDict.Add(storeConfig.ID, redpoint);
+                //    break;
+                //case 5:
+                //    redKey = StoreFunc5_RedKey * 10000 + storeConfig.ID;
+                //    redpoint = new Redpoint(StoreFunc5_RedKey, redKey);
+                //    shopRedDict.Add(storeConfig.ID, redpoint);
+                //    break;
+                case 8:
+                    redKey = StoreFunc8_RedKey * 10000 + storeConfig.ID;
+                    redpoint = new Redpoint(StoreFunc8_RedKey, redKey);
+                    shopRedDict.Add(storeConfig.ID, redpoint);
+                    break;
+            }
+        }
+    }
+
+    public void UpdateFreeShopRedpoint()
+    {
+        if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Store)) return;
+
+        foreach (var key in showStoreTypeDict.Keys)
+        {
+            var storeDatas = showStoreTypeDict[key];
+            for (int i = 0; i < storeDatas.Count; i++)
+            {
+                var storeConfig = storeDatas[i].storeConfig;
+                int type = 0;
+                TryGetRedTypeByShopId(storeConfig.ID, out type);
+                if (type == 1)
+                {
+                    int remainNum = 0;
+                    if (shopRedDict.ContainsKey(storeConfig.ID))
+                    {
+                        if (!TryGetIsSellOut(storeConfig, out remainNum))
+                        {
+                            shopRedDict[storeConfig.ID].state = RedPointState.Simple;
+                        }
+                        else
+                        {
+                            shopRedDict[storeConfig.ID].state = RedPointState.None;
+                        }
+                    }
+                }
+            }
+
+        }
+    }
+
+    public void UpdateCanBuyRedpoint()
+    {
+        if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Store)) return;
+
+        foreach (var key in showStoreTypeDict.Keys)
+        {
+            var storeDatas = showStoreTypeDict[key];
+            for (int i = 0; i < storeDatas.Count; i++)
+            {
+                var storeConfig = storeDatas[i].storeConfig;
+                int type = 0;
+                TryGetRedTypeByShopId(storeConfig.ID, out type);
+                if (type == 4)
+                {
+                    int remainNum = 0;
+                    if (shopRedDict.ContainsKey(storeConfig.ID))
+                    {
+                        if (!TryGetIsSellOut(storeConfig, out remainNum))
+                        {
+                            if (UIHelper.GetMoneyCnt(storeConfig.MoneyType) >= (ulong)storeConfig.MoneyNumber)
+                            {
+                                shopRedDict[storeConfig.ID].state = RedPointState.Simple;
+                            }
+                            else
+                            {
+                                shopRedDict[storeConfig.ID].state = RedPointState.None;
+                            }
+                        }
+                        else
+                        {
+                            shopRedDict[storeConfig.ID].state = RedPointState.None;
+                        }
+
+                    }
+                }
+            }
+
+        }
+    }
+
+    public void UpdateMustBuyRedpoint()
+    {
+        if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Store)) return;
+
+        foreach (var key in showStoreTypeDict.Keys)
+        {
+            var storeDatas = showStoreTypeDict[key];
+            for (int i = 0; i < storeDatas.Count; i++)
+            {
+                var storeConfig = storeDatas[i].storeConfig;
+                int type = 0;
+                TryGetRedTypeByShopId(storeConfig.ID, out type);
+                if (type == 2)
+                {
+                    if (shopRedDict.ContainsKey(storeConfig.ID))
+                    {
+                        if (CheckIsMustBuy(storeConfig))
+                        {
+                            shopRedDict[storeConfig.ID].state = RedPointState.Simple;
+                        }
+                        else
+                        {
+                            shopRedDict[storeConfig.ID].state = RedPointState.None;
+                        }
+                    }
+                }
+            }
+
+        }
+    }
+
+    public void UpdateDailyRedpoinit()
+    {
+        if (storeRedRuleDict.ContainsKey(6))
+        {
+            var shopIds = storeRedRuleDict[6];
+            var count = 0;
+            foreach (var shopId in shopIds)
+            {
+                var redable = false;
+                var config = StoreConfig.Get(shopId);
+                switch (config.ShopType)
+                {
+                    case 8:
+                        if (TryGetIsSellOut(config, out count))
+                        {
+                            break;
+                        }
+                        if (PlayerDatas.Instance.fairyData.fairy == null)
+                        {
+                            break;
+                        }
+                        if (config.VIPLV.Length > 0
+                            && PlayerDatas.Instance.baseData.VIPLv < config.VIPLV[0])
+                        {
+                            break;
+                        }
+                        if (PlayerDatas.Instance.fairyData.fairy.FamilyLV < config.LimitValue)
+                        {
+                            break;
+                        }
+                        if (!MoneyIsEnough(config.MoneyType, (ulong)config.MoneyNumber))
+                        {
+                            break;
+                        }
+                        redable = IsRequireDailyRedRemind(shopId);
+                        break;
+                }
+
+                if (shopRedDict.ContainsKey(shopId))
+                {
+                    shopRedDict[shopId].state = redable ? RedPointState.Simple : RedPointState.None;
+                }
+            }
+        }
+    }
+
+    
+
+
+    public void ClearMustBuyRedpoint(StoreConfig storeConfig)
+    {
+        if (!shopRedDict.ContainsKey(storeConfig.ID))
+            return;
+        int type = 0;
+        TryGetRedTypeByShopId(storeConfig.ID, out type);
+        if (type == 2)
+        {
+            shopRedDict[storeConfig.ID].state = RedPointState.None;
+            IsMustBuyDay = false;
+        }
+        else if (type == 1)
+        {
+            shopRedDict[storeConfig.ID].state = RedPointState.None;
+        }
+    }
+
+    public bool IsMustBuyDay { get; private set; }
+    int[] saveTimes = new int[2];
+    public void SetIsMustBuyDay()
+    {
+        if (IsMustBuyDay) return;
+
+        saveTimes[0] = TimeUtility.ServerNow.Day;
+        saveTimes[1] = TimeUtility.ServerNow.Hour;
+        if (PlayerPrefs.HasKey(MUSTBUYSAVE_KEY))
+        {
+            int[] records = LocalSave.GetIntArray(MUSTBUYSAVE_KEY);
+            if (TimeUtility.ServerNow.Hour >= 5
+                && ((TimeUtility.ServerNow.Day == records[0] && records[1] < 5)
+                || TimeUtility.ServerNow.Day != records[0]))
+            {
+                IsMustBuyDay = true;
+                LocalSave.SetIntArray(MUSTBUYSAVE_KEY, saveTimes);
+            }
+            else
+            {
+                IsMustBuyDay = false;
+            }
+        }
+        else
+        {
+            IsMustBuyDay = true;
+            LocalSave.SetIntArray(MUSTBUYSAVE_KEY, saveTimes);
+        }
+    }
+
+    public bool CheckIsMustBuy(StoreConfig config)
+    {
+        int remainNum = 0;
+        if (!TryGetIsSellOut(config, out remainNum) && IsMustBuyDay)
+        {
+            return true;
+        }
+        return false;
+    }
+
+    
+    public void ClearPetAndMountRedpoint(StoreConfig storeConfig)
+    {
+        ItemConfig itemConfig = ItemConfig.Get(storeConfig.ItemID);
+        switch (itemConfig.Type)
+        {
+            case 26:
+            case 41:
+                string key = StringUtility.Contact(PlayerDatas.Instance.baseData.PlayerID, "ShopId", storeConfig.ID);
+                if (shopRedDict.ContainsKey(storeConfig.ID) && shopRedDict[storeConfig.ID].state == RedPointState.Simple)
+                {
+                    shopRedDict[storeConfig.ID].state = RedPointState.None;
+                    LocalSave.SetBool(key, false);
+                }
+                break;
+        }
+    }
+
+    public void ClearAllPetAndMountRedpoint(StoreFunc storeFunc)
+    {
+        if (storeFuncType == StoreFunc.BindStore && storeFunc != StoreFunc.BindStore)
+        {
+            foreach (var key in shopRedDict.Keys)
+            {
+                StoreConfig storeConfig = StoreConfig.Get(key);
+                ItemConfig itemConfig = ItemConfig.Get(storeConfig.ItemID);
+                switch (itemConfig.Type)
+                {
+                    case 26:
+                    case 41:
+                        if (shopRedDict.ContainsKey(key) && shopRedDict[key].state != RedPointState.None)
+                        {
+                            string record = StringUtility.Contact(PlayerDatas.Instance.baseData.PlayerID, "ShopId", key);
+                            shopRedDict[key].state = RedPointState.None;
+                            LocalSave.SetBool(record, false);
+                        }
+                        break;
+                }
+
+            }
+        }
+
+    }
+
+    public void CloseRedPoint(StoreConfig storeConfig)
+    {
+        ClearMustBuyRedpoint(storeConfig);
+        ClearPetAndMountRedpoint(storeConfig);
+    }
+
+    public void CloseAllRedpoint(StoreFunc storeFunc)
+    {
+        ClearAllPetAndMountRedpoint(storeFunc);
+    }
+    #endregion
+
+    
+
+
+}
+
+public enum StoreFunc
+{
+    DayStore = 1, //1锛氭瘡澶╅檺璐�
+    CommonStore = 2, //2锛氬够澧冮榿鍟嗗簵
+    GrowStrongerStore = 3, //3锛氭垚闀垮彉寮�
+    BindStore = 4,  //4锛氱粦鐜夊晢鍩�
+    IntegralStore = 5,  //5锛氱Н鍒嗗晢鍩�
+    BagStore = 6,  //6:闅忚韩鍟嗗簵
+    RuneStore = 7,  //7锛氱鍗板晢搴�
+    ToolStore = 8, // 閬撳叿鍟嗗簵
+    MountStoneStore = 9, //鍧愰獞榄傜煶鍟嗗簵
+    MountSkillBookStore = 10,//鍧愰獞鎶�鑳戒功鍟嗗簵
+    XBEquipStore = 11, //瀵诲疂瑁呭鍟嗗簵
+    XBRuneStore = 12, //瀵诲疂绗﹀嵃鍟嗗簵
+    XBToolStore = 13, //瀵诲疂閬撳叿鍟嗗簵
+    OSGift = 14,//寮�鏈嶇ぜ鍖�
+    OSTimeLimitGift = 15,//闄愭椂鐗规儬
+    CrossOneVsOneHonor = 17,//鑽h獕鍟嗗簵
+    MysteryStore = 18, //1锛氱绉樺晢搴�
+    default1,
+    default2, //鏃堕棿绫绘椿鍔� - 濡俠oss鍑瘉鐨勫晢搴� 20
+    default3,
+    QCTrainActStore = 306, //楠戝疇鍏绘垚娲诲姩鍟嗗簵
+    CelestialPalaceStore = 308, //浠欏鍟嗗簵锛堝ぉ閬撻榿锛�
+}
+
+public enum LocalSaveStoreType
+{
+    UnionStore, //浠欑洘鍟嗗簵
+
+}
+
diff --git a/Main/System/Store/StoreModel.cs.meta b/Main/System/Store/StoreModel.cs.meta
new file mode 100644
index 0000000..feed344
--- /dev/null
+++ b/Main/System/Store/StoreModel.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 011b7415c126f9e419ee23cbd873c887
+timeCreated: 1505464356
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Utility/Logic.cs b/Main/Utility/Logic.cs
new file mode 100644
index 0000000..6b7ed9e
--- /dev/null
+++ b/Main/Utility/Logic.cs
@@ -0,0 +1,417 @@
+锘縰sing System;
+using System.Collections.Generic;
+
+public class BaseProperty
+{
+    bool m_Dirty = true;
+    public bool dirty {
+        get {
+            return this.m_Dirty;
+        }
+        set {
+            lock (this)
+            {
+                this.m_Dirty = value;
+            }
+        }
+    }
+
+    public BaseProperty()
+    {
+
+    }
+}
+
+public sealed class LogicInt : BaseProperty
+{
+    int m_Value;
+    public int value {
+        get { return this.m_Value; }
+        set {
+            lock (this)
+            {
+                if (this.m_Value != value)
+                {
+                    this.m_Value = value;
+                    this.dirty = true;
+                }
+            }
+        }
+    }
+
+    public LogicInt()
+    {
+    }
+
+    public LogicInt(int value)
+    {
+        this.value = value;
+    }
+
+    public int Fetch()
+    {
+        this.dirty = false;
+        return this.m_Value;
+    }
+
+}
+
+public sealed class LogicFloat : BaseProperty
+{
+    float m_Value;
+    public float value {
+        get { return this.m_Value; }
+        set {
+            lock (this)
+            {
+                if (this.m_Value != value)
+                {
+                    this.m_Value = value;
+                    this.dirty = true;
+                }
+            }
+        }
+    }
+
+    public LogicFloat()
+    {
+    }
+
+    public LogicFloat(float value)
+    {
+        this.value = value;
+    }
+
+    public float Fetch()
+    {
+        this.dirty = false;
+        return this.m_Value;
+    }
+
+}
+
+public sealed class LogicBool : BaseProperty
+{
+    bool m_Value;
+    public bool value {
+        get { return this.m_Value; }
+        set {
+            lock (this)
+            {
+                if (this.m_Value != value)
+                {
+                    this.m_Value = value;
+                    this.dirty = true;
+                }
+            }
+        }
+    }
+
+    public LogicBool()
+    {
+    }
+
+    public LogicBool(bool value)
+    {
+        this.value = value;
+    }
+
+    public bool Fetch()
+    {
+        this.dirty = false;
+        return this.m_Value;
+    }
+
+}
+
+
+public sealed class LogicString : BaseProperty
+{
+    string m_Value = string.Empty;
+    public string value {
+        get { return this.m_Value; }
+        set {
+            lock (this)
+            {
+                if (this.m_Value != value)
+                {
+                    this.m_Value = value;
+                    this.dirty = true;
+                }
+            }
+        }
+    }
+
+    public LogicString()
+    {
+    }
+
+    public LogicString(string value)
+    {
+        this.value = value;
+    }
+
+    public string Fetch()
+    {
+        this.dirty = false;
+        return this.m_Value;
+    }
+
+}
+
+
+public sealed class LogicLong : BaseProperty
+{
+    long m_Value;
+    public long value {
+        get { return this.m_Value; }
+        set {
+            lock (this)
+            {
+                if (this.m_Value != value)
+                {
+                    this.m_Value = value;
+                    this.dirty = true;
+                }
+            }
+        }
+    }
+
+    public LogicLong()
+    {
+    }
+
+    public LogicLong(long value)
+    {
+        this.value = value;
+    }
+
+    public long Fetch()
+    {
+        this.dirty = false;
+        return this.m_Value;
+    }
+
+}
+
+public sealed class LogicInt2 : BaseProperty
+{
+    Int2 m_Value = Int2.zero;
+    public Int2 value {
+        get { return this.m_Value; }
+        set {
+            lock (this)
+            {
+                if (this.m_Value != value)
+                {
+                    this.m_Value = value;
+                    this.dirty = true;
+                }
+            }
+        }
+    }
+
+    public LogicInt2()
+    {
+    }
+
+    public LogicInt2(Int2 value)
+    {
+        this.value = value;
+    }
+
+    public Int2 Fetch()
+    {
+        this.dirty = false;
+        return this.m_Value;
+    }
+
+}
+
+public sealed class LogicInt3 : BaseProperty
+{
+    Int3 m_Value = Int3.zero;
+    public Int3 value {
+        get { return this.m_Value; }
+        set {
+            lock (this)
+            {
+                if (this.m_Value != value)
+                {
+                    this.m_Value = value;
+                    this.dirty = true;
+                }
+            }
+        }
+    }
+
+    public LogicInt3()
+    {
+    }
+
+    public LogicInt3(Int3 value)
+    {
+        this.value = value;
+    }
+
+    public Int3 Fetch()
+    {
+        this.dirty = false;
+        return this.m_Value;
+    }
+
+}
+
+public sealed class LogicDateTime : BaseProperty
+{
+    DateTime m_Value = DateTime.MinValue;
+    public DateTime value {
+        get { return this.m_Value; }
+        set {
+            lock (this)
+            {
+                if (this.m_Value != value)
+                {
+                    this.m_Value = value;
+                    this.dirty = true;
+                }
+            }
+        }
+    }
+
+    public LogicDateTime()
+    {
+    }
+
+    public LogicDateTime(DateTime value)
+    {
+        this.value = value;
+    }
+
+    public DateTime Fetch()
+    {
+        this.dirty = false;
+        return this.m_Value;
+    }
+
+}
+
+public sealed class LogicEnum<T> : BaseProperty where T : struct
+{
+    T m_Value;
+    public T value {
+        get { return this.m_Value; }
+        set {
+            lock (this)
+            {
+                this.m_Value = value;
+                this.dirty = true;
+            }
+        }
+    }
+
+    public LogicEnum(T value)
+    {
+        if (typeof(Enum) != typeof(T).BaseType)
+        {
+            throw new ArgumentException("鍙傛暟蹇呴』鏄灇涓剧被鍨嬶紒");
+        }
+
+        this.value = value;
+    }
+
+    public T Fetch()
+    {
+        this.dirty = false;
+        return this.m_Value;
+    }
+
+}
+
+public sealed class LogicList<T> : BaseProperty
+{
+    List<T> collect = new List<T>();
+
+    public T this[int index] { get { return this.collect[index]; } }
+
+    public int Count { get { return collect.Count; } }
+
+    public void Add(T element)
+    {
+        collect.Add(element);
+        this.dirty = true;
+    }
+
+    public void AddRange(IList<T> elements)
+    {
+        collect.AddRange(elements);
+        this.dirty = true;
+    }
+
+    public void Remove(T element)
+    {
+        collect.Remove(element);
+        this.dirty = true;
+    }
+
+    public void RemoveAt(int index)
+    {
+        collect.RemoveAt(index);
+        this.dirty = true;
+    }
+
+    public bool Contains(T element)
+    {
+        return collect.Contains(element);
+    }
+
+    public void Clear()
+    {
+        collect.Clear();
+        this.dirty = true;
+    }
+
+    public void Sort(Comparison<T> comparison)
+    {
+        collect.Sort(comparison);
+        this.dirty = true;
+    }
+
+    public List<T> Fetch()
+    {
+        this.dirty = false;
+        return this.collect;
+    }
+
+}
+
+public sealed class LogicStruct<T> : BaseProperty where T : struct
+{
+    T m_Value;
+    public T value {
+        get { return this.m_Value; }
+        set {
+            lock (this)
+            {
+                this.m_Value = value;
+                this.dirty = true;
+            }
+        }
+    }
+
+    public LogicStruct()
+    {
+    }
+
+    public LogicStruct(T value)
+    {
+        this.value = value;
+    }
+
+    public T Fetch()
+    {
+        this.dirty = false;
+        return this.m_Value;
+    }
+
+}
\ No newline at end of file
diff --git a/Main/Utility/Logic.cs.meta b/Main/Utility/Logic.cs.meta
new file mode 100644
index 0000000..0d60f8c
--- /dev/null
+++ b/Main/Utility/Logic.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: faf6a99de5f6e154386b07e2c2f9239e
+timeCreated: 1551234104
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

--
Gitblit v1.8.0