hxp
2025-12-05 c80c8718c507a7e52f065eee9e35bb4f27573f48
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/OpenFunc.py
@@ -22,6 +22,7 @@
import GameFuncComm
import ChConfig
import ShareDefine
import PlayerOnline
## GM命令执行入口
#  @param curPlayer 当前玩家
@@ -43,7 +44,8 @@
        else:
            openFuncID = cmdList[1] if len(cmdList) > 1 else 0
            DoGMOpenFunc(curPlayer, openFuncID)
        PlayerOnline.GetOnlinePlayer(curPlayer).ReCalcAllAttr()
    PrintFuncOpenState(curPlayer)
    return
@@ -87,36 +89,51 @@
        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())
    
    # 优先处理升级        
    if needLV:
    if needLV > 1:
        preLV = needLV - 1
        curPlayer.SetLV(preLV)
        PlayerControl.SetPlayerTotalExp(curPlayer, PlayerControl.GetTotalExpByPlayerLv(preLV))
        PlayerControl.PlayerControl(curPlayer).PlayerLvUp()
        # 获取等级需要的境界
        ipyDataMgr = IpyGameDataPY.IPY_Data()
        for index in range(ipyDataMgr.GetRealmCount()):
            realmIpyData = ipyDataMgr.GetRealmByIndex(index)
            if realmIpyData.GetLv() > needRealmLV:
                needRealmLV = realmIpyData.GetLv()
            if realmIpyData.GetLVMax() >= needLV:
                break
    GameWorld.DebugLog("GM处理境界开启功能: needRealmLV=%s" % needRealmLV, curPlayer.GetPlayerID())
    if needRealmLV:
        curPlayer.SetOfficialRank(max(ChConfig.Def_InitOfficialRank, needRealmLV - 1))
        PlayerPrestigeSys.DoRealmLVUpLogic(curPlayer)
        
    GameWorld.DebugLog("GM处理任务开启功能: needMissionIDList=%s" % needMissionIDList, curPlayer.GetPlayerID())
    for limitMissionID in needMissionIDList:
        if not curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_MissionFinish % limitMissionID):
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_MissionFinish % limitMissionID, 1)
    if needMainLevel:
        PlayerControl.SetMainLevelPassValue(curPlayer, needMainLevel)
    GameWorld.DebugLog("GM处理任务开启功能: needMissionIDList=%s,needMainLevel=%s" % (needMissionIDList, needMainLevel), curPlayer.GetPlayerID())
    #最后强制触发一次
    #if needMissionIDList:
    GameFuncComm.DoFuncOpenLogic(curPlayer, needMissionIDList)
    GameFuncComm.DoFuncOpenLogic(curPlayer, checkServerDay=False)
    return
def __GetOpenFuncLimit(curPlayer, openFuncIDList):
    maxLV = PlayerControl.GetPlayerMaxLV(curPlayer)
    maxLV = PlayerControl.GetOpenMaxLV()
    needLV = 0
    needRealmLV = 0
    needMissionIDList = []
    needMainLevel = 0
    
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    funcOpenLVCount = ipyDataMgr.GetFuncOpenLVCount()
@@ -137,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关闭功能
@@ -149,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
@@ -177,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