5722 【后端】【1.5】跨服BOSS开发(跨服boss地图支持挂机经验)
| | |
| | | # return
|
| | |
|
| | | vsRoomID = curPlayer.GetVsRoomId()
|
| | | if vsRoomID and PlayerControl.GetCrossRealmState(curPlayer) == 1:
|
| | | if vsRoomID and PlayerControl.GetCrossMapID(curPlayer) == ChConfig.Def_FBMapID_CrossRealmPK:
|
| | | GameWorld.DebugLog("玩家跨服PK状态,不能取消匹配!vsRoomID=%s" % vsRoomID, curPlayer.GetPlayerID())
|
| | | return
|
| | |
|
| | |
| | | matchPlayer.MaxProDef = readyPlayerInfo["MaxProDef"]
|
| | | break
|
| | |
|
| | | PlayerControl.SetCrossRealmState(player, ChConfig.Def_FBMapID_CrossRealmPK)
|
| | | PlayerControl.SetCrossMapID(player, ChConfig.Def_FBMapID_CrossRealmPK)
|
| | | SetIsCrossPKMatching(player, 0)
|
| | |
|
| | | # 通知匹配成功,可进入跨服
|
| | |
| | | GameWorld.DebugLog(" 房间ID不同, playerID=%s" % (playerID))
|
| | | continue
|
| | | player.SetDict(ChConfig.Def_PlayerKey_IsLoginToMergeServer, 0)
|
| | | PlayerControl.SetCrossRealmState(player, 0)
|
| | | PlayerControl.SetCrossMapID(player, 0)
|
| | |
|
| | | return
|
| | |
|
| | |
| | | overInfoData = PyDataManager.GetCrossPKUnNotifyOverInfoManager().GetPlayerUnNotifyOverInfo(playerID)
|
| | | if not overInfoData:
|
| | | return
|
| | | PlayerControl.SetCrossRealmState(curPlayer, 0)
|
| | | PlayerControl.SetCrossMapID(curPlayer, 0)
|
| | | PlayerControl.SetVsRoomId(curPlayer, 0)
|
| | |
|
| | | zoneID = overInfoData.ZoneID
|
| | |
| | | curPlayer = playerManager.GetActivePlayerAt(i)
|
| | | if curPlayer == None:
|
| | | continue
|
| | | PlayerControl.SetCrossRealmState(curPlayer, 0)
|
| | | PlayerControl.SetCrossMapID(curPlayer, 0)
|
| | | curPlayer.Kick(0)
|
| | |
|
| | | # 广播所有子服,本服务器进入维护
|
| | |
| | | curPlayer = playerManager.GetActivePlayerAt(i)
|
| | | if curPlayer == None:
|
| | | continue
|
| | | PlayerControl.SetCrossRealmState(curPlayer, 0)
|
| | | PlayerControl.SetCrossMapID(curPlayer, 0)
|
| | |
|
| | | # 通知地图
|
| | | GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossServerOpen, isOpen)
|
| | |
| | | CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ExitCrossServer, playerID, [serverGroupID])
|
| | |
|
| | | # 设置非跨服状态,踢下线
|
| | | PlayerControl.SetCrossRealmState(curPlayer, 0)
|
| | | PlayerControl.SetCrossMapID(curPlayer, 0)
|
| | | curPlayer.Kick(0)
|
| | | GameWorld.Log("PlayerExitCrossServer...serverGroupID=%s" % serverGroupID, playerID)
|
| | | return
|
| | |
| | | if not curPlayer:
|
| | | GameWorld.Log(" 退出跨服时本服玩家不在线!", playerID)
|
| | | return
|
| | | PlayerControl.SetCrossRealmState(curPlayer, 0)
|
| | | PlayerControl.SetCrossMapID(curPlayer, 0)
|
| | | return
|
| | |
|
| | | def SendCrossRealmReg(curPlayer, registerMap, mapID=0, dataMapID=0, copyMapID=0, posX=0, posY=0):
|
| | |
| | | '''
|
| | | curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
| | | GameWorld.ErrLog("某些异常情况下,前端强制发包退出跨服状态! ", curPlayer.GetPlayerID())
|
| | | PlayerControl.SetCrossRealmState(curPlayer, 0)
|
| | | PlayerControl.SetCrossMapID(curPlayer, 0)
|
| | | return
|
| | |
|
| | | #// C0 02 查看跨服玩家信息 #tagCGViewCrossPlayerInfo
|
| | |
| | | SetMapServerPlayerAttrValue(curPlayer, "SetVsRoomId", roomID)
|
| | | return
|
| | |
|
| | | ## 跨服状态: 0-非跨服状态,1-跨服状态
|
| | | def GetCrossRealmState(curPlayer): return curPlayer.GetExAttr5()
|
| | | def SetCrossRealmState(curPlayer, value):
|
| | | ''' 设置玩家跨服状态
|
| | | @param isExitCrossRealm: 非跨服状态时是否通知前端退出跨服服务器
|
| | | '''
|
| | | curPlayer.SetExAttr5(1 if value else 0)
|
| | | ## 跨服状态所在地图ID: 0-非跨服状态,非0-跨服状态对应的地图ID
|
| | | def GetCrossMapID(curPlayer): return curPlayer.GetExAttr5()
|
| | | def SetCrossMapID(curPlayer, value):
|
| | | curPlayer.SetExAttr5(value)
|
| | | SetMapServerPlayerAttrValue(curPlayer, "SetExAttr5", value)
|
| | | return
|
| | |
|
| | |
| | | Def_Player_Dict_FromLineID = 'FromLineID' # 最后一次离开的非中立常规地图,线路ID
|
| | |
|
| | | Def_PlayerKey_CrossRegisterMap = "CrossRegisterMap" #跨服注册活动地图, dataMapID
|
| | | Def_PlayerKey_CrossMapID = "CrossMapID" #玩家所在跨服地图ID
|
| | | Def_PlayerKey_IsCrossPKMatching = "IsCrossPKMatching" #是否跨服匹配中
|
| | |
|
| | | Def_Player_Dict_FamilyTechLV = "FamilyTechLV_%s" #家族科技等级, 参数(科技ID)
|
| | |
| | | playerControl = PlayerControl.PlayerControl(curPlayer)
|
| | | playerControl.ReCalcAllState()
|
| | |
|
| | | if PlayerControl.GetCrossRealmState(curPlayer):
|
| | | if PlayerControl.GetCrossMapID(curPlayer):
|
| | | CrossRealmPlayer.DoExitCrossRealm(curPlayer)
|
| | |
|
| | | return
|
| | |
| | | # !!!必要发送的数据要注意位置
|
| | | if GameWorld.IsCrossServer():
|
| | | curPlayer.SetForbiddenSyncClientState(False)
|
| | | PlayerControl.SetCrossRealmState(curPlayer, curPlayer.GetMapID()) # 因为主服上传数据之前该值为0,所以登录跨服后在跨服服务器要设置为1
|
| | | PlayerControl.SetCrossMapID(curPlayer, curPlayer.GetMapID()) # 因为主服上传数据之前该值为0,所以登录跨服后在跨服服务器要设置为对应地图
|
| | |
|
| | | return
|
| | |
|
| | |
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_HighChangeLineID, 0)
|
| | | #GameWorld.DebugLog("离线超过10秒重置切线临时保存的相关记录值!leaveServerSecond=%s" % leaveServerSecond, curPlayer.GetPlayerID())
|
| | | # 离线过久恢复为非跨服状态
|
| | | if PlayerControl.GetCrossRealmState(curPlayer):
|
| | | PlayerControl.SetCrossRealmState(curPlayer, 0)
|
| | | if PlayerControl.GetCrossMapID(curPlayer):
|
| | | PlayerControl.SetCrossMapID(curPlayer, 0)
|
| | |
|
| | | # 合服首登处理
|
| | | __DoMixServerFirstLogin(curPlayer)
|
| | |
| | | SkillCommon.AddBuffBySkillType_NoRefurbish(curPlayer, ChConfig.Def_SkillID_LimitSuperBuff, tick)
|
| | |
|
| | | #刷新玩家的视野
|
| | | if not GameWorld.IsCrossServer() and PlayerControl.GetCrossRealmState(curPlayer):
|
| | | if not GameWorld.IsCrossServer() and PlayerControl.GetCrossMapID(curPlayer):
|
| | | GameWorld.DebugLog("===登录本服地图时,处于跨服状态,不刷新视野!", curPlayer.GetPlayerID())
|
| | | else:
|
| | | PlayerState.ChangePlayerSigh(curPlayer, tick)
|
| | |
| | | firstMission = QuestCommon.GetCommonMission(curPlayer)
|
| | | if not (firstMission and firstMission.GetProperty(QuestCommon.Def_NewGuyNoSight) == 1):
|
| | | #刷新自己的视野
|
| | | if not GameWorld.IsCrossServer() and PlayerControl.GetCrossRealmState(curPlayer):
|
| | | if not GameWorld.IsCrossServer() and PlayerControl.GetCrossMapID(curPlayer):
|
| | | GameWorld.DebugLog("===本服LoadMapOK时玩家处于跨服状态,不设置可见!", curPlayer.GetPlayerID())
|
| | | else:
|
| | | curPlayer.RefreshView()
|
| | |
| | | GameWorld.DebugLog("跨服服务器不接受复活请求!")
|
| | | return
|
| | |
|
| | | if PlayerControl.GetCrossRealmState(curPlayer):
|
| | | if PlayerControl.GetCrossMapID(curPlayer):
|
| | | OnReqCrossServerReborn(curPlayer, rebornType)
|
| | | return
|
| | |
|
| | |
| | | def OnReqCrossServerReborn(curPlayer, rebornType):
|
| | | ## 请求跨服服务器复活玩家
|
| | |
|
| | | crossMapID = curPlayer.NomalDictGetProperty(ChConfig.Def_PlayerKey_CrossMapID)
|
| | | crossMapID = PlayerControl.GetCrossMapID(curPlayer)
|
| | | if not crossMapID:
|
| | | GameWorld.DebugLog("当前无跨服地图!")
|
| | | return
|
| | |
| | | GameWorld.SendMsgToClientServer(ShareDefine.CrossServerMsg_ExitCrossServer, playerID, [serverGroupID])
|
| | |
|
| | | # 设置非跨服状态,踢下线
|
| | | PlayerControl.SetCrossRealmState(curPlayer, 0)
|
| | | PlayerControl.SetCrossMapID(curPlayer, 0)
|
| | | curPlayer.Kick(IPY_GameWorld.disMapServerClose)
|
| | | GameWorld.Log("PlayerExitCrossServer...", curPlayer.GetPlayerID())
|
| | | return
|
| | |
| | | curPet = curPlayer.GetPetMgr().GetFightPet()
|
| | | if curPet:
|
| | | curPet.SetVisible(True)
|
| | | if PlayerControl.GetCrossRealmState(curPlayer):
|
| | | PlayerControl.SetCrossRealmState(curPlayer, 0)
|
| | | if PlayerControl.GetCrossMapID(curPlayer):
|
| | | PlayerControl.SetCrossMapID(curPlayer, 0)
|
| | | return
|
| | |
| | | GameWorld.DebugLog("跨服服务器不允许该操作!")
|
| | | return
|
| | |
|
| | | if GetCrossRealmState(curPlayer):
|
| | | if GetCrossMapID(curPlayer):
|
| | | GameWorld.ErrLog("玩家当前为跨服状态,不允许再次请求进入跨服!", curPlayer.GetPlayerID())
|
| | | return
|
| | |
|
| | |
| | | def SetFBFuncLineID(curPlayer, funcLineID): return curPlayer.SetExAttr3(funcLineID, False, False)
|
| | | def GetFBFuncLineID(curPlayer): return curPlayer.GetExAttr3()
|
| | |
|
| | | ## 跨服状态: 0-非跨服状态,1-跨服状态
|
| | | def GetCrossRealmState(curPlayer): return curPlayer.GetExAttr5()
|
| | | def SetCrossRealmState(curPlayer, value):
|
| | | NomalDictSetProperty(curPlayer, ChConfig.Def_PlayerKey_CrossMapID, value)
|
| | | curPlayer.SetExAttr5(1 if value else 0, False, True)
|
| | | ## 跨服状态所在地图ID: 0-非跨服状态,非0-跨服状态对应的地图ID
|
| | | def GetCrossMapID(curPlayer): return curPlayer.GetExAttr5()
|
| | | def SetCrossMapID(curPlayer, value):
|
| | | curPlayer.SetExAttr5(value, False, True)
|
| | | return
|
| | |
|
| | | ## 铜钱点, 支持铜钱超20亿
|
| | |
| | |
|
| | | def ProcessAreaExp(curPlayer, tick):
|
| | | ##给场景经验
|
| | | mapID = GameWorld.GetMap().GetMapID()
|
| | | crossMapID = PlayerControl.GetCrossMapID(curPlayer)
|
| | | mapID = crossMapID if crossMapID else GameWorld.GetMap().GetMapID()
|
| | | neutralMapExpAwardDict = IpyGameDataPY.GetFuncEvalCfg('NeutralMapExpAward', 1, {})
|
| | | expAwardInfo = GameWorld.GetDictValueByKey(neutralMapExpAwardDict, mapID)
|
| | | if not expAwardInfo:
|
| | |
| | |
|
| | | if registerMap in ChConfig.RegisterEnter_CrossServerMapIDList:
|
| | | CrossRealmPlayer.DoEnterCrossRealm(curPlayer)
|
| | | PlayerControl.SetCrossRealmState(curPlayer, registerMap)
|
| | | PlayerControl.SetCrossMapID(curPlayer, registerMap)
|
| | | NetPackCommon.SendFakePack(curPlayer, ChPyNetSendPack.tagMCStartEnterCrossServer())
|
| | | return
|
| | |
|
| | |
| | | if attrName == "SetExAttr5":
|
| | | if value:
|
| | | CrossRealmPlayer.DoEnterCrossRealm(curPlayer)
|
| | | elif PlayerControl.GetCrossRealmState(curPlayer):
|
| | | elif PlayerControl.GetCrossMapID(curPlayer):
|
| | | CrossRealmPlayer.DoExitCrossRealm(curPlayer)
|
| | |
|
| | | callObj = getattr(curPlayer, attrName)
|