#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
##@package PlayerLove  
 | 
#  
 | 
# @todo:ÇéԵϵͳ  
 | 
# @author hxp  
 | 
# @date 2021-11-09  
 | 
# @version 1.0  
 | 
#  
 | 
# ÏêϸÃèÊö: ÇéԵϵͳ  
 | 
#  
 | 
#-------------------------------------------------------------------------------  
 | 
#"""Version = 2021-11-09 20:00"""  
 | 
#-------------------------------------------------------------------------------  
 | 
  
 | 
import GameWorld  
 | 
import PyDataManager  
 | 
import PlayerControl  
 | 
import ChPyNetSendPack  
 | 
import PlayerCompensation  
 | 
import PlayerFamilyRedPacket  
 | 
import PyGameDataStruct  
 | 
import NetPackCommon  
 | 
import IpyGameDataPY  
 | 
import PlayerSocial  
 | 
import PlayerCharm  
 | 
import ShareDefine  
 | 
import PyGameData  
 | 
import CommFunc  
 | 
  
 | 
import operator  
 | 
import time  
 | 
import math  
 | 
  
 | 
class MarryReq():  
 | 
    ## ½øÐÐÖеÄÇóÇ×£¬²»´æµµ£¬»ØÓ¦·½ÉÏÏßÒ²²»Í¨Öª£¬½öË«·½¶¼ÔÚÏßʱͬ²½´¦Àí£¬·þÎñÆ÷ά»¤²»´æµµ£¬ÖØÐÂÇëÇó  
 | 
      
 | 
    def __init__(self):  
 | 
        self.playerIDA = 0 # ÇëÇó·½  
 | 
        self.playerIDB = 0 # »ØÓ¦·½  
 | 
        self.bridePriceID = 0 # Æ¸ÀñID  
 | 
        self.reqTime = 0 # ÇëÇóʱ¼ä´Á  
 | 
        return  
 | 
      
 | 
class MarryCandy():  
 | 
    ## Ï²ÌÇÑç»á£¬²»´æ¿â£¬·þÎñÆ÷¹Ø·þʱδ½áÊøµÄϲÑçÇ¿ÖÆ½áËã  
 | 
      
 | 
    def __init__(self):  
 | 
        self.playerIDA = 0  
 | 
        self.playerNameA = ""  
 | 
        self.playerIDB = 0  
 | 
        self.playerNameB = ""  
 | 
        self.bridePriceID = 0 # Æ¸ÀñID  
 | 
        self.marryTime = 0 # ³ÉÇ×ʱ¼ä´Á  
 | 
        self.endTime = 0 # ½áËãʱ¼ä´Á  
 | 
        self.prosperity = 0 # ×Ü·±ÈÙ¶È  
 | 
        self.prosperitySuccessList = [] # ·±ÈÙ¶È´ï±ê³É¾ÍÒÑ´¦ÀíÖµ  
 | 
        self.playerFreeEatCountDict = {} # Íæ¼ÒÃâ·Ñ³ÔϲÌÇ´ÎÊý {playerID:´ÎÊý, ...}  
 | 
        self.fireworksCountDict = {} # ÑÌ»¨´ÎÊýÐÅÏ¢ {playerID:´ÎÊý, ...}  
 | 
        return  
 | 
      
 | 
class PlayerCouple():  
 | 
      
 | 
    def __init__(self, coupleData):  
 | 
        self.coupleData = coupleData # PyGameDataStruct.tagDBPyCouple()  
 | 
          
 | 
        # ¸üÐÂ×î´óƸÀñID  
 | 
        self.BridePriceMaxID = 0  
 | 
        maxCount = IpyGameDataPY.IPY_Data().GetMarryCount()  
 | 
        for index in range(maxCount)[::-1]:  
 | 
            ipyData = IpyGameDataPY.IPY_Data().GetMarryByIndex(index)  
 | 
            priceID = ipyData.GetBridePriceID()  
 | 
            if self.GetBridePriceBuyCount(priceID):  
 | 
                self.BridePriceMaxID = priceID  
 | 
                break  
 | 
        return  
 | 
      
 | 
    def GetCoupleID(self, playerID):  
 | 
        return self.coupleData.PlayerIDA if (playerID == self.coupleData.PlayerIDB) else self.coupleData.PlayerIDB  
 | 
    def GetCoupleName(self, playerID): return PlayerSocial.GetSocialPlayerName(self.GetCoupleID(playerID))  
 | 
    def GetCoupleJob(self, playerID): return PlayerSocial.GetSocialPlayerJob(self.GetCoupleID(playerID))  
 | 
    def GetNewMarryTime(self): return self.coupleData.NewMarryTime  
 | 
    def GetMarryTime(self): return self.coupleData.MarryTime  
 | 
    def GetBridePriceState(self): return self.coupleData.BridePriceState  
 | 
    def GetBridePriceBuyCount(self, priceID): return GameWorld.GetDataByDigitPlace(self.coupleData.BridePriceState, priceID - 1)  
 | 
    def SetBridePriceBuyCount(self, priceID, buyCount):  
 | 
        self.coupleData.BridePriceState = GameWorld.ChangeDataByDigitPlace(self.coupleData.BridePriceState, priceID - 1, min(buyCount, 9))  
 | 
        return self.coupleData.BridePriceState  
 | 
    def GetBreakRequestID(self): return self.coupleData.BreakRequestID  
 | 
    def GetBreakRequestTime(self): return self.coupleData.BreakRequestTime  
 | 
    def SetBreakRequestID(self, reqID):  
 | 
        self.coupleData.BreakRequestID = reqID  
 | 
        self.coupleData.BreakRequestTime = 0  
 | 
        if reqID > 0:  
 | 
            curTime = int(time.time())  
 | 
            self.coupleData.BreakRequestTime = curTime  
 | 
            if reqID == self.coupleData.PlayerIDA:  
 | 
                self.coupleData.BreakRequestTimeA = curTime  
 | 
            else:  
 | 
                self.coupleData.BreakRequestTimeB = curTime  
 | 
        return  
 | 
    def GetPlayerBreakRequestTime(self, playerID):  
 | 
        return self.coupleData.BreakRequestTimeA if (playerID == self.coupleData.PlayerIDA) else self.coupleData.BreakRequestTimeB  
 | 
    def GetSendMapServerCoupleInfo(self, playerID):   
 | 
        coupleID = self.GetCoupleID(playerID)  
 | 
        coupleName = self.GetCoupleName(playerID)  
 | 
        coupleJob = self.GetCoupleJob(playerID)  
 | 
        bridePriceMaxID = self.BridePriceMaxID  
 | 
        return coupleID, coupleName, coupleJob, bridePriceMaxID  
 | 
      
 | 
class DBPyCoupleManager(object):  
 | 
    ## °éÂÂÊý¾Ý¹ÜÀí  
 | 
      
 | 
    def __init__(self):  
 | 
        self.coupleDict = {} # {(playerIDA, playerIDB):PlayerCouple, ...}  
 | 
        self.coupleIDDict = {} # {playerID:(playerIDA, playerIDB), ...} # °é¶ÔÓ¦¹ØÏµ  
 | 
        return  
 | 
      
 | 
    def DelCouple(self, playerIDA, playerIDB):  
 | 
        ## É¾³ý°éÂÂÊý¾Ý£¬Èç¹ûÒÑÀë»éÇÒ¾ùÒÑ֪ͨ£¬Ôò¿ÉÖ±½Óɾ³ý  
 | 
        key = (playerIDA, playerIDB)  
 | 
        if key in self.coupleDict:  
 | 
            self.coupleDict.pop(key)  
 | 
          
 | 
        if playerIDA in self.coupleIDDict and self.coupleIDDict[playerIDA] == key:  
 | 
            self.coupleIDDict.pop(playerIDA)  
 | 
              
 | 
        if playerIDB in self.coupleIDDict and self.coupleIDDict[playerIDB] == key:  
 | 
            self.coupleIDDict.pop(playerIDB)  
 | 
        return  
 | 
      
 | 
    def AddCouple(self, playerIDA, playerIDB, coupleData):  
 | 
        ## Ìí¼Óаé  
 | 
        coupleKey = (playerIDA, playerIDB)  
 | 
        couple = PlayerCouple(coupleData)  
 | 
        self.coupleDict[coupleKey] = couple  
 | 
        self.coupleIDDict[playerIDA] = coupleKey  
 | 
        self.coupleIDDict[playerIDB] = coupleKey  
 | 
        return couple  
 | 
      
 | 
    def GetCouple(self, playerID):  
 | 
        ## »ñÈ¡°é  
 | 
        coupleData = None  
 | 
        # ²»¿ÉÄܳÉÁ¢µÄÌõ¼þ£¬Ö»ÊÇΪÁË. Äܳö´úÂëÌáʾָÏò PlayerCouple Àà  
 | 
        if False:  
 | 
            coupleData = PlayerCouple(None)  
 | 
        if playerID not in self.coupleIDDict:  
 | 
            return coupleData  
 | 
        coupleKey = self.coupleIDDict[playerID]  
 | 
        if coupleKey not in self.coupleDict:  
 | 
            return coupleData  
 | 
        coupleData = self.coupleDict[coupleKey]  
 | 
        return coupleData  
 | 
      
 | 
    def SendMapServerCoupleInfo(self, syncPlayerIDList=None):  
 | 
        ## Í¬²½µØÍ¼°éÂÂÐÅÏ¢  
 | 
        syncCoupleInfo = {}  
 | 
        if syncPlayerIDList == None:  
 | 
            syncPlayerIDList = self.coupleIDDict.keys()  
 | 
        # ·ÖÅúͬ²½£¬×Ó·þ³¤¶È²»Äܳ¬¹ý 65535£¬Ã¿ÅúÔݶ¨×î´óͬ²½1000¸ö  
 | 
        for playerID in syncPlayerIDList:  
 | 
            couple = self.GetCouple(playerID)  
 | 
            if not couple:  
 | 
                syncCoupleInfo[playerID] = []  
 | 
            else:  
 | 
                syncCoupleInfo[playerID] = couple.GetSendMapServerCoupleInfo(playerID)  
 | 
            if len(syncCoupleInfo) >= 1000:  
 | 
                GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CoupleInfo, syncCoupleInfo)  
 | 
                syncCoupleInfo = {}  
 | 
        if not syncCoupleInfo:  
 | 
            return  
 | 
        GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CoupleInfo, syncCoupleInfo)  
 | 
        return  
 | 
      
 | 
    # ±£´æÊý¾Ý ´æÊý¾Ý¿âºÍrealtimebackup  
 | 
    def GetSaveData(self):  
 | 
        savaData = ""  
 | 
        cntData = ""  
 | 
        cnt = 0  
 | 
          
 | 
        for couple in self.coupleDict.values():  
 | 
            cnt += 1  
 | 
            savaData += couple.coupleData.getBuffer()  
 | 
                  
 | 
        GameWorld.Log("Save DBPyMarry count :%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("Load DBPyMarry count :%s" % cnt)  
 | 
          
 | 
        for _ in xrange(cnt):  
 | 
            coupleData = PyGameDataStruct.tagDBPyCouple()  
 | 
            coupleData.clear()  
 | 
            pos += coupleData.readData(datas, pos, dataslen)  
 | 
              
 | 
            playerIDA = coupleData.PlayerIDA  
 | 
            playerIDB = coupleData.PlayerIDB  
 | 
              
 | 
            couple = self.AddCouple(playerIDA, playerIDB, coupleData)  
 | 
            if couple.GetBreakRequestTime() > 0:  
 | 
                PyGameData.g_marryBreakInfo[(playerIDA, playerIDB)] = couple  
 | 
                  
 | 
        SortMarryBreak()  
 | 
        return pos  
 | 
      
 | 
class DBPyUnNotifyLoveGiftRecManager(object):  
 | 
    ## Î´Í¨ÖªµÄÔùËÍÀñÎï¼Ç¼¹ÜÀí  
 | 
      
 | 
    def __init__(self):  
 | 
        self.unNotifyLoveGiftDict = {} # {playerID:[PyGameDataStruct.tagDBPyUnNotifyLoveGiftRec, ...], ...}  
 | 
        return  
 | 
      
 | 
    def AddUnNotifyGiftRec(self, receivePlayerID, givePlayerID, giftNum, giftCount, sendTime):  
 | 
        ''' Ìí¼Óδ֪ͨµÄÔùËÍÀñÎï¼Ç¼  
 | 
        @param receivePlayerID: Î´Í¨ÖªµÄÊÜÔù·½Íæ¼ÒID  
 | 
        @param givePlayerID: ÔùËÍ·½Íæ¼ÒID  
 | 
        '''  
 | 
        recData = PyGameDataStruct.tagDBPyUnNotifyLoveGiftRec()  
 | 
        recData.PlayerID = receivePlayerID  
 | 
        recData.GivePlayerID = givePlayerID  
 | 
        recData.GiftNum = giftNum  
 | 
        recData.GiftCount = giftCount  
 | 
        recData.SendTime = sendTime  
 | 
          
 | 
        if receivePlayerID not in self.unNotifyLoveGiftDict:  
 | 
            self.unNotifyLoveGiftDict[receivePlayerID] = []  
 | 
        giftList = self.unNotifyLoveGiftDict[receivePlayerID]  
 | 
        giftList.append(recData)  
 | 
        return  
 | 
      
 | 
    def LoginNotify(self, curPlayer):  
 | 
        receivePlayerID = curPlayer.GetPlayerID()  
 | 
        if receivePlayerID not in self.unNotifyLoveGiftDict:  
 | 
            return  
 | 
        giftList = self.unNotifyLoveGiftDict.pop(receivePlayerID, [])  
 | 
          
 | 
        sendGiftList = []  
 | 
        for recData in giftList:  
 | 
            giftOK = ChPyNetSendPack.tagGCSendGiftsOK()  
 | 
            giftOK.PlayerID = recData.GivePlayerID  
 | 
            giftOK.Name = PlayerSocial.GetSocialPlayerName(recData.GivePlayerID)  
 | 
            giftOK.NameLen = len(giftOK.Name)  
 | 
            giftOK.GiftNum = recData.GiftNum  
 | 
            giftOK.GiftCount = recData.GiftCount  
 | 
            giftOK.SendTime = recData.SendTime  
 | 
            sendGiftList.append(giftOK)  
 | 
              
 | 
        clientPack = ChPyNetSendPack.tagGCSendGiftsOKList()  
 | 
        clientPack.SendGiftsOKList = sendGiftList  
 | 
        clientPack.Count = len(clientPack.SendGiftsOKList)  
 | 
        NetPackCommon.SendFakePack(curPlayer, clientPack)  
 | 
        return  
 | 
      
 | 
    # ±£´æÊý¾Ý ´æÊý¾Ý¿âºÍrealtimebackup  
 | 
    def GetSaveData(self):  
 | 
        savaData = ""  
 | 
        cntData = ""  
 | 
        cnt = 0  
 | 
          
 | 
        for recDataList in self.unNotifyLoveGiftDict.values():  
 | 
            for recData in recDataList:  
 | 
                cnt += 1  
 | 
                savaData += recData.getBuffer()  
 | 
                  
 | 
        GameWorld.Log("Save DBPyUnNotifyLoveGiftRec count :%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("Load DBPyUnNotifyLoveGiftRec count :%s" % cnt)  
 | 
          
 | 
        for _ in xrange(cnt):  
 | 
            recData = PyGameDataStruct.tagDBPyUnNotifyLoveGiftRec()  
 | 
            recData.clear()  
 | 
            pos += recData.readData(datas, pos, dataslen)  
 | 
              
 | 
            playerID = recData.PlayerID  
 | 
              
 | 
            if playerID not in self.unNotifyLoveGiftDict:  
 | 
                self.unNotifyLoveGiftDict[playerID] = []  
 | 
            recDataList = self.unNotifyLoveGiftDict[playerID]  
 | 
            recDataList.append(recData)  
 | 
              
 | 
        return pos  
 | 
      
 | 
def AddProsperity(candyObj, addValue):  
 | 
    candyObj.prosperity += addValue  
 | 
      
 | 
    succProsperityStrList = []  
 | 
    # ·±ÈÙ¶ÈÈ«·þºì°ü  
 | 
    redpackDict = IpyGameDataPY.GetFuncEvalCfg("LoveCandyAward", 1, {})  
 | 
    for prosperityStr, redPackID in redpackDict.items():  
 | 
        if candyObj.prosperity < int(prosperityStr):  
 | 
            continue  
 | 
        if prosperityStr in candyObj.prosperitySuccessList:  
 | 
            continue  
 | 
        succProsperityStrList.append(prosperityStr)  
 | 
        PlayerFamilyRedPacket.CreateSystemRedPacket(redPackID)  
 | 
          
 | 
    # ·±ÈٶȶîÍâ½±Àø  
 | 
    itemInfoDict = IpyGameDataPY.GetFuncEvalCfg("LoveCandyAward", 2, {})  
 | 
    for prosperityStr, itemList in itemInfoDict.items():  
 | 
        if candyObj.prosperity < int(prosperityStr):  
 | 
            continue  
 | 
        if prosperityStr in candyObj.prosperitySuccessList:  
 | 
            continue  
 | 
        succProsperityStrList.append(prosperityStr)  
 | 
          
 | 
        playerIDList = [candyObj.playerIDA, candyObj.playerIDB]  
 | 
        paramList = [candyObj.playerNameA, candyObj.playerNameB, prosperityStr]  
 | 
        PlayerCompensation.SendMailByKey("MarryCandyProsperity", playerIDList, itemList, paramList)  
 | 
          
 | 
    for prosperityStr in succProsperityStrList:  
 | 
        if prosperityStr not in candyObj.prosperitySuccessList:  
 | 
            candyObj.prosperitySuccessList.append(prosperityStr)  
 | 
              
 | 
    return  
 | 
  
 | 
def OnServerClose():  
 | 
      
 | 
    for candyObj in PyGameData.g_marryCandySortList:  
 | 
        __DoMarryCandyOver(candyObj)  
 | 
          
 | 
    return  
 | 
  
 | 
def DoOnDay():  
 | 
      
 | 
    # ÖØÖÃÿÈÕÆ¸Àñ״̬  
 | 
    syncPlayerIDList = []  
 | 
    coupleMgr = PyDataManager.GetDBPyCoupleManager()  
 | 
    ipyDataMgr = IpyGameDataPY.IPY_Data()  
 | 
    for index in range(ipyDataMgr.GetMarryCount()):  
 | 
        ipyData = ipyDataMgr.GetMarryByIndex(index)  
 | 
        if not ipyData.GetIsDayReset():  
 | 
            continue  
 | 
        bridePriceID = ipyData.GetBridePriceID()  
 | 
          
 | 
        for couple in coupleMgr.coupleDict.values():  
 | 
            bridePriceState = couple.GetBridePriceState()  
 | 
            buyCount = couple.GetBridePriceBuyCount(bridePriceID)  
 | 
            if not buyCount:  
 | 
                continue  
 | 
            coupleIDInfo = [couple.coupleData.PlayerIDA, couple.coupleData.PlayerIDB]  
 | 
            updBridePriceState = couple.SetBridePriceBuyCount(bridePriceID, 0)  
 | 
            GameWorld.DebugLog("ÖØÖÃÿÈÕÆ¸Àñ´ÎÊý: coupleIDInfo=%s,bridePriceState=%s,bridePriceID=%s,updBridePriceState=%s"   
 | 
                               % (coupleIDInfo, bridePriceState, bridePriceID, updBridePriceState))  
 | 
            syncPlayerIDList.extend(coupleIDInfo)  
 | 
              
 | 
    if syncPlayerIDList:  
 | 
        playerMgr = GameWorld.GetPlayerManager()  
 | 
        syncPlayerIDList = list(set(syncPlayerIDList))  
 | 
        for playerID in syncPlayerIDList:  
 | 
            curPlayer = playerMgr.FindPlayerByID(playerID)  
 | 
            if not curPlayer or PlayerControl.GetIsTJG(curPlayer):  
 | 
                continue  
 | 
            Sync_CoupleInfo(curPlayer)  
 | 
              
 | 
    return  
 | 
  
 | 
def OnPlayerLogin(curPlayer):  
 | 
    PyDataManager.GetDBPyUnNotifyLoveGiftRecManager().LoginNotify(curPlayer)  
 | 
      
 | 
    # Í¬²½°éÂÂÇ×ÃÜ¶È  
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    couple = PyDataManager.GetDBPyCoupleManager().GetCouple(playerID)  
 | 
    if couple:  
 | 
        coupleID = couple.GetCoupleID(playerID)  
 | 
        intimacys = PyDataManager.GetIntimacyManager().GetIntimacys(playerID)  
 | 
        intimacys.SyncMapServerIntimacy(curPlayer, coupleID)  
 | 
          
 | 
    Sync_CoupleInfo(curPlayer)  
 | 
    Sync_CandyList(curPlayer)  
 | 
    return  
 | 
  
 | 
def OnTimeProcess(curTime, tick):  
 | 
    ## Ã¿Ãë´¥·¢Ò»´Î  
 | 
      
 | 
    # ¼ì²é½áËãϲÌÇ  
 | 
    doCount = len(PyGameData.g_marryCandySortList)  
 | 
    while doCount > 0 and PyGameData.g_marryCandySortList:  
 | 
        doCount -= 1  
 | 
        candyObj = PyGameData.g_marryCandySortList[0]  
 | 
        if curTime <= candyObj.endTime:  
 | 
            break  
 | 
          
 | 
        PyGameData.g_marryCandySortList.pop(0)  
 | 
        PyGameData.g_marryCandyInfo.pop((candyObj.playerIDA, candyObj.playerIDB), None)  
 | 
          
 | 
        __DoMarryCandyOver(candyObj)  
 | 
          
 | 
    # ¼ì²éºÍÀë  
 | 
    breakWaitTimes = IpyGameDataPY.GetFuncCfg("LoveMarryBreak", 5)  
 | 
    doCount = len(PyGameData.g_marryBreakSortList)  
 | 
    while doCount > 0 and PyGameData.g_marryBreakSortList:  
 | 
        doCount -= 1  
 | 
        couple = PyGameData.g_marryBreakSortList[0]  
 | 
        if curTime <= (couple.GetBreakRequestTime() + breakWaitTimes):  
 | 
            break  
 | 
        playerIDA, playerIDB = couple.coupleData.PlayerIDA, couple.coupleData.PlayerIDB  
 | 
        PyGameData.g_marryBreakSortList.pop(0)  
 | 
        PyGameData.g_marryBreakInfo.pop((playerIDA, playerIDB), None)  
 | 
          
 | 
        GameWorld.Log("ºÍÀëÌá½»ÇëÇóµ½ÆÚ£¬ÏµÍ³×Ô¶¯ºÍÀë! playerIDA=%s,playerIDB=%s, len(g_marryBreakSortList)=%s"   
 | 
                      % (playerIDA, playerIDB, len(PyGameData.g_marryBreakSortList)))  
 | 
        __DoMarryBreakLogic(couple, 0)  
 | 
          
 | 
    return  
 | 
  
 | 
def __DoMarryCandyOver(candyObj):  
 | 
    playerIDA, playerIDB, prosperity = candyObj.playerIDA, candyObj.playerIDB, candyObj.prosperity  
 | 
    GameWorld.Log("½áËã»éÀñϲÌÇÑç»á: playerIDA=%s,playerIDB=%s,prosperity=%s" % (playerIDA, playerIDB, prosperity))  
 | 
      
 | 
    transformItemInfo = IpyGameDataPY.GetFuncEvalCfg("LoveCandyAward", 3)  
 | 
    if len(transformItemInfo) != 2:  
 | 
        return  
 | 
    unitProsperity, itemID = transformItemInfo  
 | 
    itemCount = int(math.ceil(prosperity / float(unitProsperity)))  
 | 
    remainSeconds = candyObj.endTime - int(time.time())  
 | 
    GameWorld.Log("ϲÑç·±ÈÙ¶Èת»¯½±Àø: playerIDA=%s,playerIDB=%s,prosperity=%s,itemID=%s,itemCount=%s,marryTime=%s,endTime=%s,remainSeconds=%s"   
 | 
                  % (playerIDA, playerIDB, prosperity, itemID, itemCount,  
 | 
                     GameWorld.ChangeTimeNumToStr(candyObj.marryTime),  
 | 
                     GameWorld.ChangeTimeNumToStr(candyObj.endTime), remainSeconds  
 | 
                     ))  
 | 
    if not itemID or not itemCount:  
 | 
        return  
 | 
    playerIDList = [playerIDA, playerIDB]  
 | 
    itemList = [[itemID, itemCount, 0]]  
 | 
    paramList = [candyObj.playerNameA, candyObj.playerNameB, prosperity]  
 | 
    PlayerCompensation.SendMailByKey("MarryCandyOver", playerIDList, itemList, paramList)  
 | 
    return  
 | 
  
 | 
#// B3 12 ÌáÇ×»ØÓ¦ #tagCGMarryResponse  
 | 
#  
 | 
#struct    tagCGMarryResponse  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#    DWORD        ReqPlayerID;    // ÌáÇ×µÄÍæ¼ÒID  
 | 
#    BYTE        IsOK;    // ÊÇ·ñͬÒ⣬0-·ñ£¬1-ÊÇ  
 | 
#};  
 | 
def OnMarryResponse(index, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    reqPlayerID = clientData.ReqPlayerID  
 | 
    isOK = clientData.IsOK  
 | 
      
 | 
    reqPlayer = GameWorld.GetPlayerManager().FindPlayerByID(reqPlayerID)  
 | 
    if not __MarryCheckComm(curPlayer, reqPlayer, reqPlayerID, False):  
 | 
        return  
 | 
      
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    if reqPlayerID not in PyGameData.g_marryReqInfo:  
 | 
        GameWorld.DebugLog("ÌáÇ×ÇëÇó²»´æÔÚ! reqPlayerID=%s" % reqPlayerID, playerID)  
 | 
        PlayerControl.NotifyCode(curPlayer, "MarryReqInvalid")  
 | 
        return  
 | 
    reqData = PyGameData.g_marryReqInfo[reqPlayerID]  
 | 
      
 | 
    if reqData.playerIDB != playerID:  
 | 
        GameWorld.DebugLog("·ÇĿǰÌáÇ×¶ÔÏó! reqPlayerID=%s, playerIDB(%s) != playerID(%s)"   
 | 
                           % (reqPlayerID, reqData.playerIDB, playerID), playerID)  
 | 
        PlayerControl.NotifyCode(curPlayer, "MarryReqInvalid")  
 | 
        return  
 | 
      
 | 
    if __CheckMarryReqTimeout(reqData):  
 | 
        GameWorld.DebugLog("ÌáÇ×ÇëÇóÒѳ¬Ê±! reqPlayerID=%s" % reqPlayerID, playerID)  
 | 
        PlayerControl.NotifyCode(curPlayer, "MarryReqInvalid")  
 | 
        PyGameData.g_marryReqInfo.pop(reqPlayerID, None)  
 | 
        return  
 | 
      
 | 
    __DoMarryResponse(curPlayer, playerID, reqPlayer, reqPlayerID, isOK)  
 | 
    return  
 | 
  
 | 
def __DoMarryResponse(curPlayer, playerID, reqPlayer, reqPlayerID, isOK, needResponse=True):  
 | 
    ''' ÌáÇ×»ØÓ¦  
 | 
    @param curPlayer: »ØÓ¦Íæ¼Ò  
 | 
    @param reqPlayer: ÌáÇ×Íæ¼Ò  
 | 
    @param isOK: ÊÇ·ñͳһ  
 | 
    '''  
 | 
    reqData = PyGameData.g_marryReqInfo.pop(reqPlayerID, None)  
 | 
    if not reqData:  
 | 
        return  
 | 
    bridePriceID = reqData.bridePriceID  
 | 
    ipyData = IpyGameDataPY.GetIpyGameData("Marry", bridePriceID)  
 | 
    if not ipyData:  
 | 
        return  
 | 
      
 | 
    #playerID = curPlayer.GetPlayerID()  
 | 
    reqPlayerName = reqPlayer.GetName() if reqPlayer else PlayerSocial.GetSocialPlayerName(reqPlayerID)  
 | 
    playerName = curPlayer.GetName() if curPlayer else PlayerSocial.GetSocialPlayerName(playerID)  
 | 
      
 | 
    if needResponse:  
 | 
        responsePack = ChPyNetSendPack.tagGCMarryResponseRet()  
 | 
        responsePack.PlayerIDA = reqPlayerID  
 | 
        responsePack.PlayerNameA = reqPlayerName  
 | 
        responsePack.NameALen = len(responsePack.PlayerNameA)  
 | 
        responsePack.PlayerIDB = playerID  
 | 
        responsePack.PlayerNameB = playerName  
 | 
        responsePack.NameBLen = len(responsePack.PlayerNameB)  
 | 
        responsePack.IsOK = isOK  
 | 
        if reqPlayer:  
 | 
            NetPackCommon.SendFakePack(reqPlayer, responsePack) # ±Ø»Ø¸´ÌáÇ×·½  
 | 
    # ¾Ü¾ø  
 | 
    if not isOK:  
 | 
        return  
 | 
    if needResponse and curPlayer:  
 | 
        NetPackCommon.SendFakePack(curPlayer, responsePack) # »ØÓ¦·½½öͬÒâʱͬ²½  
 | 
      
 | 
    # ===================== ÒÔÏÂÖ´ÐгÉÇ×Âß¼ =====================   
 | 
    GameWorld.Log("Ö´ÐгÉÇ×: reqPlayerID=%s,playerID=%s,bridePriceID=%s" % (reqPlayerID, playerID, bridePriceID), playerID)  
 | 
      
 | 
    curTime = int(time.time())  
 | 
    prosperity = ipyData.GetProsperity()  
 | 
    candyTimes = ipyData.GetCandyTimes()  
 | 
    brideGiftItemInfo = ipyData.GetBrideGiftItemInfo()  
 | 
    worldNotifyKey = ipyData.GetWorldNotifyKey()  
 | 
    if worldNotifyKey:  
 | 
        paramList = [reqPlayerName, playerName]  
 | 
        for itemID, itemCount, _ in brideGiftItemInfo:  
 | 
            paramList.extend([itemID, itemCount])  
 | 
        PlayerControl.WorldNotify(0, worldNotifyKey, paramList)  
 | 
          
 | 
    coupleMgr = PyDataManager.GetDBPyCoupleManager()  
 | 
    couple = coupleMgr.GetCouple(playerID)  
 | 
    if not couple:  
 | 
        GameWorld.Log("    Ð»é: reqPlayerID=%s,playerID=%s,bridePriceID=%s" % (reqPlayerID, playerID, bridePriceID), playerID)  
 | 
        coupleData = PyGameDataStruct.tagDBPyCouple()  
 | 
        coupleData.PlayerIDA = reqPlayerID  
 | 
        coupleData.PlayerNameA = reqPlayerName  
 | 
        coupleData.PlayerIDB = playerID  
 | 
        coupleData.PlayerNameB = playerName  
 | 
        coupleData.NewMarryTime = curTime  
 | 
        couple = coupleMgr.AddCouple(reqPlayerID, playerID, coupleData)  
 | 
          
 | 
        # Í¨Öª¸øÏà¹ØÉç½»ÈËÔ±  
 | 
        PlayerSocial.NotifySocialCoupleChange(reqPlayerID, playerID)  
 | 
        PlayerSocial.NotifySocialCoupleChange(playerID, reqPlayerID)  
 | 
          
 | 
        # Í¨ÖªµØÍ¼È«¾Ö°éÂÂÐÅÏ¢  
 | 
        PyDataManager.GetDBPyCoupleManager().SendMapServerCoupleInfo([playerID, reqPlayerID])  
 | 
    else:  
 | 
        GameWorld.Log("    Òѻ飬ÔÙ´ÎÌáÇ×: PlayerIDA=%s,PlayerIDB=%s, cur reqPlayerID=%s,playerID=%s,bridePriceID=%s"   
 | 
                      % (couple.coupleData.PlayerIDA, couple.coupleData.PlayerIDB, reqPlayerID, playerID, bridePriceID), playerID)  
 | 
          
 | 
    couple.coupleData.MarryTime = curTime  
 | 
    updBuyCountValue = couple.SetBridePriceBuyCount(bridePriceID, couple.GetBridePriceBuyCount(bridePriceID) + 1)  
 | 
    GameWorld.Log("    updBuyCountValue=%s" % updBuyCountValue, playerID)  
 | 
      
 | 
    if bridePriceID > couple.BridePriceMaxID:  
 | 
        couple.BridePriceMaxID = bridePriceID  
 | 
        GameWorld.Log("    update BridePriceMaxID=%s" % couple.BridePriceMaxID, playerID)  
 | 
          
 | 
    # Í¨ÖªÍæ¼Ò  
 | 
    for player in [reqPlayer, curPlayer]:  
 | 
        if not player:  
 | 
            continue     
 | 
        mapServerCoupleInfo = couple.GetSendMapServerCoupleInfo(player.GetPlayerID())  
 | 
          
 | 
        curIntimacys = PyDataManager.GetIntimacyManager().GetIntimacys(player.GetPlayerID())  
 | 
        coupleIntimacy = curIntimacys.GetTagIntimacy(couple.GetCoupleID(player.GetPlayerID())) if curIntimacys else 0  
 | 
          
 | 
        dataMsg = [reqPlayerID, bridePriceID, mapServerCoupleInfo, coupleIntimacy]  
 | 
        MapServer_QueryPlayer_DoLogic_Love(player, "MarrySuccess", dataMsg, playerID)  
 | 
        Sync_CoupleInfo(player)  
 | 
          
 | 
    # Æ¸Àñ½±Àø·¢Óʼþ  
 | 
    playerIDList = [reqPlayerID, playerID]  
 | 
    paramList = [reqPlayerName, playerName]  
 | 
    PlayerCompensation.SendMailByKey("MarrySuccess", playerIDList, brideGiftItemInfo, paramList)  
 | 
      
 | 
    # ÐÂÔöϲÌÇ  
 | 
    candyObj = MarryCandy()  
 | 
    candyObj.playerIDA = reqPlayerID  
 | 
    candyObj.playerNameA = reqPlayerName  
 | 
    candyObj.playerIDB = playerID  
 | 
    candyObj.playerNameB = playerName  
 | 
    candyObj.bridePriceID = bridePriceID  
 | 
    candyObj.marryTime = curTime  
 | 
    candyObj.endTime = curTime + candyTimes  
 | 
    AddProsperity(candyObj, prosperity)  
 | 
      
 | 
    PyGameData.g_marryCandyInfo[(reqPlayerID, playerID)] = candyObj  
 | 
    __SortCandy()  
 | 
    Sync_CandyList(None, [candyObj])  
 | 
      
 | 
    PyGameData.g_marryReqInfo.pop(playerID, None) # ¿ÉÄÜ´æÔÚÏ໥ÌáÇ×µÄÇé¿ö£¬³¢ÊÔ˳±ã°Ñ×ÔÉíµÄÌáÇ×ÇëÇóɾ³ý£¬ÒòΪÒѾÎÞÓÃÁË  
 | 
    return True  
 | 
  
 | 
def GMAddCandy(curPlayer, bridePriceID, addCount):  
 | 
    ## GMÌí¼Ó²âÊÔϲÌÇÑç»á  
 | 
    fakeID = 0  
 | 
    for playerIDA, playerIDB in PyGameData.g_marryCandyInfo.keys():  
 | 
        if playerIDA < 10000:  
 | 
            fakeID = max(playerIDA, fakeID)  
 | 
        if playerIDB < 10000:  
 | 
            fakeID = max(playerIDB, fakeID)  
 | 
              
 | 
    ipyData = IpyGameDataPY.GetIpyGameData("Marry", bridePriceID)  
 | 
    if not ipyData:  
 | 
        return 0  
 | 
    prosperity = ipyData.GetProsperity()  
 | 
    candyTimes = ipyData.GetCandyTimes()  
 | 
      
 | 
    syncCandyList = []  
 | 
    curTime = int(time.time())  
 | 
    for _ in xrange(addCount):  
 | 
        playerIDA = fakeID + 1  
 | 
        playerIDB = fakeID + 2  
 | 
        fakeID = playerIDB  
 | 
          
 | 
        candyObj = MarryCandy()  
 | 
        candyObj.playerIDA = playerIDA  
 | 
        candyObj.playerNameA = PlayerSocial.GetSocialPlayerName(playerIDA)  
 | 
        candyObj.playerIDB = playerIDB  
 | 
        candyObj.playerNameB = PlayerSocial.GetSocialPlayerName(playerIDB)  
 | 
        candyObj.bridePriceID = bridePriceID  
 | 
        candyObj.marryTime = curTime  
 | 
        candyObj.endTime = curTime + candyTimes  
 | 
        AddProsperity(candyObj, prosperity)  
 | 
          
 | 
        PyGameData.g_marryCandyInfo[(playerIDA, playerIDB)] = candyObj  
 | 
        syncCandyList.append(candyObj)  
 | 
          
 | 
    __SortCandy()  
 | 
    Sync_CandyList(None, syncCandyList)  
 | 
    return addCount  
 | 
      
 | 
def __SortCandy():  
 | 
    PyGameData.g_marryCandySortList = PyGameData.g_marryCandyInfo.values()  
 | 
    PyGameData.g_marryCandySortList.sort(key=operator.attrgetter("endTime"))  
 | 
    return  
 | 
  
 | 
def SortMarryBreak():  
 | 
    PyGameData.g_marryBreakSortList = PyGameData.g_marryBreakInfo.values()  
 | 
    PyGameData.g_marryBreakSortList.sort(key=operator.attrgetter("coupleData.BreakRequestTime"))  
 | 
    #GameWorld.DebugLog("SortMarryBreak count=%s" % len(PyGameData.g_marryBreakSortList))  
 | 
    return  
 | 
  
 | 
def __CheckMarryReqTimeout(reqData):  
 | 
    ## ¼ì²éÌáÇ×ÊÇ·ñ³¬Ê±  
 | 
    curTime = int(time.time())  
 | 
    passSeconds = curTime - reqData.reqTime  
 | 
    reqSecondCD = IpyGameDataPY.GetFuncCfg("LoveMarry", 1)  
 | 
    return passSeconds > reqSecondCD  
 | 
  
 | 
#// B3 16 ºÍƽÀë»é»ØÓ¦ #tagGCMarryBreakResponse  
 | 
#  
 | 
#struct    tagGCMarryBreakResponse  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#    BYTE        IsOK;    // ÊÇ·ñͬÒ⣬0-·ñ£¬1-ÊÇ  
 | 
#};  
 | 
def OnMarryBreakResponse(index, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    isOK = clientData.IsOK  
 | 
      
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    couple = PyDataManager.GetDBPyCoupleManager().GetCouple(playerID)  
 | 
    if not couple:  
 | 
        GameWorld.Log("ûÓа飬ÎÞ·¨»ØÓ¦ºÍÀë! ", playerID)  
 | 
        return  
 | 
    coupleID = couple.GetCoupleID(playerID)  
 | 
    breakRequestID = couple.GetBreakRequestID()  
 | 
    if not breakRequestID or coupleID != breakRequestID:  
 | 
        GameWorld.Log("°éÂÂûÓÐÌá³öºÍÀ룬ÎÞ·¨»ØÓ¦ºÍÀë! coupleID=%s,breakRequestID=%s"   
 | 
                      % (coupleID, breakRequestID), playerID)  
 | 
        return  
 | 
      
 | 
    playerIDA, playerIDB = couple.coupleData.PlayerIDA, couple.coupleData.PlayerIDB  
 | 
    if (playerIDA, playerIDB) in PyGameData.g_marryBreakInfo:  
 | 
        PyGameData.g_marryBreakInfo.pop((playerIDA, playerIDB), None)  
 | 
        SortMarryBreak()  
 | 
          
 | 
    if not isOK:  
 | 
        GameWorld.Log("¾Ü¾øºÍÀë! coupleID=%s" % coupleID, playerID)  
 | 
        couple.SetBreakRequestID(0) # Çå³ýºÍÀëÇëÇóID  
 | 
          
 | 
        Sync_CoupleInfo(curPlayer)  
 | 
        tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(coupleID)  
 | 
        if tagPlayer and not PlayerControl.GetIsTJG(tagPlayer):  
 | 
            Sync_CoupleInfo(tagPlayer)  
 | 
        PlayerCompensation.SendMailByKey("MarryBreakRefuse", [coupleID], [], [curPlayer.GetName()])  
 | 
        return  
 | 
      
 | 
    GameWorld.Log("ͬÒâºÍÀë: coupleID=%s" % coupleID, playerID)  
 | 
      
 | 
    __DoMarryBreakLogic(couple, playerID)  
 | 
    return  
 | 
  
 | 
def __DoMarryBreakLogic(couple, playerID=0):  
 | 
    ## Ö´ÐÐÀë»é   
 | 
      
 | 
    if not couple:  
 | 
        return  
 | 
      
 | 
    playerIDA = couple.coupleData.PlayerIDA  
 | 
    playerIDB = couple.coupleData.PlayerIDB  
 | 
      
 | 
    coupleMgr = PyDataManager.GetDBPyCoupleManager()  
 | 
      
 | 
    # Ç×ÃܶȼõÉÙ  
 | 
    decIntimacyPer = IpyGameDataPY.GetFuncCfg("LoveMarryBreak", 4)  
 | 
    if decIntimacyPer:  
 | 
        PyDataManager.GetIntimacyManager().DelIntimacyBothPer(playerIDA, playerIDB, decIntimacyPer)  
 | 
          
 | 
    # Óʼþ֪ͨÀë»é  
 | 
    for pid in [playerIDA, playerIDB]:  
 | 
        coupleName = couple.GetCoupleName(pid)  
 | 
        playerIDList = [pid]  
 | 
        paramList = [coupleName]  
 | 
        PlayerCompensation.SendMailByKey("MarryBreakOK", playerIDList, [], paramList)  
 | 
          
 | 
    coupleMgr.DelCouple(playerIDA, playerIDB)  
 | 
    # Í¨ÖªµØÍ¼È«¾Ö°éÂÂÐÅÏ¢  
 | 
    PyDataManager.GetDBPyCoupleManager().SendMapServerCoupleInfo([playerIDA, playerIDB])  
 | 
      
 | 
    # Í¨ÖªÍæ¼Ò  
 | 
    dataMsg = []  
 | 
    for pid in [playerIDA, playerIDB]:  
 | 
        tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(pid)  
 | 
        if tagPlayer and not PlayerControl.GetIsTJG(tagPlayer):  
 | 
            MapServer_QueryPlayer_DoLogic_Love(tagPlayer, "ClearCoupleSocial", dataMsg, playerID)  
 | 
            Sync_CoupleInfo(tagPlayer)  
 | 
              
 | 
    # Í¨Öª¸øÏà¹ØÉç½»ÈËÔ±  
 | 
    PlayerSocial.NotifySocialCoupleChange(playerIDA, 0)  
 | 
    PlayerSocial.NotifySocialCoupleChange(playerIDB, 0)  
 | 
      
 | 
    if (playerIDA, playerIDB) in PyGameData.g_marryCandyInfo:  
 | 
        GameWorld.Log("Àë»éʱͬ²½Çå³ýϲÌÇÑç»á: playerIDA=%s, playerIDB=%s" % (playerIDA, playerIDB), playerID)  
 | 
        PyGameData.g_marryCandyInfo.pop((playerIDA, playerIDB))  
 | 
        __SortCandy()  
 | 
        Sync_CandyList(None)  
 | 
          
 | 
    if (playerIDA, playerIDB) in PyGameData.g_marryBreakInfo:  
 | 
        GameWorld.Log("Àë»éʱͬ²½Çå³ýºÍÀëÇëÇó: playerIDA=%s, playerIDB=%s" % (playerIDA, playerIDB), playerID)  
 | 
        PyGameData.g_marryBreakInfo.pop((playerIDA, playerIDB), None)  
 | 
        SortMarryBreak()  
 | 
          
 | 
    return True  
 | 
  
 | 
def MapServer_Love(curPlayer, msgList):  
 | 
    mapID = curPlayer.GetRealMapID()  
 | 
    GameWorld.Log("MapServer_Love mapID=%s,msgList=%s" % (mapID, msgList), curPlayer.GetPlayerID())  
 | 
    if not msgList:  
 | 
        return  
 | 
      
 | 
    msgType, dataMsg = msgList  
 | 
      
 | 
    # ËÍÀñÎïÇëÇó  
 | 
    if msgType == "SendGiftsReq":  
 | 
        ret = __SendGiftsReq(curPlayer, dataMsg)  
 | 
          
 | 
    # ËÍÀñÎï  
 | 
    elif msgType == "SendGiftsOK":  
 | 
        __DoSendGiftsOK(curPlayer, dataMsg)  
 | 
        return  
 | 
      
 | 
    # ÌáÇ×  
 | 
    elif msgType == "MarryReq":  
 | 
        __DoMarryReq(curPlayer, dataMsg)  
 | 
        return  
 | 
      
 | 
    # ³ÔϲÌÇ  
 | 
    elif msgType == "MarryEatCandy":  
 | 
        ret = __DoMarryEatCandy(curPlayer, dataMsg)  
 | 
          
 | 
    # ¹ºÂòϲÌÇÑÌ»¨  
 | 
    elif msgType == "MarryBuyFireworks":  
 | 
        ret = __DoMarryBuyFireworks(curPlayer, dataMsg)  
 | 
      
 | 
    # Àë»é  
 | 
    elif msgType == "MarryBreakReq":  
 | 
        ret = __DoMarryBreakReq(curPlayer, dataMsg)  
 | 
          
 | 
    if ret == None:  
 | 
        return  
 | 
    return msgList + [ret]  
 | 
  
 | 
def __SendGiftsReq(curPlayer, dataMsg):  
 | 
    ## ËÍÀñÎïÇëÇó  
 | 
    tagPlayerID = dataMsg[0]  
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
      
 | 
    if not PlayerControl.GetDBPlayerAccIDByID(tagPlayerID):  
 | 
        PlayerControl.NotifyCode(curPlayer, "NoInDBPlayer")  
 | 
        return  
 | 
          
 | 
    # ºÚÃûµ¥¼ì²é  
 | 
    if PyDataManager.GetBlacklistManager().CheckBlacklistBoth(playerID, tagPlayerID, curPlayer):  
 | 
        return  
 | 
      
 | 
    return True  
 | 
  
 | 
def __DoSendGiftsOK(curPlayer, dataMsg):  
 | 
    ## ËÍÀñÎï  
 | 
      
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    playerName = curPlayer.GetName()  
 | 
      
 | 
    tagPlayerID, giftNum, giftItemID, giftCount, isAutoBuy = dataMsg  
 | 
      
 | 
    ipyData = IpyGameDataPY.GetIpyGameData("LoveGift", giftNum)  
 | 
    if not ipyData:  
 | 
        return  
 | 
      
 | 
    addCharmSelf = int(ipyData.GetAddCharmSelf() * giftCount)  
 | 
    addCharmTag = int(ipyData.GetAddCharmTag() * giftCount)  
 | 
    addIntimacy = ipyData.GetAddIntimacy() * giftCount  
 | 
    worldNotifyKey = ipyData.GetWorldNotifyKey()  
 | 
      
 | 
    GameWorld.Log("ÔùËÍÀñÎï: tagPlayerID=%s,giftNum=%s,giftItemID=%s,giftCount=%s,addCharmSelf=%s,addCharmTag=%s,addIntimacy=%s,isAutoBuy=%s"   
 | 
                  % (tagPlayerID, giftNum, giftItemID, giftCount, addCharmSelf, addCharmTag, addIntimacy, isAutoBuy), playerID)  
 | 
      
 | 
    tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagPlayerID)  
 | 
      
 | 
    PyDataManager.GetIntimacyManager().AddIntimacyBoth(playerID, tagPlayerID, addIntimacy)  
 | 
    PlayerCharm.AddCharm(curPlayer, playerID, playerID, addCharmSelf)  
 | 
    PlayerCharm.AddCharm(tagPlayer, tagPlayerID, playerID, addCharmTag)  
 | 
      
 | 
    tagPlayerName = ""  
 | 
    isOnline = tagPlayer and not PlayerControl.GetIsTJG(tagPlayer)  
 | 
    if isOnline:  
 | 
        tagPlayerName = tagPlayer.GetName()  
 | 
    else:  
 | 
        tagPlayerName = PlayerSocial.GetSocialPlayerName(tagPlayerID)  
 | 
          
 | 
    if worldNotifyKey:  
 | 
        PlayerControl.WorldNotify(0, worldNotifyKey, [playerName, tagPlayerName, giftItemID, giftCount])  
 | 
          
 | 
    sendTime = int(time.time())  
 | 
    if not isOnline:  
 | 
        PyDataManager.GetDBPyUnNotifyLoveGiftRecManager().AddUnNotifyGiftRec(tagPlayerID, playerID, giftNum, giftCount, sendTime)  
 | 
        return  
 | 
      
 | 
    # Í¨ÖªÄ¿±êǰ¶ËËÍ»¨³É¹¦  
 | 
    giftOK = ChPyNetSendPack.tagGCSendGiftsOK()  
 | 
    giftOK.PlayerID = playerID  
 | 
    giftOK.Name = playerName  
 | 
    giftOK.NameLen = len(giftOK.Name)  
 | 
    giftOK.GiftNum = giftNum  
 | 
    giftOK.GiftCount = giftCount  
 | 
    giftOK.SendTime = sendTime  
 | 
      
 | 
    clientPack = ChPyNetSendPack.tagGCSendGiftsOKList()  
 | 
    clientPack.SendGiftsOKList = [giftOK]  
 | 
    clientPack.Count = len(clientPack.SendGiftsOKList)  
 | 
    NetPackCommon.SendFakePack(tagPlayer, clientPack)  
 | 
    return  
 | 
  
 | 
def MapServer_QueryPlayer_DoLogic_Love(tagPlayer, msgType, dataMsg, playerID=0):  
 | 
    ## Í¨ÖªÄ¿±êÍæ¼ÒµØÍ¼Ö´ÐРDoLogic  
 | 
    tagPlayerID = tagPlayer.GetPlayerID()  
 | 
    tagMapID = tagPlayer.GetRealMapID()  
 | 
    if tagMapID:  
 | 
        cmdStr = str([msgType, dataMsg])  
 | 
        GameWorld.Log("MapServer_QueryPlayer_DoLogic_Love: msgType=%s,tagPlayerID=%s,tagMapID=%s,dataMsg=%s"   
 | 
                      % (msgType, tagPlayerID, tagMapID, dataMsg), playerID)  
 | 
        GameWorld.GetPlayerManager().MapServer_QueryPlayer(0, 0, tagPlayer.GetPlayerID(), tagMapID, "Love",  
 | 
                                                           cmdStr, len(cmdStr), tagPlayer.GetRouteServerIndex())  
 | 
    return  
 | 
  
 | 
def __MarryCheckComm(curPlayer, tagPlayer, tagPlayerID, checkIntimacy):  
 | 
    ## ³ÉÇ×ͨÓüì²é  
 | 
      
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
      
 | 
    if not PlayerControl.GetDBPlayerAccIDByID(tagPlayerID):  
 | 
        PlayerControl.NotifyCode(curPlayer, "NoInDBPlayer")  
 | 
        return  
 | 
      
 | 
    # ºÚÃûµ¥¼ì²é  
 | 
    if PyDataManager.GetBlacklistManager().CheckBlacklistBoth(playerID, tagPlayerID, curPlayer):  
 | 
        return  
 | 
      
 | 
    curCouple = PyDataManager.GetDBPyCoupleManager().GetCouple(playerID)  
 | 
    if curCouple and curCouple.GetCoupleID(playerID) != tagPlayerID:  
 | 
        PlayerControl.NotifyCode(curPlayer, "HaveCouple") # ÒѾÓÐÆäËû°éÂÂÁË  
 | 
        return  
 | 
      
 | 
    tagCouple = PyDataManager.GetDBPyCoupleManager().GetCouple(tagPlayerID)  
 | 
    if tagCouple and tagCouple.GetCoupleID(tagPlayerID) != playerID:  
 | 
        PlayerControl.NotifyCode(curPlayer, "TagHaveCouple") # ¶Ô·½ÒѾÓÐÆäËû°éÂÂÁË  
 | 
        return  
 | 
      
 | 
    if not tagPlayer or PlayerControl.GetIsTJG(tagPlayer):  
 | 
        if not curCouple:  
 | 
            PlayerControl.NotifyCode(curPlayer, "LoveOffline") # ÀëÏß  
 | 
            return  
 | 
      
 | 
    # »ØÓ¦·½¿É²»¼ì²éÇ×ÃÜ¶È  
 | 
    if checkIntimacy:  
 | 
        needIntimacy = IpyGameDataPY.GetFuncCfg("LoveMarry", 2)  
 | 
        curIntimacys = PyDataManager.GetIntimacyManager().GetIntimacys(playerID)  
 | 
        if not curIntimacys or curIntimacys.GetTagIntimacy(tagPlayerID) < needIntimacy:  
 | 
            PlayerControl.NotifyCode(curPlayer, "IntimacyLack", [needIntimacy]) # Ç×ÃܶȲ»×ã  
 | 
            return  
 | 
          
 | 
    return True  
 | 
  
 | 
def __DoMarryReq(curPlayer, dataMsg):  
 | 
    ## ÌáÇ×  
 | 
      
 | 
    tagPlayerID, bridePriceID = dataMsg  
 | 
      
 | 
    tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagPlayerID)  
 | 
      
 | 
    if not __MarryCheckComm(curPlayer, tagPlayer, tagPlayerID, True):  
 | 
        return  
 | 
      
 | 
    curTime = int(time.time())  
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
      
 | 
    if (playerID, tagPlayerID) in PyGameData.g_marryCandyInfo or (tagPlayerID, playerID) in PyGameData.g_marryCandyInfo:  
 | 
        PlayerControl.NotifyCode(curPlayer, "MarryReqLimitByCandy") # Ï²ÑçÖÐÎÞ·¨²Ù×÷  
 | 
        return  
 | 
      
 | 
    couple = PyDataManager.GetDBPyCoupleManager().GetCouple(playerID)  
 | 
    if couple:  
 | 
        coupleID = couple.GetCoupleID(playerID)  
 | 
        if coupleID != tagPlayerID:  
 | 
            GameWorld.Log("ÒѳÉÇ×°éÂÂID²»Ò»Ö£¬ÎÞ·¨ÌáÇ×! tagPlayerID(%s) != coupleID(%s)" % (tagPlayerID, coupleID), playerID)  
 | 
            return  
 | 
          
 | 
        if couple.GetBreakRequestID():  
 | 
            PlayerControl.NotifyCode(curPlayer, "LimitByMarryBroke") # ºÍÀëÖÐÎÞ·¨²Ù×÷  
 | 
            return  
 | 
          
 | 
        ipyData = IpyGameDataPY.GetIpyGameData("Marry", bridePriceID)  
 | 
        if not ipyData:  
 | 
            return  
 | 
          
 | 
        canBuyMax = ipyData.GetCanBuyCount()  
 | 
        buyCount = couple.GetBridePriceBuyCount(bridePriceID)  
 | 
        GameWorld.DebugLog("bridePriceID=%s,buyCount=%s,canBuyMax=%s %s" % (bridePriceID, buyCount, canBuyMax, couple.coupleData.BridePriceState))  
 | 
        if canBuyMax and buyCount >= canBuyMax:  
 | 
            GameWorld.Log("ƸÀñÌáÇ×´ÎÊý²»×㣬ÎÞ·¨ÌáÇ×! bridePriceID=%s,buyCount(%s) >= canBuyMax(%s)"   
 | 
                          % (bridePriceID, buyCount, canBuyMax), playerID)  
 | 
            return  
 | 
          
 | 
        GameWorld.Log("ÒѳÉÇ׵İéÂÂÔÙ´ÎÌáÇ×£¬Ö±½Ó³ÉÇ×! tagPlayerID=%s,coupleID=%s" % (tagPlayerID, coupleID), playerID)  
 | 
        reqData = MarryReq()  
 | 
        reqData.playerIDA = playerID  
 | 
        reqData.playerIDB = tagPlayerID  
 | 
        reqData.bridePriceID = bridePriceID  
 | 
        reqData.reqTime = curTime  
 | 
        PyGameData.g_marryReqInfo[playerID] = reqData  
 | 
        __DoMarryResponse(tagPlayer, tagPlayerID, curPlayer, playerID, 1, False)  
 | 
        return  
 | 
      
 | 
    if tagPlayerID in PyGameData.g_marryReqInfo:  
 | 
        tagReqData = PyGameData.g_marryReqInfo[tagPlayerID]  
 | 
        tagBridePriceID = tagReqData.bridePriceID  
 | 
        if playerID == tagReqData.playerIDB and not __CheckMarryReqTimeout(tagReqData):  
 | 
            if tagBridePriceID < bridePriceID:  
 | 
                GameWorld.Log("Íæ¼ÒÌáÇ×ʱ£¬Ä¿±ê¸ÕºÃÒѾÏÈÌá¹ýÇ×£¬ÇÒÔÚÓÐЧÆÚÄÚ£¬Ö±½Ó³ÉÇ×£¡Ê¹Óõ±Ç°ÌáÇ×Íæ¼Ò½Ï¸ßƸÀñIDΪ׼! tagPlayerID=%s,tagBridePriceID=%s < bridePriceID=%s"   
 | 
                              % (tagPlayerID, tagBridePriceID, bridePriceID), playerID)  
 | 
                reqData = MarryReq()  
 | 
                reqData.playerIDA = playerID  
 | 
                reqData.playerIDB = tagPlayerID  
 | 
                reqData.bridePriceID = bridePriceID  
 | 
                reqData.reqTime = curTime  
 | 
                PyGameData.g_marryReqInfo[playerID] = reqData  
 | 
                if __DoMarryResponse(tagPlayer, tagPlayerID, curPlayer, playerID, 1):  
 | 
                    return  
 | 
            GameWorld.Log("Íæ¼ÒÌáÇ×ʱ£¬Ä¿±ê¸ÕºÃÒѾÏÈÌá¹ýÇ×£¬ÇÒÔÚÓÐЧÆÚÄÚ£¬Ö±½Ó³ÉÇ×£¡tagPlayerID=%s,tagBridePriceID=%s,bridePriceID=%s"   
 | 
                          % (tagPlayerID, tagBridePriceID, bridePriceID), playerID)  
 | 
            if __DoMarryResponse(curPlayer, playerID, tagPlayer, tagPlayerID, 1):  
 | 
                return  
 | 
        else:  
 | 
            GameWorld.DebugLog("¶Ô·½ÓÐÌáÇ×£¬µ«ÊǶÔÏó²»Ò»Ñù»òÒѳ¬Ê±£¡ tagPlayerID=%s, timeout=%s" % (tagReqData.playerIDB, __CheckMarryReqTimeout(tagReqData)), playerID)  
 | 
              
 | 
    if playerID not in PyGameData.g_marryReqInfo:  
 | 
        reqData = MarryReq()  
 | 
        PyGameData.g_marryReqInfo[playerID] = reqData  
 | 
    else:  
 | 
        reqData = PyGameData.g_marryReqInfo[playerID]  
 | 
          
 | 
    # Ìáǰ²»ÑéÖ¤£¬Ö±½Ó¸²¸Ç£¬·ÅÔÚ»ØÓ¦ÖÐÑéÖ¤  
 | 
    reqData.playerIDA = playerID  
 | 
    reqData.playerIDB = tagPlayerID  
 | 
    reqData.bridePriceID = bridePriceID  
 | 
    reqData.reqTime = curTime  
 | 
      
 | 
    # Í¨Öª×Ô¼ºÇëÇó³É¹¦  
 | 
    NetPackCommon.SendFakePack(curPlayer, ChPyNetSendPack.tagGCMarryReqOK())  
 | 
      
 | 
    # Í¨Öª¶Ô·½  
 | 
    clientPack = ChPyNetSendPack.tagGCMarryReqInfo()  
 | 
    clientPack.PlayerID = playerID  
 | 
    clientPack.PlayerName = curPlayer.GetName()  
 | 
    clientPack.NameLen = len(clientPack.PlayerName)  
 | 
    clientPack.BridePriceID = bridePriceID  
 | 
    NetPackCommon.SendFakePack(tagPlayer, clientPack)  
 | 
    return  
 | 
  
 | 
def __DoMarryEatCandy(curPlayer, dataMsg):  
 | 
    ## ³ÔϲÌÇ  
 | 
    playerIDA, playerIDB, playerID, costMoneyType, costMoneyValue, playerMoneyValue = dataMsg  
 | 
      
 | 
    coupleIDInfo = (playerIDA, playerIDB)  
 | 
      
 | 
    if coupleIDInfo not in PyGameData.g_marryCandyInfo:  
 | 
        GameWorld.ErrLog("²»´æÔڸûéÀñϲÌÇÑç»á! playerIDA=%s, playerIDB=%s" % (playerIDA, playerIDB))  
 | 
        return  
 | 
    candyObj = PyGameData.g_marryCandyInfo[coupleIDInfo]  
 | 
      
 | 
    bridePriceID = candyObj.bridePriceID  
 | 
    ipyData = IpyGameDataPY.GetIpyGameData("Marry", bridePriceID)  
 | 
    if not ipyData:  
 | 
        return  
 | 
    candyItemInfo = []  
 | 
    candyItemWeightInfo = ipyData.GetCandyItemWeightInfo()  
 | 
    candyNotifyItemInfo = ipyData.GetCandyNotifyItemInfo()  
 | 
      
 | 
    playerFreeEatCount = candyObj.playerFreeEatCountDict.get(playerID, 0)  
 | 
    playerFireworksCount = candyObj.fireworksCountDict.get(playerID, 0)  
 | 
      
 | 
    candyFreeCount = IpyGameDataPY.GetFuncCfg("LoveCandy", 1) # Ãâ·ÑϲÌÇ´ÎÊý  
 | 
    fireworksCandyCount = IpyGameDataPY.GetFuncCfg("LoveCandyFire", 3) # ¹ºÂòÒ»´ÎÑÌ»¨ÔùËÍϲÌÇ´ÎÊý  
 | 
      
 | 
    totalFreeCount = candyFreeCount + fireworksCandyCount * playerFireworksCount  
 | 
    isFree = (playerFreeEatCount < totalFreeCount)  
 | 
      
 | 
    canBuy = isFree or (playerMoneyValue >= costMoneyValue)  
 | 
    GameWorld.Log("³ÔϲÌÇ: coupleIDInfo=%s,costMoneyType=%s,costMoneyValue=%s,playerMoneyValue=%s,playerFireworksCount=%s,playerFreeEatCount=%s,totalFreeCount=%s,isFree=%s,canBuy=%s"   
 | 
                  % (coupleIDInfo, costMoneyType, costMoneyValue, playerMoneyValue, playerFireworksCount, playerFreeEatCount, totalFreeCount, isFree, canBuy), playerID)  
 | 
    if canBuy:  
 | 
        addProsperityValue = IpyGameDataPY.GetFuncCfg("LoveCandy", 3) # Ï²ÌÇÿ´ÎÔö¼Ó·±ÈÙ¶È  
 | 
        AddProsperity(candyObj, addProsperityValue)  
 | 
        PlayerControl.NotifyCode(curPlayer, "EatCandyProsperity", [curPlayer.GetName(), addProsperityValue])  
 | 
        for pID in [playerIDA, playerIDB]:  
 | 
            if playerID == pID:  
 | 
                continue  
 | 
            player = GameWorld.GetPlayerManager().FindPlayerByID(pID)  
 | 
            if not player or PlayerControl.GetIsTJG(player):  
 | 
                continue  
 | 
            PlayerControl.NotifyCode(player, "EatCandyProsperity", [curPlayer.GetName(), addProsperityValue])  
 | 
        if isFree:  
 | 
            candyObj.playerFreeEatCountDict[playerID] = playerFreeEatCount + 1  
 | 
        Sync_CandyList(None, [candyObj])  
 | 
          
 | 
        updProsperity = candyObj.prosperity  
 | 
        updPlayerFreeEatCount = candyObj.playerFreeEatCountDict.get(playerID, 0)  
 | 
          
 | 
        getCandyItemInfo = GameWorld.GetResultByWeightList(candyItemWeightInfo, [])  
 | 
        if getCandyItemInfo:  
 | 
            candyItemInfo.append(getCandyItemInfo)  
 | 
            itemID, itemCount = getCandyItemInfo[:2]  
 | 
            if itemID in candyNotifyItemInfo:  
 | 
                PlayerControl.WorldNotify(0, "EatCandyItemNotify", [curPlayer.GetName(), itemID, itemCount])  
 | 
        GameWorld.Log("¸üÐÂϲÌÇÑç»á: updProsperity=%s,updPlayerFreeEatCount=%s,getCandyItemInfo=%s"   
 | 
                      % (updProsperity, updPlayerFreeEatCount, getCandyItemInfo), playerID)  
 | 
          
 | 
    return canBuy, isFree, costMoneyType, costMoneyValue, candyItemInfo  
 | 
  
 | 
def __DoMarryBuyFireworks(curPlayer, dataMsg):  
 | 
    ## ¹ºÂòϲÌÇÑÌ»¨  
 | 
    playerIDA, playerIDB, playerID, costMoneyType, costMoneyValue, playerMoneyValue = dataMsg  
 | 
      
 | 
    coupleIDInfo = (playerIDA, playerIDB)  
 | 
      
 | 
    if coupleIDInfo not in PyGameData.g_marryCandyInfo:  
 | 
        GameWorld.ErrLog("²»´æÔڸûéÀñϲÌÇÑç»áÑÌ»¨! playerIDA=%s, playerIDB=%s" % (playerIDA, playerIDB))  
 | 
        return  
 | 
    candyObj = PyGameData.g_marryCandyInfo[coupleIDInfo]  
 | 
      
 | 
    fireworksTotalBuyCount = sum(candyObj.fireworksCountDict.values())  
 | 
    totalBuyCountLimit = IpyGameDataPY.GetFuncCfg("LoveCandyFire", 1)  
 | 
    if fireworksTotalBuyCount >= totalBuyCountLimit:  
 | 
        PlayerControl.NotifyCode(curPlayer, "MarryFireworksSoldout")  
 | 
        return  
 | 
      
 | 
    addProsperityValue = IpyGameDataPY.GetFuncCfg("LoveCandyFire", 4) # ÑÌ»¨Ï²ÌÇÔùËÍ·±ÈÙ¶È  
 | 
      
 | 
    GameWorld.Log("¹ºÂò»éÀñÑÌ»¨: coupleIDInfo=%s,costMoneyType=%s,costMoneyValue=%s,playerMoneyValue=%s,fireworksCountDict=%s"   
 | 
                  % (coupleIDInfo, costMoneyType, costMoneyValue, playerMoneyValue, candyObj.fireworksCountDict), playerID)  
 | 
          
 | 
    AddProsperity(candyObj, addProsperityValue)  
 | 
    candyObj.fireworksCountDict[playerID] = candyObj.fireworksCountDict.get(playerID, 0) + 1  
 | 
    Sync_CandyList(None, [candyObj])  
 | 
      
 | 
    PlayerControl.WorldNotify(0, "BuyFireworks", [curPlayer.GetName(), candyObj.playerNameA, candyObj.playerNameB])  
 | 
    GameWorld.Log("¸üлéÀñÑÌ»¨: updProsperity=%s,fireworksCountDict=%s" % (candyObj.prosperity, candyObj.fireworksCountDict), playerID)  
 | 
    return costMoneyType, costMoneyValue  
 | 
  
 | 
def __DoMarryBreakReq(curPlayer, dataMsg):  
 | 
    ## Àë»éÇëÇó  
 | 
    playerID, breakType, moneyType, moneyValue = dataMsg  
 | 
      
 | 
    couple = PyDataManager.GetDBPyCoupleManager().GetCouple(playerID)  
 | 
    if not couple:  
 | 
        GameWorld.Log("ûÓа飬²»ÐèÒªÀë»é! ", playerID)  
 | 
        return  
 | 
    coupleID = couple.GetCoupleID(playerID)  
 | 
      
 | 
    curTime = int(time.time())  
 | 
      
 | 
    # ¹«¹²CD  
 | 
    marryTime = couple.GetMarryTime()  
 | 
    passTime = curTime - marryTime  
 | 
    marryBreakCD = IpyGameDataPY.GetFuncCfg("LoveMarryBreak", 1)  
 | 
    if marryBreakCD and passTime < marryBreakCD:  
 | 
        GameWorld.Log("¾àÀë×î½üÒ»´Î³ÉÇ×Àë»éµÈ´ýʱ¼äδµ½£¬ÎÞ·¨ÇëÇóÀë»é! marryTime=%s,passTime(%s) < %s"   
 | 
                      % (GameWorld.ChangeTimeNumToStr(marryTime), passTime, marryBreakCD), playerID)  
 | 
        return  
 | 
      
 | 
    # ºÍÀë¶îÍâÏÞÖÆ¸öÈËCD  
 | 
    playerBreakRequestTime = couple.GetPlayerBreakRequestTime(playerID)  
 | 
    if breakType == 0 and playerBreakRequestTime:  
 | 
        passTime = curTime - playerBreakRequestTime  
 | 
        breakReqCD = IpyGameDataPY.GetFuncCfg("LoveMarryBreak", 2)  
 | 
        if breakReqCD and passTime < breakReqCD:  
 | 
            GameWorld.Log("¾àÀë×î½üÒ»´ÎÇëÇóºÍÀëµÈ´ýʱ¼äδµ½£¬ÎÞ·¨ÇëÇóÀë»é! playerBreakRequestTime=%s,passTime(%s) < %s"   
 | 
                          % (GameWorld.ChangeTimeNumToStr(playerBreakRequestTime), passTime, breakReqCD), playerID)  
 | 
            return  
 | 
          
 | 
    if couple.GetBreakRequestID() == coupleID:  
 | 
        GameWorld.Log("ÇëÇóÀë»éʱ¶Ô·½ÒѾÌá³öºÍÀëÁË£¬Ö±½ÓÀë»é! coupleID=%s,breakRequestID=%s"   
 | 
                      % (coupleID, couple.GetBreakRequestID()), playerID)          
 | 
        __DoMarryBreakLogic(couple, playerID)  
 | 
        return  
 | 
      
 | 
    # 0-ºÍƽÀë»é£»1-Ç¿ÖÆÀë»é  
 | 
    if breakType == 0:  
 | 
        if couple.GetBreakRequestID() != playerID:  
 | 
            playerIDA, playerIDB = couple.coupleData.PlayerIDA, couple.coupleData.PlayerIDB  
 | 
            GameWorld.Log("ÐÂÔöÌá½»ºÍÀë! coupleID=%s" % coupleID, playerID)  
 | 
            couple.SetBreakRequestID(playerID)  
 | 
            PyGameData.g_marryBreakInfo[(playerIDA, playerIDB)] = couple  
 | 
            SortMarryBreak()  
 | 
            playerBreakRequestTime = couple.GetPlayerBreakRequestTime(playerID)  
 | 
        else:  
 | 
            GameWorld.Log("ÖØ¸´Ìá½»ºÍÀë! coupleID=%s" % coupleID, playerID)  
 | 
              
 | 
        Sync_CoupleInfo(curPlayer)  
 | 
        tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(coupleID)  
 | 
        if tagPlayer and not PlayerControl.GetIsTJG(tagPlayer):  
 | 
            Sync_CoupleInfo(tagPlayer)  
 | 
        return  
 | 
      
 | 
    GameWorld.Log("Ç¿ÖÆÀë»é: coupleID=%s" % coupleID, playerID)  
 | 
    __DoMarryBreakLogic(couple, playerID)  
 | 
      
 | 
    return moneyType, moneyValue  
 | 
  
 | 
def Sync_CoupleInfo(curPlayer):  
 | 
    ## Í¬²½°éÂÂÐÅÏ¢  
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    clientPack = ChPyNetSendPack.tagGCCoupleInfo()  
 | 
    curCouple = PyDataManager.GetDBPyCoupleManager().GetCouple(playerID)  
 | 
    if curCouple:  
 | 
        clientPack.CoupleID = curCouple.GetCoupleID(playerID)  
 | 
        clientPack.CoupleName = curCouple.GetCoupleName(playerID)  
 | 
        clientPack.NameLen = len(clientPack.CoupleName)  
 | 
        clientPack.NewMarryTime = curCouple.GetNewMarryTime()  
 | 
        clientPack.MarryTime = curCouple.GetMarryTime()  
 | 
        clientPack.BridePriceState = curCouple.GetBridePriceState()  
 | 
        clientPack.BreakRequestID = curCouple.GetBreakRequestID()  
 | 
        clientPack.BreakRequestTime = curCouple.GetBreakRequestTime()  
 | 
        clientPack.PlayerBreakRequestTime = curCouple.GetPlayerBreakRequestTime(playerID)  
 | 
    NetPackCommon.SendFakePack(curPlayer, clientPack)  
 | 
    return  
 | 
  
 | 
def Sync_CandyList(curPlayer, syncCandyList=None):  
 | 
    if syncCandyList == None:  
 | 
        syncCandyList = PyGameData.g_marryCandySortList  
 | 
          
 | 
    if not syncCandyList:  
 | 
        return  
 | 
      
 | 
    clientPack = ChPyNetSendPack.tagGCCandyList()  
 | 
    clientPack.CandyInfoList = []  
 | 
    for candyObj in syncCandyList:  
 | 
        candyInfo = ChPyNetSendPack.tagGCCandyInfo()  
 | 
        candyInfo.PlayerIDA = candyObj.playerIDA  
 | 
        candyInfo.PlayerNameA = candyObj.playerNameA  
 | 
        candyInfo.NameALen = len(candyInfo.PlayerNameA)  
 | 
        candyInfo.PlayerIDB = candyObj.playerIDB  
 | 
        candyInfo.PlayerNameB = candyObj.playerNameB  
 | 
        candyInfo.NameBLen = len(candyInfo.PlayerNameB)  
 | 
        candyInfo.BridePriceID = candyObj.bridePriceID  
 | 
        candyInfo.MarryTime = candyObj.marryTime  
 | 
        candyInfo.EndTime = candyObj.endTime  
 | 
        candyInfo.Prosperity = candyObj.prosperity  
 | 
        candyInfo.FireworksTotalBuyCount = sum(candyObj.fireworksCountDict.values())  
 | 
          
 | 
        if curPlayer:  
 | 
            candyInfo.FireworksPlayerBuyCount = candyObj.fireworksCountDict.get(curPlayer.GetPlayerID(), 0)  
 | 
            candyInfo.PlayerFreeEatCandyCount = candyObj.playerFreeEatCountDict.get(curPlayer.GetPlayerID(), 0)  
 | 
              
 | 
        clientPack.CandyInfoList.append(candyInfo)  
 | 
    clientPack.CandyCount = len(clientPack.CandyInfoList)  
 | 
      
 | 
    if not curPlayer:  
 | 
        playerManager = GameWorld.GetPlayerManager()  
 | 
        for i in xrange(playerManager.GetActivePlayerCount()):  
 | 
            curPlayer = playerManager.GetActivePlayerAt(i)  
 | 
            if curPlayer == None:  
 | 
                continue  
 | 
            if PlayerControl.GetIsTJG(curPlayer):  
 | 
                continue  
 | 
              
 | 
            for candyInfo in clientPack.CandyInfoList:  
 | 
                coupleIDInfo = (candyInfo.PlayerIDA, candyInfo.PlayerIDB)  
 | 
                if coupleIDInfo not in PyGameData.g_marryCandyInfo:  
 | 
                    continue  
 | 
                candyObj = PyGameData.g_marryCandyInfo[coupleIDInfo]  
 | 
                candyInfo.FireworksPlayerBuyCount = candyObj.fireworksCountDict.get(curPlayer.GetPlayerID(), 0)  
 | 
                candyInfo.PlayerFreeEatCandyCount = candyObj.playerFreeEatCountDict.get(curPlayer.GetPlayerID(), 0)  
 | 
                  
 | 
            NetPackCommon.SendFakePack(curPlayer, clientPack)  
 | 
    else:  
 | 
        if PlayerControl.GetIsTJG(curPlayer):  
 | 
            return  
 | 
        NetPackCommon.SendFakePack(curPlayer, clientPack)  
 | 
    return  
 | 
  
 | 
  
 | 
  
 |