From 3bc2e9aae7e595d5be896a9db4c909b76fa6f5be Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期五, 11 七月 2025 14:16:29 +0800
Subject: [PATCH] 0312 物品叠加数量支持配置DWORD
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py | 211 +++++++++++-----------------------------------------
1 files changed, 45 insertions(+), 166 deletions(-)
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 2ea5c7d..3d0c00b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -879,8 +879,6 @@
#itemColor = curItem.GetItemColor()
result = self.SwitchEquip(curItem, equipPackIndex)
if result:
- #穿戴某阶某品质的装备成就
- PlayerSuccess.DoEquipSuccessLogic(curPlayer, classLV)
#换装宝石处理
Operate_EquipStone.DoMoveEquipStone(curPlayer, equipPackIndex)
dataDict = {'dotype':'EquipItem', 'desItemID':desItemID, 'desUserData':desUserData,'srcItemID':srcItemID,'srcUserData':srcUserData}
@@ -1071,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
@@ -2266,7 +2264,41 @@
return
-def GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, packIndexList=None, event=["", False, {}]):
+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: 是否拍品
'''
@@ -2301,19 +2333,11 @@
#不可放入
return False
- #定制物品
- if GetAppointItemRealID(itemID):
- isOK = False
- for _ in xrange(itemCount):
- if GivePlayerAppointItem(curPlayer, itemID, isAuctionItem, event):
- isOK = True # 只要有成功的就返回成功,防止异常情况失败可能导致被刷
- return isOK
-
#装备
if ItemCommon.GetIsEquip(curItemData):
isOK = False
for _ in xrange(itemCount):
- outPutEquip = GetOutPutItemObj(itemID, 1, isAuctionItem, curPlayer=curPlayer)
+ outPutEquip = GetOutPutItemObj(itemID, 1, isAuctionItem, curPlayer=curPlayer, setAttrDict=setAttrDict)
if not outPutEquip:
return isOK
if DoLogic_PutItemInPack(curPlayer, outPutEquip, event, packIndexList):
@@ -2322,10 +2346,10 @@
#常规物品
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)
+ giveItem = GetOutPutItemObj(itemID, itemCount, isAuctionItem, curPlayer=curPlayer, setAttrDict=setAttrDict)
if not giveItem:
return isOK
giveCount = GetItemCount(giveItem)
@@ -2341,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)
@@ -2358,110 +2382,6 @@
giveOKCount += curCount
return giveOKCount
-
-def GivePlayerAppointItem(curPlayer, appointID, isAuctionItem, event=["", False, {}]):
- '''给玩家定制物品表物品,定制物品默认个数1
- @param appointID 定制表ID
- @param isAuctionItem 是否拍品
- '''
- itemDictData = GetAppointItemDictData(appointID, isAuctionItem)
- if not itemDictData:
- return False
-
- return GivePlayerEquip(curPlayer, itemDictData, event=event)
-
-def GetAppointItemDictData(appointID, isAuctionItem):
- '''获取定制表物品数据,定制物品默认个数1
- @param appointID 定制表ID
- @param isAuctionItem 是否拍品
- '''
- itemID = GetAppointItemRealID(appointID)
- if not itemID:
- return {}
- ipyData = IpyGameDataPY.GetIpyGameData("AppointItem", appointID)
- if not ipyData:
- return {}
- itemDictData = {}
-
- itemDictData['legendAttrID'] = ipyData.GetLegendAttrID()
- itemDictData['legendAttrValue'] = ipyData.GetLegendAttrValue()
- itemDictData['ItemID'] = itemID
- itemDictData['CancelUseLimit'] = ipyData.GetCancelUseLimit()
-
- itemDictData['IsAuctionItem'] = isAuctionItem
-
- return itemDictData
-
-def GetAppointItemRealID(itemID):
- '''获取定制物品对应的真实物品ID'''
- curItem = GameWorld.GetGameData().GetItemByTypeID(itemID)
- if not curItem:
- return 0
- curEff = curItem.GetEffectByIndex(0)
- curEffID = curEff.GetEffectID()
- if curEffID != ChConfig.Def_Effect_AppointItem:
- return 0
- return curEff.GetEffectValue(0)
-
-## 根据物品data字典给玩家装备/翅膀
-# @param curPlayer:玩家实例
-# @param itemData:物品数据
-# @param packType:背包类型
-# @param defaultPile 默认先判断是否能进行物品堆叠
-# @return None
-def GivePlayerEquip(curPlayer, itemData, event=["", False, {}], packType=[IPY_GameWorld.rptItem, IPY_GameWorld.rptAnyWhere],
- defaultPile=True):
- equipItem = GetItemByData(itemData)
- #将物品放入背包
- return DoLogic_PutItemInPack(curPlayer, equipItem, event, packType, defaultPile)
-
-
-## 根据物品data字典创建物品
-# @param itemData:物品数据
-# @return ItemObj
-def GetItemByData(itemData):
- if not itemData:
- return
-
- itemID = int(itemData.get('ItemID', 0))
- isAuctionItem = int(itemData.get('IsAuctionItem', 0))
- equipItem = ItemCommon.CreateSingleItem(itemID, isAuctionItem=isAuctionItem)
- if not equipItem:
- return
-
- tmpEquipData = SingleEquipTmpData()
-
- #tmpEquipData.starLV = int(itemData.get('StarLV', '0'))
- #tmpEquipData.holeCnt = int(itemData.get('HoleCount', '0'))
- #tmpEquipData.stoneData = eval(itemData.get('StoneData', '[]'))
- tmpEquipData.isBind = isAuctionItem
- #tmpEquipData.isSuite = int(itemData.get('IsSuit', '0'))
- #tmpEquipData.suiteLV = int(itemData.get('SuiteLV', '0'))
- #if tmpEquipData.suiteLV:
- # tmpEquipData.isSuite = 1
- tmpEquipData.source = int(itemData.get('Source', str(ShareDefine.Item_Source_Unkown)))
-
- tmpEquipData.legendAttrIDList = itemData.get('legendAttrID', [])
- tmpEquipData.legendAttrValueList = itemData.get('legendAttrValue', [])
-
- # 装备附加属性
- ChItem.EquipAddAdditionEx(equipItem, tmpEquipData)
-
- if "UserData" in itemData:
- userData = itemData["UserData"]
- ItemCommon.SetItemUserData(equipItem, userData)
-
- if "EquipGS" in itemData:
- equipGS = int(itemData["EquipGS"])
- ItemCommon.SetEquipGearScore(equipItem, equipGS)
-
-
- # 取消等级限制
- if itemData.get('CancelUseLimit', 0):
- equipItem.SetUserAttr(ShareDefine.Def_IudetCancelUseLimit, 1)
-
- return equipItem
-
#---------------------------------------------------------------------
## 执行物品放入背包逻辑
@@ -2558,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
@@ -2570,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 主干取消拍品有效时长设定
@@ -2643,52 +2557,17 @@
#---无空位置,替换---
return placeList[0]
-def GetOutPutItemObj(itemID, itemCount=1, isAuctionItem=False, expireTime=0, curPlayer=None, isAllAttr=False):
+def GetOutPutItemObj(itemID, itemCount=1, isAuctionItem=False, expireTime=0, curPlayer=None, setAttrDict=None):
''' 获取功能产出的物品实例
@param isAuctionItem: 是否拍品,默认非拍品
@param expireTime: 有效时间,时间单位由时效类型决定
@param curPlayer: 产出该物品时的玩家,物品某些属性由玩家等级决定,如传奇属性
- @param isAllAttr: 是否生成该装备所有属性,GM创建物品时用,需验证相关权限
+ @param setAttrDict: 直接设置物品的属性 {key:value, ...} key支持 ShareDefine.Def_IudetXXX字符串 或 自定key
'''
- curItem = ItemCommon.CreateSingleItem(itemID, itemCount, isAuctionItem, expireTime)
+ curItem = ItemCommon.CreateSingleItem(itemID, itemCount, isAuctionItem, expireTime, curPlayer, setAttrDict)
if not curItem:
GameWorld.ErrLog("产出物品异常,无法创建物品 = %s" % (itemID))
return
-
- # 英雄
- if curItem.GetType() == ChConfig.Def_ItemType_Hero:
- return curItem
-
- # 非装备,无需设置属性
- if not ItemCommon.CheckItemIsEquip(curItem):
- return curItem
-
- # 定制物品
- if GetAppointItemRealID(itemID):
- curItem.Clear()
- #GameWorld.DebugLog("清除给定制物品之前已经创建的物品ID=%s" % itemID)
- return GetItemByData(GetAppointItemDictData(itemID, isAuctionItem))
-
-# # 拍品不处理其他属性
-# if isAuctionItem:
-# return curItem
-
- tmpEquipData = SingleEquipTmpData()
-
- # 传奇属性
- legendAttrInfo = GetAddEquipLegendAttr(curItem, curPlayer, isAllAttr)
- if legendAttrInfo:
- tmpEquipData.legendAttrIDList = legendAttrInfo[0]
- tmpEquipData.legendAttrValueList = legendAttrInfo[1]
- tmpEquipData.legendAttrIDListShen = legendAttrInfo[2]
- tmpEquipData.legendAttrValueListShen = legendAttrInfo[3]
- tmpEquipData.legendAttrIDListXian = legendAttrInfo[4]
- tmpEquipData.legendAttrValueListXian = legendAttrInfo[5]
- tmpEquipData.legendAttrIDListJi = legendAttrInfo[6]
- tmpEquipData.legendAttrValueListJi = legendAttrInfo[7]
-
- # 其他装备属性
- ChItem.EquipAddAdditionEx(curItem, tmpEquipData)
return curItem
def GetAddEquipLegendAttr(curItem, curPlayer, isAllAttr=False):
--
Gitblit v1.8.0