From f38208f069fcb1823f3ef4398e1c9715488dfaa3 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 02 七月 2024 16:34:45 +0800
Subject: [PATCH] 10192 【越南】【主干】【港台】【砍树】上线增加膜拜主动推送(增加膜拜功能,目前支持跨服排位赛名次及服务器冠名膜拜;增加GameServer玩家记录表;玩家缓存增加记录佩戴称号ID)

---
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerSocial.py |  311 ++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 288 insertions(+), 23 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerSocial.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerSocial.py
index bb54b83..24c92d0 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):
@@ -37,6 +38,9 @@
     
     # 添加社交对象
     def Add(self, tagID, isNotify=True):
+        if not PlayerControl.GetDBPlayerAccIDByID(tagID):
+            GameWorld.ErrLog("试图添加非本服玩家社交对象: tagID=%s,GroupType=%s" % (tagID, self.GroupType))
+            return False
         GameWorld.DebugLog("SocialPlayers----Add %s-%s-%s"%(self.GroupType, self.PlayerID, tagID))
         if tagID in self.SocialDict:
             GameWorld.DebugLog("SocialPlayers----Add 重复")
@@ -123,20 +127,28 @@
 
     
     # 上线通知 
-    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
+            if hasattr(player, 'Intimacy'):
+                inPack.SortValue = player.Intimacy
+            else:
+                inPack.SortValue = player.Timestamp if hasattr(player, 'Timestamp') else 0
             pack.Players.append(inPack)
             
+        pack.Count = len(pack.Players)
         NetPackCommon.SendFakePack(curPlayer, pack)
         return
 
@@ -189,8 +201,7 @@
         self.Delete(delFriendID)
         curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(self.PlayerID)
         self.MapServer_SyncFriendInfo(curPlayer)
-    
-    
+        
     # 通知地图好友信息
     def MapServer_SyncFriendInfo(self, curPlayer):
         return
@@ -208,7 +219,7 @@
         #    sendPack.Friends.append(playerFriend)
         # NetPackCommon.SendPyPackToMapServer(curPlayer.GetLineNO(), curPlayer.GetRealMapID(), sendPack) 
         #=======================================================================
-    
+        
 
 # 整个游戏的好友管理
 class FriendManager(object):
@@ -268,7 +279,7 @@
                 cnt += 1
                 savaData += friend.getBuffer()
         
-        GameWorld.Log("SaveFriendData cnt :%s"%cnt)
+        GameWorld.Log("SaveFriendData cnt :%s len=%s" % (cnt, len(savaData)))
         return CommFunc.WriteDWORD(cntData, cnt) + savaData
 
     # 从数据库载入好友数据
@@ -287,6 +298,172 @@
             self.PlayerFriends[playerFriend.PlayerID].SocialDict[playerFriend.TagID] = playerFriend
             
             AddBeSocial(playerFriend.TagID, playerFriend.PlayerID)
+        return pos
+    
+#-------------------亲密------------------------------
+# 某个玩家的亲密组管理
+class Intimacys(SocialPlayers):
+    def __init__(self, PlayerID):
+        super(Intimacys, self).__init__(PlayerID, PyGameDataStruct.tagDBPyPlayerIntimacy, 
+                                        ChConfig.Def_SocialGroup_Intimacy)
+        
+    def GetIntimacyObj(self, tagID):
+        if tagID not in self.SocialDict:
+            self.Add(tagID)
+        return self.SocialDict.get(tagID)
+    
+    def GetTagIntimacy(self, tagID):
+        intimacyObj = self.Find(tagID)
+        return intimacyObj.Intimacy if intimacyObj else 0
+    
+    def AddIntimacy(self, curPlayer, tagID, addValue):
+        ## 增加亲密度 - 支持正负、支持离线, curPlayer 可能为None
+        intimacyObj = self.GetIntimacyObj(tagID)
+        if not intimacyObj:
+            return 0
+        if not intimacyObj.Intimacy and addValue < 0:
+            return 0
+        intimacyObj.Intimacy = min(max(0, intimacyObj.Intimacy + addValue), ShareDefine.Def_UpperLimit_DWord)
+        nowIntimacy = intimacyObj.Intimacy
+        
+        if nowIntimacy <= 0:
+            self.Delete(tagID)
+            
+        if not curPlayer:
+            return nowIntimacy
+        
+        self.__SyncMapServerCoupleIntimacy(curPlayer, tagID)
+        
+        tagName = ""
+        socialPlayer = PyDataManager.GetPersonalSocialManager().GetSocialPlayer(tagID)
+        if socialPlayer:
+            tagName = socialPlayer.playerInfo.PlayerName
+            
+        if addValue > 0:
+            PlayerControl.NotifyCode(curPlayer, "AddIntimacy", [tagName, addValue])
+        elif addValue < 0:
+            PlayerControl.NotifyCode(curPlayer, "DelIntimacy", [tagName, abs(addValue)])
+            
+        self.Sync_SocialsInfo(curPlayer, [tagID])
+        return nowIntimacy
+    
+    def SetIntimacy(self, curPlayer, tagID, setValue):
+        ## 直接设置亲密度 - 一般GM测试使用
+        intimacyObj = self.GetIntimacyObj(tagID)
+        if not intimacyObj:
+            return 0
+        intimacyObj.Intimacy = setValue
+        if curPlayer:
+            self.__SyncMapServerCoupleIntimacy(curPlayer, tagID)
+            self.Sync_SocialsInfo(curPlayer, [tagID])
+        return intimacyObj.Intimacy
+    
+    def __SyncMapServerCoupleIntimacy(self, curPlayer, tagID):
+        ## 同步地图玩家伴侣亲密度
+        playerID = curPlayer.GetPlayerID()
+        couple = PyDataManager.GetDBPyCoupleManager().GetCouple(playerID)
+        if not couple:
+            return
+        if couple.GetCoupleID(playerID) != tagID:
+            return
+        self.SyncMapServerIntimacy(curPlayer, tagID)
+        return
+    
+    def SyncMapServerIntimacy(self, curPlayer, tagID):
+        ## 同步地图玩家伴侣亲密度
+        playerID = curPlayer.GetPlayerID()
+        intimacyValue = 0
+        intimacyObj = self.GetIntimacyObj(tagID)
+        if intimacyObj:
+            intimacyValue = intimacyObj.Intimacy
+        cmdInfo = ["SyncMapServerIntimacy", [tagID, intimacyValue]]
+        PlayerControl.MapServer_QueryPlayer_DoLogic(curPlayer, "Love", cmdInfo, playerID)
+        return
+    
+# 整个游戏的亲密管理
+class IntimacyManager(object):
+    def __init__(self):
+        self.PlayerIntimacys = {}     # PyGameDataStruct.tagDBPyPlayerIntimacy
+        return
+    
+    # 增加双方亲密度
+    def AddIntimacyBoth(self, aID, bID, addValue):
+        
+        for playerID, tagPlayerID in {aID:bID, bID:aID}.items():
+            intimacys = self.GetIntimacys(playerID)
+            if not intimacys:
+                continue
+            intimacyObj = intimacys.GetIntimacyObj(tagPlayerID)
+            if not intimacyObj:
+                continue
+            
+            curIntimacy = intimacyObj.Intimacy
+            curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
+            updIntimacy = intimacys.AddIntimacy(curPlayer, tagPlayerID, addValue)
+            
+            GameWorld.DebugLog("增加亲密度: playerID=%s,tagPlayerID=%s,curIntimacy=%s,addValue=%s,updIntimacy=%s" 
+                               % (playerID, tagPlayerID, curIntimacy, addValue, updIntimacy), playerID)
+        return
+    
+    # 扣除双方亲密度 - 按百分比
+    def DelIntimacyBothPer(self, aID, bID, delPer):
+        
+        for playerID, tagPlayerID in {aID:bID, bID:aID}.items():
+            intimacys = self.GetIntimacys(playerID)
+            if not intimacys:
+                continue
+            intimacyObj = intimacys.GetIntimacyObj(tagPlayerID)
+            if not intimacyObj:
+                continue
+            
+            curIntimacy = intimacyObj.Intimacy
+            delValue = -max(1, int(curIntimacy * delPer / 100.0))
+            curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
+            updIntimacy = intimacys.AddIntimacy(curPlayer, tagPlayerID, delValue)
+            GameWorld.DebugLog("扣除亲密度: playerID=%s,tagPlayerID=%s,curIntimacy=%s,delPer=%s,delValue=%s,updIntimacy=%s" 
+                               % (playerID, tagPlayerID, curIntimacy, delPer, delValue, updIntimacy), playerID)
+            
+        return
+    
+    # 获取亲密组
+    def GetIntimacys(self, playerID):
+        if not PlayerControl.GetDBPlayerAccIDByID(playerID):
+            GameWorld.ErrLog("试图获取非本服玩家亲密组: playerID=%s" % playerID)
+            return
+        if playerID not in self.PlayerIntimacys:
+            self.PlayerIntimacys[playerID] = Intimacys(playerID)
+        return self.PlayerIntimacys[playerID]
+    
+    # 保存亲密数据 存数据库和realtimebackup
+    def GetSaveData(self):
+        savaData = ""
+        cntData = ""
+        cnt = 0
+        for intimacys in self.PlayerIntimacys.values():
+            for playerIntimacy in intimacys.SocialDict.values():
+                cnt += 1
+                savaData += playerIntimacy.getBuffer()
+        
+        GameWorld.Log("Save DBPyPlayerIntimacy cnt :%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 DBPyPlayerIntimacy cnt :%s"%cnt)
+        
+        self.PlayerIntimacys = {}
+        
+        for i in xrange(cnt):
+            playerIntimacy = PyGameDataStruct.tagDBPyPlayerIntimacy()
+            playerIntimacy.clear()
+            pos += playerIntimacy.readData(datas, pos, dataslen)
+            playerID = playerIntimacy.PlayerID
+            if playerID not in self.PlayerIntimacys:
+                self.PlayerIntimacys[playerID] = Intimacys(playerID) 
+            self.PlayerIntimacys[playerID].SocialDict[playerIntimacy.TagID] = playerIntimacy
+            
+            AddBeSocial(playerIntimacy.TagID, playerIntimacy.PlayerID)
         return pos
     
 #-------------------仇人------------------------------
@@ -385,7 +562,7 @@
                 cnt += 1
                 savaData += socialPlayer.getBuffer()
         
-        GameWorld.Log("!!SaveEnemyData cnt :%s"%cnt)
+        GameWorld.Log("!!SaveEnemyData cnt :%s len=%s" % (cnt, len(savaData)))
         return CommFunc.WriteDWORD(cntData, cnt) + savaData
 
     # 从数据库载入
@@ -541,7 +718,7 @@
                 cnt += 1
                 savaData += socialPlayer.getBuffer()
         
-        GameWorld.Log("!!SaveContactsData cnt :%s"%cnt)
+        GameWorld.Log("!!SaveContactsData cnt :%s len=%s" % (cnt, len(savaData)))
         return CommFunc.WriteDWORD(cntData, cnt) + savaData
 
     # 从数据库载入
@@ -622,7 +799,7 @@
                 cnt += 1
                 savaData += socialPlayer.getBuffer()
         
-        GameWorld.Log("!!SaveBlacklistData cnt :%s"%cnt)
+        GameWorld.Log("!!SaveBlacklistData cnt :%s len=%s" % (cnt, len(savaData)))
         return CommFunc.WriteDWORD(cntData, cnt) + savaData
 
     # 从数据库载入
@@ -664,6 +841,7 @@
         self.playerInfo.LV = curPlayer.GetLV()
         self.playerInfo.RealmLV = curPlayer.GetOfficialRank()
         self.playerInfo.OnlineType = 1      # 0 不在线  1 在线 2 脱机在线  
+        self.playerInfo.Face = curPlayer.GetFace()
         if not self.playerInfo.RefCount:
             self.playerInfo.RefCount = 1
         return
@@ -676,8 +854,8 @@
         packStruct.LV = self.playerInfo.LV
         packStruct.RealmLV = self.playerInfo.RealmLV
         packStruct.OnlineType = self.playerInfo.OnlineType
+        packStruct.Face = self.playerInfo.Face
         return packStruct
-    
     
     # 更新玩家数据引用, 根据需求是否更新玩家数据
     def AddSocialRef(self, curPlayer = None):
@@ -724,6 +902,7 @@
             playerSocial.LV = 1
             playerSocial.RealmLV = 1
             playerSocial.OnlineType = ChConfig.Def_Offline
+            playerSocial.Face = 0
         else:
             cacheDict = PlayerViewCache.GetCachePropDataDict(curCache)
     
@@ -734,6 +913,7 @@
             playerSocial.LV = cacheDict["LV"]
             playerSocial.RealmLV = cacheDict["RealmLV"]
             playerSocial.OnlineType = ChConfig.Def_Offline
+            playerSocial.Face = cacheDict.get("Face", 0)
             
         self.SocialInfo[playerID] = SocialPlayerData(playerSocial)
         socialPlayer = self.SocialInfo[playerID]
@@ -750,22 +930,44 @@
         socialPlayer.SubSocialRef()
         if socialPlayer.GetRefCount() <= 0:
             self.SocialInfo.pop(delPlayerID)
-            
     
     def GetSocialPlayer(self, playerID):
         return self.SocialInfo.get(playerID, None)
     
+    def SyncSocialCoupleInfo(self, curPlayer):
+        coupleMgr = PyDataManager.GetDBPyCoupleManager()
+        coupleList = []
+        for playerID in self.SocialInfo.keys():
+            couple = coupleMgr.GetCouple(playerID)
+            if not couple:
+                continue
+            socialCouple = ChPyNetSendPack.tagGCSocialCouple()
+            socialCouple.PlayerID = playerID
+            socialCouple.CoupleID = couple.GetCoupleID(playerID)
+            coupleList.append(socialCouple)
+            
+        if not coupleList:
+            return
+        
+        clientPack = ChPyNetSendPack.tagGCSocialCouples()
+        clientPack.Player = coupleList
+        clientPack.Count = len(clientPack.Player)
+        NetPackCommon.SendFakePack(curPlayer, clientPack)
+        return
     
     # 保存有社交的玩家信息
     def GetSaveData(self):
         savaData = ""
         cntData = ""
         cnt = 0
-        for socialPlayer in self.SocialInfo.values():
+        for playerID, socialPlayer in self.SocialInfo.items():
+            if PyGameData.g_dbPlayerIDMap and not PlayerControl.GetDBPlayerAccIDByID(playerID):
+                GameWorld.ErrLog("非本服社交玩家,不存档! playerID=%s" % playerID)
+                continue
             cnt += 1
             savaData += socialPlayer.playerInfo.getBuffer()
         
-        GameWorld.Log("SaveSocialData cnt :%s"%cnt)
+        GameWorld.Log("SaveSocialData cnt :%s len=%s" % (cnt, len(savaData)))
         return CommFunc.WriteDWORD(cntData, cnt) + savaData
 
 
@@ -783,6 +985,38 @@
                 
         return pos
 
+def GetSocialPlayerName(playerID):
+    ## 获取玩家社交昵称
+    socialPlayer = PyDataManager.GetPersonalSocialManager().GetSocialPlayer(playerID)
+    if socialPlayer:
+        return socialPlayer.playerInfo.PlayerName
+    
+    curCache = PlayerViewCache.FindViewCache(playerID)
+    if curCache:
+        cacheDict = PlayerViewCache.GetCachePropDataDict(curCache)
+        return cacheDict["Name"]
+    
+    if playerID < 10000:
+        return "testName%s" % playerID
+    
+    return ""
+
+def GetSocialPlayerJob(playerID):
+    ## 获取玩家社交职业
+    socialPlayer = PyDataManager.GetPersonalSocialManager().GetSocialPlayer(playerID)
+    if socialPlayer:
+        return socialPlayer.playerInfo.Job
+    
+    curCache = PlayerViewCache.FindViewCache(playerID)
+    if curCache:
+        cacheDict = PlayerViewCache.GetCachePropDataDict(curCache)
+        return cacheDict["Job"]
+    
+    if playerID < 10000:
+        job = 2 if playerID % 2 == 0 else 1
+        return job
+    
+    return 1
 
 # 向相关联的社交对象通知当前玩家信息
 # 最近联系人、仇人和黑名单存在单向情况, 向对方通知信息
@@ -812,12 +1046,36 @@
         if PlayerControl.GetIsTJG(player):
             continue
         NetPackCommon.SendFakePack(player, pack)
-        
+    return
 
+def NotifySocialCoupleChange(playerID, coupleID):
+    ## 通知伴侣变更给相关社交人员
+    if playerID not in PyGameData.g_BeSocialList:
+        return
+    
+    couple = ChPyNetSendPack.tagGCSocialCouple()
+    couple.PlayerID = playerID
+    couple.CoupleID = coupleID
+    
+    clientPack = ChPyNetSendPack.tagGCSocialCouples()
+    clientPack.Player.append(couple)
+    clientPack.Count = len(clientPack.Player)
+    
+    for tagID in PyGameData.g_BeSocialList[playerID]:
+        player = GameWorld.GetPlayerManager().FindPlayerByID(tagID)
+        if not player:
+            continue
+        
+        if PlayerControl.GetIsTJG(player):
+            continue
+        
+        NetPackCommon.SendFakePack(player, clientPack)
+    return
+    
 
 #更新玩家社交信息
-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 +1085,13 @@
         socialPlayer.playerInfo.RealmLV = value
     elif notifyType == IPY_PlayerDefine.CDBPlayerRefresh_PlayerName:
         socialPlayer.playerInfo.PlayerName = value
-        
-    Notify_All(curPlayer.GetID(), notifyType, value)
-
-
+    elif notifyType == IPY_PlayerDefine.CDBPlayerRefresh_Face:
+        socialPlayer.playerInfo.Face = value
+    else:
+        return
+    
+    Notify_All(playerID, notifyType, value)
+    return
 
 # 向当前玩家通知相关联的所有玩家信息
 def Sync_AllSocialsInfo(curPlayer):
@@ -843,9 +1104,11 @@
     list3 = contacts.SocialDict.keys() if contacts else []
     blacklists = PyDataManager.GetBlacklistManager().GetBlacklist(playerID)
     list4 = blacklists.SocialDict.keys() if blacklists else []
+    intimacys = PyDataManager.GetIntimacyManager().GetIntimacys(playerID)
+    list5 = intimacys.SocialDict.keys() if intimacys else []
 
     #信息并集后发送, 玩家ID
-    resultSet = set(list1)|set(list2)|set(list3)|set(list4)
+    resultSet = set(list1)|set(list2)|set(list3)|set(list4)|set(list5)
     
     sendPack = ChPyNetSendPack.tagGCSocialPlayers()
     sendPack.Clear()
@@ -860,6 +1123,8 @@
         
     sendPack.Count = len(sendPack.Player)
     NetPackCommon.SendFakePack(curPlayer, sendPack)
+    
+    socialManager.SyncSocialCoupleInfo(curPlayer)
     return
     
 

--
Gitblit v1.8.0