10185 【越南】【港台】【主干】BOSS凭证修改(去除排行榜查询CD;优化排行榜查看指定ID;)
| | |
| | | ("Type", c_ubyte), #类型 TBillboardType
|
| | | ("StartIndex", c_int), #查看的起始名次索引, 默认0
|
| | | ("WatchCnt", c_ubyte), #查看条数,默认20,最大不超过100
|
| | | ("IsWatchSelf", c_ubyte), #是否查看自己名次前后,默认10条数据
|
| | | ("WatchID", c_int), #查看指定ID名次前后,如玩家ID、家族ID等
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | |
| | | self.Type = 0
|
| | | self.StartIndex = 0
|
| | | self.WatchCnt = 0
|
| | | self.IsWatchSelf = 0
|
| | | self.WatchID = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | |
| | | Type:%d,
|
| | | StartIndex:%d,
|
| | | WatchCnt:%d,
|
| | | IsWatchSelf:%d
|
| | | WatchID:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | |
| | | self.Type,
|
| | | self.StartIndex,
|
| | | self.WatchCnt,
|
| | | self.IsWatchSelf
|
| | | self.WatchID
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
| | | ("GroupValue2", c_ubyte), # 分组值2,与分组值1组合归为同组榜单数据
|
| | | ("StartIndex", c_int), #查看的起始名次索引, 默认0
|
| | | ("WatchCnt", c_ubyte), #查看条数,默认20,最大不超过100
|
| | | ("IsWatchSelf", c_ubyte), #是否查看自己名次前后,默认10条数据
|
| | | ("WatchID", c_int), #查看指定ID名次前后,如玩家ID、家族ID等
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | |
| | | self.GroupValue2 = 0
|
| | | self.StartIndex = 0
|
| | | self.WatchCnt = 0
|
| | | self.IsWatchSelf = 0
|
| | | self.WatchID = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | |
| | | GroupValue2:%d,
|
| | | StartIndex:%d,
|
| | | WatchCnt:%d,
|
| | | IsWatchSelf:%d
|
| | | WatchID:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | |
| | | self.GroupValue2,
|
| | | self.StartIndex,
|
| | | self.WatchCnt,
|
| | | self.IsWatchSelf
|
| | | self.WatchID
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
| | |
|
| | | class tagPYBillboardData(Structure):
|
| | | Head = tagHead()
|
| | | IsWatchSelf = 0 #(BYTE IsWatchSelf)
|
| | | WatchID = 0 #(DWORD WatchID)//查看指定ID名次前后,如玩家ID、家族ID等
|
| | | BillboardCount = 0 #(BYTE BillboardCount)
|
| | | Type = 0 #(BYTE Type)//排行榜类型
|
| | | Billboard = list() #(vector<tagPYBillboardInfo> Billboard)//size = BillboardCount
|
| | |
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.IsWatchSelf,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.WatchID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.BillboardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.Type,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | for i in range(self.BillboardCount):
|
| | |
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xA9
|
| | | self.Head.SubCmd = 0xA2
|
| | | self.IsWatchSelf = 0
|
| | | self.WatchID = 0
|
| | | self.BillboardCount = 0
|
| | | self.Type = 0
|
| | | self.Billboard = list()
|
| | |
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 1
|
| | | length += 4
|
| | | length += 1
|
| | | length += 1
|
| | | for i in range(self.BillboardCount):
|
| | |
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteBYTE(data, self.IsWatchSelf)
|
| | | data = CommFunc.WriteDWORD(data, self.WatchID)
|
| | | data = CommFunc.WriteBYTE(data, self.BillboardCount)
|
| | | data = CommFunc.WriteBYTE(data, self.Type)
|
| | | for i in range(self.BillboardCount):
|
| | |
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | IsWatchSelf:%d,
|
| | | WatchID:%d,
|
| | | BillboardCount:%d,
|
| | | Type:%d,
|
| | | Billboard:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.IsWatchSelf,
|
| | | self.WatchID,
|
| | | self.BillboardCount,
|
| | | self.Type,
|
| | | "..."
|
| | |
| | | Type = 0 #(BYTE Type)//榜单类型
|
| | | GroupValue1 = 0 #(BYTE GroupValue1)// 分组值1
|
| | | GroupValue2 = 0 #(BYTE GroupValue2)// 分组值2,与分组值1组合归为同组榜单数据
|
| | | IsWatchSelf = 0 #(BYTE IsWatchSelf)
|
| | | WatchID = 0 #(DWORD WatchID)//查看指定ID名次前后,如玩家ID、家族ID等
|
| | | 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.WatchID,_pos = CommFunc.ReadDWORD(_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.WatchID = 0
|
| | | self.BillboardCount = 0
|
| | | self.CrossBillboardDataList = list()
|
| | | return
|
| | |
| | | length += 1
|
| | | length += 1
|
| | | length += 1
|
| | | length += 1
|
| | | length += 4
|
| | | length += 1
|
| | | for i in range(self.BillboardCount):
|
| | | length += self.CrossBillboardDataList[i].GetLength()
|
| | |
| | | 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.WriteDWORD(data, self.WatchID)
|
| | | 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,
|
| | | WatchID:%d,
|
| | | BillboardCount:%d,
|
| | | CrossBillboardDataList:%s
|
| | | '''\
|
| | |
| | | self.Type,
|
| | | self.GroupValue1,
|
| | | self.GroupValue2,
|
| | | self.IsWatchSelf,
|
| | | self.WatchID,
|
| | | self.BillboardCount,
|
| | | "..."
|
| | | )
|
| | |
| | | # BYTE GroupValue2; // 分组值2,与分组值1组合归为同组榜单数据
|
| | | # DWORD StartIndex; //查看的起始名次索引, 默认0
|
| | | # BYTE WatchCnt; //查看条数,默认20,最大不超过100
|
| | | # BYTE IsWatchSelf; //是否查看自己名次前后,默认10条数据
|
| | | # DWORD WatchID; //查看指定ID名次前后,如玩家ID、家族ID等
|
| | | #};
|
| | | def OnViewCrossBillboard(index, clientData, tick):
|
| | | curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
| | |
| | | billboardType, groupValue1, groupValue2 = clientData.Type, clientData.GroupValue1, clientData.GroupValue2
|
| | | startIndex = clientData.StartIndex
|
| | | watchCnt = clientData.WatchCnt
|
| | | isWatchSelf = clientData.IsWatchSelf
|
| | | watchID = clientData.WatchID
|
| | |
|
| | | if billboardType not in ShareDefine.CrossBillboardTypeList:
|
| | | return
|
| | |
| | |
|
| | | # 请求查询跨服服务器
|
| | | dataMsg = {"BillboardType":billboardType, "GroupValue1":groupValue1, "GroupValue2":groupValue2,
|
| | | "QueryData":{"EventName":"View", "PlayerID":playerID, "StartIndex":startIndex, "WatchCnt":watchCnt, "IsWatchSelf":isWatchSelf}}
|
| | | "QueryData":{"EventName":"View", "PlayerID":playerID, "StartIndex":startIndex, "WatchCnt":watchCnt, "WatchID":watchID}}
|
| | | CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_QueryBillboard, dataMsg)
|
| | | return
|
| | |
|
| | |
| | |
|
| | | # 有查询数据时才同步榜单数据列表,否则只同步数据版本号
|
| | | if queryData:
|
| | | playerID = queryData.get("PlayerID", 0)
|
| | | #playerID = queryData.get("PlayerID", 0)
|
| | | startIndex = queryData.get("StartIndex", 0)
|
| | | watchCnt = queryData.get("WatchCnt", 0)
|
| | | isWatchSelf = queryData.get("IsWatchSelf", 0)
|
| | | watchID = queryData.get("WatchID", 0)
|
| | |
|
| | | count = billboardObj.GetCount()
|
| | | endIndex = 0
|
| | | # 查看自己前后名次
|
| | | if isWatchSelf:
|
| | | playerIndex = billboardObj.IndexOfByID(playerID)
|
| | | if watchID:
|
| | | playerIndex = billboardObj.IndexOfByID(watchID)
|
| | | if playerIndex != -1:
|
| | | # 前5后4,首尾补足10条记录
|
| | | endIndex = min(playerIndex + 5, count)
|
| | |
| | | return
|
| | |
|
| | | if eventName == "View":
|
| | | isWatchSelf = queryData.get("IsWatchSelf", 0)
|
| | | SyncCrossBillboardToPlayer(queryPlayer, billboardType, groupValue1, groupValue2, syncBillboardList, isWatchSelf)
|
| | | watchID = queryData.get("WatchID", 0)
|
| | | SyncCrossBillboardToPlayer(queryPlayer, billboardType, groupValue1, groupValue2, syncBillboardList, watchID)
|
| | | #else:
|
| | | # idOrderDict = billboardObj.GetIDOrderDict()
|
| | | # order = idOrderDict.get(queryPlayerID, 0)
|
| | |
| | |
|
| | | return
|
| | |
|
| | | def SyncCrossBillboardToPlayer(curPlayer, billboardType, groupValue1, groupValue2, billboardList, isWatchSelf):
|
| | | def SyncCrossBillboardToPlayer(curPlayer, billboardType, groupValue1, groupValue2, billboardList, watchID):
|
| | | ## 同步给玩家跨服榜单
|
| | | billboardInfo = ChPyNetSendPack.tagGCCrossBillboardInfo()
|
| | | billboardInfo.Type = billboardType
|
| | | billboardInfo.GroupValue1 = groupValue1
|
| | | billboardInfo.GroupValue2 = groupValue2
|
| | | billboardInfo.IsWatchSelf = isWatchSelf
|
| | | billboardInfo.WatchID = watchID
|
| | | billboardInfo.CrossBillboardDataList = []
|
| | | for dataInfo in billboardList:
|
| | | index, ID, ID2, Name1, Name2, Type2, Value1, Value2, CmpValue, CmpValue2, CmpValue3, Value3, Value4, Value5, Value6, Value7, Value8, UserData = dataInfo
|
| | |
| | | # BYTE Type; //类型 TBillboardType
|
| | | # DWORD StartIndex; //查看的起始名次索引, 默认0
|
| | | # BYTE WatchCnt; //查看条数,默认20,最大不超过100
|
| | | # BYTE IsWatchSelf; //是否查看自己名次前后,默认10条数据
|
| | | # DWORD WatchID; //查看指定ID名次前后,如玩家ID、家族ID等
|
| | | #};
|
| | | def Client_PYWatchBillboard(index, clientData, tick):
|
| | |
|
| | |
| | | packType = clientData.Type
|
| | | startIndex = clientData.StartIndex
|
| | | watchCnt = clientData.WatchCnt
|
| | | isWatchSelf = clientData.IsWatchSelf
|
| | | if not __CheckWatchCD(curPlayer, packType, tick):
|
| | | return
|
| | | watchID = clientData.WatchID
|
| | | #if not __CheckWatchCD(curPlayer, packType, tick):
|
| | | # return
|
| | |
|
| | | Sync_BillboardEx(curPlayer, packType, isWatchSelf, startIndex, watchCnt)
|
| | | Sync_BillboardEx(curPlayer, packType, watchID, startIndex, watchCnt)
|
| | | return
|
| | |
|
| | | def Sync_BillboardEx(curPlayer, bbType, isWatchSelf=False, startIndex=0, watchCnt=20):
|
| | | def Sync_BillboardEx(curPlayer, bbType, watchID=0, startIndex=0, watchCnt=20):
|
| | | if bbType < 0 or bbType >= ShareDefine.Def_BT_Max:
|
| | | return
|
| | |
|
| | |
| | | GameWorld.ErrLog("找不到排行榜数据!bbType=%s" % (bbType))
|
| | | return
|
| | |
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | #playerID = curPlayer.GetPlayerID()
|
| | | count = billBoard.GetCount()
|
| | | endIndex = 0
|
| | | # 查看自己前后名次
|
| | | if isWatchSelf:
|
| | | playerIndex = billBoard.IndexOfByID(playerID)
|
| | | if watchID:
|
| | | playerIndex = billBoard.IndexOfByID(watchID)
|
| | | if playerIndex != -1:
|
| | | # 前5后4,首尾补足10条记录
|
| | | endIndex = min(playerIndex + 5, count)
|
| | |
| | |
|
| | | billBoardData = ChPyNetSendPack.tagPYBillboardData()
|
| | | billBoardData.Clear()
|
| | | billBoardData.IsWatchSelf = isWatchSelf
|
| | | billBoardData.WatchID = watchID
|
| | | billBoardData.Type = bbType
|
| | | billBoardData.Billboard = []
|
| | | for index in xrange(startIndex, endIndex):
|
| | |
| | | ("Type", c_ubyte), #类型 TBillboardType
|
| | | ("StartIndex", c_int), #查看的起始名次索引, 默认0
|
| | | ("WatchCnt", c_ubyte), #查看条数,默认20,最大不超过100
|
| | | ("IsWatchSelf", c_ubyte), #是否查看自己名次前后,默认10条数据
|
| | | ("WatchID", c_int), #查看指定ID名次前后,如玩家ID、家族ID等
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | |
| | | self.Type = 0
|
| | | self.StartIndex = 0
|
| | | self.WatchCnt = 0
|
| | | self.IsWatchSelf = 0
|
| | | self.WatchID = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | |
| | | Type:%d,
|
| | | StartIndex:%d,
|
| | | WatchCnt:%d,
|
| | | IsWatchSelf:%d
|
| | | WatchID:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | |
| | | self.Type,
|
| | | self.StartIndex,
|
| | | self.WatchCnt,
|
| | | self.IsWatchSelf
|
| | | self.WatchID
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
| | | ("GroupValue2", c_ubyte), # 分组值2,与分组值1组合归为同组榜单数据
|
| | | ("StartIndex", c_int), #查看的起始名次索引, 默认0
|
| | | ("WatchCnt", c_ubyte), #查看条数,默认20,最大不超过100
|
| | | ("IsWatchSelf", c_ubyte), #是否查看自己名次前后,默认10条数据
|
| | | ("WatchID", c_int), #查看指定ID名次前后,如玩家ID、家族ID等
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | |
| | | self.GroupValue2 = 0
|
| | | self.StartIndex = 0
|
| | | self.WatchCnt = 0
|
| | | self.IsWatchSelf = 0
|
| | | self.WatchID = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | |
| | | GroupValue2:%d,
|
| | | StartIndex:%d,
|
| | | WatchCnt:%d,
|
| | | IsWatchSelf:%d
|
| | | WatchID:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | |
| | | self.GroupValue2,
|
| | | self.StartIndex,
|
| | | self.WatchCnt,
|
| | | self.IsWatchSelf
|
| | | self.WatchID
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
| | |
|
| | | class tagPYBillboardData(Structure):
|
| | | Head = tagHead()
|
| | | IsWatchSelf = 0 #(BYTE IsWatchSelf)
|
| | | WatchID = 0 #(DWORD WatchID)//查看指定ID名次前后,如玩家ID、家族ID等
|
| | | BillboardCount = 0 #(BYTE BillboardCount)
|
| | | Type = 0 #(BYTE Type)//排行榜类型
|
| | | Billboard = list() #(vector<tagPYBillboardInfo> Billboard)//size = BillboardCount
|
| | |
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.IsWatchSelf,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.WatchID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.BillboardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.Type,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | for i in range(self.BillboardCount):
|
| | |
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xA9
|
| | | self.Head.SubCmd = 0xA2
|
| | | self.IsWatchSelf = 0
|
| | | self.WatchID = 0
|
| | | self.BillboardCount = 0
|
| | | self.Type = 0
|
| | | self.Billboard = list()
|
| | |
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 1
|
| | | length += 4
|
| | | length += 1
|
| | | length += 1
|
| | | for i in range(self.BillboardCount):
|
| | |
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteBYTE(data, self.IsWatchSelf)
|
| | | data = CommFunc.WriteDWORD(data, self.WatchID)
|
| | | data = CommFunc.WriteBYTE(data, self.BillboardCount)
|
| | | data = CommFunc.WriteBYTE(data, self.Type)
|
| | | for i in range(self.BillboardCount):
|
| | |
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | IsWatchSelf:%d,
|
| | | WatchID:%d,
|
| | | BillboardCount:%d,
|
| | | Type:%d,
|
| | | Billboard:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.IsWatchSelf,
|
| | | self.WatchID,
|
| | | self.BillboardCount,
|
| | | self.Type,
|
| | | "..."
|
| | |
| | | Type = 0 #(BYTE Type)//榜单类型
|
| | | GroupValue1 = 0 #(BYTE GroupValue1)// 分组值1
|
| | | GroupValue2 = 0 #(BYTE GroupValue2)// 分组值2,与分组值1组合归为同组榜单数据
|
| | | IsWatchSelf = 0 #(BYTE IsWatchSelf)
|
| | | WatchID = 0 #(DWORD WatchID)//查看指定ID名次前后,如玩家ID、家族ID等
|
| | | 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.WatchID,_pos = CommFunc.ReadDWORD(_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.WatchID = 0
|
| | | self.BillboardCount = 0
|
| | | self.CrossBillboardDataList = list()
|
| | | return
|
| | |
| | | length += 1
|
| | | length += 1
|
| | | length += 1
|
| | | length += 1
|
| | | length += 4
|
| | | length += 1
|
| | | for i in range(self.BillboardCount):
|
| | | length += self.CrossBillboardDataList[i].GetLength()
|
| | |
| | | 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.WriteDWORD(data, self.WatchID)
|
| | | 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,
|
| | | WatchID:%d,
|
| | | BillboardCount:%d,
|
| | | CrossBillboardDataList:%s
|
| | | '''\
|
| | |
| | | self.Type,
|
| | | self.GroupValue1,
|
| | | self.GroupValue2,
|
| | | self.IsWatchSelf,
|
| | | self.WatchID,
|
| | | self.BillboardCount,
|
| | | "..."
|
| | | )
|