#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.PlayerBillboard # # @todo:ÅÅÐаñ # @author hxp # @date 2018-03-06 # @version 1.0 # # ÏêϸÃèÊö: ÅÅÐаñ£¬±¾·þ¡¢¿ç·þͨÓà # #------------------------------------------------------------------------------- #"""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 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 [ShareDefine.Def_CBT_BossTrialSubmitBak, ShareDefine.Def_CBT_BossTrialSubmitFamilyBak, ShareDefine.Def_CBT_CrossRealmPK]: 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): # ÉÏÏßĬÈÏͬ²½ÅÅÐаñ UpdatePlayerBillboardOnLeaveServer(curPlayer) #ÅÅÐаñÒÑʵʱ¸üУ¬¹ÊÉÏÏß²»ÔÙͬ²½ return def GetBillboardOperateInfo(curPlayer): # ÅÅÐаñÖÐËù±£´æµÄÔËÓªÉÌÏà¹ØÐÅÏ¢ platform = curPlayer.GetAccID() return platform def GetBillboardJob(curPlayer): return curPlayer.GetJob() def UpdatePlayerBillboardOnLeaveServer(curPlayer, isAll=False): ##ÏÂÏ߸üÐÂÍæ¼ÒÅÅÐаñ if GameWorld.IsCrossServer(): # ¿ç·þ·þÎñÆ÷²»Óøüб¾·þ°ñ 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) # if bType == ShareDefine.Def_BT_FightPower: # playerID = bID # fightPowerTotal = cmpValue * ChConfig.Def_PerPointValue + cmpValue2 # familyID = exInfo[0] # playerJob = bType2 # # curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) # if curPlayer: # PlayerControl.SetFightPower(curPlayer, fightPowerTotal) # # #¸üÐÂÕ½Ã˳ÉÔ±Õ½Á¦ # PlayerFamily.UpdFamilyMemberFightPower(familyID, playerID, fightPowerTotal) # # #Ö°ÒµÕ½Á¦°ñ # job = playerJob % 10 # if job in ShareDefine.JobFightPowerBillboardDict: # jobBType = ShareDefine.JobFightPowerBillboardDict[job] # 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 ÊÇ·ñÇ¿ÖÆ¸üУ¨ÈôÉèÖÃÇ¿ÖÆ¸üУ¬ÔÚijЩDZ¹æÔòÏÂÒ²²»Ò»¶¨ÄÜÇ¿ÖÆ¸üУ¬Èç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): ## ¸üгèÎïÅÅÐаñ 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): ##¸üÐÂÍæ¼Ò·ûÓ¡ËþÅÅÐаñ passLV = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_TrialTower_PassLV) if not passLV: return UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_TrialTower, passLV) 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 UpdatePlayerBillboard(curPlayer, bType, cmpValue, cmpValue2=0, cmpValue3=0, value1=0, 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() playerOpInfo = GetBillboardOperateInfo(curPlayer) kwargs["value3"] = curPlayer.GetFace() kwargs["value4"] = curPlayer.GetFacePic() if bType in ShareDefine.BTValue1_OfficialRankList: value1 = curPlayer.GetOfficialRank() groupValue1 = 0 UpdateBillboard(bType, groupValue1, playerID, playerName, playerOpInfo, playerJob, value1, value2, cmpValue, cmpValue2, cmpValue3, autoSort=autoSort, **kwargs) return 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 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() if not billboardData: return 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.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) 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 __CmpLastBillboardData(cmpValue, cmpValue2, cmpValue3, billboardObj): ## ±È½ÏÊÇ·ñ³¬¹ý×îºóÒ»Ãû # @return: ³¬¹ýÔò·µ»Ø×îºóÒ»ÃûÊý¾ÝʵÀý£¬·ñÔò·µ»ØNone if not billboardObj.GetCount(): return lastBillBoardData = billboardObj.At(billboardObj.GetCount() - 1) if cmpValue < lastBillBoardData.GetCmpValue(): #ÎÞ·¨Éϰñ return 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 #// 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 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