10156 副本功能玩法关联回合战斗表现(符印塔、天星塔战斗改为回合制,功能玩法不变,配置不变;支持新任务系统中的挑战副本、过关副本;)
7个文件已修改
1个文件已添加
566 ■■■■ 已修改文件
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetFB.py 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Adventure.py 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MineArea.py 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_SkyTower.py 329 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_TrialTower.py 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -184,16 +184,17 @@
        return
    isWin, turnNum, turnMax, factionTotalHurtDict, playbackID = fightRet
    
    needSendGameServer, awardItemList = False, []
    needSendGameServer, awardItemList, overInfoEx = False, [], {}
    overRet = FBLogic.OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet)
    if overRet != None:
        needSendGameServer, awardItemList = overRet
        needSendGameServer, awardItemList, overInfoEx = overRet
        
    if needSendGameServer or mapID in ChConfig.Def_TFMapID_SendToGameServer:
        SendToGameServer_TurnFight(curPlayer, "TurnFightOver", [mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList])
        
    overMsg = {"isWin":isWin, "itemInfo":FBCommon.GetJsonItemList(awardItemList), "totalHurt":factionTotalHurtDict.get(1, 0)}
    overMsg = {"isWin":isWin, FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(awardItemList), "totalHurt":factionTotalHurtDict.get(1, 0)}
    playbackID and overMsg.update({"playbackID":playbackID})
    overInfoEx and overMsg.update(overInfoEx)
    SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Award, turnNum, turnMax, overMsg)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetFB.py
New file
@@ -0,0 +1,63 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package GM.Commands.SetFB
#
# @todo:设置副本相关
# @author hxp
# @date 2024-05-11
# @version 1.0
#
# 详细描述: 设置副本相关
#
#-------------------------------------------------------------------------------
#"""Version = 2024-05-11 12:00"""
#-------------------------------------------------------------------------------
import GameWorld
import ChConfig
import FBCommon
import PlayerControl
import GameLogic_TrialTower
import GameLogic_SkyTower
#---------------------------------------------------------------------
#逻辑实现
## GM命令执行入口
#  @param curPlayer 当前玩家
#  @param paramList 参数列表
#  @return None
#  @remarks 函数详细说明.
def OnExec(curPlayer, paramList):
    if not paramList:
        GameWorld.DebugAnswer(curPlayer, "设置线路: SetFB line 地图ID 已过关到线路")
        return
    mapID = None
    value = paramList[0]
    if value == "line":
        mapID = paramList[1] if len(paramList) > 1 else 0
        funcLineID = paramList[2] if len(paramList) > 2 else 0
        if not mapID:
            return
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FBPassLineID % mapID, funcLineID)
        if mapID == ChConfig.Def_FBMapID_TrialTower:
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_TrialTower_PassLV, funcLineID)
            GameLogic_TrialTower.SyncTrialLevelInfo(curPlayer)
        elif mapID == ChConfig.Def_FBMapID_SkyTower:
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_SkyTowerFloor, funcLineID)
            GameLogic_SkyTower.SyncSkyTowerInfo(curPlayer)
        GameWorld.DebugAnswer(curPlayer, "设置副本:%s 已过关:%s" % (mapID, funcLineID))
    else:
        return
    FBCommon.Sync_FBPlayerFBInfoData(curPlayer, mapID)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py
@@ -2439,7 +2439,7 @@
def OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet):
    ## 回合战斗结束
    # @return: 是否需要同步GameServer, 奖励列表
    # @return: 是否需要同步GameServer, 奖励列表, 同步结果信息
    
    do_FBLogic_ID = __GetFBLogic_MapID(mapID)
    
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
@@ -1720,21 +1720,21 @@
    NotifyFBCntRegainInfo(curPlayer, [mapID])
    return
def OnFBOver(curPlayer, mapID, funcLineID, isWin, awardItemList):
    ## 副本结束通用逻辑
def OnFBJoin(curPlayer, mapID, funcLineID):
    ## 副本参与通用逻辑
    PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_FBChallenge, 1, [mapID])
    if not isWin:
        return
    PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_FBPass)
    return
def OnFBPass(curPlayer, mapID, funcLineID, awardItemList=None):
    ## 副本过关通用逻辑
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FBPassLineID % mapID, funcLineID)
    Sync_FBPlayerFBInfoData(curPlayer, mapID)
    
    GameWorld.DebugLog("奖励物品: %s" % awardItemList)
    if awardItemList:
        GameWorld.DebugLog("给奖励物品: %s" % awardItemList)
        ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["FBPass_%s" % mapID, False, {"mapID":mapID, "funcLineID":funcLineID}])
    PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_FBPass)
    return
def RegainFBCntProcess(curPlayer):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Adventure.py
@@ -44,19 +44,22 @@
def OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet):
    ## 回合战斗结束
    # @return: 是否需要同步GameServer, 奖励列表
    # @return: 是否需要同步GameServer, 奖励列表, 同步结果信息
    needSendGameServer = False
    awardItemList = []
    overInfoEx = {}
    isWin = fightRet[0]
    
    GameWorld.DebugLog("冒险关卡结算: funcLineID=%s,isWin=%s" % (funcLineID, isWin))
    
    ipyData = IpyGameDataPY.GetIpyGameData("Adventure", funcLineID)
    if not ipyData:
        return needSendGameServer, awardItemList
        return
    
    if isWin:
        awardItemList = ipyData.GetAwardItemList()
    FBCommon.OnFBOver(curPlayer, mapID, funcLineID, isWin, awardItemList)
    return needSendGameServer, awardItemList
    FBCommon.OnFBJoin(curPlayer, mapID, funcLineID)
    if not isWin:
        return
    awardItemList = ipyData.GetAwardItemList()
    FBCommon.OnFBPass(curPlayer, mapID, funcLineID, awardItemList)
    return needSendGameServer, awardItemList, overInfoEx
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MineArea.py
@@ -48,23 +48,24 @@
def OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet):
    ## 回合战斗结束
    # @return: 是否需要同步GameServer, 奖励列表
    # @return: 是否需要同步GameServer, 奖励列表, 同步结果信息
    needSendGameServer = True
    awardItemList = []
    overInfoEx = {}
    
    # 摇人帮助
    if funcLineID == 0:
        # 无论胜负都要同步GameServer汇报结果
        isWin = fightRet[0]
        if not isWin:
            return needSendGameServer, awardItemList
            return needSendGameServer, awardItemList, overInfoEx
        
        awardItemList = IpyGameDataPY.GetFuncEvalCfg("MineAreaHelp", 2)
        return needSendGameServer, awardItemList
        return needSendGameServer, awardItemList, overInfoEx
    
    # 自己驱赶
    elif funcLineID == 1:
        return needSendGameServer, awardItemList
        return needSendGameServer, awardItemList, overInfoEx
    
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_SkyTower.py
@@ -18,9 +18,7 @@
import FBCommon
import GameWorld
import IPY_GameWorld
import PlayerControl
import NPCCustomRefresh
import ChPyNetSendPack
import ItemControler
import EventShell
@@ -28,34 +26,9 @@
import ShareDefine
import IpyGameDataPY
import ChConfig
import ChPlayer
import PlayerActivity
import PlayerBillboard
import PlayerSuccess
import GameObj
import GameWorldProcess
FBDict_Level = 'FBDict_Level'   # 副本关卡
# 副本通用配置
(
Def_PrepareTime, # 每关准备时间,秒
Def_FightTime, # 每关战斗时间,秒
Def_ExitTime, # 退出时间, 秒
Def_DayPrizeMaxCnt, #每日奖励最多累积几天(配0则无限)
) = range(4)
# 副本状态
(
FB_State_Open, # 副本开启
FB_State_FightPrepare, # 战斗准备时间
FB_State_Fighting, # 战斗
FB_State_FreeTime, # 活动结束准备(胜利/失败)
FB_State_Close, # 关闭副本
) = range(5)
## 天星塔配置
def __GetTrialCfg(): return FBCommon.GetFBLineStepTime(ChConfig.Def_FBMapID_SkyTower)
def GetTowerIpyData(floor):
    return IpyGameDataPY.GetIpyGameData('SkyTower', floor)
@@ -136,18 +109,10 @@
    GameWorld.DebugLog(' 更新天星塔已通关数 %s' % floorID)
    return
## 是否可进入
#  @param curPlayer
#  @param mapID 地图ID
#  @param lineId 分线ID
#  @param tick
#  @return 是否可进入
def OnEnterFBEvent(curPlayer, mapID, lineId, tick):
    return True
## 检查可否进行挑战
def __CheckCanChallenge(curPlayer, floorID):
def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList):
    ## 回合战斗请求 - 地图验证
    floorID = funcLineID
    playerID = curPlayer.GetPlayerID()
    ipyData = GetTowerIpyData(floorID)
    
@@ -164,224 +129,44 @@
        GameWorld.DebugLog("天星塔本关  等级不足%s, 无法挑战!" % ipyData.GetNeedLV(), playerID)
        return False
    
    bossID = ipyData.GetBossID()
    if tagID != bossID or tagType != ChConfig.TurnBattle_TagType_NPC:
        GameWorld.ErrLog("目标bossID错误,无法挑战! mapID=%s,funcLineID=%s,bossID=%s,tagType=%s,tagID=%s"
                         % (mapID, funcLineID, bossID, tagType, tagID), curPlayer.GetPlayerID())
        return False
    return True
##副本玩家进入点
# @param curPlayer 玩家实例
# @param mapID 地图ID
# @param lineId 分线ID
# @param ipyEnterPosInfo 功能线路IPY配置坐标信息
# @param tick 时间戳
# @return posX, posY, 随机半径(可选)
def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick):
    return ipyEnterPosInfo
## 是否可以进入
#  @param ask 请求信息
#  @param tick
#  @return 回复是否通过请求
def OnChangeMapAsk(ask, tick):
    return IPY_GameWorld.cmeAccept
## 进副本
#  @param curPlayer
#  @param tick
#  @return None
def DoEnterFB(curPlayer, tick):
    gameFB = GameWorld.GetGameFB()
    fbStep = gameFB.GetFBStep()
def OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet):
    ## 回合战斗结束
    # @return: 是否需要同步GameServer, 奖励列表, 同步结果信息
    needSendGameServer = False
    awardItemList = []
    overInfoEx = {}
    
    if fbStep == FB_State_FightPrepare:
        notify_tick = __GetTrialCfg()[Def_PrepareTime] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())
        curPlayer.Sync_TimeTick(IPY_GameWorld.tttWaitStart, 0, max(notify_tick, 0), True)
    elif fbStep == FB_State_Fighting:
        notify_tick = __GetTrialCfg()[Def_FightTime] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())
        curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, max(notify_tick, 0), True)
    elif fbStep > FB_State_Fighting:
        PlayerControl.PlayerLeaveFB(curPlayer)
        return
    # 不做处理,有副本行为客户端发包选择挑战关卡
    #EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_SkyTower, 0, ChConfig.CME_Log_Start)
    return
## 副本时间到关闭
#  @param tick 当前时间
#  @return None
#  @remarks 函数详细说明.
def OnCloseFB(tick):
    return
##玩家退出副本.
# @param curPlayer 玩家实例
# @param tick 时间戳
# @return 返回值无意义
# @remarks 玩家主动离开副本.
def DoExitFB(curPlayer, tick):
    # 玩家退出默认关闭副本
    GameWorldProcess.CloseFB(tick)
    return
##副本总逻辑计时器
# @param tick 时间戳
# @return 无意义
# @remarks 副本总逻辑计时器
def OnProcess(tick):
    gameFB = GameWorld.GetGameFB()
    fbStep = gameFB.GetFBStep()
    if fbStep == FB_State_FightPrepare:
        __DoLogic_FightPrepare(tick)
    elif fbStep == FB_State_Fighting:
        __DoLogic_Fighting(tick)
    elif fbStep == FB_State_FreeTime:
        __DoLogic_FreeTime(tick)
    elif fbStep == FB_State_Close:
        pass
    return
## 获取BossID
def __GetSkyTowerBossID(floorID= -1):
    gameFB = GameWorld.GetGameFB()
    if floorID == -1:
        floorID = gameFB.GetGameFBDictByKey(FBDict_Level)
    ipyData = GetTowerIpyData(floorID)
    if not ipyData:
        GameWorld.ErrLog("__GetSkyTowerBossID() can not find %s in SkyTowerNPC.txt" % floorID)
        return 0
    return ipyData.GetBossID()
##战斗准备时间
# @param tick  时钟
# @return 无意义
def __DoLogic_FightPrepare(tick):
    gameFB = GameWorld.GetGameFB()
    trialCfg = __GetTrialCfg()
    if tick - gameFB.GetFBStepTick() < trialCfg[Def_PrepareTime] * 1000:
        return
    bossID = __GetSkyTowerBossID()
    if not bossID:
        FBCommon.DoLogic_FBKickAllPlayer()
        return
    FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttTowerTake, trialCfg[Def_FightTime] * 1000)
    NPCCustomRefresh.SetNPCRefresh(FBCommon.GetFBLineRefreshNPC(ChConfig.Def_FBMapID_SkyTower, 0), [bossID])
    #转入战斗
    FBCommon.SetFBStep(FB_State_Fighting, tick)
    return
## 开始副本关卡
def StartfloorID(curPlayer, floorID, tick):
    if curPlayer.GetPlayerAction() == IPY_GameWorld.paDie:
        GameWorld.DebugLog("复活玩家...", curPlayer.GetPlayerID())
        ChPlayer.PlayerRebornByType(curPlayer, ChConfig.rebornType_City, tick)
    GameObj.SetHPFull(curPlayer)
    FBCommon.ClearFBNPC()
    gameFB = GameWorld.GetGameFB()
    gameFB.SetGameFBDict(FBDict_Level, floorID)
    prepareTick = __GetTrialCfg()[Def_PrepareTime] * 1000
    FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttWaitStart, prepareTick)
    FBCommon.SetFBStep(FB_State_FightPrepare, tick)
    helpDict = {FBCommon.Help_wheel:floorID}
    FBCommon.Notify_FBHelp(curPlayer, helpDict)
    GameWorld.DebugLog("StartfloorID, floorID=%s, helpDict=%s"
                       % (floorID, str(helpDict)), curPlayer.GetPlayerID())
    return
##战斗时间
# @param tick  时钟
# @return 无意义
def __DoLogic_Fighting(tick):
    gameFB = GameWorld.GetGameFB()
    #判断时间结束
    if tick - gameFB.GetFBStepTick() < __GetTrialCfg()[Def_FightTime] * 1000:
        return
    floorID = gameFB.GetGameFBDictByKey(FBDict_Level)
    playerManager = GameWorld.GetMapCopyPlayerManager()
    for index in xrange(playerManager.GetPlayerCount()):
        curPlayer = playerManager.GetPlayerByIndex(index)
        if not curPlayer:
            continue
        __SendSkyTowerOverInfo(curPlayer, floorID, False)
    #游戏结束
    __SetFBToFreeTime(tick)
    return
##设置副本进入离开状态
# @param tick  时钟
# @return 无意义
def __SetFBToFreeTime(tick):
    FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttLeaveMap, __GetTrialCfg()[Def_ExitTime] * 1000)
    FBCommon.SetFBStep(FB_State_FreeTime, tick)
    return
##比赛结束的空闲时间
# @param tick  时钟
# @return 无意义
# @remarks 比赛结束的空闲时间
def __DoLogic_FreeTime(tick):
    if tick - GameWorld.GetGameFB().GetFBStepTick() < __GetTrialCfg()[Def_ExitTime] * 1000:
        return
    #FBCommon.DoLogic_FBKickAllPlayer()
    return
## 杀怪
#  @param curPlayer
#  @param curNPC 被杀的怪
#  @param tick
#  @return None
def DoFB_Player_KillNPC(curPlayer, curNPC, tick):
    gameFB = GameWorld.GetGameFB()
    if gameFB.GetFBStep() != FB_State_Fighting:
        return
    bossID = __GetSkyTowerBossID()
    if bossID != curNPC.GetNPCID():
        return
    floorID = gameFB.GetGameFBDictByKey(FBDict_Level)
    # 过关全服广播
    floorID = funcLineID
    ipyData = GetTowerIpyData(floorID)
    if not ipyData:
        return
    FBCommon.OnFBJoin(curPlayer, mapID, funcLineID)
    isWin = fightRet[0]
    if not isWin:
        return
    
    if ipyData.GetIsNotify():
        sysMark = 'KillGodTowerInfo_1'# if floorID == maxLevel else 'GeRen_liubo_471172'
        PlayerControl.WorldNotify(0, sysMark, [curPlayer.GetPlayerName(), floorID])
    #更新关卡
    SetSkyTowerCurfloorID(curPlayer, floorID)
    # 给过关奖励
    prizeDict = __GiveFBPassPrize(curPlayer, ipyData)
    # 过关时间
    costTime = tick - GameWorld.GetGameFB().GetFBStepTick()
    prizeDict[FBCommon.Over_costTime] = costTime
    __SendSkyTowerOverInfo(curPlayer, floorID, True, prizeDict)
    PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_SkyTower)
    
    SyncSkyTowerInfo(curPlayer, 0) # 同步最新关卡信息
    __SetFBToFreeTime(tick)
    
    if floorID >= 10:
        PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_SkyTower, floorID)
@@ -400,9 +185,9 @@
        GameWorld.DebugLog("全服过关信息同步GameServer: %s" % msgInfo, playerID)
        GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "SkyTower", msgInfo, len(msgInfo))
        
    return
    FBCommon.OnFBPass(curPlayer, mapID, funcLineID)
    overInfoEx.update(prizeDict)
    return needSendGameServer, awardItemList, overInfoEx
## 给过关奖励
def __GiveFBPassPrize(curPlayer, ipyData):
@@ -414,8 +199,6 @@
    prizeDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(giveItemList)}
    return prizeDict
## 发送挑战结果信息
def __SendSkyTowerOverInfo(curPlayer, floorID, isPass, overDict={}):
    
@@ -424,63 +207,6 @@
    overDict[FBCommon.Over_isPass] = int(isPass)
    GameWorld.DebugLog("__SendSkyTowerOverInfo overDict=%s" % (str(overDict)), curPlayer.GetPlayerID())
    FBCommon.Notify_FB_Over(curPlayer, overDict)
    return
## 检查是否可攻击, 主判定不可攻击的情况,其他逻辑由外层决定
#  @param attacker 攻击方
#  @param defender 防守方
#  @return bool
def CheckCanAttackTagObjInFB(attacker, defender):
    gameFB = GameWorld.GetGameFB()
    if gameFB.GetFBStep() != FB_State_Fighting:
        return False
    return True
##玩家死亡.
# @param curPlayer:死亡的玩家
# @param tick 时间戳
# @return 返回值无意义
# @remarks 玩家主动离开副本.
def DoPlayerDead(curPlayer):
    gameFB = GameWorld.GetGameFB()
    floorID = gameFB.GetGameFBDictByKey(FBDict_Level)
    __SendSkyTowerOverInfo(curPlayer, floorID, False)
    tick = GameWorld.GetGameWorld().GetTick()
    #游戏结束
    __SetFBToFreeTime(tick)
    return
## 是否副本复活
#  @param None
#  @return 是否副本复活
def OnPlayerReborn():
    return True
## 副本行为
#  @param curPlayer 玩家
#  @param actionType 行为类型
#  @param actionInfo 行为信息
#  @param tick 当前时间
#  @return None
def DoFBAction(curPlayer, actionType, actionInfo, tick):
    # 默认为选择关卡,由客户端决定,进场及副本选关通用此行为
    if actionInfo <= 0:
        return
    gameFB = GameWorld.GetGameFB()
    fbStep = gameFB.GetFBStep()
    if fbStep in [FB_State_FightPrepare, FB_State_Fighting]:
        GameWorld.DebugLog("准备或战斗中, 无法变更关卡!")
        return
    floorID = actionInfo
    if not __CheckCanChallenge(curPlayer, floorID):
        FBCommon.DoLogic_FBKickAllPlayer()
        return
    StartfloorID(curPlayer, floorID, tick)
    return
def OnGetSkyTowerServerChallengeReward(curPlayer, floorID, needPlayerCount):
@@ -565,5 +291,4 @@
        SyncSkyTowerInfo(curPlayer, floorID)
        
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_TrialTower.py
@@ -18,19 +18,15 @@
import FBCommon
import GameWorld
import IPY_GameWorld
import PlayerControl
import NPCCustomRefresh
import ChPyNetSendPack
import ItemControler
import EventShell
import NetPackCommon
import ShareDefine
import IpyGameDataPY
import PlayerRune
import ItemCommon
import ChConfig
import ChPlayer
import PlayerSuccess
import PlayerActivity
import PlayerBillboard
@@ -38,7 +34,6 @@
import PlayerActLogin
import EventReport
import PlayerBossReborn
import GameObj
import random
import math
@@ -84,38 +79,44 @@
    GameWorld.DebugLog(' 更新符印塔已通关数 %s' % passlv)
    return
## 获取BossID
def __GetTrialBossID(fbLevel= -1):
    gameFB = GameWorld.GetGameFB()
    if fbLevel == -1:
        fbLevel = gameFB.GetGameFBDictByKey(FBDict_Level)
    ipyData = GetTowerIpyData(fbLevel)
def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList):
    ## 回合战斗请求 - 地图验证
    playerID = curPlayer.GetPlayerID()
    ipyData = GetTowerIpyData(funcLineID)
    
    if not ipyData:
        GameWorld.ErrLog("__GetTrialBossID() can not find %s in TrialTowerNPC.txt" % fbLevel)
        return 0
    return ipyData.GetNPCID()
## 杀怪
#  @param curPlayer
#  @param curNPC 被杀的怪
#  @param tick
#  @return None
def DoFB_Player_KillNPC(curPlayer, curNPC, tick):
    gameFB = GameWorld.GetGameFB()
    if gameFB.GetFBStep() != FB_State_Fighting:
        return
    bossID = __GetTrialBossID()
    if bossID != curNPC.GetNPCID():
        return
        GameWorld.ErrLog("符印塔关卡不存在: funcLineID=%s" % (funcLineID), playerID)
        return False
    
    # 是否已过关
    if funcLineID <= __GetTrialLevelCurPassLV(curPlayer):
        GameWorld.DebugLog("符印塔本关已过关, 无法挑战! funcLineID=%s" % funcLineID, playerID)
        return False
    
    fbLevel = gameFB.GetGameFBDictByKey(FBDict_Level)
    # 过关全服广播
    bossID = ipyData.GetNPCID()
    if tagID != bossID or tagType != ChConfig.TurnBattle_TagType_NPC:
        GameWorld.ErrLog("目标bossID错误,无法挑战! mapID=%s,funcLineID=%s,bossID=%s,tagType=%s,tagID=%s"
                         % (mapID, funcLineID, bossID, tagType, tagID), curPlayer.GetPlayerID())
        return False
    return True
def OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet):
    ## 回合战斗结束
    # @return: 是否需要同步GameServer, 奖励列表, 同步结果信息
    needSendGameServer = False
    awardItemList = []
    overInfoEx = {}
    fbLevel = funcLineID
    ipyData = GetTowerIpyData(fbLevel)
    if not ipyData:
        return
    FBCommon.OnFBJoin(curPlayer, mapID, funcLineID)
    isWin = fightRet[0]
    if not isWin:
        return
    
    floorCnt = IpyGameDataPY.GetFuncCfg('TowerRuneType', 2)
@@ -123,31 +124,31 @@
        # 记录过关
        EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_TrialTower, 0, ChConfig.CME_Log_End, 0, 1)
        
    # 过关全服广播
    if ipyData.GetIsNotify():
        IPY_Data = IpyGameDataPY.IPY_Data()
        maxLevel = IPY_Data.GetRuneTowerByIndex(IPY_Data.GetRuneTowerCount()-1).GetID()
        sysMark = 'RuneTowerInfo_1' if fbLevel == maxLevel else 'GeRen_liubo_471172'
        PlayerControl.WorldNotify(0, sysMark,
                                  [curPlayer.GetPlayerName(), fbLevel / 100])
        PlayerControl.WorldNotify(0, sysMark, [curPlayer.GetPlayerName(), fbLevel / 100])
    #更新关卡
    SetTrialLevelCurPassLV(curPlayer, fbLevel)
    # 给过关奖励
    prizeDict = __GiveFBPassPrize(curPlayer, fbLevel)
    # 过关时间
    costTime = tick - GameWorld.GetGameFB().GetFBStepTick()
    prizeDict[FBCommon.Over_costTime] = costTime
    __SendTrialTowerOverInfo(curPlayer, fbLevel, True, prizeDict)
    
    #任务
    EventShell.EventRespons_TrialTowerCnt(curPlayer, fbLevel)
    #EventShell.EventRespons_TrialTowerCnt(curPlayer, fbLevel)
    
    SyncTrialLevelInfo(curPlayer) # 同步最新关卡信息
    __SetFBToFreeTime(tick)
    #每日任务
    PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_Tower)
    return
    FBCommon.OnFBPass(curPlayer, mapID, funcLineID)
    overInfoEx.update(prizeDict)
    return needSendGameServer, awardItemList, overInfoEx
## 给过关奖励
def __GiveFBPassPrize(curPlayer, fbLevel):
@@ -397,39 +398,3 @@
    PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_TowerSweep, 1)
    PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_TowerSweep, 1)
    return True
def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList):
    ## 回合战斗请求 - 地图验证
    playerID = curPlayer.GetPlayerID()
    ipyData = GetTowerIpyData(funcLineID)
    if not ipyData:
        GameWorld.ErrLog("符印塔关卡不存在: funcLineID=%s" % (funcLineID), playerID)
        return False
    # 是否已过关
    if funcLineID <= __GetTrialLevelCurPassLV(curPlayer):
        GameWorld.DebugLog("符印塔本关已过关, 无法挑战! funcLineID=%s" % funcLineID, playerID)
        return False
    return True
def OnTurnFightOver(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet):
    ## 回合战斗结束
    # @return: 是否需要同步GameServer, 奖励列表, 发放方式(0-不发放, 1-TurnAttack模块统一发放, 2-功能自己决定发放逻辑)
    needSendGameServer = False
    awardItemList = []
    awardWay = 2
    isWin = fightRet[0]
    if not isWin:
        return needSendGameServer, awardItemList, awardWay
    return needSendGameServer, awardItemList, awardWay
    return