| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package PlayerXMZZ  | 
| #  | 
| # @todo:ÏÉħ֮Õù  | 
| # @author xdh  | 
| # @date 2017-12-07  | 
| # @version 1.1  | 
| #  | 
| #  | 
| # ÏêϸÃèÊö: ÏÉħ֮Õù  | 
| # @change: "2018-07-09 14:30" xdh Ã¿³¡ÌØÊâ´ÎÊý°´ÊÀ½çµÈ¼¶¶ÔÓ¦Õ½Á¦·¶Î§À´Ëæ»ú¶ÔÊÖ  | 
| #---------------------------------------------------------------------  | 
| """Version = 2018-07-09 14:30"""  | 
|   | 
| import GameWorld  | 
| import ShareDefine  | 
| import IpyGameDataPY  | 
| import PlayerDBGSEvent  | 
| import PlayerCompensation  | 
| import ChPyNetSendPack  | 
| import NetPackCommon  | 
| import ChConfig  | 
| import PyGameDataStruct  | 
| import CommFunc  | 
| import PyDataManager  | 
| import PlayerControl  | 
| import PlayerViewCache  | 
| import FormulaControl  | 
| import PlayerUniversalGameRec  | 
|   | 
| import random  | 
| import math  | 
| import json  | 
|   | 
| RecType = ShareDefine.Def_UniversalGameRecType_XMZZStageRecord  | 
| RecType1 = ShareDefine.Def_UniversalGameRecType_XMZZPKInfoRecord  | 
| #strValue3 {ͶעË÷Òý:½á¹û,..}  | 
| g_historyPKDict = {} #ÀúÊ·¶ÔÊÖID»º´æ  | 
|   | 
| (  | 
| Bet_StartTime, #Ͷע¿ªÊ¼Ê±¼ä  | 
| Bet_EndTime, #Ͷע½áÊøÊ±¼ä  | 
| Bet_ResultTime, #Ͷע½áËãʱ¼ä  | 
| Bet_NeedMoney, #ͶעÐèҪǮ  | 
| ) = range(4)  | 
|   | 
| (  | 
| Faction_0, #δ·ÖÅä  | 
| Faction_1, #ÏÉ×å  | 
| Faction_2, #ħ×å  | 
| ) = range(0, 3)  | 
|   | 
| (  | 
| Def_Faction1Win, #ÏÉ×åʤÀû  | 
| Def_Faction2Win, #ħ×åʤÀû  | 
| Def_Dogfall #ƽ¾Ö  | 
| ) = range(1, 4)  | 
|   | 
|   | 
| ## ·þÎñÆ÷¿ªÆôʱ¼ì²é  | 
| def OnGameServerInitOK():  | 
|     fbFuncStateKey = ShareDefine.Def_Notify_WorldKey_FBFuncState % ChConfig.Def_FBMapID_XMZZ  | 
|     gameWorld = GameWorld.GetGameWorld()  | 
|     isAtCPing = gameWorld.GetDictByKey(fbFuncStateKey) != 0  | 
|           | 
|       | 
|     hasSendAward = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_XMZZIsOver) #ÊÇ·ñ½áËã¹ý  | 
|       | 
|     if not isAtCPing and not hasSendAward: #»î¶¯Î´¿ªÆô²¢ÇÒδ½áËã  | 
|         PyDataManager.GetXMZZManager().GiveXMZZAward()  | 
|       | 
|     return  | 
|   | 
| def OnXMZZOnLogin(curPlayer):  | 
|     #Íæ¼ÒµÇ¼  | 
|     PyDataManager.GetXMZZManager().NotifyXMZZInfo(curPlayer)  | 
|     PyDataManager.GetXMZZManager().NotifyXMZZSelfInfo(curPlayer)  | 
|     PlayerUniversalGameRec.SendUniversalGameRecInfo(curPlayer, RecType1)  | 
|       | 
|     if curPlayer.GetMapID() == ChConfig.Def_FBMapID_XMZZ:  | 
|         PyDataManager.GetXMZZManager().SyncXMZZFightInfo(curPlayer)  | 
|     return  | 
|   | 
| def XMZZOndayEx():  | 
|     #¹ýÌì  | 
|     global g_historyPKDict  | 
|     PyDataManager.GetXMZZManager().ResetXMZZ()  | 
|     g_historyPKDict = {} #ÀúÊ·¶ÔÊÖID»º´æ  | 
|     return  | 
|   | 
| ## ÏÉħ֮Õù»î¶¯×´Ì¬±ä¸ü  | 
| #  @param curPlayer  | 
| #  @param isOpen  | 
| #  @return  | 
| def OnXMZZStateChange(dictName, value):  | 
|           | 
|     DoBetResultSaveLogic()  | 
|       | 
|     if value == 0: #»î¶¯½áÊø  | 
|         PyDataManager.GetXMZZManager().GiveXMZZAward()  | 
|       | 
|       | 
|     #hasSendAward = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_XMZZIsOver) #ÊÇ·ñ½áËã¹ý  | 
| #    if value == 1 and hasSendAward:  | 
| #        PyDataManager.GetXMZZManager().ResetXMZZ()  | 
|     return  | 
|   | 
|   | 
| def OnXMZZBet(curPlayer, msgInfo):  | 
|     ## ÏÉħ֮ÕùͶע  | 
|     betIndex, betResult, needMoney = msgInfo  | 
|     fbFuncStateKey = ShareDefine.Def_Notify_WorldKey_FBFuncState % ChConfig.Def_FBMapID_XMZZ  | 
|     gameWorld = GameWorld.GetGameWorld()  | 
|     if gameWorld.GetDictByKey(fbFuncStateKey) == 0:  | 
|         return  | 
|       | 
|     #¼Ç¼Ͷע  | 
|     result = PyDataManager.GetXMZZManager().AddBetRecord(curPlayer, betIndex, betResult, needMoney)  | 
|     if result:  | 
|         return [needMoney]  | 
|       | 
| def DoBetResultSaveLogic():  | 
|     #ÏÉħ֮ÕùѺע½áËã   | 
|     betTimeDict = IpyGameDataPY.GetFuncEvalCfg('XMZZBetCfg')  | 
|     if not betTimeDict:  | 
|         return  | 
|     curResult = PyDataManager.GetXMZZManager().GetXMZZCurResult()  | 
|     #curTime = str(GameWorld.GetServerTime())[11:16]  | 
|     curTime = GameWorld.GetServerTime()  | 
|     curHour, curMinute = curTime.hour, curTime.minute  | 
|     GameWorld.DebugLog('    ÏÉħ֮ÕùѺע½áËã  curTime=%s, curResult=%s' % (curTime, curResult))  | 
|       | 
|     universalRecMgr = GameWorld.GetUniversalRecMgr()  | 
|     recordList = universalRecMgr.GetTypeList(RecType)  | 
|     if recordList.Count() <= 0:  | 
|         recData = recordList.AddRec()  | 
|         resutlDict = {}  | 
|         recData.SetStrValue3(str(resutlDict))  | 
|     else:  | 
|         recData = recordList.At(0)  | 
|         resutlDict = eval(recData.GetStrValue3())  | 
|                   | 
|   | 
|     for betIndex, info in betTimeDict.items():  | 
|         hour, minute = info[Bet_ResultTime].split(':')  | 
|         if abs(curHour*60+curMinute - (int(hour)*60+int(minute))) <= 1:  | 
|             if betIndex not in resutlDict:  | 
|                 resutlDict[betIndex] = curResult  | 
|                 recData.SetStrValue3(str(resutlDict))  | 
|                 GameWorld.DebugLog('    ÏÉħ֮Õù½×¶Î³É¼¨¼Ç¼£¡ betIndex=%s'%betIndex)  | 
|                 if int(betIndex) in [1,2,3]:  | 
|                     if curResult == Def_Dogfall:  | 
|                         SavePKRecord('XMZZ_DrawStage', [betIndex], True)  | 
|                     else:  | 
|                         SavePKRecord('XMZZ_LeadingStage', [betIndex, curResult], True)  | 
| #                else:  | 
| #                    if curResult != Def_Dogfall:  | 
| #                        PyDataManager.GetXMZZManager().SavePKRecord('XMZZ_Victory', [curResult], True)  | 
| #                    else:  | 
| #                        PyDataManager.GetXMZZManager().SavePKRecord('XMZZ_Draw', [], True)  | 
|                 PyDataManager.GetXMZZManager().NotifyXMZZInfo()  | 
|     return  | 
|   | 
|   | 
| #// AC 01 ÏÉħ֮Õù±¨Ãû #tagCGJoinXMZZ  | 
| #  | 
| #struct    tagCGJoinXMZZ  | 
| #{  | 
| #    tagHead        Head;  | 
| #};  | 
| ## ·ÖÅäÕóÓª   | 
| def OnJoinXMZZ(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     PyDataManager.GetXMZZManager().DoAllocationFaction(curPlayer)  | 
|     return  | 
|   | 
| #// AC 02 ÏÉħ֮ÕùÕ½¶·½áÊø #tagCGXMZZOver  | 
| #  | 
| #struct    tagCGXMZZOver  | 
| #{  | 
| #    tagHead        Head;  | 
| #    BYTE        IsWin; //ÊÇ·ñʤÀû  | 
| #    BYTE        HPPer; //Ê£ÓàѪÁ¿°Ù·Ö±È  | 
| #};  | 
| def OnXMZZPKOver(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     isWin = clientData.IsWin  | 
|     isEnd = clientData.IsEnd  | 
|     HPPer = clientData.HPPer  | 
|     vsName = clientData.VSName  | 
|     #¼ÆËãÔö¼Ó»ý·Ö  | 
|     XMZZPKOver(curPlayer, vsName, isWin, isEnd, HPPer)  | 
|     return  | 
|   | 
| def XMZZStartFight(curPlayer, msgInfo):  | 
|     ##¿ªÊ¼Õ½¶·  | 
|     isStart = msgInfo[0]  | 
|     if isStart:#±¾¾Ö¸Õ¿ªÊ¼ÔòÇå³ýÁ¬Ê¤¼Ç¼  | 
|         PyDataManager.GetXMZZManager().ResetConWinRecord(curPlayer)  | 
|           | 
|     #ɸѡ¶ÔÊÖ  | 
|     isOK = RandomBattler(curPlayer)  | 
|     if isOK and isStart:  | 
|         return True  | 
|     return   | 
|   | 
|   | 
|   | 
|   | 
| def OnGetXMZZWinPrize(curPlayer, msgList):  | 
|     ##ÁìÈ¡ÏÉħ֮ÕùʤÀû³¡Êý½±Àø  | 
|     prizeEx = msgList[0]  | 
|     result = PyDataManager.GetXMZZManager().GetWinCntPrize(curPlayer, prizeEx)  | 
|     if not result:  | 
|         return  | 
|     return [prizeEx]  | 
|   | 
|   | 
| # ÏÉħ֮Õù¹ÜÀí  | 
| class XMZZManager(object):  | 
|          | 
|     def __init__(self):  | 
|         self.XMZZPlayerDict = {}     # {playerid:data, ...} PyGameDataStruct.tagDBPyXMZZ  | 
|         self.XMZZFactionDict = {Faction_1:[0, 0], Faction_2:[0, 0]}    # {faction:[»ý·Ö, ÈËÊý]}  | 
|         self.XMZZTopScore = 0 #»ý·ÖÍõ»ý·Ö  | 
|         self.XMZZTopPlayerName = '' #»ý·ÖÍõÃû  | 
|         self.vsPlayerIDDict = {} #µ±Ç°¶ÔÊÖID  | 
|         return  | 
|   | 
|     def ResetConWinRecord(self, curPlayer):  | 
|         ##ÖØÖÃÁ¬Ê¤  | 
|         playerID = curPlayer.GetID()  | 
|         if playerID not in self.XMZZPlayerDict:  | 
|             return  | 
|         self.XMZZPlayerDict[playerID].ConWinCnt = 0  | 
|         return  | 
|       | 
|     def GetXMZZPKCnt(self, curPlayer):  | 
|         ##»ñÈ¡ÒÑPK³¡´Î  | 
|         playerID = curPlayer.GetID()  | 
|         if playerID not in self.XMZZPlayerDict:  | 
|             return 0  | 
|         return self.XMZZPlayerDict[playerID].WinCnt + self.XMZZPlayerDict[playerID].LoseCnt  | 
|       | 
|     def GetPlayerXMZZFaction(self, playerID):  | 
|         ##»ñÈ¡Íæ¼ÒËùÊôÕóÓª  | 
|         if playerID not in self.XMZZPlayerDict:  | 
|             return Faction_0  | 
|         return self.XMZZPlayerDict[playerID].Faction  | 
|       | 
|       | 
|     def SyncXMZZFightInfo(self, curPlayer):  | 
|         playerID = curPlayer.GetPlayerID()  | 
|         if playerID not in self.vsPlayerIDDict:  | 
|             return  | 
|         pkPlayerID = self.vsPlayerIDDict[playerID]  | 
|         curCache = PlayerViewCache.FindViewCache(pkPlayerID)  | 
|         if not curCache:  | 
|             return  | 
|           | 
|         packData = ChPyNetSendPack.tagGCXMZZFightInfo()  | 
|         packData.Clear()  | 
|         packData.PlayerID = pkPlayerID  | 
|         packData.PropData = curCache.PropData  | 
|         packData.PropDataSize = len(packData.PropData)  | 
|         NetPackCommon.SendFakePack(curPlayer, packData)  | 
|         return  | 
|       | 
|     def MapServer_XMZZPKInfo(self, curPlayer, overInfo, vsPlayerInfo):  | 
|         # Í¨ÖªMapServer PKÐÅÏ¢  | 
|         result = str([overInfo, vsPlayerInfo])  | 
|         curPlayer.MapServer_QueryPlayerResult(0, 0, "XMZZPKInfo", result, len(result))  | 
|         return  | 
|       | 
|     def AddBetRecord(self, curPlayer, betIndex, betResult, needMoney):  | 
|         ##ÐÂÔöѺע¼Ç¼  | 
|         playerID = curPlayer.GetID()  | 
|         if playerID not in self.XMZZPlayerDict:  | 
|             GameWorld.DebugLog('    ÏÉħ֮Õùδ·ÖÅäÕóÓªµÄ²»ÄÜѺע', playerID)  | 
|             return  | 
|         betInfoDict = eval(self.XMZZPlayerDict[playerID].BetRecord) #{¾º²ÂË÷Òý:[ѺעÄÄ·½Ê¤,ѺÁ˶àÉÙÇ®]}  | 
|   | 
|         if betIndex in betInfoDict:  | 
|             GameWorld.DebugLog('    ÏÉħ֮ÕùÒÑѺע¹ý¸ÃÂÖ´ÎbetIndex=%s' % betIndex, playerID)  | 
|             #ÒÑѺע¹ý¸ÃÂÖ´Î  | 
|             return  | 
|         GameWorld.DebugLog('    ÏÉħ֮ÕùѺע³É¹¦betIndex=%s,betResult=%s' % (betIndex, betResult), playerID)  | 
|         betInfoDict[betIndex] = [betResult, needMoney]  | 
|         self.XMZZPlayerDict[playerID].BetRecord = str(betInfoDict)  | 
|         self.XMZZPlayerDict[playerID].Len = len(str(betInfoDict))  | 
|         self.NotifyXMZZSelfInfo(curPlayer)  | 
|         return 1  | 
|       | 
|     def GetStageResultRecord(self):  | 
|         #»ñÈ¡½×¶Î±È·ÖÇé¿ö  | 
|         universalRecMgr = GameWorld.GetUniversalRecMgr()  | 
|         recordList = universalRecMgr.GetTypeList(RecType)  | 
|         if recordList.Count() <= 0:  | 
|             resutlDict = {}  | 
|         else:  | 
|             recData = recordList.At(0)  | 
|             resutlDict = eval(recData.GetStrValue3())  | 
|         return resutlDict  | 
|       | 
|     def BetOverLogic(self):  | 
|         #Ѻע½áËã  | 
|         resutlDict = self.GetStageResultRecord()  | 
|           | 
|         betTimeDict = IpyGameDataPY.GetFuncEvalCfg('XMZZBetCfg')  | 
|           | 
|         for playerID, XMZZData in self.XMZZPlayerDict.items():  | 
|             betInfoDict = eval(XMZZData.BetRecord)  | 
|             if not betInfoDict:  | 
|                 continue  | 
|             paramList = [] #Óʼþ²ÎÊý  | 
|             totalGiveMoney = 0 #ÍÇ®  | 
|             for betID in [0]: #ÔÝдËÀ˳Ðò  | 
|                 if str(betID) not in betTimeDict:  | 
|                     GameWorld.ErrLog('XMZZBetCfg Ñº×¢Ë÷ÒýÅäÖÃÒì³££¡')  | 
|                     return  | 
|                 if betID not in betInfoDict:  | 
|                     #δͶע  | 
|                     paramList += [0, 0]  | 
|                 else:  | 
|                     betSide, needMoney = betInfoDict[betID]  | 
|                       | 
|                     if str(betID) in resutlDict: #¸ÃÂÖ´ÎÓÐʤ¸º¼Ç¼ÔòÕý³£½áËã,·ñÔòÍË»ØÑº×¢Ç®  | 
|                         curResult = resutlDict[str(betID)]  | 
|                          | 
|                         isRight = int(betSide == curResult) #ÊÇ·ñѺע¶ÔÁË  | 
|                         getMoney = needMoney * 2 if isRight else needMoney / 2  | 
|                         totalGiveMoney += getMoney  | 
|                         paramList += [isRight + 1, getMoney]  | 
|                     else:  | 
|                         totalGiveMoney += needMoney  | 
|                         paramList += [3, needMoney]  | 
|                       | 
|             PlayerCompensation.SendMailByKey('XMZZBet', [playerID], [], paramList, silver=totalGiveMoney)  | 
|             GameWorld.DebugLog('    ÏÉħ֮ÕùѺע½áËã paramList=%s,totalGiveMoney=%s' % (paramList, totalGiveMoney), playerID)  | 
|         return  | 
|       | 
|     def GetXMZZCurResult(self):  | 
|         #»ñÈ¡µ±Ç°±È·ÖÇé¿ö  | 
|         faction_1_Score = self.XMZZFactionDict.get(Faction_1, [0, 0])[0]  | 
|         faction_2_Score = self.XMZZFactionDict.get(Faction_2, [0, 0])[0]  | 
|         if faction_1_Score > faction_2_Score:  | 
|             result = Def_Faction1Win  | 
|         elif faction_1_Score == faction_2_Score:  | 
|             result = Def_Dogfall  | 
|         else:  | 
|             result = Def_Faction2Win  | 
|         return result  | 
|       | 
|     def DoAllocationFaction(self, curPlayer):  | 
|         #·ÖÅäÕóÓª  | 
|         fbFuncStateKey = ShareDefine.Def_Notify_WorldKey_FBFuncState % ChConfig.Def_FBMapID_XMZZ  | 
|         if GameWorld.GetGameWorld().GetDictByKey(fbFuncStateKey) == 0:  | 
|             GameWorld.DebugLog('ÏÉħ֮Õù±¨Ãû »î¶¯Î´¿ªÆô£¡')  | 
|             return  | 
|           | 
|         curPlayerID = curPlayer.GetID()  | 
|         if curPlayerID in self.XMZZPlayerDict:  | 
|             GameWorld.DebugLog('·ÖÅäÏÉħ֮ÕùÕóÓª ÒÑ·ÖÅä¹ý£¡', curPlayerID)  | 
|             #ÒÑ·ÖÅä¹ý  | 
|             return True  | 
|         Faction_1_Cnt = self.XMZZFactionDict.get(Faction_1, [0, 0])[1]  | 
|         Faction_2_Cnt = self.XMZZFactionDict.get(Faction_2, [0, 0])[1]  | 
|         if Faction_1_Cnt < Faction_2_Cnt:  | 
|             result = Faction_1  | 
|         else:  | 
|             result = Faction_2  | 
|         self.XMZZFactionDict[result][1] += 1  | 
|           | 
|         GameWorld.DebugLog('·ÖÅäÏÉħ֮ÕùÕóÓª result=%s' % result, curPlayerID)  | 
|           | 
|         record = PyGameDataStruct.tagDBPyXMZZ()  | 
|         record.clear()  | 
|         record.PlayerID = curPlayerID  | 
|         record.Name = curPlayer.GetName()   | 
|         record.Faction = result  | 
|         record.BetRecord = '{}'  | 
|         record.Len = len(record.BetRecord)  | 
|         self.XMZZPlayerDict[curPlayerID] = record  | 
|           | 
|           | 
|         #֪ͨ¿Í»§¶Ë  | 
|         self.NotifyXMZZSelfInfo(curPlayer)  | 
|         self.NotifyXMZZInfo(curPlayer)  | 
|         return True  | 
|       | 
|     def GetWinCntPrize(self, curPlayer, getWinCnt):  | 
|         #ÁìȡʤÀû³¡´Î½±Àø  | 
|         playerID = curPlayer.GetID()  | 
|         if playerID not in self.XMZZPlayerDict:  | 
|             GameWorld.DebugLog('ÏÉħ֮ÕùÁìȡʤÀû³¡´Î½±Àø  Î´±¨Ãû²Î¼Ó£¡', playerID)  | 
|             return  | 
|         if getWinCnt > self.XMZZPlayerDict[playerID].WinCnt:  | 
|             GameWorld.DebugLog('ÏÉħ֮ÕùÁìȡʤÀû³¡´Î½±Àø  Ê¤³¡Êý²»×ã getWinCnt=%s£¡' % getWinCnt, playerID)  | 
|             return  | 
|         winCntAwardDict = IpyGameDataPY.GetFuncEvalCfg('XMZZAward', 1, {})  | 
|         if str(getWinCnt) not in winCntAwardDict:  | 
|             GameWorld.DebugLog('ÏÉħ֮ÕùÁìȡʤÀû³¡´Î½±Àø  Î´ÅäÖøó¡´Î½±Àø getWinCnt=%s£¡' % getWinCnt, playerID)  | 
|             return  | 
|         keyList = [int(cnt) for cnt in winCntAwardDict.keys()]  | 
|         keyList.sort()  | 
|         index = keyList.index(getWinCnt)  | 
|         #ÊÇ·ñÒÑÁìÈ¡  | 
|         awardRecord = self.XMZZPlayerDict[playerID].WinAwardRecord  | 
|           | 
|         if awardRecord & pow(2, index):  | 
|             GameWorld.DebugLog('ÏÉħ֮ÕùÁìȡʤÀû³¡´Î½±Àø  ÒÑÁìÈ¡¸Ã½±Àø getWinCnt=%s£¡' % getWinCnt, playerID)  | 
|             #ÒÑÁìÈ¡¸Ã½±Àø  | 
|             return  | 
|         self.XMZZPlayerDict[playerID].WinAwardRecord = awardRecord | pow(2, index)  | 
|         self.NotifyXMZZSelfInfo(curPlayer)  | 
|         return 1  | 
|       | 
|     def GiveXMZZAward(self):  | 
|         ##»î¶¯½áÊø¸ø½±Àø  | 
|         if not self.XMZZPlayerDict:  | 
|             return  | 
|         hasSendAward = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_XMZZIsOver) #ÊÇ·ñ½áËã¹ý  | 
|         if hasSendAward:  | 
|             GameWorld.DebugLog('    GiveXMZZAward ÒѾ½áËã¹ý£¡')  | 
|             return  | 
|           | 
|         winCntAwardDict = IpyGameDataPY.GetFuncEvalCfg('XMZZAward', 1, {})  | 
|         winCntList = [int(cnt) for cnt in winCntAwardDict.keys()]  | 
|         winCntList.sort()  | 
|         topScorePlayerID = 0  | 
|         topScore = 0  | 
|         Faction_1_IDList = [] #ÏÉ×åÕóÓªÍæ¼Ò  | 
|         Faction_2_IDList = [] #ħ×åÕóÓªÍæ¼Ò  | 
|         for playerID, XMZZData in self.XMZZPlayerDict.items():  | 
|             curWinCnt = XMZZData.WinCnt  | 
|             winCntAwardRecord = XMZZData.WinAwardRecord  | 
|             score = XMZZData.Score  | 
|             faction = XMZZData.Faction  | 
|             #ʤÀû³¡´Î½±ÀøÓʼþ²¹·¢  | 
|             if curWinCnt >= winCntList[0]:  | 
|                 winCntAwardList = []  | 
|                 for i, winCnt in enumerate(winCntList):  | 
|                     if curWinCnt < winCnt:  | 
|                         break  | 
|                     if winCntAwardRecord & pow(2, i):  | 
|                         continue  | 
|                     winCntAwardRecord |= pow(2, i)  | 
|                     winCntAwardList += winCntAwardDict[str(winCnt)]  | 
|                 if winCntAwardList:  | 
|                     XMZZData.WinAwardRecord = winCntAwardRecord #¸üмǼ  | 
|                     PlayerCompensation.SendMailByKey('XMZZWinCnt', [playerID], winCntAwardList, [curWinCnt])  | 
|             if score > topScore:  | 
|                 topScorePlayerID = playerID  | 
|                 topScore = score  | 
|             if faction == Faction_1:  | 
|                 Faction_1_IDList.append(playerID)  | 
|             else:  | 
|                 Faction_2_IDList.append(playerID)  | 
|               | 
|           | 
|           | 
|         #µÚÒ»»ý·Ö½±Àø  | 
|         if topScorePlayerID:  | 
|             topScoreAward = IpyGameDataPY.GetFuncEvalCfg('XMZZAward', 2)  | 
|             if topScoreAward:  | 
|                 PlayerCompensation.SendMailByKey('XMZZTopScore', [topScorePlayerID], topScoreAward, [topScore])  | 
|                 SavePKRecord('XMZZ_FirstPlace', [self.XMZZTopPlayerName, self.XMZZTopScore], False)  | 
|           | 
|         #Ѻע½±Àø  | 
|         self.BetOverLogic()  | 
|           | 
|         #ÕóÓª½±Àø  | 
|         winAward = IpyGameDataPY.GetFuncEvalCfg('XMZZAward', 3)  | 
|         LoseAward = IpyGameDataPY.GetFuncEvalCfg('XMZZAward', 4)  | 
|         dogfallAward = IpyGameDataPY.GetFuncCfg('XMZZAward', 5)  | 
|         result = self.GetXMZZCurResult()  | 
|         if result == Faction_1:  | 
|             SavePKRecord('XMZZ_Victory', [result], True)            | 
|             PlayerCompensation.SendMailByKey('XMZZWin', Faction_1_IDList, winAward)  | 
|             PlayerCompensation.SendMailByKey('XMZZLose', Faction_2_IDList, LoseAward)  | 
|         elif result == Faction_2:  | 
|             SavePKRecord('XMZZ_Victory', [result], True)  | 
|             PlayerCompensation.SendMailByKey('XMZZWin', Faction_2_IDList, winAward)  | 
|             PlayerCompensation.SendMailByKey('XMZZLose', Faction_1_IDList, LoseAward)  | 
|         else: #ƽ¾Ö Ë«·½ÕóÓª»ý·Ö´ïµ½1000»ý·ÖʱÉúЧ  | 
|             XMZZDogFallLimit = IpyGameDataPY.GetFuncCfg('XMZZDogFallLimit')  | 
|             faction_1_Score = self.XMZZFactionDict.get(Faction_1, [0, 0])[0]  | 
|             faction_2_Score = self.XMZZFactionDict.get(Faction_2, [0, 0])[0]  | 
|             if faction_1_Score + faction_2_Score >= XMZZDogFallLimit:  | 
|                 SavePKRecord('XMZZ_Draw', [], True)  | 
|                 if dogfallAward:  | 
|                     PlayerCompensation.SendMailByKey('XMZZDogfall', Faction_2_IDList + Faction_1_IDList, [], goldPaper=dogfallAward)  | 
|           | 
|         PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_XMZZIsOver, 1)  | 
|         self.NotifyXMZZInfo()  | 
|         return  | 
|       | 
|     def ResetXMZZ(self):  | 
|         #ÖØÖÃ  | 
|         PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_XMZZIsOver, 0)  | 
|         self.XMZZPlayerDict = {}  | 
|         self.XMZZFactionDict = {Faction_1:[0, 0], Faction_2:[0, 0]}  | 
|         self.XMZZTopPlayerName = ''  | 
|         self.XMZZTopScore = 0  | 
|         self.vsPlayerIDDict = {}  | 
|         GameWorld.GetUniversalRecMgr().Delete(RecType)  | 
|         GameWorld.GetUniversalRecMgr().Delete(RecType1)  | 
|         PlayerUniversalGameRec.SendUniversalGameRecInfo(None, RecType1)  | 
|         playerManager = GameWorld.GetPlayerManager()  | 
|         for i in range(0, playerManager.GetPlayerCount()):  | 
|             curPlayer = playerManager.GetPlayerByIndex(i)  | 
|             if curPlayer == None or not curPlayer.GetInitOK():  | 
|                 continue  | 
|             self.NotifyXMZZSelfInfo(curPlayer, True)  | 
|         self.NotifyXMZZInfo()  | 
|         return  | 
|       | 
|     def NotifyXMZZSelfInfo(self, curPlayer, isReset=False):  | 
|         ##×Ô¼ºÏà¹ØÊý¾Ý  | 
|         playerID = curPlayer.GetID()  | 
|         if not isReset and playerID not in self.XMZZPlayerDict:  | 
|             return  | 
|         xmzzData = self.XMZZPlayerDict.get(playerID)  | 
|         packData = ChPyNetSendPack.tagGCXMZZSelfInfo()  | 
|         packData.Clear()  | 
|         if xmzzData:  | 
|             packData.Faction = xmzzData.Faction  | 
|             packData.Score = xmzzData.Score  | 
|             packData.WinCnt = xmzzData.WinCnt  | 
|             packData.WinCntAwardRecord = xmzzData.WinAwardRecord  | 
|             betInfoDict = eval(xmzzData.BetRecord) #{¾º²ÂË÷Òý:[ѺעÄÄ·½Ê¤,ѺÁ˶àÉÙÇ®]}  | 
|             packData.BetRecord = json.dumps(betInfoDict, ensure_ascii=False)  | 
|             packData.Len = len(packData.BetRecord)  | 
|         NetPackCommon.SendFakePack(curPlayer, packData)  | 
|         return  | 
|       | 
|     def NotifyXMZZInfo(self, curPlayer=None):  | 
|         #»î¶¯Ïà¹ØÊý¾Ý  | 
|         packData = ChPyNetSendPack.tagGCXMZZInfo()  | 
|         packData.Clear()  | 
|         #resutlDict = self.GetStageResultRecord()  | 
|         #packData.StageRecord = json.dumps(resutlDict, ensure_ascii=False)  | 
|         #packData.Len = len(packData.StageRecord)  | 
|         packData.Score1 = self.XMZZFactionDict[Faction_1][0]  | 
|         packData.Score2 = self.XMZZFactionDict[Faction_2][0]  | 
|         packData.TopScore = self.XMZZTopScore  | 
|         packData.TopName = self.XMZZTopPlayerName  | 
|           | 
|         if curPlayer:  | 
|             NetPackCommon.SendFakePack(curPlayer, packData)  | 
|         else:  | 
|             playerManager = GameWorld.GetPlayerManager()  | 
|             for playerID in self.XMZZPlayerDict.keys():  | 
|                 notifyPlayer = playerManager.FindPlayerByID(playerID)  | 
|                 if notifyPlayer == None:  | 
|                     continue  | 
|                 if PlayerControl.GetIsTJG(notifyPlayer):  | 
|                     continue  | 
|   | 
|                 NetPackCommon.SendFakePack(notifyPlayer, packData)  | 
|         return  | 
|       | 
|     # ±£´æÊý¾Ý ´æÊý¾Ý¿âºÍrealtimebackup  | 
|     def GetSaveData(self):  | 
|         savaData = ""  | 
|         cntData = ""  | 
|         cnt = 0  | 
|         for XMZZData in self.XMZZPlayerDict.values():  | 
|             cnt += 1  | 
|             savaData += XMZZData.getBuffer()  | 
|                   | 
|         GameWorld.Log("SaveXMZZ cnt :%s len=%s" % (cnt, len(savaData)))  | 
|         return CommFunc.WriteDWORD(cntData, cnt) + savaData  | 
|       | 
|     # ´ÓÊý¾Ý¿âÔØÈëÊý¾Ý  | 
|     def LoadPyGameData(self, datas, pos, dataslen):  | 
|         cnt, pos = CommFunc.ReadDWORD(datas, pos)  | 
|         GameWorld.Log("LoadXMZZ cnt :%s" % cnt)  | 
|           | 
|         self.XMZZPlayerDict = {}  | 
|         self.XMZZFactionDict = {Faction_1:[0, 0], Faction_2:[0, 0]}  | 
|         self.XMZZTopScore = 0  | 
|         self.XMZZTopPlayerName = ''  | 
|         for _ in xrange(cnt):  | 
|             data = PyGameDataStruct.tagDBPyXMZZ()  | 
|             data.clear()  | 
|             pos += data.readData(datas, pos, dataslen)  | 
|             playerID = data.PlayerID  | 
|             self.XMZZPlayerDict[playerID] = data  | 
|             faction = data.Faction  | 
|             score = data.Score  | 
|             self.XMZZFactionDict[faction][0] += score  | 
|             self.XMZZFactionDict[faction][1] += 1  | 
|             if score > self.XMZZTopScore:  | 
|                 self.XMZZTopScore = score  | 
|                 self.XMZZTopPlayerName = data.Name  | 
|         return pos  | 
|   | 
|   | 
| def RandomBattler(curPlayer, overInfo=[]):  | 
|     #ɸѡ¶ÔÊÖ ¸ù¾ÝÁ¬Ê¤´ÎÊýÒ»¶¨¼¸ÂÊËæ»úµ½¸ß¼¶»úÆ÷ÈË£¬·ñÔòÿ5¸öµÄµÚ1¸öµÍÓÚ×Ô¼ºÕ½Á¦ ÏÈ´ÓС·¶Î§Ëæ»ú£¬ÔÙ´ó·¶Î§Ëæ»ú£¬Ã»ÓÐÔòÓÃNPC  | 
|     global g_historyPKDict  | 
|     myPlayerID = curPlayer.GetID()  | 
|     GameWorld.DebugLog('    ÏÉħ֮Õù¿ªÊ¼É¸Ñ¡¶ÔÊÖ', myPlayerID)  | 
|     XMZZManager = PyDataManager.GetXMZZManager()  | 
|     XMZZPlayerDict = XMZZManager.XMZZPlayerDict  | 
|       | 
|     if myPlayerID not in XMZZPlayerDict:  | 
|         GameWorld.DebugLog("    ÏÉħ֮Õùϵͳ×Ô¶¯±¨Ãû!", myPlayerID)  | 
|         if not XMZZManager.DoAllocationFaction(curPlayer):  | 
|             GameWorld.DebugLog('    ÏÉħ֮Õùɸѡ¶ÔÊÖ, ÏµÍ³×Ô¶¯±¨Ãûʧ°Ü£¡£¡', myPlayerID)  | 
|             return  | 
|           | 
|     pkPlayerID = 0 # Ä¬Èϵͼ¶»úÆ÷ÈË  | 
|     isRobotNPC = True  | 
|     conWinCnt = XMZZPlayerDict[myPlayerID].ConWinCnt #²ÎÊý  | 
|     XMZZSpecialNPCRate = eval(IpyGameDataPY.GetFuncCompileCfg('XMZZSpecialNPCRate'))  | 
|     XMZZSuperNPCRate = eval(IpyGameDataPY.GetFuncCompileCfg('XMZZSpecialNPCRate', 2))  | 
|     XMZZNPCByLVPowerList = IpyGameDataPY.GetFuncEvalCfg('XMZZPKPowerRange', 2)  | 
|     isByLVPower = conWinCnt + 1 in XMZZNPCByLVPowerList #ÊÇ·ñ°´µÈ¼¶±íÕ½Á¦À´Ëæ»ú·¶Î§  | 
|     if GameWorld.CanHappen(XMZZSuperNPCRate):  | 
|         GameWorld.DebugLog('    É¸Ñ¡¶ÔÊÖ  ³¬¼¶»úÆ÷ÈË XMZZSuperNPCRate=%s' % (XMZZSuperNPCRate))  | 
|         pkPlayerID = 2  | 
|       | 
|     elif not isByLVPower and GameWorld.CanHappen(XMZZSpecialNPCRate):  | 
|         GameWorld.DebugLog('    É¸Ñ¡¶ÔÊÖ  ¸ß¼¶»úÆ÷ÈË XMZZSpecialNPCRate=%s' % (XMZZSpecialNPCRate))  | 
|         #»úÆ÷ÈËID¹æÔò: ID´Ó0~n, n²»´óÓÚ»úÆ÷ÈËIDÁÐ±í³¤¶È, IDÔ½´ó»úÆ÷ÈËÔ½¸ß¼¶£¬¸ù¾Ý²ß»®ÐèÇó×ÔÔö  | 
|         #¸ß¼¶»úÆ÷ÈË  | 
|         pkPlayerID = 1  | 
|     else:  | 
|         historyPKList = g_historyPKDict.get(myPlayerID, [])  | 
|         myFaction = XMZZManager.GetPlayerXMZZFaction(myPlayerID)  | 
|         if isByLVPower:  | 
|             worldLv = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)  | 
|             ipyData = IpyGameDataPY.GetIpyGameData('PlayerLV', worldLv)  | 
|             myPower = ipyData.GetReFightPower() if ipyData else PlayerControl.GetFightPower(curPlayer)   | 
|         else:  | 
|             myPower = PlayerControl.GetFightPower(curPlayer)  | 
|         XMZZPKPowerRange = IpyGameDataPY.GetFuncEvalCfg('XMZZPKPowerRange')  | 
|         minPower1, maxPower1 = myPower * (100 - XMZZPKPowerRange[0][0]) / 100, myPower * (100 + XMZZPKPowerRange[0][1]) / 100  | 
|         minPower2, maxPower2 = myPower * (100 - XMZZPKPowerRange[1][0]) / 100, myPower * (100 + XMZZPKPowerRange[1][1]) / 100  | 
|         underList1, aboveList1 = [], [] #С·¶Î§  | 
|         underList2, aboveList2 = [], [] #´ó·¶Î§  | 
|           | 
|         pyViewCacheMgr = PyDataManager.GetPlayerViewCachePyManager()  | 
|         playerViewCachePyDict = pyViewCacheMgr.playerViewCachePyDict  | 
|         for playerID, curCache in playerViewCachePyDict.items():  | 
|             if myPlayerID == playerID:  | 
|                 #²»ºÍ×Ô¼ºpk  | 
|                 continue  | 
|             if XMZZManager.GetPlayerXMZZFaction(playerID) == myFaction:  | 
|                 #ͬÕóÓªµÄ²»PK  | 
|                 continue  | 
|             if playerID in historyPKList:  | 
|                 #ÒÑÆ¥Åä¹ýµÄÌø¹ý  | 
|                 continue  | 
|               | 
|             propDataDict = PlayerViewCache.GetCachePropDataDict(curCache)  | 
|             power = propDataDict.get('FightPower', 0)  | 
|               | 
|             #GameWorld.DebugLog('    É¸Ñ¡¶ÔÊÖ playerID=%s,power=%s' % (playerID, power))  | 
|             if minPower1 < power < myPower:  | 
|                 underList1.append(playerID)  | 
|             if myPower < power < maxPower1:  | 
|                 aboveList1.append(playerID)  | 
|             if minPower2 < power < myPower:  | 
|                 underList2.append(playerID)  | 
|             if myPower < power < maxPower2:  | 
|                 aboveList2.append(playerID)  | 
|         GameWorld.DebugLog('    É¸Ñ¡¶ÔÊÖ myPower=%s,underList1=%s, aboveList1=%s,underList2=%s, aboveList2=%s' % (myPower, underList1, aboveList1, underList2, aboveList2), myPlayerID)  | 
|   | 
|         if conWinCnt % 5 == 0 or conWinCnt <= IpyGameDataPY.GetFuncCfg('XMZZPKPowerRange', 3): #ÿ5¸öÆ¥ÅäÕ½Á¦µÍµÄ¶ÔÊÖ  | 
|             if underList1:  | 
|                 pkPlayerID = underList1[0]  | 
|             elif underList2:  | 
|                 pkPlayerID = underList2[0]  | 
|               | 
|         else:  | 
|             if underList1 + aboveList1:  | 
|                 pkPlayerID = random.choice(underList1 + aboveList1)  | 
|             elif underList2 + aboveList2:  | 
|                 pkPlayerID = random.choice(underList2 + aboveList2)  | 
|             elif historyPKList:  | 
|                 pkPlayerID = random.choice(historyPKList)  | 
|                 #ÖØÖÃÀúÊ·PK¶ÔÊÖ  | 
|                 g_historyPKDict[myPlayerID] = []  | 
|                   | 
|         if pkPlayerID:  | 
|             isRobotNPC = False  | 
|               | 
|     if isRobotNPC:  | 
|         #»úÆ÷ÈË, Ö°ÒµËæ»ú  | 
|         openJob = IpyGameDataPY.GetFuncEvalCfg("OpenJob")  | 
|         pkPlayerPropData = {"Job":random.choice(openJob), "LV":curPlayer.GetLV()}  | 
|     else:  | 
|         if myPlayerID in g_historyPKDict:  | 
|             g_historyPKDict[myPlayerID].append(pkPlayerID)  | 
|         else:  | 
|             g_historyPKDict[myPlayerID] = [pkPlayerID]  | 
|               | 
|         pkPlayerCache = PlayerViewCache.FindViewCache(pkPlayerID)  | 
|         pkPlayerPropData = {} if not pkPlayerCache else PlayerViewCache.GetCachePropDataDict(pkPlayerCache)  | 
|     XMZZManager.vsPlayerIDDict[myPlayerID] = pkPlayerID  | 
|   | 
|     GameWorld.DebugLog('   ÏÉħ֮ÕùÆ¥Åä¶ÔÊÖÐÅÏ¢ pkPlayerID=%s, pkPlayerPropData=%s, overInfo=%s' % (pkPlayerID, pkPlayerPropData, overInfo), myPlayerID)  | 
|       | 
|     #֪ͨǰ¶Ë  | 
|     packData = ChPyNetSendPack.tagGCXMZZFightInfo()  | 
|     packData.Clear()  | 
|     packData.PlayerID = pkPlayerID  | 
|     packData.PropData = json.dumps(pkPlayerPropData, ensure_ascii=False)  | 
|     packData.PropDataSize = len(packData.PropData)  | 
|     NetPackCommon.SendFakePack(curPlayer, packData)  | 
|       | 
|     #֪ͨµØÍ¼  | 
|     if not pkPlayerPropData:  | 
|         GameWorld.ErrLog("ÏÉħ֮ÕùûÓÐÆ¥Åäµ½¶ÔÊÖÐÅÏ¢£¡fightPower=%s" % PlayerControl.GetFightPower(curPlayer), myPlayerID)  | 
|     vsPlayerInfo = [pkPlayerID, pkPlayerPropData]  | 
|     XMZZManager.MapServer_XMZZPKInfo(curPlayer, overInfo, vsPlayerInfo)  | 
|     return True  | 
|   | 
|   | 
| def SavePKRecord(sysMark,paramList=[], isSys=False):  | 
|     #PKÐÅÏ¢¼Ç¼  | 
|     if isSys:  | 
|         PlayerControl.WorldNotify(0, sysMark, paramList)  | 
|     maxCnt = IpyGameDataPY.GetFuncCfg('XMZZPKRecord', 2)  | 
|     universalRecMgr = GameWorld.GetUniversalRecMgr()  | 
|     recordList = universalRecMgr.GetTypeList(RecType1)  | 
|     if recordList.Count() >= maxCnt:  | 
|         recordList.Delete(0)  | 
|       | 
|       | 
|     paramList = [str(param) for param in paramList]  | 
|     strValue3 = '|'.join(paramList)  | 
|            | 
|     recData = recordList.AddRec()  | 
|     recData.SetStrValue1(sysMark)  | 
|     recData.SetStrValue3(strValue3)  | 
|     #֪ͨ  | 
|     #PlayerUniversalGameRec.SendUniversalGameRecInfo(None, RecType1)  | 
|     return  | 
|   | 
| def XMZZPKOver(curPlayer, vsName, isWin=True, isEnd=False, HPPer=100):  | 
|     #PK½áÊø£¬¸üнá¹û»ý·Ö  | 
|     playerID = curPlayer.GetID()  | 
|     XMZZManager = PyDataManager.GetXMZZManager()  | 
|     if playerID not in XMZZManager.XMZZPlayerDict:  | 
|         return False  | 
|       | 
|     hasSendAward = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_XMZZIsOver) #ÊÇ·ñ½áËã¹ý  | 
|     if hasSendAward:  | 
|         GameWorld.DebugLog('    XMZZPKOver ÒѾ½áËã¹ý£¡')  | 
|         result = [isWin, True, 0, 0, XMZZManager.XMZZPlayerDict[playerID].ConWinCnt]  | 
|         XMZZManager.MapServer_XMZZPKInfo(curPlayer, result, [])  | 
|         return False  | 
|       | 
|     if playerID not in XMZZManager.vsPlayerIDDict:  | 
|         GameWorld.DebugLog('    XMZZPKOver Ã»ÓжÔÊÖ self.vsPlayerIDDict=%s'%XMZZManager.vsPlayerIDDict, playerID)  | 
|         return False  | 
|     XMZZManager.vsPlayerIDDict.pop(playerID)  | 
|       | 
|     oldConWinCnt = XMZZManager.XMZZPlayerDict[playerID].ConWinCnt  | 
|     needRecordConCntList = IpyGameDataPY.GetFuncEvalCfg('XMZZPKRecord')  | 
|     if isWin:  | 
|         XMZZManager.XMZZPlayerDict[playerID].WinCnt += 1  | 
|         XMZZManager.XMZZPlayerDict[playerID].ConWinCnt += 1  | 
|     else:  | 
|         XMZZManager.XMZZPlayerDict[playerID].LoseCnt += 1  | 
|         #self.XMZZPlayerDict[playerID].ConWinCnt = 0 ÊäÁËÖ±½Ó½áËãÍ˳ö£¬ËùÒÔ´Ë´¦²»ÖØÖà  | 
|           | 
|       | 
|     conWinCnt = XMZZManager.XMZZPlayerDict[playerID].ConWinCnt  | 
|     addPerList = IpyGameDataPY.GetFuncEvalCfg('XMZZPKAward')  | 
|     addPerIndex = min(max(0, conWinCnt - 1), len(addPerList)-1)  | 
|     addPer = addPerList[addPerIndex] #Á¬Ê¤Ôö¼ÓµÄ°Ù·Ö±È  | 
|     if isWin:  | 
|         winAddScoreFormula = IpyGameDataPY.GetFuncCompileCfg('XMZZPKAward', 2)  | 
|         addScore = eval(winAddScoreFormula)  | 
|         #Á¬Ê¤¼Ç¼  | 
|         if conWinCnt in needRecordConCntList:  | 
|             SavePKRecord('XMZZ_Streak', [curPlayer.GetName(), vsName, conWinCnt, addScore])  | 
|         #Á¬Ê¤³É¾Í  | 
|         PlayerControl.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_XMZZConWin, 1, [conWinCnt])  | 
|     else:  | 
|         failAddScoreFormula = IpyGameDataPY.GetFuncCompileCfg('XMZZPKAward', 3)  | 
|         addScore = eval(failAddScoreFormula)  | 
|         if oldConWinCnt in needRecordConCntList:  | 
|             SavePKRecord('XMZZ_ShutDown', [vsName, curPlayer.GetName(), oldConWinCnt])  | 
|   | 
|     #·¢ÖÁµØÍ¼½áËã  | 
|     result = [isWin, isEnd, addScore, addPer, conWinCnt]  | 
|       | 
|     XMZZManager.XMZZPlayerDict[playerID].Score += addScore  | 
|     if XMZZManager.XMZZPlayerDict[playerID].Score > XMZZManager.XMZZTopScore:  | 
|         #»ý·ÖÍõ±ä¸ü  | 
|         XMZZManager.XMZZTopScore = XMZZManager.XMZZPlayerDict[playerID].Score  | 
|         XMZZManager.XMZZTopPlayerName = XMZZManager.XMZZPlayerDict[playerID].Name  | 
|           | 
|     faction = XMZZManager.XMZZPlayerDict[playerID].Faction  | 
|     XMZZManager.XMZZFactionDict[faction][0] += addScore  | 
|           | 
|     #֪ͨ  | 
|     XMZZManager.NotifyXMZZInfo()  | 
|     XMZZManager.NotifyXMZZSelfInfo(curPlayer)  | 
|       | 
|     if not isEnd:  | 
|         #Æ¥ÅäÏÂÒ»¸ö¶ÔÊÖ  | 
|         RandomBattler(curPlayer, result)  | 
|     else:  | 
|         XMZZManager.MapServer_XMZZPKInfo(curPlayer, result, [])  | 
|     GameWorld.DebugLog("¸üÐÂÏÉħ֮Õù»ý·Ö playerID=%s,addScore=%s,addPer=%s,faction=%s,isWin=%s,conWin=%s" %   | 
|                        (playerID, addScore,addPer, faction, isWin, XMZZManager.XMZZPlayerDict[playerID].ConWinCnt))  | 
|     return True  | 
|   | 
| #// AC 03 ÏÉħ֮ÕùÐÅÏ¢²éѯ #tagCGXMZZInfoQuery  | 
| #  | 
| #struct    tagCGXMZZInfoQuery  | 
| #{  | 
| #    tagHead        Head;  | 
| #};  | 
| def OnQueryXMZZInfo(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     PyDataManager.GetXMZZManager().NotifyXMZZInfo(curPlayer)  | 
|     return |