From 0684a9b035835b1e97e7ebc2ff9b949e72181e8c Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 21 一月 2025 14:15:18 +0800
Subject: [PATCH] 10263 【越南】【英文】【BT】【砍树】后端支持NPC仿真实玩家战斗和快速战斗(优化镜像玩家移动)
---
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py | 139 ++++++++++++++++++++++++++++++++++++++--------
1 files changed, 115 insertions(+), 24 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py
index a3dfaf7..c1f7cf3 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py
@@ -18,8 +18,6 @@
import PyDataManager
import ChConfig
import EventReport
-import ChPyNetSendPack
-import NetPackCommon
import PlayerFamilyParty
import ChPyNetSendPack
import ShareDefine
@@ -28,8 +26,12 @@
import CrossRealmMsg
import ChNetSendPack
import NetPackCommon
-import PlayerGeTui
+import PyGameData
+
import re
+import time
+import IpyGameDataPY
+
g_ChatMi = {} # 离线聊天记录 {玩家ID:[信息]} 一个玩家最多8条
@@ -88,7 +90,7 @@
curCache = None
tagPlayerName = ""
if tagPlayer == None:
- curCache = PlayerViewCache.ViewCacheMgr.FindCache(tagPlayerID)
+ curCache = PlayerViewCache.FindViewCache(tagPlayerID)
if not curCache:
PlayerControl.NotifyCode(curPlayer, "CanootTalk10")
return
@@ -100,7 +102,7 @@
return
if curCache:
- cacheDict = eval(curCache.GetPropData())
+ cacheDict = PlayerViewCache.GetCachePropDataDict(curCache)
tagPlayerName = cacheDict["Name"]
talkType = sendPack.GetTalkType()
@@ -143,8 +145,6 @@
if len(g_ChatMi[tagPlayerID]) > 8:
g_ChatMi[tagPlayerID].pop(0)
return
-
- PlayerGeTui.ChatMiGeTui(tagPlayerID, tagPlayerName, curPlayer.GetName())
# 登录时将离线消息下发
def LoginChatMi(curPlayer):
@@ -175,18 +175,27 @@
content = sendPack.GetContent()
extraValue = sendPack.GetExtraValue()
extras = sendPack.GetExtras()
+ crossPlayerName = CrossRealmPlayer.GetCrossPlayerName(curPlayer)
## 发送到跨服服务器,直接使用跨服boss的分区配置
- dataMsg = {"PlayerID":playerID, "Content":content, "ExtraValue":extraValue, "Extras":extras}
+ dataMsg = {"PlayerID":playerID, "Name":crossPlayerName, "Content":content, "ExtraValue":extraValue, "Extras":extras}
CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_ChatCrossWorld, dataMsg)
return
def ClientServerMsg_ChatCrossWorld(serverGroupID, msgData, tick):
## 收到子服跨服世界频道聊天
- zoneIpyData = CrossRealmPlayer.GetServerCrossZoneIpyData(ChConfig.Def_FBMapID_CrossPenglai, serverGroupID)
- if not zoneIpyData:
- return
- serverGroupIDList = zoneIpyData.GetServerGroupIDList()
+ 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
@@ -194,22 +203,16 @@
## 收到跨服世界频道聊天
playerID = msgData["PlayerID"]
+ crossPlayerName = msgData["Name"]
content = msgData["Content"]
extraValue = msgData["ExtraValue"]
extras = msgData["Extras"]
- curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
- if curPlayer:
- PlayerChatCountry(curPlayer, content, extraValue, extras)
- #curPlayer.ChatCountry(content, extraValue, extras)
- return
-
-def PlayerChatCountry(curPlayer, content, extraValue, extras):
sendPack = ChNetSendPack.tagTalkCountry()
sendPack.Clear()
- sendPack.Name = CrossRealmPlayer.GetCrossPlayerName(curPlayer)
+ sendPack.Name = crossPlayerName
sendPack.NameLen = len(sendPack.Name)
- sendPack.PlayerID = curPlayer.GetPlayerID()
+ sendPack.PlayerID = playerID
sendPack.Content = content
sendPack.Len = len(sendPack.Content)
sendPack.ExtraValue = extraValue
@@ -224,7 +227,7 @@
if PlayerControl.GetIsTJG(player):
continue
NetPackCommon.SendFakePack(player, sendPack)
-
+ #curPlayer.ChatCountry(content, extraValue, extras)
return
## 公频(封包参数)
@@ -239,7 +242,8 @@
extraValue = sendPack.GetExtraValue()
extras = sendPack.GetExtras()
curPlayer.ChatGong(content, extraValue, extras)
-
+ #缓存
+ DoTalkCache(0, curPlayer.GetName(), curPlayer.GetPlayerID(), content, extras)
return
@@ -277,6 +281,8 @@
curPlayer.ChatFamily(content, extraValue, extras)
#仙盟宴会答题
PlayerFamilyParty.OnTalkFamily(curPlayer, content, tick)
+ #缓存
+ DoTalkCache(curPlayer.GetFamilyID(), curPlayer.GetName(), curPlayer.GetPlayerID(), content, extras)
return
@@ -436,7 +442,8 @@
vipLv = player.GetVIPLv() # 玩家vip等级
GMLevel = player.GetGMLevel()
job = player.GetJob()
-
+ playerID = player.GetID()
+
extraValueStr = ""
# vip等级
extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_VipLv)%vipLv
@@ -450,6 +457,16 @@
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
+ face = player.GetFace()
+ facePic = player.GetFacePic()
+ extraValueStr = "%s|%s|%s|%s|%s|%s" % (extraValueStr, coupleName, coupleJob, bridePriceMaxID, face, facePic)
return extraValueStr
@@ -474,3 +491,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