4064 【后端】【主干】直接给玩家的货币类物品优化处理; 2094 邮件发放神兽装备,神兽背包空间不足逻辑错误;
3个文件已修改
93 ■■■■■ 已修改文件
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py 61 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCompensationTube.py 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py
@@ -440,8 +440,8 @@
        if not curItem:
            GameWorld.ErrLog("Store shop item error! shopType=%s,itemID=%s" % (shopType, itemID))
            return
        packType = ShareDefine.rptRune if curItem.GetType() == ChConfig.Def_ItemType_Rune else IPY_GameWorld.rptItem
        needSpace = int(math.ceil(float(itemCnt) / curItem.GetPackCount()))
        packType = ChConfig.GetItemPackType(curItem.GetType())
        needSpace = ItemControler.GetItemNeedPackCount(packType, curItem, itemCnt)
        needPackSpaceDict[packType] = needPackSpaceDict.get(packType, 0) + needSpace
        
        if i == 0:
@@ -515,7 +515,7 @@
        if not curItemObj:
            continue
        userData = curItemObj.GetUserData()
        packType = ShareDefine.rptRune if curItemObj.GetType() == ChConfig.Def_ItemType_Rune else IPY_GameWorld.rptItem
        packType = ChConfig.GetItemPackType(curItemObj.GetType())
        if not itemControl.PutInItem(packType, curItemObj, event=[ChConfig.ItemGive_BuyItem, isForceEvent, dataDict]):
            curItemObj.Clear()
            continue
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -35,6 +35,7 @@
import IpyGameDataPY
import EventShell
import math
#---------------------------------------------------------------------
## 放不下主角背包放入万能背包的逻辑, curGiveItem 要先 SetCount
#  @param curPlayer 当前玩家
@@ -1087,10 +1088,6 @@
    def PutInItem(self, packIndex, tagItem, defaultPile=True, event=["", False, {}]):
        curPlayer = self.__Player
        
        if packIndex != ShareDefine.rptTreasure and self.DoTransformItem(curPlayer, tagItem):
            tagItem.Clear() # 需清除,不然会导致内存泄露   寻宝仓库可暂存直接转化数值的物品
            return True
        isEquip = ItemCommon.CheckItemIsEquip(tagItem)
        if isEquip:
            defaultPile = False # 装备默认不判断堆叠
@@ -1101,10 +1098,22 @@
        
        packIndex = ChConfig.GetItemPackType(curItemData.GetType(), packIndex)
        
        if not self.CanPutInItem(packIndex, tagItem.GetItemTypeID(), tagItem.GetCount(), tagItem.GetIsBind(), defaultPile):
            GameWorld.DebugLog("背包满,不能放入物品 count = %d"%tagItem.GetCount())
        if not self.CanPutInItem(packIndex, tagItem.GetItemTypeID(), GetItemCount(tagItem), tagItem.GetIsBind(), defaultPile):
            GameWorld.DebugLog("背包满,不能放入物品 count = %d"%GetItemCount(tagItem))
            tagItem.Clear()
            return False
        itemID = tagItem.GetItemTypeID()
        if itemID in ChConfig.Def_TransformItemIDList:
            # 直接转化为对应货币的物品仅在放入背包时直接转化,否则还是以真实物品的形式存在,但堆叠上限需要做特殊处理
            if packIndex == IPY_GameWorld.rptItem:
                self.DoTransformItem(curPlayer, tagItem)
                tagItem.Clear() # 需清除,不然会导致内存泄露
                return True
            defaultPile = True
            maxPackCount = ChConfig.Def_UpperLimit_DWord # 转化物品叠加上限不取物品表的, 暂定堆叠上限20亿
        else:
            maxPackCount = curItemData.GetPackCount()
        
        # 虚拟背包, 默认不做叠加
        if packIndex in ShareDefine.Def_VPack_TypeList:
@@ -1141,9 +1150,9 @@
                if item.GetIsLocked() == True:
                    continue
                
                packItemCount = item.GetCount()
                curItemCount = tagItem.GetCount()
                canPutinCount = tagItem.GetPackCount() - packItemCount
                packItemCount = GetItemCount(item)
                curItemCount = GetItemCount(tagItem)
                canPutinCount = maxPackCount - packItemCount
                if canPutinCount <= 0:
                    continue    
                #可以摆放
@@ -1179,9 +1188,9 @@
            if item.IsEmpty() != True:
                continue
            
            packItemCount = item.GetCount() # Ϊ0
            curItemCount = tagItem.GetCount()
            canPutinCount = tagItem.GetPackCount() - packItemCount
            packItemCount = GetItemCount(item) # Ϊ0
            curItemCount = GetItemCount(tagItem)
            canPutinCount = maxPackCount - packItemCount
            if canPutinCount <= 0:
                continue
            #可以摆放
@@ -1213,7 +1222,7 @@
                putResult = True
                
                if isNeedRecord:
                    itemNoteDict = ItemCommon.GetItemNoteDict(item, curItemCount, packItemCount, item.GetCount())
                    itemNoteDict = ItemCommon.GetItemNoteDict(item, curItemCount, packItemCount, GetItemCount(item))
                    ItemCommon.DR_GetItem(curPlayer, packIndex, eventName, itemNoteDict, addDict)
                break
                                                
@@ -1294,9 +1303,11 @@
            return False, 0 
        
        if curItemID in ChConfig.Def_TransformItemIDList:
            #特殊物品无需判断数量
            # 货币直接转换的物品如果是放入背包的则直接转化,无需暂用格子
            if packIndex == IPY_GameWorld.rptItem:
            return True, 0
            maxPackCount = ChConfig.Def_UpperLimit_DWord # 转化物品叠加上限不取物品表的, 暂定堆叠上限20亿
        else:
        maxPackCount = curItemData.GetPackCount()
        
        if maxPackCount == 0:
@@ -1322,7 +1333,7 @@
        
        itemIndex = -1
        curPack = self.__PlayerItemManager.GetPack(packIndex)
        for i in range(0, curPack.GetCount()):
        for i in xrange(curPack.GetCount()):
            item = curPack.GetAt(i)
            if item.IsEmpty():
@@ -1336,10 +1347,10 @@
                        continue
    
                    if (CanPackItemByItemType(item.GetItemTypeID(), item.GetIsBind(), curItemID, isBind) and
                        maxPackCount > item.GetCount()):
                        maxPackCount > GetItemCount(item)):
                        #该物品锁定不执行==============================================
                        #可堆叠
                        maxCanPutItem += maxPackCount - item.GetCount()
                        maxCanPutItem += maxPackCount - GetItemCount(item)
                        if itemIndex == -1:
                            itemIndex = i
            
@@ -2209,6 +2220,20 @@
            GameWorld.ErrLog(errorInfo + str(traceback.extract_stack()) + "\n" + traceback.format_exc())
            raise
def GetItemCount(item):
    if item.GetItemTypeID() in ChConfig.Def_TransformItemIDList:
        return item.GetUserAttr(ShareDefine.Def_IudetItemCount)
    return item.GetCount()
def GetItemNeedPackCount(packType, itemData, itemCount):
    if itemData.GetItemTypeID() in ChConfig.Def_TransformItemIDList:
        # 货币直接转换的物品如果是放入背包的则不需要暂用格子,放入其他的背包的则按物品叠加上限算
        if packType == IPY_GameWorld.rptItem:
            return 0
        packCount = ChConfig.Def_UpperLimit_DWord # 转化物品叠加上限不取物品表的
    else:
        packCount = itemData.GetPackCount()
    return int(math.ceil(itemCount / float(packCount)))
## 双手武器,需要两只手才拿得动
#  @param curEquip
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCompensationTube.py
@@ -68,9 +68,8 @@
        GameWorld.DebugLog("    PlayerID %s no found "%curPackData.PlayerID)
        return
    
    needPackSpaceDict = {}
    isPackSpaceEnough = True
    commPackItemCount = 0 # 常规背包物品个数
    RuneItemCount = 0 # 符印物品个数
    # 先汇总物品所属背包
    for i in xrange(curPackData.Count):
        curPackItem = curPackData.Items[i]
@@ -78,24 +77,17 @@
        curItemData = GameWorld.GetGameData().GetItemByTypeID(itemID)
        if not curItemData:
            continue
        if curItemData.GetType() in [ChConfig.Def_ItemType_Rune, ChConfig.Def_ItemType_RuneExp]:
            RuneItemCount += curPackItem.Count
        else:
            commPackItemCount += 1
            
    if isPackSpaceEnough and RuneItemCount > 0:
        packSpace = ItemCommon.GetItemPackSpace(curPlayer, ShareDefine.rptRune, RuneItemCount)
        if packSpace < RuneItemCount:
            isPackSpaceEnough = False
            GameWorld.DebugLog("    符印背包空间不足, RuneItemCount=%s > packSpace=%s" % (RuneItemCount, packSpace))
            PlayerControl.NotifyCode(curPlayer, "RuneBagFull")
        packType = ChConfig.GetItemPackType(curItemData.GetType())
        needSpace = ItemControler.GetItemNeedPackCount(packType, curItemData, curPackItem.Count)
        needPackSpaceDict[packType] = needPackSpaceDict.get(packType, 0) + needSpace
    
    if isPackSpaceEnough and commPackItemCount > 0:
        itemPackSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, commPackItemCount)
        if itemPackSpace < commPackItemCount:
    GameWorld.DebugLog("    needPackSpaceDict=%s" % str(needPackSpaceDict))
    for packType, needSpace in needPackSpaceDict.items():
        if needSpace > ItemCommon.GetItemPackSpace(curPlayer, packType, needSpace):
            PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_676165", [packType])
            isPackSpaceEnough = False
            GameWorld.DebugLog("    背包空间不足, commPackItemCount=%s > itemPackSpace=%s" % (commPackItemCount, itemPackSpace))
            PlayerControl.NotifyCode(curPlayer, "BagFull")
            break
            
    #背包空间不足
    if not isPackSpaceEnough: