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