From b081d6f889a35197f94e72cf37800015d9943512 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期一, 31 七月 2023 16:35:04 +0800 Subject: [PATCH] 9788 【BT9】【后端】成就系统(新增成就类型164~175) hygame2 冲突 --- ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py | 337 +++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 247 insertions(+), 90 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py index d274d2c..110ce43 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py @@ -18,16 +18,21 @@ import PyDataManager import ChConfig import EventReport -import ChPyNetSendPack -import NetPackCommon import PlayerFamilyParty import ChPyNetSendPack import ShareDefine import PlayerViewCache +import CrossRealmPlayer +import CrossRealmMsg import ChNetSendPack import NetPackCommon import PlayerGeTui +import PyGameData + import re +import time +import IpyGameDataPY + g_ChatMi = {} # 离线聊天记录 {玩家ID:[信息]} 一个玩家最多8条 @@ -86,7 +91,7 @@ curCache = None tagPlayerName = "" if tagPlayer == None: - curCache = PlayerViewCache.ViewCacheMgr.FindCache(tagPlayerID) + curCache = PlayerViewCache.FindViewCache(tagPlayerID) if not curCache: PlayerControl.NotifyCode(curPlayer, "CanootTalk10") return @@ -98,7 +103,7 @@ return if curCache: - cacheDict = eval(curCache.GetPropData()) + cacheDict = PlayerViewCache.GetCachePropDataDict(curCache) tagPlayerName = cacheDict["Name"] talkType = sendPack.GetTalkType() @@ -142,7 +147,7 @@ g_ChatMi[tagPlayerID].pop(0) return - PlayerGeTui.ChatMiGeTui(tagPlayerID, tagPlayerName, curPlayer.GetName()) + #PlayerGeTui.ChatMiGeTui(tagPlayerID, tagPlayerName, curPlayer.GetName()) # 登录时将离线消息下发 def LoginChatMi(curPlayer): @@ -160,6 +165,74 @@ NetPackCommon.SendFakePack(curPlayer, chatPack) return +## 国家频(封包参数) +# @param index 玩家索引 +# @param tick 当前时间 +# @return None +# @remarks 函数详细说明. +def ChatCountry(index, tick): + ## 跨服频道 + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + playerID = curPlayer.GetPlayerID() + sendPack = IPY_GameServer.IPY_GTalkCountry() + content = sendPack.GetContent() + extraValue = sendPack.GetExtraValue() + extras = sendPack.GetExtras() + crossPlayerName = CrossRealmPlayer.GetCrossPlayerName(curPlayer) + + ## 发送到跨服服务器,直接使用跨服boss的分区配置 + dataMsg = {"PlayerID":playerID, "Name":crossPlayerName, "Content":content, "ExtraValue":extraValue, "Extras":extras} + CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_ChatCrossWorld, dataMsg) + return + +def ClientServerMsg_ChatCrossWorld(serverGroupID, msgData, tick): + ## 收到子服跨服世界频道聊天 + chatCrossType = IpyGameDataPY.GetFuncCfg("TalkCross", 1) # 跨服聊天范围设定 0-全服;1-boss分区;2-跨服竞技场分区 + if chatCrossType == 0: + serverGroupIDList = [] + else: + crossTypeMapDict = {1:ChConfig.Def_FBMapID_CrossPenglai, 2:ChConfig.Def_FBMapID_CrossRealmPK} + if chatCrossType not in crossTypeMapDict: + GameWorld.ErrLog("跨服聊天范围配置错误! chatCrossType=%s" % chatCrossType) + return + zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByServerGroupID(crossTypeMapDict[chatCrossType], serverGroupID) + if not zoneIpyData: + return + serverGroupIDList = zoneIpyData.GetServerGroupIDList() + CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ChatCrossWorld, msgData, serverGroupIDList) + return + +def CrossServerMsg_ChatCrossWorld(msgData): + ## 收到跨服世界频道聊天 + + playerID = msgData["PlayerID"] + crossPlayerName = msgData["Name"] + content = msgData["Content"] + extraValue = msgData["ExtraValue"] + extras = msgData["Extras"] + + sendPack = ChNetSendPack.tagTalkCountry() + sendPack.Clear() + sendPack.Name = crossPlayerName + sendPack.NameLen = len(sendPack.Name) + sendPack.PlayerID = playerID + sendPack.Content = content + sendPack.Len = len(sendPack.Content) + sendPack.ExtraValue = extraValue + sendPack.Extras = extras + + # 全服广播在线玩家 + playerManager = GameWorld.GetPlayerManager() + for i in xrange(playerManager.GetActivePlayerCount()): + player = playerManager.GetActivePlayerAt(i) + if player == None: + continue + if PlayerControl.GetIsTJG(player): + continue + NetPackCommon.SendFakePack(player, sendPack) + #curPlayer.ChatCountry(content, extraValue, extras) + return + ## 公频(封包参数) # @param index 玩家索引 # @param tick 当前时间 @@ -172,7 +245,8 @@ extraValue = sendPack.GetExtraValue() extras = sendPack.GetExtras() curPlayer.ChatGong(content, extraValue, extras) - + #缓存 + DoTalkCache(0, curPlayer.GetName(), curPlayer.GetPlayerID(), content, extras) return @@ -210,6 +284,8 @@ curPlayer.ChatFamily(content, extraValue, extras) #仙盟宴会答题 PlayerFamilyParty.OnTalkFamily(curPlayer, content, tick) + #缓存 + DoTalkCache(curPlayer.GetFamilyID(), curPlayer.GetName(), curPlayer.GetPlayerID(), content, extras) return @@ -223,12 +299,6 @@ # 跨服喇叭 if SpeakerType == 2: pass - #======================================================================= - # playerName = PlayerControl.GetMergePlayerName(accID, playerName) # 转化为跨服的名字 - # dataMsg = [accID, 0, playerName, SpeakerType, Text, extraValue, extras] - # MergeChildMsg.SendMergerChildToCenterStringData(ChConfig.Def_SendMergeLoudspeaker, dataMsg) - # GameWorld.Log("发送跨服喇叭聊天: accID=%s,Text=%s" % (accID, Text), playerID) - #======================================================================= else: #GameWorld.DebugLog("发送本服喇叭聊天: accID=%s,Text=%s" % (accID, Text), playerID) @@ -288,83 +358,83 @@ # }; #=============================================================================== def OnVoiceChat(index, clientPack, tick): - curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) - if not CheckTalk(curPlayer, tick): - return - - sendPack = ChPyNetSendPack.tagGCVoiceChat() - sendPack.Clear() - sendPack.ChannelType = clientPack.ChannelType - sendPack.SrcName = curPlayer.GetName() - sendPack.SrcNameLen = len(curPlayer.GetName()) - sendPack.PlayerID = curPlayer.GetID() - sendPack.Len = clientPack.Len - sendPack.Content = clientPack.Content - sendPack.Extras = GetTalkExtraValue(curPlayer) - sendPack.ExtraValue = len(sendPack.Extras) - - playerManager = GameWorld.GetPlayerManager() - if clientPack.ChannelType == ShareDefine.Def_ChannelChat_World: - # 世界频道 - curPlayer.BroadCastAll(sendPack.GetBuffer(), len(sendPack.GetBuffer())) - elif clientPack.ChannelType == ShareDefine.Def_ChannelChat_Family: - # 家族频道 - curFamily = curPlayer.GetFamily() - if curFamily == None: - return - for i in range(0, curFamily.GetCount()): - notifyMember = curFamily.GetAt(i) - notifyPlayer = playerManager.FindPlayerByID(notifyMember.GetPlayerID()) - - if notifyPlayer == None or not notifyPlayer.GetInitOK(): - continue - - if PlayerControl.GetIsTJG(notifyPlayer): - continue - #=================================================================== - # if notifyPlayer.GetPlayerID() == curPlayer.GetPlayerID(): - # #不包括自己 - # continue - #=================================================================== - - NetPackCommon.SendFakePack(notifyPlayer, sendPack) - elif clientPack.ChannelType == ShareDefine.Def_ChannelChat_Team: - # 队伍 - curTeam = curPlayer.GetTeam() - if curTeam == None: - return - for index in xrange(curTeam.GetMemberCount()): - curMember = curTeam.GetMemberPlayer(index) - if not curMember or not curMember.GetPlayerID(): - continue - - #=================================================================== - # if curMember.GetPlayerID() == curPlayer.GetPlayerID(): - # #不包括自己 - # continue - #=================================================================== - - if PlayerControl.GetIsTJG(curMember): - continue - NetPackCommon.SendFakePack(curMember, sendPack) - - elif clientPack.ChannelType == ShareDefine.Def_ChannelChat_Private: - # 私聊 - tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(clientPack.TargetID) - if not tagPlayer: - tagPlayer = GameWorld.GetPlayerManager().FindPlayerByName(clientPack.TargetName) - if tagPlayer == None: - return - - # 黑名单检查 - if PyDataManager.GetBlacklistManager().CheckBlacklistBoth(curPlayer.GetID(), tagPlayer.GetID(), curPlayer): - return - - sendPack.ToName = tagPlayer.GetName() - sendPack.ToNameLen = len(tagPlayer.GetName()) - sendPack.ToPlayerID = tagPlayer.GetID() - NetPackCommon.SendFakePack(tagPlayer, sendPack) - NetPackCommon.SendFakePack(curPlayer, sendPack) +# curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) +# if not CheckTalk(curPlayer, tick): +# return +# +# sendPack = ChPyNetSendPack.tagGCVoiceChat() +# sendPack.Clear() +# sendPack.ChannelType = clientPack.ChannelType +# sendPack.SrcName = curPlayer.GetName() +# sendPack.SrcNameLen = len(curPlayer.GetName()) +# sendPack.PlayerID = curPlayer.GetID() +# sendPack.Len = clientPack.Len +# sendPack.Content = clientPack.Content +# sendPack.Extras = GetTalkExtraValue(curPlayer) +# sendPack.ExtraValue = len(sendPack.Extras) +# +# playerManager = GameWorld.GetPlayerManager() +# if clientPack.ChannelType == ShareDefine.Def_ChannelChat_World: +# # 世界频道 +# curPlayer.BroadCastAll(sendPack.GetBuffer(), len(sendPack.GetBuffer())) +# elif clientPack.ChannelType == ShareDefine.Def_ChannelChat_Family: +# # 家族频道 +# curFamily = curPlayer.GetFamily() +# if curFamily == None: +# return +# for i in range(0, curFamily.GetCount()): +# notifyMember = curFamily.GetAt(i) +# notifyPlayer = playerManager.FindPlayerByID(notifyMember.GetPlayerID()) +# +# if notifyPlayer == None or not notifyPlayer.GetInitOK(): +# continue +# +# if PlayerControl.GetIsTJG(notifyPlayer): +# continue +# #=================================================================== +# # if notifyPlayer.GetPlayerID() == curPlayer.GetPlayerID(): +# # #不包括自己 +# # continue +# #=================================================================== +# +# NetPackCommon.SendFakePack(notifyPlayer, sendPack) +# elif clientPack.ChannelType == ShareDefine.Def_ChannelChat_Team: +# # 队伍 +# curTeam = curPlayer.GetTeam() +# if curTeam == None: +# return +# for index in xrange(curTeam.GetMemberCount()): +# curMember = curTeam.GetMemberPlayer(index) +# if not curMember or not curMember.GetPlayerID(): +# continue +# +# #=================================================================== +# # if curMember.GetPlayerID() == curPlayer.GetPlayerID(): +# # #不包括自己 +# # continue +# #=================================================================== +# +# if PlayerControl.GetIsTJG(curMember): +# continue +# NetPackCommon.SendFakePack(curMember, sendPack) +# +# elif clientPack.ChannelType == ShareDefine.Def_ChannelChat_Private: +# # 私聊 +# tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(clientPack.TargetID) +# if not tagPlayer: +# tagPlayer = GameWorld.GetPlayerManager().FindPlayerByName(clientPack.TargetName) +# if tagPlayer == None: +# return +# +# # 黑名单检查 +# if PyDataManager.GetBlacklistManager().CheckBlacklistBoth(curPlayer.GetID(), tagPlayer.GetID(), curPlayer): +# return +# +# sendPack.ToName = tagPlayer.GetName() +# sendPack.ToNameLen = len(tagPlayer.GetName()) +# sendPack.ToPlayerID = tagPlayer.GetID() +# NetPackCommon.SendFakePack(tagPlayer, sendPack) +# NetPackCommon.SendFakePack(curPlayer, sendPack) return @@ -375,7 +445,8 @@ vipLv = player.GetVIPLv() # 玩家vip等级 GMLevel = player.GetGMLevel() job = player.GetJob() - + playerID = player.GetID() + extraValueStr = "" # vip等级 extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_VipLv)%vipLv @@ -385,6 +456,18 @@ extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_JOB)% job # 气泡框 extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_BubbleBox) % PlayerControl.GetChatBubbleBox(player) + # 服务器组ID + extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_ServerGroupID) % PlayerControl.GetPlayerServerGroupID(player) + # 等级 + extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_LV) % player.GetLV() + # 伴侣信息 + coupleName, coupleJob, bridePriceMaxID = "", 1, 0 + couple = PyDataManager.GetDBPyCoupleManager().GetCouple(playerID) + if couple: + coupleName = couple.GetCoupleName(playerID) + coupleJob = couple.GetCoupleJob(playerID) + bridePriceMaxID = couple.BridePriceMaxID + extraValueStr = "%s|%s|%s|%s" % (extraValueStr, coupleName, coupleJob, bridePriceMaxID) return extraValueStr @@ -409,3 +492,77 @@ return True + +def DoTalkCache(familyID, name, playerID, content, extras): + #仙盟、世界频道聊天缓存 + curTime = int(time.time()) + saveInfo = [curTime, name, playerID, content, extras] + if familyID: + if familyID not in PyGameData.g_familyTalkCache: + PyGameData.g_familyTalkCache[familyID] = [] + else: + maxCnt = IpyGameDataPY.GetFuncCfg('TalkCache', 2) + if maxCnt and len(PyGameData.g_familyTalkCache[familyID]) >= maxCnt: + del PyGameData.g_familyTalkCache[familyID][0] + PyGameData.g_familyTalkCache[familyID].append(saveInfo) + else: + maxCnt = IpyGameDataPY.GetFuncCfg('TalkCache', 1) + if maxCnt and len(PyGameData.g_worldTalkCache) >= maxCnt: + del PyGameData.g_worldTalkCache[0] + PyGameData.g_worldTalkCache.append(saveInfo) + return + +def NotifyTalkCache(curPlayer): + ##上线通知非脱机离线后的聊天缓存 + if PlayerControl.GetIsTJG(curPlayer): + return + playerID = curPlayer.GetPlayerID() + unTJLogoffTime = PyGameData.g_unTJLogoffTime.get(playerID, 0) + + familyCacheList, worldCacheList = [], [] + familyID = curPlayer.GetFamilyID() + if familyID and familyID in PyGameData.g_familyTalkCache: + for curTime, name, playerID, content, extras in PyGameData.g_familyTalkCache[familyID]: + if curTime < unTJLogoffTime: + continue + contentInfo = ChPyNetSendPack.tagGCTalkCacheInfo() + contentInfo.Clear() + contentInfo.ChannelType = 2 + contentInfo.Name = name + contentInfo.NameLen = len(name) + contentInfo.PlayerID = playerID + contentInfo.Time = curTime + contentInfo.Content = content + contentInfo.Len = len(content) + contentInfo.Extras = extras + familyCacheList.append(contentInfo) + + for curTime, name, playerID, content, extras in PyGameData.g_worldTalkCache: + if curTime < unTJLogoffTime: + continue + contentInfo = ChPyNetSendPack.tagGCTalkCacheInfo() + contentInfo.Clear() + contentInfo.ChannelType = 1 + contentInfo.Name = name + contentInfo.NameLen = len(name) + contentInfo.PlayerID = playerID + contentInfo.Time = curTime + contentInfo.Content = content + contentInfo.Len = len(content) + contentInfo.Extras = extras + worldCacheList.append(contentInfo) + + if familyCacheList: + sendPack = ChPyNetSendPack.tagGCTalkCache() + sendPack.Clear() + sendPack.InfoList = familyCacheList + sendPack.Count = len(sendPack.InfoList) + NetPackCommon.SendFakePack(curPlayer, sendPack) + + if worldCacheList: + sendPack = ChPyNetSendPack.tagGCTalkCache() + sendPack.Clear() + sendPack.InfoList = worldCacheList + sendPack.Count = len(sendPack.InfoList) + NetPackCommon.SendFakePack(curPlayer, sendPack) + return \ No newline at end of file -- Gitblit v1.8.0