hxp
4 天以前 4e3d1ff7e0b98fc18b0b6e63e449f3d7577c0ba6
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBillboard.py
@@ -9,32 +9,49 @@
# @date 2018-03-06
# @version 1.0
#
# 详细描述: 排行榜
# 详细描述: 排行榜,本服、跨服通用
#
#-------------------------------------------------------------------------------
#"""Version = 2018-03-06 11:00"""
#-------------------------------------------------------------------------------
import ShareDefine
import GameWorld
import ChConfig
import ShareDefine
import PlayerControl
import OpenServerCampaign
import CrossRealmPlayer
import GameFuncComm
import EventReport
import ChPyNetSendPack
import NetPackCommon
import IpyGameDataPY
import DBDataMgr
def DoBillboardOpen(curPlayer):
    ## 排行榜开启时需要处理的
    UpdatePlayerBillboardOnLeaveServer(curPlayer, True) # 主动同步一次榜单
    OpenServerCampaign.DoBillboardOpen(curPlayer) # 同步开服活动榜单
import time
def OnDay():
    drBillboardTypeList = []
    if GameWorld.IsCrossServer():
        drBillboardTypeList = ShareDefine.CrossBillboardTypeList
    else:
        drBillboardTypeList = IpyGameDataPY.GetFuncEvalCfg("BillboardSet", 1)
    billboardMgr = DBDataMgr.GetBillboardMgr()
    for billboardType in drBillboardTypeList:
        if billboardType in []:
            continue
        groupList = billboardMgr.GetBillboardGroupList(billboardType)
        for billboardType, groupValue1, groupValue2 in groupList:
            billboardObj = billboardMgr.GetBillboard(billboardType, groupValue1, groupValue2)
            billboardObj.SaveDRData("OnDay")
    return
def BillboardOnLogin(curPlayer):
    # 上线默认同步排行榜
    UpdatePlayerBillboardOnLeaveServer(curPlayer) #排行榜已实时更新,故上线不再同步
    return
def GetBillboardOperateInfo(curPlayer):
    # 排行榜中所保存的运营商相关信息
    platform = curPlayer.GetAccID()
    if platform in ["tencent"]:
        return curPlayer.GetOperateInfo()
    return platform
def GetBillboardJob(curPlayer): return curPlayer.GetJob()
@@ -44,279 +61,330 @@
    if GameWorld.IsCrossServer():
        # 跨服服务器不用更新本服榜
        return
    #UpdateTotalRechargeBillboard(curPlayer)
    
    UpdatePlayerLVBillboard(curPlayer) # 等级榜
    UpdatePlayerFPTotalBillboard(curPlayer, True) # 战斗力榜
    UpdateHorseBillboard(curPlayer, True, False) # 坐骑榜
    UpdatePyPetBillboard(curPlayer, True, False) # 灵宠榜
    UpdateRealmBillboard(curPlayer) # 境界榜
    if isAll:
        UpdateRuneTowerBillboard(curPlayer)
        #UpdateTJGBillboard(curPlayer, minuteExp) 脱机效率可不更新
    EventReport.WriteEvent_FightPower(curPlayer)
    return
def __CanPlayerBillboardComm(curPlayer):
    ## 玩家可否上榜通用检查
    if not GameWorld.IsNormalPlayer(curPlayer):
        return False
    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Billboard):
        GameWorld.DebugLog("排行榜未开启,无法上榜!curLV=%s" % (curPlayer.GetLV()), curPlayer.GetPlayerID())
        return False
def UpdatePlayerBillboardName(curPlayer):
    ## 更新排行榜中的玩家名字记录
    
    return True
    playerID = curPlayer.GetPlayerID()
    updName = curPlayer.GetPlayerName()
    billboardMgr = DBDataMgr.GetBillboardMgr()
    for billboardType in ShareDefine.BillboardTypeList:
        if billboardType in ShareDefine.FamilyBillboardList:
            continue
        groupList = billboardMgr.GetBillboardGroupList(billboardType)
        for billboardType, groupValue1, groupValue2 in groupList:
            billboardObj = billboardMgr.GetBillboard(billboardType, groupValue1, groupValue2)
            billData = billboardObj.FindByID(playerID)
            if not billData:
                continue
            billData.SetName1(updName)
    # 跨服榜更新, 待处理
    return
def UpdatePlayerBillboard(curPlayer, bType, cmpValue, cmpValue2=0, cmpValue3=0, value1=0, value2=0, exInfo=[], autoSort=False, **kwargs):
def UpdatePlayerFPTotalBillboard(curPlayer, isForceUpdate=False, isCheckRule=True):
    ##更新玩家总战斗力
    return
def UpdatePyPetBillboard(curPlayer, isForceUpdate=False, isUpdateTotal=True):
    ## 更新宠物排行榜
    return
def UpdateRealmBillboard(curPlayer):
    ##境界榜
    return
#def __CanPlayerBillboardComm(curPlayer):
#    ## 玩家可否上榜通用检查
#    if not GameWorld.IsNormalPlayer(curPlayer):
#        return False
#    #if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Billboard):
#    #    GameWorld.DebugLog("排行榜未开启,无法上榜!curLV=%s" % (curPlayer.GetLV()), curPlayer.GetPlayerID())
#    #    return False
#
#    return True
def UpdatePlayerBillboard(curPlayer, bType, cmpValue, cmpValue2=0, cmpValue3=0, autoSort=False, **kwargs):
    ## 更新玩家排行榜
    
    #if not cmpValue and not cmpValue2 and not cmpValue3:
    #    return
    
    if not __CanPlayerBillboardComm(curPlayer):
        return
    playerJob = GetBillboardJob(curPlayer)
    playerID = curPlayer.GetID()
    playerName = curPlayer.GetName()
    playerName = curPlayer.GetPlayerName()
    playerOpInfo = GetBillboardOperateInfo(curPlayer)
    value1 = curPlayer.GetOfficialRank()
    value2 = PlayerControl.GetTitleID(curPlayer)
    kwargs["value3"] = curPlayer.GetFace()
    kwargs["value4"] = curPlayer.GetFacePic()
    if bType in ShareDefine.BTValue1_OfficialRankList:
        value1 = curPlayer.GetOfficialRank()
    GameServer_UpdateBillboard(bType, playerJob, playerID, playerName, playerOpInfo,
                               value1, value2, cmpValue, cmpValue2, cmpValue3, 0, exInfo, autoSort, **kwargs)
    kwargs["value5"] = curPlayer.GetModelMark()
    kwargs["value6"] = curPlayer.GetEquipShowSwitch()
    groupValue1 = 0
    UpdateBillboard(bType, groupValue1, playerID, playerName, playerOpInfo, playerJob, value1, value2,
                    cmpValue, cmpValue2, cmpValue3, autoSort=autoSort, **kwargs)
    return
def GameServer_UpdateBillboard(bType, bType2, bID, bName, bName2, value1, value2, cmpValue, cmpValue2=0, cmpValue3=0, bID2=0, exInfo=[], autoSort=False, **kwargs):
    bData = {"Type":bType, "Type2":bType2, "ID":bID, "ID2":bID2, "Name1":bName, "Name2":bName2, "ExInfo":exInfo,
             "Value1":value1, "Value2":value2, "CmpValue":cmpValue, "CmpValue2":cmpValue2, "CmpValue3":cmpValue3, "autoSort":autoSort}
    if "value3" in kwargs:
        bData["Value3"] = kwargs["value3"]
    if "value4" in kwargs:
        bData["Value4"] = kwargs["value4"]
    if "value5" in kwargs:
        bData["Value5"] = kwargs["value5"]
    if "value6" in kwargs:
        bData["Value6"] = kwargs["value6"]
    if "value7" in kwargs:
        bData["Value7"] = kwargs["value7"]
    if "value8" in kwargs:
        bData["Value8"] = kwargs["value8"]
    if "userData" in kwargs:
        bData["UserData"] = kwargs["userData"]
    sendMsg = "%s" % (bData)
    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "UpdateBillboard", sendMsg, len(sendMsg))
    GameWorld.DebugLog("同步GameServer排行榜:bType=%s,cmpValue=%s,cmpValue2=%s %s" % (bType, cmpValue, cmpValue2, sendMsg), bID)
    return
def UpdatePlayerCrossBillboard(curPlayer, bType, groupValue1, cmpValue, cmpValue2=0, cmpValue3=0, value1=0, value2=0,
                               groupValue2=0, **kwargs):
    ## 更新玩家跨服排行榜
    #if not cmpValue and not cmpValue2 and not cmpValue3:
    #    return
    #if not __CanPlayerBillboardComm(curPlayer):
    #    return
    playerJob = GetBillboardJob(curPlayer)
    playerID = curPlayer.GetID()
    playerName = CrossRealmPlayer.GetCrossPlayerName(curPlayer)
    playerOpInfo = GetBillboardOperateInfo(curPlayer)
    kwargs["value3"] = curPlayer.GetFace()
    kwargs["value4"] = curPlayer.GetFacePic()
    if bType in ShareDefine.BTValue1_OfficialRankList:
        value1 = curPlayer.GetOfficialRank()
    id2 = 0
    GameServer_UpdateCrossBillboard(bType, groupValue1, playerID, playerName, playerOpInfo, playerJob, value1, value2,
                                    cmpValue, cmpValue2, cmpValue3, groupValue2, id2, **kwargs)
    return
def GameServer_UpdateCrossBillboard(bType, groupValue1, dataID, name1, name2, type2, value1, value2, cmpValue,
                                    cmpValue2=0, cmpValue3=0, groupValue2=0, id2=0, **kwargs):
    bData = {"Type":bType, "GroupValue1":groupValue1, "Type2":type2, "ID":dataID, "ID2":id2, "Name1":name1, "Name2":name2,
             "Value1":value1, "Value2":value2, "CmpValue":cmpValue, "CmpValue2":cmpValue2, "CmpValue3":cmpValue3, "GroupValue2":groupValue2}
    if "value3" in kwargs:
        bData["Value3"] = kwargs["value3"]
    if "value4" in kwargs:
        bData["Value4"] = kwargs["value4"]
    if "value5" in kwargs:
        bData["Value5"] = kwargs["value5"]
    if "value6" in kwargs:
        bData["Value6"] = kwargs["value6"]
    if "value7" in kwargs:
        bData["Value7"] = kwargs["value7"]
    if "value8" in kwargs:
        bData["Value8"] = kwargs["value8"]
    if "userData" in kwargs:
        bData["UserData"] = kwargs["userData"]
    sendMsg = "%s" % (bData)
    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "UpdateCrossBillboard", sendMsg, len(sendMsg))
    GameWorld.DebugLog("同步GameServer跨服排行榜:bType=%s,groupValue1=%s,groupValue2=%s,cmpValue=%s, %s"
                       % (bType, groupValue1, groupValue2, cmpValue, sendMsg), dataID)
    return
def UpdatePlayerFPTotalBillboard(curPlayer, isForceUpdate=False, isCheckRule=True):
    ##更新玩家总战斗力
    playerFightPower = PlayerControl.GetFightPower(curPlayer)
    if not __CheckFightPowerCanUpdate(curPlayer, ChConfig.Def_PDict_FightPower_Total, playerFightPower,
                                      isForceUpdate, isCheckRule, ChConfig.Def_PDict_FightPower_TotalEx):
        return
    fightPower = playerFightPower % ChConfig.Def_PerPointValue
    fightPowerEx = playerFightPower / ChConfig.Def_PerPointValue
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FightPower_Total, fightPower,
                                       ChConfig.Def_PDictType_FightPower)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FightPower_TotalEx, fightPowerEx,
                                       ChConfig.Def_PDictType_FightPower)
    familyID = curPlayer.GetFamilyID()
    GameWorld.DebugLog("更新总战斗力:playerFightPower=%s" % (playerFightPower), curPlayer.GetPlayerID())
    UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_FightPower, fightPowerEx, fightPower, exInfo=[familyID])
    #EventReport.WriteEvent_FightPower(curPlayer)
    return
def __CheckFightPowerCanUpdate(curPlayer, key, fightPower, isForceUpdate=False, isCheckRule=True, key2=None):
    ''' 检查玩家可否更新战斗力
    @param curPlayer 玩家实例
    @param key 战斗力类型对应key
    @param fightPower 当前战斗力
    @param isForceUpdate 是否强制更新(若设置强制更新,在某些潜规则下也不一定能强制更新,如GM等)
    @param isCheckRule 是否检查战力范围更新差值
    @return True-可更新
    '''
    if fightPower <= 0:
        return False
    historyFightPower = curPlayer.NomalDictGetProperty(key, 0, ChConfig.Def_PDictType_FightPower)
    if key2 != None:
        historyFightPower += curPlayer.NomalDictGetProperty(key2, 0, ChConfig.Def_PDictType_FightPower) * ChConfig.Def_PerPointValue
def UpdateBillboardByID(dataID, billboardType, cmpValue, cmpValue2=0, cmpValue3=0, autoSort=False):
    ## 直接根据榜单ID修改榜单排行相关值,其他值不修改
    if GameWorld.IsCrossServer():
        if billboardType not in ShareDefine.CrossBillboardTypeList:
            return
    else:
        if billboardType not in ShareDefine.BillboardTypeList:
            return
        
    if not __CanPlayerBillboardComm(curPlayer):
        return False
    if not dataID:
        return
    
    if isForceUpdate:
        GameWorld.DebugLog("战斗力更新检查:强制更新 key=%s,fightPower=%s,history=%s"
                           % (key, fightPower, historyFightPower), curPlayer.GetPlayerID())
        return True
    groupValue1, groupValue2 = 0, 0
    billboardMgr = DBDataMgr.GetBillboardMgr()
    billboardObj = billboardMgr.GetBillboard(billboardType, groupValue1, groupValue2)
    billboardData = billboardObj.FindByID(dataID)
    if not billboardData:
        return
    
    if fightPower == historyFightPower:
        GameWorld.DebugLog("战斗力更新检查:与上次相同,默认不更新 key=%s,fightPower=%s,history=%s"
                           % (key, fightPower, historyFightPower), curPlayer.GetPlayerID())
        return False
    isNewData = False
    cmpValueChange = isNewData or billboardData.GetCmpValue() != cmpValue or billboardData.GetCmpValue2() != cmpValue2 \
        or (cmpValue3 and billboardData.GetCmpValue3() != cmpValue3)
    billboardData.SetCmpValue(cmpValue)
    billboardData.SetCmpValue2(cmpValue2)
    billboardData.SetCmpValue3(cmpValue3)
    if cmpValueChange or not billboardData.GetTime():
        billboardData.SetTime(int(time.time()))
    GameWorld.DebugLog("更新排行榜值: billboardType=%s,groupValue1=%s,groupValue2=%s,dataID=%s,cmpValueChange=%s,cmpValue=%s,cmpValue2=%s,cmpValue3=%s"
                       % (billboardType, groupValue1, groupValue2, dataID, cmpValueChange,
                          cmpValue, cmpValue2, cmpValue3), dataID)
    if not autoSort:
        if isNewData or cmpValueChange:
            billboardObj.SetSortDelay()
    else:
        billboardObj.SortData()
    return True
def UpdateHorseBillboard(curPlayer, isForceUpdate=False, isUpdateTotal=True):
    ##更新玩家坐骑排行榜
    HorseFightPower = PlayerControl.GetMFPFightPower(curPlayer, ShareDefine.Def_MFPType_Horse)
    if not HorseFightPower:
def UpdateBillboard(billboardType, groupValue1, dataID, name1, name2, type2, value1, value2, cmpValue,
                    cmpValue2=0, cmpValue3=0, groupValue2=0, id2=0, autoSort=True, **kwargs):
    ''' 更新排行榜
    @param billboardType: 排行榜索引类型,同个榜单类型可以有多个分组榜单数据,独立排序
    @param groupValue1: 榜单分组1
    @param dataID: 榜单唯一数据ID,如玩家ID等
    @param name1: 显示名称1,不影响排序
    @param name2: 显示名称2,不影响排序
    @param type2: 榜单数据类型2,自定义,一般为职业等二级分类,不影响排序
    @param value1: 显示值1,不影响排序
    @param value2: 显示值2,不影响排序
    @param cmpValue: 比较值1
    @param cmpValue2: 比较值2
    @param cmpValue3: 比较值3,没设定的话默认为时间戳比较值
    @param groupValue1: 榜单分组2
    @param id2: 扩展数据ID2
    @param autoSort: 是否排序,默认True
    @return: 是否上榜更新榜单
    '''
    if GameWorld.IsCrossServer():
        if billboardType not in ShareDefine.CrossBillboardTypeList:
            return
    else:
        if billboardType not in ShareDefine.BillboardTypeList:
            return
    if not dataID:
        return
    
    fightPower = HorseFightPower % ChConfig.Def_PerPointValue
    fightPowerEx = HorseFightPower / ChConfig.Def_PerPointValue
    UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_FightPower_Horse, fightPowerEx, fightPower)
    if isUpdateTotal:
        UpdatePlayerFPTotalBillboard(curPlayer, isForceUpdate)
    return
    billboardMgr = DBDataMgr.GetBillboardMgr()
    billboardObj = billboardMgr.GetBillboard(billboardType, groupValue1, groupValue2)
    billboardData = billboardObj.FindByID(dataID)
    isNewData = False
    if not billboardData:
        isNewData = True
        if billboardObj.IsFull():
            # 与最后一名对比
            lastBillBoardData = __CmpLastBillboardData(cmpValue, cmpValue2, cmpValue3, billboardObj)
            if not lastBillBoardData:
                GameWorld.DebugLog("    榜单值不超过最后一名,不上榜! ")
                return
            billboardData = lastBillBoardData
            billboardData.Clear()
        else:
            billboardData = billboardObj.AddNewBillboardData(dataID)
            if not billboardData:
                return
    cmpValueChange = isNewData or billboardData.GetCmpValue() != cmpValue or billboardData.GetCmpValue2() != cmpValue2 \
        or (cmpValue3 and billboardData.GetCmpValue3() != cmpValue3)
    # 更新所有值
    billboardData.SetType(billboardType)
    billboardData.SetGroupValue1(groupValue1)
    billboardData.SetGroupValue2(groupValue2)
    billboardData.SetID(dataID)
    billboardData.SetID2(id2)
    billboardData.SetName1(name1)
    billboardData.SetName2(name2)
    billboardData.SetType2(type2)
    billboardData.SetValue1(value1)
    billboardData.SetValue2(value2)
    billboardData.SetValue3(kwargs.get("value3", 0))
    billboardData.SetValue4(kwargs.get("value4", 0))
    billboardData.SetValue5(kwargs.get("value5", 0))
    billboardData.SetValue6(kwargs.get("value6", 0))
    billboardData.SetValue7(kwargs.get("value7", 0))
    billboardData.SetValue8(kwargs.get("value8", 0))
    billboardData.SetUserData(kwargs.get("userData", ""))
    billboardData.SetCmpValue(cmpValue)
    billboardData.SetCmpValue2(cmpValue2)
    billboardData.SetCmpValue3(cmpValue3)
    if cmpValueChange or not billboardData.GetTime():
        billboardData.SetTime(int(time.time()))
    GameWorld.DebugLog("更新排行榜值: billboardType=%s,groupValue1=%s,groupValue2=%s,dataID=%s,isNewData=%s,cmpValueChange=%s,type2=%s,value1=%s,value2=%s,cmpValue=%s,cmpValue2=%s,cmpValue3=%s,%s"
                       % (billboardType, groupValue1, groupValue2, dataID, isNewData, cmpValueChange,
                          type2, value1, value2, cmpValue, cmpValue2, cmpValue3, kwargs), dataID)
    if not autoSort:
        if isNewData or cmpValueChange:
            billboardObj.SetSortDelay()
    else:
        billboardObj.SortData()
    return True
def UpdatePyPetBillboard(curPlayer, isForceUpdate=False, isUpdateTotal=True):
    ## 更新宠物排行榜
    petMaxAtk = PlayerControl.GetPetMaxAtk(curPlayer)
    if not petMaxAtk:
def __CmpLastBillboardData(cmpValue, cmpValue2, cmpValue3, billboardObj):
    ## 比较是否超过最后一名
    # @return: 超过则返回最后一名数据实例,否则返回None
    if not billboardObj.GetCount():
        return
    UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_FightPower_Pet, petMaxAtk)
    if isUpdateTotal:
        UpdatePlayerFPTotalBillboard(curPlayer, isForceUpdate)
    return
def UpdatePlayerLVBillboard(curPlayer, isForceUpdate=True):
    ##更新玩家等级排行榜
    UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_LV, curPlayer.GetLV())
    return
def UpdateRuneTowerBillboard(curPlayer):
    ##更新玩家符印塔排行榜
    passLV = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_TrialTower_PassLV)
    if not passLV:
    lastBillBoardData = billboardObj.At(billboardObj.GetCount() - 1)
    if cmpValue < lastBillBoardData.GetCmpValue():
        #无法上榜
        return
    UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_TrialTower, passLV)
    elif cmpValue == lastBillBoardData.GetCmpValue():
        if cmpValue2 < lastBillBoardData.GetCmpValue2():
            return
        elif cmpValue2 == lastBillBoardData.GetCmpValue2():
            if cmpValue3 <= lastBillBoardData.GetCmpValue3():
                return
    return lastBillBoardData
def UpdatePlayerCrossBillboard(curPlayer, bType, groupValue1, cmpValue, cmpValue2=0, cmpValue3=0, value1=0, value2=0,
                               groupValue2=0, **kwargs):
    ## 在本服直接更新玩家跨服排行榜,发送到跨服,之后扩展
    return
def UpdateTJGBillboard(curPlayer, minuteExp):
    ##脱机效率榜
    if not minuteExp:
#// A1 30 查看榜单 #tagCMViewBillboard
#
#struct    tagCMViewBillboard
#{
#    tagHead        Head;
#    BYTE        Type;        //榜单类型
#    DWORD        GroupValue1;    //分组值1
#    DWORD        GroupValue2;    //分组值2,与分组值1组合归为同组榜单数据
#    WORD        StartIndex;    //查看的起始名次索引, 默认0
#    BYTE        ViewCnt;        //查看条数,默认20,单次最大不超过100
#    DWORD        ViewID;        //附带查看指定ID所在名次前后数据,如玩家ID、家族ID等
#};
def OnViewBillboard(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    billboardType, groupValue1, groupValue2 = clientData.Type, clientData.GroupValue1, clientData.GroupValue2
    startIndex = clientData.StartIndex
    viewCnt = clientData.ViewCnt
    viewID = clientData.ViewID
    if billboardType in ShareDefine.CrossBillboardTypeList:
        # 跨服榜单直接查跨服服务器,待扩展
        return
    expPoint = minuteExp / ChConfig.Def_PerPointValue
    exp = minuteExp % ChConfig.Def_PerPointValue
    UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_OffLineEfficient, expPoint, exp)
    return
def UpdateRealmBillboard(curPlayer):
    ##境界榜
    if not curPlayer.GetOfficialRank():
        return
    UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_Realm, curPlayer.GetOfficialRank())
    return
###################################### 以下代码暂时没用,修改时再整合 ################################################
##玩家登录排行处理
# @param curPlayer 玩家实例
# @return
def BillboardOnLogin(curPlayer):
    # 上线默认同步排行榜
    UpdatePlayerBillboardOnLeaveServer(curPlayer) #排行榜已实时更新,故上线不再同步
    return
## 更新当前镖车信息
#  @param playerID: 玩家ID
#  @param playerName: 玩家名字
#  @param playerOpInfo: 玩家平台信息
#  @param playerLV: 玩家等级
#  @param truckLV: 镖车等级
#  @param truckMapID: 镖车所在地图ID
#  @return:
def UpdateBillboardPlayerTruck(playerID, playerName, playerOpInfo, playerLV, truckLV, truckMapID):
    
    #当truckMapID为0时表示在排行在删除该镖车的记录
    #[玩家ID, 玩家名字, 玩家等级, 镖车等级, 镖车位置]
    cmdList = [playerID, playerName, playerOpInfo, playerLV, truckLV, truckMapID]
    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "UpdateBillboardPlayerTruck",
                                                              '%s' % (cmdList), len(str(cmdList)))
    return
##更新玩家充值排行榜
# @param curPlayer 玩家实例
# @return 任务实例
# @remarks
def UpdateTotalRechargeBillboard(curPlayer):
#    if GameWorld.IsGM(curPlayer):
#        #GM不上榜
#        return
    totalChangeCoinPoint = curPlayer.GetChangeCoinPointTotal()
    #排行榜需要数据[玩家ID, 玩家名字, 玩家职业, 玩家等级]
    playerID = curPlayer.GetID()
    playerName = curPlayer.GetName()
    playerOpInfo = curPlayer.GetOperateInfo()
    playerJob = curPlayer.GetJob()
    playerLV = curPlayer.GetLV()
    sendMsg = '%s' % ([playerID, playerName, playerOpInfo, playerJob, playerLV, totalChangeCoinPoint])
    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'UpdateTotalRechargeBillboard', \
            sendMsg, len(sendMsg))
    clientPack = GetPack_ViewBillboardRet(billboardType, groupValue1, groupValue2, startIndex, viewCnt, viewID)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return
def GetPack_ViewBillboardRet(bbType, groupValue1, groupValue2, startIndex=0, viewCnt=20, viewID=0):
    ## 获取查看榜单返回信息封包,本服跨服通用
    billboardMgr = DBDataMgr.GetBillboardMgr()
    billboardObj = billboardMgr.GetBillboard(bbType, groupValue1, groupValue2)
    billboardObj.SortDelayDo()
    idOrderDict = billboardObj.GetIDOrderDict()
    count = billboardObj.GetCount()
    maxIndex = count - 1
    startIndex = max(min(startIndex, maxIndex), 0)
    viewCnt = 20 if not viewCnt else min(viewCnt, 100) # 默认20,最多100
    endIndex = min(startIndex + viewCnt - 1, maxIndex)
    viewRange = [] if not count else range(startIndex, endIndex + 1)
    viewIDRange = []
    # 查看viewID前后名次
    if viewID:
        viewBFCnt = 3 # 查看ViewID返回前后数据条数,一般设置为奇数
        viewIDIndex = billboardObj.IndexOfByID(viewID)
        if viewIDIndex != -1:
            # 前x后x
            viewIDStartIndex = max(0, viewIDIndex - viewBFCnt / 2)
            viewIDEndIndex = min(viewIDIndex + viewBFCnt / 2, maxIndex)
            viewIDRange = range(viewIDStartIndex, viewIDEndIndex + 1)
    clientPack = ChPyNetSendPack.tagMCViewBillboardRet()
    clientPack.Type = bbType
    clientPack.GroupValue1 = groupValue1
    clientPack.GroupValue2 = groupValue2
    clientPack.DataTotal = count
    clientPack.PageDataList = []
    for index in viewRange:
        billboardData = billboardObj.At(index)
        viewData = ChPyNetSendPack.tagMCViewBillboardData()
        viewData.Index = index
        viewData.Rank = idOrderDict.get(billboardData.GetID(), 0)
        viewData.ID = billboardData.GetID()
        viewData.ID2 = billboardData.GetID2()
        viewData.Name1 = billboardData.GetName1()
        viewData.Name2 = billboardData.GetName2()
        viewData.Type2 = billboardData.GetType2()
        viewData.Value1 = billboardData.GetValue1()
        viewData.Value2 = billboardData.GetValue2()
        viewData.Value3 = billboardData.GetValue3()
        viewData.Value4 = billboardData.GetValue4()
        viewData.Value5 = billboardData.GetValue5()
        viewData.Value6 = billboardData.GetValue6()
        viewData.Value7 = billboardData.GetValue7()
        viewData.Value8 = billboardData.GetValue8()
        viewData.CmpValue = billboardData.GetCmpValue()
        viewData.CmpValue2 = billboardData.GetCmpValue2()
        viewData.CmpValue3 = billboardData.GetCmpValue3()
        viewData.UserData = billboardData.GetUserData()
        viewData.DataLen = len(viewData.UserData)
        clientPack.PageDataList.append(viewData)
    clientPack.PageDataCnt = len(clientPack.PageDataList)
    clientPack.ViewID = viewID
    clientPack.ViewIDDataList = []
    for index in viewIDRange:
        billboardData = billboardObj.At(index)
        viewData = ChPyNetSendPack.tagMCViewBillboardData()
        viewData.Index = index
        viewData.Rank = idOrderDict.get(billboardData.GetID(), 0)
        viewData.ID = billboardData.GetID()
        viewData.ID2 = billboardData.GetID2()
        viewData.Name1 = billboardData.GetName1()
        viewData.Name2 = billboardData.GetName2()
        viewData.Type2 = billboardData.GetType2()
        viewData.Value1 = billboardData.GetValue1()
        viewData.Value2 = billboardData.GetValue2()
        viewData.Value3 = billboardData.GetValue3()
        viewData.Value4 = billboardData.GetValue4()
        viewData.Value5 = billboardData.GetValue5()
        viewData.Value6 = billboardData.GetValue6()
        viewData.Value7 = billboardData.GetValue7()
        viewData.Value8 = billboardData.GetValue8()
        viewData.CmpValue = billboardData.GetCmpValue()
        viewData.CmpValue2 = billboardData.GetCmpValue2()
        viewData.CmpValue3 = billboardData.GetCmpValue3()
        viewData.UserData = billboardData.GetUserData()
        viewData.DataLen = len(viewData.UserData)
        clientPack.ViewIDDataList.append(viewData)
    clientPack.ViewIDDataCnt = len(clientPack.ViewIDDataList)
    return clientPack