#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.PlayerArena # # @todo:¾º¼¼³¡ - ±¾·þ # @author hxp # @date 2020-12-07 # @version 1.0 # # ÏêϸÃèÊö: ¾º¼¼³¡ - ±¾·þ # #------------------------------------------------------------------------------- #"""Version = 2020-12-07 19:30""" #------------------------------------------------------------------------------- import ShareDefine import GameFuncComm import PlayerControl import IpyGameDataPY import ChPyNetSendPack import NetPackCommon import GameWorld import ChConfig import FBCommon import IPY_GameWorld import ItemControler import EventShell import PlayerActTask import PlayerWeekParty import PlayerFeastTravel import PlayerActivity import PlayerSuccess import PlayerGubao def DoArenaOpen(curPlayer): ## ¾º¼¼³¡¹¦ÄÜ¿ªÆô __DoArenaSeasonReset(curPlayer) return def OnLogin(curPlayer): if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Arena): return OSSeasonState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaOSSeasonState) if not OSSeasonState: __DoArenaSeasonReset(curPlayer) else: Sync_ArenaInfo(curPlayer) return def OnDayEx(curPlayer): if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Arena): return PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaItemAddCount, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaBattleCountDay, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaMatchRefreshCount, 0) Sync_ArenaInfo(curPlayer) openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1 customMaxServerDay = IpyGameDataPY.GetFuncCfg("OperationAction", 1) if openServerDay <= customMaxServerDay: GameWorld.DebugLog("OnDayExʱ¾º¼¼³¡¿ª·þ¶¨ÖÆÈü¼¾½øÐÐÖУ¬²»´¦Àí! openServerDay=%s <= %s" % (openServerDay, customMaxServerDay)) return OSSeasonState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaOSSeasonState) if OSSeasonState > 1: GameWorld.DebugLog("OnDayExʱ¾º¼¼³¡¿ª·þ¶¨ÖÆÈü¼¾ÒѽáËã¹ý£¬²»´¦Àí! OSSeasonState=%s" % (OSSeasonState)) return __DoArenaSeasonReset(curPlayer) return def OnWeekEx(curPlayer): if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Arena): return openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1 customMaxServerDay = IpyGameDataPY.GetFuncCfg("OperationAction", 1) if openServerDay <= customMaxServerDay: GameWorld.DebugLog("OnWeekExʱÔÚ¿ª·þ¶¨ÖÆÌìÄÚ£¬²»´¦Àí¾º¼¼³¡Èü¼¾ÖØÖÃ! openServerDay=%s <= %s" % (openServerDay, customMaxServerDay)) return OSSeasonState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaOSSeasonState) if not OSSeasonState or OSSeasonState == 1 or OSSeasonState == openServerDay: GameWorld.DebugLog("OnWeekExʱ¾º¼¼³¡¿ª·þ¶¨ÖÆÈü¼¾½øÐÐÖлòͬһÌì½áË㣬²»´¦ÀíÖØÖÃ! openServerDay=%s,OSSeasonState=%s" % (openServerDay, OSSeasonState)) return __DoArenaSeasonReset(curPlayer) return def __DoArenaSeasonReset(curPlayer): ## Íæ¼ÒÖØÖþº¼¼³¡ OSSeasonState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaOSSeasonState) openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1 customMaxServerDay = IpyGameDataPY.GetFuncCfg("OperationAction", 1) if openServerDay <= customMaxServerDay and OSSeasonState != 0: GameWorld.DebugLog("¿ª·þ¶¨ÖÆÌìÄÚ²»ÄÜÖØÖã¡") return setScoreMin, setScoreMax, refScoreMax = IpyGameDataPY.GetFuncEvalCfg("ArenaSet", 2) setScore = setScoreMin if openServerDay <= customMaxServerDay and OSSeasonState == 0: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaOSSeasonState, 1) GameWorld.DebugLog("¾º¼¼³¡¿ª·þ¶¨ÖÆÈü¼¾£¡ setScore=%s" % setScore) else: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaOSSeasonState, customMaxServerDay + 1) preSeasonscore = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaScore) if preSeasonscore <= setScoreMin: setScore = setScoreMin elif preSeasonscore >= refScoreMax: setScore = setScoreMax else: # °´±ÈÀý½µµÍ»ý·Ö£¬¶¼¼õÈ¥×îµÍ·ÖµÄ²îÖµËã±ÈÀý calcScore = preSeasonscore - setScoreMin setScore = setScoreMin + int(calcScore * (setScoreMax - setScoreMin) / float(refScoreMax - setScoreMin)) GameWorld.DebugLog("¾º¼¼³¡Èü¼¾ÖØÖã¡ preSeasonscore=%s,setScore=%s" % (preSeasonscore, setScore)) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaScore, setScore) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaItemAddCount, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaBattleCountDay, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaMatchRefreshCount, 0) Sync_ArenaInfo(curPlayer, True) return def CheckArenaBattleCount(curPlayer): ## ÑéÖ¤ÊÇ·ñ»¹ÓжÔÕ½´ÎÊý todayBattleCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaBattleCountDay) itemAddCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaItemAddCount) dayFreeCount = IpyGameDataPY.GetFuncCfg("ArenaSet", 3) return todayBattleCount < (dayFreeCount + itemAddCount) #// B2 09 ¾º¼¼³¡Æ¥ÅäÍæ¼Ò #tagCMArenaMatch # #struct tagCMArenaMatch #{ # tagHead Head; # BYTE IsRefresh; // 0-´ò¿ª½çÃæÎÞÆ¥ÅäÊý¾Ýʱʱ²éѯ£¬1-Ç¿ÖÆË¢ÐÂÆ¥ÅäÁбí #}; def OnArenaMatch(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) isRefresh = clientData.IsRefresh playerID = curPlayer.GetPlayerID() refreshCountLimit = IpyGameDataPY.GetFuncCfg("ArenaSet", 5) if isRefresh and refreshCountLimit: refreshCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaMatchRefreshCount) if refreshCount >= refreshCountLimit: GameWorld.DebugLog("¾º¼¼³¡Ë¢ÐÂÆ¥ÅäÍæ¼Ò´ÎÊýÒÑÂú£¡refreshCount=%s >= %s" % (refreshCount, refreshCountLimit), playerID) return if not GameWorld.SetPlayerTickTime(curPlayer, ChConfig.TYPE_Player_Tick_Arena, tick): GameWorld.DebugLog("¾º¼¼³¡Æ¥Åä²Ù×÷CDÖÐ...", playerID) PlayerControl.NotifyCode(curPlayer, "RequestLater") return playerLV = curPlayer.GetLV() playerScore = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaScore) msgInfo = str(["MatchRefresh", {"isRefresh":isRefresh, "playerLV":playerLV, "playerScore":playerScore}]) GameWorld.DebugLog("¾º¼¼³¡·¢ËÍGameServerÆ¥Åä: %s" % msgInfo, playerID) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "Arena", msgInfo, len(msgInfo)) return def GMArenaMatch(curPlayer, gmMatchIDList): playerID = curPlayer.GetPlayerID() playerLV = curPlayer.GetLV() playerScore = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaScore) msgInfo = str(["MatchRefresh", {"isRefresh":1, "playerLV":playerLV, "playerScore":playerScore, "gmMatchIDList":gmMatchIDList}]) GameWorld.DebugLog("¾º¼¼³¡·¢ËÍGameServerÆ¥Åä: %s" % msgInfo, playerID) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "Arena", msgInfo, len(msgInfo)) return #// B2 10 ¾º¼¼³¡ÌôÕ½Íæ¼Ò #tagCMArenaBattle # #struct tagCMArenaBattle #{ # tagHead Head; # DWORD TagPlayerID; // Ä¿±êÍæ¼ÒID»ò»úÆ÷ÈËID # BYTE Result; // 0-½øÈë×Ô¶¨Ò峡¾°·¢ËÍ֪ͨºó¶Ë£»1-ʤÀû£¨ºó¶Ë´¦Àí£¬ÔÝʱ²»ÐèÒª·¢ËÍ´Ë״̬£©£»2-ʧ°Ü£¨Ç°¶Ë±»¶ÔÊÖ»÷ɱÐèÒª·¢ËÍ´Ë״̬£© #}; def OnArenaBattle(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() tagPlayerID = clientData.TagPlayerID result = clientData.Result GameWorld.DebugLog("¾º¼¼³¡ÌôÕ½Íæ¼Ò! tagPlayerID=%s,result=%s" % (tagPlayerID, result), playerID) if not tagPlayerID: return if not result: GameWorld.DebugLog("¸üоº¼¼³¡¶ÔÕ½¶ÔÊÖID! tagPlayerID=%s" % tagPlayerID, playerID) # ¼Ç¼¶ÔÊÖID PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaBattleTagID, tagPlayerID) return isWin = 1 if result == 1 else 0 # # ľ׮±»»÷ɱ£¬ºó¶ËÅжϣ¬ÆäËûǰ¶Ëͬ²½ # if isWin: # GameWorld.ErrLog("ǰ¶Ë²»ÄÜͬ²½¾º¼¼³¡Ê¤Àû״̬£¡", playerID) # return recTagPlayerID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaBattleTagID) if tagPlayerID != recTagPlayerID: GameWorld.ErrLog("¾º¼¼³¡½áËãʱ¶ÔÊÖID²»Ò»ÖÂ! tagPlayerID(%s) != recTagPlayerID(%s)" % (tagPlayerID, recTagPlayerID), playerID) __DoArenaBattleOver(curPlayer) return # ʧ°Ü½áËãÈë¿Ú£º ǰ¶Ëͬ²½ SendGameServer_ArenaBattleOver(curPlayer, isWin) return def OnKillBattleNPC(curPlayer, curNPC): # ## »÷ɱ¶ÔÊÖ£¬Ç°¶Ë±¾£¬Ê¹ÓÃľ׮NPC×÷Ϊ¶ÔÊÖ # # if curNPC.GetGameObjType() != IPY_GameWorld.gotNPC or curNPC.GetType() not in [ChConfig.ntPriWoodPilePVE, ChConfig.ntPriWoodPilePVP]: # GameWorld.DebugLog("»÷ɱ·Çľ׮NPC£¬²»½áËã!") # return # # # ʤÀû½áËãÈë¿Ú£ººó¶ËÑéÖ¤»÷ɱ¶ÔÊÖ # tagPlayerID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaBattleTagID) # GameWorld.DebugLog("¾º¼¼³¡»÷ɱ¶ÔÊÖ! tagPlayerID=%s" % tagPlayerID, curPlayer.GetPlayerID()) # isWin = 1 # SendGameServer_ArenaBattleOver(curPlayer, isWin) return def SendGameServer_ArenaBattleOver(curPlayer, isWin): ## ·¢ËÍGameServer֪ͨս¶·½áËã playerID = curPlayer.GetPlayerID() tagPlayerID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaBattleTagID) if not tagPlayerID: GameWorld.ErrLog("¾º¼¼³¡½áËãʱûÓжÔÊÖID!", playerID) __DoArenaBattleOver(curPlayer) return if not CheckArenaBattleCount(curPlayer): GameWorld.ErrLog("¾º¼¼³¡ÒѾ­Ã»ÓжÔÕ½´ÎÊý!", playerID) __DoArenaBattleOver(curPlayer) return tick = GameWorld.GetGameWorld().GetTick() if not GameWorld.SetPlayerTickTime(curPlayer, ChConfig.TYPE_Player_Tick_Arena, tick): GameWorld.ErrLog("½áË㾺¼¼³¡CDÖУ¡tagPlayerID=%s" % tagPlayerID, playerID) return playerLV = curPlayer.GetLV() playerScore = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaScore) msgInfo = str(["BattleResult", {"tagPlayerID":tagPlayerID, "isWin":isWin, "playerLV":playerLV, "playerScore":playerScore, "realmLV":curPlayer.GetOfficialRank(), "fightPower":PlayerControl.GetFightPower(curPlayer)}]) GameWorld.DebugLog("¾º¼¼³¡·¢ËÍGameServer½áËã: %s" % msgInfo, playerID) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "Arena", msgInfo, len(msgInfo)) return def __DoArenaBattleOver(curPlayer, retDict={}): ## Ö÷¶¯Õ½¶·½áËã½±Àø # @param isOK: Trueʱ²Å½áËã½±Àø£¬·ÀֹijЩÒì³£Çé¿öÎÞ·¨½áËã֪ͨǰ¶ËFBOver£¬µ¼Ö¿¨¸±±¾ GameWorld.DebugLog("½áË㾺¼¼³¡¶ÔÕ½½±Àø! retDict=%s" % retDict) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaBattleTagID, 0) isOK = retDict.get("isOK", False) isWin = retDict.get("isWin", 0) if not isOK: # Ò»Ö±Òì³£µÄÇé¿öÖ±½Óͬ²½½áÊø°ü£¬·ÀÖ¹²»½áË㿨¸±±¾ FBCommon.NotifyFBOver(curPlayer, ChConfig.Def_FBMapID_ArenaBattle, 0, isWin) return #GameServer MapServer ͬ²½ÓÐÒ»¶¨Ê±¼ä²î£¬±¾¹¦ÄÜ´æÔÚ±»¶¯ÌôÕ½Òý·¢»ý·Ö±ä¶¯µÄÇé¿ö£¬ #curScore = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaScore) addScore = retDict["addScore"] updScore = retDict["updScore"] curOrder = retDict["curOrder"] updOrder = retDict["updOrder"] # ¿Û´ÎÊý todayBattleCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaBattleCountDay) + 1 PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaBattleCountDay, todayBattleCount) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaMatchRefreshCount, 0) # ¸üлý·Ö PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaScore, updScore) highestScore = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaHighestScore) if updScore > highestScore: highestScore = updScore PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaHighestScore, highestScore) GameWorld.DebugLog(" ¸üоº¼¼³¡ÀúÊ·×î¸ß·Ö! %s" % highestScore) # ʤÀû¸ø¶îÍâ½±Àø itemList = retDict.get("awardItemList", []) ItemControler.GivePlayerItemOrMail(curPlayer, itemList) jsonItemList = FBCommon.GetJsonItemList(itemList) overDict = {FBCommon.Over_itemInfo:jsonItemList, "addScore":addScore, "updScore":updScore, "curOrder":curOrder, "updOrder":updOrder} FBCommon.NotifyFBOver(curPlayer, ChConfig.Def_FBMapID_ArenaBattle, 0, isWin, overDict) Sync_ArenaInfo(curPlayer) # ´¥·¢ÈÎÎñ EventShell.EventRespons_ArenaBattleOver(curPlayer) EventShell.EventRespons_ArenaHighestScore(curPlayer) PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Arena, 1) PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_Arena, 1) PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_Arena, 1) PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Arena, 1) PlayerGubao.AddGubaoItemEffValue(curPlayer, PlayerGubao.GubaoEffType_Arena, 1) PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_Arena) return def __DoUpdateArenaScore(curPlayer, cmdDict={}): ''' Íæ¼ÒÖ±½Ó¸üлý·Ö£¬ÓÐÒÔϼ¸ÖÖÇé¿ö£¬¶¼ÊDZ»ÌôÕ½µÄ£¬Ö»¸üлý·Ö 1. ±»¶¯ÌôÕ½ÔÚÏßʱֱ½Ó¸üлý·Ö 2. ÀëÏß/ÍÑ»úʱ±»ÌôÕ½£¬ÉÏÏߺóͬ²½×îлý·Ö ''' playerScore = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaScore) updScore = cmdDict.get("updScore", playerScore) if updScore == playerScore: return PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaScore, updScore) Sync_ArenaInfo(curPlayer) return def GameServer_ArenaResult(curPlayer, msgList, tick): if not msgList: return cmd = msgList[0] cmdDict = msgList[1] if len(msgList) > 1 else {} retDict = msgList[2] if len(msgList) > 2 else {} # Ë¢ÐÂÆ¥Åä if cmd == "MatchRefresh": isRefresh = cmdDict.get("isRefresh", False) refreshCountLimit = IpyGameDataPY.GetFuncCfg("ArenaSet", 5) if isRefresh and refreshCountLimit: updRefreshCount = min(250, curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaMatchRefreshCount) + 1) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaMatchRefreshCount, updRefreshCount) GameWorld.DebugLog("¸üоº¼¼³¡Ë¢ÐÂÆ¥Åä´ÎÊý! updRefreshCount=%s" % updRefreshCount) Sync_ArenaInfo(curPlayer) # Ö÷¶¯¶ÔÕ½½á¹û elif cmd == "BattleResult": __DoArenaBattleOver(curPlayer, retDict) # ±»¶¯ÌôÕ½¸üлý·Ö elif cmd == "UpdScore": __DoUpdateArenaScore(curPlayer, cmdDict) return def Sync_ArenaInfo(curPlayer, isReset=False): clientPack = ChPyNetSendPack.tagMCArenaPlayerInfo() clientPack.IsReset = 1 if isReset else 0 clientPack.Score = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaScore) clientPack.BattleCountToday = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaBattleCountDay) clientPack.MatchRefreshCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaMatchRefreshCount) clientPack.ItemAddBattleCountToday = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaItemAddCount) NetPackCommon.SendFakePack(curPlayer, clientPack) return