From 4fde46699701b1a8b74b4dab516624852b24a86d Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期一, 23 六月 2025 14:24:50 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_scripts

---
 Main/Config/Configs/DirtyNameConfig.cs.meta                                                             |   11 
 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/Config/Configs/PlayerPropertyConfig.cs                                                             |   62 
 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/Config/Configs/TreasureSetConfig.cs                                                                |  119 
 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/Config/Configs/PlayerPropertyConfig.cs.meta                                                        |   11 
 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/Redpoint/MainRedDot.cs.meta                                                                 |    0 
 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/Utility/FontUtility.cs                                                                             |    4 
 Main/Core/GameEngine/Player/PlayerDatas.cs                                                              |   85 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA315_tagMCDailyActionCnt.cs.meta            |   11 
 Main/Config/Configs/XBGetItemConfig.cs                                                                  |   53 
 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                                                                         | 1662 +++++
 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/Config/Configs/TreasureCntAwardConfig.cs.meta                                                      |   11 
 Main/Utility/SafeAreaUI.cs                                                                              |    3 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA4_Family/DTCA408_tagGCPyAllFamilyView.cs.meta             |   11 
 Main/System/Recharge/RechargeManager.cs                                                                 |    6 
 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/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/System/Chat/ChatManager.cs                                                                         |   48 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB118_tagMCFacePicInfo.cs.meta                   |   11 
 Main/System/KnapSack/Logic/ItemLogicUtility.cs                                                          |  619 -
 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                                                                    |  551 +
 Main/Config/PartialConfigs/EquipPlaceMapConfig.cs                                                       |   26 
 Main/Core/NetworkPackage/ClientPack/CA6_Family/CA602_tagCMRequesJoinFamily.cs.meta                      |   11 
 Main/Config/Configs/DirtyNameConfig.cs                                                                  |   38 
 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/System/Main/HomeWin.cs.meta                                                                        |   11 
 Main/System/Redpoint/MainRedDot.cs                                                                      |  115 
 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/Config/Configs/EquipPlaceMapConfig.cs                                                              |   41 
 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/Chat/ChatCenter.cs                                                                          |   80 
 Main/System/Equip/EquipSlot.cs                                                                          |   20 
 Main/Utility/EnumHelper.cs                                                                              |    1 
 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/Config/Configs/TreasureItemLibConfig.cs                                                            |   41 
 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/System/KnapSack/VirtualPackManager.cs                                                              |    3 
 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/Config/Configs/TreasureItemLibConfig.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/KnapSack/PackManager.cs                                                                     |  920 ---
 Main/System/Redpoint/RedpointBehaviour.cs                                                               |  213 
 Main/System/PhantasmPavilion/PhantasmPavilionModel.cs                                                   |  893 +++
 Main/Config/Configs/EquipGSParamConfig.cs.meta                                                          |   11 
 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/Config/Configs/EquipGSParamConfig.cs                                                               |  173 
 Main/System/Main/MainWin.cs                                                                             |   81 
 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/System/Task/TaskManager.cs                                                                         |   54 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB120_tagMCZhanlingInfo.cs.meta                  |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB117_tagMCFaceInfo.cs                           |   13 
 Main/Config/Configs/XBGetItemConfig.cs.meta                                                             |   11 
 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/Redpoint/RedpointCenter.cs                                                                  |  244 
 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                                                                            |   49 
 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/System/GeneralConfig/GeneralDefine.cs                                                              | 1368 ++--
 Main/Core/NetworkPackage/ClientPack/CA3_Item/CA310_tagCMBuyItem.cs                                      |   20 
 Main/Config/Configs/TreasureSetConfig.cs.meta                                                           |   11 
 Main/System/Main/HomeWin.cs                                                                             |   62 
 Main/Core/NetworkPackage/ServerPack/HA4_Family/HA403_tagGCFamilyActionInfo.cs.meta                      |   11 
 Main/Main.cs                                                                                            |   19 
 Main/System/PhantasmPavilion/AvatarCell.cs                                                              |  255 
 Main/Config/Configs/TreasureCntAwardConfig.cs                                                           |   47 
 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                                                                                               |  226 
 Main/Core/NetworkPackage/ServerPack/HA8_Item/HA802_tagMCShopItemDayBuyCntInfo.cs.meta                   |   11 
 Main/System/DailyQuest/DailyQuestData.cs.meta                                                           |   11 
 Main/Config/Configs/EquipPlaceMapConfig.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 
 265 files changed, 14,098 insertions(+), 3,352 deletions(-)

diff --git a/Main/Config/ConfigManager.cs b/Main/Config/ConfigManager.cs
index e241fdd..cb9c38e 100644
--- a/Main/Config/ConfigManager.cs
+++ b/Main/Config/ConfigManager.cs
@@ -33,20 +33,28 @@
         isLoadFinished = false;
 
         // 鍔犺浇閰嶇疆鏂囦欢
-        int totalConfigs = 49;
+        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),
             typeof(EffectConfig),
             typeof(EmojiPackConfig),
+            typeof(EquipGSParamConfig),
+            typeof(EquipPlaceMapConfig),
             typeof(FaceConfig),
             typeof(FamilyConfig),
+            typeof(FamilyEmblemConfig),
             typeof(FirstGoldConfig),
             typeof(FuncConfigConfig),
             typeof(FuncOpenLVConfig),
@@ -73,9 +81,8 @@
             typeof(OrderInfoConfig),
             typeof(PlayerFaceConfig),
             typeof(PlayerFacePicConfig),
-            typeof(PlayerFacePicStarConfig),
-            typeof(PlayerFaceStarConfig),
             typeof(PlayerLVConfig),
+            typeof(PlayerPropertyConfig),
             typeof(priorbundleConfig),
             typeof(RichTextMsgReplaceConfig),
             typeof(RuleConfig),
@@ -83,7 +90,11 @@
             typeof(StoreConfig),
             typeof(SuccessConfig),
             typeof(SysInfoConfig),
-            typeof(TitleStarUpConfig)
+            typeof(TitleStarUpConfig),
+            typeof(TreasureCntAwardConfig),
+            typeof(TreasureItemLibConfig),
+            typeof(TreasureSetConfig),
+            typeof(XBGetItemConfig)
         };
 
         // 閫愪釜鍔犺浇閰嶇疆骞舵洿鏂拌繘搴�
@@ -184,6 +195,8 @@
         ClearConfigDictionary<AppointItemConfig>();
         // 娓呯┖ AudioConfig 瀛楀吀
         ClearConfigDictionary<AudioConfig>();
+        // 娓呯┖ ChatBubbleBoxConfig 瀛楀吀
+        ClearConfigDictionary<ChatBubbleBoxConfig>();
         // 娓呯┖ ChestsAwardConfig 瀛楀吀
         ClearConfigDictionary<ChestsAwardConfig>();
         // 娓呯┖ ChestsConfig 瀛楀吀
@@ -192,18 +205,32 @@
         ClearConfigDictionary<CTGConfig>();
         // 娓呯┖ CTGSelectItemConfig 瀛楀吀
         ClearConfigDictionary<CTGSelectItemConfig>();
+        // 娓呯┖ DailyLivenessRewardConfig 瀛楀吀
+        ClearConfigDictionary<DailyLivenessRewardConfig>();
+        // 娓呯┖ DailyQuestConfig 瀛楀吀
+        ClearConfigDictionary<DailyQuestConfig>();
+        // 娓呯┖ DailyQuestOpenTimeConfig 瀛楀吀
+        ClearConfigDictionary<DailyQuestOpenTimeConfig>();
         // 娓呯┖ DienstgradConfig 瀛楀吀
         ClearConfigDictionary<DienstgradConfig>();
+        // 娓呯┖ DirtyNameConfig 瀛楀吀
+        ClearConfigDictionary<DirtyNameConfig>();
         // 娓呯┖ DirtyWordConfig 瀛楀吀
         ClearConfigDictionary<DirtyWordConfig>();
         // 娓呯┖ EffectConfig 瀛楀吀
         ClearConfigDictionary<EffectConfig>();
         // 娓呯┖ EmojiPackConfig 瀛楀吀
         ClearConfigDictionary<EmojiPackConfig>();
+        // 娓呯┖ EquipGSParamConfig 瀛楀吀
+        ClearConfigDictionary<EquipGSParamConfig>();
+        // 娓呯┖ EquipPlaceMapConfig 瀛楀吀
+        ClearConfigDictionary<EquipPlaceMapConfig>();
         // 娓呯┖ FaceConfig 瀛楀吀
         ClearConfigDictionary<FaceConfig>();
         // 娓呯┖ FamilyConfig 瀛楀吀
         ClearConfigDictionary<FamilyConfig>();
+        // 娓呯┖ FamilyEmblemConfig 瀛楀吀
+        ClearConfigDictionary<FamilyEmblemConfig>();
         // 娓呯┖ FirstGoldConfig 瀛楀吀
         ClearConfigDictionary<FirstGoldConfig>();
         // 娓呯┖ FuncConfigConfig 瀛楀吀
@@ -256,12 +283,10 @@
         ClearConfigDictionary<PlayerFaceConfig>();
         // 娓呯┖ PlayerFacePicConfig 瀛楀吀
         ClearConfigDictionary<PlayerFacePicConfig>();
-        // 娓呯┖ PlayerFacePicStarConfig 瀛楀吀
-        ClearConfigDictionary<PlayerFacePicStarConfig>();
-        // 娓呯┖ PlayerFaceStarConfig 瀛楀吀
-        ClearConfigDictionary<PlayerFaceStarConfig>();
         // 娓呯┖ PlayerLVConfig 瀛楀吀
         ClearConfigDictionary<PlayerLVConfig>();
+        // 娓呯┖ PlayerPropertyConfig 瀛楀吀
+        ClearConfigDictionary<PlayerPropertyConfig>();
         // 娓呯┖ priorbundleConfig 瀛楀吀
         ClearConfigDictionary<priorbundleConfig>();
         // 娓呯┖ RichTextMsgReplaceConfig 瀛楀吀
@@ -278,5 +303,13 @@
         ClearConfigDictionary<SysInfoConfig>();
         // 娓呯┖ TitleStarUpConfig 瀛楀吀
         ClearConfigDictionary<TitleStarUpConfig>();
+        // 娓呯┖ TreasureCntAwardConfig 瀛楀吀
+        ClearConfigDictionary<TreasureCntAwardConfig>();
+        // 娓呯┖ TreasureItemLibConfig 瀛楀吀
+        ClearConfigDictionary<TreasureItemLibConfig>();
+        // 娓呯┖ TreasureSetConfig 瀛楀吀
+        ClearConfigDictionary<TreasureSetConfig>();
+        // 娓呯┖ XBGetItemConfig 瀛楀吀
+        ClearConfigDictionary<XBGetItemConfig>();
     }
 }
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/DirtyNameConfig.cs b/Main/Config/Configs/DirtyNameConfig.cs
new file mode 100644
index 0000000..fffd283
--- /dev/null
+++ b/Main/Config/Configs/DirtyNameConfig.cs
@@ -0,0 +1,38 @@
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           Tuesday, June 17, 2025
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class DirtyNameConfig : ConfigBase<int, DirtyNameConfig>
+{
+
+    public int id;
+	public string word;
+
+    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); 
+
+			word = tables[1];
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Config/Configs/DirtyNameConfig.cs.meta b/Main/Config/Configs/DirtyNameConfig.cs.meta
new file mode 100644
index 0000000..60a8a21
--- /dev/null
+++ b/Main/Config/Configs/DirtyNameConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 6da75bc0cae8a5448968ebb2a41cc342
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/Configs/EquipGSParamConfig.cs b/Main/Config/Configs/EquipGSParamConfig.cs
new file mode 100644
index 0000000..426109f
--- /dev/null
+++ b/Main/Config/Configs/EquipGSParamConfig.cs
@@ -0,0 +1,173 @@
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           2025骞�6鏈�17鏃�
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class EquipGSParamConfig : ConfigBase<int, EquipGSParamConfig>
+{
+
+    public int ID;
+	public int EquipClass;
+	public int EquipColor;
+	public int IsSuit;
+	public int Star;
+	public int BaseEquipMaxHPAddPerC;
+	public int BaseEquipAtkAddPerC;
+	public int SuperHitC;
+	public int SuperHitPerC;
+	public int LuckyHitRateC;
+	public int LuckyHitRateReduceC;
+	public int LuckPerC;
+	public int PerLVAtkC;
+	public int PerLVMaxHPC;
+	public int DropMoneyPerC;
+	public int SuperHitReduceC;
+	public int SuperHitRateReduceC;
+	public int HitC;
+	public int MissC;
+	public int PetDamPerC;
+	public int MaxHPPerC;
+	public int AtkPerC;
+	public int SkillAtkRateC;
+	public int SkillAtkRateReduceC;
+	public int SkillAddPerAC;
+	public int SkillAddPerBC;
+	public int SkillAddPerCC;
+	public int SkillAddPerDC;
+	public int SkillAddPerEC;
+	public int SkillAddPerFC;
+	public int SkillAddPerGC;
+	public int SkillReducePerAC;
+	public int SkillReducePerBC;
+	public int SkillReducePerCC;
+	public int SkillReducePerDC;
+	public int SkillReducePerEC;
+	public int SkillReducePerFC;
+	public int SkillReducePerGC;
+	public int ReduceSkillCDPerC;
+	public int LuckyHitPerC;
+	public int FaintDefRateC;
+	public int SuperHitRateC;
+	public int IgnoreDefRateC;
+	public int IgnoreDefRateReduceC;
+	public int ProDefPerC;
+	public int FinalHurtPerC;
+	public int FinalHurtReducePerC;
+
+    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 EquipClass); 
+
+			int.TryParse(tables[2],out EquipColor); 
+
+			int.TryParse(tables[3],out IsSuit); 
+
+			int.TryParse(tables[4],out Star); 
+
+			int.TryParse(tables[5],out BaseEquipMaxHPAddPerC); 
+
+			int.TryParse(tables[6],out BaseEquipAtkAddPerC); 
+
+			int.TryParse(tables[7],out SuperHitC); 
+
+			int.TryParse(tables[8],out SuperHitPerC); 
+
+			int.TryParse(tables[9],out LuckyHitRateC); 
+
+			int.TryParse(tables[10],out LuckyHitRateReduceC); 
+
+			int.TryParse(tables[11],out LuckPerC); 
+
+			int.TryParse(tables[12],out PerLVAtkC); 
+
+			int.TryParse(tables[13],out PerLVMaxHPC); 
+
+			int.TryParse(tables[14],out DropMoneyPerC); 
+
+			int.TryParse(tables[15],out SuperHitReduceC); 
+
+			int.TryParse(tables[16],out SuperHitRateReduceC); 
+
+			int.TryParse(tables[17],out HitC); 
+
+			int.TryParse(tables[18],out MissC); 
+
+			int.TryParse(tables[19],out PetDamPerC); 
+
+			int.TryParse(tables[20],out MaxHPPerC); 
+
+			int.TryParse(tables[21],out AtkPerC); 
+
+			int.TryParse(tables[22],out SkillAtkRateC); 
+
+			int.TryParse(tables[23],out SkillAtkRateReduceC); 
+
+			int.TryParse(tables[24],out SkillAddPerAC); 
+
+			int.TryParse(tables[25],out SkillAddPerBC); 
+
+			int.TryParse(tables[26],out SkillAddPerCC); 
+
+			int.TryParse(tables[27],out SkillAddPerDC); 
+
+			int.TryParse(tables[28],out SkillAddPerEC); 
+
+			int.TryParse(tables[29],out SkillAddPerFC); 
+
+			int.TryParse(tables[30],out SkillAddPerGC); 
+
+			int.TryParse(tables[31],out SkillReducePerAC); 
+
+			int.TryParse(tables[32],out SkillReducePerBC); 
+
+			int.TryParse(tables[33],out SkillReducePerCC); 
+
+			int.TryParse(tables[34],out SkillReducePerDC); 
+
+			int.TryParse(tables[35],out SkillReducePerEC); 
+
+			int.TryParse(tables[36],out SkillReducePerFC); 
+
+			int.TryParse(tables[37],out SkillReducePerGC); 
+
+			int.TryParse(tables[38],out ReduceSkillCDPerC); 
+
+			int.TryParse(tables[39],out LuckyHitPerC); 
+
+			int.TryParse(tables[40],out FaintDefRateC); 
+
+			int.TryParse(tables[41],out SuperHitRateC); 
+
+			int.TryParse(tables[42],out IgnoreDefRateC); 
+
+			int.TryParse(tables[43],out IgnoreDefRateReduceC); 
+
+			int.TryParse(tables[44],out ProDefPerC); 
+
+			int.TryParse(tables[45],out FinalHurtPerC); 
+
+			int.TryParse(tables[46],out FinalHurtReducePerC); 
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Config/Configs/EquipGSParamConfig.cs.meta b/Main/Config/Configs/EquipGSParamConfig.cs.meta
new file mode 100644
index 0000000..142c67b
--- /dev/null
+++ b/Main/Config/Configs/EquipGSParamConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f510c442e570ac446af81fa008cc0367
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/Configs/EquipPlaceMapConfig.cs b/Main/Config/Configs/EquipPlaceMapConfig.cs
new file mode 100644
index 0000000..f0fa345
--- /dev/null
+++ b/Main/Config/Configs/EquipPlaceMapConfig.cs
@@ -0,0 +1,41 @@
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           2025骞�6鏈�17鏃�
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class EquipPlaceMapConfig : ConfigBase<int, EquipPlaceMapConfig>
+{
+
+    public int PackIndex;
+	public int LV;
+	public int EquipPlace;
+
+    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 PackIndex); 
+
+			int.TryParse(tables[1],out LV); 
+
+			int.TryParse(tables[2],out EquipPlace); 
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Config/Configs/EquipPlaceMapConfig.cs.meta b/Main/Config/Configs/EquipPlaceMapConfig.cs.meta
new file mode 100644
index 0000000..2389729
--- /dev/null
+++ b/Main/Config/Configs/EquipPlaceMapConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 695a587191bcf194ab9c1d32d07102e2
+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/Configs/PlayerPropertyConfig.cs b/Main/Config/Configs/PlayerPropertyConfig.cs
new file mode 100644
index 0000000..856601f
--- /dev/null
+++ b/Main/Config/Configs/PlayerPropertyConfig.cs
@@ -0,0 +1,62 @@
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           2025骞�6鏈�17鏃�
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class PlayerPropertyConfig : ConfigBase<int, PlayerPropertyConfig>
+{
+
+    public int ID;
+	public string Name;
+	public string ShowName;
+	public int ISPercentage;
+	public int type;
+	public int decimalCount;
+	public int showType;
+	public int showSequence;
+	public string desc;
+	public string Parameter;
+
+    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];
+
+			ShowName = tables[2];
+
+			int.TryParse(tables[3],out ISPercentage); 
+
+			int.TryParse(tables[4],out type); 
+
+			int.TryParse(tables[5],out decimalCount); 
+
+			int.TryParse(tables[6],out showType); 
+
+			int.TryParse(tables[7],out showSequence); 
+
+			desc = tables[8];
+
+			Parameter = tables[9];
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Config/Configs/PlayerPropertyConfig.cs.meta b/Main/Config/Configs/PlayerPropertyConfig.cs.meta
new file mode 100644
index 0000000..d17edae
--- /dev/null
+++ b/Main/Config/Configs/PlayerPropertyConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 453d28b14c276df41bd363b2054a0477
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/Configs/TreasureCntAwardConfig.cs b/Main/Config/Configs/TreasureCntAwardConfig.cs
new file mode 100644
index 0000000..0f7912d
--- /dev/null
+++ b/Main/Config/Configs/TreasureCntAwardConfig.cs
@@ -0,0 +1,47 @@
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           2025骞�6鏈�17鏃�
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class TreasureCntAwardConfig : ConfigBase<int, TreasureCntAwardConfig>
+{
+
+    public int ID;
+	public int TreasureType;
+	public int NeedTreasureCnt;
+	public int AwardIndex;
+	public int[][] AwardItemList;
+
+    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 TreasureType); 
+
+			int.TryParse(tables[2],out NeedTreasureCnt); 
+
+			int.TryParse(tables[3],out AwardIndex); 
+
+			AwardItemList = JsonMapper.ToObject<int[][]>(tables[4].Replace("(", "[").Replace(")", "]")); 
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Config/Configs/TreasureCntAwardConfig.cs.meta b/Main/Config/Configs/TreasureCntAwardConfig.cs.meta
new file mode 100644
index 0000000..4415b4d
--- /dev/null
+++ b/Main/Config/Configs/TreasureCntAwardConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 571161a2e6c006a4390fbde04e5986cf
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/Configs/TreasureItemLibConfig.cs b/Main/Config/Configs/TreasureItemLibConfig.cs
new file mode 100644
index 0000000..4d612b5
--- /dev/null
+++ b/Main/Config/Configs/TreasureItemLibConfig.cs
@@ -0,0 +1,41 @@
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           2025骞�6鏈�17鏃�
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class TreasureItemLibConfig : ConfigBase<int, TreasureItemLibConfig>
+{
+
+    public int LibID;
+	public int ItemID;
+	public int ItemCount;
+
+    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 LibID); 
+
+			int.TryParse(tables[1],out ItemID); 
+
+			int.TryParse(tables[2],out ItemCount); 
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Config/Configs/TreasureItemLibConfig.cs.meta b/Main/Config/Configs/TreasureItemLibConfig.cs.meta
new file mode 100644
index 0000000..43dbc25
--- /dev/null
+++ b/Main/Config/Configs/TreasureItemLibConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 90292bb76558b9a4e87e7ef216522f46
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/Configs/TreasureSetConfig.cs b/Main/Config/Configs/TreasureSetConfig.cs
new file mode 100644
index 0000000..afdf86c
--- /dev/null
+++ b/Main/Config/Configs/TreasureSetConfig.cs
@@ -0,0 +1,119 @@
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           2025骞�6鏈�17鏃�
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class TreasureSetConfig : ConfigBase<int, TreasureSetConfig>
+{
+
+    public int TreasureType;
+	public int PackType;
+	public int DailyMaxCount;
+	public int DailyFreeCount;
+	public int[] TreasureCountList;
+	public int CostItemID;
+	public int[] CostItemCountList;
+	public int CostMoneyType;
+	public int[] CostMoneyList;
+	public int EnsureCount;
+	public int OnceLucky;
+	public int FullLucky;
+	public int LuckyGridNum;
+	public string GridNumMaxLimitInfo;
+	public int AwardMoneyType;
+	public int AwardMoneyValue;
+	public string ProbabilityDisplay;
+
+    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 TreasureType); 
+
+			int.TryParse(tables[1],out PackType); 
+
+			int.TryParse(tables[2],out DailyMaxCount); 
+
+			int.TryParse(tables[3],out DailyFreeCount); 
+
+			if (tables[4].Contains("["))
+			{
+				TreasureCountList = JsonMapper.ToObject<int[]>(tables[4]);
+			}
+			else
+			{
+				string[] TreasureCountListStringArray = tables[4].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				TreasureCountList = new int[TreasureCountListStringArray.Length];
+				for (int i=0;i<TreasureCountListStringArray.Length;i++)
+				{
+					 int.TryParse(TreasureCountListStringArray[i],out TreasureCountList[i]);
+				}
+			}
+
+			int.TryParse(tables[5],out CostItemID); 
+
+			if (tables[6].Contains("["))
+			{
+				CostItemCountList = JsonMapper.ToObject<int[]>(tables[6]);
+			}
+			else
+			{
+				string[] CostItemCountListStringArray = tables[6].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				CostItemCountList = new int[CostItemCountListStringArray.Length];
+				for (int i=0;i<CostItemCountListStringArray.Length;i++)
+				{
+					 int.TryParse(CostItemCountListStringArray[i],out CostItemCountList[i]);
+				}
+			}
+
+			int.TryParse(tables[7],out CostMoneyType); 
+
+			if (tables[8].Contains("["))
+			{
+				CostMoneyList = JsonMapper.ToObject<int[]>(tables[8]);
+			}
+			else
+			{
+				string[] CostMoneyListStringArray = tables[8].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				CostMoneyList = new int[CostMoneyListStringArray.Length];
+				for (int i=0;i<CostMoneyListStringArray.Length;i++)
+				{
+					 int.TryParse(CostMoneyListStringArray[i],out CostMoneyList[i]);
+				}
+			}
+
+			int.TryParse(tables[9],out EnsureCount); 
+
+			int.TryParse(tables[10],out OnceLucky); 
+
+			int.TryParse(tables[11],out FullLucky); 
+
+			int.TryParse(tables[12],out LuckyGridNum); 
+
+			GridNumMaxLimitInfo = tables[13];
+
+			int.TryParse(tables[14],out AwardMoneyType); 
+
+			int.TryParse(tables[15],out AwardMoneyValue); 
+
+			ProbabilityDisplay = tables[16];
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Config/Configs/TreasureSetConfig.cs.meta b/Main/Config/Configs/TreasureSetConfig.cs.meta
new file mode 100644
index 0000000..e5a6a20
--- /dev/null
+++ b/Main/Config/Configs/TreasureSetConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 6b9694e1e5e82f14b803352d470ba768
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/Configs/XBGetItemConfig.cs b/Main/Config/Configs/XBGetItemConfig.cs
new file mode 100644
index 0000000..5c947d4
--- /dev/null
+++ b/Main/Config/Configs/XBGetItemConfig.cs
@@ -0,0 +1,53 @@
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           2025骞�6鏈�17鏃�
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class XBGetItemConfig : ConfigBase<int, XBGetItemConfig>
+{
+
+    public int ID;
+	public int TreasureType;
+	public int MinLV;
+	public string GridItemInfo;
+	public string GridLibInfo;
+	public string JobItemList;
+	public int[][] GridItemRateList1;
+
+    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 TreasureType); 
+
+			int.TryParse(tables[2],out MinLV); 
+
+			GridItemInfo = tables[3];
+
+			GridLibInfo = tables[4];
+
+			JobItemList = tables[5];
+
+			GridItemRateList1 = JsonMapper.ToObject<int[][]>(tables[6].Replace("(", "[").Replace(")", "]")); 
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Config/Configs/XBGetItemConfig.cs.meta b/Main/Config/Configs/XBGetItemConfig.cs.meta
new file mode 100644
index 0000000..91f5b07
--- /dev/null
+++ b/Main/Config/Configs/XBGetItemConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: a26f83764daa3744d8fac6faefefca9c
+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/Chat/ChatCenter.cs b/Main/System/Chat/ChatCenter.cs
index d01560b..2552fe7 100644
--- a/Main/System/Chat/ChatCenter.cs
+++ b/Main/System/Chat/ChatCenter.cs
@@ -49,8 +49,8 @@
         void ParseConfig()
         {
             chatCharacterLimit = int.Parse(FuncConfigConfig.Get("MessageLength").Numerical1);
-            var _funcCfg = FuncConfigConfig.Get("BugleItem");
-            bugleItem = int.Parse(_funcCfg.Numerical1);
+            // var _funcCfg = FuncConfigConfig.Get("BugleItem");
+            // bugleItem = int.Parse(_funcCfg.Numerical1);
             chatChannels = new List<ChatInfoType>();
             chatChannels.Add(ChatInfoType.System);
             chatChannels.Add(ChatInfoType.World);
@@ -63,16 +63,16 @@
             chatChannels.Add(ChatInfoType.Friend);
             chatChannels.Add(ChatInfoType.default1);
 
-            var config = FuncConfigConfig.Get("ClientChatBan");
-            banCheckSecond = int.Parse(config.Numerical1);
-            repeatCountLimit = int.Parse(config.Numerical2);
-            maliceCheckCount = int.Parse(config.Numerical3);
-            maliceLimitCount = int.Parse(config.Numerical4);
-            var array = ConfigParse.GetMultipleStr<int>(config.Numerical5);
-            singleBanSecond = array[0];
-            maxBanSecond = array[1];
+            // var config = FuncConfigConfig.Get("ClientChatBan");
+            // banCheckSecond = int.Parse(config.Numerical1);
+            // repeatCountLimit = int.Parse(config.Numerical2);
+            // maliceCheckCount = int.Parse(config.Numerical3);
+            // maliceLimitCount = int.Parse(config.Numerical4);
+            // var array = ConfigParse.GetMultipleStr<int>(config.Numerical5);
+            // singleBanSecond = array[0];
+            // maxBanSecond = array[1];
 
-            config = FuncConfigConfig.Get("LocalChatHistoryCount");
+            var config = FuncConfigConfig.Get("LocalChatHistoryCount");
             if (config != null)
             {
                 LocalChatHistory.localSaveCount = int.Parse(config.Numerical1);
@@ -479,36 +479,38 @@
         public int singleBanSecond = 1;
         public int maxBanSecond = 1;
 
-        public int banSecond {
-            get { return LocalSave.GetInt("ClientChatBanSecond", 0); }
-            set {
-                LocalSave.SetInt("ClientChatBanSecond", value);
-            }
-        }
+    public int banSecond;
+        // {
+        //     get { return LocalSave.GetInt("ClientChatBanSecond", 0); }
+        //     set {
+        //         LocalSave.SetInt("ClientChatBanSecond", value);
+        //     }
+        // }
 
         private int[] banTimeArray = new int[6];
-        private DateTime bandTime {
-            get {
-                var timeArray = LocalSave.GetIntArray("ClientChatBanTime");
-                if (null == timeArray)
-                {
-                    return TimeUtility.OriginalTime;
-                }
-                else
-                {
-                    return new DateTime(timeArray[0], timeArray[1], timeArray[2], timeArray[3], timeArray[4], timeArray[5]);
-                }
-            }
-            set {
-                banTimeArray[0] = value.Year;
-                banTimeArray[1] = value.Month;
-                banTimeArray[2] = value.Day;
-                banTimeArray[3] = value.Hour;
-                banTimeArray[4] = value.Minute;
-                banTimeArray[5] = value.Second;
-                LocalSave.SetIntArray("ClientChatBanTime", banTimeArray);
-            }
-        }
+    private DateTime bandTime;
+        // {
+        //     get {
+        //         var timeArray = LocalSave.GetIntArray("ClientChatBanTime");
+        //         if (null == timeArray)
+        //         {
+        //             return TimeUtility.OriginalTime;
+        //         }
+        //         else
+        //         {
+        //             return new DateTime(timeArray[0], timeArray[1], timeArray[2], timeArray[3], timeArray[4], timeArray[5]);
+        //         }
+        //     }
+        //     set {
+        //         banTimeArray[0] = value.Year;
+        //         banTimeArray[1] = value.Month;
+        //         banTimeArray[2] = value.Day;
+        //         banTimeArray[3] = value.Hour;
+        //         banTimeArray[4] = value.Minute;
+        //         banTimeArray[5] = value.Second;
+        //         LocalSave.SetIntArray("ClientChatBanTime", banTimeArray);
+        //     }
+        // }
 
         public void ChatClientBan()
         {
diff --git a/Main/System/Chat/ChatManager.cs b/Main/System/Chat/ChatManager.cs
index a1c46b2..105050c 100644
--- a/Main/System/Chat/ChatManager.cs
+++ b/Main/System/Chat/ChatManager.cs
@@ -155,8 +155,8 @@
         presentChatType = ChatInfoType.World;
         IsExtentOpen = false;
 
-        var _funcCfg = FuncConfigConfig.Get("BugleItem");
-        BugleItem = int.Parse(_funcCfg.Numerical1);
+        // var _funcCfg = FuncConfigConfig.Get("BugleItem");
+        // BugleItem = int.Parse(_funcCfg.Numerical1);
 
         DTC0102_tagCDBPlayer.switchAccountEvent += SwitchAccountEvent;
         // TODO YYL
@@ -165,28 +165,28 @@
 
         InitChatRedpoints();
 
-        FuncConfigConfig _cfg = FuncConfigConfig.Get("RandomWord");
-        try
-        {
-            achievementRandoms.Add(ChatInfoType.World, new List<string>(ConfigParse.GetMultipleStr(_cfg.Numerical1)));
-            achievementRandoms.Add(ChatInfoType.Fairy, new List<string>(ConfigParse.GetMultipleStr(_cfg.Numerical2)));
-            var json = LitJson.JsonMapper.ToObject(_cfg.Numerical3);
-            foreach (var key in json.Keys)
-            {
-                var type = int.Parse(key);
-                m_TaskRandomChats.Add(type, new List<string>(LitJson.JsonMapper.ToObject<string[]>(json[key].ToJson())));
-            }
-            assistThankLanguages.AddRange(ConfigParse.GetMultipleStr(_cfg.Numerical4));
-            if (!string.IsNullOrEmpty(_cfg.Numerical5))
-            {
-                var levelArray = ConfigParse.GetMultipleStr<int>(_cfg.Numerical5);
-                assistThankLevelLimit = new Int2(levelArray[0], levelArray[1]);
-            }
-        }
-        catch (Exception e)
-        {
-            Debug.LogError(e.Message);
-        }
+        // FuncConfigConfig _cfg = FuncConfigConfig.Get("RandomWord");
+        // try
+        // {
+        //     achievementRandoms.Add(ChatInfoType.World, new List<string>(ConfigParse.GetMultipleStr(_cfg.Numerical1)));
+        //     achievementRandoms.Add(ChatInfoType.Fairy, new List<string>(ConfigParse.GetMultipleStr(_cfg.Numerical2)));
+        //     var json = LitJson.JsonMapper.ToObject(_cfg.Numerical3);
+        //     foreach (var key in json.Keys)
+        //     {
+        //         var type = int.Parse(key);
+        //         m_TaskRandomChats.Add(type, new List<string>(LitJson.JsonMapper.ToObject<string[]>(json[key].ToJson())));
+        //     }
+        //     assistThankLanguages.AddRange(ConfigParse.GetMultipleStr(_cfg.Numerical4));
+        //     if (!string.IsNullOrEmpty(_cfg.Numerical5))
+        //     {
+        //         var levelArray = ConfigParse.GetMultipleStr<int>(_cfg.Numerical5);
+        //         assistThankLevelLimit = new Int2(levelArray[0], levelArray[1]);
+        //     }
+        // }
+        // catch (Exception e)
+        // {
+        //     Debug.LogError(e.Message);
+        // }
     }
 
     private void PlayerLoginOkEvent()
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..6a50c74
--- /dev/null
+++ b/Main/System/FairyUnion/FairyModel.cs
@@ -0,0 +1,551 @@
+锘縰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 fairyCreateTimes { get; private set; }
+    void ParseConfig()
+    {
+        var config = FuncConfigConfig.Get("CreateFamily");
+        createFairyCost = 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..1d68e16
--- /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/GeneralConfig/GeneralDefine.cs b/Main/System/GeneralConfig/GeneralDefine.cs
index fe7b8c9..5051e0d 100644
--- a/Main/System/GeneralConfig/GeneralDefine.cs
+++ b/Main/System/GeneralConfig/GeneralDefine.cs
@@ -246,727 +246,727 @@
     {
         try
         {
-            equipStarUpAmendFactor = GetIntArray("EquipStarRate")[0];
-            equipStarDownAmendFactor = GetIntArray("EquipStarRate")[1];
+            // equipStarUpAmendFactor = GetIntArray("EquipStarRate")[0];
+            // equipStarDownAmendFactor = GetIntArray("EquipStarRate")[1];
 
-            normalEquipStarUpgradeRateFloor = GetIntArray("EquipStarRate", 2)[0];
-            normalEquipStarUpgradeRateCeiling = GetIntArray("EquipStarRate", 2)[1];
+            // normalEquipStarUpgradeRateFloor = GetIntArray("EquipStarRate", 2)[0];
+            // normalEquipStarUpgradeRateCeiling = GetIntArray("EquipStarRate", 2)[1];
 
-            suitEquipStarUpgradeRateFloor = GetIntArray("EquipStarRate", 3)[0];
-            suitEquipStarUpgradeRateCeiling = GetIntArray("EquipStarRate", 3)[1];
+            // suitEquipStarUpgradeRateFloor = GetIntArray("EquipStarRate", 3)[0];
+            // suitEquipStarUpgradeRateCeiling = GetIntArray("EquipStarRate", 3)[1];
 
-            BlueEquipJumpLevel = GetInt("BlueEquipJumpLevel");
-            initDepotGridCount = GetInt("InitDepotCellCount");
-            maxDepotGridCount = GetInt("MaxDepotCellCount");
-            initBagGridCount = GetInt("InitBagCellCount");
-            maxBagGridCount = GetInt("MaxBagCellCount");
-            maxXBGridCount = GetInt("TreasureSet", 3);
+            // BlueEquipJumpLevel = GetInt("BlueEquipJumpLevel");
+            // initDepotGridCount = GetInt("InitDepotCellCount");
+            // maxDepotGridCount = GetInt("MaxDepotCellCount");
+            // initBagGridCount = GetInt("InitBagCellCount");
+            // maxBagGridCount = GetInt("MaxBagCellCount");
+            // maxXBGridCount = GetInt("TreasureSet", 3);
 
-            CompareEquipPlaces = GetIntArray("EquipUpType");
-            playerMaxLevel = GetInt("PlayerMaxLV");
-            kylinHomeCollectItems = GetIntArray("KirinNpc", 2);
-            dailyQuestOpenTime = GetTimeArray("ActionTime", 1);
-            flyBootItemId = GetInt("TransportPay");
-            flyBootItemMoney = GetInt("TransportPay", 2);
-            teamReadyTime = GetInt("TeamReadyTime");
-            playerNameLength = GetInt("RoleNameLength");
-            elderGodAreaAngerTotal = GetInt("AngryAdd", 4);
-            petRandomSpeak = GetFloat("PetRandomSpeak");
-            guardDungeonCageNPCID = GetInt("GuardFBCageNPCID");
-            guardBubbleInterval = GetFloat("GuardFBCageNPCID", 3);
-            autoRideHorse = GetFloat("AutoRideHorseTime") * Constants.F_DELTA;
-            moneyDisplayIds = ConfigParse.GetDic<int, int>(GetInputString("MoneyDisplayModel", 1));
-            expDisplayId = GetInt("MoneyDisplayModel", 2);
-            openJobs = GetIntArray("OpenJob");
-            xpGuideDelay = GetFloat("GuideConfig");
-            xpGuideDuration = GetFloat("GuideConfig", 2);
-            ResetComAtkTime = GetFloat("AtkWaitingTime");
-            autoOnHookMap = new List<int>(GetIntArray("AutoOnHookMap"));
-            GuardianPickUpID = new List<int>(GetIntArray("GuardianPickUpID"));
-            ArenaSetList = new List<int>(GetIntArray("ArenaSet"));
-            RotateSpeed = GetInt("RoleTurnedAngle");
-            CloseNpcDist = GetFloat("ConversationDistanc", 2);
-            FarawayNpcDist = GetFloat("ConversationDistanc");
-            SpecialNpcIDs = new List<int>(GetIntArray("SpecialCollectNpcs", 1));
-            PetDanceInterval = GetInt("PetDanceInterval") * Constants.F_GAMMA;
-            FuncNpcDanceInterval = GetInt("PetDanceInterval", 2) * Constants.F_GAMMA;
-            ruinsTranscriptMapId = GetInt("SpRewardMapID");
-            EarlierGetTreasure = new List<int>(GetIntArray("EarlierGetTreasure"));
-            BossSound = GetInt("BossSound");
-            PlayBossHurtInterval = GetFloat("BossSound", 2);
-            var jobHeadPortraitConfig1 = FuncConfigConfig.Get("Job1Head");
-            jobHeadPortrait[1] = ConfigParse.GetDic<int, string>(jobHeadPortraitConfig1.Numerical1);
-            otherjobHeadPortrait[1] = ConfigParse.GetDic<int, string>(jobHeadPortraitConfig1.Numerical2);
+            // CompareEquipPlaces = GetIntArray("EquipUpType");
+            // playerMaxLevel = GetInt("PlayerMaxLV");
+            // kylinHomeCollectItems = GetIntArray("KirinNpc", 2);
+            // dailyQuestOpenTime = GetTimeArray("ActionTime", 1);
+            // flyBootItemId = GetInt("TransportPay");
+            // flyBootItemMoney = GetInt("TransportPay", 2);
+            // teamReadyTime = GetInt("TeamReadyTime");
+            // playerNameLength = GetInt("RoleNameLength");
+            // elderGodAreaAngerTotal = GetInt("AngryAdd", 4);
+            // petRandomSpeak = GetFloat("PetRandomSpeak");
+            // guardDungeonCageNPCID = GetInt("GuardFBCageNPCID");
+            // guardBubbleInterval = GetFloat("GuardFBCageNPCID", 3);
+            // autoRideHorse = GetFloat("AutoRideHorseTime") * Constants.F_DELTA;
+            // moneyDisplayIds = ConfigParse.GetDic<int, int>(GetInputString("MoneyDisplayModel", 1));
+            // expDisplayId = GetInt("MoneyDisplayModel", 2);
+            // openJobs = GetIntArray("OpenJob");
+            // xpGuideDelay = GetFloat("GuideConfig");
+            // xpGuideDuration = GetFloat("GuideConfig", 2);
+            // ResetComAtkTime = GetFloat("AtkWaitingTime");
+            // autoOnHookMap = new List<int>(GetIntArray("AutoOnHookMap"));
+            // GuardianPickUpID = new List<int>(GetIntArray("GuardianPickUpID"));
+            // ArenaSetList = new List<int>(GetIntArray("ArenaSet"));
+            // RotateSpeed = GetInt("RoleTurnedAngle");
+            // CloseNpcDist = GetFloat("ConversationDistanc", 2);
+            // FarawayNpcDist = GetFloat("ConversationDistanc");
+            // SpecialNpcIDs = new List<int>(GetIntArray("SpecialCollectNpcs", 1));
+            // PetDanceInterval = GetInt("PetDanceInterval") * Constants.F_GAMMA;
+            // FuncNpcDanceInterval = GetInt("PetDanceInterval", 2) * Constants.F_GAMMA;
+            // ruinsTranscriptMapId = GetInt("SpRewardMapID");
+            // EarlierGetTreasure = new List<int>(GetIntArray("EarlierGetTreasure"));
+            // BossSound = GetInt("BossSound");
+            // PlayBossHurtInterval = GetFloat("BossSound", 2);
+            // var jobHeadPortraitConfig1 = FuncConfigConfig.Get("Job1Head");
+            // jobHeadPortrait[1] = ConfigParse.GetDic<int, string>(jobHeadPortraitConfig1.Numerical1);
+            // otherjobHeadPortrait[1] = ConfigParse.GetDic<int, string>(jobHeadPortraitConfig1.Numerical2);
 
-            var jobHeadPortraitConfig2 = FuncConfigConfig.Get("Job2Head");
-            jobHeadPortrait[2] = ConfigParse.GetDic<int, string>(jobHeadPortraitConfig2.Numerical1);
-            otherjobHeadPortrait[2] = ConfigParse.GetDic<int, string>(jobHeadPortraitConfig2.Numerical2);
+            // var jobHeadPortraitConfig2 = FuncConfigConfig.Get("Job2Head");
+            // jobHeadPortrait[2] = ConfigParse.GetDic<int, string>(jobHeadPortraitConfig2.Numerical1);
+            // otherjobHeadPortrait[2] = ConfigParse.GetDic<int, string>(jobHeadPortraitConfig2.Numerical2);
 
-            var jobHeadPortraitConfig3 = FuncConfigConfig.Get("Job3Head");
-            jobHeadPortrait[3] = ConfigParse.GetDic<int, string>(jobHeadPortraitConfig3.Numerical1);
-            otherjobHeadPortrait[3] = ConfigParse.GetDic<int, string>(jobHeadPortraitConfig3.Numerical2);
+            // var jobHeadPortraitConfig3 = FuncConfigConfig.Get("Job3Head");
+            // jobHeadPortrait[3] = ConfigParse.GetDic<int, string>(jobHeadPortraitConfig3.Numerical1);
+            // otherjobHeadPortrait[3] = ConfigParse.GetDic<int, string>(jobHeadPortraitConfig3.Numerical2);
 
-            bossWearyValues = ConfigParse.GetDic<int, int>(GetInputString("KillBossCntLimit", 2));
-            wingEquipLimits = ConfigParse.GetDic<int, int>(GetInputString("WingRealmLimit", 1));
-            int i = 0;
-            int[] equipPlaces = GetIntArray("EquipArea", 1);
-            string[] equipPlacesNames = GetStringArray("EquipArea", 2);
-            equipPlaceNameDict = new Dictionary<int, string>();
-            for (i = 0; i < equipPlaces.Length; i++)
-            {
-                if (!equipPlaceNameDict.ContainsKey(equipPlaces[i]))
-                {
-                    equipPlaceNameDict.Add(equipPlaces[i], equipPlacesNames[i]);
-                }
-                else
-                {
-                    Debug.LogError("EquipArea : 瑁呭浣嶇疆閲嶅");
-                }
-            }
-            var _trailBossJson = LitJson.JsonMapper.ToObject(GetInputString("MuneKadoTrialBossHead", 1));
-            trailBossHeadIcons = new Dictionary<int, string>();
-            foreach (var _key in _trailBossJson.Keys)
-            {
-                var _npcId = int.Parse(_key);
-                if (!trailBossHeadIcons.ContainsKey(_npcId))
-                {
-                    trailBossHeadIcons.Add(_npcId, _trailBossJson[_key].ToString());
-                }
-            }
-            FuncConfigConfig HorseTrainConfig = FuncConfigConfig.Get("HorseTrain");
-            HorseTrainIDList = LitJson.JsonMapper.ToObject<int[]>(HorseTrainConfig.Numerical1);
-            FuncConfigConfig PetTrainConfig = FuncConfigConfig.Get("PetUpItem");
-            PetTrainIDList = LitJson.JsonMapper.ToObject<int[]>(PetTrainConfig.Numerical3);
-            FuncConfigConfig LingQiTrainConfig = FuncConfigConfig.Get("HorseTrain");
-            var LingQiTrainJson = LitJson.JsonMapper.ToObject(GetInputString("LingQiTrain", 1));
-            LingQiTrainIDList = new Dictionary<int, List<int>>();
-            foreach (var key in LingQiTrainJson.Keys)
-            {
-                int attrId = int.Parse(key);
-                var skillIds = LingQiTrainJson[key];
-                foreach (var skillId in skillIds)
-                {
-                    int id = int.Parse(skillId.ToString());
-                    if (!LingQiTrainIDList.ContainsKey(attrId))
-                    {
-                        List<int> list = new List<int>();
-                        list.Add(id);
-                        LingQiTrainIDList.Add(attrId, list);
-                    }
-                    else
-                    {
-                        LingQiTrainIDList[attrId].Add(id);
-                    }
-                }
-
-            }
-
-            var skillPlusAttrIDJson = LitJson.JsonMapper.ToObject(GetInputString("SkillPlusAttrID", 2));
-            skillAttrIDDict = new Dictionary<int, List<int>>();
-            foreach (var key in skillPlusAttrIDJson.Keys)
-            {
-                int attrId = int.Parse(key);
-                var skillIds = skillPlusAttrIDJson[key];
-                foreach (var skillId in skillIds)
-                {
-                    int id = int.Parse(skillId.ToString());
-                    if (!skillAttrIDDict.ContainsKey(id))
-                    {
-                        List<int> list = new List<int>();
-                        list.Add(attrId);
-                        skillAttrIDDict.Add(id, list);
-                    }
-                    else
-                    {
-                        skillAttrIDDict[id].Add(attrId);
-                    }
-                }
-
-            }
-            
-            var BossAssistAwardJson = LitJson.JsonMapper.ToObject(GetInputString("AssistAward", 1));
-            BossAssistAward = new Dictionary<int, List<int>>();
-            foreach (var key in BossAssistAwardJson.Keys)
-            {
-                int bossID = int.Parse(key);
-                var awards = BossAssistAwardJson[key];
-                if (!BossAssistAward.ContainsKey(bossID))
-                {
-                    BossAssistAward[bossID] = new List<int>();
-                }
-                foreach (var award in awards)
-                {
-                    BossAssistAward[bossID].Add(int.Parse(award.ToString()));
-                }
-
-            }
-
-            var FBAssistAwardJson = LitJson.JsonMapper.ToObject(GetInputString("AssistAward", 2));
-            FBAssistAward = new Dictionary<int, List<int>>();
-            foreach (var key in FBAssistAwardJson.Keys)
-            {
-                int mapID = int.Parse(key);
-                var awards = FBAssistAwardJson[key];
-                if (!FBAssistAward.ContainsKey(mapID))
-                {
-                    FBAssistAward[mapID] = new List<int>();
-                }
-                foreach (var award in awards)
-                {
-                    FBAssistAward[mapID].Add(int.Parse(award.ToString()));
-                }
-
-            }
-
-            var _godWeaponJson = LitJson.JsonMapper.ToObject(GetInputString("GodModel", 1));
-            godWeaponMobs = new Dictionary<int, string>();
-            foreach (var _key in _godWeaponJson.Keys)
-            {
-                var _godWeaponType = int.Parse(_key);
-                if (!godWeaponMobs.ContainsKey(_godWeaponType))
-                {
-                    godWeaponMobs.Add(_godWeaponType, _godWeaponJson[_key].ToString());
-                }
-            }
-
-            audioScaleWhenFullScreenOn = GetFloat("AudioSound");
-
-            iceCrystalMonsterScores = ConfigParse.GetDic<int, int>(GetInputString("IceLodeNeedPoint", 2));
-
-            NoXpDungeons = new List<int>(GetIntArray("XpNoUseDungeon"));
-            RandomJobs = new List<int>(GetIntArray("RandomJob"));
-            elderGodTalkingTime = GetInt("ElderGodTalkingTime");
-            elderGodBigBoss = GetInt("ElderGodBigBoss");
-            PassiveSkillShow = new List<int>(GetIntArray("PassiveSkillShow"));
-
-            FuncConfigConfig func = FuncConfigConfig.Get("NpcPosOffset");
-            LitJson.JsonData _data = LitJson.JsonMapper.ToObject(func.Numerical1);
-            foreach (var _key in _data.Keys)
-            {
-                int _npcID = int.Parse(_key);
-                double[] _pos = new double[2];
-                _pos[0] = (double)_data[_key][0];
-                _pos[1] = (double)_data[_key][1];
-                NpcPosOffset.Add(_npcID, new Vector3((float)_pos[0], 0, (float)_pos[1]));
-            }
-            //checkShowSwitchAccount
-            var showSwitchAccount = FuncConfigConfig.Get("ShowSwitchAccount");
-            LitJson.JsonData itemShowSwitchAccount = LitJson.JsonMapper.ToObject(showSwitchAccount.Numerical1);
-            checkShowSwitchAccount = new List<string>();
-            foreach(var item in itemShowSwitchAccount)
-            {
-                checkShowSwitchAccount.Add(item.ToString());
-            }
-
-            var putInItemPack = FuncConfigConfig.Get("PutInItemPack");
-            LitJson.JsonData itemPutInData = LitJson.JsonMapper.ToObject(putInItemPack.Numerical1);
-            itemPutInPackDict = new Dictionary<int, List<int>>();
-            foreach (var _key in itemPutInData.Keys)
-            {
-                var itemTypeData = itemPutInData[_key];
-                int packType = int.Parse(_key);
-                List<int> itemTypes = new List<int>();
-                itemPutInPackDict.Add(packType, itemTypes);
-                if (itemTypeData.IsArray)
-                {
-                    for (i = 0; i < itemTypeData.Count; i++)
-                    {
-                        int itemType = int.Parse(itemTypeData[i].ToString());
-                        itemTypes.Add(itemType);
-                    }
-                }
-            }
-
-            //鎷惧彇璐甸噸鐗╁搧
-            FuncConfigConfig importantItemType = FuncConfigConfig.Get("AutoBuyDrug");
-            ImportantItemType = LitJson.JsonMapper.ToObject<int[]>(importantItemType.Numerical2);
-            ImportantItemID = LitJson.JsonMapper.ToObject<int[]>(importantItemType.Numerical3);
-
-            FuncConfigConfig nxxdImg = FuncConfigConfig.Get("NXXDPicture");
-            LitJson.JsonData nxxdData = LitJson.JsonMapper.ToObject(nxxdImg.Numerical1);
-            multipleRealmImgDict = new Dictionary<int, string>();
-            if (nxxdData.IsArray)
-            {
-                for (i = 0; i < nxxdData.Count; i++)
-                {
-                    if (nxxdData[i].IsArray)
-                    {
-                        multipleRealmImgDict.Add(int.Parse(nxxdData[i][0].ToString()), nxxdData[i][1].ToString());
-                    }
-                }
-            }
-
-            bossShuntMaps = new List<int>(GetIntArray("BossShunt"));
-            bossShuntDays = GetInt("BossShunt", 3);
-
-            itemDropEffect.Clear();
-            func = FuncConfigConfig.Get("ItemEquipmentEffect");
-            _data = LitJson.JsonMapper.ToObject(func.Numerical1);
-            List<string> _keys = new List<string>(_data.Keys);
-            for (i = 0; i < _keys.Count; ++i)
-            {
-                int[] _props = new int[3];
-                for (int j = 0; j < 3; ++j)
-                {
-                    _props[j] = (int)_data[_keys[i]][j];
-                }
-                itemDropEffect[int.Parse(_keys[i])] = _props;
-            }
-
-            xllyDropEffect.Clear();
-            _data = LitJson.JsonMapper.ToObject(func.Numerical2);
-            _keys.Clear();
-            _keys.AddRange(_data.Keys);
-            for (i = 0; i < _keys.Count; ++i)
-            {
-                int[] _props = new int[3];
-                for (int j = 0; j < 3; ++j)
-                {
-                    _props[j] = (int)_data[_keys[i]][j];
-                }
-                xllyDropEffect[int.Parse(_keys[i])] = _props;
-            }
-
-            xqryDropEffect.Clear();
-            _data = LitJson.JsonMapper.ToObject(func.Numerical3);
-            _keys.Clear();
-            _keys.AddRange(_data.Keys);
-            for (i = 0; i < _keys.Count; ++i)
-            {
-                int[] _props = new int[3];
-                for (int j = 0; j < 3; ++j)
-                {
-                    _props[j] = (int)_data[_keys[i]][j];
-                }
-                xqryDropEffect[int.Parse(_keys[i])] = _props;
-            }
-
-            dropEffectQuality.Clear();
-            func = FuncConfigConfig.Get("IeemEquipmentEffectQuality");
-            _data = LitJson.JsonMapper.ToObject(func.Numerical1);
-            _keys.Clear();
-            _keys.AddRange(_data.Keys);
-            for (i = 0; i < _keys.Count; ++i)
-            {
-                dropEffectQuality[int.Parse(_keys[i])] = (int)_data[_keys[i]];
-            }
-
-            customDropEffect.Clear();
-            func = FuncConfigConfig.Get("ItemEquipmentEffectItem");
-            _data = LitJson.JsonMapper.ToObject(func.Numerical1);
-            _keys.Clear();
-            _keys.AddRange(_data.Keys);
-            int[] _tmp = null;
-            List<int[]> _content = null;
-            for (i = 0; i < _keys.Count; ++i)
-            {
-                _content = new List<int[]>();
-                foreach (LitJson.JsonData _values in _data[_keys[i]])
-                {
-                    if (_values.IsArray)
-                    {
-                        _tmp = new int[2];
-                        _tmp[0] = (int)_values[0];
-                        _tmp[1] = (int)_values[1];
-                    }
-                    else
-                    {
-                        _tmp = new int[1];
-                        _tmp[0] = (int)_values;
-                    }
-                    _content.Add(_tmp);
-                }
-                customDropEffect.Add(int.Parse(_keys[i]), _content);
-            }
-
-            BuffToHitEffect.Clear();
-            func = FuncConfigConfig.Get("BuffToHitEffect");
-            if (!string.IsNullOrEmpty(func.Numerical1) && !string.IsNullOrEmpty(func.Numerical2))
-            {
-                string[] _buffs = func.Numerical1.Split('|');
-                string[] _effects = func.Numerical2.Split('|');
-                for (i = 0; i < _buffs.Length; ++i)
-                {
-                    BuffToHitEffect[int.Parse(_buffs[i])] = int.Parse(_effects[i]);
-                }
-            }
-
-            demonJarHintLevelLimit = GetInt("DemonJarFirstRemin");
-            demonJarHintLineId = GetInt("DemonJarFirstRemin", 2);
-            skillPanelUnLock = GetInt("SkillPanelUnlock");
-            dailyQuestRedpointLevelLimit = GetInt("DailyQuestRedPoint");
-            lowHpRemind = GetInt("LowHpRemind");
-            autoBuyItemIds = GetIntArray("BuyItemPrice", 1);
-            autoBuyItemPrices = GetIntArray("BuyItemPrice", 2);
-            neutralMaps.AddRange(GetIntArray("MapLine", 4));
-            neutralBossMaps.AddRange(GetIntArray("BossListMapID"));
-
-            var _propertyIconCfg = FuncConfigConfig.Get("PropertyIcon");
-            var _propertyIconJson = LitJson.JsonMapper.ToObject(_propertyIconCfg.Numerical1);
-            foreach (var _key in _propertyIconJson.Keys)
-            {
-                var _property = int.Parse(_key);
-                propertyIconDict.Add(_property, _propertyIconJson[_key].ToString());
-            }
-
-            munekadolockLimit = GetInt("MunekadoLockLimit");
-            demonJarRedPoint = GetInt("DemonJarRedPoint");
-            LoadLV = GetInputString("LoadLV");
-
-            mainWinSkillResetTime = GetFloat("AutomaticSwitch");
-            heroDialogueOffset = GetInputString("NpcHalfLength", 1).Vector3Parse();
-            heroDialogueRotation = GetInputString("NpcHalfLength", 2).Vector3Parse();
-            heroDialogueScale = GetFloat("NpcHalfLength", 3);
-
-            var ancientConfig = FuncConfigConfig.Get("ElderBattleTarget");
-            ancientGrandTotalAchievements = new List<int>();
-            ancientGrandTotalAchievements.AddRange(ConfigParse.GetMultipleStr<int>(ancientConfig.Numerical1));
-            ancientContinueKillAchievements = new List<int>();
-            ancientContinueKillAchievements.AddRange(ConfigParse.GetMultipleStr<int>(ancientConfig.Numerical2));
-
-            trialDungeonGroupChallengeTipLv = GetInt("SingleIntoFB");
-            prayerRedpointLimitLv = GetInt("PrayRedPoint");
-            demonJarLevelLimit = GetInt("DemonJarLevelLimit");
-            maxItemDropEffectCount = GetInt("ItemMaskEffect");
-
-            specialGuide41Mission = GetInt("SpecialGuide41", 1);
-            specialGuide41Achievement = GetInt("SpecialGuide41", 2);
-
-            supremeRechargeVipLv = GetInt("SupremeCTGVipLimit", 1);
-
-            rechargeRedpointLv = GetInt("FirstPayRedPoint", 1);
-            rechargeRedpointMinLv = GetInt("FirstPayRedPoint", 2);
-            runeTowerSweepBuyTimes = GetInt("RuneTowerSweepBuy");
-            runeTowerSweepBuyPrice = GetInt("RuneTowerSweepBuy", 2);
-            teamMatchingTimeOut = GetInt("TeamMatchingTimeOut");
-            inGameDownLoadLevelCheckPoints = new List<int>(GetIntArray("InGameDownLoad"));
-            inGameDownLoadTaskCheckPoints = new List<int>(GetIntArray("InGameDownLoad", 2));
-            inGameDownLoadHighLevel = GetInt("InGameDownLoad", 3);
-
-            worldBossNoRebornRemindMaps = new List<int>(GetIntArray("NoRebornRemindMap", 1));
-            bossHomeNoRebornRemindMaps = new List<int>(GetIntArray("NoRebornRemindMap", 2));
-            elderGodNoRebornRemindMaps = new List<int>(GetIntArray("NoRebornRemindMap", 3));
-            demonJarNoRebornRemindMaps = new List<int>(GetIntArray("NoRebornRemindMap", 4));
-            dogzNoRebornRemindMaps = new List<int>(GetIntArray("NoRebornRemindMap", 5));
-
-            if (ModeDefaultConfig == null)
-            {
-                func = FuncConfigConfig.Get("ModeDefault");
-
-                string[] _funcNpc = func.Numerical1.Split('|');
-                string[] _fightNpc = func.Numerical2.Split('|');
-                string[] _pet = func.Numerical3.Split('|');
-                string[] _horse = func.Numerical4.Split('|');
-
-                ModeDefaultConfig = new string[4][];
-                ModeDefaultConfig[0] = _funcNpc;
-                ModeDefaultConfig[1] = _fightNpc;
-                ModeDefaultConfig[2] = _pet;
-                ModeDefaultConfig[3] = _horse;
-            }
-
-            if (RealmGroup == null)
-            {
-                func = FuncConfigConfig.Get("RealmGroup");
-                string[] _group = func.Numerical1.Split('|');
-                RealmGroup = new int[_group.Length];
-                for (int j = 0; j < _group.Length; ++j)
-                {
-                    int.TryParse(_group[j], out RealmGroup[j]);
-                }
-            }
-
-            func = FuncConfigConfig.Get("PrefightAtkRange");
-            PrefightAtkRange = float.Parse(func.Numerical1);
-            inGameDownLoadHighestLevelPoint = GetInt("DownReward", 2);
-
-            dungeonCanUseMoneyIds = new List<int>(GetIntArray("FBEnterTickeyAuto", 1));
-            dungeonRebornClientTimes = ConfigParse.GetDic<int, int>(GetInputString("DuplicatesRebornTime", 2));
-            dogzBoxLimit = GetInt("DogzBoxLimit");
-
-            fairyGrabBossMapLines = ConfigParse.GetDic<int, int>(GetInputString("MapLine", 2));
-            var grabBossMaps = fairyGrabBossMapLines.Keys.ToList();
-            foreach (var _key in grabBossMaps)
-            {
-                fairyGrabBossMapLines[_key] = fairyGrabBossMapLines[_key] - 1;
-            }
-
-            if (DropItemEffectMapID == null)
-            {
-                DropItemEffectMapID = new Dictionary<int, List<int>>();
-            }
-            DropItemEffectMapID.Clear();
-            func = FuncConfigConfig.Get("DropItemEffectMapID");
-            _data = LitJson.JsonMapper.ToObject(func.Numerical1);
-            int _itemID;
-            _keys.Clear();
-            _keys.AddRange(_data.Keys);
-            for (int j = 0; j < _keys.Count; ++j)
-            {
-                if (int.TryParse(_keys[j].ToString(), out _itemID))
-                {
-                    if (!DropItemEffectMapID.ContainsKey(_itemID))
-                    {
-                        DropItemEffectMapID.Add(_itemID, new List<int>());
-                    }
-                    var _jsonMapIDs = _data[_keys[j]];
-                    foreach (var _jsonMapID in _jsonMapIDs)
-                    {
-                        var _mapID = ((LitJson.IJsonWrapper)_jsonMapID).GetInt();
-                        if (!DropItemEffectMapID[_itemID].Contains(_mapID))
-                        {
-                            DropItemEffectMapID[_itemID].Add(_mapID);
-                        }
-                    }
-                }
-            }
-
-            int[] mapIDs = GetIntArray("RebornAutoFightDungeon");
-            RebornAutoFightMapID = new List<int>(mapIDs);
-
-            teamWorldCall = GetInputString("TeamWorldCall");
-            teamWorldCallInviteCount = GetInt("TeamWorldCall", 2);
-
-            var ancientKingAwradConfig = FuncConfigConfig.Get("ElderBattlefieldTopAward");
-            if (ancientKingAwradConfig != null)
-            {
-                var itemArray = LitJson.JsonMapper.ToObject<int[][]>(ancientKingAwradConfig.Numerical1);
-                for (int k = 0; k < itemArray.Length; k++)
-                {
-                    // ancientKingAwards.Add(new Item()
-                    // {
-                    //     id = itemArray[k][0],
-                    //     count = itemArray[k][1],
-                    // });
-                }
-            }
-
-            func = FuncConfigConfig.Get("QualityEffectConfig");
-            lowQualityEffectCount = int.Parse(func.Numerical1);
-            medQualityEffectCount = int.Parse(func.Numerical2);
-            highQualityEffectCount = int.Parse(func.Numerical3);
-
-            func = FuncConfigConfig.Get("QualityPetCountConfig");
-            lowQualityPetCount = int.Parse(func.Numerical1);
-            medQualityPetCount = int.Parse(func.Numerical2);
-            highQualityPetCount = int.Parse(func.Numerical3);
-
-            func = FuncConfigConfig.Get("QualityGuardCountConfig");
-            lowQualityGuardCount = int.Parse(func.Numerical1);
-            medQualityGuardCount = int.Parse(func.Numerical2);
-            highQualityGuardCount = int.Parse(func.Numerical3);
-
-            func = FuncConfigConfig.Get("QualityPetEffectCount");
-            lowQualityPetEffectCount = int.Parse(func.Numerical1);
-            medQualityPetEffectCount = int.Parse(func.Numerical2);
-            highQualityPetEffectCount = int.Parse(func.Numerical3);
-
-            func = FuncConfigConfig.Get("QualityHorseEffectCount");
-            lowQualityHorseEffectCount = int.Parse(func.Numerical1);
-            medQualityHorseEffectCount = int.Parse(func.Numerical2);
-            highQualityHorseEffectCount = int.Parse(func.Numerical3);
-
-            fairyLandBuffCondition = GetInt("XjmjAddHarm", 1);
-            fairyLandBuffId = GetInt("XjmjAddHarm", 2);
-            achievementEarlierStageLevel = GetInt("AchieveLV");
-
-            func = FuncConfigConfig.Get("PreloadSkillEffect");
-            PreloadSkillEffect = new int[2][];
-            PreloadSkillEffect[0] = GetIntArray("PreloadSkillEffect");
-            PreloadSkillEffect[1] = GetIntArray("PreloadSkillEffect", 2);
-            demonJarAutoTime = GetInt("DemonJarAutoTime");
-
-            // if (SgzzRobotEquipDict == null)
+            // bossWearyValues = ConfigParse.GetDic<int, int>(GetInputString("KillBossCntLimit", 2));
+            // wingEquipLimits = ConfigParse.GetDic<int, int>(GetInputString("WingRealmLimit", 1));
+            // int i = 0;
+            // int[] equipPlaces = GetIntArray("EquipArea", 1);
+            // string[] equipPlacesNames = GetStringArray("EquipArea", 2);
+            // equipPlaceNameDict = new Dictionary<int, string>();
+            // for (i = 0; i < equipPlaces.Length; i++)
             // {
-            //     SgzzRobotEquipDict = new Dictionary<int, Dictionary<int, GA_NpcFightSgzcZZ.EquipRandomInfo>>();
-
-            //     for (int job = 1; job <= 3; ++job)
+            //     if (!equipPlaceNameDict.ContainsKey(equipPlaces[i]))
             //     {
-            //         string _jsonString = GetInputString("SGZCHelpBattleEquip", job);
-
-            //         if (string.IsNullOrEmpty(_jsonString))
+            //         equipPlaceNameDict.Add(equipPlaces[i], equipPlacesNames[i]);
+            //     }
+            //     else
+            //     {
+            //         Debug.LogError("EquipArea : 瑁呭浣嶇疆閲嶅");
+            //     }
+            // }
+            // var _trailBossJson = LitJson.JsonMapper.ToObject(GetInputString("MuneKadoTrialBossHead", 1));
+            // trailBossHeadIcons = new Dictionary<int, string>();
+            // foreach (var _key in _trailBossJson.Keys)
+            // {
+            //     var _npcId = int.Parse(_key);
+            //     if (!trailBossHeadIcons.ContainsKey(_npcId))
+            //     {
+            //         trailBossHeadIcons.Add(_npcId, _trailBossJson[_key].ToString());
+            //     }
+            // }
+            // FuncConfigConfig HorseTrainConfig = FuncConfigConfig.Get("HorseTrain");
+            // HorseTrainIDList = LitJson.JsonMapper.ToObject<int[]>(HorseTrainConfig.Numerical1);
+            // FuncConfigConfig PetTrainConfig = FuncConfigConfig.Get("PetUpItem");
+            // PetTrainIDList = LitJson.JsonMapper.ToObject<int[]>(PetTrainConfig.Numerical3);
+            // FuncConfigConfig LingQiTrainConfig = FuncConfigConfig.Get("HorseTrain");
+            // var LingQiTrainJson = LitJson.JsonMapper.ToObject(GetInputString("LingQiTrain", 1));
+            // LingQiTrainIDList = new Dictionary<int, List<int>>();
+            // foreach (var key in LingQiTrainJson.Keys)
+            // {
+            //     int attrId = int.Parse(key);
+            //     var skillIds = LingQiTrainJson[key];
+            //     foreach (var skillId in skillIds)
+            //     {
+            //         int id = int.Parse(skillId.ToString());
+            //         if (!LingQiTrainIDList.ContainsKey(attrId))
             //         {
-            //             continue;
+            //             List<int> list = new List<int>();
+            //             list.Add(id);
+            //             LingQiTrainIDList.Add(attrId, list);
             //         }
-
-            //         var _jsonData = LitJson.JsonMapper.ToObject(_jsonString);
-            //         var _jobDict = new Dictionary<int, GA_NpcFightSgzcZZ.EquipRandomInfo>();
-
-            //         for (i = 0; i < _jsonData.Count; ++i)
+            //         else
             //         {
-            //             var _lvJson = _jsonData[i];
-            //             var _lv = (int)_lvJson["LV"];
-            //             if (!_jobDict.ContainsKey(_lv))
-            //             {
-            //                 var _equips = _lvJson["Equips"];
-
-            //                 var _randEquip = new GA_NpcFightSgzcZZ.EquipRandomInfo();
-
-            //                 _randEquip.randClothesItemIDs = new int[_equips[0].Count];
-            //                 for (int j = 0; j < _equips[0].Count; ++j)
-            //                 {
-            //                     _randEquip.randClothesItemIDs[j] = (int)_equips[0][j];
-            //                 }
-
-            //                 _randEquip.randWeaponItemIDs = new int[_equips[1].Count];
-            //                 for (int j = 0; j < _equips[1].Count; ++j)
-            //                 {
-            //                     _randEquip.randWeaponItemIDs[j] = (int)_equips[1][j];
-            //                 }
-
-            //                 _randEquip.randSecondaryItemIDs = new int[_equips[2].Count];
-            //                 for (int j = 0; j < _equips[2].Count; ++j)
-            //                 {
-            //                     _randEquip.randSecondaryItemIDs[j] = (int)_equips[2][j];
-            //                 }
-
-            //                 _randEquip.randWingItemIDs = new int[_equips[3].Count];
-            //                 for (int j = 0; j < _equips[3].Count; ++j)
-            //                 {
-            //                     _randEquip.randWingItemIDs[j] = (int)_equips[3][j];
-            //                 }
-
-            //                 _randEquip.godWeaponIDs = new int[_equips[4].Count];
-            //                 for (int j = 0; j < _equips[4].Count; ++j)
-            //                 {
-            //                     _randEquip.godWeaponIDs[j] = (int)_equips[4][j];
-            //                 }
-
-            //                 _jobDict.Add(_lv, _randEquip);
-            //             }
+            //             LingQiTrainIDList[attrId].Add(id);
             //         }
+            //     }
 
-            //         SgzzRobotEquipDict.Add(job, _jobDict);
+            // }
 
+            // var skillPlusAttrIDJson = LitJson.JsonMapper.ToObject(GetInputString("SkillPlusAttrID", 2));
+            // skillAttrIDDict = new Dictionary<int, List<int>>();
+            // foreach (var key in skillPlusAttrIDJson.Keys)
+            // {
+            //     int attrId = int.Parse(key);
+            //     var skillIds = skillPlusAttrIDJson[key];
+            //     foreach (var skillId in skillIds)
+            //     {
+            //         int id = int.Parse(skillId.ToString());
+            //         if (!skillAttrIDDict.ContainsKey(id))
+            //         {
+            //             List<int> list = new List<int>();
+            //             list.Add(attrId);
+            //             skillAttrIDDict.Add(id, list);
+            //         }
+            //         else
+            //         {
+            //             skillAttrIDDict[id].Add(attrId);
+            //         }
+            //     }
+
+            // }
+            
+            // var BossAssistAwardJson = LitJson.JsonMapper.ToObject(GetInputString("AssistAward", 1));
+            // BossAssistAward = new Dictionary<int, List<int>>();
+            // foreach (var key in BossAssistAwardJson.Keys)
+            // {
+            //     int bossID = int.Parse(key);
+            //     var awards = BossAssistAwardJson[key];
+            //     if (!BossAssistAward.ContainsKey(bossID))
+            //     {
+            //         BossAssistAward[bossID] = new List<int>();
+            //     }
+            //     foreach (var award in awards)
+            //     {
+            //         BossAssistAward[bossID].Add(int.Parse(award.ToString()));
+            //     }
+
+            // }
+
+            // var FBAssistAwardJson = LitJson.JsonMapper.ToObject(GetInputString("AssistAward", 2));
+            // FBAssistAward = new Dictionary<int, List<int>>();
+            // foreach (var key in FBAssistAwardJson.Keys)
+            // {
+            //     int mapID = int.Parse(key);
+            //     var awards = FBAssistAwardJson[key];
+            //     if (!FBAssistAward.ContainsKey(mapID))
+            //     {
+            //         FBAssistAward[mapID] = new List<int>();
+            //     }
+            //     foreach (var award in awards)
+            //     {
+            //         FBAssistAward[mapID].Add(int.Parse(award.ToString()));
+            //     }
+
+            // }
+
+            // var _godWeaponJson = LitJson.JsonMapper.ToObject(GetInputString("GodModel", 1));
+            // godWeaponMobs = new Dictionary<int, string>();
+            // foreach (var _key in _godWeaponJson.Keys)
+            // {
+            //     var _godWeaponType = int.Parse(_key);
+            //     if (!godWeaponMobs.ContainsKey(_godWeaponType))
+            //     {
+            //         godWeaponMobs.Add(_godWeaponType, _godWeaponJson[_key].ToString());
             //     }
             // }
 
+            // audioScaleWhenFullScreenOn = GetFloat("AudioSound");
 
-            if (SgzcRealm == null)
-            {
-                SgzcRealm = new Dictionary<int, int>();
+            // iceCrystalMonsterScores = ConfigParse.GetDic<int, int>(GetInputString("IceLodeNeedPoint", 2));
 
-                var _lvArr = GetInputString("SGZCRobotRealm", 1).Split('|');
-                var _rLvArr = GetInputString("SGZCRobotRealm", 2).Split('|');
+            // NoXpDungeons = new List<int>(GetIntArray("XpNoUseDungeon"));
+            // RandomJobs = new List<int>(GetIntArray("RandomJob"));
+            // elderGodTalkingTime = GetInt("ElderGodTalkingTime");
+            // elderGodBigBoss = GetInt("ElderGodBigBoss");
+            // PassiveSkillShow = new List<int>(GetIntArray("PassiveSkillShow"));
 
-                for (int j = 0; j < _lvArr.Length; ++j)
-                {
-                    SgzcRealm[int.Parse(_lvArr[j])] = int.Parse(_rLvArr[j]);
-                }
-            }
+            // FuncConfigConfig func = FuncConfigConfig.Get("NpcPosOffset");
+            // LitJson.JsonData _data = LitJson.JsonMapper.ToObject(func.Numerical1);
+            // foreach (var _key in _data.Keys)
+            // {
+            //     int _npcID = int.Parse(_key);
+            //     double[] _pos = new double[2];
+            //     _pos[0] = (double)_data[_key][0];
+            //     _pos[1] = (double)_data[_key][1];
+            //     NpcPosOffset.Add(_npcID, new Vector3((float)_pos[0], 0, (float)_pos[1]));
+            // }
+            // //checkShowSwitchAccount
+            // var showSwitchAccount = FuncConfigConfig.Get("ShowSwitchAccount");
+            // LitJson.JsonData itemShowSwitchAccount = LitJson.JsonMapper.ToObject(showSwitchAccount.Numerical1);
+            // checkShowSwitchAccount = new List<string>();
+            // foreach(var item in itemShowSwitchAccount)
+            // {
+            //     checkShowSwitchAccount.Add(item.ToString());
+            // }
 
-            crossServerBattleFieldOpenDay = GetInt("CrossRealmCfg", 2);
-            UISpringDecorate = GetInt("UISpringDecorate");
+            // var putInItemPack = FuncConfigConfig.Get("PutInItemPack");
+            // LitJson.JsonData itemPutInData = LitJson.JsonMapper.ToObject(putInItemPack.Numerical1);
+            // itemPutInPackDict = new Dictionary<int, List<int>>();
+            // foreach (var _key in itemPutInData.Keys)
+            // {
+            //     var itemTypeData = itemPutInData[_key];
+            //     int packType = int.Parse(_key);
+            //     List<int> itemTypes = new List<int>();
+            //     itemPutInPackDict.Add(packType, itemTypes);
+            //     if (itemTypeData.IsArray)
+            //     {
+            //         for (i = 0; i < itemTypeData.Count; i++)
+            //         {
+            //             int itemType = int.Parse(itemTypeData[i].ToString());
+            //             itemTypes.Add(itemType);
+            //         }
+            //     }
+            // }
 
-            mixServerCustomDays = GetInt("MixServer");
-            openServerCustomDays = GetInt("OperationAction");
-            ClientPvpAttributePer = GetInt("ClientPvPAttributePer") * Constants.F_DELTA;
+            // //鎷惧彇璐甸噸鐗╁搧
+            // FuncConfigConfig importantItemType = FuncConfigConfig.Get("AutoBuyDrug");
+            // ImportantItemType = LitJson.JsonMapper.ToObject<int[]>(importantItemType.Numerical2);
+            // ImportantItemID = LitJson.JsonMapper.ToObject<int[]>(importantItemType.Numerical3);
 
-            mysteryShopRefreshItem = GetInt("MysteryShopRefresh");
-            mysteryShopRefreshItemCount = new Dictionary<int, int>();
-            var mysteryShopJson = JsonMapper.ToObject(GetInputString("MysteryShopRefresh", 2));
-            foreach (var key in mysteryShopJson.Keys)
-            {
-                var time = int.Parse(key);
-                mysteryShopRefreshItemCount[time] = (int)mysteryShopJson[key];
-            }
+            // FuncConfigConfig nxxdImg = FuncConfigConfig.Get("NXXDPicture");
+            // LitJson.JsonData nxxdData = LitJson.JsonMapper.ToObject(nxxdImg.Numerical1);
+            // multipleRealmImgDict = new Dictionary<int, string>();
+            // if (nxxdData.IsArray)
+            // {
+            //     for (i = 0; i < nxxdData.Count; i++)
+            //     {
+            //         if (nxxdData[i].IsArray)
+            //         {
+            //             multipleRealmImgDict.Add(int.Parse(nxxdData[i][0].ToString()), nxxdData[i][1].ToString());
+            //         }
+            //     }
+            // }
 
-            mysteryShopRefreshItemValue = GetInt("MysteryShopRefresh", 3);
-            mysteryShopRefreshInterval = GetInt("MysteryShopRefresh", 4);
+            // bossShuntMaps = new List<int>(GetIntArray("BossShunt"));
+            // bossShuntDays = GetInt("BossShunt", 3);
 
-            var equipStarConfig = FuncConfigConfig.Get("EquipPartStar");
-            var equipStarJson = LitJson.JsonMapper.ToObject(equipStarConfig.Numerical1);
-            equipStarLimit = new Dictionary<int, Dictionary<int, int>>();
-            foreach (var itemColorKey in equipStarJson.Keys)
-            {
-                var itemColor = int.Parse(itemColorKey);
-                Dictionary<int, int> dict = new Dictionary<int, int>();
-                foreach (var itemLevelKey in equipStarJson[itemColorKey].Keys)
-                {
-                    var itemLevel = int.Parse(itemLevelKey);
-                    var starLimit = int.Parse(equipStarJson[itemColorKey][itemLevelKey].ToString());
-                    dict.Add(itemLevel, starLimit);
-                }
-                equipStarLimit.Add(itemColor, dict);
-            }
+            // itemDropEffect.Clear();
+            // func = FuncConfigConfig.Get("ItemEquipmentEffect");
+            // _data = LitJson.JsonMapper.ToObject(func.Numerical1);
+            // List<string> _keys = new List<string>(_data.Keys);
+            // for (i = 0; i < _keys.Count; ++i)
+            // {
+            //     int[] _props = new int[3];
+            //     for (int j = 0; j < 3; ++j)
+            //     {
+            //         _props[j] = (int)_data[_keys[i]][j];
+            //     }
+            //     itemDropEffect[int.Parse(_keys[i])] = _props;
+            // }
 
-            equipTrainMustItemId = GetInt("EquipWashMustID");
-            acutionItemHour = GetInt("AuctionItem");
-            mainWinTopCloseTime = GetInt("AutomaticSwitch");
+            // xllyDropEffect.Clear();
+            // _data = LitJson.JsonMapper.ToObject(func.Numerical2);
+            // _keys.Clear();
+            // _keys.AddRange(_data.Keys);
+            // for (i = 0; i < _keys.Count; ++i)
+            // {
+            //     int[] _props = new int[3];
+            //     for (int j = 0; j < 3; ++j)
+            //     {
+            //         _props[j] = (int)_data[_keys[i]][j];
+            //     }
+            //     xllyDropEffect[int.Parse(_keys[i])] = _props;
+            // }
 
-            equipDecomposeScreen.AddRange(GetIntArray("EquipDecomposeScreen", 2));
+            // xqryDropEffect.Clear();
+            // _data = LitJson.JsonMapper.ToObject(func.Numerical3);
+            // _keys.Clear();
+            // _keys.AddRange(_data.Keys);
+            // for (i = 0; i < _keys.Count; ++i)
+            // {
+            //     int[] _props = new int[3];
+            //     for (int j = 0; j < 3; ++j)
+            //     {
+            //         _props[j] = (int)_data[_keys[i]][j];
+            //     }
+            //     xqryDropEffect[int.Parse(_keys[i])] = _props;
+            // }
 
-            func = FuncConfigConfig.Get("AtkTypeIncreasePushDis");
-            var _ks = func.Numerical1.Split('|');
-            var _vs = func.Numerical2.Split('|');
-            for (i = 0; i < _ks.Length; ++i)
-            {
-                AtkTypeIncreasePushDis[int.Parse(_ks[i])] = int.Parse(_vs[i]) * Constants.F_DELTA;
-            }
+            // dropEffectQuality.Clear();
+            // func = FuncConfigConfig.Get("IeemEquipmentEffectQuality");
+            // _data = LitJson.JsonMapper.ToObject(func.Numerical1);
+            // _keys.Clear();
+            // _keys.AddRange(_data.Keys);
+            // for (i = 0; i < _keys.Count; ++i)
+            // {
+            //     dropEffectQuality[int.Parse(_keys[i])] = (int)_data[_keys[i]];
+            // }
 
-            func = FuncConfigConfig.Get("NpcDieSetCamera");
-            if (func != null)
-            {
-                var _jsonData = LitJson.JsonMapper.ToObject(func.Numerical1);
-                for (i = 0; i < _jsonData.Count; ++i)
-                {
-                    var _child = _jsonData[i];
-                    // var _lookAtData = new CameraController.LookAtData();
-                    // _lookAtData.position = new Vector3(MathUtility.GetFloatFromLitJson(_child[1][0]),
-                    //                                    MathUtility.GetFloatFromLitJson(_child[1][1]),
-                    //                                    MathUtility.GetFloatFromLitJson(_child[1][2]));
-                    // _lookAtData.rotX = (int)_child[2];
-                    // _lookAtData.rotY = (int)_child[3];
-                    // _lookAtData.lastTime = MathUtility.GetFloatFromLitJson(_child[4]);
+            // customDropEffect.Clear();
+            // func = FuncConfigConfig.Get("ItemEquipmentEffectItem");
+            // _data = LitJson.JsonMapper.ToObject(func.Numerical1);
+            // _keys.Clear();
+            // _keys.AddRange(_data.Keys);
+            // int[] _tmp = null;
+            // List<int[]> _content = null;
+            // for (i = 0; i < _keys.Count; ++i)
+            // {
+            //     _content = new List<int[]>();
+            //     foreach (LitJson.JsonData _values in _data[_keys[i]])
+            //     {
+            //         if (_values.IsArray)
+            //         {
+            //             _tmp = new int[2];
+            //             _tmp[0] = (int)_values[0];
+            //             _tmp[1] = (int)_values[1];
+            //         }
+            //         else
+            //         {
+            //             _tmp = new int[1];
+            //             _tmp[0] = (int)_values;
+            //         }
+            //         _content.Add(_tmp);
+            //     }
+            //     customDropEffect.Add(int.Parse(_keys[i]), _content);
+            // }
 
-                    // NpcDieSetCamera[(int)_child[0]] = _lookAtData;
-                }
-            }
-            WorkForEnemySkills = GetIntArray("ArenaSetSkills", 1);
-            WorkForMeSkills = GetIntArray("ArenaSetSkills", 2);
-            WorkNotSkills = GetIntArray("ArenaSetSkills", 3);
-            defenseGetWays = GetIntArray("DefenseGetWays", 1);
-            skillYinjis = ConfigParse.GetDic<int, int>(GetInputString("SkillYinji", 1));
-            onlyUsedAtBackpackItems = new List<int>(GetIntArray("ItemPush", 2));
+            // BuffToHitEffect.Clear();
+            // func = FuncConfigConfig.Get("BuffToHitEffect");
+            // if (!string.IsNullOrEmpty(func.Numerical1) && !string.IsNullOrEmpty(func.Numerical2))
+            // {
+            //     string[] _buffs = func.Numerical1.Split('|');
+            //     string[] _effects = func.Numerical2.Split('|');
+            //     for (i = 0; i < _buffs.Length; ++i)
+            //     {
+            //         BuffToHitEffect[int.Parse(_buffs[i])] = int.Parse(_effects[i]);
+            //     }
+            // }
 
-            var signInSkillArray = GetIntArray("SignInPromoteSkill", 1);
-            if (signInSkillArray != null)
-            {
-                signInPromoteSkills.AddRange(signInSkillArray);
-            }
+            // demonJarHintLevelLimit = GetInt("DemonJarFirstRemin");
+            // demonJarHintLineId = GetInt("DemonJarFirstRemin", 2);
+            // skillPanelUnLock = GetInt("SkillPanelUnlock");
+            // dailyQuestRedpointLevelLimit = GetInt("DailyQuestRedPoint");
+            // lowHpRemind = GetInt("LowHpRemind");
+            // autoBuyItemIds = GetIntArray("BuyItemPrice", 1);
+            // autoBuyItemPrices = GetIntArray("BuyItemPrice", 2);
+            // neutralMaps.AddRange(GetIntArray("MapLine", 4));
+            // neutralBossMaps.AddRange(GetIntArray("BossListMapID"));
 
-            MasteryLoadingLevelLimit1 = GetInt("MasteryLoadingLevelLimit");
-            MasteryLoadingLevelLimit2 = GetInt("MasteryLoadingLevelLimit", 2);
+            // var _propertyIconCfg = FuncConfigConfig.Get("PropertyIcon");
+            // var _propertyIconJson = LitJson.JsonMapper.ToObject(_propertyIconCfg.Numerical1);
+            // foreach (var _key in _propertyIconJson.Keys)
+            // {
+            //     var _property = int.Parse(_key);
+            //     propertyIconDict.Add(_property, _propertyIconJson[_key].ToString());
+            // }
 
-            chestDisplayItems = new List<int>(GetIntArray("ChestShowItems"));
+            // munekadolockLimit = GetInt("MunekadoLockLimit");
+            // demonJarRedPoint = GetInt("DemonJarRedPoint");
+            // LoadLV = GetInputString("LoadLV");
 
-            func = FuncConfigConfig.Get("Zhanling");
-            if (func != null)
-            {
-                OldZhanLingCtgIdDict = new Dictionary<int, int>();
-                ZhanLingCtgIdDict = new Dictionary<int, List<int>>();
-                var tempDict = JsonMapper.ToObject(func.Numerical1);
-                var keyList = tempDict.Keys.ToList();
-                for (int j = 0; j < keyList.Count; j++)
-                {
-                    OldZhanLingCtgIdDict[int.Parse(keyList[j])] = JsonMapper.ToObject<List<int>>(tempDict[keyList[j]].ToJson())[0];
-                    ZhanLingCtgIdDict[int.Parse(keyList[j])] = JsonMapper.ToObject<List<int>>(tempDict[keyList[j]].ToJson());
-                }
+            // mainWinSkillResetTime = GetFloat("AutomaticSwitch");
+            // heroDialogueOffset = GetInputString("NpcHalfLength", 1).Vector3Parse();
+            // heroDialogueRotation = GetInputString("NpcHalfLength", 2).Vector3Parse();
+            // heroDialogueScale = GetFloat("NpcHalfLength", 3);
 
-                ZhanLingCtgIdHDict = new Dictionary<int, List<int>>();
-                tempDict = JsonMapper.ToObject(func.Numerical3);
-                keyList = tempDict.Keys.ToList();
-                for (int k = 0; k < keyList.Count; k++)
-                {
-                    ZhanLingCtgIdHDict[int.Parse(keyList[k])] = JsonMapper.ToObject<List<int>>(tempDict[keyList[k]].ToJson());
-                }
-            }
+            // var ancientConfig = FuncConfigConfig.Get("ElderBattleTarget");
+            // ancientGrandTotalAchievements = new List<int>();
+            // ancientGrandTotalAchievements.AddRange(ConfigParse.GetMultipleStr<int>(ancientConfig.Numerical1));
+            // ancientContinueKillAchievements = new List<int>();
+            // ancientContinueKillAchievements.AddRange(ConfigParse.GetMultipleStr<int>(ancientConfig.Numerical2));
 
-            func = FuncConfigConfig.Get("FBQuickPass");
-            fightPowerMore = float.Parse(func.Numerical1) + 0.01f; //鐤戜技鐜╁鏃犳硶闆疯瘺鏄疌/S璁$畻涓嶅绛夐棶棰橈紝鎵�浠ュ姞0.01f
-            flashOpenArr = JsonMapper.ToObject<int[]>(func.Numerical2);
-            flashCntMoreArr = JsonMapper.ToObject<int[]>(func.Numerical3);
-            flashKillMaxCount = int.Parse(func.Numerical4);
+            // trialDungeonGroupChallengeTipLv = GetInt("SingleIntoFB");
+            // prayerRedpointLimitLv = GetInt("PrayRedPoint");
+            // demonJarLevelLimit = GetInt("DemonJarLevelLimit");
+            // maxItemDropEffectCount = GetInt("ItemMaskEffect");
+
+            // specialGuide41Mission = GetInt("SpecialGuide41", 1);
+            // specialGuide41Achievement = GetInt("SpecialGuide41", 2);
+
+            // supremeRechargeVipLv = GetInt("SupremeCTGVipLimit", 1);
+
+            // rechargeRedpointLv = GetInt("FirstPayRedPoint", 1);
+            // rechargeRedpointMinLv = GetInt("FirstPayRedPoint", 2);
+            // runeTowerSweepBuyTimes = GetInt("RuneTowerSweepBuy");
+            // runeTowerSweepBuyPrice = GetInt("RuneTowerSweepBuy", 2);
+            // teamMatchingTimeOut = GetInt("TeamMatchingTimeOut");
+            // inGameDownLoadLevelCheckPoints = new List<int>(GetIntArray("InGameDownLoad"));
+            // inGameDownLoadTaskCheckPoints = new List<int>(GetIntArray("InGameDownLoad", 2));
+            // inGameDownLoadHighLevel = GetInt("InGameDownLoad", 3);
+
+            // worldBossNoRebornRemindMaps = new List<int>(GetIntArray("NoRebornRemindMap", 1));
+            // bossHomeNoRebornRemindMaps = new List<int>(GetIntArray("NoRebornRemindMap", 2));
+            // elderGodNoRebornRemindMaps = new List<int>(GetIntArray("NoRebornRemindMap", 3));
+            // demonJarNoRebornRemindMaps = new List<int>(GetIntArray("NoRebornRemindMap", 4));
+            // dogzNoRebornRemindMaps = new List<int>(GetIntArray("NoRebornRemindMap", 5));
+
+            // if (ModeDefaultConfig == null)
+            // {
+            //     func = FuncConfigConfig.Get("ModeDefault");
+
+            //     string[] _funcNpc = func.Numerical1.Split('|');
+            //     string[] _fightNpc = func.Numerical2.Split('|');
+            //     string[] _pet = func.Numerical3.Split('|');
+            //     string[] _horse = func.Numerical4.Split('|');
+
+            //     ModeDefaultConfig = new string[4][];
+            //     ModeDefaultConfig[0] = _funcNpc;
+            //     ModeDefaultConfig[1] = _fightNpc;
+            //     ModeDefaultConfig[2] = _pet;
+            //     ModeDefaultConfig[3] = _horse;
+            // }
+
+            // if (RealmGroup == null)
+            // {
+            //     func = FuncConfigConfig.Get("RealmGroup");
+            //     string[] _group = func.Numerical1.Split('|');
+            //     RealmGroup = new int[_group.Length];
+            //     for (int j = 0; j < _group.Length; ++j)
+            //     {
+            //         int.TryParse(_group[j], out RealmGroup[j]);
+            //     }
+            // }
+
+            // func = FuncConfigConfig.Get("PrefightAtkRange");
+            // PrefightAtkRange = float.Parse(func.Numerical1);
+            // inGameDownLoadHighestLevelPoint = GetInt("DownReward", 2);
+
+            // dungeonCanUseMoneyIds = new List<int>(GetIntArray("FBEnterTickeyAuto", 1));
+            // dungeonRebornClientTimes = ConfigParse.GetDic<int, int>(GetInputString("DuplicatesRebornTime", 2));
+            // dogzBoxLimit = GetInt("DogzBoxLimit");
+
+            // fairyGrabBossMapLines = ConfigParse.GetDic<int, int>(GetInputString("MapLine", 2));
+            // var grabBossMaps = fairyGrabBossMapLines.Keys.ToList();
+            // foreach (var _key in grabBossMaps)
+            // {
+            //     fairyGrabBossMapLines[_key] = fairyGrabBossMapLines[_key] - 1;
+            // }
+
+            // if (DropItemEffectMapID == null)
+            // {
+            //     DropItemEffectMapID = new Dictionary<int, List<int>>();
+            // }
+            // DropItemEffectMapID.Clear();
+            // func = FuncConfigConfig.Get("DropItemEffectMapID");
+            // _data = LitJson.JsonMapper.ToObject(func.Numerical1);
+            // int _itemID;
+            // _keys.Clear();
+            // _keys.AddRange(_data.Keys);
+            // for (int j = 0; j < _keys.Count; ++j)
+            // {
+            //     if (int.TryParse(_keys[j].ToString(), out _itemID))
+            //     {
+            //         if (!DropItemEffectMapID.ContainsKey(_itemID))
+            //         {
+            //             DropItemEffectMapID.Add(_itemID, new List<int>());
+            //         }
+            //         var _jsonMapIDs = _data[_keys[j]];
+            //         foreach (var _jsonMapID in _jsonMapIDs)
+            //         {
+            //             var _mapID = ((LitJson.IJsonWrapper)_jsonMapID).GetInt();
+            //             if (!DropItemEffectMapID[_itemID].Contains(_mapID))
+            //             {
+            //                 DropItemEffectMapID[_itemID].Add(_mapID);
+            //             }
+            //         }
+            //     }
+            // }
+
+            // int[] mapIDs = GetIntArray("RebornAutoFightDungeon");
+            // RebornAutoFightMapID = new List<int>(mapIDs);
+
+            // teamWorldCall = GetInputString("TeamWorldCall");
+            // teamWorldCallInviteCount = GetInt("TeamWorldCall", 2);
+
+            // var ancientKingAwradConfig = FuncConfigConfig.Get("ElderBattlefieldTopAward");
+            // if (ancientKingAwradConfig != null)
+            // {
+            //     var itemArray = LitJson.JsonMapper.ToObject<int[][]>(ancientKingAwradConfig.Numerical1);
+            //     for (int k = 0; k < itemArray.Length; k++)
+            //     {
+            //         // ancientKingAwards.Add(new Item()
+            //         // {
+            //         //     id = itemArray[k][0],
+            //         //     count = itemArray[k][1],
+            //         // });
+            //     }
+            // }
+
+            // func = FuncConfigConfig.Get("QualityEffectConfig");
+            // lowQualityEffectCount = int.Parse(func.Numerical1);
+            // medQualityEffectCount = int.Parse(func.Numerical2);
+            // highQualityEffectCount = int.Parse(func.Numerical3);
+
+            // func = FuncConfigConfig.Get("QualityPetCountConfig");
+            // lowQualityPetCount = int.Parse(func.Numerical1);
+            // medQualityPetCount = int.Parse(func.Numerical2);
+            // highQualityPetCount = int.Parse(func.Numerical3);
+
+            // func = FuncConfigConfig.Get("QualityGuardCountConfig");
+            // lowQualityGuardCount = int.Parse(func.Numerical1);
+            // medQualityGuardCount = int.Parse(func.Numerical2);
+            // highQualityGuardCount = int.Parse(func.Numerical3);
+
+            // func = FuncConfigConfig.Get("QualityPetEffectCount");
+            // lowQualityPetEffectCount = int.Parse(func.Numerical1);
+            // medQualityPetEffectCount = int.Parse(func.Numerical2);
+            // highQualityPetEffectCount = int.Parse(func.Numerical3);
+
+            // func = FuncConfigConfig.Get("QualityHorseEffectCount");
+            // lowQualityHorseEffectCount = int.Parse(func.Numerical1);
+            // medQualityHorseEffectCount = int.Parse(func.Numerical2);
+            // highQualityHorseEffectCount = int.Parse(func.Numerical3);
+
+            // fairyLandBuffCondition = GetInt("XjmjAddHarm", 1);
+            // fairyLandBuffId = GetInt("XjmjAddHarm", 2);
+            // achievementEarlierStageLevel = GetInt("AchieveLV");
+
+            // func = FuncConfigConfig.Get("PreloadSkillEffect");
+            // PreloadSkillEffect = new int[2][];
+            // PreloadSkillEffect[0] = GetIntArray("PreloadSkillEffect");
+            // PreloadSkillEffect[1] = GetIntArray("PreloadSkillEffect", 2);
+            // demonJarAutoTime = GetInt("DemonJarAutoTime");
+
+            // // if (SgzzRobotEquipDict == null)
+            // // {
+            // //     SgzzRobotEquipDict = new Dictionary<int, Dictionary<int, GA_NpcFightSgzcZZ.EquipRandomInfo>>();
+
+            // //     for (int job = 1; job <= 3; ++job)
+            // //     {
+            // //         string _jsonString = GetInputString("SGZCHelpBattleEquip", job);
+
+            // //         if (string.IsNullOrEmpty(_jsonString))
+            // //         {
+            // //             continue;
+            // //         }
+
+            // //         var _jsonData = LitJson.JsonMapper.ToObject(_jsonString);
+            // //         var _jobDict = new Dictionary<int, GA_NpcFightSgzcZZ.EquipRandomInfo>();
+
+            // //         for (i = 0; i < _jsonData.Count; ++i)
+            // //         {
+            // //             var _lvJson = _jsonData[i];
+            // //             var _lv = (int)_lvJson["LV"];
+            // //             if (!_jobDict.ContainsKey(_lv))
+            // //             {
+            // //                 var _equips = _lvJson["Equips"];
+
+            // //                 var _randEquip = new GA_NpcFightSgzcZZ.EquipRandomInfo();
+
+            // //                 _randEquip.randClothesItemIDs = new int[_equips[0].Count];
+            // //                 for (int j = 0; j < _equips[0].Count; ++j)
+            // //                 {
+            // //                     _randEquip.randClothesItemIDs[j] = (int)_equips[0][j];
+            // //                 }
+
+            // //                 _randEquip.randWeaponItemIDs = new int[_equips[1].Count];
+            // //                 for (int j = 0; j < _equips[1].Count; ++j)
+            // //                 {
+            // //                     _randEquip.randWeaponItemIDs[j] = (int)_equips[1][j];
+            // //                 }
+
+            // //                 _randEquip.randSecondaryItemIDs = new int[_equips[2].Count];
+            // //                 for (int j = 0; j < _equips[2].Count; ++j)
+            // //                 {
+            // //                     _randEquip.randSecondaryItemIDs[j] = (int)_equips[2][j];
+            // //                 }
+
+            // //                 _randEquip.randWingItemIDs = new int[_equips[3].Count];
+            // //                 for (int j = 0; j < _equips[3].Count; ++j)
+            // //                 {
+            // //                     _randEquip.randWingItemIDs[j] = (int)_equips[3][j];
+            // //                 }
+
+            // //                 _randEquip.godWeaponIDs = new int[_equips[4].Count];
+            // //                 for (int j = 0; j < _equips[4].Count; ++j)
+            // //                 {
+            // //                     _randEquip.godWeaponIDs[j] = (int)_equips[4][j];
+            // //                 }
+
+            // //                 _jobDict.Add(_lv, _randEquip);
+            // //             }
+            // //         }
+
+            // //         SgzzRobotEquipDict.Add(job, _jobDict);
+
+            // //     }
+            // // }
+
+
+            // if (SgzcRealm == null)
+            // {
+            //     SgzcRealm = new Dictionary<int, int>();
+
+            //     var _lvArr = GetInputString("SGZCRobotRealm", 1).Split('|');
+            //     var _rLvArr = GetInputString("SGZCRobotRealm", 2).Split('|');
+
+            //     for (int j = 0; j < _lvArr.Length; ++j)
+            //     {
+            //         SgzcRealm[int.Parse(_lvArr[j])] = int.Parse(_rLvArr[j]);
+            //     }
+            // }
+
+            // crossServerBattleFieldOpenDay = GetInt("CrossRealmCfg", 2);
+            // UISpringDecorate = GetInt("UISpringDecorate");
+
+            // mixServerCustomDays = GetInt("MixServer");
+            // openServerCustomDays = GetInt("OperationAction");
+            // ClientPvpAttributePer = GetInt("ClientPvPAttributePer") * Constants.F_DELTA;
+
+            // mysteryShopRefreshItem = GetInt("MysteryShopRefresh");
+            // mysteryShopRefreshItemCount = new Dictionary<int, int>();
+            // var mysteryShopJson = JsonMapper.ToObject(GetInputString("MysteryShopRefresh", 2));
+            // foreach (var key in mysteryShopJson.Keys)
+            // {
+            //     var time = int.Parse(key);
+            //     mysteryShopRefreshItemCount[time] = (int)mysteryShopJson[key];
+            // }
+
+            // mysteryShopRefreshItemValue = GetInt("MysteryShopRefresh", 3);
+            // mysteryShopRefreshInterval = GetInt("MysteryShopRefresh", 4);
+
+            // var equipStarConfig = FuncConfigConfig.Get("EquipPartStar");
+            // var equipStarJson = LitJson.JsonMapper.ToObject(equipStarConfig.Numerical1);
+            // equipStarLimit = new Dictionary<int, Dictionary<int, int>>();
+            // foreach (var itemColorKey in equipStarJson.Keys)
+            // {
+            //     var itemColor = int.Parse(itemColorKey);
+            //     Dictionary<int, int> dict = new Dictionary<int, int>();
+            //     foreach (var itemLevelKey in equipStarJson[itemColorKey].Keys)
+            //     {
+            //         var itemLevel = int.Parse(itemLevelKey);
+            //         var starLimit = int.Parse(equipStarJson[itemColorKey][itemLevelKey].ToString());
+            //         dict.Add(itemLevel, starLimit);
+            //     }
+            //     equipStarLimit.Add(itemColor, dict);
+            // }
+
+            // equipTrainMustItemId = GetInt("EquipWashMustID");
+            // acutionItemHour = GetInt("AuctionItem");
+            // mainWinTopCloseTime = GetInt("AutomaticSwitch");
+
+            // equipDecomposeScreen.AddRange(GetIntArray("EquipDecomposeScreen", 2));
+
+            // func = FuncConfigConfig.Get("AtkTypeIncreasePushDis");
+            // var _ks = func.Numerical1.Split('|');
+            // var _vs = func.Numerical2.Split('|');
+            // for (i = 0; i < _ks.Length; ++i)
+            // {
+            //     AtkTypeIncreasePushDis[int.Parse(_ks[i])] = int.Parse(_vs[i]) * Constants.F_DELTA;
+            // }
+
+            // func = FuncConfigConfig.Get("NpcDieSetCamera");
+            // if (func != null)
+            // {
+            //     var _jsonData = LitJson.JsonMapper.ToObject(func.Numerical1);
+            //     for (i = 0; i < _jsonData.Count; ++i)
+            //     {
+            //         var _child = _jsonData[i];
+            //         // var _lookAtData = new CameraController.LookAtData();
+            //         // _lookAtData.position = new Vector3(MathUtility.GetFloatFromLitJson(_child[1][0]),
+            //         //                                    MathUtility.GetFloatFromLitJson(_child[1][1]),
+            //         //                                    MathUtility.GetFloatFromLitJson(_child[1][2]));
+            //         // _lookAtData.rotX = (int)_child[2];
+            //         // _lookAtData.rotY = (int)_child[3];
+            //         // _lookAtData.lastTime = MathUtility.GetFloatFromLitJson(_child[4]);
+
+            //         // NpcDieSetCamera[(int)_child[0]] = _lookAtData;
+            //     }
+            // }
+            // WorkForEnemySkills = GetIntArray("ArenaSetSkills", 1);
+            // WorkForMeSkills = GetIntArray("ArenaSetSkills", 2);
+            // WorkNotSkills = GetIntArray("ArenaSetSkills", 3);
+            // defenseGetWays = GetIntArray("DefenseGetWays", 1);
+            // skillYinjis = ConfigParse.GetDic<int, int>(GetInputString("SkillYinji", 1));
+            // onlyUsedAtBackpackItems = new List<int>(GetIntArray("ItemPush", 2));
+
+            // var signInSkillArray = GetIntArray("SignInPromoteSkill", 1);
+            // if (signInSkillArray != null)
+            // {
+            //     signInPromoteSkills.AddRange(signInSkillArray);
+            // }
+
+            // MasteryLoadingLevelLimit1 = GetInt("MasteryLoadingLevelLimit");
+            // MasteryLoadingLevelLimit2 = GetInt("MasteryLoadingLevelLimit", 2);
+
+            // chestDisplayItems = new List<int>(GetIntArray("ChestShowItems"));
+
+            // func = FuncConfigConfig.Get("Zhanling");
+            // if (func != null)
+            // {
+            //     OldZhanLingCtgIdDict = new Dictionary<int, int>();
+            //     ZhanLingCtgIdDict = new Dictionary<int, List<int>>();
+            //     var tempDict = JsonMapper.ToObject(func.Numerical1);
+            //     var keyList = tempDict.Keys.ToList();
+            //     for (int j = 0; j < keyList.Count; j++)
+            //     {
+            //         OldZhanLingCtgIdDict[int.Parse(keyList[j])] = JsonMapper.ToObject<List<int>>(tempDict[keyList[j]].ToJson())[0];
+            //         ZhanLingCtgIdDict[int.Parse(keyList[j])] = JsonMapper.ToObject<List<int>>(tempDict[keyList[j]].ToJson());
+            //     }
+
+            //     ZhanLingCtgIdHDict = new Dictionary<int, List<int>>();
+            //     tempDict = JsonMapper.ToObject(func.Numerical3);
+            //     keyList = tempDict.Keys.ToList();
+            //     for (int k = 0; k < keyList.Count; k++)
+            //     {
+            //         ZhanLingCtgIdHDict[int.Parse(keyList[k])] = JsonMapper.ToObject<List<int>>(tempDict[keyList[k]].ToJson());
+            //     }
+            // }
+
+            // func = FuncConfigConfig.Get("FBQuickPass");
+            // fightPowerMore = float.Parse(func.Numerical1) + 0.01f; //鐤戜技鐜╁鏃犳硶闆疯瘺鏄疌/S璁$畻涓嶅绛夐棶棰橈紝鎵�浠ュ姞0.01f
+            // flashOpenArr = JsonMapper.ToObject<int[]>(func.Numerical2);
+            // flashCntMoreArr = JsonMapper.ToObject<int[]>(func.Numerical3);
+            // flashKillMaxCount = int.Parse(func.Numerical4);
 
         }
         catch (Exception ex)
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..5237198
--- /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..0513ad9 100644
--- a/Main/System/KnapSack/Logic/ItemLogicUtility.cs
+++ b/Main/System/KnapSack/Logic/ItemLogicUtility.cs
@@ -7,22 +7,10 @@
 
     public class ItemLogicUtility : Singleton<ItemLogicUtility>
     {
-        private string dogzGSFormula;
         private string normalGSFormula;
-        private Dictionary<int, string> specialSpiritPropertyFormula = new Dictionary<int, string>();
-        Dictionary<int, int> specialSpiritPropertyMaxLevels;
 
-        private int[] preciousItemTypes;
-        private int[] preciousItemIDs; // 涓嶅睍绀虹殑鐗╁搧ID
-        public int[] drugIDs;
-        private int[] onekeySellTypes;
-        private int[] pushItemIds;
-
-        private int lsItemCnt; // 鑳屽寘涓殑鐏电煶鏁伴噺
 
         private List<int> equipBaseProperties = new List<int>();
-        private Dictionary<int, int> promptUseLimitDict;
-        private Dictionary<int, List<int>> betterEquipExceptDungeonDict;
         Dictionary<int, int> equipSkillScores = new Dictionary<int, int>();
 
         PackManager packModel { get { return PackManager.Instance; } }
@@ -38,15 +26,8 @@
         public void Init()
         {
             var GSFormulaConfig = FuncConfigConfig.Get("EquipGSFormula");
-            dogzGSFormula = GSFormulaConfig.Numerical3;
             normalGSFormula = GSFormulaConfig.Numerical1;
 
-            var json = JsonMapper.ToObject(FuncConfigConfig.Get("OutOfPrintValue").Numerical2);
-            foreach (var key in json.Keys)
-            {
-                specialSpiritPropertyFormula[int.Parse(key)] = json[key].ToString();
-            }
-            specialSpiritPropertyMaxLevels = ConfigParse.GetDic<int, int>(FuncConfigConfig.Get("OutOfPrintValueDes").Numerical1);
             var equipSkillScoreJson = JsonMapper.ToObject(GSFormulaConfig.Numerical4);
             foreach (var key in equipSkillScoreJson.Keys)
             {
@@ -66,29 +47,9 @@
                     equipBaseProperties.Add(int.Parse(baseAttr[i].ToString()));
                 }
             }
-            lsItemCnt = int.Parse(FuncConfigConfig.Get("LingshiShowCount").Numerical1);
 
-            preciousItemTypes = ConfigParse.GetMultipleStr<int>(FuncConfigConfig.Get("ItemPush").Numerical1);
-            promptUseLimitDict = ConfigParse.GetDic<int, int>(FuncConfigConfig.Get("NoPromptUsetItem").Numerical1);
-            preciousItemIDs = ConfigParse.GetMultipleStr<int>(FuncConfigConfig.Get("ItemPush").Numerical3);
-            drugIDs = ConfigParse.GetMultipleStr<int>(FuncConfigConfig.Get("LifePotionlist").Numerical1);
 
-            onekeySellTypes = ConfigParse.GetMultipleStr<int>(FuncConfigConfig.Get("OneKeySellItemType").Numerical1);
 
-            pushItemIds = ConfigParse.GetMultipleStr<int>(FuncConfigConfig.Get("IntroductionItem").Numerical1);
-
-            betterEquipExceptDungeonDict = new Dictionary<int, List<int>>();
-            var excEquipData = JsonMapper.ToObject(FuncConfigConfig.Get("GoodItemDungeon").Numerical1);
-            foreach (var dungeonId in excEquipData.Keys)
-            {
-                var itemIds = new List<int>();
-                betterEquipExceptDungeonDict.Add(int.Parse(dungeonId), itemIds);
-                for (var i = 0; i < excEquipData[dungeonId].Count; i++)
-                {
-                    var itemId = int.Parse(excEquipData[dungeonId][i].ToString());
-                    itemIds.Add(itemId);
-                }
-            }
 
             DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize;
         }
@@ -213,63 +174,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,470 +259,94 @@
         /// <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;
-        //     }
-
-        //     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;
-
-        //     properties[(int)PropertyType.MinAtk] = minAttack + attack;
-        //     properties[(int)PropertyType.MaxAtk] = maxAttack + attack;
-
-        //     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;
-        //         }
-        //     }
-
-        //     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
-        //     {
-
-        //         if (config.AddSkill1 != 0 && equipSkillScores.ContainsKey(config.AddSkill1))
-        //         {
-        //             skillScore += equipSkillScores[config.AddSkill1];
-        //         }
-
-        //         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);
-        //     }
-        // }
-
-        #endregion
-
-        #region 涓荤晫闈㈢墿鍝佸脊妗嗗睍绀�
-        public event Action<PackType, string> GetPreciousItemEvent; //寰楀埌鐝嶅搧  value 鐗╁搧鐨勫疄渚婭D
-        public event Action<PackType, string> GetExpItemEvent; //寰楀埌缁忛獙鐗╁搧  value 鐗╁搧鐨勫疄渚婭D
-        public void RecommendItem(ItemModel item)
+        private int CalculateEquipScore(int itemId, EquipSorceProperties properties, Dictionary<int, List<int>> useDataDic = null)
         {
-            if (item.packType != PackType.Item)
+            var config = ItemConfig.Get(itemId);
+            if (config == null || !GeneralDefine.CompareEquipPlaces.Contains(config.EquipPlace))
             {
-                return;
-            }
-            if (!preciousItemTypes.Contains(item.config.Type))
-            {
-                int mapId = PlayerDatas.Instance.baseData.MapID;
-                var drugList = packModel.GetDrugIDListByDungeonID(mapId);
-                if (drugList == null)
-                    return;
-                if (!drugList.Contains(item.config.ID))
-                    return;
+                return 0;
             }
 
-            if (item.config.Type == 145 && item.config.CDTime > 0)
+            //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;
+
+            properties[(int)PropertyType.MinAtk] = minAttack + attack;
+            properties[(int)PropertyType.MaxAtk] = maxAttack + attack;
+
+            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 createTime = item.GetUseDataFirstValue((int)ItemUseDataKey.createTime);
-                if (createTime > 0)
+                var attrType = (PropertyType)key;
+                switch (attrType)
                 {
-                    DateTime useTime;
-                    if (item.config.CDTypeEx == 1)
-                    {
-                        //itemConfig.CDTime 涓哄ぉ锛岃繃0鐐瑰彲鐢�
-                        useTime = TimeUtility.GetTime((uint)createTime).AddDays(item.config.CDTime);
-                        useTime = TimeUtility.GetDayStartTime(useTime.Year, useTime.Month, useTime.Day);
-                    }
-                    else
-                    {
-                        useTime = TimeUtility.GetTime((uint)createTime).AddSeconds(item.config.CDTime);
-                    }
-                    if (TimeUtility.ServerNow < useTime)
-                    {
-                        return;
-                    }
+                    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;
                 }
             }
 
-            if (preciousItemIDs != null && preciousItemIDs.Contains(item.config.ID))
+            foreach (var key in curEquipAttrDict.Keys)
             {
-                return;
-            }
-            if (item.config.ID == packModel.lsItemID)
-            {
-                int tmpCnt = PlayerDatas.Instance.baseData.LV < 50 ? 5 : lsItemCnt;
-                if (packModel.GetItemCountByID(PackType.Item, packModel.lsItemID) < tmpCnt)
-                    return;
-            }
-            //if (item.isAuction)
-            //{
-            //    return;
-            //}
-
-            if (item.config.UseLV > PlayerDatas.Instance.baseData.LV)
-            {
-                return;
-            }
-
-            if (IsOverdue(item.guid))
-            {
-                return;
-            }
-
-            // if (!IsAbleToUse(item))
-            // {
-            //     return;
-            // }
-
-            if (IsSpiritWeapon(item.itemId))
-            {
-                if (IsFightUp(item.itemId, item.score) != 1)
+                var propertyConfig = PlayerPropertyConfig.Get((int)key);
+                if (propertyConfig != null)
                 {
-                    return;
+                    Equation.Instance.AddKeyValue(propertyConfig.Parameter, curEquipAttrDict[key]);
                 }
             }
-            if (item.config.Type == 13)
+
+            var skillScore = 0;
+            if (useDataDic != null && useDataDic.ContainsKey((int)ItemUseDataKey.equipSkills))
             {
-                // 缁忛獙涓圭壒娈婂鐞嗭紝浼樺厛鏄剧ず
-                if (GetExpItemEvent != null)
+                for (int i = 0; i < useDataDic[(int)ItemUseDataKey.equipSkills].Count; i++)
                 {
-                    GetExpItemEvent(item.packType, item.guid);
+                    skillScore += equipSkillScores[useDataDic[(int)ItemUseDataKey.equipSkills][i]];
                 }
             }
             else
             {
-                if (GetPreciousItemEvent != null)
+
+                if (config.AddSkill1 != 0 && equipSkillScores.ContainsKey(config.AddSkill1))
                 {
-                    GetPreciousItemEvent(item.packType, item.guid);
+                    skillScore += equipSkillScores[config.AddSkill1];
+                }
+
+                if (config.AddSkill2 != 0 && equipSkillScores.ContainsKey(config.AddSkill2))
+                {
+                    skillScore += equipSkillScores[config.AddSkill2];
                 }
 
             }
+
+
+            return skillScore + Equation.Instance.Eval<int>(normalGSFormula);
         }
 
-        // bool IsAbleToUse(ItemModel item)
-        // {
-        //     var windowSearch = WindowSearchConfig.Get(item.config.Jump);
-        //     if (windowSearch != null)
-        //     {
-        //         if (!FuncOpen.Instance.IsFuncOpen(windowSearch.Lv) && windowSearch.Lv != 0)
-        //         {
-        //             return false;
-        //         }
-        //     }
+        #endregion
 
-        //     if (pushItemIds.Contains(item.itemId))
-        //     {
-        //         var itemCnt = packModel.GetItemCountByID(PackType.Item, item.itemId) - item.count;
-        //         if (itemCnt > 0)
-        //         {
-        //             return false;
-        //         }
-        //         else
-        //         {
-        //             if (item.preItemCount > 0)
-        //             {
-        //                 return false;
-        //             }
-        //         }
-        //     }
-
-        //     if (promptUseLimitDict.ContainsKey(item.itemId))
-        //     {
-        //         var playerLv = PlayerDatas.Instance.baseData.LV;
-        //         if (playerLv < promptUseLimitDict[item.itemId])
-        //         {
-        //             return false;
-        //         }
-        //     }
-
-        //     ulong canUseCnt = 0;
-        //     if (packModel.IsReachUseLimit(item.guid, out canUseCnt))
-        //     {
-        //         return false;
-        //     }
-
-        //     bool isBox = false;
-        //     bool isCanOpen = ModelCenter.Instance.GetModel<BoxGetItemModel>().CheckOpenBoxCondition(item.itemId, out isBox);
-        //     if (isBox)
-        //     {
-        //         if (!isCanOpen)
-        //         {
-        //             return false;
-        //         }
-        //     }
-
-        //     //if (trialModel.trialTokens.Contains(item.itemId))
-        //     //{
-        //     //    if (!trialModel.IsAnySatisfyExchangeBetter(item.itemId))
-        //     //    {
-        //     //        return false;
-        //     //    }
-        //     //}
-
-        //     if (packModel.CheckIsDrugById(item.itemId))
-        //     {
-        //         if (item.config.RealmLimit > PlayerDatas.Instance.baseData.realmLevel)
-        //         {
-        //             return false;
-        //         }
-        //     }
-
-        //     var fruitConfig = AttrFruitConfig.Get(item.itemId);
-        //     if (fruitConfig != null && fruitConfig.FuncID == 2)
-        //     {
-        //         if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.BlastFurnace))
-        //         {
-        //             return false;
-        //         }
-        //     }
-
-        //     switch (item.config.Type)
-        //     {
-        //         case 8:
-        //             if (buffDatas.BastBuff(item.itemId))
-        //             {
-        //                 return false;
-        //             }
-        //             break;
-        //         case 20:
-        //             if (magicianModel.IsGodWeaponMaxLevelByItem(item.itemId))
-        //             {
-        //                 return false;
-        //             }
-        //             break;
-        //         case 21:
-        //             if (!mountDatas.IsHint(HorseEnum.HorseDan, item.itemId))
-        //             {
-        //                 return false;
-        //             }
-        //             break;
-        //         case 22:
-        //             if (!mountDatas.IsHint(HorseEnum.HorseStone, item.itemId))
-        //             {
-        //                 return false;
-        //             }
-        //             break;
-        //         case 41:
-        //             if (!mountDatas.IsHint(HorseEnum.HorseDebris, item.itemId))
-        //             {
-        //                 return false;
-        //             }
-        //             break;
-        //         case 26:
-        //             if (!petDatas.IsHint(PetEnum.PetDebris, item.itemId))
-        //             {
-        //                 return false;
-        //             }
-        //             break;
-        //         case 27:
-        //             if (!petDatas.IsHint(PetEnum.PetDan, item.itemId))
-        //             {
-        //                 return false;
-        //             }
-        //             break;
-        //         case 28:
-        //             if (!petDatas.IsHint(PetEnum.PetStone, item.itemId))
-        //             {
-        //                 return false;
-        //             }
-        //             break;
-        //         case 25:
-        //             if (!ModelCenter.Instance.GetModel<EquipGemModel>().IsBetterGem(item.itemId))
-        //             {
-        //                 return false;
-        //             }
-        //             break;
-        //         case 39:
-        //             if (!IsBetterWings(item))
-        //             {
-        //                 return false;
-        //             }
-        //             break;
-        //         case 52:
-        //             if (!strengthDatas.IsHint(item.itemId))
-        //             {
-        //                 return false;
-        //             }
-        //             break;
-        //         case 55:
-        //             if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.BlastFurnace))
-        //             {
-        //                 return false;
-        //             }
-        //             var alchemyId = 0;
-        //             if (alchemyModel.TryGetAlchemyByStudyMaterial(item.itemId, out alchemyId))
-        //             {
-        //                 var alchemyConfig = AlchemyConfig.Get(alchemyId);
-        //                 int alchemingId;
-        //                 if (alchemyModel.IsStoveAlcheming((AlchemyType)alchemyConfig.AlchemType, out alchemingId))
-        //                 {
-        //                     return false;
-        //                 }
-        //                 if (alchemyModel.IsGraspRecipe(alchemyId))
-        //                 {
-        //                     return false;
-        //                 }
-        //                 var studyError = 0;
-        //                 if (!alchemyModel.TryLearn(alchemyId, out studyError))
-        //                 {
-        //                     return false;
-        //                 }
-        //             }
-        //             break;
-        //         case 127:
-        //             var error = 0;
-        //             bool isHaveMakeNum = ItemOperateUtility.Instance.CanUseItem(item.guid, 1, out error);
-        //             int remainNum = CrossServerOneVsOnePlayerInfo.Instance.GetDayRemainNum();
-        //             if (!CrossServerOneVsOnePKSeason.Instance.isSatisfyMatch
-        //                 || remainNum > 0
-        //                 || !isHaveMakeNum)
-        //             {
-        //                 return false;
-        //             }
-        //             break;
-        //         default:
-        //             break;
-        //     }
-
-        //     switch (item.itemId)
-        //     {
-        //         case 951:
-        //             if (!CheckIsExtendGrid(item.itemId))
-        //             {
-        //                 return false;
-        //             }
-        //             break;
-        //         case 952:
-        //             return false;
-        //             break;
-
-        //     }
-
-        //     return true;
-        // }
-
-        // private bool IsBetterWings(ItemModel item)
-        // {
-        //     if (item == null)
-        //     {
-        //         return false;
-        //     }
-
-        //     var putModel = packModel.GetItemByIndex(PackType.Equip, SpiritWeaponModel.WING_EQUIPINDEX);
-        //     var singlePack = packModel.GetSinglePack(PackType.Item);
-        //     if (singlePack == null)
-        //     {
-        //         return false;
-        //     }
-
-        //     int[] composeTypes = item.config.JumpComposeCondi;
-        //     bool isOpenCompose = false;
-        //     if (composeTypes != null && composeTypes.Length >= 3)
-        //     {
-        //         int first = composeTypes[0];
-        //         int second = composeTypes[1];
-        //         int third = composeTypes[2];
-        //         ComposeWinModel.ComposeThirdTypeData thirdTypeData = null;
-        //         composeModel.TryGetThirdTypeData(first, second, third, out thirdTypeData);
-        //         if (thirdTypeData != null)
-        //         {
-        //             var itemCompound = thirdTypeData.itemCompound;
-        //             if (itemCompound.levelNeed <= PlayerDatas.Instance.baseData.LV)
-        //             {
-        //                 isOpenCompose = true;
-        //             }
-        //         }
-        //     }
-
-        //     if (!isOpenCompose)
-        //     {
-        //         return false;
-        //     }
-
-        //     if (putModel != null && putModel.config.LV >= item.config.LV)
-        //     {
-        //         return false;
-        //     }
-
-        //     var itemModels = packModel.GetItems(PackType.Item, new SinglePack.FilterParams()
-        //     {
-        //         itemTypes = new List<int>() { (int)ItemType.Equip_Wing }
-        //     });
-
-        //     if (itemModels != null)
-        //     {
-        //         for (int i = 0; i < itemModels.Count; i++)
-        //         {
-        //             if (IsJobCompatibleItem(itemModels[i].itemId))
-        //             {
-        //                 if (itemModels[i].config.LV >= item.config.LV)
-        //                 {
-        //                     return false;
-        //                 }
-        //             }
-        //         }
-        //     }
-
-        //     return true;
-        // }
-
+       
         private bool CheckIsExtendGrid(int itemId)
         {
             SinglePack singlePack = packModel.GetSinglePack(PackType.Item);
@@ -988,7 +552,6 @@
         //     }
         //     return RealmDruglist;
         // }
-        #endregion
 
         #region 鐗╁搧澶勪簬CD涓殑閫昏緫澶勭悊
 
diff --git a/Main/System/KnapSack/PackManager.cs b/Main/System/KnapSack/PackManager.cs
index 5b5648b..0dbd7f1 100644
--- a/Main/System/KnapSack/PackManager.cs
+++ b/Main/System/KnapSack/PackManager.cs
@@ -24,12 +24,9 @@
         //AlchemyModel alchemyModel { get { return ModelCenter.Instance.GetModel<AlchemyModel>(); } }
         //ItemTipsModel itemTipsModel { get { return ModelCenter.Instance.GetModel<ItemTipsModel>(); } }
 
-        public int lsItemID = 150; //鍙厬鎹㈢殑鐏电煶鐗╁搧ID
-        int lsItemCnt = 0;
         List<string> commonShowAwardEvents = new List<string>();
 
         public int[] autoUseItemIDs;
-        UIEffect lingshiEffect;  //鐏电煶鐗规晥
         public override void Init()
         {
             DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize;
@@ -37,72 +34,25 @@
             DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOk;
             ParseConfig();
             //SysNotifyMgr.Instance.sysNotifyEvent += RefreshSysInfo;
-            // List<DungeonOpenTimeConfig> dungeonlist = DungeonOpenTimeConfig.GetValues();
-            // if (dungeonlist != null)
-            // {
-            //     //DrugToDungeonDict = new Dictionary<int, int>();
-            //     DungeonToDrugDict = new Dictionary<int, int[]>();
+          
 
-            //     for (int i = 0; i < dungeonlist.Count; i++)
+
+            // FuncConfigConfig ShareUseCntItem = FuncConfigConfig.Get("ShareUseCntItem");
+            // sharedUseCountItemDict = new Dictionary<int, List<int>>();
+            // JsonData shareUseJson = JsonMapper.ToObject(ShareUseCntItem.Numerical1);
+            // if (shareUseJson.IsArray)
+            // {
+            //     for (int i = 0; i < shareUseJson.Count; i++)
             //     {
-            //         int[] drugIdlist = dungeonlist[i].ElixirHint;
-            //         if (drugIdlist != null && drugIdlist.Length > 0)
+            //         var idListJson = shareUseJson[i];
+            //         var idlist = new List<int>();
+            //         sharedUseCountItemDict.Add(i, idlist);
+            //         foreach (var id in idListJson)
             //         {
-            //             DungeonToDrugDict.Add(dungeonlist[i].DataMapID, drugIdlist);
-            //             //for (int j = 0; j < drugIdlist.Length; j++)
-            //             //{
-            //             //    DrugToDungeonDict.Add(drugIdlist[j], dungeonlist[i].DataMapID);
-            //             //}
+            //             idlist.Add(int.Parse(id.ToString()));
             //         }
             //     }
             // }
-
-            // makeDruglist = new List<AttrFruitConfig>();
-            // List<AttrFruitConfig> fruitlist = AttrFruitConfig.GetValues();
-            // for (int i = 0; i < fruitlist.Count; i++)
-            // {
-            //     if (fruitlist[i].FuncID == 2)
-            //     {
-            //         makeDruglist.Add(fruitlist[i]);
-            //     }
-            // }
-            // StageLoad.Instance.onStageLoadFinish += OnStageLoadFinish;
-
-            SetDevourEquipPlace();
-
-            // decomposeAttrDict.Clear();
-            // List<EquipDeComposeConfig> decomlist = EquipDeComposeConfig.GetValues();
-            // for (int i = 0; i < decomlist.Count; i++)
-            // {
-            //     JsonData attrData = JsonMapper.ToObject(decomlist[i].Attr);
-            //     Dictionary<int, int> attrDict = new Dictionary<int, int>();
-            //     decomposeAttrDict.Add(decomlist[i].LV, attrDict);
-            //     foreach (var id in attrData.Keys)
-            //     {
-            //         attrDict.Add(int.Parse(id), int.Parse(attrData[id].ToString()));
-            //     }
-            // }
-
-            FuncConfigConfig equipDecompose = FuncConfigConfig.Get("EquipDevourCount");
-            minDecomposeNum = int.Parse(equipDecompose.Numerical1);
-            defaultUnSelectlist = ConfigParse.GetMultipleStr<int>(equipDecompose.Numerical2);
-
-            FuncConfigConfig ShareUseCntItem = FuncConfigConfig.Get("ShareUseCntItem");
-            sharedUseCountItemDict = new Dictionary<int, List<int>>();
-            JsonData shareUseJson = JsonMapper.ToObject(ShareUseCntItem.Numerical1);
-            if (shareUseJson.IsArray)
-            {
-                for (int i = 0; i < shareUseJson.Count; i++)
-                {
-                    var idListJson = shareUseJson[i];
-                    var idlist = new List<int>();
-                    sharedUseCountItemDict.Add(i, idlist);
-                    foreach (var id in idListJson)
-                    {
-                        idlist.Add(int.Parse(id.ToString()));
-                    }
-                }
-            }
 
             ParseItemCount();
 
@@ -140,27 +90,18 @@
 
         private void OnFuncStateChangeEvent(int id)
         {
-            if (id == (int)FuncOpenEnum.EquipDecompose)
-            {
-                EquipDecomRedCtrl();
-            }
+
         }
         public void OnBeforePlayerDataInitialize()
         {
             GlobalTimeEvent.Instance.secondEvent -= UpdateSecond;
             PlayerDatas.Instance.playerDataRefreshEvent -= UpdatePlayerLv;
             LocalSave.DeleteKey(RecordKnapsackTitle);
-            cacheMapId = 0;
             playerPackDict.Clear();
             itemDayUseCntDict.Clear();
             itemSumUseCntDict.Clear();
             itemGUIDDict.Clear();
             isPlayBetterEquipEffect = false;
-            colorType = EquipColorType.Orange;
-            decomposeLv = 1;
-            decomposeExp = 0;
-            decomposeProgress = 0;
-            isAutoDecompose = false;
         }
 
         public void OnAfterPlayerDataInitialize()
@@ -171,7 +112,6 @@
         public void OnPlayerLoginOk()
         {
             //ItemOperateUtility.Instance.RequestWarehouseData();
-            EquipDecomRedCtrl();
             RoleEquipLocalSave = StringUtility.Contact("RoleEquipLocalSave", PlayerDatas.Instance.baseData.PlayerID);
             StrengthAttrShift_RecordKey = StringUtility.Contact(PlayerDatas.Instance.baseData.PlayerID, "StrengthAttrShift");
             if (LocalSave.GetIntArray(RoleEquipLocalSave) != null)
@@ -321,20 +261,10 @@
 
             UpdatePackRedpoint(type);
             //EquipDecomRedCtrl();
-            m_CheckEquipDecomRedCtrl = true;
             AutoUseItem(itemInfo.itemId, serverItem.ItemGUID);
         }
 
 
-        bool m_CheckEquipDecomRedCtrl = false;
-        void CheckEquipDecomRedCtrl()
-        {
-            if (m_CheckEquipDecomRedCtrl)
-            {
-                EquipDecomRedCtrl();
-                m_CheckEquipDecomRedCtrl = false;
-            }
-        }
 
 
         public void UpdateUnlockedGridCount(H0724_tagRolePackCanUseCount useCount)
@@ -381,7 +311,6 @@
                         {
                             itemCntAddEvent(type, itemModel.gridIndex, itemModel.itemId);
                         }
-                        ItemLogicUtility.Instance.RecommendItem(itemModel);
                         ItemLogicUtility.Instance.RefreshPickItem(type, itemModel.itemId.ToString());
                     }
                     else
@@ -397,7 +326,6 @@
                         refreshItemCountEvent(type, itemModel.gridIndex, itemModel.itemId);
                     }
 
-                    UpdateLSRedpoint(type, itemModel.itemId);
                 }
             }
 
@@ -444,8 +372,6 @@
             }
 
             UpdatePackRedpoint(type);
-            m_CheckEquipDecomRedCtrl = true;
-            //EquipDecomRedCtrl();
 
             if (GetItemByGuid(guid) == null)
             {
@@ -468,16 +394,6 @@
                 return;
             }
 
-            MakeUseItemSuccess(success.ItemIndex, (int)success.ItemID);
-            switch (success.ItemID)
-            {
-                // case 221:
-                //     if (WindowCenter.Instance.IsOpen<KnapSackWin>())
-                //     {
-                //         WindowCenter.Instance.Close<KnapSackWin>();
-                //     }
-                //     break;
-            }
 
             if (useItemSuccessEvent != null)
             {
@@ -493,28 +409,6 @@
             // }
         }
 
-        private void MakeUseItemSuccess(int index, int id)
-        {
-            ItemConfig itemConfig = ItemConfig.Get(id);
-            if (itemConfig.CDType != 0)
-            {
-                var items = GetItems(PackType.Item, new SinglePack.FilterParams()
-                {
-                    itemTypes = new List<int>() { (int)ItemType.Buff }
-                });
-
-                for (int i = 0; i < items.Count; i++)
-                {
-                    if (ItemLogicUtility.Instance.drugIDs.Contains(items[i].itemId))
-                    {
-                        itemConfig = ItemConfig.Get(items[i].itemId);
-                        float configCdTime = (float)Math.Round((double)itemConfig.CDTime / 1000, 1);
-                        KnapsackTimeCDMgr.Instance.Register(items[i].guid, items[i].itemId, configCdTime);
-                    }
-                }
-
-            }
-        }
 
         void AddItemGUIDDict(ItemModel itemModel, bool showNewItem)
         {
@@ -586,67 +480,16 @@
         #endregion
 
         #region 鐜╁瑁呭鐗规畩閫昏緫
-        public Dictionary<int, Dictionary<int, int>> spiritWeaponPathIds { get; private set; }
-        public Dictionary<int, int> wingsGetPathIdDict { get; private set; }
-        public Dictionary<int, List<int>> dungeonUseDict { get; private set; }
         void ParseConfig()
         {
-            FuncConfigConfig funcConfig = FuncConfigConfig.Get("WingYuPeiHQTJ");
-            spiritWeaponPathIds = new Dictionary<int, Dictionary<int, int>>();
-            var splits = funcConfig.Numerical3.Split('|');
-            for (int i = 0; i < splits.Length; i++)
-            {
-                var tempString = splits[i];
-                var matches = Regex.Matches(tempString.Trim(), "\\d+");
-                var equipPlace = int.Parse(matches[0].Value);
-                var job = int.Parse(matches[1].Value);
-                var itemId = int.Parse(matches[2].Value);
+           
 
-                if (!spiritWeaponPathIds.ContainsKey(equipPlace))
-                {
-                    spiritWeaponPathIds[equipPlace] = new Dictionary<int, int>();
-                }
-
-                spiritWeaponPathIds[equipPlace][job] = itemId;
-            }
-
-            FuncConfigConfig copyItemBulletWindow = FuncConfigConfig.Get("CopyItemBulletWindow");
-            JsonData copyWinData = JsonMapper.ToObject(copyItemBulletWindow.Numerical1);
-            dungeonUseDict = new Dictionary<int, List<int>>();
-            foreach (var dungeonId in copyWinData.Keys)
-            {
-                List<int> idlist = new List<int>();
-                dungeonUseDict.Add(int.Parse(dungeonId), idlist);
-                if (copyWinData[dungeonId].IsArray)
-                {
-                    JsonData useData = copyWinData[dungeonId];
-                    for (int i = 0; i < useData.Count; i++)
-                    {
-                        idlist.Add(int.Parse(useData[i].ToString()));
-                    }
-                }
-            }
-
-            lsItemCnt = int.Parse(FuncConfigConfig.Get("LingshiShowCount").Numerical1);
             var config = FuncConfigConfig.Get("CommonShowAwards");
             commonShowAwardEvents = JsonMapper.ToObject<List<string>>(config.Numerical1);
 
         }
 
-        public int GetRoleEquipPathId(int equipPlace)
-        {
-            int playerJob = PlayerDatas.Instance.baseData.Job;
-            switch ((RoleEquipType)equipPlace)
-            {
-                case RoleEquipType.Guard:
-                case RoleEquipType.PeerlessWeapon1:
-                case RoleEquipType.PeerlessWeapon2:
-                case RoleEquipType.Wing:
-                    return spiritWeaponPathIds[equipPlace][playerJob];
-                default:
-                    return 0;
-            }
-        }
+
 
         private void UpdateSecond()
         {
@@ -654,7 +497,6 @@
             {
                 isUpdatePlayerLv = false;
             }
-            CheckEquipDecomRedCtrl();
         }
 
         private void UpdatePlayerLv(PlayerDataType type)
@@ -947,27 +789,6 @@
         const int LS_REDKEY = 102011015;
         Redpoint redpointLS = new Redpoint(MainRedDot.RedPoint_BagFuncKey, LS_REDKEY);
 
-        private void UpdateLSRedpoint(PackType type, int itemID)
-        {
-            var singlePack = GetSinglePack(type);
-            if (singlePack == null)
-            {
-                return;
-            }
-            if (type != PackType.Item) return;
-            if (itemID != lsItemID) return;
-
-
-            if (GetItemCountByID(PackType.Item, lsItemID) < lsItemCnt)
-            {
-                redpointLS.state = RedPointState.None;
-            }
-            else
-            {
-                redpointLS.state = RedPointState.Simple;
-            }
-
-        }
 
         private void UpdatePackRedpoint(PackType type)
         {
@@ -989,14 +810,7 @@
                     {
                         redpointItemPack.state = RedPointState.None;
                     }
-                    if (GetItemCountByID(PackType.Item, lsItemID) < lsItemCnt)
-                    {
-                        redpointLS.state = RedPointState.None;
-                    }
-                    else
-                    {
-                        redpointLS.state = RedPointState.Simple;
-                    }
+
                     break;
                 case PackType.Warehouse:
                     if (singlePack.GetEmptyGridCount() <= 0)
@@ -1011,34 +825,7 @@
             }
         }
 
-        const int PLAYERSUMSTAR_REDKEY = 102011002;
-        Redpoint redpointSTAR = new Redpoint(MainRedDot.RedPoint_BagFuncKey, PLAYERSUMSTAR_REDKEY);
-
-        public const int EquipDecompose_RedKey = 10205;
-        public Redpoint redpointEquipDecom = new Redpoint(MainRedDot.RedPoint_MainPackKey, EquipDecompose_RedKey);
-        public void EquipDecomRedCtrl()
-        {
-            if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.EquipDecompose))
-            {
-                return;
-            }
-
-            if (PlayerDatas.Instance.baseData.LV < devourRedpointLevel)
-            {
-                redpointEquipDecom.state = RedPointState.None;
-                return;
-            }
-
-            var canDevourItems = GetCanDevourModellist();
-            if (canDevourItems != null && canDevourItems.Count >= minDevourEquipNum)
-            {
-                redpointEquipDecom.state = RedPointState.Simple;
-            }
-            else
-            {
-                redpointEquipDecom.state = RedPointState.None;
-            }
-        }
+        
         #endregion
 
         #region 鏌ョ湅鏌愪釜浣嶇疆鐨勭墿鍝�
@@ -1090,33 +877,7 @@
         private int cacheMapId = 0;
         public event Action<PackType, string> itemUseAct;
         private Dictionary<int, int> itemUseTypeDict = new Dictionary<int, int>(); //key SkillTypeID,value 浣跨敤鐗╁搧鐨処D
-        private void OnStageLoadFinish()
-        {
-            // itemUseTypeDict.Clear();
-            // if (PlayerDatas.Instance.baseData.MapID == cacheMapId)
-            // {
-            //     return;
-            // }
-
-            // cacheMapId = PlayerDatas.Instance.baseData.MapID;
-            // UpdateDungeonDanUse();
-            // UpdateDungeonUse();
-            // SinglePack singlePack = GetSinglePack(PackType.Item);
-            // foreach (int itemId in itemUseTypeDict.Values)
-            // {
-            //     var modellist = singlePack.GetItemsById(itemId);
-            //     if (modellist.Count > 0)
-            //     {
-            //         ItemModel itemModel = modellist[0];
-            //         bool isExist = StatusMgr.Instance.IsExist(PlayerDatas.Instance.hero.ServerInstID, itemModel.config.AddSkill1);
-            //         Debug.Log("Buff鏄惁瀛樺湪" + isExist);
-            //         if (itemUseAct != null && !isExist)
-            //         {
-            //             itemUseAct(PackType.Item, itemModel.guid);
-            //         }
-            //     }
-            // }
-        }
+        
 
         private void AddItemUseTypeDict(int id)
         {
@@ -1139,31 +900,8 @@
             }
         }
 
-        private void UpdateDungeonDanUse()
-        {
-            int mapId = PlayerDatas.Instance.baseData.MapID;
-            int[] useDrugs = GetDrugIDListByDungeonID(mapId);
-            if (useDrugs == null) return;
 
-            for (int i = 0; i < useDrugs.Length; i++)
-            {
-                int id = useDrugs[i];
-                AddItemUseTypeDict(id);
-            }
-        }
 
-        private void UpdateDungeonUse()
-        {
-            int mapId = PlayerDatas.Instance.baseData.MapID;
-            if (!dungeonUseDict.ContainsKey(mapId)) return;
-
-            List<int> useIdlist = dungeonUseDict[mapId];
-            for (int i = 0; i < useIdlist.Count; i++)
-            {
-                int id = useIdlist[i];
-                AddItemUseTypeDict(id);
-            }
-        }
 
         public SkillConfig GetSkillConfig(int itemId)
         {
@@ -1172,19 +910,8 @@
             return skillConfig;
         }
 
-        public int GetDungeonIDByDrugID(int drugID)
-        {
-            int dungeonID = 0;
-            //DrugToDungeonDict.TryGetValue(drugID, out dungeonID);
-            return dungeonID;
-        }
 
-        public int[] GetDrugIDListByDungeonID(int dungeonID)
-        {
-            int[] drugIDlist = null;
-            DungeonToDrugDict.TryGetValue(dungeonID, out drugIDlist);
-            return drugIDlist;
-        }
+
         #endregion
 
         #region 鍒ゆ柇鐗╁搧鏄惁杈惧埌浣跨敤涓婇檺
@@ -1228,442 +955,9 @@
         // }
         #endregion
 
-        #region 鐗╁搧鍚炲櫖閫昏緫澶勭悊
-        public EquipColorType colorType { get; private set; }
-        public event Action<EquipColorType> RefreshColorSelectAct;
-        public event Action RefreshEquipDecomNumAct;
-        public int[] defaultUnSelectlist { get; private set; }
+        
 
-        public int GetBetterEquipCount(List<ItemModel> itemModels)
-        {
-            if (itemModels.IsNullOrEmpty())
-            {
-                return 0;
-            }
-
-            var count = 0;
-            foreach (var item in itemModels)
-            {
-                if (ItemLogicUtility.Instance.IsFightUp(item.itemId, item.score) == 1)
-                {
-                    count += item.count;
-                }
-            }
-            return count;
-        }
-
-        public void SetColorSelect(EquipColorType type)
-        {
-            colorType = type;
-
-            if (RefreshColorSelectAct != null)
-            {
-                RefreshColorSelectAct(type);
-            }
-            SendEquipDevourRecordQuest();
-            EquipDecomRedCtrl();
-        }
-
-        public List<int> devourPlacelist { get; private set; }
-        public int devourRedpointLevel { get; private set; }
-        public int minDevourEquipNum { get; private set; }
-        public void SetDevourEquipPlace()
-        {
-            devourPlacelist = new List<int>();
-            FuncConfigConfig funcConfig = FuncConfigConfig.Get("PetAbsorbType");
-            int[] placeArray = ConfigParse.GetMultipleStr<int>(funcConfig.Numerical1);
-            for (int i = 0; i < placeArray.Length; i++)
-            {
-                devourPlacelist.Add(placeArray[i]);
-            }
-            devourRedpointLevel = int.Parse(funcConfig.Numerical2);
-            minDevourEquipNum = int.Parse(funcConfig.Numerical3);
-        }
-
-        List<ItemModel> devourModellist = new List<ItemModel>();
-        List<ItemModel> orderDevourModellist = new List<ItemModel>();
-        public List<ItemModel> GetDevourModellist()
-        {
-            SinglePack singlePack = GetSinglePack(PackType.Item);
-            if (singlePack == null) return null;
-
-            devourModellist.Clear();
-            orderDevourModellist.Clear();
-            foreach (var model in singlePack.GetAllItems().Values)
-            {
-                if (model.config.Type == 29)
-                {
-                    devourModellist.Add(model);
-                }
-                else
-                {
-                    if (devourPlacelist.Contains(model.config.EquipPlace))
-                    {
-                        if (GeneralDefine.equipDecomposeScreen.Contains(model.config.ItemColor))
-                        {
-                            devourModellist.Add(model);
-                        }
-                    }
-                }
-
-            }
-            orderDevourModellist.AddRange(devourModellist);
-            orderDevourModellist.Sort(CompareByColor);
-            return orderDevourModellist;
-        }
-
-        public int CompareByColor(ItemModel start, ItemModel next)
-        {
-            bool typeX = start.config.Type == 29 ? true : false;
-            bool typeY = next.config.Type == 29 ? true : false;
-
-            if (typeX.CompareTo(typeY) != 0) return -typeX.CompareTo(typeY);
-
-            int colorX = start.config.ItemColor;
-            int colorY = next.config.ItemColor;
-            if (colorX.CompareTo(colorY) != 0) return colorX.CompareTo(colorY);
-
-            int startIndex = devourModellist.IndexOf(start);
-            int nextIndex = devourModellist.IndexOf(next);
-            if (startIndex.CompareTo(nextIndex) != 0) return startIndex.CompareTo(nextIndex);
-
-            return 0;
-        }
-
-        public List<ItemModel> GetCanDevourModellist()
-        {
-            List<ItemModel> canDevourModellist = new List<ItemModel>();
-            SinglePack singlePack = GetSinglePack(PackType.Item);
-            if (singlePack == null || colorType == EquipColorType.None)
-            {
-                if (RefreshEquipDecomNumAct != null)
-                {
-                    RefreshEquipDecomNumAct();
-                }
-                return null;
-            }
-
-            foreach (var model in singlePack.GetAllItems().Values)
-            {
-                if (model.config.Type == 29)
-                {
-                    if (!defaultUnSelectlist.Contains(model.itemId))
-                    {
-                        canDevourModellist.Add(model);
-                    }
-                }
-                else
-                {
-                    if (IsCanDevour(model))
-                    {
-                        canDevourModellist.Add(model);
-                    }
-                }
-            }
-
-            if (RefreshEquipDecomNumAct != null)
-            {
-                RefreshEquipDecomNumAct();
-            }
-
-            return canDevourModellist;
-        }
-
-        public bool IsCanDevour(ItemModel model)
-        {
-            // if (devourPlacelist.Contains(model.config.EquipPlace))
-            // {
-            //     if (GeneralDefine.equipDecomposeScreen.Contains(model.config.ItemColor))
-            //     {
-            //         var eatEquipConfig = PetEatEquipConfig.GetEquipColorAndEquipClass(model.config.ItemColor, model.config.LV);
-            //         if (eatEquipConfig == null) return false;
-
-            //         if (EquipControlConfig.Get(model.config.LV, 1).realm > PlayerDatas.Instance.baseData.realmLevel)
-            //         {
-            //             //bug锛氱帺瀹舵寕鏈轰細鎵撻珮澧冪晫鎬紝瀵艰嚧瑁呭鏃犳硶鍒嗚В鑳屽寘澶弧鐨勬儏鍐�
-            //             //澧冪晫澶т簬鐜╁澧冪晫锛屼笖鍦ㄦ寚瀹氶鑹插搧璐ㄤ笅鐨勭洿鎺ュ垎瑙g传鑹蹭互涓嬭澶�
-            //             if (model.config.ItemColor <= (int)colorType && model.config.ItemColor <= 3)
-            //             {
-            //                 return true;
-            //             }
-            //         }
-
-            //         //1. 闈炴媿鍗栬澶�
-            //         //2. 瑁呭鍝佽川灏忎簬绛変簬褰撳墠閫夋嫨鐨勫搧璐�
-            //         //3. 闈炴湰鑱屼笟鐨勫瑁呰澶�
-            //         //4. 闈炴垬鏂楀姏鎻愬崌鐨勮澶�
-            //         if (!model.isAuction && model.config.ItemColor <= (int)colorType
-            //             && !(ItemLogicUtility.Instance.IsJobCompatibleItem(model.itemId)
-            //                     && model.config.ItemColor == 4 && model.config.SuiteiD != 0)
-            //             && ItemLogicUtility.Instance.IsFightUp(model.itemId, model.score) != 1)
-            //         {
-            //             return true;
-            //         }
-            //     }
-            // }
-
-            return false;
-        }
-
-        public bool IsMaxDecomLv(int decomLv, out int realLv)
-        {
-            realLv = decomLv;
-            // var decomlist = EquipDeComposeConfig.GetValues();
-            // if (decomLv > decomlist[decomlist.Count - 1].LV)
-            // {
-            //     realLv = decomlist[decomlist.Count - 1].LV;
-            //     return true;
-            // }
-
-            return false;
-        }
-
-        public List<ItemModel> selectDevourlist = new List<ItemModel>();
-        public void GetSelectDevourList()
-        {
-            selectDevourlist.Clear();
-            List<ItemModel> itemModels = GetCanDevourModellist();
-            if (itemModels != null)
-            {
-                selectDevourlist.AddRange(itemModels);
-            }
-        }
-
-        public void RefreshGetNewItem(ItemModel model)
-        {
-            if (model == null) return;
-
-            if (CheckIsReachDevourCondi(model))
-            {
-                selectDevourlist.Add(model);
-                if (RefreshEquipDecomNumAct != null)
-                {
-                    RefreshEquipDecomNumAct();
-                }
-            }
-        }
-
-        public void AddSelectDevourModellist(ItemModel model)
-        {
-            selectDevourlist.Add(model);
-            if (RefreshEquipDecomNumAct != null)
-            {
-                RefreshEquipDecomNumAct();
-            }
-        }
-
-        public bool CheckIsReachDevourCondi(ItemModel model)
-        {
-            if (model.config.Type == 29)
-            {
-                if (!defaultUnSelectlist.Contains(model.itemId))
-                {
-                    return true;
-                }
-                return false;
-            }
-            else
-            {
-                if (IsCanDevour(model))
-                {
-                    return true;
-                }
-
-            }
-            return false;
-        }
-
-        public void RemoveSelectDevourModellist(ItemModel model)
-        {
-            if (selectDevourlist.Contains(model))
-            {
-                selectDevourlist.Remove(model);
-            }
-            if (RefreshEquipDecomNumAct != null)
-            {
-                RefreshEquipDecomNumAct();
-            }
-        }
-
-        public Dictionary<int, int> GetDecomAttrDictByLv(int decomLv)
-        {
-            if (decomposeAttrDict.ContainsKey(decomLv))
-            {
-                return decomposeAttrDict[decomLv];
-            }
-
-            return null;
-        }
-
-        public bool IsReachMinDecomposeNum()
-        {
-            List<ItemModel> itemModels = GetCanDevourModellist();
-            if (itemModels != null && itemModels.Count >= minDecomposeNum)
-            {
-                return true;
-            }
-            return false;
-        }
-
-        public void SendEquipdevourQuest(bool auto)
-        {
-            List<ItemModel> items = null;
-            if (auto)
-            {
-                items = GetCanDevourModellist();
-            }
-            else
-            {
-                items = selectDevourlist;
-            }
-
-            // if (items == null || items.Count < minDecomposeNum || !ItemLogicUtility.Instance.isPackResetOk || SettingEffectMgr.Instance.isStartDecompose) return;
-
-            // SettingEffectMgr.Instance.isStartDecompose = true;
-            // isAutoDecompose = auto;
-            // recordAutoDecomNum = Math.Min(items.Count, 100);    //鍗曟鏈�澶�100浠跺垎瑙�
-            // var package = new CA32C_tagCMEquipDecompose();
-            // var indexLists = new ushort[recordAutoDecomNum];
-            // var idlist = new uint[recordAutoDecomNum];
-            // for (int i = 0; i < recordAutoDecomNum; i++)
-            // {
-            //     indexLists[i] = (ushort)items[i].gridIndex;
-            //     idlist[i] = (uint)items[i].itemId;
-            //     if ((items[i].config.EquipPlace == 0 && items[i].config.Type != 29))
-            //     {
-            //         return;
-            //     }
-            // }
-            // package.Count = (byte)indexLists.Length;
-            // package.IndexList = indexLists;
-            // package.ItemIDList = idlist;
-            // package.IsAuto = (byte)(auto ? 1 : 0);
-            // GameNetSystem.Instance.SendInfo(package);
-        }
-
-        public void SendEquipDevourRecordQuest()
-        {
-            var record = StringUtility.Contact((int)colorType + 1, 1, 1);
-            var decomSet = new CA32D_tagCMDecomposeSeting();
-            decomSet.Seting = uint.Parse(record);
-            GameNetSystem.Instance.SendInfo(decomSet);
-        }
-
-        public int decomposeLv { get; private set; }
-        public int decomposeExp { get; private set; }
-        public int decomposeProgress { get; private set; }
-        public int addDecomposeExp { get; private set; }
-        public int minDecomposeNum { get; private set; }
-        public bool isAutoDecompose { get; set; }
-        public int recordAutoDecomNum { get; private set; }
-        public DecomposeGetMatInfo[] getItems { get; private set; }
-
-        public event Action RefreshDecomAttrAct;
-        // public void GetServerDecomposeSet(HA31C_tagMCEquipDecomposeInfo info)
-        // {
-        //     addDecomposeExp = 0;
-        //     int realLv = info.LV + 1;
-        //     bool isMax = IsMaxDecomLv(realLv, out realLv);
-        //     if (realLv == decomposeLv)
-        //     {
-        //         addDecomposeExp = (int)info.Exp - decomposeExp;
-        //     }
-        //     else
-        //     {
-        //         for (int i = decomposeLv; i <= realLv; i++)
-        //         {
-        //             var deComposeConfig = EquipDeComposeConfig.Get(i);
-        //             if (i == decomposeLv)
-        //             {
-        //                 addDecomposeExp = deComposeConfig.UpNeedExp - decomposeExp;
-        //             }
-        //             else if (i == realLv)
-        //             {
-        //                 addDecomposeExp += (int)info.Exp;
-        //             }
-        //             else
-        //             {
-        //                 addDecomposeExp += deComposeConfig.UpNeedExp;
-        //             }
-        //         }
-        //     }
-
-        //     decomposeLv = realLv;
-        //     decomposeExp = (int)info.Exp;
-        //     decomposeProgress = info.DecomposeCnt;
-        //     getItems = JsonMapper.ToObject<DecomposeGetMatInfo[]>(info.GetItemData);
-
-        //     if (info.Seting != 0)
-        //     {
-        //         string decomSetStr = info.Seting.ToString();
-        //         string colorStr = decomSetStr.Substring(0, 1);
-        //         colorType = (EquipColorType)(int.Parse(colorStr) - 1);
-        //         string lvStr = decomSetStr.Substring(1, decomSetStr.Length - 2);
-        //     }
-        //     if (RefreshDecomAttrAct != null)
-        //     {
-        //         RefreshDecomAttrAct();
-        //     }
-        // }
-        /// <summary>
-        /// 璁剧疆鑾峰緱鐐间腹鏉愭枡鐨勫睍绀烘暟鎹�
-        /// </summary>
-        /// <param name="getMatInfos"></param>
-        /// <returns></returns>
-        private List<DecomposeGetMatInfo> getMatInfos = new List<DecomposeGetMatInfo>();
-        public List<DecomposeGetMatInfo> SetShowMatInfo()
-        {
-            getMatInfos.Clear();
-            int sumMatCnt = 0;
-            if (getItems != null)
-            {
-                for (int i = 0; i < getItems.Length; i++)
-                {
-                    if (getItems[i].Count > 0)
-                    {
-                        sumMatCnt += getItems[i].Count;
-                    }
-                    else
-                    {
-                        sumMatCnt += 1;
-                    }
-                }
-            }
-
-            if (sumMatCnt > 5)
-            {
-                for (int i = 0; i < getItems.Length; i++)
-                {
-                    getMatInfos.Add(getItems[i]);
-                }
-            }
-            else
-            {
-                if (getItems != null)
-                {
-                    for (int i = 0; i < getItems.Length; i++)
-                    {
-                        //if (getItems[i].Count > 0)
-                        //{
-                        //    for (int j = 0; j < getItems[i].Count; j++)
-                        //    {
-                        //        DecomposeGetMatInfo matInfo = new DecomposeGetMatInfo();
-                        //        matInfo.ItemID = getItems[i].ItemID;
-                        //        matInfo.Count = 1;
-                        //        matInfo.IsSuite = getItems[i].IsSuite;
-                        //        matInfo.UserData = getItems[i].UserData;
-                        //        getMatInfos.Add(matInfo);
-                        //    }
-                        //}
-                        //else
-                        {
-                            getMatInfos.Add(getItems[i]);
-                        }
-                    }
-                }
-            }
-            return getMatInfos;
-        }
+        
 
         public enum EquipColorType
         {
@@ -1673,177 +967,11 @@
             Purple = 3,
             Orange = 4,
             Red = 5,
-            //鍚庣画IL寮�鍙戞坊鍔犻璁�
-            default1,
-            default2,
-            default3,
-            default4,
-            All = 10,
+
         }
 
-        public class DecomposeGetMatInfo
-        {
-            public int ItemID;
-            public int Count;
-            public int IsSuite;
-            public string UserData;
-        }
-        #endregion
 
-        #region 涓硅嵂閫昏緫澶勭悊
-
-        // private int CompareMakeDrug(AttrFruitConfig start, AttrFruitConfig end)
-        // {
-        //     ItemConfig configS = ItemConfig.Get(start.ID);
-        //     ItemConfig configE = ItemConfig.Get(end.ID);
-        //     if (configS.RealmLimit.CompareTo(configE.RealmLimit) != 0)
-        //     {
-        //         return configS.RealmLimit.CompareTo(configE.RealmLimit);
-        //     }
-        //     if (configS.LV.CompareTo(configE.LV) != 0)
-        //     {
-        //         return configS.LV.CompareTo(configE.LV);
-        //     }
-
-        //     int x = makeDruglist.IndexOf(start);
-        //     int y = makeDruglist.IndexOf(end);
-        //     if (x.CompareTo(y) != 0) x.CompareTo(y);
-
-        //     return 0;
-        // }
-
-        // List<AttrFruitConfig> drugOrderlist = new List<AttrFruitConfig>();
-        // List<AttrFruitConfig> haveDruglist = new List<AttrFruitConfig>();
-        // public List<AttrFruitConfig> GetDrugOrderByCnt()
-        // {
-        //     drugOrderlist.Clear();
-        //     haveDruglist.Clear();
-        //     drugOrderlist.AddRange(makeDruglist);
-        //     drugOrderlist.Sort(CompareByIsHave);
-        //     for (int i = 0; i < drugOrderlist.Count; i++)
-        //     {
-        //         if (IsHaveDrugUse(drugOrderlist[i]))
-        //         {
-        //             haveDruglist.Add(drugOrderlist[i]);
-        //         }
-        //     }
-        //     haveDruglist.Sort(CompareMakeDrug);
-        //     for (int i = 0; i < haveDruglist.Count; i++)
-        //     {
-        //         drugOrderlist[i] = haveDruglist[i];
-        //     }
-
-        //     return drugOrderlist;
-        // }
-
-        public bool CheckIsDrugById(int itemId)
-        {
-            // for (int i = 0; i < makeDruglist.Count; i++)
-            // {
-            //     if (makeDruglist[i].ID == itemId)
-            //     {
-            //         return true;
-            //     }
-            // }
-            return false;
-        }
-
-        // public int CompareByIsHave(AttrFruitConfig start, AttrFruitConfig end)
-        // {
-        //     bool isHaveStart = IsHaveDrugUse(start);
-        //     bool isHaveEnd = IsHaveDrugUse(end);
-        //     if (isHaveStart.CompareTo(isHaveEnd) != 0) return -isHaveStart.CompareTo(isHaveEnd);
-
-        //     //isHaveStart = IsHaveDrugRecycle(start);
-        //     //isHaveEnd = IsHaveDrugRecycle(end);
-        //     //if (isHaveStart.CompareTo(isHaveEnd) != 0) return -isHaveStart.CompareTo(isHaveEnd);
-
-        //     isHaveStart = GetItemCountByID(PackType.Item, start.ID) > 0 ? true : false;
-        //     isHaveEnd = GetItemCountByID(PackType.Item, end.ID) > 0 ? true : false;
-        //     if (isHaveStart.CompareTo(isHaveEnd) != 0) return isHaveStart.CompareTo(isHaveEnd);
-
-        //     isHaveStart = IsReachMaxUseDrug(start);
-        //     isHaveEnd = IsReachMaxUseDrug(end);
-        //     if (isHaveStart.CompareTo(isHaveEnd) != 0) return isHaveStart.CompareTo(isHaveEnd);
-
-        //     int x = makeDruglist.IndexOf(start);
-        //     int y = makeDruglist.IndexOf(end);
-        //     if (x.CompareTo(y) != 0) return x.CompareTo(y);
-        //     return 0;
-        // }
-
-        // public bool IsHaveDrugUse(AttrFruitConfig fruitConfig)
-        // {
-        //     if (!IsReachMaxUseDrug(fruitConfig))
-        //     {
-        //         return GetItemCountByID(PackType.Item, fruitConfig.ID) > 0 ? true : false;
-        //     }
-
-        //     return false;
-        // }
-
-        // public bool IsHaveDrugRecycle(AttrFruitConfig fruitConfig)
-        // {
-        //     if (IsReachMaxUseDrug(fruitConfig))
-        //     {
-        //         return GetItemCountByID(PackType.Item, fruitConfig.ID) > 0 ? true : false;
-        //     }
-        //     return false;
-        // }
-
-        // public bool IsReachMaxUseDrug(AttrFruitConfig fruitConfig)
-        // {
-        //     if (fruitConfig == null)
-        //     {
-        //         return false;
-        //     }
-
-        //     if (fruitConfig.FuncID == 2)
-        //     {
-        //         AlchemyDrugUseLimit drugUseLimit;
-        //         if (alchemyModel.TryGetAlchemyUseLimit(fruitConfig.ID, out drugUseLimit))
-        //         {
-        //             return drugUseLimit.IsReachLimit();
-        //         }
-        //     }
-
-        //     int useNum = GetItemTotalUsedTimes(fruitConfig.ID);
-        //     if (useNum >= fruitConfig.basicUseLimit)
-        //     {
-        //         return true;
-        //     }
-        //     return false;
-        // }
-        #endregion
-
-        //鑾峰彇鑳屽寘涓殑涓�浠跺彲鎷嶅崠鐗╁搧 浼樺厛鍏朵粬鑱屼笟
-        public string GetAuctionEquip()
-        {
-            var itemPackage = GetSinglePack(PackType.Item);
-            var allItems = itemPackage.GetAllItems();
-
-            var guid = string.Empty;
-            List<string> guidList = new List<string>();
-            foreach (var item in allItems.Values)
-            {
-                var isAuction = item.isAuction;
-                if (isAuction && ItemLogicUtility.Instance.IsRealmEquip(item.itemId))
-                {
-                    if (!ItemLogicUtility.Instance.IsJobCompatibleItem(item.itemId))
-                    {
-                        return item.guid;
-                    }
-                    else
-                    {
-                        if (guid != string.Empty)
-                            continue;
-                        guid = item.guid;
-                    }
-                }
-            }
-            return guid;
-        }
-
+        
 
         public void ReceiveAwardNotify(HA801_tagMCGiveAwardInfo netPack)
         {
diff --git a/Main/System/KnapSack/VirtualPackManager.cs b/Main/System/KnapSack/VirtualPackManager.cs
index 9072080..a88250e 100644
--- a/Main/System/KnapSack/VirtualPackManager.cs
+++ b/Main/System/KnapSack/VirtualPackManager.cs
@@ -60,8 +60,7 @@
 
     void ParseConfig()
     {
-        var funcConfig = FuncConfigConfig.Get("RunePackageNum");
-        virtualPackCapacityDict.Add(PackType.RunePack, int.Parse(funcConfig.Numerical1));
+        // virtualPackCapacityDict.Add(PackType.RunePack, int.Parse(funcConfig.Numerical1));
     }
 
     public bool IsVirtualPack(PackType packType)
diff --git a/Main/System/Main/HomeWin.cs b/Main/System/Main/HomeWin.cs
new file mode 100644
index 0000000..c5f41f1
--- /dev/null
+++ b/Main/System/Main/HomeWin.cs
@@ -0,0 +1,62 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+/// <summary>
+/// 娓告垙涓荤晫闈�
+/// </summary>
+public class HomeWin : UIBase
+{
+    /// <summary>
+    /// 鍒濆鍖栫粍浠�
+    /// </summary>
+    protected override void InitComponent()
+    {
+    }
+    
+    
+
+    
+    public override void Refresh()
+    {
+        UpdatePlayerInfo();
+        UpdateCurrency();
+    }
+
+    protected override void OnPreOpen()
+    {
+        Refresh();
+    }
+
+    // protected override void OnPreClose()
+    // {
+    // }
+    
+    /// <summary>
+    /// 鏇存柊鐜╁淇℃伅
+    /// </summary>
+    private void UpdatePlayerInfo()
+    {
+        // 浠庣帺瀹舵暟鎹腑鑾峰彇淇℃伅骞舵洿鏂癠I
+        // 渚嬪锛�
+        // playerNameText.text = PlayerData.Instance.Name;
+        // playerLevelText.text = "Lv." + PlayerData.Instance.Level;
+        // powerText.text = PlayerData.Instance.Power.ToString();
+        // expSlider.value = PlayerData.Instance.ExpRatio;
+    }
+    
+    /// <summary>
+    /// 鏇存柊璐у竵淇℃伅
+    /// </summary>
+    private void UpdateCurrency()
+    {
+        // 浠庣帺瀹舵暟鎹腑鑾峰彇璐у竵淇℃伅骞舵洿鏂癠I
+        // 渚嬪锛�
+        // goldText.text = PlayerData.Instance.Gold.ToString();
+        // diamondText.text = PlayerData.Instance.Diamond.ToString();
+        // energyText.text = PlayerData.Instance.Energy + "/" + PlayerData.Instance.MaxEnergy;
+    }
+    
+    
+}
\ No newline at end of file
diff --git a/Main/System/Main/HomeWin.cs.meta b/Main/System/Main/HomeWin.cs.meta
new file mode 100644
index 0000000..43b93c9
--- /dev/null
+++ b/Main/System/Main/HomeWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 428e25b7deff7474e8c611d41bbbaf7b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Main/MainWin.cs b/Main/System/Main/MainWin.cs
index 76a04cc..0db0f0f 100644
--- a/Main/System/Main/MainWin.cs
+++ b/Main/System/Main/MainWin.cs
@@ -4,16 +4,13 @@
 using UnityEngine.UI;
 
 /// <summary>
-/// 娓告垙涓荤晫闈�
+/// 娓告垙涓荤晫闈㈠簳閮ㄥ姛鑳芥寜閽�
 /// </summary>
 public class MainWin : UIBase
 {
-    public GameObject windowBackground;
-
     // 搴曢儴鎸夐挳缁�
     public Button[] bottomTabButtons;
 
-    private EffectPlayer[] bottomTabEffects;
     
     // 褰撳墠閫変腑鐨勫簳閮ㄦ爣绛剧储寮�
     private int currentTabIndex = 0;
@@ -48,55 +45,25 @@
 
     }
     
-    protected override void OnOpen()
+    public override void Refresh()
     {
-        base.OnOpen();
-        
+        UpdateCurrency();
+    }
+
+    protected override void OnPreOpen()
+    {
         // 榛樿閫変腑绗竴涓爣绛�
         SelectBottomTab(0);
 
         // 鍒锋柊UI
         Refresh();
     }
-    
-    public override void Refresh()
-    {
-        UpdatePlayerInfo();
-        UpdateCurrency();
-    }
 
-    protected override void OnPreOpen()
-    {
-        base.OnPreOpen();
-        bottomTabEffects = new EffectPlayer[bottomTabButtons.Length];
-        for (int i = 0; i < bottomTabButtons.Length; i++)
-        {
-            bottomTabEffects[i] = PlayUIEffect(1004, bottomTabButtons[i].transform, false);
-        }
-    }
-
-    protected override void OnPreClose()
-    {
-        base.OnPreClose();
-        foreach (var effectGO in bottomTabEffects)
-        {
-            DestroyImmediate(effectGO);
-        }
-        bottomTabEffects = null;
-    }
+    // protected override void OnPreClose()
+    // {
+    // }
     
-    /// <summary>
-    /// 鏇存柊鐜╁淇℃伅
-    /// </summary>
-    private void UpdatePlayerInfo()
-    {
-        // 浠庣帺瀹舵暟鎹腑鑾峰彇淇℃伅骞舵洿鏂癠I
-        // 渚嬪锛�
-        // playerNameText.text = PlayerData.Instance.Name;
-        // playerLevelText.text = "Lv." + PlayerData.Instance.Level;
-        // powerText.text = PlayerData.Instance.Power.ToString();
-        // expSlider.value = PlayerData.Instance.ExpRatio;
-    }
+
     
     /// <summary>
     /// 鏇存柊璐у竵淇℃伅
@@ -115,6 +82,13 @@
     /// </summary>
     private void OnBottomTabButtonClicked(int index)
     {
+        if (index == 0)
+        { 
+            if (currentSubUI != null && currentSubUI.name == "HomeWin")
+            {
+                //鎵撳紑涓荤晫闈㈢殑鎯呭喌涓嬪啀鐐瑰嚮鎸夐挳锛屾墽琛屾敾鍑婚�昏緫
+            }
+        }
         SelectBottomTab(index);
     }
     
@@ -150,12 +124,8 @@
         // 閬嶅巻鎵�鏈夋寜閽紝璁剧疆閫変腑鐘舵��
         for (int i = 0; i < bottomTabButtons.Length; i++)
         {
-            // 杩欓噷鍙互鏍规嵁鏄惁閫変腑璁剧疆鎸夐挳鐨勮瑙夋晥鏋�
-            // 渚嬪锛氭敼鍙樺浘鐗囥�侀鑹茬瓑
-            // bottomTabButtons[i].GetComponent<Image>().color = (i == currentTabIndex) ? Color.blue : Color.white;
 
-            // 鎴栬�呮縺娲�/绂佺敤閫変腑鍥炬爣
-            bottomTabButtons[i].image.color = (i == currentTabIndex) ?  Color.white : Color.gray;
+            // bottomTabButtons[i].image.color = (i == currentTabIndex) ?  Color.white : Color.gray;
         }
     }
     
@@ -179,34 +149,29 @@
     {
 
         Debug.Log("鎵撳紑瀛愮晫闈� : " + index);
-        // 涓诲煄 闃靛 鍚岀洘 绂忓埄 鍐掗櫓
-        windowBackground.SetActive(index != 4);
+        // 涓诲煄 鍐呮斂 姝﹀皢 鎸戞垬 鍏細
         //鏍规嵁绱㈠紩鎵撳紑涓嶅悓鐨勭晫闈�
          switch (index)
         {
             case 0:
-                // 渚嬪锛氭墦寮�涓婚〉鐣岄潰
-                // currentSubUI = UIManager.Instance.OpenUI<HomeUI>();
+                // 鎵撳紑涓婚〉鐣岄潰
+                currentSubUI = UIManager.Instance.OpenWindow<HomeWin>();
                 Debug.Log("鎵撳紑涓诲煄鐣岄潰");
                 break;
             case 1:
-                // 渚嬪锛氭墦寮�瑙掕壊鐣岄潰
                 // currentSubUI = UIManager.Instance.OpenUI<CharacterUI>();
                 Debug.Log("鎵撳紑闃靛鐣岄潰");
                 break;
             case 2:
-                // 渚嬪锛氭墦寮�鑳屽寘鐣岄潰
                 // currentSubUI = UIManager.Instance.OpenUI<BagUI>();
                 Debug.Log("鎵撳紑鍚岀洘鐣岄潰");
                 break;
             case 3:
-                // 渚嬪锛氭墦寮�浠诲姟鐣岄潰
                 // currentSubUI = UIManager.Instance.OpenUI<QuestUI>();
                 Debug.Log("鎵撳紑绂忓埄鐣岄潰");
                 break;
             case 4:
-                // 渚嬪锛氭墦寮�璁剧疆鐣岄潰
-                currentSubUI = UIManager.Instance.OpenWindow<PlaceWin>();
+                //currentSubUI = UIManager.Instance.OpenWindow<PlaceWin>();
                 Debug.Log("鎵撳紑鍐掗櫓鐣岄潰");
                 break;
             default:
diff --git a/Main/System/MainInterfacePanel.meta b/Main/System/MainInterfacePanel.meta
deleted file mode 100644
index 6591dbf..0000000
--- a/Main/System/MainInterfacePanel.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: 4cf9daf7c9fbaf94ea5af5b13a70c217
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Main/System/MainInterfacePanel/MainRedDot.cs b/Main/System/MainInterfacePanel/MainRedDot.cs
deleted file mode 100644
index 0aecf9f..0000000
--- a/Main/System/MainInterfacePanel/MainRedDot.cs
+++ /dev/null
@@ -1,226 +0,0 @@
-锘�//--------------------------------------------------------
-//    [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);
-
-        #region 閭欢绾㈢偣
-        public const int RedPoint_MainMailKey = 24;
-        public const int RedPoint_MailFuncKey = 2401;
-        public Redpoint redpointMainMail = new Redpoint(RedPoint_MainMailKey);
-        public Redpoint redpointMailFunc = new Redpoint(RedPoint_MainMailKey, RedPoint_MailFuncKey);
-        #endregion
-
-        #region 濂藉弸绾㈢偣
-        public const int RedPoint_FriendQuestKey = 26;
-        public const int RedPoint_FriendChatKey = 25; //濂藉弸
-        public Redpoint redpointFriendQuest = new Redpoint(RedPoint_FriendQuestKey);
-        public Redpoint redPointFriendChat = new Redpoint(RedPoint_FriendChatKey);
-        #endregion
-
-        #region 鑳屽寘绾㈢偣
-        public const int RedPoint_MainPackKey = 102;
-        public const int RedPoint_BagFuncKey = 10201;
-        public const int RedPoint_DepotFuncKey = 10204;
-        public Redpoint redPointMainPack = new Redpoint(RedPoint_MainPackKey);
-        public Redpoint redPointBagFunc = new Redpoint(RedPoint_MainPackKey, RedPoint_BagFuncKey);
-        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;
-        public Redpoint fairyLaunch = new Redpoint(RedPoint_key, FAIRY_REDPOINT_KEY1);
-        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;
-        public Redpoint fairyStoreRedPoint = new Redpoint(FAIRY_REDPOINT_KEY2, FAIRYStore_REDPOINT_KEY3);
-        #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;
-        public Redpoint openServerRedpoint = new Redpoint(REDPOINT_OPENSERVER);
-
-        //280 寮�澶寸敤浜庤妭鏃ョ绂�
-        public const int RedPoint_HolidayWishes = 280;
-        public Redpoint holidayWishesRedpoint = new Redpoint(RedPoint_HolidayWishes);
-
-        #endregion
-        public const int REDPOINT_OPENRANK = 258;
-        public Redpoint openRankRedpoint = new Redpoint(REDPOINT_OPENRANK);
-        #region 浠欑洘娲诲姩绾㈢偣
-        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/Recharge/RechargeManager.cs b/Main/System/Recharge/RechargeManager.cs
index d1d2ad3..c3460bf 100644
--- a/Main/System/Recharge/RechargeManager.cs
+++ b/Main/System/Recharge/RechargeManager.cs
@@ -217,11 +217,6 @@
 #endif
             }
         }
-        var _funcConfig = FuncConfigConfig.Get("ChargeDelayTime");
-        m_CTGDelayTime = int.Parse(_funcConfig.Numerical1);
-        m_CTGLimitDelayTime = int.Parse(_funcConfig.Numerical2);
-        _funcConfig = FuncConfigConfig.Get("FirstGoldMobs");
-        firstRechargeWeapon = ConfigParse.GetDic<int, int>(_funcConfig.Numerical1);
     }
 
     public List<int> GetCTGConfigs(string _appid)
@@ -305,7 +300,6 @@
     
 
     #region 鍏呭��
-    public Dictionary<int, int> firstRechargeWeapon { get; private set; }
     public Dictionary<int, List<Item>> m_RechargeGainItemDict { get; private set; }
     private Dictionary<int, RechargeCount> m_RechargeCountDict = new Dictionary<int, RechargeCount>();
     Dictionary<string, List<OrderInfoConfig>> m_OrderInfoDict = new Dictionary<string, List<OrderInfoConfig>>();
diff --git a/Main/System/Redpoint/MainRedDot.cs b/Main/System/Redpoint/MainRedDot.cs
new file mode 100644
index 0000000..43510d3
--- /dev/null
+++ b/Main/System/Redpoint/MainRedDot.cs
@@ -0,0 +1,115 @@
+锘�//--------------------------------------------------------
+//    [Author]:           绗簩涓栫晫
+//    [  Date ]:           Thursday, November 16, 2017
+//--------------------------------------------------------
+
+
+
+public class MainRedDot : Singleton<MainRedDot>
+{
+    //涓荤晫闈�
+    public const int MainAffairsRedpoint = 1;   //鍐呮斂
+    public Redpoint redpointAffairs = new Redpoint(MainAffairsRedpoint);
+    public const int MainHerosRedpoint = 2;     //姝﹀皢
+    public Redpoint redpointHeros = new Redpoint(MainHerosRedpoint);
+    public const int MainChallengeRedpoint = 3; //鎸戞垬
+    public Redpoint redpointChallenge = new Redpoint(MainChallengeRedpoint);
+    public const int MainGuildRedpoint = 4;     //鍏細
+    public Redpoint redpointGuild = new Redpoint(MainGuildRedpoint);
+
+
+    public const int RedPoint_key = 11;
+    public const int FAIRY_REDPOINT_KEY1 = 107;
+    public const int RedPoint_UpFuncBase = 12;
+
+    private Redpoint rightTopRedpint = new Redpoint(RedPoint_UpFuncBase);
+    private Redpoint redPointStrePrentOne = new Redpoint(RedPoint_key);
+
+
+    //public Redpoint jadeDynastyRedpoint = new Redpoint(1, 117);
+
+    #region 閭欢绾㈢偣
+    public const int RedPoint_MainMailKey = 24;
+    public const int RedPoint_MailFuncKey = 2401;
+    public Redpoint redpointMainMail = new Redpoint(RedPoint_MainMailKey);
+    public Redpoint redpointMailFunc = new Redpoint(RedPoint_MainMailKey, RedPoint_MailFuncKey);
+    #endregion
+
+    #region 濂藉弸绾㈢偣
+    public const int RedPoint_FriendQuestKey = 26;
+    public const int RedPoint_FriendChatKey = 25; //濂藉弸
+    public Redpoint redpointFriendQuest = new Redpoint(RedPoint_FriendQuestKey);
+    public Redpoint redPointFriendChat = new Redpoint(RedPoint_FriendChatKey);
+    #endregion
+
+    #region 鑳屽寘绾㈢偣
+    public const int RedPoint_MainPackKey = 102;
+    public const int RedPoint_BagFuncKey = 10201;
+    public const int RedPoint_DepotFuncKey = 10204;
+    public Redpoint redPointMainPack = new Redpoint(RedPoint_MainPackKey);
+    public Redpoint redPointBagFunc = new Redpoint(RedPoint_MainPackKey, RedPoint_BagFuncKey);
+    public Redpoint redPointDepotFunc = new Redpoint(RedPoint_MainPackKey, RedPoint_DepotFuncKey);
+    #endregion
+
+
+
+
+    #region 浠欑洘鍏敤绾㈢偣
+    public const int FAIRY_REDPOINT_KEY2 = 10701;
+    public Redpoint fairyLaunch = new Redpoint(RedPoint_key, FAIRY_REDPOINT_KEY1);
+    public Redpoint fairyBaseFuncRedPoint = new Redpoint(FAIRY_REDPOINT_KEY1, FAIRY_REDPOINT_KEY2);
+    #endregion
+
+
+
+    #region 浠欑洘鍟嗗簵绾㈢偣
+    public const int FAIRYStore_REDPOINT_KEY3 = 1070106;
+    public Redpoint fairyStoreRedPoint = new Redpoint(FAIRY_REDPOINT_KEY2, FAIRYStore_REDPOINT_KEY3);
+    #endregion
+
+
+
+
+    #region 寮�鏈嶆椿鍔ㄧ孩鐐�
+    public const int REDPOINT_OPENSERVER = 209;
+    public Redpoint openServerRedpoint = new Redpoint(REDPOINT_OPENSERVER);
+
+    //280 寮�澶寸敤浜庤妭鏃ョ绂�
+    public const int RedPoint_HolidayWishes = 280;
+    public Redpoint holidayWishesRedpoint = new Redpoint(RedPoint_HolidayWishes);
+
+    #endregion
+    public const int REDPOINT_OPENRANK = 258;
+    public Redpoint openRankRedpoint = new Redpoint(REDPOINT_OPENRANK);
+    #region 浠欑洘娲诲姩绾㈢偣
+    public readonly Redpoint fairyActivityRedpoint = new Redpoint(218);
+    #endregion
+
+    public static int DailySpecialsRedpoint = 439;  //姣忔棩鐗规儬鍏ュ彛绾㈢偣
+
+    public static int BlessedLandRedpoint = 444; //绂忓湴绾㈢偣
+    public const int CustomizedGiftRedpoint = 448; //鑷�夌ぜ鍖�
+    public const int LoginZhanLingRedpoint = 449; //鐧诲綍鎴樹护
+    public const int PhantasmPavilionRepoint = 459; //骞诲闃�
+    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 void Register()
+    {
+
+    }
+
+
+
+
+}
+
+
+
diff --git a/Main/System/MainInterfacePanel/MainRedDot.cs.meta b/Main/System/Redpoint/MainRedDot.cs.meta
similarity index 100%
rename from Main/System/MainInterfacePanel/MainRedDot.cs.meta
rename to Main/System/Redpoint/MainRedDot.cs.meta
diff --git a/Main/System/Redpoint/RedpointBehaviour.cs b/Main/System/Redpoint/RedpointBehaviour.cs
index 6cb2382..61a7734 100644
--- a/Main/System/Redpoint/RedpointBehaviour.cs
+++ b/Main/System/Redpoint/RedpointBehaviour.cs
@@ -6,114 +6,119 @@
 using System.Collections;
 using UnityEngine.UI;
 
-    
-    public class RedpointBehaviour : MonoBehaviour
-    {
-        [SerializeField]
-        int m_RedpointId;
-        public int redpointId {
-            get {
-                return m_RedpointId;
-            }
-            set {
-                m_RedpointId = value;
-                UpdateRedpoint(value);
-            }
+
+public class RedpointBehaviour : MonoBehaviour
+{
+    [SerializeField]
+    int m_RedpointId;
+    public int redpointId {
+        get {
+            return m_RedpointId;
         }
-
-        [SerializeField]
-        Transform m_SimpleRedpoint;
-        public Transform simpleRedpoint {
-            get {
-                return m_SimpleRedpoint;
-            }
+        set {
+            m_RedpointId = value;
+            UpdateRedpoint(value);
         }
-        [SerializeField]
-        Transform m_QuantityRedpoint;
-        public Transform quantityRedpoint {
-            get {
-                return m_QuantityRedpoint;
-            }
-        }
-        [SerializeField]
-        Text m_Quantity;
-        public Text quantityText {
-            get {
-                return m_Quantity;
-            }
-        }
-        [SerializeField]
-        Transform m_FullRedpoint;
-
-        [SerializeField]
-        Transform m_GetRewardRedpoint;
-
-        bool m_Show = false;
-        public bool show {
-            get { return m_Show; }
-            set {
-                if (m_Show != value)
-                {
-                    m_Show = value;
-                    this.SetActive(m_Show);
-                }
-            }
-        }
-
-        private void Awake()
-        {
-            UpdateRedpoint(redpointId);
-            RedpointCenter.Instance.redpointValueChangeEvent += UpdateRedpoint;
-        }
-
-        private void OnDestroy()
-        {
-            RedpointCenter.Instance.redpointValueChangeEvent -= UpdateRedpoint;
-        }
-
-        void UpdateRedpoint(int _id)
-        {
-            if (_id != redpointId)
-            {
-                return;
-            }
-
-            var state = RedpointCenter.Instance.GetRedpointState(redpointId);
-            if (m_SimpleRedpoint != null)
-            {
-                m_SimpleRedpoint.SetActive(state == RedPointState.Simple);
-            }
-
-            if (m_QuantityRedpoint != null)
-            {
-                m_QuantityRedpoint.SetActive(state == RedPointState.Quantity);
-            }
-
-            if (m_Quantity != null)
-            {
-                m_Quantity.SetActive(state == RedPointState.Quantity);
-            }
-
-            if (m_FullRedpoint != null)
-            {
-                m_FullRedpoint.SetActive(state == RedPointState.Full);
-            }
-
-            if (m_GetRewardRedpoint != null)
-            {
-                m_GetRewardRedpoint.SetActive(state == RedPointState.GetReward);
-            }
-
-            if (state == RedPointState.Quantity && m_Quantity != null)
-            {
-                var count = RedpointCenter.Instance.GetRedpointCount(redpointId);
-                m_Quantity.text = count > 9 ? "N" : count >= 1 ? count.ToString() : "";
-            }
-
-        }
-
     }
 
+    [SerializeField]
+    Transform m_SimpleRedpoint;
+    public Transform simpleRedpoint {
+        get {
+            return m_SimpleRedpoint;
+        }
+    }
+    [SerializeField]
+    Transform m_QuantityRedpoint;
+    public Transform quantityRedpoint {
+        get {
+            return m_QuantityRedpoint;
+        }
+    }
+    [SerializeField]
+    Text m_Quantity;
+    public Text quantityText {
+        get {
+            return m_Quantity;
+        }
+    }
+    [SerializeField]
+    Transform m_FullRedpoint;
+
+    [SerializeField]
+    Transform m_GetRewardRedpoint;
+
+    [SerializeField] Transform m_NewRedpoint;
+    bool m_Show = false;
+    public bool show {
+        get { return m_Show; }
+        set {
+            if (m_Show != value)
+            {
+                m_Show = value;
+                this.SetActive(m_Show);
+            }
+        }
+    }
+
+    private void Awake()
+    {
+        UpdateRedpoint(redpointId);
+        RedpointCenter.Instance.redpointValueChangeEvent += UpdateRedpoint;
+    }
+
+    private void OnDestroy()
+    {
+        RedpointCenter.Instance.redpointValueChangeEvent -= UpdateRedpoint;
+    }
+
+    void UpdateRedpoint(int _id)
+    {
+        if (_id != redpointId)
+        {
+            return;
+        }
+
+        var state = RedpointCenter.Instance.GetRedpointState(redpointId);
+        if (m_SimpleRedpoint != null)
+        {
+            m_SimpleRedpoint.SetActive(state == RedPointState.Simple);
+        }
+
+        if (m_QuantityRedpoint != null)
+        {
+            m_QuantityRedpoint.SetActive(state == RedPointState.Quantity);
+        }
+
+        if (m_Quantity != null)
+        {
+            m_Quantity.SetActive(state == RedPointState.Quantity);
+        }
+
+        if (m_FullRedpoint != null)
+        {
+            m_FullRedpoint.SetActive(state == RedPointState.Full);
+        }
+
+        if (m_GetRewardRedpoint != null)
+        {
+            m_GetRewardRedpoint.SetActive(state == RedPointState.GetReward);
+        }
+
+        if (state == RedPointState.Quantity && m_Quantity != null)
+        {
+            var count = RedpointCenter.Instance.GetRedpointCount(redpointId);
+            m_Quantity.text = count > 9 ? "N" : count >= 1 ? count.ToString() : "";
+        }
+
+        if (m_NewRedpoint != null)
+        {
+            m_NewRedpoint.SetActive(state == RedPointState.New);
+        }
+    }
+
+}
+
 
 
 
diff --git a/Main/System/Redpoint/RedpointCenter.cs b/Main/System/Redpoint/RedpointCenter.cs
index b197f86..408a26f 100644
--- a/Main/System/Redpoint/RedpointCenter.cs
+++ b/Main/System/Redpoint/RedpointCenter.cs
@@ -3,128 +3,128 @@
 using UnityEngine;
 using System;
 
-    
-    public class RedpointCenter : Singleton<RedpointCenter>
+
+public class RedpointCenter : Singleton<RedpointCenter>
+{
+    public event Action<int> redpointValueChangeEvent;
+
+    Dictionary<int, Redpoint> redpoints = new Dictionary<int, Redpoint>();
+    Dictionary<int, List<int>> parentChildren = new Dictionary<int, List<int>>();
+
+    public RedpointCenter()
     {
-        public event Action<int> redpointValueChangeEvent;
-
-        Dictionary<int, Redpoint> redpoints = new Dictionary<int, Redpoint>();
-        Dictionary<int, List<int>> parentChildren = new Dictionary<int, List<int>>();
-
-        public RedpointCenter()
-        {
-
-        }
-
-        public void ResetAllRedpointState()
-        {
-            foreach (var redpoint in redpoints.Values)
-            {
-                redpoint.state = RedPointState.None;
-            }
-        }
-
-        public void Register(Redpoint _redpoint)
-        {
-            var id = _redpoint.id;
-            if (redpoints.ContainsKey(id))
-            {
-                Debug.LogErrorFormat("閲嶅娉ㄥ唽绾㈢偣锛歩d->{0}", id);
-            }
-
-            redpoints[id] = _redpoint;
-
-            var parentId = _redpoint.parent;
-            if (parentId > 0)
-            {
-                List<int> children = null;
-                if (!parentChildren.TryGetValue(parentId, out children))
-                {
-                    parentChildren[parentId] = children = new List<int>();
-                }
-
-                if (!children.Contains(id))
-                {
-                    children.Add(id);
-                }
-            }
-        }
-
-        public void Report(Redpoint _redpoint)
-        {
-            var parentId = _redpoint.parent;
-
-            if (redpointValueChangeEvent != null)
-            {
-                redpointValueChangeEvent(_redpoint.id);
-            }
-
-            if (parentId > 0)
-            {
-                TestParentValue(_redpoint.parent);
-            }
-        }
-
-        public void ReportWithoutParent(Redpoint _redpoint)
-        {
-            if (redpointValueChangeEvent != null)
-            {
-                redpointValueChangeEvent(_redpoint.id);
-            }
-        }
-
-        public RedPointState GetRedpointState(int _id)
-        {
-            Redpoint redpoint = null;
-            if (this.redpoints.TryGetValue(_id, out redpoint))
-            {
-                return redpoint.state;
-            }
-            else
-            {
-                return RedPointState.None;
-            }
-        }
-
-        public int GetRedpointCount(int _id)
-        {
-            Redpoint redpoint = null;
-            if (this.redpoints.TryGetValue(_id, out redpoint))
-            {
-                return redpoint.count;
-            }
-            else
-            {
-                return 0;
-            }
-        }
-
-        void TestParentValue(int _parentId)
-        {
-            List<int> children = null;
-            Redpoint parent = null;
-            if (redpoints.TryGetValue(_parentId, out parent) && parentChildren.TryGetValue(_parentId, out children))
-            {
-                var parentState = RedPointState.None;
-                for (int i = 0; i < children.Count; i++)
-                {
-                    Redpoint child = null;
-                    if (redpoints.TryGetValue(children[i], out child))
-                    {
-                        if (child.state > parentState)
-                        {
-                            parentState = child.state;
-                        }
-                    }
-
-                    if (parentState == RedPointState.Full)
-                    {
-                        break;
-                    }
-
-                }
-                parent.state = parentState;
-            }
-        }
 
     }
+
+    public void ResetAllRedpointState()
+    {
+        foreach (var redpoint in redpoints.Values)
+        {
+            redpoint.state = RedPointState.None;
+        }
+    }
+
+    public void Register(Redpoint _redpoint)
+    {
+        var id = _redpoint.id;
+        if (redpoints.ContainsKey(id))
+        {
+            Debug.LogErrorFormat("閲嶅娉ㄥ唽绾㈢偣锛歩d->{0}", id);
+        }
+
+        redpoints[id] = _redpoint;
+
+        var parentId = _redpoint.parent;
+        if (parentId > 0)
+        {
+            List<int> children = null;
+            if (!parentChildren.TryGetValue(parentId, out children))
+            {
+                parentChildren[parentId] = children = new List<int>();
+            }
+
+            if (!children.Contains(id))
+            {
+                children.Add(id);
+            }
+        }
+    }
+
+    public void Report(Redpoint _redpoint)
+    {
+        var parentId = _redpoint.parent;
+
+        if (redpointValueChangeEvent != null)
+        {
+            redpointValueChangeEvent(_redpoint.id);
+        }
+
+        if (parentId > 0)
+        {
+            TestParentValue(_redpoint.parent);
+        }
+    }
+
+    public void ReportWithoutParent(Redpoint _redpoint)
+    {
+        if (redpointValueChangeEvent != null)
+        {
+            redpointValueChangeEvent(_redpoint.id);
+        }
+    }
+
+    public RedPointState GetRedpointState(int _id)
+    {
+        Redpoint redpoint = null;
+        if (this.redpoints.TryGetValue(_id, out redpoint))
+        {
+            return redpoint.state;
+        }
+        else
+        {
+            return RedPointState.None;
+        }
+    }
+
+    public int GetRedpointCount(int _id)
+    {
+        Redpoint redpoint = null;
+        if (this.redpoints.TryGetValue(_id, out redpoint))
+        {
+            return redpoint.count;
+        }
+        else
+        {
+            return 0;
+        }
+    }
+
+    void TestParentValue(int _parentId)
+    {
+        List<int> children = null;
+        Redpoint parent = null;
+        if (redpoints.TryGetValue(_parentId, out parent) && parentChildren.TryGetValue(_parentId, out children))
+        {
+            var parentState = RedPointState.None;
+            for (int i = 0; i < children.Count; i++)
+            {
+                Redpoint child = null;
+                if (redpoints.TryGetValue(children[i], out child))
+                {
+                    if (child.state > parentState)
+                    {
+                        parentState = child.state;
+                    }
+                }
+
+                if (parentState == RedPointState.Full)
+                {
+                    break;
+                }
+
+            }
+            parent.state = parentState;
+        }
+    }
+
+}
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..4b98aaa
--- /dev/null
+++ b/Main/System/Store/StoreModel.cs
@@ -0,0 +1,1662 @@
+锘縰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 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, int> showCoinUIDict { 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();
+    }
+
+    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 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 (tagStore.RemindSuccess == 0)
+            {
+                return;
+            }
+
+            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/System/Task/TaskManager.cs b/Main/System/Task/TaskManager.cs
index 41632ab..7bb2e2d 100644
--- a/Main/System/Task/TaskManager.cs
+++ b/Main/System/Task/TaskManager.cs
@@ -170,36 +170,36 @@
         // StageLoad.Instance.onStageLoadFinish += onStageLoadFinish;
         // NPCInteractProcessor.s_NpcInteractEvent += NpcInterac;
 
-        string BossDelayTime = FuncConfigConfig.Get("BossDelayTime").Numerical1;
-        BossDelayTimeint = float.Parse(BossDelayTime);
-        var Task_Auto = FuncConfigConfig.Get("TaskAuto");
-        TaskAutoLv = int.Parse(Task_Auto.Numerical1);
-        TaskAutoTime = int.Parse(Task_Auto.Numerical2);
-        mainTaskAutoWaitTime = int.Parse(Task_Auto.Numerical3) / 1000f;
-        var mapIds = ConfigParse.GetMultipleStr<int>(Task_Auto.Numerical4);
-        if (mapIds != null && mapIds.Length > 0)
-        {
-            allowAutoTaskMapIds.AddRange(mapIds);
-        }
+        // string BossDelayTime = FuncConfigConfig.Get("BossDelayTime").Numerical1;
+        // BossDelayTimeint = float.Parse(BossDelayTime);
+        // var Task_Auto = FuncConfigConfig.Get("TaskAuto");
+        // TaskAutoLv = int.Parse(Task_Auto.Numerical1);
+        // TaskAutoTime = int.Parse(Task_Auto.Numerical2);
+        // mainTaskAutoWaitTime = int.Parse(Task_Auto.Numerical3) / 1000f;
+        // var mapIds = ConfigParse.GetMultipleStr<int>(Task_Auto.Numerical4);
+        // if (mapIds != null && mapIds.Length > 0)
+        // {
+        //     allowAutoTaskMapIds.AddRange(mapIds);
+        // }
 
-        FairyAuTaskCount_Day = int.Parse(FuncConfigConfig.Get("RunTaskCnt").Numerical1.Split('|')[1].Split('_')[1]);
-        FairyAuTaskCount_Round = int.Parse(FuncConfigConfig.Get("RunTaskCnt").Numerical2.Split('|')[1].Split('_')[1]);
+        // FairyAuTaskCount_Day = int.Parse(FuncConfigConfig.Get("RunTaskCnt").Numerical1.Split('|')[1].Split('_')[1]);
+        // FairyAuTaskCount_Round = int.Parse(FuncConfigConfig.Get("RunTaskCnt").Numerical2.Split('|')[1].Split('_')[1]);
 
-        var cliengGuardConfig = FuncConfigConfig.Get("ClientGuardDungeon");
-        clientGuardDugeonTask = int.Parse(cliengGuardConfig.Numerical5);
+        // var cliengGuardConfig = FuncConfigConfig.Get("ClientGuardDungeon");
+        // clientGuardDugeonTask = int.Parse(cliengGuardConfig.Numerical5);
 
-        var funcConfig = FuncConfigConfig.Get("AutoSelectTaskChain");
-        var taskChainArray = LitJson.JsonMapper.ToObject<int[][]>(funcConfig.Numerical1);
-        if (taskChainArray != null)
-        {
-            for (int i = 0; i < taskChainArray.Length; i++)
-            {
-                priorityTaskChains.Add(taskChainArray[i]);
-            }
-        }
-        var config = FuncConfigConfig.Get("NPCTalk");
-        npcImages = JsonMapper.ToObject<List<int>>(config.Numerical1);
-        playerJobImages = JsonMapper.ToObject<List<int>>(config.Numerical2);
+        // var funcConfig = FuncConfigConfig.Get("AutoSelectTaskChain");
+        // var taskChainArray = LitJson.JsonMapper.ToObject<int[][]>(funcConfig.Numerical1);
+        // if (taskChainArray != null)
+        // {
+        //     for (int i = 0; i < taskChainArray.Length; i++)
+        //     {
+        //         priorityTaskChains.Add(taskChainArray[i]);
+        //     }
+        // }
+        // var config = FuncConfigConfig.Get("NPCTalk");
+        // npcImages = JsonMapper.ToObject<List<int>>(config.Numerical1);
+        // playerJobImages = JsonMapper.ToObject<List<int>>(config.Numerical2);
     }
 
     public override void Release()
diff --git a/Main/Utility/EnumHelper.cs b/Main/Utility/EnumHelper.cs
index 66ffe05..0dbdc97 100644
--- a/Main/Utility/EnumHelper.cs
+++ b/Main/Utility/EnumHelper.cs
@@ -1144,6 +1144,7 @@
     Quantity = 2,
     Full = 3,
     GetReward = 4,
+    New = 5,
 }
 
 
diff --git a/Main/Utility/FontUtility.cs b/Main/Utility/FontUtility.cs
index 876ab17..09d455f 100644
--- a/Main/Utility/FontUtility.cs
+++ b/Main/Utility/FontUtility.cs
@@ -7,12 +7,12 @@
 {
     static Font m_Preferred;
     public static Font preferred {
-        get { return m_Preferred ?? (m_Preferred = ResManager.Instance.LoadAsset<Font>("Font", "AlibabaSansTC-55")); }
+        get { return m_Preferred ?? (m_Preferred = ResManager.Instance.LoadAsset<Font>("Font", "GameFont1")); }
     }
 
     static Font m_Secondary;
     public static Font secondary {
-        get { return m_Secondary ?? (m_Secondary = ResManager.Instance.LoadAsset<Font>("Font", "AlibabaSansTC-55")); }
+        get { return m_Secondary ?? (m_Secondary = ResManager.Instance.LoadAsset<Font>("Font", "GameFont2")); }
     }
 
 }
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: 
diff --git a/Main/Utility/SafeAreaUI.cs b/Main/Utility/SafeAreaUI.cs
index b31890f..8f1c476 100644
--- a/Main/Utility/SafeAreaUI.cs
+++ b/Main/Utility/SafeAreaUI.cs
@@ -6,6 +6,7 @@
 {
 
     public const int SafeWidth = 75;
+    public const int SafeBottom = 15;   //绔栧睆涓嬫柟闂撮殧
 
     public enum SimDevice { None, IphoneX }
     public static SimDevice Sim
@@ -62,7 +63,7 @@
             if (Screen.height / Screen.width > 1.8)//瀹藉睆闇�瑕侀�傞厤
             {
                 //涓婁笅鍚勯棿闅擲afeWidth
-                Panel.offsetMin = new Vector2(0, SafeWidth);
+                Panel.offsetMin = new Vector2(0, SafeBottom);
                 Panel.offsetMax = new Vector2(0, -SafeWidth);
             }
             else

--
Gitblit v1.8.0