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