From 11999c0e61fd4ce20316b7a26514e66ebea4e070 Mon Sep 17 00:00:00 2001 From: xdh <xiefantasy@qq.com> Date: 星期一, 27 五月 2019 11:16:50 +0800 Subject: [PATCH] 6743 【后端】【2.0】31250副本地图修改为前端副本 --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Guard.py | 447 ++----------------------------------------------------- 1 files changed, 20 insertions(+), 427 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Guard.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Guard.py index ad8aa31..a5743b2 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Guard.py +++ b/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 \ No newline at end of file -- Gitblit v1.8.0