#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.PlayerArena # # @todo:ÑÝÎ䳡 # @author hxp # @date 2025-09-12 # @version 1.0 # # ÏêϸÃèÊö: ÑÝÎ䳡 # #------------------------------------------------------------------------------- #"""Version = 2025-09-12 10:30""" #------------------------------------------------------------------------------- import DBDataMgr import PlayerMail import ShareDefine import GameFuncComm import PlayerControl import IpyGameDataPY import ChPyNetSendPack import PlayerViewCache import NetPackCommon import PyGameData import GameWorld import ChConfig import random # ¼Ç¼¹¥»÷ÀàÐÍ RecAtkType_Atk = 1 # ·¢Æð¹¥»÷ RecAtkType_Def = 2 # ±»¹¥»÷µÄ def GetRecUpdScore(recData): return recData.GetValue1() # ¸üлý·Ö def SetRecUpdScore(recData, score): return recData.SetValue1(score) 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(): DoArenaReset() return def OnDay(): __DoGiveBillboardAward("Day") return def DoArenaReset(): ''' Èü¼¾ÖØÖà ''' GameWorld.Log("=============== ÖØÖþº¼¼³¡ ===============") PyGameData.g_arenaPlayerMatchDict = {} # ½áËãÉÏÈü¼¾ÅÅÐн±Àø __DoGiveBillboardAward("Week") # ÖØÖÃÅÅÐаñ DBDataMgr.GetBillboardMgr().RemoveBillboard(ShareDefine.Def_BT_Arena) # ÖØÖüǼ #DBDataMgr.GetGameRecMgr().DelDataByType(ShareDefine.Def_GameRecType_ArenaRecord) # ÌôÕ½¼Ç¼²»ÖØÖà GameWorld.Log("==========================================") return True def __DoGiveBillboardAward(awardType): ## ¾º¼¼³¡½áËãÅÅÐн±Àø£¬ ÿÈÕ¡¢Èü¼¾Í¨Óà GameWorld.Log("=== ¾º¼¼³¡½áËãÅÅÐн±Àø! === %s" % awardType) billboardMgr = DBDataMgr.GetBillboardMgr() billBoard = billboardMgr.GetBillboard(ShareDefine.Def_BT_Arena) if not billBoard: return if awardType == "Day": billboradAwardDict = IpyGameDataPY.GetFuncEvalCfg("ArenaBillboradAward", 1, {}) elif awardType == "Week": billboradAwardDict = IpyGameDataPY.GetFuncEvalCfg("ArenaBillboradAward", 2, {}) else: return orderList = [int(orderStr) for orderStr in billboradAwardDict.keys()] orderList.sort() GameWorld.Log(" ½±ÀøÃû´ÎÁбí: %s" % orderList) awardOrder = orderList[0] orderPlayerIDDict = {} billboardCount, billboardMaxCount = billBoard.GetCount(), billBoard.GetMaxCount() GameWorld.Log(" °ñµ¥Êý¾ÝÊý! billboardCount=%s,billboardMaxCount=%s" % (billboardCount, billboardMaxCount)) for index in xrange(billboardCount): billBoardData = billBoard.At(index) if not billBoardData: continue order = index + 1 if order > awardOrder: nextOrderIndex = orderList.index(awardOrder) + 1 if nextOrderIndex >= len(orderList): break awardOrder = orderList[nextOrderIndex] playerID = billBoardData.GetID() if playerID < ShareDefine.RealPlayerIDStart: # ·ÇÕæÈ˲»´¦Àí continue orderPlayerIDDict[playerID] = [order, awardOrder] paramList = [order] awardList = billboradAwardDict[str(awardOrder)] PlayerMail.SendMailByKey("ArenaBillboardAward%s" % awardType, playerID, awardList, paramList) GameWorld.Log(" ½±ÀøÍæ¼ÒÃû´ÎÐÅÏ¢: %s" % orderPlayerIDDict) return def OnLogin(curPlayer): if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Arena): return __loginUpdPlayerScore(curPlayer) Sync_ArenaInfo(curPlayer) return def __loginUpdPlayerScore(curPlayer): playerID = curPlayer.GetPlayerID() recMgr = DBDataMgr.GetGameRecMgr() recIDMgr = recMgr.GetRecTypeIDMgr(ShareDefine.Def_GameRecType_ArenaRecord, playerID) if not recIDMgr.GetCount(): return finalRecData = recIDMgr.At(recIDMgr.GetCount() - 1) recTime = finalRecData.GetTime() if not GameWorld.CheckTimeIsSameWeek(recTime): GameWorld.Log("Íæ¼ÒÉÏÏßÑÝÎ䳡¼Ç¼»ý·Ö·Ç±¾Öܲ»¸üÐÂ! recTime=%s" % GameWorld.ChangeTimeNumToStr(recTime), playerID) return updScore = GetRecUpdScore(finalRecData) befScore = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaScore) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaScore, updScore) GameWorld.Log("Íæ¼ÒÉÏÏ߸üÐÂÑÝÎ䳡»ý·Ö: befScore=%s,updScore=%s,recTime=%s" % (befScore, updScore, GameWorld.ChangeTimeNumToStr(recTime)), playerID) return def OnDayEx(curPlayer): if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Arena): return Sync_ArenaInfo(curPlayer) return def OnWeekEx(curPlayer): if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Arena): return __DoArenaSeasonReset(curPlayer) return def DoArenaOpen(curPlayer): __DoArenaSeasonReset(curPlayer) return def __DoArenaSeasonReset(curPlayer): ## Íæ¼ÒÖØÖþº¼¼³¡ initScore = IpyGameDataPY.GetFuncCfg("ArenaSet", 1) GameWorld.DebugLog("¾º¼¼³¡Èü¼¾ÖØÖã¡initScore=%s" % (initScore)) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaScore, initScore) Sync_ArenaInfo(curPlayer) return def GetArenaTicketStoreMax(curPlayer): ## »ñÈ¡Ìôսȯ´æ´¢ÉÏÏÞ baseCnt = IpyGameDataPY.GetFuncCfg("ArenaSet", 3) # ÆäËûÌØÈ¨ÌáÉýÉÏÏÞ storeMax = baseCnt return storeMax #// B2 09 ÑÝÎ䳡ƥÅäÍæ¼Ò #tagCSArenaMatch # #struct tagCSArenaMatch #{ # tagHead Head; # BYTE IsRefresh; // 0-´ò¿ª½çÃæÎÞÆ¥ÅäÊý¾Ýʱ²éѯ£¬1-Ç¿ÖÆË¢ÐÂÆ¥ÅäÁбí #}; def OnArenaMatch(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) isRefresh = clientData.IsRefresh DoArenaMatchRefresh(curPlayer, isRefresh) return def GMArenaMatch(curPlayer, gmMatchIDList): ## GMÖ±½ÓÆ¥Åä isRefresh = True DoArenaMatchRefresh(curPlayer, isRefresh, gmMatchIDList) return def DoArenaMatchRefresh(curPlayer, isRefresh, gmMatchIDList=None, isSys=False): ## Íæ¼ÒË¢ÐÂÆ¥Åä¶ÔÊÖ playerID = curPlayer.GetPlayerID() playerScore = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaScore) matchScoreList = IpyGameDataPY.GetFuncEvalCfg("ArenaMatch", 1) GameWorld.DebugLog("¾º¼¼³¡Íæ¼ÒË¢ÐÂÆ¥ÅäÁбí: isRefresh=%s,playerScore=%s,gmMatchIDList=%s,isSys=%s" % (isRefresh, playerScore, gmMatchIDList, isSys), playerID) GameWorld.DebugLog(" matchScoreList=%s" % (matchScoreList), playerID) # Æ¥Åä¶ÔÏ󻺴æ needMatchCount = len(matchScoreList) if playerID not in PyGameData.g_arenaPlayerMatchDict: PyGameData.g_arenaPlayerMatchDict[playerID] = [] matchIDList = PyGameData.g_arenaPlayerMatchDict[playerID] if len(matchIDList) > needMatchCount: matchIDList = matchIDList[:needMatchCount] # ɾ³ý¶àÓàµÄ¸öÊý£¬Ò»°ã¶¼ÊÇÏàͬµÄ£¬³ý·ÇÐÞ¸ÄÆ¥ÅäÊýÖØ¶ÁÅäÖà if not isRefresh and len(matchIDList) == needMatchCount: # ·ÇˢеIJ¢ÇÒÒѾ­ÓмǼµÄÖ±½Óͬ²½ GameWorld.DebugLog(" ·ÇË¢ÐÂÇÒÓÐÊý¾Ý£¬Ö±½Óͬ²½£¡", playerID) __SyncMatchList(curPlayer, matchIDList) return if isRefresh and not gmMatchIDList and not isSys: costMoney, moneyValue = IpyGameDataPY.GetFuncEvalCfg("ArenaMatch", 4) if not costMoney or not moneyValue or not PlayerControl.PayMoney(curPlayer, costMoney, moneyValue, "Arena"): return billboardMgr = DBDataMgr.GetBillboardMgr() billBoard = billboardMgr.GetBillboard(ShareDefine.Def_BT_Arena) if not billBoard: return maxOrder = billBoard.GetCount() playerOrder = billBoard.IndexOfByID(playerID) + 1 # Íæ¼ÒÔÚÅÅÐаñÖеÄÃû´Î£¬Ã»ÓÐÃû´ÎΪ-1 matchRobotCntDict = IpyGameDataPY.GetFuncEvalCfg("ArenaMatch", 3) if playerOrder > 0: matchRobotRange = GameWorld.GetOrderValueByDict(matchRobotCntDict, playerOrder) matchRobotCnt = random.randint(matchRobotRange[0], matchRobotRange[1]) else: matchRobotCnt = needMatchCount matchPlayerCnt = needMatchCount - matchRobotCnt GameWorld.DebugLog(" maxOrder=%s,playerOrder=%s,matchRobotCnt=%s,matchPlayerCnt=%s" % (maxOrder, playerOrder, matchRobotCnt, matchPlayerCnt), playerID) fromLowerCnt, matchPerRank = IpyGameDataPY.GetFuncEvalCfg("ArenaMatch", 2) toOrder = playerOrder + fromLowerCnt * matchPerRank # ´ÓµÍÃû´ÎÍù¸ßÃû´ÎÆ¥Åä GameWorld.DebugLog(" fromLowerCnt=%s,matchPerRank=%s,toOrder=%s" % (fromLowerCnt, matchPerRank, toOrder), playerID) matchOrderList = [] # Æ¥Åäµ½µÄÃû´Î for _ in range(matchPlayerCnt): fromOrder = max(1, toOrder - matchPerRank) if toOrder <= fromOrder: break orderList = range(fromOrder, toOrder) random.shuffle(orderList) if playerOrder in orderList: orderList.remove(playerOrder) # ²»°üº¬×Ô¼º if not orderList: break if fromOrder == 1: for order in orderList: if order > maxOrder: continue matchOrderList.append(order) if len(matchOrderList) >= matchPlayerCnt: break else: order = orderList[0] if order <= maxOrder: matchOrderList.append(order) GameWorld.DebugLog(" Æ¥ÅäÍæ¼Ò: fromOrder=%s,toOrder=%s,matchOrderList=%s" % (fromOrder, toOrder, matchOrderList), playerID) toOrder = fromOrder - 1 # GMÖ¸¶¨Æ¥Åä²âÊÔ if gmMatchIDList != None and curPlayer.GetGMLevel(): for gmMatchID in gmMatchIDList: if gmMatchID == playerID: GameWorld.DebugAnswer(curPlayer, "Ä¿±êID²»ÄÜÊÇ×Ô¼º!ÎÞ·¨Æ¥Åä!%s" % gmMatchID) continue gmMatchOrder = billBoard.IndexOfByID(gmMatchID) + 1 if gmMatchOrder <= 0: GameWorld.DebugAnswer(curPlayer, "Ä¿±êID²»ÔÚ°ñµ¥ÉÏ!ÎÞ·¨Æ¥Åä!%s" % gmMatchID) continue GameWorld.DebugAnswer(curPlayer, "Ö¸¶¨Æ¥ÅäID(%s),order(%s)" % (gmMatchID, gmMatchOrder)) if gmMatchID not in matchOrderList: matchOrderList.insert(0, gmMatchOrder) matchOrderList = matchOrderList[:needMatchCount] matchOrderList.sort() matchIDList = [] # ×îÖÕÆ¥ÅäµÄÍæ¼ÒIDÁбí for matchOrder in matchOrderList: if matchOrder > maxOrder or matchOrder <= 0: break billData = billBoard.At(matchOrder - 1) matchIDList.append(billData.GetID()) needRobotCnt = needMatchCount - len(matchIDList) GameWorld.DebugLog(" Æ¥Åä°ñµ¥½á¹û: matchIDList=%s,matchOrderList=%s,needRobotCnt=%s" % (matchIDList, matchOrderList, needRobotCnt), playerID) ipyDataMgr = IpyGameDataPY.IPY_Data() robotMax = ipyDataMgr.GetRobotCount() doCnt = 100 while doCnt > 0 and needRobotCnt > 0 and robotMax: doCnt -= 1 robotIndex = random.randint(0, robotMax - 1) robotIpyData = ipyDataMgr.GetRobotByIndex(robotIndex) robotID = robotIpyData.GetID() if robotID not in matchIDList: matchIDList.append(robotID) needRobotCnt -= 1 GameWorld.DebugLog(" ×îÖÕÆ¥Åä½á¹û: matchIDList=%s" % matchIDList, playerID) PyGameData.g_arenaPlayerMatchDict[playerID] = matchIDList __SyncMatchList(curPlayer, matchIDList) return def __SyncMatchList(curPlayer, matchIDList): ## ͬ²½Æ¥ÅäÁбí clientPack = ChPyNetSendPack.tagSCArenaMatchList() clientPack.MatchList = [] for matchID in matchIDList: viewCache = PlayerViewCache.FindViewCache(matchID) matchInfo = ChPyNetSendPack.tagSCArenaMatchInfo() matchInfo.PlayerID = matchID if viewCache: matchInfo.PlayerName = viewCache.GetPlayerName() matchInfo.RealmLV = viewCache.GetRealmLV() matchInfo.Face = viewCache.GetFace() matchInfo.FacePic = viewCache.GetFacePic() matchInfo.FightPower = viewCache.GetFightPower() matchInfo.FightPowerEx = viewCache.GetFightPowerEx() else: matchInfo.PlayerName = "p%s" % matchID clientPack.MatchList.append(matchInfo) clientPack.MatchCount = len(clientPack.MatchList) NetPackCommon.SendFakePack(curPlayer, clientPack) return def Sync_ArenaInfo(curPlayer): clientPack = ChPyNetSendPack.tagSCArenaPlayerInfo() clientPack.Score = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaScore) NetPackCommon.SendFakePack(curPlayer, clientPack) return