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 【常规】背包-服务端(增加背包购买格子;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventShell.py |  118 ++++++++++++++--------------------------------------------
 1 files changed, 29 insertions(+), 89 deletions(-)

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

--
Gitblit v1.8.0