From a7ab0247c7b8eff06ad104bee39bc035384ca43e Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 23 七月 2025 12:08:22 +0800
Subject: [PATCH] 80 【常规】背包-服务端(增加背包购买格子;)

---
 /dev/null                                                                                      |  262 -----------------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py |   36 ++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py         |  108 +++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py         |   24 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventShell.py        |  118 +-----
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ResetPack.py   |   35 -
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py    |  212 -------------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                |   54 ---
 8 files changed, 208 insertions(+), 641 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 8b2fc9a..c0cbe0f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1019,10 +1019,6 @@
 #流向记录变更最小金币值(小于该值的暂不记录, 仅限金币)
 Def_DRRecord_Min_Silver = 500000
 Def_LargeTrade_Silver = 1000 * 1000
-#登陆初始储物柜格子数
-Def_PackCnt_Fashion = 1
-#登陆初始武器时装格子数
-Def_PackCnt_WeaponCoat = 8
 #玩家脱离战斗状态时间(6秒)
 Def_PlayerLeaveBattleTick = 3000
 #玩家PK多杀间隔
@@ -3334,13 +3330,7 @@
 Def_Player_Dict_Wallow_LV = "GameWallowLV_34"    #防沉迷等级
 Def_Player_Dict_Wallow_OfflineTime = "GameWallowOfflineTime_35"    #防沉迷离线累积时间
 Def_Player_Dict_Wallow_OnlineTime = "GameWallowOnlineTime_36"    #防沉迷在线累积时间
-Def_Player_Dict_CabinetCount_Pet = "CabinetCount_Pet_39"    #宠物收纳柜
-Def_Player_Dict_CabinetCount_WeaponCoat = "CabinetCount_WeaponCoat_40"    #武器收纳柜
-Def_Player_Dict_CabinetCount_DressCoat = "CabinetCount_DressCoat_41"     #时装收纳柜
-Def_Player_Dict_CabinetCount_Horse = "CabinetCount_Horse_42"    #马匹收纳柜
-Def_Player_Dict_PackCount_Item = "PackCount_Item_72"    #玩家物品背包格子数
-Def_Player_Dict_PackCount_Warehouse = "PackCount_Warehouse_73"    #仓库背包格子数
-Def_Player_Dict_PackCount_Hero = "PackCount_Hero"    #武将背包格子数
+Def_Player_Dict_PackBuyCnt = "PackBuyCnt_%s"    #背包已购买格子次数, 参数(背包类型)
 Def_Player_Dict_PlayerMapSignCnt = "PlayerMapSignCnt_75"    # 大地图标记数量
 Def_Player_Dict_PlayerBuyZhenQiCnt = "PlayerBuyZhenQiCnt_76"  # 购买真气次数
 Def_Player_Dict_PlayChangeLineID = "PlayChangeLineID"     # 玩家主动切换线路记录
@@ -3485,7 +3475,6 @@
 Def_PDict_FamilyWarDailyReward = "FamilyWarDailyReward"  # 王者仙盟每日俸禄领取状态
 Def_PDict_Family_Contribution = "FamilyContribution"  #战盟贡献度
 Def_PDict_HasChange_FamilyActiveToContribution = "HasChangeContribution"  #战盟活跃度已转化过贡献度
-Def_PDict_PackCount_FineSoul = "PackCount_FineSoul"    # 已购买精魄/符文背包格子数
 Def_PDict_KillPlayerAddActive = "KillPlayerAddActiveByDay"  # 杀人每日获得活跃度
 Def_PDict_LoginDayCnt = "PLoginDayCnt"  # 累计登陆天数
 Def_PDict_LoginDayAward = "PLoginDayAward"  # 累计登陆领取情况
@@ -4309,47 +4298,6 @@
 Def_PDict_UnXiantaoCntEquip = "UnXiantaoCntEquip" # 累计未结算掉落的战锤数
 Def_PDict_BootyDropToday = "BootyDropToday_%s" # 今日已累计掉落战利品数量,参数(itemID)
 
-#-------------------------------------------------------------------------------
-#可以从07 41封包购买的背包类型,和对应字典{背包类型:[字典key, 默认格子数]}
-
-#字典值列表枚举,废弃默认格子数枚举,改为读配置
-[
-Def_PlayerPackDict_Index_Key,      # 字典可以
-] = range(0, 1)
-
-Def_Type_CanBuyPack_PlayerDict = {
-                                  #IPY_GameWorld.rptPetCabinetPet:[
-                                  #     Def_Player_Dict_CabinetCount_Pet, 
-                                  #     Def_PackCnt_Fashion],
-                                      
-                                  #IPY_GameWorld.rptCabinetWeaponCoat:[
-                                  #     Def_Player_Dict_CabinetCount_WeaponCoat, 
-                                  #     Def_PackCnt_WeaponCoat],
-                                      
-                                  #IPY_GameWorld.rptCabinetDressCoat:[
-                                  #     Def_Player_Dict_CabinetCount_DressCoat, 
-                                  #     Def_PackCnt_Fashion],
-                                      
-                                  #IPY_GameWorld.rptCabinetHorse:[
-                                  #     Def_Player_Dict_CabinetCount_Horse, 
-                                  #     Def_PackCnt_Fashion],
-                                      
-                                  IPY_GameWorld.rptItem:[
-                                       Def_Player_Dict_PackCount_Item, 
-                                       0],
-                                      
-                                  IPY_GameWorld.rptWarehouse:[
-                                       Def_Player_Dict_PackCount_Warehouse, 
-                                       0],
-                                      
-                                  ShareDefine.rptHero:[
-                                       Def_Player_Dict_PackCount_Hero, 
-                                       0],
-                                      
-                                  #IPY_GameWorld.rptFineSoulSlot:[
-                                  #     Def_PDict_PackCount_FineSoul, 
-                                  #     Def_PlayerFirstLoginOpenFineSoulSlot],
-                                }
 #-------------------------------------------------------------------------------
 
 #物品效果(ID或指定类型)对应的属性计算信息 {效果(ID/指定类型):[[属性索引, ...], 是否基础属性,(非)线性]}
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 7d8db7d..4ddf44f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -3252,6 +3252,114 @@
 
 
 #------------------------------------------------------
+# A2 07 背包购买格子信息 #tagSCPackBuyInfo
+
+class  tagSCPackBuy(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("PackType", c_ubyte),    # 背包类型
+                  ("BuyCnt", c_ushort),    # 已购买次数
+                  ]
+
+    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.PackType = 0
+        self.BuyCnt = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagSCPackBuy)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A2 07 背包购买格子信息 //tagSCPackBuyInfo:
+                                PackType:%d,
+                                BuyCnt:%d
+                                '''\
+                                %(
+                                self.PackType,
+                                self.BuyCnt
+                                )
+        return DumpString
+
+
+class  tagSCPackBuyInfo(Structure):
+    Head = tagHead()
+    Count = 0    #(BYTE Count)
+    BuyInfoList = list()    #(vector<tagSCPackBuy> BuyInfoList)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA2
+        self.Head.SubCmd = 0x07
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            temBuyInfoList = tagSCPackBuy()
+            _pos = temBuyInfoList.ReadData(_lpData, _pos)
+            self.BuyInfoList.append(temBuyInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA2
+        self.Head.SubCmd = 0x07
+        self.Count = 0
+        self.BuyInfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        for i in range(self.Count):
+            length += self.BuyInfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.BuyInfoList[i].GetLength(), self.BuyInfoList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                Count:%d,
+                                BuyInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagSCPackBuyInfo=tagSCPackBuyInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagSCPackBuyInfo.Head.Cmd,m_NAtagSCPackBuyInfo.Head.SubCmd))] = m_NAtagSCPackBuyInfo
+
+
+#------------------------------------------------------
 # A2 05 虚拟背包物品清空 #tagMCVPackClear
 
 class  tagMCVPackClear(Structure):
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 ac64644..04fe355 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventShell.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventShell.py
@@ -77,7 +77,6 @@
 import ItemControler
 import ItemCommon
 import ShareDefine
-import DataRecordPack
 import PlayerCoat
 import PlayerGatherSoul
 import PlayerRune
@@ -455,104 +454,45 @@
     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
     pack = IPY_GameWorld.IPY_COpenPackCount()
     packType = pack.GetPackType()
-    if packType not in ChConfig.Def_Type_CanBuyPack_PlayerDict.keys():
-        return
-    
-    buyCount = pack.GetCount()
+    #buyCount = pack.GetCount()
+    __DoOpenPackCount(curPlayer, packType)
+    return
 
-    #已购买格子数
-    keyName = ChConfig.Def_Type_CanBuyPack_PlayerDict[packType][ChConfig.Def_PlayerPackDict_Index_Key]
-    curGridCnt = curPlayer.NomalDictGetProperty(keyName)  
-    
-    #默认格子数
-    initCnt = ItemCommon.GetPackInitCount(packType)
+def __DoOpenPackCount(curPlayer, packType):
+    costMoneyTypeDict = IpyGameDataPY.GetFuncEvalCfg("OpenPack", 1, {})
+    costMoneyValueDict = IpyGameDataPY.GetFuncEvalCfg("OpenPack", 2, {})
+    openGridListDict = IpyGameDataPY.GetFuncEvalCfg("OpenPack", 3, {})
+    if str(packType) not in costMoneyTypeDict or str(packType) not in costMoneyValueDict or str(packType) not in openGridListDict:
+        GameWorld.ErrLog("该背包不可购买! packType=%s" % packType)
+        return
+    moneyType = costMoneyTypeDict[str(packType)]
+    costValueList = costMoneyValueDict[str(packType)]
+    openGridList = openGridListDict[str(packType)]
     
     curPack = curPlayer.GetItemManager().GetPack(packType)
     curPackMaxCnt = curPack.GetMaxCount()
-    openAnonCnt =  initCnt + curGridCnt + buyCount
+    initCnt = ItemCommon.GetPackInitCount(packType)
+    alreadyOpenCnt = ItemCommon.GetPackOpenItemCnt(curPlayer, packType)
+    canOpenGridCnt = curPackMaxCnt - initCnt - alreadyOpenCnt
     
-    if curPackMaxCnt < openAnonCnt:
+    nextBuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PackBuyCnt % packType) + 1
+    nextOpenCnt = openGridList[nextBuyCnt - 1] if len(openGridList) >= nextBuyCnt else openGridList[-1]
+    moneyCnt = costValueList[nextBuyCnt - 1] if len(costValueList) >= nextBuyCnt else costValueList[-1]
+    
+    if canOpenGridCnt < nextOpenCnt:
         #数量超过最大格子数
-        GameWorld.DebugLog("购买背包格子,数量超过最大格子数!packType=%s,buyCount=%s" % (packType, buyCount))
-        return
-   
-    isBuyOK, costMoneyList = DoOpenGrid(curPlayer, curGridCnt, packType, buyCount)
-    if not isBuyOK:
+        GameWorld.DebugLog("购买背包格子,数量超过最大格子数!packType=%s,initCnt=%s,alreadyOpenCnt=%s,已购买次数=%s,curPackMaxCnt=%s,canOpenGridCnt=%s < %s" 
+                           % (packType, initCnt, alreadyOpenCnt, nextBuyCnt - 1, curPackMaxCnt, canOpenGridCnt, nextOpenCnt))
         return
     
-    #fromIndex, toIndex =  curGridCnt + 1, curGridCnt + buyCount  
-#    GameWorld.Log("fromIndex=%s toIndex=%s"%(fromIndex, toIndex))
-    PlayerControl.NomalDictSetProperty(curPlayer, keyName, curGridCnt + buyCount)
+    infoDict = {"BuyCount":nextBuyCnt, ChConfig.Def_Cost_Reason_SonKey:packType}
+    if not PlayerControl.PayMoney(curPlayer, moneyType, moneyCnt, ChConfig.Def_Cost_BuyPack, infoDict, 1):
+        return
     
-    if packType == IPY_GameWorld.rptItem:
-        #背包刷新
-        PlayerControl.Init_ItemPack(curPlayer)
-        PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_671654")
-        #PlayerControl.SyncOnLineTimeTotal(curPlayer)
-        #PlayerControl.SyncOnLineTimeLastOpenPack(curPlayer, packType)
-        
-        
-    elif packType == IPY_GameWorld.rptWarehouse:
-        #仓库刷新
-        PlayerControl.Init_Warehouse(curPlayer)
-            
-    else:
-        #收纳柜刷新
-        PlayerControl.Init_CabinetCountByType(curPlayer, packType)
-    
-    DataRecordPack.DR_OpenPackCount(curPlayer, packType, buyCount, curPlayer.NomalDictGetProperty(keyName))
-    
-    if costMoneyList:
-        #消费记录
-        for moneyType, money in costMoneyList:
-            GameWorld.Login_Interface_GoldRec(curPlayer, 0, 1, 'BuyPackGrid', moneyType, money)
-
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_PackBuyCnt % packType, nextBuyCnt)
+    PlayerControl.Init_PackCount(curPlayer, packType)
+    ItemCommon.SyncPackBuyCnt(curPlayer, packType)
     return
-
-##开启格子扣道具钻石
-# @param curPlayer 玩家对象
-# @param buyMoney 钻石消耗
-# @param packType 背包类型
-# @param curPack 物品管理器
-# @param buyPackMoneyType 货币类型
-# @param buyCount 购买格子数
-# @return None 是否购买成功, 玩家是否有钱款
-def DoOpenGrid(curPlayer, curGridCnt, packType, buyCount):
-    curPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
-    
-    itemId = IpyGameDataPY.GetFuncCfg('OpenBagItem')
-    itemCntFormula = IpyGameDataPY.GetFuncCompileCfg('OpenBagItem', 2)
-    buyMoney = IpyGameDataPY.GetFuncCfg('OpenBagItem', 3)
-    totalItemCnt = 0
-    for index in range(curGridCnt+1, curGridCnt + buyCount+1):
-        itemcnt = eval(itemCntFormula)
-        totalItemCnt += itemcnt
-    
-    hasEnough, indexList, findItemIsBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(itemId, curPack, totalItemCnt)
-    
-    needMoney = lackCnt * buyMoney if not hasEnough else 0
-        
-
-    # 需要付钱
-    costMoneyList = []
-    if needMoney > 0:
-        costMoneyList = PlayerControl.HaveMoneyEx(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Paper, needMoney)
-        if costMoneyList == []:
-            #金钱不足
-            return False, costMoneyList
-    
-        #付款
-        for moneyType, moneyCnt in costMoneyList:
-            infoDict = {"BuyCount":buyCount, ChConfig.Def_Cost_Reason_SonKey:packType}
-            if not PlayerControl.PayMoney(curPlayer, moneyType, moneyCnt, ChConfig.Def_Cost_BuyPack, infoDict, 1):
-                return False, costMoneyList
-    
-    # 扣道具
-    delCnt = max(0, totalItemCnt - lackCnt) # 实际扣除的个数
-    if indexList:
-        ItemCommon.ReduceItem(curPlayer, curPack, indexList, delCnt, True)
-        
-    return True, costMoneyList
     
 #===============================================================================
 #//A2 04 请求打开远程仓库 #tagCMOpenLongWarehouse
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ResetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ResetPack.py
index 936994e..603a3c2 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ResetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ResetPack.py
@@ -2,26 +2,23 @@
 # -*- coding: GBK -*-
 #-------------------------------------------------------------------------------
 #
-#-------------------------------------------------------------------------------
-#
 ##@package GM.Commands.ResetPack
 #
 # @todo:重置背包购买
 # @author hxp
-# @date 2015-1-10
+# @date 2025-07-23
 # @version 1.0
 #
 # 详细描述: 重置背包购买
 #
-#---------------------------------------------------------------------
-"""Version = 2015-1-10 23:00"""
+#-------------------------------------------------------------------------------
+#"""Version = 2025-07-23 12:00"""
+#-------------------------------------------------------------------------------
 
-import IPY_GameWorld
-import PlayerControl
-import ChConfig
 import GameWorld
-
-#---------------------------------------------------------------------
+import PlayerControl
+import ItemCommon
+import ChConfig
 
 ## 执行逻辑
 #  @param curPlayer 当前玩家
@@ -30,22 +27,16 @@
 #  @remarks 函数详细说明.
 def OnExec(curPlayer, cmdList):
     if len(cmdList) <= 0:
-        GameWorld.DebugAnswer(curPlayer, "ResetPack 背包类型[5-仓库]")
+        GameWorld.DebugAnswer(curPlayer, "ResetPack 背包类型")
         return
     
     packType = cmdList[0]
-    if packType not in ChConfig.Def_Type_CanBuyPack_PlayerDict.keys():
-        GameWorld.DebugAnswer(curPlayer, "背包类型错误")
+    if not curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PackBuyCnt % packType):
+        GameWorld.DebugAnswer(curPlayer, "背包未购买过: %s" % packType)
         return
     
-    keyName = ChConfig.Def_Type_CanBuyPack_PlayerDict[packType][ChConfig.Def_PlayerPackDict_Index_Key]
-    
-    if packType == IPY_GameWorld.rptWarehouse:
-        PlayerControl.NomalDictSetProperty(curPlayer, keyName, 0)
-        #仓库刷新
-        PlayerControl.Init_Warehouse(curPlayer)
-    else:
-        return
-    
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_PackBuyCnt % packType, 0)
+    PlayerControl.Init_PackCount(curPlayer, packType)
+    ItemCommon.SyncPackBuyCnt(curPlayer, packType)
     GameWorld.DebugAnswer(curPlayer, "ResetPack OK")
     return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py
index c694aee..2efc92e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py
@@ -794,6 +794,42 @@
     GameWorld.DebugLog("背包类型初始格子数: packType=%s,initCount=%s" % (packType, initCount))
     return initCount
 
+def GetPackOpenItemCnt(curPlayer, packType):
+    ## 获取对应背包已购买的格子数
+    openCntDict = IpyGameDataPY.GetFuncEvalCfg("OpenPack", 3, {})
+    if str(packType) not in openCntDict:
+        return 0
+    openCntList = openCntDict[str(packType)]
+    if not openCntList:
+        return 0
+    
+    buyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PackBuyCnt % packType)
+    openCnt = sum(openCntList[:buyCnt])
+    if buyCnt > len(openCntList):
+        addCnt = (buyCnt - len(openCntList)) * openCntList[-1]
+        openCnt += addCnt
+        
+    return openCnt
+
+def SyncPackBuyCnt(curPlayer, packType=None):
+    ## 同步已购买格子次数信息
+    openCntDict = IpyGameDataPY.GetFuncEvalCfg("OpenPack", 3, {})
+    if not openCntDict:
+        return
+    syncTypeList = [str(packType)] if packType else openCntDict.keys()
+    
+    clientPack = ChPyNetSendPack.tagSCPackBuyInfo()
+    clientPack.BuyInfoList = []
+    for packTypeStr in syncTypeList:
+        packType = int(packTypeStr)
+        buy = ChPyNetSendPack.tagSCPackBuy()
+        buy.PackType = packType
+        buy.BuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PackBuyCnt % packType)
+        clientPack.BuyInfoList.append(buy)
+    clientPack.Count = len(clientPack.BuyInfoList)
+    NetPackCommon.SendFakePack(curPlayer, clientPack)
+    return
+
 ## 获得虚拟背包格子数
 #  @param packindex 背包索引
 #  @return 背包格子数
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 d50420b..fbcc07c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -1436,36 +1436,30 @@
 #@return 返回值无意义
 #@remarks 初始化玩家背包
 def InitPlayerPack(curPlayer) :
-    itemManager = curPlayer.GetItemManager()
-
+    
     #设置装备实际个数,默认最大个数
-    curPack = itemManager.GetPack(IPY_GameWorld.rptEquip)
-    curPack.SetCount(curPack.GetMaxCount())
+    PlayerControl.Init_PackCount(curPlayer, IPY_GameWorld.rptEquip, defaultMax=True, isSync=False)
     
     #初始化玩家背包
-    PlayerControl.Init_ItemPack(curPlayer)
+    PlayerControl.Init_PackCount(curPlayer, IPY_GameWorld.rptItem)
     
     #初始化玩家仓库
     #PlayerControl.Init_Warehouse(curPlayer)
     
     #初始化鉴定背包,默认最大个数用于存放主线掉落
-    curPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptIdentify)
-    curPack.SetCount(curPack.GetMaxCount())
-    curPack.Sync_PackCanUseCount()
+    PlayerControl.Init_PackCount(curPlayer, IPY_GameWorld.rptIdentify, defaultMax=True)
     
     #初始化英雄背包
-    PlayerControl.Init_HeroPack(curPlayer)
+    PlayerControl.Init_PackCount(curPlayer, ShareDefine.rptHero)
     
     #初始化临时交换背包,默认最大个数
-    curPack = itemManager.GetPack(ShareDefine.rptTempSwap)
-    curPack.SetCount(curPack.GetMaxCount())
+    PlayerControl.Init_PackCount(curPlayer, ShareDefine.rptTempSwap, defaultMax=True, isSync=False)
     
     #初始化临时存放背包,默认最大个数
-    curPack = itemManager.GetPack(ShareDefine.rptTempItem)
-    curPack.SetCount(curPack.GetMaxCount())
+    PlayerControl.Init_PackCount(curPlayer, ShareDefine.rptTempItem, defaultMax=True, isSync=False)
     
     #初始化寻宝背包
-    PlayerControl.Init_TreasurePack(curPlayer)
+    PlayerControl.Init_PackCount(curPlayer, ShareDefine.rptTreasure)
     
     #初始化神兽物品背包
     #curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzItem)
@@ -1493,6 +1487,8 @@
     #curPack.SetCount(ItemCommon.GetPackInitCount(ShareDefine.rptPet))
     #curPack.Sync_PackCanUseCount()
     
+    ItemCommon.SyncPackBuyCnt(curPlayer)
+    
     #通知玩家物品信息
     __Sync_PackDetel(curPlayer)
     
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 241e10b..b35b8c3 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -14,10 +14,8 @@
 #"""Version = 2017-07-17 15:00"""
 #---------------------------------------------------------------------
 import GameWorld
-import ChEquip
 import SkillShell
 import ChConfig
-import EffGetSet
 import PlayerHorse
 import PlayerTeam
 import SkillCommon
@@ -41,27 +39,15 @@
 import ChPyNetSendPack
 import NetPackCommon
 import DataRecordPack
-import CalcNoLineEffect
-import CalcLineEffect
-import PlayerEquipDecompose
-import FormulaControl
-import PlayerDienstgrad
 import PlayerPrestigeSys
-import OpenServerCampaign
-import PlayerGodWeapon
-import PlayerExpandPackCfgMgr
 import PlayerActivity
 import FBCommon
 import PassiveBuffEffMng
 import EventReport
-import PlayerGatherSoul
-import PlayerGatherTheSoul
 import PlayerSuccess
-import PlayerPet
 import ItemControler
 import GameFuncComm
 import IpyGameDataPY
-import PlayerRune
 import PyGameData
 import PlayerMagicWeapon
 import PlayerFeastTravel
@@ -70,9 +56,6 @@
 import GameLogic_ZhuXianBoss
 import GameLogic_CrossDemonKing
 import PlayerVip
-import PlayerRefineStove
-import PlayerFamilyTech
-import PlayerFamilyZhenfa
 import PlayerCostRebate
 import PlayerActLunhuidian
 import PlayerActGarbageSorting
@@ -80,24 +63,14 @@
 import PlayerTongTianLing
 import FunctionNPCCommon
 import PlayerGoldInvest
-import IPY_PlayerDefine
 import CrossRealmPlayer
 import CrossPlayerData
-import NPCHurtManager
 import ChNetSendPack
-import PlayerLianTi
-import PlayerCoat
 import PlayerAssist
 import PlayerState
-import PlayerDogz
-import PlayerFaQi
-import PlayerLove
 import PlayerGubao
-import PlayerShentong
 import PlayerOnline
-import PlayerCharm
 import PlayerTask
-import PlayerFace
 import PlayerMail
 import ChPlayer
 import GameObj
@@ -777,21 +750,6 @@
     curPlayer.Stand()
     
     
-    return
-#---------------------------------------------------------------------
-##玩家播放表情
-# @param curPlayer 玩家实例
-# @return 返回值无意义
-# @remarks 玩家播放表情
-def DoPlayerShowPlayerFace(curPlayer, faceType):
-    #清空玩家点击
-    curPlayer.SetActionObj(None)
-    #通知中断战斗对峙
-    ExitPlayerConfronting(curPlayer)
-    #通知停止移动
-    curPlayer.StopMove()
-    #通知客户端播放表情
-    curPlayer.View_ShowPlayerFace(faceType)
     return
 
 #---------------------------------------------------------------------
@@ -3647,10 +3605,6 @@
             
             # 升级需要执行的游戏功能处理
             GameFuncComm.DoFuncOpenLogic(curPlayer)
-            #ChEquip.RefreshPlayerLingQiEquipAttr(curPlayer) # 灵器属性会随等级成长
-            #if aftLV%10 == 0:
-            #    # 控制下刷新次数
-            #    PlayerPet.CalcPetItemAddPlayerAttr(curPlayer)   # 宠物有随等级变化的技能
             
             PlayerOnline.CalcRoleBase(curPlayer)
             PlayerOnline.GetOnlinePlayer(curPlayer).RefreshRoleAttr()
@@ -4268,104 +4222,22 @@
 #        return False
     
     return True
-#------------------------------------------------------------------------------------
-##初始化玩家背包.
-# @param curPlayer 玩家实例
-# @return 返回值无意义
-# @remarks 初始化玩家背包
-def Init_ItemPack(curPlayer):
-    packType = IPY_GameWorld.rptItem
-    
-    #初始化玩家背包
-    if packType not in ChConfig.Def_Type_CanBuyPack_PlayerDict.keys():
-        return
-    
-    #获取玩家背包
-    curPack = curPlayer.GetItemManager().GetPack(packType)
-    
-    #默认14格子 + 开启的
-    keyName = ChConfig.Def_Type_CanBuyPack_PlayerDict.get(packType)[ChConfig.Def_PlayerPackDict_Index_Key]
-    count = ItemCommon.GetPackInitCount(packType) + curPlayer.NomalDictGetProperty(keyName)
-    curPack.SetCount(count)
-        
-    #通知客户端背包格子数目
-#    curPlayer.Sync_ItemCount(curPack.GetCount())
-    curPack.Sync_PackCanUseCount()
-    return
 
 #------------------------------------------------------------------------------------
-##初始化玩家仓库.
-# @param curPlayer 玩家实例
-# @return 返回值无意义
-# @remarks 初始化玩家仓库
-def Init_Warehouse(curPlayer):
-    
-    packType = IPY_GameWorld.rptWarehouse
-    
-    #初始化玩家背包
-    if packType not in ChConfig.Def_Type_CanBuyPack_PlayerDict.keys():
-        return
-    
-    #获取玩家背包
+
+def Init_PackCount(curPlayer, packType, defaultMax=False, isSync=True):
+    ## 初始化刷新玩家某个背包格子数
     curPack = curPlayer.GetItemManager().GetPack(packType)
-    
-    #默认42格子 + 开启的
-    keyName = ChConfig.Def_Type_CanBuyPack_PlayerDict.get(packType)[ChConfig.Def_PlayerPackDict_Index_Key]
-    count = ItemCommon.GetPackInitCount(packType) + curPlayer.NomalDictGetProperty(keyName)
-    
-    curPack.SetCount(count)
-    
-    #通知客户端
-    curPack.Sync_PackCanUseCount()
+    maxCount = curPack.GetMaxCount()
+    if defaultMax:
+        curPack.SetCount(maxCount)
+    else:
+        count = ItemCommon.GetPackInitCount(packType) + ItemCommon.GetPackOpenItemCnt(curPlayer, packType)
+        curPack.SetCount(min(count, maxCount))
+    if isSync:
+        curPack.Sync_PackCanUseCount()
     return
 
-def Init_HeroPack(curPlayer):
-    packType = ShareDefine.rptHero    
-    #获取玩家背包
-    curPack = curPlayer.GetItemManager().GetPack(packType)
-    initCount = ItemCommon.GetPackInitCount(packType)
-    if packType in ChConfig.Def_Type_CanBuyPack_PlayerDict.keys():
-        keyName = ChConfig.Def_Type_CanBuyPack_PlayerDict.get(packType)[ChConfig.Def_PlayerPackDict_Index_Key]
-        initCount += curPlayer.NomalDictGetProperty(keyName)
-    curPack.SetCount(initCount)
-    #通知客户端背包格子数目
-#    curPlayer.Sync_ItemCount(curPack.GetCount())
-    curPack.Sync_PackCanUseCount()
-    return
-
-
-##初始化寻宝背包
-# @param curPlayer 玩家实例
-# @return None
-def Init_TreasurePack(curPlayer):
-    curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptTreasure)
-    curPack.SetCount(ItemCommon.GetPackInitCount(ShareDefine.rptTreasure))
-    
-    #通知客户端
-    curPack.Sync_PackCanUseCount()
-    return
-
-##初始化玩家收纳柜
-# @param curPlayer 玩家实例
-# @param packType 背包类型
-# @return 返回值无意义
-def Init_CabinetCountByType(curPlayer, packType):
-    keyName = ChConfig.Def_Type_CanBuyPack_PlayerDict.get(packType)[ChConfig.Def_PlayerPackDict_Index_Key]
-    if keyName == None:
-        GameWorld.ErrLog("Init_Pack Error type=%s" % packType)
-        return
-    
-    #初始化时装武器背包
-    curPack = curPlayer.GetItemManager().GetPack(packType)
-    #默认14格子 + 开启的
-    count = ChConfig.Def_PackCnt_WeaponCoat + curPlayer.NomalDictGetProperty(keyName)
-    curPack.SetCount(count)
-    
-    #通知客户端
-    curPack.Sync_PackCanUseCount()
-    return
-
-#---------------------------------------------------------------------
 def IsInOperationAction(curPlayer, actName, actIDKey, crossActName="", crossActIDKey=""):
     ## 玩家是否有正在进行中运营活动,不含参与结束阶段
     
@@ -4871,68 +4743,6 @@
 # #@warning: ExAttr6~ExAttr10, 新增2个布尔默认参数, 是否通知客户端, 是否通知GameServer, 默认值为False
 #===============================================================================
 #---------------------------------------------------------------------------
-
-##获取可免费开启的格子数
-# @param curPlayer 玩家对象
-# @param packType 背包类型
-# @param openCnt 实际要开启的格子数
-# @return 获取可免费开启的格子数
-def GetCanAutoOpenPackCount(curPlayer, packType, openCnt, tick):
-    if packType not in [IPY_GameWorld.rptItem, IPY_GameWorld.rptWarehouse]:
-        return 0
-    cfgObj = PlayerExpandPackCfgMgr.GetExpandPackCfg(curPlayer, packType)
-    #找不到这种背包的配置信息对象
-    if not cfgObj:
-        return 0
-    #已购买或自动开启的格子数
-    keyName = ChConfig.Def_Type_CanBuyPack_PlayerDict[packType][ChConfig.Def_PlayerPackDict_Index_Key]
-    curCount = curPlayer.NomalDictGetProperty(keyName)
-    
-#    nextCountIndex = curCount + 1
-#    infoObj = cfgObj.GetAttrInfoByInex(nextCountIndex)
-#    if None == infoObj:
-#        return 0
-#    #更新下玩家的在线时间
-#    UpdateOnLineTime(curPlayer, tick)
-#    onlineTime = curPlayer.GetOnlineTime()
-#    #需要的时间
-#    needOnlineTime = infoObj["OnlineTime"]
-#    #最后一次自动开启背包的在线时间tick
-#    lastAutoOpenPackTick = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_LastAutoOpenPackTick)
-#    if onlineTime - lastAutoOpenPackTick > needOnlineTime:
-#        return 1
-#    return 0
-    
-    #最大可增加的背包数
-    maxCanAddCount = cfgObj.GetCanAddCount()
-    forCount = min(openCnt, maxCanAddCount - curCount)
-    
-    #可以再增加的格子数
-    count = 0
-    #遍历可增加的背包格子数
-    UpdateOnLineTime(curPlayer, tick)
-    onlineTime = curPlayer.GetOnlineTime()
-    lastAutoOpenPackTick = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_LastAutoOpenPackTick % packType)
-    lastInfoObj = cfgObj.GetTotalAddAttrInfoByCount(curCount)
-    notOnlineTime = 0
-    if lastInfoObj:
-        notOnlineTime = lastInfoObj["OnlineTime"]
-#    GameWorld.Log("get online time = %s"%onlineTime)
-    for i in range(forCount):
-        nextCount = curCount + i + 1
-        infoObj = cfgObj.GetTotalAddAttrInfoByCount(nextCount)
-        if None == infoObj:
-            break
-        # (小于0的不具有免费开启功能)
-        if infoObj["OnlineTime"] < 0:
-            continue
-        needOnlineTime = infoObj["OnlineTime"] - notOnlineTime
-#        GameWorld.Log("get need online time = %s"%needOnlineTime)
-        #要求的在线时间,大于当前的在线时间,没办法加背包格子
-        if needOnlineTime > onlineTime - lastAutoOpenPackTick:
-            break
-        count += 1
-    return count
 
 ## 获取玩家当前等级升级所需总经验
 #  @param playerLv 玩家等级
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerExpandPackCfgMgr.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerExpandPackCfgMgr.py
deleted file mode 100644
index 10f63d6..0000000
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerExpandPackCfgMgr.py
+++ /dev/null
@@ -1,262 +0,0 @@
-#!/usr/bin/python
-# -*- coding: GBK -*-
-#-------------------------------------------------------------------------------
-#
-#-------------------------------------------------------------------------------
-#
-##@package PlayerAutoCheckOnline
-#
-# @todo: 玩家增加背包的相关配置信息管理器,各种背包的配置字段信息需保持一致
-# @author xcc
-# @date 2014-04-24 22:05
-# @version 1.5
-#
-# 详细描述: 玩家增加背包的相关配置信息管理器
-
-# @change: "2014-04-22 17:50" xcc 增加首版本
-# @change: "2014-04-24 22:05" cbw 在线开启改为一次一格
-# @change: "2014-06-24 21:00" Alee 去除异常抛出详细输出出错信息
-# @change: "2015-01-10 23:00" hxp 屏蔽仓库刷属性
-# @change: "2015-08-12 16:00" zqx 开仓库刷属性
-#---------------------------------------------------------------------
-"""Version = 2015-08-12 16:00"""
-#------------------------------------------------------------------------------
-import ReadChConfig
-import GameWorld
-import IPY_GameWorld
-import PlayerControl
-import ItemCommon
-import ChConfig
-import copy
-
-##背包的配置信息,只要用于可扩充的背包类型,如物品背包,仓库背包,使用的配置格式需统一
-class  ExpandPackCfg(object):
-    ##构造函数
-    #@param cfgName 配置文件名
-    #@param defCount 初始背包格子数
-    #@param maxCount 最大背包格子数
-    #@return 无
-    #@remarks 读取配置文件
-    def __init__(self, cfgName, defCount, maxCount):
-        self.__cfgInfo = {}   #配置信息{1:[5,10,2000], ...}
-        self.__totalAddAttrInfoWithCount = {}  #增加的总属性,按格子数计算,如格子数是3,则会累加1,2,3格的信息
-        self.__defCount = defCount
-        self.__maxCount = maxCount   #总的可增加的格子数
-        self.__canAddCount = maxCount - defCount
-        self.__cfgName = cfgName
-        self.__LoadCfg()
-    
-    ##读取配置文件
-    #@param None
-    #@return 无
-    #@remarks 读取配置文件
-    def __LoadCfg(self):
-        cfgInfo = ReadChConfig.GetEvalChConfig(self.__cfgName)
-        #没有读取到配置文件
-        if None == cfgInfo:
-            return
-        
-        self.__cfgInfo = cfgInfo
-        cfgCount = len(self.__cfgInfo)  #获取共配置了几个配置信息
-        #Exp参数特殊处理,以为是有公式的
-        totalDict = {"Exp":[]}
-        for i in range(0, self.__canAddCount):
-            count = index = i + 1
-            #如果只配置了前几个格子的数据,则后面的格子信息以最后一个格子的信息为准
-            if index > cfgCount:
-                index = cfgCount
-            gridCfgInfo = self.__cfgInfo.get(index, {})
-            for key in gridCfgInfo.iterkeys():
-                if key == "Exp":
-                    totalDict[key].append(gridCfgInfo.get(key, "0"))   
-                else:
-                    totalDict[key] = totalDict.get(key, 0) + gridCfgInfo.get(key, 0)
-            
-            #计算添加的格子数对应的附加属性的总值
-            if not self.__totalAddAttrInfoWithCount.has_key(count):
-                self.__totalAddAttrInfoWithCount[count] = copy.deepcopy(totalDict)
-                
-    ##获取可以增加的背包数,即最大背包数减去基础背包数
-    #@param None
-    #@return 可以增加的背包数
-    #@remarks 获取可以增加的背包数,即最大背包数减去基础背包数
-    def GetCanAddCount(self):
-        return self.__canAddCount
-    
-    def GetAttrInfoByInex(self, buyIndex):
-        cfgCount = len(self.__cfgInfo)
-        if buyIndex > cfgCount:
-            buyIndex = cfgCount
-        return self.__cfgInfo.get(buyIndex, None)
-    
-    ##根据已购买的格子数,获取总的附加属性信息
-    #@param buyCount 已购买的格子数
-    #@return 附加的属性信息
-    #@remarks 根据当前格子数,获取总的附加属性信息
-    def GetTotalAddAttrInfoByCount(self, buyCount):
-        return self.__totalAddAttrInfoWithCount.get(buyCount, None)
-    
-    ##根据起始格子编号,和结束格子编号,获取总的可附加的属性信息,编号从1开始
-    #如果当前玩家有50个格子,要开启51,52这两个格子,则fromIndex为1, toIndex为2,如果只有51,则fromIndex和toIndex均为1
-    #@param fromIndex 起始格子编号
-    #@param toIndex 结束格子编号
-    #@param attrList 要获取的属性列表,如果需要所有的属性的话,请填写["all"]
-    #@return 附加的属性信息
-    #@remarks 获取总的可附加的属性信息
-    def GetTotalCanAddAttrInfo(self, curPlayer, fromIndex, toIndex, attrList=["Exp"]):
-        #索引有误 
-        if fromIndex <= 0 or toIndex <= 0:
-            GameWorld.ErrLog('GetTotalCanAddAttrInfo fromIndex <= 0 or toIndex <= 0')
-            return None
-        #索引有误  
-        if toIndex > self.__canAddCount:
-            GameWorld.ErrLog('GetTotalCanAddAttrInfo toIndex > self.__canAddCount')
-            return None
-        
-        #起始位置不能大于结束位置
-        if fromIndex > toIndex:
-            GameWorld.ErrLog('GetTotalCanAddAttrInfo fromIndex > toIndex')
-            return None
-        
-        #位置相同,直接取配置信息
-        if fromIndex == toIndex:
-            cfgCount = len(self.__cfgInfo)  #获取共配置了几个配置信息
-            if toIndex > cfgCount:
-                toIndex = cfgCount
-#            GameWorld.Log("index=%s cfgInfo=%s"%(toIndex, self.__cfgInfo))
-#            GameWorld.Log("get = %s"%self.__cfgInfo.get(toIndex, None))
-            findInfo = self.__cfgInfo.get(toIndex, {})
-            retInfo = {}
-            for attr in attrList:
-                if attr == "Exp":
-                    ReExp = PlayerControl.GetPlayerReExp(curPlayer)
-#                    GameWorld.Log("ReExp=%s"%ReExp)
-                    addExp = eval(findInfo[attr])
-#                    GameWorld.Log("addExp=%s type=%s"%(addExp, type(addExp)))
-                    retInfo[attr] = addExp
-                else:
-                    retInfo[attr] = findInfo[attr]
-            return retInfo
-        
-        #位置不同,进行计算
-        toInfo = self.GetTotalAddAttrInfoByCount(toIndex)
-        fromInfo = self.GetTotalAddAttrInfoByCount(fromIndex - 1)
-        if toInfo == None or fromInfo == None:
-            GameWorld.ErrLog('GetTotalCanAddAttrInfo NoData %s'%([fromIndex, toIndex]))
-            return None
-        
-
-        #如果有all属性,说明是要取全部的属性信息
-        if "all" in attrList:
-            attrList = toInfo.keys()
-        #取出需要的属性
-        retInfo = {}
-        for attr in attrList:
-            if attr == "Exp":
-#                GameWorld.Log("toIndex=%s fromIndex=%s"%(toIndex, fromIndex))
-                ReExp = PlayerControl.GetPlayerReExp(curPlayer)
-#                GameWorld.Log("toInfo[attr]=%s"%toInfo[attr])
-                expFormulaList = toInfo[attr][fromIndex - 1:]
-#                GameWorld.Log("expFormulaList=%s"%expFormulaList)
-                addExp = 0
-                for formula in expFormulaList:
-                    addExp += eval(formula)
-#                GameWorld.Log("addExp=%s"%addExp)
-                retInfo[attr] = addExp
-            else:
-                retInfo[attr] = toInfo[attr] - fromInfo[attr]
-        return retInfo
-    
-#    def __str__(self):
-#        return """CfgName = %s\r\ncfgInfo=%s\r\ntotalAddAttrInfo=%s"""%(
-#                        self.__cfgName, self.__cfgInfo, self.__totalAddAttrInfoWithCount)
-    
-##扩充背包配置信息管理器
-class ExpandPackCfgMgr():
-    ##构造函数
-    #@param None
-    #@return None
-    #@remarks 构造函数
-    def __init__(self):
-        self.__expandPackCfgDict = {}  #各种类型背包配置文件信息管理器字典
-    
-    ##加载物品背包和仓库扩充格子时需要用的配置信息
-    #@param curPlayer 玩家对象
-    #@return None
-    #@remarks 加载物品背包和仓库扩充格子时需要用的配置信息
-    def Load(self, curPlayer):
-        #默认物品背包格子数
-        defItemPackCount = ItemCommon.GetPackInitCount(IPY_GameWorld.rptItem)
-        itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
-        self.__expandPackCfgDict[IPY_GameWorld.rptItem] = ExpandPackCfg("ExpandItemPack", defItemPackCount, 
-                                                                        itemPack.GetMaxCount())
-        #默认仓库背包格子数
-        defItemPackCount = ItemCommon.GetPackInitCount(IPY_GameWorld.rptWarehouse)
-        itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptWarehouse)
-        self.__expandPackCfgDict[IPY_GameWorld.rptWarehouse] = ExpandPackCfg("ExpandWareHousePack", defItemPackCount, 
-                                                                             itemPack.GetMaxCount())
-        
-    ##获取扩充指定类型的背包的配置信息
-    #@param packType 背包类型
-    #@return 扩充指定类型的背包的配置信息
-    #@remarks 获取扩充指定类型的背包的配置信息
-    def GetExpandPackCfg(self, packType):
-        return self.__expandPackCfgDict.get(packType, None)
-    
-    ##计算物品背包和仓库附加的总属性
-    #@param curPlayer 玩家对象
-    #@param allAttrList 属性列表
-    #@return 计算背包附加的总属性
-    #@remarks 计算背包附加的总属性
-    def CalcAttr(self, curPlayer, allAttrList):
-        #计算物品背包的属性
-        self.__CalcPackAttr(curPlayer, allAttrList, IPY_GameWorld.rptItem)
-        #计算仓库背包的属性
-        self.__CalcPackAttr(curPlayer, allAttrList, IPY_GameWorld.rptWarehouse)
-    
-    ##计算背包附加的总属性
-    #@param curPlayer 玩家对象
-    #@param allAttrList 属性列表
-    #@param packType 背包类型
-    #@return 计算背包附加的总属性
-    #@remarks 计算背包附加的总属性
-    def __CalcPackAttr(self, curPlayer, allAttrList, packType):
-        packCfg = self.GetExpandPackCfg(packType)
-        if not packCfg:
-            return
-        #已购买或自动开启的格子数
-        keyName = ChConfig.Def_Type_CanBuyPack_PlayerDict[packType][ChConfig.Def_PlayerPackDict_Index_Key]
-        curCount = curPlayer.NomalDictGetProperty(keyName)
-        if curCount == 0:
-            return
-        attrInfo = packCfg.GetTotalAddAttrInfoByCount(curCount)
-        expandPackAddAttr = ReadChConfig.GetEvalChConfig("ExpandPackAddAttr")
-        for attrName in expandPackAddAttr:
-            addValue = attrInfo[attrName]
-            #物理攻击
-            PlayerControl.CalcAttrDict_Type(attrName, addValue, allAttrList)
-        
-    
-#    def __str__(self):
-#        return "ItemPackInfo = %s\r\nWareHousePackInfo = %s"%(self.GetExpandPackCfg(IPY_GameWorld.rptItem),
-#                                                              self.GetExpandPackCfg(IPY_GameWorld.rptWarehouse))
-        
-g_expandPackCfgMgr = None
-#获取背包配置信息管理器
-#@param curPlayer 玩家实例,需要这个实例来获取各种背包类型的最大背包数
-#@return 背包配置信息管理器
-#@remarks 获取所有背包配置信息管理器
-def GetExpandPackCfgMgr(curPlayer):
-    global g_expandPackCfgMgr
-    if not g_expandPackCfgMgr:
-        g_expandPackCfgMgr = ExpandPackCfgMgr()
-        g_expandPackCfgMgr.Load(curPlayer)
-    return g_expandPackCfgMgr
-
-#获取获取指定类型的背包的配置信息
-#@param curPlayer 玩家实例,需要这个实例来获取各种背包类型的最大背包数
-#@param packType 背包类型
-#@return 指定类型的背包的配置信息
-#@remarks 获取获取指定类型的背包的配置信息
-def GetExpandPackCfg(curPlayer, packType):
-    return GetExpandPackCfgMgr(curPlayer).GetExpandPackCfg(packType)
\ No newline at end of file

--
Gitblit v1.8.0