| | |
| | | if showType:
|
| | | useCnt = 1
|
| | |
|
| | | isBind = int(curRoleItem.GetIsBind() or chestsIpyData.GetIsBind()) # 奖励物品是否绑定
|
| | | isBind = int(chestsIpyData.GetIsBind()) # 奖励物品是否绑定
|
| | | costItemID = chestsIpyData.GetCostItemID()
|
| | | costItemCountTotal = chestsIpyData.GetCostItemCount() * useCnt
|
| | | costGoldTotal = chestsIpyData.GetCostGold() * useCnt
|
| | |
| | | awardInfo = GetChestsAwardInfo(curPlayer, chestsItemID, useCnt, exData)
|
| | | if not awardInfo:
|
| | | return
|
| | | needSpaceMax, needSpaceDict, jobAwardItemDict, moneyType, moneyCount, notifyItemList = awardInfo
|
| | | GameWorld.DebugLog(" needSpaceDict=%s,jobAwardItemDict=%s,moneyType=%s,moneyCount=%s,notifyItemList=%s" |
| | | % (needSpaceDict, jobAwardItemDict, moneyType, moneyCount, notifyItemList))
|
| | | needSpaceDict, jobAwardItemList, moneyType, moneyCount, notifyItemList, updOpenCount = awardInfo
|
| | | GameWorld.DebugLog(" needSpaceDict=%s,jobAwardItemList=%s,moneyType=%s,moneyCount=%s,notifyItemList=%s,updOpenCount=%s" |
| | | % (needSpaceDict, jobAwardItemList, moneyType, moneyCount, notifyItemList, updOpenCount))
|
| | |
|
| | | for packType, needSpace in needSpaceDict.items():
|
| | | packSpace = ItemCommon.GetItemPackSpace(curPlayer, packType, needSpace)
|
| | | if packSpace < needSpace:
|
| | | #PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_676165", [packType])
|
| | | PlayerControl.NotifyCode(curPlayer, "OpenBoxItem", [packType, chestsItemID, needSpaceMax - packSpace])
|
| | | PlayerControl.NotifyCode(curPlayer, "OpenBoxItem", [packType, chestsItemID, needSpace - packSpace])
|
| | | return
|
| | |
|
| | | # 扣除消耗
|
| | |
| | | infoDict = {ChConfig.Def_Cost_Reason_SonKey:chestsItemID}
|
| | | PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costGoldTotal, ChConfig.Def_Cost_UseItem, infoDict)
|
| | |
|
| | | saveDataDict = {"AwardItem":jobAwardItemDict}
|
| | | # 更新开启次数
|
| | | if updOpenCount:
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ChestsOpenCount % chestsItemID, updOpenCount)
|
| | | GameWorld.DebugLog(" 更新宝箱开启次数: %s" % updOpenCount)
|
| | | |
| | | saveDataDict = {"AwardItem":jobAwardItemList}
|
| | | ItemCommon.DelItem(curPlayer, curRoleItem, useCnt, True, ChConfig.ItemDel_Chests, saveDataDict)
|
| | |
|
| | | # 给奖励
|
| | | syncItemList = []
|
| | | for itemID, itemCount in jobAwardItemDict.items():
|
| | | for itemID, itemCount in jobAwardItemList:
|
| | | curItem = ItemControler.GetOutPutItemObj(itemID, itemCount, isBind)
|
| | | if not curItem:
|
| | | GameWorld.ErrLog("宝箱创建奖励物品异常!chestsItemID=%s,useCnt=%s,itemID=%s,itemCount=%s,isBind=%s"
|
| | |
| | | def GetChestsAwardInfo(curPlayer, chestsItemID, useCount, exData=0):
|
| | | '''获取宝箱开启奖励
|
| | | @return: None - 获取宝箱奖励失败
|
| | | @return: needSpaceMax, needSpaceDict, jobAwardItemDict{itemID:itemCount, ...}
|
| | | @return: needSpaceDict, jobAwardItemList [[itemID, itemCount], ...]
|
| | | '''
|
| | |
|
| | | awardIpyData = __GetChestsAwardIpyDataByLV(curPlayer, chestsItemID)
|
| | | if not awardIpyData:
|
| | | return
|
| | |
|
| | | needSpaceMax = 0
|
| | | awardItemDict = {}
|
| | | job = curPlayer.GetJob()
|
| | | jobItemList = awardIpyData.GetJobItemList()
|
| | |
| | | if not isSelectOK:
|
| | | GameWorld.ErrLog("选择的物品错误, 该宝箱没有该物品!chestsItemID=%s,selectItemID=%s" % (chestsItemID, selectItemID))
|
| | | return
|
| | | needSpaceMax += 1
|
| | |
|
| | | # 固定产出物品
|
| | | if awardIpyData.GetFixedItemDict():
|
| | | for itemID, itemCount in awardIpyData.GetFixedItemDict().items():
|
| | | needSpaceMax += 1
|
| | | __AddAwardItem(awardItemDict, itemID, itemCount * useCount)
|
| | |
|
| | | # 随机物品库1
|
| | | if awardIpyData.GetRandItemList1() and awardIpyData.GetRandTimeList1():
|
| | | if not __AddChestsRandAwardItem(curPlayer, chestsItemID, useCount, awardItemDict, awardIpyData.GetRandItemList1(), awardIpyData.GetRandTimeList1()):
|
| | | return
|
| | | needSpaceMax += __GetMaxRandTime(awardIpyData.GetRandTimeList1())
|
| | | |
| | | # 根据宝箱开启次数特殊产出
|
| | | updOpenCount = 0
|
| | | randItemList2DoCount = useCount
|
| | | randItemByUseCountDict = awardIpyData.GetRandItemByUseCount()
|
| | | if randItemByUseCountDict:
|
| | | maxOpenCount = max(randItemByUseCountDict)
|
| | | hisOpenCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ChestsOpenCount % chestsItemID)
|
| | | if hisOpenCount < maxOpenCount:
|
| | | updOpenCount = min(hisOpenCount + useCount, maxOpenCount)
|
| | | for specUseCount, randItemList in randItemByUseCountDict.items():
|
| | | if not (hisOpenCount < specUseCount <= updOpenCount):
|
| | | GameWorld.DebugLog(" 不满足特殊次数产出: hisOpenCount=%s,specUseCount=%s,updOpenCount=%s" |
| | | % (hisOpenCount, specUseCount, updOpenCount))
|
| | | continue
|
| | | randItemList2DoCount -= 1
|
| | | randItemInfo = GameWorld.GetResultByRandomList(randItemList)
|
| | | GameWorld.DebugLog(" 根据开启次数特殊产出: specUseCount=%s, %s, randItemList2DoCount=%s" |
| | | % (specUseCount, randItemInfo, randItemList2DoCount))
|
| | | if not randItemInfo:
|
| | | continue
|
| | | if len(randItemInfo) != 2:
|
| | | GameWorld.ErrLog("宝箱开启次数特殊产出随机库配置错误!chestsItemID=%s" % chestsItemID)
|
| | | return
|
| | | itemID, itemCount = randItemInfo
|
| | | if not itemID:
|
| | | continue
|
| | | __AddAwardItem(awardItemDict, itemID, itemCount)
|
| | | |
| | | if randItemList2DoCount != useCount:
|
| | | GameWorld.DebugLog(" 随机物品库2执行次数: %s" % (randItemList2DoCount))
|
| | |
|
| | | # 随机物品库2
|
| | | if awardIpyData.GetRandItemList2() and awardIpyData.GetRandTimeList2():
|
| | | if not __AddChestsRandAwardItem(curPlayer, chestsItemID, useCount, awardItemDict, awardIpyData.GetRandItemList2(), awardIpyData.GetRandTimeList2()):
|
| | | if awardIpyData.GetRandItemList2() and awardIpyData.GetRandTimeList2() and randItemList2DoCount:
|
| | | if not __AddChestsRandAwardItem(curPlayer, chestsItemID, randItemList2DoCount, awardItemDict, awardIpyData.GetRandItemList2(), awardIpyData.GetRandTimeList2()):
|
| | | return
|
| | | needSpaceMax += __GetMaxRandTime(awardIpyData.GetRandTimeList2())
|
| | |
|
| | | # 产出特殊物品广播
|
| | | needNotifyItemList = awardIpyData.GetNeedNotifyItemList()
|
| | |
|
| | | needSpaceDict = {} # {packType:needSpace, ...}
|
| | | notifyItemList = []
|
| | | jobAwardItemDict = {}
|
| | | jobAwardItemList = []
|
| | | for itemID, itemCount in awardItemDict.items():
|
| | | jobItemID = __GetChestsJobItem(chestsItemID, job, itemID, jobItemList)
|
| | | if not jobItemID:
|
| | |
| | | needSpace = int(math.ceil(itemCount / float(itemData.GetPackCount())))
|
| | | needSpaceDict[packType] = needSpaceDict.get(packType, 0) + needSpace
|
| | |
|
| | | jobAwardItemDict[jobItemID] = itemCount
|
| | | # 装备拆开给,需要同步每件装备的属性
|
| | | if ItemCommon.GetIsEquip(itemData):
|
| | | jobAwardItemList.extend([[jobItemID, 1]] * itemCount)
|
| | | else:
|
| | | jobAwardItemList.append([jobItemID, itemCount])
|
| | | if itemID in needNotifyItemList or jobItemID in needNotifyItemList:
|
| | | notifyItemList.append(jobItemID)
|
| | |
|
| | | return needSpaceMax, needSpaceDict, jobAwardItemDict, awardIpyData.GetMoneyType(), awardIpyData.GetMoneyCount() * useCount, notifyItemList
|
| | | return needSpaceDict, jobAwardItemList, awardIpyData.GetMoneyType(), awardIpyData.GetMoneyCount() * useCount, notifyItemList, updOpenCount
|
| | |
|
| | | def __GetMaxRandTime(randTimeList):
|
| | | if len(randTimeList) == 1 and type(randTimeList[0]) == int:
|