From fdebf36f0d9201c6a6949a08cdfeebb718c25ce2 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期五, 23 五月 2025 19:35:53 +0800 Subject: [PATCH] 16 卡牌服务端(聊天、广播、通用记录、查看玩家;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTalk.py | 716 ++++++++++++++--------------------------------------------- 1 files changed, 170 insertions(+), 546 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTalk.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTalk.py index 948b30f..51bab1a 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTalk.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTalk.py @@ -1,268 +1,110 @@ #!/usr/bin/python # -*- coding: GBK -*- +#------------------------------------------------------------------------------- # -##@package +##@package Player.PlayerTalk # -# @todo: 玩家聊天逻辑 支持语音 -# -# @author: Alee -# @date 2018-4-24 下午07:36:28 +# @todo:聊天 +# @author hxp +# @date 2025-05-23 # @version 1.0 # -# @note: +# 详细描述: 聊天 # -#--------------------------------------------------------------------- -import IPY_GameWorld -import GameWorld -import PlayerControl +#------------------------------------------------------------------------------- +#"""Version = 2025-05-23 20:00""" +#------------------------------------------------------------------------------- + import ChConfig -import FBLogic -#import ReadChConfig +import GameWorld import ShareDefine +import IPY_GameWorld import ChPyNetSendPack import CrossRealmPlayer +import PlayerViewCache import NetPackCommon -import EventReport -import PlayerSuccess import IpyGameDataPY -import ItemCommon -import ChItem -import PlayerTJG -import EventShell -import PyGameData -import PlayerLove +import PlayerControl +import PlayerFamily +import DBDataMgr + import math -#--------------------------------------------------------------------- +#需要记录聊天缓存的频道对应限制最大条数 +ChannelCacheMax = {IPY_GameWorld.tcFamily:30, + IPY_GameWorld.tcWorld:100, + } + +def OnPlayerLogin(curPlayer): + NotifyTalkCache(curPlayer) + return -## 区域频道(封包参数) -# @param index 玩家索引 -# @param tick 当前时间 -# @return None -# @remarks 函数详细说明. -# 整个地图的人都可以听到 -def TalkArea(index, tick): +#// B3 20 聊天 #tagCMTalk +# +#struct tagCMPyTalk +#{ +# tagHead Head; +# BYTE ChannelType; // 频道 +# WORD Len; +# char Content[Len]; //size = Len +#}; +def OnTalk(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + playerID = curPlayer.GetPlayerID() + familyID = curPlayer.GetFamilyID() + channelType = clientData.ChannelType + content = clientData.Content - #获得区域频封包 - sendPack = IPY_GameWorld.IPY_CTalkArea() - #玩家聊天内容 - content = sendPack.GetContent() - - #通用判断 - if not __CheckTalk(curPlayer, content, sendPack.GetLen(), tick, talkType=IPY_GameWorld.tcArea): - return - - #通用设置 - SetTalkTime(curPlayer, content, IPY_GameWorld.tcArea, tick) - - - #如果在普通地图, 就广播, 如果在副本就单个通知 - if GameWorld.GetMap().GetMapFBType() == IPY_GameWorld.fbtNull and not GameWorld.IsCrossServer(): - #广播 - extras = GetTalkExtraValue(curPlayer) - curPlayer.ChatArea(content, 0, extras) - else: - __DoLogic_FB_TalkArea(curPlayer, content) - - return True - -## 副本中说话 -# @param curPlayer 当前玩家 -# @param content 讲话的内容 -# @return None -# @remarks 函数详细说明. -def __DoLogic_FB_TalkArea(curPlayer, content): - playerManager = GameWorld.GetMapCopyPlayerManager() - - for index in range(0 , playerManager.GetPlayerCount()): - #广播玩家 - tempPlayer = playerManager.GetPlayerByIndex(index) - if not tempPlayer.GetPlayerID(): - continue + #GameWorld.DebugLog("OnTalk channelType=%s, %s" % (channelType, GameWorld.CodeToGbk(content))) + if channelType == IPY_GameWorld.tcFamily: + if not familyID: + PlayerControl.NotifyCode(curPlayer, "jiazu_lhs_0") + return - #单个广播说话 - extras = GetTalkExtraValue(curPlayer) - tempPlayer.Sync_ChatArea(curPlayer.GetPlayerID(), content, 0, extras) + elif channelType == IPY_GameWorld.tcCountry: + if GameWorld.IsCrossServer(): + return + if not CrossRealmPlayer.IsCrossServerOpen(): + PlayerControl.NotifyCode(curPlayer, "CrossMatching18") + return + if not __CheckTalk(curPlayer, channelType, content, tick): + return + + curPlayer.SetLastChatTick(tick) + curPlayer.SetDict(ChConfig.Def_ChannelTalkTick % channelType, tick) + + if channelType == IPY_GameWorld.tcCountry: + #发送到跨服,待扩展 + return + + bubbleBox = PlayerControl.GetChatBubbleBox(curPlayer) # 气泡框 + + clientPack = ChPyNetSendPack.tagMCTalk() + clientPack.ChannelType = channelType + clientPack.PlayerID = playerID + clientPack.Name = curPlayer.GetPlayerName() + clientPack.NameLen = len(clientPack.Name) + clientPack.Content = content + clientPack.Len = len(clientPack.Content) + clientPack.BubbleBox = bubbleBox + clientPack.LV = curPlayer.GetLV() + clientPack.Job = curPlayer.GetJob() + clientPack.RealmLV = curPlayer.GetOfficialRank() + clientPack.Face = curPlayer.GetFace() + clientPack.FacePic = curPlayer.GetFacePic() + clientPack.ServerID = GameWorld.GetPlayerServerID(curPlayer) + + if channelType == IPY_GameWorld.tcWorld: + NetPackCommon.SendFackPackOnline(clientPack) + elif channelType == IPY_GameWorld.tcFamily: + PlayerFamily.Broadcast_FamilyPack(familyID, clientPack) + + DoTalkCache(channelType, playerID, content, bubbleBox, familyID) return -## 世界频道(封包参数) -# @param index 玩家索引 -# @param tick 当前时间 -# @return None -# @remarks 函数详细说明. -def TalkWorld(index, tick): - curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) - - sendPack = IPY_GameWorld.IPY_CTalkGong() - #玩家聊天内容 - content = sendPack.GetContent() - - #通用检测 - if not __CheckTalk(curPlayer, content, sendPack.GetLen(), tick, checkSameMsg = False, talkType=IPY_GameWorld.tcWorld): - return - - #通用设置 - SetTalkTime(curPlayer, content, IPY_GameWorld.tcWorld, tick) - #发送聊天内容 - extras = GetTalkExtraValue(curPlayer) - curPlayer.ChatGong(content, 0, extras) - #世界频道发言成就 - #PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_TalkWorld, 1) - PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_FeastRedPack_TalkWorld, 1) - EventShell.EventRespons_Talk(curPlayer, 'talkworld') - return - -## 国家频道(封包参数) -# @param index 玩家索引 -# @param tick 当前时间 -# @return None -# @remarks 函数详细说明. -def TalkCountry(index, tick): - ## 跨服世界频道 - if GameWorld.IsCrossServer(): - return - - curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) - - if not CrossRealmPlayer.IsCrossServerOpen(): - PlayerControl.NotifyCode(curPlayer, "CrossMatching18") - return - - sendPack = IPY_GameWorld.IPY_CTalkCountry() - #玩家聊天内容 - content = sendPack.GetContent() - - #通用检测 - if not __CheckTalk(curPlayer, content, sendPack.GetLen(), tick, checkSameMsg = False, talkType=IPY_GameWorld.tcCountry): - return - - #通用设置 - SetTalkTime(curPlayer, content, IPY_GameWorld.tcCountry, tick) - #发送聊天内容 - extras = GetTalkExtraValue(curPlayer) - curPlayer.ChatCountry(content, 0, extras) - return - -## 联盟家族频道(封包参数) -# @param index 玩家索引 -# @param tick 当前时间 -# @return None -# @remarks 函数详细说明. -def TalkFamily(index, tick): - curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) - if curPlayer.GetFamilyID() == 0: - PlayerControl.NotifyCode(curPlayer, "jiazu_lhs_0 ") - return - - sendPack = IPY_GameWorld.IPY_CTalkBang() - #玩家聊天内容 - content = sendPack.GetContent() - - if not __CheckTalk(curPlayer, content, sendPack.GetLen(), tick, talkType=IPY_GameWorld.tcFamily): - return - - #通用设置 - SetTalkTime(curPlayer, content, IPY_GameWorld.tcFamily, tick) - - extras = GetTalkExtraValue(curPlayer) - curPlayer.ChatFamily(content, 0, extras) - #仙盟频道发言成就 - PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_TalkFamily, 1) - EventShell.EventRespons_Talk(curPlayer, 'talkfamily') - return - -## 队伍频道(封包参数) -# @param index 玩家索引 -# @param tick 当前时间 -# @return None -# @remarks 函数详细说明. -def TalkTeam(index, tick): - curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) - if curPlayer.GetTeam() == None: - PlayerControl.NotifyCode(curPlayer, "GeRen_lhs_161795 ") - return - - sendPack = IPY_GameWorld.IPY_CTalkDui() - #玩家聊天内容 - content = sendPack.GetContent() - - if not __CheckTalk(curPlayer, content, sendPack.GetLen(), tick, talkType=IPY_GameWorld.tcTeam): - return - - #通用设置 - SetTalkTime(curPlayer, content, IPY_GameWorld.tcTeam, tick) - #说话 - extras = GetTalkExtraValue(curPlayer) - curPlayer.ChatTeam(content, 0, extras) - return - - -## 私聊频道(封包参数) -# @param index 玩家索引 -# @param tick 当前时间 -# @return None -# @remarks 函数详细说明. -def TalkPrivate(index, tick): - curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) - sendPack = IPY_GameWorld.IPY_CTalkMiFix() - - #玩家聊天内容 - content = sendPack.GetContent() - - if not __CheckTalk(curPlayer, content, sendPack.GetLen(), tick, talkType=IPY_GameWorld.tcPrivate): - return - - #通用设置 - SetTalkTime(curPlayer, content, IPY_GameWorld.tcPrivate, tick) - #说话 - extras = GetTalkExtraValue(curPlayer) - curPlayer.ChatMiByID(sendPack.GetTalkType(), sendPack.GetPlayerID(), content, 0, extras) - return - -def TalkPrivateByID(curPlayer, tagPlayerID, content): - #私聊 0为默认 1为1对1聊天 - talkType = 1 - extras = GetTalkExtraValue(curPlayer) - curPlayer.ChatMiByID(talkType, tagPlayerID, content, 0, extras) - return - - - -## 私聊频道(封包参数) -# @param index 玩家索引 -# @param tick 当前时间 -# @return None -# @remarks 函数详细说明. -def TalkPrivateName(index, tick): - curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) - sendPack = IPY_GameWorld.IPY_CTalkMi() - #玩家聊天内容 - content = sendPack.GetContent() - - if not __CheckTalk(curPlayer, content, sendPack.GetLen(), tick, talkType=IPY_GameWorld.tcPrivate): - return - - #通用设置 - SetTalkTime(curPlayer, content, IPY_GameWorld.tcPrivate, tick) - #说话 - extras = GetTalkExtraValue(curPlayer) - curPlayer.ChatMiByName(sendPack.GetTalkType(), sendPack.GetTargetName(), content, 0, extras) - return - - -#-3秒重复,;聊天信息太长 -## 聊天通用检查 -# @param curPlayer 当前玩家 -# @param content 聊天内容 -# @param length 聊天长度 -# @param tick 当前时间 -# @param checkGMForbidenTalk 检查是否禁言 -# @param checkSameMsg 是否检查相同信息 -# @return True or False -# @remarks 函数详细说明. -def __CheckTalk(curPlayer, content, length, tick, checkGMForbidenTalk = True, checkSameMsg = True, talkType=None): +def __CheckTalk(curPlayer, channelType, content, tick, checkGMForbidenTalk=True): + ## 聊天通用检查 if checkGMForbidenTalk and GetGMToolForbidTalk(curPlayer): #GeRen_chenxin_921745 对不起,您已被GM禁言,发送信息失败 #PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_921745") @@ -274,18 +116,18 @@ return False #频道各自间隔时间 - if talkType != None: + if channelType != None: talkCDDict = IpyGameDataPY.GetFuncEvalCfg("TalkCD", 1, {}) - if str(talkType) in talkCDDict: - cdTicks = talkCDDict[str(talkType)] * 1000 - lastTalkTick = curPlayer.GetTalkTick(talkType) + if str(channelType) in talkCDDict: + cdTicks = talkCDDict[str(channelType)] * 1000 + lastTalkTick = curPlayer.GetDictByKey(ChConfig.Def_ChannelTalkTick % channelType) remainTick = cdTicks - (tick - lastTalkTick) if remainTick > 0: - PlayerControl.NotifyCode(curPlayer, "CanootTalk01", [int(math.ceil(remainTick/1000.0))]) + PlayerControl.NotifyCode(curPlayer, "CanootTalk01", [int(math.ceil(remainTick / 1000.0))]) return False #聊天信息太长 - if length > ChConfig.Def_PlayerTalkMaxCount : + if len(content) > ChConfig.Def_PlayerTalkMaxCount: PlayerControl.NotifyCode(curPlayer, "CanootTalk13") return False @@ -296,315 +138,97 @@ return True - -## 获得玩家是否被禁言 -# @param curPlayer 当前玩家 -# @return 是否禁言 def GetGMToolForbidTalk(curPlayer): - + ## 获得玩家是否被禁言 #accIDForbid = (curPlayer.GetAccState() & pow(2, ChConfig.Def_PysForbidTalk)) > 0 - return curPlayer.GetGMForbidenTalk()# or accIDForbid - -## 聊天时间通用设置 -# @param curPlayer 当前玩家 -# @param content 聊天内容 -# @param type 类型 -# @param tick 当前时间 -# @return None -# @remarks 函数详细说明. -def SetTalkTime(curPlayer, content, type, tick): - #设置当前时间为玩家开始聊天时间 - curPlayer.SetLastChatTick(tick) - #设置当前聊天内容为玩家本次聊天内容 - #curPlayer.SetLastChatContent(content) - #设置当前频道时间 - curPlayer.SetTalkTick(type, tick) - return - -## 信件2B封包 -# @param index 玩家索引 -# @param tick 当前时间 -# @return None -# @remarks 函数详细说明. -def GBLetter(index, tick): - #=========================================================================== - # curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) - # sendPack = IPY_GameWorld.IPY_CGBLetter() - # - # if tick - curPlayer.GetTickByType(ChConfig.TYPE_Player_Tick_GBLetter) <= ChConfig.TYPE_Player_Tick_Time[ChConfig.TYPE_Player_Tick_GBLetter]: - # #发信1秒间隔 - # return - # - # curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_GBLetter, tick) - # - # #信件标题和内容 - # titleStr = sendPack.GetTitle() - # contentStr = sendPack.GetContent() - # - # #发给GM - # curPlayer.Interface_SendGMLetter(titleStr, contentStr) - #=========================================================================== - return - -## 记录玩家聊天内容 -# @param messageStr 聊天类型 -# @param curPlayer 聊天的玩家 -# @param tagPlayer None -# @param content 聊天内容 -# @param addinfo 额外信息 -# @return None -# @remarks 函数详细说明. -def __LogInDBPlayerTalk(messageStr , curPlayer , tagPlayer , content, addinfo=""): - # 由客户端向后台发送 - return - #=========================================================================== - # tagName = "" if not tagPlayer else tagPlayer.GetName() - # #EventReport.WriteEvent_chat_log(curPlayer, content, messageStr, tagName, addinfo) - # gameWorld = GameWorld.GetGameWorld() - # #开关未开启 - # if not gameWorld.GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_PurTalk): - # return - # - # #将聊天内容存入数据库 - # gameWorld.DataServer_TalkTrace('%s'%(messageStr), curPlayer, tagPlayer, content) - # return - #=========================================================================== - - -## 获取聊天内容附加值 -# @param objTalk: 聊天对象 -# @return: 聊天内容附加值 -def GetTalkExtraValue(objTalk): - vipLv = objTalk.GetVIPLv() # 玩家vip等级 - GMLevel = objTalk.GetGMLevel() - job = objTalk.GetJob() - playerID = objTalk.GetID() - - extraValueStr = "" - # vip等级 - extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_VipLv)%vipLv - # GM - extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_GM)% (GMLevel > 0) - # job - extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_JOB)% job - # 气泡框 - extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_BubbleBox) % PlayerControl.GetChatBubbleBox(objTalk) - # 服务器组ID - extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_ServerGroupID) % PlayerControl.GetPlayerServerGroupID(objTalk) - # 等级 - extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_LV) % objTalk.GetLV() - # 伴侣信息 - coupleName = PlayerControl.GetCoupleName(objTalk) - coupleJob = PlayerControl.GetCoupleJob(objTalk) - bridePriceMaxID = PlayerControl.GetBridePriceMaxID(objTalk) - face = objTalk.GetFace() - facePic = objTalk.GetFacePic() - extraValueStr = "%s|%s|%s|%s|%s|%s" % (extraValueStr, coupleName, coupleJob, bridePriceMaxID, face, facePic) - return extraValueStr - - -## 附加信息的长度匹配 -# @param extraValueInfo: 附加信息的长度 -# @return: -def GetTalkExtraValueStar(extraValueType): - extraValueInfo = ShareDefine.Def_TalkExtraValue_LenDict.get(extraValueType) - extraValueLen = extraValueInfo[1] - extraValueInfo[0] - - return "%0" + str(extraValueLen) + "d" - - -#// A2 17 喇叭聊天 #tagCMPYSpeaker -# -#struct tagCMPYSpeaker -#{ -# tagHead Head; -# BYTE SpeakerType; //1-本服;2-跨服 -# BYTE IsUseGold; //是否使用钻石 -# BYTE ItemIndex; //使用物品说话时, 物品Index -# BYTE TextLen; //字符长度 -# char Text[TextLen]; //size = TextLen -#}; -def OnUsePYSpeaker(index, clientData, tick): - curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) - playerID = curPlayer.GetPlayerID() - SpeakerType = clientData.SpeakerType - IsUseGold = clientData.IsUseGold - ItemIndex = clientData.ItemIndex - TextLen = clientData.TextLen - Text = clientData.Text - - #GameWorld.Log("玩家喇叭聊天: SpeakerType=%s,IsUseGold=%s,ItemIndex=%s" - # % (SpeakerType, IsUseGold, ItemIndex), playerID) - if not __CheckTalk(curPlayer, Text, TextLen, tick): +def DoTalkCache(channelType, playerID, content, bubbleBox, familyID=0): + # 聊天缓存 + if channelType not in ChannelCacheMax: return + cacheMaxDict = IpyGameDataPY.GetFuncEvalCfg("TalkCache", 1, {}) + maxCount = min(ChannelCacheMax[channelType], cacheMaxDict.get(channelType, 0)) - - if IsUseGold: - bugleItemID = IpyGameDataPY.GetFuncCfg('BugleItem', SpeakerType) - if not bugleItemID: - GameWorld.ErrLog("功能配置表没有配置对应喇叭类型物品消耗!SpeakerType=%s,请检查BugleItem!" % SpeakerType) - return - costMoney = ItemCommon.GetAutoBuyItemNeedGold({bugleItemID:1}) - if not costMoney: - return - moneyType = IPY_GameWorld.TYPE_Price_Gold_Money - infoDict = {"SpeakerType":SpeakerType, ChConfig.Def_Cost_Reason_SonKey:bugleItemID} - if not PlayerControl.PayMoney(curPlayer, moneyType, costMoney, ChConfig.Def_Cost_UseSpeaker, infoDict, 1): - return - - # 检查使用喇叭道具 - elif not ChItem.DoSpeaker_UseItem(curPlayer, ItemIndex, SpeakerType): - GameWorld.Log(" 喇叭道具不可用!", playerID) - return - - #通知世界服务器,使用小喇叭 - extraValue = 0 - extras = GetTalkExtraValue(curPlayer) - msgList = str([SpeakerType, Text, extraValue, extras]) - GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, 'PYSpeaker', msgList, len(msgList)) - - return - - - -#// A2 16 自定义玩家聊天 #tagCMPyTalk -# -#struct tagCMPyTalk -#{ -# tagHead Head; -# BYTE TalkType; // 自定义聊天类型 -# WORD Len; -# char Content[Len]; //size = Len -#}; -## 自定义玩家聊天 -# @param index -# @param clientData -# @param tick -# @return -def OnPyTalk(index, clientData, tick): - curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) - - #GameWorld.DebugLog("OnPyTalk, Name:%s" % curPlayer.GetPlayerName()) - - talkType = clientData.TalkType - contentLen = clientData.Len - content = clientData.Content - - if talkType not in ShareDefine.TalkTypeList: - GameWorld.ErrLog("OnPyTalk talkType(%s) is not define!" % talkType, curPlayer.GetPlayerID()) - return - - #通用判断 - if not __CheckTalk(curPlayer, content, contentLen, tick): - return - - #说话 - extraValue = 0 - extras = GetTalkExtraValue(curPlayer) - - isChatOK = False - if talkType == ShareDefine.Def_TalkType_FBFaction: - isChatOK = __ChatFBFaction(curPlayer, talkType, content, extraValue, extras) + # 仙盟聊天存FamilyAction + if channelType == IPY_GameWorld.tcFamily: + familyActonMgr = DBDataMgr.GetFamilyActionMgr().GetFamilyAction(familyID, ShareDefine.Def_ActionType_TalkCache) + actionData = familyActonMgr.AddAction(maxCount) + actionData.SetValue1(playerID) + actionData.SetValue2(bubbleBox) + actionData.GetUserDict().update({"content":content}) - if not isChatOK: - return - - #设置当前时间为玩家开始聊天时间 - curPlayer.SetLastChatTick(tick) - #设置当前聊天内容为玩家本次聊天内容 - curPlayer.SetLastChatContent(content) - - return True + else: + recTypeIDMgr = DBDataMgr.GetGameRecMgr().GetRecTypeIDMgr(ShareDefine.Def_GameRecType_TalkCache, channelType) + recData = recTypeIDMgr.AddRecData(maxCount) + recData.SetValue1(playerID) + recData.SetValue2(bubbleBox) + recData.GetUserDict().update({"content":content}) + + return -## py自定义聊天推送包 -def __GetPyTalkPack(curPlayer, talkType, content, extraValue, extras): - pyTalk = ChPyNetSendPack.tagMCPyTalk() - pyTalk.Clear() - pyTalk.TalkType = talkType - pyTalk.Name = curPlayer.GetPlayerName() - pyTalk.NameLen = len(pyTalk.Name) - pyTalk.PlayerID = curPlayer.GetPlayerID() - pyTalk.Len = len(content) - pyTalk.Content = content - pyTalk.ExtraValue = extraValue - pyTalk.Extras = extras - return pyTalk - -## 副本阵营聊天 -def __ChatFBFaction(curPlayer, talkType, content, extraValue, extras): - curFaction = curPlayer.GetFaction() - if not curFaction: - return False +def NotifyTalkCache(curPlayer): + ##上线通知聊天缓存 - pyTalkPack = __GetPyTalkPack(curPlayer, talkType, content, extraValue, extras) - - playerManager = GameWorld.GetMapCopyPlayerManager() - for index in range(playerManager.GetPlayerCount()): - player = playerManager.GetPlayerByIndex(index) - if not player: + for channelType in ChannelCacheMax.keys(): + cacheList = [] + if channelType == IPY_GameWorld.tcFamily: + familyID = curPlayer.GetFamilyID() + if not familyID: + continue + familyActonMgr = DBDataMgr.GetFamilyActionMgr().GetFamilyAction(familyID, ShareDefine.Def_ActionType_TalkCache) + for index in range(familyActonMgr.Count()): + actionData = familyActonMgr.At(index) + talkTime = actionData.GetTime() + playerID = actionData.GetValue1() + bubbleBox = actionData.GetValue2() + content = actionData.GetUserDict().get("content", "") + if not content: + content + cacheList.append([talkTime, playerID, bubbleBox, content]) + else: + recTypeIDMgr = DBDataMgr.GetGameRecMgr().GetRecTypeIDMgr(ShareDefine.Def_GameRecType_TalkCache, channelType) + for index in range(recTypeIDMgr.GetCount()): + recData = recTypeIDMgr.At(index) + talkTime = recData.GetTime() + playerID = recData.GetValue1() + bubbleBox = recData.GetValue2() + content = recData.GetUserDict().get("content", "") + if not content: + content + cacheList.append([talkTime, playerID, bubbleBox, content]) + + if not cacheList: continue - if player.GetFaction() != curFaction: + packCacheList = [] + for talkTime, playerID, bubbleBox, content in cacheList: + viewCache = PlayerViewCache.FindViewCache(playerID) + if not viewCache: + continue + talkCache = ChPyNetSendPack.tagMCTalkCacheInfo() + talkCache.PlayerID = playerID + talkCache.Name = viewCache.GetPlayerName() + talkCache.NameLen = len(talkCache.Name) + talkCache.Content = content + talkCache.Len = len(talkCache.Content) + talkCache.BubbleBox = bubbleBox + talkCache.LV = viewCache.GetLV() + talkCache.Job = viewCache.GetJob() + talkCache.RealmLV = viewCache.GetRealmLV() + talkCache.Face = viewCache.GetFace() + talkCache.FacePic = viewCache.GetFacePic() + talkCache.ServerID = viewCache.GetServerID() + talkCache.TalkTime = talkTime + packCacheList.append(talkCache) + + if not packCacheList: continue - if PlayerTJG.GetIsTJG(player): - continue + clientPack = ChPyNetSendPack.tagMCTalkCacheList() + clientPack.ChannelType = channelType + clientPack.InfoList = packCacheList + clientPack.Count = len(clientPack.InfoList) + NetPackCommon.SendFakePack(curPlayer, clientPack) - NetPackCommon.SendFakePack(player, pyTalkPack) - - return True - - -#=============================================================================== -# //A2 26 语音聊天 #tagCMVoiceChat -# -# struct tagCMVoiceChat -# { -# tagHead Head; -# BYTE ChannelType; // 5 区域 --- 查看封包tagCGVoiceChat 1 世界 2 仙盟 3 私聊(好友) 4 队伍 -# BYTE TargetNameLen; -# char TargetName[TargetNameLen]; //size = TargetNameLen -# DWORD TargetID; // 默认发玩家ID,没有ID才发名称 -# WORD Len; -# BYTE Content[Len]; //size = Len -# }; -#=============================================================================== -def OnVoiceChat(index, clientPack, tick): -# curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) -# if GetGMToolForbidTalk(curPlayer): -# return -# if clientPack.ChannelType != ShareDefine.Def_ChannelChat_Area: -# 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) -# -# # 区域频道 -# -# #如果在普通地图, 就广播, 如果在副本就单个通知 -# if GameWorld.GetMap().GetMapFBType() == IPY_GameWorld.fbtNull: -# curPlayer.BroadCastAll(sendPack.GetBuffer(), len(sendPack.GetBuffer())) -# else: -# playerManager = GameWorld.GetMapCopyPlayerManager() -# -# for index in range(0 , playerManager.GetPlayerCount()): -# #广播玩家 -# tempPlayer = playerManager.GetPlayerByIndex(index) -# if not tempPlayer.GetPlayerID(): -# continue -# -# if PlayerTJG.GetIsTJG(tempPlayer): -# continue -# -# NetPackCommon.SendFakePack(tempPlayer, sendPack) return - -- Gitblit v1.8.0