#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package CrossChampionship
|
#
|
# @todo:¿ç·þÅÅλÕù°ÔÈü
|
# @author hxp
|
# @date 2022-09-21
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: ¿ç·þÅÅλÕù°ÔÈü
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2022-09-21 21:30"""
|
#-------------------------------------------------------------------------------
|
|
import GameWorld
|
import ShareDefine
|
import IpyGameDataPY
|
import PlayerViewCache
|
import PlayerDBGSEvent
|
import ChPyNetSendPack
|
import IPY_PlayerDefine
|
import PlayerCompensation
|
import CrossRealmPlayer
|
import DataRecordPack
|
import CrossRealmMsg
|
import PlayerControl
|
import PyDataManager
|
import NetPackCommon
|
import GameXiangong
|
import GameWorship
|
import PyGameData
|
import ChConfig
|
import PlayerFB
|
|
import datetime
|
import random
|
import time
|
import json
|
|
Def_CrossChampionshipPlayerMax = 64 # ×î´óÍæ¼ÒÊý
|
Def_CrossChampionshipPlayerWFCount = 8 # ʤ¸ºÅÅλËùÐèÍæ¼ÒÊý
|
|
Def_RecType_CrossChampionshipGroup = ShareDefine.Def_UniversalGameRecType_CrossChampionshipGroup
|
'''
|
¿ç·þÅÅλÕù°ÔÈü·Ö×éÐÅÏ¢
|
ShareDefine.Def_UniversalGameRecType_CrossChampionshipGroup
|
time:time Õ½¶·½áËãʱ¼ä
|
value1:zoneID ·ÖÇøID
|
value2:groupInfo ·Ö×é±êʶ*100+¶ÔÕ½±àºÅ
|
value3:playerIDA Íæ¼ÒIDA
|
value4:playerIDB Íæ¼ÒIDB
|
value5:winPlayerID »ñÊ¤Íæ¼ÒID
|
strValue3:battleDict ¾µÏñPK³¡´Î½á¹û {"Íæ¼ÒID":[[µÚ1³¡Ê¤¸º,¼Ó»ý·Ö,...], ...], ...}
|
'''
|
|
Def_RecType_CrossChampionshipGuess = ShareDefine.Def_UniversalGameRecType_CrossChampionshipGuess
|
'''
|
¿ç·þÅÅλÕù°ÔÈü¾º²Â¼Ç¼ÐÅÏ¢
|
ShareDefine.Def_UniversalGameRecType_CrossChampionshipGuess
|
value1:zoneID ·ÖÇøID
|
value2:guessInfo ¾º²ÂÀàÐÍ*100 + ¾º²ÂÖµ£º ÀàÐÍ£º8-8Ç¿£»4-4Ç¿£» Öµ£º¶ÔÓ¦ÅÅÃû
|
value3:guessPlayerID ¾º²ÂÍæ¼ÒID
|
value4:tagPlayerID Ä¿±êÍæ¼ÒID
|
value5:moneyTotal Ͷע×Ü»õ±ÒÖµ
|
StrValue1:isClose ÊÇ·ñÒѽáËã
|
'''
|
|
Def_RecType_CrossChampionshipOfficial = ShareDefine.Def_UniversalGameRecType_CrossChampionshipOfficial
|
'''
|
¿ç·þÅÅλÕù°ÔÈü×îÖÕÅÅÃû¹ÙÖ°ÐÅÏ¢
|
ShareDefine.Def_UniversalGameRecType_CrossChampionshipOfficial
|
time:time ÉÏÒ»´Î´ÇÍËϼ¶ÏɹÙʱ¼ä
|
value1:¹ÙÖ°ID ¹ÙÖ°ID
|
value2:playerID Íæ¼ÒID£¬¿ÉÄÜΪ0
|
value3:worshipValue ±»Ä¤°Ý´ÎÊý*10 + ÊÇ·ñË«±¶
|
value4:rank ÅÅÃû
|
value5:zoneID ·ÖÇøID
|
StrValue3: [ÉêÇë¸Ã¹ÙÖ°Íæ¼ÒID,...]
|
'''
|
|
Def_RecType_CrossChampionshipOffChallenge = ShareDefine.Def_UniversalGameRecType_CrossChampionshipOffChallenge
|
'''
|
¿ç·þÅÅλÕù°ÔÈü¹ÙÖ°ÌôÕ½ÐÅÏ¢
|
ShareDefine.Def_UniversalGameRecType_CrossChampionshipOffChallenge
|
value1:¹ÙÖ°ID ¹ÙÖ°ID
|
value2:zoneID ·ÖÇøID
|
StrValue3: {ÌôÕ½Íæ¼ÒÐÅÏ¢key:value, ...}
|
'''
|
|
class ChampionshipOfficial():
|
## Õù°ÔÈü¹Ù¾ôÍæ¼Ò
|
|
def __init__(self):
|
self.zoneID = 0
|
self.officialID = 0 # ¹ÙÖ°ID
|
self.lastDismissJuniorTime = 0 # ÉϴδÇÍËϼ¶ÏɹÙʱ¼ä´Á
|
|
self.rank = 0 # Ãû´Î
|
self.worshipCount = 0 # ±»Ä¤°Ý´ÎÊý£¬ÈËÆøÖµ
|
self.applyPlayerInfo = {} # ÉêÇë¸Ã¹ÙÖ°Íæ¼ÒÐÅÏ¢ {playerID:{Íæ¼Ò¼ò¶ÌÐÅÏ¢×Öµä}, ...}
|
self.challengeList = [] # ÌôÕ½¼Ç¼ÐÅÏ¢ [{ÌôÕ½Íæ¼ÒÐÅÏ¢key:value, ...}, ...] key: Ret,AccID,Name,Time
|
|
self.ResetPlayer()
|
|
self.worshipDouble = 0 # Ĥ°ÝÊÇ·ñË«±¶
|
return
|
|
def ResetPlayer(self):
|
self.playerID = 0
|
self.accID = ""
|
self.playerName = ""
|
self.job = 0
|
self.lv = 0
|
self.fightPower = 0
|
self.realmLV = 0
|
self.face = 0
|
self.facePic = 0
|
return
|
|
def GetString(self):
|
for applyPlayerID in self.applyPlayerInfo.keys():
|
curCache = PlayerViewCache.FindViewCache(applyPlayerID)
|
if curCache:
|
playerShortInfo = {}
|
cacheDict = PlayerViewCache.GetCachePropDataDict(curCache)
|
playerShortInfo["AccID"] = cacheDict.get("AccID", "")
|
playerShortInfo["Name"] = cacheDict.get("Name", str(applyPlayerID))
|
playerShortInfo["Job"] = cacheDict.get("Job", 1)
|
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, "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
|
}
|
|
def SetAttr(self, attrDict):
|
for k, v in attrDict.items():
|
setattr(self, k, v)
|
return
|
|
class ChampionshipOfficialZoneMgr():
|
## Õù°ÔÈüÅÅλ·ÖÇø¹ÜÀí
|
|
def __init__(self, zoneID):
|
self.zoneID = zoneID
|
self.officialInfo = {} # ¹Ù¾ôÐÅÏ¢ {officialID:ChampionshipOfficial, ...}
|
return
|
|
def GetOfficialObj(self, officialID):
|
officialObj = None
|
if officialID in self.officialInfo:
|
officialObj = self.officialInfo[officialID]
|
if GameWorld.IsCrossServer() and officialObj.playerID:
|
UpdCachePlayerInfo(officialObj, officialObj.playerID)
|
else:
|
ipyData = IpyGameDataPY.GetIpyGameData("ChampionshipOfficial", officialID)
|
if ipyData:
|
officialObj = ChampionshipOfficial()
|
officialObj.zoneID = self.zoneID
|
officialObj.officialID = officialID
|
|
self.officialInfo[officialID] = officialObj
|
|
if not officialObj:
|
GameWorld.ErrLog("ÏɹٹÙÖ°Êý¾ÝÐÅÏ¢²»´æÔÚ! officialID=%s" % officialID)
|
|
return officialObj
|
|
def GetPlayerOfficial(self, playerID):
|
for offObj in self.officialInfo.values():
|
if offObj.playerID == playerID:
|
return offObj
|
return
|
|
class ChampionshipGuess():
|
## Õù°ÔÈü¾º²Â
|
|
def __init__(self):
|
self.zoneID = 0
|
self.guessType = 0 # ¾º²ÂÀàÐÍ£º8-8Ç¿£»4-4Ç¿
|
self.guessPlayerID = 0 # ¾º²ÂÍæ¼ÒID
|
self.tagPlayerID = 0 # Ä¿±êÍæ¼ÒID
|
self.moneyTotal = 0 # Ͷע×Ü»õ±ÒÖµ
|
self.guessRank = 0 # ¾º²ÂÃû´Î£¬Ã»ÓÐÃû´ÎµÄ¾º²ÂĬÈÏ0£»1-´ú±íµÚÒ»Ãû
|
self.isClose = 0 # ÊÇ·ñÒѽáËã
|
return
|
|
def GetString(self):
|
return {"zoneID":self.zoneID, "guessType":self.guessType, "guessRank":self.guessRank,
|
"guessPlayerID":self.guessPlayerID, "tagPlayerID":self.tagPlayerID, "moneyTotal":self.moneyTotal}
|
|
def SetAttr(self, attrDict):
|
for k, v in attrDict.items():
|
setattr(self, k, v)
|
return
|
|
|
class ChampionshipBatPlayer():
|
## Õù°ÔÈüÍæ¼Ò
|
|
def __init__(self):
|
self.zoneID = 0
|
self.accID = ""
|
self.playerID = 0
|
self.playerName = ""
|
self.job = 0
|
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, "face":self.face, "facePic":self.facePic}
|
|
def SetAttr(self, attrDict):
|
for k, v in attrDict.items():
|
setattr(self, k, v)
|
return
|
|
class ChampionshipBattle():
|
## Õù°ÔÈü¶ÔÕ½
|
|
def __init__(self):
|
self.overTime = 0 # Õ½¶·½áËãʱ¼ä
|
self.zoneID = 0
|
self.groupMark = 0 # ·Ö×é±êʶ£¬Èç 64 32 16 8 4 2
|
self.battleNum = 0 # ¶ÔÕ½±àºÅ£¬Èç 1 ~ 32
|
self.playerIDA = 0
|
self.playerIDB = 0
|
self.winPlayerID = 0
|
self.playerBatDict = {} # ¾µÏñPK³¡´Î½á¹û {"Íæ¼ÒID":[[µÚ1³¡Ê¤¸º,¼Ó»ý·Ö,...], ...], ...}
|
|
# ²»´æµµ
|
self.roomID = 0
|
self.mapID = 0
|
self.copyMapID = 0
|
return
|
|
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, "playerBatDict":self.playerBatDict}
|
|
def SetAttr(self, attrDict):
|
for k, v in attrDict.items():
|
setattr(self, k, v)
|
return
|
|
class ChampionshipPKZoneMgr():
|
## Õù°ÔÈüPK·ÖÇø¹ÜÀí
|
|
def __init__(self, zoneID):
|
self.zoneID = zoneID
|
self.playerDict = {} # ²ÎÈüÍæ¼Ò {playerID:ChampionshipBatPlayer, ...}
|
self.battleInfo = {} # ·Ö×é¶ÔÕ½ÐÅÏ¢ {·Ö×é±êʶ:{¶ÔÕ½±àºÅ:ChampionshipBattle, ...}, ...}
|
self.guessInfo = {} # ¾º²ÂÐÅÏ¢ {¾º²ÂÀàÐÍ:{¾º²ÂÍæ¼ÒID:[ChampionshipGuess, ...]}, ...}
|
self.supportCountInfo = {} # {¾º²ÂÀàÐÍ:{±»¾º²ÂÍæ¼ÒID:Ö§³ÖÈËÊý, ...}, ...}
|
|
# ×Ó·þ
|
self.syncGuessPlayerIDInfo = {} # ͬ²½¹ý¾º²ÂÐÅÏ¢µÄÍæ¼ÒID {playerID:tick, ...}
|
return
|
|
def AddBattle(self, groupMark, battleNum, battle):
|
if groupMark not in self.battleInfo:
|
self.battleInfo[groupMark] = {}
|
battleDict = self.battleInfo[groupMark]
|
battleDict[battleNum] = battle
|
self.battleInfo[groupMark] = battleDict
|
return
|
|
def GetBattle(self, groupMark, battleNum):
|
battle = None
|
if groupMark in self.battleInfo:
|
battleDict = self.battleInfo[groupMark]
|
if battleNum in battleDict:
|
battle = battleDict[battleNum]
|
|
if not battle:
|
GameWorld.Log("Î޸ÿç·þÅÅλÕù°ÔÈü¶ÔÕ½³¡´ÎÐÅÏ¢: groupMark=%s,battleNum=%s" % (groupMark, battleNum))
|
|
# ²»¿ÉÄÜÖ´ÐеĴúÂ룬·½±ã . ³öÌáʾ´úÂë
|
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
|
|
def GetBatPlayerIDList(self): return self.playerDict.keys()
|
def GetBatPlayer(self, playerID):
|
batPlayer = None
|
if playerID in self.playerDict:
|
batPlayer = self.playerDict[playerID]
|
if GameWorld.IsCrossServer():
|
UpdCachePlayerInfo(batPlayer, playerID)
|
|
# ²»¿ÉÄÜÖ´ÐеĴúÂ룬·½±ã . ³öÌáʾ´úÂë
|
if False:
|
batPlayer = ChampionshipBatPlayer()
|
return batPlayer
|
|
def GetPlayerGuessList(self, playerID, guessType):
|
## »ñÈ¡Íæ¼Ò¾º²ÂÁбí
|
if guessType not in self.guessInfo:
|
self.guessInfo[guessType] = {}
|
playerGuessDict = self.guessInfo[guessType]
|
if playerID not in playerGuessDict:
|
playerGuessDict[playerID] = []
|
return playerGuessDict[playerID]
|
|
def GetTop8PlayerIDList(self):
|
## »ñȡǰ8Ç¿Íæ¼ÒIDÁбí
|
top8PlayerIDList = []
|
preGroupMark = 16 # È¡16ǿս¶·Ê¤Õß
|
battleNumList = self.battleInfo.get(preGroupMark, {}).keys()
|
for battleNum in battleNumList:
|
batObj = self.GetBattle(preGroupMark, battleNum)
|
if not batObj:
|
continue
|
if batObj.overTime and batObj.winPlayerID:
|
top8PlayerIDList.append(batObj.winPlayerID)
|
return top8PlayerIDList
|
|
def UpdCachePlayerInfo(obj, playerID):
|
## ¸üÐÂÍæ¼Ò»º´æÐÅÏ¢
|
|
# »úÆ÷ÈË
|
if not obj or not hasattr(obj, "playerName"):
|
return
|
|
packDataObj = PyDataManager.GetDBPlayerPackDataManager().GetPlayerPackObj(playerID)
|
# Èç¹ûÓдò°üÊý¾Ý£¬ÒÔ´ò°üÊý¾ÝΪ׼
|
if packDataObj:
|
obj.accID = packDataObj.accID
|
obj.playerName = packDataObj.playerName
|
obj.job = packDataObj.job
|
obj.lv = packDataObj.lv
|
obj.fightPower = packDataObj.fightPower
|
obj.realmLV = packDataObj.realmLV
|
obj.face = packDataObj.face
|
obj.facePic = packDataObj.facePic
|
return
|
|
if playerID < 10000:
|
if obj.playerName:
|
return
|
obj.accID = "accID%s@robot@s1" % (playerID)
|
obj.playerName = "name%s" % playerID
|
obj.job = random.randint(1, 2)
|
obj.lv = random.randint(200, 300)
|
obj.fightPower = random.randint(100000, 1000000)
|
obj.realmLV = random.randint(10, 20)
|
return
|
curCache = PlayerViewCache.FindViewCache(playerID)
|
if curCache:
|
cacheDict = PlayerViewCache.GetCachePropDataDict(curCache)
|
obj.accID = cacheDict.get("AccID", obj.accID)
|
obj.playerName = cacheDict.get("Name", obj.playerName)
|
obj.job = cacheDict.get("Job", obj.job)
|
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
|
|
class ChampionshipMgr():
|
## Õù°ÔÈü¹ÜÀí
|
|
def __init__(self):
|
'''×¢ÒâÇø·Ö¿ç·þÆ¥Åä·ÖÇø¡¢ÅÅλ·ÖÇø¡¢ÏɹٷÖÇø£¬ÈýÕß²»Ò»Ñù
|
Æ¥Åä·ÖÇø£ºµ±Ç°½øÐÐÖеĿç·þÆ¥ÅäPK·ÖÇø CrossRealmPK
|
ÅÅλ·ÖÇø£ºÈ¡ÉÏÒ»Èü¼¾µÄ¿ç·þÆ¥ÅäPK·ÖÇøÅÅÃûǰ64×÷ΪPK·ÖÇø£¬¿ÉÄÜÓ뵱ǰ½øÐÐÖеĿç·þPK·ÖÇø²»Ò»Ñù
|
ÏɹٷÖÇø£ºÓÉÅÅλ·ÖÇøPK¾ö³öµÄ½á¹û×öΪÏɹٷÖÇø£¬¿ÉÄÜÓ뵱ǰ½øÐÐÖеÄÅÅλPK·ÖÇø²»Ò»Ñù
|
'''
|
self._pkZoneInfo = {} # ÅÅλ¶ÔÕ½·ÖÇø {zoneID:ChampionshipZoneMgr, ...}
|
self._officialZoneInfo = {} # ÏɹٷÖÇø {zoneID:ChampionshipOfficialZoneMgr, ...}
|
return
|
|
def ClearPKZone(self):
|
self._pkZoneInfo = {}
|
return
|
|
def GetChampPKZoneIDList(self): return self._pkZoneInfo.keys()
|
def GetChampPKZoneMgr(self, zoneID, addNew=False):
|
pkZoneMgr = None
|
if zoneID in self._pkZoneInfo:
|
pkZoneMgr = self._pkZoneInfo[zoneID]
|
elif addNew:
|
pkZoneMgr = ChampionshipPKZoneMgr(zoneID)
|
self._pkZoneInfo[zoneID] = pkZoneMgr
|
if not pkZoneMgr:
|
GameWorld.ErrLog("ÕÒ²»µ½¿ç·þÅÅλÈü·ÖÇø¹ÜÀí! zoneID=%s" % zoneID)
|
return pkZoneMgr
|
|
def GetPlayerPKZoneID(self, playerID):
|
## »ñÈ¡Íæ¼ÒÅÅÎ»Íæ·¨ËùÊô·ÖÇø - ×Ó·þרÓÃ
|
# @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)
|
|
##=============================================================================================
|
|
def ClearOfficialZone(self):
|
self._officialZoneInfo = {}
|
return
|
|
def GetChampOfficialZoneIDList(self): return self._officialZoneInfo.keys()
|
def GetChampOfficialZoneMgr(self, zoneID):
|
if zoneID in self._officialZoneInfo:
|
offZoneMgr = self._officialZoneInfo[zoneID]
|
else:
|
offZoneMgr = ChampionshipOfficialZoneMgr(zoneID)
|
self._officialZoneInfo[zoneID] = offZoneMgr
|
return offZoneMgr
|
|
def GetPlayerOfficialZoneID(self, playerID):
|
## »ñÈ¡Íæ¼ÒÅÅÎ»Íæ·¨ËùÊô·ÖÇø - ×Ó·þרÓÃ
|
# @return: Èç¹ûÔÚ·ÖÇøÈÎÖ°ÖÐÔò·µ»ØËùÔÚÅÅλ·ÖÇø£¬·ñÔò·µ»Øµ±Ç°·þÎñÆ÷ËùÔÚ¿ç·þÆ¥ÅäPK·ÖÇø
|
for zoneID in self._officialZoneInfo.keys():
|
offZoneMgr = self.GetChampOfficialZoneMgr(zoneID)
|
if offZoneMgr.GetPlayerOfficial(playerID):
|
return zoneID
|
return GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID)
|
|
def GetChampionshipMgr():
|
mgr = PyGameData.g_championshipMgr
|
if mgr == None:
|
mgr = ChampionshipMgr()
|
PyGameData.g_championshipMgr = mgr
|
return mgr
|
|
def OnServerStart():
|
|
if not GameWorld.IsCrossServer():
|
return
|
|
champMgr = GetChampionshipMgr()
|
|
universalRecMgr = GameWorld.GetUniversalRecMgr()
|
groupRecDataList = universalRecMgr.GetTypeList(Def_RecType_CrossChampionshipGroup)
|
GameWorld.Log("¼ÓÔØ¿ç·þÅÅÎ»Íæ¼Ò·Ö×é¼Ç¼! %s" % groupRecDataList.Count())
|
groupMarkList = ShareDefine.CrossChampionshipEnterStateInfo.values()
|
|
for index in xrange(groupRecDataList.Count()):
|
recData = groupRecDataList.At(index)
|
overTime = recData.GetTime()
|
zoneID = recData.GetValue1()
|
groupInfo = recData.GetValue2()
|
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, True)
|
|
if groupMark in groupMarkList and battleNum:
|
battle = ChampionshipBattle()
|
battle.overTime = overTime
|
battle.zoneID = zoneID
|
battle.groupMark = groupMark
|
battle.battleNum = battleNum
|
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))
|
|
# ·Ç·Ö×éÊý¾ÝΪ²ÎÈüÍæ¼ÒÊý¾Ý
|
elif playerIDA:
|
playerID = playerIDA
|
batPlayer = ChampionshipBatPlayer()
|
batPlayer.zoneID = zoneID
|
batPlayer.playerID = playerID
|
pkZoneMgr.playerDict[playerID] = batPlayer
|
GameWorld.Log("²ÎÈüÍæ¼Ò: zoneID=%s,playerID=%s" % (zoneID, playerID))
|
|
guessRecDataList = universalRecMgr.GetTypeList(Def_RecType_CrossChampionshipGuess)
|
GameWorld.Log("¼ÓÔØ¿ç·þÅÅÎ»Íæ¼Ò¾º²Â¼Ç¼! %s" % guessRecDataList.Count())
|
for index in xrange(guessRecDataList.Count()):
|
recData = guessRecDataList.At(index)
|
zoneID = recData.GetValue1()
|
guessInfo = recData.GetValue2()
|
guessType = guessInfo / 100
|
guessRank = guessInfo % 100
|
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
|
guessObj.guessType = guessType
|
guessObj.guessRank = guessRank
|
guessObj.guessPlayerID = guessPlayerID
|
guessObj.tagPlayerID = tagPlayerID
|
guessObj.moneyTotal = moneyTotal
|
guessObj.isClose = isClose
|
playerGuessList.append(guessObj)
|
|
if guessType not in pkZoneMgr.supportCountInfo:
|
pkZoneMgr.supportCountInfo[guessType] = {}
|
playerSupportCountDict = pkZoneMgr.supportCountInfo[guessType]
|
playerSupportCountDict[tagPlayerID] = playerSupportCountDict.get(tagPlayerID, 0) + 1
|
|
officialRecDataList = universalRecMgr.GetTypeList(Def_RecType_CrossChampionshipOfficial)
|
GameWorld.Log("¼ÓÔØ¿ç·þÅÅÎ»Íæ¼Ò¹ÙÖ°ÐÅÏ¢! %s" % officialRecDataList.Count())
|
for index in xrange(officialRecDataList.Count()):
|
recData = officialRecDataList.At(index)
|
lastDismissJuniorTime = recData.GetTime()
|
officialID = recData.GetValue1()
|
zoneID = recData.GetValue5()
|
playerID = recData.GetValue2()
|
worshipValue = recData.GetValue3()
|
worshipCount = worshipValue / 10
|
worshipDouble = worshipValue % 10
|
rank = recData.GetValue4()
|
strValue3 = recData.GetStrValue3()
|
try:
|
applyPlayerIDList = eval(strValue3) if strValue3 else []
|
except:
|
applyPlayerIDList = []
|
|
offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID)
|
|
offObj = ChampionshipOfficial()
|
offObj.zoneID = zoneID
|
offObj.officialID = officialID
|
offObj.lastDismissJuniorTime = lastDismissJuniorTime
|
offObj.playerID = playerID
|
offObj.worshipCount = worshipCount
|
offObj.worshipDouble = worshipDouble
|
offObj.rank = rank
|
offObj.applyPlayerInfo = {applyPlayerID:{} for applyPlayerID in applyPlayerIDList}
|
|
offZoneMgr.officialInfo[officialID] = offObj
|
GameWorld.Log(" zoneID=%s,officialID=%s,playerID=%s,rank=%s" % (zoneID, officialID, playerID, rank))
|
|
challengeRecDataList = universalRecMgr.GetTypeList(Def_RecType_CrossChampionshipOffChallenge)
|
GameWorld.Log("¼ÓÔØ¿ç·þÅÅλ¹ÙÖ°ÌôÕ½¼Ç¼ÐÅÏ¢! %s" % challengeRecDataList.Count())
|
for index in xrange(challengeRecDataList.Count()):
|
recData = challengeRecDataList.At(index)
|
officialID = recData.GetValue1()
|
zoneID = recData.GetValue2()
|
strValue3 = recData.GetStrValue3()
|
if not strValue3:
|
continue
|
try:
|
challengeDict = eval(strValue3)
|
except:
|
continue
|
|
offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID)
|
offObj = offZoneMgr.GetOfficialObj(officialID)
|
if not offObj:
|
continue
|
offObj.challengeList.append(challengeDict)
|
#GameWorld.Log(" zoneID=%s,officialID=%s,ÌôÕ½¼Ç¼=%s" % (zoneID, officialID, challengeDict))
|
|
return
|
|
def OnServerClose():
|
SaveChampionshipData()
|
return
|
|
def SaveChampionshipData():
|
if not GameWorld.IsCrossServer():
|
return
|
|
champMgr = GetChampionshipMgr()
|
universalRecMgr = GameWorld.GetUniversalRecMgr()
|
|
pkZoneIDList = champMgr.GetChampPKZoneIDList()
|
GameWorld.Log("±£´æ¿ç·þÅÅÎ»Íæ¼Ò·Ö×é¼Ç¼! pkZoneIDList=%s" % pkZoneIDList)
|
universalRecMgr.Delete(Def_RecType_CrossChampionshipGroup)
|
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))
|
for playerID in batPlayerIDList:
|
recData = groupRecDataList.AddRec()
|
recData.SetValue1(zoneID)
|
recData.SetValue2(0) # ÎÞ·Ö×éÍæ¼Ò£¬´ú±í²ÎÈüÍæ¼Ò·Ö×éÐÅÏ¢´æ0
|
recData.SetValue3(playerID)
|
|
# ±£´æ·Ö×é¼Ç¼
|
GameWorld.Log(" zoneID=%s,battleInfoKey=%s" % (zoneID, pkZoneMgr.battleInfo.keys()))
|
for groupMark, groupDict in pkZoneMgr.battleInfo.items():
|
GameWorld.Log(" zoneID=%s,groupMark=%s,count=%s" % (zoneID, groupMark, len(groupDict)))
|
for battleNum, batObj in groupDict.items():
|
groupInfo = groupMark * 100 + battleNum # ·Ö×é±êʶ*100+¶ÔÕ½±àºÅ
|
recData = groupRecDataList.AddRec()
|
recData.SetTime(batObj.overTime)
|
recData.SetValue1(zoneID)
|
recData.SetValue2(groupInfo) # ÎÞ·Ö×éÍæ¼Ò£¬´ú±í²ÎÈüÍæ¼Ò·Ö×éÐÅÏ¢´æ0
|
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)))
|
for guessObj in guessObjList:
|
recData = guessRecDataList.AddRec()
|
recData.SetValue1(zoneID)
|
recData.SetValue2(guessType * 100 + guessObj.guessRank)
|
recData.SetValue3(guessPlayerID)
|
recData.SetValue4(guessObj.tagPlayerID)
|
recData.SetValue5(guessObj.moneyTotal)
|
recData.SetStrValue1("%s" % guessObj.isClose)
|
|
offZoneIDList = champMgr.GetChampOfficialZoneIDList()
|
GameWorld.Log("±£´æ¿ç·þÅÅÎ»Íæ¼Ò¹ÙÖ°ÐÅÏ¢! offZoneIDList=%s" % offZoneIDList)
|
universalRecMgr.Delete(Def_RecType_CrossChampionshipOfficial)
|
officialRecDataList = universalRecMgr.GetTypeList(Def_RecType_CrossChampionshipOfficial)
|
universalRecMgr.Delete(Def_RecType_CrossChampionshipOffChallenge)
|
challengeRecDataList = universalRecMgr.GetTypeList(Def_RecType_CrossChampionshipOffChallenge)
|
for zoneID in offZoneIDList:
|
offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID)
|
#GameWorld.Log(" zoneID=%s,officialInfoKey=%s" % (zoneID, offZoneMgr.officialInfo.keys()))
|
for officialID in offZoneMgr.officialInfo.keys():
|
offObj = offZoneMgr.GetOfficialObj(officialID)
|
if not offObj:
|
continue
|
recData = officialRecDataList.AddRec()
|
recData.SetTime(offObj.lastDismissJuniorTime)
|
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)))
|
for challengeDict in offObj.challengeList:
|
challRecData = challengeRecDataList.AddRec()
|
challRecData.SetValue1(officialID)
|
challRecData.SetValue2(zoneID)
|
strValue3 = str(challengeDict)
|
strValue3 = strValue3.replace(" ", "")
|
challRecData.SetStrValue3(strValue3)
|
|
return
|
|
def DoOnDay():
|
|
if not GameWorld.IsCrossServer():
|
return
|
|
dailyOfficialInfo = {}
|
champMgr = GetChampionshipMgr()
|
for zoneID in champMgr.GetChampOfficialZoneIDList():
|
offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID)
|
for officialID in offZoneMgr.officialInfo.keys():
|
offObj = offZoneMgr.GetOfficialObj(officialID)
|
if not offObj:
|
continue
|
if not offObj.playerID:
|
continue
|
dailyOfficialInfo[offObj.playerID] = officialID
|
|
if dailyOfficialInfo:
|
serverGroupIDList = []
|
CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ChampionshipDailyOfficial, dailyOfficialInfo, serverGroupIDList)
|
|
return
|
|
def DoOnDayEx():
|
|
if not GameWorld.IsCrossServer():
|
return
|
|
champMgr = GetChampionshipMgr()
|
for zoneID in champMgr.GetChampOfficialZoneIDList():
|
syncOfficialIDList = []
|
mainOfficialList = [] # ½öÖ÷Ïɹٿɱ»Ä¤°Ý
|
offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID)
|
for officialID in offZoneMgr.officialInfo.keys():
|
offObj = offZoneMgr.GetOfficialObj(officialID)
|
if not offObj:
|
continue
|
if not offObj.playerID:
|
continue
|
|
if offObj.worshipDouble:
|
offObj.worshipDouble = 0 # ÖØÖÃÿÈÕË«±¶Ä¤°Ý
|
syncOfficialIDList.append(officialID)
|
GameWorld.Log("ÖØÖýñÈÕË«±¶Ä¤°ÝÌØÈ¨ÏɹÙ: zoneID=%s,officialID=%s,playerID=%s"
|
% (zoneID, officialID, offObj.playerID), zoneID)
|
|
mainIpyData = IpyGameDataPY.GetIpyGameData("ChampionshipOfficial", officialID)
|
if mainIpyData and mainIpyData.GetJuniorOfficialIDList():
|
mainOfficialList.append(offObj)
|
|
if mainOfficialList:
|
offObj = random.choice(mainOfficialList)
|
officialID = offObj.officialID
|
offObj.worshipDouble = 1 # Ëæ»úij¸öÏɹٻñµÃ½ñÈÕË«±¶ÌØÈ¨
|
GameWorld.Log("Ëæ»ú½ñÈÕË«±¶Ä¤°ÝÌØÈ¨ÏɹÙ: zoneID=%s,officialID=%s,playerID=%s"
|
% (zoneID, officialID, offObj.playerID), zoneID)
|
if officialID not in syncOfficialIDList:
|
syncOfficialIDList.append(officialID)
|
|
if syncOfficialIDList:
|
Send_CrossServerMsg_ChampionshipOfficial(zoneID, syncOfficialIDList)
|
|
return
|
|
def IsChampionshipPlayer(playerID):
|
## ÊÇ·ñÅÅλÈüÏà¹ØÍæ¼Ò
|
|
champMgr = GetChampionshipMgr()
|
for zoneID in champMgr.GetChampPKZoneIDList():
|
pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
|
if not pkZoneMgr:
|
continue
|
if playerID in pkZoneMgr.GetBatPlayerIDList():
|
# ÊDzÎÈüÍæ¼Ò
|
return True
|
|
for zoneID in champMgr.GetChampOfficialZoneIDList():
|
offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID)
|
for offObj in offZoneMgr.officialInfo.values():
|
if playerID == offObj.playerID:
|
# ÊÇÏɹÙ
|
return True
|
if playerID in offObj.applyPlayerInfo:
|
# ÉêÇëÏɹÙÖÐ
|
return True
|
return False
|
|
def CrossServerMsg_ChampionshipDailyOfficial(msgData):
|
## ÊÕµ½¿ç·þ·þÎñÆ÷ÐÅÏ¢ - ÿÈÕ¹Ù¾ôÍæ¼ÒÐÅÏ¢
|
|
for playerID, officialID in msgData.items():
|
if not PlayerControl.GetDBPlayerAccIDByID(playerID):
|
# ·Ç±¾·þÍæ¼Ò
|
continue
|
ipyData = IpyGameDataPY.GetIpyGameData("ChampionshipOfficial", officialID)
|
if not ipyData:
|
continue
|
awardItemList = ipyData.GetDailyAwardItemList()
|
if not awardItemList:
|
continue
|
paramList = [officialID]
|
PlayerCompensation.SendMailByKey("CrossChampionshipOfficialDaily", [playerID], awardItemList, paramList)
|
|
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()
|
for zoneID in pkZoneIDList:
|
Sync_ChampionshipPKZoneGroupInfo(zoneID, curPlayer=curPlayer)
|
for zoneID in champMgr.GetChampOfficialZoneIDList():
|
Sync_ChampionshipOfficialInfo(zoneID, curPlayer=curPlayer)
|
|
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)
|
else:
|
Sync_ChampionshipGuessPriInfo(curPlayer)
|
Sync_ChampionshipGuessPubInfo(playerZoneID, curPlayer)
|
|
return
|
|
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():
|
## »ñÈ¡ÅÅλÈü¿ªÊ¼ÈÕÆÚ
|
|
key = "ChampionshipStartDate"
|
openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1
|
loadSign = openServerDay
|
ChampionshipStartDateInfo = IpyGameDataPY.GetConfigEx(key)
|
if ChampionshipStartDateInfo and ChampionshipStartDateInfo[0] == loadSign:
|
GameWorld.DebugLog("ÒѾ¼ÓÔØ¹ý±¾ÈÕ¿ç·þÅÅλÕù°ÔÈü¿ªÊ¼ÈÕÆÚ£¡loadSign=%s" % loadSign)
|
return False, ChampionshipStartDateInfo[1]
|
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
count = ipyDataMgr.GetChampionshipTimeCount()
|
if count < 2:
|
return True, ""
|
|
firstIpyData = ipyDataMgr.GetChampionshipTimeByIndex(0)
|
lastIpyData = ipyDataMgr.GetChampionshipTimeByIndex(count - 1)
|
if not firstIpyData or not lastIpyData:
|
return False, ""
|
fristDay, firstHour, firstMinute = firstIpyData.GetStartDay(), firstIpyData.GetStartHour(), firstIpyData.GetStartMinute()
|
lastDay, lastHour, lastMinute = lastIpyData.GetEndDay(), lastIpyData.GetEndHour(), lastIpyData.GetEndMinute()
|
startSeconds = ((fristDay - 1) * 24 + firstHour) * 3600 + firstMinute * 60
|
endSeconds = ((lastDay - 1) * 24 + lastHour) * 3600 + lastMinute * 60
|
|
curDateTime = GameWorld.GetServerTime()
|
GameWorld.Log("===== ¼ÓÔØ½ñÌì¿ç·þÅÅλÕù°ÔÈüʱ¼ä =====")
|
CrossChamDateList = IpyGameDataPY.GetFuncEvalCfg("CrossChamFB", 1)
|
GameWorld.Log("¿ªÆôÈÕÆÚÁбí: %s" % CrossChamDateList)
|
GameWorld.Log("fristDay=%s,firstHour=%s,firstMinute=%s,startSeconds=%s" % (fristDay, firstHour, firstMinute, startSeconds))
|
GameWorld.Log("lastDay=%s,lastHour=%s,lastMinute=%s,endSeconds=%s" % (lastDay, lastHour, lastMinute, endSeconds))
|
|
nowStartDate = ""
|
for startDate in CrossChamDateList:
|
startDateTime0 = datetime.datetime.strptime(startDate, ChConfig.TYPE_Time_YmdFormat) # ¿ªÊ¼ÈÕÆÚ0µã
|
startDateTime = startDateTime0 + datetime.timedelta(seconds=startSeconds)
|
endDateTime = startDateTime0 + datetime.timedelta(seconds=endSeconds)
|
if curDateTime >= startDateTime and curDateTime <= endDateTime:
|
nowStartDate = startDate # È«²¿±éÀúÍ꣬ÒÔ×îеÄÂú×ãÌõ¼þʱ¼äΪ׼
|
|
GameWorld.Log("nowStartDate=%s" % nowStartDate)
|
|
ChampionshipStartDateInfo = IpyGameDataPY.SetConfigEx(key, [loadSign, nowStartDate])
|
GameWorld.Log("¿ç·þÅÅλÕù°ÔÈü¿ªÊ¼ÈÕÆÚ¼ÓÔØÍê±Ï! loadSign=%s,nowStartDate=%s" % (loadSign, nowStartDate))
|
GameWorld.Log("=============================================================")
|
return True, ChampionshipStartDateInfo[1]
|
|
def Dispose_CrossChampionshipState(reloadRefresh=False):
|
|
isReload, startDate = __GetChampionshipStartDate()
|
isReload = isReload or reloadRefresh
|
|
gameWorld = GameWorld.GetGameWorld()
|
# ´Ë»î¶¯Ñϸñ°´ÕÕÁ÷³Ì״̬һ¸ö¸öÀ´£¬²»ÄÜÌø£¬ËùÒÔʹÓÃdb±£´æ×´Ì¬£¬·ÀÖ¹ÁÙʱά»¤µ¼ÖÂ״̬Ϊ0
|
befState = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState)
|
dbCrossChampionshipID = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipID)
|
stateError = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError)
|
|
updState = 0
|
crossChampionshipID = dbCrossChampionshipID
|
|
# ÕâÀïʱ¼äÐ辫ȷµ½·ÖÖÓ£¬²»È»ºóÃæµÄ±È½Ï»áÆ¥Åä²»µ½
|
curDateTime = GameWorld.GetServerTime()
|
curDateTime = datetime.datetime.strptime("%d-%d-%d %d:%d:00" % (curDateTime.year, curDateTime.month, curDateTime.day,
|
curDateTime.hour, curDateTime.minute), ChConfig.TYPE_Time_Format)
|
|
serverGroupIDList = [] # È«·þͳһÂß¼
|
if startDate:
|
crossChampionshipID = GameWorld.ChangeTimeStrToNum(startDate, ChConfig.TYPE_Time_YmdFormat)
|
startDateTime0 = datetime.datetime.strptime(startDate, ChConfig.TYPE_Time_YmdFormat) # ¿ªÊ¼ÈÕÆÚ0µã
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
for index in xrange(ipyDataMgr.GetChampionshipTimeCount()):
|
timeIpyData = ipyDataMgr.GetChampionshipTimeByIndex(index)
|
#dataID = timeIpyData.GetID()
|
startDay, startHour, startMinute = timeIpyData.GetStartDay(), timeIpyData.GetStartHour(), timeIpyData.GetStartMinute()
|
endDay, endHour, endMinute = timeIpyData.GetEndDay(), timeIpyData.GetEndHour(), timeIpyData.GetEndMinute()
|
|
startSeconds = ((startDay - 1) * 24 + startHour) * 3600 + startMinute * 60
|
endSeconds = ((endDay - 1) * 24 + endHour) * 3600 + endMinute * 60
|
startDateTime = startDateTime0 + datetime.timedelta(seconds=startSeconds)
|
endDateTime = startDateTime0 + datetime.timedelta(seconds=endSeconds)
|
if curDateTime < startDateTime or curDateTime > endDateTime:
|
continue
|
|
updState = timeIpyData.GetStateValue()
|
notifyInfoDict = timeIpyData.GetNotifyInfo()
|
if not stateError and notifyInfoDict:
|
diffDateTime = curDateTime - startDateTime
|
diffMinute = (diffDateTime.days * 24 * 3600 + diffDateTime.seconds) / 60 # µ±Ç°Ê±¼äÓ뿪ʼʱ¼äÏà²î·ÖÖÓÊý
|
GameWorld.DebugLog(" ¹ã²¥ÅжÏ: curDateTime=%s,startDateTime=%s,diffDays=%s,diffSeconds=%s,diffMinute=%s"
|
% (curDateTime, startDateTime, diffDateTime.days, diffDateTime.seconds, diffMinute))
|
if diffMinute in notifyInfoDict:
|
notifyKey, paramList = notifyInfoDict[diffMinute]
|
PlayerControl.WorldNotifyCross(serverGroupIDList, 0, notifyKey, paramList)
|
break
|
|
if not isReload and befState == updState:
|
#ÒѾÊÇÕâ¸ö״̬ÁË
|
return
|
|
GameWorld.Log("¿ç·þÅÅλÕù°ÔÈü״̬±ä¸ü: befState=%s,updState=%s,stateError=%s" % (befState, updState, stateError))
|
|
# ÅÐ¶Ï»î¶¯ÖØÖ㬸ûֻ¿¼ÂÇÕý³£Á÷³Ì״̬£¬ÈκÎÁ÷³ÌÌø¹ýµÄ¶¼²»´¦Àí£»Òì³£Çé¿öά»¤·þÎñÆ÷µ¼ÖÂÌø¹ýÁ÷³ÌµÄ¿ÉÅäÖÃÐÂÈÕÆÚ¿ªÊ¼Ð»£¬²¢×ö²¹³¥
|
GameWorld.Log("crossChampionshipID=%s,dbCrossChampionshipID=%s" % (crossChampionshipID, dbCrossChampionshipID))
|
gameWorld.SetDict(PlayerDBGSEvent.Def_CrossChampionshipState, updState)
|
gameWorld.SetDict(PlayerDBGSEvent.Def_CrossChampionshipID, crossChampionshipID)
|
|
PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipID, crossChampionshipID)
|
PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState, updState)
|
|
isNewStart = False
|
if crossChampionshipID != dbCrossChampionshipID:
|
# л - ±ØÐë´ÓµÚÒ»¸ö״̬¿ªÊ¼²ÅËã
|
if crossChampionshipID:
|
if updState == ShareDefine.CrossChampionshipStateList[0]:
|
isNewStart = True
|
DoCrossChampionshipStart(crossChampionshipID, updState)
|
else:
|
GameWorld.ErrLog("¿ç·þÅÅλÕù°ÔÈüÖØÖûʱ·ÇÊ׸ö״̬£¬Òì³£²»´¦Àí: crossChampionshipID=%s,dbCrossChampionshipID=%s,updState=%s"
|
% (crossChampionshipID, dbCrossChampionshipID, updState))
|
PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError, 1)
|
|
# ·Ç¿ªÆôÐÂÅÅλ»î¶¯µÄ£¬ÓÅÏÈͳһ¹ã²¥×Ó·þ״̬£¬ÔÙ×öºóÐø´¦Àí
|
if not isNewStart:
|
Send_CrossServerMsg_ChampionshipState()
|
|
if isNewStart:
|
pass
|
elif not crossChampionshipID:
|
GameWorld.Log("¿ç·þÅÅλÕù°ÔÈü·Ç»î¶¯ÖУ¬²»´¦Àí!")
|
elif stateError:
|
GameWorld.ErrLog("¿ç·þÅÅλÕù°ÔÈü»î¶¯×´Ì¬ÒѾÒì³££¬²»´¦Àí!")
|
elif crossChampionshipID == dbCrossChampionshipID:
|
if befState == updState:
|
GameWorld.Log("¿ç·þÅÅλÕù°ÔÈü״̬²»±ä²»´¦Àí: befState=%s,updState=%s" % (befState, updState))
|
|
elif befState and befState in ShareDefine.CrossChampionshipStateList \
|
and updState and updState in ShareDefine.CrossChampionshipStateList:
|
befStateIndex = ShareDefine.CrossChampionshipStateList.index(befState)
|
updStateIndex = ShareDefine.CrossChampionshipStateList.index(updState)
|
# ¸Ã»î¶¯±ØÐ밴״̬Á÷³ÌÒ»¸ö¸öÀ´£¬´æDBµÄÈ·±£Ã¿¸ö״ֵ̬Âß¼´¦ÀíÖ»»á´¥·¢Ò»´Î
|
if befStateIndex + 1 == updStateIndex:
|
if updState == ShareDefine.CrossChampionshipState_Group64:
|
DoCrossChampionshipGroupRand(64)
|
elif updState == ShareDefine.CrossChampionshipState_Group32:
|
DoCrossChampionshipGroupRand(32)
|
elif updState == ShareDefine.CrossChampionshipState_Group16:
|
DoCrossChampionshipGroupRand(16)
|
elif updState == ShareDefine.CrossChampionshipState_Guess4:
|
DoCrossChampionshipTopPlayer8()
|
elif updState == ShareDefine.CrossChampionshipState_Group8:
|
DoCrossChampionshipGroupRand(8)
|
elif updState == ShareDefine.CrossChampionshipState_GroupSemi:
|
DoCrossChampionshipGroupByWF(4)
|
elif updState == ShareDefine.CrossChampionshipState_GroupFinal:
|
DoCrossChampionshipGroupByWF(2)
|
# ´¦Àí½ø³¡×´Ì¬
|
elif updState in ShareDefine.CrossChampionshipEnterStateInfo:
|
DoCrossChampionshipStartEnter(updState)
|
else:
|
GameWorld.ErrLog("¿ç·þÅÅλÕù°ÔÈü״̬Á÷³ÌÒì³£: befState=%s,updState=%s,befStateIndex=%s,updStateIndex=%s"
|
% (befState, updState, befStateIndex, updStateIndex))
|
PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError, 1)
|
Send_CrossServerMsg_ChampionshipState()
|
|
# ´Ó×îºóÒ»¸ö״̬µ½0£¬´ú±íÕû¸öÁ÷³Ì½áÊø£¬ÐèÒª´¦ÀíϽáËã
|
elif befState == ShareDefine.CrossChampionshipStateList[-1] and not updState:
|
DoCrossChampionshipFinalOver()
|
|
else:
|
GameWorld.ErrLog("¿ç·þÅÅλÕù°ÔÈü״̬Òì³£: updState=%s" % updState)
|
PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError, 1)
|
Send_CrossServerMsg_ChampionshipState()
|
|
return
|
|
def DoCrossChampionshipStart(crossChampionshipID, updState):
|
## л¿ªÊ¼
|
GameWorld.Log("=== ¿ç·þÅÅλÕù°ÔÈüл¿ªÊ¼ ===")
|
GameWorld.Log("crossChampionshipID=%s,updState=%s" % (crossChampionshipID, updState))
|
|
hisZoneIDList = [] # ÒòΪ·ÖÇø¿ÉÄܵ÷ÕûÔöɾ£¬ÕâÀïҪȡÀúÊ·ÅäÖùýµÄËùÓзÖÇø
|
championshipSeason = 0 # ÅÅλÈüÊý¾ÝÈ¡·Ç»î¶¯ÖеÄ×î¸ßÈü¼¾
|
crossZoneName = GameWorld.GetCrossZoneName()
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
for index in range(ipyDataMgr.GetCrossRealmPKSeasonCount()):
|
seasonIpyData = ipyDataMgr.GetCrossRealmPKSeasonByIndex(index)
|
if crossZoneName != seasonIpyData.GetCrossZoneName():
|
continue
|
zoneID = seasonIpyData.GetZoneID()
|
if zoneID not in hisZoneIDList:
|
hisZoneIDList.append(zoneID)
|
|
gameWorld = GameWorld.GetGameWorld()
|
for zoneID in hisZoneIDList:
|
seasonID = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonID % zoneID)
|
seasonState = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonState % zoneID)
|
if seasonState == 1:
|
checkSeason = seasonID - 1 # Èü¼¾ÖеÄÈ¡ÉÏÒ»¸öÈü¼¾
|
else:
|
checkSeason = seasonID
|
if championshipSeason < checkSeason:
|
championshipSeason = checkSeason
|
GameWorld.Log("hisZoneIDList=%s,championshipSeason=%s" % (hisZoneIDList, championshipSeason))
|
|
# Çå¿ÕÉϴλ¼Ç¼
|
universalRecMgr = GameWorld.GetUniversalRecMgr()
|
universalRecMgr.Delete(Def_RecType_CrossChampionshipGroup)
|
universalRecMgr.Delete(Def_RecType_CrossChampionshipGuess)
|
universalRecMgr.Delete(Def_RecType_CrossChampionshipOfficial)
|
universalRecMgr.Delete(Def_RecType_CrossChampionshipOffChallenge)
|
|
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:
|
crossBillboardMgr = PyDataManager.GetCrossBillboardManager()
|
for zoneID in hisZoneIDList:
|
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, 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
|
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 index=%s,playerID=%s,accID=%s,fightPower=%s" % (index, playerID, getPlayer.accID, getPlayer.fightPower))
|
|
GameWorld.Log("=============================================================")
|
Send_CrossServerMsg_ChampionshipState(newAct=True)
|
Send_CrossServerMsg_ChampionshipPlayer(isSync=True)
|
return
|
|
def DoCrossChampionshipGroupRand(groupMark):
|
## Ëæ»úÁ½Á½·Ö×é
|
|
battleCount = int(groupMark / 2) # ¶ÔÕ½×éÊý
|
preGroupMark = 0 if groupMark == 64 else groupMark * 2 # ÉÏÒ»ÂÖ·Ö×é±êʶ
|
|
GameWorld.Log("=== ¿ç·þÅÅλÕù°ÔÈüËæ»ú·Ö×é === groupMark=%s,battleCount=%s,preGroupMark=%s" % (groupMark, battleCount, preGroupMark))
|
|
syncPlayerIDList = []
|
champMgr = GetChampionshipMgr()
|
for zoneID in champMgr.GetChampPKZoneIDList():
|
pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
|
if not pkZoneMgr:
|
continue
|
# Ê×ÂÖÈ¡ËùÓвÎÈüÍæ¼Ò
|
if preGroupMark == 0:
|
batPlayerIDList = pkZoneMgr.GetBatPlayerIDList()
|
# È¡ÉÏÒ»ÂÖ»ñʤÕß
|
else:
|
batPlayerIDList = []
|
battleNumList = pkZoneMgr.battleInfo.get(preGroupMark, {}).keys()
|
for battleNum in battleNumList:
|
batObj = pkZoneMgr.GetBattle(preGroupMark, battleNum)
|
if not batObj:
|
continue
|
# Èç¹ûÉÏÒ»ÂÖÕ½¶·Ã»½áË㣬ÔòÇ¿ÖÆ½áËã
|
if not batObj.overTime:
|
GameWorld.ErrLog("ÉÏÒ»ÂÖÕ½¶·Î´½áË㣬ִÐÐÇ¿ÖÆ½áËã! zoneID=%s,preGroupMark=%s,battleNum=%s,mapID=%s,copyMapID=%s"
|
% (zoneID, preGroupMark, battleNum, batObj.mapID, batObj.copyMapID), batObj.roomID)
|
DoBattleOverLogic(zoneID, preGroupMark, battleNum)
|
|
if not batObj.winPlayerID:
|
continue
|
if batObj.winPlayerID not in batPlayerIDList:
|
batPlayerIDList.append(batObj.winPlayerID)
|
|
# ½øÈë¾öÈüµÄËæ»ú·Ö×é£¬Íæ¼Ò²»×ãµÄ²¹0£¬È·±£·Ö×éºó˳ÐòÒ»ÖÂ
|
if groupMark == 8 and len(batPlayerIDList) < Def_CrossChampionshipPlayerWFCount:
|
batPlayerIDList += [0] * (Def_CrossChampionshipPlayerWFCount - len(batPlayerIDList))
|
batPlayerCount = len(batPlayerIDList)
|
GameWorld.Log("zoneID=%s,batPlayerCount=%s" % (zoneID, batPlayerCount), zoneID)
|
if not batPlayerIDList:
|
continue
|
|
# ´òÂÒ˳Ðò
|
random.shuffle(batPlayerIDList)
|
GameWorld.Log("batPlayerIDList=%s" % batPlayerIDList)
|
|
battleDict = {}
|
for num, playerID in enumerate(batPlayerIDList, 1):
|
if playerID and playerID not in syncPlayerIDList:
|
syncPlayerIDList.append(playerID)
|
#batPlayer = zoneMgr.GetBatPlayer(playerID)
|
# 1.ÏÈÈ·±£Ã¿×éÓÐÈË
|
if num <= battleCount:
|
battle = ChampionshipBattle()
|
battle.zoneID = zoneID
|
battle.groupMark = groupMark
|
battle.battleNum = num
|
battle.playerIDA = playerID
|
|
battleDict[num] = battle
|
pkZoneMgr.battleInfo[groupMark] = battleDict
|
|
else:
|
battle = pkZoneMgr.GetBattle(groupMark, num - battleCount)
|
# Ò»°ã²»¿ÉÄÜΪNone£¬·ÀÒ»ÏÂ
|
if not battle:
|
continue
|
battle.playerIDB = playerID
|
|
for battleNum in range(1, 1 + battleCount):
|
batObj = pkZoneMgr.GetBattle(groupMark, battleNum)
|
if not batObj:
|
continue
|
playerIDA = batObj.playerIDA
|
playerIDB = batObj.playerIDB
|
playerObjA = pkZoneMgr.GetBatPlayer(playerIDA)
|
playerObjB = pkZoneMgr.GetBatPlayer(playerIDB)
|
accIDA = "" if not playerObjA else playerObjA.accID
|
accIDB = "" if not playerObjB else playerObjB.accID
|
fightPowerA = 0 if not playerObjA else playerObjA.fightPower
|
fightPowerB = 0 if not playerObjB else playerObjB.fightPower
|
GameWorld.Log(" ¶ÔÕ½×éÐÅÏ¢: zoneID=%s,groupMark=%s,battleNum=%s,playerIDA=%s(%s),playerIDB=%s(%s),fightPowerA=%s,fightPowerB=%s"
|
% (zoneID, batObj.groupMark, batObj.battleNum, playerIDA, accIDA, playerIDB, accIDB, fightPowerA, fightPowerB), zoneID)
|
|
dataDict = {"zoneID":zoneID, "groupMark":groupMark, "battleNum":battleNum,
|
"playerIDA":playerIDA, "accIDA":accIDA, "fightPowerA":fightPowerA,
|
"playerIDB":playerIDB, "accIDB":accIDB, "fightPowerB":fightPowerB,
|
}
|
DR_CrossChampionshipPK("Group", dataDict)
|
GameWorld.Log("=============================================================")
|
|
# ¹ã²¥×Ó·þ
|
Send_CrossServerMsg_ChampionshipPlayer(syncPlayerIDList)
|
Send_CrossServerMsg_ChampionshipGroup(groupMark)
|
return
|
|
def DoCrossChampionshipGroupByWF(groupMark):
|
## °´Ê¤¸º×é·Ö×飬ÓÉÉÏÒ»ÂÖµÄʤ¸º·Ö×鼰˳Ðò¾ö¶¨±¾ÂִεķÖ×飬ÐèҪȷ±£Ë³ÐòÒ»ÖÂ
|
|
if groupMark == 4:
|
preGroupMark = 8
|
elif groupMark == 2:
|
preGroupMark = 4
|
else:
|
return
|
battleCount = int(Def_CrossChampionshipPlayerWFCount / 2) # ¶ÔÕ½×éÊý£¬Ò²ÊÇʤ¸º×éÿ×éËùÐèÈËÊý
|
GameWorld.Log("=== ¿ç·þÅÅλÕù°ÔÈüʤ¸º·Ö×é === groupMark=%s,battleCount=%s,preGroupMark=%s" % (groupMark, battleCount, preGroupMark))
|
|
syncPlayerIDList = []
|
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() # ¶ÔÕ½±àºÅ°´Ö®Ç°µÄ·Ö×é˳ÐòÅÅÐò£¬È·±£·Ö×é˳ÐòÒ»ÖÂ
|
for battleNum in battleNumList:
|
batObj = pkZoneMgr.GetBattle(preGroupMark, battleNum)
|
if not batObj:
|
continue
|
|
# Èç¹ûÉÏÒ»ÂÖÕ½¶·Ã»½áË㣬ÔòÇ¿ÖÆ½áËã
|
if not batObj.overTime:
|
GameWorld.ErrLog("ÉÏÒ»ÂÖÕ½¶·Î´½áË㣬ִÐÐÇ¿ÖÆ½áËã! zoneID=%s,preGroupMark=%s,battleNum=%s,mapID=%s,copyMapID=%s"
|
% (zoneID, preGroupMark, battleNum, batObj.mapID, batObj.copyMapID), batObj.roomID)
|
DoBattleOverLogic(zoneID, preGroupMark, battleNum)
|
|
# Ϊȷ±£¶àÂִζÔս˳ÐòÒ»Ö£¬µ±ÎÞʤÀûÍæ¼Òʱ£¨Ò»°ãÊÇûÓÐÍæ¼Ò»ò½áËãÒì³£µ¼ÖÂûÓÐʤÕߣ¬Ò»Âɵ±×öÎÞÍæ¼Ò´¦Àí£©£¬ÎÞÍæ¼ÒÐèÒª²¹0£¬È·±£ºóÐøÆ¥Åä·Ö×é˳ÐòÒ»ÖÂ
|
if not batObj.winPlayerID:
|
winPlayerIDList.append(0)
|
losePlayerIDList.append(0)
|
else:
|
winPlayerID = batObj.playerIDA if batObj.winPlayerID == batObj.playerIDA else batObj.playerIDB
|
losePlayerID = batObj.playerIDB if batObj.winPlayerID == batObj.playerIDA else batObj.playerIDA
|
winPlayerIDList.append(winPlayerID)
|
losePlayerIDList.append(losePlayerID)
|
|
if len(winPlayerIDList) < battleCount:
|
winPlayerIDList += [0] * (battleCount - len(winPlayerIDList))
|
winPlayerIDList = winPlayerIDList[:battleCount]
|
if len(losePlayerIDList) < battleCount:
|
losePlayerIDList += [0] * (battleCount - len(losePlayerIDList))
|
losePlayerIDList = losePlayerIDList[:battleCount]
|
GameWorld.Log("zoneID=%s,groupMark=%s,winPlayerIDList=%s,losePlayerIDList=%s"
|
% (zoneID, groupMark, winPlayerIDList, losePlayerIDList), zoneID)
|
|
battleNum = 0
|
battleDict = {}
|
batPlayerIDList = winPlayerIDList + losePlayerIDList
|
for i in range(Def_CrossChampionshipPlayerWFCount)[::2]:
|
playerIDA = batPlayerIDList[i]
|
playerIDB = batPlayerIDList[i + 1]
|
battleNum += 1
|
battle = ChampionshipBattle()
|
battle.zoneID = zoneID
|
battle.groupMark = groupMark
|
battle.battleNum = battleNum
|
battle.playerIDA = playerIDA
|
battle.playerIDB = playerIDB
|
|
battleDict[battleNum] = battle
|
pkZoneMgr.battleInfo[groupMark] = battleDict
|
|
if playerIDA and playerIDA not in syncPlayerIDList:
|
syncPlayerIDList.append(playerIDA)
|
if playerIDB and playerIDB not in syncPlayerIDList:
|
syncPlayerIDList.append(playerIDB)
|
|
playerObjA = pkZoneMgr.GetBatPlayer(playerIDA)
|
playerObjB = pkZoneMgr.GetBatPlayer(playerIDB)
|
accIDA = "" if not playerObjA else playerObjA.accID
|
accIDB = "" if not playerObjB else playerObjB.accID
|
fightPowerA = 0 if not playerObjA else playerObjA.fightPower
|
fightPowerB = 0 if not playerObjB else playerObjB.fightPower
|
GameWorld.Log(" ¶ÔÕ½×éÐÅÏ¢: zoneID=%s,groupMark=%s,battleNum=%s,playerIDA=%s(%s),playerIDB=%s(%s),fightPowerA=%s,fightPowerB=%s"
|
% (zoneID, groupMark, battleNum, playerIDA, accIDA, playerIDB, accIDB, fightPowerA, fightPowerB), zoneID)
|
|
dataDict = {"zoneID":zoneID, "groupMark":groupMark, "battleNum":battleNum,
|
"playerIDA":playerIDA, "accIDA":accIDA, "fightPowerA":fightPowerA,
|
"playerIDB":playerIDB, "accIDB":accIDB, "fightPowerB":fightPowerB,
|
}
|
DR_CrossChampionshipPK("Group", dataDict)
|
|
GameWorld.Log("=============================================================")
|
|
# ¹ã²¥×Ó·þ
|
Send_CrossServerMsg_ChampionshipPlayer(syncPlayerIDList)
|
Send_CrossServerMsg_ChampionshipGroup(groupMark)
|
return
|
|
def DoCrossChampionshipTopPlayer8():
|
## ²ú³öǰ8Ç¿
|
|
preGroupMark = 16
|
GameWorld.Log("=== ¿ç·þÅÅλÕù°ÔÈü²ú³öǰ8Ç¿ === preGroupMark=%s" % preGroupMark)
|
|
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:
|
batObj = pkZoneMgr.GetBattle(preGroupMark, battleNum)
|
if not batObj:
|
continue
|
|
# Èç¹ûÉÏÒ»ÂÖÕ½¶·Ã»½áË㣬ÔòÇ¿ÖÆ½áËã
|
if not batObj.overTime:
|
GameWorld.ErrLog("ÉÏÒ»ÂÖÕ½¶·Î´½áË㣬ִÐÐÇ¿ÖÆ½áËã! zoneID=%s,preGroupMark=%s,battleNum=%s,mapID=%s,copyMapID=%s"
|
% (zoneID, preGroupMark, battleNum, batObj.mapID, batObj.copyMapID), batObj.roomID)
|
DoBattleOverLogic(zoneID, preGroupMark, battleNum)
|
|
top8PlayerIDList = pkZoneMgr.GetTop8PlayerIDList()
|
GameWorld.Log("ÅÅλ·ÖÇø8Ç¿Íæ¼ÒIDÁбí: zoneID=%s, %s" % (zoneID, top8PlayerIDList), zoneID)
|
|
# ´¦Àí8Ç¿¾º²Â·¢½±Àø
|
guessType = 8
|
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)
|
playerGuessDict = pkZoneMgr.guessInfo.get(guessType, {})
|
for guessPlayerID, guessList in playerGuessDict.items():
|
guessCorrectCount = 0 # ²ÂÖÐÈËÊý
|
guessCorrectMoney = 0 # ²ÂÖÐ×ÜͶÈë»õ±Ò
|
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:
|
continue
|
guessCorrectCount += 1
|
guessCorrectMoney += moneyTotal
|
|
if guessCorrectMoney <= 0 or multiPrice <= 0 or not moneyItemID:
|
continue
|
moneyPriceTotal = guessCorrectMoney * multiPrice # ×ÜÊÕÒæ
|
paramList = [guessCorrectCount, multiPrice]
|
addItemList = [[moneyItemID, moneyPriceTotal, 0]]
|
PlayerCompensation.SendMailByKey("CrossChampionshipGuess8", [guessPlayerID], addItemList, paramList, crossMail=True)
|
|
GameWorld.Log("=============================================================")
|
return
|
|
def DoCrossChampionshipStartEnter(state):
|
## ¿ªÆô½ø³¡´¦ÀíÂß¼
|
# ¸ÄΪ¾µÏñÕ½¶·£¬·ÏÆú¿ªµØÍ¼·¿¼ä
|
return
|
|
def Sync_CrossChampionshipDataToClientServer(serverGroupID=0):
|
''' ͬ²½¿ç·þÅÅλÕù°ÔÈüÊý¾Ýµ½×Ó·þÎñÆ÷
|
@param serverGroupID: Ϊ0ʱͬ²½ËùÓÐ×Ó·þ
|
'''
|
GameWorld.Log("ͬ²½¸ø×Ó·þÅÅλÕù°ÔÈüÊý¾Ý: syncServerGroupID=%s" % (serverGroupID))
|
# Í¨ÖªÈ«Çø
|
Send_CrossServerMsg_ChampionshipState(serverGroupID)
|
Send_CrossServerMsg_ChampionshipPlayer(serverGroupID=serverGroupID)
|
Send_CrossServerMsg_ChampionshipGroup(serverGroupID=serverGroupID)
|
Send_CrossServerMsg_ChampionshipGuess(serverGroupID=serverGroupID)
|
Send_CrossServerMsg_ChampionshipOfficial(serverGroupID=serverGroupID)
|
return
|
|
def Send_CrossServerMsg_ChampionshipState(serverGroupID=0, newAct=False):
|
# ֪ͨ״̬
|
champMgr = GetChampionshipMgr()
|
pkZoneIDList = champMgr.GetChampPKZoneIDList()
|
ID = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipID)
|
State = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState)
|
StateError = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError)
|
dataMsg = {"ID":ID, "State":State, "StateError":StateError, "PKZoneIDList":pkZoneIDList, "NewAct":newAct}
|
serverGroupIDList = [serverGroupID] if serverGroupID else []
|
CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ChampionshipState, dataMsg, serverGroupIDList)
|
return
|
|
def Send_CrossServerMsg_ChampionshipPlayer(syncPlayerIDList=None, serverGroupID=0, isSync=False, clearPlayer=False):
|
# ֪ͨ²ÎÈüÍæ¼Ò
|
|
zoneBatPlayerInfo = {}
|
champMgr = GetChampionshipMgr()
|
for zoneID in champMgr.GetChampPKZoneIDList():
|
batPlayerList = []
|
pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
|
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, "clearPlayer":clearPlayer}
|
serverGroupIDList = [serverGroupID] if serverGroupID else []
|
CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ChampionshipPlayer, dataMsg, serverGroupIDList)
|
return
|
|
def Send_CrossServerMsg_ChampionshipGroup(groupMark=None, battleObj=None, serverGroupID=0):
|
# ֪ͨ·Ö×é
|
dataMsg = []
|
if battleObj != None:
|
dataMsg.append(battleObj.GetString())
|
else:
|
syncGroupMarkList = [groupMark] if groupMark != None else ShareDefine.CrossChampionshipEnterStateInfo.values()
|
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:
|
continue
|
for num in battleDict.keys():
|
battleObj = pkZoneMgr.GetBattle(gMark, num)
|
dataMsg.append(battleObj.GetString())
|
|
serverGroupIDList = [serverGroupID] if serverGroupID else []
|
CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ChampionshipGroup, dataMsg, serverGroupIDList)
|
return
|
|
def Send_CrossServerMsg_ChampionshipGuess(syncZoneID=None, playerID=0, guessObj=None, serverGroupID=0, exData=None, syncPub=True):
|
## ֪ͨ¾º²Â
|
|
champMgr = GetChampionshipMgr()
|
|
# ÒòΪ¾º²ÂÊÇÃæÏòÈ«·þµÄÍæ¼Ò£¬ËùÒÔÖ»ÄÜÕë¶Ôÿ¸öÍæ¼Òµ¥¶Àͬ²½×Ô¼º²ÎÓë¹ýµÄ¾º²Â
|
guessList = []
|
if syncZoneID and playerID:
|
if guessObj != None and guessObj.guessPlayerID == playerID:
|
guessList.append(guessObj.GetString())
|
else:
|
pkZoneMgr = champMgr.GetChampPKZoneMgr(syncZoneID)
|
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:
|
zoneSupportCountInfo = {}
|
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}
|
|
serverGroupIDList = [serverGroupID] if serverGroupID else []
|
if syncPub:
|
serverGroupIDList = [] # ͬ²½¹«¹²ÐÅϢʱ£¬Ä¬ÈÏÈ«·þ¹ã²¥
|
CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ChampionshipGuess, dataMsg, serverGroupIDList)
|
return
|
|
def CrossServerMsg_ChampionshipState(msgData):
|
## ÊÕµ½¿ç·þ·þÎñÆ÷ͬ²½µÄÐÅÏ¢ - ¿ç·þÅÅλÕù°ÔÈü״̬
|
|
ID = msgData["ID"]
|
State = msgData["State"]
|
StateError = msgData["StateError"]
|
PKZoneIDList = msgData["PKZoneIDList"]
|
newAct = msgData["NewAct"]
|
|
dbID = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipID)
|
|
PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipID, ID)
|
PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState, State)
|
PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError, StateError)
|
|
# ×Ó·þÊý¾ÝÖØÖÃ
|
if dbID != ID or newAct:
|
champMgr = GetChampionshipMgr()
|
prePKZoneIDList = champMgr.GetChampPKZoneIDList()
|
champMgr.ClearPKZone()
|
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, True)
|
|
if not batPlayerList:
|
if clearPlayer:
|
pkZoneMgr.playerDict = {}
|
else:
|
for attrDict in batPlayerList:
|
zoneID = attrDict["zoneID"]
|
playerID = attrDict["playerID"]
|
batPlayer = pkZoneMgr.GetBatPlayer(playerID)
|
if not batPlayer:
|
batPlayer = ChampionshipBatPlayer()
|
pkZoneMgr.playerDict[playerID] = batPlayer
|
batPlayer.SetAttr(attrDict)
|
|
if isSync:
|
for zoneID in zoneBatPlayerInfo.keys():
|
Sync_ChampionshipPKZoneGroupInfo(zoneID)
|
|
return
|
|
def CrossServerMsg_ChampionshipGroup(msgData):
|
## ÊÕµ½¿ç·þ·þÎñÆ÷ͬ²½µÄÐÅÏ¢ - ·Ö×éÐÅÏ¢
|
|
syncGroupInfo = {}
|
champMgr = GetChampionshipMgr()
|
for attrDict in msgData:
|
zoneID = attrDict["zoneID"]
|
groupMark = attrDict["groupMark"]
|
battleNum = attrDict["battleNum"]
|
|
pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True)
|
battle = pkZoneMgr.GetBattle(groupMark, battleNum)
|
if not battle:
|
battle = ChampionshipBattle()
|
pkZoneMgr.AddBattle(groupMark, battleNum, battle)
|
battle.SetAttr(attrDict)
|
|
if zoneID not in syncGroupInfo:
|
syncGroupInfo[zoneID] = {}
|
groupMarkDict = syncGroupInfo[zoneID]
|
if groupMark not in groupMarkDict:
|
groupMarkDict[groupMark] = []
|
battleNumList = groupMarkDict[groupMark]
|
if battleNum not in battleNumList:
|
battleNumList.append(battleNum)
|
|
for zoneID, groupMarkDict in syncGroupInfo.items():
|
Sync_ChampionshipPKZoneGroupInfo(zoneID, groupMarkDict)
|
|
return
|
|
def CrossServerMsg_ChampionshipGuess(msgData, tick):
|
## ÊÕµ½¿ç·þ·þÎñÆ÷ͬ²½µÄÐÅÏ¢ - ¾º²ÂÐÅÏ¢
|
|
exData = msgData["exData"]
|
guessList = msgData["guessList"]
|
pubInfo = msgData.get("pubInfo", None)
|
|
if not exData or not isinstance(exData, dict):
|
exData = {}
|
exDataType = exData.get("exDataType", "")
|
playerID = exData.get("playerID", 0)
|
|
champMgr = GetChampionshipMgr()
|
|
syncKeyInfo = {}
|
for attrDict in guessList:
|
zoneID = attrDict["zoneID"]
|
guessType = attrDict["guessType"]
|
guessPlayerID = attrDict["guessPlayerID"]
|
tagPlayerID = attrDict["tagPlayerID"]
|
|
if guessType not in syncKeyInfo:
|
syncKeyInfo[guessType] = []
|
syncTagPlayerIDList = syncKeyInfo[guessType]
|
syncTagPlayerIDList.append(tagPlayerID)
|
|
# ¾º²ÂÁбí½öÕë¶ÔÍæ¼Ò¸öÈË£¬ËùÒÔ²»ÊÇÇëÇó·½Íæ¼Ò»ò±¾·þÍæ¼ÒÔò²»´¦Àí¸öÈËÐÅÏ¢£¬½ö´¦Àí¹«¹²ÐÅÏ¢
|
if playerID != guessPlayerID:
|
continue
|
|
if not PlayerControl.GetDBPlayerAccIDByID(guessPlayerID):
|
# ·Ç±¾·þÍæ¼Ò
|
continue
|
|
pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True)
|
|
guessObj = None
|
playerGuessList = pkZoneMgr.GetPlayerGuessList(guessPlayerID, guessType)
|
for guess in playerGuessList:
|
if guess.tagPlayerID == tagPlayerID:
|
guessObj = guess
|
break
|
|
if not guessObj:
|
guessObj = ChampionshipGuess()
|
playerGuessList.append(guessObj)
|
guessObj.SetAttr(attrDict)
|
|
pubZoneIDList = []
|
if pubInfo != None:
|
zoneSupportCountInfo = pubInfo["zoneSupportCountInfo"]
|
for zoneID, supportCountInfo in zoneSupportCountInfo.items():
|
pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True)
|
pkZoneMgr.supportCountInfo = supportCountInfo
|
pubZoneIDList.append(zoneID)
|
|
if exDataType == "ChampionshipGuessQuery":
|
# ²éѯµÄÖ»´¦Àí±¾·þÍæ¼Ò
|
if not playerID:
|
return
|
if not PlayerControl.GetDBPlayerAccIDByID(playerID):
|
# ·Ç±¾·þÍæ¼Ò
|
return
|
zoneID = exData.get("zoneID", 0)
|
pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True)
|
pkZoneMgr.syncGuessPlayerIDInfo[playerID] = tick
|
curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
|
if curPlayer == None:
|
return
|
Sync_ChampionshipGuessPriInfo(curPlayer, syncKeyInfo)
|
Sync_ChampionshipGuessPubInfo(zoneID, curPlayer, syncKeyInfo)
|
return
|
|
if exDataType == "ChampionshipGuess":
|
# ¾º²ÂµÄÈç¹ûÓй«¹²ÐÅÏ¢ÐèÒª¹ã²¥È«·þÍæ¼Ò£¬¸öÈËÐÅϢֻͬ²½¸Ã¾º²ÂÍæ¼Ò
|
zoneID = exData.get("zoneID", 0)
|
if pubInfo != None:
|
Sync_ChampionshipGuessPubInfo(zoneID, None, syncKeyInfo)
|
if not playerID:
|
return
|
if not PlayerControl.GetDBPlayerAccIDByID(playerID):
|
# ·Ç±¾·þÍæ¼Ò
|
return
|
msgInfo = [exDataType, exData]
|
curPlayer = CrossRealmPlayer.MapServer_QueryCrossPlayerResult(playerID, "Championship", msgInfo, True)
|
if curPlayer:
|
Sync_ChampionshipGuessPriInfo(curPlayer, syncKeyInfo)
|
return
|
|
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 DoBattleOverLogic(zoneID, groupMark, battleNum):
|
## Ö´ÐжÔÕ½½áËãÂß¼
|
|
if not zoneID:
|
return
|
|
groupMarkList = ShareDefine.CrossChampionshipEnterStateInfo.values()
|
if groupMark not in groupMarkList:
|
GameWorld.ErrLog("¿ç·þÅÅλ½áËã·Ö×éÒì³£! groupMark=%s" % groupMark)
|
return
|
|
champMgr = GetChampionshipMgr()
|
pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
|
if not pkZoneMgr:
|
return
|
battleObj = pkZoneMgr.GetBattle(groupMark, battleNum)
|
if not battleObj:
|
return
|
|
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)
|
return
|
|
playerIDA = battleObj.playerIDA
|
playerIDB = battleObj.playerIDB
|
roomPlayerIDList = [playerIDA, playerIDB]
|
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:
|
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
|
fightPowerB = playerB.fightPower if playerB else 0
|
if fightPowerA > fightPowerB:
|
winnerID, loserID = playerIDA, playerIDB
|
GameWorld.Log(" ¿ç·þÅÅλÈü¶ÔÕ½µØÍ¼Ã»ÓÐÍæ¼Ò²ÎÓë»òûÓÐʤ¸ºÍæ¼Ò£¬Õ½Á¦¸ß»ñʤ! fightPowerA=%s(%s) > fightPowerB=%s(%s),winnerID=%s,loserID=%s"
|
% (fightPowerA, playerIDA, fightPowerB, playerIDB, winnerID, loserID), roomID)
|
elif fightPowerA < fightPowerB:
|
winnerID, loserID = playerIDB, playerIDA
|
GameWorld.Log(" ¿ç·þÅÅλÈü¶ÔÕ½µØÍ¼Ã»ÓÐÍæ¼Ò²ÎÓë»òûÓÐʤ¸ºÍæ¼Ò£¬Õ½Á¦¸ß»ñʤ! fightPowerA=%s(%s) < fightPowerB=%s(%s),winnerID=%s,loserID=%s"
|
% (fightPowerA, playerIDA, fightPowerB, playerIDB, winnerID, loserID), roomID)
|
else:
|
random.shuffle(roomPlayerIDList)
|
winnerID, loserID = roomPlayerIDList
|
GameWorld.Log(" ¿ç·þÅÅλÈü¶ÔÕ½µØÍ¼Ã»ÓÐÍæ¼Ò²ÎÓë»òûÓÐʤ¸ºÍæ¼Ò£¬Õ½Á¦ÏàÍ¬Ëæ»úÍæ¼Ò»ñʤ! fightPowerA=%s(%s) = fightPowerB=%s(%s),winnerID=%s,loserID=%s"
|
% (fightPowerA, playerIDA, fightPowerB, playerIDB, winnerID, loserID), roomID)
|
|
elif playerIDA:
|
winnerID = playerIDA
|
loserID = playerIDB
|
GameWorld.Log(" ¿ç·þÅÅλÈü¶ÔÕ½Íæ¼ÒÂÖ¿Õ£¬Ä¬ÈÏ»ñʤ! winner is playerIDA=%s,loserID=%s" % (playerIDA, loserID), roomID)
|
elif playerIDB:
|
winnerID = playerIDB
|
loserID = playerIDA
|
GameWorld.Log(" ¿ç·þÅÅλÈü¶ÔÕ½Íæ¼ÒÂÖ¿Õ£¬Ä¬ÈÏ»ñʤ! winner is playerIDB=%s,loserID=%s" % (playerIDB, loserID), roomID)
|
else:
|
GameWorld.Log(" ¿ç·þÅÅλÈüPK·¿¼äÎÞÍæ¼Ò! roomID=%s,winnerID=%s,loserID=%s,roomPlayerIDList=%s"
|
% (roomID, winnerID, loserID, roomPlayerIDList), roomID)
|
|
# ¸üлñÊ¤Íæ¼ÒID¡¢½áÊøÊ±¼ä
|
battleObj.winPlayerID = winnerID
|
battleObj.overTime = int(time.time())
|
|
winner = pkZoneMgr.GetBatPlayer(winnerID)
|
loser = pkZoneMgr.GetBatPlayer(loserID)
|
|
# ¾öÈü¿É»ñÈ¡×îÖÕÃû´Î
|
playerRankInfo = {}
|
if groupMark == 2:
|
playerRankInfo = GetZoneIDRankInfo(zoneID, [winnerID, loserID])
|
|
if groupMark == 64:
|
wfAwardItemList = IpyGameDataPY.GetFuncEvalCfg("CrossChamWFAward", 1)
|
elif groupMark == 32:
|
wfAwardItemList = IpyGameDataPY.GetFuncEvalCfg("CrossChamWFAward", 2)
|
elif groupMark == 16:
|
wfAwardItemList = IpyGameDataPY.GetFuncEvalCfg("CrossChamWFAward", 3)
|
else:
|
wfAwardItemList = IpyGameDataPY.GetFuncEvalCfg("CrossChamWFAward", 4)
|
|
wAwardItemList, fAwardItemList = [], []
|
if wfAwardItemList and len(wfAwardItemList) == 2:
|
wAwardItemList, fAwardItemList = wfAwardItemList
|
|
# ½áËã
|
for playerID in [winnerID, loserID]:
|
if not playerID:
|
continue
|
|
if playerID == winnerID:
|
addItemList = wAwardItemList
|
mailTypeKey = "CrossChampionshipPKWin%s" % groupMark
|
tagPlayerID = loserID
|
else:
|
addItemList = fAwardItemList
|
mailTypeKey = "CrossChampionshipPKLose%s" % groupMark
|
tagPlayerID = winnerID
|
|
rank = playerRankInfo.get(playerID, 0)
|
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:
|
paramList = []
|
playerIDList = [playerID]
|
PlayerCompensation.SendMailByKey(mailTypeKey, playerIDList, addItemList, paramList, crossMail=True)
|
|
# ͬ²½×Ó·þ
|
Send_CrossServerMsg_ChampionshipGroup(battleObj=battleObj)
|
|
# ¼Ç¼Á÷Ïò
|
winnerInfo = winner.GetString() if winner else {}
|
loserInfo = loser.GetString() if loser else {}
|
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():
|
## Ö´ÐнáËã×îÖÕ½á¹û£¬ËùÓзÖÇøÍ¬Ò»Ê±¼äµã´¦Àí
|
|
GameWorld.Log("===================== Ö´Ðпç·þÅÅλ×îÖÕ½áËã ===========================")
|
|
finalGroupMark = 2 # ¾öÈü·Ö×é
|
|
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)
|
if not batObj:
|
continue
|
if not batObj.overTime:
|
GameWorld.ErrLog("×îÖÕÕ½¶·Î´½áË㣬ִÐÐÇ¿ÖÆ½áËã! zoneID=%s,finalGroupMark=%s,battleNum=%s,mapID=%s,copyMapID=%s"
|
% (zoneID, finalGroupMark, battleNum, batObj.mapID, batObj.copyMapID), batObj.roomID)
|
DoBattleOverLogic(zoneID, finalGroupMark, battleNum)
|
|
if batObj.playerIDA and batObj.playerIDA not in finalPlayerIDList:
|
finalPlayerIDList.append(batObj.playerIDA)
|
|
if batObj.playerIDB and batObj.playerIDB not in finalPlayerIDList:
|
finalPlayerIDList.append(batObj.playerIDB)
|
|
offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID)
|
playerRankInfo = GetZoneIDRankInfo(zoneID, finalPlayerIDList)
|
for playerID, rank in playerRankInfo.items():
|
batPlayer = pkZoneMgr.GetBatPlayer(playerID)
|
accID = "" if not batPlayer else batPlayer.accID
|
fightPower = 0 if not batPlayer else batPlayer.fightPower
|
rankIpyData = IpyGameDataPY.GetIpyGameData("ChampionshipRank", rank)
|
officialID = rankIpyData.GetMainOfficialID() if rankIpyData else 0
|
rankAwardItemList = rankIpyData.GetRankAwardItemList() if rankIpyData else []
|
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()
|
offObj.zoneID = zoneID
|
offObj.officialID = officialID
|
offObj.rank = rank
|
offObj.playerID = playerID
|
|
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 = 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)
|
playerGuessDict = pkZoneMgr.guessInfo.get(guessType, {})
|
for guessPlayerID, guessList in playerGuessDict.items():
|
guessCorrectCount = 0 # ²ÂÖÐÈËÊý
|
guessCorrectMoney = 0 # ²ÂÖÐ×ÜͶÈë»õ±Ò
|
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
|
if not tagPlayerID or tagPlayerID not in playerRankInfo:
|
continue
|
playerRank = playerRankInfo[tagPlayerID]
|
if playerRank != guessRank:
|
continue
|
guessCorrectCount += 1
|
guessCorrectMoney += moneyTotal
|
|
multiPrice = multiPriceDict.get(str(guessCorrectCount), 0)
|
if guessCorrectMoney <= 0 or multiPrice <= 0 or not moneyItemID:
|
continue
|
moneyPriceTotal = guessCorrectMoney * multiPrice # ×ÜÊÕÒæ
|
paramList = [guessCorrectCount, multiPrice]
|
addItemList = [[moneyItemID, moneyPriceTotal, 0]]
|
PlayerCompensation.SendMailByKey("CrossChampionshipGuess4", [guessPlayerID], addItemList, paramList, crossMail=True)
|
|
exData = {"exDataType":"OfficialReset"}
|
Send_CrossServerMsg_ChampionshipOfficial(exData=exData)
|
|
serverGroupIDList = [] # È«·þͳһÂß¼
|
PlayerControl.WorldNotifyCross(serverGroupIDList, 0, "ChampionshipOver")
|
|
# ֪ͨÐÂÌí¼ÓµÄĤ°Ý
|
GameWorship.SendNewWorshipPlayer(syncNewWorshipList)
|
GameXiangong.SendNewXiangongPlayerToClientServer(syncNewXiangongDict)
|
GameWorld.Log("===================================================================")
|
return
|
|
def GetZoneIDRankInfo(zoneID, playerIDList):
|
## »ñÈ¡·ÖÇøÍæ¼ÒÅÅÃû
|
|
champMgr = GetChampionshipMgr()
|
pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
|
if not pkZoneMgr:
|
return {}
|
|
# ¾öÈü
|
finalGroupMark = 2
|
finalWinPlayerIDList, finalLosePlayerIDList = [], []
|
battleNumList = pkZoneMgr.battleInfo.get(finalGroupMark, {}).keys()
|
for battleNum in battleNumList:
|
batObj = pkZoneMgr.GetBattle(finalGroupMark, battleNum)
|
if not batObj:
|
continue
|
if not batObj.overTime or not batObj.winPlayerID:
|
continue
|
winPlayerID = batObj.playerIDA if batObj.winPlayerID == batObj.playerIDA else batObj.playerIDB
|
losePlayerID = batObj.playerIDB if batObj.winPlayerID == batObj.playerIDA else batObj.playerIDA
|
finalWinPlayerIDList.append(winPlayerID)
|
finalLosePlayerIDList.append(losePlayerID)
|
|
# °ë¾öÈü
|
semiGroupMark = 4
|
semiWinPlayerIDList, semiLosePlayerIDList = [], []
|
battleNumList = pkZoneMgr.battleInfo.get(semiGroupMark, {}).keys()
|
for battleNum in battleNumList:
|
batObj = pkZoneMgr.GetBattle(semiGroupMark, battleNum)
|
if not batObj:
|
continue
|
if not batObj.overTime or not batObj.winPlayerID:
|
continue
|
winPlayerID = batObj.playerIDA if batObj.winPlayerID == batObj.playerIDA else batObj.playerIDB
|
losePlayerID = batObj.playerIDB if batObj.winPlayerID == batObj.playerIDA else batObj.playerIDA
|
semiWinPlayerIDList.append(winPlayerID)
|
semiLosePlayerIDList.append(losePlayerID)
|
|
# 1/4¾öÈü
|
wlGroupMark = 8
|
winGroupPlayerIDList, loseGroupPlayerIDList = [], [] # ʤÕß×é¡¢°ÜÕß×é
|
battleNumList = pkZoneMgr.battleInfo.get(wlGroupMark, {}).keys()
|
for battleNum in battleNumList:
|
batObj = pkZoneMgr.GetBattle(wlGroupMark, battleNum)
|
if not batObj:
|
continue
|
if not batObj.overTime or not batObj.winPlayerID:
|
continue
|
winPlayerID = batObj.playerIDA if batObj.winPlayerID == batObj.playerIDA else batObj.playerIDB
|
losePlayerID = batObj.playerIDB if batObj.winPlayerID == batObj.playerIDA else batObj.playerIDA
|
winGroupPlayerIDList.append(winPlayerID)
|
loseGroupPlayerIDList.append(losePlayerID)
|
|
GameWorld.Log(" 8Ç¿Èüʤ¸º: zoneID=%s,ʤÕßID=%s,°ÜÕßID=%s" % (zoneID, winGroupPlayerIDList, loseGroupPlayerIDList), zoneID)
|
GameWorld.Log(" °ë¾öÈüʤ¸º: zoneID=%s,ʤÕßID=%s,°ÜÕßID=%s" % (zoneID, semiWinPlayerIDList, semiLosePlayerIDList), zoneID)
|
GameWorld.Log(" ×ܾöÈüʤ¸º: zoneID=%s,ʤÕßID=%s,°ÜÕßID=%s" % (zoneID, finalWinPlayerIDList, finalLosePlayerIDList), zoneID)
|
|
playerRankInfo = {}
|
for playerID in playerIDList:
|
if not playerID:
|
continue
|
if playerID in winGroupPlayerIDList:
|
if playerID in semiWinPlayerIDList:
|
if playerID in finalWinPlayerIDList:
|
playerRankInfo[playerID] = 1
|
elif playerID in finalLosePlayerIDList:
|
playerRankInfo[playerID] = 2
|
elif playerID in semiLosePlayerIDList:
|
if playerID in finalWinPlayerIDList:
|
playerRankInfo[playerID] = 3
|
elif playerID in finalLosePlayerIDList:
|
playerRankInfo[playerID] = 4
|
elif playerID in loseGroupPlayerIDList:
|
if playerID in semiWinPlayerIDList:
|
if playerID in finalWinPlayerIDList:
|
playerRankInfo[playerID] = 5
|
elif playerID in finalLosePlayerIDList:
|
playerRankInfo[playerID] = 6
|
elif playerID in semiLosePlayerIDList:
|
if playerID in finalWinPlayerIDList:
|
playerRankInfo[playerID] = 7
|
elif playerID in finalLosePlayerIDList:
|
playerRankInfo[playerID] = 8
|
|
GameWorld.Log(" zoneID=%s,playerRankInfo=%s" % (zoneID, playerRankInfo), zoneID)
|
return playerRankInfo
|
|
def Send_CrossServerMsg_ChampionshipOfficial(syncZonID=None, syncOfficialIDList=None, serverGroupID=0, exData=None):
|
officialList = []
|
champMgr = GetChampionshipMgr()
|
for zoneID in champMgr.GetChampOfficialZoneIDList():
|
if syncZonID != None and zoneID != syncZonID:
|
continue
|
offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID)
|
officialIDList = offZoneMgr.officialInfo.keys() if syncOfficialIDList == None else syncOfficialIDList
|
for officialID in officialIDList:
|
offObj = offZoneMgr.GetOfficialObj(officialID)
|
if not offObj:
|
continue
|
officialList.append(offObj.GetString())
|
|
dataMsg = {"exData":exData if exData else {}, "officialList":officialList}
|
serverGroupIDList = [serverGroupID] if serverGroupID else []
|
CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ChampionshipOfficial, dataMsg, serverGroupIDList)
|
return
|
|
def CrossServerMsg_ChampionshipOfficial(msgData):
|
## ÊÕµ½¿ç·þͬ²½µÄ¹Ù¾ôÍæ¼ÒÐÅÏ¢
|
|
exData = msgData["exData"]
|
officialList = msgData["officialList"]
|
|
if not exData or not isinstance(exData, dict):
|
exData = {}
|
exDataType = exData.get("exDataType", "")
|
|
champMgr = GetChampionshipMgr()
|
## ¹ÙÖ°ÖØÖÃ
|
if exDataType == "OfficialReset":
|
champMgr.ClearOfficialZone()
|
|
syncZoneOfficialInfo = {}
|
for attrDict in officialList:
|
zoneID = attrDict["zoneID"]
|
officialID = attrDict["officialID"]
|
offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID)
|
offObj = offZoneMgr.GetOfficialObj(officialID)
|
if not offObj:
|
offObj = ChampionshipOfficial()
|
offZoneMgr.officialInfo[officialID] = offObj
|
offObj.SetAttr(attrDict)
|
|
if zoneID not in syncZoneOfficialInfo:
|
syncZoneOfficialInfo[zoneID] = []
|
officialIDList = syncZoneOfficialInfo[zoneID]
|
if officialID not in officialIDList:
|
officialIDList.append(officialID)
|
|
for zoneID, officialIDList in syncZoneOfficialInfo.items():
|
Sync_ChampionshipOfficialInfo(zoneID, officialIDList)
|
|
if not exData:
|
return
|
|
## ¹ÙÖ°ÉêÇë»ØÓ¦
|
if exDataType == "OfficialApplyReply":
|
mainPlayerName = exData["mainPlayerName"]
|
mainOfficialID = exData["mainOfficialID"]
|
officialID = exData["officialID"]
|
replyDict = exData["replyDict"]
|
for playerID, isOK in replyDict.items():
|
curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
|
if curPlayer == None or not curPlayer.GetInitOK():
|
continue
|
clientPack = ChPyNetSendPack.tagGCChampionshipOfficialApplyReplyRet()
|
clientPack.PlayerName = mainPlayerName
|
clientPack.NameLen = len(clientPack.PlayerName)
|
clientPack.MainOfficialID = mainOfficialID
|
clientPack.OfficialID = officialID
|
clientPack.IsOK = 1 if isOK else 0
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
|
## ¹ÙÖ°ÌôÕ½½á¹û
|
elif exDataType == "OfficialChallenge":
|
playerID = exData["playerID"]
|
tagPlayerName = exData["tagPlayerName"]
|
mainOfficialID = exData["mainOfficialID"]
|
officialID = exData["officialID"]
|
Ret = exData["Ret"]
|
curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
|
if curPlayer:
|
clientPack = ChPyNetSendPack.tagGCChampionshipOfficialChallengeRet()
|
clientPack.PlayerName = tagPlayerName
|
clientPack.NameLen = len(clientPack.PlayerName)
|
clientPack.MainOfficialID = mainOfficialID
|
clientPack.OfficialID = officialID
|
clientPack.Ret = Ret
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
|
## Ĥ°Ý
|
elif exDataType == "OfficialWorship":
|
playerID = exData["playerID"]
|
if not playerID:
|
return
|
if not PlayerControl.GetDBPlayerAccIDByID(playerID):
|
# ·Ç±¾·þÍæ¼Ò
|
return
|
msgInfo = [exDataType, exData]
|
CrossRealmPlayer.MapServer_QueryCrossPlayerResult(playerID, "Championship", msgInfo, True)
|
|
return
|
|
def ClientServerMsg_ChampionshipGuess(serverGroupID, msgData):
|
## ÊÕµ½×Ó·þÐÅÏ¢ - ¿ç·þÅÅλ¾º²Â
|
|
if "exDataType" not in msgData:
|
return
|
exDataType = msgData["exDataType"]
|
|
# ²éÑ¯Íæ¼ÒËùÓвÎÓëµÄ¾º²Â
|
if exDataType == "ChampionshipGuessQuery":
|
zoneID = msgData["zoneID"]
|
playerID = msgData["playerID"]
|
Send_CrossServerMsg_ChampionshipGuess(zoneID, playerID, serverGroupID=serverGroupID, exData=msgData)
|
return
|
|
if exDataType != "ChampionshipGuess":
|
return
|
|
zoneID = msgData["zoneID"]
|
playerID = msgData["playerID"]
|
guessType = msgData["guessType"]
|
tagPlayerID = msgData["tagPlayerID"]
|
guessRank = msgData["guessRank"]
|
guessMoney = msgData["guessMoney"]
|
moneyType = msgData["moneyType"]
|
|
if not tagPlayerID or not guessMoney:
|
return
|
|
stateError = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError)
|
if stateError:
|
GameWorld.ErrLog("¿ç·þÅÅλ״̬ÒѾÒì³£ÎÞ·¨¾º²Â! stateError=%s" % stateError, playerID)
|
return
|
|
guessTypeStateDict = {8:ShareDefine.CrossChampionshipState_Guess8,
|
4:ShareDefine.CrossChampionshipState_Guess4,
|
}
|
state = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState)
|
if guessType not in guessTypeStateDict or state != guessTypeStateDict[guessType]:
|
GameWorld.ErrLog("¾º²ÂÀàÐÍ´íÎó»òµ±Ç°×´Ì¬ÎÞ·¨½øÐиÃÀàÐ;º²Â! guessType=%s,state=%s" % (guessType, state), playerID)
|
return
|
|
curMoneyType, moneyValue = IpyGameDataPY.GetFuncEvalCfg("CrossChamGuess", 1)
|
guessCountMax = IpyGameDataPY.GetFuncCfg("CrossChamGuess", 2)
|
guessMoneyMax = moneyValue * guessCountMax
|
if moneyType != curMoneyType:
|
GameWorld.ErrLog("¾º²Â»õ±ÒÀàÐͲ»Ò»ÖÂ! moneyType=%s != curMoneyType=%s" % (moneyType, curMoneyType), playerID)
|
return
|
|
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)
|
return
|
|
guessTagPlayerCountMax = guessType
|
# 4Ç¿¾º²Â
|
if guessType == 4:
|
if guessRank <= 0 or guessRank > guessTagPlayerCountMax:
|
GameWorld.ErrLog("¾º²ÂÃû´Î´íÎó! zoneID=%s,guessType=%s,guessRank=%s" % (zoneID, guessType, guessRank), playerID)
|
return
|
top8PlayerIDList = pkZoneMgr.GetTop8PlayerIDList()
|
if tagPlayerID not in top8PlayerIDList:
|
GameWorld.ErrLog("Ä¿Ç°Íæ¼Ò·Ç¸Ã·ÖÇø8Ç¿Íæ¼Ò£¬ÎÞ·¨¾º²Â! zoneID=%s,tagPlayerID=%s not in %s"
|
% (zoneID, tagPlayerID, top8PlayerIDList), playerID)
|
return
|
|
guessObj = None
|
playerGuessList = pkZoneMgr.GetPlayerGuessList(playerID, guessType)
|
for guess in playerGuessList:
|
if guess.tagPlayerID == tagPlayerID:
|
if guessType == 4:
|
if guess.guessRank != guessRank:
|
GameWorld.ErrLog("ÒѾ´æÔڸþº²Â£¬µ«ÊDz»ÄÜÐ޸ľº²ÂÃû´Î£¬ÎÞ·¨¾º²Â! zoneID=%s,guessType=%s,tagPlayerID=%s, guessRank(%s) != guess.guessRank(%s)"
|
% (zoneID, guessType, tagPlayerID, guessRank, guess.guessRank), playerID)
|
return
|
guessObj = guess
|
GameWorld.Log("ÒѾ´æÔڸþº²Â£¬Íæ¼Ò½øÐмÓ×¢! guessInfo=%s" % guess.GetString(), playerID)
|
else:
|
if guessType == 4:
|
if guess.guessRank == guessRank:
|
GameWorld.ErrLog("¸ÃÃû´ÎÒѾ¾º²ÂÁËÆäËûÍæ¼Ò£¬ÎÞ·¨Öظ´¾º²ÂͬһÃû´Î! zoneID=%s,guessType=%s,tagPlayerID=%s,guessRank=%s,ÒѾ¾º²Â¹ýµÄÍæ¼ÒID=%s"
|
% (zoneID, guessType, tagPlayerID, guessRank, guess.tagPlayerID), playerID)
|
return
|
|
guessMoneyAlready = 0 if not guessObj else guessObj.moneyTotal # ÒѾ¾º²ÂµÄ¶î¶È
|
if guessMoneyAlready + guessMoney > guessMoneyMax:
|
GameWorld.ErrLog("³¬³ö×î´ó¿ÉͶע·ÝÊý¶î¶È£¬ÎÞ·¨¾º²Â! zoneID=%s,guessType=%s,tagPlayerID=%s,guessMoneyAlready=%s,guessMoney=%s,guessMoneyMax=%s"
|
% (zoneID, guessType, tagPlayerID, guessMoneyAlready, guessMoney, guessMoneyMax), playerID)
|
return
|
|
syncPub = False # ͬ²½¹«¹²ÐÅÏ¢
|
if not guessObj:
|
if len(playerGuessList) >= guessTagPlayerCountMax:
|
GameWorld.ErrLog("³¬³öÿ¸öÍæ¼Ò×î´ó¾º²ÂÈËÊý£¬ÎÞ·¨¾º²Â! zoneID=%s,guessType=%s,playerGuessListLen=%s >= guessTagPlayerCountMax=%s"
|
% (zoneID, guessType, len(playerGuessList), guessTagPlayerCountMax), playerID)
|
return
|
guessObj = ChampionshipGuess()
|
guessObj.zoneID = zoneID
|
guessObj.guessType = guessType
|
guessObj.guessRank = guessRank
|
guessObj.guessPlayerID = playerID
|
guessObj.tagPlayerID = tagPlayerID
|
guessObj.moneyTotal = 0 # Ͷע×Ü»õ±ÒÖµ
|
playerGuessList.append(guessObj)
|
|
syncPub = True
|
if guessType not in pkZoneMgr.supportCountInfo:
|
pkZoneMgr.supportCountInfo[guessType] = {}
|
playerSupportCountDict = pkZoneMgr.supportCountInfo[guessType]
|
playerSupportCountDict[tagPlayerID] = playerSupportCountDict.get(tagPlayerID, 0) + 1
|
superPlayerCount = playerSupportCountDict.get(tagPlayerID, 0)
|
GameWorld.Log("¸üб»¾º²ÂÍæ¼ÒÖ§³ÖÈËÊýÖµ! zoneID=%s,guessType=%s,tagPlayerID=%s,superPlayerCount=%s"
|
% (zoneID, guessType, tagPlayerID, superPlayerCount), playerID)
|
|
guessObj.moneyTotal += guessMoney
|
GameWorld.Log("¸üоº²Â! zoneID=%s,guessType=%s,tagPlayerID=%s,guessRank=%s,moneyTotal=%s"
|
% (zoneID, guessType, tagPlayerID, guessRank, guessObj.moneyTotal), playerID)
|
|
Send_CrossServerMsg_ChampionshipGuess(zoneID, playerID, guessObj, serverGroupID, msgData, syncPub=syncPub)
|
return
|
|
def ClientServerMsg_ChampionshipWorship(serverGroupID, msgData):
|
## ÊÕµ½×Ó·þÐÅÏ¢ - ¿ç·þÅÅλĤ°Ý
|
|
zoneID = msgData["zoneID"]
|
playerID = msgData["playerID"]
|
tagPlayerID = msgData["tagPlayerID"]
|
|
champMgr = GetChampionshipMgr()
|
offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID)
|
officialObj = offZoneMgr.GetPlayerOfficial(tagPlayerID)
|
if not officialObj:
|
GameWorld.ErrLog("¸Ã·ÖÇøÄ¿±êÍæ¼ÒûÓйÙÖ°£¬ÎÞ·¨Ä¤°Ý! zoneID=%s,tagPlayerID=%s" % (zoneID, tagPlayerID), playerID)
|
return
|
tagOfficialID = officialObj.officialID
|
mainIpyData = IpyGameDataPY.GetIpyGameData("ChampionshipOfficial", tagOfficialID)
|
if not mainIpyData:
|
return
|
juniorOfficialIDList = mainIpyData.GetJuniorOfficialIDList()
|
if not juniorOfficialIDList:
|
GameWorld.ErrLog("¸Ã¹ÙÖ°ÎÞϼ¶Ïɹ٣¬ÎÞ·¨Ä¤°Ý! zoneID=%s,tagPlayerID=%s,tagOfficialID=%s" % (zoneID, tagPlayerID, tagOfficialID), playerID)
|
return
|
|
officialObj.worshipCount += 1
|
|
if officialObj.worshipDouble:
|
msgData["worshipDouble"] = 1
|
|
syncOfficialIDList = [tagOfficialID]
|
Send_CrossServerMsg_ChampionshipOfficial(zoneID, syncOfficialIDList, exData=msgData)
|
return
|
|
def ClientServerMsg_ChampionshipOfficialApply(serverGroupID, msgData):
|
## ÊÕµ½×Ó·þÐÅÏ¢ - ¿ç·þÅÅλÏɹÙÉêÇë
|
|
zoneID = msgData["zoneID"]
|
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:
|
return
|
juniorOfficialIDList = mainIpyData.GetJuniorOfficialIDList()
|
if officialID not in juniorOfficialIDList:
|
GameWorld.ErrLog("ÉêÇë¹ÙÖ°ID·Ç¸Ã½çÖ÷ϼ¶¹ÙÖ°£¬ÎÞ·¨ÉêÇë! mainOfficialID=%s,officialID=%s not in %s"
|
% (mainOfficialID, officialID, juniorOfficialIDList), playerID)
|
return
|
|
ipyData = IpyGameDataPY.GetIpyGameData("ChampionshipOfficial", officialID)
|
if not ipyData:
|
return
|
canBeReplace = ipyData.GetCanBeReplace()
|
if canBeReplace:
|
GameWorld.ErrLog("¿É±»ÌôÕ½µÄ¹ÙÖ°ÎÞ·¨ÉêÇë! mainOfficialID=%s,officialID=%s" % (mainOfficialID, officialID), playerID)
|
return
|
|
champMgr = GetChampionshipMgr()
|
offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID)
|
mainOffObj = offZoneMgr.GetOfficialObj(mainOfficialID)
|
officialObj = offZoneMgr.GetOfficialObj(officialID)
|
if not mainOffObj or not officialObj:
|
return
|
|
if not mainOffObj.playerID:
|
GameWorld.Log("ÏɹÙËùÊô½çÖ÷ÎÞÍæ¼Ò£¬ÎÞ·¨ÉêÇë! zoneID=%s,mainOfficialID=%s,officialID=%s" % (zoneID, mainOfficialID, officialID), playerID)
|
return
|
|
if officialObj.playerID:
|
GameWorld.Log("ÏɹÙÒÑÓÐÍæ¼ÒÈÎÖ°£¬ÎÞ·¨ÉêÇë! zoneID=%s,mainOfficialID=%s,officialID=%s,offPlayerID=%s"
|
% (zoneID, mainOfficialID, officialID, officialObj.playerID), playerID)
|
return
|
|
if playerID in officialObj.applyPlayerInfo:
|
GameWorld.Log("ÒѾÉêÇë¹ý¸Ã¹ÙÖ°! zoneID=%s,mainOfficialID=%s,officialID=%s" % (zoneID, mainOfficialID, officialID), playerID)
|
return
|
|
applyPlayerCountMax = IpyGameDataPY.GetFuncCfg("CrossChamOfficial", 1) # ÿ¸ö¹ÙÖ°×î´óÉêÇëÍæ¼ÒÊý
|
if applyPlayerCountMax and len(officialObj.applyPlayerInfo) >= applyPlayerCountMax:
|
GameWorld.Log("¸Ã¹ÙÖ°ÒÑ´ïµ½×î´óÉêÇëÍæ¼ÒÊý! zoneID=%s,mainOfficialID=%s,officialID=%s,applyPlayerIDList=%s,applyPlayerCountMax=%s"
|
% (zoneID, mainOfficialID, officialID, officialObj.applyPlayerInfo.keys(), applyPlayerCountMax), playerID)
|
PlayerControl.NotifyCodeCross(serverGroupID, playerID, "ChampionshipOfficialApplyFull")
|
return
|
|
playerApplyOfficialIDList = []
|
for offID in offZoneMgr.officialInfo.keys():
|
offObj = offZoneMgr.GetOfficialObj(offID)
|
if not offObj:
|
continue
|
if offObj.playerID == playerID:
|
GameWorld.ErrLog("Íæ¼ÒÒѾÓÐÈÎÖ°¹ÙÖ°£¬ÎÞ·¨ÉêÇëÆäËû¹ÙÖ°! zoneID=%s,player officialID=%s" % (zoneID, offID), playerID)
|
PlayerControl.NotifyCodeCross(serverGroupID, playerID, "ChampionshipAlreadyHasOfficial")
|
return
|
if playerID in offObj.applyPlayerInfo:
|
playerApplyOfficialIDList.append(offID)
|
|
playerApplyCountMax = IpyGameDataPY.GetFuncCfg("CrossChamOfficial", 2) # ÿ¸öÍæ¼Ò×î´ó¿ÉͬʱÉêÇë¹ÙÖ°Êý
|
if playerApplyCountMax and len(playerApplyOfficialIDList) >= playerApplyCountMax:
|
GameWorld.Log("Íæ¼ÒÒѴﵽͬʱÉêÇë¹ÙÖ°×î´óÊý! zoneID=%s,mainOfficialID=%s,officialID=%s,playerApplyOfficialIDList=%s,playerApplyCountMax=%s"
|
% (zoneID, mainOfficialID, officialID, playerApplyOfficialIDList, playerApplyCountMax), playerID)
|
PlayerControl.NotifyCodeCross(serverGroupID, playerID, "ChampionshipOfficialApplyMax")
|
return
|
|
# ¸üÐÂû½øÈë¿ç·þµÄÍæ¼Ò»º´æÐÅÏ¢
|
PlayerViewCache.FindViewCache(playerID, True, PropData)
|
officialObj.applyPlayerInfo[playerID] = PropData
|
|
Send_CrossServerMsg_ChampionshipOfficial(zoneID, [officialID])
|
|
PlayerControl.NotifyCodeCross(serverGroupID, playerID, "ChampionshipOfficialApplyOK")
|
return
|
|
#// C0 21 ¿ç·þÅÅλÏɹÙÉêÇë»ØÓ¦ #tagCGChampionshipOfficialApplyReply
|
#
|
#struct tagCGChampionshipOfficialApplyReply
|
#{
|
# tagHead Head;
|
# WORD MainOfficialID; //½çÖ÷¹ÙÖ°ID
|
# WORD OfficialID; //ÉêÇë¹ÙÖ°ID
|
# DWORD PlayerID; //ÉêÇëµÄÍæ¼ÒID
|
# BYTE IsOK; //ÊÇ·ñͬÒ⣻1-ÊÇ£»0-·ñ
|
#};
|
def OnChampionshipOfficialApplyReply(index, clientData, tick):
|
if GameWorld.IsCrossServer():
|
return
|
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
playerID = curPlayer.GetPlayerID()
|
|
mainOfficialID = clientData.MainOfficialID
|
officialID = clientData.OfficialID
|
applyPlayerID = clientData.PlayerID
|
isOK = clientData.IsOK
|
|
champMgr = GetChampionshipMgr()
|
zoneID = champMgr.GetPlayerOfficialZoneID(playerID)
|
if not zoneID:
|
return
|
|
sendMsg = {"zoneID":zoneID, "playerID":playerID, "mainOfficialID":mainOfficialID, "officialID":officialID,
|
"applyPlayerID":applyPlayerID, "isOK":isOK}
|
CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_ChampionshipOfficialApplyReply, sendMsg)
|
return
|
|
def ClientServerMsg_ChampionshipOfficialApplyReply(serverGroupID, msgData):
|
## ÊÕµ½×Ó·þÐÅÏ¢ - ¿ç·þÅÅλÏɹÙÉêÇë»ØÓ¦
|
|
zoneID = msgData["zoneID"]
|
playerID = msgData["playerID"]
|
mainOfficialID = msgData["mainOfficialID"]
|
officialID = msgData["officialID"]
|
applyPlayerID = msgData["applyPlayerID"]
|
isOK = msgData["isOK"]
|
|
champMgr = GetChampionshipMgr()
|
offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID)
|
mainOffObj = offZoneMgr.GetOfficialObj(mainOfficialID)
|
officialObj = offZoneMgr.GetOfficialObj(officialID)
|
if not mainOffObj:
|
return
|
if not officialObj:
|
return
|
|
if mainOffObj.playerID != playerID:
|
GameWorld.ErrLog("·Ç½çÖ÷£¬ÎÞ·¨»ØÓ¦ÏɹÙÉêÇë! zoneID=%s,mainOfficialID=%s,mainOffPlayerID=%s"
|
% (zoneID, mainOfficialID, mainOffObj.playerID), playerID)
|
return
|
|
if applyPlayerID not in officialObj.applyPlayerInfo:
|
GameWorld.Log("Íæ¼ÒûÓÐÔÚ¸ÃÏɹÙÉêÇëÁбíÀ²»ÐèÒª»ØÓ¦! zoneID=%s,mainOfficialID=%s,officialID=%s,applyPlayerID=%s not in applyPlayerIDList=%s"
|
% (zoneID, mainOfficialID, officialID, applyPlayerID, officialObj.applyPlayerInfo.keys()), playerID)
|
return
|
|
replyDict = {applyPlayerID:isOK} # »ØÓ¦½á¹û {playerID:isOK, ...}
|
syncOfficialIDList = [officialID]
|
officialObj.applyPlayerInfo.pop(applyPlayerID)
|
|
# ͬÒâ
|
if isOK:
|
applyPlayerOffID = 0
|
# ÒÆ³ý¸ÃÍæ¼ÒµÄÆäËûÏɹÙÉêÇë
|
for offID in offZoneMgr.officialInfo.keys():
|
offObj = offZoneMgr.GetOfficialObj(offID)
|
if not offObj:
|
continue
|
|
if offObj.playerID == applyPlayerID:
|
applyPlayerOffID = offID
|
syncOfficialIDList.append(offID)
|
|
if applyPlayerID in offObj.applyPlayerInfo:
|
offObj.applyPlayerInfo.pop(applyPlayerID)
|
syncOfficialIDList.append(offID)
|
|
if applyPlayerOffID:
|
GameWorld.ErrLog("ͬÒâÍæ¼Ò¹ÙÖ°ÉêÇëʱ£¬ÉêÇë¹ÙÖ°Íæ¼ÒÒѾÈÎÖ°ÆäËû¹ÙÖ°£¬²»´¦Àí£¡ zoneID=%s,applyPlayerID=%s,applyPlayerOffID=%s"
|
% (zoneID, applyPlayerID, applyPlayerOffID), playerID)
|
else:
|
officialObj.playerID = applyPlayerID
|
# ĬÈϾܾøÆäËûÉêÇëÕß
|
for refusePlayerID in officialObj.applyPlayerInfo.keys():
|
replyDict[refusePlayerID] = 0
|
officialObj.applyPlayerInfo = {}
|
else:
|
pass
|
|
exData = {"exDataType":"OfficialApplyReply", "mainPlayerName":mainOffObj.playerName, "replyDict":replyDict,
|
"mainOfficialID":mainOfficialID, "officialID":officialID}
|
Send_CrossServerMsg_ChampionshipOfficial(zoneID, syncOfficialIDList, exData=exData)
|
return
|
|
def ClientServerMsg_ChampionshipOfficialChallenge(serverGroupID, msgData):
|
## ÊÕµ½×Ó·þÐÅÏ¢ - ÏɹÙÌôÕ½
|
|
zoneID = msgData["zoneID"]
|
playerID = msgData["playerID"]
|
mainOfficialID = msgData["mainOfficialID"]
|
officialID = msgData["officialID"]
|
tagPlayerID = msgData["tagPlayerID"]
|
PropData = msgData["PropData"]
|
|
if playerID == tagPlayerID:
|
GameWorld.ErrLog("ÌôÕ½Ïɹٲ»ÄÜÌôÕ½×Ô¼º! mainOfficialID=%s,officialID=%s" % (mainOfficialID, officialID), playerID)
|
return
|
|
mainIpyData = IpyGameDataPY.GetIpyGameData("ChampionshipOfficial", mainOfficialID)
|
if not mainIpyData:
|
return
|
juniorOfficialIDList = mainIpyData.GetJuniorOfficialIDList()
|
if officialID not in juniorOfficialIDList:
|
GameWorld.ErrLog("ÉêÇë¹ÙÖ°ID·Ç¸Ã½çÖ÷ϼ¶¹ÙÖ°£¬ÎÞ·¨ÌôÕ½! mainOfficialID=%s,officialID=%s not in %s"
|
% (mainOfficialID, officialID, juniorOfficialIDList), playerID)
|
return
|
|
ipyData = IpyGameDataPY.GetIpyGameData("ChampionshipOfficial", officialID)
|
if not ipyData:
|
return
|
canBeReplace = ipyData.GetCanBeReplace()
|
if not canBeReplace:
|
GameWorld.ErrLog("¸ÃÏɹÙÎÞ·¨±»ÌôÕ½Ìæ»»! mainOfficialID=%s,officialID=%s" % (mainOfficialID, officialID), playerID)
|
return
|
|
champMgr = GetChampionshipMgr()
|
offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID)
|
mainOffObj = offZoneMgr.GetOfficialObj(mainOfficialID)
|
officialObj = offZoneMgr.GetOfficialObj(officialID)
|
if not mainOffObj or not officialObj:
|
return
|
|
if not mainOffObj.playerID:
|
GameWorld.Log("ÏɹÙËùÊô½çÖ÷ÎÞÍæ¼Ò£¬ÎÞ·¨ÌôÕ½! zoneID=%s,mainOfficialID=%s,officialID=%s" % (zoneID, mainOfficialID, officialID), playerID)
|
return
|
|
for offID in offZoneMgr.officialInfo.keys():
|
offObj = offZoneMgr.GetOfficialObj(offID)
|
if not offObj:
|
continue
|
if offObj.playerID == playerID:
|
GameWorld.ErrLog("Íæ¼ÒÒѾÓÐÈÎÖ°¹ÙÖ°£¬ÎÞ·¨ÌôÕ½ÆäËû¹ÙÖ°! zoneID=%s, player officialID=%s" % (zoneID, offID), playerID)
|
PlayerControl.NotifyCodeCross(serverGroupID, playerID, "ChampionshipAlreadyHasOfficial")
|
return
|
|
Ret = 0 # ÌôÕ½½á¹û£»0-ʧ°Ü£»1-»ñʤ£»2-Ä¿±êÏɹÙÍæ¼ÒIDÒѱä¸ü£¬¿ÉˢкóÖØÊÔ
|
offPlayerID = officialObj.playerID
|
if not offPlayerID:
|
GameWorld.Log("ÌôսĿ±êÏɹÙÎÞÍæ¼ÒÈÎÖ°£¬Ö±½Ó»ñʤ! zoneID=%s,mainOfficialID=%s,officialID=%s" % (zoneID, mainOfficialID, officialID), playerID)
|
Ret = 1
|
elif offPlayerID != tagPlayerID:
|
GameWorld.Log("ÌôսĿ±êÏɹÙÍæ¼ÒIDÒѱä¸ü£¬ÐèҪˢкóÖØÐÂÌôÕ½! zoneID=%s,mainOfficialID=%s,officialID=%s,offPlayerID(%s) != tagPlayerID(%s)"
|
% (zoneID, mainOfficialID, officialID, offPlayerID, tagPlayerID), playerID)
|
Ret = 2
|
else:
|
fightPower = PropData.get("FightPower", 0)
|
tagFightPower = officialObj.fightPower
|
Ret = 1 if fightPower > tagFightPower else 0
|
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:
|
officialObj.challengeList.append({"Time":int(time.time()), "Ret":Ret,
|
"Name":playerName,
|
"AccID":PropData.get("AccID", ""),
|
})
|
# Ö»±£Áô×î½ü5Ìõ¼þ¼Ç¼
|
if len(officialObj.challengeList) > 5:
|
officialObj.challengeList.pop(0)
|
|
# ¸üÐÂû½øÈë¿ç·þµÄÍæ¼Ò»º´æÐÅÏ¢
|
PlayerViewCache.FindViewCache(playerID, True, PropData)
|
|
# ¸üÐÂÈÎÖ°Íæ¼ÒID
|
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, syncOfficialIDList, exData=exData)
|
return
|
|
#// C0 23 ¿ç·þÅÅλÏɹÙÌôÕ½¼Ç¼²éѯ #tagCGChampionshipOfficialChallengeQuery
|
#
|
#struct tagCGChampionshipOfficialChallengeQuery
|
#{
|
# tagHead Head;
|
# WORD MainOfficialID; //½çÖ÷¹ÙÖ°ID
|
# WORD OfficialID; //²éѯ¹ÙÖ°ID
|
#};
|
def OnChampionshipOfficialChallengeQuery(index, clientData, tick):
|
if GameWorld.IsCrossServer():
|
return
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
playerID = curPlayer.GetPlayerID()
|
|
mainOfficialID = clientData.MainOfficialID
|
officialID = clientData.OfficialID
|
|
champMgr = GetChampionshipMgr()
|
zoneID = champMgr.GetPlayerOfficialZoneID(playerID)
|
if not zoneID:
|
return
|
|
offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID)
|
officialObj = offZoneMgr.GetOfficialObj(officialID)
|
challengeList = officialObj.challengeList if officialObj else []
|
|
clientPack = ChPyNetSendPack.tagGCChampionshipOfficialChallengeRecordInfo()
|
clientPack.ZoneID = zoneID
|
clientPack.MainOfficialID = mainOfficialID
|
clientPack.OfficialID = officialID
|
clientPack.RecordList = []
|
for challengeDict in challengeList:
|
recordPack = ChPyNetSendPack.tagGCChampionshipOfficialChallengeRecord()
|
recordPack.PlayerName = challengeDict.get("Name", "")
|
recordPack.NameLen = len(recordPack.PlayerName)
|
recordPack.ChallengeTime = challengeDict.get("Time", 0)
|
recordPack.Ret = challengeDict.get("Ret", 0)
|
clientPack.RecordList.append(recordPack)
|
clientPack.RecordCount = len(clientPack.RecordList)
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return
|
|
#// C0 24 ¿ç·þÅÅλ´ÇÍËϼ¶Ïɹ٠#tagCGChampionshipOfficialKick
|
#
|
#struct tagCGChampionshipOfficialKick
|
#{
|
# tagHead Head;
|
# WORD MainOfficialID; //½çÖ÷¹ÙÖ°ID
|
# WORD OfficialID; //Ä¿±ê¹ÙÖ°ID
|
# DWORD PlayerID; //Ä¿±êÍæ¼ÒID
|
#};
|
def OnChampionshipOfficialKick(index, clientData, tick):
|
if GameWorld.IsCrossServer():
|
return
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
playerID = curPlayer.GetPlayerID()
|
|
mainOfficialID = clientData.MainOfficialID
|
officialID = clientData.OfficialID
|
tagPlayerID = clientData.PlayerID
|
|
champMgr = GetChampionshipMgr()
|
zoneID = champMgr.GetPlayerOfficialZoneID(playerID)
|
if not zoneID:
|
return
|
|
sendMsg = {"zoneID":zoneID, "playerID":playerID, "mainOfficialID":mainOfficialID, "officialID":officialID,
|
"tagPlayerID":tagPlayerID, "playerName":CrossRealmPlayer.GetCrossPlayerName(curPlayer)}
|
CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_ChampionshipOfficialKick, sendMsg)
|
return
|
|
def ClientServerMsg_ChampionshipOfficialKick(serverGroupID, msgData):
|
## ÊÕµ½×Ó·þÐÅÏ¢ - ¿ç·þÅÅλ´ÇÍËϼ¶ÏɹÙ
|
|
zoneID = msgData["zoneID"]
|
playerID = msgData["playerID"]
|
playerName = msgData["playerName"]
|
mainOfficialID = msgData["mainOfficialID"]
|
officialID = msgData["officialID"]
|
tagPlayerID = msgData["tagPlayerID"]
|
|
mainIpyData = IpyGameDataPY.GetIpyGameData("ChampionshipOfficial", mainOfficialID)
|
if not mainIpyData:
|
return
|
juniorOfficialIDList = mainIpyData.GetJuniorOfficialIDList()
|
if officialID not in juniorOfficialIDList:
|
GameWorld.ErrLog("¹ÙÖ°ID·Ç¸Ã½çÖ÷ϼ¶¹ÙÖ°£¬ÎÞ·¨´ÇÍË! mainOfficialID=%s,officialID=%s not in %s"
|
% (mainOfficialID, officialID, juniorOfficialIDList), playerID)
|
return
|
|
champMgr = GetChampionshipMgr()
|
offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID)
|
mainOffObj = offZoneMgr.GetOfficialObj(mainOfficialID)
|
officialObj = offZoneMgr.GetOfficialObj(officialID)
|
if not mainOffObj:
|
return
|
if not officialObj:
|
return
|
|
if mainOffObj.playerID != playerID:
|
GameWorld.ErrLog("·Ç½çÖ÷£¬ÎÞ·¨´ÇÍËϼ¶ÏɹÙ! zoneID=%s,mainOfficialID=%s,mainOffPlayerID=%s"
|
% (zoneID, mainOfficialID, mainOffObj.playerID), playerID)
|
return
|
|
if not officialObj.playerID or officialObj.playerID != tagPlayerID:
|
GameWorld.Log("µ±Ç°ÏɹÙÍæ¼ÒID·ÇÄ¿±êÍæ¼ÒID£¬ÎÞ·¨´ÇÍË! zoneID=%s,mainOfficialID=%s,officialID=%s,offPlayerID(%s) != tagPlayerID(%s)"
|
% (zoneID, mainOfficialID, officialID, officialObj.playerID, tagPlayerID), playerID)
|
return
|
|
kickCD = IpyGameDataPY.GetFuncCfg("CrossChamOfficial", 4) # ´ÇÍËϼ¶Ïɹٹ«¹²CD£¬Ãë
|
if kickCD:
|
curTime = int(time.time())
|
passSeconds = curTime - mainOffObj.lastDismissJuniorTime
|
if passSeconds < kickCD:
|
GameWorld.ErrLog("½çÖ÷´ÇÍËϼ¶ÏɹÙCDÖÐ! zoneID=%s,mainOfficialID=%s,passSeconds(%s) < %s"
|
% (zoneID, mainOfficialID, passSeconds, kickCD), playerID)
|
return
|
mainOffObj.lastDismissJuniorTime = curTime
|
|
officialObj.ResetPlayer() # ´ÇÍËÖØÖÃ
|
|
if tagPlayerID:
|
# Óʼþ֪ͨ¶Ô·½£¬¹ÙÖ°±»´ÇÍËÁË
|
PlayerCompensation.SendMailByKey("CrossChampionshipOfficialBeKick", [tagPlayerID], [], [playerName, officialID], crossMail=True)
|
|
syncOfficialIDList = [mainOfficialID, officialID]
|
Send_CrossServerMsg_ChampionshipOfficial(zoneID, syncOfficialIDList)
|
return
|
|
|
#// C0 25 ¿ç·þÅÅλÖ÷¶¯ÀëÈÎÏɹ٠#tagCGChampionshipOfficialLeave
|
#
|
#struct tagCGChampionshipOfficialLeave
|
#{
|
# tagHead Head;
|
# WORD MainOfficialID; //½çÖ÷¹ÙÖ°ID
|
# WORD OfficialID; //ÀëÈιÙÖ°ID
|
#};
|
def OnChampionshipOfficialLeave(index, clientData, tick):
|
if GameWorld.IsCrossServer():
|
return
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
playerID = curPlayer.GetPlayerID()
|
|
mainOfficialID = clientData.MainOfficialID
|
officialID = clientData.OfficialID
|
|
champMgr = GetChampionshipMgr()
|
zoneID = champMgr.GetPlayerOfficialZoneID(playerID)
|
if not zoneID:
|
return
|
|
sendMsg = {"zoneID":zoneID, "playerID":playerID, "mainOfficialID":mainOfficialID, "officialID":officialID}
|
CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_ChampionshipOfficialLeave, sendMsg)
|
return
|
|
def ClientServerMsg_ChampionshipOfficialLeave(serverGroupID, msgData):
|
## ÊÕµ½×Ó·þÐÅÏ¢ - ¿ç·þÅÅλÖ÷¶¯ÀëÈÎÏɹÙ
|
|
zoneID = msgData["zoneID"]
|
playerID = msgData["playerID"]
|
mainOfficialID = msgData["mainOfficialID"]
|
officialID = msgData["officialID"]
|
|
mainIpyData = IpyGameDataPY.GetIpyGameData("ChampionshipOfficial", mainOfficialID)
|
if not mainIpyData:
|
return
|
juniorOfficialIDList = mainIpyData.GetJuniorOfficialIDList()
|
if officialID not in juniorOfficialIDList:
|
GameWorld.ErrLog("¹ÙÖ°ID·Ç¸Ã½çÖ÷ϼ¶¹ÙÖ°£¬ÎÞ·¨Ö÷¶¯ÀëÈÎÏɹÙ! mainOfficialID=%s,officialID=%s not in %s"
|
% (mainOfficialID, officialID, juniorOfficialIDList), playerID)
|
return
|
|
champMgr = GetChampionshipMgr()
|
offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID)
|
officialObj = offZoneMgr.GetOfficialObj(officialID)
|
if not officialObj:
|
return
|
|
if not officialObj.playerID or officialObj.playerID != playerID:
|
GameWorld.Log("·Ç±¾ÏɹÙÍæ¼ÒID£¬ÎÞ·¨Ö÷¶¯ÀëÈÎÏɹÙ! zoneID=%s,mainOfficialID=%s,officialID=%s,offPlayerID(%s) != playerID(%s)"
|
% (zoneID, mainOfficialID, officialID, officialObj.playerID, playerID), playerID)
|
return
|
|
officialObj.ResetPlayer() # ÀëÈÎÖØÖÃ
|
|
syncOfficialIDList = [officialID]
|
Send_CrossServerMsg_ChampionshipOfficial(zoneID, syncOfficialIDList)
|
return
|
|
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():
|
groupMarkDict[groupMark] = groupDict.keys()
|
playerIDList = pkZoneMgr.GetBatPlayerIDList()
|
else:
|
playerIDList = []
|
for groupMark, battleNumList in groupMarkDict.items():
|
for battleNum in battleNumList:
|
battleObj = pkZoneMgr.GetBattle(groupMark, battleNum)
|
if not battleObj:
|
continue
|
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)
|
clientPack.ZoneID = zoneID
|
clientPack.GroupList = []
|
for groupMark, battleNumList in groupMarkDict.items():
|
groupPack = ChPyNetSendPack.tagGCCrossChampionshipPKGroup()
|
groupPack.GroupMark = groupMark
|
groupPack.BattleList = []
|
for battleNum in battleNumList:
|
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)
|
clientPack.GroupCount = len(clientPack.GroupList)
|
|
clientPack.PlayerList = []
|
for playerID in playerIDList:
|
batPlayer = pkZoneMgr.GetBatPlayer(playerID)
|
if not batPlayer:
|
continue
|
playerPack = ChPyNetSendPack.tagGCCrossChampionshipPKPlayer()
|
playerPack.PlayerID = playerID
|
playerPack.PlayerName = batPlayer.playerName
|
playerPack.NameLen = len(playerPack.PlayerName)
|
playerPack.Job = batPlayer.job
|
playerPack.LV = batPlayer.lv
|
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
|
clientPack.PlayerList.append(playerPack)
|
clientPack.PlayerCount = len(clientPack.PlayerList)
|
|
if curPlayer != None:
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
else:
|
playerManager = GameWorld.GetPlayerManager()
|
for i in xrange(playerManager.GetPlayerCount()):
|
curPlayer = playerManager.GetPlayerByIndex(i)
|
if curPlayer == None or not curPlayer.GetInitOK():
|
continue
|
playerZoneID = champMgr.GetPlayerPKZoneID(curPlayer.GetPlayerID())
|
if playerZoneID != zoneID:
|
continue
|
if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
|
continue
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
|
return
|
|
def Sync_ChampionshipGuessPriInfo(curPlayer, syncKeyInfo=None):
|
## ͬ²½ÅÅλ·ÖÇø¾º²Â¸öÈËÐÅÏ¢
|
# @param syncKeyInfo: Ö¸¶¨Í¬²½µÄ {guessType:[tagPlayerID, ...], ...}
|
|
playerID = curPlayer.GetPlayerID()
|
champMgr = GetChampionshipMgr()
|
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
|
clientPack.GuessList = []
|
|
for guessType, playerGuessDict in pkZoneMgr.guessInfo.items():
|
if syncKeyInfo and guessType not in syncKeyInfo:
|
continue
|
syncTagPlayerIDList = [] if not syncKeyInfo else syncKeyInfo.get(guessType, [])
|
|
priListPack = ChPyNetSendPack.tagGCChampionshipGuessPriList()
|
priListPack.GuessType = guessType
|
priListPack.GuessPlayerList = []
|
|
playerGuessList = playerGuessDict.get(playerID, [])
|
for guess in playerGuessList:
|
tagPlayerID = guess.tagPlayerID
|
if syncTagPlayerIDList and tagPlayerID not in syncTagPlayerIDList:
|
continue
|
priPlayerPack = ChPyNetSendPack.tagGCChampionshipGuessPlayerPri()
|
priPlayerPack.PlayerID = tagPlayerID
|
priPlayerPack.MoneyTotal = guess.moneyTotal
|
priPlayerPack.GuessRank = guess.guessRank
|
priListPack.GuessPlayerList.append(priPlayerPack)
|
priListPack.PlayerCount = len(priListPack.GuessPlayerList)
|
|
clientPack.GuessList.append(priListPack)
|
|
clientPack.Count = len(clientPack.GuessList)
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return
|
|
def Sync_ChampionshipGuessPubInfo(zoneID, curPlayer=None, syncKeyInfo=None):
|
## ͬ²½ÅÅλ·ÖÇø¾º²Â¹«¹²ÐÅÏ¢
|
# @param syncKeyInfo: Ö¸¶¨Í¬²½µÄ {guessType:[tagPlayerID, ...], ...}
|
|
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
|
|
# ¹«¹²¾º²ÂÐÅÏ¢
|
clientPack = ChPyNetSendPack.tagGCChampionshipGuessPubInfo()
|
clientPack.ZoneID = zoneID
|
clientPack.GuessList = []
|
|
for guessType, playerSupportCountDict in pkZoneMgr.supportCountInfo.items():
|
if syncKeyInfo and guessType not in syncKeyInfo:
|
continue
|
syncTagPlayerIDList = [] if not syncKeyInfo else syncKeyInfo.get(guessType, [])
|
|
pubListPack = ChPyNetSendPack.tagGCChampionshipGuessPubList()
|
pubListPack.GuessType = guessType
|
pubListPack.GuessPlayerList = []
|
|
for tagPlayerID, supportCount in playerSupportCountDict.items():
|
if syncTagPlayerIDList and tagPlayerID not in syncTagPlayerIDList:
|
continue
|
pubPlayerPack = ChPyNetSendPack.tagGCChampionshipGuessPlayerPub()
|
pubPlayerPack.PlayerID = tagPlayerID
|
pubPlayerPack.SupportCount = supportCount
|
pubListPack.GuessPlayerList.append(pubPlayerPack)
|
pubListPack.PlayerCount = len(pubListPack.GuessPlayerList)
|
|
clientPack.GuessList.append(pubListPack)
|
|
clientPack.Count = len(clientPack.GuessList)
|
|
if curPlayer != None:
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
else:
|
playerManager = GameWorld.GetPlayerManager()
|
for i in xrange(playerManager.GetPlayerCount()):
|
curPlayer = playerManager.GetPlayerByIndex(i)
|
if curPlayer == None or not curPlayer.GetInitOK():
|
continue
|
playerZoneID = champMgr.GetPlayerPKZoneID(curPlayer.GetPlayerID())
|
if playerZoneID != zoneID:
|
continue
|
if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
|
continue
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return
|
|
def Sync_ChampionshipOfficialInfo(zoneID, officialIDList=None, curPlayer=None):
|
## ͬ²½ÅÅλ·ÖÇø¹ÙÖ°ÐÅÏ¢
|
# @param officialIDList: [officialID, ...]
|
|
champMgr = GetChampionshipMgr()
|
if curPlayer:
|
playerZoneID = champMgr.GetPlayerOfficialZoneID(curPlayer.GetPlayerID())
|
if playerZoneID != zoneID:
|
return
|
if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
|
return
|
|
clientPack = ChPyNetSendPack.tagGCChampionshipOfficialInfo()
|
clientPack.ZoneID = zoneID
|
clientPack.OfficialList = []
|
|
offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID)
|
if officialIDList == None:
|
officialIDList = offZoneMgr.officialInfo.keys()
|
|
for officialID in officialIDList:
|
offObj = offZoneMgr.GetOfficialObj(officialID)
|
if not offObj:
|
continue
|
offPlayer = ChPyNetSendPack.tagGCChampionshipOfficialPlayer()
|
offPlayer.PlayerID = offObj.playerID
|
offPlayer.PlayerName = offObj.playerName
|
offPlayer.NameLen = len(offPlayer.PlayerName)
|
offPlayer.Job = offObj.job
|
offPlayer.LV = offObj.lv
|
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
|
offPack.LastDismissJuniorTime = offObj.lastDismissJuniorTime
|
offPack.WorshipCount = offObj.worshipCount
|
offPack.WorshipDouble = offObj.worshipDouble
|
offPack.OfficialPlayer = offPlayer
|
offPack.ApplyPlayerList = []
|
for applyPlayerID, playerInfo in offObj.applyPlayerInfo.items():
|
applyPlayer = ChPyNetSendPack.tagGCChampionshipOfficialPlayer()
|
applyPlayer.PlayerID = applyPlayerID
|
applyPlayer.PlayerName = playerInfo.get("Name", "")
|
applyPlayer.NameLen = len(applyPlayer.PlayerName)
|
applyPlayer.Job = playerInfo.get("Job", 1)
|
applyPlayer.LV = playerInfo.get("LV", 1)
|
fightPower = playerInfo.get("FightPower", 0)
|
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)
|
clientPack.OfficialList.append(offPack)
|
|
clientPack.OfficialCount = len(clientPack.OfficialList)
|
|
if curPlayer != None:
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
else:
|
playerManager = GameWorld.GetPlayerManager()
|
for i in xrange(playerManager.GetPlayerCount()):
|
curPlayer = playerManager.GetPlayerByIndex(i)
|
if curPlayer == None or not curPlayer.GetInitOK():
|
continue
|
playerZoneID = champMgr.GetPlayerOfficialZoneID(curPlayer.GetPlayerID())
|
if playerZoneID != zoneID:
|
continue
|
if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship):
|
continue
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
|
return
|
|
def DR_CrossChampionshipPK(eventName, dataDict={}):
|
drDataDict = {}
|
drDataDict.update(dataDict)
|
DataRecordPack.SendEventPack("CrossChampionship_%s" % eventName, drDataDict)
|
return
|
|