349 【配套功能】功能预告-服务端(功能开启增加主线关卡进度条件)
4个文件已修改
104 ■■■■ 已修改文件
PySysDB/PySysDBPY.h 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/OpenFunc.py 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h
@@ -557,6 +557,7 @@
    WORD        LimiRealmLV;    //需要境界等级
    DWORD        LimitMissionID;    //需要完成的任务ID
    WORD        LimitOpenDay;    //开服第几天开启
    WORD        LimitManLevel;    //关卡进度波
    char        MailKey;    //邮件
    list        AwardList;    //奖励列表[[物品ID,个数], ...]
};
@@ -1452,17 +1453,6 @@
{
    BYTE        _DayID;    //天数
    dict        Reward;    //奖励 {"职业":[[物品ID,个数],...], ...}
};
//七天限时特惠表
struct tagSpringSale
{
    BYTE        _GiftID;    //礼包ID
    BYTE        SellDay;    //创角第几天上架
    BYTE        BuyNumLimit;    //每人限购数量
    WORD        GiftPrice;    //礼包价格,仙玉
    list        GiftItemList;    //礼包物品信息列表[[物品ID,个数,是否绑定], ...]
};
//充值商品编号表
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/OpenFunc.py
@@ -89,10 +89,10 @@
        openFuncIDList = [openFuncID]
        
    if openFuncIDList:
        needLV, needRealmLV, needMissionIDList = __GetOpenFuncLimit(curPlayer, openFuncIDList)
        needLV, needRealmLV, needMissionIDList, needMainLevel = __GetOpenFuncLimit(curPlayer, openFuncIDList)
        if needRealmLV:
            openFuncIDList.append(ShareDefine.GameFuncID_Official)
    needLV, needRealmLV, needMissionIDList = __GetOpenFuncLimit(curPlayer, openFuncIDList)
    needLV, needRealmLV, needMissionIDList, needMainLevel = __GetOpenFuncLimit(curPlayer, openFuncIDList)
    
    GameWorld.DebugLog("GM处理等级开启功能: openFuncID=%s,openFuncIDList=%s,needLV=%s" % (openFuncID, openFuncIDList, needLV), curPlayer.GetPlayerID())
    
@@ -121,7 +121,9 @@
        if not curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_MissionFinish % limitMissionID):
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_MissionFinish % limitMissionID, 1)
            
    GameWorld.DebugLog("GM处理任务开启功能: needMissionIDList=%s" % needMissionIDList, curPlayer.GetPlayerID())
    if needMainLevel:
        PlayerControl.SetMainLevelPassValue(curPlayer, needMainLevel)
    GameWorld.DebugLog("GM处理任务开启功能: needMissionIDList=%s,needMainLevel=%s" % (needMissionIDList, needMainLevel), curPlayer.GetPlayerID())
    #最后强制触发一次
    GameFuncComm.DoFuncOpenLogic(curPlayer, checkServerDay=False)
    return
@@ -131,6 +133,7 @@
    needLV = 0
    needRealmLV = 0
    needMissionIDList = []
    needMainLevel = 0
    
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    funcOpenLVCount = ipyDataMgr.GetFuncOpenLVCount()
@@ -151,7 +154,12 @@
        limitMissionID = ipyData.GetLimitMissionID()
        if limitMissionID and limitMissionID not in needMissionIDList:
            needMissionIDList.append(limitMissionID)
    return needLV, needRealmLV, needMissionIDList
        limitManLevel = ipyData.GetLimitManLevel()
        if limitManLevel and needMainLevel < limitManLevel:
            needMainLevel = limitManLevel
    return needLV, needRealmLV, needMissionIDList, needMainLevel
def DoGMCloseFunc(curPlayer, closeFuncID):
    ## GM关闭功能
@@ -163,10 +171,13 @@
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_GameFuncFirstTouch % keyNum, 0)
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_GameFuncAwardState % keyNum, 0)
            
        needLV, needRealmLV, needMissionIDList = __GetOpenFuncLimit(curPlayer, [])
        needLV, needRealmLV, needMissionIDList, needMainLevel = __GetOpenFuncLimit(curPlayer, [])
        for missionID in needMissionIDList:
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_MissionFinish % missionID, 0)
        if needMainLevel:
            PlayerControl.SetMainLevelPassInfo(curPlayer, 1, 1, 0)
        GameFuncComm.Sync_FuncOpenState(curPlayer, isSyncUnOpen=True)
        GameWorld.DebugAnswer(curPlayer, "关闭所有功能!")
        return
@@ -191,8 +202,36 @@
    limitMissionID = ipyData.GetLimitMissionID()
    if limitMissionID:
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_MissionFinish % limitMissionID, 0)
    limitManLevel = ipyData.GetLimitManLevel()
    if limitManLevel and PlayerControl.GetMainLevelPassValue(curPlayer) >= limitManLevel:
        __SetPassMainLevelWavePre(curPlayer)
    GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_GameFuncFirstTouch, closeFuncID, 0)
    GameFuncComm.Sync_FuncOpenState(curPlayer, isSyncUnOpen=True)
    GameWorld.DebugAnswer(curPlayer, "关闭功能: %s" % closeFuncID)
    return
def __SetPassMainLevelWavePre(curPlayer):
    ## 设置已过关主线进度到上一波
    passChapterID, passLevelNum, passWave = PlayerControl.GetMainLevelPassInfo(curPlayer) # 当前过关进度包含波,所以需要取上一关的
    if passWave > 0:
        passWave -= 1
        PlayerControl.SetMainLevelPassInfo(curPlayer, passChapterID, passLevelNum, passWave)
        return
    passWave = 0
    if passLevelNum > 1:
        passLevelNum -= 1
        PlayerControl.SetMainLevelPassInfo(curPlayer, passChapterID, passLevelNum, passWave)
        return
    if passChapterID > 1: # 取上一章节
        passChapterID -= 1
        levelDataList = IpyGameDataPY.GetIpyGameDataByCondition("MainLevel", {"ChapterID":passChapterID}, True)
        passLevelNum = len(levelDataList) if levelDataList else 0
        PlayerControl.SetMainLevelPassInfo(curPlayer, passChapterID, passLevelNum, passWave)
        return
    PlayerControl.SetMainLevelPassInfo(curPlayer, 1, 1, 0)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -500,6 +500,7 @@
                        ("WORD", "LimiRealmLV", 0),
                        ("DWORD", "LimitMissionID", 0),
                        ("WORD", "LimitOpenDay", 0),
                        ("WORD", "LimitManLevel", 0),
                        ("char", "MailKey", 0),
                        ("list", "AwardList", 0),
                        ),
@@ -1180,14 +1181,6 @@
                "LoginDayAward":(
                        ("BYTE", "DayID", 1),
                        ("dict", "Reward", 0),
                        ),
                "SpringSale":(
                        ("BYTE", "GiftID", 1),
                        ("BYTE", "SellDay", 0),
                        ("BYTE", "BuyNumLimit", 0),
                        ("WORD", "GiftPrice", 0),
                        ("list", "GiftItemList", 0),
                        ),
                "OrderInfo":(
@@ -2880,8 +2873,9 @@
    def GetLimiRealmLV(self): return self.attrTuple[2] # 需要境界等级 WORD
    def GetLimitMissionID(self): return self.attrTuple[3] # 需要完成的任务ID DWORD
    def GetLimitOpenDay(self): return self.attrTuple[4] # 开服第几天开启 WORD
    def GetMailKey(self): return self.attrTuple[5] # 邮件 char
    def GetAwardList(self): return self.attrTuple[6] # 奖励列表[[物品ID,个数], ...] list
    def GetLimitManLevel(self): return self.attrTuple[5] # 关卡进度波 WORD
    def GetMailKey(self): return self.attrTuple[6] # 邮件 char
    def GetAwardList(self): return self.attrTuple[7] # 奖励列表[[物品ID,个数], ...] list
# 合成表
class IPY_ItemCompound():
@@ -3905,19 +3899,6 @@
        
    def GetDayID(self): return self.attrTuple[0] # 天数 BYTE
    def GetReward(self): return self.attrTuple[1] # 奖励 {"职业":[[物品ID,个数],...], ...} dict
# 七天限时特惠表
class IPY_SpringSale():
    def __init__(self):
        self.attrTuple = None
        return
    def GetGiftID(self): return self.attrTuple[0] # 礼包ID BYTE
    def GetSellDay(self): return self.attrTuple[1] # 创角第几天上架 BYTE
    def GetBuyNumLimit(self): return self.attrTuple[2] # 每人限购数量 BYTE
    def GetGiftPrice(self): return self.attrTuple[3] # 礼包价格,仙玉 WORD
    def GetGiftItemList(self): return self.attrTuple[4] # 礼包物品信息列表[[物品ID,个数,是否绑定], ...] list
# 充值商品编号表
class IPY_OrderInfo():
@@ -5698,7 +5679,6 @@
        self.__LoadFileData("ChestsAward", onlyCheck)
        self.__LoadFileData("VIPKillNPC", onlyCheck)
        self.__LoadFileData("LoginDayAward", onlyCheck)
        self.__LoadFileData("SpringSale", onlyCheck)
        self.__LoadFileData("OrderInfo", onlyCheck)
        self.__LoadFileData("CTG", onlyCheck)
        self.__LoadFileData("CTGSelectItem", onlyCheck)
@@ -6782,13 +6762,6 @@
    def GetLoginDayAwardByIndex(self, index):
        self.CheckLoadData("LoginDayAward")
        return self.ipyLoginDayAwardCache[index]
    def GetSpringSaleCount(self):
        self.CheckLoadData("SpringSale")
        return self.ipySpringSaleLen
    def GetSpringSaleByIndex(self, index):
        self.CheckLoadData("SpringSale")
        return self.ipySpringSaleCache[index]
    def GetOrderInfoCount(self):
        self.CheckLoadData("OrderInfo")
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py
@@ -90,6 +90,10 @@
        if limitOpenDay and serverDay < limitOpenDay and checkServerDay:
            continue
        
        limitManLevel = ipyData.GetLimitManLevel()
        if limitManLevel and limitManLevel < PlayerControl.GetMainLevelPassValue(curPlayer):
            continue
        # 先更新值再处理开启逻辑,不能可能导致在功能开启逻辑中再开启功能引发的递归死循环
        befValue, updValue = GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_GameFuncFirstTouch, funcID, 1)
        if befValue == updValue: