From a9039a33299cc764fb4225a9d49b15d10414cfb8 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期三, 03 七月 2024 15:14:39 +0800 Subject: [PATCH] 10195 【香港】【越南】【主干】【砍树】新增消耗记录(代币获得、消耗记录;后台扣除货币支持扣代币;) --- ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerRecData.py | 107 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 98 insertions(+), 9 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerRecData.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerRecData.py index 683b67e..a471d0b 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerRecData.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerRecData.py @@ -15,9 +15,14 @@ #"""Version = 2024-07-02 16:30""" #------------------------------------------------------------------------------- -import CommFunc +import ChConfig +import ShareDefine +import PyDataManager import PyGameDataStruct +import ChPyNetSendPack +import NetPackCommon import GameWorld +import CommFunc import time @@ -58,8 +63,8 @@ def GetUserData(self): return self.dbRecData.UserData def SetUserData(self, userData): if type(userData) != str: - userData = str(userData).replace(" ", "") - self.dbRecData.UserData = userData + userData = str(userData) + self.dbRecData.UserData = userData.replace(" ", "") self.dbRecData.UserDataLen = len(self.dbRecData.UserData) if self.evalUserData != None: self.evalUserData = None @@ -117,9 +122,12 @@ def DelRecDataByType(self, recType): ## 删除某个记录类型所有玩家记录 - GameWorld.DebugLog("删除所有玩家指定记录类型: recType=%s" % recType) - self.recTypeDict.pop(recType, None) - return + recDict = self.recTypeDict.pop(recType, {}) + delCount = 0 + for recList in recDict.values(): + delCount += len(recList) + GameWorld.DebugLog("删除所有玩家指定记录类型: recType=%s,delCount=%s" % (recType, delCount)) + return delCount def DelRecDataByTypePlayer(self, recType, delPlayerID): ## 删除玩家某个类型记录 @@ -223,17 +231,22 @@ def GetPlayerRecDataList(self, recType, playerID): ## 获取玩家记录类型对应记录列表 [recData, ...] if recType not in self.recTypeDict: - return [] + self.recTypeDict[recType] = {} playerRecDataDict = self.recTypeDict[recType] if playerID not in playerRecDataDict: - return [] - return playerRecDataDict[playerID] + playerRecDataDict[playerID] = [] + playerRecDataList = playerRecDataDict[playerID] + return playerRecDataList def GetPlayerRecDataDict(self, recType): ## 获取记录类型对应所有玩家的记录字典 {playerID:[recData, ...], ...} if recType not in self.recTypeDict: return {} return self.recTypeDict[recType] + + def SortRecDataList(self, recDataList): + recDataList.sort(key=lambda r: (r.GetTime()), reverse=False) + return # 保存数据 存数据库和realtimebackup def GetSaveData(self): @@ -269,3 +282,79 @@ return pos PlayerRecDataTemp = PlayerRecData() + +def OnPlayerLogin(curPlayer): + playerID = curPlayer.GetPlayerID() + playerRecMgr = PyDataManager.GetDBPlayerRecDataManager() + for recType in ChConfig.Def_PlayerRecLoginNotifyList: + recDataList = playerRecMgr.GetPlayerRecDataList(recType, playerID) + if not recDataList: + continue + SyncPlayerRecInfo(curPlayer, recType, recDataList) + return + +def MapServer_AddPlayerRec(curPlayer, recType, valueList, userData="", notifyType=0): + ''' + @todo: 添加玩家记录 + @param recType: 通用记录类型, 对应 ShareDefine.Def_PlayerRecTypeList + @param valueList: 数值列表[value1, value2, ...], 按顺序, 支持value1 ~ value8 + @param userData: 自定义字符信息 + @param notifyType: 0-不通知; 1-通知单条; 2-通知全部 + ''' + playerID = curPlayer.GetPlayerID() + if recType not in ShareDefine.Def_PlayerRecTypeList: + GameWorld.ErrLog("玩家记录类型错误: recType=%s" % recType, playerID) + return + + playerRecMgr = PyDataManager.GetDBPlayerRecDataManager() + recDataList = playerRecMgr.GetPlayerRecDataList(recType, playerID) + if recDataList and len(recDataList) >= ChConfig.Def_PlayerRecCountDict.get(recType, 50): + playerRecMgr.SortRecDataList(recDataList) + recDataList.pop(0) # 删除第一个 + + recData = playerRecMgr.AddPlayerRecData(recType, playerID) + + for num, value in enumerate(valueList, 1): + if num > 8: + break + getattr(recData, "SetValue%s" % num)(min(ChConfig.Def_UpperLimit_DWord, value)) + + if userData: + recData.SetUserData(userData) + + if notifyType == 1: + SyncPlayerRecInfo(curPlayer, recType, [recData]) + elif notifyType == 2: + SyncPlayerRecInfo(curPlayer, recType, recDataList) + + return recData + +def SyncPlayerRecInfo(curPlayer, recType, recDataList): + if not recDataList: + return + + playerRecList = [] + for recData in recDataList: + if not recData: + continue + rec = ChPyNetSendPack.tagGCPlayerRec() + rec.Time = recData.GetTime() + rec.Value1 = recData.GetValue1() + rec.Value2 = recData.GetValue2() + rec.Value3 = recData.GetValue3() + rec.Value4 = recData.GetValue4() + rec.Value5 = recData.GetValue5() + rec.Value6 = recData.GetValue6() + rec.Value7 = recData.GetValue7() + rec.Value8 = recData.GetValue8() + rec.UserData = recData.GetUserData() + rec.UserDataLen = len(rec.UserData) + playerRecList.append(rec) + + clientPack = ChPyNetSendPack.tagGCPlayerRecInfo() + clientPack.Clear() + clientPack.Type = recType + clientPack.PlayerRecList = playerRecList + clientPack.Count = len(clientPack.PlayerRecList) + NetPackCommon.SendFakePack(curPlayer, clientPack) + return -- Gitblit v1.8.0