3906 【后端】新增宝箱开启规则次数特定定制产出;
增加GM命令重置宝箱开启次数: SetChestsUseCount
4个文件已修改
1个文件已添加
127 ■■■■■ 已修改文件
PySysDB/PySysDBPY.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetChestsUseCount.py 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_Chests.py 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;    //货币数量
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" # 跑环本轮结束奖励记录 参数任务类型
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetChestsUseCount.py
New file
@@ -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
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 # 货币数量
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: