#!/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  
 | 
  
 |