From f6334d003ecef6b59d97bde3ed53bcbf8e3ac515 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期二, 02 七月 2024 16:31:28 +0800 Subject: [PATCH] 10192 【越南】【主干】【港台】【砍树】上线增加膜拜主动推送(增加膜拜功能,目前支持跨服排位赛名次及服务器冠名膜拜;增加GameServer玩家记录表;玩家缓存增加记录佩戴称号ID) --- ServerPython/CoreServerGroup/GameServer/PyNetPack.ini | 11 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py | 6 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorship.py | 521 +++++++++++++++++ ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py | 29 ServerPython/CoreServerGroup/GameServer/Script/PyGameDataStruct.py | 130 ++++ ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py | 14 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerRecData.py | 271 +++++++++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py | 22 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py | 60 ++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py | 207 ++++++ ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py | 60 ++ ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py | 3 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py | 207 ++++++ ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py | 9 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py | 5 ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py | 9 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py | 3 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_GiveAward.py | 52 + ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py | 4 ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_Worship.py | 130 ++++ ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py | 22 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py | 5 PySysDB/PySysDBG.h | 11 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py | 1 24 files changed, 1,790 insertions(+), 2 deletions(-) diff --git a/PySysDB/PySysDBG.h b/PySysDB/PySysDBG.h index 91f5e18..3b04712 100644 --- a/PySysDB/PySysDBG.h +++ b/PySysDB/PySysDBG.h @@ -1276,6 +1276,17 @@ BYTE AssistAwardCount; // 协助奖励每日次数 }; +//膜拜表 + +struct tagWorship +{ + BYTE _WorshipType; //膜拜类型 + DWORD _WorshipValue; //膜拜值 + BYTE WorshipDays; //膜拜天数 + BYTE MoneyType; //膜拜货币类型 + list MoneyRange; //货币值范围 +}; + //缥缈仙域表 struct tagFairyDomain diff --git a/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini b/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini index e5501c3..e67bdf0 100644 --- a/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini +++ b/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini @@ -541,6 +541,17 @@ PacketSubCMD_1=0x07 PacketCallFunc_1=OnVoiceChat +[GameWorship] +ScriptName = GameWorldLogic\GameWorship.py +Writer = hxp +Releaser = hxp +RegType = 0 +RegisterPackCount = 1 + +PacketCMD_1=0xB0 +PacketSubCMD_1=0x20 +PacketCallFunc_1=OnWorship + [GameWorldMineArea] ScriptName = GameWorldLogic\GameWorldMineArea.py Writer = hxp diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py index db10c79..52258f9 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py @@ -2382,6 +2382,66 @@ #------------------------------------------------------ +# B0 20 请求膜拜玩家 #tagCGWorship + +class tagCGWorship(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("PlayerID", c_int), # 目标玩家ID + ("WorshipType", c_ubyte), # 膜拜类型 + ("WorshipValue", c_int), # 膜拜类型对应的功能值,如名次或其他,由具体膜拜类型定义对应值含义 + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xB0 + self.SubCmd = 0x20 + return + + def ReadData(self, stringData, _pos=0, _len=0): + self.Clear() + memmove(addressof(self), stringData[_pos:], self.GetLength()) + return _pos + self.GetLength() + + def Clear(self): + self.Cmd = 0xB0 + self.SubCmd = 0x20 + self.PlayerID = 0 + self.WorshipType = 0 + self.WorshipValue = 0 + return + + def GetLength(self): + return sizeof(tagCGWorship) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// B0 20 请求膜拜玩家 //tagCGWorship: + Cmd:%s, + SubCmd:%s, + PlayerID:%d, + WorshipType:%d, + WorshipValue:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.PlayerID, + self.WorshipType, + self.WorshipValue + ) + return DumpString + + +m_NAtagCGWorship=tagCGWorship() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGWorship.Cmd,m_NAtagCGWorship.SubCmd))] = m_NAtagCGWorship + + +#------------------------------------------------------ # B3 19 提升魅力等级 #tagCGCharmLVUp class tagCGCharmLVUp(Structure): diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py index be51fff..7b77e7d 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py @@ -8515,6 +8515,213 @@ #------------------------------------------------------ +# B0 20 膜拜信息列表 #tagGCWorshipInfoList + +class tagGCWorshipInfo(Structure): + PlayerID = 0 #(DWORD PlayerID)// 目标玩家ID + WorshipType = 0 #(BYTE WorshipType)// 膜拜类型 + WorshipValue = 0 #(DWORD WorshipValue)// 膜拜类型对应的功能值,如名次或其他,由具体膜拜类型定义对应值含义 + InfoLen = 0 #(WORD InfoLen) + PlayerInfo = "" #(String PlayerInfo)// 玩家信息{k:v, ...} + data = None + + def __init__(self): + self.Clear() + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.WorshipType,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.WorshipValue,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.InfoLen,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.PlayerInfo,_pos = CommFunc.ReadString(_lpData, _pos,self.InfoLen) + return _pos + + def Clear(self): + self.PlayerID = 0 + self.WorshipType = 0 + self.WorshipValue = 0 + self.InfoLen = 0 + self.PlayerInfo = "" + return + + def GetLength(self): + length = 0 + length += 4 + length += 1 + length += 4 + length += 2 + length += len(self.PlayerInfo) + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteDWORD(data, self.PlayerID) + data = CommFunc.WriteBYTE(data, self.WorshipType) + data = CommFunc.WriteDWORD(data, self.WorshipValue) + data = CommFunc.WriteWORD(data, self.InfoLen) + data = CommFunc.WriteString(data, self.InfoLen, self.PlayerInfo) + return data + + def OutputString(self): + DumpString = ''' + PlayerID:%d, + WorshipType:%d, + WorshipValue:%d, + InfoLen:%d, + PlayerInfo:%s + '''\ + %( + self.PlayerID, + self.WorshipType, + self.WorshipValue, + self.InfoLen, + self.PlayerInfo + ) + return DumpString + + +class tagGCWorshipInfoList(Structure): + Head = tagHead() + WorshipCount = 0 #(BYTE WorshipCount) + WorshipInfoList = list() #(vector<tagGCWorshipInfo> WorshipInfoList) + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xB0 + self.Head.SubCmd = 0x20 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.WorshipCount,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.WorshipCount): + temWorshipInfoList = tagGCWorshipInfo() + _pos = temWorshipInfoList.ReadData(_lpData, _pos) + self.WorshipInfoList.append(temWorshipInfoList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xB0 + self.Head.SubCmd = 0x20 + self.WorshipCount = 0 + self.WorshipInfoList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + for i in range(self.WorshipCount): + length += self.WorshipInfoList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteBYTE(data, self.WorshipCount) + for i in range(self.WorshipCount): + data = CommFunc.WriteString(data, self.WorshipInfoList[i].GetLength(), self.WorshipInfoList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + WorshipCount:%d, + WorshipInfoList:%s + '''\ + %( + self.Head.OutputString(), + self.WorshipCount, + "..." + ) + return DumpString + + +m_NAtagGCWorshipInfoList=tagGCWorshipInfoList() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCWorshipInfoList.Head.Cmd,m_NAtagGCWorshipInfoList.Head.SubCmd))] = m_NAtagGCWorshipInfoList + + +#------------------------------------------------------ +# B0 21 膜拜结果 #tagGCWorshipResult + +class tagGCWorshipResult(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("PlayerID", c_int), # 目标玩家ID + ("WorshipType", c_ubyte), # 膜拜类型 + ("WorshipValue", c_int), # 膜拜类型对应的功能值,如名次或其他,由具体膜拜类型定义对应值含义 + ("Result", c_ubyte), # 膜拜结果:0-成功;1-不存在该膜拜类型;2-不存在该目标膜拜;3-不能膜拜该目标; + ("MoneyType", c_ubyte), # 货币类型 + ("MoneyValue", c_int), # 货币奖励 + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xB0 + self.SubCmd = 0x21 + return + + def ReadData(self, stringData, _pos=0, _len=0): + self.Clear() + memmove(addressof(self), stringData[_pos:], self.GetLength()) + return _pos + self.GetLength() + + def Clear(self): + self.Cmd = 0xB0 + self.SubCmd = 0x21 + self.PlayerID = 0 + self.WorshipType = 0 + self.WorshipValue = 0 + self.Result = 0 + self.MoneyType = 0 + self.MoneyValue = 0 + return + + def GetLength(self): + return sizeof(tagGCWorshipResult) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// B0 21 膜拜结果 //tagGCWorshipResult: + Cmd:%s, + SubCmd:%s, + PlayerID:%d, + WorshipType:%d, + WorshipValue:%d, + Result:%d, + MoneyType:%d, + MoneyValue:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.PlayerID, + self.WorshipType, + self.WorshipValue, + self.Result, + self.MoneyType, + self.MoneyValue + ) + return DumpString + + +m_NAtagGCWorshipResult=tagGCWorshipResult() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCWorshipResult.Cmd,m_NAtagGCWorshipResult.SubCmd))] = m_NAtagGCWorshipResult + + +#------------------------------------------------------ #B3 03 询问是否允许添加好友#tagGCFriendAskIfJoin class tagGCFriendAskIfJoin(Structure): diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_Worship.py b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_Worship.py new file mode 100644 index 0000000..78911de --- /dev/null +++ b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_Worship.py @@ -0,0 +1,130 @@ +#!/usr/bin/python +# -*- coding: GBK -*- +#------------------------------------------------------------------------------- +# +##@package GM.Commands.GMT_Worship +# +# @todo:后台管理膜拜 +# @author hxp +# @date 2024-07-02 +# @version 1.0 +# +# 详细描述: 后台管理膜拜 +# +#------------------------------------------------------------------------------- +#"""Version = 2024-07-02 16:30""" +#------------------------------------------------------------------------------- + +import GMCommon +import ChConfig +import GameWorship +import PyDataManager +import PlayerViewCache +import IpyGameDataPY +import ShareDefine +import GameWorld + + +## 执行逻辑 +# @param curPlayer 当前玩家 +# @param gmCmdDict: 命令字典 +# @return None +# @remarks 函数详细说明. +def OnExec(orderId, gmCmdDict): + GameWorld.Log("GMT_Worship %s" % gmCmdDict) + queryType = gmCmdDict.get(GMCommon.Def_GMKey_QueryType, '') + playerFind = gmCmdDict.get(GMCommon.Def_GMKey_PlayerFind, '') + worshipType = GameWorld.ToIntDef(gmCmdDict.get('worshipType', ''), 0) + worshipValue = GameWorld.ToIntDef(gmCmdDict.get('worshipValue', ''), 0) + zoneID = GameWorld.ToIntDef(gmCmdDict.get('zoneID', ''), 0) + days = GameWorld.ToIntDef(gmCmdDict.get('days', ''), 0) + + opType = gmCmdDict.get('opType', '') + + if not opType or not worshipType: + GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_ParamErr) + return + + if opType == "view": + worshipList = __GetServerWorshipList() + GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_Success, {"WorshipList":worshipList}) + return + + if worshipType in ShareDefine.Def_WorshipTypeCross: + if not GameWorld.IsCrossServer(): + GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_ParamErr, "player run in cross server.") + return + else: + if GameWorld.IsCrossServer(): + GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_ParamErr, "do not run in cross server.") + return + + ipyData = IpyGameDataPY.GetIpyGameData("Worship", worshipType, worshipValue) + if not ipyData: + GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_ParamErr, "worshipType value ipyData is not exist.") + return + + playerManager = GameWorld.GetPlayerManager() + + if queryType == "playerID": + tagPlayerID = GameWorld.ToIntDef(playerFind, 0) + else: + if queryType == GMCommon.Def_GMKey_PlayerAccID: + queryType = ChConfig.queryType_sqtPlayerByAccID + tagPlayer = playerManager.FindPlayerByAccID(str(playerFind)) + + elif queryType == GMCommon.Def_GMKey_PlayerName: + queryType = ChConfig.queryType_sqtPlayerByName + tagPlayer = playerManager.FindPlayerByName(str(playerFind)) + + else: + GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_ParamErr) + return + + if not tagPlayer: + GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_PlayerOfLine) + return + tagPlayerID = tagPlayer.GetPlayerID() + + cacheDict = PlayerViewCache.GetCachePropDataDict(PlayerViewCache.FindViewCache(tagPlayerID)) + if not cacheDict: + GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_NoTag, "can not found player view cache") + return {} + Name = cacheDict.get("Name", "") + AccID = cacheDict.get("AccID", "") + + if opType == "add": + if not GameWorship.AddWorshipPlayer(tagPlayerID, worshipType, worshipValue, days, zoneID): + GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_Unknow, "add error.") + return + + elif opType == "del": + GameWorship.DelWorshipPlayer(worshipType, worshipValue, tagPlayerID) + + else: + GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_ParamErr) + return + + worshipList = __GetServerWorshipList() + GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_Success, {"AccID":AccID, "Name":Name, "PlayerID":tagPlayerID, "WorshipList":worshipList}) + return + +def __GetServerWorshipList(): + worshipList = [] + playerRecMgr = PyDataManager.GetDBPlayerRecDataManager() + recDict = playerRecMgr.GetPlayerRecDataDict(ShareDefine.Def_PlayerRecType_WorshipPlayer) + for recDataList in recDict.values(): + for recData in recDataList: + playerInfo = GameWorship.GetModelShowInfo(recData) + worshipList.append({"PlayerID":recData.GetPlayerID(), + "AddTime":GameWorld.ChangeTimeNumToStr(recData.GetTime()), + "WorshipType":GameWorship.GetWorshipType(recData), + "WorshipValue":GameWorship.GetWorshipValue(recData), + "Days":GameWorship.GetWorshipDays(recData), + "ZoneID":GameWorship.GetWorshipZoneID(recData), + "AccID":playerInfo.get("AccID", ""), + "Name":playerInfo.get("Name", ""), + }) + return worshipList + + diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py index 03aa70c..3de2fd9 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py @@ -700,6 +700,15 @@ return pastTimeDelta.days * 24 * 60 * 60 + pastTimeDelta.seconds #--------------------------------------------------------------------- + +def GetDiff_Day(timeA , timeB): + ## 获取 timeA - timeB 相差的日期天数 + dateTimeA = ChangeTimeNumToDatetime(timeA) + dateTimeA = datetime.datetime(dateTimeA.year, dateTimeA.month, dateTimeA.day, 0, 0, 0) + dateTimeB = ChangeTimeNumToDatetime(timeB) + dateTimeB = datetime.datetime(dateTimeB.year, dateTimeB.month, dateTimeB.day, 0, 0, 0) + return (dateTimeA - dateTimeB).days + ##设置世界服务器字典 # @param key 字典值 # @param tick 时间戳 diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py index 43abd50..3537914 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py @@ -29,6 +29,7 @@ import PlayerControl import PyDataManager import NetPackCommon +import GameWorship import PyGameData import ChConfig import PlayerFB @@ -1945,9 +1946,14 @@ champMgr = GetChampionshipMgr() champMgr.ClearOfficialZone() # 最终结算重置仙官信息,替换最新仙官 + # 膜拜重置 + worshipType = ShareDefine.Def_WorshipType_CrossChampionship + GameWorship.DelWorshipPlayer(worshipType) + pkZoneIDList = champMgr.GetChampPKZoneIDList() GameWorld.Log("pkZoneIDList=%s" % pkZoneIDList) + worshipList = [] for zoneID in pkZoneIDList: GameWorld.Log("=== 结算排位分区: zoneID=%s ===" % zoneID, zoneID) finalPlayerIDList = [] @@ -1991,6 +1997,11 @@ offZoneMgr.officialInfo[officialID] = offObj + worshipValue = rank + if GameWorship.GetWorshipIpyData(worshipType, worshipValue): + worshipData = GameWorship.AddWorshipPlayer(playerID, worshipType, worshipValue, zoneID=zoneID, isNotify=False) + worshipList.append(worshipData) + # 名次奖励 paramList = [rank] PlayerCompensation.SendMailByKey("CrossChampionshipPKRank", [playerID], rankAwardItemList, paramList, crossMail=True) @@ -2033,6 +2044,9 @@ serverGroupIDList = [] # 全服统一逻辑 PlayerControl.WorldNotifyCross(serverGroupIDList, 0, "ChampionshipOver") + + # 通知新添加的膜拜 + GameWorship.SyncAddCrossWorship(worshipList) GameWorld.Log("===================================================================") return diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py index 0458197..5bfa98b 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py @@ -33,6 +33,7 @@ import CrossYaomoBoss import GameWorldBoss import CrossRealmPK +import GameWorship import PlayerQuery import PlayerTalk import PyGameData @@ -209,6 +210,7 @@ CrossActAllRecharge.Sync_AllRechargeDataToClientServer(serverGroupID) CrossYaomoBoss.Sync_CrossYaomoBossDataToClientServer(serverGroupID) PlayerCompensation.Sync_CrossMailPlayerIDToClientServer(serverGroupID) + GameWorship.Sync_CrossWorshipToClientServer(serverGroupID) return def MapServer_CrossServerReceiveMsg(msgType, msgData, serverGroupID): @@ -362,6 +364,9 @@ elif msgType == ShareDefine.CrossServerMsg_CrossBossTrialFamilyAward: PlayerActBossTrial.CrossServerMsg_CrossBossTrialFamilyAward(msgData) + elif msgType == ShareDefine.CrossServerMsg_Worship: + GameWorship.CrossServerMsg_Worship(msgData) + elif msgType == ShareDefine.CrossServerMsg_ChampionshipState: CrossChampionship.CrossServerMsg_ChampionshipState(msgData) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py index d0be780..0c59fd9 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py @@ -113,6 +113,7 @@ import CrossBillboard import CrossChampionship import GameWorldMineArea +import GameWorship #--------------------------------------------------------------------- #--------------------------------------------------------------------- @@ -186,6 +187,8 @@ PlayerLove.DoOnDay() # 云购 CrossLuckyCloudBuy.DoOnDay() + # 膜拜 + GameWorship.DoOnDay() return def OnDayEx(tick): diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorship.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorship.py new file mode 100644 index 0000000..2b8a41d --- /dev/null +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorship.py @@ -0,0 +1,521 @@ +#!/usr/bin/python +# -*- coding: GBK -*- +#------------------------------------------------------------------------------- +# +##@package GameWorship +# +# @todo:膜拜 +# @author hxp +# @date 2024-07-02 +# @version 1.0 +# +# 详细描述: 膜拜 +# +#------------------------------------------------------------------------------- +#"""Version = 2024-7-02 16:30""" +#------------------------------------------------------------------------------- + +import ShareDefine +import PyDataManager +import NetPackCommon +import PlayerControl +import ChPyNetSendPack +import CrossChampionship +import PlayerViewCache +import PlayerRecData +import CrossRealmMsg +import IpyGameDataPY +import GameWorld + +import random +import time + +# 被膜拜玩家 RecType = ShareDefine.Def_PlayerRecType_WorshipPlayer +def GetWorshipType(recData): return recData.GetValue1() # 膜拜类型 +def SetWorshipType(recData, worshipType): recData.SetValue1(worshipType) +def GetWorshipValue(recData): return recData.GetValue2() # 膜拜类型下的功能值,即膜拜什么,功能自定义,如排名或其他,可选 +def SetWorshipValue(recData, worshipValue): recData.SetValue2(worshipValue) +def GetWorshipDays(recData): return recData.GetValue3() # 持续天数: 0永久,>0-天数 +def SetWorshipDays(recData, days): recData.SetValue3(days) +def GetWorshipZoneID(recData): return recData.GetValue4() # 膜拜分区,跨服膜拜类型有用 +def SetWorshipZoneID(recData, zoneID): recData.SetValue4(zoneID) +def GetModelShowInfo(recData): return recData.GetEvalUserData({}) # 模型外观显示信息,备用,缓存没有时取这里 +def SetModelShowInfo(recData, modelShow): return recData.SetEvalUserData(modelShow) +def GetPlayerModelShow(playerID): + ## 获取膜拜对象的外观显示信息 - 本服跨服通用 + cacheDict = PlayerViewCache.GetCachePropDataDict(PlayerViewCache.FindViewCache(playerID)) + if not cacheDict: + return {} + modelShow = { + "Name":cacheDict.get("Name", ""), + "AccID":cacheDict.get("AccID", ""), + "LV":cacheDict.get("LV", 0), + "RealmLV":cacheDict.get("RealmLV", 0), + "Job":cacheDict.get("Job", 0), + "VIPLV":cacheDict.get("VIPLV", 0), + "TitleID":cacheDict.get("TitleID", 0), + "FightPower":cacheDict.get("FightPower", 0), + "EquipShowID":cacheDict.get("EquipShowID", []), + } + return modelShow + +# 玩家每日膜拜记录 RecType = ShareDefine.Def_PlayerRecType_WorshipDaily +def GetTodayWorshipRecord(recData): return recData.GetEvalUserData({}) # 今日已膜拜记录 {tagPlayerID:[[膜拜类型, 膜拜值], ...], ...} + +##-------------------------------------------------------------------------------------------------- + +def OnPlayerLogin(curPlayer): + + playerRecMgr = PyDataManager.GetDBPlayerRecDataManager() + + unWorshipList = [] # 未膜拜列表 + recDict = playerRecMgr.GetPlayerRecDataDict(ShareDefine.Def_PlayerRecType_WorshipPlayer) + for recDataList in recDict.values(): + for recData in recDataList: + if not __CheckPlayerCanWorship(curPlayer, recData): + continue + unWorshipList.append(recData) + + Sync_UnWorshipInfo(curPlayer, unWorshipList) + return + +def DoOnDay(): + ''' + 本服先过天 + 已过期的跨服膜拜也会被先删除,相当于提交删除过期的跨服膜拜 + 未过期的跨服膜拜当跨服服务器过天时同样也是未过期,故也可正常膜拜,每天的膜拜记录是存在本服玩家,相当于提前膜拜 + + 跨服先过天 + 已过期的跨服膜拜会被删除,然后同步给子服先同步删除掉即可 + 未过期的跨服膜拜不处理即可 + + 所以,过天时,本服及跨服各自处理各自的逻辑即可 + ''' + + isCrossServer = GameWorld.IsCrossServer() + playerRecMgr = PyDataManager.GetDBPlayerRecDataManager() + + worshipList = [] + curTime = int(time.time()) + recDict = playerRecMgr.GetPlayerRecDataDict(ShareDefine.Def_PlayerRecType_WorshipPlayer) + for recDataList in recDict.values(): + for recData in recDataList[::-1]: # 倒序处理删除到期的膜拜对象 + recTime = recData.GetTime() + tagPlayerID = recData.GetPlayerID() + worshipType = GetWorshipType(recData) + worshipValue = GetWorshipValue(recData) + worshipDays = GetWorshipDays(recData) + if not worshipDays: # 永久膜拜不处理,直到被替换 + GameWorld.DebugLog("永久膜拜不处理: worshipType=%s,worshipValue=%s,tagPlayerID=%s" % (worshipType, worshipValue, tagPlayerID)) + __UpdWorshipByDay(isCrossServer, worshipList, recData) + continue + + diffDays = GameWorld.GetDiff_Day(curTime, recTime) + if diffDays < worshipDays: + GameWorld.DebugLog("膜拜未到期: worshipType=%s,worshipValue=%s,tagPlayerID=%s,diffDays=%s < %s" + % (worshipType, worshipValue, tagPlayerID, diffDays, worshipDays)) + __UpdWorshipByDay(isCrossServer, worshipList, recData) + continue + + GameWorld.DebugLog("删除膜拜: worshipType=%s,worshipValue=%s,tagPlayerID=%s" % (worshipType, worshipValue, tagPlayerID)) + playerRecMgr.DelRecData(recData) + + if isCrossServer: + # 同步给子服 + dataMsg = {"msgType":"AllCrossWorship", "worshipDataList":worshipList} + CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_Worship, dataMsg) + return + + # 本服处理 + playerRecMgr.DelRecDataByType(ShareDefine.Def_PlayerRecType_WorshipDaily) # 删除本服所有玩家的每日膜拜记录 + Sync_UnWorshipInfo(None, worshipList) + return + +def __UpdWorshipByDay(isCrossServer, worshipList, recData): + ## 过天更新未过期膜拜信息 + playerID = recData.GetPlayerID() + modelShow = GetPlayerModelShow(playerID) + if modelShow: + SetModelShowInfo(recData, modelShow) + + if isCrossServer: + worshipList.append(recData.GetString()) + else: + worshipList.append(recData) + return + +def IsWorshipPlayer(playerID): + ## 是否膜拜玩家 + playerRecMgr = PyDataManager.GetDBPlayerRecDataManager() + if playerRecMgr.GetPlayerRecDataList(ShareDefine.Def_PlayerRecType_WorshipPlayer, playerID): + return True + return False + +def GetWorshipIpyData(worshipType, worshipValue): + ## 获取膜拜配置数据 + ipyData = IpyGameDataPY.GetIpyGameDataNotLog("Worship", worshipType, worshipValue) + return ipyData + +def AddWorshipPlayer(playerID, worshipType, worshipValue, days=None, zoneID=0, isNotify=True): + ## 添加膜拜玩家,本服跨服通用 + # @param isNotify: 本服-是否通知玩家;跨服-是否通知子服 + + if worshipType in ShareDefine.Def_WorshipTypeCross: + if not GameWorld.IsCrossServer(): + GameWorld.ErrLog("非跨服服务器不允许添加跨服膜拜! worshipType=%s" % (worshipType)) + return + else: + if GameWorld.IsCrossServer(): + GameWorld.ErrLog("跨服服务器不允许添加非跨服膜拜! worshipType=%s" % (worshipType)) + return + + ipyData = IpyGameDataPY.GetIpyGameData("Worship", worshipType, worshipValue) + if not ipyData: + return + + if days == None: + days = ipyData.GetWorshipDays() # 没有指定天数的话取配表 + + playerRecMgr = PyDataManager.GetDBPlayerRecDataManager() + recData = playerRecMgr.GetPlayerRecData(ShareDefine.Def_PlayerRecType_WorshipPlayer, playerID, [worshipType, worshipValue]) + if not recData: + GameWorld.Log("添加膜拜数据: playerID=%s,worshipType=%s,worshipValue=%s,days=%s,zoneID=%s" % (playerID, worshipType, worshipValue, days, zoneID)) + recData = playerRecMgr.AddPlayerRecData(ShareDefine.Def_PlayerRecType_WorshipPlayer, playerID) + else: + GameWorld.Log("更新膜拜数据: playerID=%s,worshipType=%s,worshipValue=%s,days=%s,zoneID=%s" % (playerID, worshipType, worshipValue, days, zoneID)) + SetWorshipType(recData, worshipType) + SetWorshipValue(recData, worshipValue) + SetWorshipDays(recData, days) + SetModelShowInfo(recData, GetPlayerModelShow(playerID)) + SetWorshipZoneID(recData, zoneID) + + if isNotify: + if GameWorld.IsCrossServer(): + SyncAddCrossWorship([recData]) + else: + Sync_UnWorshipInfo(None, [recData]) + + return recData + +def DelWorshipPlayer(worshipType, worshipValue=None, delPlayerID=None): + ## 删除膜拜玩家,本服跨服通用 + valueList = [worshipType] + if worshipValue != None: + valueList.append(worshipValue) + playerRecMgr = PyDataManager.GetDBPlayerRecDataManager() + playerRecMgr.DelRecDataByTypeValue(ShareDefine.Def_PlayerRecType_WorshipPlayer, valueList, delPlayerID) + + if GameWorld.IsCrossServer(): + dataMsg = {"msgType":"DelCrossWorship", "worshipType":worshipType, "worshipValue":worshipValue, "delPlayerID":delPlayerID} + CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_Worship, dataMsg) + return + +#// B0 20 请求膜拜玩家 #tagCGWorship +# +#struct tagCGWorship +#{ +# tagHead Head; +# DWORD PlayerID; // 目标玩家ID +# BYTE WorshipType; // 膜拜类型 +# DWORD WorshipValue; // 膜拜类型对应的功能值,如名次或其他,由具体膜拜类型定义对应值含义 +#}; +def OnWorship(index, clientData, tick): + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + playerID = curPlayer.GetPlayerID() + tagPlayerID = clientData.PlayerID + worshipType = clientData.WorshipType + worshipValue = clientData.WorshipValue + + ipyData = IpyGameDataPY.GetIpyGameData("Worship", worshipType, worshipValue) + if not ipyData: + __SyncWorshipResult(curPlayer, tagPlayerID, worshipType, worshipValue, 1) + return + + findWorshipData = None + playerRecMgr = PyDataManager.GetDBPlayerRecDataManager() + recDataList = playerRecMgr.GetPlayerRecDataList(ShareDefine.Def_PlayerRecType_WorshipPlayer, tagPlayerID) + for recData in recDataList: + if worshipType == GetWorshipType(recData) and worshipValue == GetWorshipValue(recData): + findWorshipData = recData + break + + if not findWorshipData: + __SyncWorshipResult(curPlayer, tagPlayerID, worshipType, worshipValue, 2) + GameWorld.DebugLog("不存在该目标玩家的膜拜! tagPlayerID=%s,worshipType=%s,worshipValue=%s" + % (tagPlayerID, worshipType, worshipValue), playerID) + return + + if not __CheckPlayerCanWorship(curPlayer, recData): + __SyncWorshipResult(curPlayer, tagPlayerID, worshipType, worshipValue, 3) + return + + moneyType = ipyData.GetMoneyType() + moneyRange = ipyData.GetMoneyRange() + if len(moneyRange) != 2: + return + moneyValue = random.randint(moneyRange[0], moneyRange[1]) + + GameWorld.DebugLog("膜拜: tagPlayerID=%s,worshipType=%s,worshipValue=%s,moneyType=%s,moneyValue=%s" + % (tagPlayerID, worshipType, worshipValue, moneyType, moneyValue), playerID) + __AddWorshipRecord(playerID, recData) + + __SyncWorshipResult(curPlayer, tagPlayerID, worshipType, worshipValue, 0, moneyType, moneyValue) + # 同步地图发放货币 + PlayerControl.MapServerGiveAward(curPlayer, "Worship", {moneyType:moneyValue}) + return + +def __CheckPlayerCanWorship(curPlayer, recData): + ## 检查玩家是否可膜拜该对象 + playerID = curPlayer.GetPlayerID() + recPlayerID = recData.GetPlayerID() + if playerID == recPlayerID: + GameWorld.DebugLog("不能膜拜自己!", playerID) + return + modelShow = GetModelShowInfo(recData) + if not modelShow: + GameWorld.DebugLog("没有外观展示的不同步! recPlayerID=%s" % recPlayerID, playerID) + return + accID = modelShow.get("AccID", "") + if not accID: + return + worshipType = GetWorshipType(recData) + worshipValue = GetWorshipValue(recData) + zoneID = GetWorshipZoneID(recData) + if worshipType == ShareDefine.Def_WorshipType_ServerNaming: + #只同步给同ServerID的 + serverID = GameWorld.GetAccIDServerID(accID) + playerServerID = GameWorld.GetPlayerServerID(curPlayer) + if serverID != playerServerID: + GameWorld.DebugLog("只同步给同ServerID的! recPlayerID=%s,accID=%s,serverID=%s != playerServerID=%s" + % (recPlayerID, accID, serverID, playerServerID), playerID) + return + elif worshipType == ShareDefine.Def_WorshipType_CrossChampionship: + #只同步给同分区的 + playerZoneID = CrossChampionship.GetChampionshipMgr().GetPlayerOfficialZoneID(playerID) + if playerZoneID != zoneID: + GameWorld.DebugLog("只同步给同分区的! recPlayerID=%s,zoneID=%s != playerZoneID=%s" % (recPlayerID, zoneID, playerZoneID), playerID) + return + + playerRecMgr = PyDataManager.GetDBPlayerRecDataManager() + worshipRecData = playerRecMgr.GetPlayerRecDataFirst(ShareDefine.Def_PlayerRecType_WorshipDaily, playerID) + worshipRecordDict = GetTodayWorshipRecord(worshipRecData) + if recPlayerID in worshipRecordDict and [worshipType, worshipValue] in worshipRecordDict[recPlayerID]: + GameWorld.DebugLog("已膜拜过! recPlayerID=%s,worshipType=%s, worshipValue=%s,worshipRecordDict=%s" + % (recPlayerID, worshipType, worshipValue, worshipRecordDict), playerID) + return + + return True + +def __AddWorshipRecord(playerID, recData): + ## 添加玩家膜拜目标记录 + playerRecMgr = PyDataManager.GetDBPlayerRecDataManager() + worshipRecData = playerRecMgr.GetPlayerRecDataFirst(ShareDefine.Def_PlayerRecType_WorshipDaily, playerID) + worshipRecordDict = GetTodayWorshipRecord(worshipRecData) + + tagPlayerID = recData.GetPlayerID() + worshipType = GetWorshipType(recData) + worshipValue = GetWorshipValue(recData) + recordInfo = [worshipType, worshipValue] + + if tagPlayerID not in worshipRecordDict: + worshipRecordDict[tagPlayerID] = [] + worshipRecordList = worshipRecordDict[tagPlayerID] + if recordInfo not in worshipRecordList: + worshipRecordList.append(recordInfo) + + #GameWorld.DebugLog("更新今日膜拜记录: %s" % GetTodayWorshipRecord(worshipRecData), playerID) + return + +def __SyncWorshipResult(curPlayer, tagPlayerID, worshipType, worshipValue, result, moneyType=0, moneyValue=0): + ## 同步膜拜结果 + # @param result: 膜拜结果:0-成功;1-不存在该膜拜;2-不能膜拜目标 + clientPack = ChPyNetSendPack.tagGCWorshipResult() + clientPack.PlayerID = tagPlayerID + clientPack.WorshipType = worshipType + clientPack.WorshipValue = worshipValue + clientPack.Result = result + clientPack.MoneyType = moneyType + clientPack.MoneyValue = moneyValue + NetPackCommon.SendFakePack(curPlayer, clientPack) + return + +def CrossServerMsg_Worship(msgData): + ## 子服收到跨服信息 + + msgType = msgData["msgType"] + + if msgType == "AddCrossWorship": + __Client_AddCrossWorship(msgData) + + elif msgType == "AllCrossWorship": + __Client_AllCrossWorship(msgData) + + elif msgType == "DelCrossWorship": + __Client_DelCrossWorship(msgData) + + return + +def __Client_AllCrossWorship(msgData): + ## 子服更新所有跨服膜拜 + worshipDataList = msgData["worshipDataList"] + + GameWorld.Log("子服更新所有跨服膜拜: count=%s" % len(worshipDataList)) + playerRecMgr = PyDataManager.GetDBPlayerRecDataManager() + for crossWorshipType in ShareDefine.Def_WorshipTypeCross: + playerRecMgr.DelRecDataByTypeValue(ShareDefine.Def_PlayerRecType_WorshipPlayer, [crossWorshipType]) + + sysnList = [] + for attrDict in worshipDataList: + recData = playerRecMgr.AddPlayerRecDataByDict(attrDict) + playerID = recData.GetPlayerID() + + # 如果存在本服的最新外观数据则已本服的为准 + modelShow = GetPlayerModelShow(playerID) + if modelShow: + SetModelShowInfo(recData, modelShow) + + sysnList.append(recData) + GameWorld.Log(" 更新跨服膜拜: worshipType=%s,zoneID=%s,playerID=%s,worshipValue=%s,days=%s" + % (GetWorshipType(recData), GetWorshipZoneID(recData), playerID, GetWorshipValue(recData), GetWorshipDays(recData))) + + #更新数据的可不同步,每个人的膜拜记录都不一样,由登录触发及添加新膜拜触发即可 + #Sync_UnWorshipInfo(None, sysnList) + return + +def __Client_AddCrossWorship(msgData): + ## 子服添加跨服膜拜 + worshipDataList = msgData["worshipDataList"] + + GameWorld.Log("子服添加跨服膜拜: addCount=%s" % len(worshipDataList)) + playerRecMgr = PyDataManager.GetDBPlayerRecDataManager() + + tempData = PlayerRecData.PlayerRecDataTemp + sysnList = [] + for attrDict in worshipDataList: + tempData.SetAttr(attrDict, True) + playerID = tempData.GetPlayerID() + worshipType = GetWorshipType(tempData) + worshipValue = GetWorshipValue(tempData) + if not playerID or not worshipType: + continue + + # 如果已经存在该膜拜则直接更新数据,否则添加新数据 + recData = playerRecMgr.GetPlayerRecData(ShareDefine.Def_PlayerRecType_WorshipPlayer, playerID, [worshipType, worshipValue]) + if recData: + recData.SetAttr(attrDict, True) + else: + recData = playerRecMgr.AddPlayerRecDataByDict(attrDict) + + sysnList.append(recData) + GameWorld.Log(" 添加跨服膜拜: worshipType=%s,zoneID=%s,playerID=%s,worshipValue=%s,days=%s" + % (GetWorshipType(recData), GetWorshipZoneID(recData), playerID, GetWorshipValue(recData), GetWorshipDays(recData))) + + Sync_UnWorshipInfo(None, sysnList) + return + +def __Client_DelCrossWorship(msgData): + ## 子服删除跨服膜拜 + worshipType = msgData["worshipType"] + worshipValue = msgData["worshipValue"] + delPlayerID = msgData["delPlayerID"] + GameWorld.Log("子服删除跨服膜拜: worshipType=%s,worshipValue=%s,delPlayerID=%s" % (worshipType, worshipValue, delPlayerID)) + DelWorshipPlayer(worshipType, worshipValue, delPlayerID) + return + +def Sync_UnWorshipInfo(curPlayer, unWorshipList): + ## curPlayer 可能为None + if not unWorshipList: + return + + infoList = [] + for recData in unWorshipList: + recPlayerID = recData.GetPlayerID() + modelShow = GetPlayerModelShow(recPlayerID) + if modelShow: + # 更新本服最新的外观显示,跨服玩家由跨服每日同步更新 __UpdWorshipByDay + SetModelShowInfo(recData, modelShow) + else: + modelShow = GetModelShowInfo(recData) + if not modelShow: + # 没有外观展示的不同步 + continue + + if curPlayer: + if not __CheckPlayerCanWorship(curPlayer, recData): + continue + + infoPack = ChPyNetSendPack.tagGCWorshipInfo() + infoPack.PlayerID = recPlayerID + infoPack.WorshipType = GetWorshipType(recData) + infoPack.WorshipValue = GetWorshipValue(recData) + infoPack.PlayerInfo = str(modelShow).replace(" ", "") + infoPack.InfoLen = len(infoPack.PlayerInfo) + + if curPlayer: + infoList.append(infoPack) + else: + infoList.append([recData, infoPack]) + + if not infoList: + return + + clientPack = ChPyNetSendPack.tagGCWorshipInfoList() + if not curPlayer: + # 全服广播在线玩家,每个人同步的可能不一样 + playerManager = GameWorld.GetPlayerManager() + for i in range(0, playerManager.GetPlayerCount()): + curPlayer = playerManager.GetPlayerByIndex(i) + if curPlayer == None or not curPlayer.GetInitOK(): + continue + clientPack.WorshipInfoList = [] + for info in infoList: + recData, infoPack = info + if not __CheckPlayerCanWorship(curPlayer, recData): + continue + clientPack.WorshipInfoList.append(infoPack) + if not clientPack.WorshipInfoList: + continue + clientPack.WorshipCount = len(clientPack.WorshipInfoList) + NetPackCommon.SendFakePack(curPlayer, clientPack) + else: + clientPack.WorshipInfoList = infoList + clientPack.WorshipCount = len(clientPack.WorshipInfoList) + NetPackCommon.SendFakePack(curPlayer, clientPack) + return + +##-------------------------------------------------------------------------------------------------- + +def Sync_CrossWorshipToClientServer(serverGroupID=0): + ''' 同步跨服膜拜数据到子服务器 + @param serverGroupID: 为0时同步所有子服 + ''' + GameWorld.Log("同步给子服膜拜数据: syncServerGroupID=%s" % (serverGroupID)) + + playerRecMgr = PyDataManager.GetDBPlayerRecDataManager() + recDataDict = playerRecMgr.GetPlayerRecDataDict(ShareDefine.Def_PlayerRecType_WorshipPlayer) + + worshipDataList = [] + for recDataList in recDataDict.values(): + for recData in recDataList: + if not recData: + continue + if GetWorshipType(recData) not in ShareDefine.Def_WorshipTypeCross: + continue + worshipDataList.append(recData.GetString()) + + dataMsg = {"msgType":"AllCrossWorship", "worshipDataList":worshipDataList} + CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_Worship, dataMsg) + return + +def SyncAddCrossWorship(addRecDataList): + # 同步子服 + worshipDataList = [] + for recData in addRecDataList: + if not recData: + continue + worshipDataList.append(recData.GetString()) + if not worshipDataList: + return + dataMsg = {"msgType":"AddCrossWorship", "worshipDataList":worshipDataList} + CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_Worship, dataMsg) + return diff --git a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py index 64ebbcf..d09c815 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py @@ -1030,6 +1030,14 @@ ("BYTE", "AssistAwardCount", 0), ), + "Worship":( + ("BYTE", "WorshipType", 1), + ("DWORD", "WorshipValue", 1), + ("BYTE", "WorshipDays", 0), + ("BYTE", "MoneyType", 0), + ("list", "MoneyRange", 0), + ), + "FairyDomain":( ("WORD", "ID", 1), ("DWORD", "HourCntPubLimit", 0), @@ -2500,6 +2508,19 @@ def GetGiftID(self): return self.attrTuple[0] # 礼盒物品ID DWORD def GetAssistAwardCount(self): return self.attrTuple[1] # 协助奖励每日次数 BYTE +# 膜拜表 +class IPY_Worship(): + + def __init__(self): + self.attrTuple = None + return + + def GetWorshipType(self): return self.attrTuple[0] # 膜拜类型 BYTE + def GetWorshipValue(self): return self.attrTuple[1] # 膜拜值 DWORD + def GetWorshipDays(self): return self.attrTuple[2] # 膜拜天数 BYTE + def GetMoneyType(self): return self.attrTuple[3] # 膜拜货币类型 BYTE + def GetMoneyRange(self): return self.attrTuple[4] # 货币值范围 list + # 缥缈仙域表 class IPY_FairyDomain(): @@ -2659,6 +2680,7 @@ self.__LoadFileData("MineAreaItem", onlyCheck) self.__LoadFileData("FamilyWarRankAward", onlyCheck) self.__LoadFileData("AssistThanksGift", onlyCheck) + self.__LoadFileData("Worship", onlyCheck) self.__LoadFileData("FairyDomain", onlyCheck) Log("IPY_DataMgr ReloadOK! onlyCheck=%s" % onlyCheck) return @@ -3516,6 +3538,13 @@ self.CheckLoadData("AssistThanksGift") return self.ipyAssistThanksGiftCache[index] + def GetWorshipCount(self): + self.CheckLoadData("Worship") + return self.ipyWorshipLen + def GetWorshipByIndex(self, index): + self.CheckLoadData("Worship") + return self.ipyWorshipCache[index] + def GetFairyDomainCount(self): self.CheckLoadData("FairyDomain") return self.ipyFairyDomainLen diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py index c8bb99c..a77a7c1 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py @@ -75,6 +75,7 @@ import CrossActAllRecharge import CrossYaomoBoss import GameWorldMineArea +import GameWorship #--------------------------------------------------------------------- #--------------------------------------------------------------------- @@ -235,6 +236,8 @@ PlayerCharm.OnPlayerLogin(curPlayer) #情缘 PlayerLove.OnPlayerLogin(curPlayer) + #膜拜 + GameWorship.OnPlayerLogin(curPlayer) #跨服战场 CrossBattlefield.OnPlayerLogin(curPlayer) #跨服排位 diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py index 415d287..3f874ac 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py @@ -376,6 +376,12 @@ curPlayer.MapServer_QueryPlayerResult(0, 0, "DelItem", result, len(result)) return +def MapServerGiveAward(curPlayer, eventName, moneyInfo={}, itemList=[], drDict={}): + ## 地图给奖励 + result = str([eventName, moneyInfo, itemList, drDict]) + curPlayer.MapServer_QueryPlayerResult(0, 0, "GiveAward", result, len(result)) + return + ## 增加仙盟活跃 # @param curPlayer # @param successType: 成就类型 diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerRecData.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerRecData.py new file mode 100644 index 0000000..683b67e --- /dev/null +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerRecData.py @@ -0,0 +1,271 @@ +#!/usr/bin/python +# -*- coding: GBK -*- +#------------------------------------------------------------------------------- +# +##@package PlayerRecData +# +# @todo:玩家记录 +# @author hxp +# @date 2024-07-02 +# @version 1.0 +# +# 详细描述: 玩家记录,区别与通用记录,通用记录字符长度记录有限,且针对玩家的记录查找每次需要遍历,效率不高 +# +#------------------------------------------------------------------------------- +#"""Version = 2024-07-02 16:30""" +#------------------------------------------------------------------------------- + +import CommFunc +import PyGameDataStruct +import GameWorld + +import time + +class PlayerRecData(): + + def __init__(self, dbRecData=None): + if not dbRecData: + dbRecData = PyGameDataStruct.tagDBPlayerRecData() + self.dbRecData = dbRecData + self.evalUserData = None + return + def clear(self): + self.dbRecData.clear() + self.evalUserData = None + return + def GetPlayerID(self): return self.dbRecData.PlayerID + def SetPlayerID(self, playerID): self.dbRecData.PlayerID = playerID + def GetRecType(self): return self.dbRecData.RecType + def SetRecType(self, recType): self.dbRecData.RecType = recType + def GetTime(self): return self.dbRecData.Time + def SetTime(self, sTime): self.dbRecData.Time = sTime + def GetValue1(self): return self.dbRecData.Value1 + def SetValue1(self, value1): self.dbRecData.Value1 = value1 + def GetValue2(self): return self.dbRecData.Value2 + def SetValue2(self, value2): self.dbRecData.Value2 = value2 + def GetValue3(self): return self.dbRecData.Value3 + def SetValue3(self, value3): self.dbRecData.Value3 = value3 + def GetValue4(self): return self.dbRecData.Value4 + def SetValue4(self, value4): self.dbRecData.Value4 = value4 + def GetValue5(self): return self.dbRecData.Value5 + def SetValue5(self, value5): self.dbRecData.Value5 = value5 + def GetValue6(self): return self.dbRecData.Value6 + def SetValue6(self, value6): self.dbRecData.Value6 = value6 + def GetValue7(self): return self.dbRecData.Value7 + def SetValue7(self, value7): self.dbRecData.Value7 = value7 + def GetValue8(self): return self.dbRecData.Value8 + def SetValue8(self, value8): self.dbRecData.Value8 = value8 + def GetUserData(self): return self.dbRecData.UserData + def SetUserData(self, userData): + if type(userData) != str: + userData = str(userData).replace(" ", "") + self.dbRecData.UserData = userData + self.dbRecData.UserDataLen = len(self.dbRecData.UserData) + if self.evalUserData != None: + self.evalUserData = None + return + def GetEvalUserData(self, defValue={}): + if self.evalUserData == None: + try: + self.evalUserData = eval(self.dbRecData.UserData) + except: + self.evalUserData = defValue + return self.evalUserData + def SetEvalUserData(self, eValue): + self.evalUserData = eValue + return + + 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): + continue + curValue = getattr(self, "GetValue%s" % i)() + if curValue != value: + return False + return True + + def GetString(self): + return {"PlayerID":self.GetPlayerID(), "RecType":self.GetRecType(), "Time":self.GetTime(), + "Value1":self.GetValue1(), "Value2":self.GetValue2(), "Value3":self.GetValue3(), "Value4":self.GetValue4(), + "Value5":self.GetValue5(), "Value6":self.GetValue6(), "Value7":self.GetValue7(), "Value8":self.GetValue8(), + "UserData":self.GetUserData() + } + def SetAttr(self, attrDict, isClear=False): + if isClear: + self.clear() + for k, v in attrDict.items(): + if hasattr(self, "Set%s" % k): + getattr(self, "Set%s" % k, v)(v) + return + +class DBPlayerRecDataManager(): + ## 玩家记录管理 + + def __init__(self): + self.Clear() + return + + def Clear(self): + self.recTypeDict = {} # {recType:{playerID:[PlayerRecData, ...], ...}} + return + + def DelRecDataByType(self, recType): + ## 删除某个记录类型所有玩家记录 + GameWorld.DebugLog("删除所有玩家指定记录类型: recType=%s" % recType) + self.recTypeDict.pop(recType, None) + return + + def DelRecDataByTypePlayer(self, recType, delPlayerID): + ## 删除玩家某个类型记录 + if recType not in self.recTypeDict: + return 0 + playerRecDataDict = self.recTypeDict[recType] + recDataList = playerRecDataDict.pop(delPlayerID, None) + delCount = len(recDataList) if recDataList else 0 + GameWorld.DebugLog("删除某个玩家指定记录类型: recType=%s,delPlayerID=%s,delCount=%s" % (recType, delPlayerID, delCount)) + return delCount + + def DelRecDataByTypeValue(self, recType, valueList, delPlayerID=None): + ## 删除某个记录类型匹配Value值列表的记录 + # @param valueList: [value1, value2, ...] value为None时不判断该值 + # @param delPlayerID: 可指定只删除某个玩家的记录 + + if not valueList: + return 0 + if recType not in self.recTypeDict: + return 0 + delCountTotal = 0 + recDict = self.recTypeDict[recType] + for playerID, recDataList in recDict.items(): + if delPlayerID and playerID != delPlayerID: + continue + delCount = 0 + for recData in recDataList[::-1]: # 倒序处理删除 + if recData.IsMatchValue(valueList): + recDataList.remove(recData) + delCount += 1 + + if delCount: + delCountTotal += delCount + GameWorld.DebugLog("删除某个记录类型所有Value1匹配值的记录: recType=%s,valueList=%s,delPlayerID=%s,delCount=%s" + % (recType, valueList, playerID, delCount)) + return delCountTotal + + def DelRecData(self, recData): + ## 删除指定记录 + playerID = recData.GetPlayerID() + recType = recData.GetRecType() + if recType not in self.recTypeDict: + return 0 + playerRecDataDict = self.recTypeDict[recType] + if playerID not in playerRecDataDict: + return 0 + playerRecDataList = playerRecDataDict[playerID] + if recData in playerRecDataList: + playerRecDataList.remove(recData) + return 1 + + def AddPlayerRecData(self, recType, playerID): + ## 添加玩家记录 + recData = PlayerRecData() + recData.clear() + recData.SetPlayerID(playerID) + recData.SetRecType(recType) + recData.SetTime(int(time.time())) + self.__AddRecData(recData) + return recData + + def AddPlayerRecDataByDict(self, attrDict): + ## 一般是跨服同步过来数据添加用 + recData = PlayerRecData() + recData.SetAttr(attrDict, True) + self.__AddRecData(recData) + return recData + + def __AddRecData(self, recData): + playerID = recData.GetPlayerID() + recType = recData.GetRecType() + if recType not in self.recTypeDict: + self.recTypeDict[recType] = {} + playerRecDataDict = self.recTypeDict[recType] + if playerID not in playerRecDataDict: + playerRecDataDict[playerID] = [] + playerRecDataList = playerRecDataDict[playerID] + playerRecDataList.append(recData) + return + + def GetPlayerRecDataFirst(self, recType, playerID): + ## 获取玩家记录类型对应的第一条记录,适用于仅需一条的记录类型 + recDataList = self.GetPlayerRecDataList(recType, playerID) + if recDataList: + recData = recDataList[0] + else: + recData = self.AddPlayerRecData(recType, playerID) + return recData + + def GetPlayerRecData(self, recType, playerID, valueList): + ## 获取玩家记录类型对应的某条记录 + # @param valueList: [value1, value2, ...] value为None时不判断该值 + recDataList = self.GetPlayerRecDataList(recType, playerID) + if not recDataList: + return + for recData in recDataList: + if recData.IsMatchValue(valueList): + return recData + return + + def GetPlayerRecDataList(self, recType, playerID): + ## 获取玩家记录类型对应记录列表 [recData, ...] + if recType not in self.recTypeDict: + return [] + playerRecDataDict = self.recTypeDict[recType] + if playerID not in playerRecDataDict: + return [] + return playerRecDataDict[playerID] + + def GetPlayerRecDataDict(self, recType): + ## 获取记录类型对应所有玩家的记录字典 {playerID:[recData, ...], ...} + if recType not in self.recTypeDict: + return {} + return self.recTypeDict[recType] + + # 保存数据 存数据库和realtimebackup + def GetSaveData(self): + savaData = "" + cntData = "" + cnt = 0 + + for playerRecDataDict in self.recTypeDict.values(): + for recDataList in playerRecDataDict.values(): + for recData in recDataList: + cnt += 1 + if recData.evalUserData != None: + recData.SetUserData(recData.evalUserData) + savaData += recData.dbRecData.getBuffer() + + GameWorld.Log("Save DBPlayerRecData 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 DBPlayerRecData count :%s" % cnt) + + self.Clear() + + for _ in xrange(cnt): + recData = PyGameDataStruct.tagDBPlayerRecData() + recData.clear() + pos += recData.readData(datas, pos, dataslen) + + self.__AddRecData(PlayerRecData(recData)) + + return pos + +PlayerRecDataTemp = PlayerRecData() diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py index 78a97b5..ce034af 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py @@ -19,6 +19,7 @@ #--------------------------------------------------------------------- import GameWorld +import GameWorship import PlayerControl import NetPackCommon import GameWorldArena @@ -54,6 +55,9 @@ if CrossChampionship.IsChampionshipPlayer(playerID): return True + if GameWorship.IsWorshipPlayer(playerID): + return True + if GameWorldSkyTower.IsSkyTowerPassPlayer(playerID): return True diff --git a/ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py b/ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py index e35a1a5..67c88dd 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py @@ -26,6 +26,7 @@ import CrossRealmPK import AuctionHouse import PlayerAssist +import PlayerRecData import GameWorldMineArea import PyGameDataStruct import IpyGameDataPY @@ -310,6 +311,7 @@ class PyGameDataManager(object): def __init__(self): + self.DBPlayerRecDataManager = PlayerRecData.DBPlayerRecDataManager() self.DBPyMineAreaAwardManager = GameWorldMineArea.DBPyMineAreaAwardManager() self.DBPyMineAreaRecordManager = GameWorldMineArea.DBPyMineAreaRecordManager() self.DBPyMineAreaItemManager = GameWorldMineArea.DBPyMineAreaItemManager() @@ -342,6 +344,7 @@ def GetSaveData(self): buff = "" + buff += self.DBPlayerRecDataManager.GetSaveData() buff += self.DBPyMineAreaAwardManager.GetSaveData() buff += self.DBPyMineAreaRecordManager.GetSaveData() buff += self.DBPyMineAreaItemManager.GetSaveData() @@ -373,6 +376,7 @@ return buff def LoadGameData(self, gameBuffer, pos): + pos = self.DBPlayerRecDataManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer)) pos = self.DBPyMineAreaAwardManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer)) pos = self.DBPyMineAreaRecordManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer)) pos = self.DBPyMineAreaItemManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer)) @@ -491,6 +495,11 @@ pyGameDataMgr = GetPyGameDataManager() return pyGameDataMgr.familyStoreItemManager +def GetDBPlayerRecDataManager(): + # 玩家记录管理 + pyGameDataMgr = GetPyGameDataManager() + return pyGameDataMgr.DBPlayerRecDataManager + def GetDBPyMineAreaAwardManager(): # 福地奖励结算管理 pyGameDataMgr = GetPyGameDataManager() diff --git a/ServerPython/CoreServerGroup/GameServer/Script/PyGameDataStruct.py b/ServerPython/CoreServerGroup/GameServer/Script/PyGameDataStruct.py index 2a3aa80..8fc29b5 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/PyGameDataStruct.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/PyGameDataStruct.py @@ -3014,3 +3014,133 @@ ) return output + +# 玩家记录表 #tagDBPlayerRecData +class tagDBPlayerRecData(Structure): + _pack_ = 1 + _fields_ = [ + ('PlayerID', ctypes.c_ulong), + ('RecType', ctypes.c_ushort), + ('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.PlayerID = 0 + self.RecType = 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.PlayerID, pos = CommFunc.ReadDWORD(buf, pos) + self.RecType, pos = CommFunc.ReadWORD(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.WriteDWORD(buf, self.PlayerID) + buf = CommFunc.WriteWORD(buf, self.RecType) + 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_ulong) + length += sizeof(ctypes.c_ushort) + 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 = '''// 玩家记录表 #tagDBPlayerRecData: + PlayerID = %s, + RecType = %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.PlayerID, + self.RecType, + 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 + diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py index 261939f..b0348e2 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py @@ -1297,7 +1297,26 @@ Def_Weapon_Dual_Hands, # 双持(左右手可互换) ) = range(3) -#玩家通用信息记录类型 +#膜拜类型 +Def_WorshipTypeList = ( + Def_WorshipType_ServerNaming, # 服务器冠名 1 + Def_WorshipType_CrossChampionship, # 跨服排位冠军 2 + ) = range(1, 1 + 2) + +#跨服膜拜类型 +Def_WorshipTypeCross = [Def_WorshipType_CrossChampionship] + +#玩家记录类型 +Def_PlayerRecTypeList = ( + Def_PlayerRecType_WorshipPlayer, # 被膜拜的玩家 1 + Def_PlayerRecType_WorshipDaily, # 玩家每日膜拜记录 2 + ) = range(1, 1 + 2) + +#玩家记录类型每人限制条数,没有配置的类型不限制,由功能自行控制 +Def_PlayerRecCountDict = { + } + +#通用信息记录类型 Def_UniversalGameRecTypeList = ( Def_UniversalGameRecType_XMZZPKInfoRecord, # 仙魔之争信息记录0 Def_UniversalGameRecType_HijackTruck, # 劫镖1 @@ -1541,6 +1560,7 @@ CrossServerMsg_CrossYaomoBossHurtInfo = "CrossYaomoBossHurtInfo" # 跨服妖魔boss玩家伤害信息 CrossServerMsg_FamilyFlagwarOver = "FamilyFlagwarOver" # 逐鹿万界结算信息 CrossServerMsg_CrossBossTrialFamilyAward = "CrossBossTrialFamilyAward" # 跨服boss历练仙盟奖励结算 +CrossServerMsg_Worship = "Worship" # 膜拜信息 # 子服发送跨服信息定义 ClientServerMsg_ServerInitOK = "ServerInitOK" # 子服启动成功 diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py index db10c79..52258f9 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py @@ -2382,6 +2382,66 @@ #------------------------------------------------------ +# B0 20 请求膜拜玩家 #tagCGWorship + +class tagCGWorship(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("PlayerID", c_int), # 目标玩家ID + ("WorshipType", c_ubyte), # 膜拜类型 + ("WorshipValue", c_int), # 膜拜类型对应的功能值,如名次或其他,由具体膜拜类型定义对应值含义 + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xB0 + self.SubCmd = 0x20 + return + + def ReadData(self, stringData, _pos=0, _len=0): + self.Clear() + memmove(addressof(self), stringData[_pos:], self.GetLength()) + return _pos + self.GetLength() + + def Clear(self): + self.Cmd = 0xB0 + self.SubCmd = 0x20 + self.PlayerID = 0 + self.WorshipType = 0 + self.WorshipValue = 0 + return + + def GetLength(self): + return sizeof(tagCGWorship) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// B0 20 请求膜拜玩家 //tagCGWorship: + Cmd:%s, + SubCmd:%s, + PlayerID:%d, + WorshipType:%d, + WorshipValue:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.PlayerID, + self.WorshipType, + self.WorshipValue + ) + return DumpString + + +m_NAtagCGWorship=tagCGWorship() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGWorship.Cmd,m_NAtagCGWorship.SubCmd))] = m_NAtagCGWorship + + +#------------------------------------------------------ # B3 19 提升魅力等级 #tagCGCharmLVUp class tagCGCharmLVUp(Structure): diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py index be51fff..7b77e7d 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py @@ -8515,6 +8515,213 @@ #------------------------------------------------------ +# B0 20 膜拜信息列表 #tagGCWorshipInfoList + +class tagGCWorshipInfo(Structure): + PlayerID = 0 #(DWORD PlayerID)// 目标玩家ID + WorshipType = 0 #(BYTE WorshipType)// 膜拜类型 + WorshipValue = 0 #(DWORD WorshipValue)// 膜拜类型对应的功能值,如名次或其他,由具体膜拜类型定义对应值含义 + InfoLen = 0 #(WORD InfoLen) + PlayerInfo = "" #(String PlayerInfo)// 玩家信息{k:v, ...} + data = None + + def __init__(self): + self.Clear() + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.WorshipType,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.WorshipValue,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.InfoLen,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.PlayerInfo,_pos = CommFunc.ReadString(_lpData, _pos,self.InfoLen) + return _pos + + def Clear(self): + self.PlayerID = 0 + self.WorshipType = 0 + self.WorshipValue = 0 + self.InfoLen = 0 + self.PlayerInfo = "" + return + + def GetLength(self): + length = 0 + length += 4 + length += 1 + length += 4 + length += 2 + length += len(self.PlayerInfo) + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteDWORD(data, self.PlayerID) + data = CommFunc.WriteBYTE(data, self.WorshipType) + data = CommFunc.WriteDWORD(data, self.WorshipValue) + data = CommFunc.WriteWORD(data, self.InfoLen) + data = CommFunc.WriteString(data, self.InfoLen, self.PlayerInfo) + return data + + def OutputString(self): + DumpString = ''' + PlayerID:%d, + WorshipType:%d, + WorshipValue:%d, + InfoLen:%d, + PlayerInfo:%s + '''\ + %( + self.PlayerID, + self.WorshipType, + self.WorshipValue, + self.InfoLen, + self.PlayerInfo + ) + return DumpString + + +class tagGCWorshipInfoList(Structure): + Head = tagHead() + WorshipCount = 0 #(BYTE WorshipCount) + WorshipInfoList = list() #(vector<tagGCWorshipInfo> WorshipInfoList) + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xB0 + self.Head.SubCmd = 0x20 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.WorshipCount,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.WorshipCount): + temWorshipInfoList = tagGCWorshipInfo() + _pos = temWorshipInfoList.ReadData(_lpData, _pos) + self.WorshipInfoList.append(temWorshipInfoList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xB0 + self.Head.SubCmd = 0x20 + self.WorshipCount = 0 + self.WorshipInfoList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + for i in range(self.WorshipCount): + length += self.WorshipInfoList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteBYTE(data, self.WorshipCount) + for i in range(self.WorshipCount): + data = CommFunc.WriteString(data, self.WorshipInfoList[i].GetLength(), self.WorshipInfoList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + WorshipCount:%d, + WorshipInfoList:%s + '''\ + %( + self.Head.OutputString(), + self.WorshipCount, + "..." + ) + return DumpString + + +m_NAtagGCWorshipInfoList=tagGCWorshipInfoList() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCWorshipInfoList.Head.Cmd,m_NAtagGCWorshipInfoList.Head.SubCmd))] = m_NAtagGCWorshipInfoList + + +#------------------------------------------------------ +# B0 21 膜拜结果 #tagGCWorshipResult + +class tagGCWorshipResult(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("PlayerID", c_int), # 目标玩家ID + ("WorshipType", c_ubyte), # 膜拜类型 + ("WorshipValue", c_int), # 膜拜类型对应的功能值,如名次或其他,由具体膜拜类型定义对应值含义 + ("Result", c_ubyte), # 膜拜结果:0-成功;1-不存在该膜拜类型;2-不存在该目标膜拜;3-不能膜拜该目标; + ("MoneyType", c_ubyte), # 货币类型 + ("MoneyValue", c_int), # 货币奖励 + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xB0 + self.SubCmd = 0x21 + return + + def ReadData(self, stringData, _pos=0, _len=0): + self.Clear() + memmove(addressof(self), stringData[_pos:], self.GetLength()) + return _pos + self.GetLength() + + def Clear(self): + self.Cmd = 0xB0 + self.SubCmd = 0x21 + self.PlayerID = 0 + self.WorshipType = 0 + self.WorshipValue = 0 + self.Result = 0 + self.MoneyType = 0 + self.MoneyValue = 0 + return + + def GetLength(self): + return sizeof(tagGCWorshipResult) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// B0 21 膜拜结果 //tagGCWorshipResult: + Cmd:%s, + SubCmd:%s, + PlayerID:%d, + WorshipType:%d, + WorshipValue:%d, + Result:%d, + MoneyType:%d, + MoneyValue:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.PlayerID, + self.WorshipType, + self.WorshipValue, + self.Result, + self.MoneyType, + self.MoneyValue + ) + return DumpString + + +m_NAtagGCWorshipResult=tagGCWorshipResult() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCWorshipResult.Cmd,m_NAtagGCWorshipResult.SubCmd))] = m_NAtagGCWorshipResult + + +#------------------------------------------------------ #B3 03 询问是否允许添加好友#tagGCFriendAskIfJoin class tagGCFriendAskIfJoin(Structure): 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 aebd1e5..c85fd31 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py @@ -6310,6 +6310,11 @@ def GetPayCoin(curPlayer): return curPlayer.GetExAttr11() def SetPayCoin(curPlayer, value): return curPlayer.SetExAttr11(min(value, ChConfig.Def_UpperLimit_DWord), False, False) +## 获取佩戴的称号ID +def GetTitleID(curPlayer): + curDienstgradMgr = curPlayer.GetDienstgradManager() + return curDienstgradMgr.GetCurGradID() + ##伴侣 def GetCoupleID(curPlayer): coupleInfo = GetCoupleInfo(curPlayer.GetPlayerID()) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py index e55c8c5..0c85787 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py @@ -171,6 +171,7 @@ curPlayerPropDict["Name"] = curPlayer.GetPlayerName() curPlayerPropDict["FamilyID"] = curPlayer.GetFamilyID() curPlayerPropDict["FamilyName"] = curPlayer.GetFamilyName() + curPlayerPropDict["TitleID"] = PlayerControl.GetTitleID(curPlayer) curPlayerPropDict["CoupleName"] = PlayerControl.GetCoupleName(curPlayer) curPlayerPropDict["FightPower"] = PlayerControl.GetFightPower(curPlayer) curPlayerPropDict["AppID"] = GameWorld.GetPlayerPlatform(curPlayer) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_GiveAward.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_GiveAward.py new file mode 100644 index 0000000..33ce9c4 --- /dev/null +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_GiveAward.py @@ -0,0 +1,52 @@ +#!/usr/bin/python +# -*- coding: GBK -*- +#------------------------------------------------------------------------------- +# +##@package Player.RemoteQuery.GY_Query_GiveAward +# +# @todo:给奖励 +# @author hxp +# @date 2024-07-02 +# @version 1.0 +# +# 详细描述: 给奖励 +# +#------------------------------------------------------------------------------- +#"""Version = 2024-07-02 16:30""" +#------------------------------------------------------------------------------- + +import PlayerControl +import ItemControler +import GameWorld + +#逻辑实现 +## 玩家请求领取奖励 +# @param query_Type 请求类型 +# @param query_ID 请求的玩家ID +# @param packCMDList 发包命令 +# @param tick 当前时间 +# @return "True" or "False" or "" +# @remarks 函数详细说明. +def DoLogic(query_Type, query_ID, packCMDList, tick): + return '' + +#--------------------------------------------------------------------- +## 执行结果 +# @param curPlayer 发出请求的玩家 +# @param callFunName 功能名称 +# @param funResult 查询的结果 +# @param tick 当前时间 +# @return None +# @remarks 函数详细说明. +def DoResult(curPlayer, callFunName, funResult, tick): + GameWorld.Log("GY_Query_GiveAward funResult=%s" % str(funResult), curPlayer.GetPlayerID()) + if funResult == "": + return + eventName, moneyInfo, itemList, drDict = eval(funResult) + + if moneyInfo: + for moneyType, moneyValue in moneyInfo.items(): + PlayerControl.GiveMoney(curPlayer, moneyType, moneyValue, eventName, drDict) + + ItemControler.GivePlayerItemOrMail(curPlayer, itemList, event=[eventName, False, drDict]) + return diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py index 261939f..b0348e2 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py @@ -1297,7 +1297,26 @@ Def_Weapon_Dual_Hands, # 双持(左右手可互换) ) = range(3) -#玩家通用信息记录类型 +#膜拜类型 +Def_WorshipTypeList = ( + Def_WorshipType_ServerNaming, # 服务器冠名 1 + Def_WorshipType_CrossChampionship, # 跨服排位冠军 2 + ) = range(1, 1 + 2) + +#跨服膜拜类型 +Def_WorshipTypeCross = [Def_WorshipType_CrossChampionship] + +#玩家记录类型 +Def_PlayerRecTypeList = ( + Def_PlayerRecType_WorshipPlayer, # 被膜拜的玩家 1 + Def_PlayerRecType_WorshipDaily, # 玩家每日膜拜记录 2 + ) = range(1, 1 + 2) + +#玩家记录类型每人限制条数,没有配置的类型不限制,由功能自行控制 +Def_PlayerRecCountDict = { + } + +#通用信息记录类型 Def_UniversalGameRecTypeList = ( Def_UniversalGameRecType_XMZZPKInfoRecord, # 仙魔之争信息记录0 Def_UniversalGameRecType_HijackTruck, # 劫镖1 @@ -1541,6 +1560,7 @@ CrossServerMsg_CrossYaomoBossHurtInfo = "CrossYaomoBossHurtInfo" # 跨服妖魔boss玩家伤害信息 CrossServerMsg_FamilyFlagwarOver = "FamilyFlagwarOver" # 逐鹿万界结算信息 CrossServerMsg_CrossBossTrialFamilyAward = "CrossBossTrialFamilyAward" # 跨服boss历练仙盟奖励结算 +CrossServerMsg_Worship = "Worship" # 膜拜信息 # 子服发送跨服信息定义 ClientServerMsg_ServerInitOK = "ServerInitOK" # 子服启动成功 -- Gitblit v1.8.0