4627 【主干】分解跟升星同时触发有概率扣除失败或者扣除了错误的物品(优化升星扣除装备、材料逻辑)
3个文件已修改
65 ■■■■ 已修改文件
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipStar.py 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py
@@ -1454,7 +1454,7 @@
def __DoEquipStarAutoBuyEquip(curPlayer, queryData, tick):
    ## 升星自动购买
    classLV, equipPlace, curPartStar, equipPackIndex, isAutoBuyPreview, curRate, delEquipIndexList, delItemInfoList, lackItemCostMoney, playerGoldPaper = queryData
    classLV, equipPlace, curPartStar, equipPackIndex, isAutoBuyPreview, curRate, delEquipGUIDDict, delItemInfoDict, lackItemCostMoney, playerGoldPaper = queryData
    GameWorld.DebugLog("升星自动购买装备: classLV=%s, equipPlace=%s, curPartStar=%s, equipPackIndex=%s" % (classLV, equipPlace, curPartStar, equipPackIndex))
    GameWorld.DebugLog("    是否预览 %s, curRate=%s,lackItemCostMoney=%s, playerGoldPaper=%s" % (isAutoBuyPreview, curRate, lackItemCostMoney, playerGoldPaper))
    nextStar = curPartStar + 1
@@ -1616,7 +1616,7 @@
        # 这里认为一定可以购买成功,不对返回值做处理,即使无法购买也认为购买成功,玩家的消耗照常扣除
        __DoPlayerBidAuctionItem(curPlayer, worldAuctionItem.ItemGUID, buyoutPrice, tick, False, funcAutoBuyout=True)
        
    return classLV, equipPlace, curPartStar, equipPackIndex, curRate, delEquipIndexList, delItemInfoList, lackItemCostMoney, buyEquipCostMoney
    return classLV, equipPlace, curPartStar, equipPackIndex, curRate, delEquipGUIDDict, delItemInfoDict, lackItemCostMoney, buyEquipCostMoney
def __SyncEquipStarAutoBuyCostInfo(curPlayer, classLV, equipPlace, curPartStar, curRate, totalCostMoney):
    ## 通知自动购买预览结果
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipStar.py
@@ -84,14 +84,14 @@
    checkCostResult = __CheckCostInfo(curPlayer, classLV, equipPlace, curPartStar, costEquipIndexList, costEquipIDList, itemPack, autoBuy)
    if not checkCostResult:
        return
    curRate, delEquipIndexList, delItemInfoList, lackItemCostMoney = checkCostResult
    curRate, delEquipGUIDDict, delItemInfoDict, lackItemCostMoney = checkCostResult
    
    if autoBuy:
        isAutoBuyPreview = autoBuy == 2
        # 概率未满 且 自动购买, 则需要执行拍卖行购买装备
        if curRate < 100:
            playerGoldPaper = curPlayer.GetGoldPaper()
            queryData = [classLV, equipPlace, curPartStar, equipPackIndex, isAutoBuyPreview, curRate, delEquipIndexList, delItemInfoList, lackItemCostMoney, playerGoldPaper]
            queryData = [classLV, equipPlace, curPartStar, equipPackIndex, isAutoBuyPreview, curRate, delEquipGUIDDict, delItemInfoDict, lackItemCostMoney, playerGoldPaper]
            PlayerAuctionHouse.QueryGameServer_AuctionHouse(playerID, "EquipStarAutoBuy", queryData)
            return
        
@@ -110,16 +110,16 @@
    
    # 升星处理
    buyEquipCostMoney = 0
    __DoEquipStarUp(curPlayer, classLV, equipPlace, curPartStar, equipPackIndex, curRate, delEquipIndexList, delItemInfoList, lackItemCostMoney, buyEquipCostMoney)
    __DoEquipStarUp(curPlayer, classLV, equipPlace, curPartStar, equipPackIndex, curRate, delEquipGUIDDict, delItemInfoDict, lackItemCostMoney, buyEquipCostMoney)
    return
def GameServer_EquipStarAutoBuy(curPlayer, result):
    ## GameServer自动购买拍品结果返回
    classLV, equipPlace, curPartStar, equipPackIndex, curRate, delEquipIndexList, delItemInfoList, lackItemCostMoney, buyEquipCostMoney = result
    __DoEquipStarUp(curPlayer, classLV, equipPlace, curPartStar, equipPackIndex, curRate, delEquipIndexList, delItemInfoList, lackItemCostMoney, buyEquipCostMoney)
    classLV, equipPlace, curPartStar, equipPackIndex, curRate, delEquipGUIDDict, delItemInfoDict, lackItemCostMoney, buyEquipCostMoney = result
    __DoEquipStarUp(curPlayer, classLV, equipPlace, curPartStar, equipPackIndex, curRate, delEquipGUIDDict, delItemInfoDict, lackItemCostMoney, buyEquipCostMoney)
    return
def __DoEquipStarUp(curPlayer, classLV, equipPlace, curPartStar, equipPackIndex, curRate, delEquipIndexList, delItemInfoList, lackItemCostMoney, buyEquipCostMoney):
def __DoEquipStarUp(curPlayer, classLV, equipPlace, curPartStar, equipPackIndex, curRate, delEquipGUIDDict, delItemInfoDict, lackItemCostMoney, buyEquipCostMoney):
    ## 执行装备部位升星
    
    playerID = curPlayer.GetPlayerID()
@@ -137,10 +137,27 @@
                       % (curRate, isOK, lackItemCostMoney, buyEquipCostMoney), playerID)
    
    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
    #扣材料物品
    for indexList, delCount in delItemInfoList:
    #扣材料物品,因为可能还需要先到GameServer,再回MapServer扣除物品,故中间过程物品位置可能发生变化,所以这里不能直接通过index去扣物品,需要重新精确定位
    for delItemID, delCount in delItemInfoDict.items():
        if not delCount:
            continue
        hasEnough, indexList, findItemIsBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(delItemID, itemPack, delCount)
        GameWorld.DebugLog("    扣除道具: delItemID=%s,delCount=%s,indexList=%s" % (delItemID, delCount, indexList))
        ItemCommon.ReduceItem(curPlayer, itemPack, indexList, delCount, True, ChConfig.ItemDel_EquipStarUp)
    ItemCommon.ReduceItem(curPlayer, itemPack, delEquipIndexList, len(delEquipIndexList), True, ChConfig.ItemDel_EquipStarUp)
    delItemByGUIDDict = {}
    for index, itemGUID in delEquipGUIDDict.items():
        delCnt = 1
        curEquip = itemPack.GetAt(index)
        if not ItemCommon.CheckItemCanUse(curEquip) or curEquip.GetGUID() != itemGUID:
            delItemByGUIDDict[itemGUID] = delCnt
            continue
        GameWorld.DebugLog("    扣除装备: index=%s, %s" % (index, itemGUID))
        ItemCommon.DelItem(curPlayer, curEquip, delCnt, recordName=ChConfig.ItemDel_EquipStarUp)
    if delItemByGUIDDict:
        GameWorld.DebugLog("    扣除装备位置错误,通过GUID补扣! %s" % delItemByGUIDDict)
        ItemCommon.DelItemByGUID(curPlayer, itemPack, delItemByGUIDDict, recordName=ChConfig.ItemDel_EquipStarUp)
    drDict = {"PlayerID":playerID, "AccID":curPlayer.GetAccID(), "classLV":classLV, "equipPlace":equipPlace, "IsSuccess":isOK,
              "curRate":curRate, "nextStar":nextStar, 'totalEquipStars':totalEquipStars,
              "lackItemCostMoney":lackItemCostMoney, "buyEquipCostMoney":buyEquipCostMoney}
@@ -191,7 +208,7 @@
    costEquipPlaceList = ipyData.GetCostEquipPlace()
    costEquipColorList = ipyData.GetCostEquipColor()
    isJobLimit = ipyData.GetIsJobLimit()
    delEquipIndexList = []
    delEquipGUIDDict = {}
    totalEquipStars = ChEquip.GetTotalEquipStars(curPlayer)
    
    if not costEquipCnt:
@@ -246,9 +263,9 @@
            addRate = max(minRate, min(addRate, maxRate))
            curRate += addRate
            GameWorld.DebugLog("    本件装备增加概率=%s,当前总概率=%s" % (addRate, curRate))
            delEquipIndexList.append(index)
            delEquipGUIDDict[index] = costEquip.GetGUID()
            
    delItemInfoList = []
    delItemInfoDict = {}
    lackItemCostMoney = 0
    costItemDict = ipyData.GetCostItemDict()
    if costItemDict:
@@ -267,7 +284,7 @@
                GameWorld.DebugLog("    缺少必要物品: itemID=%s,lackMoney(%s)*Count(%s)=%s" % (itemID, itemGoldPaper, lackCnt, itemGoldPaper * lackCnt))
            else:
                delCount = itemCnt
            delItemInfoList.append([indexList, delCount])
            delItemInfoDict[itemID] = delCount
            
    if totalEquipStars < IpyGameDataPY.GetFuncCfg('EquipStarCustomized'):
        curRate = 100
@@ -277,6 +294,6 @@
    if curRate >= IpyGameDataPY.GetFuncCfg("EquipStarRate", 4): # 优化高概率体验
        curRate = 100
        
    return curRate, delEquipIndexList, delItemInfoList, lackItemCostMoney
    return curRate, delEquipGUIDDict, delItemInfoDict, lackItemCostMoney
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py
@@ -1777,6 +1777,22 @@
                               curPlayer.GetPlayerName())
    return
def DelItemByGUID(curPlayer, curItemPack, delItemByGUIDDict, recordName="", saveDataDict={}, isForceDR=False):
    ## 根据物品GUID扣除物品
    for i in xrange(curItemPack.GetCount()):
        curItem = curItemPack.GetAt(i)
        if not CheckItemCanUse(curItem):
            continue
        itemGUID = curItem.GetGUID()
        if itemGUID not in delItemByGUIDDict:
            continue
        delCnt = delItemByGUIDDict.pop(itemGUID)
        DelItem(curPlayer, curItem, delCnt, True, recordName, saveDataDict, isForceDR)
        if not delItemByGUIDDict:
            break
    return
def DelVPackItem(curPlayer, packIndex, placeList, eventName=""):
    ''' 删除虚拟背包物品 '''
    if packIndex not in ShareDefine.Def_VPack_TypeList: