xdh
2019-05-27 11999c0e61fd4ce20316b7a26514e66ebea4e070
6743 【后端】【2.0】31250副本地图修改为前端副本
1个文件已修改
447 ■■■■■ 已修改文件
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Guard.py 447 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Guard.py
@@ -14,78 +14,15 @@
#-------------------------------------------------------------------------------
#"""Version = 2017-12-22 14:00"""
#-------------------------------------------------------------------------------
import ChConfig
import FBCommon
import GameWorld
import IpyGameDataPY
import IPY_GameWorld
import GameWorldProcess
import NPCCustomRefresh
import ChConfig
import ShareDefine
import ItemControler
import PlayerControl
import EventShell
import EventReport
#---副本配置对应key值---
(
Def_PrepareTime, # 副本准备时间(秒)
Def_FightTime, # 进行时间(秒)
Def_LeaveTime, # 退出时间(秒)
) = range(3)
(
DL_RefreshMark, # 刷怪标识点
DL_NPCID, # NPCID
DL_SingleNPCCnt, # 单次刷NPC个数
DL_maxCnt, #当前点最大怪物数
DL_TotalNPCCnt, # 累计刷NPC总个数
DL_NeedKillCnt, # 需要击杀数量
DL_RefreshCD, # 刷新间隔
) = range(7)
#当前副本地图的状态
(
FB_Step_Open, # 副本开启
FB_Step_Prepare, # 副本等待
FB_Step_Fighting, # 副本进行中
FB_Step_Over, # 副本结束
FB_Step_Close, # 副本关闭
) = range(5)
#副本进行的关卡
(
Def_Prepare, # 准备
Def_KillBandit, # 击杀强盗
Def_BreakCage, # 破坏笼子
Def_Dialog, # 与幼龙对话
Def_EndGuard, # 结束
) = range(5)
FBPlayerDict_GameStep = 'FBPlayerDict_GameStep' #关卡
FBPlayerDict_NPCKillCnt = 'FBPlayerDict_NPCKillCnt'   # NPC已击杀数量
FBPlayerDict_NPCNeedKillCnt = 'FBPlayerDict_NPCNeedKillCnt'   # NPC需要击杀数量
FBPlayerDict_TotalExp = 'FBPlayerDict_TotalExp'   # 获得的总经验
FBPlayerDict_TotalExpPoint = 'FBPlayerDict_TotalExpPoint'   # 获得的总经验点
##---获得副本配置---
#  @param None
#  @return 配置信息
def GetGuardTimeCfg():
    return FBCommon.GetFBLineStepTime(GameWorld.GetMap().GetMapID(), 0)
##开启副本
# @param tick 时间戳
# @return 返回值无意义
# @remarks 开启副本
def OnOpenFB(tick):
    FBCommon.OpenOrCloseDoorEx([IpyGameDataPY.GetFuncCfg('GuardFBCageNPCID', 2)], 0)
    return
## 是否能够通过活动查询进入
#  @param curPlayer 玩家实例
@@ -94,370 +31,26 @@
#  @param tick 时间戳
#  @return 布尔值
def OnEnterFBEvent(curPlayer, mapID, lineID, tick):
    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:请求结构体(IPY_BMChangeMapAsk)
# @param tick:时间戳
# @return IPY_GameWorld.cme 枚举
def OnChangeMapAsk(ask, tick):
    return IPY_GameWorld.cmeAccept
def SetMap_Guard_GameStep(gameStep):
    ## 设置副本步骤
    GameWorld.GetGameFB().SetGameFBDict(FBPlayerDict_GameStep, gameStep)
    return
## 进副本
#  @param curPlayer
#  @param tick
#  @return None
def DoEnterFB(curPlayer, tick):
    playerID = curPlayer.GetPlayerID()
    playerLV = curPlayer.GetLV()
    mapID = GameWorld.GetMap().GetMapID()
    mapID = FBCommon.GetRecordMapID(mapID)
    gameFB = GameWorld.GetGameFB()
    GameWorld.DebugLog("DoEnterFB...,playerLV=%s" % (playerLV), playerID)
    hadDelTicket = FBCommon.GetHadDelTicket(curPlayer)
    if not hadDelTicket:
        FBCommon.SetHadDelTicket(curPlayer)
        # 新手剧情副本重置所有技能CD
        skillManager = curPlayer.GetSkillManager()
        for i in range(0, skillManager.GetSkillCount()):
            curSkill = skillManager.GetSkillByIndex(i)
            if curSkill.GetRemainTime() != 0:
                curSkill.SetRemainTime(0)
                curSkill.Sync_Skill()
        EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_Guard, 0, ChConfig.CME_Log_Start)
        GameWorld.DebugLog("此副本刚进入时不直接开始,需等前端通知开始才开始!", playerID) # 掉线重上强制开始
        return
    fbStep = gameFB.GetFBStep()
    if fbStep < FB_Step_Prepare:
        FBCommon.SetFBStep(FB_Step_Prepare, tick)
    if fbStep <= FB_Step_Prepare:
        notify_tick = GetGuardTimeCfg()[Def_PrepareTime] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())
        curPlayer.Sync_TimeTick(IPY_GameWorld.tttWaitStart, 0, max(notify_tick, 0), True)
    elif fbStep == FB_Step_Fighting:
        notify_tick = GetGuardTimeCfg()[Def_FightTime] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())
        curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, max(notify_tick, 0), True)
    DoFBHelp(curPlayer, tick)
    return
## 客户端发送开始副本
def OnClientStartFB(curPlayer, tick):
    gameFB = GameWorld.GetGameFB()
    fbStep = gameFB.GetFBStep()
    if fbStep >= FB_Step_Prepare:
        GameWorld.ErrLog("前端请求正式开始副本, 但副本已经开始了,不可重复开始!", curPlayer.GetPlayerID())
        return
    GameWorld.DebugLog("前端场景秀已播放完毕,请求正式开始副本!", curPlayer.GetPlayerID())
    FBCommon.SetFBStep(FB_Step_Prepare, tick)
    notify_tick = GetGuardTimeCfg()[Def_PrepareTime] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())
    curPlayer.Sync_TimeTick(IPY_GameWorld.tttWaitStart, 0, max(notify_tick, 0), True)
    DoFBHelp(curPlayer, tick)
    return
##玩家退出副本
# @param curPlayer 玩家实例
# @param tick 时间戳
# @return 无意义
def DoExitFB(curPlayer, tick):
    step = GameWorld.GetGameFB().GetGameFBDictByKey(FBPlayerDict_GameStep)
    if step == Def_EndGuard:
        itemID, giveExp = FBCommon.GetFBLineReward(GameWorld.GetMap().GetMapID(), 0)
        if itemID:
            ItemControler.GivePlayerItem(curPlayer, itemID, 1, 0, [IPY_GameWorld.rptItem, IPY_GameWorld.rptAnyWhere])
    # 新手本玩家退出默认关闭副本
    GameWorldProcess.CloseFB(tick)
    return
##玩家主动离开副本.
# @param curPlayer 玩家实例
# @param tick 时间戳
# @return 返回值无意义
def DoPlayerLeaveFB(curPlayer, tick):
    return
## 获得副本帮助信息
#  @param curPlayer 当前玩家(被通知对象)
#  @param tick 当前时间
#  @return None
def DoFBHelp(curPlayer, tick):
    gameFB = GameWorld.GetGameFB()
    step = gameFB.GetGameFBDictByKey(FBPlayerDict_GameStep)
    helpDict = {FBCommon.Help_step:step, FBCommon.Help_npcTotal:gameFB.GetGameFBDictByKey(FBPlayerDict_NPCKillCnt)}
    cageNPCID = IpyGameDataPY.GetFuncCfg('GuardFBCageNPCID')
    helpDict[FBCommon.Help_npc] = FBCommon.GetJsonNPCKillList({cageNPCID:int(step>Def_BreakCage)})
    helpDict["talkOver"] = int(step>Def_Dialog)
    #副本帮助
    GameWorld.DebugLog("DoFBHelp %s" % str(helpDict))
    FBCommon.Notify_FBHelp(curPlayer, helpDict)
    return
##---副本总逻辑计时器---
# @param tick:时间戳
# @return 无意义
# @remarks 副本总逻辑计时器
def OnProcess(tick):
    fbStep = GameWorld.GetGameFB().GetFBStep()
    # 副本准备
    if fbStep == FB_Step_Prepare:
        __DoLogic_FB_Prepare(tick)
    # 副本进行中
    elif fbStep == FB_Step_Fighting:
        __DoLogic_FB_Fighting(tick)
    # 副本结束
    elif fbStep == FB_Step_Over:
        __DoLogic_FB_Over(tick)
    return
## 副本准备逻辑
#  @param tick:时间戳
#  @return 无意义
def __DoLogic_FB_Prepare(tick):
    #gameFB = GameWorld.GetGameFB()
    fbCfg = GetGuardTimeCfg()
    # 间隔未到
    if tick - GameWorld.GetGameFB().GetFBStepTick() < fbCfg[Def_PrepareTime] * 1000:
        return
    FBCommon.OpenOrCloseDoorEx([IpyGameDataPY.GetFuncCfg('GuardFBCageNPCID', 2)], 1)
    # 设置开始刷怪
    mapID = GameWorld.GetMap().GetMapID()
    gameFB = GameWorld.GetGameFB()
    cageNPCID = IpyGameDataPY.GetFuncCfg('GuardFBCageNPCID')
    refreshIDList = FBCommon.GetFBLineRefreshNPC(mapID)
    needKillCnt = 0
    for refreshID in refreshIDList:
        npcCountList = NPCCustomRefresh.GetNPCRefreshCountList(refreshID)
        if not npcCountList:
            continue
        for npcID, count in npcCountList:
            if npcID == cageNPCID:
                continue
            needKillCnt += count
    gameFB.SetGameFBDict(FBPlayerDict_NPCNeedKillCnt, needKillCnt)
    for refreshID in refreshIDList:
        NPCCustomRefresh.SetNPCRefreshByID(refreshID)
    SetMap_Guard_GameStep(Def_KillBandit)
    playerManager = GameWorld.GetMapCopyPlayerManager()
    if playerManager.GetPlayerCount() > 0:
        curPlayer = playerManager.GetPlayerByIndex(0)
        DoFBHelp(curPlayer, tick)
    FBCommon.SetFBStep(FB_Step_Fighting, tick)
    FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttTowerTake, fbCfg[Def_FightTime] * 1000)
    return
## 副本进行中
#  @param tick:时间戳
#  @return 无意义
def __DoLogic_FB_Fighting(tick):
    fbCfg = GetGuardTimeCfg()
    # 间隔未到
    if tick - GameWorld.GetGameFB().GetFBStepTick() < fbCfg[Def_FightTime] * 1000:
        return
    __DoGuardOver(False)
    return
##副本关闭中
# @param tick:时间戳
# @return 无意义
# @remarks 副本关闭中
def __DoLogic_FB_Over(tick):
    #gameFB = GameWorld.GetGameFB()
    fbCfg = GetGuardTimeCfg()
    # 间隔未到
    if tick - GameWorld.GetGameFB().GetFBStepTick() < fbCfg[Def_LeaveTime] * 1000:
        return
    #副本关闭
    GameWorldProcess.CloseFB(tick)
    FBCommon.SetFBStep(FB_Step_Close, tick)
    return
## 获得经验
#  @param curPlayer 当前玩家
#  @param addExp 获得的经验
#  @param expViewType 经验类型
#  @return True or False
def OnGetExp(curPlayer, addExp, expViewType):
    if expViewType != ShareDefine.Def_ViewExpType_KillNPC:
        return
    playerID = curPlayer.GetID()
    gameFB = GameWorld.GetGameFB()
    exp = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_TotalExp)
    expPoint = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_TotalExpPoint)
    totalExp = expPoint * ChConfig.Def_PerPointValue + exp
    updTotalExp = totalExp + addExp
    updExp = updTotalExp % ChConfig.Def_PerPointValue
    updExpPoint = updTotalExp / ChConfig.Def_PerPointValue
    gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_TotalExp, updExp)
    gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_TotalExpPoint, updExpPoint)
    GameWorld.DebugLog("OnGetExp() totalExp=%s,addExp=%s,updTotalExp=%s"
                       % (totalExp, addExp, updTotalExp), playerID)
    return
## 执行副本杀怪逻辑
#  @param curPlayer 杀怪的人
#  @param curNPC 被杀的怪
#  @param tick 当前时间
#  @return None
def DoFB_Player_KillNPC(curPlayer, curNPC, tick):
    gameFB = GameWorld.GetGameFB()
    fbStep = gameFB.GetFBStep()
    if fbStep != FB_Step_Fighting:
        return
    cageNPCID = IpyGameDataPY.GetFuncCfg('GuardFBCageNPCID')
    npcid = curNPC.GetNPCID()
    if not npcid:
        return
    if npcid == cageNPCID:
        #笼子打掉了触发任务可对话
        EventShell.EventRespons_FBEvent(curPlayer, "guardfbtalk")
        SetMap_Guard_GameStep(Def_Dialog)
    else:
        killCnt = gameFB.GetGameFBDictByKey(FBPlayerDict_NPCKillCnt)
        gameFB.SetGameFBDict(FBPlayerDict_NPCKillCnt, killCnt+1)
        if killCnt+1 >= gameFB.GetGameFBDictByKey(FBPlayerDict_NPCNeedKillCnt):
            SetMap_Guard_GameStep(Def_BreakCage)
    DoFBHelp(curPlayer, tick)
    return
## 检查是否可攻击, 主判定不可攻击的情况,其他逻辑由外层决定
#  @param attacker 攻击方
#  @param defender 防守方
#  @return bool
def CheckCanAttackTagObjInFB(attacker, defender):
    gameFB = GameWorld.GetGameFB()
    if gameFB.GetFBStep() != FB_Step_Fighting:
    hasEnter = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, lineID, False, [mapID])
    if hasEnter:
        GameWorld.DebugLog("    已进入过副本%s" % lineID)
        return False
    gameFB = GameWorld.GetGameFB()
    cageNPCID = IpyGameDataPY.GetFuncCfg('GuardFBCageNPCID')
    step = gameFB.GetGameFBDictByKey(FBPlayerDict_GameStep)
    if step != Def_BreakCage:
        defenderObjType = defender.GetGameObjType()
        # 攻击笼子
        if defenderObjType == IPY_GameWorld.gotNPC and defender.GetNPCID() == cageNPCID:
            return False
    return True
## 任务专用,触发事件(副本内完成某任务)
#  @param curPlayer:玩家实例
#  @param isAchieve:是否完成任务
#  @return None
def DoFB_OnAchieveTask(curPlayer, isAchieve):
    if GameWorld.GetGameFB().GetGameFBDictByKey(FBPlayerDict_GameStep) != Def_Dialog:
        return
    SetMap_Guard_GameStep(Def_EndGuard)
    DoFBHelp(curPlayer, 0)
    __DoGuardOver(True)
    return
## 是否副本复活
#  @param None
#  @return 是否副本复活
def OnPlayerReborn():
    return True
##玩家死亡.
# @param curPlayer:死亡的玩家
# @param tick 时间戳
# @return 返回值无意义
# @remarks 玩家主动离开副本.
def DoPlayerDead(curPlayer):
    __DoGuardOver(False)
    return
## 副本结束处理
def __DoGuardOver(isPass):
    gameFB = GameWorld.GetGameFB()
    if gameFB.GetFBStep() == FB_Step_Over:
        return
    tick = GameWorld.GetGameWorld().GetTick()
    curPlayer = None
    playerManager = GameWorld.GetMapCopyPlayerManager()
    if playerManager.GetPlayerCount() > 0:
        curPlayer = playerManager.GetPlayerByIndex(0)
    if not curPlayer:
        GameWorldProcess.CloseFB(tick)
        return
    fbCfg = GetGuardTimeCfg()
    gameFB = GameWorld.GetGameFB()
    playerID = curPlayer.GetPlayerID()
#    exp = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_TotalExp)
#    expPoint = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_TotalExpPoint)
#    totalExp = expPoint * ChConfig.Def_PerPointValue + exp
    costTime = tick - GameWorld.GetGameFB().GetFBStepTick()
    giveExp = 0
    overDict = {FBCommon.Over_isPass:int(isPass), FBCommon.Over_costTime:costTime}
    if isPass:
        itemID, giveExp = FBCommon.GetFBLineReward(GameWorld.GetMap().GetMapID(), 0)
        #物品改在退出副本时给
        #ItemControler.GivePlayerItem(curPlayer, itemID, 1, 0, [IPY_GameWorld.rptItem, IPY_GameWorld.rptAnyWhere])
        if giveExp:
            PlayerControl.PlayerControl(curPlayer).AddExp(giveExp)
            overDict[FBCommon.Over_exp] = giveExp
        if itemID:
            overDict[FBCommon.Over_itemInfo] = FBCommon.GetJsonItemList([itemID])
    # 通知结果
    __SendOverInfo(curPlayer, overDict)
    # 进入离开阶段
    FBCommon.SetFBStep(FB_Step_Over, tick)
    FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttLeaveMap, fbCfg[Def_LeaveTime] * 1000)
    return
## 发送挑战结果信息
def __SendOverInfo(curPlayer, overDict):
    overDict[FBCommon.Over_dataMapID] = FBCommon.GetRecordMapID(GameWorld.GetMap().GetMapID())
    overDict[FBCommon.Over_lineID] = FBCommon.GetFBPropertyMark()
    GameWorld.DebugLog("__SendOverInfo overDict=%s" % (str(overDict)), curPlayer.GetPlayerID())
    FBCommon.Notify_FB_Over(curPlayer, overDict)
    return
def OnClientEndFB(curPlayer, mapID, lineID, dataList):
    #客户端副本发送结束
    itemID, giveExp = FBCommon.GetFBLineReward(mapID, 0)
    #
    overDict = {}
    ItemControler.GivePlayerItem(curPlayer, itemID, 1, 0, [IPY_GameWorld.rptItem, IPY_GameWorld.rptAnyWhere])
    if giveExp:
        PlayerControl.PlayerControl(curPlayer).AddExp(giveExp)
        overDict[FBCommon.Over_exp] = giveExp
    if itemID:
        overDict[FBCommon.Over_itemInfo] = FBCommon.GetJsonItemList([itemID])
    GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, lineID, 1, False, [mapID])
    FBCommon.NotifyFBOver(curPlayer,mapID,lineID,1,overDict)
    EventShell.EventRespons_FBEvent(curPlayer, "guardfbpass")
    PlayerControl.SetCustomMap(curPlayer, 0, 0)
    return