#!/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 GameWorld import ShareDefine import PlayerControl import ChPyNetSendPack import NetPackCommon import IpyGameDataPY 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 []: 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() return platform def GetBillboardJob(curPlayer): return curPlayer.GetJob() def UpdatePlayerBillboardOnLeaveServer(curPlayer, isAll=False): ##ÏÂÏ߸üÐÂÍæ¼ÒÅÅÐаñ if GameWorld.IsCrossServer(): # ¿ç·þ·þÎñÆ÷²»Óøüб¾·þ°ñ return return def UpdatePlayerBillboardName(curPlayer): ## ¸üÐÂÅÅÐаñÖеÄÍæ¼ÒÃû×ּǼ 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 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 playerJob = GetBillboardJob(curPlayer) playerID = curPlayer.GetID() playerName = curPlayer.GetPlayerName() playerOpInfo = GetBillboardOperateInfo(curPlayer) value1 = curPlayer.GetOfficialRank() value2 = PlayerControl.GetTitleID(curPlayer) kwargs["value3"] = curPlayer.GetFace() kwargs["value4"] = curPlayer.GetFacePic() 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 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) 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 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(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 __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