#!/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
|
|
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
|
|
minScore, maxScore = IpyGameDataPY.GetFuncEvalCfg("ArenaSet", 1)
|
setScore = minScore
|
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)
|
|
# °´±ÈÀý½µµÍ»ý·Ö£¬¶¼¼õÈ¥×îµÍ·ÖµÄ²îÖµËã±ÈÀý
|
setScoreMax = IpyGameDataPY.GetFuncCfg("ArenaSet", 2)
|
preSeasonscore = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaScore)
|
if preSeasonscore <= minScore:
|
setScore = minScore
|
elif preSeasonscore >= maxScore:
|
setScore = setScoreMax
|
else:
|
calcScore = preSeasonscore - minScore
|
setScore = minScore + int(calcScore * (setScoreMax - minScore) / float(maxScore - minScore))
|
|
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)
|
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
|
|