From f4f907ae6ae2f22207859230e8fc88583fe3a723 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 10 十一月 2021 11:26:11 +0800
Subject: [PATCH] 9341 【BT5】【主干】【后端】情缘系统

---
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerSocial.py |  129 ++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 120 insertions(+), 9 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerSocial.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerSocial.py
index 770c385..3ed29f5 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerSocial.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerSocial.py
@@ -26,6 +26,7 @@
 import IpyGameDataPY
 import PlayerViewCache
 import PyGameData
+import ShareDefine
 #--------------------社交圈基本结构-------------------
 # 社交圈
 class SocialPlayers(object):
@@ -123,20 +124,26 @@
 
     
     # 上线通知 
-    def Sync_SocialsInfo(self, curPlayer):
+    def Sync_SocialsInfo(self, curPlayer, playerIDList=None):
+        if playerIDList == None:
+            playerIDList = self.SocialDict.keys()
         pack = ChPyNetSendPack.tagGCGroupPlayers()
         pack.Clear()
         pack.GroupType = self.GroupType
         pack.Players = []
-        pack.Count = self.GetCount()
         
-        for player in self.SocialDict.values():
+        for playerID in playerIDList:
+            if playerID not in self.SocialDict:
+                continue
+            player = self.SocialDict[playerID]
             inPack = ChPyNetSendPack.tagGCGroupPlayer()
             inPack.PlayerID = player.TagID
             
             inPack.SortValue = player.Timestamp if hasattr(player, 'Timestamp') else 0
+            inPack.Intimacy = player.Intimacy if hasattr(player, 'Intimacy') else 0
             pack.Players.append(inPack)
             
+        pack.Count = len(pack.Players)
         NetPackCommon.SendFakePack(curPlayer, pack)
         return
 
@@ -190,6 +197,46 @@
         curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(self.PlayerID)
         self.MapServer_SyncFriendInfo(curPlayer)
     
+    def AddIntimacy(self, curPlayer, friendID, addValue):
+        ## 增加亲密度 - 支持正负
+        if friendID not in self.SocialDict:
+            return 0
+        friendObj = self.SocialDict[friendID]
+        friendObj.Intimacy += addValue
+        friendObj.Intimacy = max(0, min(friendObj.Intimacy, ShareDefine.Def_UpperLimit_DWord))
+        
+        if not curPlayer:
+            return friendObj.Intimacy
+        
+        friendName = ""
+        socialPlayer = PyDataManager.GetPersonalSocialManager().GetSocialPlayer(friendID)
+        if socialPlayer:
+            friendName = socialPlayer.playerInfo.PlayerName
+            
+        if addValue > 0:
+            PlayerControl.NotifyCode(curPlayer, "AddIntimacy", [friendName, addValue])
+            
+        self.Sync_SocialsInfo(curPlayer, [friendID])
+        return friendObj.Intimacy
+    
+    def AddIntimacyByPer(self, curPlayer, friendID, addPer):
+        ## 增加亲密度 - 根据百分比,支持正负
+        if friendID not in self.SocialDict:
+            return 0
+        
+        friendObj = self.SocialDict[friendID]
+        addValue = int(friendObj.Intimacy * addPer / 100.0)
+        return self.AddIntimacy(curPlayer, friendID, addValue)
+    
+    def SetIntimacy(self, curPlayer, friendID, setValue):
+        ## 直接设置亲密度 - 一般GM测试使用
+        if friendID not in self.SocialDict:
+            return
+        friendObj = self.SocialDict[friendID]
+        friendObj.Intimacy = setValue
+        if curPlayer:
+            self.Sync_SocialsInfo(curPlayer, [friendID])
+        return friendObj.Intimacy
     
     # 通知地图好友信息
     def MapServer_SyncFriendInfo(self, curPlayer):
@@ -208,7 +255,7 @@
         #    sendPack.Friends.append(playerFriend)
         # NetPackCommon.SendPyPackToMapServer(curPlayer.GetLineNO(), curPlayer.GetRealMapID(), sendPack) 
         #=======================================================================
-    
+        
 
 # 整个游戏的好友管理
 class FriendManager(object):
@@ -649,6 +696,7 @@
 class SocialPlayerData(object):
     def __init__(self, playerSocial = None, player = None):
         self.playerInfo = PyGameDataStruct.tagPersonalSocial()
+        self.syncMapCouple = 0 # 是否已经同步过地图全局伴侣信息
         
         if playerSocial:
             self.playerInfo = playerSocial
@@ -664,6 +712,7 @@
         self.playerInfo.LV = curPlayer.GetLV()
         self.playerInfo.RealmLV = curPlayer.GetOfficialRank()
         self.playerInfo.OnlineType = 1      # 0 不在线  1 在线 2 脱机在线  
+        self.playerInfo.CoupleID = PlayerControl.GetCoupleID(curPlayer)
         if not self.playerInfo.RefCount:
             self.playerInfo.RefCount = 1
         return
@@ -676,8 +725,38 @@
         packStruct.LV = self.playerInfo.LV
         packStruct.RealmLV = self.playerInfo.RealmLV
         packStruct.OnlineType = self.playerInfo.OnlineType
+        packStruct.CoupleID = self.GetCoupleID()
         return packStruct
     
+    def GetCoupleID(self): return 0 if self.GetCoupleBreakOffline() else self.playerInfo.CoupleID
+    def GetCoupleName(self): return "" if not self.GetCoupleID() else self.playerInfo.CoupleName
+    
+    def SetCoupleInfo(self, coupleID, coupleName):
+        self.playerInfo.CoupleBreakOffline = 0
+        self.playerInfo.CoupleID = coupleID
+        self.playerInfo.CoupleName = coupleName
+        Notify_All(self.playerInfo.PlayerID, IPY_PlayerDefine.CDBPlayerRefresh_ExAttr11, coupleID)
+        return
+    
+    def GetBridePriceMaxID(self): return self.playerInfo.CouplePriceMaxID
+    def CheckUpdCouplePriceMaxID(self, bridePriceID):
+        if bridePriceID > 0 and bridePriceID <= self.playerInfo.CouplePriceMaxID:
+            GameWorld.Log("不更新社交最高聘礼ID: bridePriceID=%s,self.playerInfo.CouplePriceMaxID=%s" 
+                          % (bridePriceID, self.playerInfo.CouplePriceMaxID), self.playerInfo.PlayerID)
+            return
+        self.playerInfo.CouplePriceMaxID = bridePriceID
+        GameWorld.Log("更新社交最高聘礼ID: bridePriceID=%s" % (bridePriceID), self.playerInfo.PlayerID)
+        return
+    
+    def GetCoupleBreakOffline(self):
+        ## 是否离线状态下被离婚,等待下次上线处理
+        return self.playerInfo.CoupleBreakOffline == 1
+    
+    def SetCoupleBreakOffline(self):
+        ## 设置离线状态下被离婚,是的话将在玩家下次上线后处理解除相关伴侣关系,因为离线状态下无法处理,故做个标记等待上线处理
+        self.playerInfo.CoupleBreakOffline = 1
+        GameWorld.Log("离线状态下被离婚,标记伴侣社交关系已离婚!等下次上线处理! coupleID=%s" % self.playerInfo.CoupleID, self.playerInfo.PlayerID)
+        return
     
     # 更新玩家数据引用, 根据需求是否更新玩家数据
     def AddSocialRef(self, curPlayer = None):
@@ -724,6 +803,7 @@
             playerSocial.LV = 1
             playerSocial.RealmLV = 1
             playerSocial.OnlineType = ChConfig.Def_Offline
+            playerSocial.CoupleID = 0
         else:
             cacheDict = PlayerViewCache.GetCachePropDataDict(curCache)
     
@@ -734,6 +814,7 @@
             playerSocial.LV = cacheDict["LV"]
             playerSocial.RealmLV = cacheDict["RealmLV"]
             playerSocial.OnlineType = ChConfig.Def_Offline
+            playerSocial.CoupleID = cacheDict.get("CoupleID", 0)
             
         self.SocialInfo[playerID] = SocialPlayerData(playerSocial)
         socialPlayer = self.SocialInfo[playerID]
@@ -816,8 +897,8 @@
 
 
 #更新玩家社交信息
-def UpdateSocialInfo(curPlayer, notifyType, value):
-    socialPlayer = PyDataManager.GetPersonalSocialManager().GetSocialPlayer(curPlayer.GetID())
+def UpdateSocialInfo(playerID, notifyType, value):
+    socialPlayer = PyDataManager.GetPersonalSocialManager().GetSocialPlayer(playerID)
     if socialPlayer == None:
         return
     
@@ -827,10 +908,40 @@
         socialPlayer.playerInfo.RealmLV = value
     elif notifyType == IPY_PlayerDefine.CDBPlayerRefresh_PlayerName:
         socialPlayer.playerInfo.PlayerName = value
+        coupleID = socialPlayer.playerInfo.CoupleID
+        if coupleID:
+            coupleSocialPlayer = PyDataManager.GetPersonalSocialManager().GetSocialPlayer(coupleID)
+            if coupleSocialPlayer:
+                coupleSocialPlayer.playerInfo.CoupleName = value
+                SendMapServerCoupleInfo([coupleID])
+                
+    Notify_All(playerID, notifyType, value)
+    return
+
+def SendMapServerCoupleInfo(syncPlayerIDList=None):
+    checkState = False
+    syncCoupleInfo = {}
+    socialMgr = PyDataManager.GetPersonalSocialManager()
+    if syncPlayerIDList == None:
+        syncPlayerIDList = socialMgr.SocialInfo.keys()
+        checkState = True # 未指定时才检查,防止启动地图时同步过多(启动地图时,只同步本次已经同步过的)
         
-    Notify_All(curPlayer.GetID(), notifyType, value)
-
-
+    for playerID in syncPlayerIDList:
+        socialPlayer = socialMgr.GetSocialPlayer(playerID)
+        if not socialPlayer:
+            continue
+        coupleID = socialPlayer.GetCoupleID()
+        if checkState:
+            if not socialPlayer.syncMapCouple:
+                continue
+            if not coupleID:
+                continue
+        socialPlayer.syncMapCouple = 1
+        coupleName = socialPlayer.GetCoupleName()
+        syncCoupleInfo[playerID] = [coupleID, coupleName] if coupleID else []
+        
+    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CoupleInfo, syncCoupleInfo)
+    return
 
 # 向当前玩家通知相关联的所有玩家信息
 def Sync_AllSocialsInfo(curPlayer):

--
Gitblit v1.8.0