| | |
| | | # @change: "2014-12-23 15:30" xmnathan GameServer增加根据LineNO发送Py自定义包接口
|
| | | # @change: "2015-10-22 23:00" hxp 增加Recv_MergerChildToCenter
|
| | | #-------------------------------------------------------------------------------
|
| | | """Version = 2015-10-22 23:00"""
|
| | | #"""Version = 2015-10-22 23:00"""
|
| | | #-------------------------------------------------------------------------------
|
| | | #---导入---
|
| | | import IPY_GameServer
|
| | |
| | | import ChPyNetSendPack
|
| | | import traceback
|
| | | import ChMapToGamePyPack
|
| | | import MergeChildMsg
|
| | | import CrossRealmMsg
|
| | | import PlayerControl
|
| | | import ChPlayer
|
| | | import ShareDefine
|
| | | #-------------------------------------------------------------------------------
|
| | | #---全局变量---
|
| | |
|
| | |
| | | # Log("ReadPyPackTable: moudle: %s"%dir(moudle))
|
| | |
|
| | | for index in range(regCnt):
|
| | | if not config.get(section, "PacketCMD_%s"%(index + 1)):
|
| | | continue
|
| | | cmd = config.get(section, "PacketCMD_%s"%(index + 1))
|
| | | subCmd = config.get(section, "PacketSubCMD_%s"%(index + 1))
|
| | | callFunc = config.get(section, "PacketCallFunc_%s"%(index + 1))
|
| | | if not cmd or not subCmd or not callFunc:
|
| | | continue
|
| | |
|
| | | cmd = int(cmd, 16)
|
| | | subCmd = int(subCmd, 16)
|
| | |
| | | curPackHeadRegDict["CallFunc"](index, curPackData, tick)
|
| | |
|
| | | except Exception:
|
| | | Log("python自定义封包解析失败~~~~~\r\n%s" % traceback.format_exc())
|
| | | #raise Exception("python自定义封包解析失败~~~~~\r\n%s" % traceback.format_exc())
|
| | | GameWorld.RaiseException("python自定义封包解析失败\r\n%s" % traceback.format_exc())
|
| | | return
|
| | |
|
| | |
|
| | |
| | | innerPackData = clientPack.GetBuffer()
|
| | | curPlayer.Sync_GeneralPack(len(innerPackData), innerPackData)
|
| | |
|
| | | def SendPackByPlayer(clientPack, curPlayer=None):
|
| | | ## 发送封包,当curPlayer为None时则发送全服玩家
|
| | | if not curPlayer:
|
| | | # 全服广播在线玩家
|
| | | playerManager = GameWorld.GetPlayerManager()
|
| | | for i in xrange(playerManager.GetActivePlayerCount()):
|
| | | curPlayer = playerManager.GetActivePlayerAt(i)
|
| | | if curPlayer == None:
|
| | | continue
|
| | | if PlayerControl.GetIsTJG(curPlayer):
|
| | | continue
|
| | | SendFakePack(curPlayer, clientPack)
|
| | | else:
|
| | | if PlayerControl.GetIsTJG(curPlayer):
|
| | | return
|
| | | SendFakePack(curPlayer, clientPack)
|
| | | return
|
| | |
|
| | | def SendFakePackByCross(onlinePlayerIDDict, clientPack):
|
| | | '''由跨服服务器直接给子服在线玩家发送封包,适用于接受的玩家封包数据一致的
|
| | | @param onlinePlayerIDDict: 在线玩家GroupID字典 {playerID:groupID, ...}
|
| | | 功能自行通过 onlineMgr = ChPlayer.GetOnlinePlayerMgr() 过滤
|
| | | onlineMgr.GetOLPlayerServerGroupID(playerID) 获取ServerGroupID
|
| | | '''
|
| | | if not onlinePlayerIDDict:
|
| | | return
|
| | | innerPackData = clientPack.GetBuffer()
|
| | | dataMsg = {"playerIDList":onlinePlayerIDDict.keys(), "innerPackData":innerPackData}
|
| | | CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_SendFakePack, dataMsg, onlinePlayerIDDict.values())
|
| | | return
|
| | |
|
| | | def CrossServerMsg_SendFakePack(msgData):
|
| | | ## 子服收到由跨服直接发送给玩家的封包
|
| | | playerIDList = msgData["playerIDList"]
|
| | | innerPackData = msgData["innerPackData"]
|
| | | |
| | | playerManager = GameWorld.GetPlayerManager()
|
| | | for playerID in playerIDList:
|
| | | curPlayer = playerManager.FindPlayerByID(playerID)
|
| | | if curPlayer == None:
|
| | | continue
|
| | | if PlayerControl.GetIsTJG(curPlayer):
|
| | | continue
|
| | | curPlayer.Sync_GeneralPack(len(innerPackData), innerPackData)
|
| | | |
| | | return
|
| | | #-------------------------------------------------------------------------------
|
| | | #---Py封包注册信息
|
| | | PyPackTable = ReadPyPackTable("PyNetPack")
|
| | |
| | | curPackHeadRegDict["CallFunc"](routeIndex, mapID, curPackData, tick)
|
| | | #Log("RecvMapPyPack: CallFunc curPackHead = %s"%curPackHead)
|
| | | except Exception:
|
| | | Log("RecvMapPyPack python自定义封包解析失败~~~~~\r\n%s" % traceback.format_exc())
|
| | | if GameWorld.GetGameWorld().GetDebugLevel():
|
| | | raise Exception("RecGamePyPack python自定义封包解析失败~~~~~\r\n%s" % traceback.format_exc())
|
| | | GameWorld.RaiseException("RecvMapPyPack python自定义封包解析失败\r\n%s" % traceback.format_exc())
|
| | | return
|
| | |
|
| | | #-------------------------------------------------------------------------------
|
| | |
| | | def Recv_MergerChildToCenter(index, tick):
|
| | | try:
|
| | | packData = IPY_GameServer.IPY_MGMergerChildToCenter().GetData()
|
| | | Log("收到跨服子服自定义封包消息:\r\n%s" % packData)
|
| | | # 不要输出具体封包内容,可能会因为内容导致日志输出报错
|
| | | Log("收到跨服子服自定义封包消息:长度=%s" % len(packData))
|
| | | #以下添加后续处理函数
|
| | | #...
|
| | | #...
|
| | | MergeChildMsg.Recv_MergerChildToCenterProcess(packData, tick)
|
| | | CrossRealmMsg.OnCrossServerReceiveMsg(packData, tick)
|
| | | except Exception:
|
| | | Log("跨服子服自定义封包消息处理失败")
|
| | | return
|