#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # #------------------------------------------------------------------------------- # ##@package Player.PlayerMergePK # # @todo:¿ç·þPKÆ¥Åä # @author hxp # @date 2015-10-22 # @version 1.2 # # @change: "2015-11-05 18:00" hxp Ôö¼Ó»Ö¸´Á¬Ê¤; Ôö¼ÓÿÈÕ»ý·Ö½±Àø£»Ôö¼Ó¹ºÂò´ÎÊýÉÏÏÞ # @change: "2016-12-20 17:30" hxp ÓÀºã°æ¿ç·þÐÞ¸Ä # ÏêϸÃèÊö: ¿ç·þPKÆ¥Åä # #--------------------------------------------------------------------- """Version = 2016-12-20 17:30""" #--------------------------------------------------------------------- import ChConfig import GameWorld import ItemCommon import ShareDefine import IPY_GameWorld import ChPyNetSendPack import NetPackCommon import PlayerControl import ReadChConfig import ChPlayer ## ¿ç·þPK»î¶¯ID±ä¸ü def OnMergePKActionChange(key, value): # ¿ç·þ·þÎñÆ÷²»´¦Àí if GameWorld.IsMergeServer(): return #Def_Notify_WorldKey_MergePKDayID gameWorld = GameWorld.GetGameWorld() mapKeyValue = gameWorld.GetGameWorldDictByKey(key) if mapKeyValue == value: #GameWorld.Log(" ÓëµØÍ¼µ±Ç°ÖµÏàͬ£¬²»´¦Àí£¡") return GameWorld.Log("¿ç·þPK»î¶¯Öµ±ä¸ükey=%s,value=%s,mapKeyValue=%s" % (key, value, mapKeyValue)) for i in range(0, GameWorld.GetPlayerManager().GetPlayerCount()): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(i) if curPlayer == None or not curPlayer.GetPlayerID(): continue #¼ì²éÖØÖÃÍæ¼ÒÐÅÏ¢ __CheckResetPlayerMergePKData(curPlayer, key, value) return ## Çå³ýÍæ¼ÒÐÅÏ¢ # @param curPlayer: Íæ¼Ò # @param key: ÌØ»Ý»î¶¯key£¬Ä¬ÈÏÈ«²¿¼ì²é£¬Ò»°ãµÇ¼ʱȫ²¿¼ì²é # @return: None def __CheckResetPlayerMergePKData(curPlayer, key, value, isSync=True): playerID = curPlayer.GetPlayerID() # Íæ¼ÒÉíÉÏÊý¾ÝµÄ»î¶¯id playerActionIDKey = ChConfig.Def_PDict_MergePK_ID % key playerActionID = __GetMergePKPDictValue(curPlayer, playerActionIDKey) if playerActionID == value: GameWorld.DebugLog("¿ç·þPK»î¶¯IDÏàͬ£¬²»´¦Àíkey=%s,actionID=%s" % (key, value), playerID) return GameWorld.Log("¿ç·þPK»î¶¯ID²»Í¬£¬Êý¾ÝÖØÖÃkey=%s,actionID=%s,playerActionID=%s" % (key, value, playerActionID), playerID) __SetMergePKPDictValue(curPlayer, playerActionIDKey, value) # ÈÕÖØÖà if key == ShareDefine.Def_Notify_WorldKey_MergePKDayID: __SetMergePKPDictValue(curPlayer, ChConfig.Def_PDict_MergePK_Cnt, 0) __SetMergePKPDictValue(curPlayer, ChConfig.Def_PDict_MergePK_BuyCnt, 0) if isSync: Sync_MergePKCnt(curPlayer) # Èü¼¾ÖØÖà elif key == ShareDefine.Def_Notify_WorldKey_MergePKSeasonID: pass return ## OnLogin´¦Àí # @param curPlayer # @return None def MergePKOnLogin(curPlayer): if GameWorld.IsMergeServer(): return gameWorld = GameWorld.GetGameWorld() for idKey in [ShareDefine.Def_Notify_WorldKey_MergePKDayID, ShareDefine.Def_Notify_WorldKey_MergePKSeasonID]: __CheckResetPlayerMergePKData(curPlayer, idKey, gameWorld.GetGameWorldDictByKey(idKey), False) Sync_MergePKCnt(curPlayer) Sync_MergePKAwardRecord(curPlayer) return #// C1 09 ¿ç·þPKÆ¥Åä #tagCMMergePKMatch # #struct tagCMMergePKMatch #{ # tagHead Head; # BYTE Type; // 0-È¡ÏûÆ¥Åä; 1-½øÐÐÆ¥Åä #}; ## ¿ç·þPKÆ¥Åä # @param None # @return None def OnRequestMergePK(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) accID = curPlayer.GetAccID() playerID = curPlayer.GetPlayerID() requestType = clientData.Type mergePKState = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_MergePKState) if mergePKState != ChConfig.Def_Action_Open: GameWorld.Log("OnRequestMergePK ¿ç·þ»î¶¯Î´¿ªÆô£¬²»¿É½øÐÐÆ¥Å䣡", playerID) PlayerControl.NotifyCode(curPlayer, "GeRen_hgg_21675") return if GameWorld.IsMergeServer(): return GameWorld.Log("ÊÕµ½¿ç·þPKÆ¥Åä: type=%s,accID=%s" % (requestType, accID), playerID) # ½øÐÐÆ¥Åä if requestType == 1: pkCnt = __GetMergePKPDictValue(curPlayer, ChConfig.Def_PDict_MergePK_Cnt) buyCnt = __GetMergePKPDictValue(curPlayer, ChConfig.Def_PDict_MergePK_BuyCnt) unUsedBuyCnt = __GetMergePKPDictValue(curPlayer, ChConfig.Def_PDict_MergePK_UnUsedBuyCnt) freeCnt, maxBuyCnt, moneyType, buyCostFormat = ReadChConfig.GetEvalChConfig("MergePK_BuyCost") # ³¬³öÃâ·Ñ´ÎÊý ÇÒ ÎÞ¿ÉÓõÄÒѹºÂò´ÎÊý ÔòÐ蹺Âò´ÎÊý if pkCnt >= freeCnt and unUsedBuyCnt <= 0: if buyCnt >= maxBuyCnt: GameWorld.Log(" ÒÑ´ïµ½×î´ó¿É¹ºÂòPK´ÎÊý£¬²»¿ÉÔÙÂò£¡:buyCnt=%s,maxBuyCnt=%s,pkCnt=%s,unUsedBuyCnt=%s" % (buyCnt, maxBuyCnt, pkCnt, unUsedBuyCnt), playerID) return buyCost = eval(buyCostFormat) infoDict = {"pkCnt":pkCnt, "freeCnt":freeCnt, "buyCnt":buyCnt, "buyCost":buyCost} if not PlayerControl.PayMoney(curPlayer, moneyType, buyCost, ChConfig.Def_Cost_BuyMergePKCnt, infoDict): return # Ôö¼Ó¹ºÂò´ÎÊý ¼° δʹÓõĹºÂò´ÎÊý __SetMergePKPDictValue(curPlayer, ChConfig.Def_PDict_MergePK_BuyCnt, buyCnt + 1) __SetMergePKPDictValue(curPlayer, ChConfig.Def_PDict_MergePK_UnUsedBuyCnt, unUsedBuyCnt + 1) Sync_MergePKCnt(curPlayer) GameWorld.Log(" ¹ºÂòPK´ÎÊýÏûºÄ: pkCnt=%s,freeCnt=%s,buyCnt=%s,moneyType=%s,buyCost=%s" % (pkCnt, freeCnt, buyCnt, moneyType, buyCost), playerID) dataMsg = {"accID":accID, # ¿ç·þ×Ó·þID "playerID":playerID, # Íæ¼ÒID "playerName":curPlayer.GetPlayerName(), # Íæ¼ÒÃû "fightPower":curPlayer.GetFightPower(), # Õ½¶·Á¦ } GameWorld.SendMergerChildToCenterStringData(ChConfig.Def_RequestMergePKMatch, dataMsg) ChPlayer.SendRegisterState(curPlayer, ShareDefine.Def_MergeRegisterState_Request) GameWorld.Log(" ·¢ËÍÇëÇóÆ¥Åäµ½¿ç·þ·þÎñÆ÷ dataMsg=%s" % str(dataMsg), playerID) # È¡ÏûÆ¥Åä else: sendMsg = "Client Cancel!" GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, 'MergePKCancel', sendMsg, len(sendMsg)) GameWorld.Log(" ·¢ËÍÈ¡ÏûÆ¥Åäµ½GameServer sendMsg=%s" % str(sendMsg), playerID) return #// C1 10 ¿ç·þPK»Ö¸´Á¬Ê¤´ÎÊý #tagCMRecoverMergePKWin # #struct tagCMRecoverMergePKWin #{ # tagHead Head; #}; def OnRequestRecoverMergePKWin(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) if GameWorld.IsMergeServer(): return if not GameWorld.CheckPlayerTick(curPlayer, ChConfig.TYPE_Player_Tick_RecoverMergePKWin, tick): GameWorld.DebugLog("TYPE_Player_Tick_RecoverMergePKWin ÇëÇóCDÖУ¡") return dataMsg = {"accID":curPlayer.GetAccID(), "playerID":curPlayer.GetPlayerID(), "type":1, # 1-ÇëÇó¿Û·Ñ£»2-¿Û·Ñ³É¹¦ºóÈ·Èϻָ´ } GameWorld.SendMergerChildToCenterStringData(ChConfig.Def_RecoverMergePKWin, dataMsg) return ## ѯÎÊ¿ç·þ·þÎñÆ÷¾ßÌå·ÑÓúó½øÐÐ¿Û·Ñ def DoRecoverMergePKWinCost(curPlayer, moneyType, costMoney, cWin, maxCWin): infoDict = {"cWin":cWin, "maxCWin":maxCWin} if not PlayerControl.PayMoney(curPlayer, moneyType, costMoney, ChConfig.Def_Cost_RecoverMergePKWin, infoDict): return dataMsg = {"accID":curPlayer.GetAccID(), # ¿ç·þ×Ó·þID "playerID":curPlayer.GetPlayerID(), "type":2, # 1-ÇëÇó¿Û·Ñ£»2-¿Û·Ñ³É¹¦ºóÈ·Èϻָ´ } GameWorld.SendMergerChildToCenterStringData(ChConfig.Def_RecoverMergePKWin, dataMsg, curPlayer.GetPlayerID()) return def __GetMergePKPDictValue(curPlayer, key, defaultVlaue=0): return curPlayer.NomalDictGetProperty(key, defaultVlaue, ChConfig.Def_PDictType_MergePK) def __SetMergePKPDictValue(curPlayer, key, value): value = min(value, ChConfig.Def_UpperLimit_DWord) return PlayerControl.NomalDictSetProperty(curPlayer, key, value, ChConfig.Def_PDictType_MergePK) ## Ôö¼Ó¿ç·þPK´ÎÊý def AddMergePKCnt(curPlayer, isSync=True, addCnt=1): # GameWorld.Log("Ôö¼Ó¿ç·þPKÆ¥Åä´ÎÊý addCnt=%s" % addCnt, curPlayer.GetPlayerID()) # pkCnt = __GetMergePKPDictValue(curPlayer, ChConfig.Def_PDict_MergePK_Cnt) # __SetMergePKPDictValue(curPlayer, ChConfig.Def_PDict_MergePK_Cnt, pkCnt + addCnt) # freeCnt = ReadChConfig.GetEvalChConfig("MergePK_BuyCost")[0] # # # Èç¹ûÒѾ­PK´ÎÊý³¬¹ýÃâ·Ñ´ÎÊý£¬Ôò±¾´ÎÏûºÄÊÓΪÐè¿Û³ýδʹÓõĹºÂò´ÎÊý # if pkCnt >= freeCnt: # unUsedBuyCnt = __GetMergePKPDictValue(curPlayer, ChConfig.Def_PDict_MergePK_UnUsedBuyCnt) # __SetMergePKPDictValue(curPlayer, ChConfig.Def_PDict_MergePK_UnUsedBuyCnt, max(0, unUsedBuyCnt - addCnt)) # GameWorld.Log(" ÒÑ´ïµ½Ãâ·ÑPK´ÎÊý£¬±¾´ÎÐè¿Û³ýÒѹºÂòµÄPK´ÎÊý pkCnt=%s,unUsedBuyCnt=%s" # % (pkCnt, unUsedBuyCnt), curPlayer.GetPlayerID()) # # if isSync: # Sync_MergePKCnt(curPlayer) return def OnQueryMergePKAward(curPlayer, awardType, awardIndex, tick): ''' ÇëÇóÁìÈ¡¿ç·þPKÏà¹Ø½±Àø ''' playerID = curPlayer.GetPlayerID() GameWorld.Log("ÁìÈ¡¿ç·þPK½±Àø awardType=%s, awardIndex=%s" % (awardType, awardIndex), playerID) if awardType not in ShareDefine.Def_MergePKAwardTypeList: GameWorld.ErrLog(" ·Ç·¨¿ç·þPK½±ÀøÀàÐÍ!awardType=%s" % awardType, playerID) return packSpaceNum = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem) if packSpaceNum <= 0: GameWorld.DebugLog(" ±³°üÒÑÎ޿ռ䣡") return if not GameWorld.CheckPlayerTick(curPlayer, ChConfig.TYPE_Player_Tick_MergePKAward, tick): GameWorld.DebugLog(" Áì½±ÇëÇóCDÖУ¡") return # Ê×´ÎʤÀû´ÎÊý½±ÀøÐèÒª¶îÍâÅжϵØÍ¼´æ´¢µÄÁ콱״̬ if awardType == ShareDefine.Def_MergePKAward_FirstWinCnt: firstWinCntReward = __GetMergePKPDictValue(curPlayer, ChConfig.Def_PDict_MergePK_FirstWinCntReward) if firstWinCntReward&pow(2,awardIndex): GameWorld.DebugLog(" ÒÑÁìÈ¡¹ý¸Ã½±Àø£¡firstWinCntReward=%s" % firstWinCntReward) return msgListStr = str([awardType, awardIndex, packSpaceNum]) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, 'MergePKAward', msgListStr, len(msgListStr)) # ¸ø½±ÀøÔÚ GY_Query_MergePKAward Öд¦Àí return ## ͬ²½¿ç·þPK´ÎÊýÏà¹Ø def Sync_MergePKAwardRecord(curPlayer): awardRecordPack = ChPyNetSendPack.tagMCMergePKAwardRecord() awardRecordPack.Clear() awardRecordPack.FirstWinAwardRecord = __GetMergePKPDictValue(curPlayer, ChConfig.Def_PDict_MergePK_FirstWinCntReward) NetPackCommon.SendFakePack(curPlayer, awardRecordPack) return ## ͬ²½¿ç·þPK´ÎÊýÏà¹Ø def Sync_MergePKCnt(curPlayer): # mergePKCntPack = ChPyNetSendPack.tagMCMergePKCnt() # mergePKCntPack.Clear() # mergePKCntPack.DayPKCnt = __GetMergePKPDictValue(curPlayer, ChConfig.Def_PDict_MergePK_Cnt) # mergePKCntPack.DayBuyCnt = __GetMergePKPDictValue(curPlayer, ChConfig.Def_PDict_MergePK_BuyCnt) # mergePKCntPack.UnUsedBuyCnt = __GetMergePKPDictValue(curPlayer, ChConfig.Def_PDict_MergePK_UnUsedBuyCnt) # NetPackCommon.SendFakePack(curPlayer, mergePKCntPack) return