From b8fde01b237a2ad9c69e64f265efa692f1d4f70f Mon Sep 17 00:00:00 2001 From: hch <305670599@qq.com> Date: 星期五, 10 五月 2019 19:39:50 +0800 Subject: [PATCH] 6603 【后端】【2.0】增加新版的sp和被动技能 - 增加前端用的印记包 --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py | 126 +++++++++++++++++++++++++++++++++++------ 1 files changed, 107 insertions(+), 19 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py index e31eba8..747aea3 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py @@ -39,9 +39,12 @@ import GameWorld import ChConfig import PlayerControl +import FamilyRobBoss +import NPCCustomRefresh import EventShell import FBLogic import FBCommon +import ShareDefine import EventReport import ItemCommon import PyGameData @@ -73,6 +76,8 @@ #调用副本开启触发器 FBLogic.OnOpenFB(tick) + + GameServer_DynamicLineMapStateChange(gameWorld, IPY_GameWorld.fbosOpen) return ## 副本关闭 @@ -91,8 +96,10 @@ gameFBMgr = gameWorld.GetGameFB() gameFBMgr.SetPlayerLogoffTick(0) gameFBMgr.SetIsSafeClose(0) - - GameWorld.Log("FB Close! lineID = %s, openState = %s"%(gameWorld.GetLineID(), gameWorld.GetOpenState())) + + lineID = gameWorld.GetLineID() + copyMapID = gameWorld.GetCopyMapID() + GameWorld.Log("FB Close! lineID = %s, openState = %s"%(lineID, gameWorld.GetOpenState())) gameWorld.SetOpenState(IPY_GameWorld.fbosClosed) gameMap = gameWorld.GetMap() @@ -101,9 +108,23 @@ if fbType == 0: return + if fbType == IPY_GameWorld.fbtSingle: + ownerID = gameFBMgr.GetGameFBDictByKey(ChConfig.Def_FB_SingleFBPlayerID) + if ownerID in PyGameData.g_fbHelpBattlePlayerDict: + PyGameData.g_fbHelpBattlePlayerDict.pop(ownerID) + GameWorld.DebugLog("清除单人副本镜像助战信息: ownerID=%s" % ownerID) + elif fbType == IPY_GameWorld.fbtTeam: + teamID = gameWorld.GetPropertyID() + if teamID in PyGameData.g_teamFBMemRelationDict: + PyGameData.g_teamFBMemRelationDict.pop(teamID) + GameWorld.DebugLog("清除组队副本队员关系信息: teamID=%s" % teamID) + #副本关闭时统一清怪 FBCommon.ClearFBNPC() + if lineID in PyGameData.g_fbRobotJobDict: + PyGameData.g_fbRobotJobDict.pop(lineID) + mapID = FBCommon.GetRecordMapID(gameMap.GetMapID()) #清理物品 unPickItemDict = {} @@ -134,9 +155,15 @@ #发送未拾取的物品给玩家 if mapID in ChConfig.Def_SendUnPickItemMailMapIDList and unPickItemDict: + isCrossServer = GameWorld.IsCrossServer() + playerServerGroupIDDict = PyGameData.g_crossPlayerServerGroupIDInfo.get(copyMapID, {}) for ownerID, mailItemList in unPickItemDict.items(): GameWorld.Log("发送未拾取的物品给玩家: %s" % mailItemList, ownerID) - PlayerControl.SendMailByKey("ItemNoPickUp", [ownerID], mailItemList, [gameWorld.GetMapID()]) + if isCrossServer: + serverGroupID = playerServerGroupIDDict.get(ownerID, 0) + PlayerControl.SendCrossMail(serverGroupID, "ItemNoPickUp", [ownerID], mailItemList, [gameWorld.GetMapID()]) + else: + PlayerControl.SendMailByKey("ItemNoPickUp", [ownerID], mailItemList, [gameWorld.GetMapID()]) playerManager = gameWorld.GetMapCopyPlayerManager() @@ -150,6 +177,26 @@ #根据是否收缩型FB处理 FreeOrClearFBByAutoSize(gameWorld) + GameServer_DynamicLineMapStateChange(gameWorld, IPY_GameWorld.fbosClosed) + + gameWorld.SetPropertyID(0) + PyGameData.g_crossPlayerServerGroupIDInfo.pop(copyMapID, None) + return + +def GameServer_DynamicLineMapStateChange(gameWorld, state): + if gameWorld.GetMapID() not in ChConfig.Def_CrossDynamicLineMap: + return + + realMapID, copyMapID = gameWorld.GetRealMapID(), gameWorld.GetCopyMapID() + if state == IPY_GameWorld.fbosWaitForClose: + crossFuncLineDataCache = FBLogic.OnGetCrossFuncLineDataCache() + msgInfo = [realMapID, copyMapID, state, crossFuncLineDataCache] + else: + msgInfo = [realMapID, copyMapID, state] + + msgInfo = str(msgInfo) + GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "DynamicLineMapStateChange", msgInfo, len(msgInfo)) + GameWorld.Log("DynamicLineMapStateChange realMapID=%s, copyMapID=%s, PropertyID=%s, state=%s" % (realMapID, copyMapID, gameWorld.GetPropertyID(), state)) return ##根据表中的收缩类型释放或者清空副本状态 @@ -231,6 +278,7 @@ ##踢人 __KickAllPlayerAndCloseFB(gameWorld, tick) + GameServer_DynamicLineMapStateChange(gameWorld, IPY_GameWorld.fbosClosed) return ## 副本踢出玩家逻辑 @@ -307,19 +355,39 @@ return #特殊副本,不执行这个逻辑 - if not GameWorld.GetMap().GetAutoSize(): + if not IsNoPlayerNeedCloseFB(): return gameFB = GameWorld.GetGameFB() - logOffTick = gameFB.GetPlayerLogoffTick() + fbIndex = gameWorld.GetCurGameWorldIndex() + if fbIndex in PyGameData.g_lastExitFBType: + '''老模式根据 GetPlayerLogoffTick()、GetIsSafeClose()判断的话在某些情况下会有隐藏bug + 因为当副本中玩家同时退出时可能出现 GameWorld.GetMapCopyPlayerManager().GetPlayerCount() != 1 的情况 + 所以老逻辑存在副本无法关闭的bug,这里只使用新模式,老模式暂不做修改,仅做兼容后备处理 + ''' + exitFBType, exitTick = PyGameData.g_lastExitFBType[fbIndex] + if exitFBType == 1: + passTick = tick - exitTick + if passTick < ChConfig.Def_EmptyFBKeepTime: + #GameWorld.DebugLog("最后一个玩家离线退出的,副本保护中!tick=%s,exitTick=%s,passTick=%s" + # % (tick, exitTick, passTick), fbIndex) + return + #GameWorld.DebugLog("最后一个玩家离线退出的,副本保护超时,关闭副本!tick=%s,exitTick=%s,passTick=%s" + # % (tick, exitTick, passTick), fbIndex) + #else: + # GameWorld.DebugLog("最后一个玩家主动退出的,直接关闭副本!", fbIndex) + PyGameData.g_lastExitFBType.pop(fbIndex) + #GameWorld.DebugLog("PyGameData.g_lastExitFBType=%s" % PyGameData.g_lastExitFBType, fbIndex) + else: + logOffTick = gameFB.GetPlayerLogoffTick() - if logOffTick == 0: - return - - if (not gameFB.GetIsSafeClose()) and tick - logOffTick < ChConfig.Def_EmptyFBKeepTime: - #GameWorld.Log(str(tick - logOffTick)) - #不是安全断线的情况下, 返回 - return + if logOffTick == 0: + return + + if (not gameFB.GetIsSafeClose()) and tick - logOffTick < ChConfig.Def_EmptyFBKeepTime: + #GameWorld.Log(str(tick - logOffTick)) + #不是安全断线的情况下, 返回 + return #输出调试信息 GameWorld.Log('__ProcessClose! LineID = %s, openState = %s, isSafeClose = %s'%( @@ -402,9 +470,13 @@ return IPY_GameWorld.cmePlayerFull #检查副本状态是否可以登录 - if not FBCommon.CheckFBStateCanEnter(askStruct): + checkRet = FBCommon.CheckFBStateCanEnter(askStruct) + if type(checkRet) not in [tuple, list]: + checkRet = (checkRet, "FB_andyshao_861048") + canEnter, notifyMark = checkRet + if not canEnter: #副本关闭中, 请稍后 - return IPY_GameWorld.cmeCustom, 'FB_andyshao_861048' + return IPY_GameWorld.cmeCustom, notifyMark changeMapAskResult = FBLogic.OnChangeMapAsk(askStruct, tick) @@ -452,11 +524,11 @@ __ProcessOpen(gameWorld, tick) - __ProcessTimeKickPlayer(gameWorld, tick) + __ProcessTimeKickPlayer(gameWorld, tick) # 处理副本生存周期强关副本 - __ProcessFBDelayKickPlayer(gameWorld, tick) + __ProcessFBDelayKickPlayer(gameWorld, tick) # 关闭副本延迟踢出玩家 - __ProcessClose(gameWorld, tick) + __ProcessClose(gameWorld, tick) # 自伸缩副本关闭逻辑 __ProcessMapServerAcPlayer(tick) @@ -477,6 +549,12 @@ __RefreshOnFiveMinute(tick) #定时检测关闭超时文件 EventReport.OnTimeCloseScribeTxt() + + #仙盟归属boss定时处理 + FamilyRobBoss.OnFamilyOwnerBossProcess(tick) + + #地图自定义随机刷怪 + NPCCustomRefresh.ProcessMapRandomRefreshNPC(gameWorld, tick) return ## 通知RouteServer 消息 @@ -541,6 +619,11 @@ if GameWorld.GetMap().GetMapFBType() == IPY_GameWorld.fbtNull: msgInfo = str([gameWorld.GetMapID(), gameWorld.GetLineID(), gameWorld.GetRealMapID(), gameWorld.GetCopyMapID()]) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "CommMapServerInitOK", msgInfo, len(msgInfo)) + + if gameWorld.GetMapID() in ChConfig.Def_CrossDynamicLineMap and gameWorld.GetCopyMapID() == gameWorld.GetGameWorldCount() - 1: + msgInfo = str([gameWorld.GetRealMapID(), gameWorld.GetGameWorldCount()]) + GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "DynamicLineMapInitOK", msgInfo, len(msgInfo)) + return @@ -550,6 +633,9 @@ # @remarks 函数详细说明. def CloseFB(tick): GameWorld.GetGameWorld().SetCloseFBTick(tick) + + gameWorld = GameWorld.GetGameWorld() + GameServer_DynamicLineMapStateChange(gameWorld, IPY_GameWorld.fbosWaitForClose) return ## 玩家离开地图时,尝试关闭副本 @@ -564,8 +650,7 @@ if gameMap.GetMapFBType() == 0: return - if gameMap.GetAutoSize() == 0: - #只处理自动是否的地图 + if not IsNoPlayerNeedCloseFB(): return playerManager = gameWorld.GetMapCopyPlayerManager() @@ -574,6 +659,9 @@ __CloseFB(GameWorld.GetGameWorld(), GameWorld.GetGameWorld().GetTick()) +def IsNoPlayerNeedCloseFB(): + ## 副本中无玩家是否需要自动关闭的副本 + return GameWorld.GetMap().GetAutoSize() and GameWorld.GetMap().GetMapID() not in ChConfig.Def_NoPlayerNotCloseAutoSizeMap #//08 06 根据国家统计的玩家数目#tagMPlayerCountByCountry #tagMPlayerCountByCountry * GettagMPlayerCountByCountry(); -- Gitblit v1.8.0