#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package GameWorldLogic.FBProcess.GameLogic_Qunying # # @todo:ȺӢ°ñ # @author hxp # @date 2026-03-11 # @version 1.0 # # ÏêϸÃèÊö: ȺӢ°ñ # #------------------------------------------------------------------------------- #"""Version = 2026-03-11 19:00""" #------------------------------------------------------------------------------- import DBDataMgr import GameWorld import TurnAttack import ShareDefine import PlayerControl import IpyGameDataPY import PlayerBillboard import PlayerViewCache import ChPyNetSendPack import NetPackCommon import ItemControler import GameFuncComm import PyGameData import FBCommon import ChConfig import random import time # ¼Ç¼¹¥»÷ÀàÐÍ RecAtkType_Atk = 1 # ·¢Æð¹¥»÷ RecAtkType_Def = 2 # ±»¹¥»÷µÄ def GetRecAtkType(recData): return recData.GetValue2() # ¹¥»÷ÀàÐÍ 1-·¢Æð¹¥»÷µÄ£¬2-±»¹¥»÷µÄ def SetRecAtkType(recData, atkType): return recData.SetValue2(atkType) def GetRecTagPlayerID(recData): return recData.GetValue3() # Ïà¶Ô¹¥»÷ÀàÐ͵ÄÄ¿±êÍæ¼ÒID def SetRecTagPlayerID(recData, tagPlayerID): return recData.SetValue3(tagPlayerID) def GetRecIsWin(recData): return recData.GetValue4() # ÊÇ·ñ»ñʤ 1-»ñʤ£»2-ʧ°Ü def SetRecIsWin(recData, isWin): return recData.SetValue4(1 if isWin else 0) def GetRecFace(recData): return recData.GetValue5() # Ä¿±êÍ·Ïñ def SetRecFace(recData, face): return recData.SetValue5(face) def GetRecFacePic(recData): return recData.GetValue6() def SetRecFacePic(recData, facePic): return recData.SetValue6(facePic) def GetRecRealmLV(recData): return recData.GetValue7() def SetRecRealmLV(recData, realmLV): return recData.SetValue7(realmLV) def GetRecLV(recData): return recData.GetValue8() def SetRecLV(recData, tagLV): return recData.SetValue8(tagLV) #SetUserData Ãû×Ö¡¢×Ô¼ºÃû´Î¡¢¶Ô·½Ãû´Î def OnWeek(): serverDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_ServerDay) + 1 serverDayNeed = IpyGameDataPY.GetFuncCfg("QunyingSet", 1) if serverDayNeed and serverDay < serverDayNeed: GameWorld.DebugLog("¿ª·þÌì²»×ã±¾Öܲ»ÖØÖÃȺӢ°ñ! serverDay=%s < %s" % (serverDay, serverDayNeed)) return DoQunyingReset() return def OnDay(): billboardAwardDict = IpyGameDataPY.GetFuncEvalCfg("QunyingAward", 1, {}) PlayerBillboard.DoGiveBillboardAwardByMail(ShareDefine.Def_BT_Qunying, "QunyingDay", billboardAwardDict, "QunyingDay", isClearData=False) return def OnServerStart(): __fillRobot() return def DoQunyingReset(): ''' Èü¼¾ÖØÖà ''' GameWorld.Log("=============== ÖØÖÃȺӢ°ñ ===============") PyGameData.g_qunyingPlayerMatchDict = {} # ½áËãÉÏÈü¼¾ÅÅÐн±Àø billboardAwardDict = IpyGameDataPY.GetFuncEvalCfg("QunyingAward", 2, {}) PlayerBillboard.DoGiveBillboardAwardByMail(ShareDefine.Def_BT_Qunying, "QunyingWeek", billboardAwardDict, "QunyingWeek", isClearData=False) # ÖØÖÃÅÅÐаñ DBDataMgr.GetBillboardMgr().RemoveBillboard(ShareDefine.Def_BT_Qunying) __fillRobot() GameWorld.Log("==========================================") return True def __fillRobot(): ## Ìî³äÂú»úÆ÷ÈË billboardMgr = DBDataMgr.GetBillboardMgr() billBoard = billboardMgr.GetBillboard(ShareDefine.Def_BT_Qunying) maxCount = billBoard.GetMaxCount() # »úÆ÷ÈËÌî³äÊýĬÈÏʹÓðñµ¥×î´óÊý robotFPSortList = PlayerViewCache.GetRobotFightPowerSortList(ChConfig.RobotTempNum_Qunying) robotDict = {} # {(rankA, rankB):[robotID], ...} for _, robotID in robotFPSortList: robotIpyData = IpyGameDataPY.GetIpyGameData("Robot", robotID) if not robotIpyData: continue tempValue1 = robotIpyData.GetTempValue1() tempValue2 = robotIpyData.GetTempValue2() rankKey = (tempValue1, tempValue2) if rankKey not in robotDict: robotDict[rankKey] = [] robotList = robotDict[rankKey] robotList.append(robotIpyData.GetID()) layerRobotIDList = [] robotKeyList = robotDict.keys() robotKeyList.sort() # °´Ãû´ÎÅÅÐò´¦Àí for robotKey in robotKeyList: rankA, rankB = robotKey robotIDList = robotDict[robotKey] random.shuffle(robotIDList) robotCnt = len(robotIDList) needRobotCnt = rankB - rankA + 1 for _ in range(needRobotCnt / robotCnt): layerRobotIDList += robotIDList for index in range(needRobotCnt % robotCnt): layerRobotIDList.append(robotIDList[index]) layerRobotIDList = layerRobotIDList[:maxCount] GameWorld.DebugLog("Ìî³äȺӢ°ñ»úÆ÷ÈË: maxCount=%s,fillRobotIDLen=%s" % (maxCount, len(layerRobotIDList))) billBoard.SetOrderRuleByLayer(layerRobotIDList) return ## ------------------------------------------------------------------------------------------------ def DoQunyingOpen(curPlayer): storeMax = IpyGameDataPY.GetFuncCfg("QunyingChallenge", 1) PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_QunyingTicket, storeMax, "QunyingOpen") Sync_QunyingInfo(curPlayer) # ¿ªÆô¹¦ÄÜ return def OnFBPlayerOnWeek(curPlayer): if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Qunying): return serverDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_ServerDay) + 1 serverDayNeed = IpyGameDataPY.GetFuncCfg("QunyingSet", 1) # Íæ¼ÒÖØÖÃÓиöÎÊÌâ£¬Íæ¼ÒµÄ¹ýÖܲ¢²»Ò»¶¨ÊÇÖÜÒ»´¥·¢£¬¾ßÌå¿´Íæ¼ÒʲôʱºòµÇ¼ # ÄÇô¿ÉÄÜ´æÔÚÖܶþÍæ¼Ò²ÅµÇ¼£¬È»ºóÂú×ãÁËÖØÖÃÌõ¼þ£¬µ¼Ö´¥·¢ÁËÍæ¼Ò¸öÈ˵ÄÈü¼¾ÖØÖà # ĿǰֻÓÐˢдÎÊýÐèÒªÖØÖã¬ÔÝʱ²»¿¼ÂÇÕâ¸öÎÊÌ⣬ÕâÖÖÇé¿öÒ»°ãÖ»ÓÐзþ²Å¿ÉÄܳöÏÖ # ¡¾×¢¡¿ÈçÖ®ºóÓÐÐèÒªÖØÖñȽÏÑϽ÷µÄÊý¾Ý£¬ÔòÐèÒª°´Èü¼¾ID¶Ô±È²»Ò»Ñù²ÅÄÜÖØÖà if serverDayNeed and serverDay < serverDayNeed: GameWorld.DebugLog("¿ª·þÌì²»×ã±¾Öܲ»ÖØÖÃÍæ¼ÒȺӢ°ñ! serverDay=%s < %s" % (serverDay, serverDayNeed), curPlayer.GetPlayerID()) return PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_QunyingRefreshCnt, 0) Sync_QunyingInfo(curPlayer) # Èü¼¾ÖØÖà return def OnFBPlayerOnLogin(curPlayer): if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Qunying): return Sync_QunyingInfo(curPlayer) # µÇ¼ return def __checkAtkQunyingPlayer(curPlayer, tagID, tagRank): '''¼ì²é¿É·ñ¹¥»÷Ä¿±ê ''' playerID = curPlayer.GetPlayerID() if not tagID or playerID == tagID: return matchRankList = PyGameData.g_qunyingPlayerMatchDict.get(playerID, []) if tagRank not in matchRankList: GameWorld.DebugLog("ȺӢ°ñ²»¿É¹¥»÷²»ÔÚÆ¥ÅäÁбíÀïµÄÄ¿±êÃû´Î! tagID=%s not in matchRankList=%s" % (tagID, matchRankList), playerID) return # ÑéÖ¤Ãû´ÎÊÇ·ñ»¹Óëǰ¶ËµÄÒ»Ö billboardMgr = DBDataMgr.GetBillboardMgr() billBoard = billboardMgr.GetBillboard(ShareDefine.Def_BT_Qunying) if not billBoard: return layerIDList = billBoard.GetLayerIDList() tagIndex = tagRank - 1 tagIDNow = 0 if 0 <= tagIndex < len(layerIDList): tagIDNow = layerIDList[tagIndex] if tagID != tagIDNow: GameWorld.DebugLog("ȺӢ°ñ¹¥»÷ʱĿ±êÃû´ÎÍæ¼ÒID²»Ò»ÖÂ! tagRank=%s,tagID=%s != tagIDNow=%s" % (tagRank, tagID, tagIDNow), playerID) PlayerControl.NotifyCode(curPlayer, "QunyingTagRankIDErr") # Ä¿±êÍæ¼ÒÃû´ÎÒѸıä DoQunyingMatchRefresh(curPlayer, True, isSys=True) return return True def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList): ## »ØºÏÕ½¶·ÇëÇó if not valueList: return tagRank = valueList[0] # Ä¿±êÃû´Î quickCnt = valueList[1] if len(valueList) > 1 else 0 # ËÙÕ½´ÎÊý # ËÙÕ½ if quickCnt > 0: __doQuickFight(curPlayer, mapID, tagID, quickCnt) return if not __checkAtkQunyingPlayer(curPlayer, tagID, tagRank): return if not PlayerControl.HaveMoney(curPlayer, ShareDefine.TYPE_Price_QunyingTicket, 1): return return True, funcLineID def __doQuickFight(curPlayer, mapID, tagID, quickCnt): '''Ö´ÐÐËÙÕ½£¬±ØÊ¤¡¢Ö»¸ø¹Ì¶¨Õ½¶·½±Àø£¬Ãû´Î²»±ä ''' GameWorld.DebugLog("ȺӢ°ñËÙÕ½: tagID=%s,quickCnt=%s" % (tagID, quickCnt)) if quickCnt <= 0: return if not PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_QunyingTicket, quickCnt, "Qunying"): return awardItemDict = {} for item in IpyGameDataPY.GetFuncEvalCfg("QunyingChallenge", 3): itemID, itemCount = item[:2] awardItemDict[itemID] = awardItemDict.get(itemID, 0) + itemCount * quickCnt awardItemList = [[itemID, itemCount] for itemID, itemCount in awardItemDict.items()] ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["Qunying", False, {}], isNotifyAward=False) lineID = 0 isPass = 1 jsonItemList = [] for itemInfo in awardItemList: itemDict = {"ItemID":itemInfo[0], "Count":itemInfo[1]} jsonItemList.append(itemDict) overDict = {FBCommon.Over_itemInfo:jsonItemList, FBCommon.Over_isSweep:1, "tagID":tagID, "quickCnt":quickCnt} FBCommon.NotifyFBOver(curPlayer, mapID, lineID, isPass, overDict) return def OnTurnFightAward(curPlayer, guid, mapID, funcLineID, winFaction, statMsg, dateStr, reqData, awardDict): ## »ØºÏÕ½¶·½áËã½±Àø if not curPlayer: return playerID = curPlayer.GetPlayerID() tagPlayerID = reqData[1] valueList = reqData[2] tagRank = valueList[0] # Ä¿±êÃû´Î isWin = winFaction == ChConfig.Def_FactionA GameWorld.DebugLog("½áËãȺӢ°ñÕ½¶·! isWin=%s,tagPlayerID=%s,tagRank=%s" % (isWin, tagPlayerID, tagRank), playerID) canAtkRet = __checkAtkQunyingPlayer(curPlayer, tagPlayerID, tagRank) if not canAtkRet: return billboardMgr = DBDataMgr.GetBillboardMgr() billBoard = billboardMgr.GetBillboard(ShareDefine.Def_BT_Qunying) idRankDict = billBoard.GetIDOrderDict() curRank = idRankDict.get(playerID, 0) updRank = 0 awardItemList = [] if isWin: # ʤÀûʱ¹Ì¶¨½±Àø awardItemList = IpyGameDataPY.GetFuncEvalCfg("QunyingChallenge", 3) cmpValue = tagRank if PlayerBillboard.UpdateBillboardLayer(playerID, ShareDefine.Def_BT_Qunying, cmpValue): updRank = tagRank else: GameWorld.DebugLog(" ¸üаñµ¥Ê§°Ü", playerID) awardDict.update({FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(awardItemList), "tagPlayerID":tagPlayerID, "updRank":updRank, "curRank":curRank}) GameWorld.DebugLog(" tagPlayerID=%s,isWin=%s,awardItemList=%s" % (tagPlayerID, isWin, awardItemList), playerID) if not PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_QunyingTicket, 1): return if isWin: ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["Qunying", False, {}], isNotifyAward=False) rankHighest = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_QunyingRankHighest) if not rankHighest or (1 <= tagRank < rankHighest): PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_QunyingRankHighest, tagRank) GameWorld.DebugLog(" ¸üÐÂÀúÊ·×î¸ßÅÅÃû! tagRank=%s" % tagRank, playerID) Sync_QunyingInfo(curPlayer) # ¸üÐÂ×î¸ßÅÅÃû __updQunyingBatRecord(curPlayer, tagPlayerID, isWin, curRank, tagRank) # Õ½¶·½áÊøÏµÍ³Ç¿ÖÆË¢ÐÂÆ¥Åä DoQunyingMatchRefresh(curPlayer, True, isSys=True) return def __updQunyingBatRecord(curPlayer, tagPlayerID, isWin, curRank, tagRank): ## ¸üÐÂÕ½¶·Ïà¹ØÈÕÖ¾¡¢°ñµ¥µÈ playerID = curPlayer.GetPlayerID() maxCount = 20 tagViewCache = PlayerViewCache.FindViewCache(tagPlayerID) gameRecMgr = DBDataMgr.GetGameRecMgr() atkRecMgr = gameRecMgr.GetRecTypeIDMgr(ShareDefine.Def_GameRecType_QunyingRecord, playerID) recData = atkRecMgr.AddRecData(maxCount) SetRecAtkType(recData, RecAtkType_Atk) SetRecTagPlayerID(recData, tagPlayerID) SetRecIsWin(recData, isWin) SetRecFace(recData, tagViewCache.GetFace() if tagViewCache else 0) SetRecFacePic(recData, tagViewCache.GetFacePic() if tagViewCache else 0) SetRecRealmLV(recData, tagViewCache.GetRealmLV() if tagViewCache else 1) SetRecLV(recData, tagViewCache.GetLV() if tagViewCache else 1) # Ãû×Ö¡¢×Ô¼ºÃû´Î¡¢¶Ô·½Ãû´Î tagPlayerName = tagViewCache.GetPlayerName() if tagViewCache else "" recData.SetUserData({"Name":tagPlayerName, "CurRank":curRank, "TagRank":tagRank}) # ±»»÷·½ if tagPlayerID < ShareDefine.RealPlayerIDStart: #GameWorld.DebugLog("Ä¿±ê·ÇÕæÊµÍæ¼Ò²»´¦Àí! tagPlayerID=%s" % tagPlayerID, playerID) return # ÓÉÓڷǰñµ¥ÉϵÄÍæ¼Ò²»»á±»Æ¥Åäµ½£¬ËùÒÔ±»Æ¥Åäµ½µÄ¿ÉÒÔÀí½âΪһ¶¨ÓÐÕ½¶·¼Ç¼£¬ÒòΪҪÉϰñ±ØÐëÕ½¶·¹ý defRecMgr = gameRecMgr.GetRecTypeIDMgr(ShareDefine.Def_GameRecType_QunyingRecord, tagPlayerID) if not defRecMgr.GetCount(): GameWorld.DebugLog("Ä¿±êûÓжÔÕ½¼Ç¼²»´¦Àí! tagPlayerID=%s" % tagPlayerID, playerID) return finalRecData = defRecMgr.At(defRecMgr.GetCount() - 1) if not GameWorld.CheckTimeIsSameWeek(finalRecData.GetTime()): GameWorld.DebugLog("Ä¿±ê±¾ÖÜûÓжÔÕ½¼Ç¼²»´¦Àí! tagPlayerID=%s" % tagPlayerID, playerID) return recData = defRecMgr.AddRecData(maxCount) SetRecAtkType(recData, RecAtkType_Def) SetRecTagPlayerID(recData, playerID) SetRecIsWin(recData, not isWin) SetRecFace(recData, curPlayer.GetFace()) SetRecFacePic(recData, curPlayer.GetFacePic()) SetRecRealmLV(recData, curPlayer.GetOfficialRank()) SetRecLV(recData, curPlayer.GetLV()) # Ãû×Ö¡¢×Ô¼ºÃû´Î¡¢¶Ô·½Ãû´Î recData.SetUserData({"Name":curPlayer.GetPlayerName(), "CurRank":tagRank, "TagRank":curRank}) return def GetQunyingRankHighestAward(curPlayer): rankHighest = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_QunyingRankHighest) awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_QunyingRankSuccAward) if not rankHighest: return GameWorld.DebugLog("ÁìȡȺӢ°ñÀúÊ·×î¸ßÅÅÃû³É¾Í½±Àø! rankHighest=%s,awardRecord=%s" % (rankHighest, awardRecord)) # Ê״δﵽxÃû³É¾Í½±Àø {"Ãû´Î":[[ÎïÆ·ID, ¸öÊý], ...], ...} rankAwardDict = IpyGameDataPY.GetFuncEvalCfg("QunyingAward", 3, {}) # Ê״δﵽxÃû³É¾Í½±Àø¼Ç¼Ë÷Òý {"Ãû´Î":¼Ç¼Ë÷Òý, ...}£¬¼Ç¼Ë÷Òý´Ó0¿ªÊ¼µÝÔö£¬ÉÏÏߺó²»ÄÜÐÞ¸Ä rankIndexDict = IpyGameDataPY.GetFuncEvalCfg("QunyingAward", 4, {}) awardItemDict = {} for rankStr, itemList in rankAwardDict.items(): rank = int(rankStr) if rankHighest > rank: GameWorld.DebugLog(" δ´ïµ½: rank=%s" % rank) continue if rankStr not in rankIndexDict: continue index = rankIndexDict[rankStr] if awardRecord&pow(2, index): GameWorld.DebugLog(" ÒÑÁìÈ¡: rank=%s" % rank) continue awardRecord |= pow(2, index) for itemInfo in itemList: itemID, itemCount = itemInfo[:2] awardItemDict[itemID] = awardItemDict.get(itemID, 0) + itemCount GameWorld.DebugLog(" ¿ÉÁìÈ¡: rank=%s,%s,%s" % (rank, itemList, awardItemDict)) awardItemList = [[itemID, itemCount] for itemID, itemCount in awardItemDict.items()] GameWorld.DebugLog(" awardRecord=%s,awardRecord=%s" % (awardRecord, awardItemList)) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_QunyingRankSuccAward, awardRecord) ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["QunyingRankHighest", False, {}]) Sync_QunyingInfo(curPlayer) # Áì½± return def OnProcess(curPlayer): CheckQunyingTicketRecover(curPlayer) return def CheckQunyingTicketRecover(curPlayer): ## ¼ì²éÌôÕ½Áî»Ö¸´ storeMax = IpyGameDataPY.GetFuncCfg("QunyingChallenge", 1) curTicket = PlayerControl.GetMoney(curPlayer, ShareDefine.TYPE_Price_QunyingTicket) lastRecoverTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_QunyingRecoverTime) if curTicket >= storeMax: if lastRecoverTime: GameWorld.DebugLog("ȺӢÌôÕ½ÁîÒÑÂú!") PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_QunyingRecoverTime, 0) Sync_QunyingInfo(curPlayer) # ÌôÕ½Áî»Ö¸´Âú return curTime = int(time.time()) passSeconds = curTime - lastRecoverTime if not lastRecoverTime or passSeconds < 0: GameWorld.DebugLog("ÖØÉèȺӢÌôÕ½Áî»Ö¸´Ê±¼ä!") PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_QunyingRecoverTime, curTime) Sync_QunyingInfo(curPlayer) return cdSeconds = IpyGameDataPY.GetFuncCfg("QunyingChallenge", 2) * 60 if passSeconds < cdSeconds: #GameWorld.DebugLog("ȺӢÌôÕ½Áî»Ö¸´CDÖÐ: passSeconds=%s < %s, lastRecoverTime=%s" % (passSeconds, cdSeconds, GameWorld.ChangeTimeNumToStr(lastRecoverTime))) return recoverCnt = passSeconds / cdSeconds recoverCnt = min(recoverCnt, storeMax - curTicket) updRecoverTime = curTime - passSeconds % cdSeconds PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_QunyingRecoverTime, updRecoverTime) GameWorld.DebugLog("»Ö¸´ÈºÓ¢ÌôÕ½Áî: %s,passSeconds=%s,Éϴλָ´:%s" % (recoverCnt, passSeconds, GameWorld.ChangeTimeNumToStr(lastRecoverTime))) PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_QunyingTicket, recoverCnt) if PlayerControl.GetMoney(curPlayer, ShareDefine.TYPE_Price_QunyingTicket) >= storeMax: GameWorld.DebugLog("ÒÑÂú!") PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_QunyingRecoverTime, 0) Sync_QunyingInfo(curPlayer) return #// B2 10 ȺӢ°ñÆ¥ÅäÍæ¼Ò #tagCSQunyingMatch # #struct tagCSQunyingMatch #{ # tagHead Head; # BYTE IsRefresh; // 0-´ò¿ª½çÃæÊ±²éѯ£¬1-Ç¿ÖÆË¢ÐÂÆ¥ÅäÁбí #}; def OnQunyingMatch(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) isRefresh = clientData.IsRefresh DoQunyingMatchRefresh(curPlayer, isRefresh) return def DoQunyingMatchRefresh(curPlayer, isRefresh, isSys=False): ## Íæ¼ÒË¢ÐÂÆ¥Åä¶ÔÊÖ playerID = curPlayer.GetPlayerID() GameWorld.DebugLog("ȺӢ°ñÍæ¼ÒË¢ÐÂÆ¥ÅäÁбí: isRefresh=%s,isSys=%s" % (isRefresh, isSys), playerID) billboardMgr = DBDataMgr.GetBillboardMgr() billBoard = billboardMgr.GetBillboard(ShareDefine.Def_BT_Qunying) if not billBoard: return layerIDList = billBoard.GetLayerIDList() idRankDict = billBoard.GetIDOrderDict() layerIDCnt = len(layerIDList) playerRank = idRankDict.get(playerID, layerIDCnt + 1) # δÉϰñĬÈÏ×î´óÃû´Î + 1 # Æ¥Åä¶ÔÏ󻺴æ if playerID not in PyGameData.g_qunyingPlayerMatchDict: PyGameData.g_qunyingPlayerMatchDict[playerID] = [] matchRankList = PyGameData.g_qunyingPlayerMatchDict[playerID] if not isRefresh and matchRankList: # ·ÇˢеIJ¢ÇÒÒѾ­ÓмǼµÄÖ±½Óͬ²½ GameWorld.DebugLog(" ·ÇË¢ÐÂÇÒÓÐÊý¾Ý£¬Ö±½Óͬ²½! matchRankList=%s" % matchRankList, playerID) __SyncQunyingMatchList(curPlayer, matchRankList, layerIDList) return # Æ¥Åä¿ÉÌôսĿ±ê¹æÔò {Íæ¼ÒÃû´Î:[[Ãû´Î²îÖµ, Æ¥Åäx¸ö], ...], ...} Ãû´Î²îÖµÖ§³ÖÕý¸º matchRuleDict = IpyGameDataPY.GetFuncEvalCfg("QunyingMatch", 1, {}) rankList = matchRuleDict.keys() rankList.sort() matchRuleList = [] for rank in rankList: if playerRank <= rank: matchRuleList = matchRuleDict[rank] break if not matchRuleList: matchRuleList = matchRuleDict[rankList[-1]] # ûÓÐĬÈÏÈ¡×îºóÒ»µµ matchRuleList.sort() GameWorld.DebugLog(" layerIDCnt=%s,playerRank=%s,matchRuleList=%s" % (layerIDCnt, playerRank, matchRuleList), playerID) if not matchRuleList: return if isRefresh and not isSys: refreshMax = IpyGameDataPY.GetFuncCfg("QunyingMatch", 3) if refreshMax: refreshCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_QunyingRefreshCnt) if refreshCnt >= refreshMax: GameWorld.DebugLog(" ÒÑ´ï×î´óˢдÎÊý! refreshCnt=%s >= %s" % (refreshCnt, refreshMax), playerID) return costMoney, moneyValue = IpyGameDataPY.GetFuncEvalCfg("QunyingMatch", 2) if not costMoney or not moneyValue or not PlayerControl.PayMoney(curPlayer, costMoney, moneyValue, "Qunying"): return if refreshMax: refreshCnt += 1 PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_QunyingRefreshCnt, refreshCnt) Sync_QunyingInfo(curPlayer) # Ë¢ÐÂÆ¥Åä matchRankList = [] # ÒòΪÓÐÌî³ä»úÆ÷ÈË£¬»úÆ÷ÈËID¿ÉÄÜÖØ¸´£¬¹Ì°´Ãû´ÎλÖÃÆ¥Åä [rank, ...] if 1 <= playerRank <= layerIDCnt: matchRankList.append(playerRank) # Íæ¼ÒÓÐÉϰñʱĬÈÏÒª°üº¬Íæ¼Ò×Ô¼º # [[Ãû´Î²îÖµ, Æ¥Åäx¸ö], ...] # µÚÒ»ÃûʱƥÅäʾÀý: [[50, 4]] # δÉϰñʱƥÅäʾÀý£º[[-500, 5]] # °ñµ¥ÖÐʱƥÅäʾÀý£º[[-300, 1], [-200, 1], [-100, 1],[100, 1]] for mIndex, matchRule in enumerate(matchRuleList): rankDiff, matchCnt = matchRule nextDiff = None if mIndex < len(matchRuleList) - 1: nextDiff = matchRuleList[mIndex + 1][0] if mIndex == 0: if rankDiff >= 0: # µÚ1¸ö¾Í¿ªÊ¼Æ¥ÅäºóÃæµÄ£¬Ö±½Ó´ÓÍæ¼ÒºóÒ»Ãû¿ªÊ¼£¬·ñÔòÖ±½Ó´ÓÓëÍæ¼ÒÃû´ÎµÄ²îÖµ¿ªÊ¼ fromRank = playerRank + 1 else: fromRank = playerRank + rankDiff # ·Ç×îºóÒ»µµµÄÇé¿ö if nextDiff != None: if rankDiff < 0 and nextDiff >= 0: toRank = playerRank - 1 # ²îÖµÕý¸º±ä¸ü£¬Ä¬ÈÏÒÔÍæ¼ÒÃû´Î·Öµµ else: toRank = fromRank + (nextDiff - rankDiff) - 1 # ~ ÓëÏÂÒ»µµµÄ²îÖµ # ×îºóÒ»µµ else: if rankDiff < 0: toRank = layerIDCnt else: toRank = fromRank + rankDiff - 1 fromRank = max(fromRank, 1) toRank = min(toRank, layerIDCnt) if fromRank > toRank: GameWorld.ErrLog("Æ¥Å乿ÔòÒì³£! mIndex=%s,fromRank=%s,toRank=%s,%s" % (mIndex, fromRank, toRank, matchRuleList)) break randRankList = range(fromRank, toRank + 1) random.shuffle(randRankList) rankCnt = len(randRankList) mCnt = 0 # ²»ÓÃÑé֤Ŀ±êID£¬ÔÊÐíÆ¥ÅäÖØ¸´µÄID£¬Ö»ÒªÆ¥ÅäµÄÄ¿±êÃû´Î²»Öظ´¼´¿É for randRank in randRankList: if randRank in matchRankList: continue tagID = layerIDList[randRank - 1] GameWorld.DebugLog(" Æ¥ÅäÃû´Î: %s ~ %s,%sÃû,randRank=%s,tagID=%s" % (fromRank, toRank, rankCnt, randRank, tagID), playerID) matchRankList.append(randRank) mCnt += 1 if mCnt >= matchCnt: break if toRank == playerRank - 1: fromRank = toRank + 2 else: fromRank = toRank + 1 if fromRank > layerIDCnt: break matchRankList.sort() GameWorld.DebugLog(" Æ¥ÅäÃû´Î½á¹û: matchRankList=%s" % (matchRankList), playerID) PyGameData.g_qunyingPlayerMatchDict[playerID] = matchRankList __SyncQunyingMatchList(curPlayer, matchRankList, layerIDList) return def __SyncQunyingMatchList(curPlayer, matchRankList, layerIDList): ## ͬ²½Æ¥ÅäÁбí layerIDCnt = len(layerIDList) clientPack = ChPyNetSendPack.tagSCQunyingMatchList() clientPack.MatchList = [] for rank in matchRankList: if rank <= 0 or rank > layerIDCnt: continue matchID = layerIDList[rank - 1] viewCache = PlayerViewCache.FindBattleViewCache(matchID) if not viewCache: continue matchInfo = ChPyNetSendPack.tagSCQunyingMatchInfo() matchInfo.Rank = rank matchInfo.PlayerID = matchID if viewCache: fightPower = TurnAttack.GetCacheLineupFightPower(viewCache, ShareDefine.BatPreset_QunyingDef) matchInfo.PlayerName = viewCache.GetPlayerName() matchInfo.RealmLV = viewCache.GetRealmLV() matchInfo.LV = viewCache.GetLV() matchInfo.Face = viewCache.GetFace() matchInfo.FacePic = viewCache.GetFacePic() matchInfo.FightPower = fightPower % ChConfig.Def_PerPointValue matchInfo.FightPowerEx = fightPower / ChConfig.Def_PerPointValue matchInfo.TitleID = viewCache.GetTitleID() matchInfo.ModelMark = viewCache.GetModelMark() matchInfo.EquipShowSwitch = viewCache.GetEquipShowSwitch() matchInfo.ServerID = viewCache.GetServerID() else: matchInfo.PlayerName = "p%s" % matchID clientPack.MatchList.append(matchInfo) clientPack.MatchCount = len(clientPack.MatchList) NetPackCommon.SendFakePack(curPlayer, clientPack) return def Sync_QunyingInfo(curPlayer): clientPack = ChPyNetSendPack.tagSCQunyingPlayerInfo() clientPack.RefreshCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_QunyingRefreshCnt) clientPack.LastRecoverTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_QunyingRecoverTime) clientPack.RankHighest = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_QunyingRankHighest) clientPack.RankSuccAward = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_QunyingRankSuccAward) NetPackCommon.SendFakePack(curPlayer, clientPack) return