3906 【后端】新增宝箱开启规则次数特定定制产出;
增加GM命令重置宝箱开启次数: SetChestsUseCount
| | |
| | | list RandTimeList1; //随机次数饼图列表1
|
| | | list RandItemList2; //随机物品饼图列表2
|
| | | list RandTimeList2; //随机次数饼图列表2
|
| | | dict RandItemByUseCount; //宝箱开启X次对应特殊产出,与饼图列表2互斥
|
| | | list JobItemList; //职业物品列表
|
| | | BYTE MoneyType; //货币类型
|
| | | DWORD MoneyCount; //货币数量
|
| | |
| | |
|
| | | Def_PDict_DownloadAwardState = "DownloadAwardState" # 分支下载奖励状态 0-未领 1-已领
|
| | |
|
| | | Def_PDict_ChestsOpenCount = "ChestsOpenCount_%s" # 宝箱已开启次数, 参数(宝箱ID), 只有有开启次数额外奖励的才会记录
|
| | |
|
| | | # 跑环
|
| | | Def_PDict_RunTaskAwardState = "RunTaskAwardState_%s" # 是否已领取跑环本轮结束奖励 参数任务类型
|
| | | Def_PDict_RunTaskAwardRecord = "RunTaskAwardRecord_%s" # 跑环本轮结束奖励记录 参数任务类型
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #-------------------------------------------------------------------------------
|
| | | #
|
| | | ##@package GM.Commands.SetChestsUseCount
|
| | | #
|
| | | # @todo:设置宝箱开启次数
|
| | | # @author hxp
|
| | | # @date 2018-09-27
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 设置宝箱开启次数
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2018-09-27 19:00"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | import PlayerControl
|
| | | import IpyGameDataPY
|
| | | import GameWorld
|
| | | import ChConfig
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | | #逻辑实现
|
| | |
|
| | | ## GM命令执行入口
|
| | | # @param curPlayer 当前玩家
|
| | | # @param msgList 参数列表
|
| | | # @return None
|
| | | # @remarks 函数详细说明.
|
| | | def OnExec(curPlayer, msgList):
|
| | | if not msgList:
|
| | | GameWorld.DebugAnswer(curPlayer, "SetChestsUseCount 宝箱ID 次数")
|
| | | GameWorld.DebugAnswer(curPlayer, "重置所有: SetChestsUseCount 0")
|
| | | return
|
| | | |
| | | if len(msgList) == 1 and not msgList[0]:
|
| | | resetIDList = []
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | for i in xrange(ipyDataMgr.GetChestsAwardCount()):
|
| | | ipyData = ipyDataMgr.GetChestsAwardByIndex(i)
|
| | | chestsItemID = ipyData.GetChestsItemID()
|
| | | if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ChestsOpenCount % chestsItemID):
|
| | | continue
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ChestsOpenCount % chestsItemID, 0)
|
| | | resetIDList.append(chestsItemID)
|
| | | |
| | | GameWorld.DebugAnswer(curPlayer, "重置OK: %s" % resetIDList)
|
| | | return
|
| | | |
| | | isNeedRecord = False
|
| | | chestsItemID = msgList[0]
|
| | | awardIpyDataList = IpyGameDataPY.GetIpyGameDataList("ChestsAward", chestsItemID)
|
| | | if not awardIpyDataList:
|
| | | GameWorld.DebugAnswer(curPlayer, "没有该宝箱产出配置:%s" % chestsItemID)
|
| | | return
|
| | | |
| | | for ipyData in awardIpyDataList:
|
| | | if ipyData.GetRandItemByUseCount():
|
| | | isNeedRecord = True
|
| | | break
|
| | | |
| | | if not isNeedRecord:
|
| | | GameWorld.DebugAnswer(curPlayer, "没有配置开启次数特殊产出:%s" % chestsItemID)
|
| | | return
|
| | | |
| | | useCount = msgList[1] if len(msgList) > 1 else 0
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ChestsOpenCount % chestsItemID, useCount)
|
| | | GameWorld.DebugAnswer(curPlayer, "设置宝箱开启次数(%s)=%s" % (chestsItemID, useCount))
|
| | | return
|
| | |
|
| | |
|
| | |
|
| | |
| | | ("list", "RandTimeList1", 0),
|
| | | ("list", "RandItemList2", 0),
|
| | | ("list", "RandTimeList2", 0),
|
| | | ("dict", "RandItemByUseCount", 0),
|
| | | ("list", "JobItemList", 0),
|
| | | ("BYTE", "MoneyType", 0),
|
| | | ("DWORD", "MoneyCount", 0),
|
| | |
| | | self.RandTimeList1 = []
|
| | | self.RandItemList2 = []
|
| | | self.RandTimeList2 = []
|
| | | self.RandItemByUseCount = {}
|
| | | self.JobItemList = []
|
| | | self.MoneyType = 0
|
| | | self.MoneyCount = 0
|
| | |
| | | def GetRandTimeList1(self): return self.RandTimeList1 # 随机次数饼图列表1
|
| | | def GetRandItemList2(self): return self.RandItemList2 # 随机物品饼图列表2
|
| | | def GetRandTimeList2(self): return self.RandTimeList2 # 随机次数饼图列表2
|
| | | def GetRandItemByUseCount(self): return self.RandItemByUseCount # 宝箱开启X次对应特殊产出,与饼图列表2互斥
|
| | | def GetJobItemList(self): return self.JobItemList # 职业物品列表
|
| | | def GetMoneyType(self): return self.MoneyType # 货币类型
|
| | | def GetMoneyCount(self): return self.MoneyCount # 货币数量
|
| | |
| | | awardInfo = GetChestsAwardInfo(curPlayer, chestsItemID, useCnt, exData)
|
| | | if not awardInfo:
|
| | | return
|
| | | needSpaceDict, jobAwardItemDict, moneyType, moneyCount, notifyItemList = awardInfo
|
| | | GameWorld.DebugLog(" needSpaceDict=%s,jobAwardItemDict=%s,moneyType=%s,moneyCount=%s,notifyItemList=%s" |
| | | % (needSpaceDict, jobAwardItemDict, moneyType, moneyCount, notifyItemList))
|
| | | needSpaceDict, jobAwardItemDict, moneyType, moneyCount, notifyItemList, updOpenCount = awardInfo
|
| | | GameWorld.DebugLog(" needSpaceDict=%s,jobAwardItemDict=%s,moneyType=%s,moneyCount=%s,notifyItemList=%s,updOpenCount=%s" |
| | | % (needSpaceDict, jobAwardItemDict, moneyType, moneyCount, notifyItemList, updOpenCount))
|
| | |
|
| | | for packType, needSpace in needSpaceDict.items():
|
| | | packSpace = ItemCommon.GetItemPackSpace(curPlayer, packType, needSpace)
|
| | |
| | | if costGoldTotal:
|
| | | infoDict = {ChConfig.Def_Cost_Reason_SonKey:chestsItemID}
|
| | | PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costGoldTotal, ChConfig.Def_Cost_UseItem, infoDict)
|
| | | |
| | | # 更新开启次数
|
| | | if updOpenCount:
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ChestsOpenCount % chestsItemID, updOpenCount)
|
| | | GameWorld.DebugLog(" 更新宝箱开启次数: %s" % updOpenCount)
|
| | |
|
| | | saveDataDict = {"AwardItem":jobAwardItemDict}
|
| | | ItemCommon.DelItem(curPlayer, curRoleItem, useCnt, True, ChConfig.ItemDel_Chests, saveDataDict)
|
| | |
| | | if not __AddChestsRandAwardItem(curPlayer, chestsItemID, useCount, awardItemDict, awardIpyData.GetRandItemList1(), awardIpyData.GetRandTimeList1()):
|
| | | return
|
| | |
|
| | | # 根据宝箱开启次数特殊产出
|
| | | 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
|
| | |
|
| | | # 产出特殊物品广播
|
| | |
| | | if itemID in needNotifyItemList or jobItemID in needNotifyItemList:
|
| | | notifyItemList.append(jobItemID)
|
| | |
|
| | | return needSpaceDict, jobAwardItemDict, awardIpyData.GetMoneyType(), awardIpyData.GetMoneyCount() * useCount, notifyItemList
|
| | | return needSpaceDict, jobAwardItemDict, awardIpyData.GetMoneyType(), awardIpyData.GetMoneyCount() * useCount, notifyItemList, updOpenCount
|
| | |
|
| | | def __GetMaxRandTime(randTimeList):
|
| | | if len(randTimeList) == 1 and type(randTimeList[0]) == int:
|