hxp
2024-12-10 cc3b988b52ba3f473862d289ec58e7873e35d713
10334 【越南】【英语】【BT】【砍树】境界修改-服务端
15个文件已修改
940 ■■■■ 已修改文件
PySysDB/PySysDBPY.h 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 101 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 101 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/RealmLVUP.py 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetFreePoint.py 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_DuJie.py 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_AddLV.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py 462 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h
@@ -132,13 +132,9 @@
{
    WORD        _Lv;    //境界等级
    BYTE        LvLarge;    //大境界
    DWORD        NeedLV;    //需要等级
    DWORD        NeedItemID;    //需要道具ID
    WORD        NeedItemCnt;    //消耗的道具数量
    list        NeedEquip;    //需要8部位装备条件阶级|品质|是否套装
    DWORD        LVMax;    //等级上限
    list        AddAttrType;    //境界加成属性类型    
    list        AddAttrNum;    //境界加成属性值
    DWORD        BossID;    //渡劫bossid
    DWORD        BuffID;    //给全服在线玩家增加buff
    DWORD        ExpRate;    //修为池经验速率
    DWORD        ExpLimit;    //修为池经验上限
@@ -146,6 +142,17 @@
    BYTE        AddFreePoint;    //增加自由属性点
};
//境界进阶任务表
struct tagRealmLVUPTask
{
    WORD        _Lv;    //境界等级
    BYTE        TaskID;    //任务ID
    BYTE        TaskType;    //任务类型
    list        NeedValueList;    //所需值列表
    list        AwardItemList;    //奖励物品列表
};
//境界塔表
struct tagRealmTower
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -28349,19 +28349,15 @@
#------------------------------------------------------
# A3 11 通知玩家境界信息 #tagMCSyncRealmInfo
class  tagMCSyncRealmInfo(Structure):
class  tagMCSyncRealmTask(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("IsPass", c_ubyte),    #是否通关副本
                  ("XXZLAwardState", c_int),    #修仙之路领奖状态;按二进制位存储每个任务ID是否已领取
                  ("TaskID", c_ubyte),
                  ("TaskValue", c_int),
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA3
        self.SubCmd = 0x11
        return
    def ReadData(self, stringData, _pos=0, _len=0):
@@ -28370,36 +28366,99 @@
        return _pos + self.GetLength()
    def Clear(self):
        self.Cmd = 0xA3
        self.SubCmd = 0x11
        self.IsPass = 0
        self.XXZLAwardState = 0
        self.TaskID = 0
        self.TaskValue = 0
        return
    def GetLength(self):
        return sizeof(tagMCSyncRealmInfo)
        return sizeof(tagMCSyncRealmTask)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A3 11 通知玩家境界信息 //tagMCSyncRealmInfo:
                                Cmd:%s,
                                SubCmd:%s,
                                IsPass:%d,
                                XXZLAwardState:%d
                                TaskID:%d,
                                TaskValue:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.IsPass,
                                self.XXZLAwardState
                                self.TaskID,
                                self.TaskValue
                                )
        return DumpString
class  tagMCSyncRealmInfo(Structure):
    Head = tagHead()
    TaskAwardState = 0    #(DWORD TaskAwardState)//进阶任务领奖状态;按任务ID二进制位存储是否已领取
    TaskValueCount = 0    #(BYTE TaskValueCount)
    TaskValueList = list()    #(vector<tagMCSyncRealmTask> TaskValueList)//进阶任务值列表,仅有需要记录的任务才会通知
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0x11
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.TaskAwardState,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.TaskValueCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.TaskValueCount):
            temTaskValueList = tagMCSyncRealmTask()
            _pos = temTaskValueList.ReadData(_lpData, _pos)
            self.TaskValueList.append(temTaskValueList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0x11
        self.TaskAwardState = 0
        self.TaskValueCount = 0
        self.TaskValueList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 4
        length += 1
        for i in range(self.TaskValueCount):
            length += self.TaskValueList[i].GetLength()
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteDWORD(data, self.TaskAwardState)
        data = CommFunc.WriteBYTE(data, self.TaskValueCount)
        for i in range(self.TaskValueCount):
            data = CommFunc.WriteString(data, self.TaskValueList[i].GetLength(), self.TaskValueList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                TaskAwardState:%d,
                                TaskValueCount:%d,
                                TaskValueList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.TaskAwardState,
                                self.TaskValueCount,
                                "..."
                                )
        return DumpString
m_NAtagMCSyncRealmInfo=tagMCSyncRealmInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCSyncRealmInfo.Cmd,m_NAtagMCSyncRealmInfo.SubCmd))] = m_NAtagMCSyncRealmInfo
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCSyncRealmInfo.Head.Cmd,m_NAtagMCSyncRealmInfo.Head.SubCmd))] = m_NAtagMCSyncRealmInfo
#------------------------------------------------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -4392,8 +4392,10 @@
Def_PDict_FeastRedPacketCanGrabCnt = "FeastRedPacketCanGrabCnt"  # 节日红包可抢次数
#境界
Def_PDict_RealmVersionState = "RealmVersionState" #境界版本调整记录状态值
Def_PDict_RealmTaskAwardState = "RealmTaskAwardState" #境界渡劫条件领奖状态,按二进制位存储是否已领取
Def_PDict_RealmTaskValue = "RealmTaskValue_%s" #境界渡劫任务需要记录值,参数(任务ID)
Def_PDict_RealmXXZLAward = "RealmXXZLAward" #境界修仙之路领奖状态;按二进制位存储每个任务ID是否已领取
Def_PDict_RealmFBIsOpen = "RealmFBIsOpen" #渡劫副本是否开启 0未开启 1已开启 2可升级境界
Def_PDict_RealmFBAttrAdd = "RealmFBAttrAdd_%s" #渡劫副本属性加成 参数属性ID
Def_PDict_RealmExp = "RealmExp" #境界修为池总经验
Def_PDict_RealmExpPoint = "RealmExpPoint" #境界修为池总经验点
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -28349,19 +28349,15 @@
#------------------------------------------------------
# A3 11 通知玩家境界信息 #tagMCSyncRealmInfo
class  tagMCSyncRealmInfo(Structure):
class  tagMCSyncRealmTask(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("IsPass", c_ubyte),    #是否通关副本
                  ("XXZLAwardState", c_int),    #修仙之路领奖状态;按二进制位存储每个任务ID是否已领取
                  ("TaskID", c_ubyte),
                  ("TaskValue", c_int),
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA3
        self.SubCmd = 0x11
        return
    def ReadData(self, stringData, _pos=0, _len=0):
@@ -28370,36 +28366,99 @@
        return _pos + self.GetLength()
    def Clear(self):
        self.Cmd = 0xA3
        self.SubCmd = 0x11
        self.IsPass = 0
        self.XXZLAwardState = 0
        self.TaskID = 0
        self.TaskValue = 0
        return
    def GetLength(self):
        return sizeof(tagMCSyncRealmInfo)
        return sizeof(tagMCSyncRealmTask)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A3 11 通知玩家境界信息 //tagMCSyncRealmInfo:
                                Cmd:%s,
                                SubCmd:%s,
                                IsPass:%d,
                                XXZLAwardState:%d
                                TaskID:%d,
                                TaskValue:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.IsPass,
                                self.XXZLAwardState
                                self.TaskID,
                                self.TaskValue
                                )
        return DumpString
class  tagMCSyncRealmInfo(Structure):
    Head = tagHead()
    TaskAwardState = 0    #(DWORD TaskAwardState)//进阶任务领奖状态;按任务ID二进制位存储是否已领取
    TaskValueCount = 0    #(BYTE TaskValueCount)
    TaskValueList = list()    #(vector<tagMCSyncRealmTask> TaskValueList)//进阶任务值列表,仅有需要记录的任务才会通知
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0x11
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.TaskAwardState,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.TaskValueCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.TaskValueCount):
            temTaskValueList = tagMCSyncRealmTask()
            _pos = temTaskValueList.ReadData(_lpData, _pos)
            self.TaskValueList.append(temTaskValueList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0x11
        self.TaskAwardState = 0
        self.TaskValueCount = 0
        self.TaskValueList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 4
        length += 1
        for i in range(self.TaskValueCount):
            length += self.TaskValueList[i].GetLength()
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteDWORD(data, self.TaskAwardState)
        data = CommFunc.WriteBYTE(data, self.TaskValueCount)
        for i in range(self.TaskValueCount):
            data = CommFunc.WriteString(data, self.TaskValueList[i].GetLength(), self.TaskValueList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                TaskAwardState:%d,
                                TaskValueCount:%d,
                                TaskValueList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.TaskAwardState,
                                self.TaskValueCount,
                                "..."
                                )
        return DumpString
m_NAtagMCSyncRealmInfo=tagMCSyncRealmInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCSyncRealmInfo.Cmd,m_NAtagMCSyncRealmInfo.SubCmd))] = m_NAtagMCSyncRealmInfo
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCSyncRealmInfo.Head.Cmd,m_NAtagMCSyncRealmInfo.Head.SubCmd))] = m_NAtagMCSyncRealmInfo
#------------------------------------------------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/RealmLVUP.py
@@ -17,6 +17,10 @@
import GameWorld
import PlayerPrestigeSys
import IpyGameDataPY
import PlayerControl
import PlayerGubao
import ChConfig
## 逻辑实现
@@ -24,10 +28,59 @@
#  @param cmdList 参数列表
#  @return None
def OnExec(curPlayer, cmdList):
    isOK = PlayerPrestigeSys.DoRealmLVUpLogic(curPlayer)
    curRealmLV = curPlayer.GetOfficialRank()
    if isOK:
        GameWorld.DebugAnswer(curPlayer, "提升境界成功!GetOfficialRank=%s" % curRealmLV)
    else:
        GameWorld.DebugAnswer(curPlayer, "提升境界失败!GetOfficialRank=%s" % curRealmLV)
    if not cmdList:
        GameWorld.DebugAnswer(curPlayer, "------------ %s" % GameWorld.GetCurrentDataTimeStr())
        GameWorld.DebugAnswer(curPlayer, "重置境界阶级: RealmLVUP 0 [重置改版标记]")
        GameWorld.DebugAnswer(curPlayer, "执行境界升阶: RealmLVUP 1 [次数]")
        GameWorld.DebugAnswer(curPlayer, "设置境界任务: RealmLVUP t 任务ID 进度值")
        GameWorld.DebugAnswer(curPlayer, "注:可设置进度的任务类型:%s" % PlayerPrestigeSys.NeedTaskValueTypeList)
        GameWorld.DebugAnswer(curPlayer, "设置境界塔层: RealmTower")
        GameWorld.DebugAnswer(curPlayer, "设置天星塔层: SetSkyTower")
        GameWorld.DebugAnswer(curPlayer, "设置境界等级: SetOfficalRank 境界等级")
        GameWorld.DebugAnswer(curPlayer, "注:直接设置境界等级不会触发境界其他额外效果")
        return
    value = cmdList[0]
    if value == 0:
        reVersionState = cmdList[1] if len(cmdList) > 1 else 0
        curPlayer.SetOfficialRank(0)
        curPlayer.SetFreePoint(0)
        GameWorld.DebugAnswer(curPlayer, "重置境界!")
        GameWorld.DebugAnswer(curPlayer, "重置灵根点!")
        effType = PlayerGubao.GubaoEffType_RealmLVAddLinggen
        ipyDataMgr = IpyGameDataPY.IPY_Data()
        for index in range(ipyDataMgr.GetGubaoCount()):
            ipyData = ipyDataMgr.GetGubaoByIndex(index)
            gubaoID = ipyData.GetGubaoID()
            addFreePointAlready = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoItemEffValue % (gubaoID, effType))
            if not addFreePointAlready:
                continue
            GameWorld.DebugAnswer(curPlayer, "重置古宝(%s)效果(%s)增加灵根点:%s" % (gubaoID, effType, addFreePointAlready))
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GubaoItemEffValue % (gubaoID, effType), 0)
            PlayerGubao.Sync_GubaoItemEffInfo(curPlayer, gubaoID, effType, force=True)
        GameWorld.DebugAnswer(curPlayer, "重置境界OK")
        if reVersionState:
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmVersionState, 0)
            GameWorld.DebugAnswer(curPlayer, "重置改版标记,重登会执行重置境界逻辑!")
        return
    if value == 1:
        doCount = cmdList[1] if len(cmdList) > 1 else 1
        okCnt = 0
        for _ in range(doCount):
            if PlayerPrestigeSys.DoRealmLVUpLogic(curPlayer):
                okCnt += 1
            else:
                break
        curRealmLV = curPlayer.GetOfficialRank()
        if okCnt:
            GameWorld.DebugAnswer(curPlayer, "提升境界成功!GetOfficialRank=%s" % curRealmLV)
        else:
            GameWorld.DebugAnswer(curPlayer, "提升境界失败!GetOfficialRank=%s" % curRealmLV)
    elif value == "t":
        taskID = cmdList[1] if len(cmdList) > 1 else 0
        taskValue = cmdList[2] if len(cmdList) > 2 else 0
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmTaskValue % taskID, taskValue)
        PlayerPrestigeSys.SyncRealmFBState(curPlayer, taskIDList=[taskID])
        GameWorld.DebugAnswer(curPlayer, "设置任务ID:%s,进度值:%s" % (taskID, taskValue))
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetFreePoint.py
@@ -15,19 +15,39 @@
import OpenServerCampaign
import GameWorld
import Lang
import PlayerControl
import IpyGameDataPY
import ChPlayer
import ChConfig
## GM命令执行入口
#  @param curPlayer 当前玩家
#  @param playerList 参数列表 [pointCount]
#  @return None
#  @remarks 函数详细说明.
def OnExec(curPlayer,playerList):
    if len(playerList) != 1:
        #参数不正确
        GameWorld.DebugAnswer(curPlayer, Lang.GBText("参数不正确"))
def OnExec(curPlayer, paramList):
    if not paramList:
        GameWorld.DebugAnswer(curPlayer, "设置灵根点: SetFreePoint 自由点 [五行加点数]")
        return
    #获取 指定帐号<玩家ID>的未分配点数<未分配点数>
    curPlayer.SetFreePoint(playerList[0])
    value = paramList[0]
    curPlayer.SetFreePoint(value)
    GameWorld.DebugAnswer(curPlayer, "设置自由点: %s" % value)
    # 更新开服活动灵根数据
    OpenServerCampaign.UpdOpenServerCampaignLingGenData(curPlayer)
    if len(paramList) > 1:
        setPoint = paramList[1]
        vIndex = 0
        setAddPointList = []
        ipyDataMgr = IpyGameDataPY.IPY_Data()
        for index in range(ipyDataMgr.GetRolePointCount()):
            vIndex += 1
            attrID = ipyDataMgr.GetRolePointByIndex(index).GetAttrID()
            setPoint = paramList[vIndex] if len(paramList) > vIndex else setPoint
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AddPointValue % attrID, setPoint)
            setAddPointList.append(setPoint)
        GameWorld.DebugAnswer(curPlayer, "设置五行点: %s" % setAddPointList)
        ChPlayer.NotifyPlayerBasePoint(curPlayer)
        playerControl = PlayerControl.PlayerControl(curPlayer)
        playerControl.RefreshPlayerAttrState()
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
@@ -165,6 +165,28 @@
        return
    return dayStr in PyGameData.FBOpenTimeRecord[dataMapID]
def IsFBPass(curPlayer, mapID, lineID):
    ## 副本线路是否已过关
    passLineID = 0
    if mapID == ChConfig.Def_FBMapID_RealmTower:
        passLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RealmTowerFloor)
    elif mapID == ChConfig.Def_FBMapID_SkyTower:
        passLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerFloor)
    elif mapID == ChConfig.Def_FBMapID_TrialTower:
        passLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_TrialTower_PassLV)
    else:
        ipyData = IpyGameDataPY.GetIpyGameDataNotLog('FBGeneralTrain', mapID, lineID)
        if ipyData:
            passLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mapID)
        else:
            grade = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, lineID, False, [mapID])
            if grade:
                return True
    if passLineID >= lineID:
        return True
    return False
def CheckCanEnterFBComm(curPlayer, mapID, lineID, fbIpyData, fbLineIpyData, reqEnterCnt=1, isNotify=True, isTeamAsk=False):
    # 可否进入副本通用检查, 扫荡通用
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_DuJie.py
@@ -61,13 +61,25 @@
    lineID = 1 if FBCommon.GetFBPropertyMark() else 0
    return FBCommon.GetFBLineStepTime(ChConfig.Def_FBMapID_DuJie, lineID)
def GetDuJieBossID():
    realmLV = GameWorld.GetGameFB().GetGameFBDictByKey(DuJieFB_RealmLV)
    realmIpyData = PlayerPrestigeSys.GetRealmIpyData(realmLV)
    if not realmIpyData:
        GameWorld.ErrLog("没有该境界等级数据! Lv=%s" % realmLV)
def GetDuJieBossID(curPlayer=None):
    if curPlayer:
        realmLV = curPlayer.GetOfficialRank()
    else:
        realmLV = GameWorld.GetGameFB().GetGameFBDictByKey(DuJieFB_RealmLV)
    taskIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("RealmLVUPTask", realmLV)
    if not taskIpyDataList:
        return
    return realmIpyData.GetBossID()
    for taskIpyData in taskIpyDataList:
        if taskIpyData.GetTaskType() != PlayerPrestigeSys.RealmTaskType_Dujie:
            continue
        taskID = taskIpyData.GetTaskID()
        if curPlayer:
            if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmTaskValue % taskID):
                GameWorld.DebugLog("玩家渡劫boss已完成击杀! realmLV=%s,taskID=%s" % (realmLV, taskID), curPlayer.GetPlayerID())
                return
        valueList = taskIpyData.GetNeedValueList()
        return valueList[0] if valueList else 0
    return
#---FB接口----------
##副本初始化
@@ -128,21 +140,11 @@
        GameWorld.DebugLog("爵位境界功能未开启, 无法开启渡劫!curLV=%s" % curPlayer.GetLV())
        return False
    if lineID == 0 or curPlayer.GetTeamLV() == IPY_GameWorld.tmlLeader or (lineID == 1 and curPlayer.GetTeamID() == 0):
        curRealmLV = curPlayer.GetOfficialRank()
        realmIpyData = PlayerPrestigeSys.GetRealmIpyData(curRealmLV)
        if not realmIpyData:
            GameWorld.ErrLog("没有该境界等级数据! Lv=%s" % curRealmLV)
        bossID = GetDuJieBossID(curPlayer)
        if not bossID:
            GameWorld.ErrLog("没有可挑战的渡劫boss或已完成: realmLV=%s" % curPlayer.GetOfficialRank(), curPlayer.GetPlayerID())
            return False
        needLV = realmIpyData.GetNeedLV()
        if not needLV:
            GameWorld.DebugLog("境界已是最大等级,不能升级! Lv=%s" % curRealmLV, curPlayer.GetPlayerID())
            return False
        if curPlayer.GetLV() < needLV:
            GameWorld.DebugLog("等级不足,无法开启渡劫!needRealmPoint=%s" % (needLV), curPlayer.GetPlayerID())
            return False
        if not realmIpyData.GetBossID():
            return False
    return True
@@ -409,7 +411,7 @@
        if isPass and leaderPlayer:
            if curPlayer.GetPlayerID() == leaderPlayerID:
                #渡劫通过处理
                PlayerPrestigeSys.DologicDujieFBPass(curPlayer, realmLV, curStar)
                PlayerPrestigeSys.AddRealmTaskValue(curPlayer, PlayerPrestigeSys.RealmTaskType_Dujie, 1)
                #清除CD
                FBCommon.SetFBPDictValue(curPlayer, ChConfig.Def_PDict_LastEnterFBTick % ChConfig.Def_FBMapID_DuJie, 0)
                FBCommon.SyncFBEnterTick(curPlayer)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -131,18 +131,22 @@
                "Realm":(
                        ("WORD", "Lv", 1),
                        ("BYTE", "LvLarge", 0),
                        ("DWORD", "NeedLV", 0),
                        ("DWORD", "NeedItemID", 0),
                        ("WORD", "NeedItemCnt", 0),
                        ("list", "NeedEquip", 0),
                        ("DWORD", "LVMax", 0),
                        ("list", "AddAttrType", 0),
                        ("list", "AddAttrNum", 0),
                        ("DWORD", "BossID", 0),
                        ("DWORD", "BuffID", 0),
                        ("DWORD", "ExpRate", 0),
                        ("DWORD", "ExpLimit", 0),
                        ("dict", "LearnSkillIDInfo", 0),
                        ("BYTE", "AddFreePoint", 0),
                        ),
                "RealmLVUPTask":(
                        ("WORD", "Lv", 1),
                        ("BYTE", "TaskID", 0),
                        ("BYTE", "TaskType", 0),
                        ("list", "NeedValueList", 0),
                        ("list", "AwardItemList", 0),
                        ),
                "RealmTower":(
@@ -2719,18 +2723,27 @@
        
    def GetLv(self): return self.attrTuple[0] # 境界等级 WORD
    def GetLvLarge(self): return self.attrTuple[1] # 大境界 BYTE
    def GetNeedLV(self): return self.attrTuple[2] # 需要等级 DWORD
    def GetNeedItemID(self): return self.attrTuple[3] # 需要道具ID DWORD
    def GetNeedItemCnt(self): return self.attrTuple[4] # 消耗的道具数量 WORD
    def GetNeedEquip(self): return self.attrTuple[5] # 需要8部位装备条件阶级|品质|是否套装 list
    def GetAddAttrType(self): return self.attrTuple[6] # 境界加成属性类型 list
    def GetAddAttrNum(self): return self.attrTuple[7] # 境界加成属性值 list
    def GetBossID(self): return self.attrTuple[8] # 渡劫bossid DWORD
    def GetBuffID(self): return self.attrTuple[9] # 给全服在线玩家增加buff DWORD
    def GetExpRate(self): return self.attrTuple[10] # 修为池经验速率 DWORD
    def GetExpLimit(self): return self.attrTuple[11] # 修为池经验上限 DWORD
    def GetLearnSkillIDInfo(self): return self.attrTuple[12] # 学习技能ID信息 {"职业":[技能ID, ...], ...} dict
    def GetAddFreePoint(self): return self.attrTuple[13] # 增加自由属性点 BYTE
    def GetLVMax(self): return self.attrTuple[2] # 等级上限 DWORD
    def GetAddAttrType(self): return self.attrTuple[3] # 境界加成属性类型 list
    def GetAddAttrNum(self): return self.attrTuple[4] # 境界加成属性值 list
    def GetBuffID(self): return self.attrTuple[5] # 给全服在线玩家增加buff DWORD
    def GetExpRate(self): return self.attrTuple[6] # 修为池经验速率 DWORD
    def GetExpLimit(self): return self.attrTuple[7] # 修为池经验上限 DWORD
    def GetLearnSkillIDInfo(self): return self.attrTuple[8] # 学习技能ID信息 {"职业":[技能ID, ...], ...} dict
    def GetAddFreePoint(self): return self.attrTuple[9] # 增加自由属性点 BYTE
# 境界进阶任务表
class IPY_RealmLVUPTask():
    def __init__(self):
        self.attrTuple = None
        return
    def GetLv(self): return self.attrTuple[0] # 境界等级 WORD
    def GetTaskID(self): return self.attrTuple[1] # 任务ID BYTE
    def GetTaskType(self): return self.attrTuple[2] # 任务类型 BYTE
    def GetNeedValueList(self): return self.attrTuple[3] # 所需值列表 list
    def GetAwardItemList(self): return self.attrTuple[4] # 奖励物品列表 list
# 境界塔表
class IPY_RealmTower():
@@ -6457,6 +6470,7 @@
        self.__LoadFileData("LingQiTrain", onlyCheck)
        self.__LoadFileData("RealmXXZL", onlyCheck)
        self.__LoadFileData("Realm", onlyCheck)
        self.__LoadFileData("RealmLVUPTask", onlyCheck)
        self.__LoadFileData("RealmTower", onlyCheck)
        self.__LoadFileData("LianTi", onlyCheck)
        self.__LoadFileData("GodWeapon", onlyCheck)
@@ -6999,6 +7013,13 @@
        self.CheckLoadData("Realm")
        return self.ipyRealmCache[index]
    def GetRealmLVUPTaskCount(self):
        self.CheckLoadData("RealmLVUPTask")
        return self.ipyRealmLVUPTaskLen
    def GetRealmLVUPTaskByIndex(self, index):
        self.CheckLoadData("RealmLVUPTask")
        return self.ipyRealmLVUPTaskCache[index]
    def GetRealmTowerCount(self):
        self.CheckLoadData("RealmTower")
        return self.ipyRealmTowerLen
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_AddLV.py
@@ -62,7 +62,7 @@
        curLV = curPlayer.GetLV()
        isOnlyLVUp = lvLimit==0 or curLV < lvLimit #是否直接提升固定等级
            
        maxLV = IpyGameDataPY.GetFuncCfg("PlayerMaxLV") # 当前已开放的最大等级不一定大于下一次转生等级
        maxLV = PlayerControl.GetPlayerMaxLV(curPlayer)
        if isOnlyLVUp and curLV >= maxLV:
            PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_607994")
            GameWorld.Log('升级果实无法使用,已达到当前最大等级 curLV=%s,maxLV=%s' 
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -44,6 +44,7 @@
import PlayerActivity
import PlayerSuccess
import BossHurtMng
import PlayerPrestigeSys
import GY_Query_BossFirstKill
import GameLogic_FamilyInvade
import GameLogic_GatherSoul
@@ -5194,6 +5195,7 @@
                PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_KillNPC)
                PlayerActGarbageSorting.AddActGarbageTaskProgress(curPlayer, ChConfig.Def_GarbageTask_KillNPC)
                PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_KillNPC)
            PlayerPrestigeSys.AddRealmTaskValue(curPlayer, PlayerPrestigeSys.RealmTaskType_KillNPC, 1)
            PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_FeastRedPack_KillSpecificNPC, 1, [npcID])
            
        if ChConfig.IsGameBoss(curNPC):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -5722,6 +5722,9 @@
    #境界修仙之路奖励
    elif rewardType == ChConfig.Def_RewardType_RealmXXZL:
        PlayerPrestigeSys.GetXXZLAward(curPlayer, dataEx)
    #境界渡劫任务条件奖励
    elif rewardType == ChConfig.Def_RewardType_RealmLVUpTask:
        PlayerPrestigeSys.GetRealmLVUpTaskAward(curPlayer, dataEx)
    #仙盟boss伤害奖励
    elif rewardType == ChConfig.Def_RewardType_FamilyBossHurt:
        GameLogic_FamilyBoss.GetFamilyBossHurtAward(curPlayer, dataEx, dataExStr)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -4215,7 +4215,7 @@
        #curTotalExp = GetPlayerTotalExp(curPlayer)
        curTotalExp = curPlayer.GetExpPoint() * ChConfig.Def_PerPointValue + curPlayer.GetTotalExp()
        maxLV = IpyGameDataPY.GetFuncCfg("PlayerMaxLV", 1)
        maxLV = GetPlayerMaxLV(curPlayer)
        maxLVExpStore = IpyGameDataPY.GetFuncCfg("MaxLVExpStore", 1)
        
        curLV = curPlayer.GetLV()            
@@ -4225,10 +4225,10 @@
#            GameWorld.DebugLog("经验已满!需先转生!curLV=%s,reinLV=%s" % (curLV, nextReinLV), curPlayer.GetPlayerID())
#            return 0
        # 检查最大等级
        if curLV >= maxLV and curTotalExp >= maxLVExpStore:
        # 检查最大等级,maxLVExpStore -1时不限累计经验上限
        if curLV >= maxLV and curTotalExp >= maxLVExpStore and maxLVExpStore != -1:
            self.__NotifyExpFull(curPlayer, "GeRen_admin_825676")
            #GameWorld.DebugLog("经验已满!已满级!curLV=%s" % (curLV), curPlayer.GetPlayerID())
            GameWorld.DebugLog("经验已满!已满级!curLV=%s,maxLV=%s,curTotalExp=%s >= maxLVExpStore=%s" % (curLV, maxLV, curTotalExp, maxLVExpStore), curPlayer.GetPlayerID())
            return 0, expViewType
        
        # 杀怪
@@ -4276,7 +4276,7 @@
        
        # 不可再升级时,增加后的经验不可超过最大可存储经验
        #if curLV >= nextReinLV or curLV >= maxLV:
        if curLV >= maxLV:
        if curLV >= maxLV and maxLVExpStore > 0:
            addExp = min(addExp, max(0, maxLVExpStore - curTotalExp))
        if addExp <= 0:
@@ -4377,7 +4377,7 @@
        needSyncTalentPoint = False
        playerNeedDoLVUp = False
        curLV = curPlayer.GetLV()
        maxLV = IpyGameDataPY.GetFuncCfg("PlayerMaxLV", 1)
        maxLV = GetPlayerMaxLV(curPlayer)
        
        curPlayer.BeginRefreshState()
        #befXP = curPlayer.GetXP()
@@ -6874,6 +6874,16 @@
        return 0
    return lvIpyData.GetExpPoint() * ChConfig.Def_PerPointValue + lvIpyData.GetExp()
def GetPlayerMaxLV(curPlayer):
    ## 获取玩家实际可升的最大等级
    maxLV = IpyGameDataPY.GetFuncCfg("PlayerMaxLV", 1)
    curRealmLV = curPlayer.GetOfficialRank()
    realmIpyData = PlayerPrestigeSys.GetRealmIpyData(curRealmLV)
    if not realmIpyData:
        return 0
    playerMaxLV = min(maxLV, realmIpyData.GetLVMax())
    return playerMaxLV
## 获得玩家实际等级
#  @param curPlayer 玩家
#  @return 玩家实际等级
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py
@@ -60,6 +60,7 @@
                        ]
# 古宝灵根点特殊效果列表
GubaoEffType_RealmLVAddLinggen = 55 # 境界每级增加X点灵根
GubaoEffFreePointTypeList = [54, 55, 56]
# 需要记录EffValue的EffType列表
@@ -292,8 +293,8 @@
        addFreePointAlready = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoItemEffValue % (gubaoID, effType))
        unAddFreePoint = max(0, addFreePointTotal - addFreePointAlready)
        unAddFreePointTotal += unAddFreePoint
        GameWorld.DebugLog("古宝星级增加灵根点: gubaoID=%s,star=%s,addFreePointTotal=%s,addFreePointAlready=%s,unAddFreePoint=%s,total=%s"
                           % (gubaoID, star, addFreePointTotal, addFreePointAlready, unAddFreePoint, unAddFreePointTotal), playerID)
        GameWorld.DebugLog("古宝星级增加灵根点: gubaoID=%s,star=%s,effType=%s,addFreePointTotal=%s,addFreePointAlready=%s,unAddFreePoint=%s,total=%s"
                           % (gubaoID, star, effType, addFreePointTotal, addFreePointAlready, unAddFreePoint, unAddFreePointTotal), playerID)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GubaoItemEffValue % (gubaoID, effType), addFreePointTotal)
        if unAddFreePoint:
            Sync_GubaoItemEffInfo(curPlayer, gubaoID, effType, True)
@@ -303,6 +304,7 @@
    freePoint = curPlayer.GetFreePoint()
    updFreePoint = freePoint + unAddFreePointTotal
    curPlayer.SetFreePoint(updFreePoint)
    GameWorld.DebugLog("古宝加点: freePoint=%s,freePoint=%s,freePoint=%s" % (freePoint, unAddFreePointTotal, updFreePoint), playerID)
    return
def __calcStarEffAddFreePoint(curPlayer, gubaoID, effPointDict):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py
@@ -16,6 +16,8 @@
#-------------------------------------------------------------------------------
import ItemCommon
import ItemControler
import FBCommon
import GameFuncComm
import PlayerControl
import ChPyNetSendPack
@@ -38,6 +40,18 @@
import time
#------------------------------------------------------------------------------
# 渡劫任务类型
RealmTaskTypeList = (
RealmTaskType_LV, # 等级 1
RealmTaskType_PassMap, # 过关关卡 2
RealmTaskType_KillNPC, # 击杀NPC 3
RealmTaskType_LVUPItem, # 进阶丹 4
RealmTaskType_Equip, # 基础装备明细 5
RealmTaskType_Dujie, # 渡劫boss 6
) = range(1, 1 + 6)
# 需要记录任务值的任务类型列表
NeedTaskValueTypeList = [RealmTaskType_KillNPC, RealmTaskType_Dujie]
def DoOfficialOpen(curPlayer):
    #功能开启
@@ -48,11 +62,129 @@
def OnLogin(curPlayer):
    SyncRealmFBState(curPlayer)
    DoRealmVersionStateLogic(curPlayer)
    SyncRealmFBState(curPlayer, isAll=True)
    UpdateRealmExp(curPlayer, False)
    NotifyRealmExpInfo(curPlayer)
    return
def DoRealmVersionStateLogic(curPlayer):
    ## 执行版本变更逻辑,仅触发一次,之后可删除
    state = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmVersionState)
    if state:
        GameWorld.DebugLog("境界版本变更逻辑已重置过!", curPlayer.GetPlayerID())
        return
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmVersionState, 1)
    realmLV = curPlayer.GetOfficialRank()
    if not realmLV:
        # 新号不处理
        return
    playerID = curPlayer.GetPlayerID()
    GameWorld.Log("======================== 执行境界版本变更重置逻辑 =======================", playerID)
    # 重置境界
    curPlayer.SetOfficialRank(0)
    # 返还境界丹
    returnItemID = IpyGameDataPY.GetFuncCfg("RealmLvUP", 1)
    returnCount = 0
    itemCntList = IpyGameDataPY.GetFuncEvalCfg("RealmVersion", 1)
    for rLV, needCnt in enumerate(itemCntList):
        if rLV > realmLV:
            break
        returnCount += needCnt
    GameWorld.Log("境界等级: realmLV=%s,returnItemID=%s,returnCount=%s" % (realmLV, returnItemID, returnCount), playerID)
    # 重置灵根点,扣除赠送灵根点
    linggenPointDel = 0
    linggenPointLVAdd = 0
    linggenCntList = IpyGameDataPY.GetFuncEvalCfg("RealmVersion", 2)
    for rLV, lgPoint in enumerate(linggenCntList):
        if rLV > realmLV:
            break
        linggenPointDel += lgPoint
        linggenPointLVAdd += lgPoint
    # 古宝效果赠送灵根点
    linggenPointGubaoAdd = 0
    resetGubaoEffValueKeyList = []
    effType = PlayerGubao.GubaoEffType_RealmLVAddLinggen
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for index in range(ipyDataMgr.GetGubaoCount()):
        ipyData = ipyDataMgr.GetGubaoByIndex(index)
        gubaoID = ipyData.GetGubaoID()
        addFreePointAlready = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoItemEffValue % (gubaoID, effType))
        if not addFreePointAlready:
            continue
        resetGubaoEffValueKeyList.append(ChConfig.Def_PDict_GubaoItemEffValue % (gubaoID, effType))
        linggenPointDel += addFreePointAlready
        linggenPointGubaoAdd += addFreePointAlready
    freePointBef = curPlayer.GetFreePoint()
    linggenPointTotalBef = freePointBef
    addPointDict = {}
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for index in range(ipyDataMgr.GetRolePointCount()):
        linggenID = ipyDataMgr.GetRolePointByIndex(index).GetAttrID()
        linggenPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AddPointValue % linggenID)
        addPointDict[linggenID] = linggenPoint
        linggenPointTotalBef += linggenPoint
    GameWorld.Log("重置前灵根点: freePointBef=%s,linggenPointTotalBef=%s,addPointDict=%s" % (freePointBef, linggenPointTotalBef, addPointDict), playerID)
    if linggenPointDel:
        import Item_ResetAttrPoint
        Item_ResetAttrPoint.DoResetAttrPoint(curPlayer, 0, 0)
        updFreePoint = max(0, curPlayer.GetFreePoint() - linggenPointDel)
        curPlayer.SetFreePoint(updFreePoint)
        for resetKey in resetGubaoEffValueKeyList:
            PlayerControl.NomalDictSetProperty(curPlayer, resetKey, 0)
        GameWorld.Log("重置境界灵根点: linggenPointDel=%s,updFreePoint=%s,linggenPointLVAdd=%s,linggenPointGubaoAdd=%s" %
                      (linggenPointDel, updFreePoint, linggenPointLVAdd, linggenPointGubaoAdd), playerID)
    # 删除境界技能
    delSkillIDList = []
    skillIDList = IpyGameDataPY.GetFuncEvalCfg("RealmVersion", 3)
    skillManager = curPlayer.GetSkillManager()
    playerControl = PlayerControl.PlayerControl(curPlayer)
    for skillID in skillIDList:
        if not skillManager.FindSkillBySkillID(skillID):
            continue
        skillManager.DeleteSkillBySkillID(skillID)
        delSkillIDList.append(skillID)
        playerControl.RefreshSkillFightPowerByDel(skillID)
    playerControl.RefreshPlayerAttrState()
    PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEffSet(curPlayer)
    GameWorld.Log("重置境界删除技能ID列表: %s" % delSkillIDList, playerID)
    # 境界难度地图重置
    PlayerControl.SetRealmDifficulty(curPlayer, 0)
    GameWorld.Log("重置境界难度等级选择!", playerID)
    itemListEx = IpyGameDataPY.GetFuncEvalCfg("RealmVersion", 4)
    mailItemList = [[returnItemID, returnCount, 0]] + itemListEx
    paramList = [linggenPointDel, returnItemID, returnItemID, returnCount]
    PlayerControl.SendMailByKey("RealmVersion", [playerID], mailItemList, paramList)
    GameWorld.Log("重置境界邮件: mailItemList=%s" % mailItemList, playerID)
    # 记录流向
    freePointAft = curPlayer.GetFreePoint()
    linggenPointTotalAft = freePointAft
    addPointDictAft = {}
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for index in range(ipyDataMgr.GetRolePointCount()):
        linggenID = ipyDataMgr.GetRolePointByIndex(index).GetAttrID()
        linggenPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AddPointValue % linggenID)
        addPointDictAft[linggenID] = linggenPoint
        linggenPointTotalAft += linggenPoint
    GameWorld.Log("重置后灵根点: freePointAft=%s,linggenPointTotalAft=%s,addPointDictAft=%s" % (freePointAft, linggenPointTotalAft, addPointDictAft), playerID)
    dataDict = {"realmLV":realmLV, "returnItemID":returnItemID, "returnCount":returnCount,
                "linggenPointDel":linggenPointDel, "linggenPointLVAdd":linggenPointLVAdd, "linggenPointGubaoAdd":linggenPointGubaoAdd,
                "linggenPointTotalBef":linggenPointTotalBef, "linggenPointTotalAft":linggenPointTotalAft,
                "freePointBef":freePointBef, "freePointAft":freePointAft, "addPointDict":addPointDict,
                "delSkillIDList":delSkillIDList, "mailItemList":mailItemList}
    DataRecordPack.SendEventPack("RealmVersionReset", dataDict, curPlayer)
    GameWorld.Log("======================= 境界版本变更重置完毕 =======================", playerID)
    return
def GetRealmIpyData(realmLV): return IpyGameDataPY.GetIpyGameData("Realm", realmLV)
@@ -67,75 +199,31 @@
    return
def GetXXZLAward(curPlayer, taskID):
    ## 领取修仙之路奖励
    awardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmXXZLAward)
    if awardState&pow(2, taskID):
        GameWorld.DebugLog("已领取过境界修仙之路该奖励, taskID=%s" % taskID, curPlayer.GetPlayerID())
        return
    ipyData = IpyGameDataPY.GetIpyGameData("RealmXXZL", taskID)
    if not ipyData:
        return
    taskType = ipyData.GetTaskType()
    needValue = ipyData.GetNeedValue()
    curValue= 0
    #1. 得到 XXX法宝, 所需值为法宝ID
    if taskType == 1:
        magicWeaponID = needValue
        if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MagicWeaponLV % magicWeaponID) >= 1:
            curValue = needValue
    #2. 通关天星塔X层
    elif taskType == 2:
        curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerFloor)
    #3. 击杀世界BOSSX只
    elif taskType == 3:
        curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCntTotal % ShareDefine.Def_Boss_Func_World)
    #4. 活跃修炼X次
    elif taskType == 4:
        curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActivityCountTotal)
    #5. 击杀个人BOSS:xxx,所需之为个人boss表对应线路id
    elif taskType == 5:
        mapID = ChConfig.Def_FBMapID_PersonalBoss
        lineID = needValue
        if GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, lineID, False, [mapID]):
            curValue = needValue
    #6. 通关宗门试炼x次
    elif taskType == 6:
        curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntTotal % ChConfig.Def_FBMapID_MunekadoTrial)
    #7. 获得X点灵根点
    elif taskType == 7:
        curValue = PlayerControl.GetTotalLingGenPoint(curPlayer)
    if curValue < needValue:
        GameWorld.DebugLog("境界修仙之路当前任务所需值不满足,无法领奖, taskID=%s,taskType=%s,curValue=%s < %s"
                           % (taskID, taskType, curValue, needValue), curPlayer.GetPlayerID())
        return
    awardItemList = ipyData.GetAwardItemList()
    if not ItemCommon.GiveAwardItem(curPlayer, awardItemList, "RealmXXZL"):
        return
    updAwardState = awardState|pow(2, taskID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmXXZLAward, updAwardState)
    GameWorld.DebugLog("领取境界修仙之路奖励, awardID=%s,updAwardState=%s" % (taskID, updAwardState), curPlayer.GetPlayerID())
    SyncRealmFBState(curPlayer)
    EventShell.EventRespons_RealmXXZLAward(curPlayer, taskID)
    ## 领取修仙之路奖励,废弃
    return
def SyncRealmFBState(curPlayer):
def SyncRealmFBState(curPlayer, taskIDList=None, isAll=False):
    #通知客户端渡劫副本是否开启
    #if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Official):
    #    return
    sendPack = ChPyNetSendPack.tagMCSyncRealmInfo()
    sendPack.IsPass = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmFBIsOpen)
    sendPack.XXZLAwardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmXXZLAward)
    sendPack.TaskAwardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmTaskAwardState)
    sendPack.TaskValueList = []
    if isAll and taskIDList == None:
        taskIDList = []
        curRealmLV = curPlayer.GetOfficialRank()
        taskIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("RealmLVUPTask", curRealmLV)
        if taskIpyDataList:
            for taskIpyData in taskIpyDataList:
                if taskIpyData.GetTaskType() in NeedTaskValueTypeList:
                    taskIDList.append(taskIpyData.GetTaskID())
    if taskIDList:
        for taskID in taskIDList:
            task = ChPyNetSendPack.tagMCSyncRealmTask()
            task.TaskID = taskID
            task.TaskValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmTaskValue % taskID)
            sendPack.TaskValueList.append(task)
    sendPack.TaskValueCount = len(sendPack.TaskValueList)
    NetPackCommon.SendFakePack(curPlayer, sendPack)
    return
@@ -173,6 +261,162 @@
    PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
    return
def AddRealmTaskValue(curPlayer, taskType, addValue):
    ## 增加境界任务值
    if taskType not in NeedTaskValueTypeList:
        return
    realmLV = curPlayer.GetOfficialRank()
    taskIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("RealmLVUPTask", realmLV)
    if not taskIpyDataList:
        return
    syncTaskIDList = []
    for taskIpyData in taskIpyDataList:
        if taskType != taskIpyData.GetTaskType():
            continue
        taskID = taskIpyData.GetTaskID()
        needValue = GetRealmTaskNeedValue(taskIpyData.GetNeedValueList(), 0)
        curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmTaskValue % taskID)
        if curValue >= needValue:
            continue
        syncTaskIDList.append(taskID)
        updValue = min(curValue + addValue, needValue)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmTaskValue % taskID, updValue)
        GameWorld.DebugLog("更新境界任务值: realmLV=%s,taskType=%s,taskID=%s,updValue=%s,curValue=%s,addValue=%s"
                           % (realmLV, taskType, taskID, updValue, curValue, addValue), curPlayer.GetPlayerID())
    if syncTaskIDList:
        SyncRealmFBState(curPlayer, taskIDList=syncTaskIDList)
    return
def GetRealmTaskNeedValue(needValueList, index): return needValueList[index] if len(needValueList) > index else 0
def GetRealmLVUpTaskAward(curPlayer, taskID):
    ## 领取境界渡劫任务条件奖励
    playerID = curPlayer.GetPlayerID()
    realmLV = curPlayer.GetOfficialRank()
    awardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmTaskAwardState)
    if awardState&pow(2, taskID):
        GameWorld.DebugLog("境界任务领奖,已领取过! realmLV=%s,taskID=%s" % (realmLV, taskID), playerID)
        return
    taskIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("RealmLVUPTask", realmLV)
    if not taskIpyDataList:
        return
    taskIpyData = None
    for tIpyData in taskIpyDataList:
        if taskID != tIpyData.GetTaskID():
            continue
        taskIpyData = tIpyData
        break
    if not taskIpyData:
        GameWorld.DebugLog("没有该境界任务! realmLV=%s,taskID=%s" % (realmLV, taskID), playerID)
        return
    taskType = taskIpyData.GetTaskType()
    needValueList = taskIpyData.GetNeedValueList()
    needValueA = GetRealmTaskNeedValue(needValueList, 0)
    awardItemList = taskIpyData.GetAwardItemList()
    # 玩家等级
    if taskType == RealmTaskType_LV:
        playerLV = curPlayer.GetLV()
        if playerLV < needValueA:
            GameWorld.DebugLog('境界任务领奖,等级不足! realmLV=%s,taskID=%s,taskType=%s,playerLV=%s < %s'
                               % (realmLV, taskID, taskType, playerLV, needValueA), playerID)
            return
    # 过关副本
    elif taskType == RealmTaskType_PassMap:
        mapID = needValueA
        lineID = GetRealmTaskNeedValue(needValueList, 1)
        if not FBCommon.IsFBPass(curPlayer, mapID, lineID):
            GameWorld.DebugLog('境界任务领奖,未过关! realmLV=%s,taskID=%s,taskType=%s,mapID=%s,lineID=%s'
                               % (realmLV, taskID, taskType, mapID, lineID), playerID)
            return
    # 进阶丹
    elif taskType == RealmTaskType_LVUPItem:
        itemID = IpyGameDataPY.GetFuncCfg("RealmLvUP", 1)
        needItemCount = needValueA
        itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
        lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList({itemID:needItemCount}, itemPack)
        if lackItemDict:
            GameWorld.DebugLog('境界任务领奖,物品不足! realmLV=%s,taskID=%s,taskType=%s,lackItemDict=%s'
                               % (realmLV, taskID, taskType, lackItemDict), playerID)
            return
        ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "Realm")
    # 装备
    elif taskType == RealmTaskType_Equip:
        if len(needValueList) != 4:
            GameWorld.DebugLog('境界任务领奖,装备条件配置错误,长度必须为4! realmLV=%s,taskID=%s,taskType=%s,needValueList=%s'
                               % (realmLV, taskID, taskType, needValueList), playerID)
            return
        classLV, star, isSuite, color = needValueList
        equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
        for place in ChConfig.EquipPlace_Base:
            ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, place)
            if not ipyData:
                return
            gridIndex = ipyData.GetGridIndex()
            curEquip = equipPack.GetAt(gridIndex)
            if not ItemCommon.CheckItemCanUse(curEquip):
                GameWorld.DebugLog('境界任务领奖,装备位无装备! realmLV=%s,taskID=%s,taskType=%s,classLV=%s,place=%s'
                                   % (realmLV, taskID, taskType, classLV, place), playerID)
                return
            curPartStar = ChEquip.GetEquipPartStar(curPlayer, gridIndex)
            if curPartStar < star:
                GameWorld.DebugLog('境界任务领奖,装备位星级不足! realmLV=%s,taskID=%s,taskType=%s,classLV=%s,place=%s,curPartStar=%s < %s'
                                   % (realmLV, taskID, taskType, classLV, place, curPartStar, star), playerID)
                return
            if isSuite and not curEquip.GetSuiteID():
                GameWorld.DebugLog('境界任务领奖,装备位非套装! realmLV=%s,taskID=%s,taskType=%s,classLV=%s,place=%s'
                                   % (realmLV, taskID, taskType, classLV, place), playerID)
                return
            if curEquip.GetItemColor() < color:
                GameWorld.DebugLog('境界任务领奖,装备位品质不足! realmLV=%s,taskID=%s,taskType=%s,classLV=%s,place=%s,ItemColor=%s < %s'
                                   % (realmLV, taskID, taskType, classLV, place, curEquip.GetItemColor(), color), playerID)
                return
    # 渡劫
    elif taskType == RealmTaskType_Dujie:
        curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmTaskValue % taskID)
        if not curValue:
            GameWorld.DebugLog('境界任务领奖,渡劫未过关! realmLV=%s,taskID=%s,taskType=%s' % (realmLV, taskID, taskType), playerID)
            return
    # 根据记录任务进度值
    elif taskType in NeedTaskValueTypeList:
        curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmTaskValue % taskID)
        if curValue < needValueA:
            GameWorld.DebugLog('境界任务领奖,条件不足! realmLV=%s,taskID=%s,taskType=%s,curValue=%s < %s'
                               % (realmLV, taskID, taskType, curValue, needValueA), playerID)
            return
    else:
        return
    ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["RealmTask", False, {}])
    updAwardState = awardState|pow(2, taskID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmTaskAwardState, updAwardState)
    GameWorld.DebugLog("境界渡劫领奖OK! realmLV=%s,taskID=%s,updAwardState=%s" % (realmLV, taskID, updAwardState), playerID)
    SyncRealmFBState(curPlayer)
    return
def CheckRealmTaskFinishAll(curPlayer):
    ## 检查境界任务是否已全部完成
    realmLV = curPlayer.GetOfficialRank()
    taskIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("RealmLVUPTask", realmLV)
    if not taskIpyDataList:
        GameWorld.DebugLog("没有境界任务算未完成! realmLV=%s" % (realmLV), curPlayer.GetPlayerID())
        return
    awardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmTaskAwardState)
    for taskIpyData in taskIpyDataList:
        taskID = taskIpyData.GetTaskID()
        if not awardState&pow(2, taskID):
            GameWorld.DebugLog("境界任务未完成领奖! realmLV=%s,taskID=%s" % (realmLV, taskID), curPlayer.GetPlayerID())
            return
    return True
#// A5 23 提升境界等级 # tagCMRealmLVUp
#
@@ -188,66 +432,12 @@
    if not realmIpyData:
        GameWorld.ErrLog("没有该境界等级数据! Lv=%s" % curRealmLV)
        return
    if realmIpyData.GetBossID():
        canLvUp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmFBIsOpen) == 1
        if not canLvUp:
            GameWorld.DebugLog('    副本未过关,不能升级境界')
            return
    #等级判断
    if curPlayer.GetLV() < realmIpyData.GetNeedLV():
        return
    #装备判断
    needEquip = realmIpyData.GetNeedEquip()
    if needEquip and len(needEquip) == 4:
        classLV, star, isSuite, color = needEquip
        equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
        for place in ChConfig.EquipPlace_Base:
            ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, place)
            if not ipyData:
                return
            gridIndex = ipyData.GetGridIndex()
            curEquip = equipPack.GetAt(gridIndex)
            if not ItemCommon.CheckItemCanUse(curEquip):
                return
            curPartStar = ChEquip.GetEquipPartStar(curPlayer, gridIndex)
            if curPartStar < star:
                return
            if isSuite and not curEquip.GetSuiteID():
                return
            if curEquip.GetItemColor() < color:
                return
    
    needItemID = realmIpyData.GetNeedItemID()
    needItemCount = realmIpyData.GetNeedItemCnt()
    # 支持不消耗物品升级
    if needItemID > 0 and needItemCount > 0:
        curPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
        hasEnough, itemIndexList = ItemCommon.GetItem_FromPack_ByID(needItemID, curPack, needItemCount)
        if not hasEnough:
            GameWorld.DebugLog("渡劫开启, 材料不足! Lv=%s, needItemID=%s,needItemCount=%s"
                               % (curRealmLV, needItemID, needItemCount))
            return
        #扣除物品
        ItemCommon.ReduceItem(curPlayer, curPack, itemIndexList, needItemCount, True, "Realm")
    if not CheckRealmTaskFinishAll(curPlayer):
        return
    
    DoRealmLVUpLogic(curPlayer)
    return
# 提升1级境界加点
def __DoRealmLVUpAddPoint(curPlayer):
    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_AddPoint):
        # 未开启前不可加点,因为DoAddPointOpen会一次性补齐,避免意外情况多加了点数
        return
    curFreePoint = curPlayer.GetFreePoint()
    addPoint = IpyGameDataPY.GetFuncCfg("LVUPAddPoint", 3)
    if addPoint != 0:
        setFreePoint = curFreePoint + addPoint
        DataRecordPack.DR_Freepoint(curPlayer, "RealmLVUp", addPoint)
        curPlayer.SetFreePoint(setFreePoint)
    return
def DoRealmLVUpLogic(curPlayer, needSys=True):
    curRealmLV = curPlayer.GetOfficialRank()
@@ -258,11 +448,20 @@
        return
    
    curPlayer.SetOfficialRank(nextRealmLv)
    # 提升1级境界加点
    __DoRealmLVUpAddPoint(curPlayer)
    PlayerGubao.DoGubaoAddFreePoint(curPlayer)
    
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmFBIsOpen, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmTaskAwardState, 0)
    syncTaskIDList = []
    taskIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("RealmLVUPTask", nextRealmLv)
    if taskIpyDataList:
        for taskIpyData in taskIpyDataList:
            taskID = taskIpyData.GetTaskID()
            if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmTaskValue % taskID):
                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmTaskValue % taskID, 0)
                syncTaskIDList.append(taskID)
    PlayerControl.PlayerControl(curPlayer).PlayerLvUp()
    if needSys:
        addBuffID = nextRealmIpyData.GetBuffID()
        if addBuffID:
@@ -279,11 +478,11 @@
    if addFreePoint:
        updFreePoint = curPlayer.GetFreePoint() + addFreePoint
        curPlayer.SetFreePoint(updFreePoint)
        GameWorld.DebugLog("    addFreePoint=%s,updFreePoint=%s" % (addFreePoint, updFreePoint))
        GameWorld.DebugLog("    境界阶级加灵根点: addFreePoint=%s,updFreePoint=%s" % (addFreePoint, updFreePoint))
        
    RefreshOfficialAttr(curPlayer)
    GameFuncComm.DoFuncOpenLogic(curPlayer)
    SyncRealmFBState(curPlayer)
    SyncRealmFBState(curPlayer, taskIDList=syncTaskIDList)
    #更新修为速率
    UpdateRealmExp(curPlayer, False, True)
    NotifyRealmExpInfo(curPlayer)
@@ -298,19 +497,6 @@
    #流向
    DataRecordPack.DR_RealmLVUp(curPlayer, nextRealmLv)
    return True
def DologicDujieFBPass(curPlayer, realmLV, star):
    #渡劫通过后处理
    realmIpyData = GetRealmIpyData(realmLV)
    if not realmIpyData:
        return
    #DoRealmLVUpLogic(curPlayer)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmFBIsOpen, 1)
    SyncRealmFBState(curPlayer)
    return
#// A5 21 境界修为池提取 #tagCMTakeOutRealmExp
#