hxp
2021-11-09 f4f907ae6ae2f22207859230e8fc88583fe3a723
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):