#!/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 json import math RecType = ShareDefine.Def_UniversalGameRecType_XMZZStageRecord RecType1 = ShareDefine.Def_UniversalGameRecType_XMZZPKInfoRecord #strValue3 {ͶעË÷Òý:½á¹û,..} g_playerPowerDict = {} #Íæ¼ÒÕ½Á¦»º´æ 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_playerPowerDict global g_historyPKDict PyDataManager.GetXMZZManager().ResetXMZZ() g_playerPowerDict = {} #Íæ¼ÒÕ½Á¦»º´æ 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.tagDBPySealDemonRecord 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.ViewCacheMgr.FindCache(pkPlayerID) if not curCache: return PropData, ItemData = curCache.GetPropData(), curCache.GetItemData() packData = ChPyNetSendPack.tagGCXMZZFightInfo() packData.Clear() packData.PlayerID = pkPlayerID packData.PropData = PropData packData.PropDataSize = len(packData.PropData) packData.ItemData = ItemData packData.ItemDataSize = len(packData.ItemData) 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) 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" % cnt) 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_playerPowerDict 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 pkDataDict = {} 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 curPlayer.GetFightPower() else: myPower = curPlayer.GetFightPower() 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 = [], [] #´ó·¶Î§ ViewCacheMgr = GameWorld.GameWorldData.GetPlayerViewCacheMgr() for i in xrange(ViewCacheMgr.GetCount()): curCache = ViewCacheMgr.At(i) itemData = PlayerViewCache.GetItemData(curCache) if not itemData: #ûÓÐ×°±¸ÐÅÏ¢ continue playerID = curCache.GetPlayerID() if myPlayerID == playerID: #²»ºÍ×Ô¼ºpk continue if XMZZManager.GetPlayerXMZZFaction(playerID) == myFaction: #ͬÕóÓªµÄ²»PK continue if playerID in historyPKList: #ÒÑÆ¥Åä¹ýµÄÌø¹ý continue if playerID in g_playerPowerDict: power = g_playerPowerDict[playerID] else: propDataDict = eval(curCache.GetPropData()) power = propDataDict.get('FightPower', 0) g_playerPowerDict[playerID] = power pkDataDict[playerID] = [curCache.GetPropData(), curCache.GetItemData()] #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") PropData = str({"Job":random.choice(openJob), "LV":curPlayer.GetLV()}) ItemData = "" # ǰ¶Ë×Ô¼º¸ù¾ÝÖ°Òµ¼°NPCµÈ¼¶´¦Àí else: if myPlayerID in g_historyPKDict: g_historyPKDict[myPlayerID].append(pkPlayerID) else: g_historyPKDict[myPlayerID] = [pkPlayerID] PropData, ItemData = pkDataDict.get(pkPlayerID, ["", ""]) XMZZManager.vsPlayerIDDict[myPlayerID] = pkPlayerID GameWorld.DebugLog(' ÏÉħ֮ÕùÆ¥Åä¶ÔÊÖÐÅÏ¢ pkPlayerID=%s, PropData=%s, overInfo=%s' % (pkPlayerID, PropData, overInfo), myPlayerID) #֪ͨǰ¶Ë packData = ChPyNetSendPack.tagGCXMZZFightInfo() packData.Clear() packData.PlayerID = pkPlayerID packData.PropData = PropData packData.PropDataSize = len(packData.PropData) packData.ItemData = ItemData packData.ItemDataSize = len(packData.ItemData) NetPackCommon.SendFakePack(curPlayer, packData) #֪ͨµØÍ¼ pkPlayerPropData = {} if PropData: pkPlayerPropData = eval(PropData) else: GameWorld.ErrLog("ÏÉħ֮ÕùûÓÐÆ¥Åäµ½¶ÔÊÖÐÅÏ¢£¡fightPower=%s" % curPlayer.GetFightPower(), 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