hxp
5 天以前 2b34924e06c0c36d77d9ccec4c4f10f1ebd16e84
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBillboard.py
@@ -15,15 +15,11 @@
#"""Version = 2018-03-06 11:00"""
#-------------------------------------------------------------------------------
import ChConfig
import GameWorld
import ShareDefine
import PlayerControl
import OpenServerCampaign
import ChPyNetSendPack
import NetPackCommon
import IpyGameDataPY
import GameFuncComm
import DBDataMgr
import time
@@ -38,19 +34,13 @@
        
    billboardMgr = DBDataMgr.GetBillboardMgr()
    for billboardType in drBillboardTypeList:
        if billboardType in [ShareDefine.Def_CBT_BossTrialSubmitBak, ShareDefine.Def_CBT_BossTrialSubmitFamilyBak, ShareDefine.Def_CBT_CrossRealmPK]:
        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 DoBillboardOpen(curPlayer):
    ## 排行榜开启时需要处理的
    #UpdatePlayerBillboardOnLeaveServer(curPlayer, True) # 主动同步一次榜单
    #OpenServerCampaign.DoBillboardOpen(curPlayer) # 同步开服活动榜单
    return
def BillboardOnLogin(curPlayer):
@@ -71,35 +61,26 @@
        # 跨服服务器不用更新本服榜
        return
    
    UpdatePlayerLVBillboard(curPlayer) # 等级榜
    UpdatePlayerFPTotalBillboard(curPlayer, True) # 战斗力榜
    UpdateHorseBillboard(curPlayer, True, False) # 坐骑榜
    UpdatePyPetBillboard(curPlayer, True, False) # 灵宠榜
    UpdateRealmBillboard(curPlayer) # 境界榜
    if isAll:
        UpdateRuneTowerBillboard(curPlayer)
    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)
    GameWorld.DebugLog("更新总战斗力:playerFightPower=%s" % (playerFightPower), curPlayer.GetPlayerID())
    UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_FightPower, fightPowerEx, fightPower)
#
#    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)
#
#    GameWorld.DebugLog("更新总战斗力:playerFightPower=%s" % (playerFightPower), curPlayer.GetPlayerID())
#
#    UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_FightPower, fightPowerEx, fightPower)
    
#    if bType == ShareDefine.Def_BT_FightPower:
#        playerID = bID
@@ -121,114 +102,126 @@
#            UpdatePlayerBillboard(bID, bName, bName2, jobBType, bType2, value1, value2, cmpValue, autoSort, cmpValue2, **kwargs)
    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
    if not __CanPlayerBillboardComm(curPlayer):
        return False
    if isForceUpdate:
        GameWorld.DebugLog("战斗力更新检查:强制更新 key=%s,fightPower=%s,history=%s"
                           % (key, fightPower, historyFightPower), curPlayer.GetPlayerID())
        return True
    if fightPower == historyFightPower:
        GameWorld.DebugLog("战斗力更新检查:与上次相同,默认不更新 key=%s,fightPower=%s,history=%s"
                           % (key, fightPower, historyFightPower), curPlayer.GetPlayerID())
        return False
    return True
#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
#
#    if not __CanPlayerBillboardComm(curPlayer):
#        return False
#
#    if isForceUpdate:
#        GameWorld.DebugLog("战斗力更新检查:强制更新 key=%s,fightPower=%s,history=%s"
#                           % (key, fightPower, historyFightPower), curPlayer.GetPlayerID())
#        return True
#
#    if fightPower == historyFightPower:
#        GameWorld.DebugLog("战斗力更新检查:与上次相同,默认不更新 key=%s,fightPower=%s,history=%s"
#                           % (key, fightPower, historyFightPower), curPlayer.GetPlayerID())
#        return False
#
#    return True
def UpdateHorseBillboard(curPlayer, isForceUpdate=False, isUpdateTotal=True):
    ##更新玩家坐骑排行榜
    HorseFightPower = PlayerControl.GetMFPFightPower(curPlayer, ShareDefine.Def_MFPType_Horse)
    if not HorseFightPower:
        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
def UpdatePyPetBillboard(curPlayer, isForceUpdate=False, isUpdateTotal=True):
    ## 更新宠物排行榜
    return
#    petMaxAtk = PlayerControl.GetPetMaxAtk(curPlayer)
#    if not petMaxAtk:
#        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):
    ##更新玩家符印塔排行榜
    return
def UpdateRealmBillboard(curPlayer):
    ##境界榜
    if not curPlayer.GetOfficialRank():
        return
    UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_Realm, curPlayer.GetOfficialRank())
    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 __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, value1=0, value2=0, autoSort=False, **kwargs):
def UpdatePlayerBillboard(curPlayer, bType, cmpValue, cmpValue2=0, cmpValue3=0, value1=None, value2=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)
    if value1 == None:
        value1 = curPlayer.GetOfficialRank()
    kwargs["value3"] = curPlayer.GetFace()
    kwargs["value4"] = curPlayer.GetFacePic()
    if bType in ShareDefine.BTValue1_OfficialRankList:
        value1 = curPlayer.GetOfficialRank()
    kwargs["value5"] = curPlayer.GetModelMark()
    groupValue1 = 0
    UpdateBillboard(bType, groupValue1, playerID, playerName, playerOpInfo, playerJob, value1, value2, 
                    cmpValue, cmpValue2, cmpValue3, autoSort=autoSort, **kwargs)
    return
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 dataID:
        return
    groupValue1, groupValue2 = 0, 0
    billboardMgr = DBDataMgr.GetBillboardMgr()
    billboardObj = billboardMgr.GetBillboard(billboardType, groupValue1, groupValue2)
    billboardData = billboardObj.FindByID(dataID)
    if not billboardData:
        return
    isNewData = False
    cmpValueChange = isNewData or billboardData.GetCmpValue() != cmpValue or billboardData.GetCmpValue2() != cmpValue2 \
        or (cmpValue3 and billboardData.GetCmpValue3() != cmpValue3)
    # 没设置值默认为时间time,先上榜的排前面
    if cmpValue3 == 0:
        # 时间权值仅在比较值变更的情况下才更新, 防止其他附属值更新时导致比较值相同的玩家名次间会变动的问题
        if cmpValueChange:
            calcTime = GameWorld.ChangeTimeStrToNum("2090-01-01 00:00:00")
            cmpValue3 = max(0, calcTime - int(time.time())) # 比较值3如果没指定值则默认存当前更新的time
        else:
            cmpValue3 = billboardData.GetCmpValue3()
    billboardData.SetCmpValue(cmpValue)
    billboardData.SetCmpValue2(cmpValue2)
    billboardData.SetCmpValue3(cmpValue3)
    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 UpdateBillboard(billboardType, groupValue1, dataID, name1, name2, type2, value1, value2, cmpValue,
                    cmpValue2=0, cmpValue3=0, groupValue2=0, id2=0, autoSort=True, **kwargs):
    ''' 更新排行榜