From ec19547ca0985de3f1c4045411ee6c171204e535 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 21 十月 2025 19:00:45 +0800
Subject: [PATCH] 297 【常规】坊市系统-服务端(坊市、公会、将魂)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFlashSale.py           |   11 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py | 1322 ++++++---------------------------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script.ini                                 |   16 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py                      |   10 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py                      |   92 -
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py                  |  406 ++-------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetMoney.py             |    7 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSpringSale.py          |   10 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Shop.py                 |   72 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py        |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py               |    6 
 /dev/null                                                                                               |   59 -
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini                              |   18 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DataRecordPack.py                   |   28 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                    |   69 -
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py                  |    3 
 PySysDB/PySysDBPY.h                                                                                     |   27 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventShell.py                 |   89 -
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py              |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py             |    5 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py        |   10 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                         |   20 
 22 files changed, 526 insertions(+), 1,759 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 0f31164..deff2b1 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -1409,29 +1409,20 @@
 
 //商城表
 
-struct tagStore
+struct Store
 {
 	DWORD		_ID;	//ID
 	DWORD		ShopType;	//商店类型
-	BYTE		OperationActionShop;	//是否运营活动商店
 	DWORD		ItemID;	//物品ID
 	WORD		ItemCnt;	//物品数量
-	BYTE		IsBind;	//是否绑定
 	list		ItemListEx;	//扩展物品列表[[物品ID,个数,是否绑定],...]
-	DWORD		MainItemID;	//标的物品ID
-	list		JobItem;	//职业替换物品
-	BYTE		RefreshLimit;	//是否限制刷新限购次数,即是否永久限购,包含活动也不重置
-	BYTE		RefreshType;	//刷新类型 0-不重置,1-onWeek0点,2-onWeek5点,3-OnDay0点,4-OnDay5点
-	list		LimitVIPLV;	//VIP限制
-	DWORD		LimitLV;	//等级限制
-	list		LimitCnt;	//个人限制数量
-	DWORD		ServerLimitCnt;	//全服限制数量
+	BYTE		ResetType;	//重置类型
+	DWORD		LimitCnt;	//个人限制数量
 	BYTE		MoneyType;	//金钱类型
 	DWORD		MoneyNum;	//金钱数量
 	DWORD		MoneyOriginal;	//原价
-	DWORD		LimitValue;	//限制条件
-	char		NotifyMark;	//广播提示
-	char		MailKey;	//背包不足时邮件KEY
+	BYTE		UnlockType;	//解锁类型
+	DWORD		UnlockValue;	//解锁所需值
 };
 
 //限时特惠表
@@ -2810,14 +2801,6 @@
 	WORD		OrderB;	//至名次B
 	float		CTGAtleast;	//至少充值RMB
 	list		AwardItemList;	//奖励物品列表[[物品ID,个数,是否拍品], ...]
-};
-
-//神秘商店表
-
-struct tagMysteryShop
-{
-	list		LVRange;	//等级范围
-	DWORD		GoodsID;	//商城表ID
 };
 
 //装备位背包索引映射表
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
index ece9d40..15547e7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -140,23 +140,15 @@
 Writer = wdb
 Releaser = wdb
 RegType = 0
-RegisterPackCount = 4
+RegisterPackCount = 2
 
 PacketCMD_1=0xA2
-PacketSubCMD_1=0x01
-PacketCallFunc_1=QueryNPCShopItem
+PacketSubCMD_1=0x32
+PacketCallFunc_1=OnRefreshShop
 
 PacketCMD_2=0xA3
-PacketSubCMD_2=0x11
-PacketCallFunc_2=OnSellManyItem
-
-PacketCMD_3=0xA2
-PacketSubCMD_3=0x32
-PacketCallFunc_3=OnMysticalShopRefresh
-
-PacketCMD_4=0xA3
-PacketSubCMD_4=0x10
-PacketCallFunc_4=PyBuyItem
+PacketSubCMD_2=0x10
+PacketCallFunc_2=PyBuyItem
 
 ;物品管理
 [ItemControler]
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script.ini
index 3683a76..dca93ea 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script.ini
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script.ini
@@ -445,22 +445,6 @@
 PacketSubCMD_1=0x41
 PacketCallFunc_1=OpenPackCount
 
-;商店
-[Shop]
-ScriptName = Event\EventShell.py
-Writer = eggxp
-Releaser = eggxp
-RegType = 0
-RegisterPackCount = 2
-
-PacketCMD_1=0x8
-PacketSubCMD_1=0x3
-PacketCallFunc_1=BuyItem
-
-PacketCMD_2=0x8
-PacketSubCMD_2=0x6
-PacketCallFunc_2=SellItem
-
 ;GM命令
 [GM]
 ScriptName = GM\GMShell.py
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 4af6b30..e328ff4 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -2917,12 +2917,6 @@
     Def_GameWallow_LV_Max,
 )= range(0, 10)
 
-#---物品卖给商店商店类型记录---
-(
-    Def_ShopType_NpcShop,     #NPC商店
-    Def_ShopType_LongSale,    #远程贩售
-) = range(1, 2+1)
-
 # 回合攻击战斗类型
 (
 TurnBattleType_Normal, # 常规攻击 0
@@ -3138,7 +3132,6 @@
 Def_PlayerKey_ComboBuffProcessState = "ComboBuffProcessState"    #持续性buff连击处理状态
 Def_PlayerKey_LvAwardQueryState = 'LvAwardQueryState'  # 等级奖励领奖查询状态
 Def_PlayerKey_StoreQueryState = 'StoreQueryState'  # 商店全服购买次数查询状态
-Def_PlayerKey_MysticalShopLastTime = 'MysticalShopLastTime'  # 神秘商店刷新时间
 #===============================================================================
 # # 持续性buff伤害处理连击技能ID列表
 # # 因为释放一次技能后一段时间内是持续性的, 故连接判断效果仅处理一次, 持续时间内均受此效果影响, 不重复处理连击
@@ -3373,11 +3366,6 @@
 Def_PDict_LoginDayAward = "PLoginDayAward"  # 累计登陆领取情况
 Def_PDict_CollNpcIDCollTime = "NPCIDCollTime_%s"   # 采集NPCID对应每日对应采集次数,%sNPCID
 Def_PDict_CollNpcIDCollTimeTotal = "NPCIDCollTimeTotal_%s"   # 采集NPCID对应对应采集总次数,%sNPCID
-Def_PDict_ShopItemDayBuyCnt = "ShopItemDayBuyCnt_%s"   # 商店NPC商品已购买次数,itemIndex
-Def_PDict_ShopItemStartTime = "ShopItemStartTime_%s"   # 神秘限购商品开卖时间,itemIndex
-Def_PDict_MysticalShopGoods = "MysticalShopGoods_%s"   # 神秘商店商品ID,索引
-Def_PDict_MysticalShopRefreshCnt = "MysticalShopRefreshCnt"   # 神秘商店已手动刷新次数
-Def_PDict_MysticalShopLVRefreshCnt = "MysticalShopLVRefreshCnt"   # 神秘商店等级段刷新次数
 Def_PDict_MoneyMinus = "MoneyMinus_%s"  # 货币对应负值, 参数[货币类型]
 Def_PDict_Currency = "PlayerCurrency_%s"  # 自定义货币类型, 参数[自定义货币类型]
 Def_PDict_UseMoneyTotal = "UseMoneyTotal_%s"  # 累计消耗货币, 参数[货币类型]
@@ -3421,6 +3409,11 @@
 
 Def_PDict_DropCountToday = "DropCountToday_%s" # 今日物品已掉落次数,参数(物品ID)
 Def_PDict_DropColorToday = "DropColorToday_%s" # 今日装备品质已掉落次数,参数(装备品质)
+
+#商城
+Def_PDict_ShopBuyCnt = "ShopBuyCnt_%s"  # 商店商品已购买次数,参数(商品ID)
+Def_PDict_ShopRandUnlock = "ShopRandUnlock_%s"  # 商店随机刷新解锁的商品ID解锁状态,参数(key编号)
+Def_PDict_ShopRefreshCnt = "ShopRefreshCnt_%s"  # 今日已刷新次数,参数(商店类型)
 
 # 签到
 Def_PDict_SignInState = "SignInState_%s" # 按位记录每日签到状态,参数(key编号),状态:0-不可签到;1-已签到;2-可补签;3-已领取
@@ -4319,7 +4312,7 @@
 Def_Cost_FBGatherSoulBoss, # 聚魂副本BOSS召唤 40
 Def_Cost_CrossRealmPK, # 跨服PK
 Def_Cost_LuckyTreasure, #幸运鉴宝
-Def_Cost_MysteryShopRefresh, # 神秘商店刷新
+Def_Cost_43, # 神秘商店刷新
 Def_Cost_AuctionBid, # 拍卖行竞价
 Def_Cost_45, # 购买活动次数 45
 Def_Cost_46, # 副本买buff
@@ -4415,7 +4408,6 @@
 Def_Cost_FBGatherSoulBoss:"FBGatherSoulBoss",
 Def_Cost_CrossRealmPK:"CrossRealmPK",
 Def_Cost_LuckyTreasure:"LuckyTreasure",
-Def_Cost_MysteryShopRefresh:"MysteryShopRefresh",
 Def_Cost_AuctionBid:"AuctionBid",
 Def_Cost_CreatFamily:"CreatFamily",
 Def_Cost_BuyKillBossCnt:"BuyKillBossCnt",
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index 7b7a484..bfe39f1 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -1645,58 +1645,6 @@
 
 
 #------------------------------------------------------
-#A2 01 请求npc商店物品信息 #tagCMQueryNPCShopItem
-
-class  tagCMQueryNPCShopItem(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
-                  ("NPCShopID", c_int),    #商店npcid
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        self.Cmd = 0xA2
-        self.SubCmd = 0x01
-        return
-
-    def ReadData(self, stringData, _pos=0, _len=0):
-        self.Clear()
-        memmove(addressof(self), stringData[_pos:], self.GetLength())
-        return _pos + self.GetLength()
-
-    def Clear(self):
-        self.Cmd = 0xA2
-        self.SubCmd = 0x01
-        self.NPCShopID = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagCMQueryNPCShopItem)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''//A2 01 请求npc商店物品信息 //tagCMQueryNPCShopItem:
-                                Cmd:%s,
-                                SubCmd:%s,
-                                NPCShopID:%d
-                                '''\
-                                %(
-                                self.Cmd,
-                                self.SubCmd,
-                                self.NPCShopID
-                                )
-        return DumpString
-
-
-m_NAtagCMQueryNPCShopItem=tagCMQueryNPCShopItem()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMQueryNPCShopItem.Cmd,m_NAtagCMQueryNPCShopItem.SubCmd))] = m_NAtagCMQueryNPCShopItem
-
-
-#------------------------------------------------------
 # A2 06 快速完成任务#tagCMQuickFinishMission
 
 class  tagCMQuickFinishMission(Structure):
@@ -1753,13 +1701,14 @@
 
 
 #------------------------------------------------------
-# A2 32 神秘商店刷新 #tagCMRefreshMysticalShop
+# A2 32 刷新商店 #tagCSRefreshShop
 
-class  tagCMRefreshMysticalShop(Structure):
+class  tagCSRefreshShop(Structure):
     _pack_ = 1
     _fields_ = [
                   ("Cmd", c_ubyte),
                   ("SubCmd", c_ubyte),
+                  ("ShopType", c_ushort),    
                   ]
 
     def __init__(self):
@@ -1776,28 +1725,31 @@
     def Clear(self):
         self.Cmd = 0xA2
         self.SubCmd = 0x32
+        self.ShopType = 0
         return
 
     def GetLength(self):
-        return sizeof(tagCMRefreshMysticalShop)
+        return sizeof(tagCSRefreshShop)
 
     def GetBuffer(self):
         return string_at(addressof(self), self.GetLength())
 
     def OutputString(self):
-        DumpString = '''// A2 32 神秘商店刷新 //tagCMRefreshMysticalShop:
+        DumpString = '''// A2 32 刷新商店 //tagCSRefreshShop:
                                 Cmd:%s,
-                                SubCmd:%s
+                                SubCmd:%s,
+                                ShopType:%d
                                 '''\
                                 %(
                                 self.Cmd,
-                                self.SubCmd
+                                self.SubCmd,
+                                self.ShopType
                                 )
         return DumpString
 
 
-m_NAtagCMRefreshMysticalShop=tagCMRefreshMysticalShop()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMRefreshMysticalShop.Cmd,m_NAtagCMRefreshMysticalShop.SubCmd))] = m_NAtagCMRefreshMysticalShop
+m_NAtagCSRefreshShop=tagCSRefreshShop()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCSRefreshShop.Cmd,m_NAtagCSRefreshShop.SubCmd))] = m_NAtagCSRefreshShop
 
 
 #------------------------------------------------------
@@ -2261,14 +2213,14 @@
 
 
 #------------------------------------------------------
-# A3 10 购买商城物品 #tagCMBuyItem
+# A3 10 购买商城物品 #tagCSBuyItem
 
-class  tagCMBuyItem(Structure):
+class  tagCSBuyItem(Structure):
     _pack_ = 1
     _fields_ = [
                   ("Cmd", c_ubyte),
                   ("SubCmd", c_ubyte),
-                  ("BuyItemIndex", c_ushort),    #购买的物品索引
+                  ("ShopID", c_int),    #商品ID
                   ("BuyCount", c_int),    #购买数量
                   ]
 
@@ -2286,34 +2238,34 @@
     def Clear(self):
         self.Cmd = 0xA3
         self.SubCmd = 0x10
-        self.BuyItemIndex = 0
+        self.ShopID = 0
         self.BuyCount = 0
         return
 
     def GetLength(self):
-        return sizeof(tagCMBuyItem)
+        return sizeof(tagCSBuyItem)
 
     def GetBuffer(self):
         return string_at(addressof(self), self.GetLength())
 
     def OutputString(self):
-        DumpString = '''// A3 10 购买商城物品 //tagCMBuyItem:
+        DumpString = '''// A3 10 购买商城物品 //tagCSBuyItem:
                                 Cmd:%s,
                                 SubCmd:%s,
-                                BuyItemIndex:%d,
+                                ShopID:%d,
                                 BuyCount:%d
                                 '''\
                                 %(
                                 self.Cmd,
                                 self.SubCmd,
-                                self.BuyItemIndex,
+                                self.ShopID,
                                 self.BuyCount
                                 )
         return DumpString
 
 
-m_NAtagCMBuyItem=tagCMBuyItem()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMBuyItem.Cmd,m_NAtagCMBuyItem.SubCmd))] = m_NAtagCMBuyItem
+m_NAtagCSBuyItem=tagCSBuyItem()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCSBuyItem.Cmd,m_NAtagCSBuyItem.SubCmd))] = m_NAtagCSBuyItem
 
 
 #------------------------------------------------------
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 6366384..5938ce6 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -16001,281 +16001,6 @@
 
 
 #------------------------------------------------------
-# A8 11 商店购买结果 #tagMCShoppingResult
-
-class  tagMCShoppingResult(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
-                  ("ItemIndex", c_int),    
-                  ("ItemCnt", c_int),    #购买数量
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        self.Cmd = 0xA8
-        self.SubCmd = 0x11
-        return
-
-    def ReadData(self, stringData, _pos=0, _len=0):
-        self.Clear()
-        memmove(addressof(self), stringData[_pos:], self.GetLength())
-        return _pos + self.GetLength()
-
-    def Clear(self):
-        self.Cmd = 0xA8
-        self.SubCmd = 0x11
-        self.ItemIndex = 0
-        self.ItemCnt = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagMCShoppingResult)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''// A8 11 商店购买结果 //tagMCShoppingResult:
-                                Cmd:%s,
-                                SubCmd:%s,
-                                ItemIndex:%d,
-                                ItemCnt:%d
-                                '''\
-                                %(
-                                self.Cmd,
-                                self.SubCmd,
-                                self.ItemIndex,
-                                self.ItemCnt
-                                )
-        return DumpString
-
-
-m_NAtagMCShoppingResult=tagMCShoppingResult()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCShoppingResult.Cmd,m_NAtagMCShoppingResult.SubCmd))] = m_NAtagMCShoppingResult
-
-
-#------------------------------------------------------
-# A8 16 神秘商店商品信息 #tagMCMysticalShopInfo
-
-class  tagMCMysticalShopGoods(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("GoodsID", c_int),    # 商品ID
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        return
-
-    def ReadData(self, stringData, _pos=0, _len=0):
-        self.Clear()
-        memmove(addressof(self), stringData[_pos:], self.GetLength())
-        return _pos + self.GetLength()
-
-    def Clear(self):
-        self.GoodsID = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagMCMysticalShopGoods)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''// A8 16 神秘商店商品信息 //tagMCMysticalShopInfo:
-                                GoodsID:%d
-                                '''\
-                                %(
-                                self.GoodsID
-                                )
-        return DumpString
-
-
-class  tagMCMysticalShopInfo(Structure):
-    Head = tagHead()
-    RefreshCnt = 0    #(WORD RefreshCnt)// 刷新次数
-    Count = 0    #(BYTE Count)// 商品数
-    GoodsList = list()    #(vector<tagMCMysticalShopGoods> GoodsList)// 商品信息
-    data = None
-
-    def __init__(self):
-        self.Clear()
-        self.Head.Cmd = 0xA8
-        self.Head.SubCmd = 0x16
-        return
-
-    def ReadData(self, _lpData, _pos=0, _Len=0):
-        self.Clear()
-        _pos = self.Head.ReadData(_lpData, _pos)
-        self.RefreshCnt,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        for i in range(self.Count):
-            temGoodsList = tagMCMysticalShopGoods()
-            _pos = temGoodsList.ReadData(_lpData, _pos)
-            self.GoodsList.append(temGoodsList)
-        return _pos
-
-    def Clear(self):
-        self.Head = tagHead()
-        self.Head.Clear()
-        self.Head.Cmd = 0xA8
-        self.Head.SubCmd = 0x16
-        self.RefreshCnt = 0
-        self.Count = 0
-        self.GoodsList = list()
-        return
-
-    def GetLength(self):
-        length = 0
-        length += self.Head.GetLength()
-        length += 2
-        length += 1
-        for i in range(self.Count):
-            length += self.GoodsList[i].GetLength()
-
-        return length
-
-    def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteWORD(data, self.RefreshCnt)
-        data = CommFunc.WriteBYTE(data, self.Count)
-        for i in range(self.Count):
-            data = CommFunc.WriteString(data, self.GoodsList[i].GetLength(), self.GoodsList[i].GetBuffer())
-        return data
-
-    def OutputString(self):
-        DumpString = '''
-                                Head:%s,
-                                RefreshCnt:%d,
-                                Count:%d,
-                                GoodsList:%s
-                                '''\
-                                %(
-                                self.Head.OutputString(),
-                                self.RefreshCnt,
-                                self.Count,
-                                "..."
-                                )
-        return DumpString
-
-
-m_NAtagMCMysticalShopInfo=tagMCMysticalShopInfo()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCMysticalShopInfo.Head.Cmd,m_NAtagMCMysticalShopInfo.Head.SubCmd))] = m_NAtagMCMysticalShopInfo
-
-
-#------------------------------------------------------
-# A8 06 通知神秘限购商品时间 #tagMCMysticalShopTimeInfo
-
-class  tagMCMysticalShopTime(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("GoodsID", c_int),    # 商品ID
-                  ("StartTime", c_int),    # 开卖时间
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        return
-
-    def ReadData(self, stringData, _pos=0, _len=0):
-        self.Clear()
-        memmove(addressof(self), stringData[_pos:], self.GetLength())
-        return _pos + self.GetLength()
-
-    def Clear(self):
-        self.GoodsID = 0
-        self.StartTime = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagMCMysticalShopTime)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''// A8 06 通知神秘限购商品时间 //tagMCMysticalShopTimeInfo:
-                                GoodsID:%d,
-                                StartTime:%d
-                                '''\
-                                %(
-                                self.GoodsID,
-                                self.StartTime
-                                )
-        return DumpString
-
-
-class  tagMCMysticalShopTimeInfo(Structure):
-    Head = tagHead()
-    Count = 0    #(WORD Count)// 商品数
-    ShopTimeList = list()    #(vector<tagMCMysticalShopTime> ShopTimeList)// 商品开卖信息
-    data = None
-
-    def __init__(self):
-        self.Clear()
-        self.Head.Cmd = 0xA8
-        self.Head.SubCmd = 0x06
-        return
-
-    def ReadData(self, _lpData, _pos=0, _Len=0):
-        self.Clear()
-        _pos = self.Head.ReadData(_lpData, _pos)
-        self.Count,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        for i in range(self.Count):
-            temShopTimeList = tagMCMysticalShopTime()
-            _pos = temShopTimeList.ReadData(_lpData, _pos)
-            self.ShopTimeList.append(temShopTimeList)
-        return _pos
-
-    def Clear(self):
-        self.Head = tagHead()
-        self.Head.Clear()
-        self.Head.Cmd = 0xA8
-        self.Head.SubCmd = 0x06
-        self.Count = 0
-        self.ShopTimeList = list()
-        return
-
-    def GetLength(self):
-        length = 0
-        length += self.Head.GetLength()
-        length += 2
-        for i in range(self.Count):
-            length += self.ShopTimeList[i].GetLength()
-
-        return length
-
-    def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteWORD(data, self.Count)
-        for i in range(self.Count):
-            data = CommFunc.WriteString(data, self.ShopTimeList[i].GetLength(), self.ShopTimeList[i].GetBuffer())
-        return data
-
-    def OutputString(self):
-        DumpString = '''
-                                Head:%s,
-                                Count:%d,
-                                ShopTimeList:%s
-                                '''\
-                                %(
-                                self.Head.OutputString(),
-                                self.Count,
-                                "..."
-                                )
-        return DumpString
-
-
-m_NAtagMCMysticalShopTimeInfo=tagMCMysticalShopTimeInfo()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCMysticalShopTimeInfo.Head.Cmd,m_NAtagMCMysticalShopTimeInfo.Head.SubCmd))] = m_NAtagMCMysticalShopTimeInfo
-
-
-#------------------------------------------------------
 # A8 10 通知获得物品 #tagMCNotifyUseItemGetItem
 
 class  tagMCNotifyUseItemGetItem(Structure):
@@ -16445,14 +16170,13 @@
 
 
 #------------------------------------------------------
-# A8 02 通知NPC商店物品今日已购买次数 #tagMCShopItemDayBuyCntInfo
+# A8 02 商店物品已购买次数 #tagSCShopItemBuyCntInfo
 
-class  tagMCShopItemDayBuyCnt(Structure):
+class  tagSCShopItemBuyCnt(Structure):
     _pack_ = 1
     _fields_ = [
-                  ("ItemIndex", c_int),    
-                  ("BuyCnt", c_int),    # 今日已购买次数
-                  ("IsReset", c_ubyte),    #是否重置
+                  ("ShopID", c_int),    # 商品ID
+                  ("BuyCnt", c_int),    # 已购买次数
                   ]
 
     def __init__(self):
@@ -16465,35 +16189,32 @@
         return _pos + self.GetLength()
 
     def Clear(self):
-        self.ItemIndex = 0
+        self.ShopID = 0
         self.BuyCnt = 0
-        self.IsReset = 0
         return
 
     def GetLength(self):
-        return sizeof(tagMCShopItemDayBuyCnt)
+        return sizeof(tagSCShopItemBuyCnt)
 
     def GetBuffer(self):
         return string_at(addressof(self), self.GetLength())
 
     def OutputString(self):
-        DumpString = '''// A8 02 通知NPC商店物品今日已购买次数 //tagMCShopItemDayBuyCntInfo:
-                                ItemIndex:%d,
-                                BuyCnt:%d,
-                                IsReset:%d
+        DumpString = '''// A8 02 商店物品已购买次数 //tagSCShopItemBuyCntInfo:
+                                ShopID:%d,
+                                BuyCnt:%d
                                 '''\
                                 %(
-                                self.ItemIndex,
-                                self.BuyCnt,
-                                self.IsReset
+                                self.ShopID,
+                                self.BuyCnt
                                 )
         return DumpString
 
 
-class  tagMCShopItemDayBuyCntInfo(Structure):
+class  tagSCShopItemBuyCntInfo(Structure):
     Head = tagHead()
-    Count = 0    #(WORD Count)//通知个数,注意不限制每日购买次数的默认不通知
-    DayBuyCntList = list()    #(vector<tagMCShopItemDayBuyCnt> DayBuyCntList)
+    Count = 0    #(WORD Count)
+    BuyCntList = list()    #(vector<tagSCShopItemBuyCnt> BuyCntList)//仅通知有限购次数的商品
     data = None
 
     def __init__(self):
@@ -16507,9 +16228,9 @@
         _pos = self.Head.ReadData(_lpData, _pos)
         self.Count,_pos = CommFunc.ReadWORD(_lpData, _pos)
         for i in range(self.Count):
-            temDayBuyCntList = tagMCShopItemDayBuyCnt()
-            _pos = temDayBuyCntList.ReadData(_lpData, _pos)
-            self.DayBuyCntList.append(temDayBuyCntList)
+            temBuyCntList = tagSCShopItemBuyCnt()
+            _pos = temBuyCntList.ReadData(_lpData, _pos)
+            self.BuyCntList.append(temBuyCntList)
         return _pos
 
     def Clear(self):
@@ -16518,7 +16239,7 @@
         self.Head.Cmd = 0xA8
         self.Head.SubCmd = 0x02
         self.Count = 0
-        self.DayBuyCntList = list()
+        self.BuyCntList = list()
         return
 
     def GetLength(self):
@@ -16526,7 +16247,7 @@
         length += self.Head.GetLength()
         length += 2
         for i in range(self.Count):
-            length += self.DayBuyCntList[i].GetLength()
+            length += self.BuyCntList[i].GetLength()
 
         return length
 
@@ -16535,14 +16256,14 @@
         data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
         data = CommFunc.WriteWORD(data, self.Count)
         for i in range(self.Count):
-            data = CommFunc.WriteString(data, self.DayBuyCntList[i].GetLength(), self.DayBuyCntList[i].GetBuffer())
+            data = CommFunc.WriteString(data, self.BuyCntList[i].GetLength(), self.BuyCntList[i].GetBuffer())
         return data
 
     def OutputString(self):
         DumpString = '''
                                 Head:%s,
                                 Count:%d,
-                                DayBuyCntList:%s
+                                BuyCntList:%s
                                 '''\
                                 %(
                                 self.Head.OutputString(),
@@ -16552,8 +16273,89 @@
         return DumpString
 
 
-m_NAtagMCShopItemDayBuyCntInfo=tagMCShopItemDayBuyCntInfo()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCShopItemDayBuyCntInfo.Head.Cmd,m_NAtagMCShopItemDayBuyCntInfo.Head.SubCmd))] = m_NAtagMCShopItemDayBuyCntInfo
+m_NAtagSCShopItemBuyCntInfo=tagSCShopItemBuyCntInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagSCShopItemBuyCntInfo.Head.Cmd,m_NAtagSCShopItemBuyCntInfo.Head.SubCmd))] = m_NAtagSCShopItemBuyCntInfo
+
+
+#------------------------------------------------------
+# A8 03 商店刷新解锁的商品信息 #tagSCShopRefreshItemInfo
+
+class  tagSCShopRefreshItemInfo(Structure):
+    Head = tagHead()
+    ShopType = 0    #(WORD ShopType)// 商店类型
+    RefreshCnt = 0    #(BYTE RefreshCnt)// 今日已刷新次数
+    Count = 0    #(BYTE Count)
+    ShopIDList = list()    #(vector<DWORD> ShopIDList)// 对应刷新出来的商店表商品ID列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA8
+        self.Head.SubCmd = 0x03
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.ShopType,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.RefreshCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
+            self.ShopIDList.append(value)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA8
+        self.Head.SubCmd = 0x03
+        self.ShopType = 0
+        self.RefreshCnt = 0
+        self.Count = 0
+        self.ShopIDList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 2
+        length += 1
+        length += 1
+        length += 4 * self.Count
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteWORD(data, self.ShopType)
+        data = CommFunc.WriteBYTE(data, self.RefreshCnt)
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteDWORD(data, self.ShopIDList[i])
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                ShopType:%d,
+                                RefreshCnt:%d,
+                                Count:%d,
+                                ShopIDList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ShopType,
+                                self.RefreshCnt,
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagSCShopRefreshItemInfo=tagSCShopRefreshItemInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagSCShopRefreshItemInfo.Head.Cmd,m_NAtagSCShopRefreshItemInfo.Head.SubCmd))] = m_NAtagSCShopRefreshItemInfo
 
 
 #------------------------------------------------------
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DataRecordPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DataRecordPack.py
index f5bc798..2b6a1a1 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DataRecordPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DataRecordPack.py
@@ -294,23 +294,6 @@
     SendEventPack("SetMoneyInWarehouse", dataDict, curPlayer)
     return
 
-
-## 出售物品获得金钱 
-#  @param curPlayer: 玩家实例
-#  @param moneyType: 金钱类型
-#  @param moneyCount: 金钱数量
-#  @return: None
-def DR_GetMoneyBySellPackItem(curPlayer, moneyType, moneyCount):
-
-    dataDict = {'PlayerID':curPlayer.GetPlayerID(), 'PlayerName':curPlayer.GetPlayerName(), 
-                'AccID':curPlayer.GetAccID(), 
-                'MoneyType':moneyType, 'MoneyCount':moneyCount, 
-                'PlayerMoneyCount':PlayerControl.GetMoney(curPlayer, moneyType)}
-
-    #发送封包
-    SendEventPack("GetMoneyBySellPackItem", dataDict, curPlayer)
-    return
-
 def DR_CTGError(curPlayer, errorInfo, addDict):
     ## CTG异常信息
     dataDict = {'PlayerID':curPlayer.GetPlayerID(), 'PlayerName':curPlayer.GetPlayerName(), 
@@ -518,17 +501,6 @@
     #发送封包
     curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
     SendEventPack("GMToolOperate", dataDict, curPlayer)
-    return
-
-
-## 出售指定背包物品
-#  @param curPlayer: 玩家实例
-#  @param dataDict: 记录信息字典
-#  @return: 
-def DR_SellPackItem(curPlayer, dataDict):
-    dataDict.update({"PlayerID":curPlayer.GetPlayerID(), "PlayerName":curPlayer.GetPlayerName(), 
-                     "AccID":curPlayer.GetAccID()})
-    SendEventPack("SellPackItem", dataDict, curPlayer)
     return
 
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventShell.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventShell.py
index f55e6e5..e3a59b7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventShell.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventShell.py
@@ -131,10 +131,10 @@
 #@remarks 远程执行NPC功能
 def FuncDirectCall(curPlayer, responseType, funcAnswer, tick, clientData=None):
     #远程事件,状态统一判断
-    if not FunctionNPCCommon.CheckPlayerCanStateEvent(curPlayer):
-        #退出回包
-        SyncMakeItemRefuse(curPlayer, funcAnswer)
-        return
+    #if not FunctionNPCCommon.CheckPlayerCanStateEvent(curPlayer):
+    #    #退出回包
+    #    SyncMakeItemRefuse(curPlayer, funcAnswer)
+    #    return
     
     callFunc = GameWorld.GetExecFunc(EventSrc, "%s.%s"%(responseType, funcAnswer))
     
@@ -191,36 +191,6 @@
     return GameWorld.GetPsycoFunc(callFunc)(curPlayer, tick)
 
 #===============================================================================
-# //08 03 玩家购买物品#tagCBuyItemList
-# tagCBuyItemList       *   GettagCBuyItemList();
-# 
-# class   IPY_CBuyItemList
-# {
-# public:
-# 
-#    int      GetBuyItemIndex();
-#    //购买数量
-#    int      GetBuyCount();
-# };
-#===============================================================================
-##客户端封包响应//08 03 玩家购买物品#tagCBuyItemList
-#@param index 玩家索引
-#@param tick 时间戳
-#@return 返回值无意义
-#@remarks 客户端封包响应//08 03 玩家购买物品#tagCBuyItemList
-def BuyItem(index, tick):
-    #得到玩家的对象
-    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
-
-    result = FuncDirectCall(curPlayer, "FunctionNPCCommon", "BuyItem", tick)
-
-    if result:
-        PlayerControl.NotifyCode(curPlayer, "BuyResSucceed")
-        
-    return
-
-
-#===============================================================================
 # //A2 03 回购物品 #tagCMBuyItemBack
 # 
 # struct tagCMBuyItemBack
@@ -234,31 +204,8 @@
 #  @return None
 def BuyItemBack(index, clientPack, tick):
     #得到玩家的对象
-    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
-    FunctionNPCCommon.BuyItemBack(curPlayer, clientPack, tick)
-    return
-
-#===============================================================================
-# //08 06 卖物品#tagCPlayerSellItem
-# tagCPlayerSellItem       *   GettagCPlayerSellItem();
-# 
-# class   IPY_CPlayerSellItem
-# {
-# public:
-#    //背包类型
-#    int      GetPackType();
-#    //物品索引
-#    int      GetItemIndex();
-# };
-#===============================================================================
-##客户端封包响应//08 06 卖物品#tagCPlayerSellItem
-#@param index 玩家索引
-#@param tick 时间戳
-#@return 返回值无意义
-#@remarks 客户端封包响应//08 06 卖物品#tagCPlayerSellItem
-def SellItem(index, tick):
-    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
-    FuncDirectCall(curPlayer, "FunctionNPCCommon", "SellItem", tick)
+    #curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    #FunctionNPCCommon.BuyItemBack(curPlayer, clientPack, tick)
     return
 
 #===============================================================================
@@ -385,16 +332,16 @@
 #  @return 无返回值
 #  @remarks 07 3C通用背包操作#tagCBackpackOperate
 def BackpackOperate(index, tick):
-    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
-    sendPack = IPY_GameWorld.IPY_CBackpackOperate()
-    pack_SrcBackpack = sendPack.GetSrcBackpack()
-    pack_DesBackPack = sendPack.GetDesBackPack()
-    pack_SrcIndex = sendPack.GetSrcIndex()
-    pack_DestIndex = sendPack.GetDestIndex()
-    pack_ItemCount = sendPack.GetCount()
-    
-    FunctionNPCCommon.BackpackOperate(curPlayer, pack_SrcBackpack, pack_DesBackPack, 
-                                          pack_SrcIndex, pack_DestIndex, pack_ItemCount, tick)
+#    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+#    sendPack = IPY_GameWorld.IPY_CBackpackOperate()
+#    pack_SrcBackpack = sendPack.GetSrcBackpack()
+#    pack_DesBackPack = sendPack.GetDesBackPack()
+#    pack_SrcIndex = sendPack.GetSrcIndex()
+#    pack_DestIndex = sendPack.GetDestIndex()
+#    pack_ItemCount = sendPack.GetCount()
+#    
+#    FunctionNPCCommon.BackpackOperate(curPlayer, pack_SrcBackpack, pack_DesBackPack, 
+#                                          pack_SrcIndex, pack_DestIndex, pack_ItemCount, tick)
     return
 #---------------------------------------------------------------------
 #===============================================================================
@@ -429,8 +376,8 @@
     if PlayerCoat.SwitchCoat(curPlayer, pack_SrcBackpack, pack_DesBackPack, pack_SrcIndex, pack_DestIndex):
         return
     
-    FunctionNPCCommon.PackItemExchange(curPlayer, pack_SrcBackpack, pack_DesBackPack, 
-                                          pack_SrcIndex, pack_DestIndex, tick)
+    #FunctionNPCCommon.PackItemExchange(curPlayer, pack_SrcBackpack, pack_DesBackPack, 
+    #                                      pack_SrcIndex, pack_DestIndex, tick)
     return
 
 #===============================================================================
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py
index 311a05b..a38043c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py
@@ -46,480 +46,98 @@
 #---------------------------------------------------------------------
 #"""Version = 2016-08-04 18:00"""
 #---------------------------------------------------------------------
-import ChPyNetSendPack
-import NetPackCommon
-import GameWorld
-import IPY_GameWorld
-import ItemControler
+
 import ChConfig
+import GameWorld
+import NetPackCommon
+import ItemControler
+import ChPyNetSendPack
 import PlayerControl
-import ItemCommon
-import ShareDefine
-import PlayerFlashSale
-#import EventSrc
-import ChItem
 import IpyGameDataPY
-import PlayerRune
-import GameFuncComm
-import PlayerSpringSale
-import PyGameData
+import ItemCommon
+import ObjPool
 
-import random
-import math
-import time
+# 重置类型
+ResetType_Day = 1
+ResetType_Week = 2
 
-g_mysticalShopDict = {} #神秘商店{等级范围:[等级段,{金钱类型:库}]}
-#---------------------------------------------------------------------
-##开始交易
-# @param curPlayer 玩家实例
-# @param tick 时间戳
-# @return 返回值真, 逻辑运行成功
-# @remarks 开始交易
-def StartTrade(curPlayer, tick):
+# 解锁类型
+UnlockType_FamilyLV = 1 # 公会等级
+UnlockType_RandRefresh = 2 # 随机刷新解锁
 
-    curActionObj = curPlayer.GetActionObj()
-    if curActionObj == None:
-        return
-    
-    if curActionObj.GetGameObjType() != IPY_GameWorld.gotNPC:
-        return
-            
-    curActionNPC = GameWorld.GetNPCManager().GetNPCByIndex(curActionObj.GetIndex())
-    curActionNPCID = curActionNPC.GetNPCID()
-    
-    # 设置当前商店的npcid
-    curPlayer.SetDict(ChConfig.Def_PlayerKey_TradeTagNPC, curActionNPCID)
-    
-    #设定为禁止整理背包
-    curPlayer.SetForbiddenResetItem(1)
-    curPlayer.BeginSpecialEvent(ShareDefine.TYPE_Event_Shop)
-    return True
+# 部分商店类型
+ShopType_HeroSoul = 3 # 将魂
 
-#------------------------------------------------------------------------------ 
-## 获取远程商店的npc
-# @param curPlayer 玩家实例
-# @return 远程商店的npc
-def GetDirectNpcID():
-    return 0
+RefreshShopTypeList = [ShopType_HeroSoul]
 
-#---------------------------------------------------------------------
-##请求商店物品列表
-# @param curPlayer 玩家实例
-# @param tick 时间戳
-# @return 返回值真, 逻辑运行成功
-def QueryNPCShopItem(playerIndex, clientData, tick):
-    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)
-    
-    #时间间隔未到
-    if tick - curPlayer.GetTickByType(ChConfig.TYPE_Player_Tick_QueryFuncData) \
-       < ChConfig.TYPE_Player_Tick_Time[ChConfig.TYPE_Player_Tick_QueryFuncData]:
-        return
-    
-    curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_QueryFuncData, tick) 
-    
-    #直接查询,存在该NPCID就发包
-    tradeTagNPC = clientData.NPCShopID
-    GameWorld.GetGameData().FilterShopItemByShopType(tradeTagNPC)
-    shopItemCount = GameWorld.GetGameData().GetFilterShopItemCount()
-    if shopItemCount <= 0:
-        return
-    
-#    # 商店npcid与当前对话npc对应,0为远程商店
-#    tradeTagNPC = clientData.NPCShopID
-#    if tradeTagNPC != 0 and not CheckTradeTagNPC(curPlayer, tradeTagNPC):
-#        return
-    
-    # 发送商品今日已购买次数
-    #SyncShopItemTodayBuyCount(curPlayer)
-    
-    # 发送商店物品列表
-    curPlayer.BeginShopEx(tradeTagNPC)    
+def DoShopOpen(curPlayer):
+    for shopType in RefreshShopTypeList:
+        DoRandRefreshShopItem(curPlayer, shopType, sysRefresh=True)
     return
 
-##同步商店NPC物品今日购买次数
-# @param curPlayer 玩家实例
-# @param npcID
-# @param itemIndex -1时同步该NPC所有物品
-# @return 
-def SyncShopItemTodayBuyCount(curPlayer, itemIndexList=[], isReset=False):
-    dayBuyCntInfo = ChPyNetSendPack.tagMCShopItemDayBuyCntInfo()
-    dayBuyCntInfo.DayBuyCntList = []
-    if itemIndexList:
-        for itemIndex in itemIndexList:
-            __AppendShopItemDayBuyCntInfo(curPlayer, itemIndex, dayBuyCntInfo.DayBuyCntList, isReset)
-    else:
-        ipyDataMgr = IpyGameDataPY.IPY_Data()
-        for i in xrange(ipyDataMgr.GetStoreCount()):
-            shopItem = ipyDataMgr.GetStoreByIndex(i)
-            if not shopItem.GetLimitCnt():
-                continue
-            dayBuyCntKey = ChConfig.Def_PDict_ShopItemDayBuyCnt % shopItem.GetID()
-            curDayBuyCnt = curPlayer.NomalDictGetProperty(dayBuyCntKey)
-            if curDayBuyCnt <= 0:
-                continue
-            __AppendShopItemDayBuyCntInfo(curPlayer, shopItem.GetID(), dayBuyCntInfo.DayBuyCntList, isReset)
-            
-    dayBuyCntInfo.Count = len(dayBuyCntInfo.DayBuyCntList)
-    NetPackCommon.SendFakePack(curPlayer, dayBuyCntInfo)
+def ShopItemOnLogin(curPlayer):
+    SyncShopItemBuyCntInfo(curPlayer)
+    for shopType in RefreshShopTypeList:
+        SyncShopRefreshItemInfo(curPlayer, shopType)
     return
 
-##增加商店物品今日购买次数信息
-# @param curPlayer 玩家实例
-# @param npcID
-# @param itemIndex
-# @return 
-def __AppendShopItemDayBuyCntInfo(curPlayer, itemIndex, dayBuyCntList, isReset):
-    itemDayBuyCnt = ChPyNetSendPack.tagMCShopItemDayBuyCnt()
-    itemDayBuyCnt.ItemIndex = itemIndex
-    dayBuyCntKey = ChConfig.Def_PDict_ShopItemDayBuyCnt % itemIndex
-    curDayBuyCnt = curPlayer.NomalDictGetProperty(dayBuyCntKey)
-    itemDayBuyCnt.BuyCnt = curDayBuyCnt
-    itemDayBuyCnt.IsReset = int(isReset)
-    dayBuyCntList.append(itemDayBuyCnt)
-    return
-
-## 登录
-def ShopItemOnLogin(curPlayer):    
-    SyncMysticalLimitShopInfo(curPlayer)
-    SyncShopItemTodayBuyCount(curPlayer)
-    if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MysticalShopGoods % 0):
-        __DoMysticalShopRefresh(curPlayer, True, GameWorld.GetGameWorld().GetTick())
-    SyncMysticalShopInfo(curPlayer)
-    return
-
-##商店物品OnDay
-# @param curPlayer 玩家实例
-# @return 
-def ShopItemOnDay(curPlayer, onEventType):
-    if onEventType == ShareDefine.Def_OnEventType:
-        OSSaleOpenMail(curPlayer)
-        refreshType = [3]
-        #神秘商店刷新次数重置
-        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MysticalShopRefreshCnt, 0)
-        SyncMysticalShopInfo(curPlayer)
+def ShopItemOnDay(curPlayer):
+    for shopType in RefreshShopTypeList:
+        if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShopRefreshCnt % shopType):
+            continue
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ShopRefreshCnt % shopType, 0)
+        SyncShopRefreshItemInfo(curPlayer, shopType)
         
-    elif onEventType == ShareDefine.Def_OnEventTypeEx:
-        refreshType = [4]
-        openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)
-        isMixServer = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_IsMixServer)
-        if isMixServer:
-            mixServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_MixServerDay)
-            if mixServerDay % 3 == 0:
-                refreshType.append(7)
-        elif openServerDay % 3 == 0:
-            refreshType.append(7)
-    else:
-        return
-    ResetShopItemBuyCount(curPlayer, refreshType)
+    ResetShopItemBuyCount(curPlayer, [ResetType_Day])
     return
 
-##商店物品OnWeek
-# @param curPlayer 玩家实例
-# @return 
-def ShopItemOnWeek(curPlayer, onEventType):
-    if onEventType == ShareDefine.Def_OnEventType:
-        refreshType = [1]
-    elif onEventType == ShareDefine.Def_OnEventTypeEx:
-        refreshType = [2]
-    else:
-        return
-    ResetShopItemBuyCount(curPlayer, refreshType)
-    return
-
-##商店物品OnMonth
-# @param curPlayer 玩家实例
-# @return 
-def ShopItemOnMonth(curPlayer, onEventType):
-    if onEventType == ShareDefine.Def_OnEventType:
-        refreshType = 5
-    elif onEventType == ShareDefine.Def_OnEventTypeEx:
-        refreshType = 6
-    else:
-        return
-    ResetShopItemBuyCount(curPlayer, [refreshType])
-    return
-
-def ShopItemOnCrossPKSeasonChange(curPlayer):
-    ## 按跨服PK赛季重置
-    refreshType = 8
-    ResetShopItemBuyCount(curPlayer, [refreshType])
+def ShopItemOnWeek(curPlayer):
+    ResetShopItemBuyCount(curPlayer, [ResetType_Week])
     return
 
 def ResetShopItemBuyCount(curPlayer, resetTypeList):
     #@param resetTypeList: 需要重置的类型列表
-    #重置商店物品购买次数  1:周一0点刷新    2:周一5点刷新    3:每日0点刷新    4:每日5点刷新    5每月0点    6每月5点   7每3天5点  8每赛季
     if not resetTypeList:
         # 暂定必须指定类型列表,防止终身限购的误被重置
         return
-    
-    syncIndexList = []
+    syncIDList = []
     ipyDataMgr = IpyGameDataPY.IPY_Data()
     for i in xrange(ipyDataMgr.GetStoreCount()):
         shopItem = ipyDataMgr.GetStoreByIndex(i)
         if not shopItem.GetLimitCnt():
             continue
-        if shopItem.GetRefreshLimit():
+        if shopItem.GetResetType() not in resetTypeList:
             continue
-        if shopItem.GetRefreshType() not in resetTypeList:
+        shopID = shopItem.GetID()
+        curBuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShopBuyCnt % shopID)
+        if curBuyCnt <= 0:
             continue
-        dayBuyCntKey = ChConfig.Def_PDict_ShopItemDayBuyCnt % shopItem.GetID()
-        curDayBuyCnt = curPlayer.NomalDictGetProperty(dayBuyCntKey)
-        if curDayBuyCnt <= 0:
-            continue
-        PlayerControl.NomalDictSetProperty(curPlayer, dayBuyCntKey, 0)
-        syncIndexList.append(shopItem.GetID())
-    if syncIndexList:
-        SyncShopItemTodayBuyCount(curPlayer, syncIndexList, True)
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ShopBuyCnt % shopID, 0)
+        syncIDList.append(shopID)
+    if syncIDList:
+        SyncShopItemBuyCntInfo(curPlayer, syncIDList)
     return
 
 def ResetShopItemBuyCountByShopType(curPlayer, shopTypeList):
     ##根据商店类型重置商店限购物品次数
     if not shopTypeList:
         return
-    syncIndexList = []
-    ipyDataMgr = IpyGameDataPY.IPY_Data()
-    for i in xrange(ipyDataMgr.GetStoreCount()):
-        shopItem = ipyDataMgr.GetStoreByIndex(i)
-        if not shopItem.GetLimitCnt():
+    syncIDList = []
+    for shopType in shopTypeList:
+        ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition("Store", {"ShopType":shopType}, True, True)
+        if not ipyDataList:
             continue
-        if shopItem.GetRefreshLimit():
-            continue
-        if shopItem.GetShopType() not in shopTypeList:
-            continue
-        dayBuyCntKey = ChConfig.Def_PDict_ShopItemDayBuyCnt % shopItem.GetID()
-        curDayBuyCnt = curPlayer.NomalDictGetProperty(dayBuyCntKey)
-        if curDayBuyCnt <= 0:
-            continue
-        PlayerControl.NomalDictSetProperty(curPlayer, dayBuyCntKey, 0)
-        syncIndexList.append(shopItem.GetID())
-    if syncIndexList:
-        SyncShopItemTodayBuyCount(curPlayer, syncIndexList, True)
-    return
-
-def MysticalLimitShopOpen(curPlayer, befLV, aftLV):
-    ##神秘限购开启
-    ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('Store', {'ShopType':16}, True)
-    if not ipyDataList:
-        return
-    curTime = int(time.time())
-    syncGoodsList = []
-    for ipyData in ipyDataList:
-        limitLV = ipyData.GetLimitLV()
-        if befLV < limitLV and aftLV >= limitLV:
-            goodsID = ipyData.GetID()
-            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ShopItemStartTime % goodsID, curTime)
-            syncGoodsList.append(goodsID)
-            GameWorld.DebugLog('神秘限购商品%s 开卖'%goodsID, curPlayer.GetID())
-    if syncGoodsList:
-        SyncMysticalLimitShopInfo(curPlayer)
-    return
-
-def SyncMysticalLimitShopInfo(curPlayer):
-    ##神秘限购通知
-    packData = ChPyNetSendPack.tagMCMysticalShopTimeInfo()
-    packData.ShopTimeList = []
-    ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('Store', {'ShopType':16}, True)
-    curTime = int(time.time())
-    for ipyData in ipyDataList:
-        goodsID = ipyData.GetID()
-        startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShopItemStartTime % goodsID)
-        if not startTime:
-            continue
-        if curTime - startTime >= ipyData.GetLimitValue():
-            #超时的重置
-            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ShopItemStartTime % goodsID, 0)
-        else:
-            goodsTime = ChPyNetSendPack.tagMCMysticalShopTime()
-            goodsTime.GoodsID = goodsID
-            goodsTime.StartTime = startTime
-            packData.ShopTimeList.append(goodsTime)
-    if not packData.ShopTimeList:
-        return
-    packData.Count = len(packData.ShopTimeList)
-    NetPackCommon.SendFakePack(curPlayer, packData)
-    return
-
-def CheckMysticalShopRefresh(curPlayer, tick):
-    ##神秘商店刷新
-    createRoleTime = curPlayer.GetCreateRoleTime()
-    if not createRoleTime:
-        return
-    diffTime = GameWorld.GetCurrentTime() - GameWorld.GetDateTimeByStr(createRoleTime, ChConfig.TYPE_Time_Format)
-    pastSeconds = diffTime.days*24*60*60 + diffTime.seconds
-    refreshTime = IpyGameDataPY.GetFuncCfg('MysteryShopRefresh', 4)
-    if refreshTime and pastSeconds % refreshTime == 0:
-        __DoMysticalShopRefresh(curPlayer, True, tick)
-    return
-
-#// A2 32 神秘商店刷新 #tagCMRefreshMysticalShop
-#struct    tagCMRefreshMysticalShop
-#{
-#    tagHead        Head;
-#};
-def OnMysticalShopRefresh(index, clientData, tick):
-    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
-    __DoMysticalShopRefresh(curPlayer, False, tick)
-    return
-
-def __DoMysticalShopRefresh(curPlayer, isFree, tick):
-    global g_mysticalShopDict #{等级范围:[等级段,{金钱类型:库}]}
-    refreshTime = IpyGameDataPY.GetFuncCfg('MysteryShopRefresh', 4)
-    if not refreshTime:
-        return
-
-    lastTime = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MysticalShopLastTime)
-    if lastTime and tick - lastTime < 1000:
-        #GameWorld.DebugLog('神秘商店刷新,过于频繁!')
-        return
-    curPlayer.SetDict(ChConfig.Def_PlayerKey_MysticalShopLastTime, tick)
-    if not g_mysticalShopDict:
-        ipyMgr= IpyGameDataPY.IPY_Data()
-        for i in xrange(ipyMgr.GetMysteryShopCount()):
-            ipyData = ipyMgr.GetMysteryShopByIndex(i)
-            lvRange = ipyData.GetLVRange()
-            goodsID = ipyData.GetGoodsID()
-            goodsIpyData = IpyGameDataPY.GetIpyGameData('Store', goodsID)
-            if not goodsIpyData:
+        for ipyData in ipyDataList:
+            if not ipyData.GetLimitCnt():
                 continue
-            moneyType = goodsIpyData.GetMoneyType()
-            weight = goodsIpyData.GetLimitValue()
-            lvkey = tuple(lvRange)
-            if lvkey not in g_mysticalShopDict:
-                g_mysticalShopDict[lvkey] = [lvkey[0], {}]
-                weightDict = {}
-            if moneyType not in g_mysticalShopDict[lvkey][1]:
-                g_mysticalShopDict[lvkey][1][moneyType] = []
-            weightDict[moneyType] = weightDict.get(moneyType, 0) + weight
-            g_mysticalShopDict[lvkey][1][moneyType].append([weightDict[moneyType], goodsID])
-    if not g_mysticalShopDict:
-        return 
-    playerLV = curPlayer.GetLV()
-    curLVDan, shopDict = GameWorld.GetDictValueByRangeKey(g_mysticalShopDict, playerLV)
-    if not shopDict:
-        return
-    maxCnt = IpyGameDataPY.GetFuncCfg('MysteryShopGoods', 1)
-    goldGoodsCnt =GameWorld.GetResultByRandomList(IpyGameDataPY.GetFuncEvalCfg('MysteryShopGoods', 2))
-    if not goldGoodsCnt:
-        return
-    specialGoodsID = 0 #必出的商品ID
-    if not isFree:
-        #优先道具,再仙玉
-        itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
-        costItemID = IpyGameDataPY.GetFuncCfg('MysteryShopRefresh', 1)
-        costItemCntDict = IpyGameDataPY.GetFuncEvalCfg('MysteryShopRefresh', 2)
-        curRefreshCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MysticalShopRefreshCnt)
-        cntList = [int(cnt) for cnt in costItemCntDict.keys()]
-        cntList.sort()
-        costItemCnt = costItemCntDict[str(cntList[-1])]
-        for cnt in cntList:
-            if curRefreshCnt < cnt:
-                costItemCnt = costItemCntDict[str(cnt)]
-                break
-        enough, indexList, hasBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(costItemID, itemPack, costItemCnt)
-        costGold = 0
-        if not enough:
-            costGold = lackCnt * IpyGameDataPY.GetFuncCfg('MysteryShopRefresh', 3)
-            if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costGold, ChConfig.Def_Cost_MysteryShopRefresh):
-                return
-        ItemCommon.ReduceItem(curPlayer, itemPack, indexList, costItemCnt, False, "MysteryShopRefresh")
-        curLVRefreshData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MysticalShopLVRefreshCnt)
-        curLVRefreshCnt, lvDan = curLVRefreshData / 10000, curLVRefreshData % 10000 
-        updLVRefreshCnt = 1 if curLVDan != lvDan else curLVRefreshCnt + 1 #等级段变更,重置该等级段的刷新次数
-        updLVRefreshData = min(updLVRefreshCnt * 10000+curLVDan, ChConfig.Def_UpperLimit_DWord)
-        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MysticalShopLVRefreshCnt, updLVRefreshData)
-        specialRefreshCfg = IpyGameDataPY.GetFuncEvalCfg('MysteryShopRefresh', 5)
-        if curLVDan in specialRefreshCfg and updLVRefreshCnt == specialRefreshCfg[curLVDan][0]:
-            specialGoodsID = specialRefreshCfg[curLVDan][1]
-        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MysticalShopRefreshCnt, curRefreshCnt+1)
-        
-    goldGoodsCnt = min(goldGoodsCnt, maxCnt)
-    sliverGoodsCnt = maxCnt - goldGoodsCnt
-    goodsResultList = []
-    if goldGoodsCnt:
-        goodsResultList += GameWorld.GetResultByRandomListEx(shopDict.get(IPY_GameWorld.TYPE_Price_Gold_Money, []), goldGoodsCnt, [])
-    if sliverGoodsCnt:
-        goodsResultList += GameWorld.GetResultByRandomListEx(shopDict.get(IPY_GameWorld.TYPE_Price_Silver_Money, []), sliverGoodsCnt, [])
-    if specialGoodsID and specialGoodsID not in goodsResultList:
-        goodsResultList[0] = specialGoodsID
-        GameWorld.DebugLog('神秘商店刷新特殊规则,等级段:%s,updLVRefreshCnt=%s,specialGoodsID=%s'%(curLVDan, updLVRefreshCnt, specialGoodsID))
-    
-    GameWorld.DebugLog('神秘商店刷新isFree=%s,goldGoodsCnt=%s,sliverGoodsCnt=%s,goodsResultList=%s'%(isFree, goldGoodsCnt, sliverGoodsCnt, goodsResultList))
-    syncIndexList = []
-    for i in xrange(maxCnt):
-        goodsID = goodsResultList[i] if i < len(goodsResultList) else 0
-        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MysticalShopGoods % i, goodsID)
-        
-        dayBuyCntKey = ChConfig.Def_PDict_ShopItemDayBuyCnt % goodsID
-        curDayBuyCnt = curPlayer.NomalDictGetProperty(dayBuyCntKey)
-        if curDayBuyCnt:
-            PlayerControl.NomalDictSetProperty(curPlayer, dayBuyCntKey, 0)
-            syncIndexList.append(goodsID)
-    if syncIndexList:
-        SyncShopItemTodayBuyCount(curPlayer, syncIndexList, True)
-    #通知
-    SyncMysticalShopInfo(curPlayer)
-    return
-
-def SyncMysticalShopInfo(curPlayer):
-    ##神秘商店通知
-    packData = ChPyNetSendPack.tagMCMysticalShopInfo()
-    packData.RefreshCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MysticalShopRefreshCnt)
-    packData.GoodsList = []
-    maxCnt = IpyGameDataPY.GetFuncCfg('MysteryShopGoods', 1)
-    for i in xrange(maxCnt):
-        goodsID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MysticalShopGoods % i)
-        goodsInfo = ChPyNetSendPack.tagMCMysticalShopGoods()
-        goodsInfo.GoodsID = goodsID
-        packData.GoodsList.append(goodsInfo)
-    packData.Count = len(packData.GoodsList)
-    NetPackCommon.SendFakePack(curPlayer, packData)
-    return
-
-## 回购物品
-#  @param None
-#  @return None
-def BuyItemBack(curPlayer, clientPack, tick):
-    index = clientPack.Index
-
-    backPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptRecycle)
-    if index >= backPack.GetCount():
-        #假包退出
-        return
-    
-    curItem = backPack.GetAt(index)
-    if not curItem or curItem.IsEmpty():
-        #没有物品退出
-        return
-    
-    realPutCount = curItem.GetCount()
-    itemControl = ItemControler.PlayerItemControler(curPlayer)
-    if not itemControl.CanPutInItem(IPY_GameWorld.rptItem, 
-                                    curItem.GetItemTypeID(), 
-                                    realPutCount, 
-                                    curItem.GetIsBind()):
-        #物品不能放入退出
-        PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_676165", [IPY_GameWorld.rptItem])
-        return 
-    
-    itemPrice, priceType = __GetItemSellPrice(curPlayer, curItem)
-    itemPrice = int(itemPrice) * realPutCount
-    if not priceType or not itemPrice:
-        return
-         
-    #付钱
-    infoDict = {ChConfig.Def_Cost_Reason_SonKey:curItem.GetItemTypeID()}
-    if not PlayerControl.PayMoney(curPlayer, priceType, itemPrice, ChConfig.Def_Cost_BuyItemBack, infoDict):
-        return
-    
-    itemControl.PutInItem(IPY_GameWorld.rptItem, curItem, event=["BuyItemBack", False, {}])
-    
-    itemIndexs = str(curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_DelPackIndex))
-    itemIndexs = itemIndexs.replace(str(index + 1), '')
-    if itemIndexs == '':
-        #没有物品保留 0
-        itemIndexs = '0'
-    
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_DelPackIndex, int(itemIndexs))
+            shopID = ipyData.GetID()
+            curBuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShopBuyCnt % shopID)
+            if curBuyCnt <= 0:
+                continue
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ShopBuyCnt % shopID, 0)
+            syncIDList.append(shopID)
+    if syncIDList:
+        SyncShopItemBuyCntInfo(curPlayer, syncIDList)
     return
 
 def PayAutoBuyItem(curPlayer, lackItemDict, priceType, costType=ChConfig.Def_Cost_Unknown, infoDict={}, isCheck=False, shopItemIndexDict=None):
@@ -541,27 +159,26 @@
             return
         
         if shopItemIndexDict and itemID in shopItemIndexDict:
-            itemIndex = shopItemIndexDict[itemID]
-            ipyData = IpyGameDataPY.GetIpyGameData("Store", itemIndex)
+            shopID = shopItemIndexDict[itemID]
+            ipyData = IpyGameDataPY.GetIpyGameData("Store", shopID)
         else:
             ipyData = ItemCommon.GetShopItemPriceIpyData(itemID, priceType)
         if not ipyData:
             return
         
-        itemIndex = ipyData.GetID()
+        shopID = ipyData.GetID()
         shopType = ipyData.GetShopType()
         priceType = ipyData.GetMoneyType()
         itemMoney = ipyData.GetMoneyNum()
-        limitCntList = ipyData.GetLimitCnt()
-        if limitCntList:
-            limitBuyCnt = limitCntList[0]
-            curDayBuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShopItemDayBuyCnt % itemIndex)
-            canBuyCnt = max(0, limitBuyCnt - curDayBuyCnt)
+        limitBuyCnt = ipyData.GetLimitCnt()
+        if limitBuyCnt:
+            curBuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShopBuyCnt % shopID)
+            canBuyCnt = max(0, limitBuyCnt - curBuyCnt)
             if canBuyCnt < lackCnt:
-                GameWorld.Log("自动购买次数不足!shopType=%s,itemIndex=%s,itemID=%s,limitBuyCnt=%s,curDayBuyCnt=%s,canBuyCnt=%s < %s" 
-                              % (shopType, itemIndex, itemID, limitBuyCnt, curDayBuyCnt, canBuyCnt, lackCnt), curPlayer.GetPlayerID())
+                GameWorld.Log("自动购买次数不足!shopType=%s,shopID=%s,itemID=%s,limitBuyCnt=%s,curBuyCnt=%s,canBuyCnt=%s < %s" 
+                              % (shopType, shopID, itemID, limitBuyCnt, curBuyCnt, canBuyCnt, lackCnt), curPlayer.GetPlayerID())
                 return
-            addLimitCountInfo[itemIndex] = lackCnt
+            addLimitCountInfo[shopID] = lackCnt
             
         totalMoney += (lackCnt * itemMoney)
         
@@ -578,679 +195,254 @@
         return
     
     if addLimitCountInfo:
-        syncIndexList = []
-        for itemIndex, lackCnt in addLimitCountInfo.items():
-            curDayBuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShopItemDayBuyCnt % itemIndex)
-            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ShopItemDayBuyCnt % itemIndex, curDayBuyCnt + lackCnt)
-            syncIndexList.append(itemIndex)
-        SyncShopItemTodayBuyCount(curPlayer, syncIndexList)
+        syncIDList = []
+        for shopID, lackCnt in addLimitCountInfo.items():
+            curBuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShopBuyCnt % shopID)
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ShopBuyCnt % shopID, curBuyCnt + lackCnt)
+            syncIDList.append(shopID)
+        SyncShopItemBuyCntInfo(curPlayer, syncIDList)
         
     return True
 
-#// A3 10 购买商城物品 #tagCMBuyItem
+#// A3 10 购买商城物品 #tagCSBuyItem
 #
-#struct    tagCMBuyItem
+#struct    tagCSBuyItem
 #{
 #    tagHead        Head;
-#    WORD        BuyItemIndex;        //购买的物品索引
-#    DWORD        BuyCount;        //购买数量
+#    DWORD        ShopID;        //商品ID
+#    DWORD        BuyCount;    //购买数量
 #};
 def PyBuyItem(index, clientData, tick):
     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
-    itemIndex = clientData.BuyItemIndex
+    shopID = clientData.ShopID
     buyCount = clientData.BuyCount
-    OnBuyItem(curPlayer, itemIndex, buyCount)
+    OnBuyItem(curPlayer, shopID, buyCount)
     return
 
-##购买物品
-# @param curPlayer 玩家实例
-# @param tick 时间戳
-# @return 返回值真, 逻辑运行成功
-def BuyItem(curPlayer, tick):
-    buyItemList = IPY_GameWorld.IPY_CBuyItemList()    
-    itemIndex = buyItemList.GetBuyItemIndex()
-    clientBuyCount = buyItemList.GetBuyCount()
-    OnBuyItem(curPlayer, itemIndex, clientBuyCount)
-    return
-
-def OnBuyItem(curPlayer, itemIndex, clientBuyCount):
-    GameWorld.DebugLog("购买商城物品: itemIndex=%s,clientBuyCount=%s" % (itemIndex, clientBuyCount), curPlayer.GetPlayerID())
+def OnBuyItem(curPlayer, shopID, clientBuyCount):
+    GameWorld.DebugLog("购买商城物品: shopID=%s,clientBuyCount=%s" % (shopID, clientBuyCount))
     if GameWorld.IsCrossServer():
         return
-    if itemIndex < 0 or clientBuyCount <= 0:
+    if shopID <= 0 or clientBuyCount <= 0:
         return
-    ipyData = IpyGameDataPY.GetIpyGameData("Store", itemIndex)
+    ipyData = IpyGameDataPY.GetIpyGameData("Store", shopID)
     if not ipyData:
         return
     shopType = ipyData.GetShopType()
-    operationActionShopType = ipyData.GetOperationActionShop()
-    if operationActionShopType == 1:
-        if not PlayerSpringSale.IsSpringSaleShopType(shopType):
-            return
-    elif operationActionShopType == 2:
-        if not PlayerFlashSale.IsFlashSaleShopType(shopType):
-            return
-        
-    # 物品信息
-    limitLV = ipyData.GetLimitLV()
-    if limitLV and curPlayer.GetLV() < limitLV:
-        return
-    LimitVIPLVList = ipyData.GetLimitVIPLV()
-    LimitCntList = ipyData.GetLimitCnt()
-    limitBuyCnt = 0
-    if LimitVIPLVList or LimitCntList:
-        if not LimitVIPLVList:
-            LimitVIPLVList = [0]
-        if not LimitCntList:
-            LimitCntList = [0]
-
-        if len(LimitVIPLVList) != len(LimitCntList):
-            GameWorld.Log("    购买物品LimitVIPLV  LimitCnt 长度不同")
-            return
-        curVIPlv = curPlayer.GetVIPLv()
-        limitBuyCnt = -1
-        for i, viplv in enumerate(LimitVIPLVList):
-            if curVIPlv < viplv:
-                break
-            limitBuyCnt = LimitCntList[i]
-        if limitBuyCnt == -1:
-            GameWorld.DebugLog("    vip%s才能购买"%viplv)
-            return
-    
-    curDayBuyCnt = 0
-    dayBuyCntKey = ChConfig.Def_PDict_ShopItemDayBuyCnt % itemIndex
+    limitBuyCnt = ipyData.GetLimitCnt()
     if limitBuyCnt > 0:
-        curDayBuyCnt = curPlayer.NomalDictGetProperty(dayBuyCntKey)
-        canBuyCnt = max(0, limitBuyCnt - curDayBuyCnt)
+        curBuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShopBuyCnt % shopID)
+        canBuyCnt = max(0, limitBuyCnt - curBuyCnt)
         if canBuyCnt <= 0:
-            GameWorld.DebugLog("BuyShopItem 今日购买次数已满!shopType=%s,itemIndex=%s" % (shopType, itemIndex))
+            GameWorld.DebugLog("商品限购次数已满 ! shopType=%s,shopID=%s,curBuyCnt=%s < %s" % (shopType, shopID, curBuyCnt, limitBuyCnt))
             return
         if clientBuyCount > canBuyCnt:
-            GameWorld.DebugLog("BuyShopItem 修正购买次数!shopType=%s,itemIndex=%s,clientBuyCount=%s,canBuyCnt=%s" 
-                               % (shopType, itemIndex, clientBuyCount, canBuyCnt))
             clientBuyCount = canBuyCnt
-    serverLimitCnt = ipyData.GetServerLimitCnt()
-    if serverLimitCnt > 0:
-        clientBuyCount = min(serverLimitCnt, clientBuyCount)
-        
-    itemID, itemCount, isBind = ipyData.GetItemID(), ipyData.GetItemCnt(), ipyData.GetIsBind()
+            
+    itemID, itemCount, isBind = ipyData.GetItemID(), ipyData.GetItemCnt(), 0
     itemListEx = ipyData.GetItemListEx()
-    priceType, itemPrice = ipyData.GetMoneyType(), ipyData.GetMoneyNum()
-    
-    itemPrice *= clientBuyCount
-    job = curPlayer.GetJob()
-    jobItemList = ipyData.GetJobItem()
     totalItemList = []
     if itemID:
-        jobItemID = GetShopJobItem(job, itemID, jobItemList)
-        totalItemList.append([jobItemID, itemCount * clientBuyCount, isBind])
+        totalItemList.append([itemID, itemCount * clientBuyCount, isBind])
     for itemIDEx, itemCountEx, isBindEx in itemListEx:
-        jobItemID = GetShopJobItem(job, itemIDEx, jobItemList)
-        totalItemList.append([jobItemID, itemCountEx * clientBuyCount, isBindEx])
-    #允许价钱配置0,用来免费购买
+        totalItemList.append([itemIDEx, itemCountEx * clientBuyCount, isBindEx])
     if not totalItemList:
-        GameWorld.ErrLog("Store shop item error! shopType=%s,totalItemList=%s,itemPrice=%s" % (shopType, totalItemList, itemPrice))
+        GameWorld.ErrLog("Store shop item error! shopType=%s,shopID=%s" % (shopType, shopID), curPlayer.GetPlayerID())
+        return
+    mainItemID = totalItemList[0][0]
+    GameWorld.DebugLog("shopType=%s,shopID=%s,totalItemList=%s" % (shopType, shopID, totalItemList))
+    
+    # 检查是否解锁商品购买
+    if not CheckBuyItemUnlock(curPlayer, shopType, shopID, mainItemID, ipyData):
+        GameWorld.Log("Store shop item lock! shopID=%s,shopID=%s" % (shopType, shopID), curPlayer.GetPlayerID())
         return
     
-    mainItemID = 0
-    needPackSpaceDict = {}
-    for i, itemInfo in enumerate(totalItemList):
-        itemID = itemInfo[0]
-        itemCnt = itemInfo[1]
-        curItem = GameWorld.GetGameData().GetItemByTypeID(itemID)
-        if not curItem:
-            GameWorld.ErrLog("Store shop item error! shopType=%s,itemID=%s" % (shopType, itemID))
-            return
-        packType = ChConfig.GetItemPackType(curItem)
-        needSpace = ItemControler.GetItemNeedPackCount(packType, curItem, itemCnt)
-        needPackSpaceDict[packType] = needPackSpaceDict.get(packType, 0) + needSpace
-        
-        if i == 0:
-            mainItemID = itemID
-    
-    if not mainItemID:
-        return
-    
-    GameWorld.DebugLog("购买物品: shopType=%s,itemIndex=%s,clientBuyCount=%s,totalItemList=%s,mainItemID=%s,needPackSpaceDict=%s" 
-                       % (shopType, itemIndex, clientBuyCount, totalItemList, mainItemID, needPackSpaceDict), curPlayer.GetPlayerID())
-    mailKey = ipyData.GetMailKey()
-    isLackPack = False #是否背包不足
-    for packType, needSpace in needPackSpaceDict.items():
-        if needSpace > ItemCommon.GetItemPackSpace(curPlayer, packType, needSpace):
-            isLackPack = True
-            if mailKey:
-                break
-            else:
-                curPlayer.ShopResult(itemIndex, IPY_GameWorld.tsrNoPlace)
-                PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_676165", [packType])
-                return
-    sendMailKey = mailKey if isLackPack and mailKey else '' #背包不足且配置了mailKey的才发邮件
-        
-    # 购买限制条件扩展
-    if CheckBuyItemLimitEx(curPlayer, shopType, itemIndex, mainItemID, ipyData.GetLimitValue(), clientBuyCount):
-        GameWorld.Log("Store shop item buy limit! shopType=%s,itemIndex=%s,limitValue=%s" 
-                      % (shopType, itemIndex, ipyData.GetLimitValue()), curPlayer.GetPlayerID())
-        return
-    if not PlayerControl.HaveMoney(curPlayer, priceType, itemPrice):
-        curPlayer.ShopResult(itemIndex, IPY_GameWorld.tsrNoMoney)
-        return
-    
-    if serverLimitCnt > 0: #全服限购判断放到最后面,GameServer直接加次数
-        if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_StoreQueryState) == 1:
-            #已经在查询中, 不重复查询
-            GameWorld.DebugLog("全服购买次数已经在查询中, 不重复查询 itemIndex=%s" % itemIndex)
-            return
-        cmdStr = '%s' % ([itemIndex, serverLimitCnt, clientBuyCount, totalItemList, mainItemID, limitBuyCnt, sendMailKey])
-        GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0,
-                                        "GetStoreServerBuyCnt", cmdStr, len(cmdStr))
-        #设置状态查询中
-        curPlayer.SetDict(ChConfig.Def_PlayerKey_StoreQueryState, 1)
-        return
-    #-------------------------开始购买物品-----------------------------
-    DoBuyStoreItem(curPlayer, itemIndex, clientBuyCount, totalItemList, mainItemID, limitBuyCnt, sendMailKey, ipyData)
-    
-    return
-
-def DoBuyStoreItem(curPlayer, itemIndex, clientBuyCount, totalItemList, mainItemID, limitBuyCnt, sendMailKey, ipyData=None):
-    if not ipyData:
-        ipyData = IpyGameDataPY.GetIpyGameData("Store", itemIndex)
     priceType, itemPrice = ipyData.GetMoneyType(), ipyData.GetMoneyNum()
     itemPrice *= clientBuyCount
-    shopType = ipyData.GetShopType()
+    #if not PlayerControl.HaveMoney(curPlayer, priceType, itemPrice):
+    #    return
     
-    beforeMoney = PlayerControl.GetMoney(curPlayer, priceType)
     infoDict = {"TotalItemList":totalItemList, "ClientBuyCount":clientBuyCount, "ShopType":shopType,
-                "ShopItemIndex":itemIndex, ChConfig.Def_Cost_Reason_SonKey:mainItemID}
-    if not PlayerControl.PayMoney(curPlayer, priceType, itemPrice, ChConfig.Def_Cost_BuyStoreItem, infoDict, clientBuyCount):
-        GameWorld.ErrLog("购买商城物品实际扣除货币时失败: itemIndex=%s,clientBuyCount=%s,priceType=%s,itemPrice=%s" 
-                         % (itemIndex, clientBuyCount, priceType, itemPrice))
+                "ShopID":shopID, ChConfig.Def_Cost_Reason_SonKey:mainItemID}
+    if priceType and itemPrice and not PlayerControl.PayMoney(curPlayer, priceType, itemPrice, ChConfig.Def_Cost_BuyStoreItem, infoDict, clientBuyCount):
         return
-        
-    afterMoney = PlayerControl.GetMoney(curPlayer, priceType)
     
     # 今日购买次数+1
     if limitBuyCnt > 0:
-        dayBuyCntKey = ChConfig.Def_PDict_ShopItemDayBuyCnt % itemIndex
-        curDayBuyCnt = curPlayer.NomalDictGetProperty(dayBuyCntKey)
-        updDayBuyCnt = min(curDayBuyCnt + clientBuyCount, ChConfig.Def_UpperLimit_DWord)
-        PlayerControl.NomalDictSetProperty(curPlayer, dayBuyCntKey, updDayBuyCnt)
-        GameWorld.DebugLog("更新商城物品限购次数: itemIndex=%s,curDayBuyCnt=%s,clientBuyCount=%s,updDayBuyCnt=%s/%s" 
-                           % (itemIndex, curDayBuyCnt, clientBuyCount, updDayBuyCnt, limitBuyCnt), curPlayer.GetPlayerID())
-        SyncShopItemTodayBuyCount(curPlayer, [itemIndex])
+        updBuyCnt = min(curBuyCnt + clientBuyCount, ChConfig.Def_UpperLimit_DWord)
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ShopBuyCnt % shopID, updBuyCnt)
+        GameWorld.DebugLog("更新商城物品限购次数: shopID=%s,curBuyCnt=%s,clientBuyCount=%s,updBuyCnt=%s/%s" 
+                           % (shopID, curBuyCnt, clientBuyCount, updBuyCnt, limitBuyCnt))
+        SyncShopItemBuyCntInfo(curPlayer, [shopID])
         
-    dataDict = {"ShopType":shopType, "ShopItemIndex":itemIndex, "ClientBuyCount":clientBuyCount, 
-                "ItemPrice":itemPrice, "MoneyType":priceType, 
-                "BeforeMoney":beforeMoney, "AfterMoney":afterMoney}
-    isForceEvent = priceType not in [IPY_GameWorld.TYPE_Price_Silver_Money]
+    ItemControler.GivePlayerItemOrMail(curPlayer, totalItemList, event=["BuyItem", False, {}], notifyDataEx=shopID)
+    return
+
+def CheckBuyItemUnlock(curPlayer, shopType, shopID, mainItemID, ipyData):
+    ## 检查是否解锁商品购买
+    # @return: 是否已解锁购买
     
-    for itemID, itemCount, isBind in totalItemList:
-        curItemObj = ItemControler.GetOutPutItemObj(itemID, itemCount, False, curPlayer=curPlayer)
-        if not curItemObj:
-            continue
-        userData = curItemObj.GetUserData()
-        curItemObj.Clear()
-        if not sendMailKey:
-            if not ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isBind, event=[ChConfig.ItemGive_BuyItem, isForceEvent, dataDict]):
-                GameWorld.ErrLog("购买商城物品放入背包失败! itemID=%s, itemCount=%s" % (itemID, itemCount), curPlayer.GetPlayerID())
-                
-        if ipyData.GetNotifyMark() and itemID == mainItemID:
-            PlayerControl.WorldNotify(0, ipyData.GetNotifyMark(), [curPlayer.GetName(), mainItemID, userData])
-            
-        # 购买永久守护时删除限时守护
-        if itemID == 4101:
-            delGuardItem = ItemCommon.FindItemInPackByItemID(curPlayer, 4105, IPY_GameWorld.rptItem)
-            if delGuardItem:
-                ItemCommon.DelItem(curPlayer, delGuardItem, 1)
-                
-    if sendMailKey:
-        PlayerControl.SendMailByKey(sendMailKey, [curPlayer.GetID()], totalItemList, detail=dataDict)
-    else:
-        ItemControler.NotifyGiveAwardInfo(curPlayer, totalItemList, ChConfig.ItemGive_BuyItem, dataEx=shopType)
-    SyncShoppingResult(curPlayer, itemIndex, clientBuyCount)
-    return
-
-def GetShopJobItem(job, itemID, jobItemList):
-    ## 获取商城物品对应的职业物品, 职业从1开始
-    for jobItemIDList in jobItemList:
-        if type(jobItemIDList) not in [list, tuple]:
-            GameWorld.ErrLog("商城职业物品组格式错误!shopItemID=%s,jobItemList=%s" % (itemID, jobItemList))
-            return itemID
-        if itemID in jobItemIDList:
-            if job <= 0 or job > len(jobItemIDList):
-                GameWorld.ErrLog("商城职业物品配置错误,没有该职业对应物品ID!shopItemID=%s,job=%s" % (itemID, job))
-                return itemID
-            return jobItemIDList[job - 1]
-    return itemID
-
-def SyncShoppingResult(curPlayer, itemIndex, itemCnt):
-    #通知购买结果
-    resultInfo = ChPyNetSendPack.tagMCShoppingResult()
-    resultInfo.ItemIndex = itemIndex
-    resultInfo.ItemCnt = itemCnt
-    NetPackCommon.SendFakePack(curPlayer, resultInfo)
-    return
-
-## 商店购买物品限制条件扩展
-#  @param curPlayer 玩家实例
-#  @return 
-def CheckBuyItemLimitEx(curPlayer, shopNPCID, itemIndex, curItemID, limitValue, clientBuyCount):
-    if shopNPCID == 7: #符印商店
-        return not PlayerRune.GetIsOpenByRuneID(curPlayer, curItemID)
-    if shopNPCID in [8, 9, 10]: #仙盟商店
-        if curPlayer.GetFamilyID() == 0:
-            #无家族
-            return True
+    unlockType = ipyData.GetUnlockType()
+    unlockValue = ipyData.GetUnlockValue()
+    
+    # 公会等级解锁
+    if unlockType == UnlockType_FamilyLV:
+        if not curPlayer.GetFamilyID():
+            GameWorld.DebugLog("无公会无法购买! shopID=%s" % shopID)
+            return
         curFamilyLV = curPlayer.GetFamilyLV()
         if curFamilyLV <= 0:
             curFamilyLV = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyLV)
-        return curFamilyLV < limitValue
-    if shopNPCID in [15]: # 开服特惠商店
-        #playerCreateRoleDays = GameWorld.GetCreateRoleDays(curPlayer)
-        openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)+1
-        return openServerDay != limitValue
-    
-    if shopNPCID == 16:#神秘限购
-        startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShopItemStartTime % itemIndex)
-        curTime = int(time.time())
-        return not startTime or curTime - startTime >= limitValue
+        if curFamilyLV < unlockValue:
+            GameWorld.DebugLog("公会等级不足无法购买! shopID=%s,curFamilyLV=%s < %s" % (shopID, curFamilyLV, unlockValue))
+            return
         
-#    
-#    limitPlusDict = {shopItem.GetLimitPlusType1():shopItem.GetLimitPlusValue1(),
-#                     shopItem.GetLimitPlusType2():shopItem.GetLimitPlusValue2(),
-#                     shopItem.GetLimitPlusType3():shopItem.GetLimitPlusValue3(),
-#                     }
-#    
-#    for limitType, limitValue in limitPlusDict.items():
-#        if limitType <= 0:
-#            continue
-#        
-#        # 优先判断NPC独有的
-#        callFunc = GameWorld.GetExecFunc(EventSrc, "FunctionNPCShopBuyCheck.CheckByNPC_%s_%s" 
-#                                         % (shopNPCID, limitType))
-#        
-#        if callFunc:
-#            return callFunc(curPlayer, shopItem.GetItemID(), limitValue)
-#        
-#        # 公共限制条件判断
-#        callFunc = GameWorld.GetExecFunc(EventSrc, "FunctionNPCShopBuyCheck.CheckPublic_%s" % limitType)
-#        
-#        if callFunc:
-#            return callFunc(curPlayer, shopItem.GetItemID(), limitValue)
-    
-    # 默认不限制
-    return False
-
-def OSSaleOpenMail(curPlayer):
-    #开服特惠开启邮件
-    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_OSSail):
-        return
-    openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)+1
-    if openServerDay not in IpyGameDataPY.GetFuncEvalCfg('OSSaleOpenMail'):
-        return
-    addItemList = IpyGameDataPY.GetFuncEvalCfg('OSSaleOpenMail', 2)
-    PlayerControl.SendMailByKey('SellMail1', [curPlayer.GetID()], addItemList)
-    return
-
-
-## 商店npcid
-#  @param curPlayer 玩家实例
-#  @return 
-def GetCurTradeTagNPC(curPlayer):
-    curActionNPCID = -1
-
-    # 当前商店的npcid
-    tradeTagNPC = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_TradeTagNPC)
-    # 远程商店
-    if not tradeTagNPC:
-        return GetDirectNpcID()
-
-    # 商店npcid与当前对话npc对应
-    elif CheckTradeTagNPC(curPlayer, tradeTagNPC):
-        return tradeTagNPC
-    
-    else:
-        GameWorld.ErrLog("GetCurStoreItemList:trade tag NPC not match:%s"%tradeTagNPC,
-                          curPlayer.GetPlayerID())
-           
-    return curActionNPCID
-
-## 判断记录的商店npcid是否正确
-#  @param curPlayer 玩家实例
-#  @param tradeTagNPC 
-#  @return 
-def CheckTradeTagNPC(curPlayer, tradeTagNPC):
-    
-    curActionObj = curPlayer.GetActionObj()
-    if not curActionObj:
-        return False
-    
-    if curActionObj.GetGameObjType() != IPY_GameWorld.gotNPC:
-        return False
-    
-    curActionNPC = GameWorld.GetNPCManager().GetNPCByIndex(curActionObj.GetIndex())
-    if curActionNPC.GetNPCID() != tradeTagNPC:
-        return False
-
+    # 随机刷新解锁
+    elif unlockType == UnlockType_RandRefresh:
+        if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_ShopRandUnlock, shopID):
+            GameWorld.DebugLog("该商品没有随机解锁无法购买! shopID=%s" % shopID)
+            return
+        
     return True
 
-#--------------------出售物品
-##出售物品
-# @param curPlayer 玩家实例
-# @param tick 时间戳
-# @return 返回值真, 逻辑运行成功
-# @remarks 出售物品
-def SellItem(curPlayer, tick):
-    #1检查事件发生的顺序
-    sendData = IPY_GameWorld.IPY_CPlayerSellItem()
-    packType = sendData.GetPackType()
-    itemIndex = sendData.GetItemIndex()
-    shopType = ChConfig.Def_ShopType_NpcShop
-    
-    return SellPackItem(curPlayer, packType, [itemIndex], shopType)
-
-#// A3 11 批量出售物品 #tagCMSellItem
+#// A2 32 刷新商店 #tagCSRefreshShop
 #
-#struct    tagCMSellItem
+#struct    tagCSRefreshShop
 #{
 #    tagHead        Head;
-#    BYTE        PackType;        //背包类型
-#    BYTE        Count;            //索引数量
-#    BYTE        ItemIndex[Count];        //物品索引
+#    WORD        ShopType;
 #};
-def OnSellManyItem(index, clientData, tick):
+def OnRefreshShop(index, clientData, tick):
     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
-    packType = clientData.PackType
-    ItemIndexList = clientData.ItemIndex
-    if not ItemIndexList:
-        return
-    shopType = ChConfig.Def_ShopType_NpcShop
-    isOk = SellPackItem(curPlayer, packType, ItemIndexList, shopType)
-    if isOk:
-        curPlayer.Sync_MakeItemAnswer(ShareDefine.Def_mitKeySell, 1)
-        
-    return 
-#---------------------------------------------------------------------
-##出售指定背包物品
-# @param curPlayer 玩家实例
-# @param packType 背包类型
-# @param itemIndex 物品索引
-# @param shopType 商店类型,1NPC商店,2远程贩售
-# @return 返回值真, 检查通过
-# @remarks 出售指定背包物品
-def SellPackItem(curPlayer, packType, itemIndexList, shopType):
-    backPack = curPlayer.GetItemManager().GetPack(packType)
-    if backPack == None:
-        return False
+    shopType = clientData.ShopType
+    DoRandRefreshShopItem(curPlayer, shopType)
+    return
+
+def DoRandRefreshShopItem(curPlayer, shopType, randCnt=0, sysRefresh=False):
+    ## 随机刷新商店物品,ID不重复
+    # @param randCnt: 指定要随机解锁的个数
     
-    totalSellPriceDict = {}
-    hasSellOK = False
-    notForceRecordEquipTypeList = range(ChConfig.Def_ItemType_retWeapon, ChConfig.Def_ItemType_retNeck)
-    for itemIndex in itemIndexList:
-        curItem = backPack.GetAt(itemIndex)
-        
-        if not __CheckItemSell(curPlayer, curItem):
+    ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition("Store", {"ShopType":shopType}, True, True)
+    if not ipyDataList:
+        return
+    
+    shopIDWeightDict = {}
+    randWeightList = []
+    for ipyData in ipyDataList:
+        if ipyData.GetUnlockType() != UnlockType_RandRefresh:
             continue
-        hasSellOK = True
-        #当前物品数量
-        curItemCount = curItem.GetCount()
-        #itemName = curItem.GetName()
-        #获得单个物品销售价格
-        curItemSellPrice, curItemSellType = __GetItemSellPrice(curPlayer, curItem)
-        #获得整组销售价格
-        curAllItemSellPrice = int(curItemSellPrice) * curItemCount
-        totalSellPriceDict[curItemSellType] = totalSellPriceDict.get(curItemSellType, 0) + curAllItemSellPrice
-        #GameWorld.Log('curItemSellPrice=%s,curAllItemSellPrice=%s,curItemCount=%s'%(curItemSellPrice,curAllItemSellPrice,curItemCount))
+        shopID = ipyData.GetID()
+        randWeight = ipyData.GetUnlockValue()
+        randWeightList.append([randWeight, shopID])
+        shopIDWeightDict[shopID] = randWeight
         
-        #===========================================================================================
-        # #因日记记录过大, 添加记录筛选条件
-        # if ItemControler.ItemNeedRecord(curItem):
-        #    #详细记录装备信息
-        #    DataRecordPack.DR_GetMoneyBySellPackItem(curPlayer, curItemSellType, curAllItemSellPrice)
-        #===========================================================================================
+    if not randWeightList:
+        GameWorld.ErrLog("该商店没有可随机刷新解锁的商品! shopType=%s" % shopType)
+        return
+    
+    refreshCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShopRefreshCnt % shopType)
+    moneyType, moneyValue = 0, 0
+    if shopType == ShopType_HeroSoul:
+        randCnt = IpyGameDataPY.GetFuncCfg("StoreHeroSoul", 1)
+        freeCnt = IpyGameDataPY.GetFuncCfg("StoreHeroSoul", 3)
+        if not sysRefresh and refreshCnt >= freeCnt:
+            moneyType, moneyValue = IpyGameDataPY.GetFuncEvalCfg("StoreHeroSoul", 2)
+            
+    GameWorld.DebugLog("随机刷新商店商品: shopType=%s,randCnt=%s/%s,refreshCnt=%s,moneyType=%s,moneyValue=%s,sysRefresh=%s" 
+                       % (shopType, randCnt, len(randWeightList), refreshCnt, moneyType, moneyValue, sysRefresh))
+    
+    if randCnt <= 0:
+        return
+    
+    if moneyType and moneyValue and not PlayerControl.PayMoney(curPlayer, moneyType, moneyValue, "RefreshShopItem"):
+        return
+    
+    doCnt = randCnt * 10
+    randShopIDList = []
+    syncBuyCntIDList = []
+    while randWeightList and len(randShopIDList) < randCnt and doCnt > 0:
+        doCnt -= 1
+        shopID = GameWorld.GetResultByWeightList(randWeightList)
+        if not shopID:
+            continue
+        randShopIDList.append(shopID)
+        randWeight = shopIDWeightDict.get(shopID, 0)
+        if [randWeight, shopID] in randWeightList:
+            randWeightList.remove([randWeight, shopID])
+            
+        GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_ShopRandUnlock, shopID, 1)
+        if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShopBuyCnt % shopID):
+            syncBuyCntIDList.append(shopID)
+            
+    GameWorld.DebugLog("随机刷新商品数: %s,%s" % (len(randShopIDList), randShopIDList))
+    GameWorld.DebugLog("剩余锁定商品数: %s,%s" % (len(randWeightList), randWeightList))
+    
+    # 其他的设置未解锁
+    for _, shopID in randWeightList:
+        GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_ShopRandUnlock, shopID, 0)
+    if not sysRefresh:
+        refreshCnt += 1
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ShopRefreshCnt % shopType, refreshCnt)
+        GameWorld.DebugLog("更新刷新商店次数=%s" % refreshCnt)
         
-        isForceDR = curItem.GetType() not in notForceRecordEquipTypeList and not ItemControler.ItemNotNeedRecord(curItem)
-        #物品消失
-        ItemCommon.DelItem(curPlayer, curItem, curItemCount, False, ChConfig.ItemDel_SellPackItem, isForceDR=isForceDR)
-        #PutItemInBuyBackPack(curPlayer, curItem)
-    if not hasSellOK:
-        return False
-    for priceType, priceMoney in totalSellPriceDict.items():
-        #玩家钱增加
-        addDataDict = {}
-        PlayerControl.GiveMoney(curPlayer, priceType, priceMoney, ChConfig.Def_GiveMoney_SellPackItem, addDataDict, False)
-        PlayerControl.NotifyCode(curPlayer, "GetMoney01", [priceType, priceMoney])
-    return True
-
-
-## 售卖物品回购背包的处理, 放入空位不叠加(本项目没有回购,先屏蔽)
-#  @param None
-#  @return None
-def PutItemInBuyBackPack(curPlayer, curItem):
+    if syncBuyCntIDList:
+        SyncShopItemBuyCntInfo(curPlayer, syncBuyCntIDList)
+    SyncShopRefreshItemInfo(curPlayer, shopType, randShopIDList)
     return
-    itemIndexs = str(curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_DelPackIndex))
-    backPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptRecycle)
-    emptyIndex = ItemCommon.GetEmptyIndexInPack(curPlayer, IPY_GameWorld.rptRecycle)
-    if emptyIndex == -1:
-        #清除旧物品
-        emptyIndex = int(itemIndexs[0]) - 1
-        item = backPack.GetAt(emptyIndex)
-        item.Clear()
-        itemIndexs = itemIndexs[1:]
+
+def SyncShopRefreshItemInfo(curPlayer, shopType, syncIDList=[]):
+    ##同步刷新解锁的商品信息
+    if not syncIDList:
+        syncIDList = []
+        ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition("Store", {"ShopType":shopType}, True, True)
+        if not ipyDataList:
+            return
+        for ipyData in ipyDataList:
+            shopID = ipyData.GetID()
+            if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_ShopRandUnlock, shopID):
+                continue
+            syncIDList.append(shopID)
+    if not syncIDList:
+        return
+    clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCShopRefreshItemInfo)
+    clientPack.ShopType = shopType
+    clientPack.RefreshCnt = min(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShopRefreshCnt % shopType), 250)
+    clientPack.ShopIDList = syncIDList
+    clientPack.Count = len(clientPack.ShopIDList)
+    NetPackCommon.SendFakePack(curPlayer, clientPack)
+    return
+
+def SyncShopItemBuyCntInfo(curPlayer, syncIDList=[]):
+    ##同步商品购买次数
+    
+    objPool = ObjPool.GetPoolMgr()
+    buyCntList = []
+    if syncIDList:
+        for shopID in syncIDList:
+            buyInfo = objPool.acquire(ChPyNetSendPack.tagSCShopItemBuyCnt)
+            buyInfo.ShopID = shopID
+            buyInfo.BuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShopBuyCnt % shopID)
+            buyCntList.append(buyInfo)
     else:
-        # 清空空格位防范, 防止异常情况物品消失而没有重置标记位导致数值越界
-        itemIndexs = itemIndexs.replace(str(emptyIndex + 1), '')
-        item = backPack.GetAt(emptyIndex)
-        
-    itemIndexs = "%s%s"%(itemIndexs, emptyIndex + 1)
+        ipyDataMgr = IpyGameDataPY.IPY_Data()
+        for i in xrange(ipyDataMgr.GetStoreCount()):
+            shopItem = ipyDataMgr.GetStoreByIndex(i)
+            if not shopItem.GetLimitCnt():
+                continue
+            shopID = shopItem.GetID()
+            buyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShopBuyCnt % shopID)
+            if buyCnt <= 0:
+                continue
+            buyInfo = objPool.acquire(ChPyNetSendPack.tagSCShopItemBuyCnt)
+            buyInfo.ShopID = shopID
+            buyInfo.BuyCnt = buyCnt
+            buyCntList.append(buyInfo)
+            
+    if not buyCntList:
+        return
     
-    #放入新物品
-    item.PutIn(curItem)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_DelPackIndex, int(itemIndexs))
+    clientPack = objPool.acquire(ChPyNetSendPack.tagSCShopItemBuyCntInfo)
+    clientPack.BuyCntList = buyCntList
+    clientPack.Count = len(clientPack.BuyCntList)
+    NetPackCommon.SendFakePack(curPlayer, clientPack)
     return
-
-
-##检查物品是否可以出售
-# @param curPlayer 玩家实例
-# @param curItem 物品实例
-# @return 返回值真, 检查通过
-# @remarks 检查物品是否可以出售
-def __CheckItemSell(curPlayer, curItem) :
-    if not ItemCommon.CheckItemCanUse(curItem):# or ItemControler.GetIsAuctionItem(curItem):
-        PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_644055")
-        return
-    
-    #if ItemControler.IsEventItem(curItem):
-    #    PlayerControl.NotifyCode(curPlayer, "itemuse_chenxin_31379")
-    #    return
-    
-    if curItem.GetCanSell() == 0:
-        #不能出售的物品,无法出售
-        PlayerControl.NotifyCode(curPlayer, "GeRen_lhs_272921")
-        return
-    
-    #获得单个物品销售价格
-    itemPrice , priceType = __GetItemSellPrice(curPlayer, curItem)
-    itemPrice = int(itemPrice) * curItem.GetCount()
-    
-    if not itemPrice or not priceType:
-        PlayerControl.NotifyCode(curPlayer, "GeRen_lhs_272921")
-        return
-    
-    if not PlayerControl.CanGiveMoney(curPlayer, priceType, itemPrice):
-        # 对不起,您携带的金钱已经达上限,操作无效
-        #PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_609765")
-        return
-        
-    return True
-
-#---------------------------------------------------------------------
-##获得物品的出售价格
-# @param curPlayer 玩家实例
-# @param curItem 物品实例
-# @return 返回值, 物品的出售价格
-# @remarks 获得物品的出售价格
-def __GetItemSellPrice(curPlayer, curItem):
-    #为配合客户端,进行以下逻辑(向上取整)
-    #2012-03-26 jiang 耐久这里不进行除ChConfig.Def_EndureRepairParameter的转换该有公式自己计算
-    #curItemEndure = curItem.GetCurDurg()
-    #curItemMaxEndure = curItem.GetMaxEndure()
-    
-    # 修改此函数请同时修改 脱机挂出售
-    #当前物品价格 原价出售
-    priceType = curItem.GetGoldPaperPrice()
-    if not priceType:
-        priceType = IPY_GameWorld.TYPE_Price_Silver_Money
-    curItemPrice = curItem.GetSilverPrice()
-    return curItemPrice, priceType
-
-##检查玩家可否开始NPC事件
-# @param curPlayer 玩家实例
-# @return 返回值真, 检查通过
-# @remarks 检查玩家可否开始NPC事件
-def CheckPlayerCanStateEvent(curPlayer):
-    if curPlayer.GetPlayerAction() not in ChConfig.Def_Player_DoEvent_State :
-        #CannotDoing 对不起,您当前状态无法进行此操作,操作无效
-        PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_740826")
-        return False
-    
-    return True
-
-#---------------------------------------------------------------------
-##检查物品是否可以放入合成背包.
-# @param curItem 物品实例
-# @return 布尔值
-# @remarks 检查物品是否可以放入合成背包
-def __CheckItemCanPutInComposePack(curItem):
-    return curItem.GetType() in ChConfig.Def_Compose_Can_Put_List
-
-#---------------------------------------------------------------------
-##通用背包放入操作
-# @param curPlayer 玩家实例
-# @param srcBackpack 起点背包
-# @param desBackPack 目标背包
-# @param srcIndex 起点索引
-# @param destIndex 目标索引
-# @param putItemCount 放入数量
-# @param tick 时间戳
-# @return 返回值无意义
-# @remarks 通用背包放入操作
-def BackpackOperate(curPlayer, srcBackpack, desBackPack, srcIndex, destIndex, putItemCount, tick):
-    #获得需要操作的物品的物品
-    scrItem = __GetBackPackOperateItem(curPlayer, srcBackpack, desBackPack, srcIndex)
-    
-    if scrItem == None:
-        return
-
-    itemControl = ItemControler.PlayerItemControler(curPlayer)
-    
-    if not itemControl.CanPutInItem(desBackPack, scrItem.GetItemTypeID(), putItemCount, scrItem.GetIsBind()):
-        PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_676165", [desBackPack])   
-        return
-    
-    #拖拽物品
-    ItemControler.DragItem(curPlayer, srcBackpack, srcIndex, desBackPack, destIndex, putItemCount)
-    return
-#---------------------------------------------------------------------
-##通用背包操作检查
-# @param scrItem 放入物品
-# @param desBackPack 目标背包
-# @return 布尔值
-# @remarks 通用背包操作检查
-def __CheckBackPackOperate(scrItem, desBackPack):
-    #特殊检查
-    if desBackPack in ChConfig.Def_ComposePack_List:
-        if not __CheckItemCanPutInComposePack(scrItem):
-            GameWorld.ErrLog('BackpackOperate ItemErr = %s, ItemType = %s'%(scrItem.GetItemTypeID(), scrItem.GetType()))
-            return False
-
-    return True
-#---------------------------------------------------------------------
-##获得背包当前操作的物品
-# @param curPlayer 玩家实例
-# @param srcBackpack 起始背包
-# @param desBackPack 目的背包
-# @param srcIndex 起始物品索引
-# @return 操作物品实例或者None
-# @remarks 获得背包当前操作的物品
-def __GetBackPackOperateItem(curPlayer, srcBackpack, desBackPack, srcIndex):
-    #操作背包检查
-    if srcBackpack not in ChConfig.Def_BackpackOperate_List or desBackPack not in ChConfig.Def_BackpackOperate_List:
-        GameWorld.ErrLog('PackItemExchange packErr, srcBackpack = %s, \
-            desBackPack = %s'%(srcBackpack, desBackPack), curPlayer.GetID())
-        return
-    
-    #获得放入的物品
-    scrItem = curPlayer.GetItemManager().GetPack(srcBackpack).GetAt(srcIndex)
-    
-    #---物品检查---
-    if not ItemCommon.CheckItemCanUse(scrItem):
-        return
-    
-    #特殊检查
-    if not __CheckBackPackOperate(scrItem, desBackPack):
-        return
-    
-    return scrItem
-#---------------------------------------------------------------------
-##通用背包交换操作
-# @param curPlayer 玩家实例
-# @param srcBackpack 起点背包
-# @param destBackPack 目标背包
-# @param srcIndex 起点索引
-# @param destIndex 目标索引
-# @param tick 时间戳
-# @return 返回值无意义
-# @remarks 通用背包交换操作
-def PackItemExchange(curPlayer, srcBackpack, destBackPack, srcIndex, destIndex, tick):
-    #获得需要操作的物品的物品
-    scrItem = __GetBackPackOperateItem(curPlayer, srcBackpack, destBackPack, srcIndex)
-    
-    if scrItem == None:
-        return
-    
-    #---验证目标背包格子--
-    destItem = curPlayer.GetItemManager().GetPack(destBackPack).GetAt(destIndex)
-    #目标格子只验证锁定, 可以允许空位
-    if destItem == None or destItem.GetIsLocked():
-        return
-    
-    ItemCommon.DoLogicSwitchItem(curPlayer, scrItem, destItem, destBackPack)
-    return
-
-
-## 获得金钱付费字典
-#  @param moneyList 金钱列表 [金钱类型, 金钱数量,。。。]
-#  @param payMoneyDict 金钱累加字典
-#  @return 金钱累加字典
-#  @remarks 获得金钱付费字典
-def GetPayMoneyDict(moneyList, payMoneyDict={}):
-    length = len(moneyList)
-    
-    for index in range(0, length, 2):
-        moneyType = moneyList[index]
-        money = moneyList[index + 1]
-        
-        payMoney = payMoneyDict.get(moneyType)
-        if payMoney == None:
-            payMoneyDict[moneyType] = money
-        else:
-            payMoneyDict[moneyType] += money
-    
-    return payMoneyDict
-
-
-## 检查金钱
-#  @param curPlayer 玩家
-#  @param payMoneyDict 付钱字典
-#  @return BOOL是否足够
-#  @remarks 检查金钱
-def CheckPayMoney(curPlayer, payMoneyDict):
-    
-    for moneyType, money in payMoneyDict.items():
-        
-        #验证手续费
-        if not PlayerControl.HaveMoney(curPlayer, moneyType, money):
-            return False
-    
-    return True
-
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearStoreBuyCount.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearStoreBuyCount.py
deleted file mode 100644
index 6a983d9..0000000
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearStoreBuyCount.py
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/usr/bin/python
-# -*- coding: GBK -*-
-#-------------------------------------------------------------------------------
-#
-##@package GM.Commands.ClearStoreBuyCount
-#
-# @todo:清除商店物品限购次数
-# @author hxp
-# @date 2018-05-09
-# @version 1.0
-#
-# 详细描述: 清除商店物品限购次数
-#
-#-------------------------------------------------------------------------------
-#"""Version = 2018-05-09 15:00"""
-#-------------------------------------------------------------------------------
-
-import ChConfig
-import IpyGameDataPY
-import FunctionNPCCommon
-import PlayerControl
-import GameWorld
-
-
-#---------------------------------------------------------------------
-#逻辑实现
-## GM命令执行入口
-#  @param curPlayer 当前玩家
-#  @param list 参数列表 [npcID]
-#  @return None
-#  @remarks 函数详细说明.
-def OnExec(curPlayer, paramList):
-    syncIndexList = []
-    ipyDataMgr = IpyGameDataPY.IPY_Data()
-    for i in xrange(ipyDataMgr.GetStoreCount()):
-        shopItem = ipyDataMgr.GetStoreByIndex(i)
-        if not shopItem.GetLimitCnt():
-            continue
-        dayBuyCntKey = ChConfig.Def_PDict_ShopItemDayBuyCnt % shopItem.GetID()
-        curDayBuyCnt = curPlayer.NomalDictGetProperty(dayBuyCntKey)
-        if curDayBuyCnt <= 0:
-            continue
-        PlayerControl.NomalDictSetProperty(curPlayer, dayBuyCntKey, 0)
-        syncIndexList.append(shopItem.GetID())
-    if syncIndexList:
-        FunctionNPCCommon.SyncShopItemTodayBuyCount(curPlayer, syncIndexList, True)
-    GameWorld.DebugAnswer(curPlayer, "重置成功:%s" % syncIndexList)
-    return
-
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetMoney.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetMoney.py
index d26c04a..a701ea2 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetMoney.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetMoney.py
@@ -24,6 +24,7 @@
 import ChConfig
 import ShareDefine
 import GameWorld
+import PrintMoney
 
 moneyNameDict = ShareDefine.MoneyNameDict
 
@@ -50,11 +51,7 @@
         GameWorld.DebugAnswer(curPlayer, Lang.GBText("参数不正确"))
         GameWorld.DebugAnswer(curPlayer, "设置货币: SetMoney 货币类型 数值")
         GameWorld.DebugAnswer(curPlayer, "显示货币: SetMoney 货币类型")
-        helpStr = ""
-        moneyTypeList = moneyNameDict.keys()
-        for moneyType in moneyTypeList:
-            helpStr += "%s-%s;" % (moneyType, moneyNameDict[moneyType])
-        GameWorld.DebugAnswer(curPlayer, helpStr)
+        PrintMoney.OnExec(curPlayer, [])
         return
     #钱币类型
     moneyType = List[0]
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Shop.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Shop.py
new file mode 100644
index 0000000..1e040b1
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Shop.py
@@ -0,0 +1,72 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package GM.Commands.Shop
+#
+# @todo:商城 /坊市
+# @author hxp
+# @date 2025-10-21
+# @version 1.0
+#
+# 详细描述: 商城 /坊市
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2025-10-21 19:00"""
+#-------------------------------------------------------------------------------
+
+import ChConfig
+import IpyGameDataPY
+import FunctionNPCCommon
+import PlayerControl
+import GameWorld
+
+def OnExec(curPlayer, paramList):
+    if not paramList:
+        GameWorld.DebugAnswer(curPlayer, "重置商店: Shop 0")
+        GameWorld.DebugAnswer(curPlayer, "设置购买: Shop s 商品ID 已购次数")
+        return
+    
+    value = paramList[0]
+    if value == 0:
+        syncRefreshTypeList = []
+        syncIDList = []
+        ipyDataMgr = IpyGameDataPY.IPY_Data()
+        for i in xrange(ipyDataMgr.GetStoreCount()):
+            shopItem = ipyDataMgr.GetStoreByIndex(i)
+            shopType = shopItem.GetShopType()
+            if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShopRefreshCnt % shopType):
+                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ShopRefreshCnt % shopType, 0)
+                syncRefreshTypeList.append(shopType)
+            if not shopItem.GetLimitCnt():
+                continue
+            shopID = shopItem.GetID()
+            curBuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShopBuyCnt % shopID)
+            if curBuyCnt <= 0:
+                continue
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ShopBuyCnt % shopID, 0)
+            syncIDList.append(shopID)
+        if syncIDList:
+            FunctionNPCCommon.SyncShopItemBuyCntInfo(curPlayer, syncIDList)
+        for shopType in syncRefreshTypeList:
+            FunctionNPCCommon.SyncShopRefreshItemInfo(curPlayer, shopType)
+        GameWorld.DebugAnswer(curPlayer, "重置成功:%s" % syncIDList)
+        return
+    
+    # 设置限购
+    if value == "s":
+        shopID = paramList[1] if len(paramList) > 1 else 0
+        buyCnt = paramList[2] if len(paramList) > 2 else 0
+        ipyData = IpyGameDataPY.GetIpyGameData("Store", shopID)
+        if not ipyData:
+            GameWorld.DebugAnswer(curPlayer, "不存在该商品:%s" % shopID)
+            return
+        if not ipyData.GetLimitCnt():
+            GameWorld.DebugAnswer(curPlayer, "该商品没有限购:%s" % shopID)
+            return
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ShopBuyCnt % shopID, buyCnt)
+        FunctionNPCCommon.SyncShopItemBuyCntInfo(curPlayer, [shopID])
+        GameWorld.DebugAnswer(curPlayer, "商品ID(%s)限购:%s" % (shopID, buyCnt))
+        
+    return
+
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index b7f7580..84b5b01 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -1154,25 +1154,16 @@
                 "Store":(
                         ("DWORD", "ID", 1),
                         ("DWORD", "ShopType", 0),
-                        ("BYTE", "OperationActionShop", 0),
                         ("DWORD", "ItemID", 0),
                         ("WORD", "ItemCnt", 0),
-                        ("BYTE", "IsBind", 0),
                         ("list", "ItemListEx", 0),
-                        ("DWORD", "MainItemID", 0),
-                        ("list", "JobItem", 0),
-                        ("BYTE", "RefreshLimit", 0),
-                        ("BYTE", "RefreshType", 0),
-                        ("list", "LimitVIPLV", 0),
-                        ("DWORD", "LimitLV", 0),
-                        ("list", "LimitCnt", 0),
-                        ("DWORD", "ServerLimitCnt", 0),
+                        ("BYTE", "ResetType", 0),
+                        ("DWORD", "LimitCnt", 0),
                         ("BYTE", "MoneyType", 0),
                         ("DWORD", "MoneyNum", 0),
                         ("DWORD", "MoneyOriginal", 0),
-                        ("DWORD", "LimitValue", 0),
-                        ("char", "NotifyMark", 0),
-                        ("char", "MailKey", 0),
+                        ("BYTE", "UnlockType", 0),
+                        ("DWORD", "UnlockValue", 0),
                         ),
 
                 "ActSpringSale":(
@@ -2212,11 +2203,6 @@
                         ("WORD", "OrderB", 0),
                         ("float", "CTGAtleast", 0),
                         ("list", "AwardItemList", 0),
-                        ),
-
-                "MysteryShop":(
-                        ("list", "LVRange", 0),
-                        ("DWORD", "GoodsID", 0),
                         ),
 
                 "EquipPlaceIndexMap":(
@@ -4090,25 +4076,16 @@
         
     def GetID(self): return self.attrTuple[0] # ID DWORD
     def GetShopType(self): return self.attrTuple[1] # 商店类型 DWORD
-    def GetOperationActionShop(self): return self.attrTuple[2] # 是否运营活动商店 BYTE
-    def GetItemID(self): return self.attrTuple[3] # 物品ID DWORD
-    def GetItemCnt(self): return self.attrTuple[4] # 物品数量 WORD
-    def GetIsBind(self): return self.attrTuple[5] # 是否绑定 BYTE
-    def GetItemListEx(self): return self.attrTuple[6] # 扩展物品列表[[物品ID,个数,是否绑定],...] list
-    def GetMainItemID(self): return self.attrTuple[7] # 标的物品ID DWORD
-    def GetJobItem(self): return self.attrTuple[8] # 职业替换物品 list
-    def GetRefreshLimit(self): return self.attrTuple[9] # 是否限制刷新限购次数,即是否永久限购,包含活动也不重置 BYTE
-    def GetRefreshType(self): return self.attrTuple[10] # 刷新类型 0-不重置,1-onWeek0点,2-onWeek5点,3-OnDay0点,4-OnDay5点 BYTE
-    def GetLimitVIPLV(self): return self.attrTuple[11] # VIP限制 list
-    def GetLimitLV(self): return self.attrTuple[12] # 等级限制 DWORD
-    def GetLimitCnt(self): return self.attrTuple[13] # 个人限制数量 list
-    def GetServerLimitCnt(self): return self.attrTuple[14] # 全服限制数量 DWORD
-    def GetMoneyType(self): return self.attrTuple[15] # 金钱类型 BYTE
-    def GetMoneyNum(self): return self.attrTuple[16] # 金钱数量 DWORD
-    def GetMoneyOriginal(self): return self.attrTuple[17] # 原价 DWORD
-    def GetLimitValue(self): return self.attrTuple[18] # 限制条件 DWORD
-    def GetNotifyMark(self): return self.attrTuple[19] # 广播提示 char
-    def GetMailKey(self): return self.attrTuple[20] # 背包不足时邮件KEY char
+    def GetItemID(self): return self.attrTuple[2] # 物品ID DWORD
+    def GetItemCnt(self): return self.attrTuple[3] # 物品数量 WORD
+    def GetItemListEx(self): return self.attrTuple[4] # 扩展物品列表[[物品ID,个数,是否绑定],...] list
+    def GetResetType(self): return self.attrTuple[5] # 重置类型 BYTE
+    def GetLimitCnt(self): return self.attrTuple[6] # 个人限制数量 DWORD
+    def GetMoneyType(self): return self.attrTuple[7] # 金钱类型 BYTE
+    def GetMoneyNum(self): return self.attrTuple[8] # 金钱数量 DWORD
+    def GetMoneyOriginal(self): return self.attrTuple[9] # 原价 DWORD
+    def GetUnlockType(self): return self.attrTuple[10] # 解锁类型 BYTE
+    def GetUnlockValue(self): return self.attrTuple[11] # 解锁所需值 DWORD
 
 # 限时特惠表
 class IPY_ActSpringSale():
@@ -5709,16 +5686,6 @@
     def GetCTGAtleast(self): return self.attrTuple[3] # 至少充值RMB float
     def GetAwardItemList(self): return self.attrTuple[4] # 奖励物品列表[[物品ID,个数,是否拍品], ...] list
 
-# 神秘商店表
-class IPY_MysteryShop():
-    
-    def __init__(self):
-        self.attrTuple = None
-        return
-        
-    def GetLVRange(self): return self.attrTuple[0] # 等级范围 list
-    def GetGoodsID(self): return self.attrTuple[1] # 商城表ID DWORD
-
 # 装备位背包索引映射表
 class IPY_EquipPlaceIndexMap():
     
@@ -6387,7 +6354,6 @@
         self.__LoadFileData("LuckyTreasureTemplate", onlyCheck)
         self.__LoadFileData("CrossActCTGBillboardDabiao", onlyCheck)
         self.__LoadFileData("CrossActCTGBillboardOrder", onlyCheck)
-        self.__LoadFileData("MysteryShop", onlyCheck)
         self.__LoadFileData("EquipPlaceIndexMap", onlyCheck)
         self.__LoadFileData("EquipShenAttr", onlyCheck)
         self.__LoadFileData("EquipShenEvolve", onlyCheck)
@@ -8135,13 +8101,6 @@
     def GetCrossActCTGBillboardOrderByIndex(self, index):
         self.CheckLoadData("CrossActCTGBillboardOrder")
         return self.ipyCrossActCTGBillboardOrderCache[index]
-
-    def GetMysteryShopCount(self):
-        self.CheckLoadData("MysteryShop")
-        return self.ipyMysteryShopLen
-    def GetMysteryShopByIndex(self, index):
-        self.CheckLoadData("MysteryShop")
-        return self.ipyMysteryShopCache[index]
 
     def GetEquipPlaceIndexMapCount(self):
         self.CheckLoadData("EquipPlaceIndexMap")
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
index 39dad57..144adf6 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -847,9 +847,6 @@
     # 重置首充双倍
     PlayerCoin.DoResetCTGCount(curPlayer, "MixServer")
     
-    # 重置商店购买次数,暂定只重置类型 7 的
-    FunctionNPCCommon.ResetShopItemBuyCount(curPlayer, [7])
-    
     # 合服邮件,盟主专属邮件在GameServer处理
     mailItemList = IpyGameDataPY.GetFuncEvalCfg("MixServerMail", 1)
     worldLVMailItemList = IpyGameDataPY.GetFuncEvalCfg("MixServerMail", 2)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py
index ba94c7a..2318f5e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py
@@ -27,6 +27,7 @@
 import ShareDefine
 import IpyGameDataPY
 import PlayerControl
+import FunctionNPCCommon
 import PlayerActBuyCountGift
 import PlayerActLoginNew
 import PlayerActTask
@@ -40,6 +41,7 @@
 # 功能开启需执行的函数{功能ID:执行函数, ...} 函数需返回是否激活成功, 功能开启有需要处理功能逻辑的这里增加函数调用配置即可
 FuncOpenLogicDict = {
                      ShareDefine.GameFuncID_Arena:lambda curObj:PlayerArena.DoArenaOpen(curObj),
+                     ShareDefine.GameFuncID_Shop:lambda curObj:FunctionNPCCommon.DoShopOpen(curObj),
                      }
 
 def GetFuncOpenLVIpyData(funcID): return IpyGameDataPY.GetIpyGameData("FuncOpenLV", funcID)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index 93a6a3d..42b42ee 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -50,7 +50,6 @@
 import PlayerCostRebate
 import PlayerActLunhuidian
 import GY_Query_CrossRealmReg
-import FunctionNPCCommon
 import PlayerGoldInvest
 import CrossRealmPlayer
 import CrossPlayerData
@@ -3527,9 +3526,7 @@
             
             # 记录开服活动冲级数据
             #OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_LV, curPlayer.GetLV())
-            #神秘限购
-            FunctionNPCCommon.MysticalLimitShopOpen(curPlayer, befLV, aftLV)
-
+            
         #不需要做升级任务, 设置玩家经验
         SetPlayerTotalExp(curPlayer, curTotalExp) 
         return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py
index 5ade292..d4335a8 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py
@@ -22,7 +22,6 @@
 import ChPyNetSendPack
 import CrossRealmPlayer
 import PlayerTongTianLing
-import FunctionNPCCommon
 import DataRecordPack
 import PlayerWeekParty
 import IPY_GameWorld
@@ -185,7 +184,7 @@
     SyncCrossRealmPKAwardState(curPlayer)
     
     # 重置商店物品
-    FunctionNPCCommon.ShopItemOnCrossPKSeasonChange(curPlayer)
+    #FunctionNPCCommon.ShopItemOnCrossPKSeasonChange(curPlayer)
     return True
 
 #// C1 01 跨服PK匹配 #tagCMCrossRealmPKMatch
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
index c6896d3..bff52a5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -280,6 +280,7 @@
         ChPlayer.PlayerOnDay(curPlayer)
         PlayerActivity.OnDay(curPlayer)
         PlayerLLMJ.PlayerOnDay(curPlayer)
+        FunctionNPCCommon.ShopItemOnDay(curPlayer)
         
     # 特殊时间点X点过天
     elif onEventType == ShareDefine.Def_OnEventTypeEx:
@@ -303,9 +304,6 @@
         
     # 以下为支持两种重置模式切换配置的
     FBCommon.FBOnDay(curPlayer, onEventType)
-        
-    # 商店物品购买兑换OnDay
-    FunctionNPCCommon.ShopItemOnDay(curPlayer, onEventType)
     #许愿池
     PlayerWishingWell.OnDay(curPlayer)
     #通天令
@@ -397,6 +395,7 @@
         
         # 每周提示玩家提示vip等级加入贵宾俱乐部
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_HasVIPClubNote, 0)
+        FunctionNPCCommon.ShopItemOnWeek(curPlayer)
         
     elif onEventType == ShareDefine.Def_OnEventTypeEx:
         #竞技场
@@ -405,9 +404,6 @@
         
     # 以下为支持两种重置模式切换配置的
     FBCommon.FBOnWeek(curPlayer, onEventType)
-    
-    # 商店物品购买兑换OnDay
-    FunctionNPCCommon.ShopItemOnWeek(curPlayer, onEventType)
     return
 
 #---------------------------------------------------------------------
@@ -448,8 +444,6 @@
         pass
         #OnMonthEx
         
-    # 商店物品购买兑换OnMonth
-    FunctionNPCCommon.ShopItemOnMonth(curPlayer, onEventType)
     return
 
 #---------------------------------------------------------------------
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFlashSale.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFlashSale.py
index 26e88e0..400d4e8 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFlashSale.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFlashSale.py
@@ -234,17 +234,14 @@
             for itemIpyData in shopItemIpyDataList:
                 giftBag = ChPyNetSendPack.tagMCFlashSaleGiftbag()
                 giftBag.GiftID = itemIpyData.GetID()
-                giftBag.BuyCountLimit = 0 if not itemIpyData.GetLimitCnt() else itemIpyData.GetLimitCnt()[0]
-                giftBag.ServerBuyCountLimit = itemIpyData.GetServerLimitCnt()
+                giftBag.BuyCountLimit = itemIpyData.GetLimitCnt()
+                giftBag.ServerBuyCountLimit = 0
                 giftBag.MoneyType = itemIpyData.GetMoneyType()
                 giftBag.MoneyNumber = itemIpyData.GetMoneyNum()
                 giftBag.MoneyOriginal = itemIpyData.GetMoneyOriginal()
-                itemID = itemIpyData.GetItemID()
-                jobItemList = itemIpyData.GetJobItem()
-                jobItemID = FunctionNPCCommon.GetShopJobItem(job, itemID, jobItemList)
-                giftBag.ItemID = jobItemID
+                giftBag.ItemID = itemIpyData.GetItemID()
                 giftBag.ItemCount = itemIpyData.GetItemCnt()
-                giftBag.IsBind = itemIpyData.GetIsBind()
+                giftBag.IsBind = 0
                 shop.GiftbagInfo.append(giftBag)
                 
             shop.GiftbagCount = len(shop.GiftbagInfo)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSpringSale.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSpringSale.py
index 8cb6885..8abbaef 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSpringSale.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSpringSale.py
@@ -162,21 +162,19 @@
         for itemIpyData in shopItemIpyDataList:
             giftBag = ChPyNetSendPack.tagMCSpringSaleGiftbag()
             giftBag.GiftID = itemIpyData.GetID()
-            giftBag.BuyCountLimit = 0 if not itemIpyData.GetLimitCnt() else itemIpyData.GetLimitCnt()[0]
+            giftBag.BuyCountLimit = itemIpyData.GetLimitCnt()
             giftBag.MoneyType = itemIpyData.GetMoneyType()
             giftBag.MoneyNumber = itemIpyData.GetMoneyNum()
             giftBag.MoneyOriginal = itemIpyData.GetMoneyOriginal()
             giftBag.ItemInfo = []
-            itemList = [[itemIpyData.GetItemID(), itemIpyData.GetItemCnt(), itemIpyData.GetIsBind()]]
+            itemList = [[itemIpyData.GetItemID(), itemIpyData.GetItemCnt(), 0]]
             itemList += itemIpyData.GetItemListEx()
-            jobItemList = itemIpyData.GetJobItem()
             for itemID, itemCount, isBind in itemList:
                 item = ChPyNetSendPack.tagMCSpringSaleItem()
-                jobItemID = FunctionNPCCommon.GetShopJobItem(job, itemID, jobItemList)
-                item.ItemID = jobItemID
+                item.ItemID = itemID
                 item.ItemCount = itemCount
                 item.IsBind = isBind
-                item.IsMainItem = int(itemID == FunctionNPCCommon.GetShopJobItem(job, itemIpyData.GetMainItemID(), jobItemList))
+                #item.IsMainItem = int(itemID == FunctionNPCCommon.GetShopJobItem(job, itemIpyData.GetMainItemID(), jobItemList))
                 giftBag.ItemInfo.append(item)
             giftBag.GiftItemCount = len(giftBag.ItemInfo)
             shop.GiftbagInfo.append(giftBag)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
index 35f83ff..ea48c5e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
@@ -34,8 +34,6 @@
 import AICommon
 import PlayerSuccess
 import PassiveBuffEffMng
-import FunctionNPCCommon
-import PlayerFlashSale
 import PlayerBackup
 import PlayerOnline
 import PlayerGoldRush
@@ -1050,9 +1048,7 @@
     #成就
     PlayerSuccess.FinishDelayAddSuccessProgress(curPlayer, tick, False)
     #限时抢购
-    PlayerFlashSale.ProcessFlashSaleMail(curPlayer, tick)
-    #神秘商店刷新
-    FunctionNPCCommon.CheckMysticalShopRefresh(curPlayer, tick)
+    #PlayerFlashSale.ProcessFlashSaleMail(curPlayer, tick)
     #淘金
     PlayerGoldRush.OnProcess(curPlayer)
     return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_GetStoreServerBuyCnt.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_GetStoreServerBuyCnt.py
deleted file mode 100644
index 06ab242..0000000
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_GetStoreServerBuyCnt.py
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/usr/bin/python
-# -*- coding: GBK -*-
-#-------------------------------------------------------------------------------
-#
-##@package Player.RemoteQuery.GY_Query_GetStoreServerBuyCnt
-#
-# @todo:商城全服限购处理
-# @author xdh
-# @date 2018-03-07
-# @version 1.0
-#
-# 详细描述: 商城全服限购处理
-#
-#-------------------------------------------------------------------------------
-#"""Version = 2018-03-07 17:30"""
-#-------------------------------------------------------------------------------
-
-import GameWorld
-import FunctionNPCCommon
-import ChConfig
-
-#---------------------------------------------------------------------
-
-
-#---------------------------------------------------------------------
-#逻辑实现
-## 请求逻辑
-#  @param query_Type 请求类型
-#  @param query_ID 请求的玩家ID
-#  @param packCMDList 发包命令 [ ]
-#  @param tick 当前时间
-#  @return "True" or "False" or ""
-#  @remarks 函数详细说明.
-def DoLogic(query_Type, query_ID, packCMDList, tick):
-    return ""
-
-#---------------------------------------------------------------------
-#执行结果
-## 执行结果
-#  @param curPlayer 发出请求的玩家
-#  @param callFunName 功能名称
-#  @param funResult 查询的结果
-#  @param tick 当前时间
-#  @return None
-#  @remarks 函数详细说明.
-def DoResult(curPlayer, callFunName, funResult, tick):
-    GameWorld.DebugLog("GY_Query_GetStoreServerBuyCnt funResult=%s" % funResult)
-    curPlayer.SetDict(ChConfig.Def_PlayerKey_StoreQueryState, 0)
-    if not funResult:
-        return
-    result = eval(funResult)
-    if len(result) != 7:
-        return
-    itemIndex, serverLimitCnt, clientBuyCount, totalItemList, mainItemID, limitBuyCnt, sendMailKey = result
-    FunctionNPCCommon.DoBuyStoreItem(curPlayer, itemIndex, clientBuyCount, totalItemList, mainItemID, limitBuyCnt, sendMailKey)
-    
-    return
-
-
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index 34881db..3f4aa3a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -705,7 +705,7 @@
 CDBPlayerRefresh_SuperDamPer, # 强化暴伤 259
 CDBPlayerRefresh_SuperDamPerDef, # 弱化暴伤 260
 CDBPlayerRefresh_Lingyu, # 灵玉 261
-CDBPlayerRefresh_262, # 凭证积分 262
+CDBPlayerRefresh_HeroSoul, # 将魂 262
 CDBPlayerRefresh_GatherSoul, # 聚魂精华 263
 CDBPlayerRefresh_BossFinalHurtPer,  # Boss最终输出伤害百分比 264
 CDBPlayerRefresh_265, # 骑宠养成积分 265
@@ -761,7 +761,7 @@
 TYPE_Price_FamilyFlagWarPoint = 40    # 万界积分
 TYPE_Price_Xiantao = 41    # 仙桃/战锤
 TYPE_Price_Lingyu = 42    # 灵玉/将星玉髓
-TYPE_Price_43 = 43    # boss历练凭证积分
+TYPE_Price_HeroSoul = 43    # 将魂
 TYPE_Price_GatherSoul = 44    # 聚魂精华
 TYPE_Price_45 = 45    # 骑宠养成积分
 TYPE_Price_46 = 46    # 古宝养成积分
@@ -777,7 +777,7 @@
 
 #key可用于遍历所有货币,value仅GM相关会用到
 MoneyNameDict = {
-                 1:"金币", 15:"公会贡献币", 41:"战锤", 42:"将星玉髓", 51:"招募积分", 52:"淘金令", 53:"挑战券",
+                 1:"金币", 15:"公会贡献币", 41:"战锤", 42:"将星玉髓", 43:"将魂", 51:"招募积分", 52:"淘金令", 53:"挑战券",
                  98:"代币时效", 99:"代币"
                  }
 #MoneyNameDict = {
@@ -815,6 +815,7 @@
                            TYPE_Price_GongdePoint:CDBPlayerRefresh_GongdePoint,
                            TYPE_Price_Xiantao:CDBPlayerRefresh_Xiantao,
                            TYPE_Price_Lingyu:CDBPlayerRefresh_Lingyu,
+                           TYPE_Price_HeroSoul:CDBPlayerRefresh_HeroSoul,
                            TYPE_Price_FamilyFlagWarPoint:CDBPlayerRefresh_FamilyFlagWarPoint,
                            TYPE_Price_GatherSoul:CDBPlayerRefresh_GatherSoul,
                            TYPE_Price_TiandaoFruit:CDBPlayerRefresh_TiandaoFruit,
@@ -842,7 +843,8 @@
 # 游戏功能ID定义,需确保唯一,与PyGameFuncControl.txt中FuncId一致
 GameFuncID_Official = 10        # 官爵,境界
 GameFuncID_Family = 11          # 战盟,仙盟
-GameFuncID_Arena = 27          # 竞技场
+GameFuncID_Shop = 16            # 商城,坊市
+GameFuncID_Arena = 27           # 竞技场
 
 # 以下为暂时无用的
 GameFuncID_Wing = -1            # 翅膀 3

--
Gitblit v1.8.0