hxp
2024-12-17 d1771581d7b1d365a45a0aa075927c49e83618db
10337 【越南】【英文】【BT】【砍树】爬塔通关类的支持一键过关
8个文件已修改
403 ■■■■■ 已修改文件
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_RealmTower.py 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_SkyTower.py 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_TrialTower.py 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFB.py 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -19044,6 +19044,62 @@
#------------------------------------------------------
# B1 08 快速一键过关副本 #tagCMFBQuickPass
class  tagCMFBQuickPass(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("MapID", c_int),
                  ("LineID", c_ushort),
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xB1
        self.SubCmd = 0x08
        return
    def ReadData(self, stringData, _pos=0, _len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
    def Clear(self):
        self.Cmd = 0xB1
        self.SubCmd = 0x08
        self.MapID = 0
        self.LineID = 0
        return
    def GetLength(self):
        return sizeof(tagCMFBQuickPass)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// B1 08 快速一键过关副本 //tagCMFBQuickPass:
                                Cmd:%s,
                                SubCmd:%s,
                                MapID:%d,
                                LineID:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.MapID,
                                self.LineID
                                )
        return DumpString
m_NAtagCMFBQuickPass=tagCMFBQuickPass()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMFBQuickPass.Cmd,m_NAtagCMFBQuickPass.SubCmd))] = m_NAtagCMFBQuickPass
#------------------------------------------------------
# B1 06 助战召唤 #tagCMHelpBattleCall
class  tagCMHelpBattleCall(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -488,9 +488,9 @@
PacketSubCMD_8=0x04
PacketCallFunc_8=OnClientStartFB
PacketCMD_9=
PacketSubCMD_9=
PacketCallFunc_9=
PacketCMD_9=0xB1
PacketSubCMD_9=0x08
PacketCallFunc_9=OnFBQuickPass
PacketCMD_10=
PacketSubCMD_10=
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -19044,6 +19044,62 @@
#------------------------------------------------------
# B1 08 快速一键过关副本 #tagCMFBQuickPass
class  tagCMFBQuickPass(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("MapID", c_int),
                  ("LineID", c_ushort),
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xB1
        self.SubCmd = 0x08
        return
    def ReadData(self, stringData, _pos=0, _len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
    def Clear(self):
        self.Cmd = 0xB1
        self.SubCmd = 0x08
        self.MapID = 0
        self.LineID = 0
        return
    def GetLength(self):
        return sizeof(tagCMFBQuickPass)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// B1 08 快速一键过关副本 //tagCMFBQuickPass:
                                Cmd:%s,
                                SubCmd:%s,
                                MapID:%d,
                                LineID:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.MapID,
                                self.LineID
                                )
        return DumpString
m_NAtagCMFBQuickPass=tagCMFBQuickPass()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMFBQuickPass.Cmd,m_NAtagCMFBQuickPass.SubCmd))] = m_NAtagCMFBQuickPass
#------------------------------------------------------
# B1 06 助战召唤 #tagCMHelpBattleCall
class  tagCMHelpBattleCall(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py
@@ -1668,6 +1668,36 @@
    
    return callFunc(curPlayer, mapID, lineID, cnt, dataEx)
def OnPlayerFBQuickPass(curPlayer, mapID, lineID):
    '''副本快速过关验证
    @param mapID: 数据地图ID
    @param lineID: 目标关卡线路ID,可一次性跳多关,由前端发包决定
    @return: (bossID, quickCnt) 或  None
    @note: bossID 目标NPCID - 目标关卡所需要挑战的主NPCID,一般是boss,用于验证战力是否满足快速过关
    @note: quickCnt 本次总共跳过几关 - 默认1
    '''
    do_FBLogic_ID = __GetFBLogic_MapID(mapID)
    callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "OnPlayerFBQuickPass"))
    # 没有额外条件判断默认返回True
    if callFunc == None:
        return
    return callFunc(curPlayer, mapID, lineID)
def OnPlayerFBQuickPassResult(curPlayer, mapID, lineID):
    '''副本快速过关结果
    '''
    do_FBLogic_ID = __GetFBLogic_MapID(mapID)
    callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "OnPlayerFBQuickPassResult"))
    if callFunc == None:
        return
    return callFunc(curPlayer, mapID, lineID)
#---------------------------------------------------------------------
## 切换地图询问(只询问第一条线) 判断是否可以进入副本
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_RealmTower.py
@@ -67,7 +67,7 @@
    return __CheckCanChallenge(curPlayer, nextFloorID)
## 检查可否进行挑战
def __CheckCanChallenge(curPlayer, floorID):
def __CheckCanChallenge(curPlayer, floorID, checkPre=True):
    playerID = curPlayer.GetPlayerID()
    ipyData = GetTowerIpyData(floorID)
    if not ipyData:
@@ -79,7 +79,7 @@
        GameWorld.DebugLog("该境界塔层已过关: floorID=%s" % floorID, playerID)
        return False
    
    if floorID > curFloorID + 1:
    if checkPre and floorID > curFloorID + 1:
        GameWorld.DebugLog("上一层未过关: floorID=%s > curFloorID=%s+1" % (floorID, curFloorID), playerID)
        return False
    
@@ -138,9 +138,10 @@
    return
## 获取BossID
def __GetRealmTowerBossID():
    gameFB = GameWorld.GetGameFB()
    floorID = gameFB.GetGameFBDictByKey(FBDict_Floor)
def __GetRealmTowerBossID(floorID=-1):
    if floorID == -1:
        gameFB = GameWorld.GetGameFB()
        floorID = gameFB.GetGameFBDictByKey(FBDict_Floor)
    ipyData = GetTowerIpyData(floorID)
    if not ipyData:
        GameWorld.ErrLog("__GetRealmTowerBossID() can not find %s in RealmTowerNPC.txt" % floorID)
@@ -308,3 +309,50 @@
    
    StartfloorID(curPlayer, floorID, tick)
    return
def OnPlayerFBQuickPass(curPlayer, mapID, lineID):
    '''副本快速过关验证
    @param mapID: 数据地图ID
    @param lineID: 目标关卡线路ID,可一次性跳多关,由前端发包决定
    @return: (bossID, quickCnt) 或  None
    @note: bossID 目标NPCID - 目标关卡所需要挑战的主NPCID,一般是boss,用于验证战力是否满足快速过关
    @note: quickCnt 本次总共跳过几关 - 默认1
    '''
    if not __CheckCanChallenge(curPlayer, lineID, False):
        return
    curLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RealmTowerFloor)
    bossID = __GetRealmTowerBossID(lineID)
    quickCnt = lineID - curLineID
    return bossID, quickCnt
def OnPlayerFBQuickPassResult(curPlayer, mapID, lineID):
    '''副本快速过关结果
    '''
    playerID = curPlayer.GetPlayerID()
    curLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RealmTowerFloor)
    fromLineID = curLineID + 1
    GameWorld.DebugLog("处理快速过关结算: mapID=%s,fromLineID=%s to %s" % (mapID, fromLineID, lineID), playerID)
    itemListTotal = []
    for floorID in range(fromLineID, lineID + 1):
        ipyData = GetTowerIpyData(floorID)
        if not ipyData:
            continue
        #更新关卡
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_RealmTowerFloor, floorID)
        GameWorld.DebugLog('更新境界塔快速过关: floorID=%s' % floorID, playerID)
        # 给过关奖励
        giveItemList = ipyData.GetRewardItemList()
        itemListTotal += giveItemList
    prizeItemList = GameWorld.MergeItemList(itemListTotal)
    ItemControler.GivePlayerItemOrMail(curPlayer, prizeItemList, None, ["RealmTower", False, {}])
    quickPassDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(prizeItemList), "quickPass":1}
    __SendRealmTowerOverInfo(curPlayer, floorID, True, quickPassDict)
    SyncRealmTowerInfo(curPlayer)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_SkyTower.py
@@ -570,4 +570,73 @@
        
    return
def OnPlayerFBQuickPass(curPlayer, mapID, lineID):
    '''副本快速过关验证
    @param mapID: 数据地图ID
    @param lineID: 目标关卡线路ID,可一次性跳多关,由前端发包决定
    @return: (bossID, quickCnt) 或  None
    @note: bossID 目标NPCID - 目标关卡所需要挑战的主NPCID,一般是boss,用于验证战力是否满足快速过关
    @note: quickCnt 本次总共跳过几关 - 默认1
    '''
    if not __CheckCanChallenge(curPlayer, lineID):
        return
    curLineID = __GetSkyTowerCurFloor(curPlayer)
    bossID = __GetSkyTowerBossID(lineID)
    quickCnt = lineID - curLineID
    return bossID, quickCnt
def OnPlayerFBQuickPassResult(curPlayer, mapID, lineID):
    '''副本快速过关结果
    '''
    playerID = curPlayer.GetPlayerID()
    curLineID = __GetSkyTowerCurFloor(curPlayer)
    fromLineID = curLineID + 1
    GameWorld.DebugLog("处理快速过关结算: mapID=%s,fromLineID=%s to %s" % (mapID, fromLineID, lineID), playerID)
    itemListTotal = []
    for floorID in range(fromLineID, lineID + 1):
        ipyData = GetTowerIpyData(floorID)
        if not ipyData:
            continue
        if ipyData.GetIsNotify():
            sysMark = 'KillGodTowerInfo_1'# if floorID == maxLevel else 'GeRen_liubo_471172'
            PlayerControl.WorldNotify(0, sysMark, [curPlayer.GetPlayerName(), floorID])
        #更新关卡
        SetSkyTowerCurfloorID(curPlayer, floorID)
        #过关奖励
        giveItemDict = ipyData.GetReward()
        giveItemList = [[itemID, itemCnt, 0] for itemID, itemCnt in giveItemDict.items()]
        itemListTotal += giveItemList
        PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_SkyTower)
        # 全服目标
        ipyDataServer = IpyGameDataPY.GetIpyGameDataNotLog("SkyTowerServerChallenge", floorID)
        if ipyDataServer:
            maxNeedPassCount = 0
            rankRewardInfo = ipyDataServer.GetPassRankRewardInfo()
            for rank in rankRewardInfo.keys():
                maxNeedPassCount = max(maxNeedPassCount, int(rank))
            for needPlayerCount in ipyDataServer.GetServerRewardInfo().keys():
                maxNeedPassCount = max(maxNeedPassCount, int(needPlayerCount))
            playerID = curPlayer.GetPlayerID()
            msgInfo = str(["ServerChallengePass", [floorID, maxNeedPassCount, rankRewardInfo]])
            GameWorld.DebugLog("全服过关信息同步GameServer: %s" % msgInfo, playerID)
            GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "SkyTower", msgInfo, len(msgInfo))
    prizeItemList = GameWorld.MergeItemList(itemListTotal)
    ItemControler.GivePlayerItemOrMail(curPlayer, prizeItemList, None, ["SKYTower", False, {}])
    quickPassDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(prizeItemList), "quickPass":1}
    __SendSkyTowerOverInfo(curPlayer, floorID, True, quickPassDict)
    SyncSkyTowerInfo(curPlayer, 0) # 同步最新关卡信息
    if floorID >= 10:
        PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_SkyTower, floorID)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_TrialTower.py
@@ -355,7 +355,7 @@
## 给过关奖励
def __GiveFBPassPrize(curPlayer, fbLevel):
def __GiveFBPassPrize(curPlayer, fbLevel, moneyDictTotal=None, itemListTotal=None):
    ipyData = GetTowerIpyData(fbLevel)
    if not ipyData:
        return {}
@@ -406,6 +406,11 @@
    moneyDict = {ShareDefine.TYPE_Price_Rune:addJH, ShareDefine.TYPE_Price_Ysog:RuneMagicEssence}
    prizeDict = {FBCommon.Over_money:FBCommon.GetJsonMoneyList(moneyDict), FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(prizeItemList)}
    
    if isinstance(moneyDictTotal, dict):
        for moneyType, addValue in moneyDict.items():
            moneyDictTotal[moneyType] = moneyDictTotal.get(moneyType, 0) + addValue
    if isinstance(itemListTotal, list):
        itemListTotal += prizeItemList
#    for _ in xrange(challengeCnt):
#        EventReport.WriteEvent_custom_mission_log(curPlayer, ChConfig.CME_FB_TrialTower, ChConfig.CME_Log_End, 1, cmeInfoEx=bossName)
    return prizeDict
@@ -659,4 +664,73 @@
    #BOSS复活活动
    PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_TowerSweep, 1)
    PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_TowerSweep, 1)
    return True
    return True
def OnPlayerFBQuickPass(curPlayer, mapID, lineID):
    '''副本快速过关验证
    @param mapID: 数据地图ID
    @param lineID: 目标关卡线路ID,可一次性跳多关,由前端发包决定
    @return: (bossID, quickCnt) 或  None
    @note: bossID 目标NPCID - 目标关卡所需要挑战的主NPCID,一般是boss,用于验证战力是否满足快速过关
    @note: quickCnt 本次总共跳过几关 - 默认1
    '''
    ipyData = GetTowerIpyData(lineID)
    if not ipyData:
        return
    curLineID = __GetTrialLevelCurPassLV(curPlayer)
    if lineID <= curLineID:
        GameWorld.DebugLog("符印塔本关已过关, 无法挑战! lineID=%s" % lineID, curPlayer.GetPlayerID())
        return
    bossID = ipyData.GetNPCID()
    quickCnt = 0 #lineID - curLineID
    fromLineID = curLineID + 1
    for passLineID in range(fromLineID, lineID + 1):
        # 符印塔lineID可能会跳,这里遍历不输出找不到的lineID
        ipyData = IpyGameDataPY.GetIpyGameDataNotLog('RuneTower', passLineID)
        if not ipyData:
            continue
        quickCnt += 1
    return bossID, quickCnt
def OnPlayerFBQuickPassResult(curPlayer, mapID, lineID):
    '''副本快速过关结果
    '''
    playerID = curPlayer.GetPlayerID()
    curLineID = __GetTrialLevelCurPassLV(curPlayer)
    fromLineID = curLineID + 1
    GameWorld.DebugLog("处理快速过关结算: mapID=%s,fromLineID=%s to %s" % (mapID, fromLineID, lineID), playerID)
    moneyDictTotal = {}
    itemListTotal = []
    for passLineID in range(fromLineID, lineID + 1):
        ipyData = IpyGameDataPY.GetIpyGameDataNotLog('RuneTower', passLineID)
        if not ipyData:
            continue
        if ipyData.GetIsNotify():
            IPY_Data = IpyGameDataPY.IPY_Data()
            maxLevel = IPY_Data.GetRuneTowerByIndex(IPY_Data.GetRuneTowerCount()-1).GetID()
            sysMark = 'RuneTowerInfo_1' if passLineID == maxLevel else 'GeRen_liubo_471172'
            PlayerControl.WorldNotify(0, sysMark, [curPlayer.GetPlayerName(), passLineID / 100])
        #更新关卡
        SetTrialLevelCurPassLV(curPlayer, passLineID)
        # 给过关奖励
        __GiveFBPassPrize(curPlayer, passLineID, moneyDictTotal, itemListTotal)
        #任务
        EventShell.EventRespons_TrialTowerCnt(curPlayer, passLineID)
        #每日任务
        PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_Tower)
    prizeItemList = GameWorld.MergeItemList(itemListTotal)
    quickPassDict = {FBCommon.Over_money:FBCommon.GetJsonMoneyList(moneyDictTotal),
                     FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(prizeItemList),
                     "quickPass":1}
    __SendTrialTowerOverInfo(curPlayer, passLineID, True, quickPassDict)
    SyncTrialLevelInfo(curPlayer) # 同步最新关卡信息
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFB.py
@@ -626,3 +626,53 @@
    packData.Cnt = len(packData.InfoList)
    NetPackCommon.SendFakePack(curPlayer, packData)
    return
#// B1 08 快速一键过关副本 #tagCMFBQuickPass
#
#struct    tagCMFBQuickPass
#{
#    tagHead         Head;
#    DWORD        MapID;
#    WORD        LineID;
#};
def OnFBQuickPass(playerIndex, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)
    playerID = curPlayer.GetPlayerID()
    mapID = clientData.MapID
    lineID = clientData.LineID
    GameWorld.DebugLog("玩家请求快速一键过关副本: mapID=%s,lineID=%s" % (mapID, lineID), playerID)
    fbIpyData = FBCommon.GetFBIpyData(mapID)
    fbLineIpyData = FBCommon.GetFBLineIpyData(mapID, lineID)
    if FBCommon.CheckCanEnterFBComm(curPlayer, mapID, lineID, fbIpyData, fbLineIpyData) != ShareDefine.EntFBAskRet_OK:
        return
    reqRet = FBLogic.OnPlayerFBQuickPass(curPlayer, mapID, lineID)
    if not reqRet or len(reqRet) != 2:
        GameWorld.DebugLog("无法一键过关副本: mapID=%s,lineID=%s" % (mapID, lineID), playerID)
        return
    bossID, quickCnt = reqRet
    if bossID:
        npcData = GameWorld.GetGameData().FindNPCDataByID(bossID)
        if not npcData:
            return
        npcFightPower = NPCCommon.GetSuppressFightPower(npcData)
        quickNeedRatio = IpyGameDataPY.GetFuncCfg("FBQuickPass", 1)
        quickNeedFightPower = int(npcFightPower * quickNeedRatio)
        curFightPower = PlayerControl.GetFightPower(curPlayer)
        if quickNeedFightPower and curFightPower < quickNeedFightPower:
            GameWorld.DebugLog("无法一键过关副本! 战力限制: mapID=%s,lineID=%s,bossID=%s,npcFightPower=%s,quickNeedFightPower=%s > %s"
                               % (mapID, lineID, bossID, npcFightPower, quickNeedFightPower, curFightPower), playerID)
            return
    #增加副本进入次数
    if fbIpyData and fbIpyData.GetDayTimes() and quickCnt:
        # 跳关超过1关的要重新验证下
        if quickCnt > 1 and FBCommon.CheckCanEnterFBComm(curPlayer, mapID, lineID, fbIpyData, fbLineIpyData, quickCnt) != ShareDefine.EntFBAskRet_OK:
            return
        FBCommon.AddEnterFBCount(curPlayer, mapID, quickCnt)
    #扫荡结果给奖励等
    FBLogic.OnPlayerFBQuickPassResult(curPlayer, mapID, lineID)
    return