5424 【后端】【1.4】跨服竞技场开发(封包、定义、公共函数)
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # C1 04 主动退出跨服 #tagCMExitCrossRealm
|
| | |
|
| | | class tagCMExitCrossRealm(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Cmd = 0xC1
|
| | | self.SubCmd = 0x04
|
| | | return
|
| | |
|
| | | def ReadData(self, stringData, _pos=0, _len=0):
|
| | | self.Clear()
|
| | | memmove(addressof(self), stringData[_pos:], self.GetLength())
|
| | | return _pos + self.GetLength()
|
| | |
|
| | | def Clear(self):
|
| | | self.Cmd = 0xC1
|
| | | self.SubCmd = 0x04
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagCMExitCrossRealm)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''// C1 04 主动退出跨服 //tagCMExitCrossRealm:
|
| | | Cmd:%s,
|
| | | SubCmd:%s
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagCMExitCrossRealm=tagCMExitCrossRealm()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMExitCrossRealm.Cmd,m_NAtagCMExitCrossRealm.SubCmd))] = m_NAtagCMExitCrossRealm
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # C1 11 跨服王者争霸押注 #tagCMMergeKingSupport
|
| | |
|
| | | class tagCMMergeKingSupport(Structure):
|
| | |
| | | RoomID = 0 #(WORD RoomID)// 房间ID
|
| | | NameLen = 0 #(BYTE NameLen)
|
| | | PlayerName = "" #(String PlayerName)// 跨服名字
|
| | | MatchPlayer=tagGCCrossRealmPKMatchPlayer() #(tagGCCrossRealmPKMatchPlayer MatchPlayer)// 匹配到的玩家
|
| | | MatchPlayerCount = 0 #(BYTE MatchPlayerCount)
|
| | | MatchPlayer = list() #(vector<tagGCCrossRealmPKMatchPlayer> MatchPlayer)// 匹配到的玩家
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | |
| | | self.RoomID,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.PlayerName,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
|
| | | _pos = self.MatchPlayer.ReadData(_lpData,_pos)
|
| | | self.MatchPlayerCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | for i in range(self.MatchPlayerCount):
|
| | | temMatchPlayer = tagGCCrossRealmPKMatchPlayer()
|
| | | _pos = temMatchPlayer.ReadData(_lpData, _pos)
|
| | | self.MatchPlayer.append(temMatchPlayer)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | |
| | | self.RoomID = 0
|
| | | self.NameLen = 0
|
| | | self.PlayerName = ""
|
| | | self.MatchPlayer=tagGCCrossRealmPKMatchPlayer()
|
| | | self.MatchPlayer.Clear()
|
| | | self.MatchPlayerCount = 0
|
| | | self.MatchPlayer = list()
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | |
| | | length += 2
|
| | | length += 1
|
| | | length += len(self.PlayerName)
|
| | | length += self.MatchPlayer.GetLength()
|
| | | length += 1
|
| | | for i in range(self.MatchPlayerCount):
|
| | | length += self.MatchPlayer[i].GetLength()
|
| | |
|
| | | return length
|
| | |
|
| | |
| | | data = CommFunc.WriteWORD(data, self.RoomID)
|
| | | data = CommFunc.WriteBYTE(data, self.NameLen)
|
| | | data = CommFunc.WriteString(data, self.NameLen, self.PlayerName)
|
| | | data = CommFunc.WriteString(data,self.MatchPlayer.GetLength(),self.MatchPlayer.GetBuffer())
|
| | | data = CommFunc.WriteBYTE(data, self.MatchPlayerCount)
|
| | | for i in range(self.MatchPlayerCount):
|
| | | data = CommFunc.WriteString(data, self.MatchPlayer[i].GetLength(), self.MatchPlayer[i].GetBuffer())
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | |
| | | RoomID:%d,
|
| | | NameLen:%d,
|
| | | PlayerName:%s,
|
| | | MatchPlayerCount:%d,
|
| | | MatchPlayer:%s
|
| | | '''\
|
| | | %(
|
| | |
| | | self.RoomID,
|
| | | self.NameLen,
|
| | | self.PlayerName,
|
| | | self.MatchPlayer.OutputString()
|
| | | self.MatchPlayerCount,
|
| | | "..."
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
| | | return GetGameWorld().GetServerVersion()
|
| | |
|
| | | def GetServerGroupID():
|
| | | # 服务器组ID: 代表一台服务器中包含的合服、混服的各平台区服组成的一个独立游戏区服服务器环境, 用某个ID来代表此服务器
|
| | | # 在跨服环境中,此ID就是代表来自同一台服务器子服的玩家
|
| | | # 服务器组ID生成规则: DB平台标识对应编号 * 1000000 + DB配置的ServerID
|
| | | # ServerID支持范围: 1~999999
|
| | | # 平台编号支持范围:1~2000
|
| | | platform = GetPlatform()
|
| | | serverNum = GetPlatformServerNum(platform)
|
| | | if not serverNum:
|
| | | return 0
|
| | | serverNum = max(1, min(2000, serverNum))
|
| | | serverID = max(1, min(999999, GetServerID()))
|
| | | return serverNum * 1000000 + serverID
|
| | | ## 服务器组ID,必须唯一,代表这台物理服务器
|
| | | return ToIntDef(ReadChConfig.GetPyMongoConfig("platform", "GroupID"), 0)
|
| | |
|
| | | def GetPlatformServerNum(platform):
|
| | | # 获取服务器的平台编号
|
| | |
| | | # 如果跨服服务器IP有配置, 或本身就是跨服服务器, 则代表开启
|
| | | return True if (config.get('MergeServerIP') or config.get('IsMergeWarServe')) else False
|
| | |
|
| | | def IsCrossServer():
|
| | | ## 是否跨服服务器
|
| | | return ToIntDef(ReadChConfig.GetPyMongoConfig("Merge", "IsMergeServer"), 0)
|
| | |
|
| | | def IsCrossRealmOpen():
|
| | | ## 是否开启跨服活动
|
| | | return ReadChConfig.GetPyMongoConfig("Merge", "MergeServerIP") or IsCrossServer()
|
| | |
|
| | | ## 获取玩家的区服名,仅在跨服有效
|
| | | # @param curPlayer 玩家实例
|
| | |
| | | # @param option: 配置项名
|
| | | # @return
|
| | | # @remarks \db\PyMongoDataServer\PyMongoDataServer.ini配置读取
|
| | | def GetPyMongoConfig(section, option):
|
| | | def GetPyMongoConfig(section, option, raw=False):
|
| | | global PyMongoDataServerConfig
|
| | |
|
| | | if not PyMongoDataServerConfig:
|
| | |
| | | GameWorld.ErrLog("PyMongoDataServer.ini找不到配置: section=%s,option=%s" % (section, option))
|
| | | return ""
|
| | |
|
| | | strParam = PyMongoDataServerConfig.get(section, option)
|
| | | strParam = PyMongoDataServerConfig.get(section, option, raw)
|
| | | return strParam
|
| | |
|
| | | def GetDBConfig(key): return __DoLogic_GetDBConfig(key)
|
| | |
| | | CampType_Evil, #邪恶(与 Def_ID2Win 一致)
|
| | | ] = range(3)
|
| | |
|
| | | # 跨服服务器发送子服信息定义
|
| | | CrossServerMsg_ExitCrossServer = "ExitCrossServer" # 退出跨服服务器
|
| | | CrossServerMsg_Notify = "Notify" # 提示信息
|
| | | CrossServerMsg_PKMatchReqRet = "PKMatchReqRet" # 跨服PK匹配请求结果
|
| | | CrossServerMsg_PKMatchResult = "PKMatchResult" # 跨服PK匹配结果
|
| | | CrossServerMsg_PKReadyOKRoomList = "PKReadyOKRoomList" # 跨服PK已准备好的房间列表
|
| | | CrossServerMsg_PKTimeoutRoomList = "PKTimeoutRoomList" # 跨服PK已超时的房间列表
|
| | | CrossServerMsg_PKOverInfo = "PKOverInfo" # 跨服PK结果
|
| | | CrossServerMsg_PKSeasonInfo = "PKSeasonInfo" # 跨服PK赛季信息
|
| | | CrossServerMsg_PKSyncBillboard = "PKSyncBillboard" # 跨服PK同步排行榜 |
| | | CrossServerMsg_PKActionState = "PKActionState" # 跨服PK活动状态变更
|
| | |
|
| | | # 子服发送跨服信息定义
|
| | | ClientServerMsg_ServerInitOK = "ServerInitOK" # 子服启动成功
|
| | | ClientServerMsg_GMCMD = "GMCMD" # GM命令
|
| | | ClientServerMsg_PKMatch = "PKMatch" # 跨服PK匹配
|
| | | ClientServerMsg_PKCancel = "PKCancel" # 跨服PK取消匹配
|
| | | ClientServerMsg_PKPrepareOK = "PKPrepareOK" # 跨服PK准备完毕
|
| | |
|
| | | #跨服匹配PK奖励类型
|
| | | Def_MergePKAwardTypeList = (
|
| | | Def_MergePKAward_DayPKCnt, # 0 每日挑战次数奖励
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # C1 04 主动退出跨服 #tagCMExitCrossRealm
|
| | |
|
| | | class tagCMExitCrossRealm(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Cmd = 0xC1
|
| | | self.SubCmd = 0x04
|
| | | return
|
| | |
|
| | | def ReadData(self, stringData, _pos=0, _len=0):
|
| | | self.Clear()
|
| | | memmove(addressof(self), stringData[_pos:], self.GetLength())
|
| | | return _pos + self.GetLength()
|
| | |
|
| | | def Clear(self):
|
| | | self.Cmd = 0xC1
|
| | | self.SubCmd = 0x04
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagCMExitCrossRealm)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''// C1 04 主动退出跨服 //tagCMExitCrossRealm:
|
| | | Cmd:%s,
|
| | | SubCmd:%s
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagCMExitCrossRealm=tagCMExitCrossRealm()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMExitCrossRealm.Cmd,m_NAtagCMExitCrossRealm.SubCmd))] = m_NAtagCMExitCrossRealm
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # C1 11 跨服王者争霸押注 #tagCMMergeKingSupport
|
| | |
|
| | | class tagCMMergeKingSupport(Structure):
|
| | |
| | | RoomID = 0 #(WORD RoomID)// 房间ID
|
| | | NameLen = 0 #(BYTE NameLen)
|
| | | PlayerName = "" #(String PlayerName)// 跨服名字
|
| | | MatchPlayer=tagGCCrossRealmPKMatchPlayer() #(tagGCCrossRealmPKMatchPlayer MatchPlayer)// 匹配到的玩家
|
| | | MatchPlayerCount = 0 #(BYTE MatchPlayerCount)
|
| | | MatchPlayer = list() #(vector<tagGCCrossRealmPKMatchPlayer> MatchPlayer)// 匹配到的玩家
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | |
| | | self.RoomID,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.PlayerName,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
|
| | | _pos = self.MatchPlayer.ReadData(_lpData,_pos)
|
| | | self.MatchPlayerCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | for i in range(self.MatchPlayerCount):
|
| | | temMatchPlayer = tagGCCrossRealmPKMatchPlayer()
|
| | | _pos = temMatchPlayer.ReadData(_lpData, _pos)
|
| | | self.MatchPlayer.append(temMatchPlayer)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | |
| | | self.RoomID = 0
|
| | | self.NameLen = 0
|
| | | self.PlayerName = ""
|
| | | self.MatchPlayer=tagGCCrossRealmPKMatchPlayer()
|
| | | self.MatchPlayer.Clear()
|
| | | self.MatchPlayerCount = 0
|
| | | self.MatchPlayer = list()
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | |
| | | length += 2
|
| | | length += 1
|
| | | length += len(self.PlayerName)
|
| | | length += self.MatchPlayer.GetLength()
|
| | | length += 1
|
| | | for i in range(self.MatchPlayerCount):
|
| | | length += self.MatchPlayer[i].GetLength()
|
| | |
|
| | | return length
|
| | |
|
| | |
| | | data = CommFunc.WriteWORD(data, self.RoomID)
|
| | | data = CommFunc.WriteBYTE(data, self.NameLen)
|
| | | data = CommFunc.WriteString(data, self.NameLen, self.PlayerName)
|
| | | data = CommFunc.WriteString(data,self.MatchPlayer.GetLength(),self.MatchPlayer.GetBuffer())
|
| | | data = CommFunc.WriteBYTE(data, self.MatchPlayerCount)
|
| | | for i in range(self.MatchPlayerCount):
|
| | | data = CommFunc.WriteString(data, self.MatchPlayer[i].GetLength(), self.MatchPlayer[i].GetBuffer())
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | |
| | | RoomID:%d,
|
| | | NameLen:%d,
|
| | | PlayerName:%s,
|
| | | MatchPlayerCount:%d,
|
| | | MatchPlayer:%s
|
| | | '''\
|
| | | %(
|
| | |
| | | self.RoomID,
|
| | | self.NameLen,
|
| | | self.PlayerName,
|
| | | self.MatchPlayer.OutputString()
|
| | | self.MatchPlayerCount,
|
| | | "..."
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
| | | return GetGameWorld().GetServerVersion()
|
| | |
|
| | | def GetServerGroupID():
|
| | | # 服务器组ID: 代表一台服务器中包含的合服、混服的各平台区服组成的一个独立游戏区服服务器环境, 用某个ID来代表此服务器
|
| | | # 在跨服环境中,此ID就是代表来自同一台服务器子服的玩家
|
| | | # 服务器组ID生成规则: DB平台标识对应编号 * 1000000 + DB配置的ServerID
|
| | | # ServerID支持范围: 1~999999
|
| | | # 平台编号支持范围:1~2000
|
| | | platform = GetPlatform()
|
| | | serverNum = GetPlatformServerNum(platform)
|
| | | if not serverNum:
|
| | | return 0
|
| | | serverNum = max(1, min(2000, serverNum))
|
| | | serverID = max(1, min(999999, GetServerID()))
|
| | | return serverNum * 1000000 + serverID
|
| | | ## 服务器组ID,必须唯一,代表这台物理服务器
|
| | | return ToIntDef(ReadChConfig.GetPyMongoConfig("platform", "GroupID"), 0)
|
| | |
|
| | | def GetPlatformServerNum(platform):
|
| | | # 获取服务器的平台编号
|
| | |
| | |
|
| | | return config.get('IsMergeWarServe', 0)
|
| | |
|
| | | def IsCrossServer():
|
| | | ## 是否跨服服务器
|
| | | return ToIntDef(ReadChConfig.GetPyMongoConfig("Merge", "IsMergeServer"), 0)
|
| | |
|
| | | ## 时间格式转换成数值时间,可参考datetime.datetime.fromtimestamp(102645645)
|
| | | # @param timeNum
|
| | |
| | | 'SendMergerChildMsg', msgList, len(msgList))
|
| | | return
|
| | |
|
| | | def SendMsgToCrossServer(msgType, dataMsg, srcPlayerID=0, queryType=0, queryID=0):
|
| | | ## 发送信息到跨服服务器
|
| | | msgList = str([msgType, dataMsg])
|
| | | GetPlayerManager().GameServer_QueryPlayerResult(srcPlayerID, queryType, queryID, "SendMsgToCrossServer", msgList, len(msgList))
|
| | | return
|
| | |
|
| | | def SendMsgToClientServer(msgType, dataMsg, serverGroupIDList, srcPlayerID=0, queryType=0, queryID=0):
|
| | | ## 发送信息到子服
|
| | | msgList = str([msgType, dataMsg, serverGroupIDList])
|
| | | GetPlayerManager().GameServer_QueryPlayerResult(srcPlayerID, queryType, queryID, "SendMsgToClientServer", msgList, len(msgList))
|
| | | return
|
| | |
|
| | | ## 根据排行获取名次对应值
|
| | | # @param orderDict {名次:obj, ...} 名次支持段跳跃
|
| | | # @param order 名次,从1开始
|
| | |
| | | # @param option: 配置项名
|
| | | # @return
|
| | | # @remarks \db\PyMongoDataServer\PyMongoDataServer.ini配置读取
|
| | | def GetPyMongoConfig(section, option):
|
| | | def GetPyMongoConfig(section, option, raw=False):
|
| | | global PyMongoDataServerConfig
|
| | |
|
| | | if not PyMongoDataServerConfig:
|
| | |
| | | GameWorld.ErrLog("PyMongoDataServer.ini找不到配置: section=%s,option=%s" % (section, option))
|
| | | return ""
|
| | |
|
| | | strParam = PyMongoDataServerConfig.get(section, option)
|
| | | strParam = PyMongoDataServerConfig.get(section, option, raw)
|
| | | return strParam
|
| | |
|
| | | def GetDBConfig(key): return __DoLogic_GetDBConfig(key)
|
| | |
| | | CampType_Evil, #邪恶(与 Def_ID2Win 一致)
|
| | | ] = range(3)
|
| | |
|
| | | # 跨服服务器发送子服信息定义
|
| | | CrossServerMsg_ExitCrossServer = "ExitCrossServer" # 退出跨服服务器
|
| | | CrossServerMsg_Notify = "Notify" # 提示信息
|
| | | CrossServerMsg_PKMatchReqRet = "PKMatchReqRet" # 跨服PK匹配请求结果
|
| | | CrossServerMsg_PKMatchResult = "PKMatchResult" # 跨服PK匹配结果
|
| | | CrossServerMsg_PKReadyOKRoomList = "PKMatchResult" # 跨服PK已准备好的房间列表
|
| | | CrossServerMsg_PKTimeoutRoomList = "PKTimeoutRoomList" # 跨服PK已超时的房间列表
|
| | | CrossServerMsg_PKOverInfo = "PKOverInfo" # 跨服PK结果
|
| | | CrossServerMsg_PKSeasonInfo = "PKSeasonInfo" # 跨服PK赛季信息
|
| | | CrossServerMsg_PKSyncBillboard = "PKSyncBillboard" # 跨服PK同步排行榜 |
| | | CrossServerMsg_PKActionState = "PKActionState" # 跨服PK活动状态变更
|
| | |
|
| | | # 子服发送跨服信息定义
|
| | | ClientServerMsg_ServerInitOK = "ServerInitOK" # 子服启动成功
|
| | | ClientServerMsg_GMCMD = "GMCMD" # GM命令
|
| | | ClientServerMsg_PKMatch = "PKMatch" # 跨服PK匹配
|
| | | ClientServerMsg_PKCancel = "PKCancel" # 跨服PK取消匹配
|
| | | ClientServerMsg_PKPrepareOK = "PKPrepareOK" # 跨服PK准备完毕
|
| | |
|
| | | #跨服匹配PK奖励类型
|
| | | Def_MergePKAwardTypeList = (
|
| | | Def_MergePKAward_DayPKCnt, # 0 每日挑战次数奖励
|
| | |
| | | GameWorld.DebugLog("非跨服服务器上线不清除buff...", playerID)
|
| | | return
|
| | |
|
| | | ClearBuffSkillTypeIDList = ReadChConfig.GetEvalChConfig("ClearBuffSkillTypeID")
|
| | | #ClearBuffSkillTypeIDList = ReadChConfig.GetEvalChConfig("ClearBuffSkillTypeID")
|
| | | ClearBuffSkillTypeIDList = []
|
| | | # 跨服服务器上线清除增益/减益buff
|
| | | GameWorld.Log("跨服服务器上线清除buff...", playerID)
|
| | | clearBuffList = [] # 先汇总再清除,不然索引会变更
|
| | |
| | | % (curSkill.GetSkillName(), curSkill.GetSkillTypeID()), playerID)
|
| | | return
|
| | |
|
| | | def ResetAllSkillCD(curPlayer):
|
| | | skillManager = curPlayer.GetSkillManager()
|
| | | for i in xrange(skillManager.GetSkillCount()):
|
| | | skill = skillManager.GetSkillByIndex(i)
|
| | | if skill.GetRemainTime() != 0:
|
| | | skill.SetRemainTime(0)
|
| | | skill.Sync_Skill()
|
| | | return
|
| | |
|
| | | ## 刷新玩家所有技能的剩余时间(上线)
|
| | | # @param curPlayer 当前玩家
|
| | | # @param tick 当前时间
|