From a42f5ee6615a14ff1f2291952ca14fd4e293f72e Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 28 四月 2025 14:58:14 +0800
Subject: [PATCH] 10367 【越南】【英语】【BT】【砍树】仙盟攻城战-服务端(FamilyGCZ命令支持技能攻击)

---
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerRecData.py |   72 +++++++++++++++++++++++++++---------
 1 files changed, 54 insertions(+), 18 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerRecData.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerRecData.py
index a471d0b..66bfeaf 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerRecData.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerRecData.py
@@ -32,11 +32,13 @@
         if not dbRecData:
             dbRecData = PyGameDataStruct.tagDBPlayerRecData()
         self.dbRecData = dbRecData
-        self.evalUserData = None
+        self.__userDataDict = None
+        self.__userDataChange = False
         return
     def clear(self):
         self.dbRecData.clear()
-        self.evalUserData = None
+        self.__userDataDict = None
+        self.__userDataChange = False
         return
     def GetPlayerID(self): return self.dbRecData.PlayerID
     def SetPlayerID(self, playerID): self.dbRecData.PlayerID = playerID
@@ -60,24 +62,47 @@
     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 __GetUserDataDict(self):
+        if self.__userDataDict == None:
+            try:
+                self.__userDataDict = eval(self.dbRecData.UserData)
+            except:
+                self.__userDataDict = {}
+        return self.__userDataDict
+    def GetUserDataByKey(self, key, defaultValue=None):
+        userDataDict = self.__GetUserDataDict()
+        if key in userDataDict:
+            return userDataDict[key]
+        return defaultValue
+    def SetUserDataByKey(self, key, value, noneDelKey=False):
+        if not value and noneDelKey:
+            self.DelUserDataByKey(key)
+            return
+        userDataDict = self.__GetUserDataDict()
+        userDataDict[key] = value
+        self.__userDataChange = True
+        return
+    def DelUserDataByKey(self, key):
+        userDataDict = self.__GetUserDataDict()
+        userDataDict.pop(key, None)
+        self.__userDataChange = True
+        return
+    def GetUserData(self):
+        if self.__userDataChange:
+            self.SaveUserData()
+        return self.dbRecData.UserData
     def SetUserData(self, userData):
+        ## 支持直接保存任意格式数据,或者按字典方式读取kv值
         if type(userData) != str:
             userData = str(userData)
         self.dbRecData.UserData = userData.replace(" ", "")
         self.dbRecData.UserDataLen = len(self.dbRecData.UserData)
-        if self.evalUserData != None:
-            self.evalUserData = None
+        self.__userDataDict = None
+        self.__userDataChange = False
         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
+    def SaveUserData(self):
+        if self.__userDataChange:
+            self.SetUserData(self.__userDataDict)
         return
     
     def IsMatchValue(self, valueList):
@@ -93,6 +118,12 @@
             curValue = getattr(self, "GetValue%s" % i)()
             if curValue != value:
                 return False
+        return True
+    
+    def IsEmpty(self):
+        if self.GetValue1() or self.GetValue2() or self.GetValue3() or self.GetUserData() not in ["", "{}"] or self.GetValue4() \
+            or self.GetValue5() or self.GetValue6() or self.GetValue7() or self.GetValue8():
+            return False
         return True
     
     def GetString(self):
@@ -208,12 +239,14 @@
         playerRecDataList.append(recData)
         return
     
-    def GetPlayerRecDataFirst(self, recType, playerID):
+    def GetPlayerRecDataFirst(self, recType, playerID, isAddNew):
         ## 获取玩家记录类型对应的第一条记录,适用于仅需一条的记录类型
+        # @param isAddNew: 没有记录时是否添加一条新记录,一般获取后需要更新数据的可以设置为True,仅判断用的建议设置为False,减少产生多余空数据
+        recData = None
         recDataList = self.GetPlayerRecDataList(recType, playerID)
         if recDataList:
             recData = recDataList[0]
-        else:
+        elif isAddNew:
             recData = self.AddPlayerRecData(recType, playerID)
         return recData
 
@@ -257,9 +290,10 @@
         for playerRecDataDict in self.recTypeDict.values():
             for recDataList in playerRecDataDict.values():
                 for recData in recDataList:
+                    recData.SaveUserData()
+                    if recData.IsEmpty():
+                        continue
                     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)))
@@ -301,6 +335,8 @@
     @param userData: 自定义字符信息
     @param notifyType: 0-不通知; 1-通知单条; 2-通知全部
     '''
+    if not curPlayer:
+        return
     playerID = curPlayer.GetPlayerID()
     if recType not in ShareDefine.Def_PlayerRecTypeList:
         GameWorld.ErrLog("玩家记录类型错误: recType=%s" % recType, playerID)

--
Gitblit v1.8.0