From 5cbc408e220dbac176850b1b250e42bfac67e274 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 22 四月 2025 11:10:21 +0800
Subject: [PATCH] 10263 【英文】【BT】【越南】【砍树】后端支持NPC仿真实玩家战斗和快速战斗(暂时屏蔽MirrorAIAtkDepthError警告邮件;)
---
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py | 719 ++++++++++++++++++++++++++++++++++++++++-------------------
1 files changed, 480 insertions(+), 239 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py
index 3e6f773..fceab63 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py
@@ -29,6 +29,8 @@
import PlayerControl
import PyDataManager
import NetPackCommon
+import GameXiangong
+import GameWorship
import PyGameData
import ChConfig
import PlayerFB
@@ -36,6 +38,7 @@
import datetime
import random
import time
+import json
Def_CrossChampionshipPlayerMax = 64 # 最大玩家数
Def_CrossChampionshipPlayerWFCount = 8 # 胜负排位所需玩家数
@@ -50,6 +53,7 @@
value3:playerIDA 玩家IDA
value4:playerIDB 玩家IDB
value5:winPlayerID 获胜玩家ID
+strValue3:battleDict 镜像PK场次结果 {"玩家ID":[[第1场胜负,加积分,...], ...], ...}
'''
Def_RecType_CrossChampionshipGuess = ShareDefine.Def_UniversalGameRecType_CrossChampionshipGuess
@@ -61,6 +65,7 @@
value3:guessPlayerID 竞猜玩家ID
value4:tagPlayerID 目标玩家ID
value5:moneyTotal 投注总货币值
+StrValue1:isClose 是否已结算
'''
Def_RecType_CrossChampionshipOfficial = ShareDefine.Def_UniversalGameRecType_CrossChampionshipOfficial
@@ -68,10 +73,11 @@
跨服排位争霸赛最终排名官职信息
ShareDefine.Def_UniversalGameRecType_CrossChampionshipOfficial
time:time 上一次辞退下级仙官时间
-value1:zoneID官职ID 官职ID*10 + 分区ID
+value1:官职ID 官职ID
value2:playerID 玩家ID,可能为0
value3:worshipValue 被膜拜次数*10 + 是否双倍
value4:rank 排名
+value5:zoneID 分区ID
StrValue3: [申请该官职玩家ID,...]
'''
@@ -79,7 +85,8 @@
'''
跨服排位争霸赛官职挑战信息
ShareDefine.Def_UniversalGameRecType_CrossChampionshipOffChallenge
-value1:zoneID官职ID 官职ID*10 + 分区ID
+value1:官职ID 官职ID
+value2:zoneID 分区ID
StrValue3: {挑战玩家信息key:value, ...}
'''
@@ -109,6 +116,8 @@
self.lv = 0
self.fightPower = 0
self.realmLV = 0
+ self.face = 0
+ self.facePic = 0
return
def GetString(self):
@@ -123,9 +132,11 @@
playerShortInfo["LV"] = cacheDict.get("LV", 1)
playerShortInfo["FightPower"] = cacheDict.get("FightPower", 0)
playerShortInfo["RealmLV"] = cacheDict.get("RealmLV", 0)
+ playerShortInfo["Face"] = cacheDict.get("Face", 0)
+ playerShortInfo["FacePic"] = cacheDict.get("FacePic", 0)
self.applyPlayerInfo[applyPlayerID] = playerShortInfo
return {"zoneID":self.zoneID, "officialID":self.officialID, "lastDismissJuniorTime":self.lastDismissJuniorTime,
- "accID":self.accID, "playerID":self.playerID, "playerName":self.playerName,
+ "accID":self.accID, "playerID":self.playerID, "playerName":self.playerName, "face":self.face, "facePic":self.facePic,
"job":self.job, "lv":self.lv, "fightPower":self.fightPower, "realmLV":self.realmLV, "rank":self.rank,
"worshipCount":self.worshipCount, "applyPlayerInfo":self.applyPlayerInfo, "challengeList":self.challengeList,
"worshipDouble":self.worshipDouble
@@ -180,6 +191,7 @@
self.tagPlayerID = 0 # 目标玩家ID
self.moneyTotal = 0 # 投注总货币值
self.guessRank = 0 # 竞猜名次,没有名次的竞猜默认0;1-代表第一名
+ self.isClose = 0 # 是否已结算
return
def GetString(self):
@@ -204,11 +216,13 @@
self.lv = 0
self.fightPower = 0
self.realmLV = 0
+ self.face = 0
+ self.facePic = 0
return
def GetString(self):
return {"zoneID":self.zoneID, "accID":self.accID, "playerID":self.playerID, "playerName":self.playerName,
- "job":self.job, "lv":self.lv, "fightPower":self.fightPower, "realmLV":self.realmLV}
+ "job":self.job, "lv":self.lv, "fightPower":self.fightPower, "realmLV":self.realmLV, "face":self.face, "facePic":self.facePic}
def SetAttr(self, attrDict):
for k, v in attrDict.items():
@@ -226,6 +240,7 @@
self.playerIDA = 0
self.playerIDB = 0
self.winPlayerID = 0
+ self.playerBatDict = {} # 镜像PK场次结果 {"玩家ID":[[第1场胜负,加积分,...], ...], ...}
# 不存档
self.roomID = 0
@@ -235,7 +250,7 @@
def GetString(self):
return {"overTime":self.overTime, "zoneID":self.zoneID, "groupMark":self.groupMark, "battleNum":self.battleNum,
- "playerIDA":self.playerIDA, "playerIDB":self.playerIDB, "winPlayerID":self.winPlayerID}
+ "playerIDA":self.playerIDA, "playerIDB":self.playerIDB, "winPlayerID":self.winPlayerID, "playerBatDict":self.playerBatDict}
def SetAttr(self, attrDict):
for k, v in attrDict.items():
@@ -275,7 +290,24 @@
GameWorld.Log("无该跨服排位争霸赛对战场次信息: groupMark=%s,battleNum=%s" % (groupMark, battleNum))
# 不可能执行的代码,方便 . 出提示代码
- if False:
+ if not battle and False:
+ battle = ChampionshipBattle()
+ return battle
+
+ def GetBattleByPlayerID(self, groupMark, playerID):
+ battle = None
+ if groupMark in self.battleInfo:
+ battleDict = self.battleInfo[groupMark]
+ for bat in battleDict.values():
+ if playerID == bat.playerIDA or playerID == bat.playerIDB:
+ battle = bat
+ break
+
+ if not battle:
+ GameWorld.Log("无该跨服排位争霸赛对战场次信息: groupMark=%s,playerID=%s" % (groupMark, playerID))
+
+ # 不可能执行的代码,方便 . 出提示代码
+ if not battle and False:
battle = ChampionshipBattle()
return battle
@@ -340,6 +372,8 @@
obj.lv = cacheDict.get("LV", obj.lv)
obj.fightPower = cacheDict.get("FightPower", obj.fightPower)
obj.realmLV = cacheDict.get("RealmLV", obj.realmLV)
+ obj.face = cacheDict.get("Face", obj.face)
+ obj.facePic = cacheDict.get("FacePic", obj.facePic)
return
@@ -361,12 +395,15 @@
return
def GetChampPKZoneIDList(self): return self._pkZoneInfo.keys()
- def GetChampPKZoneMgr(self, zoneID):
+ def GetChampPKZoneMgr(self, zoneID, addNew=False):
+ pkZoneMgr = None
if zoneID in self._pkZoneInfo:
pkZoneMgr = self._pkZoneInfo[zoneID]
- else:
+ elif addNew:
pkZoneMgr = ChampionshipPKZoneMgr(zoneID)
self._pkZoneInfo[zoneID] = pkZoneMgr
+ if not pkZoneMgr:
+ GameWorld.ErrLog("找不到跨服排位赛分区管理! zoneID=%s" % zoneID)
return pkZoneMgr
def GetPlayerPKZoneID(self, playerID):
@@ -374,6 +411,8 @@
# @return: 如果在排位中则返回所在排位分区,否则返回当前服务器所在跨服匹配PK分区
for zoneID in self._pkZoneInfo.keys():
pkZoneMgr = self.GetChampPKZoneMgr(zoneID)
+ if not pkZoneMgr:
+ continue
if playerID in pkZoneMgr.GetBatPlayerIDList():
return zoneID
return GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID)
@@ -429,14 +468,18 @@
playerIDA = recData.GetValue3()
playerIDB = recData.GetValue4()
winPlayerID = recData.GetValue5()
-
+ strValue3 = recData.GetStrValue3()
+ try:
+ playerBatDict = eval(strValue3) if strValue3 else {}
+ except:
+ playerBatDict = {}
#if not playerIDA and not playerIDB:
# continue
groupMark = groupInfo / 100
battleNum = groupInfo % 100
- pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+ pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True)
if groupMark in groupMarkList and battleNum:
battle = ChampionshipBattle()
@@ -447,6 +490,7 @@
battle.playerIDA = playerIDA
battle.playerIDB = playerIDB
battle.winPlayerID = winPlayerID
+ battle.playerBatDict = playerBatDict
pkZoneMgr.AddBattle(groupMark, battleNum, battle)
GameWorld.Log("分组玩家: zoneID=%s,groupMark=%s,battleNum=%s,playerIDA=%s,playerIDB=%s,winPlayerID=%s"
% (zoneID, groupMark, battleNum, playerIDA, playerIDB, winPlayerID))
@@ -471,8 +515,11 @@
guessPlayerID = recData.GetValue3()
tagPlayerID = recData.GetValue4()
moneyTotal = recData.GetValue5()
+ isClose = GameWorld.ToIntDef(recData.GetStrValue1(), 0)
pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+ if not pkZoneMgr:
+ continue
playerGuessList = pkZoneMgr.GetPlayerGuessList(guessPlayerID, guessType)
guessObj = ChampionshipGuess()
guessObj.zoneID = zoneID
@@ -481,6 +528,7 @@
guessObj.guessPlayerID = guessPlayerID
guessObj.tagPlayerID = tagPlayerID
guessObj.moneyTotal = moneyTotal
+ guessObj.isClose = isClose
playerGuessList.append(guessObj)
if guessType not in pkZoneMgr.supportCountInfo:
@@ -493,9 +541,8 @@
for index in xrange(officialRecDataList.Count()):
recData = officialRecDataList.At(index)
lastDismissJuniorTime = recData.GetTime()
- value1 = recData.GetValue1()
- officialID = value1 / 10
- zoneID = value1 % 10
+ officialID = recData.GetValue1()
+ zoneID = recData.GetValue5()
playerID = recData.GetValue2()
worshipValue = recData.GetValue3()
worshipCount = worshipValue / 10
@@ -526,9 +573,8 @@
GameWorld.Log("加载跨服排位官职挑战记录信息! %s" % challengeRecDataList.Count())
for index in xrange(challengeRecDataList.Count()):
recData = challengeRecDataList.At(index)
- value1 = recData.GetValue1()
- officialID = value1 / 10
- zoneID = value1 % 10
+ officialID = recData.GetValue1()
+ zoneID = recData.GetValue2()
strValue3 = recData.GetStrValue3()
if not strValue3:
continue
@@ -547,7 +593,10 @@
return
def OnServerClose():
-
+ SaveChampionshipData()
+ return
+
+def SaveChampionshipData():
if not GameWorld.IsCrossServer():
return
@@ -560,7 +609,8 @@
groupRecDataList = universalRecMgr.GetTypeList(Def_RecType_CrossChampionshipGroup)
for zoneID in pkZoneIDList:
pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
-
+ if not pkZoneMgr:
+ continue
# 保存参赛玩家名单
batPlayerIDList = pkZoneMgr.GetBatPlayerIDList()
GameWorld.Log(" zoneID=%s,batPlayerIDCount=%s, %s" % (zoneID, len(batPlayerIDList), batPlayerIDList))
@@ -583,12 +633,17 @@
recData.SetValue3(batObj.playerIDA)
recData.SetValue4(batObj.playerIDB)
recData.SetValue5(batObj.winPlayerID)
+ strValue3 = "%s" % batObj.playerBatDict
+ strValue3 = strValue3.replace(" ", "")
+ recData.SetStrValue3(strValue3)
GameWorld.Log("保存跨服排位玩家竞猜记录!")
universalRecMgr.Delete(Def_RecType_CrossChampionshipGuess)
guessRecDataList = universalRecMgr.GetTypeList(Def_RecType_CrossChampionshipGuess)
for zoneID in pkZoneIDList:
pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+ if not pkZoneMgr:
+ continue
for guessType, playerGuessDict in pkZoneMgr.guessInfo.items():
for guessPlayerID, guessObjList in playerGuessDict.items():
#GameWorld.Log(" zoneID=%s,guessType=%s,guessPlayerID=%s,guessCount=%s" % (zoneID, guessType, guessPlayerID, len(guessObjList)))
@@ -599,6 +654,7 @@
recData.SetValue3(guessPlayerID)
recData.SetValue4(guessObj.tagPlayerID)
recData.SetValue5(guessObj.moneyTotal)
+ recData.SetStrValue1("%s" % guessObj.isClose)
offZoneIDList = champMgr.GetChampOfficialZoneIDList()
GameWorld.Log("保存跨服排位玩家官职信息! offZoneIDList=%s" % offZoneIDList)
@@ -613,22 +669,23 @@
offObj = offZoneMgr.GetOfficialObj(officialID)
if not offObj:
continue
- value1 = offObj.officialID * 10 + zoneID
recData = officialRecDataList.AddRec()
recData.SetTime(offObj.lastDismissJuniorTime)
- recData.SetValue1(value1)
+ recData.SetValue1(officialID)
recData.SetValue2(offObj.playerID)
recData.SetValue3(offObj.worshipCount * 10 + offObj.worshipDouble)
recData.SetValue4(offObj.rank)
+ recData.SetValue5(zoneID)
strValue3 = "%s" % offObj.applyPlayerInfo.keys()
strValue3 = strValue3.replace(" ", "")
recData.SetStrValue3(strValue3)
- #GameWorld.Log(" zoneID=%s,officialID=%s,playerID=%s,rank=%s,challengeCount=%s"
- # % (zoneID, officialID, offObj.playerID, offObj.rank, len(offObj.challengeList)))
+ GameWorld.Log(" zoneID=%s,officialID=%s,playerID=%s,rank=%s,challengeCount=%s"
+ % (zoneID, officialID, offObj.playerID, offObj.rank, len(offObj.challengeList)))
for challengeDict in offObj.challengeList:
challRecData = challengeRecDataList.AddRec()
- challRecData.SetValue1(value1)
+ challRecData.SetValue1(officialID)
+ challRecData.SetValue2(zoneID)
strValue3 = str(challengeDict)
strValue3 = strValue3.replace(" ", "")
challRecData.SetStrValue3(strValue3)
@@ -705,6 +762,8 @@
champMgr = GetChampionshipMgr()
for zoneID in champMgr.GetChampPKZoneIDList():
pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+ if not pkZoneMgr:
+ continue
if playerID in pkZoneMgr.GetBatPlayerIDList():
# 是参赛玩家
return True
@@ -738,11 +797,22 @@
return
+def DoChampionshipOpen(curPlayer):
+ NotifyPlayerChampionshipInfo(curPlayer, GameWorld.GetGameWorld().GetTick())
+ return
+
def OnPlayerLogin(curPlayer, tick):
if GameWorld.IsCrossServer():
return
+ if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
+ return
+
+ NotifyPlayerChampionshipInfo(curPlayer, tick)
+ return
+
+def NotifyPlayerChampionshipInfo(curPlayer, tick):
playerID = curPlayer.GetPlayerID()
champMgr = GetChampionshipMgr()
pkZoneIDList = champMgr.GetChampPKZoneIDList()
@@ -754,6 +824,8 @@
if pkZoneIDList:
playerZoneID = champMgr.GetPlayerPKZoneID(playerID)
pkZoneMgr = champMgr.GetChampPKZoneMgr(playerZoneID)
+ if not pkZoneMgr:
+ return
if playerID not in pkZoneMgr.syncGuessPlayerIDInfo:
sendMsg = {"zoneID":playerZoneID, "playerID":playerID, "exDataType":"ChampionshipGuessQuery"}
CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_ChampionshipGuess, sendMsg)
@@ -763,11 +835,60 @@
return
-def OnMinuteProcess():
+def ChampionshipErrorDo():
+ ## 状态异常后处理
+
+ stateError = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError)
+ if not stateError:
+ return "state is not error."
+
+ if PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipErrorDo):
+ return "already done."
+
+ champMgr = GetChampionshipMgr()
+
+ # 返还未结算的竞猜消耗
+ moneyType, _ = IpyGameDataPY.GetFuncEvalCfg("CrossChamGuess", 1)
+ moneyItemID = ChConfig.MoneyItemIDDict.get(moneyType)
+ for zoneID in champMgr.GetChampPKZoneIDList():
+ pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+ if not pkZoneMgr:
+ continue
+
+ backGuessTypeList = []
+ playerGuessMoneyInfo = {}
+ for guessType, playerGuessDict in pkZoneMgr.guessInfo.items():
+ for guessPlayerID, guessObjList in playerGuessDict.items():
+ for guessObj in guessObjList:
+ if guessObj.isClose:
+ # 已经结算的不处理
+ continue
+ guessObj.isClose = 1
+ if guessType not in backGuessTypeList:
+ backGuessTypeList.append(guessType)
+ playerGuessMoneyInfo[guessPlayerID] = playerGuessMoneyInfo.get(guessPlayerID, 0) + guessObj.moneyTotal
+
+ GameWorld.Log("竞猜需要返还玩家信息: moneyItemID=%s,zoneID=%s,backGuessTypeList=%s, %s" % (moneyItemID, zoneID, backGuessTypeList, playerGuessMoneyInfo))
+ if not moneyItemID or not playerGuessMoneyInfo:
+ continue
+
+ for guessPlayerID, totalMoney in playerGuessMoneyInfo.items():
+ paramList = []
+ addItemList = [[moneyItemID, totalMoney, 0]]
+ PlayerCompensation.SendMailByKey("CrossChampionshipGuessBack", [guessPlayerID], addItemList, paramList, crossMail=True)
+
+ PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipErrorDo, 1)
+ return "OK"
+
+def OnMinuteProcess(curMinute=None):
if not GameWorld.IsCrossServer():
return
Dispose_CrossChampionshipState()
+
+ # 每半小时存档一次
+ if curMinute != None and curMinute % 30 == 0:
+ SaveChampionshipData()
return
def __GetChampionshipStartDate():
@@ -985,37 +1106,39 @@
PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipID, crossChampionshipID)
PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState, updState)
PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError, 0)
+ PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipErrorDo, 0)
champMgr = GetChampionshipMgr()
champMgr.ClearPKZone() # 仅清理PK分区信息,仙官信息不变
# 生成参赛玩家名单: 取跨服PK所有分区 championshipSeason 赛季的数据
if championshipSeason:
- crossPKBillboardMgr = PyDataManager.GetCrossPKBillboardManager()
+ crossBillboardMgr = PyDataManager.GetCrossBillboardManager()
for zoneID in hisZoneIDList:
- billboardList = crossPKBillboardMgr.GetCrossPKBillboardInfo(zoneID, championshipSeason)[0]
- GameWorld.Log("zoneID=%s,billboardListLen=%s" % (zoneID, len(billboardList)))
- if not billboardList:
+ groupValue1, groupValue2 = zoneID, championshipSeason
+ billboardObj = crossBillboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_CrossRealmPK, groupValue1, groupValue2)
+ billboardDataLen = billboardObj.GetCount()
+ GameWorld.Log("zoneID=%s,championshipSeason=%s,billboardDataLen=%s" % (zoneID, championshipSeason, billboardDataLen))
+ if not billboardDataLen:
# 没有玩家上榜的不处理
continue
- pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
- battlePlayerList = billboardList[:Def_CrossChampionshipPlayerMax]
- for num, billboardData in enumerate(battlePlayerList, 1):
- playerID = billboardData.PlayerID
+ pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True)
+ for index in range(Def_CrossChampionshipPlayerMax):
+ if index >= billboardDataLen:
+ break
+ billboardData = billboardObj.At(index)
+ playerID = billboardData.ID
+
batPlayer = ChampionshipBatPlayer()
batPlayer.zoneID = zoneID
batPlayer.playerID = playerID
- batPlayer.playerName = billboardData.PlayerName
- batPlayer.job = billboardData.Job
- batPlayer.fightPower = billboardData.FightPower
- batPlayer.realmLV = billboardData.RealmLV
pkZoneMgr.playerDict[playerID] = batPlayer
getPlayer = pkZoneMgr.GetBatPlayer(playerID)
dataDict = {"zoneID":zoneID, "playerID":playerID, "accID":getPlayer.accID, "fightPower":getPlayer.fightPower}
DR_CrossChampionshipPK("StartPlayer", dataDict)
- GameWorld.Log(" AddBattlePlayer num=%s,playerID=%s,accID=%s,fightPower=%s" % (num, playerID, getPlayer.accID, getPlayer.fightPower))
+ GameWorld.Log(" AddBattlePlayer index=%s,playerID=%s,accID=%s,fightPower=%s" % (index, playerID, getPlayer.accID, getPlayer.fightPower))
GameWorld.Log("=============================================================")
Send_CrossServerMsg_ChampionshipState(newAct=True)
@@ -1034,6 +1157,8 @@
champMgr = GetChampionshipMgr()
for zoneID in champMgr.GetChampPKZoneIDList():
pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+ if not pkZoneMgr:
+ continue
# 首轮取所有参赛玩家
if preGroupMark == 0:
batPlayerIDList = pkZoneMgr.GetBatPlayerIDList()
@@ -1134,7 +1259,8 @@
champMgr = GetChampionshipMgr()
for zoneID in champMgr.GetChampPKZoneIDList():
pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
-
+ if not pkZoneMgr:
+ continue
winPlayerIDList, losePlayerIDList = [], [] # 胜者组、败者组
battleNumList = pkZoneMgr.battleInfo.get(preGroupMark, {}).keys()
battleNumList.sort() # 对战编号按之前的分组顺序排序,确保分组顺序一致
@@ -1221,7 +1347,8 @@
champMgr = GetChampionshipMgr()
for zoneID in champMgr.GetChampPKZoneIDList():
pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
-
+ if not pkZoneMgr:
+ continue
battleNumList = pkZoneMgr.battleInfo.get(preGroupMark, {}).keys()
battleNumList.sort() # 对战编号按之前的分组顺序排序,确保分组顺序一致
for battleNum in battleNumList:
@@ -1240,7 +1367,7 @@
# 处理8强竞猜发奖励
guessType = 8
- moneyType, _ = IpyGameDataPY.GetFuncEvalCfg("CrossChamGuess", 1)
+ moneyType = ShareDefine.TYPE_Price_GongdePoint
multiPrice = IpyGameDataPY.GetFuncCfg("CrossChamGuess", 3) # 猜中奖励倍值
moneyItemID = ChConfig.MoneyItemIDDict.get(moneyType)
GameWorld.Log("竞猜返利货币类型: moneyType=%s,moneyItemID=%s,multiPrice=%s" % (moneyType, moneyItemID, multiPrice), zoneID)
@@ -1251,6 +1378,7 @@
for guessObj in guessList:
if guessObj.guessType != guessType or guessObj.guessPlayerID != guessPlayerID:
continue
+ guessObj.isClose = 1
tagPlayerID = guessObj.tagPlayerID
moneyTotal = guessObj.moneyTotal
if not tagPlayerID or tagPlayerID not in top8PlayerIDList:
@@ -1270,48 +1398,7 @@
def DoCrossChampionshipStartEnter(state):
## 开启进场处理逻辑
- if state not in ShareDefine.CrossChampionshipEnterStateInfo:
- return
- groupMark = ShareDefine.CrossChampionshipEnterStateInfo[state]
- mapIDList = IpyGameDataPY.GetFuncEvalCfg("CrossChamFB", 3)
- GameWorld.Log("跨服排位争霸赛开启进场副本: groupMark=%s,mapIDList=%s" % (groupMark, mapIDList))
- champMgr = GetChampionshipMgr()
- pkZoneIDList = champMgr.GetChampPKZoneIDList()
- for index, zoneID in enumerate(pkZoneIDList):
- if index >= len(mapIDList):
- GameWorld.ErrLog("该跨服排位争霸赛分区没有分配对战地图! zoneID=%s,index=%s" % (zoneID, index), zoneID)
- continue
- mapID = mapIDList[index]
- pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
- if groupMark not in pkZoneMgr.battleInfo:
- GameWorld.Log("该跨服排位争霸赛分区没有对战组! zoneID=%s,groupMark=%s" % (zoneID, groupMark), zoneID)
- continue
- copyMapID = 0
- copyPropertyList = []
- battleDict = pkZoneMgr.battleInfo[groupMark]
- for battleNum in battleDict.keys():
- batObj = pkZoneMgr.GetBattle(groupMark, battleNum)
- if not batObj:
- continue
- roomID = GetChampionshipPKRoomID(zoneID, groupMark, battleNum)
- copyPropertyList.append([copyMapID, roomID])
- batObj.mapID = mapID
- batObj.roomID = roomID
- batObj.copyMapID = copyMapID
-
- # 添加开启分线数据
- realMapID = mapID
- copyMapObj = PlayerFB.CrossCopyMapInfo(zoneID, 0)
- copyMapObj.realMapID = realMapID
- copyMapObj.copyMapID = copyMapID
- key = (realMapID, copyMapID)
- PyGameData.g_crossDynamicLineCopyMapInfo[key] = copyMapObj
- GameWorld.Log(" 对战房间! zoneID=%s,groupMark=%s,battleNum=%s,playerIDA=%s,playerIDB=%s,roomID=%s,mapID=%s,copyMapID=%s"
- % (zoneID, groupMark, battleNum, batObj.playerIDA, batObj.playerIDB, roomID, mapID, copyMapID))
- copyMapID += 1
-
- PlayerFB.SendMapOpenFBEx(mapID, copyPropertyList)
-
+ # 改为镜像战斗,废弃开地图房间
return
def Sync_CrossChampionshipDataToClientServer(serverGroupID=0):
@@ -1339,7 +1426,7 @@
CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ChampionshipState, dataMsg, serverGroupIDList)
return
-def Send_CrossServerMsg_ChampionshipPlayer(syncPlayerIDList=None, serverGroupID=0, isSync=False):
+def Send_CrossServerMsg_ChampionshipPlayer(syncPlayerIDList=None, serverGroupID=0, isSync=False, clearPlayer=False):
# 通知参赛玩家
zoneBatPlayerInfo = {}
@@ -1347,16 +1434,17 @@
for zoneID in champMgr.GetChampPKZoneIDList():
batPlayerList = []
pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
- if syncPlayerIDList == None:
- syncPlayerIDList = pkZoneMgr.GetBatPlayerIDList()
- for playerID in syncPlayerIDList:
+ if not pkZoneMgr:
+ continue
+ playerIDList = pkZoneMgr.GetBatPlayerIDList() if syncPlayerIDList == None else syncPlayerIDList
+ for playerID in playerIDList:
batPlayer = pkZoneMgr.GetBatPlayer(playerID)
if not batPlayer:
continue
batPlayerList.append(batPlayer.GetString())
zoneBatPlayerInfo[zoneID] = batPlayerList
- dataMsg = {"isSync":isSync, "zoneBatPlayerInfo":zoneBatPlayerInfo}
+ dataMsg = {"isSync":isSync, "zoneBatPlayerInfo":zoneBatPlayerInfo, "clearPlayer":clearPlayer}
serverGroupIDList = [serverGroupID] if serverGroupID else []
CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ChampionshipPlayer, dataMsg, serverGroupIDList)
return
@@ -1371,6 +1459,8 @@
champMgr = GetChampionshipMgr()
for zoneID in champMgr.GetChampPKZoneIDList():
pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+ if not pkZoneMgr:
+ continue
for gMark in syncGroupMarkList:
battleDict = pkZoneMgr.battleInfo.get(gMark, {})
if not battleDict:
@@ -1395,12 +1485,13 @@
guessList.append(guessObj.GetString())
else:
pkZoneMgr = champMgr.GetChampPKZoneMgr(syncZoneID)
- for playerGuessDict in pkZoneMgr.guessInfo.values():
- if playerID not in playerGuessDict:
- continue
- playerGuessList = playerGuessDict[playerID]
- for guess in playerGuessList:
- guessList.append(guess.GetString())
+ if pkZoneMgr:
+ for playerGuessDict in pkZoneMgr.guessInfo.values():
+ if playerID not in playerGuessDict:
+ continue
+ playerGuessList = playerGuessDict[playerID]
+ for guess in playerGuessList:
+ guessList.append(guess.GetString())
dataMsg = {"exData":exData if exData else {}, "guessList":guessList}
if syncPub:
@@ -1408,6 +1499,8 @@
syncZoneIDList = [syncZoneID] if syncZoneID else champMgr.GetChampPKZoneIDList()
for zoneID in syncZoneIDList:
pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+ if not pkZoneMgr:
+ continue
zoneSupportCountInfo[zoneID] = pkZoneMgr.supportCountInfo
dataMsg["pubInfo"] = {"zoneSupportCountInfo":zoneSupportCountInfo}
@@ -1440,20 +1533,37 @@
GameWorld.Log("子服重置跨服排位争霸赛对战数据! dbID=%s,ID=%s,PKZoneIDList=%s,prePKZoneIDList=%s" % (dbID, ID, PKZoneIDList, prePKZoneIDList))
for zoneID in PKZoneIDList:
champMgr.GetChampPKZoneMgr(zoneID)
+
+ OnMapServerInitOK()
+ return
+
+def OnMapServerInitOK():
+ # 通知地图服务器状态
+
+ if GameWorld.IsCrossServer():
+ return
+
+ State = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState)
+ StateError = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError)
+
+ GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossChampionshipState, State)
+ GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossChampionshipStateError, StateError)
return
def CrossServerMsg_ChampionshipPlayer(msgData):
## 收到跨服服务器同步的信息 - 参赛玩家信息
isSync = msgData["isSync"]
+ clearPlayer = msgData["clearPlayer"]
zoneBatPlayerInfo = msgData["zoneBatPlayerInfo"]
champMgr = GetChampionshipMgr()
for zoneID, batPlayerList in zoneBatPlayerInfo.items():
- pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+ pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True)
if not batPlayerList:
- pkZoneMgr.playerDict = {}
+ if clearPlayer:
+ pkZoneMgr.playerDict = {}
else:
for attrDict in batPlayerList:
zoneID = attrDict["zoneID"]
@@ -1464,7 +1574,8 @@
pkZoneMgr.playerDict[playerID] = batPlayer
batPlayer.SetAttr(attrDict)
- if isSync:
+ if isSync:
+ for zoneID in zoneBatPlayerInfo.keys():
Sync_ChampionshipPKZoneGroupInfo(zoneID)
return
@@ -1479,7 +1590,7 @@
groupMark = attrDict["groupMark"]
battleNum = attrDict["battleNum"]
- pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+ pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True)
battle = pkZoneMgr.GetBattle(groupMark, battleNum)
if not battle:
battle = ChampionshipBattle()
@@ -1534,7 +1645,7 @@
# 非本服玩家
continue
- pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+ pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True)
guessObj = None
playerGuessList = pkZoneMgr.GetPlayerGuessList(guessPlayerID, guessType)
@@ -1552,7 +1663,7 @@
if pubInfo != None:
zoneSupportCountInfo = pubInfo["zoneSupportCountInfo"]
for zoneID, supportCountInfo in zoneSupportCountInfo.items():
- pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+ pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True)
pkZoneMgr.supportCountInfo = supportCountInfo
pubZoneIDList.append(zoneID)
@@ -1564,7 +1675,7 @@
# 非本服玩家
return
zoneID = exData.get("zoneID", 0)
- pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+ pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True)
pkZoneMgr.syncGuessPlayerIDInfo[playerID] = tick
curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
if curPlayer == None:
@@ -1591,93 +1702,84 @@
return
-def OnRequestChampionshipVSRoom(playerID, serverGroupID):
- ## 请求进入排位对战房间
-
- stateError = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError)
- if stateError:
- GameWorld.ErrLog("跨服排位状态已经异常无法进入! stateError=%s" % stateError, playerID)
- return
-
- state = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState)
- if state not in ShareDefine.CrossChampionshipEnterStateInfo:
- GameWorld.ErrLog("当前状态非跨服排位战斗状态无法进入: state=%s" % state, playerID)
- return
- groupMark = ShareDefine.CrossChampionshipEnterStateInfo[state]
-
- mapPosList = IpyGameDataPY.GetFuncEvalCfg("CrossChamFB", 2)
- if not mapPosList:
- GameWorld.ErrLog("没有配置跨服排位对战地图进入坐标! CrossChamFB 数值2")
- return
-
- roomID = 0
- vsRoomDict = {}
-
- champMgr = GetChampionshipMgr()
- for zoneID in champMgr.GetChampPKZoneIDList():
- pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
- if groupMark not in pkZoneMgr.battleInfo:
- continue
- battleDict = pkZoneMgr.battleInfo[groupMark]
- for battleNum in battleDict.keys():
- batObj = pkZoneMgr.GetBattle(groupMark, battleNum)
- if not batObj:
- continue
-
- if playerID == batObj.playerIDA:# or batObj.playerIDA == 496607:
- factionIndex = 0
- elif playerID == batObj.playerIDB:# or batObj.playerIDB == 489566:
- factionIndex = 1
- else:
- continue
-
- if not batObj.mapID:
- GameWorld.ErrLog("该跨服排位对战没有分配对战地图,无法进入! groupMark=%s,battleNum=%s" % (groupMark, battleNum), playerID)
- return
- roomID = batObj.roomID
- realMapID = batObj.mapID
- copyMapID = batObj.copyMapID
- key = (realMapID, copyMapID)
- if key not in PyGameData.g_crossDynamicLineCopyMapInfo:
- GameWorld.ErrLog("该跨服排位对战没有分配对战地图线路,无法进入! groupMark=%s,battleNum=%s,realMapID=%s,copyMapID=%s"
- % (groupMark, battleNum, realMapID, copyMapID), playerID)
- return
- copyMapObj = PyGameData.g_crossDynamicLineCopyMapInfo[key]
- if copyMapObj.openState != IPY_PlayerDefine.fbosOpen:
- GameWorld.Log("该跨服排位对战分配的地图线路非开启状态,无法进入! groupMark=%s,battleNum=%s,realMapID=%s,copyMapID=%s,openState=%s"
- % (groupMark, battleNum, realMapID, copyMapID, copyMapObj.openState), playerID)
- return
-
- posX, posY = mapPosList[factionIndex] if len(mapPosList) > factionIndex else mapPosList[0]
-
- registerMap = ChConfig.Def_FBMapID_CrossChampionship
- dataMapID = realMapID
-
- vsRoomDict = {roomID:{playerID:{"regMapInfo":[registerMap, realMapID, dataMapID, copyMapID, posX, posY]}}}
- GameWorld.Log("玩家请求跨服排位对战组: zoneID=%s,groupMark=%s,battleNum=%s,roomID=%s"
- % (zoneID, groupMark, battleNum, roomID), playerID)
- break
-
- if not roomID or not vsRoomDict:
- GameWorld.ErrLog("找不到玩家跨服排位对战组: state=%s,groupMark=%s" % (state, groupMark), playerID)
- return
- PlayerFB.Send_CrossServerMsg_EnterVSRoomRet(vsRoomDict, [serverGroupID])
- return
+#def OnRequestChampionshipVSRoom(playerID, serverGroupID):
+# ## 请求进入排位对战房间
+#
+# stateError = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError)
+# if stateError:
+# GameWorld.ErrLog("跨服排位状态已经异常无法进入! stateError=%s" % stateError, playerID)
+# return
+#
+# state = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState)
+# if state not in ShareDefine.CrossChampionshipEnterStateInfo:
+# GameWorld.ErrLog("当前状态非跨服排位战斗状态无法进入: state=%s" % state, playerID)
+# return
+# groupMark = ShareDefine.CrossChampionshipEnterStateInfo[state]
+#
+# mapPosList = IpyGameDataPY.GetFuncEvalCfg("CrossChamFB", 2)
+# if not mapPosList:
+# GameWorld.ErrLog("没有配置跨服排位对战地图进入坐标! CrossChamFB 数值2")
+# return
+#
+# roomID = 0
+# vsRoomDict = {}
+#
+# champMgr = GetChampionshipMgr()
+# for zoneID in champMgr.GetChampPKZoneIDList():
+# pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+# if not pkZoneMgr:
+# continue
+# if groupMark not in pkZoneMgr.battleInfo:
+# continue
+# battleDict = pkZoneMgr.battleInfo[groupMark]
+# for battleNum in battleDict.keys():
+# batObj = pkZoneMgr.GetBattle(groupMark, battleNum)
+# if not batObj:
+# continue
+#
+# if playerID == batObj.playerIDA:# or batObj.playerIDA == 496607:
+# factionIndex = 0
+# elif playerID == batObj.playerIDB:# or batObj.playerIDB == 489566:
+# factionIndex = 1
+# else:
+# continue
+#
+# if not batObj.mapID:
+# GameWorld.ErrLog("该跨服排位对战没有分配对战地图,无法进入! groupMark=%s,battleNum=%s" % (groupMark, battleNum), playerID)
+# return
+# roomID = batObj.roomID
+# realMapID = batObj.mapID
+# copyMapID = batObj.copyMapID
+# key = (realMapID, copyMapID)
+# if key not in PyGameData.g_crossDynamicLineCopyMapInfo:
+# GameWorld.ErrLog("该跨服排位对战没有分配对战地图线路,无法进入! groupMark=%s,battleNum=%s,realMapID=%s,copyMapID=%s"
+# % (groupMark, battleNum, realMapID, copyMapID), playerID)
+# return
+# copyMapObj = PyGameData.g_crossDynamicLineCopyMapInfo[key]
+# if copyMapObj.openState != IPY_PlayerDefine.fbosOpen:
+# GameWorld.Log("该跨服排位对战分配的地图线路非开启状态,无法进入! groupMark=%s,battleNum=%s,realMapID=%s,copyMapID=%s,openState=%s"
+# % (groupMark, battleNum, realMapID, copyMapID, copyMapObj.openState), playerID)
+# return
+#
+# posX, posY = mapPosList[factionIndex] if len(mapPosList) > factionIndex else mapPosList[0]
+#
+# registerMap = ChConfig.Def_FBMapID_CrossChampionship
+# dataMapID = realMapID
+#
+# vsRoomDict = {roomID:{playerID:{"regMapInfo":[registerMap, realMapID, dataMapID, copyMapID, posX, posY]}}}
+# GameWorld.Log("玩家请求跨服排位对战组: zoneID=%s,groupMark=%s,battleNum=%s,roomID=%s"
+# % (zoneID, groupMark, battleNum, roomID), playerID)
+# break
+#
+# if not roomID or not vsRoomDict:
+# GameWorld.ErrLog("找不到玩家跨服排位对战组: state=%s,groupMark=%s" % (state, groupMark), playerID)
+# return
+# PlayerFB.Send_CrossServerMsg_EnterVSRoomRet(vsRoomDict, [serverGroupID])
+# return
def GetChampionshipPKRoomID(zoneID, groupMark, battleNum): return int("%d%03d%02d" % (zoneID, groupMark, battleNum))
-def MapServer_CrossChampionshipPKOver(infoList, tick):
- ## 收到MapServer副本跨服排位PK结果同步
-
- roomID, winnerID, loserID, roundWinnerIDList, overType = infoList
- zoneID = roomID / 100000
- groupMark = roomID % 100000 / 100
- battleNum = roomID % 100
- GameWorld.Log("=== 收到MapServer_跨服排位PK战斗结果: zoneID=%s,groupMark=%s,battleNum=%s,roomID=%s,winnerID=%s,loserID=%s,roundWinnerIDList=%s,overType=%s"
- % (zoneID, groupMark, battleNum, roomID, winnerID, loserID, roundWinnerIDList, overType), roomID)
- DoBattleOverLogic(zoneID, groupMark, battleNum, winnerID, loserID, roundWinnerIDList, overType)
- return
-def DoBattleOverLogic(zoneID, groupMark, battleNum, winnerID=0, loserID=0, roundWinnerIDList=None, overType=0):
+def DoBattleOverLogic(zoneID, groupMark, battleNum):
## 执行对战结算逻辑
if not zoneID:
@@ -1690,14 +1792,13 @@
champMgr = GetChampionshipMgr()
pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+ if not pkZoneMgr:
+ return
battleObj = pkZoneMgr.GetBattle(groupMark, battleNum)
if not battleObj:
return
- if roundWinnerIDList == None:
- roundWinnerIDList = []
-
- roomID = battleObj.roomID
+ roomID = GetChampionshipPKRoomID(zoneID, groupMark, battleNum) # 改版后roomID没用了,仅作为日志输出用
if battleObj.overTime:
GameWorld.ErrLog("跨服排位PK对战已经结算过了,不重复结算! zoneID=%s,groupMark=%s,battleNum=%s,winPlayerID=%s,overTime=%s"
% (zoneID, groupMark, battleNum, battleObj.winPlayerID, GameWorld.ChangeTimeNumToStr(battleObj.overTime)), roomID)
@@ -1706,11 +1807,30 @@
playerIDA = battleObj.playerIDA
playerIDB = battleObj.playerIDB
roomPlayerIDList = [playerIDA, playerIDB]
- GameWorld.Log("结算跨服排位PK战斗结果: zoneID=%s,groupMark=%s,battleNum=%s,playerIDA=%s,playerIDB=%s,roomPlayerIDList=%s"
+ GameWorld.Log("结算跨服排位PK胜负结果: zoneID=%s,groupMark=%s,battleNum=%s,playerIDA=%s,playerIDB=%s,roomPlayerIDList=%s"
% (zoneID, groupMark, battleNum, playerIDA, playerIDB, roomPlayerIDList), roomID)
+ winnerID, loserID = 0, 0
if playerIDA and playerIDB:
- if not winnerID and not loserID:
+ totalScoreDict = {}
+ for batPlayerID, batRetList in battleObj.playerBatDict.items():
+ for retInfo in batRetList:
+ if not retInfo or len(retInfo) < 2:
+ continue
+ addScore = retInfo[1]
+ totalScoreDict[batPlayerID] = totalScoreDict.get(batPlayerID, 0) + addScore
+ playerScoreA = totalScoreDict.get(playerIDA, 0)
+ playerScoreB = totalScoreDict.get(playerIDB, 0)
+ GameWorld.Log(" 总积分: %s, %s" % (totalScoreDict, battleObj.playerBatDict), roomID)
+ if playerScoreA > playerScoreB:
+ winnerID = playerIDA
+ loserID = playerIDB
+ GameWorld.Log(" 跨服排位赛玩家累计总分高者获胜! winner is playerIDA=%s,loserID=%s" % (playerIDA, loserID), roomID)
+ elif playerScoreB > playerScoreA:
+ winnerID = playerIDB
+ loserID = playerIDA
+ GameWorld.Log(" 跨服排位赛玩家累计总分高者获胜! winner is playerIDB=%s,loserID=%s" % (playerIDB, loserID), roomID)
+ else: # 平分
playerA = pkZoneMgr.GetBatPlayer(playerIDA)
playerB = pkZoneMgr.GetBatPlayer(playerIDB)
fightPowerA = playerA.fightPower if playerA else 0
@@ -1728,18 +1848,7 @@
winnerID, loserID = roomPlayerIDList
GameWorld.Log(" 跨服排位赛对战地图没有玩家参与或没有胜负玩家,战力相同随机玩家获胜! fightPowerA=%s(%s) = fightPowerB=%s(%s),winnerID=%s,loserID=%s"
% (fightPowerA, playerIDA, fightPowerB, playerIDB, winnerID, loserID), roomID)
- elif not loserID:
- for roomPlayerID in roomPlayerIDList:
- if roomPlayerID != winnerID:
- loserID = roomPlayerID
- GameWorld.Log(" 跨服排位赛对战地图没有失败玩家,默认对方为失败玩家! loserID=%s" % loserID, roomID)
- break
- if not winnerID or winnerID not in roomPlayerIDList or loserID not in roomPlayerIDList:
- GameWorld.ErrLog("跨服排位赛PK房间胜负玩家异常,不结算! roomID=%s,winnerID=%s,loserID=%s,roomPlayerIDList=%s"
- % (roomID, winnerID, loserID, roomPlayerIDList), roomID)
- return
-
elif playerIDA:
winnerID = playerIDA
loserID = playerIDB
@@ -1759,9 +1868,6 @@
winner = pkZoneMgr.GetBatPlayer(winnerID)
loser = pkZoneMgr.GetBatPlayer(loserID)
- winnerName = winner.playerName if winner else str(winnerID)
- loserName = loser.playerName if loser else str(loserID)
-
# 决赛可获取最终名次
playerRankInfo = {}
if groupMark == 2:
@@ -1779,8 +1885,7 @@
wAwardItemList, fAwardItemList = [], []
if wfAwardItemList and len(wfAwardItemList) == 2:
wAwardItemList, fAwardItemList = wfAwardItemList
-
- timeStr = GameWorld.GetCurrentDataTimeStr()
+
# 结算
for playerID in [winnerID, loserID]:
if not playerID:
@@ -1789,15 +1894,15 @@
if playerID == winnerID:
addItemList = wAwardItemList
mailTypeKey = "CrossChampionshipPKWin%s" % groupMark
- tagPlayerID, tagPlayerName = loserID, loserName
+ tagPlayerID = loserID
else:
addItemList = fAwardItemList
mailTypeKey = "CrossChampionshipPKLose%s" % groupMark
- tagPlayerID, tagPlayerName = winnerID, winnerName
+ tagPlayerID = winnerID
rank = playerRankInfo.get(playerID, 0)
- GameWorld.Log(" 结算跨服排位赛玩家奖励: zoneID=%s,roomID=%s,groupMark=%s,battleNum=%s,rank=%s,tagPlayerID=%s"
- % (zoneID, roomID, groupMark, battleNum, rank, tagPlayerID), playerID)
+ GameWorld.Log(" 结算跨服排位赛玩家奖励: zoneID=%s,groupMark=%s,battleNum=%s,rank=%s,tagPlayerID=%s,addItemList=%s"
+ % (zoneID, groupMark, battleNum, rank, tagPlayerID, addItemList), playerID)
if rank:
paramList = [rank]
else:
@@ -1805,30 +1910,84 @@
playerIDList = [playerID]
PlayerCompensation.SendMailByKey(mailTypeKey, playerIDList, addItemList, paramList, crossMail=True)
- player = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
- if player:
- overPack = ChPyNetSendPack.tagGCCrossChampionshipPKOver()
- overPack.GroupMark = groupMark
- overPack.TimeStr = timeStr
- overPack.OverType = overType
- overPack.WinnerID = winnerID
- overPack.LoserID = loserID
- overPack.RoundWinnerID = roundWinnerIDList
- overPack.RoundCount = len(overPack.RoundWinnerID)
- overPack.TagName = tagPlayerName
- overPack.TagNameLen = len(overPack.TagName)
- overPack.Rank = rank
- NetPackCommon.SendFakePack(player, overPack)
-
# 同步子服
Send_CrossServerMsg_ChampionshipGroup(battleObj=battleObj)
# 记录流向
winnerInfo = winner.GetString() if winner else {}
loserInfo = loser.GetString() if loser else {}
- dataDict = {"roundWinnerIDList":roundWinnerIDList, "overType":overType, "winner":winnerInfo, "loser":loserInfo,
+ dataDict = {"winner":winnerInfo, "loser":loserInfo,
"battle":battleObj.GetString(), "playerRankInfo":playerRankInfo}
DR_CrossChampionshipPK("PKRoomOver", dataDict)
+ return True
+
+def ClientServerMsg_ChampionshipPKOver(serverGroupID, msgData):
+ ## 收到子服同步的镜像PK结果
+ playerID = msgData["playerID"]
+ tagPlayerID = msgData["tagPlayerID"]
+ funcLineID = msgData["funcLineID"]
+ isWin = msgData["isWin"]
+ addScore = msgData["addScore"]
+ baseScore = msgData["baseScore"]
+ hpScore = msgData["hpScore"]
+ timeScore = msgData["timeScore"]
+ pkCountMax = msgData["pkCountMax"]
+
+ zoneID = funcLineID / 100
+ groupMark = funcLineID % 100
+
+ groupMarkList = ShareDefine.CrossChampionshipEnterStateInfo.values()
+ if groupMark not in groupMarkList:
+ GameWorld.ErrLog("跨服排位镜像PK结果分组异常! groupMark=%s" % groupMark, playerID)
+ return
+
+ champMgr = GetChampionshipMgr()
+ pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+ if not pkZoneMgr:
+ return
+ battleObj = pkZoneMgr.GetBattleByPlayerID(groupMark, playerID)
+ if not battleObj:
+ GameWorld.ErrLog("跨服排位镜像PK结果玩家不在该排位分组中! zoneID=%s,groupMark=%s" % (zoneID, groupMark), playerID)
+ return
+ battleNum = battleObj.battleNum
+ playerIDA = battleObj.playerIDA
+ playerIDB = battleObj.playerIDB
+ roomPlayerIDList = [playerIDA, playerIDB]
+ # 有轮空的默认不用打
+ if playerID not in roomPlayerIDList or tagPlayerID not in roomPlayerIDList or not tagPlayerID or not playerIDA or not playerIDB:
+ GameWorld.ErrLog("跨服排位镜像PK结果玩家ID错误! zoneID=%s,groupMark=%s,playerID=%s,tagPlayerID=%s,roomPlayerIDList=%s"
+ % (zoneID, groupMark, playerID, tagPlayerID, roomPlayerIDList), playerID)
+ return
+ if playerID not in battleObj.playerBatDict:
+ battleObj.playerBatDict[playerID] = []
+ batRetList = battleObj.playerBatDict[playerID]
+ if len(batRetList) >= pkCountMax or not pkCountMax:
+ GameWorld.ErrLog("跨服排位镜像PK结果已达PK次数上限! zoneID=%s,groupMark=%s,playerID=%s,tagPlayerID=%s,batRetList=%s"
+ % (zoneID, groupMark, playerID, tagPlayerID, batRetList), playerID)
+ return
+ if battleObj.overTime:
+ GameWorld.ErrLog("跨服排位镜像PK胜负已经结算过了,不再更新PK结果! zoneID=%s,groupMark=%s,battleNum=%s,winPlayerID=%s,overTime=%s"
+ % (zoneID, groupMark, battleNum, battleObj.winPlayerID, GameWorld.ChangeTimeNumToStr(battleObj.overTime)), playerID)
+ return
+
+ isWin = 1 if isWin else 0
+ batRetList.append([isWin, addScore, baseScore, hpScore, timeScore])
+ GameWorld.Log("跨服排位镜像PK结果: zoneID=%s,groupMark=%s,battleNum=%s,playerIDA=%s,playerIDB=%s,batCount=%s,isWin=%s,addScore=%s,baseScore=%s,hpScore=%s,timeScore=%s"
+ % (zoneID, groupMark, battleNum, playerIDA, playerIDB, len(batRetList), isWin, addScore, baseScore, hpScore, timeScore), playerID)
+
+ # 是否都打完所有次数,是的话直接结算胜负
+ isAllOver = True
+ for roomPlayerID in roomPlayerIDList:
+ batList = battleObj.playerBatDict.get(roomPlayerID, [])
+ if len(batList) < pkCountMax:
+ isAllOver = False
+ break
+ if isAllOver:
+ if DoBattleOverLogic(zoneID, groupMark, battleNum):
+ return
+
+ # 同步子服
+ Send_CrossServerMsg_ChampionshipGroup(battleObj=battleObj)
return
def DoCrossChampionshipFinalOver():
@@ -1841,13 +2000,25 @@
champMgr = GetChampionshipMgr()
champMgr.ClearOfficialZone() # 最终结算重置仙官信息,替换最新仙官
+ # 膜拜重置
+ worshipType = ShareDefine.Def_WorshipType_CrossChampionship
+ GameWorship.DelWorshipPlayer(worshipType)
+
pkZoneIDList = champMgr.GetChampPKZoneIDList()
GameWorld.Log("pkZoneIDList=%s" % pkZoneIDList)
+ syncNewWorshipList = []
+ syncNewXiangongDict = {}
+ crossZoneName = GameWorld.GetCrossZoneName()
for zoneID in pkZoneIDList:
GameWorld.Log("=== 结算排位分区: zoneID=%s ===" % zoneID, zoneID)
+ zoneIpyData = IpyGameDataPY.GetIpyGameData("CrossZonePK", crossZoneName, zoneID)
+ serverIDRangeList = zoneIpyData.GetServerGroupIDList() if zoneIpyData else []
+
finalPlayerIDList = []
pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+ if not pkZoneMgr:
+ continue
battleNumList = pkZoneMgr.battleInfo.get(finalGroupMark, {}).keys()
for battleNum in battleNumList:
batObj = pkZoneMgr.GetBattle(finalGroupMark, battleNum)
@@ -1873,8 +2044,9 @@
rankIpyData = IpyGameDataPY.GetIpyGameData("ChampionshipRank", rank)
officialID = rankIpyData.GetMainOfficialID() if rankIpyData else 0
rankAwardItemList = rankIpyData.GetRankAwardItemList() if rankIpyData else []
- GameWorld.Log(" 最终排名: zoneID=%s,rank=%s,playerID=%s,officialID=%s,rankAwardItemList=%s,accID=%s,fightPower=%s"
- % (zoneID, rank, playerID, officialID, rankAwardItemList, accID, fightPower), zoneID)
+ xiangongID = rankIpyData.GetXiangongID() if rankIpyData else 0
+ GameWorld.Log(" 最终排名: zoneID=%s,rank=%s,playerID=%s,officialID=%s,xiangongID=%s,rankAwardItemList=%s,accID=%s,fightPower=%s"
+ % (zoneID, rank, playerID, officialID, xiangongID, rankAwardItemList, accID, fightPower), zoneID)
if officialID:
offObj = ChampionshipOfficial()
@@ -1885,13 +2057,17 @@
offZoneMgr.officialInfo[officialID] = offObj
+
# 名次奖励
paramList = [rank]
PlayerCompensation.SendMailByKey("CrossChampionshipPKRank", [playerID], rankAwardItemList, paramList, crossMail=True)
+ GameXiangong.AddXiangongPlayer(xiangongID, playerID, serverIDRangeList, rank, syncNewXiangongDict)
+ GameWorship.AddWorshipPlayer(worshipType, rank, playerID, serverIDRangeList, syncNewWorshipList)
+
# 处理4强竞猜发奖励
guessType = 4
- moneyType, _ = IpyGameDataPY.GetFuncEvalCfg("CrossChamGuess", 1)
+ moneyType = ShareDefine.TYPE_Price_GongdePoint
multiPriceDict = IpyGameDataPY.GetFuncEvalCfg("CrossChamGuess", 4, {}) # 猜中奖励倍值字典
moneyItemID = ChConfig.MoneyItemIDDict.get(moneyType)
GameWorld.Log("竞猜返利货币类型: moneyType=%s,moneyItemID=%s,multiPriceDict=%s" % (moneyType, moneyItemID, multiPriceDict), zoneID)
@@ -1902,6 +2078,7 @@
for guessObj in guessList:
if guessObj.guessType != guessType or guessObj.guessPlayerID != guessPlayerID:
continue
+ guessObj.isClose = 1
tagPlayerID = guessObj.tagPlayerID
guessRank = guessObj.guessRank
moneyTotal = guessObj.moneyTotal
@@ -1926,6 +2103,10 @@
serverGroupIDList = [] # 全服统一逻辑
PlayerControl.WorldNotifyCross(serverGroupIDList, 0, "ChampionshipOver")
+
+ # 通知新添加的膜拜
+ GameWorship.SendNewWorshipPlayer(syncNewWorshipList)
+ GameXiangong.SendNewXiangongPlayerToClientServer(syncNewXiangongDict)
GameWorld.Log("===================================================================")
return
@@ -1934,6 +2115,8 @@
champMgr = GetChampionshipMgr()
pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+ if not pkZoneMgr:
+ return {}
# 决赛
finalGroupMark = 2
@@ -2021,9 +2204,8 @@
if syncZonID != None and zoneID != syncZonID:
continue
offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID)
- if syncOfficialIDList == None:
- syncOfficialIDList = offZoneMgr.officialInfo.keys()
- for officialID in syncOfficialIDList:
+ officialIDList = offZoneMgr.officialInfo.keys() if syncOfficialIDList == None else syncOfficialIDList
+ for officialID in officialIDList:
offObj = offZoneMgr.GetOfficialObj(officialID)
if not offObj:
continue
@@ -2170,6 +2352,8 @@
champMgr = GetChampionshipMgr()
pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+ if not pkZoneMgr:
+ return
tagBatPlayer = pkZoneMgr.GetBatPlayer(tagPlayerID)
if not tagBatPlayer:
GameWorld.ErrLog("该分区不存在该参赛玩家,无法排位竞猜! zoneID=%s,tagPlayerID=%s" % (zoneID, tagPlayerID), playerID)
@@ -2280,7 +2464,21 @@
playerID = msgData["playerID"]
mainOfficialID = msgData["mainOfficialID"]
officialID = msgData["officialID"]
+ cancel = msgData["cancel"]
PropData = msgData["PropData"]
+
+ if cancel:
+ champMgr = GetChampionshipMgr()
+ offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID)
+ officialObj = offZoneMgr.GetOfficialObj(officialID)
+ if not officialObj:
+ return
+ if playerID not in officialObj.applyPlayerInfo:
+ GameWorld.ErrLog("不在仙官申请列表里! zoneID=%s,mainOfficialID=%s,officialID=%s" % (zoneID, mainOfficialID, officialID), playerID)
+ return
+ officialObj.applyPlayerInfo.pop(playerID, None)
+ Send_CrossServerMsg_ChampionshipOfficial(zoneID, [officialID])
+ return
mainIpyData = IpyGameDataPY.GetIpyGameData("ChampionshipOfficial", mainOfficialID)
if not mainIpyData:
@@ -2306,7 +2504,7 @@
if not mainOffObj or not officialObj:
return
- if mainOffObj.playerID:
+ if not mainOffObj.playerID:
GameWorld.Log("仙官所属界主无玩家,无法申请! zoneID=%s,mainOfficialID=%s,officialID=%s" % (zoneID, mainOfficialID, officialID), playerID)
return
@@ -2491,7 +2689,7 @@
if not mainOffObj or not officialObj:
return
- if mainOffObj.playerID:
+ if not mainOffObj.playerID:
GameWorld.Log("仙官所属界主无玩家,无法挑战! zoneID=%s,mainOfficialID=%s,officialID=%s" % (zoneID, mainOfficialID, officialID), playerID)
return
@@ -2520,6 +2718,7 @@
GameWorld.Log("挑战目标仙官玩家ID结果! zoneID=%s,mainOfficialID=%s,officialID=%s,fightPower=%s,tagFightPower=%s,tagPlayerID=%s,Ret=%s"
% (zoneID, mainOfficialID, officialID, fightPower, tagFightPower, tagPlayerID, Ret), playerID)
+ syncOfficialIDList = [officialID]
playerName = PropData.get("Name", str(playerID))
# 暂时只记录挑战胜利的
if Ret == 1:
@@ -2538,13 +2737,22 @@
officialObj.ResetPlayer()
officialObj.playerID = playerID
+ # 移除该玩家的其他仙官申请
+ for offID in offZoneMgr.officialInfo.keys():
+ offObj = offZoneMgr.GetOfficialObj(offID)
+ if not offObj:
+ continue
+ if playerID in offObj.applyPlayerInfo:
+ offObj.applyPlayerInfo.pop(playerID)
+ syncOfficialIDList.append(offID)
+
# 邮件通知对方,官职被挑战了
if offPlayerID:
PlayerCompensation.SendMailByKey("CrossChampionshipOfficialBeChallenge", [offPlayerID], [], [playerName, officialID], crossMail=True)
exData = {"exDataType":"OfficialChallenge", "playerID":playerID, "tagPlayerName":officialObj.playerName,
"mainOfficialID":mainOfficialID, "officialID":officialID, "Ret":Ret}
- Send_CrossServerMsg_ChampionshipOfficial(zoneID, [officialID], exData=exData)
+ Send_CrossServerMsg_ChampionshipOfficial(zoneID, syncOfficialIDList, exData=exData)
return
#// C0 23 跨服排位仙官挑战记录查询 #tagCGChampionshipOfficialChallengeQuery
@@ -2740,14 +2948,19 @@
def Sync_ChampionshipPKZoneGroupInfo(zoneID, groupMarkDict=None, curPlayer=None):
## 同步排位分区分组信息
# @param groupMarkDict: {groupMark:[battleNum, ...], ...}
-
+
champMgr = GetChampionshipMgr()
if curPlayer:
playerZoneID = champMgr.GetPlayerPKZoneID(curPlayer.GetPlayerID())
if playerZoneID != zoneID:
return
+ if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
+ return
pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+ if not pkZoneMgr:
+ return
+
if groupMarkDict == None:
groupMarkDict = {}
for groupMark, groupDict in pkZoneMgr.battleInfo.items():
@@ -2760,9 +2973,11 @@
battleObj = pkZoneMgr.GetBattle(groupMark, battleNum)
if not battleObj:
continue
- playerIDList.append(battleObj.playerIDA)
- playerIDList.append(battleObj.playerIDB)
-
+ if battleObj.playerIDA not in playerIDList:
+ playerIDList.append(battleObj.playerIDA)
+ if battleObj.playerIDB not in playerIDList:
+ playerIDList.append(battleObj.playerIDB)
+
clientPack = ChPyNetSendPack.tagGCCrossChampionshipPKZoneGroupInfo()
clientPack.ActID = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipID)
clientPack.StateError = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError)
@@ -2776,11 +2991,14 @@
battleObj = pkZoneMgr.GetBattle(groupMark, battleNum)
if not battleObj:
continue
+ battleRetDict = {str(k):v for k, v in battleObj.playerBatDict.items()}
battlePack = ChPyNetSendPack.tagGCCrossChampionshipPKBattle()
battlePack.BattleNum = battleNum
battlePack.WinPlayerID = battleObj.winPlayerID
battlePack.PlayerIDA = battleObj.playerIDA
battlePack.PlayerIDB = battleObj.playerIDB
+ battlePack.BattleRet = json.dumps(battleRetDict, ensure_ascii=False).replace(" ", "")
+ battlePack.BattleRetLen = len(battlePack.BattleRet)
groupPack.BattleList.append(battlePack)
groupPack.BattleCount = len(groupPack.BattleList)
clientPack.GroupList.append(groupPack)
@@ -2800,6 +3018,9 @@
playerPack.FightPower = batPlayer.fightPower % ShareDefine.Def_PerPointValue
playerPack.FightPowerEx = batPlayer.fightPower / ShareDefine.Def_PerPointValue
playerPack.RealmLV = batPlayer.realmLV
+ playerPack.Face = batPlayer.face
+ playerPack.FacePic = batPlayer.facePic
+ playerPack.ServerID = GameWorld.GetAccIDServerID(batPlayer.accID)
clientPack.PlayerList.append(playerPack)
clientPack.PlayerCount = len(clientPack.PlayerList)
@@ -2814,6 +3035,8 @@
playerZoneID = champMgr.GetPlayerPKZoneID(curPlayer.GetPlayerID())
if playerZoneID != zoneID:
continue
+ if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
+ continue
NetPackCommon.SendFakePack(curPlayer, clientPack)
return
@@ -2827,8 +3050,12 @@
playerZoneID = champMgr.GetPlayerPKZoneID(playerID)
if not playerZoneID:
return
+ if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
+ return
pkZoneMgr = champMgr.GetChampPKZoneMgr(playerZoneID)
+ if not pkZoneMgr:
+ return
clientPack = ChPyNetSendPack.tagGCChampionshipGuessPriInfo()
clientPack.ZoneID = playerZoneID
@@ -2870,8 +3097,12 @@
playerZoneID = champMgr.GetPlayerPKZoneID(curPlayer.GetPlayerID())
if playerZoneID != zoneID:
return
+ if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
+ return
pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
+ if not pkZoneMgr:
+ return
# 公共竞猜信息
clientPack = ChPyNetSendPack.tagGCChampionshipGuessPubInfo()
@@ -2911,6 +3142,8 @@
playerZoneID = champMgr.GetPlayerPKZoneID(curPlayer.GetPlayerID())
if playerZoneID != zoneID:
continue
+ if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
+ continue
NetPackCommon.SendFakePack(curPlayer, clientPack)
return
@@ -2922,6 +3155,8 @@
if curPlayer:
playerZoneID = champMgr.GetPlayerOfficialZoneID(curPlayer.GetPlayerID())
if playerZoneID != zoneID:
+ return
+ if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
return
clientPack = ChPyNetSendPack.tagGCChampionshipOfficialInfo()
@@ -2945,6 +3180,8 @@
offPlayer.FightPower = offObj.fightPower % ShareDefine.Def_PerPointValue
offPlayer.FightPowerEx = offObj.fightPower / ShareDefine.Def_PerPointValue
offPlayer.RealmLV = offObj.realmLV
+ offPlayer.Face = offObj.face
+ offPlayer.FacePic = offObj.facePic
offPack = ChPyNetSendPack.tagGCChampionshipOfficial()
offPack.OfficialID = officialID
@@ -2964,6 +3201,8 @@
applyPlayer.FightPower = fightPower % ShareDefine.Def_PerPointValue
applyPlayer.FightPowerEx = fightPower / ShareDefine.Def_PerPointValue
applyPlayer.RealmLV = playerInfo.get("RealmLV", 1)
+ applyPlayer.Face = playerInfo.get("Face", 0)
+ applyPlayer.FacePic = playerInfo.get("FacePic", 0)
offPack.ApplyPlayerList.append(applyPlayer)
offPack.ApplyPlayerCount = len(offPack.ApplyPlayerList)
@@ -2982,6 +3221,8 @@
playerZoneID = champMgr.GetPlayerOfficialZoneID(curPlayer.GetPlayerID())
if playerZoneID != zoneID:
continue
+ if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
+ continue
NetPackCommon.SendFakePack(curPlayer, clientPack)
return
--
Gitblit v1.8.0