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/GM/Commands/CreateFamily.py | 3
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Collections/CollectionDefine.py | 2
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script.ini | 40
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py | 3
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBGameRec.py | 383 +++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py | 416 +-----
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py | 848 ++++++------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py | 2
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFamily.py | 12
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_PlayerMirror.py | 43
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PlayerMirror.py | 5
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py | 2
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py | 10
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBPlayerViewCache.py | 176 --
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py | 18
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTalk.py | 716 ++--------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/MirrorAttack.py | 8
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py | 53
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCache.py | 298 ++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBHelpBattle.py | 5
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/LogicProcess/UserCtrlDB.py | 34
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBDataMgr.py | 9
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NetPackCommon.py | 13
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Collections/DataServerPlayerData.py | 218 +++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py | 4
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTJG.py | 4
/dev/null | 493 -------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini | 31
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py | 1
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py | 3
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py | 2
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBStruct.py | 133 +
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 44
33 files changed, 1,855 insertions(+), 2,177 deletions(-)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
index 1ed0e32..4c272c7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -960,7 +960,7 @@
;玩家查看数据缓存
[PlayerViewCache]
-ScriptName = Player\PlayerViewCacheTube.py
+ScriptName = Player\PlayerViewCache.py
Writer = xmnathan
Releaser = xmnathan
RegType = 0
@@ -1121,20 +1121,11 @@
Writer = hxp
Releaser = hxp
RegType = 0
-RegisterPackCount = 3
+RegisterPackCount = 1
-PacketCMD_1=0xA2
-PacketSubCMD_1=0x16
-PacketCallFunc_1=OnPyTalk
-
-PacketCMD_2=0xA2
-PacketSubCMD_2=0x17
-PacketCallFunc_2=OnUsePYSpeaker
-
-PacketCMD_3=0xA2
-PacketSubCMD_3=0x26
-PacketCallFunc_3=OnVoiceChat
-
+PacketCMD_1=0xB3
+PacketSubCMD_1=0x20
+PacketCallFunc_1=OnTalk
;属性果实
[PlayerAttrFruit]
@@ -1588,18 +1579,6 @@
PacketCMD_5=0xA5
PacketSubCMD_5=0xC4
PacketCallFunc_5=OnDogzEquipPlus
-
-;个推
-[PlayerGeTui]
-ScriptName = Player\PlayerGeTui.py
-Writer = Alee
-Releaser = Alee
-RegType = 0
-RegisterPackCount = 1
-
-PacketCMD_1=0xB2
-PacketSubCMD_1=0x5
-PacketCallFunc_1=GeTuiSetting
;充值
[PlayerCoin]
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script.ini
index c0d28cd..72366ae 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script.ini
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script.ini
@@ -524,46 +524,6 @@
PacketSubCMD_1=0x3
PacketCallFunc_1=PetStateChange
-
-;聊天
-[Talk]
-ScriptName = Player\PlayerTalk.py
-Writer = Mark
-Releaser = Mark
-RegType = 0
-RegisterPackCount = 7
-
-PacketCMD_1=0x2
-PacketSubCMD_1=0x7
-PacketCallFunc_1=TalkArea
-
-
-PacketCMD_2=0x2
-PacketSubCMD_2=0x3
-PacketCallFunc_2=TalkFamily
-
-PacketCMD_3=0x2
-PacketSubCMD_3=0x5
-PacketCallFunc_3=TalkTeam
-
-
-PacketCMD_4=0x2
-PacketSubCMD_4=0x1
-PacketCallFunc_4=TalkWorld
-
-PacketCMD_5=0x2
-PacketSubCMD_5=0x6
-PacketCallFunc_5=TalkPrivateName
-
-PacketCMD_6=0x2
-PacketSubCMD_6=0x9
-PacketCallFunc_6=TalkPrivate
-
-PacketCMD_7=0x2
-PacketSubCMD_7=0x8
-PacketCallFunc_7=TalkCountry
-
-
;战斗
[Battle]
ScriptName = Player\PlayerBattle.py
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py
index 848d310..e71314d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py
@@ -40,7 +40,6 @@
import ChNetSendPack
import NetPackCommon
import PassiveBuffEffMng
-import PlayerGeTui
import IpyGameDataPY
#---------------------------------------------------------------------
g_skillHurtList = IPY_GameWorld.IPY_HurtList()
@@ -363,7 +362,6 @@
if GameObj.GetHP(defender) <= 0:
defender.SetDict(ChConfig.Def_NPCDead_KillerType, attacker.GetGameObjType())
defender.SetDict(ChConfig.Def_NPCDead_KillerID, attacker.GetID())
- #PlayerGeTui.TJGDead(defender, attacker.GetName())
if defender.GetGameObjType() == IPY_GameWorld.gotNPC:
skillID = 0 if not useSkill else useSkill.GetSkillID()
# 记录死亡原因
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/MirrorAttack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/MirrorAttack.py
index 4430e63..179e455 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/MirrorAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/MirrorAttack.py
@@ -27,7 +27,6 @@
import IPY_GameWorld
import PlayerControl
import OperControlManager
-import PlayerViewCacheTube
import PassiveBuffEffMng
import GameWorldProcess
import ChNetSendPack
@@ -38,7 +37,6 @@
import SkillShell
import CommFunc
import FBCommon
-import PlayerFB
import GameMap
import FBLogic
import GameObj
@@ -449,7 +447,7 @@
#};
def OnSycnPlayerPackData(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
- PlayerViewCacheTube.UpdateGameServerPlayerCache(curPlayer, tick, forcePackData=True)
+ #PlayerViewCacheTube.UpdateGameServerPlayerCache(curPlayer, tick, forcePackData=True)
return
#// B4 11 镜像战斗 #tagCMMirrorFight
@@ -562,8 +560,8 @@
return True
# 玩家自身需要用镜像的情况
- if isSysbg and playerID and playerID in mirrorIDList:
- PlayerViewCacheTube.NormalSyncPackData(curPlayer)
+ #if isSysbg and playerID and playerID in mirrorIDList:
+ # PlayerViewCacheTube.NormalSyncPackData(curPlayer)
sendMsg = str(sendMsg)
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "ReuestPlayerPackData", sendMsg, len(sendMsg))
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 0e29885..8272077 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -2170,34 +2170,9 @@
Def_NPCErrorMaxDist = 99999
#玩家聊天-------------------------------------------
-#聊天通用间隔时间
-Def_PlayerTalkTick = 1000
-#玩家聊天频道最大个数
-Def_PlayerTalkChannelMaxCount = 10
-#玩家聊天,单句最大字节数
-Def_PlayerTalkMaxCount = 8000 #原来为100
-#轻频频道
-#轻频频道相同内容允许时间(10秒2次)
-Def_PlayerTalkQingTime = 5000
-#区域频道
-#区域聊天频道时间间隔(1秒)
-Def_PlayerTalkAreaTime = 1000 #原来为180000 目前测试
-#区域聊天频道等级限制
-Def_PlayerTalkAreaLV = 1
-#国家频道
-#国家聊天频道时间间隔(10秒)
-Def_PlayerTalkCountryTime = 10000 #文档中为18000
-#国家聊天频道等级限制
-Def_PlayerTalkCountryLV = 41
-#国家频道聊天花费
-Def_PlayerTalkCoutryMoney = 10
-#世界频道
-#世界频道聊天花费(银子或银票)
-Def_PlayerTalkWorldMoney = 1000
-#世界聊天时间间隔(1秒)
-Def_PlayerTalkWorldTime = 1000
-#不可以轻频聊天的地图
-CanNotQingTalkMapIDList = []
+Def_PlayerTalkTick = 1000 #聊天通用间隔时间
+Def_PlayerTalkMaxCount = 8000 #玩家聊天,单句最大字节数
+Def_ChannelTalkTick = "ChannelTalkTick_%s" # 聊天频道玩家最近一次聊天tick
###################################################
#类型定义, 以下内容不要修改
@@ -2713,19 +2688,6 @@
) = range(0, Def_QueryType_Count)
#------------------------------------------------------------------------------
-#家族某行为类型保存的条数
-ActionTypeSaveCnt = {
- ShareDefine.Def_ActionType_FamilyPray:10 , #家族祈福
- ShareDefine.Def_ActionType_FamilyArrest:7, #家族悬赏
- ShareDefine.Def_ActionType_FamilyMember:1, #记录家族成员信息
- ShareDefine.Def_ActionType_LeaderImpeachTime:1, # 族长下线了多久
- ShareDefine.Def_ActionType_FamilyBossFB:1, # 记录家族boss副本信息
- ShareDefine.Def_ActionType_FamilyStore:30, #仓库操作记录
- ShareDefine.Def_ActionType_OfficerModelEquip:10, # 记录家族有职位的成员模型装备信息(盟主+副盟主*2+战斗队长*5)
- ShareDefine.Def_ActionType_FamilyEvent:50, # 记录家族事件
- }
-
-#---------------------------------------------------------------------
#数值上限 2^31 - 1
Def_UpperLimit_DWordEx = ShareDefine.Def_UpperLimit_DWordEx
#数值上限(20亿)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index 4d586a9..09a8e73 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -3145,101 +3145,6 @@
#------------------------------------------------------
-#B3 07 语音聊天 #tagCGVoiceChat
-
-class tagCGVoiceChat(Structure):
- Head = tagHead()
- ChannelType = 0 #(BYTE ChannelType)// 1 世界 2 仙盟 3 私聊(好友) 4 队伍 -------查看封包tagCMVoiceChat 5 区域
- TargetNameLen = 0 #(BYTE TargetNameLen)
- TargetName = "" #(String TargetName)//size = TargetNameLen
- TargetID = 0 #(DWORD TargetID)// 默认发玩家ID,没有ID才发名称
- Len = 0 #(WORD Len)
- Content = list() #(vector<BYTE> Content)//size = Len
- data = None
-
- def __init__(self):
- self.Clear()
- self.Head.Cmd = 0xB3
- self.Head.SubCmd = 0x07
- return
-
- def ReadData(self, _lpData, _pos=0, _Len=0):
- self.Clear()
- _pos = self.Head.ReadData(_lpData, _pos)
- self.ChannelType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- self.TargetNameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- self.TargetName,_pos = CommFunc.ReadString(_lpData, _pos,self.TargetNameLen)
- self.TargetID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
- self.Len,_pos = CommFunc.ReadWORD(_lpData, _pos)
- for i in range(self.Len):
- value,_pos=CommFunc.ReadBYTE(_lpData,_pos)
- self.Content.append(value)
- return _pos
-
- def Clear(self):
- self.Head = tagHead()
- self.Head.Clear()
- self.Head.Cmd = 0xB3
- self.Head.SubCmd = 0x07
- self.ChannelType = 0
- self.TargetNameLen = 0
- self.TargetName = ""
- self.TargetID = 0
- self.Len = 0
- self.Content = list()
- return
-
- def GetLength(self):
- length = 0
- length += self.Head.GetLength()
- length += 1
- length += 1
- length += len(self.TargetName)
- length += 4
- length += 2
- length += 1 * self.Len
-
- return length
-
- def GetBuffer(self):
- data = ''
- data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
- data = CommFunc.WriteBYTE(data, self.ChannelType)
- data = CommFunc.WriteBYTE(data, self.TargetNameLen)
- data = CommFunc.WriteString(data, self.TargetNameLen, self.TargetName)
- data = CommFunc.WriteDWORD(data, self.TargetID)
- data = CommFunc.WriteWORD(data, self.Len)
- for i in range(self.Len):
- data = CommFunc.WriteBYTE(data, self.Content[i])
- return data
-
- def OutputString(self):
- DumpString = '''
- Head:%s,
- ChannelType:%d,
- TargetNameLen:%d,
- TargetName:%s,
- TargetID:%d,
- Len:%d,
- Content:%s
- '''\
- %(
- self.Head.OutputString(),
- self.ChannelType,
- self.TargetNameLen,
- self.TargetName,
- self.TargetID,
- self.Len,
- "..."
- )
- return DumpString
-
-
-m_NAtagCGVoiceChat=tagCGVoiceChat()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGVoiceChat.Head.Cmd,m_NAtagCGVoiceChat.Head.SubCmd))] = m_NAtagCGVoiceChat
-
-
-#------------------------------------------------------
#B3 03 是否允许加入好友的回应#tagCGJoinFriendAnswer
class tagCGJoinFriendAnswer(Structure):
@@ -6241,7 +6146,7 @@
("GroupValue2", c_int), #分组值2,与分组值1组合归为同组榜单数据
("StartIndex", c_ushort), #查看的起始名次索引, 默认0
("ViewCnt", c_ubyte), #查看条数,默认20,单次最大不超过100
- ("ViewID", c_int), #附带查看指定ID所在名次前后数据,如玩家ID、家族ID等,仅首页查询时有效,即StartIndex为0时
+ ("ViewID", c_int), #附带查看指定ID所在名次前后数据,如玩家ID、家族ID等
]
def __init__(self):
@@ -7124,162 +7029,6 @@
#------------------------------------------------------
-# A2 17 喇叭聊天 #tagCMPYSpeaker
-
-class tagCMPYSpeaker(Structure):
- Head = tagHead()
- SpeakerType = 0 #(BYTE SpeakerType)//1-本服;2-跨服
- IsUseGold = 0 #(BYTE IsUseGold)//是否使用钻石
- ItemIndex = 0 #(BYTE ItemIndex)//使用物品说话时, 物品Index
- TextLen = 0 #(WORD TextLen)//字符长度
- Text = "" #(String Text)//size = TextLen
- data = None
-
- def __init__(self):
- self.Clear()
- self.Head.Cmd = 0xA2
- self.Head.SubCmd = 0x17
- return
-
- def ReadData(self, _lpData, _pos=0, _Len=0):
- self.Clear()
- _pos = self.Head.ReadData(_lpData, _pos)
- self.SpeakerType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- self.IsUseGold,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- self.ItemIndex,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- self.TextLen,_pos = CommFunc.ReadWORD(_lpData, _pos)
- self.Text,_pos = CommFunc.ReadString(_lpData, _pos,self.TextLen)
- return _pos
-
- def Clear(self):
- self.Head = tagHead()
- self.Head.Clear()
- self.Head.Cmd = 0xA2
- self.Head.SubCmd = 0x17
- self.SpeakerType = 0
- self.IsUseGold = 0
- self.ItemIndex = 0
- self.TextLen = 0
- self.Text = ""
- return
-
- def GetLength(self):
- length = 0
- length += self.Head.GetLength()
- length += 1
- length += 1
- length += 1
- length += 2
- length += len(self.Text)
-
- return length
-
- def GetBuffer(self):
- data = ''
- data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
- data = CommFunc.WriteBYTE(data, self.SpeakerType)
- data = CommFunc.WriteBYTE(data, self.IsUseGold)
- data = CommFunc.WriteBYTE(data, self.ItemIndex)
- data = CommFunc.WriteWORD(data, self.TextLen)
- data = CommFunc.WriteString(data, self.TextLen, self.Text)
- return data
-
- def OutputString(self):
- DumpString = '''
- Head:%s,
- SpeakerType:%d,
- IsUseGold:%d,
- ItemIndex:%d,
- TextLen:%d,
- Text:%s
- '''\
- %(
- self.Head.OutputString(),
- self.SpeakerType,
- self.IsUseGold,
- self.ItemIndex,
- self.TextLen,
- self.Text
- )
- return DumpString
-
-
-m_NAtagCMPYSpeaker=tagCMPYSpeaker()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMPYSpeaker.Head.Cmd,m_NAtagCMPYSpeaker.Head.SubCmd))] = m_NAtagCMPYSpeaker
-
-
-#------------------------------------------------------
-# A2 16 自定义玩家聊天 #tagCMPyTalk
-
-class tagCMPyTalk(Structure):
- Head = tagHead()
- TalkType = 0 #(BYTE TalkType)// 自定义聊天类型
- Len = 0 #(WORD Len)
- Content = "" #(String Content)//size = Len
- data = None
-
- def __init__(self):
- self.Clear()
- self.Head.Cmd = 0xA2
- self.Head.SubCmd = 0x16
- return
-
- def ReadData(self, _lpData, _pos=0, _Len=0):
- self.Clear()
- _pos = self.Head.ReadData(_lpData, _pos)
- self.TalkType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- self.Len,_pos = CommFunc.ReadWORD(_lpData, _pos)
- self.Content,_pos = CommFunc.ReadString(_lpData, _pos,self.Len)
- return _pos
-
- def Clear(self):
- self.Head = tagHead()
- self.Head.Clear()
- self.Head.Cmd = 0xA2
- self.Head.SubCmd = 0x16
- self.TalkType = 0
- self.Len = 0
- self.Content = ""
- return
-
- def GetLength(self):
- length = 0
- length += self.Head.GetLength()
- length += 1
- length += 2
- length += len(self.Content)
-
- return length
-
- def GetBuffer(self):
- data = ''
- data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
- data = CommFunc.WriteBYTE(data, self.TalkType)
- data = CommFunc.WriteWORD(data, self.Len)
- data = CommFunc.WriteString(data, self.Len, self.Content)
- return data
-
- def OutputString(self):
- DumpString = '''
- Head:%s,
- TalkType:%d,
- Len:%d,
- Content:%s
- '''\
- %(
- self.Head.OutputString(),
- self.TalkType,
- self.Len,
- self.Content
- )
- return DumpString
-
-
-m_NAtagCMPyTalk=tagCMPyTalk()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMPyTalk.Head.Cmd,m_NAtagCMPyTalk.Head.SubCmd))] = m_NAtagCMPyTalk
-
-
-#------------------------------------------------------
#A2 11 查询世界Boss伤血列表 #tagCMQueryBossHurtList
class tagCMQueryBossHurtList(Structure):
@@ -8123,101 +7872,6 @@
m_NAtagCMClientTaskCount=tagCMClientTaskCount()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMClientTaskCount.Cmd,m_NAtagCMClientTaskCount.SubCmd))] = m_NAtagCMClientTaskCount
-
-
-#------------------------------------------------------
-#A2 26 语音聊天 #tagCMVoiceChat
-
-class tagCMVoiceChat(Structure):
- Head = tagHead()
- ChannelType = 0 #(BYTE ChannelType)// 5 区域 --- 查看封包tagCGVoiceChat 1 世界 2 仙盟 3 私聊(好友) 4 队伍
- TargetNameLen = 0 #(BYTE TargetNameLen)
- TargetName = "" #(String TargetName)//size = TargetNameLen
- TargetID = 0 #(DWORD TargetID)// 私聊默认发玩家ID,没有ID才发名称
- Len = 0 #(WORD Len)
- Content = list() #(vector<BYTE> Content)//size = Len
- data = None
-
- def __init__(self):
- self.Clear()
- self.Head.Cmd = 0xA2
- self.Head.SubCmd = 0x26
- return
-
- def ReadData(self, _lpData, _pos=0, _Len=0):
- self.Clear()
- _pos = self.Head.ReadData(_lpData, _pos)
- self.ChannelType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- self.TargetNameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- self.TargetName,_pos = CommFunc.ReadString(_lpData, _pos,self.TargetNameLen)
- self.TargetID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
- self.Len,_pos = CommFunc.ReadWORD(_lpData, _pos)
- for i in range(self.Len):
- value,_pos=CommFunc.ReadBYTE(_lpData,_pos)
- self.Content.append(value)
- return _pos
-
- def Clear(self):
- self.Head = tagHead()
- self.Head.Clear()
- self.Head.Cmd = 0xA2
- self.Head.SubCmd = 0x26
- self.ChannelType = 0
- self.TargetNameLen = 0
- self.TargetName = ""
- self.TargetID = 0
- self.Len = 0
- self.Content = list()
- return
-
- def GetLength(self):
- length = 0
- length += self.Head.GetLength()
- length += 1
- length += 1
- length += len(self.TargetName)
- length += 4
- length += 2
- length += 1 * self.Len
-
- return length
-
- def GetBuffer(self):
- data = ''
- data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
- data = CommFunc.WriteBYTE(data, self.ChannelType)
- data = CommFunc.WriteBYTE(data, self.TargetNameLen)
- data = CommFunc.WriteString(data, self.TargetNameLen, self.TargetName)
- data = CommFunc.WriteDWORD(data, self.TargetID)
- data = CommFunc.WriteWORD(data, self.Len)
- for i in range(self.Len):
- data = CommFunc.WriteBYTE(data, self.Content[i])
- return data
-
- def OutputString(self):
- DumpString = '''
- Head:%s,
- ChannelType:%d,
- TargetNameLen:%d,
- TargetName:%s,
- TargetID:%d,
- Len:%d,
- Content:%s
- '''\
- %(
- self.Head.OutputString(),
- self.ChannelType,
- self.TargetNameLen,
- self.TargetName,
- self.TargetID,
- self.Len,
- "..."
- )
- return DumpString
-
-
-m_NAtagCMVoiceChat=tagCMVoiceChat()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMVoiceChat.Head.Cmd,m_NAtagCMVoiceChat.Head.SubCmd))] = m_NAtagCMVoiceChat
#------------------------------------------------------
@@ -21924,6 +21578,74 @@
#------------------------------------------------------
+# B3 20 聊天 #tagCMTalk
+
+class tagCMPyTalk(Structure):
+ Head = tagHead()
+ ChannelType = 0 #(BYTE ChannelType)// 频道
+ Len = 0 #(WORD Len)
+ Content = "" #(String Content)//size = Len
+ data = None
+
+ def __init__(self):
+ self.Clear()
+ self.Head.Cmd = 0xB3
+ self.Head.SubCmd = 0x20
+ return
+
+ def ReadData(self, _lpData, _pos=0, _Len=0):
+ self.Clear()
+ _pos = self.Head.ReadData(_lpData, _pos)
+ self.ChannelType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.Len,_pos = CommFunc.ReadWORD(_lpData, _pos)
+ self.Content,_pos = CommFunc.ReadString(_lpData, _pos,self.Len)
+ return _pos
+
+ def Clear(self):
+ self.Head = tagHead()
+ self.Head.Clear()
+ self.Head.Cmd = 0xB3
+ self.Head.SubCmd = 0x20
+ self.ChannelType = 0
+ self.Len = 0
+ self.Content = ""
+ return
+
+ def GetLength(self):
+ length = 0
+ length += self.Head.GetLength()
+ length += 1
+ length += 2
+ length += len(self.Content)
+
+ return length
+
+ def GetBuffer(self):
+ data = ''
+ data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+ data = CommFunc.WriteBYTE(data, self.ChannelType)
+ data = CommFunc.WriteWORD(data, self.Len)
+ data = CommFunc.WriteString(data, self.Len, self.Content)
+ return data
+
+ def OutputString(self):
+ DumpString = '''
+ Head:%s,
+ ChannelType:%d,
+ Len:%d,
+ Content:%s
+ '''\
+ %(
+ self.Head.OutputString(),
+ self.ChannelType,
+ self.Len,
+ self.Content
+ )
+ return DumpString
+
+
+
+#------------------------------------------------------
# B4 11 镜像战斗 #tagCMMirrorFight
class tagCMMirrorFight(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 3cfdf96..cabf022 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -11547,292 +11547,6 @@
#------------------------------------------------------
-#B3 10 语音聊天 #tagGCVoiceChat
-
-class tagGCVoiceChat(Structure):
- Head = tagHead()
- ChannelType = 0 #(BYTE ChannelType)// 1 世界 2 仙盟 3 私聊(好友) 4 队伍 5 区域
- SrcNameLen = 0 #(BYTE SrcNameLen)
- SrcName = "" #(String SrcName)//size = SrcNameLen
- PlayerID = 0 #(DWORD PlayerID)
- ToNameLen = 0 #(BYTE ToNameLen)
- ToName = "" #(String ToName)//size = ToNameLen
- ToPlayerID = 0 #(DWORD ToPlayerID)
- Len = 0 #(WORD Len)
- Content = list() #(vector<BYTE> Content)//size = Len
- ExtraValue = 0 #(DWORD ExtraValue)//附加值
- Extras = "" #(char Extras[256])//附加值列表
- data = None
-
- def __init__(self):
- self.Clear()
- self.Head.Cmd = 0xB3
- self.Head.SubCmd = 0x10
- return
-
- def ReadData(self, _lpData, _pos=0, _Len=0):
- self.Clear()
- _pos = self.Head.ReadData(_lpData, _pos)
- self.ChannelType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- self.SrcNameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- self.SrcName,_pos = CommFunc.ReadString(_lpData, _pos,self.SrcNameLen)
- self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
- self.ToNameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- self.ToName,_pos = CommFunc.ReadString(_lpData, _pos,self.ToNameLen)
- self.ToPlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
- self.Len,_pos = CommFunc.ReadWORD(_lpData, _pos)
- for i in range(self.Len):
- value,_pos=CommFunc.ReadBYTE(_lpData,_pos)
- self.Content.append(value)
- self.ExtraValue,_pos = CommFunc.ReadDWORD(_lpData, _pos)
- self.Extras,_pos = CommFunc.ReadString(_lpData, _pos,256)
- return _pos
-
- def Clear(self):
- self.Head = tagHead()
- self.Head.Clear()
- self.Head.Cmd = 0xB3
- self.Head.SubCmd = 0x10
- self.ChannelType = 0
- self.SrcNameLen = 0
- self.SrcName = ""
- self.PlayerID = 0
- self.ToNameLen = 0
- self.ToName = ""
- self.ToPlayerID = 0
- self.Len = 0
- self.Content = list()
- self.ExtraValue = 0
- self.Extras = ""
- return
-
- def GetLength(self):
- length = 0
- length += self.Head.GetLength()
- length += 1
- length += 1
- length += len(self.SrcName)
- length += 4
- length += 1
- length += len(self.ToName)
- length += 4
- length += 2
- length += 1 * self.Len
- length += 4
- length += 256
-
- return length
-
- def GetBuffer(self):
- data = ''
- data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
- data = CommFunc.WriteBYTE(data, self.ChannelType)
- data = CommFunc.WriteBYTE(data, self.SrcNameLen)
- data = CommFunc.WriteString(data, self.SrcNameLen, self.SrcName)
- data = CommFunc.WriteDWORD(data, self.PlayerID)
- data = CommFunc.WriteBYTE(data, self.ToNameLen)
- data = CommFunc.WriteString(data, self.ToNameLen, self.ToName)
- data = CommFunc.WriteDWORD(data, self.ToPlayerID)
- data = CommFunc.WriteWORD(data, self.Len)
- for i in range(self.Len):
- data = CommFunc.WriteBYTE(data, self.Content[i])
- data = CommFunc.WriteDWORD(data, self.ExtraValue)
- data = CommFunc.WriteString(data, 256, self.Extras)
- return data
-
- def OutputString(self):
- DumpString = '''
- Head:%s,
- ChannelType:%d,
- SrcNameLen:%d,
- SrcName:%s,
- PlayerID:%d,
- ToNameLen:%d,
- ToName:%s,
- ToPlayerID:%d,
- Len:%d,
- Content:%s,
- ExtraValue:%d,
- Extras:%s
- '''\
- %(
- self.Head.OutputString(),
- self.ChannelType,
- self.SrcNameLen,
- self.SrcName,
- self.PlayerID,
- self.ToNameLen,
- self.ToName,
- self.ToPlayerID,
- self.Len,
- "...",
- self.ExtraValue,
- self.Extras
- )
- return DumpString
-
-
-m_NAtagGCVoiceChat=tagGCVoiceChat()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCVoiceChat.Head.Cmd,m_NAtagGCVoiceChat.Head.SubCmd))] = m_NAtagGCVoiceChat
-
-
-#------------------------------------------------------
-# B3 11 聊天缓存通知 #tagGCTalkCache
-
-class tagGCTalkCacheInfo(Structure):
- ChannelType = 0 #(BYTE ChannelType)// 1 世界 2 仙盟
- NameLen = 0 #(BYTE NameLen)
- Name = "" #(String Name)//size = SrcNameLen
- PlayerID = 0 #(DWORD PlayerID)
- Time = 0 #(DWORD Time)
- Len = 0 #(WORD Len)
- Content = "" #(String Content)//size = Len
- Extras = "" #(char Extras[256])//附加值列表
- data = None
-
- def __init__(self):
- self.Clear()
- return
-
- def ReadData(self, _lpData, _pos=0, _Len=0):
- self.Clear()
- self.ChannelType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- self.Name,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
- self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
- self.Time,_pos = CommFunc.ReadDWORD(_lpData, _pos)
- self.Len,_pos = CommFunc.ReadWORD(_lpData, _pos)
- self.Content,_pos = CommFunc.ReadString(_lpData, _pos,self.Len)
- self.Extras,_pos = CommFunc.ReadString(_lpData, _pos,256)
- return _pos
-
- def Clear(self):
- self.ChannelType = 0
- self.NameLen = 0
- self.Name = ""
- self.PlayerID = 0
- self.Time = 0
- self.Len = 0
- self.Content = ""
- self.Extras = ""
- return
-
- def GetLength(self):
- length = 0
- length += 1
- length += 1
- length += len(self.Name)
- length += 4
- length += 4
- length += 2
- length += len(self.Content)
- length += 256
-
- return length
-
- def GetBuffer(self):
- data = ''
- data = CommFunc.WriteBYTE(data, self.ChannelType)
- data = CommFunc.WriteBYTE(data, self.NameLen)
- data = CommFunc.WriteString(data, self.NameLen, self.Name)
- data = CommFunc.WriteDWORD(data, self.PlayerID)
- data = CommFunc.WriteDWORD(data, self.Time)
- data = CommFunc.WriteWORD(data, self.Len)
- data = CommFunc.WriteString(data, self.Len, self.Content)
- data = CommFunc.WriteString(data, 256, self.Extras)
- return data
-
- def OutputString(self):
- DumpString = '''
- ChannelType:%d,
- NameLen:%d,
- Name:%s,
- PlayerID:%d,
- Time:%d,
- Len:%d,
- Content:%s,
- Extras:%s
- '''\
- %(
- self.ChannelType,
- self.NameLen,
- self.Name,
- self.PlayerID,
- self.Time,
- self.Len,
- self.Content,
- self.Extras
- )
- return DumpString
-
-
-class tagGCTalkCache(Structure):
- Head = tagHead()
- Count = 0 #(WORD Count)
- InfoList = list() #(vector<tagGCTalkCacheInfo> InfoList)//size = Count
- data = None
-
- def __init__(self):
- self.Clear()
- self.Head.Cmd = 0xB3
- self.Head.SubCmd = 0x11
- return
-
- def ReadData(self, _lpData, _pos=0, _Len=0):
- self.Clear()
- _pos = self.Head.ReadData(_lpData, _pos)
- self.Count,_pos = CommFunc.ReadWORD(_lpData, _pos)
- for i in range(self.Count):
- temInfoList = tagGCTalkCacheInfo()
- _pos = temInfoList.ReadData(_lpData, _pos)
- self.InfoList.append(temInfoList)
- return _pos
-
- def Clear(self):
- self.Head = tagHead()
- self.Head.Clear()
- self.Head.Cmd = 0xB3
- self.Head.SubCmd = 0x11
- self.Count = 0
- self.InfoList = list()
- return
-
- def GetLength(self):
- length = 0
- length += self.Head.GetLength()
- length += 2
- for i in range(self.Count):
- length += self.InfoList[i].GetLength()
-
- return length
-
- def GetBuffer(self):
- data = ''
- data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
- data = CommFunc.WriteWORD(data, self.Count)
- for i in range(self.Count):
- data = CommFunc.WriteString(data, self.InfoList[i].GetLength(), self.InfoList[i].GetBuffer())
- return data
-
- def OutputString(self):
- DumpString = '''
- Head:%s,
- Count:%d,
- InfoList:%s
- '''\
- %(
- self.Head.OutputString(),
- self.Count,
- "..."
- )
- return DumpString
-
-
-m_NAtagGCTalkCache=tagGCTalkCache()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCTalkCache.Head.Cmd,m_NAtagGCTalkCache.Head.SubCmd))] = m_NAtagGCTalkCache
-
-
-#------------------------------------------------------
# B5 04 拍卖行新上架拍品 #tagGCAddAuctionItemInfo
class tagGCAddAuctionItem(Structure):
@@ -36251,112 +35965,6 @@
#------------------------------------------------------
-# A7 07 通知玩家自定义聊天 #tagMCPyTalk
-
-class tagMCPyTalk(Structure):
- Head = tagHead()
- TalkType = 0 #(BYTE TalkType)// 自定义聊天类型
- NameLen = 0 #(BYTE NameLen)
- Name = "" #(String Name)//size = NameLen
- PlayerID = 0 #(DWORD PlayerID)
- Len = 0 #(WORD Len)
- Content = "" #(String Content)//size = Len
- ExtraValue = 0 #(DWORD ExtraValue)//附加值
- Extras = "" #(char Extras[256])//附加值列表
- data = None
-
- def __init__(self):
- self.Clear()
- self.Head.Cmd = 0xA7
- self.Head.SubCmd = 0x07
- return
-
- def ReadData(self, _lpData, _pos=0, _Len=0):
- self.Clear()
- _pos = self.Head.ReadData(_lpData, _pos)
- self.TalkType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- self.Name,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
- self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
- self.Len,_pos = CommFunc.ReadWORD(_lpData, _pos)
- self.Content,_pos = CommFunc.ReadString(_lpData, _pos,self.Len)
- self.ExtraValue,_pos = CommFunc.ReadDWORD(_lpData, _pos)
- self.Extras,_pos = CommFunc.ReadString(_lpData, _pos,256)
- return _pos
-
- def Clear(self):
- self.Head = tagHead()
- self.Head.Clear()
- self.Head.Cmd = 0xA7
- self.Head.SubCmd = 0x07
- self.TalkType = 0
- self.NameLen = 0
- self.Name = ""
- self.PlayerID = 0
- self.Len = 0
- self.Content = ""
- self.ExtraValue = 0
- self.Extras = ""
- return
-
- def GetLength(self):
- length = 0
- length += self.Head.GetLength()
- length += 1
- length += 1
- length += len(self.Name)
- length += 4
- length += 2
- length += len(self.Content)
- length += 4
- length += 256
-
- return length
-
- def GetBuffer(self):
- data = ''
- data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
- data = CommFunc.WriteBYTE(data, self.TalkType)
- data = CommFunc.WriteBYTE(data, self.NameLen)
- data = CommFunc.WriteString(data, self.NameLen, self.Name)
- data = CommFunc.WriteDWORD(data, self.PlayerID)
- data = CommFunc.WriteWORD(data, self.Len)
- data = CommFunc.WriteString(data, self.Len, self.Content)
- data = CommFunc.WriteDWORD(data, self.ExtraValue)
- data = CommFunc.WriteString(data, 256, self.Extras)
- return data
-
- def OutputString(self):
- DumpString = '''
- Head:%s,
- TalkType:%d,
- NameLen:%d,
- Name:%s,
- PlayerID:%d,
- Len:%d,
- Content:%s,
- ExtraValue:%d,
- Extras:%s
- '''\
- %(
- self.Head.OutputString(),
- self.TalkType,
- self.NameLen,
- self.Name,
- self.PlayerID,
- self.Len,
- self.Content,
- self.ExtraValue,
- self.Extras
- )
- return DumpString
-
-
-m_NAtagMCPyTalk=tagMCPyTalk()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCPyTalk.Head.Cmd,m_NAtagMCPyTalk.Head.SubCmd))] = m_NAtagMCPyTalk
-
-
-#------------------------------------------------------
# A7 08 通知跑环奖励记录 #tagMCRunTaskAwardInfo
class tagMCRunTaskAwardRecord(Structure):
@@ -36473,11 +36081,20 @@
class tagSCQueryPlayerCacheResult(Structure):
Head = tagHead()
- PlayerID = 0 #(DWORD PlayerID)//玩家ID
- PropDataSize = 0 #(DWORD PropDataSize)
- PropData = "" #(String PropData)//属性记录
- ItemDataSize = 0 #(DWORD ItemDataSize)
- ItemData = "" #(String ItemData)//物品记录
+ PlayerID = 0 #(DWORD PlayerID)
+ PlayerName = "" #(char PlayerName[33])
+ LV = 0 #(WORD LV)
+ Job = 0 #(BYTE Job)
+ RealmLV = 0 #(BYTE RealmLV)
+ Face = 0 #(DWORD Face)
+ FacePic = 0 #(DWORD FacePic)
+ TitleID = 0 #(DWORD TitleID)//佩戴的称号
+ ServerID = 0 #(DWORD ServerID)
+ FightPower = 0 #(DWORD FightPower)
+ FightPowerEx = 0 #(DWORD FightPowerEx)
+ FamilyID = 0 #(DWORD FamilyID)
+ FamilyName = "" #(char FamilyName[33])
+ FamilyEmblemID = 0 #(DWORD FamilyEmblemID)//仙盟徽章ID
PlusDataSize = 0 #(DWORD PlusDataSize)
PlusData = "" #(String PlusData)//扩展记录
data = None
@@ -36492,10 +36109,19 @@
self.Clear()
_pos = self.Head.ReadData(_lpData, _pos)
self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
- self.PropDataSize,_pos = CommFunc.ReadDWORD(_lpData, _pos)
- self.PropData,_pos = CommFunc.ReadString(_lpData, _pos,self.PropDataSize)
- self.ItemDataSize,_pos = CommFunc.ReadDWORD(_lpData, _pos)
- self.ItemData,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize)
+ self.PlayerName,_pos = CommFunc.ReadString(_lpData, _pos,33)
+ self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+ self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.RealmLV,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ self.FacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ self.TitleID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ self.FamilyID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ self.FamilyName,_pos = CommFunc.ReadString(_lpData, _pos,33)
+ self.FamilyEmblemID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
self.PlusDataSize,_pos = CommFunc.ReadDWORD(_lpData, _pos)
self.PlusData,_pos = CommFunc.ReadString(_lpData, _pos,self.PlusDataSize)
return _pos
@@ -36506,10 +36132,19 @@
self.Head.Cmd = 0xA7
self.Head.SubCmd = 0x05
self.PlayerID = 0
- self.PropDataSize = 0
- self.PropData = ""
- self.ItemDataSize = 0
- self.ItemData = ""
+ self.PlayerName = ""
+ self.LV = 0
+ self.Job = 0
+ self.RealmLV = 0
+ self.Face = 0
+ self.FacePic = 0
+ self.TitleID = 0
+ self.ServerID = 0
+ self.FightPower = 0
+ self.FightPowerEx = 0
+ self.FamilyID = 0
+ self.FamilyName = ""
+ self.FamilyEmblemID = 0
self.PlusDataSize = 0
self.PlusData = ""
return
@@ -36518,10 +36153,19 @@
length = 0
length += self.Head.GetLength()
length += 4
+ length += 33
+ length += 2
+ length += 1
+ length += 1
length += 4
- length += len(self.PropData)
length += 4
- length += len(self.ItemData)
+ length += 4
+ length += 4
+ length += 4
+ length += 4
+ length += 4
+ length += 33
+ length += 4
length += 4
length += len(self.PlusData)
@@ -36531,10 +36175,19 @@
data = ''
data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
data = CommFunc.WriteDWORD(data, self.PlayerID)
- data = CommFunc.WriteDWORD(data, self.PropDataSize)
- data = CommFunc.WriteString(data, self.PropDataSize, self.PropData)
- data = CommFunc.WriteDWORD(data, self.ItemDataSize)
- data = CommFunc.WriteString(data, self.ItemDataSize, self.ItemData)
+ data = CommFunc.WriteString(data, 33, self.PlayerName)
+ data = CommFunc.WriteWORD(data, self.LV)
+ data = CommFunc.WriteBYTE(data, self.Job)
+ data = CommFunc.WriteBYTE(data, self.RealmLV)
+ data = CommFunc.WriteDWORD(data, self.Face)
+ data = CommFunc.WriteDWORD(data, self.FacePic)
+ data = CommFunc.WriteDWORD(data, self.TitleID)
+ data = CommFunc.WriteDWORD(data, self.ServerID)
+ data = CommFunc.WriteDWORD(data, self.FightPower)
+ data = CommFunc.WriteDWORD(data, self.FightPowerEx)
+ data = CommFunc.WriteDWORD(data, self.FamilyID)
+ data = CommFunc.WriteString(data, 33, self.FamilyName)
+ data = CommFunc.WriteDWORD(data, self.FamilyEmblemID)
data = CommFunc.WriteDWORD(data, self.PlusDataSize)
data = CommFunc.WriteString(data, self.PlusDataSize, self.PlusData)
return data
@@ -36543,20 +36196,38 @@
DumpString = '''
Head:%s,
PlayerID:%d,
- PropDataSize:%d,
- PropData:%s,
- ItemDataSize:%d,
- ItemData:%s,
+ PlayerName:%s,
+ LV:%d,
+ Job:%d,
+ RealmLV:%d,
+ Face:%d,
+ FacePic:%d,
+ TitleID:%d,
+ ServerID:%d,
+ FightPower:%d,
+ FightPowerEx:%d,
+ FamilyID:%d,
+ FamilyName:%s,
+ FamilyEmblemID:%d,
PlusDataSize:%d,
PlusData:%s
'''\
%(
self.Head.OutputString(),
self.PlayerID,
- self.PropDataSize,
- self.PropData,
- self.ItemDataSize,
- self.ItemData,
+ self.PlayerName,
+ self.LV,
+ self.Job,
+ self.RealmLV,
+ self.Face,
+ self.FacePic,
+ self.TitleID,
+ self.ServerID,
+ self.FightPower,
+ self.FightPowerEx,
+ self.FamilyID,
+ self.FamilyName,
+ self.FamilyEmblemID,
self.PlusDataSize,
self.PlusData
)
@@ -58778,6 +58449,345 @@
#------------------------------------------------------
+# B3 10 聊天信息 #tagMCTalk
+
+class tagMCTalk(Structure):
+ Head = tagHead()
+ ChannelType = 0 #(BYTE ChannelType)// 0-世界;1-跨服;3- 仙盟
+ NameLen = 0 #(BYTE NameLen)
+ Name = "" #(String Name)//size = NameLen
+ PlayerID = 0 #(DWORD PlayerID)
+ Len = 0 #(WORD Len)
+ Content = "" #(String Content)//size = Len
+ BubbleBox = 0 #(DWORD BubbleBox)//聊天气泡框
+ LV = 0 #(WORD LV)//等级
+ Job = 0 #(BYTE Job)//职业
+ RealmLV = 0 #(BYTE RealmLV)//境界
+ Face = 0 #(DWORD Face)//基本脸型
+ FacePic = 0 #(DWORD FacePic)//头像框
+ ServerID = 0 #(DWORD ServerID)//所属区服ID
+ data = None
+
+ def __init__(self):
+ self.Clear()
+ self.Head.Cmd = 0xB3
+ self.Head.SubCmd = 0x10
+ return
+
+ def ReadData(self, _lpData, _pos=0, _Len=0):
+ self.Clear()
+ _pos = self.Head.ReadData(_lpData, _pos)
+ self.ChannelType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.Name,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
+ self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ self.Len,_pos = CommFunc.ReadWORD(_lpData, _pos)
+ self.Content,_pos = CommFunc.ReadString(_lpData, _pos,self.Len)
+ self.BubbleBox,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+ self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.RealmLV,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ self.FacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ return _pos
+
+ def Clear(self):
+ self.Head = tagHead()
+ self.Head.Clear()
+ self.Head.Cmd = 0xB3
+ self.Head.SubCmd = 0x10
+ self.ChannelType = 0
+ self.NameLen = 0
+ self.Name = ""
+ self.PlayerID = 0
+ self.Len = 0
+ self.Content = ""
+ self.BubbleBox = 0
+ self.LV = 0
+ self.Job = 0
+ self.RealmLV = 0
+ self.Face = 0
+ self.FacePic = 0
+ self.ServerID = 0
+ return
+
+ def GetLength(self):
+ length = 0
+ length += self.Head.GetLength()
+ length += 1
+ length += 1
+ length += len(self.Name)
+ length += 4
+ length += 2
+ length += len(self.Content)
+ length += 4
+ length += 2
+ length += 1
+ length += 1
+ length += 4
+ length += 4
+ length += 4
+
+ return length
+
+ def GetBuffer(self):
+ data = ''
+ data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+ data = CommFunc.WriteBYTE(data, self.ChannelType)
+ data = CommFunc.WriteBYTE(data, self.NameLen)
+ data = CommFunc.WriteString(data, self.NameLen, self.Name)
+ data = CommFunc.WriteDWORD(data, self.PlayerID)
+ data = CommFunc.WriteWORD(data, self.Len)
+ data = CommFunc.WriteString(data, self.Len, self.Content)
+ data = CommFunc.WriteDWORD(data, self.BubbleBox)
+ data = CommFunc.WriteWORD(data, self.LV)
+ data = CommFunc.WriteBYTE(data, self.Job)
+ data = CommFunc.WriteBYTE(data, self.RealmLV)
+ data = CommFunc.WriteDWORD(data, self.Face)
+ data = CommFunc.WriteDWORD(data, self.FacePic)
+ data = CommFunc.WriteDWORD(data, self.ServerID)
+ return data
+
+ def OutputString(self):
+ DumpString = '''
+ Head:%s,
+ ChannelType:%d,
+ NameLen:%d,
+ Name:%s,
+ PlayerID:%d,
+ Len:%d,
+ Content:%s,
+ BubbleBox:%d,
+ LV:%d,
+ Job:%d,
+ RealmLV:%d,
+ Face:%d,
+ FacePic:%d,
+ ServerID:%d
+ '''\
+ %(
+ self.Head.OutputString(),
+ self.ChannelType,
+ self.NameLen,
+ self.Name,
+ self.PlayerID,
+ self.Len,
+ self.Content,
+ self.BubbleBox,
+ self.LV,
+ self.Job,
+ self.RealmLV,
+ self.Face,
+ self.FacePic,
+ self.ServerID
+ )
+ return DumpString
+
+
+m_NAtagMCTalk=tagMCTalk()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTalk.Head.Cmd,m_NAtagMCTalk.Head.SubCmd))] = m_NAtagMCTalk
+
+
+#------------------------------------------------------
+# B3 11 聊天缓存通知 #tagMCTalkCacheList
+
+class tagMCTalkCacheInfo(Structure):
+ NameLen = 0 #(BYTE NameLen)
+ Name = "" #(String Name)//size = NameLen
+ PlayerID = 0 #(DWORD PlayerID)
+ Len = 0 #(WORD Len)
+ Content = "" #(String Content)//size = Len
+ BubbleBox = 0 #(DWORD BubbleBox)//聊天气泡框
+ LV = 0 #(WORD LV)//等级
+ Job = 0 #(BYTE Job)//职业
+ RealmLV = 0 #(BYTE RealmLV)//境界
+ Face = 0 #(DWORD Face)//基本脸型
+ FacePic = 0 #(DWORD FacePic)//头像框
+ ServerID = 0 #(DWORD ServerID)//所属区服ID
+ TalkTime = 0 #(DWORD TalkTime)//该聊天发送时间戳
+ data = None
+
+ def __init__(self):
+ self.Clear()
+ return
+
+ def ReadData(self, _lpData, _pos=0, _Len=0):
+ self.Clear()
+ self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.Name,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
+ self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ self.Len,_pos = CommFunc.ReadWORD(_lpData, _pos)
+ self.Content,_pos = CommFunc.ReadString(_lpData, _pos,self.Len)
+ self.BubbleBox,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+ self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.RealmLV,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ self.FacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ self.TalkTime,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ return _pos
+
+ def Clear(self):
+ self.NameLen = 0
+ self.Name = ""
+ self.PlayerID = 0
+ self.Len = 0
+ self.Content = ""
+ self.BubbleBox = 0
+ self.LV = 0
+ self.Job = 0
+ self.RealmLV = 0
+ self.Face = 0
+ self.FacePic = 0
+ self.ServerID = 0
+ self.TalkTime = 0
+ return
+
+ def GetLength(self):
+ length = 0
+ length += 1
+ length += len(self.Name)
+ length += 4
+ length += 2
+ length += len(self.Content)
+ length += 4
+ length += 2
+ length += 1
+ length += 1
+ length += 4
+ length += 4
+ length += 4
+ length += 4
+
+ return length
+
+ def GetBuffer(self):
+ data = ''
+ data = CommFunc.WriteBYTE(data, self.NameLen)
+ data = CommFunc.WriteString(data, self.NameLen, self.Name)
+ data = CommFunc.WriteDWORD(data, self.PlayerID)
+ data = CommFunc.WriteWORD(data, self.Len)
+ data = CommFunc.WriteString(data, self.Len, self.Content)
+ data = CommFunc.WriteDWORD(data, self.BubbleBox)
+ data = CommFunc.WriteWORD(data, self.LV)
+ data = CommFunc.WriteBYTE(data, self.Job)
+ data = CommFunc.WriteBYTE(data, self.RealmLV)
+ data = CommFunc.WriteDWORD(data, self.Face)
+ data = CommFunc.WriteDWORD(data, self.FacePic)
+ data = CommFunc.WriteDWORD(data, self.ServerID)
+ data = CommFunc.WriteDWORD(data, self.TalkTime)
+ return data
+
+ def OutputString(self):
+ DumpString = '''
+ NameLen:%d,
+ Name:%s,
+ PlayerID:%d,
+ Len:%d,
+ Content:%s,
+ BubbleBox:%d,
+ LV:%d,
+ Job:%d,
+ RealmLV:%d,
+ Face:%d,
+ FacePic:%d,
+ ServerID:%d,
+ TalkTime:%d
+ '''\
+ %(
+ self.NameLen,
+ self.Name,
+ self.PlayerID,
+ self.Len,
+ self.Content,
+ self.BubbleBox,
+ self.LV,
+ self.Job,
+ self.RealmLV,
+ self.Face,
+ self.FacePic,
+ self.ServerID,
+ self.TalkTime
+ )
+ return DumpString
+
+
+class tagMCTalkCacheList(Structure):
+ Head = tagHead()
+ ChannelType = 0 #(BYTE ChannelType)// 0-世界;1-跨服;3- 仙盟
+ Count = 0 #(BYTE Count)
+ InfoList = list() #(vector<tagMCTalkCacheInfo> InfoList)//size = Count
+ data = None
+
+ def __init__(self):
+ self.Clear()
+ self.Head.Cmd = 0xB3
+ self.Head.SubCmd = 0x11
+ return
+
+ def ReadData(self, _lpData, _pos=0, _Len=0):
+ self.Clear()
+ _pos = self.Head.ReadData(_lpData, _pos)
+ self.ChannelType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ for i in range(self.Count):
+ temInfoList = tagMCTalkCacheInfo()
+ _pos = temInfoList.ReadData(_lpData, _pos)
+ self.InfoList.append(temInfoList)
+ return _pos
+
+ def Clear(self):
+ self.Head = tagHead()
+ self.Head.Clear()
+ self.Head.Cmd = 0xB3
+ self.Head.SubCmd = 0x11
+ self.ChannelType = 0
+ self.Count = 0
+ self.InfoList = list()
+ return
+
+ def GetLength(self):
+ length = 0
+ length += self.Head.GetLength()
+ length += 1
+ length += 1
+ for i in range(self.Count):
+ length += self.InfoList[i].GetLength()
+
+ return length
+
+ def GetBuffer(self):
+ data = ''
+ data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+ data = CommFunc.WriteBYTE(data, self.ChannelType)
+ data = CommFunc.WriteBYTE(data, self.Count)
+ for i in range(self.Count):
+ data = CommFunc.WriteString(data, self.InfoList[i].GetLength(), self.InfoList[i].GetBuffer())
+ return data
+
+ def OutputString(self):
+ DumpString = '''
+ Head:%s,
+ ChannelType:%d,
+ Count:%d,
+ InfoList:%s
+ '''\
+ %(
+ self.Head.OutputString(),
+ self.ChannelType,
+ self.Count,
+ "..."
+ )
+ return DumpString
+
+
+m_NAtagMCTalkCacheList=tagMCTalkCacheList()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTalkCacheList.Head.Cmd,m_NAtagMCTalkCacheList.Head.SubCmd))] = m_NAtagMCTalkCacheList
+
+
+#------------------------------------------------------
# B4 11 新增恶意攻击玩家 #tagMCAddMaliciousAtkPlayer
class tagMCAddMaliciousAtkPlayer(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBDataMgr.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBDataMgr.py
index 75e7d11..c4ed296 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBDataMgr.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBDataMgr.py
@@ -24,6 +24,7 @@
import DBPlayerViewCache
import DBEventTrig
import DBBillboard
+import DBGameRec
import DBFamily
import DBMail
@@ -218,6 +219,7 @@
self.BillboardMgr = DBBillboard.BillboardMgr()
self.MailMgr = DBMail.MailMgr()
self.FamilyMgr = DBFamily.FamilyMgr()
+ self.GameRecMgr = DBGameRec.GameRecMgr()
return
def GetSaveData(self):
@@ -227,6 +229,7 @@
buff += self.BillboardMgr.GetSaveData()
buff += self.MailMgr.GetSaveData()
buff += self.FamilyMgr.GetSaveData()
+ buff += self.GameRecMgr.GetSaveData()
return buff
def LoadGameData(self, gameBuffer, pos):
@@ -236,6 +239,7 @@
pos = self.BillboardMgr.LoadPyGameData(gameBuffer, pos, dataslen)
pos = self.MailMgr.LoadPyGameData(gameBuffer, pos, dataslen)
pos = self.FamilyMgr.LoadPyGameData(gameBuffer, pos, dataslen)
+ pos = self.GameRecMgr.LoadPyGameData(gameBuffer, pos, dataslen)
return pos
def GetDBDataMgr():
@@ -275,3 +279,8 @@
dbDataMgr = GetDBDataMgr()
return dbDataMgr.BillboardMgr
+def GetGameRecMgr():
+ ## 通用记录数据管理器
+ dbDataMgr = GetDBDataMgr()
+ return dbDataMgr.GameRecMgr
+
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBStruct.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBStruct.py
index 8353749..b6b8e0c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBStruct.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBStruct.py
@@ -1899,10 +1899,141 @@
self.Name2 = Str[:65]
+# 通用记录表新 #tagDBGameRec
+class tagDBGameRec(Structure):
+ _pack_ = 1
+ _fields_ = [
+ ('RecType', ctypes.c_ushort),
+ ('RecID', ctypes.c_ulong),
+ ('Time', ctypes.c_double),
+ ('Value1', ctypes.c_ulong),
+ ('Value2', ctypes.c_ulong),
+ ('Value3', ctypes.c_ulong),
+ ('Value4', ctypes.c_ulong),
+ ('Value5', ctypes.c_ulong),
+ ('Value6', ctypes.c_ulong),
+ ('Value7', ctypes.c_ulong),
+ ('Value8', ctypes.c_ulong),
+ ('UserDataLen', ctypes.c_ushort),
+ ('UserData', ctypes.c_char_p),
+ ('ADOResult', ctypes.c_ulong),
+ ]
+
+ def __init__(self):
+ Structure.__init__(self)
+ self.clear()
+
+ def clear(self):
+ self.RecType = 0
+ self.RecID = 0
+ self.Time = 0.0
+ self.Value1 = 0
+ self.Value2 = 0
+ self.Value3 = 0
+ self.Value4 = 0
+ self.Value5 = 0
+ self.Value6 = 0
+ self.Value7 = 0
+ self.Value8 = 0
+ self.UserDataLen = 0
+ self.UserData = ''
+
+ def readData(self, buf, pos = 0, length = 0):
+ if not pos <= length:
+ return -1
+ if len(buf) < pos + self.getLength():
+ return -1
+ self.clear()
+ self.RecType, pos = CommFunc.ReadWORD(buf, pos)
+ self.RecID, pos = CommFunc.ReadDWORD(buf, pos)
+ self.Time, pos = CommFunc.ReadDouble(buf, pos)
+ self.Value1, pos = CommFunc.ReadDWORD(buf, pos)
+ self.Value2, pos = CommFunc.ReadDWORD(buf, pos)
+ self.Value3, pos = CommFunc.ReadDWORD(buf, pos)
+ self.Value4, pos = CommFunc.ReadDWORD(buf, pos)
+ self.Value5, pos = CommFunc.ReadDWORD(buf, pos)
+ self.Value6, pos = CommFunc.ReadDWORD(buf, pos)
+ self.Value7, pos = CommFunc.ReadDWORD(buf, pos)
+ self.Value8, pos = CommFunc.ReadDWORD(buf, pos)
+ self.UserDataLen, pos = CommFunc.ReadWORD(buf, pos)
+ tmp, pos = CommFunc.ReadString(buf, pos, self.UserDataLen)
+ self.UserData = ctypes.c_char_p(tmp)
+ return self.getLength()
+
+ def getBuffer(self):
+ buf = ''
+ buf = CommFunc.WriteWORD(buf, self.RecType)
+ buf = CommFunc.WriteDWORD(buf, self.RecID)
+ buf = CommFunc.WriteDouble(buf, self.Time)
+ buf = CommFunc.WriteDWORD(buf, self.Value1)
+ buf = CommFunc.WriteDWORD(buf, self.Value2)
+ buf = CommFunc.WriteDWORD(buf, self.Value3)
+ buf = CommFunc.WriteDWORD(buf, self.Value4)
+ buf = CommFunc.WriteDWORD(buf, self.Value5)
+ buf = CommFunc.WriteDWORD(buf, self.Value6)
+ buf = CommFunc.WriteDWORD(buf, self.Value7)
+ buf = CommFunc.WriteDWORD(buf, self.Value8)
+ buf = CommFunc.WriteWORD(buf, self.UserDataLen)
+ buf = CommFunc.WriteString(buf, self.UserDataLen, self.UserData)
+ return buf
+
+ def getLength(self):
+ length = 0
+ length += sizeof(ctypes.c_ushort)
+ length += sizeof(ctypes.c_ulong)
+ length += sizeof(ctypes.c_double)
+ length += sizeof(ctypes.c_ulong)
+ length += sizeof(ctypes.c_ulong)
+ length += sizeof(ctypes.c_ulong)
+ length += sizeof(ctypes.c_ulong)
+ length += sizeof(ctypes.c_ulong)
+ length += sizeof(ctypes.c_ulong)
+ length += sizeof(ctypes.c_ulong)
+ length += sizeof(ctypes.c_ulong)
+ length += sizeof(ctypes.c_ushort)
+ length += self.UserDataLen
+ return length
+
+ def outputString(self):
+ output = '''// 通用记录表新 #tagDBGameRec:
+ RecType = %s,
+ RecID = %s,
+ Time = %s,
+ Value1 = %s,
+ Value2 = %s,
+ Value3 = %s,
+ Value4 = %s,
+ Value5 = %s,
+ Value6 = %s,
+ Value7 = %s,
+ Value8 = %s,
+ UserDataLen = %s,
+ UserData = %s,
+ ADOResult = %s,
+ '''%(
+ self.RecType,
+ self.RecID,
+ self.Time,
+ self.Value1,
+ self.Value2,
+ self.Value3,
+ self.Value4,
+ self.Value5,
+ self.Value6,
+ self.Value7,
+ self.Value8,
+ self.UserDataLen,
+ self.UserData,
+ self.ADOResult,
+ )
+ return output
+
+
+
#服务器世界数据表版本号
GAMEWORLD_DATA_VERSION_NO = ctypes.c_ulong (\
sizeof(tagDBEventTrig) + sizeof(tagDBFamily) + sizeof(tagDBFamilyMem) + sizeof(tagDBFamilyAction) +
sizeof(tagDBPlayerViewCache) + sizeof(tagDBMailPersonal) + sizeof(tagDBMailServer) + sizeof(tagDBMailItem) +
- sizeof(tagDBMailPlayerRec) + sizeof(tagDBBillboard)
+ sizeof(tagDBMailPlayerRec) + sizeof(tagDBBillboard) + sizeof(tagDBGameRec)
).value
\ No newline at end of file
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFamily.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFamily.py
index 9ef6384..b7b2bfe 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFamily.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFamily.py
@@ -20,6 +20,7 @@
import GameWorld
import ShareDefine
import PlayerControl
+import PlayerViewCache
import PyMongoMain
import DBDataMgr
import ChConfig
@@ -82,12 +83,15 @@
self.__actionDataList.append(actionData)
return actionData
- def AddAction(self, fullClear=True):
+ def AddAction(self, maxCount=None):
## 添加仙盟Action数据
- # @param fullClear: 数据条数超过最大数时是否清除最早一条,并创建一条新记录
+ # @param maxCount: 可传入由配置决定的最大条数,如果为None则进一步取程序默认设定的最大条数,都没配置的话默认不限条数
+ fullClear = True
+ if maxCount == None:
+ maxCount = ShareDefine.ActionTypeSaveCnt.get(self.actionType, 0)
actionData = None
- if self.Count() >= ChConfig.ActionTypeSaveCnt.get(self.actionType, 0):
+ if maxCount and self.Count() >= maxCount:
if not fullClear:
#超过记录记录不了了
return actionData
@@ -207,7 +211,7 @@
## 根据玩家ID更新成员数据,一般用于离线功能,如添加离线成员,直接使用查看缓存更新
if playerID != self.GetPlayerID():
return
- viewCache = DBDataMgr.GetPlayerViewCacheMgr().FindViewCache(playerID)
+ viewCache = PlayerViewCache.FindViewCache(playerID)
if not viewCache:
return
self.SetPlayerName(viewCache.GetPlayerName())
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBGameRec.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBGameRec.py
new file mode 100644
index 0000000..adf6e3e
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBGameRec.py
@@ -0,0 +1,383 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package DB.StructData.DBGameRec
+#
+# @todo:通用记录表新
+# @author hxp
+# @date 2025-05-23
+# @version 1.0
+#
+# 详细描述: 通用记录表新,原通用记录字符长度记录有限,且针对某个记录类型下的子类型查找每次需要遍历,效率不高
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2025-05-23 20:00"""
+#-------------------------------------------------------------------------------
+
+import DBStruct
+import GameWorld
+import ShareDefine
+import CommFunc
+import DBComm
+
+import time
+
+class GameRecData():
+
+ def __init__(self, dbData=None, dataToJson=False):
+ if not dbData:
+ dbData = DBStruct.tagDBGameRec()
+ self.__dbData = dbData
+ self.__dataDict = DBComm.UserDataDict(self.__dbData, "UserData", "UserDataLen", dataToJson)
+ return
+ def GetRecType(self): return self.__dbData.RecType
+ def SetRecType(self, recType): self.__dbData.RecType = recType
+ def GetRecID(self): return self.__dbData.RecID
+ def SetRecID(self, recID): self.__dbData.RecID = recID
+ def GetTime(self): return self.__dbData.Time
+ def SetTime(self, sTime): self.__dbData.Time = sTime
+ def GetValue1(self): return self.__dbData.Value1
+ def SetValue1(self, value1): self.__dbData.Value1 = value1
+ def GetValue2(self): return self.__dbData.Value2
+ def SetValue2(self, value2): self.__dbData.Value2 = value2
+ def GetValue3(self): return self.__dbData.Value3
+ def SetValue3(self, value3): self.__dbData.Value3 = value3
+ def GetValue4(self): return self.__dbData.Value4
+ def SetValue4(self, value4): self.__dbData.Value4 = value4
+ def GetValue5(self): return self.__dbData.Value5
+ def SetValue5(self, value5): self.__dbData.Value5 = value5
+ def GetValue6(self): return self.__dbData.Value6
+ def SetValue6(self, value6): self.__dbData.Value6 = value6
+ def GetValue7(self): return self.__dbData.Value7
+ def SetValue7(self, value7): self.__dbData.Value7 = value7
+ def GetValue8(self): return self.__dbData.Value8
+ def SetValue8(self, value8): self.__dbData.Value8 = value8
+ def GetUserDict(self): return self.__dataDict.GetData()
+ def GetUserData(self): return self.__dataDict.ToString()
+ def SetUserData(self, value): self.__dataDict.SetData(value)
+ def GetBuffer(self):
+ self.__dataDict.ToString()
+ return self.__dbData.getBuffer()
+
+ def IsMatchValue(self, valueList):
+ # 检查记录值列表是否配置该记录
+ # @param valueList: [value1, value2, ...] value为None时不判断该值
+ if not valueList:
+ return False
+ for i, value in enumerate(valueList, 1):
+ if value == None:
+ continue
+ if not hasattr(self, "GetValue%s" % i):
+ return False
+ curValue = getattr(self, "GetValue%s" % i)()
+ if curValue != value:
+ return False
+ return True
+
+ def GetValueIndexKey(self):
+ ## 获取Value快速查找索引key,默认使用value1
+ recType = self.GetRecType()
+ if recType not in ShareDefine.Def_GameRecValueKeyDict:
+ return ""
+ valueNumList = ShareDefine.Def_GameRecValueKeyDict[recType]
+ if not valueNumList:
+ valueNumList = [1]
+ keyStr = ""
+ for num in valueNumList:
+ if not hasattr(self, "GetValue%s" % num):
+ return ""
+ if keyStr:
+ keyStr += "_"
+ keyStr += str(getattr(self, "GetValue%s" % num)())
+ return keyStr
+
+class GameRecIDMgr():
+ ## 类型数据ID管理
+
+ def __init__(self, recType, recID):
+ self.__recType = recType
+ self.__recID = recID
+ self.__dataList = [] # 数据列表 [GameRecData, ...]
+ self.__valueIndexDict = {} # value索引值对应数据列表 {indexKey:[GameRecData, ...], ...}
+ return
+
+ def InitRecDataInstance(self, dbData):
+ '''初始化功能数据实例,创建或加载数据时通用,功能一般不调用
+ @param dbData: 实例对应绑定的dbData
+ @return: 成功返回实例对象,失败返回None
+ '''
+ dataToJson = False
+ # 如果需要 dataToJson,可根据 RecType 在这里处理
+ if dbData.RecType in []:
+ dataToJson = True
+ recData = GameRecData(dbData, dataToJson)
+ self.__dataList.append(recData)
+
+ keyStr = recData.GetValueIndexKey()
+ if keyStr:
+ if keyStr not in self.__valueIndexDict:
+ self.__valueIndexDict[keyStr] = []
+ recIndexDataList = self.__valueIndexDict[keyStr]
+ recIndexDataList.append(recData)
+
+ return recData
+
+ def GetRecType(self): return self.__recType
+ def GetRecID(self): return self.__recID
+
+ def SortByTime(self):
+ self.__dataList.sort(key=lambda r: (r.GetTime()), reverse=False)
+ return
+
+ def AddRecData(self, maxCount=None):
+ '''添加记录
+ @param maxCount: 可传入由配置决定的最大条数,如果为None则进一步取程序默认设定的最大条数,都没配置的话默认不限条数
+ '''
+
+ fullClear = True
+ recData = None
+ if maxCount == None:
+ maxCount = 0
+ if maxCount and self.GetCount() >= maxCount:
+ if not fullClear:
+ #超过记录记录不了了
+ return recData
+ #self.SortByTime() # 按时间升序
+ self.DelCount(self.GetCount() - maxCount + 1)
+
+ dbData = DBStruct.tagDBGameRec()
+ dbData.RecType = self.__recType
+ dbData.RecID = self.__recID
+ dbData.Time = int(time.time())
+ #if valueSetList:
+ # for num, v in enumerate(valueSetList, 1):
+ # if not hasattr(dbData, "Value%s" % num):
+ # continue
+ # setattr(dbData, "Value%s" % num, v
+
+ recData = self.InitRecDataInstance(dbData)
+ return recData
+
+ def GetCount(self): return len(self.__dataList)
+ def At(self, index):
+ recData = None
+ if 0 <= index < len(self.__dataList):
+ recData = self.__dataList[index]
+ elif False:
+ recData = GameRecData()
+ return recData
+
+ def GetOneRecData(self, isAddNew=False):
+ ## 获取第一条记录,适用于仅需一条的记录类型
+ # @param isAddNew: 没有记录时是否添加一条新记录,一般获取后需要更新数据的可以设置为True,仅判断用的建议设置为False,减少产生多余空数据
+ recData = None
+ if self.__dataList:
+ recData = self.__dataList[0]
+ elif isAddNew:
+ recData = self.AddRecData()
+ return recData
+
+ def GetRecDataByValues(self, valueList, findone=False):
+ '''获取匹配value值的记录
+ @param valueList: [value1, value2, ...] value为None时不判断该值
+ @param findone: 是否只匹配一条满足的记录
+ @return: recData or [recData, ...] or None
+ '''
+
+ # 有配置value索引key的,直接快速获取
+ if self.__recType in ShareDefine.Def_GameRecValueKeyDict:
+ keyStr = ""
+ for v in valueList:
+ if keyStr:
+ keyStr += "_"
+ keyStr += str(v)
+ if keyStr not in self.__valueIndexDict:
+ return
+ recIndexDataList = self.__valueIndexDict[keyStr]
+ if not recIndexDataList:
+ return
+ return recIndexDataList[0] if findone else recIndexDataList
+
+ # 没有的则遍历匹配
+ matchRecDataList = []
+ for recData in self.__dataList:
+ if not recData.IsMatchValue(valueList):
+ continue
+ if findone:
+ return recData
+ matchRecDataList.append(recData)
+ return matchRecDataList
+
+ def DelAllData(self):
+ ## 删除该记录ID的所有数据
+ dataCount = self.GetCount()
+ if not dataCount:
+ return 0
+ #GameWorld.DebugLog("删除通用记录某个类型ID所有记录: recType=%s,recID=%s,dataCount=%s" % (self.__recType, self.__recID, dataCount))
+ self.__dataList = []
+ self.__valueIndexDict = {}
+ return dataCount
+
+ def DelDataByValue(self, valueList):
+ ## 删除该记录ID所有匹配Value值列表的数据记录
+ # @param valueList: [value1, value2, ...] value为None时不判断该值
+ if not valueList:
+ return 0
+
+ delCount = 0
+ for recData in self.__dataList[::-1]: # 倒序处理删除
+ if recData.IsMatchValue(valueList):
+ self.DelRecData(recData)
+ delCount += 1
+
+ #if delCount:
+ # GameWorld.DebugLog("删除通用记录某个类型ID所有匹配Value值的记录: recType=%s,recID=%s,valueList=%s,delCount=%s"
+ # % (self.__recType, self.__recID, valueList, delCount))
+ return delCount
+
+ def DelRecData(self, recData):
+ ## 删除指定记录
+ if not recData:
+ return 0
+
+ if recData in self.__dataList:
+ self.__dataList.remove(recData)
+
+ keyStr = recData.GetValueIndexKey()
+ if keyStr in self.__valueIndexDict:
+ recIndexDataList = self.__valueIndexDict[keyStr]
+ if recData in recIndexDataList:
+ recIndexDataList.remove(recData)
+
+ return 1
+
+ def DelCount(self, delCount, reverse=False):
+ ## 删除条数
+ # @param reverse: False-从索引0开始删除,True-从最后一个索引往前删
+ delDataList = self.__dataList[:delCount] if not reverse else self.__dataList[-delCount-1:]
+ for recData in delDataList:
+ self.DelRecData(recData)
+ #GameWorld.DebugLog("删除通用记录条数: recType=%s,recID=%s,delCount=%s,remainCount=%s"
+ # % (self.__recType, self.__recID, delCount, len(self.__dataList)))
+ return
+
+class GameRecTypeMgr():
+ ## 类型管理
+
+ def __init__(self, recType):
+ self.__recType = recType
+ self.__recIDDict = {} # recID对应数据列表 {recID:GameRecIDMgr, ...}
+ return
+
+ def GetRecType(self): return self.__recType
+
+ def GetRecIDMgr(self, recID):
+ recIDMgr = None
+ if recID in self.__recIDDict:
+ recIDMgr = self.__recIDDict[recID]
+ else:
+ recIDMgr = GameRecIDMgr(self.__recType, recID)
+ self.__recIDDict[recID] = recIDMgr
+ return recIDMgr
+
+ def GetRecIDList(self): return self.__recIDDict.keys()
+
+ def GetRecDataByValues(self, valueList, findone=False):
+ ## 获取该类型所有记录匹配value值的记录
+ matchRecDataList = []
+ for recID in self.__recIDDict.keys():
+ recIDMgr = self.GetRecIDMgr(recID)
+ ret = recIDMgr.GetRecDataByValues(valueList, findone)
+ if not ret:
+ continue
+ if findone:
+ return ret
+
+ if isinstance(ret, list):
+ matchRecDataList += ret
+
+ return matchRecDataList
+
+ def DelAllData(self):
+ ## 删除该类型所有记录
+ delCount = 0
+ for recID in self.__recIDDict.keys():
+ delCount += self.DelDataByRecID(recID)
+ return delCount
+ def DelDataByRecID(self, recID):
+ ## 删除该类型某个记录ID的所有记录
+ return self.GetRecIDMgr(recID).DelAllData()
+ def DelDataByValue(self, valueList):
+ ## 删除该类型所有匹配Value值列表的记录
+ delCount = 0
+ for recID in self.__recIDDict.keys():
+ recIDMgr = self.GetRecIDMgr(recID)
+ delCount += recIDMgr.DelDataByValue(valueList)
+ return delCount
+
+class GameRecMgr():
+ ## 通用记录管理
+
+ def __init__(self):
+ self.__recTypeDict = {} # {recType:GameRecTypeMgr, ...}
+ return
+
+ def GetRecTypeMgr(self, recType):
+ recTypeMgr = None
+ if recType in self.__recTypeDict:
+ recTypeMgr = self.__recTypeDict[recType]
+ else:
+ recTypeMgr = GameRecTypeMgr(recType)
+ self.__recTypeDict[recType] = recTypeMgr
+ return recTypeMgr
+
+ def GetRecTypeIDMgr(self, recType, recID):
+ recTypeMgr = self.GetRecTypeMgr(recType)
+ recTypeIDMgr = recTypeMgr.GetRecIDMgr(recID)
+ if not recTypeIDMgr and False:
+ recTypeIDMgr = GameRecIDMgr(recType, recID)
+ return recTypeIDMgr
+
+ # 保存数据 存数据库和realtimebackup
+ def GetSaveData(self):
+ savaData = ""
+ cntData = ""
+ cnt = 0
+
+ for recType in self.__recTypeDict.keys():
+ recTypeMgr = self.GetRecTypeMgr(recType)
+ for recID in recTypeMgr.GetRecIDList():
+ recTypeIDMgr = recTypeMgr.GetRecIDMgr(recID)
+ for index in range(recTypeIDMgr.GetCount()):
+ recData = recTypeIDMgr.At(index)
+ savaData += recData.GetBuffer()
+ cnt += 1
+
+ GameWorld.Log("Save DBGameRec count :%s len=%s" % (cnt, len(savaData)))
+ return CommFunc.WriteDWORD(cntData, cnt) + savaData
+
+ # 从数据库载入数据
+ def LoadPyGameData(self, datas, pos, dataslen):
+ cnt, pos = CommFunc.ReadDWORD(datas, pos)
+ GameWorld.Log("Load DBGameRec count :%s" % cnt)
+
+ for _ in xrange(cnt):
+ dbData = DBStruct.tagDBGameRec()
+ dbData.readData(datas, pos, dataslen)
+ recType = dbData.RecType
+ recID = dbData.RecID
+ recTypeIDMgr = self.GetRecTypeIDMgr(recType, recID)
+ recTypeIDMgr.InitRecDataInstance(dbData)
+
+ for recType in self.__recTypeDict.keys():
+ recTypeMgr = self.GetRecTypeMgr(recType)
+ for recID in recTypeMgr.GetRecIDList():
+ recTypeIDMgr = recTypeMgr.GetRecIDMgr(recID)
+ recTypeIDMgr.SortByTime()
+
+ return pos
+
+
+
+
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBPlayerViewCache.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBPlayerViewCache.py
index 4acf923..1b24dc3 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBPlayerViewCache.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBPlayerViewCache.py
@@ -18,17 +18,8 @@
import DBComm
import DBStruct
import GameWorld
-import ShareDefine
-import PlayerControl
-import DBDataMgr
import CommFunc
import ChConfig
-import GameObj
-
-import random
-import time
-
-Key_UpdViewCacheTick = "UpdViewCacheTick"
class PlayerViewCache():
@@ -84,97 +75,36 @@
def __init__(self):
self.__viewCacheList = [] # [PlayerViewCache, ...]
- self.__idIndexDict = {} # {playerID:index, ...}
+ self.__viewCacheDict = {} # {playerID:PlayerViewCache, ...}
self.__needSort = False
self.__serverIDRangePlayerIDDict = {} # {serverIDRangeTuple:[playerID, ...], ....}
return
- def InitViewCacheInstance(self, dbData):
+ def __InitViewCacheInstance(self, dbData):
'''初始化功能数据实例,创建或加载数据时通用,功能一般不调用
@param dbData: 实例对应绑定的dbData
@return: 成功返回实例对象,失败返回None
'''
playerID = dbData.PlayerID
- self.__refreshIDIndex()
- if playerID in self.__idIndexDict:
+ if playerID in self.__viewCacheDict:
return
viewCache = PlayerViewCache(dbData)
self.__viewCacheList.append(viewCache)
- self.__idIndexDict[playerID] = len(self.__viewCacheList) - 1
+ self.__viewCacheDict[playerID] = viewCache
self.__needSort = True
return viewCache
- def CheckUpdViewCache(self, playerID):
- if playerID <= ShareDefine.FackPlayerIDMax:
- return
- curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
- if not curPlayer:
- return
- lastUpdTick = curPlayer.GetDictByKey(Key_UpdViewCacheTick)
- tick = GameWorld.GetGameWorld().GetTick()
- if lastUpdTick and tick - lastUpdTick < 60000:
- GameWorld.DebugLog("1分钟内只更新一次玩家缓存", playerID)
- return
- curPlayer.SetDict(Key_UpdViewCacheTick, tick)
- return UpdPlayerViewCache(curPlayer)
-
- def FindViewCache(self, playerID, isAdd=False):
- '''查找玩家缓存,如果不存在,则会有额外逻辑,如从redis、db直接找,
- 跨服玩家从跨服取,可能延迟获得
- '''
- curCache = self.GetPlayerViewCache(playerID)
- if curCache:
- updCache = self.CheckUpdViewCache(playerID)
- if updCache:
- curCache = updCache
-
- # 真实玩家
- elif playerID > ShareDefine.FackPlayerIDMax:
- curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
- # 本服在线玩家,直接生成新数据
- if curPlayer:
- dbData = DBStruct.tagDBPlayerViewCache()
- dbData.PlayerID = playerID
- self.InitViewCacheInstance(dbData)
- UpdPlayerViewCache(curPlayer)
-
- # 离线玩家
- else:
- pass
- # 本服玩家,从redis或db读取重新加载读取,换句话说,本服玩家只要获取一定有查看缓存数据
- # 跨服玩家,去子服拉取数据,理论上也一定有,但是如果需要拉数据,有一定延迟
- # 逻辑待扩展
-
- # 假玩家,默认添加
- elif ShareDefine.FackPlayerIDStart <= playerID <= ShareDefine.FackPlayerIDMax:
- serverID = playerID % 100 + 1 # 1 ~ 100 服
- accID = "fake%s@test@s%s" % (playerID, serverID)
- fightPower = random.randint(1000000, 100000000) # 先随机,外层有需要的话再自己设置
-
- dbData = DBStruct.tagDBPlayerViewCache()
- dbData.PlayerID = playerID
- dbData.PlayerName = "%s%s" % (GameWorld.GbkToCode("神秘道友"), playerID)
- dbData.AccID = accID
- dbData.LV = random.randint(100, 200)
- dbData.Job = random.randint(1, 2)
- dbData.RealmLV = random.randint(5, 15)
- dbData.FightPower = fightPower % ChConfig.Def_PerPointValue
- dbData.FightPowerEx = fightPower / ChConfig.Def_PerPointValue
- dbData.ServerID = serverID
- dbData.OffTime = int(time.time()) - random.randint(1, 3600 * 24 * 10) # 随机离线 0~10天
- curCache = self.InitViewCacheInstance(dbData)
-
- return curCache
+ def AddPlayerViewCache(self, playerID):
+ dbData = DBStruct.tagDBPlayerViewCache()
+ dbData.PlayerID = playerID
+ return self.__InitViewCacheInstance(dbData)
def GetPlayerViewCache(self, playerID):
## 获取玩家查看缓存,仅内存中数据,无额外逻辑
- self.__refreshIDIndex()
viewCache = None
- if playerID in self.__idIndexDict:
- index = self.__idIndexDict[playerID]
- if index < len(self.__viewCacheList):
- viewCache = self.__viewCacheList[index]
-
+ if playerID in self.__viewCacheDict:
+ viewCache = self.__viewCacheDict[playerID]
+
if not viewCache and False:
viewCache = PlayerViewCache()
@@ -200,32 +130,19 @@
self.__serverIDRangePlayerIDDict[key] = playerIDList
return self.__serverIDRangePlayerIDDict[key]
- def IsPlayerIn(self, playerID):
- self.__refreshIDIndex()
- return playerID in self.__idIndexDict
-
- def __refreshIDIndex(self):
- if not self.__idIndexDict:
- self.__idIndexDict = {}
- for index, viewCache in enumerate(self.__viewCacheList):
- self.__idIndexDict[viewCache.GetPlayerID()] = index
- return self.__idIndexDict
-
def DelPlayerViewCache(self, playerID):
- self.__refreshIDIndex()
- index = self.__idIndexDict.pop(playerID, -1)
- if index >= 0 and index < len(self.__viewCacheList):
- self.__viewCacheList.pop(index)
+ viewCache = self.__viewCacheDict.pop(playerID, None)
+ if viewCache in self.__viewCacheList:
+ self.__viewCacheList.remove(viewCache)
for playerIDList in self.__serverIDRangePlayerIDDict.values():
if playerID in playerIDList:
playerIDList.remove(playerID)
- self.__idIndexDict = {}
self.__serverIDRangePlayerIDDict = {}
return
def DelAllCache(self):
self.__viewCacheList = []
- self.__idIndexDict = {}
+ self.__viewCacheDict = {}
self.__needSort = False
self.__serverIDRangePlayerIDDict = {}
return
@@ -243,9 +160,7 @@
return
self.__needSort = False
self.__viewCacheList.sort(key=lambda v: (v.GetFightPowerTotal(), v.GetLV()), reverse=True)
- self.__idIndexDict = {}
self.__serverIDRangePlayerIDDict = {}
- self.__refreshIDIndex()
return
# 保存数据 存数据库和realtimebackup
@@ -269,66 +184,7 @@
for _ in xrange(cnt):
dbData = DBStruct.tagDBPlayerViewCache()
pos += dbData.readData(datas, pos, dataslen)
- self.InitViewCacheInstance(dbData)
+ self.__InitViewCacheInstance(dbData)
self.Sort()
return pos
-
-def OnPlayerLogout(curPlayer):
- if curPlayer.GetLV() >= 10:
- UpdPlayerViewCache(curPlayer)
-
- return
-
-def UpdPlayerViewCache(curPlayer, isOffline=False):
- '''更新玩家查看缓存数据,更新时机由外层自己判断,这里只做更新逻辑
- 1. 下线时强制更新一次,上线暂不更新,上线时由各功能如果有需要用到触发更新
- 2. 有需要用到缓存数据时,如果玩家在线,1分钟内多次获取时最多更新一次,没有获取缓存数据则不更新
- '''
- if not curPlayer:
- return
-
- playerID = curPlayer.GetPlayerID()
- curCache = DBDataMgr.GetPlayerViewCacheMgr().GetPlayerViewCache(playerID)
- if not curCache:
- return
-
- tick = GameWorld.GetGameWorld().GetTick()
- curPlayer.SetDict(Key_UpdViewCacheTick, tick)
- GameWorld.DebugLog("更新玩家查看缓存数据! isOffline=%s" % isOffline, playerID)
- curCache.SetAccID(curPlayer.GetAccID())
- curCache.SetPlayerName(curPlayer.GetPlayerName())
- curCache.SetLV(curPlayer.GetLV())
- curCache.SetJob(curPlayer.GetJob())
- curCache.SetRealmLV(curPlayer.GetOfficialRank())
- curCache.SetFace(curPlayer.GetFace())
- curCache.SetFacePic(curPlayer.GetFacePic())
- curCache.SetFamilyID(curPlayer.GetFamilyID())
- curCache.SetFamilyName(curPlayer.GetFamilyName())
- curCache.SetFamilyEmblemID(PlayerControl.GetFamilyEmblemID(curPlayer))
- curCache.SetTitleID(PlayerControl.GetTitleID(curPlayer))
- curCache.SetFightPowerTotal(PlayerControl.GetFightPower(curPlayer))
- curCache.SetServerID(GameWorld.GetPlayerServerID(curPlayer))
- if isOffline:
- curCache.SetOffTime(int(time.time()))
-
- plusDict = curCache.GetPlusDict()
-
- #战斗属性
- plusDict.update({
- "MinAtk":curPlayer.GetMinAtk(),
- "MaxAtk":curPlayer.GetMaxAtk(),
- "Def":curPlayer.GetDef(),
- "MaxHP":GameObj.GetMaxHP(curPlayer),
- "Hit":curPlayer.GetHit(),
- "Miss":curPlayer.GetMiss(),
- "SuperHitRate":curPlayer.GetSuperHitRate(), # 暴击率
- })
-
- # 功能数据
-
- # 其他
-
- return curCache
-
-
\ No newline at end of file
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/CreateFamily.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/CreateFamily.py
index 4b997da..3937f10 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/CreateFamily.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/CreateFamily.py
@@ -17,6 +17,7 @@
import GameWorld
import ShareDefine
+import PlayerViewCache
import IPY_PlayerDefine
import PlayerFamily
import DBDataMgr
@@ -232,7 +233,7 @@
else:
memFightPower = avgValue + memCnt / 2 - m
memFightPowerTotal -= memFightPower
- viewCache = DBDataMgr.GetPlayerViewCacheMgr().FindViewCache(memID, True)
+ viewCache = PlayerViewCache.FindViewCache(memID, True)
viewCache.SetFightPowerTotal(memFightPower)
GameWorld.DebugLog(" 仙盟成员: memID=%s,memFightPower=%s,fmLV=%s" % (memID, memFightPower, fmLV))
member.RefreshMemberByID(memID)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PlayerMirror.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PlayerMirror.py
index e2132aa..5b06d28 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PlayerMirror.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PlayerMirror.py
@@ -17,7 +17,6 @@
import GameWorld
import MirrorAttack
-import PlayerViewCacheTube
import ChConfig
## GM命令执行入口
@@ -97,8 +96,8 @@
return
elif value1 == 5:
- tick = GameWorld.GetGameWorld().GetTick()
- PlayerViewCacheTube.UpdateGameServerPlayerCache(curPlayer, tick, forcePackData=True)
+ #tick = GameWorld.GetGameWorld().GetTick()
+ #PlayerViewCacheTube.UpdateGameServerPlayerCache(curPlayer, tick, forcePackData=True)
GameWorld.DebugAnswer(curPlayer, "已更新最新镜像缓存!")
elif value1 in ["a", "d", "p"]:
return True
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py
index 61bc000..0128901 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py
@@ -1406,6 +1406,9 @@
return mainServerID
return 0
+def GetDBPlayerAccIDByID(playerID):
+ ## 获取玩家表账号ID - 根据玩家ID, 可用于判断是否本服玩家
+ return PyGameData.g_dbPlayerIDMap.get(playerID, "")
#===============================================================================
# 平台ID = appid
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBHelpBattle.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBHelpBattle.py
index 55f0c46..7957843 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBHelpBattle.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBHelpBattle.py
@@ -20,7 +20,6 @@
import PlayerControl
import ChPyNetSendPack
import NetPackCommon
-import PlayerViewCacheTube
import PlayerActGarbageSorting
import FBCommon
import IpyGameDataPY
@@ -111,8 +110,8 @@
PlayerActGarbageSorting.AddActGarbageTaskProgress(curPlayer, ChConfig.Def_GarbageTask_HelpBattle)
# 没有数据缓存的话,马上同步一次
- if not haveViewCache:
- PlayerViewCacheTube.UpdateGameServerPlayerCache(curPlayer, tick, False)
+ #if not haveViewCache:
+ # PlayerViewCacheTube.UpdateGameServerPlayerCache(curPlayer, tick, False)
SyncCheckInState(curPlayer, 1, False)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py
index 6a3a195..6a80703 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py
@@ -31,7 +31,6 @@
import ChItem
import IpyGameDataPY
import Operate_EquipStone
-import PlayerViewCacheTube
import Operate_EquipWash
import FormulaControl
import ChPyNetSendPack
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NetPackCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NetPackCommon.py
index a51cfd4..ec2a04e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NetPackCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NetPackCommon.py
@@ -228,6 +228,19 @@
#curPlayer.SendFakePack(innerPackData, len(innerPackData))
curPlayer.SendFakePack(clientPack.GetBuffer(), clientPack.GetLength())
+def SendFackPackOnline(clientPack, parseFunc=None, *args):
+ ## 发送给全服在线玩家
+ # @param parseFunc: 中间处理逻辑,可以做一些修改包数据的逻辑或者过滤某些玩家不发送,返回值为True时发送
+ # @param args: parseFunc方法参数(curPlayer, ...)
+ playerManager = GameWorld.GetPlayerManager()
+ for i in xrange(playerManager.OnlineCount()):
+ curPlayer = playerManager.OnlineAt(i)
+ if not GameWorld.IsNormalPlayer(curPlayer):
+ continue
+ if parseFunc and not parseFunc(curPlayer, *args):
+ continue
+ SendFakePack(curPlayer, clientPack)
+ return
#-------------------------------------------------------------------------------
#---Py封包注册信息
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
index f41b51b..aec60d7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -145,7 +145,6 @@
import PlayerArena
import PyGameData
import PlayerCoin
-import PlayerGeTui
import PlayerCharm
import PlayerDogz
import PlayerCoat
@@ -178,6 +177,7 @@
import IPY_ServerDefine
import CommFunc
from PyMongoDB import RecvPackToMapDB
+import PlayerTalk
import datetime
import time
@@ -208,10 +208,6 @@
#初始化玩家的时钟个数
if curPlayer.GetTickTypeCount() == 0:
curPlayer.SetTickTypeCount(ChConfig.TYPE_Player_Tick_Count)
-
- #初始化玩家聊天频道
- if curPlayer.GetMaxChannelCount() == 0:
- curPlayer.SetMaxChannelCount(ChConfig.Def_PlayerTalkChannelMaxCount)
#===============================================================================
# #初始化玩家鉴定管理器物品最大个数
@@ -643,9 +639,6 @@
#大师
PlayerGreatMaster.MasterOnLogin(curPlayer)
- # 推送提醒
- PlayerGeTui.LoginNotifySetting(curPlayer)
-
#通知VIP
PlayerVip.DoOnLogin(curPlayer, tick)
@@ -998,6 +991,7 @@
PlayerMineArea.OnPlayerLogin(curPlayer)
PlayerGuaji.OnPlayerLogin(curPlayer)
PlayerActFamilyGCZ.OnPlayerLogin(curPlayer)
+ PlayerTalk.OnPlayerLogin(curPlayer)
# 上线查询一次充值订单
curPlayer.SendDBQueryRecharge()
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index cdc027c..761ae6c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -37,6 +37,7 @@
import OperControlManager
import PlayerFamily
import ShareDefine
+import PlayerViewCache
import PlayerBillboard
import GameServerRefresh
import IPY_GameWorld
@@ -56,7 +57,6 @@
import PlayerWorldAverageLv
import PlayerActivity
import FBCommon
-import PlayerViewCacheTube
import PassiveBuffEffMng
import PlayerGameEvent
import EventReport
@@ -87,9 +87,7 @@
import PlayerActGarbageSorting
import GY_Query_CrossRealmReg
import PlayerTongTianLing
-import PlayerCrossRealmPK
import FunctionNPCCommon
-import DBPlayerViewCache
import PlayerGoldInvest
import IPY_PlayerDefine
import CrossRealmPlayer
@@ -251,7 +249,13 @@
# @param mergeMapInfo 该提示所属的跨服活动地图信息, 主要用于不同子服对应所跨的活动地图ID
# @return 无返回值
def WorldNotify(country, msgMark, msgParamList=[], lineID=0, mergeMinOSD=-1, mergeMaxOSD=-1, mergeMapInfo=[]):
- GameWorld.GetPlayerManager().BroadcastCountry_NotifyCode(country, 0, msgMark, __GetNotifyCodeList(msgParamList), lineID)
+ #GameWorld.GetPlayerManager().BroadcastCountry_NotifyCode(country, 0, msgMark, __GetNotifyCodeList(msgParamList), lineID)
+ playerManager = GameWorld.GetPlayerManager()
+ for i in xrange(playerManager.OnlineCount()):
+ curPlayer = playerManager.OnlineAt(i)
+ if not GameWorld.IsNormalPlayer(curPlayer):
+ continue
+ NotifyCode(curPlayer, msgMark, msgParamList)
return
def GetCrossWorldNotifyInfo(country, msgMark, msgParamList=[]):
@@ -277,7 +281,8 @@
# @return 无返回值
# @remarks
def FamilyNotify(familyID, msgMark, msgParamList=[]):
- GameWorld.GetPlayerManager().BroadcastCountry_NotifyCode(0, familyID, msgMark, __GetNotifyCodeList(msgParamList))
+ #GameWorld.GetPlayerManager().BroadcastCountry_NotifyCode(0, familyID, msgMark, __GetNotifyCodeList(msgParamList))
+ PlayerFamily.NotifyAllFamilyMemberMsg(familyID, msgMark, msgParamList)
return
#---------------------------------------------------------------------
@@ -1488,8 +1493,7 @@
PlayerBillboard.UpdatePlayerBillboardOnLeaveServer(curPlayer) #排行榜已实时更新,故下线不再同步
#玩家下线通知gameserver记录缓存(放在下线更新排行榜之后,方便Gameserver判断是否需要存入数据库中)
- PlayerViewCacheTube.OnPlayerLogOut(curPlayer, tick)
- DBPlayerViewCache.OnPlayerLogout(curPlayer)
+ PlayerViewCache.OnPlayerLogout(curPlayer)
PlayerFamily.OnPlayerLogout(curPlayer)
#玩家下线/玩家切换地图公用逻辑
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
index 766ae61..9d7d77f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -129,6 +129,7 @@
import PlayerFuncTeam
import PlayerMineArea
import PlayerBillboard
+import PlayerViewCache
import PlayerMail
import datetime
@@ -168,6 +169,7 @@
DoLogic_OnDayEx(tick)
PlayerBillboard.OnDay()
+ PlayerViewCache.OnDay()
return
def DoLogic_OnDayEx(tick):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
index 6b434b8..eeb08bc 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
@@ -20,6 +20,7 @@
import ShareDefine
import PlayerControl
import NetPackCommon
+import PlayerViewCache
import ChPyNetSendPack
import PlayerFamilyTech
import PlayerFamilyEmblem
@@ -755,7 +756,7 @@
reqInfo.ReqTime = reqTime
if curPlayer:
reqInfo.IsOnLine = True
- viewCache = DBDataMgr.GetPlayerViewCacheMgr().FindViewCache(playerID)
+ viewCache = PlayerViewCache.FindViewCache(playerID)
if viewCache:
reqInfo.Name = viewCache.GetPlayerName()
reqInfo.NameLen = len(reqInfo.Name)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGeTui.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGeTui.py
deleted file mode 100644
index 0da4ee1..0000000
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGeTui.py
+++ /dev/null
@@ -1,310 +0,0 @@
-#!/usr/bin/python
-# -*- coding: GBK -*-
-#
-##@package
-#
-# @todo: 个推逻辑
-#
-# @author: Alee
-# @date 2018-5-20 下午02:10:00
-# @version 1.0
-#
-# @note:
-#
-#---------------------------------------------------------------------
-
-import PlayerControl
-import GameWorld
-import ChConfig
-import ReadChConfig
-import datetime
-import IpyGameDataPY
-import IPY_GameWorld
-import ChPyNetSendPack
-import NetPackCommon
-import PlayerTJG
-import PlayerViewCacheTube
-import urllib
-import PlayerVip
-import json
-#===============================================================================
-# //B2 05 推送提醒设置 tagCMPushNotificationsSetting
-#
-# struct tagCMPushNotificationsSetting
-# {
-# tagHead Head;
-# DWORD OnoffBit; // 按位约定开关
-# BYTE TimeLen;
-# char TimeStr[TimeLen]; // 时间字符串 01:02-05:00
-# };
-#===============================================================================
-
-# VIP权限
-Def_Onoff_VIPCount = 5
-(
-Def_Onoff_Time, #免打扰时间开关
-Def_Onoff_Boss, #关注BOSS
-Def_Onoff_Chat, #私聊
-Def_Onoff_TJGDead, #脱机死亡
-Def_Onoff_TJGTimeLess, #脱机时间不足1小时
-) = range(Def_Onoff_VIPCount)
-
-#非VIP权限
-Def_GeTui_FMT = -2 # 封魔坛
-
-
-# 推送提醒设置
-def GeTuiSetting(index, pack, tick):
- curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
- if not PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_5):
- #清空前4位 VIP权限
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GeTuiSet, pack.OnoffBit>>Def_Onoff_VIPCount<<Def_Onoff_VIPCount)
- return
-
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GeTuiSet, pack.OnoffBit)
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_NoGeTuiTime, GetTimeLimit(pack.TimeStr))
-
- # 客户端需控制下发送频率
- PlayerViewCacheTube.UpdateGameServerPlayerCache(curPlayer, tick, False)
- return
-
-
-def GetTimeLimit(timeStr):
- # 检查格式后转数字
- timeList = timeStr.split("-")
- if len(timeList) != 2:
- return
-
- numList = timeList[0].split(":")
- if len(numList) != 2:
- return
-
- num1 = GameWorld.ToIntDef(numList[0], 0)
- num2 = GameWorld.ToIntDef(numList[1], 0)
-
- if num1 < 0 or num1 > 24:
- return
- if num2 < 0 or num2 > 60:
- return
-
- numList2 = timeList[1].split(":")
- if len(numList2) != 2:
- return
-
- num3 = GameWorld.ToIntDef(numList2[0], 0)
- num4 = GameWorld.ToIntDef(numList2[1], 0)
-
- if num3 < 0 or num3 > 24:
- return
- if num4 < 0 or num4 > 60:
- return
-
- return num1*1000000 + num2*10000 + num3*100 + num4
-
-# 便于测试
-def GetGeTuiClientID(curPlayer):
- #return "13165ffa4e5a8fbf6d0"
- return curPlayer.GetAccountData().GetGeTuiClientID()
-
-# 检查是否可以个推,geTuiType小于0的代表默认可推,无VIP限制
-def CheckCanGeTui(curPlayer, geTuiType=-1):
- if not GetGeTuiClientID(curPlayer):
- return False
-
- if not PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_5):
- if geTuiType < 0:
- return True
- return False
-
- if geTuiType == Def_GeTui_FMT:
- # 封魔坛受VIP的关注BOSS开关影响
- geTuiType = Def_Onoff_Boss
-
- # 检查时间和开关
- if geTuiType >= 0 and curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GeTuiSet)&pow(2, geTuiType) == 0:
- return False
-
- # 没有开启免打扰
- if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GeTuiSet)&pow(2, Def_Onoff_Time) == 0:
- return True
-
- limitTimt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_NoGeTuiTime)
-
- curTime = GameWorld.GetCurrentTime()
- dateStr = str(curTime).split()[0]
- #时间格式 '%Y-%m-%d %H:%M'
- try:
- startTimeStr = '%s %s:%s'%(dateStr, limitTimt/1000000, limitTimt/10000%100)
- startTime = datetime.datetime.strptime(startTimeStr, "%Y-%m-%d %H:%M")
-
- endTimeStr = '%s %s:%s'%(dateStr, limitTimt/100%100, limitTimt%100)
- endTime = datetime.datetime.strptime(endTimeStr, "%Y-%m-%d %H:%M")
- except:
- return False
-
- if startTime == endTime:
- # 时间一致代表不限制
- return True
-
- # 如 13:00-23:00
- elif startTime < endTime:
- if startTime <= curTime and curTime <= endTime:
- return False
-
- # 如 23:00 - 8:00
- else:
- if endTime < curTime < startTime:
- return True
- else:
- return False
-
- return True
-
-#===============================================================================
-# //B2 02 推送提醒设置通知 #tagMCPushNotificationsSetting
-#
-# struct tagMCPushNotificationsSetting
-# {
-# tagHead Head;
-# DWORD OnoffBit; // 按位约定开关
-# BYTE TimeLen;
-# char TimeStr[TimeLen]; // 时间字符串 01:02-05:00
-# };
-#===============================================================================
-def LoginNotifySetting(curPlayer):
-
- sendPack = ChPyNetSendPack.tagMCPushNotificationsSetting()
- sendPack.OnoffBit = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GeTuiSet)
-
- limitTimt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_NoGeTuiTime)
- timeStr = "%s:%s-%s:%s"%(limitTimt/1000000, limitTimt/10000%100, limitTimt/100%100, limitTimt%100)
- sendPack.TimeStr = timeStr
- sendPack.TimeLen = len(timeStr)
- NetPackCommon.SendFakePack(curPlayer, sendPack)
- return
-
-
-#===============================================================================
-# import urllib
-# getUrl = "http://127.0.0.1:53000/getui/index.php"
-# curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(0)
-# postInfo = urllib.urlencode({"PlayerName": curPlayer.GetName(), "NotifyMsg":"BOSS---", "RegID":"101d8559091575fb3da", "OSName":"ios"})
-# GameWorld.GetGameWorld().EventReport_EventReport(postInfo, "", "", "", 1, getUrl)
-#===============================================================================
-
-
-# 群推类定时活动由客户端自己处理
-# 服务端群推暂不由游戏服务器推送,可从第三方个推网站推送
-# 游戏服务器只推送具有变化性的内容
-# 支持单推和多人推送
-# appIDDict 混服使用对应不同key {平台ID:[[玩家个推ID, 玩家名],[玩家个推ID2, 玩家名2]。。。]}
-# 如果玩家名存在则必须与个推ID一一对应,若不存在则是多推,若存在则会一一单推
-# 带名字会被组合成 格式如【玩家名】您关注的BOSSxx已复活
-# EventReport_EventReport 向游戏服务器的个推小程序发送 webbottle
-def GeTuiNotify(appIDDict, notifyMsg):
- if not appIDDict:
- return
- #osName = ReadChConfig.GetPyMongoConfig("GeTui", "OSName") 混服无法配置系统
- geTuiUrl = ReadChConfig.GetPyMongoConfig("GeTui", "GeTuiUrl")
-
- playerInfo = json.dumps(appIDDict, ensure_ascii=False)
- #含中文部分要urlencode
- postInfo = urllib.urlencode({"PlayerInfo": playerInfo, "NotifyMsg":notifyMsg})
-
- GameWorld.GetGameWorld().EventReport_EventReport(postInfo, "", "", "", 1, geTuiUrl)
- return
-
-
-# 时间不足
-def TJGTimeLess(curPlayer):
- # 通知脱机挂,只处理一次
- if curPlayer.GetDictByKey("TJGTimeLess"):
- return
-
- tjgTime = PlayerTJG.GetTJGTime(curPlayer)
- if tjgTime > 3600:
- return
-
- curPlayer.SetDict("TJGTimeLess", 1)
-
- if not CheckCanGeTui(curPlayer, Def_Onoff_TJGTimeLess):
- return
-
- showStr = GameWorld.GbkToCode(IpyGameDataPY.GetFuncCfg("GeTuiTJG", 4)) # 文字信息
- GeTuiNotify({GameWorld.GetPlayerPlatform(curPlayer) :[[GetGeTuiClientID(curPlayer), curPlayer.GetName()]]}, showStr)
- return
-
-
-#[玩家名]脱机外挂已开始托管角色挂机,角色当前经验效率:9999亿9999万经验/分,剩余脱机外挂时间:**小时**分钟
-def TJGEfficiency(curPlayer, times, exp):
- # 通知脱机挂效益,只处理一次
- if curPlayer.GetDictByKey("TJGEfficiency"):
- return
- curPlayer.SetDict("TJGEfficiency", 1)
-
- if not CheckCanGeTui(curPlayer):
- return
-
- showStr = IpyGameDataPY.GetFuncCfg("GeTuiTJG") # 文字信息
- wanStr = IpyGameDataPY.GetFuncCfg("Coins1", 1) # 万
- yiStr = IpyGameDataPY.GetFuncCfg("Coins1", 2) # 亿
-
- # 此为中式显示法,翻译成英文因考虑显示逻辑不同而变
- Hundred_Million = 100000000
- Ten_Thousand = 10000
-
- exp = exp/max(times, 1)*60
-
- if exp >= Hundred_Million:
- expStr = "%s%s"%(exp/Hundred_Million, yiStr)
- if exp/Ten_Thousand%Ten_Thousand != 0:
- expStr += "%s%s"%(exp/Ten_Thousand%Ten_Thousand, wanStr)
- elif exp >= Ten_Thousand:
- if exp < Ten_Thousand*100:
- expStr = "%.1f%s"%(exp*1.0/Ten_Thousand, wanStr)
- else:
- expStr = "%s%s"%(exp/Ten_Thousand, wanStr)
- else:
- expStr = exp
-
- tjgTime = PlayerTJG.GetTJGTime(curPlayer)
-
- GeTuiNotify({GameWorld.GetPlayerPlatform(curPlayer) : [[GetGeTuiClientID(curPlayer), curPlayer.GetName()]]},
- GameWorld.GbkToCode(showStr%(expStr, tjgTime/60/60, tjgTime/60%60)))
- return
-
-#您被[其他玩家名]杀死,剩余脱机外挂时间:**小时**分钟
-def TJGDead(curPlayer, tagName):
- if curPlayer.GetGameObjType() != IPY_GameWorld.gotPlayer:
- return
- if not PlayerTJG.GetIsTJG(curPlayer):
- return
-
- if not CheckCanGeTui(curPlayer):
- return
-
- showStr = GameWorld.GbkToCode(IpyGameDataPY.GetFuncCfg("GeTuiTJG", 2)) # 文字信息
- tjgTime = PlayerTJG.GetTJGTime(curPlayer)
-
- GeTuiNotify({GameWorld.GetPlayerPlatform(curPlayer) : [[GetGeTuiClientID(curPlayer), curPlayer.GetName()]]},
- showStr%(tagName, tjgTime/60/60, tjgTime/60%60))
- return
-
-# [玩家名]当前背包已满,赶快上线查收战利品吧
-def FullPack(curPlayer):
- # 背包满只处理一次,外层已拦截
- #===========================================================================
- # if curPlayer.GetDictByKey("GTFullPack"):
- # return
- # curPlayer.SetDict("GTFullPack", 1)
- #===========================================================================
-
- if not CheckCanGeTui(curPlayer):
- return
-
- showStr = GameWorld.GbkToCode(IpyGameDataPY.GetFuncCfg("GeTuiTJG", 3)) # 文字信息
- GeTuiNotify({GameWorld.GetPlayerPlatform(curPlayer) : [[GetGeTuiClientID(curPlayer), curPlayer.GetName()]]}, showStr)
-
-
-
-
\ No newline at end of file
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
index e9857e7..65509d3 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
@@ -34,7 +34,6 @@
import PlayerAutoCheckOnline
import PlayerGameWallow
import ReadChConfig
-import PlayerViewCacheTube
import PlayerDienstgrad
import PlayerVip
import IpyGameDataPY
@@ -1274,9 +1273,6 @@
#副本相关时间处理
PlayerFB.DoPlayerFBTimeProcess(curPlayer, tick)
-
- #玩家数据缓存定时同步
- PlayerViewCacheTube.ProcessCache(curPlayer, tick)
#脱机计算
#PlayerTJG.ProcessPlayerTJG(curPlayer, tick)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTJG.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTJG.py
index b205439..bd2e468 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTJG.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTJG.py
@@ -48,7 +48,6 @@
import math
import PassiveBuffEffMng
import PlayerPet
-import PlayerGeTui
import ChEquip
import QuestCommon
import random
@@ -284,8 +283,6 @@
ChangeGuard(curPlayer, tick)
times, finalAddExp = CalcPlayerTJG(curPlayer, tick)
- #PlayerGeTui.TJGEfficiency(curPlayer, times, finalAddExp)
- #PlayerGeTui.TJGTimeLess(curPlayer)
return
def GetTJGTime(curPlayer): return curPlayer.GetHappyPoint()
@@ -619,7 +616,6 @@
def CheckPackFull(curPlayer):
if not ItemCommon.CheckPackHasSpace(curPlayer, IPY_GameWorld.rptItem):
curPlayer.SetDict(ChConfig.Def_PlayerKey_TJGPackFullAfterEat, 1)
- #PlayerGeTui.FullPack(curPlayer)
# 可执行吞噬操作
def CanEatItemsOper(curPlayer):
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
-
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCache.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCache.py
new file mode 100644
index 0000000..cd5d600
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCache.py
@@ -0,0 +1,298 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Player.PlayerViewCache
+#
+# @todo:玩家缓存
+# @author hxp
+# @date 2025-5-22
+# @version 1.0
+#
+# 详细描述: 玩家缓存
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2025-5-22 下午6:37:10"""
+#-------------------------------------------------------------------------------
+
+import ChConfig
+import GameWorld
+import PyMongoMain
+import PlayerControl
+import NetPackCommon
+import ChPyNetSendPack
+import IpyGameDataPY
+import ShareDefine
+import DBDataMgr
+import GameObj
+
+import random
+import time
+
+Key_UpdViewCacheTick = "UpdViewCacheTick"
+
+def OnDay():
+ DelOutofTimeViewCacheData()
+ return
+
+def OnPlayerLogout(curPlayer):
+ if curPlayer.GetLV() < 10:
+ return
+
+ curCache = UpdPlayerViewCache(curPlayer)
+ if curCache and not IsSaveDBViewCache(curCache):
+ DBDataMgr.GetPlayerViewCacheMgr().DelPlayerViewCache(curPlayer.GetPlayerID())
+
+ return
+
+def DelOutofTimeViewCacheData():
+ ## 删除过期的查看缓存数据
+
+ playerManager = GameWorld.GetPlayerManager()
+ viewCacheMgr = DBDataMgr.GetPlayerViewCacheMgr()
+ for index in range(viewCacheMgr.GetCount())[::-1]: # 有删除需倒序遍历
+ viewCache = viewCacheMgr.At(index)
+ playerID = viewCache.GetPlayerID()
+ curPlayer = playerManager.FindPlayerByID(playerID)
+ if curPlayer:
+ continue
+ if IsSaveDBViewCache(viewCache):
+ continue
+ viewCacheMgr.DelPlayerViewCache(playerID)
+
+ return
+
+def IsSaveDBViewCache(viewCache):
+ ## 缓存数据是否入库
+ if not viewCache:
+ return False
+
+ playerID = viewCache.GetPlayerID()
+
+ #某个功能中不能删除的
+ #...
+
+
+ #排行版上的默认保留
+ billboardMgr = DBDataMgr.GetBillboardMgr()
+ for bType in ShareDefine.BillboardTypeAllList:
+ if bType in ShareDefine.FamilyBillboardList:
+ continue
+ groupList = billboardMgr.GetBillboardGroupList(bType)
+ for billboardType, groupValue1, groupValue2 in groupList:
+ billboardObj = billboardMgr.GetBillboard(billboardType, groupValue1, groupValue2)
+ if billboardObj.FindByID(playerID):
+ return True
+
+ # 以上是相关功能需要用到的数据,必定不能删除的
+
+ # 以下是保留近期活跃玩家,等级限制
+ playerLV = viewCache.GetLV()
+ if playerLV >= IpyGameDataPY.GetFuncCfg("PlayerViewCache", 1):
+ maxDays = IpyGameDataPY.GetFuncCfg("PlayerViewCache", 2)
+ if not maxDays:
+ maxDays = 7 # 默认7天
+ MaxTime = maxDays * 3600 * 24
+ curTime = int(time.time())
+ passTime = curTime - viewCache.GetOffTime()
+ if passTime < MaxTime:
+ return True
+
+ return False
+
+def FindViewCache(playerID, isAdd=False):
+ '''查找玩家缓存,如果不存在,则会有额外逻辑,如从redis、db直接找,
+ 本服玩家理论上一定有查看缓存,因为如果不存在会直接从db读,除非该玩家数据被删除
+ 跨服玩家理论上也一定有缓存,只是通过跨服或从子服查询,延迟获得
+ 【注】外层调用依然要判断是否有数据
+ '''
+
+ viewCacheMgr = DBDataMgr.GetPlayerViewCacheMgr()
+ curCache = viewCacheMgr.GetPlayerViewCache(playerID)
+ if curCache:
+ updCache = __CheckUpdViewCache(playerID)
+ if updCache:
+ curCache = updCache
+
+ # 真实玩家
+ elif playerID > ShareDefine.FackPlayerIDMax:
+ curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
+ # 本服在线玩家,直接生成新数据
+ if curPlayer:
+ curCache = viewCacheMgr.AddPlayerViewCache(playerID)
+ UpdPlayerViewCache(curPlayer)
+
+ # 本服离线玩家
+ elif GameWorld.GetDBPlayerAccIDByID(playerID):
+ # 本服玩家,从redis或db读取重新加载读取,换句话说,本服玩家只要获取一定有查看缓存数据
+ curCache = UpdPlayerViewCacheByDB(playerID)
+
+ # 跨服玩家
+ else:
+ pass
+ # 跨服玩家,去子服拉取数据,理论上也一定有,但是如果需要拉数据,有一定延迟
+ # 逻辑待扩展
+
+ # 假玩家,默认添加
+ elif ShareDefine.FackPlayerIDStart <= playerID <= ShareDefine.FackPlayerIDMax:
+ serverID = playerID % 100 + 1 # 1 ~ 100 服
+ accID = "fake%s@test@s%s" % (playerID, serverID)
+ fightPower = random.randint(1000000, 100000000) # 先随机,外层有需要的话再自己设置
+
+ curCache = viewCacheMgr.AddPlayerViewCache(playerID)
+ curCache.SetPlayerName("%s%s" % (GameWorld.GbkToCode("神秘道友"), playerID))
+ curCache.SetAccID(accID)
+ curCache.SetLV(random.randint(100, 200))
+ curCache.SetJob(random.randint(1, 2))
+ curCache.SetRealmLV(random.randint(5, 15))
+ curCache.SetFightPowerTotal(fightPower)
+ curCache.SetServerID(serverID)
+ curCache.SetOffTime(int(time.time()) - random.randint(1, 3600 * 24 * 10)) # 随机离线 0~10天
+
+ return curCache
+
+def __CheckUpdViewCache(playerID):
+ if playerID <= ShareDefine.FackPlayerIDMax:
+ return
+ curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
+ if not curPlayer:
+ return
+ lastUpdTick = curPlayer.GetDictByKey(Key_UpdViewCacheTick)
+ tick = GameWorld.GetGameWorld().GetTick()
+ if lastUpdTick and tick - lastUpdTick < 60000:
+ GameWorld.DebugLog("1分钟内只更新一次玩家缓存", playerID)
+ return
+ curPlayer.SetDict(Key_UpdViewCacheTick, tick)
+ return UpdPlayerViewCache(curPlayer)
+
+def UpdPlayerViewCache(curPlayer, isOffline=False):
+ '''更新玩家查看缓存数据,更新时机由外层自己判断,这里只做更新逻辑
+ 1. 下线时强制更新一次,上线暂不更新,上线时由各功能如果有需要用到触发更新
+ 2. 有需要用到缓存数据时,如果玩家在线,1分钟内多次获取时最多更新一次,没有获取缓存数据则不更新
+ '''
+ if not curPlayer:
+ return
+
+ playerID = curPlayer.GetPlayerID()
+ curCache = DBDataMgr.GetPlayerViewCacheMgr().GetPlayerViewCache(playerID)
+ if not curCache:
+ return
+
+ tick = GameWorld.GetGameWorld().GetTick()
+ curPlayer.SetDict(Key_UpdViewCacheTick, tick)
+ GameWorld.DebugLog("更新玩家查看缓存数据! isOffline=%s" % isOffline, playerID)
+ curCache.SetAccID(curPlayer.GetAccID())
+ curCache.SetPlayerName(curPlayer.GetPlayerName())
+ curCache.SetLV(curPlayer.GetLV())
+ curCache.SetJob(curPlayer.GetJob())
+ curCache.SetRealmLV(curPlayer.GetOfficialRank())
+ curCache.SetFace(curPlayer.GetFace())
+ curCache.SetFacePic(curPlayer.GetFacePic())
+ curCache.SetFamilyID(curPlayer.GetFamilyID())
+ curCache.SetFamilyName(curPlayer.GetFamilyName())
+ curCache.SetFamilyEmblemID(PlayerControl.GetFamilyEmblemID(curPlayer))
+ curCache.SetTitleID(PlayerControl.GetTitleID(curPlayer))
+ curCache.SetFightPowerTotal(PlayerControl.GetFightPower(curPlayer))
+ curCache.SetServerID(GameWorld.GetPlayerServerID(curPlayer))
+ if isOffline:
+ curCache.SetOffTime(int(time.time()))
+
+ plusDict = curCache.GetPlusDict()
+
+ #战斗属性
+ plusDict.update({
+ "MinAtk":curPlayer.GetMinAtk(),
+ "MaxAtk":curPlayer.GetMaxAtk(),
+ "Def":curPlayer.GetDef(),
+ "MaxHP":GameObj.GetMaxHP(curPlayer),
+ "Hit":curPlayer.GetHit(),
+ "Miss":curPlayer.GetMiss(),
+ "SuperHitRate":curPlayer.GetSuperHitRate(), # 暴击率
+ })
+
+ # 功能数据
+
+ # 其他
+
+ return curCache
+
+def UpdPlayerViewCacheByDB(playerID):
+ '''更新玩家查看缓存数据,直接从db数据更新,仅更新dbPlayer表有的属性,
+ '''
+ GameWorld.DebugLog("UpdPlayerViewCacheByDB", playerID)
+ curCache = None
+ dbPlayer = PyMongoMain.GetUserCtrlDB().findDBPlayer(playerID)
+ if not dbPlayer:
+ GameWorld.DebugLog("1111111111111111", playerID)
+ return curCache
+ viewCacheMgr = DBDataMgr.GetPlayerViewCacheMgr()
+ curCache = viewCacheMgr.GetPlayerViewCache(playerID)
+ if not curCache:
+ curCache = viewCacheMgr.AddPlayerViewCache(playerID)
+ familyID = dbPlayer.FamilyID
+ GameWorld.DebugLog("db查找直接更新玩家查看缓存数据!", playerID)
+ curCache.SetAccID(dbPlayer.AccID)
+ curCache.SetPlayerName(dbPlayer.PlayerName)
+ curCache.SetLV(dbPlayer.LV)
+ curCache.SetJob(dbPlayer.Job)
+ curCache.SetRealmLV(dbPlayer.OfficialRank)
+ curCache.SetFace(dbPlayer.Face)
+ curCache.SetFacePic(dbPlayer.FacePic)
+ curCache.SetFamilyID(familyID)
+ family = DBDataMgr.GetFamilyMgr().FindFamily(familyID)
+ curCache.SetFamilyName(family.GetName() if family else "")
+ curCache.SetFamilyEmblemID(family.GetEmblemID() if family else 0)
+ #curCache.SetTitleID(PlayerControl.GetTitleID(curPlayer))
+ curCache.SetFightPowerTotal(dbPlayer.FightPowerEx * ChConfig.Def_PerPointValue + dbPlayer.FightPower)
+ curCache.SetServerID(GameWorld.GetAccIDServerID(dbPlayer.AccID))
+ curCache.SetOffTime(GameWorld.ChangeTimeStrToNum(dbPlayer.LogoffTime) if dbPlayer.LogoffTime else 0)
+ return curCache
+
+#//A2 12 查看玩家详细信息#tagCMViewPlayerInfo
+#struct tagCMViewPlayerInfo
+#{
+# tagHead Head;
+# DWORD PlayerID;
+# BYTE EquipClassLV; //大于0为查看指定境界阶装备信息, 0为查看默认信息
+#};
+def OnCMViewPlayerInfo(index, clientPack, tick):
+ curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+
+ findPlayerID = clientPack.PlayerID
+ #equipClassLV = clientPack.EquipClassLV
+
+ clientPack = GetPack_ViewCache(findPlayerID)
+ if clientPack:
+ NetPackCommon.SendFakePack(curPlayer, clientPack)
+ return
+ if GameWorld.GetDBPlayerAccIDByID(findPlayerID):
+ PlayerControl.NotifyCode(curPlayer, "ViewPlayer_OffLine")
+ return
+
+ # 跨服玩家发送跨服查询,待扩展...
+
+ return
+
+def GetPack_ViewCache(playerID):
+ ## 获取同步封包 - 玩家查看缓存
+ curCache = FindViewCache(playerID)
+ if not curCache:
+ return
+ clientPack = ChPyNetSendPack.tagSCQueryPlayerCacheResult()
+ clientPack.PlayerID = curCache.GetPlayerID()
+ clientPack.PlayerName = curCache.GetPlayerName()
+ clientPack.LV = curCache.GetLV()
+ clientPack.Job = curCache.GetJob()
+ clientPack.RealmLV = curCache.GetRealmLV()
+ clientPack.Face = curCache.GetFace()
+ clientPack.FacePic = curCache.GetFacePic()
+ clientPack.TitleID = curCache.GetTitleID()
+ clientPack.ServerID = curCache.GetServerID()
+ clientPack.FightPower = curCache.GetFightPower()
+ clientPack.FightPowerEx = curCache.GetFightPowerEx()
+ clientPack.FamilyID = curCache.GetFamilyID()
+ clientPack.FamilyName = curCache.GetFamilyName()
+ clientPack.FamilyEmblemID = curCache.GetFamilyEmblemID()
+ clientPack.PlusData = curCache.GetPlusData()
+ clientPack.PlusDataSize = len(clientPack.PlusData)
+ return clientPack
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
deleted file mode 100644
index 7a9b4ad..0000000
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
+++ /dev/null
@@ -1,493 +0,0 @@
-#!/usr/bin/python
-# -*- coding: GBK -*-
-#
-#
-##@package PlayerViewCacheTube.py
-#
-# @todo:玩家数据缓存 地图服务器处理模块
-#
-# @author xmnathan
-# @date 2010-01-01 21:30
-# @version 1.0
-# @note:
-#------------------------------------------------------------------------------
-#"""Version = 2017-11-27 22:30"""
-#------------------------------------------------------------------------------
-import ChConfig
-import GameWorld
-import ShareDefine
-import NetPackCommon
-import PlayerControl
-import IPY_GameWorld
-import ChPyNetSendPack
-import DBStruct
-import ChMapToGamePyPack
-import PlayerMagicWeapon
-import Operate_EquipStone
-import Operate_EquipWash
-import PlayerAttrFruit
-import ItemControler
-import IpyGameDataPY
-import PlayerHorse
-import ChEquip
-import ItemCommon
-import PyGameData
-import PlayerTJG
-import SkillShell
-import GameObj
-
-import base64
-import time
-import json
-
-TempDBPlayer = DBStruct.tagDBPlayer()
-
-Def_Process_Tick = "ProcessPlayerCache"
-
-def OnPlayerLogOut(curPlayer, tick):
- ##玩家下线同步
- UpdateGameServerPlayerCache(curPlayer, tick, True)
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipViewCacheState, 0)
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PackDataSyncState, 0)
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PackDataSyncFightPower, 0)
- return
-
-def ProcessCache(curPlayer, tick):
- ##玩家在线定时同步
- lastTick = curPlayer.GetDictByKey(Def_Process_Tick)
- if not lastTick:
- curPlayer.SetDict(Def_Process_Tick, tick)
- return
- if tick - lastTick < 5 * 60 * 1000: # 同步玩家缓存间隔
- return
- UpdateGameServerPlayerCache(curPlayer, tick, False)
- return
-
-def GetDBPlayerByPackData(packData):
- ## 根据 curPlayer.GetPackData() 打包返回的数据获取DBPlayer数据
- TempDBPlayer.clear()
- if packData:
- TempDBPlayer.readData(base64.b64decode(packData))
- return TempDBPlayer
-
-def GetSyncPlayerPackData(curPlayer, force=False):
- playerID = curPlayer.GetPlayerID()
- fightPower = curPlayer.GetFightPower()
-
- if not force:
- syncState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PackDataSyncState)
- if not syncState:
- GameWorld.DebugLog("不需要同步打包数据", playerID)
- return ""
- # 值判断求余部分即可
- syncFightPower = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PackDataSyncFightPower)
- if syncFightPower == fightPower:
- GameWorld.DebugLog("战力不变,不需要同步打包数据! syncFightPower=%s" % syncFightPower, playerID)
- return ""
-
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PackDataSyncFightPower, fightPower)
- packData = curPlayer.GetPackData()
- #GameWorld.DebugLog("packData=%s %s %s" % (type(packData), len(packData), packData), playerID)
- return packData
-
-def UpdPackDataSyncState(curPlayer, msgData):
- ## 更新打包数据同步状态,这里只更新状态即可,具体同步由定时同步处理
- syncState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PackDataSyncState)
- updSyncState = syncState
- if msgData.get("PackData"):
- updSyncState = GameWorld.SetBitValue(updSyncState, 0, 1)
- if msgData.get("PackDataCross"):
- updSyncState = GameWorld.SetBitValue(updSyncState, 1, 1)
- if msgData.get("ViewCacheCross"):
- updSyncState = GameWorld.SetBitValue(updSyncState, 2, 1)
- if syncState == updSyncState:
- return
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PackDataSyncState, updSyncState)
- GameWorld.DebugLog("更新打包数据同步状态: msgData=%s,syncState=%s,updSyncState=%s"
- % (msgData, syncState, updSyncState), curPlayer.GetPlayerID())
- return
-
-def SetPackDataSyncState(curPlayer): UpdPackDataSyncState(curPlayer, {"PackData":1})
-def SetPackDataCrossSyncState(curPlayer): UpdPackDataSyncState(curPlayer, {"PackDataCross":1})
-def SetViewCacheCrossSyncState(curPlayer): UpdPackDataSyncState(curPlayer, {"ViewCacheCross":1})
-
-def NormalSyncPackData(curPlayer):
- '''常规同步打包数据,仅作为补充同步用,不强制同步
- 一般由需要打包数据的功能发起检查自动同步用,做战力验证,战力变更时主动同步一次
- 防止短时间内强化了战力,导致镜像数据差异太大,影响镜像战斗结果
- '''
-
- syncFightPower = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PackDataSyncFightPower)
- if PlayerControl.GetFightPower(curPlayer) == syncFightPower:
- GameWorld.DebugLog("战力与打包数据相同,不同步!", curPlayer.GetPlayerID())
- return
- GameWorld.DebugLog("战力与打包数据不同,立即同步!", curPlayer.GetPlayerID())
-
- syncState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PackDataSyncState)
- if not syncState:
- SetPackDataSyncState(curPlayer)
- SetPackDataCrossSyncState(curPlayer)
-
- tick = GameWorld.GetGameWorld().GetTick()
- UpdateGameServerPlayerCache(curPlayer, tick)
- return
-
-##更新玩家当前详细信息到GameServer
-# @param curPlayer, tick
-# @return None
-def UpdateGameServerPlayerCache(curPlayer, tick, IsLogouting=False, forcePackData=False, packMsg=None, isOnlyViewCache=False):
- if PlayerTJG.GetIsTJG(curPlayer):
- # 脱机不处理
- return
- curPlayer.SetDict(Def_Process_Tick, tick)
- PackDataSyncState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PackDataSyncState)
- isAllEquip = False
- # 需要同步跨服缓存 且 还没同步装备的
- if PackDataSyncState&pow(2, 2) and curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipViewCacheState) != 2:
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipViewCacheState, 2)
- isAllEquip = True
- GameWorld.DebugLog("本次登录首次同步跨服缓存,全装备同步", curPlayer.GetPlayerID())
-
- if forcePackData:
- SetPackDataSyncState(curPlayer)
- SetPackDataCrossSyncState(curPlayer)
- PackDataSyncState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PackDataSyncState)
-
- #获取当前玩家缓存数据
- PropData, PlusData = GetPlayerPropPlusCache(curPlayer)
- itemDataDict = __GetPlayerItemDataCache(curPlayer, isAllEquip)
-
- #同步发送到GameServer
- sendPack = ChMapToGamePyPack.tagMGUpdatePlayerCache()
- sendPack.PlayerID = curPlayer.GetPlayerID()
- sendPack.PlayerLV = curPlayer.GetLV()
- sendPack.IsLogouting = IsLogouting #通知本次同步是否下线前保存
- sendPack.OffTime = int(time.time()) # 最后一次发送即当做离线时间
- sendPack.PropData = PropData
- sendPack.PropDataSize = len(sendPack.PropData)
- sendPack.PlusData = PlusData
- sendPack.PlusDataSize = len(sendPack.PlusData)
- for classLV, itemData in itemDataDict.items():
- setattr(sendPack, "ItemData%s" % classLV, itemData)
- setattr(sendPack, "ItemDataSize%s" % classLV, len(itemData))
- # 打包数据相关
- sendPack.PackDataSyncState = PackDataSyncState
- sendPack.PackData = "" if isOnlyViewCache else GetSyncPlayerPackData(curPlayer, forcePackData)
- sendPack.PackDataLen = len(sendPack.PackData)
- sendPack.PackMsg = str(packMsg) if packMsg else "{}"
- sendPack.PackMsgLen = len(sendPack.PackMsg)
- GameWorld.DebugLog("同步缓存: logout=%s,forcePackData=%s,isOnlyViewCache=%s,PackDataSyncState=%s,isAllEquip=%s,classList=%s"
- % (IsLogouting, forcePackData, isOnlyViewCache, PackDataSyncState, isAllEquip, itemDataDict.keys()), curPlayer.GetPlayerID())
- NetPackCommon.SendPyPackToGameServer(sendPack)
- return
-
-def __GetPlayerItemDataCache(curPlayer, isAllEquip=False):
- ## 装备及装备位养成缓存,由于装备位比较多,所以按阶同步,重登第一次同步所有阶
- if not isAllEquip and not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipViewCacheState):
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipViewCacheState, 1)
- isAllEquip = True
-
- if isAllEquip:
- needSyncClassLVList = xrange(1, IpyGameDataPY.GetFuncCfg('EquipMaxClasslv') + 1)
- else:
- playerID = curPlayer.GetPlayerID()
- needSyncClassLVList = PyGameData.g_equipChangeClassLVInfo.pop(playerID, [])
-
- itemDataDict = {}
- for classLV in needSyncClassLVList:
- itemDataDict[classLV] = __GetPlayerEquipClassDataCache(curPlayer, classLV)
-
- return itemDataDict
-
-def __GetPlayerEquipClassDataCache(curPlayer, classLV):
- ## 获取境界阶装备缓存数据
- ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'ClassLV':classLV}, True)
- if not ipyDataList:
- return "{}"
-
- packType = IPY_GameWorld.rptEquip
- equipPack = curPlayer.GetItemManager().GetPack(packType)
- classItemDataDict = {}
- for ipyData in ipyDataList:
- index = ipyData.GetGridIndex()
-
- curEquip = equipPack.GetAt(index)
- if not curEquip or curEquip.IsEmpty():
- continue
-
- itemDict = {}
- itemDict["ItemID"] = curEquip.GetItemTypeID()
- userData = curEquip.GetUserData()
- if userData and userData != "{}":
- itemDict["UserData"] = userData
-
- classItemDataDict[index] = itemDict
- classLV = ItemCommon.GetItemClassLV(curEquip)
- if not classLV:
- continue
-
- #部位升星数据
- equipStar = ChEquip.GetEquipPartStarByRank(curPlayer, index, curEquip)
- if equipStar:
- itemDict["Star"] = equipStar
-
- #部位强化数据
- equipPartPlusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, index)
- equipPartPlusEvolveLV = ChEquip.GetEquipPartPlusEvolveLV(curPlayer, packType, index)
- if equipPartPlusLV:
- itemDict["PlusLV"] = equipPartPlusLV
- if equipPartPlusEvolveLV:
- itemDict["EvolveLV"] = equipPartPlusEvolveLV
-
- #部位宝石数据
- stoneIDList = Operate_EquipStone.GetEquipIndexStoneIDList(curPlayer, index)
- if stoneIDList and stoneIDList.count(0) != len(stoneIDList):
- itemDict["Stone"] = stoneIDList
-
- #部位洗练数据
- washLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashLV % index)
- valueList = []
- for attrNum in xrange(1, Operate_EquipWash.Def_EquipWashMaxAttrCount + 1):
- value = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashValue % (index, attrNum))
- valueList.append(value)
- if valueList and valueList.count(0) != len(valueList):
- itemDict["Wash"] = {"LV":washLV, "Value":valueList}
-
- return json.dumps(classItemDataDict, ensure_ascii=False).replace(" ", "")
-
-def GetPlayerPropPlusCache(curPlayer):
- #玩家属性缓存
- curPlayerPropDict = {}
- curPlayerPropDict["AccID"] = curPlayer.GetAccID()
- curPlayerPropDict["LV"] = curPlayer.GetLV()
- curPlayerPropDict["RealmLV"] = curPlayer.GetOfficialRank()
- curPlayerPropDict["Job"] = curPlayer.GetJob()
- curPlayerPropDict["VIPLV"] = curPlayer.GetVIPLv()
- curPlayerPropDict["Name"] = curPlayer.GetPlayerName()
- curPlayerPropDict["Face"] = curPlayer.GetFace()
- curPlayerPropDict["FacePic"] = curPlayer.GetFacePic()
- curPlayerPropDict["FamilyID"] = curPlayer.GetFamilyID()
- curPlayerPropDict["FamilyName"] = curPlayer.GetFamilyName()
- curPlayerPropDict["FamilyEmblemID"] = PlayerControl.GetFamilyEmblemID(curPlayer)
- curPlayerPropDict["TitleID"] = PlayerControl.GetTitleID(curPlayer)
- curPlayerPropDict["CoupleName"] = PlayerControl.GetCoupleName(curPlayer)
- curPlayerPropDict["FightPower"] = PlayerControl.GetFightPower(curPlayer)
- curPlayerPropDict["AppID"] = GameWorld.GetPlayerPlatform(curPlayer)
- curPlayerPropDict["EquipShowSwitch"] = curPlayer.GetEquipShowSwitch()
- curPlayerPropDict["EquipShowID"] = __GetEquipShowIDList(curPlayer)
- curPlayerPropDict["ServerGroupID"] = PlayerControl.GetPlayerServerGroupID(curPlayer)
- curPlayerPropDict["LingGenPoint"] = [PlayerControl.GetMetal(curPlayer), PlayerControl.GetWood(curPlayer), PlayerControl.GetWater(curPlayer),
- PlayerControl.GetFire(curPlayer), PlayerControl.GetEarth(curPlayer)]
-
- #战斗属性
- curPlayerPropDict["MinAtk"] = curPlayer.GetMinAtk()
- curPlayerPropDict["MaxAtk"] = curPlayer.GetMaxAtk()
- curPlayerPropDict["Def"] = curPlayer.GetDef()
- curPlayerPropDict["MaxHP"] = GameObj.GetMaxHP(curPlayer)
- curPlayerPropDict["Hit"] = curPlayer.GetHit()
- curPlayerPropDict["Miss"] = curPlayer.GetMiss()
- curPlayerPropDict["SkillAtkRate"] = curPlayer.GetSkillAtkRate() # 技能攻击比例加成
- curPlayerPropDict["SkillAtkRateReduce"] = PlayerControl.GetSkillAtkRateReduce(curPlayer) # 技能攻击比例减少
- curPlayerPropDict["LuckyHitRate"] = curPlayer.GetLuckyHitRate() # 会心一击几率
- curPlayerPropDict["LuckyHitVal"] = curPlayer.GetLuckyHitVal() # 会心一击伤害固定值
- curPlayerPropDict["LuckyHitRateReduce"] = PlayerControl.GetLuckyHitRateReduce(curPlayer) # 会心一击概率抗性
- curPlayerPropDict["LuckyHitReduce"] = PlayerControl.GetLuckyHitReduce(curPlayer) # 会心一击伤害减免固定值
- curPlayerPropDict["SuperHitRate"] = curPlayer.GetSuperHitRate() # 暴击概率
- curPlayerPropDict["SuperHit"] = curPlayer.GetSuperHit() # 暴击伤害固定值
- curPlayerPropDict["SuperHitRateReduce"] = PlayerControl.GetSuperHitRateReduce(curPlayer) # 暴击概率抗性
- curPlayerPropDict["SuperHitReduce"] = PlayerControl.GetSuperHitReduce(curPlayer) # 暴击伤害抗性固定值
- curPlayerPropDict["IceAtk"] = curPlayer.GetIceAtk() # 真实伤害 固定值
- curPlayerPropDict["IceDef"] = curPlayer.GetIceDef() # 真实伤害防御 固定值
- curPlayerPropDict["IgnoreDefRate"] = curPlayer.GetIgnoreDefRate() # 无视防御几率
- curPlayerPropDict["IgnoreDefRateReduce"] = PlayerControl.GetIgnoreDefRateReduce(curPlayer) # 无视防御概率抗性
- curPlayerPropDict["IgnoreDefReducePer"] = PlayerControl.GetIgnoreDefReducePer(curPlayer) # 无视防御伤害减免
- curPlayerPropDict["DamagePVE"] = PlayerControl.GetDamagePVE(curPlayer) # 伤害输出计算固定值PVE
- curPlayerPropDict["DamagePerPVP"] = PlayerControl.GetDamagePerPVP(curPlayer) # 伤害输出计算百分比PVP
- curPlayerPropDict["DamagePerPVPReduce"] = PlayerControl.GetDamagePerPVPReduce(curPlayer) # 伤害输出计算百分比PVP减少
- curPlayerPropDict["DamagePVP"] = PlayerControl.GetDamagePVP(curPlayer) # PVP固定伤害
- curPlayerPropDict["DamagePVPReduce"] = PlayerControl.GetDamagePVPReduce(curPlayer) # PVP固定减伤
- curPlayerPropDict["FinalHurt"] = PlayerControl.GetFinalHurt(curPlayer) # 最终固定伤害增加
- curPlayerPropDict["FinalHurtReduce"] = PlayerControl.GetFinalHurtReduce(curPlayer) # 最终固定伤害减少
- curPlayerPropDict["FinalHurtPer"] = PlayerControl.GetFinalHurtPer(curPlayer) # 最终伤害百分比
- curPlayerPropDict["FinalHurtReducePer"] = PlayerControl.GetFinalHurtReducePer(curPlayer) # 最终伤害减少百分比
- curPlayerPropDict["OnlyFinalHurt"] = PlayerControl.GetOnlyFinalHurt(curPlayer) # 额外输出伤害
- curPlayerPropDict["DamChanceDef"] = PlayerControl.GetDamChanceDef(curPlayer) # 20%的概率抵御伤害比率
- curPlayerPropDict["NPCHurtAddPer"] = PlayerControl.GetNPCHurtAddPer(curPlayer) # 对怪物伤害加成
- curPlayerPropDict["AtkBackHPPer"] = PlayerControl.GetAtkBackHPPer(curPlayer) # 攻击回复血量固定值
- curPlayerPropDict["PVPAtkBackHP"] = PlayerControl.GetPVPAtkBackHP(curPlayer) # PVP攻击回血
- curPlayerPropDict["FaintRate"] = PlayerControl.GetFaintRate(curPlayer) # 触发击晕
- curPlayerPropDict["FaintDefRate"] = PlayerControl.GetFaintDefRate(curPlayer) # 击晕抵抗
-
- #-----------
- #扩展属性缓存
- curPlayerPlusDict = {}
-
- #各模块战力
- fightPowerDict = {}
- for mfpType in ShareDefine.ModuleFightPowerTypeList:
- fightPower = PlayerControl.GetMFPFightPower(curPlayer, mfpType)
- if fightPower:
- fightPowerDict["%s" % mfpType] = fightPower
- curPlayerPlusDict["FightPowerDict"] = fightPowerDict
-
- #装备汇总信息
- curPlayerPlusDict["EquipOrangeCount"] = ChEquip.GetEquipOrangeCount(curPlayer)
- curPlayerPlusDict["TotalEquipStar"] = ChEquip.GetTotalEquipStars(curPlayer)
- curPlayerPlusDict["TotalPlusLV"] = ChEquip.GetTotalPlusLV(curPlayer)
- curPlayerPlusDict["TotalPlusEvolveLV"] = ChEquip.GetTotalPlusEvolveLV(curPlayer)
- curPlayerPlusDict["TotalStoneLV"] = Operate_EquipStone.GetTotalStoneLV(curPlayer)
- curPlayerPlusDict["TotalEquipWashLV"] = Operate_EquipWash.GetTotalEquipWashLV(curPlayer)
- #主动技能总等级
- curPlayerPlusDict["TotalSkillLV"] = SkillShell.GetAllSkillLV(curPlayer, ChConfig.Def_SkillFuncType_FbSkill)
- #灵宠数据
- curPlayerPlusDict["Pet"] = __GetPetInfo(curPlayer)
-
- #坐骑数据
- curPlayerPlusDict["Horse"] = __GetHorseInfo(curPlayer)
-
- #神器数据
- curPlayerPlusDict["GodWeapon"] = __GetGodWeaponInfo(curPlayer)
-
- #符印数据
- curPlayerPlusDict["Rune"] = __GetRuneInfo(curPlayer)
-
- #法宝数据
- curPlayerPlusDict["MagicWeapon"] = __GetMagicWeaponInfo(curPlayer)
-
- #魂石、丹药使用个数
- curPlayerPlusDict["Fruit"] = PlayerAttrFruit.GetAttrFruitEatCntDict(curPlayer)
-
- PropData = json.dumps(curPlayerPropDict, ensure_ascii=False).replace(" ", "")
- PlusData = json.dumps(curPlayerPlusDict, ensure_ascii=False).replace(" ", "")
- return PropData, PlusData
-
-def __GetEquipShowIDList(curPlayer):
- ## 获取外观装备ID列表
- equipShowIDList = []
- indexList = range(10) + PlayerControl.GetFaceEquipIndexList(curPlayer) # 暂写死前10个物品 + 展示的境界装备部位
- equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
- for index in indexList:
- curEquip = equipPack.GetAt(index)
- if not curEquip or curEquip.IsEmpty():
- continue
- equipShowIDList.append(curEquip.GetItemTypeID())
- return equipShowIDList
-
-## 灵宠信息
-def __GetPetInfo(curPlayer):
- petInfo = {}
- petClassLVList = []
- equipPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptPet)
- for index in xrange(equipPack.GetCount()):
- packItem = equipPack.GetAt(index)
- if not packItem or packItem.IsEmpty():
- continue
- petNPCID = packItem.GetUserAttr(ShareDefine.Def_IudetPet_NPCID)
- classLV = packItem.GetUserAttr(ShareDefine.Def_IudetPet_ClassLV)
- petClassLVList.append({"id":petNPCID, 'lv':classLV})
-
- petInfo["PetLV"] = petClassLVList
- petInfo["AtkSpeed"] = PlayerControl.GetAtkSpeed(curPlayer)
- return petInfo
-
-## 坐骑信息
-def __GetHorseInfo(curPlayer):
- skinEndTimeInfo = {}
- ipyDataMgr = IpyGameDataPY.IPY_Data()
- for index in xrange(ipyDataMgr.GetHorseSkinPlusCount()):
- skinPlusIpyData = ipyDataMgr.GetHorseSkinPlusByIndex(index)
- skinID = skinPlusIpyData.GetID()
- if not skinPlusIpyData.GetSkinValidTime():
- continue
- skinEndTimeInfo[skinID] = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserSkinEndTime % skinID)
- horseInfo = {"LV":curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserLV),
- "EatItemCount":curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserEatItemCount),
- "SkinPlusStateList":PlayerHorse.GetHorseSkinPlusStateList(curPlayer),
- "SkinEndTimeInfo":skinEndTimeInfo,
- }
- return horseInfo
-
-## 神器信息
-def __GetGodWeaponInfo(curPlayer):
- godWeaponDict = {}
- ipyDataMgr = IpyGameDataPY.IPY_Data()
- maxType = ipyDataMgr.GetGodWeaponByIndex(ipyDataMgr.GetGodWeaponCount() - 1).GetType()
- for gwType in xrange(1, maxType + 1):
- gwLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GodWeaponLV % gwType)
- if gwLV:
- godWeaponDict[gwType] = gwLV
- return godWeaponDict
-
-## 符印信息
-def __GetRuneInfo(curPlayer):
- #runeDict = {}
- maxLV = 0
- runeHoleCnt = IpyGameDataPY.GetFuncCfg("RuneUnlock", 4)
- for holeNum in xrange(1, runeHoleCnt + 1):
- runeData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Rune_Data % holeNum, 0)
- if not runeData:
- continue
- #runeItemID = ItemControler.GetRuneItemID(runeData)
- runeItemPlusLV = ItemControler.GetRuneItemPlusLV(runeData)
- #runeDict[holeNum] = [runeItemID, runeItemPlusLV]
- maxLV += runeItemPlusLV
- return maxLV
-
-## 法宝信息
-def __GetMagicWeaponInfo(curPlayer):
- mwDict = {}
- ipyDataMgr = IpyGameDataPY.IPY_Data()
- for i in xrange(ipyDataMgr.GetTreasureCount()):
- treasureIpyData = ipyDataMgr.GetTreasureByIndex(i)
- magicWeaponID = treasureIpyData.GetID()
- treasureType = treasureIpyData.GetTreasureType()
- if PlayerMagicWeapon.GetIsActiveMagicWeapon(curPlayer, magicWeaponID):
- mwDict[treasureType] = mwDict.get(treasureType, 0) + 1
-
- return mwDict
-
-#//A2 12 查看玩家详细信息#tagCMViewPlayerInfo
-#struct tagCMViewPlayerInfo
-#{
-# tagHead Head;
-# DWORD PlayerID;
-# BYTE EquipClassLV; //大于0为查看指定境界阶装备信息, 0为查看默认信息
-#};
-def OnCMViewPlayerInfo(index, clientPack, tick):
- curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
-
- findPlayerID = clientPack.PlayerID
- equipClassLV = clientPack.EquipClassLV
- findPlayer = GameWorld.GetPlayerManager().FindPlayerByID(findPlayerID)
- if findPlayer:
- if equipClassLV:
- sendPack = ChPyNetSendPack.tagSCPlayerEquipCacheResult()
- sendPack.PlayerID = findPlayerID
- sendPack.EquipClassLV = equipClassLV
- sendPack.ItemData = __GetPlayerEquipClassDataCache(findPlayer, equipClassLV)
- sendPack.ItemDataSize = len(sendPack.ItemData)
- NetPackCommon.SendFakePack(curPlayer, sendPack)
- return
-
- #本地图玩家直接返回
- PropData, PlusData = GetPlayerPropPlusCache(findPlayer)
- sendPack = ChPyNetSendPack.tagSCQueryPlayerCacheResult()
- sendPack.PlayerID = findPlayerID
- sendPack.PropData = PropData
- sendPack.PropDataSize = len(sendPack.PropData)
- sendPack.ItemData = ""
- sendPack.ItemDataSize = len(sendPack.ItemData)
- sendPack.PlusData = PlusData
- sendPack.PlusDataSize = len(sendPack.PlusData)
- #GameWorld.DebugLog('ViewCache### OnCMViewPlayerInfo len: %s , sendPack: %s' % (sendPack.GetLength(), sendPack.OutputString()))
- NetPackCommon.SendFakePack(curPlayer, sendPack)
- return
- #发送到GameServer去查询
- sendPack = ChMapToGamePyPack.tagMGQueryPlayerCache()
- sendPack.PlayerID = curPlayer.GetPlayerID()
- sendPack.FindPlayerID = findPlayerID
- sendPack.EquipClassLV = equipClassLV
-
- NetPackCommon.SendPyPackToGameServer(sendPack)
- return
-
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_PlayerMirror.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_PlayerMirror.py
index 591d97a..000d610 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_PlayerMirror.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_PlayerMirror.py
@@ -17,7 +17,6 @@
import GameWorld
import MirrorAttack
-import PlayerViewCacheTube
import PyGameData
#---------------------------------------------------------------------
@@ -62,36 +61,36 @@
return
msgType = funResult[0]
msgData = funResult[1]
-
- if msgType == "PackDataSyncState":
- PlayerViewCacheTube.UpdPackDataSyncState(curPlayer, msgData)
- if msgData.get("PackDataCross"): # 如果跨服需要的,立即同步一次
- PlayerViewCacheTube.UpdateGameServerPlayerCache(curPlayer, tick)
- elif msgType == "PullPlayerPackData":
- msgInfo = msgData
- __DoPullPlayerPackData(curPlayer, msgInfo, tick)
-
- elif msgType == "PullPlayerViewCache":
- msgInfo = msgData
- __DoPullPlayerViewCache(curPlayer, msgInfo, tick)
-
+#
+# if msgType == "PackDataSyncState":
+# PlayerViewCacheTube.UpdPackDataSyncState(curPlayer, msgData)
+# if msgData.get("PackDataCross"): # 如果跨服需要的,立即同步一次
+# PlayerViewCacheTube.UpdateGameServerPlayerCache(curPlayer, tick)
+# elif msgType == "PullPlayerPackData":
+# msgInfo = msgData
+# __DoPullPlayerPackData(curPlayer, msgInfo, tick)
+#
+# elif msgType == "PullPlayerViewCache":
+# msgInfo = msgData
+# __DoPullPlayerViewCache(curPlayer, msgInfo, tick)
+#
return
def __DoPullPlayerPackData(curPlayer, msgInfo, tick):
pullFrom = msgInfo.get("pullFrom")
# 0 或 非本服代表跨服需要
- if pullFrom == 0 or (pullFrom > 0 and pullFrom != GameWorld.GetServerGroupID()):
- PlayerViewCacheTube.SetPackDataCrossSyncState(curPlayer)
- else:
- PlayerViewCacheTube.SetPackDataSyncState(curPlayer)
- PlayerViewCacheTube.UpdateGameServerPlayerCache(curPlayer, tick, forcePackData=True, packMsg=msgInfo)
+# if pullFrom == 0 or (pullFrom > 0 and pullFrom != GameWorld.GetServerGroupID()):
+# PlayerViewCacheTube.SetPackDataCrossSyncState(curPlayer)
+# else:
+# PlayerViewCacheTube.SetPackDataSyncState(curPlayer)
+# PlayerViewCacheTube.UpdateGameServerPlayerCache(curPlayer, tick, forcePackData=True, packMsg=msgInfo)
return
def __DoPullPlayerViewCache(curPlayer, msgInfo, tick):
viewFrom = msgInfo.get("viewFrom")
# 0 或 非本服代表跨服需要
- if viewFrom == 0 or (viewFrom > 0 and viewFrom != GameWorld.GetServerGroupID()):
- PlayerViewCacheTube.SetViewCacheCrossSyncState(curPlayer)
- PlayerViewCacheTube.UpdateGameServerPlayerCache(curPlayer, tick, packMsg=msgInfo, isOnlyViewCache=True)
+# if viewFrom == 0 or (viewFrom > 0 and viewFrom != GameWorld.GetServerGroupID()):
+# PlayerViewCacheTube.SetViewCacheCrossSyncState(curPlayer)
+# PlayerViewCacheTube.UpdateGameServerPlayerCache(curPlayer, tick, packMsg=msgInfo, isOnlyViewCache=True)
return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
index 8eed522..84f5472 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
@@ -26,6 +26,8 @@
g_pyGameDataManager = None
+g_dbPlayerIDMap = {} # 本服DBPlayer玩家表ID映射关系 {playerID:accID, ...}
+
g_mapIDTxtInfo = {} # MapID.txt 加载的信息
g_realmDiffPlayerDict = {} # 境界难度玩家信息 {realm:[playerID, ...], ...}
g_realmDiffNPCRefresh = {} # {(lineID, realm):{refreshID:tagNPCRefresh, ...}}
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Collections/CollectionDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Collections/CollectionDefine.py
index 886a20c..30ab5fd 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Collections/CollectionDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Collections/CollectionDefine.py
@@ -5,6 +5,7 @@
#-------------------------------------------------------------------------------
#
#卡牌服务器表
+UCN_DBGameRec="tagDBGameRec"
UCN_DBFamilyAction="tagDBFamilyAction"
UCN_DBFamilyMem="tagDBFamilyMem"
UCN_DBFamily="tagDBFamily"
@@ -18,7 +19,6 @@
#MMO旧表
UCN_DBPlayerPackData="tagDBPlayerPackData"
-UCN_DBGameRec="tagDBGameRec"
UCN_DBPyFuncTeam="tagDBPyFuncTeam"
UCN_DBPyFuncTeamMem="tagDBPyFuncTeamMem"
UCN_DBPlayerRecData="tagDBPlayerRecData"
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Collections/DataServerPlayerData.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Collections/DataServerPlayerData.py
index 75fc0a3..0252ce3 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Collections/DataServerPlayerData.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Collections/DataServerPlayerData.py
@@ -28697,3 +28697,221 @@
self.Name = Str[:33]
+
+# 通用记录表新 #tagDBGameRec
+class tagDBGameRec(Structure):
+ _pack_ = 1
+ _fields_ = [
+ ('RecType', ctypes.c_ushort),
+ ('RecID', ctypes.c_ulong),
+ ('Time', ctypes.c_double),
+ ('Value1', ctypes.c_ulong),
+ ('Value2', ctypes.c_ulong),
+ ('Value3', ctypes.c_ulong),
+ ('Value4', ctypes.c_ulong),
+ ('Value5', ctypes.c_ulong),
+ ('Value6', ctypes.c_ulong),
+ ('Value7', ctypes.c_ulong),
+ ('Value8', ctypes.c_ulong),
+ ('UserDataLen', ctypes.c_ushort),
+ ('UserData', ctypes.c_char_p),
+ ('ADOResult', ctypes.c_ulong),
+ ]
+
+ def __init__(self):
+ Structure.__init__(self)
+ self.clear()
+
+ def clear(self):
+ self.RecType = 0
+ self.RecID = 0
+ self.Time = 0.0
+ self.Value1 = 0
+ self.Value2 = 0
+ self.Value3 = 0
+ self.Value4 = 0
+ self.Value5 = 0
+ self.Value6 = 0
+ self.Value7 = 0
+ self.Value8 = 0
+ self.UserDataLen = 0
+ self.UserData = ''
+
+ def readData(self, buf, pos = 0, length = 0):
+ if not pos <= length:
+ msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+ mylog.error(msg)
+ return -1
+ if len(buf) < pos + self.getLength():
+ msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+ mylog.error(msg)
+ self.clear()
+ self.RecType, pos = CommFunc.ReadWORD(buf, pos)
+ self.RecID, pos = CommFunc.ReadDWORD(buf, pos)
+ self.Time, pos = CommFunc.ReadDouble(buf, pos)
+ self.Value1, pos = CommFunc.ReadDWORD(buf, pos)
+ self.Value2, pos = CommFunc.ReadDWORD(buf, pos)
+ self.Value3, pos = CommFunc.ReadDWORD(buf, pos)
+ self.Value4, pos = CommFunc.ReadDWORD(buf, pos)
+ self.Value5, pos = CommFunc.ReadDWORD(buf, pos)
+ self.Value6, pos = CommFunc.ReadDWORD(buf, pos)
+ self.Value7, pos = CommFunc.ReadDWORD(buf, pos)
+ self.Value8, pos = CommFunc.ReadDWORD(buf, pos)
+ self.UserDataLen, pos = CommFunc.ReadWORD(buf, pos)
+ tmp, pos = CommFunc.ReadString(buf, pos, self.UserDataLen)
+ self.UserData = ctypes.c_char_p(tmp)
+ return self.getLength()
+
+ def getBuffer(self):
+ buf = ''
+ buf = CommFunc.WriteWORD(buf, self.RecType)
+ buf = CommFunc.WriteDWORD(buf, self.RecID)
+ buf = CommFunc.WriteDouble(buf, self.Time)
+ buf = CommFunc.WriteDWORD(buf, self.Value1)
+ buf = CommFunc.WriteDWORD(buf, self.Value2)
+ buf = CommFunc.WriteDWORD(buf, self.Value3)
+ buf = CommFunc.WriteDWORD(buf, self.Value4)
+ buf = CommFunc.WriteDWORD(buf, self.Value5)
+ buf = CommFunc.WriteDWORD(buf, self.Value6)
+ buf = CommFunc.WriteDWORD(buf, self.Value7)
+ buf = CommFunc.WriteDWORD(buf, self.Value8)
+ buf = CommFunc.WriteWORD(buf, self.UserDataLen)
+ buf = CommFunc.WriteString(buf, self.UserDataLen, self.UserData)
+ return buf
+
+ def getLength(self):
+ length = 0
+ length += sizeof(ctypes.c_ushort)
+ length += sizeof(ctypes.c_ulong)
+ length += sizeof(ctypes.c_double)
+ length += sizeof(ctypes.c_ulong)
+ length += sizeof(ctypes.c_ulong)
+ length += sizeof(ctypes.c_ulong)
+ length += sizeof(ctypes.c_ulong)
+ length += sizeof(ctypes.c_ulong)
+ length += sizeof(ctypes.c_ulong)
+ length += sizeof(ctypes.c_ulong)
+ length += sizeof(ctypes.c_ulong)
+ length += sizeof(ctypes.c_ushort)
+ length += self.UserDataLen
+ return length
+
+ def getRecord(self):
+ '''组织存储记录'''
+ rec = {}
+ rec[u'RecType'] = self.RecType
+ rec[u'RecID'] = self.RecID
+ rec[u'Time'] = self.Time
+ rec[u'Value1'] = self.Value1
+ rec[u'Value2'] = self.Value2
+ rec[u'Value3'] = self.Value3
+ rec[u'Value4'] = self.Value4
+ rec[u'Value5'] = self.Value5
+ rec[u'Value6'] = self.Value6
+ rec[u'Value7'] = self.Value7
+ rec[u'Value8'] = self.Value8
+ rec[u'UserDataLen'] = self.UserDataLen
+ rec[u'UserData'] = fix_incomingText(self.UserData)
+ return rec
+
+ def readRecord(self, rec):
+ '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+ self.RecType = rec.get(u'RecType', 0)
+ self.RecID = rec.get(u'RecID', 0)
+ self.Time = rec.get(u'Time', 0)
+ self.Value1 = rec.get(u'Value1', 0)
+ self.Value2 = rec.get(u'Value2', 0)
+ self.Value3 = rec.get(u'Value3', 0)
+ self.Value4 = rec.get(u'Value4', 0)
+ self.Value5 = rec.get(u'Value5', 0)
+ self.Value6 = rec.get(u'Value6', 0)
+ self.Value7 = rec.get(u'Value7', 0)
+ self.Value8 = rec.get(u'Value8', 0)
+ self.UserDataLen = rec.get(u'UserDataLen', 0)
+ self.UserData = fix_outgoingText(rec.get(u'UserData', u''))
+
+#Can not implement adoLoadStr method:No key defined!
+#Can not implement adoInsertStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+ def getAdoRecords(self, resultCollection):
+ '''查询结果打包成二进制流'''
+ result = ''
+ result = CommFunc.WriteDWORD(result, resultCollection.count())
+ for rec in resultCollection:
+ self.readRecord(rec)
+ result += self.getBuffer()
+ return result
+
+#Can not implement adoQueryIndexStr method:No key defined!
+
+ def adoQueryCustom(self, collection, queryDict):
+ '''自定义查询'''
+ resultCollection = collection.find(queryDict)
+
+ return self.getAdoRecords(resultCollection)
+
+
+ def adoQueryAll(self, collection):
+ '''查询所有'''
+ resultCollection = collection.find()
+
+ return self.getAdoRecords(resultCollection)
+
+#Can not implement adoDeleteByIndexStr method:No key defined!
+ def outputString(self):
+ output = '''// 通用记录表新 #tagDBGameRec:
+ RecType = %s,
+ RecID = %s,
+ Time = %s,
+ Value1 = %s,
+ Value2 = %s,
+ Value3 = %s,
+ Value4 = %s,
+ Value5 = %s,
+ Value6 = %s,
+ Value7 = %s,
+ Value8 = %s,
+ UserDataLen = %s,
+ UserData = %s,
+ ADOResult = %s,
+ '''%(
+ self.RecType,
+ self.RecID,
+ self.Time,
+ self.Value1,
+ self.Value2,
+ self.Value3,
+ self.Value4,
+ self.Value5,
+ self.Value6,
+ self.Value7,
+ self.Value8,
+ self.UserDataLen,
+ self.UserData,
+ self.ADOResult,
+ )
+ return output
+
+ def dumpString(self):
+ output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+ self.RecType,
+ self.RecID,
+ self.Time,
+ self.Value1,
+ self.Value2,
+ self.Value3,
+ self.Value4,
+ self.Value5,
+ self.Value6,
+ self.Value7,
+ self.Value8,
+ self.UserDataLen,
+ self.UserData,
+ )
+ return output
+
+
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/LogicProcess/UserCtrlDB.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/LogicProcess/UserCtrlDB.py
index 95d7abf..a500a86 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/LogicProcess/UserCtrlDB.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/LogicProcess/UserCtrlDB.py
@@ -400,10 +400,27 @@
PyGameData.g_UserCtrlDBFirstInit = True
self.__PlayerBackupSave()
CheckGameVersion()
-
- #后续也要增加公共数据保存如家族等,考虑保存失败可以直接关闭地图
-
+ self.loadDBPlayerIDMap()
+
return
+
+ def loadDBPlayerIDMap(self):
+ ## 加载本服玩家映射关系
+ col = self.db[UCN_DBPlayer]
+ resultSet = col.find({}, {"PlayerID":1, "AccID":1, "_id":0})
+ if resultSet and resultSet.count():
+ for resultDict in resultSet:
+ PyGameData.g_dbPlayerIDMap[resultDict["PlayerID"]] = resultDict["AccID"]
+ GameWorld.Log("启动服务器加载DBPlayer玩家账号ID对应关系! %s, %s" % (len(PyGameData.g_dbPlayerIDMap), PyGameData.g_dbPlayerIDMap))
+ return
+
+ def findDBPlayer(self, playerID):
+ col = self.db[UCN_DBPlayer]
+ dbPlayer = DataServerPlayerData.tagDBPlayer()
+ dbPlayer.IsDeleted = 0
+ if not dbPlayer.adoLoadCEx(col, {"PlayerID":playerID}):
+ return
+ return dbPlayer
def requestLogicProcess(self, pack):
db = self.db
@@ -1662,7 +1679,7 @@
mylog.debug('RevoverBillProcess success...%s'%orderID)
except:
- mylog.error("RevoverBillProcess error %s"%orderID)
+ mylog.error("RevoverBillProcess error %s"%traceback.format_exc())
def SavePlayerMapServerData(self, db, saveData):
playerRec = DataServerPlayerData.tagDBPlayer()
@@ -2413,6 +2430,9 @@
return 0, disDataBaseError, createPlayer.AccID, ''
mylog.debug('insert role ok!accid = %s, PlayerName = %s'%(createPlayer.AccID, createPlayer.PlayerName))
+ PyGameData.g_dbPlayerIDMap[newPlayerID] = createPlayer.AccID
+ mylog.debug('PyGameData.g_dbPlayerIDMap = %s, %s'%(len(PyGameData.g_dbPlayerIDMap), PyGameData.g_dbPlayerIDMap))
+
#构造其他角色初始数据
itemData = ''
itemData = CommFunc.WriteDWORD(itemData, 0)
@@ -3409,6 +3429,11 @@
data += DBFamilyAction.adoQueryAll(collection)
mylog.info("tagDBFamilyAction ok")
+ collection = db[UCN_DBGameRec]
+ DBGameRec = DataServerPlayerData.tagDBGameRec()
+ data += DBGameRec.adoQueryAll(collection)
+ mylog.info("tagDBGameRec ok")
+
mylog.info('readGameWorldData len:%s' % len(data))
return data
@@ -3430,6 +3455,7 @@
gameDataReadPos = self.savegameServerWorldData(saveData, gameDataReadPos, UCN_DBFamily, DataServerPlayerData.tagDBFamily, db)
gameDataReadPos = self.savegameServerWorldData(saveData, gameDataReadPos, UCN_DBFamilyMem, DataServerPlayerData.tagDBFamilyMem, db)
gameDataReadPos = self.savegameServerWorldData(saveData, gameDataReadPos, UCN_DBFamilyAction, DataServerPlayerData.tagDBFamilyAction, db)
+ gameDataReadPos = self.savegameServerWorldData(saveData, gameDataReadPos, UCN_DBGameRec, DataServerPlayerData.tagDBGameRec, db)
mylog.info('saveGameWorldData ok!')
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index fe1fb61..a2e5419 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -946,6 +946,9 @@
BillboardTypeAllList = BillboardTypeList + CrossBillboardTypeList
+#仙盟榜单类型
+FamilyBillboardList = [Def_BT_BossTrialSubmitFamily, Def_BT_BossTrialSubmitFamilyBak, Def_CBT_FamilyGCZScore, Def_CBT_FamilyGCZRoundHurt]
+
#职业对应战力排行榜类型
JobFightPowerBillboardDict = {
PlayerJob_Warrior:Def_BT_FightPower_Warrior,
@@ -958,9 +961,6 @@
Def_BT_LV, Def_BT_FightPower_Horse, Def_BT_FightPower_Pet, Def_BT_TrialTower, Def_BT_OffLineEfficient,
Def_BT_SkyTower, Def_BT_CharmTotal, Def_BT_CharmWeek, Def_BT_CharmDay
]
-
-#仙盟榜单类型
-FamilyBillboardList = [Def_BT_BossTrialSubmitFamily, Def_BT_BossTrialSubmitFamilyBak]
##---比率---
#百分率
@@ -1381,35 +1381,6 @@
5006:6,
}
-#聊天信息附加值
-(
-Def_TalkExtraValue_Bit_VipLv, # vip等级
-Def_TalkExtraValue_Bit_GM, #GM
-Def_TalkExtraValue_Bit_JOB, #job
-Def_TalkExtraValue_Bit_BubbleBox, #气泡框
-Def_TalkExtraValue_Bit_ServerGroupID, #服务器组ID
-Def_TalkExtraValue_Bit_LV, #等级
-) = range(0, 6)
-
-#聊天信息附加值中某信息数据所占位置
-#{聊天信息附加值类型:[起始位置(从左往右), 结束位置(不包含)]}
-Def_TalkExtraValue_LenDict = {
- Def_TalkExtraValue_Bit_VipLv:[0, 2], # vip等级
- Def_TalkExtraValue_Bit_GM:[2, 3], # GM
- Def_TalkExtraValue_Bit_JOB:[3, 4], # job
- Def_TalkExtraValue_Bit_BubbleBox:[4, 6], # 气泡框
- Def_TalkExtraValue_Bit_ServerGroupID:[6, 13], # 服务器组ID
- Def_TalkExtraValue_Bit_LV:[13, 17], # 等级
- }
-
-# 聊天频道 暂用语音
-(Def_ChannelChat_World, # 世界
-Def_ChannelChat_Family, # 仙盟
-Def_ChannelChat_Private, # 私聊含好友
-Def_ChannelChat_Team, # 队伍
-Def_ChannelChat_Area, # 区域(当前地图或副本线)
-) = range(1, 6)
-
#背包类型
(
rptTempSwap, # 临时交换背包 28
@@ -1469,7 +1440,8 @@
Def_GameRecType_FamilyGCZJoinFamily, # 仙盟攻城战参与仙盟信息, zoneID 303
Def_GameRecType_FamilyGCZJoinMember, # 仙盟攻城战参与成员信息, zoneID 304
Def_GameRecType_FamilyGCZCityWall, # 仙盟攻城战城池信息, zoneID 305
- ) = range(300, 1 + 305)
+ Def_GameRecType_TalkCache, # 聊天缓存,频道 306
+ ) = range(300, 1 + 306)
#通用信息记录新 - 字典key配置,如果有配置,则可额外按对应记录Value值存储字典,方便快速取值,可配置Value编号 1~8,配空默认 Value1
Def_GameRecValueKeyDict = {
Def_GameRecType_Xiangong:[1],
@@ -1580,7 +1552,20 @@
Def_ActionType_FamilyCTGAssist, #仙盟充值协助活动 14
Def_ActionType_FamilyEmblem, #仙盟时效徽章信息 15
Def_ActionType_Zhenbaoge, #珍宝阁 16
- ) = range(0, 17)
+ Def_ActionType_TalkCache, #聊天缓存 17,最大条数配置决定
+ ) = range(0, 18)
+
+#家族某行为类型保存的条数
+ActionTypeSaveCnt = {
+ Def_ActionType_FamilyPray:10 , #家族祈福
+ Def_ActionType_FamilyArrest:7, #家族悬赏
+ Def_ActionType_FamilyMember:1, #记录家族成员信息
+ Def_ActionType_LeaderImpeachTime:1, # 族长下线了多久
+ Def_ActionType_FamilyBossFB:1, # 记录家族boss副本信息
+ Def_ActionType_FamilyStore:30, #仓库操作记录
+ Def_ActionType_OfficerModelEquip:10, # 记录家族有职位的成员模型装备信息(盟主+副盟主*2+战斗队长*5)
+ Def_ActionType_FamilyEvent:50, # 记录家族事件
+ }
# 家族行为事件类型定义; Def_ActionType_FamilyEvent; 存与事件记录Value1
# 通用:time-时间;name-玩家;value1-事件类型
--
Gitblit v1.8.0