From 7183d0b21074403350b355672d2ef2f78159cdb2 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期二, 14 一月 2020 16:26:53 +0800 Subject: [PATCH] 4627 【主干】分解跟升星同时触发有概率扣除失败或者扣除了错误的物品(优化升星扣除装备、材料逻辑) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipStar.py | 45 +++++++++++++++++++++++++++++++-------------- 1 files changed, 31 insertions(+), 14 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipStar.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipStar.py index df20996..20f2fd9 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipStar.py +++ b/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 -- Gitblit v1.8.0