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