From 0a17e139006a7e19bc3a100fa394ad7d9b4bb716 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期三, 26 九月 2018 16:37:01 +0800 Subject: [PATCH] 3810 【后端】前期BOSS分线修改 --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py | 102 ++++++++++++++++++++++++++++++++------------------ 1 files changed, 65 insertions(+), 37 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py index 07322d1..216e37d 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py @@ -87,6 +87,7 @@ import PlayerState import QuestCommon import PlayerDogz +import ChPlayer import GMShell import random @@ -2026,8 +2027,12 @@ #---同地图ID, 同分线, 仅切换坐标--- #lingID = -1, 代表默认当前线, 如主城2传送剑宗, 到达剑宗2 if gameWorld.GetMapID() == mapID and (shuntLineID == -1 or gameWorld.GetLineID() == shuntLineID): - #重置坐标 - GameWorld.ResetPlayerPos(curPlayer, posX, posY) + if exData1: + #boss的用move,通知前端,由前端发起move + ChPlayer.NotifyPlayerMove(curPlayer, posX, posY, exData1) + else: + #重置坐标 + GameWorld.ResetPlayerPos(curPlayer, posX, posY) #@bug: 在摆摊区快速传送至非摆摊区, 可以摆摊, 这里刷新一下场景Buff SkillShell.ProcessMapBuff(curPlayer, GameWorld.GetGameWorld().GetTick()) return @@ -2063,7 +2068,7 @@ # 非常规地图之间的切换不处理 if curMapID not in PyGameData.g_commMapLinePlayerCountDict or tagMapID not in PyGameData.g_commMapLinePlayerCountDict: return tagLineID - tagLinePlayerCountDict = PyGameData.g_commMapLinePlayerCountDict[tagMapID] + tagLinePlayerCountDict = PyGameData.g_commMapLinePlayerCountDict[tagMapID] # 此分线包含所有分线,含未开放的及活动分线 playerID = curPlayer.GetPlayerID() playChangeLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PlayChangeLineID) @@ -2080,7 +2085,7 @@ GameWorld.DebugLog("功能指定切换目标线路,记录当前线路后续切线备用! curLineID=%s,tagLineID=%s" % (curLineID, tagLineID), playerID) if bossID and NPCCommon.IsMapNeedBossShunt(tagMapID): - bossShuntLineID = __GetBossShuntLineID(curPlayer, tagMapID, bossID, tagLinePlayerCountDict.keys()) + bossShuntLineID = __GetBossShuntLineID(curPlayer, curMapID, curLineID, tagMapID, bossID, tagLinePlayerCountDict.keys()) if bossShuntLineID != -1: tick = GameWorld.GetGameWorld().GetTick() GameWorld.DebugLog("分流boss, bossID=%s,bossShuntLineID=%s" % (bossID, bossShuntLineID), playerID) @@ -2169,10 +2174,23 @@ GameWorld.DebugLog("分流到人数较少的线路,tagMapID=%s,linePlayerList[count,lineID]=%s" % (tagMapID, linePlayerList), playerID) return shuntLineID -def __GetBossShuntLineID(curPlayer, mapID, npcID, lineIDList): +def __GetBossShuntLineID(curPlayer, curMapID, curLineID, tagMapID, npcID, lineIDList): '''获取目标地图boss分流线路 - 根据人数分流玩家,boss死亡状态,只能分流到已死亡线路 - 队伍无视任何规则,默认分配到队伍队员多的那条线 + 根据人数分流玩家,优先分配到活着的线路 + 队伍无视任何规则,默认分配到队伍队员多的那条线 + + 前端: + 1.在中立地图的时候,显示当前线路BOSS的状态 + 2.在常规地图的时候,显示玩家击杀BOSS的CD时间 + 3.本地图不换线,60秒规则保持不变 + 4.进入BOSS区域里,刷新BOSS状态 + + 玩家在非中立地图: + 本地图不换线,60秒规则保持不变() + + 玩家在中立地图 + 没有60秒规则 + 直接发传送包,由后端决定(有队员在不同线路打同一只boss,则传送,否则move) ''' playerID = curPlayer.GetPlayerID() playerTeamID = curPlayer.GetTeamID() @@ -2180,65 +2198,75 @@ hurtTeamLineID = -1 hurtTeamMemCount = -1 - emptyLineID = -1 - bossLinePlayerCntList = [] + bossLinePlayerDict = {1:[-1, []], 0:[-1, []]} # {是否被击杀:[该状态人数空的线路, [[玩家数, 线路], ...]], ...} - deadLineList = PyGameData.g_bossShuntDeadLine.get(npcID, []) - bossState = not deadLineList # boss公共状态, 只要有一条线路是死亡的就是死亡 + bossLineStateDict = PyGameData.g_bossShuntLineState.get(npcID, {}) - GameWorld.DebugLog("玩家boss分流: playerTeamID=%s,mapID=%s,npcID=%s,lineIDList=%s,bossState=%s,deadLineList=%s,g_bossShuntPlayerInfo=%s" - % (playerTeamID, mapID, npcID, lineIDList, bossState, deadLineList, PyGameData.g_bossShuntPlayerInfo), playerID) + haveAliveLine = False # 是否有活着的线路 + activityMapLineDict = IpyGameDataPY.GetFuncEvalCfg("MapLine", 2, {}) + GameWorld.DebugLog("玩家boss分流: playerTeamID=%s,tagMapID=%s,npcID=%s,lineIDList=%s,bossLineStateDict=%s,g_bossShuntPlayerInfo=%s" + % (playerTeamID, tagMapID, npcID, lineIDList, bossLineStateDict, PyGameData.g_bossShuntPlayerInfo), playerID) + if tagMapID in activityMapLineDict: + activityLineID = max(0, activityMapLineDict[tagMapID] - 1) + # 非1线的活动线路不参与分流 + if activityLineID != 0 and activityLineID in lineIDList: + lineIDList.remove(activityLineID) + GameWorld.DebugLog(" 非1线的活动线路不参与分流: activityLineID=%s,lineIDList=%s" % (activityLineID, lineIDList), playerID) + for lineID in lineIDList: - key = (mapID, lineID) + key = (tagMapID, lineID) + # boss分流玩家信息{(mapID, lineID):{playerID:[bossID, teamID, relatedTick], ...}, ...} shuntPlayerDict = PyGameData.g_bossShuntPlayerInfo.get(key, {}) playerCount = 0 teamPlayerCount = 0 - for shuntInfo in shuntPlayerDict.values(): + for shuntPlayerID, shuntInfo in shuntPlayerDict.items(): bossID = shuntInfo[0] if npcID != bossID: continue playerCount += 1 shuntTeamID = shuntInfo[1] - if playerTeamID and playerTeamID == shuntTeamID: + if playerTeamID and playerTeamID == shuntTeamID and shuntPlayerID != playerID: teamPlayerCount += 1 if teamPlayerCount and teamPlayerCount > hurtTeamMemCount: hurtTeamMemCount = teamPlayerCount hurtTeamLineID = lineID - lineBossState = lineID not in deadLineList # 当前线路boss状态 - if bossState != lineBossState: - GameWorld.DebugLog(" lineID=%s,lineBossState=%s != bossState=%s,teamPlayerCount=%s,hurtTeamMemCount=%s,hurtTeamLineID=%s" - % (lineID, lineBossState, bossState, teamPlayerCount, hurtTeamMemCount, hurtTeamLineID), playerID) - continue + lineIsAlive = bossLineStateDict.get(lineID, 0) + lineBossIsDead = 1 if not lineIsAlive else 0 # 当前线路boss是否死亡 + emptyLineID, linePlayerCountList = bossLinePlayerDict[lineBossIsDead] + if not playerCount and emptyLineID == -1: + emptyLineID = lineID + linePlayerCountList.append([playerCount, lineID]) + bossLinePlayerDict[lineBossIsDead] = [emptyLineID, linePlayerCountList] - GameWorld.DebugLog(" lineID=%s,lineBossState=%s,playerCount=%s,teamPlayerCount=%s,hurtTeamMemCount=%s,hurtTeamLineID=%s" - % (lineID, lineBossState, playerCount, teamPlayerCount, hurtTeamMemCount, hurtTeamLineID), playerID) - - if not playerCount: - if emptyLineID < 0: - emptyLineID = lineID - else: - bossLinePlayerCntList.append([playerCount, lineID]) + if not lineBossIsDead: + haveAliveLine = True + GameWorld.DebugLog(" lineID=%s,lineBossIsDead=%s,playerCount=%s,teamPlayerCount=%s,hurtTeamMemCount=%s,hurtTeamLineID=%s" + % (lineID, lineBossIsDead, playerCount, teamPlayerCount, hurtTeamMemCount, hurtTeamLineID), playerID) + if hurtTeamLineID >= 0: GameWorld.DebugLog(" 分流到队友人数多的线路 hurtTeamLineID=%s" % hurtTeamLineID, playerID) return hurtTeamLineID - if not bossLinePlayerCntList: - GameWorld.DebugLog(" 没有人在该boss状态下的线路,默认空新线路!bossState=%s,emptyLineID=%s" % (bossState, emptyLineID), playerID) - return emptyLineID + if curMapID == tagMapID and curMapID in IpyGameDataPY.GetFuncEvalCfg("MapLine", 4): + GameWorld.DebugLog(" 中立地图在本地图中默认当前线路 curLineID=%s" % curLineID, playerID) + return curLineID - bossLinePlayerCntList.sort() # 升序 - playerCount, minPlayerCntLineID = bossLinePlayerCntList[0] + shuntBossIsDead = 0 if haveAliveLine else 1 # 优先分流到活着的线路 + GameWorld.DebugLog(" boss状态对应线路人数: haveAliveLine=%s, 状态key0为活着: %s" % (haveAliveLine, bossLinePlayerDict)) + emptyLineID, linePlayerCountList = bossLinePlayerDict[shuntBossIsDead] + linePlayerCountList.sort() # 升序 + playerCount, minPlayerCntLineID = linePlayerCountList[0] bossShuntPlayerCountMax = IpyGameDataPY.GetFuncCfg("BossShunt", 2) if playerCount >= bossShuntPlayerCountMax and emptyLineID >= 0: - GameWorld.DebugLog(" 分流到空新线路 bossState=%s,emptyLineID=%s" % (bossState, emptyLineID), playerID) + GameWorld.DebugLog(" 分流到空新线路 shuntBossIsDead=%s,emptyLineID=%s" % (shuntBossIsDead, emptyLineID), playerID) return emptyLineID - GameWorld.DebugLog(" 分流到人数最少的线路 bossState=%s,minPlayerCntLineID=%s,bossLinePlayerCntList=%s" - % (bossState, minPlayerCntLineID, bossLinePlayerCntList), playerID) + GameWorld.DebugLog(" 分流到人数最少的线路 shuntBossIsDead=%s,minPlayerCntLineID=%s,linePlayerCountList=%s" + % (shuntBossIsDead, minPlayerCntLineID, linePlayerCountList), playerID) return minPlayerCntLineID #--------------------------------------------------------------------- -- Gitblit v1.8.0