hxp
2018-12-21 f2c27280e1fae389220c22fd1ca3963c64743472
5424 【后端】【1.4】跨服竞技场开发(封包、定义、公共函数)
11个文件已修改
254 ■■■■ 已修改文件
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ReadChConfig.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ReadChConfig.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -15341,6 +15341,54 @@
#------------------------------------------------------
# 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):
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -8127,7 +8127,8 @@
    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):
@@ -8142,7 +8143,11 @@
        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):
@@ -8153,8 +8158,8 @@
        self.RoomID = 0
        self.NameLen = 0
        self.PlayerName = ""
        self.MatchPlayer=tagGCCrossRealmPKMatchPlayer()
        self.MatchPlayer.Clear()
        self.MatchPlayerCount = 0
        self.MatchPlayer = list()
        return
    def GetLength(self):
@@ -8163,7 +8168,9 @@
        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
@@ -8173,7 +8180,9 @@
        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):
@@ -8182,6 +8191,7 @@
                                RoomID:%d,
                                NameLen:%d,
                                PlayerName:%s,
                                MatchPlayerCount:%d,
                                MatchPlayer:%s
                                '''\
                                %(
@@ -8189,7 +8199,8 @@
                                self.RoomID,
                                self.NameLen,
                                self.PlayerName,
                                self.MatchPlayer.OutputString()
                                self.MatchPlayerCount,
                                "..."
                                )
        return DumpString
ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
@@ -418,18 +418,8 @@
    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):
    # 获取服务器的平台编号
@@ -864,6 +854,13 @@
    # 如果跨服服务器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 玩家实例
ServerPython/CoreServerGroup/GameServer/Script/ReadChConfig.py
@@ -215,7 +215,7 @@
#  @param option: 配置项名
#  @return
#  @remarks \db\PyMongoDataServer\PyMongoDataServer.ini配置读取
def GetPyMongoConfig(section, option):
def GetPyMongoConfig(section, option, raw=False):
    global PyMongoDataServerConfig
    
    if not PyMongoDataServerConfig:
@@ -233,7 +233,7 @@
        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)
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -1193,6 +1193,25 @@
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 每日挑战次数奖励
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -15341,6 +15341,54 @@
#------------------------------------------------------
# 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):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -8127,7 +8127,8 @@
    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):
@@ -8142,7 +8143,11 @@
        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):
@@ -8153,8 +8158,8 @@
        self.RoomID = 0
        self.NameLen = 0
        self.PlayerName = ""
        self.MatchPlayer=tagGCCrossRealmPKMatchPlayer()
        self.MatchPlayer.Clear()
        self.MatchPlayerCount = 0
        self.MatchPlayer = list()
        return
    def GetLength(self):
@@ -8163,7 +8168,9 @@
        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
@@ -8173,7 +8180,9 @@
        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):
@@ -8182,6 +8191,7 @@
                                RoomID:%d,
                                NameLen:%d,
                                PlayerName:%s,
                                MatchPlayerCount:%d,
                                MatchPlayer:%s
                                '''\
                                %(
@@ -8189,7 +8199,8 @@
                                self.RoomID,
                                self.NameLen,
                                self.PlayerName,
                                self.MatchPlayer.OutputString()
                                self.MatchPlayerCount,
                                "..."
                                )
        return DumpString
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py
@@ -1016,18 +1016,8 @@
    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):
    # 获取服务器的平台编号
@@ -1590,6 +1580,9 @@
        
    return config.get('IsMergeWarServe', 0)
def IsCrossServer():
    ## 是否跨服服务器
    return ToIntDef(ReadChConfig.GetPyMongoConfig("Merge", "IsMergeServer"), 0)
## 时间格式转换成数值时间,可参考datetime.datetime.fromtimestamp(102645645)
#  @param timeNum
@@ -1843,6 +1836,18 @@
                                                    '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开始
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ReadChConfig.py
@@ -219,7 +219,7 @@
#  @param option: 配置项名
#  @return
#  @remarks \db\PyMongoDataServer\PyMongoDataServer.ini配置读取
def GetPyMongoConfig(section, option):
def GetPyMongoConfig(section, option, raw=False):
    global PyMongoDataServerConfig
    
    if not PyMongoDataServerConfig:
@@ -237,7 +237,7 @@
        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)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -1193,6 +1193,25 @@
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 每日挑战次数奖励
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py
@@ -224,7 +224,8 @@
        GameWorld.DebugLog("非跨服服务器上线不清除buff...", playerID)
        return
    
    ClearBuffSkillTypeIDList = ReadChConfig.GetEvalChConfig("ClearBuffSkillTypeID")
    #ClearBuffSkillTypeIDList = ReadChConfig.GetEvalChConfig("ClearBuffSkillTypeID")
    ClearBuffSkillTypeIDList = []
    # 跨服服务器上线清除增益/减益buff
    GameWorld.Log("跨服服务器上线清除buff...", playerID)
    clearBuffList = [] # 先汇总再清除,不然索引会变更
@@ -281,6 +282,15 @@
                               % (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 当前时间