From 8d1a34c156b363d16b979f88909ece9e44771c74 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 20 二月 2025 20:16:43 +0800
Subject: [PATCH] 10361 【越南】【英语】【BT】【GM】【砍树】仙匠大会 - 服务端(修复活动显示等级限制通知错误bug;)

---
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerLove.py |  150 +++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 123 insertions(+), 27 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerLove.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerLove.py
index 7eeaebd..6105118 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerLove.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerLove.py
@@ -159,12 +159,18 @@
         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
     
@@ -358,6 +364,15 @@
 
 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
@@ -455,10 +470,10 @@
         PyGameData.g_marryReqInfo.pop(reqPlayerID, None)
         return
     
-    __DoMarryResponse(curPlayer, reqPlayer, reqPlayerID, isOK)
+    __DoMarryResponse(curPlayer, playerID, reqPlayer, reqPlayerID, isOK)
     return
 
-def __DoMarryResponse(curPlayer, reqPlayer, reqPlayerID, isOK):
+def __DoMarryResponse(curPlayer, playerID, reqPlayer, reqPlayerID, isOK, needResponse=True):
     ''' 提亲回应
     @param curPlayer: 回应玩家
     @param reqPlayer: 提亲玩家
@@ -472,24 +487,26 @@
     if not ipyData:
         return
     
-    playerID = curPlayer.GetPlayerID()
+    #playerID = curPlayer.GetPlayerID()
     reqPlayerName = reqPlayer.GetName() if reqPlayer else PlayerSocial.GetSocialPlayerName(reqPlayerID)
-    playerName = curPlayer.GetName()
+    playerName = curPlayer.GetName() if curPlayer else PlayerSocial.GetSocialPlayerName(playerID)
     
-    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 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
-    NetPackCommon.SendFakePack(curPlayer, responsePack) # 回应方仅同意时同步
+    if needResponse and curPlayer:
+        NetPackCommon.SendFakePack(curPlayer, responsePack) # 回应方仅同意时同步
     
     # ===================== 以下执行成亲逻辑 ===================== 
     GameWorld.Log("执行成亲: reqPlayerID=%s,playerID=%s,bridePriceID=%s" % (reqPlayerID, playerID, bridePriceID), playerID)
@@ -540,7 +557,11 @@
         if not player:
             continue   
         mapServerCoupleInfo = couple.GetSendMapServerCoupleInfo(player.GetPlayerID())
-        dataMsg = [reqPlayerID, bridePriceID, mapServerCoupleInfo]
+        
+        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)
         
@@ -567,6 +588,45 @@
     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"))
@@ -724,6 +784,10 @@
     tagPlayerID = dataMsg[0]
     playerID = curPlayer.GetPlayerID()
     
+    if not PlayerControl.GetDBPlayerAccIDByID(tagPlayerID):
+        PlayerControl.NotifyCode(curPlayer, "NoInDBPlayer")
+        return
+        
     # 黑名单检查
     if PyDataManager.GetBlacklistManager().CheckBlacklistBoth(playerID, tagPlayerID, curPlayer):
         return
@@ -742,8 +806,8 @@
     if not ipyData:
         return
     
-    addCharmSelf = ipyData.GetAddCharmSelf() * giftCount
-    addCharmTag = ipyData.GetAddCharmTag() * giftCount
+    addCharmSelf = int(ipyData.GetAddCharmSelf() * giftCount)
+    addCharmTag = int(ipyData.GetAddCharmTag() * giftCount)
     addIntimacy = ipyData.GetAddIntimacy() * giftCount
     worldNotifyKey = ipyData.GetWorldNotifyKey()
     
@@ -803,12 +867,12 @@
     
     playerID = curPlayer.GetPlayerID()
     
-    # 黑名单检查
-    if PyDataManager.GetBlacklistManager().CheckBlacklistBoth(playerID, tagPlayerID, curPlayer):
+    if not PlayerControl.GetDBPlayerAccIDByID(tagPlayerID):
+        PlayerControl.NotifyCode(curPlayer, "NoInDBPlayer")
         return
     
-    if not tagPlayer or PlayerControl.GetIsTJG(tagPlayer):
-        PlayerControl.NotifyCode(curPlayer, "LoveOffline") # 离线
+    # 黑名单检查
+    if PyDataManager.GetBlacklistManager().CheckBlacklistBoth(playerID, tagPlayerID, curPlayer):
         return
     
     curCouple = PyDataManager.GetDBPyCoupleManager().GetCouple(playerID)
@@ -820,6 +884,11 @@
     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:
@@ -841,6 +910,7 @@
     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:
@@ -854,6 +924,10 @@
             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
@@ -865,8 +939,17 @@
             GameWorld.Log("聘礼提亲次数不足,无法提亲! bridePriceID=%s,buyCount(%s) >= canBuyMax(%s)" 
                           % (bridePriceID, buyCount, canBuyMax), playerID)
             return
-                
-    curTime = int(time.time())
+        
+        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
@@ -880,11 +963,11 @@
                 reqData.bridePriceID = bridePriceID
                 reqData.reqTime = curTime
                 PyGameData.g_marryReqInfo[playerID] = reqData
-                if __DoMarryResponse(tagPlayer, curPlayer, playerID, 1):
+                if __DoMarryResponse(tagPlayer, tagPlayerID, curPlayer, playerID, 1):
                     return
             GameWorld.Log("玩家提亲时,目标刚好已经先提过亲,且在有效期内,直接成亲!tagPlayerID=%s,tagBridePriceID=%s,bridePriceID=%s" 
                           % (tagPlayerID, tagBridePriceID, bridePriceID), playerID)
-            if __DoMarryResponse(curPlayer, tagPlayer, tagPlayerID, 1):
+            if __DoMarryResponse(curPlayer, playerID, tagPlayer, tagPlayerID, 1):
                 return
         else:
             GameWorld.DebugLog("对方有提亲,但是对象不一样或已超时! tagPlayerID=%s, timeout=%s" % (tagReqData.playerIDB, __CheckMarryReqTimeout(tagReqData)), playerID)
@@ -947,6 +1030,14 @@
     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])
@@ -991,6 +1082,7 @@
     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
 
@@ -1081,7 +1173,7 @@
     
     clientPack = ChPyNetSendPack.tagGCCandyList()
     clientPack.CandyInfoList = []
-    for candyObj in PyGameData.g_marryCandySortList:
+    for candyObj in syncCandyList:
         candyInfo = ChPyNetSendPack.tagGCCandyInfo()
         candyInfo.PlayerIDA = candyObj.playerIDA
         candyInfo.PlayerNameA = candyObj.playerNameA
@@ -1112,6 +1204,10 @@
                 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)
                 

--
Gitblit v1.8.0