| | |
| | | import IpyGameDataPY
|
| | | import PlayerViewCache
|
| | | import PyGameData
|
| | | import ShareDefine
|
| | | #--------------------社交圈基本结构-------------------
|
| | | # 社交圈
|
| | | class SocialPlayers(object):
|
| | |
| | |
|
| | |
|
| | | # 上线通知
|
| | | 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
|
| | |
|
| | |
| | | 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):
|
| | |
| | | # sendPack.Friends.append(playerFriend)
|
| | | # NetPackCommon.SendPyPackToMapServer(curPlayer.GetLineNO(), curPlayer.GetRealMapID(), sendPack)
|
| | | #=======================================================================
|
| | | |
| | | |
| | |
|
| | | # 整个游戏的好友管理
|
| | | class FriendManager(object):
|
| | |
| | | class SocialPlayerData(object):
|
| | | def __init__(self, playerSocial = None, player = None):
|
| | | self.playerInfo = PyGameDataStruct.tagPersonalSocial()
|
| | | self.syncMapCouple = 0 # 是否已经同步过地图全局伴侣信息
|
| | |
|
| | | if playerSocial:
|
| | | self.playerInfo = playerSocial
|
| | |
| | | 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
|
| | |
| | | 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):
|
| | |
| | | playerSocial.LV = 1
|
| | | playerSocial.RealmLV = 1
|
| | | playerSocial.OnlineType = ChConfig.Def_Offline
|
| | | playerSocial.CoupleID = 0
|
| | | else:
|
| | | cacheDict = PlayerViewCache.GetCachePropDataDict(curCache)
|
| | |
|
| | |
| | | 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]
|
| | |
| | |
|
| | |
|
| | | #更新玩家社交信息
|
| | | 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
|
| | |
|
| | |
| | | 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):
|