From a515aa2d1043e20dba19ae0124f7777227c12753 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 11 七月 2025 11:17:39 +0800
Subject: [PATCH] 80 【常规】背包-服务端(优化背包格子初始化,屏蔽无用背包;支持绑定货币数量展示的背包物品;背包物品优化叠加上限20亿支持;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py      |   50 +++++++++++++---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py |    4 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py             |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py         |   69 ++++++++++++-----------
 PySysDB/PySysDBPY.h                                                                            |    8 +-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py    |    8 ++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/MapServerConfig.ini               |   14 ++--
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                |   23 +++----
 8 files changed, 106 insertions(+), 72 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 47c8602..907256c 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -285,7 +285,7 @@
 
 //任务表
 
-struct	tagTask
+struct	Task
 {
 	WORD		_TaskID;	//任务ID
 	BYTE		TaskGroup;	//任务组别 0-主线
@@ -379,9 +379,9 @@
 	char		Numerical5;	//数据5
 };
 
-//等级开启功能 #tagFuncOpenLV
+//等级开启功能
 
-struct	tagFuncOpenLV
+struct	FuncOpenLV
 {
 	DWORD		_FuncId;	//功能标识
 	DWORD		LimitLV;	//开启等级
@@ -863,7 +863,7 @@
 
 //玩家等级表
 
-struct tagPlayerLV
+struct PlayerLV
 {
 	WORD		_LV;	//玩家等级
 	DWORD		Exp;	//升级所需经验
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/MapServerConfig.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/MapServerConfig.ini
index 79707d2..54f95df 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/MapServerConfig.ini
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/MapServerConfig.ini
@@ -10,11 +10,11 @@
 ;物品rptItem
 PackCnt02=100
 ;垃圾桶(回收站)rptRecycle
-PackCnt03=6
+PackCnt03=0
 ;拆解物品栏rptBreakItem
 PackCnt04=0
 ;仓库rptWarehouse
-PackCnt05=100
+PackCnt05=0
 ;称号背包rptTitle
 PackCnt06=0
 ;合成背包rptCompose
@@ -30,7 +30,7 @@
 ;坐骑背包rptHorse
 PackCnt12=0
 ;万能背包rptAnyWhere 
-PackCnt13=8
+PackCnt13=0
 ;法宝背包rptFabao
 PackCnt14=0
 ;坐骑装备背包rptHorseEquip
@@ -66,12 +66,12 @@
 ;寻宝背包	
 PackCnt30=100
 ;宠物背包
-PackCnt31=50
+PackCnt31=0
 ;神兽物品背包
-PackCnt32=100
+PackCnt32=0
 ;神兽装备背包
-PackCnt33=150
+PackCnt33=0
 ;垃圾分类背包
-PackCnt34=30
+PackCnt34=0
 ;武将英雄背包
 PackCnt35=500
\ No newline at end of file
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index df636c6..5c4acdc 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -324,6 +324,7 @@
 Def_PetBaseEffectList = range(5000, 5007 + 1)
 
 #---------------------------------------------------------------------------
+Def_ItemCount_Max = 2000000000 # 物品最大叠加上限
 #写死的物品ID都放这边
 Def_ItemID_PetSoul = -1                  #宠物满魂
 Def_ItemID_PetDoubleExp = -1             #宠物双倍 
@@ -470,8 +471,8 @@
 
 #虚拟背包最大格子数 功能配置表对应的key
 Def_VPackCnt_Dict = {
-                     ShareDefine.rptRune:'RunePackageNum',
-                     ShareDefine.rptGatherSoul:'GatherSoulPackCount',
+                     #ShareDefine.rptRune:'RunePackageNum',
+                     #ShareDefine.rptGatherSoul:'GatherSoulPackCount',
                      }
 
 def GetItemPackType(itemData, defaultPack=IPY_GameWorld.rptItem):
@@ -923,12 +924,6 @@
 Def_PackCnt_Fashion = 1
 #登陆初始武器时装格子数
 Def_PackCnt_WeaponCoat = 8
-#初始化回收站
-Def_PackCnt_Recycle = 6
-#初始化临时交换背包格子数
-Def_PackCnt_TempSwap = 1
-#初始化临时存放背包格子数
-Def_PackCnt_TempItem = 10
 #玩家脱离战斗状态时间(6秒)
 Def_PlayerLeaveBattleTick = 3000
 #玩家PK多杀间隔
@@ -1143,11 +1138,11 @@
 
 #玩家登陆需要初始化的背包索引                
 Def_PlayerLoginInitPackIndexList = [#主角背包
-                                    IPY_GameWorld.rptRecycle, 
+                                    #IPY_GameWorld.rptRecycle, 
                                     IPY_GameWorld.rptEquip, 
                                     IPY_GameWorld.rptItem, 
                                     #IPY_GameWorld.rptFineSoulSlot,
-                                    IPY_GameWorld.rptAnyWhere, 
+                                    #IPY_GameWorld.rptAnyWhere, 
                                     IPY_GameWorld.rptIdentify, 
                                     #时装背包
                                     #IPY_GameWorld.rptCabinetWeaponCoat, 
@@ -1156,10 +1151,10 @@
                                     #IPY_GameWorld.rptHorseEquip,
                                     ShareDefine.rptTempItem,
                                     ShareDefine.rptTreasure,
-                                    ShareDefine.rptPet,
-                                    ShareDefine.rptDogzItem,
-                                    ShareDefine.rptDogzEquip,
-                                    ShareDefine.rptGarbage,
+                                    #ShareDefine.rptPet,
+                                    #ShareDefine.rptDogzItem,
+                                    #ShareDefine.rptDogzEquip,
+                                    #ShareDefine.rptGarbage,
                                     ShareDefine.rptHero,
                                     ]
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
index b519ecf..3d0c00b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -1069,7 +1069,7 @@
     def DoTransformItem(self, curPlayer, tagItem, event=["", False, {}]):
         ## 将特殊物品转化为对应数值
         itemID = tagItem.GetItemTypeID()
-        itemCount = max(tagItem.GetUserAttr(ShareDefine.Def_IudetItemCount), tagItem.GetCount())
+        itemCount = tagItem.GetCount()
         eventName, isForceEvent, addDict = event
         if isForceEvent:
             pass
@@ -2264,6 +2264,40 @@
         
     return
 
+def CheckGiveBindMoneyTypeItem(curPlayer, checkMoneyType=None):
+    ## 检查给绑定货币的展示物品
+    bindMoneyItemInfo = IpyGameDataPY.GetFuncEvalCfg("PutInItemPack", 2, {})
+    
+    needMoneyItemDict = {}
+    for itemIDStr, moneyType in bindMoneyItemInfo.items():
+        if checkMoneyType != None and moneyType != checkMoneyType:
+            continue
+        if PlayerControl.GetMoney(curPlayer, moneyType): # 有货币时才需要
+            needMoneyItemDict[int(itemIDStr)] = moneyType
+                    
+    if not needMoneyItemDict:
+        #GameWorld.DebugLog("绑定货币显示物品已经都有了")
+        return
+    
+    curPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
+    for i in xrange(curPack.GetCount()):
+        curItem = curPack.GetAt(i)
+        if not curItem or curItem.IsEmpty():
+            continue
+        itemID = curItem.GetItemTypeID()
+        if itemID in needMoneyItemDict:
+            needMoneyItemDict.pop(itemID)
+            if not needMoneyItemDict:
+                break
+            
+    # 还有没给的物品补给,后端只负责给物品,不处理个数,前端对该类物品默认绑定货币对应的值来显示个数
+    for itemID, moneyType in needMoneyItemDict.items():
+        if not GivePlayerItem(curPlayer, itemID, 1, False, [IPY_GameWorld.rptItem]):
+            break
+        GameWorld.DebugLog("给绑定货币显示物品: moneyType=%s,itemID=%s" % (moneyType, itemID))
+        
+    return
+
 def GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, packIndexList=None, event=["", False, {}], setAttrDict=None):
     '''给玩家物品
     @param isAuctionItem: 是否拍品
@@ -2312,7 +2346,7 @@
     
     #常规物品
     isOK = False
-    for _ in range(itemCount/65535 + 1):
+    for _ in range(itemCount/ChConfig.Def_ItemCount_Max + 1):
         if itemCount <= 0:
             break
         giveItem = GetOutPutItemObj(itemID, itemCount, isAuctionItem, curPlayer=curPlayer, setAttrDict=setAttrDict)
@@ -2331,7 +2365,7 @@
     # @return: 给成功总数,0代表给失败了
     
     giveOKCount = 0
-    for _ in range(itemCount/65535 + 1):
+    for _ in range(itemCount/ChConfig.Def_ItemCount_Max + 1):
         if giveOKCount >= itemCount:
             break
         giveItem = GetOutPutItemObj(itemID, itemCount - giveOKCount, isAuctionItem, curPlayer=curPlayer)
@@ -2444,10 +2478,7 @@
 #  @return None
 def SetItemCount(item, cnt, playerID=0, accID=0, playerName=""):
     if not item.IsEmpty():
-        if cnt > 0 and IsPutinAutoTransformItem(item):
-            item.SetUserAttr(ShareDefine.Def_IudetItemCount, min(cnt, ChConfig.Def_UpperLimit_DWord))
-        else:
-            item.SetCount(min(cnt, 65535))
+        item.SetCount(min(cnt, ChConfig.Def_ItemCount_Max))
     else:
         try:
             1 / 0
@@ -2456,10 +2487,7 @@
             GameWorld.ErrLog(errorInfo + str(traceback.extract_stack()) + "\n" + traceback.format_exc())
             raise
         
-def GetItemCount(item):
-    if IsPutinAutoTransformItem(item):
-        return item.GetUserAttr(ShareDefine.Def_IudetItemCount)
-    return item.GetCount()
+def GetItemCount(item): return item.GetCount()
 
 def GetItemNeedPackCount(packType, itemData, itemCount, isAuctionItem=0):
     # 20201223 主干取消拍品有效时长设定
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 a9f3756..850d19e 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
@@ -950,6 +950,7 @@
 
 def GetPackInitCount(packType):
     ## 获取背包类型对应初始格子数
+    initCount = 0
     if packType == IPY_GameWorld.rptItem:
         initCount = IpyGameDataPY.GetFuncCfg("InitBagCellCount", 1)
     elif packType == IPY_GameWorld.rptWarehouse:
@@ -960,7 +961,8 @@
         initCount = IpyGameDataPY.GetFuncCfg("DogzPack", 1)
     elif packType == ShareDefine.rptDogzEquip:
         initCount = IpyGameDataPY.GetFuncCfg("DogzPack", 2)
-    else:
+        
+    if not initCount:
         bagInitCntDict = IpyGameDataPY.GetFuncEvalCfg("InitBagCellCount", 2, {})
         initCount = bagInitCntDict.get(str(packType), 0)
     GameWorld.DebugLog("背包类型初始格子数: packType=%s,initCount=%s" % (packType, initCount))
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 1b2a70b..9c84d58 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -483,8 +483,6 @@
     curPlayer.SetLoginTime(GameWorld.GetCurrentDataTimeStr())
     #初始化玩家背包
     InitPlayerPack(curPlayer)
-    #通知玩家物品信息
-    __Sync_PackDetel(curPlayer)
     
     if GameWorld.IsCrossServer():
         SkillCommon.PlayerLoginMergeServerSkillLogic(curPlayer, tick)
@@ -1482,61 +1480,66 @@
 #@remarks 初始化玩家背包
 def InitPlayerPack(curPlayer) :
     itemManager = curPlayer.GetItemManager()
+
+    #设置装备实际个数,默认最大个数
+    curPack = itemManager.GetPack(IPY_GameWorld.rptEquip)
+    curPack.SetCount(curPack.GetMaxCount())
     
     #初始化玩家背包
     PlayerControl.Init_ItemPack(curPlayer)
     
     #初始化玩家仓库
-    PlayerControl.Init_Warehouse(curPlayer)
+    #PlayerControl.Init_Warehouse(curPlayer)
     
-    #初始化寻宝背包
-    PlayerControl.Init_TreasurePack(curPlayer)
-    
-    #初始化鉴定背包
+    #初始化鉴定背包,默认最大个数用于存放主线掉落
     curPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptIdentify)
-    curPack.SetCount(ItemCommon.GetPackInitCount(IPY_GameWorld.rptIdentify))
+    curPack.SetCount(curPack.GetMaxCount())
     curPack.Sync_PackCanUseCount()
     
     #初始化英雄背包
     PlayerControl.Init_HeroPack(curPlayer)
     
-    #初始化神兽物品背包
-    curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzItem)
-    curPack.SetCount(ItemCommon.GetPackInitCount(ShareDefine.rptDogzItem))
-    curPack.Sync_PackCanUseCount()
-    #初始化神兽装备背包
-    curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzEquip)
-    curPack.SetCount(ItemCommon.GetPackInitCount(ShareDefine.rptDogzEquip))
-    curPack.Sync_PackCanUseCount()
-    #初始化垃圾分类背包
-    curPack = itemManager.GetPack(ShareDefine.rptGarbage)
-    curPack.SetCount(ItemCommon.GetPackInitCount(ShareDefine.rptGarbage))
-    curPack.Sync_PackCanUseCount()
-    
-    #初始化临时交换背包
+    #初始化临时交换背包,默认最大个数
     curPack = itemManager.GetPack(ShareDefine.rptTempSwap)
-    curPack.SetCount(ChConfig.Def_PackCnt_TempSwap)
+    curPack.SetCount(curPack.GetMaxCount())
     
-    #初始化临时存放背包
+    #初始化临时存放背包,默认最大个数
     curPack = itemManager.GetPack(ShareDefine.rptTempItem)
-    curPack.SetCount(ChConfig.Def_PackCnt_TempItem)
-
-    #设置装备实际个数
-    curPack = itemManager.GetPack(IPY_GameWorld.rptEquip)
-    curPack.SetCount(ItemCommon.GetPackInitCount(IPY_GameWorld.rptEquip))
+    curPack.SetCount(curPack.GetMaxCount())
+    
+    #初始化寻宝背包
+    PlayerControl.Init_TreasurePack(curPlayer)
+    
+    #初始化神兽物品背包
+    #curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzItem)
+    #curPack.SetCount(ItemCommon.GetPackInitCount(ShareDefine.rptDogzItem))
+    #curPack.Sync_PackCanUseCount()
+    #初始化神兽装备背包
+    #curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzEquip)
+    #curPack.SetCount(ItemCommon.GetPackInitCount(ShareDefine.rptDogzEquip))
+    #curPack.Sync_PackCanUseCount()
+    #初始化垃圾分类背包
+    #curPack = itemManager.GetPack(ShareDefine.rptGarbage)
+    #curPack.SetCount(ItemCommon.GetPackInitCount(ShareDefine.rptGarbage))
+    #curPack.Sync_PackCanUseCount()
     
     #初始化垃圾桶
     #curPack = itemManager.GetPack(IPY_GameWorld.rptRecycle)
     #curPack.SetCount(ChConfig.Def_PackCnt_Recycle)
         
     #初始化万能背包
-    curPack = itemManager.GetPack(IPY_GameWorld.rptAnyWhere)
-    curPack.SetCount(IPY_GameWorld.Def_AnyWherePackCount)
+    #curPack = itemManager.GetPack(IPY_GameWorld.rptAnyWhere)
+    #curPack.SetCount(IPY_GameWorld.Def_AnyWherePackCount)
 
     #初始化宠物背包
-    curPack = itemManager.GetPack(ShareDefine.rptPet)
-    curPack.SetCount(ItemCommon.GetPackInitCount(ShareDefine.rptPet))
+    #curPack = itemManager.GetPack(ShareDefine.rptPet)
+    #curPack.SetCount(ItemCommon.GetPackInitCount(ShareDefine.rptPet))
     #curPack.Sync_PackCanUseCount()
+    
+    #通知玩家物品信息
+    __Sync_PackDetel(curPlayer)
+    
+    ItemControler.CheckGiveBindMoneyTypeItem(curPlayer)
     return
 
 #---------------------------------------------------------------------
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 020ef1f..623a240 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -3063,7 +3063,8 @@
         msgInfo = {"PlayerID":curPlayer.GetPlayerID(), "MoneyType":priceType, "Value":value, "GiveType":giveType, "AddDataDict":addDataDict}
         GameWorld.SendMsgToClientServer(ShareDefine.CrossServerMsg_GiveMoney, msgInfo, [serverGroupID])
         return True
-        
+    
+    befMoney = GetMoney(curPlayer, priceType)
     if priceType == IPY_GameWorld.TYPE_Price_Gold_Money:
         updPlayerGold = GetMoneyReal(curPlayer, priceType) + value
         if updPlayerGold > ChConfig.Def_PlayerTotalMoney_Gold:
@@ -3130,6 +3131,11 @@
             NotifyCode(curPlayer, "GetMoney", [priceType, value])
     __GiveMoneyAfter(curPlayer, priceType, value, giveType, addDataDict)
     
+    if befMoney == 0:
+        aftMoney = GetMoney(curPlayer, priceType)
+        if aftMoney > 0:
+            ItemControler.CheckGiveBindMoneyTypeItem(curPlayer, priceType)
+            
     return True
 
 def __GiveMoneyAfter(curPlayer, priceType, value, giveType, addDataDict):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index 96f5f8b..dc071ed 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -1780,7 +1780,7 @@
 Def_IudetHeroLineup = 81 # 所在阵容信息列表 [阵容类型*10000+阵型类型*100+位置编号, ...]
 
 Def_IudetItemColor = 16  # 物品颜色,如果该值没有就取物品
-Def_IudetItemCount = 18  # 物品个数,支持20亿,目前仅特殊转化物品会用到
+#Def_IudetItemCount = 18  # 物品个数,支持20亿,目前仅特殊转化物品会用到
 Def_IudetCancelUseLimit = 20  # 物品取消使用限制
 Def_IudetItemLV = 22  # 物品等级,适用于动态物品等级(非物品表配置的固定等级)
 Def_IudetSource = 24  # 物品来源

--
Gitblit v1.8.0