From bc5f3f1c88d225109fa39a85b209ef13f5fb52a9 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 06 二月 2026 21:28:13 +0800
Subject: [PATCH] 66 【公会】基础主体-服务端(跨服公会所有基本功能支持、跨服砍价支持;修改查看目标公会、查看目标玩家方式;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NetPackCommon.py | 178 +++++++++++++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 159 insertions(+), 19 deletions(-)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NetPackCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NetPackCommon.py
index 2213f4d..6953918 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NetPackCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NetPackCommon.py
@@ -18,7 +18,7 @@
# @change: "2014-12-09 17:30" xmnathan 修改玩家M->S自定义封包发送
# @change: "2014-12-19 19:30" hxp Debug下封包错误抛出异常
#-------------------------------------------------------------------------------
-"""Version = 2014-12-19 19:30"""
+#"""Version = 2014-12-19 19:30"""
#-------------------------------------------------------------------------------
#---导入---
import IPY_GameWorld
@@ -30,6 +30,13 @@
import ChPyNetSendPack
import traceback
import ChGameToMapPyPack
+from PyMongoDB.DBCommon import CommonDefine
+import ChServerToServerPyPack
+from PyMongoDB.Protocol import MergeServerRecvProtocol
+import ShareDefine
+import CrossPlayer
+import DBDataMgr
+import CrossMsg
#-------------------------------------------------------------------------------
#---全局变量---
@@ -152,6 +159,28 @@
return SendPackDict[head]
#-------------------------------------------------------------------------------
+
+def ReadRecPyPackData(packBuff):
+ ## 根据收到的py包buff读取对应的包结构实例
+ try:
+ if len(packBuff) <= 1:
+ return
+ headData = packBuff[1] + packBuff[0]
+ curPackHead = CommFunc.ReadWORD(headData, 0)[0]
+ clientPack = RecievePackDict.get(curPackHead)
+ if not clientPack:
+ return
+ clientPack.ReadData(packBuff)
+ # 截断字符串
+ for key in dir(clientPack):
+ value = getattr(clientPack, key)
+ if isinstance(value, str):
+ setattr(clientPack, key, value.rstrip(chr(0x0)))
+ return clientPack
+ except Exception:
+ GameWorld.RaiseException("!!!python自定义封包解包失败\r\n%s" % traceback.format_exc())
+ return
+
## 接收万能封包
# @param index 玩家索引
# @param tick 时间戳
@@ -226,13 +255,25 @@
Log("SendFakePack: clientPack Len = %s > %s"%(clientPack.GetLength(), len(innerPackData)))
#curPlayer.SendFakePack(innerPackData, len(innerPackData))
curPlayer.SendFakePack(clientPack.GetBuffer(), clientPack.GetLength())
+ return
+def SendFackPackOnline(clientPack, parseFunc=None, *args):
+ ## 发送给全服在线玩家
+ # @param parseFunc: 中间处理逻辑,可以做一些修改包数据的逻辑或者过滤某些玩家不发送,返回值为True时发送
+ # @param args: parseFunc方法参数(curPlayer, ...)
+ playerManager = GameWorld.GetPlayerManager()
+ for i in xrange(playerManager.OnlineCount()):
+ curPlayer = playerManager.OnlineAt(i)
+ if not GameWorld.IsNormalPlayer(curPlayer):
+ continue
+ if parseFunc and not parseFunc(curPlayer, *args):
+ continue
+ SendFakePack(curPlayer, clientPack)
+ return
#-------------------------------------------------------------------------------
#---Py封包注册信息
PyPackTable = ReadPyPackTable("PyNetPack")
-
-
@@ -288,21 +329,120 @@
##发送Map到GameServer的沟通包
#
def SendPyPackToGameServer(sendPack):
- if hasattr(sendPack, 'PlayerID'):
- if sendPack.PlayerID >= 100000000:
+ # if hasattr(sendPack, 'PlayerID'):
+ # if sendPack.PlayerID >= 100000000:
+ # return
+ # routeIndex = GameWorld.GetGameWorld().GetLineNO()
+ # #这里必须用GetRealMapID,GetMapID 实际取到的是DataMapID,在有分线的地图会问题
+ # mapID = GameWorld.GetGameWorld().GetRealMapID()
+ # #先写入当前地图标识,方便GameServer回包时可以正确通知到对应地图
+ # data = ''
+ # data = CommFunc.WriteBYTE(data, routeIndex) #1
+ # data = CommFunc.WriteDWORD(data, mapID) #4
+ # data = CommFunc.WriteString(data, sendPack.GetLength(), sendPack.GetBuffer())
+
+ # dataLen = 1 + 4 + sendPack.GetLength()
+
+ # GameWorld.GetGameWorld().SendGameServerGeneralPack(dataLen, data)
+ return
+
+
+##向地图(c++)发送数据
+# 结构体要求第一个类型为枚举 TDataServerToBalanceServer,不需要封包头,用类型做判断
+def SendPyPackToMapServerSelf(data, datalen):
+ GameWorld.GetGameWorld().SendPyPackToMapServerSelf(datalen, data)
+ return
+
+
+
+# 向ServersRoute发送数据
+def SendPyPackToServersRoute(data, datalen):
+ GameWorld.GetGameWorld().SendPyPackToServersRoute(datalen, data)
+ return
+
+
+#-------------------------------------------------------------------------------
+# Py跨服服务器间的封包
+#跨服服务器间的封包既是发包也是收包
+PyCrossServerPackTable = {}
+PyCrossServerPackTable = ReadPyPackTable("PyCrossServerPack")
+
+# 收包字典
+RecCrossServerPyPackDict = ChServerToServerPyPack.ChNetPackDict
+
+## 接收跨服之间封包
+# @param tick 时间戳
+# @return 无返回值
+# @remarks
+def RecCrossServerNetPack(netPackBuffer):
+
+ try:
+ GameWorld.GetGameWorld().SetCurGameWorldIndex(0) # 需要设置,不然获取不到 GetMap 等虚拟分线相关接口
+
+ #没有PY封包头
+ if len(netPackBuffer) <= 1:
return
- routeIndex = GameWorld.GetGameWorld().GetLineNO()
- #这里必须用GetRealMapID,GetMapID 实际取到的是DataMapID,在有分线的地图会问题
- mapID = GameWorld.GetGameWorld().GetRealMapID()
- #先写入当前地图标识,方便GameServer回包时可以正确通知到对应地图
- data = ''
- data = CommFunc.WriteBYTE(data, routeIndex) #1
- data = CommFunc.WriteDWORD(data, mapID) #4
- data = CommFunc.WriteString(data, sendPack.GetLength(), sendPack.GetBuffer())
+
+ headData = netPackBuffer[1] + netPackBuffer[0]
+ curPackHead = CommFunc.ReadWORD(headData, 0)[0]
+
+ curPackData = RecCrossServerPyPackDict.get(curPackHead)
+ if not curPackData:
+ return
+
+
+ curPackData.ReadData(netPackBuffer)
+
+ # 截断字符串
+ for key in dir(curPackData):
+ value = getattr(curPackData, key)
+ if isinstance(value, str):
+ setattr(curPackData, key, value.rstrip(chr(0x0)))
+
+ # 取此包头注册信息
+ curPackHeadRegDict = PyCrossServerPackTable.get(curPackHead)
+ # 无此封包注册信息
+ if curPackHeadRegDict == None:
+ #Log("RevieveFakePack: No Register curPackHead = %s"%curPackHead)
+ return
+
+ curPackHeadRegDict["CallFunc"](curPackData)
+
+ except Exception:
+ GameWorld.RaiseException("!!!python自定义跨服封包解析失败\r\n%s" % traceback.format_exc())
+ return
- dataLen = 1 + 4 + sendPack.GetLength()
-
- GameWorld.GetGameWorld().SendGameServerGeneralPack(dataLen, data)
-
-
-
+def GetSSPackDirType(serverType):
+ ## 根据服务器类型获取发送的目标类型
+ if serverType in [ShareDefine.serverType_Cross, ShareDefine.serverType_CrossCenter]:
+ return ShareDefine.dirType_Cross
+ if serverType in [ShareDefine.serverType_Main, ShareDefine.serverType_Child]:
+ return ShareDefine.dirType_Main
+ if serverType == ShareDefine.serverType_Battle:
+ return ShareDefine.dirType_Battle
+ return ShareDefine.dirType_All
+
+def SendCrossServerToServerPack(pack, serverList=None, dirType=None, serverType=None):
+ '''发送跨服包:服务器与服务器间的通信
+ @param pack 自定义封包实例
+ @param serverList 服务器列表 格式如 [(1,10),50,(55,100)] 约定内部必须用元组 同其他跨服配表规则一致
+ @param DirType 0全广播,1通知主服务器排除合服子服,2通知服务器包含合服子服, 3通知跨服服务器
+ @param serverType 可只传入来源的服务器类型,适用于一对一通讯的回包
+ '''
+ if dirType == None and serverType == None:
+ return
+ if dirType == None:
+ dirType = GetSSPackDirType(serverType)
+ if serverList == None:
+ serverList = []
+ recvPack = MergeServerRecvProtocol.tagLPStringData()
+ recvPack.Type = CommonDefine.gstCrossServerToServerPack
+ recvPack.DirType = dirType
+ recvPack.ServerList = str(serverList)
+ recvPack.ServerLen = len(recvPack.ServerList)
+ recvPack.Data = pack.GetBuffer()
+ recvPack.DataLen = len(recvPack.Data)
+ SendPyPackToServersRoute(recvPack.GetBuffer(), recvPack.GetLength())
+ return
+
+
--
Gitblit v1.8.0