#!/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 PlayerViewCache import NetPackCommon import IpyGameDataPY import DBBillboard import PlayerMail import DBDataMgr import time def OnDay(centerEventValue=0): # @param centerEventValue: ¿ç·þÖÐÐÄʼþÖµ£¬²»Îª0ʱ´ú±íÊÇ¿ç·þÖÐÐÄͬ²½µÄʼþ£¬Ö»´¦Àí¿ç·þ¹¦ÄÜÐèÒª´¦ÀíµÄÂß¼­ drBillboardTypeList = [] if centerEventValue: if not GameWorld.IsCrossServer(): # ¿ç·þʼþÖ»¿ç·þ·þÎñÆ÷´¦Àí return drBillboardTypeList = ShareDefine.CrossBillboardTypeList eventName = "OnDay%s" % centerEventValue else: drBillboardTypeList = IpyGameDataPY.GetFuncEvalCfg("BillboardSet", 1) eventName = "OnDay" 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(eventName) return def BillboardOnLogin(curPlayer): # ÉÏÏßĬÈÏͬ²½ÅÅÐаñ #UpdatePlayerBillboardOnLeaveServer(curPlayer) #ÅÅÐаñÒÑʵʱ¸üУ¬¹ÊÉÏÏß²»ÔÙͬ²½ return def GetBillboardOperateInfo(curPlayer): # ÅÅÐаñÖÐËù±£´æµÄÔËÓªÉÌÏà¹ØÐÅÏ¢ platform = curPlayer.GetAccID() return platform def GetBillboardJob(curPlayer): return curPlayer.GetJob() 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 UpdatePlayerBillboard(curPlayer, bType, cmpValue, cmpValue2=0, cmpValue3=0, autoSort=False, groupValue1=0, **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() UpdateBillboard(bType, groupValue1, playerID, playerName, playerOpInfo, playerJob, value1, value2, cmpValue, cmpValue2, cmpValue3, autoSort=autoSort, **kwargs) return def __updPlayerBillViewInfo(billData): playerID = billData.GetID() curCache = PlayerViewCache.FindViewCache(playerID) if not curCache: return billData.SetName1(curCache.GetPlayerName()) billData.SetName2(curCache.GetAccID()) billData.SetType2(curCache.GetJob()) billData.SetValue1(curCache.GetRealmLV()) billData.SetValue2(curCache.GetTitleID()) billData.SetValue3(curCache.GetFace()) billData.SetValue4(curCache.GetFacePic()) billData.SetValue5(curCache.GetModelMark()) billData.SetValue6(curCache.GetEquipShowSwitch()) return def UpdateBillboardLayer(dataID, billboardType, cmpValue, groupValue1=0, autoSort=True): ## ¸üаñµ¥ËùÔڵIJ㼶£¬Ò»°ãÓÃÓڲ㼶ģʽµÄ°ñµ¥£¬²ã¼¶Ä£Ê½Ä¬ÈÏÓëÄ¿±ê½»»»Ãû´Î if GameWorld.IsCrossServer(): if billboardType not in ShareDefine.CrossBillboardTypeList: return else: if billboardType not in ShareDefine.BillboardTypeList: return if not dataID: return groupValue2 = 0 billboardMgr = DBDataMgr.GetBillboardMgr() billboardObj = billboardMgr.GetBillboard(billboardType, groupValue1, groupValue2) layerIDList = billboardObj.GetLayerIDList() layerIDCnt = len(layerIDList) if cmpValue <= 0 or cmpValue > layerIDCnt: GameWorld.ErrLog("¸üв㼶°ñµ¥Ãû´ÎÒì³£! dataID=%s,billboardType=%s,cmpValue=%s,layerIDCnt=%s" % (dataID, billboardType, cmpValue, layerIDCnt), dataID) return tagIndex = cmpValue - 1 tagID = layerIDList[tagIndex] if dataID == tagID: return True tagBillData = billboardObj.FindByID(tagID) # µ±ÊÇÌî³äµÄ»úÆ÷ÈËʱ²»´æÔÚÊý¾Ý curBillData = billboardObj.FindByID(dataID) curTime = int(time.time()) # δÉϰñµÄÌæ»»ÉϰñµÄ if not curBillData: if tagBillData: curBillData = tagBillData curBillData.Clear() tagBillData = None else: curBillData = billboardObj.AddNewBillboardData(dataID) # ÉϰñµÄÖ±½Ó½»»» else: curCmpValue = curBillData.GetCmpValue() if curCmpValue <= cmpValue: GameWorld.DebugLog("²ã¼¶°ñµ¥Ãû´ÎֵûÓÐÌá¸ß²»¸üаñµ¥! curCmpValue=%s <= %s" % (curCmpValue, cmpValue), dataID) return layerIDList[curCmpValue - 1] = tagID if tagBillData: tagBillData.SetCmpValue(curCmpValue) tagBillData.SetTime(curTime) layerIDList[cmpValue - 1] = dataID billboardObj.SetLayerIDList(layerIDList) curBillData.SetID(dataID) curBillData.SetCmpValue(cmpValue) curBillData.SetTime(curTime) __updPlayerBillViewInfo(curBillData) GameWorld.DebugLog("¸üÐÂÅÅÐвãÖµ: billboardType=%s,groupValue1=%s,dataID=%s,cmpValue=%s,tagID=%s" % (billboardType, groupValue1, dataID, cmpValue, tagID), dataID) if autoSort: billboardObj.SortData() return True def SetTempDataByViewCache(playerID, billType, groupValue1=0, groupValue2=0, cmpValue=0): ## ¸ù¾ÝÍæ¼Ò»º´æ¸üÐÂÁÙʱ°ñµ¥Êý¾Ý£¬Ò»°ãÓÃÓÚÌî³ä»úÆ÷ÈË TempBillData = DBBillboard.TempBillData TempBillData.Clear() TempBillData.SetType(billType) TempBillData.SetGroupValue1(groupValue1) TempBillData.SetGroupValue2(groupValue2) if not playerID: return TempBillData TempBillData.SetID(playerID) TempBillData.SetCmpValue(cmpValue) __updPlayerBillViewInfo(TempBillData) return TempBillData 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) if billboardObj.IsOrderRuleByLayer(): # ¸Ãģʽ²»´¦Àí£¬ÇëʹÓà UpdateBillboardLayer return 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 #// 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() isLayerMode = billboardObj.IsOrderRuleByLayer() # ²ã¼¶Ä£Ê½ÓлúÆ÷ÈËÌî³ä£¬Ä¬ÈÏΪ×î´ó£¬Êµ¼Ê°ñµ¥Êý¾ÝÖÐûÓлúÆ÷ÈËÊý¾Ý layerIDList = [] if isLayerMode: layerIDList = billboardObj.GetLayerIDList() count = len(layerIDList) 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 = -1 if isLayerMode: billboardData = billboardObj.FindByID(viewID) if billboardData: viewIDIndex = billboardData.GetCmpValue() - 1 else: 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: if index >= count: break billboardData = None if isLayerMode: rank = index + 1 dataID = layerIDList[index] billboardData = billboardObj.FindByID(dataID) if not billboardData: cmpValue = rank billboardData = SetTempDataByViewCache(dataID, bbType, groupValue1, groupValue2, cmpValue) else: billboardData = billboardObj.At(index) rank = idOrderDict.get(billboardData.GetID(), 0) if not billboardData: continue viewData = ChPyNetSendPack.tagMCViewBillboardData() viewData.Index = index viewData.Rank = rank 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 = None if isLayerMode: rank = index + 1 dataID = layerIDList[index] billboardData = billboardObj.FindByID(dataID) if not billboardData: cmpValue = rank billboardData = SetTempDataByViewCache(dataID, bbType, groupValue1, groupValue2, cmpValue) else: billboardData = billboardObj.At(index) rank = idOrderDict.get(billboardData.GetID(), 0) if not billboardData: continue viewData = ChPyNetSendPack.tagMCViewBillboardData() viewData.Index = index viewData.Rank = rank 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 def SetOrderRuleListByActTempID(billboardType, templateID, groupValue1=0, groupValue2=0): ## ¸ù¾Ý»î¶¯°ñµ¥Ä£°æ¸üÐÂÅÅÃû¹æÔò orderRuleList = [] orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBillboardAward", templateID) if orderIpyDataList: for ipyData in orderIpyDataList: orderRuleList.append([ipyData.GetRankB(), ipyData.GetNeedValue()]) billboardMgr = DBDataMgr.GetBillboardMgr() billBoard = billboardMgr.GetBillboard(billboardType, groupValue1, groupValue2) billBoard.SetOrderRuleList(orderRuleList) return def DoGiveBillboardAwardByActTempID(billboardType, funcName, templateID, mailKey, groupValue1=0, groupValue2=0, isClearData=False): ## ¸ù¾Ý»î¶¯°ñµ¥Ä£°æ½áËãÅÅÃû½±Àø£¬Óʼþ·¢·Å # @param funcName: ×Ô¶¨ÒåµÄ¹¦ÄÜÃû³Æ billboardAwardDict = {} orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBillboardAward", templateID) if orderIpyDataList: for ipyData in orderIpyDataList: billboardAwardDict[str(ipyData.GetRankB())] = ipyData.GetAwardItemList() DoGiveBillboardAwardByMail(billboardType, funcName, billboardAwardDict, mailKey, groupValue1, groupValue2, isClearData) return def DoGiveBillboardAwardByMail(billboardType, funcName, billboardAwardDict, mailKey, groupValue1=0, groupValue2=0, isClearData=False): ## ½áËãÅÅÐн±ÀøÓʼþ·¢·Å # @param funcName: ×Ô¶¨ÒåµÄ¹¦ÄÜÃû³Æ # @param billboardAwardDict: {"Ãû´Î":[[itemID,itemCnt], ...], ...} # @param mailKey: ÓʼþÄ£°ækey GameWorld.Log("----- %s ½áËãÅÅÐн±Àø! -----" % (funcName)) if not billboardAwardDict: return orderList = [int(orderStr) for orderStr in billboardAwardDict.keys()] orderList.sort() GameWorld.Log(" ½±ÀøÃû´ÎÁбí: %s" % orderList) billboardMgr = DBDataMgr.GetBillboardMgr() billBoard = billboardMgr.GetBillboard(billboardType, groupValue1, groupValue2) if not billBoard: return billBoard.SortDelayDo() idOrderDict = billBoard.GetIDOrderDict() awardOrder = orderList[0] orderPlayerIDDict = {} billboardCount, billboardMaxCount = billBoard.GetCount(), billBoard.GetMaxCount() GameWorld.Log(" °ñµ¥Êý¾ÝÊý: %s/%s" % (billboardCount, billboardMaxCount)) for index in xrange(billboardCount): billBoardData = billBoard.At(index) if not billBoardData: continue playerID = billBoardData.GetID() order = idOrderDict.get(playerID, index + 1) endAward = False # ·¢½±ÊÇ·ñ½áÊø while order > awardOrder: nextOrderIndex = orderList.index(awardOrder) + 1 if nextOrderIndex >= len(orderList): endAward = True break awardOrder = orderList[nextOrderIndex] if endAward: break if playerID < ShareDefine.RealPlayerIDStart: # ·ÇÕæÈ˲»´¦Àí continue orderPlayerIDDict[playerID] = [order, awardOrder] paramList = [order] awardList = billboardAwardDict[str(awardOrder)] PlayerMail.SendMailByKey(mailKey, playerID, awardList, paramList) GameWorld.Log(" ½±ÀøÍæ¼ÒÃû´ÎÐÅÏ¢: %s" % orderPlayerIDDict) if isClearData: billBoard.ClearData("Award") GameWorld.Log("---------------------------------------------------") return