From ba9ac7c41060991bf34d8cad6db8f255561b712c Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期四, 27 九月 2018 18:45:42 +0800 Subject: [PATCH] 3906 【后端】新增宝箱开启规则次数特定定制产出; 增加GM命令重置宝箱开启次数: SetChestsUseCount --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_Chests.py | 48 ++++++++++++++-- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetChestsUseCount.py | 73 ++++++++++++++++++++++++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py | 3 + PySysDB/PySysDBPY.h | 1 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 2 5 files changed, 121 insertions(+), 6 deletions(-) diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h index 75d16ee..a4f34ce 100644 --- a/PySysDB/PySysDBPY.h +++ b/PySysDB/PySysDBPY.h @@ -982,6 +982,7 @@ list RandTimeList1; //随机次数饼图列表1 list RandItemList2; //随机物品饼图列表2 list RandTimeList2; //随机次数饼图列表2 + dict RandItemByUseCount; //宝箱开启X次对应特殊产出,与饼图列表2互斥 list JobItemList; //职业物品列表 BYTE MoneyType; //货币类型 DWORD MoneyCount; //货币数量 diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py index 3f66de6..e05a9b9 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py @@ -3498,6 +3498,8 @@ Def_PDict_DownloadAwardState = "DownloadAwardState" # 分支下载奖励状态 0-未领 1-已领 +Def_PDict_ChestsOpenCount = "ChestsOpenCount_%s" # 宝箱已开启次数, 参数(宝箱ID), 只有有开启次数额外奖励的才会记录 + # 跑环 Def_PDict_RunTaskAwardState = "RunTaskAwardState_%s" # 是否已领取跑环本轮结束奖励 参数任务类型 Def_PDict_RunTaskAwardRecord = "RunTaskAwardRecord_%s" # 跑环本轮结束奖励记录 参数任务类型 diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetChestsUseCount.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetChestsUseCount.py new file mode 100644 index 0000000..4400f24 --- /dev/null +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetChestsUseCount.py @@ -0,0 +1,73 @@ +#!/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 + + + diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py index cd11c50..5e1a31c 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py @@ -797,6 +797,7 @@ ("list", "RandTimeList1", 0), ("list", "RandItemList2", 0), ("list", "RandTimeList2", 0), + ("dict", "RandItemByUseCount", 0), ("list", "JobItemList", 0), ("BYTE", "MoneyType", 0), ("DWORD", "MoneyCount", 0), @@ -2607,6 +2608,7 @@ self.RandTimeList1 = [] self.RandItemList2 = [] self.RandTimeList2 = [] + self.RandItemByUseCount = {} self.JobItemList = [] self.MoneyType = 0 self.MoneyCount = 0 @@ -2621,6 +2623,7 @@ 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 # 货币数量 diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_Chests.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_Chests.py index d6572d0..9802a91 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_Chests.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_Chests.py @@ -62,9 +62,9 @@ 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) @@ -79,6 +79,11 @@ 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) @@ -157,9 +162,40 @@ 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 # 产出特殊物品广播 @@ -185,7 +221,7 @@ 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: -- Gitblit v1.8.0