10185 【越南】【港台】【主干】BOSS凭证修改(排行榜优化;跨服榜查看改为直接查跨服数据,支持分页查询;跨服凭证个人榜单最大调整为1000条,其他100;)
| | |
| | | ("Type", c_ubyte), #榜单类型
|
| | | ("GroupValue1", c_ubyte), # 分组值1
|
| | | ("GroupValue2", c_ubyte), # 分组值2,与分组值1组合归为同组榜单数据
|
| | | ("StartIndex", c_int), #查看的起始名次索引, 默认0
|
| | | ("WatchCnt", c_ubyte), #查看条数,默认20,最大不超过100
|
| | | ("IsWatchSelf", c_ubyte), #是否查看自己名次前后,默认10条数据
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | |
| | | self.Type = 0
|
| | | self.GroupValue1 = 0
|
| | | self.GroupValue2 = 0
|
| | | self.StartIndex = 0
|
| | | self.WatchCnt = 0
|
| | | self.IsWatchSelf = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | |
| | | SubCmd:%s,
|
| | | Type:%d,
|
| | | GroupValue1:%d,
|
| | | GroupValue2:%d
|
| | | GroupValue2:%d,
|
| | | StartIndex:%d,
|
| | | WatchCnt:%d,
|
| | | IsWatchSelf:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd,
|
| | | self.Type,
|
| | | self.GroupValue1,
|
| | | self.GroupValue2
|
| | | self.GroupValue2,
|
| | | self.StartIndex,
|
| | | self.WatchCnt,
|
| | | self.IsWatchSelf
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
| | | # C0 07 跨服排行榜信息 #tagGCCrossBillboardInfo
|
| | |
|
| | | class tagGCCrossBillboardData(Structure):
|
| | | OrderIndex = 0 #(WORD OrderIndex)//名次索引,0代表第一名
|
| | | ID = 0 #(DWORD ID)
|
| | | ID2 = 0 #(DWORD ID2)
|
| | | Name1 = "" #(char Name1[33])//名字1,用来显示排序对象名字
|
| | | Name2 = "" #(char Name2[33])//名字2
|
| | | Type2 = 0 #(BYTE Type2)//附加类型,用来表示排序对象的类型,比如,玩家所属职业门派,宠物类型等
|
| | |
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | self.OrderIndex,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.ID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.ID2,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.Name1,_pos = CommFunc.ReadString(_lpData, _pos,33)
|
| | | self.Name2,_pos = CommFunc.ReadString(_lpData, _pos,33)
|
| | | self.Type2,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | |
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.OrderIndex = 0
|
| | | self.ID = 0
|
| | | self.ID2 = 0
|
| | | self.Name1 = ""
|
| | | self.Name2 = ""
|
| | | self.Type2 = 0
|
| | |
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += 2
|
| | | length += 4
|
| | | length += 4
|
| | | length += 33
|
| | | length += 33
|
| | |
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteWORD(data, self.OrderIndex)
|
| | | data = CommFunc.WriteDWORD(data, self.ID)
|
| | | data = CommFunc.WriteDWORD(data, self.ID2)
|
| | | data = CommFunc.WriteString(data, 33, self.Name1)
|
| | | data = CommFunc.WriteString(data, 33, self.Name2)
|
| | | data = CommFunc.WriteBYTE(data, self.Type2)
|
| | |
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | OrderIndex:%d,
|
| | | ID:%d,
|
| | | ID2:%d,
|
| | | Name1:%s,
|
| | | Name2:%s,
|
| | | Type2:%d,
|
| | |
| | | UserData:%s
|
| | | '''\
|
| | | %(
|
| | | self.OrderIndex,
|
| | | self.ID,
|
| | | self.ID2,
|
| | | self.Name1,
|
| | | self.Name2,
|
| | | self.Type2,
|
| | |
| | | Type = 0 #(BYTE Type)//榜单类型
|
| | | GroupValue1 = 0 #(BYTE GroupValue1)// 分组值1
|
| | | GroupValue2 = 0 #(BYTE GroupValue2)// 分组值2,与分组值1组合归为同组榜单数据
|
| | | IsWatchSelf = 0 #(BYTE IsWatchSelf)
|
| | | BillboardCount = 0 #(BYTE BillboardCount)
|
| | | CrossBillboardDataList = list() #(vector<tagGCCrossBillboardData> CrossBillboardDataList)
|
| | | data = None
|
| | |
| | | self.Type,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.GroupValue1,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.GroupValue2,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.IsWatchSelf,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.BillboardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | for i in range(self.BillboardCount):
|
| | | temCrossBillboardDataList = tagGCCrossBillboardData()
|
| | |
| | | self.Type = 0
|
| | | self.GroupValue1 = 0
|
| | | self.GroupValue2 = 0
|
| | | self.IsWatchSelf = 0
|
| | | self.BillboardCount = 0
|
| | | self.CrossBillboardDataList = list()
|
| | | return
|
| | |
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 1
|
| | | length += 1
|
| | | length += 1
|
| | | length += 1
|
| | |
| | | data = CommFunc.WriteBYTE(data, self.Type)
|
| | | data = CommFunc.WriteBYTE(data, self.GroupValue1)
|
| | | data = CommFunc.WriteBYTE(data, self.GroupValue2)
|
| | | data = CommFunc.WriteBYTE(data, self.IsWatchSelf)
|
| | | data = CommFunc.WriteBYTE(data, self.BillboardCount)
|
| | | for i in range(self.BillboardCount):
|
| | | data = CommFunc.WriteString(data, self.CrossBillboardDataList[i].GetLength(), self.CrossBillboardDataList[i].GetBuffer())
|
| | |
| | | Type:%d,
|
| | | GroupValue1:%d,
|
| | | GroupValue2:%d,
|
| | | IsWatchSelf:%d,
|
| | | BillboardCount:%d,
|
| | | CrossBillboardDataList:%s
|
| | | '''\
|
| | |
| | | self.Type,
|
| | | self.GroupValue1,
|
| | | self.GroupValue2,
|
| | | self.IsWatchSelf,
|
| | | self.BillboardCount,
|
| | | "..."
|
| | | )
|
| | |
| | |
|
| | | groupValue1 = GameWorld.ToIntDef(gmCmdDict.get('groupValue1', ''), None)
|
| | | groupValue2 = GameWorld.ToIntDef(gmCmdDict.get('groupValue2', ''), None)
|
| | | queryCount = GameWorld.ToIntDef(gmCmdDict.get('queryCount', ''), 10)
|
| | | startRank = GameWorld.ToIntDef(gmCmdDict.get('startRank', ''), 1)
|
| | | startRank = max(1, startRank)
|
| | |
|
| | | billboardMgr = PyDataManager.GetCrossBillboardManager()
|
| | | groupList = billboardMgr.GetBillboardGroupList(billboardType)
|
| | | |
| | | backMsg = {"billboardType":billboardType, "groupList":groupList}
|
| | | dataTotalDict = {}
|
| | | for bType, gValue1, gValue2 in groupList:
|
| | | billboardObj = billboardMgr.GetCrossBillboard(bType, gValue1, gValue2)
|
| | | dataTotalDict["%s-%s-%s" % (bType, gValue1, gValue2)] = billboardObj.GetCount()
|
| | | |
| | | backMsg = {"billboardType":billboardType, "groupList":groupList, "dataTotalDict":dataTotalDict, |
| | | "groupValue1":groupValue1, "groupValue2":groupValue2, "queryCount":queryCount, "startRank":startRank}
|
| | |
|
| | | if groupValue1 != None and groupValue2 != None:
|
| | | billboardObj = billboardMgr.GetCrossBillboard(billboardType, groupValue1, groupValue2)
|
| | | |
| | | dataTotal = billboardObj.GetCount()
|
| | | fromIndex = startRank - 1
|
| | | toIndex = fromIndex + queryCount
|
| | | billboardInfo = []
|
| | | for i in xrange(billboardObj.GetCount()):
|
| | | for i in xrange(startRank - 1, toIndex):
|
| | | if i >= dataTotal:
|
| | | break
|
| | | billboardData = billboardObj.At(i)
|
| | | if not billboardData:
|
| | | continue
|
| | | rank = i + 1
|
| | | billboardDict = {
|
| | | "Rank":rank,
|
| | | "ID":billboardData.ID,
|
| | | "ID2":billboardData.ID2,
|
| | | "Name1":billboardData.Name1,
|
| | |
| | |
|
| | | billboardInfo.append(billboardDict)
|
| | |
|
| | | backMsg.update({"billboardInfo":billboardInfo, "groupValue1":groupValue1, "groupValue2":groupValue2})
|
| | | backMsg.update({"billboardInfo":billboardInfo, "groupValue1":groupValue1, "groupValue2":groupValue2, "dataTotal":dataTotal})
|
| | |
|
| | | #执行成功
|
| | | GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_Success, backMsg)
|
| | |
| | | import operator
|
| | | import time
|
| | |
|
| | | Def_CrossBillboard_MaxDataCount = 200 # 跨服榜单数据最大条数暂固定最大为100条,如有需要调整需针对实际情况进行评估(如数据同步、同步封包等)
|
| | |
|
| | | class CrossBillboardManager(object):
|
| | | ## 跨服排行榜管理,注意该类只处理数据逻辑,功能相关逻辑不要写在该类,不然重读脚本不会生效
|
| | |
|
| | |
| | | self.__billboardType = billboardType
|
| | | self.__groupValue1 = groupValue1
|
| | | self.__groupValue2 = groupValue2
|
| | | self.__maxCount = ShareDefine.CrossBillboard_MaxDataCount.get(billboardType, 100)
|
| | | self.__crossServerDataVer = 0 # 主服榜单数据版本
|
| | | self.__clientServerDataVer = 0 # 子服榜单数据版本
|
| | | self.__billboardList = [] # [tagDBCrossBillboard, ...]
|
| | |
| | | order = idOrderDict[findID]
|
| | | return self.__billboardList[order - 1]
|
| | |
|
| | | def IndexOfByID(self, findID):
|
| | | ''' 根据ID查询所在榜单索引
|
| | | @param findID: 查找的ID
|
| | | @return: -1 or >=0
|
| | | '''
|
| | | idOrderDict = self.GetIDOrderDict()
|
| | | if findID not in idOrderDict:
|
| | | return -1
|
| | | order = idOrderDict[findID]
|
| | | return order - 1
|
| | | |
| | | def SaveDRData(self):
|
| | | ## 记录流向数据
|
| | | eventTypeName = "CrossBillboard_%s" % (self.__billboardType)
|
| | |
| | | return self.__idOrderDict
|
| | |
|
| | | def GetCount(self): return len(self.__billboardList)
|
| | | def GetMaxCount(self): return Def_CrossBillboard_MaxDataCount
|
| | | def GetMaxCount(self): return self.__maxCount
|
| | |
|
| | | def At(self, i): return self.__billboardList[i]
|
| | | def IsFull(self): return len(self.__billboardList) >= Def_CrossBillboard_MaxDataCount
|
| | | def IsFull(self): return len(self.__billboardList) >= self.__maxCount
|
| | |
|
| | | def UpdCrossServerDataVer(self, version=None):
|
| | | ## 更新跨服榜单数据版本号,用于跨服主服、子服验证数据版本,同步榜单数据用
|
| | |
| | | if version == None:
|
| | | version = int(time.time())
|
| | | self.__crossServerDataVer = version
|
| | | SyncCrossBillboardToClientServer(self.__billboardType, self.__groupValue1, self.__groupValue2)
|
| | | #SyncCrossBillboardToClientServer(self.__billboardType, self.__groupValue1, self.__groupValue2)
|
| | | return
|
| | | def GetCrossServerDataVer(self): return self.__crossServerDataVer
|
| | |
|
| | |
| | | # BYTE Type; //榜单类型
|
| | | # BYTE GroupValue1; // 分组值1
|
| | | # BYTE GroupValue2; // 分组值2,与分组值1组合归为同组榜单数据
|
| | | # DWORD StartIndex; //查看的起始名次索引, 默认0
|
| | | # BYTE WatchCnt; //查看条数,默认20,最大不超过100
|
| | | # BYTE IsWatchSelf; //是否查看自己名次前后,默认10条数据
|
| | | #};
|
| | | def OnViewCrossBillboard(index, clientData, tick):
|
| | | curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
| | |
| | | return
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | billboardType, groupValue1, groupValue2 = clientData.Type, clientData.GroupValue1, clientData.GroupValue2
|
| | | startIndex = clientData.StartIndex
|
| | | watchCnt = clientData.WatchCnt
|
| | | isWatchSelf = clientData.IsWatchSelf
|
| | |
|
| | | if billboardType not in ShareDefine.CrossBillboardTypeList:
|
| | | return
|
| | |
|
| | | billboardMgr = PyDataManager.GetCrossBillboardManager()
|
| | | billboardObj = billboardMgr.GetCrossBillboard(billboardType, groupValue1, groupValue2)
|
| | | # 支持分页查询,改为直接查跨服服务器
|
| | |
|
| | | GameWorld.DebugLog("玩家请求查看跨服排行榜: billboardType=%s,groupValue1=%s,groupValue2=%s" % (billboardType, groupValue1, groupValue2))
|
| | | if not billboardObj.CheckClientServerDataVer():
|
| | | SyncCrossBillboardToPlayer(curPlayer, billboardType, groupValue1, groupValue2, billboardObj.GetBillboardDataList())
|
| | | return
|
| | |
|
| | | # 请求查询跨服服务器
|
| | | dataMsg = {"BillboardType":billboardType, "GroupValue1":groupValue1, "GroupValue2":groupValue2,
|
| | | "QueryData":{"EventName":"View", "PlayerID":playerID}}
|
| | | "QueryData":{"EventName":"View", "PlayerID":playerID, "StartIndex":startIndex, "WatchCnt":watchCnt, "IsWatchSelf":isWatchSelf}}
|
| | | CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_QueryBillboard, dataMsg)
|
| | | return
|
| | |
|
| | |
| | |
|
| | | # 有查询数据时才同步榜单数据列表,否则只同步数据版本号
|
| | | if queryData:
|
| | | playerID = queryData.get("PlayerID", 0)
|
| | | startIndex = queryData.get("StartIndex", 0)
|
| | | watchCnt = queryData.get("WatchCnt", 0)
|
| | | isWatchSelf = queryData.get("IsWatchSelf", 0)
|
| | | |
| | | count = billboardObj.GetCount()
|
| | | endIndex = 0
|
| | | # 查看自己前后名次
|
| | | if isWatchSelf:
|
| | | playerIndex = billboardObj.IndexOfByID(playerID)
|
| | | if playerIndex != -1:
|
| | | # 前5后4,首尾补足10条记录
|
| | | endIndex = min(playerIndex + 5, count)
|
| | | startIndex = max(0, endIndex - 10)
|
| | | endIndex = min(endIndex + (10 - (endIndex - startIndex)), count)
|
| | | else:
|
| | | startIndex = 0
|
| | | |
| | | # 指定索引分页查看
|
| | | else:
|
| | | startIndex = max(startIndex, 0)
|
| | | startIndex = min(startIndex, count)
|
| | | watchCnt = 20 if not watchCnt else min(watchCnt, 100) # 默认20,最多100
|
| | | endIndex = min(startIndex + watchCnt, count)
|
| | | |
| | | syncBillboardList = []
|
| | | billboardList = billboardObj.GetBillboardDataList()
|
| | | for billboardData in billboardList:
|
| | | for index in xrange(startIndex, endIndex):
|
| | | |
| | | if startIndex < 0 or index >= count:
|
| | | break
|
| | | |
| | | billboardData = billboardObj.At(index)
|
| | | |
| | | ID = billboardData.ID
|
| | | ID2 = billboardData.ID2
|
| | | Name1 = billboardData.Name1
|
| | |
| | | CmpValue = billboardData.CmpValue
|
| | | CmpValue2 = billboardData.CmpValue2
|
| | | CmpValue3 = billboardData.CmpValue3
|
| | | syncBillboardList.append([ID, ID2, Name1, Name2, Type2, Value1, Value2, CmpValue, CmpValue2, CmpValue3, Value3, Value4, Value5, Value6, Value7, Value8, UserData])
|
| | | syncBillboardList.append([index, ID, ID2, Name1, Name2, Type2, Value1, Value2, CmpValue, CmpValue2, CmpValue3, Value3, Value4, Value5, Value6, Value7, Value8, UserData])
|
| | | msgData["BillboardDataList"] = syncBillboardList
|
| | |
|
| | | CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_SyncBillboard, msgData, serverGroupIDList)
|
| | |
| | | GameWorld.DebugLog("收到跨服服务器同步的排行榜信息: billboardType=%s,groupValue1=%s,groupValue2=%s,crossServerDataVer=%s"
|
| | | % (billboardType, groupValue1, groupValue2, crossServerDataVer))
|
| | |
|
| | | billboardMgr = PyDataManager.GetCrossBillboardManager()
|
| | | billboardObj = billboardMgr.GetCrossBillboard(billboardType, groupValue1, groupValue2)
|
| | | billboardObj.UpdClientServerBillboard(crossServerDataVer, syncBillboardList)
|
| | | #billboardMgr = PyDataManager.GetCrossBillboardManager()
|
| | | #billboardObj = billboardMgr.GetCrossBillboard(billboardType, groupValue1, groupValue2)
|
| | | #billboardObj.UpdClientServerBillboard(crossServerDataVer, syncBillboardList)
|
| | |
|
| | | queryData = msgData.get("QueryData")
|
| | | if not queryData:
|
| | | return
|
| | |
|
| | | eventName = queryData.get("EventName")
|
| | | eventData = queryData.get("EventData")
|
| | | #eventData = queryData.get("EventData")
|
| | | queryPlayerID = queryData.get("PlayerID", 0)
|
| | | if not eventName or not queryPlayerID:
|
| | | return
|
| | |
| | | return
|
| | |
|
| | | if eventName == "View":
|
| | | SyncCrossBillboardToPlayer(queryPlayer, billboardType, groupValue1, groupValue2, billboardObj.GetBillboardDataList())
|
| | | else:
|
| | | idOrderDict = billboardObj.GetIDOrderDict()
|
| | | order = idOrderDict.get(queryPlayerID, 0)
|
| | | sysMsg = str([billboardType, groupValue1, groupValue2, eventName, eventData, order])
|
| | | queryPlayer.MapServer_QueryPlayerResult(0, 0, "CrossBillboardOrder", sysMsg, len(sysMsg))
|
| | | isWatchSelf = queryData.get("IsWatchSelf", 0)
|
| | | SyncCrossBillboardToPlayer(queryPlayer, billboardType, groupValue1, groupValue2, syncBillboardList, isWatchSelf)
|
| | | #else:
|
| | | # idOrderDict = billboardObj.GetIDOrderDict()
|
| | | # order = idOrderDict.get(queryPlayerID, 0)
|
| | | # sysMsg = str([billboardType, groupValue1, groupValue2, eventName, eventData, order])
|
| | | # queryPlayer.MapServer_QueryPlayerResult(0, 0, "CrossBillboardOrder", sysMsg, len(sysMsg))
|
| | |
|
| | | return
|
| | |
|
| | | def SyncCrossBillboardToPlayer(curPlayer, billboardType, groupValue1, groupValue2, billboardList):
|
| | | def SyncCrossBillboardToPlayer(curPlayer, billboardType, groupValue1, groupValue2, billboardList, isWatchSelf):
|
| | | ## 同步给玩家跨服榜单
|
| | | billboardInfo = ChPyNetSendPack.tagGCCrossBillboardInfo()
|
| | | billboardInfo.Type = billboardType
|
| | | billboardInfo.GroupValue1 = groupValue1
|
| | | billboardInfo.GroupValue2 = groupValue2
|
| | | billboardInfo.IsWatchSelf = isWatchSelf
|
| | | billboardInfo.CrossBillboardDataList = []
|
| | | for billboardData in billboardList:
|
| | | for dataInfo in billboardList:
|
| | | index, ID, ID2, Name1, Name2, Type2, Value1, Value2, CmpValue, CmpValue2, CmpValue3, Value3, Value4, Value5, Value6, Value7, Value8, UserData = dataInfo
|
| | | billboardInfoData = ChPyNetSendPack.tagGCCrossBillboardData()
|
| | | billboardInfoData.ID = billboardData.ID
|
| | | billboardInfoData.Name1 = billboardData.Name1
|
| | | billboardInfoData.Name2 = billboardData.Name2
|
| | | billboardInfoData.Type2 = billboardData.Type2
|
| | | billboardInfoData.Value1 = billboardData.Value1
|
| | | billboardInfoData.Value2 = billboardData.Value2
|
| | | billboardInfoData.Value3 = billboardData.Value3
|
| | | billboardInfoData.Value4 = billboardData.Value4
|
| | | billboardInfoData.Value5 = billboardData.Value5
|
| | | billboardInfoData.Value6 = billboardData.Value6
|
| | | billboardInfoData.Value7 = billboardData.Value7
|
| | | billboardInfoData.Value8 = billboardData.Value8
|
| | | billboardInfoData.CmpValue = billboardData.CmpValue
|
| | | billboardInfoData.CmpValue2 = billboardData.CmpValue2
|
| | | billboardInfoData.CmpValue3 = billboardData.CmpValue3
|
| | | billboardInfoData.UserData = billboardData.UserData
|
| | | billboardInfoData.OrderIndex = index
|
| | | billboardInfoData.ID = ID
|
| | | billboardInfoData.ID2 = ID2
|
| | | billboardInfoData.Name1 = Name1
|
| | | billboardInfoData.Name2 = Name2
|
| | | billboardInfoData.Type2 = Type2
|
| | | billboardInfoData.Value1 = Value1
|
| | | billboardInfoData.Value2 = Value2
|
| | | billboardInfoData.Value3 = Value3
|
| | | billboardInfoData.Value4 = Value4
|
| | | billboardInfoData.Value5 = Value5
|
| | | billboardInfoData.Value6 = Value6
|
| | | billboardInfoData.Value7 = Value7
|
| | | billboardInfoData.Value8 = Value8
|
| | | billboardInfoData.CmpValue = CmpValue
|
| | | billboardInfoData.CmpValue2 = CmpValue2
|
| | | billboardInfoData.CmpValue3 = CmpValue3
|
| | | billboardInfoData.UserData = UserData
|
| | | billboardInfoData.DataLen = len(billboardInfoData.UserData)
|
| | | billboardInfo.CrossBillboardDataList.append(billboardInfoData)
|
| | | billboardInfo.BillboardCount = len(billboardInfo.CrossBillboardDataList)
|
| | |
| | | and (not cmpValue3 or cmpValue3 == billboardData.CmpValue3) \
|
| | | and value1 == billboardData.Value1 and value2 == billboardData.Value2 \
|
| | | and value3 == billboardData.Value3 and value4 == billboardData.Value4 \
|
| | | and value5 == billboardData.Value1 and value6 == billboardData.Value6 \
|
| | | and value7 == billboardData.Value1 and value8 == billboardData.Value8 \
|
| | | and value5 == billboardData.Value5 and value6 == billboardData.Value6 \
|
| | | and value7 == billboardData.Value7 and value8 == billboardData.Value8 \
|
| | | and name1 == billboardData.Name1 and name2 == billboardData.Name2 \
|
| | | and type2 == billboardData.Type2 and id2 == billboardData.ID2 and userData == billboardData.UserData:
|
| | | GameWorld.DebugLog(" 榜单值相同,不同步跨服服务器! ")
|
| | |
| | | if not billboardObj.AddBillboardData(billboardData):
|
| | | return
|
| | |
|
| | | cmpValueChange = isNewData or billboardData.CmpValue != cmpValue or billboardData.CmpValue2 != cmpValue2 or billboardData.CmpValue3 != cmpValue3
|
| | | cmpValueChange = isNewData or billboardData.CmpValue != cmpValue or billboardData.CmpValue2 != cmpValue2 or (cmpValue3 and billboardData.CmpValue3 != cmpValue3)
|
| | | # 没设置值默认为时间time,先上榜的排前面
|
| | | if cmpValue3 == 0:
|
| | | # 时间权值仅在比较值变更的情况下才更新, 防止其他附属值更新时导致比较值相同的玩家名次间会变动的问题
|
| | |
| | | return False
|
| | |
|
| | | isNewData = playerBillBoardData.GetID2() == 0 # 是否是新增的数据
|
| | | cmpValueChange = False
|
| | | if isNewData or playerBillBoardData.GetCmpValue() != cmpValue or playerBillBoardData.GetCmpValue2() != cmpValue2 \
|
| | | or playerBillBoardData.GetCmpValue3() != cmpValue3:
|
| | | cmpValueChange = True
|
| | | if cmpValue3 == 0:
|
| | | cmpValueChange = isNewData or playerBillBoardData.GetCmpValue() != cmpValue or playerBillBoardData.GetCmpValue2() != cmpValue2 \
|
| | | or (cmpValue3 and playerBillBoardData.GetCmpValue3() != cmpValue3)
|
| | | if cmpValue3 == 0:
|
| | | if cmpValueChange:
|
| | | # 时间权值仅在比较值变更的情况下才更新, 防止其他附属值更新时导致比较值相同的玩家名次间会变动的问题
|
| | | calcTime = GameWorld.ChangeTimeStrToNum("2080-01-01 00:00:00")
|
| | | cmpValue3 = max(0, calcTime - int(time.time())) # 比较值3如果没指定值则默认存当前更新的time
|
| | | else:
|
| | | cmpValue3 = playerBillBoardData.GetCmpValue3()
|
| | |
|
| | | #设置排行榜数据
|
| | | playerBillBoardData.SetType(billboardIndex)
|
| | |
| | | if cmpValue3 > 0:
|
| | | playerBillBoardData.SetCmpValue3(cmpValue3)
|
| | |
|
| | | GameWorld.DebugLog("更新排行榜值 index=%s,type2=%s,value1=%s,value2=%s,cmpValue=%s,cmpValue2==%s,cmpValue3==%s,isNewData=%s,%s" |
| | | % (billboardIndex, type2, value1, value2, cmpValue, cmpValue2, cmpValue3, isNewData, kwargs), curPlayerID)
|
| | | GameWorld.DebugLog("更新排行榜值 index=%s,type2=%s,value1=%s,value2=%s,cmpValue=%s,cmpValue2==%s,cmpValue3==%s,isNewData=%s,cmpValueChange=%s,%s" |
| | | % (billboardIndex, type2, value1, value2, cmpValue, cmpValue2, cmpValue3, isNewData, cmpValueChange, kwargs), curPlayerID)
|
| | | if not cmpValueChange:
|
| | | return True
|
| | |
|
| | |
| | | Def_CBT_BossTrialSubmitFamilyBak, # boss凭证 - 仙盟榜 上一期 161
|
| | | ) = range(150, 161 + 1)
|
| | |
|
| | | # 跨服榜单最大数据名次,没有设置的默认100
|
| | | CrossBillboard_MaxDataCount = {
|
| | | Def_CBT_BossTrialSubmit:1000,
|
| | | Def_CBT_BossTrialSubmitBak:1000,
|
| | | }
|
| | |
|
| | | #职业对应战力排行榜类型
|
| | | JobFightPowerBillboardDict = {
|
| | | PlayerJob_Warrior:Def_BT_FightPower_Warrior,
|
| | |
| | | ("Type", c_ubyte), #榜单类型
|
| | | ("GroupValue1", c_ubyte), # 分组值1
|
| | | ("GroupValue2", c_ubyte), # 分组值2,与分组值1组合归为同组榜单数据
|
| | | ("StartIndex", c_int), #查看的起始名次索引, 默认0
|
| | | ("WatchCnt", c_ubyte), #查看条数,默认20,最大不超过100
|
| | | ("IsWatchSelf", c_ubyte), #是否查看自己名次前后,默认10条数据
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | |
| | | self.Type = 0
|
| | | self.GroupValue1 = 0
|
| | | self.GroupValue2 = 0
|
| | | self.StartIndex = 0
|
| | | self.WatchCnt = 0
|
| | | self.IsWatchSelf = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | |
| | | SubCmd:%s,
|
| | | Type:%d,
|
| | | GroupValue1:%d,
|
| | | GroupValue2:%d
|
| | | GroupValue2:%d,
|
| | | StartIndex:%d,
|
| | | WatchCnt:%d,
|
| | | IsWatchSelf:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd,
|
| | | self.Type,
|
| | | self.GroupValue1,
|
| | | self.GroupValue2
|
| | | self.GroupValue2,
|
| | | self.StartIndex,
|
| | | self.WatchCnt,
|
| | | self.IsWatchSelf
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
| | | # C0 07 跨服排行榜信息 #tagGCCrossBillboardInfo
|
| | |
|
| | | class tagGCCrossBillboardData(Structure):
|
| | | OrderIndex = 0 #(WORD OrderIndex)//名次索引,0代表第一名
|
| | | ID = 0 #(DWORD ID)
|
| | | ID2 = 0 #(DWORD ID2)
|
| | | Name1 = "" #(char Name1[33])//名字1,用来显示排序对象名字
|
| | | Name2 = "" #(char Name2[33])//名字2
|
| | | Type2 = 0 #(BYTE Type2)//附加类型,用来表示排序对象的类型,比如,玩家所属职业门派,宠物类型等
|
| | |
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | self.OrderIndex,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.ID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.ID2,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.Name1,_pos = CommFunc.ReadString(_lpData, _pos,33)
|
| | | self.Name2,_pos = CommFunc.ReadString(_lpData, _pos,33)
|
| | | self.Type2,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | |
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.OrderIndex = 0
|
| | | self.ID = 0
|
| | | self.ID2 = 0
|
| | | self.Name1 = ""
|
| | | self.Name2 = ""
|
| | | self.Type2 = 0
|
| | |
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += 2
|
| | | length += 4
|
| | | length += 4
|
| | | length += 33
|
| | | length += 33
|
| | |
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteWORD(data, self.OrderIndex)
|
| | | data = CommFunc.WriteDWORD(data, self.ID)
|
| | | data = CommFunc.WriteDWORD(data, self.ID2)
|
| | | data = CommFunc.WriteString(data, 33, self.Name1)
|
| | | data = CommFunc.WriteString(data, 33, self.Name2)
|
| | | data = CommFunc.WriteBYTE(data, self.Type2)
|
| | |
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | OrderIndex:%d,
|
| | | ID:%d,
|
| | | ID2:%d,
|
| | | Name1:%s,
|
| | | Name2:%s,
|
| | | Type2:%d,
|
| | |
| | | UserData:%s
|
| | | '''\
|
| | | %(
|
| | | self.OrderIndex,
|
| | | self.ID,
|
| | | self.ID2,
|
| | | self.Name1,
|
| | | self.Name2,
|
| | | self.Type2,
|
| | |
| | | Type = 0 #(BYTE Type)//榜单类型
|
| | | GroupValue1 = 0 #(BYTE GroupValue1)// 分组值1
|
| | | GroupValue2 = 0 #(BYTE GroupValue2)// 分组值2,与分组值1组合归为同组榜单数据
|
| | | IsWatchSelf = 0 #(BYTE IsWatchSelf)
|
| | | BillboardCount = 0 #(BYTE BillboardCount)
|
| | | CrossBillboardDataList = list() #(vector<tagGCCrossBillboardData> CrossBillboardDataList)
|
| | | data = None
|
| | |
| | | self.Type,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.GroupValue1,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.GroupValue2,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.IsWatchSelf,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.BillboardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | for i in range(self.BillboardCount):
|
| | | temCrossBillboardDataList = tagGCCrossBillboardData()
|
| | |
| | | self.Type = 0
|
| | | self.GroupValue1 = 0
|
| | | self.GroupValue2 = 0
|
| | | self.IsWatchSelf = 0
|
| | | self.BillboardCount = 0
|
| | | self.CrossBillboardDataList = list()
|
| | | return
|
| | |
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 1
|
| | | length += 1
|
| | | length += 1
|
| | | length += 1
|
| | |
| | | data = CommFunc.WriteBYTE(data, self.Type)
|
| | | data = CommFunc.WriteBYTE(data, self.GroupValue1)
|
| | | data = CommFunc.WriteBYTE(data, self.GroupValue2)
|
| | | data = CommFunc.WriteBYTE(data, self.IsWatchSelf)
|
| | | data = CommFunc.WriteBYTE(data, self.BillboardCount)
|
| | | for i in range(self.BillboardCount):
|
| | | data = CommFunc.WriteString(data, self.CrossBillboardDataList[i].GetLength(), self.CrossBillboardDataList[i].GetBuffer())
|
| | |
| | | Type:%d,
|
| | | GroupValue1:%d,
|
| | | GroupValue2:%d,
|
| | | IsWatchSelf:%d,
|
| | | BillboardCount:%d,
|
| | | CrossBillboardDataList:%s
|
| | | '''\
|
| | |
| | | self.Type,
|
| | | self.GroupValue1,
|
| | | self.GroupValue2,
|
| | | self.IsWatchSelf,
|
| | | self.BillboardCount,
|
| | | "..."
|
| | | )
|
| | |
| | | Def_CBT_BossTrialSubmitFamilyBak, # boss凭证 - 仙盟榜 上一期 161
|
| | | ) = range(150, 161 + 1)
|
| | |
|
| | | # 跨服榜单最大数据名次,没有设置的默认100
|
| | | CrossBillboard_MaxDataCount = {
|
| | | Def_CBT_BossTrialSubmit:1000,
|
| | | Def_CBT_BossTrialSubmitBak:1000,
|
| | | }
|
| | |
|
| | | #职业对应战力排行榜类型
|
| | | JobFightPowerBillboardDict = {
|
| | | PlayerJob_Warrior:Def_BT_FightPower_Warrior,
|