#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package Player.PlayerTalk
|
#
|
# @todo:ÁÄÌì
|
# @author hxp
|
# @date 2025-05-23
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: ÁÄÌì
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2025-05-23 20:00"""
|
#-------------------------------------------------------------------------------
|
|
import ChConfig
|
import GameWorld
|
import ShareDefine
|
import IPY_GameWorld
|
import ChPyNetSendPack
|
import CrossRealmPlayer
|
import PlayerViewCache
|
import NetPackCommon
|
import IpyGameDataPY
|
import PlayerControl
|
import PlayerFamily
|
import DBDataMgr
|
|
import math
|
|
#ÐèÒª¼Ç¼ÁÄÌ컺´æµÄƵµÀ¶ÔÓ¦ÏÞÖÆ×î´óÌõÊý
|
ChannelCacheMax = {IPY_GameWorld.tcFamily:30,
|
IPY_GameWorld.tcWorld:100,
|
}
|
|
def OnPlayerLogin(curPlayer):
|
NotifyTalkCache(curPlayer)
|
return
|
|
#// 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
|
|
#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
|
|
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
|
|
def __CheckTalk(curPlayer, channelType, content, tick, checkGMForbidenTalk=True):
|
## ÁÄÌìͨÓüì²é
|
if checkGMForbidenTalk and GetGMToolForbidTalk(curPlayer):
|
#GeRen_chenxin_921745 ¶Ô²»Æð£¬ÄúÒѱ»GM½ûÑÔ£¬·¢ËÍÐÅϢʧ°Ü
|
#PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_921745")
|
return False
|
|
#¼ä¸ôʱ¼ä
|
if tick - curPlayer.GetLastChatTick() < ChConfig.Def_PlayerTalkTick:
|
#PlayerControl.NotifyCode(curPlayer, "CanootTalk02")
|
return False
|
|
#ƵµÀ¸÷×Ô¼ä¸ôʱ¼ä
|
if channelType != None:
|
talkCDDict = IpyGameDataPY.GetFuncEvalCfg("TalkCD", 1, {})
|
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))])
|
return False
|
|
#ÁÄÌìÐÅϢ̫³¤
|
if len(content) > ChConfig.Def_PlayerTalkMaxCount:
|
PlayerControl.NotifyCode(curPlayer, "CanootTalk13")
|
return False
|
|
#²»ÄÜÖ»·¢¿Õ¸ñ
|
if content.strip() == '':
|
PlayerControl.NotifyCode(curPlayer, "CanootTalk14")
|
return False
|
|
return True
|
|
def GetGMToolForbidTalk(curPlayer):
|
## »ñµÃÍæ¼ÒÊÇ·ñ±»½ûÑÔ
|
#accIDForbid = (curPlayer.GetAccState() & pow(2, ChConfig.Def_PysForbidTalk)) > 0
|
return curPlayer.GetGMForbidenTalk()# or accIDForbid
|
|
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))
|
|
# ÏÉÃËÁÄÌì´æ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})
|
|
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
|
|
def NotifyTalkCache(curPlayer):
|
##ÉÏÏß֪ͨÁÄÌ컺´æ
|
|
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
|
|
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
|
|
clientPack = ChPyNetSendPack.tagMCTalkCacheList()
|
clientPack.ChannelType = channelType
|
clientPack.InfoList = packCacheList
|
clientPack.Count = len(clientPack.InfoList)
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
|
return
|