10195 【香港】【越南】【主干】【砍树】新增消耗记录(代币获得、消耗记录;后台扣除货币支持扣代币;)
13个文件已修改
1个文件已添加
605 ■■■■■ 已修改文件
ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 184 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/ClearPlayerRec.py 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerRecData.py 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 184 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameServerRefresh.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_GMTDelPlayerMoney.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
@@ -527,6 +527,14 @@
Def_QueryNoLimit_ActionTypeList = [ShareDefine.Def_ActionType_OfficerModelEquip]
#------------------------------------------------------------------------------ 
#玩家记录上线需要直接同步给前端的类型
Def_PlayerRecLoginNotifyList = [ShareDefine.Def_PlayerRecType_PayCoin]
#玩家记录类型每人限制条数,没有配置的类型不限制,由功能自行控制
Def_PlayerRecCountDict = {
                          ShareDefine.Def_PlayerRecType_PayCoin:100,
                          }
#玩家通用信息记录类型保存的条数
UniversalGameRecTypeSaveCnt = {
                                ShareDefine.Def_UniversalGameRecType_BossDropGoodItemInfo:100,    #boss掉落好物品信息
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -424,6 +424,190 @@
#------------------------------------------------------
# A0 08 玩家记录信息 #tagGCPlayerRecInfo
class  tagGCPlayerRec(Structure):
    Time = 0    #(DWORD Time)//时间
    Value1 = 0    #(DWORD Value1)//ֵ1
    Value2 = 0    #(DWORD Value2)//ֵ2
    Value3 = 0    #(DWORD Value3)//ֵ3
    Value4 = 0    #(DWORD Value4)//ֵ4
    Value5 = 0    #(DWORD Value5)//ֵ5
    Value6 = 0    #(DWORD Value6)//ֵ6
    Value7 = 0    #(DWORD Value7)//ֵ7
    Value8 = 0    #(DWORD Value8)//ֵ8
    UserDataLen = 0    #(WORD UserDataLen)//扩展数据长度
    UserData = ""    #(String UserData)//扩展数据
    data = None
    def __init__(self):
        self.Clear()
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        self.Time,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.Value1,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.Value2,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.Value3,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.Value4,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.Value5,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.Value6,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.Value7,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.Value8,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.UserDataLen,_pos = CommFunc.ReadWORD(_lpData, _pos)
        self.UserData,_pos = CommFunc.ReadString(_lpData, _pos,self.UserDataLen)
        return _pos
    def Clear(self):
        self.Time = 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 = ""
        return
    def GetLength(self):
        length = 0
        length += 4
        length += 4
        length += 4
        length += 4
        length += 4
        length += 4
        length += 4
        length += 4
        length += 4
        length += 2
        length += len(self.UserData)
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteDWORD(data, self.Time)
        data = CommFunc.WriteDWORD(data, self.Value1)
        data = CommFunc.WriteDWORD(data, self.Value2)
        data = CommFunc.WriteDWORD(data, self.Value3)
        data = CommFunc.WriteDWORD(data, self.Value4)
        data = CommFunc.WriteDWORD(data, self.Value5)
        data = CommFunc.WriteDWORD(data, self.Value6)
        data = CommFunc.WriteDWORD(data, self.Value7)
        data = CommFunc.WriteDWORD(data, self.Value8)
        data = CommFunc.WriteWORD(data, self.UserDataLen)
        data = CommFunc.WriteString(data, self.UserDataLen, self.UserData)
        return data
    def OutputString(self):
        DumpString = '''
                                Time:%d,
                                Value1:%d,
                                Value2:%d,
                                Value3:%d,
                                Value4:%d,
                                Value5:%d,
                                Value6:%d,
                                Value7:%d,
                                Value8:%d,
                                UserDataLen:%d,
                                UserData:%s
                                '''\
                                %(
                                self.Time,
                                self.Value1,
                                self.Value2,
                                self.Value3,
                                self.Value4,
                                self.Value5,
                                self.Value6,
                                self.Value7,
                                self.Value8,
                                self.UserDataLen,
                                self.UserData
                                )
        return DumpString
class  tagGCPlayerRecInfo(Structure):
    Head = tagHead()
    Type = 0    #(BYTE Type)//类型
    Count = 0    #(WORD Count)//数量
    PlayerRecList = list()    #(vector<tagGCPlayerRec> PlayerRecList)
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA0
        self.Head.SubCmd = 0x08
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.Type,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.Count,_pos = CommFunc.ReadWORD(_lpData, _pos)
        for i in range(self.Count):
            temPlayerRecList = tagGCPlayerRec()
            _pos = temPlayerRecList.ReadData(_lpData, _pos)
            self.PlayerRecList.append(temPlayerRecList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA0
        self.Head.SubCmd = 0x08
        self.Type = 0
        self.Count = 0
        self.PlayerRecList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        length += 2
        for i in range(self.Count):
            length += self.PlayerRecList[i].GetLength()
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.Type)
        data = CommFunc.WriteWORD(data, self.Count)
        for i in range(self.Count):
            data = CommFunc.WriteString(data, self.PlayerRecList[i].GetLength(), self.PlayerRecList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                Type:%d,
                                Count:%d,
                                PlayerRecList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.Type,
                                self.Count,
                                "..."
                                )
        return DumpString
m_NAtagGCPlayerRecInfo=tagGCPlayerRecInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCPlayerRecInfo.Head.Cmd,m_NAtagGCPlayerRecInfo.Head.SubCmd))] = m_NAtagGCPlayerRecInfo
#------------------------------------------------------
# A0 06 服务器地图线路人数状态 #tagGCPyServerMapState
class  tagGCPyServerMapLineState(Structure):
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/ClearPlayerRec.py
New file
@@ -0,0 +1,58 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package GM.Commands.ClearPlayerRec
#
# @todo:清除玩家记录数据
# @author hxp
# @date 2024-07-03
# @version 1.0
#
# 详细描述: 清除玩家记录数据
#
#-------------------------------------------------------------------------------
#"""Version = 2024-07-03 15:30"""
#-------------------------------------------------------------------------------
import ShareDefine
import PyDataManager
import GameWorld
## 执行逻辑
#  @param curPlayer 当前玩家
#  @param gmList []
#  @return None
def OnExec(curPlayer, gmList):
    if not gmList:
        GameWorld.DebugAnswer(curPlayer, "清除类型记录: ClearPlayerRec 记录类型")
        GameWorld.DebugAnswer(curPlayer, "清除玩家记录: ClearPlayerRec 记录类型 玩家ID")
        GameWorld.DebugAnswer(curPlayer, "清除指定记录: ClearPlayerRec 记录类型 玩家ID value1 [可选value2~8]")
        GameWorld.DebugAnswer(curPlayer, "玩家ID为1代表自己,大于1代表指定ID,0为无")
        GameWorld.DebugAnswer(curPlayer, "2-膜拜记录,3-代币记录")
        return
    recType = gmList[0]
    if recType not in ShareDefine.Def_PlayerRecTypeList:
        GameWorld.DebugAnswer(curPlayer, "类型不存在")
        return
    paramCount = len(gmList)
    playerRecMgr = PyDataManager.GetDBPlayerRecDataManager()
    if paramCount == 1:
        delCount = playerRecMgr.DelRecDataByType(recType)
        GameWorld.DebugAnswer(curPlayer, "清除所有玩家记录类型:%s, 条数:%s" % (recType, delCount))
    elif paramCount == 2:
        delPlayerID = curPlayer.GetPlayerID() if gmList[1] == 1 else gmList[1]
        playerRecMgr.DelRecDataByTypePlayer(recType, delPlayerID)
        GameWorld.DebugAnswer(curPlayer, "清除指定玩家记录类型:%s, ID:%s, 条数:%s" % (recType, delPlayerID, delCount))
    else:
        delPlayerID = curPlayer.GetPlayerID() if gmList[1] == 1 else gmList[1]
        valueList = gmList[2:]
        playerRecMgr.DelRecDataByTypeValue(recType, valueList, delPlayerID)
        GameWorld.DebugAnswer(curPlayer, "清除指定玩家记录类型:%s, ID:%s, Value:%s, 条数:%s" % (recType, delPlayerID, valueList, delCount))
    return
ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py
@@ -75,6 +75,7 @@
import CrossActAllRecharge
import CrossYaomoBoss
import GameWorldMineArea
import PlayerRecData
import GameWorship
#---------------------------------------------------------------------
@@ -246,6 +247,8 @@
        CrossActAllRecharge.OnPlayerLogin(curPlayer)
        #跨服妖魔boss
        CrossYaomoBoss.OnPlayerLogin(curPlayer)
        #玩家记录
        PlayerRecData.OnPlayerLogin(curPlayer)
        
    if isMixServerFirstLogin:
        PlayerCharm.OnMixServerFirstLogin(curPlayer)
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
@@ -87,6 +87,7 @@
import PlayerTurnFight
import GameWorldArena
import GameWorldItem
import PlayerRecData
import PlayerAssist
import PlayerLove
@@ -723,6 +724,13 @@
        GameWorldFamilyWar.MapServer_FamilyWarOver(eval(resultName))
        return
    
    # 增加玩家Rec数据
    if callName == "AddPlayerRec":
        curPlayer = None if not srcPlayerID else GameWorld.GetPlayerManager().FindPlayerByID(srcPlayerID)
        recType, valueList, userData, notifyType = eval(resultName)
        PlayerRecData.MapServer_AddPlayerRec(curPlayer, recType, valueList, userData, notifyType)
        return
    # 删除通用玩家Rec数据
    if callName == "AddUniversalGameRec":
        curPlayer = None if not srcPlayerID else GameWorld.GetPlayerManager().FindPlayerByID(srcPlayerID)
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
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -1310,11 +1310,8 @@
Def_PlayerRecTypeList = (
                         Def_PlayerRecType_WorshipPlayer, # 被膜拜的玩家 1
                         Def_PlayerRecType_WorshipDaily, # 玩家每日膜拜记录 2
                         ) = range(1, 1 + 2)
#玩家记录类型每人限制条数,没有配置的类型不限制,由功能自行控制
Def_PlayerRecCountDict = {
                          }
                         Def_PlayerRecType_PayCoin, # 代币记录 3
                         ) = range(1, 1 + 3)
#通用信息记录类型
Def_UniversalGameRecTypeList = (
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -424,6 +424,190 @@
#------------------------------------------------------
# A0 08 玩家记录信息 #tagGCPlayerRecInfo
class  tagGCPlayerRec(Structure):
    Time = 0    #(DWORD Time)//时间
    Value1 = 0    #(DWORD Value1)//ֵ1
    Value2 = 0    #(DWORD Value2)//ֵ2
    Value3 = 0    #(DWORD Value3)//ֵ3
    Value4 = 0    #(DWORD Value4)//ֵ4
    Value5 = 0    #(DWORD Value5)//ֵ5
    Value6 = 0    #(DWORD Value6)//ֵ6
    Value7 = 0    #(DWORD Value7)//ֵ7
    Value8 = 0    #(DWORD Value8)//ֵ8
    UserDataLen = 0    #(WORD UserDataLen)//扩展数据长度
    UserData = ""    #(String UserData)//扩展数据
    data = None
    def __init__(self):
        self.Clear()
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        self.Time,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.Value1,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.Value2,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.Value3,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.Value4,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.Value5,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.Value6,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.Value7,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.Value8,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.UserDataLen,_pos = CommFunc.ReadWORD(_lpData, _pos)
        self.UserData,_pos = CommFunc.ReadString(_lpData, _pos,self.UserDataLen)
        return _pos
    def Clear(self):
        self.Time = 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 = ""
        return
    def GetLength(self):
        length = 0
        length += 4
        length += 4
        length += 4
        length += 4
        length += 4
        length += 4
        length += 4
        length += 4
        length += 4
        length += 2
        length += len(self.UserData)
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteDWORD(data, self.Time)
        data = CommFunc.WriteDWORD(data, self.Value1)
        data = CommFunc.WriteDWORD(data, self.Value2)
        data = CommFunc.WriteDWORD(data, self.Value3)
        data = CommFunc.WriteDWORD(data, self.Value4)
        data = CommFunc.WriteDWORD(data, self.Value5)
        data = CommFunc.WriteDWORD(data, self.Value6)
        data = CommFunc.WriteDWORD(data, self.Value7)
        data = CommFunc.WriteDWORD(data, self.Value8)
        data = CommFunc.WriteWORD(data, self.UserDataLen)
        data = CommFunc.WriteString(data, self.UserDataLen, self.UserData)
        return data
    def OutputString(self):
        DumpString = '''
                                Time:%d,
                                Value1:%d,
                                Value2:%d,
                                Value3:%d,
                                Value4:%d,
                                Value5:%d,
                                Value6:%d,
                                Value7:%d,
                                Value8:%d,
                                UserDataLen:%d,
                                UserData:%s
                                '''\
                                %(
                                self.Time,
                                self.Value1,
                                self.Value2,
                                self.Value3,
                                self.Value4,
                                self.Value5,
                                self.Value6,
                                self.Value7,
                                self.Value8,
                                self.UserDataLen,
                                self.UserData
                                )
        return DumpString
class  tagGCPlayerRecInfo(Structure):
    Head = tagHead()
    Type = 0    #(BYTE Type)//类型
    Count = 0    #(WORD Count)//数量
    PlayerRecList = list()    #(vector<tagGCPlayerRec> PlayerRecList)
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA0
        self.Head.SubCmd = 0x08
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.Type,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.Count,_pos = CommFunc.ReadWORD(_lpData, _pos)
        for i in range(self.Count):
            temPlayerRecList = tagGCPlayerRec()
            _pos = temPlayerRecList.ReadData(_lpData, _pos)
            self.PlayerRecList.append(temPlayerRecList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA0
        self.Head.SubCmd = 0x08
        self.Type = 0
        self.Count = 0
        self.PlayerRecList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        length += 2
        for i in range(self.Count):
            length += self.PlayerRecList[i].GetLength()
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.Type)
        data = CommFunc.WriteWORD(data, self.Count)
        for i in range(self.Count):
            data = CommFunc.WriteString(data, self.PlayerRecList[i].GetLength(), self.PlayerRecList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                Type:%d,
                                Count:%d,
                                PlayerRecList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.Type,
                                self.Count,
                                "..."
                                )
        return DumpString
m_NAtagGCPlayerRecInfo=tagGCPlayerRecInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCPlayerRecInfo.Head.Cmd,m_NAtagGCPlayerRecInfo.Head.SubCmd))] = m_NAtagGCPlayerRecInfo
#------------------------------------------------------
# A0 06 服务器地图线路人数状态 #tagGCPyServerMapState
class  tagGCPyServerMapLineState(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py
@@ -2122,6 +2122,18 @@
    showLV = serverLV if transCnt <= 0 else serverLV - curTransRealLV + curNewLV - curTransTotalSplitLV + curTransAddSplitLV
    return transCnt, showLV
def AddPlayerRec(playerID, recType, valueList, userData="", notifyType=0):
    '''
    @todo: 添加玩家记录
    @param recType: 通用记录类型, 对应 ShareDefine.Def_PlayerRecTypeList
    @param valueList: 数值列表[value1, value2, ...], 按顺序, 支持value1 ~ value8
    @param userData: 自定义字符信息
    @param notifyType: 0-不通知; 1-通知单条; 2-通知全部
    '''
    msgStr = str([recType, valueList, userData, notifyType])
    GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "AddPlayerRec", msgStr, len(msgStr))
    return
def AddUniversalGameRec(playerID, recType, valueList, strValueList, notifyType=0, isSort=1):
    '''
    @todo: 添加GameServer存储通用记录
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameServerRefresh.py
@@ -719,6 +719,9 @@
# DB推送过来的充值信息
def PushRecharge(index, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    if not curPlayer or curPlayer.IsEmpty():
        #可能刚好下线导致玩家对象为空
        return
    cPlayerCoin = PlayerCoin.CPY_PlayerCoinToGold()
    cPlayerCoin.useCoin = curPlayer.GetOrderAmount()
    cPlayerCoin.orderID = curPlayer.GetOrderID()
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py
@@ -294,7 +294,7 @@
    eventName = addDRDict.get("eventName", "ExchangePayCoin")
    playerID = curPlayer.GetPlayerID()
    befPayCoin = PlayerControl.GetPayCoin(curPlayer)
    drDict = {ChConfig.Def_Give_Reason_SonKey:orderInfo, "payOrderType":payOrderType}
    drDict = {ChConfig.Def_Give_Reason_SonKey:orderInfo, "payOrderType":payOrderType, "orderInfo":orderInfo}
    PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_PayCoin, orderCoin, eventName, drDict)
    aftPayCoin = PlayerControl.GetPayCoin(curPlayer)
    GameWorld.Log("充值转化为代币: orderInfo=%s,orderCoin=%s,payOrderType=%s,eventName=%s,befPayCoin=%s,aftPayCoin=%s,errorInfo=%s" 
@@ -427,7 +427,7 @@
                    GameWorld.ErrLog("代币可不用于支付代币充值!appID=%s,orderInfo=%s" % (appID, orderInfo), curPlayer.GetPlayerID())
                    return
        #直接扣,类似充值扣钱,这里是发放物品,可能会有发放失败的当做 CTGError 处理
        if not PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_PayCoin, orderCoin, eventName, {ChConfig.Def_Cost_Reason_SonKey:orderInfo}):
        if not PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_PayCoin, orderCoin, eventName, {ChConfig.Def_Cost_Reason_SonKey:orderInfo, "orderInfo":orderInfo}):
            GameWorld.ErrLog("代币不足! appID=%s,orderInfo=%s,orderCoin=%s,curPayCoin=%s" 
                             % (appID, orderInfo, orderCoin, PlayerControl.GetPayCoin(curPlayer)), curPlayer.GetPlayerID())
            return
@@ -591,7 +591,7 @@
        playerID = curPlayer.GetPlayerID()
        befPayCoin = PlayerControl.GetPayCoin(curPlayer)
        if addGold and moneyType == ShareDefine.TYPE_Price_PayCoin:
            drDict = {ChConfig.Def_Give_Reason_SonKey:orderInfo, "payOrderType":payOrderType}
            drDict = {ChConfig.Def_Give_Reason_SonKey:orderInfo, "payOrderType":payOrderType, "orderInfo":orderInfo}
            PlayerControl.GiveMoney(curPlayer, moneyType, addGold, eventName, drDict)
        aftPayCoin = PlayerControl.GetPayCoin(curPlayer)
        GameWorld.Log("充值代币: orderInfo=%s,orderCoin=%s,payOrderType=%s,eventName=%s,befPayCoin=%s,aftPayCoin=%s" 
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -3283,7 +3283,12 @@
    DataRecordPack.DR_UseMoney(curPlayer, eventName, type_Price, price, infoDict) # 流向
    EventReport.WriteEvent_virtual_resource(curPlayer, type_Price, reason_name, quantity,
                                            unitPrice, ShareDefine.Def_UserAction_Money_Use, infoDict)
    if type_Price == ShareDefine.TYPE_Price_PayCoin:
        playerID = curPlayer.GetPlayerID()
        nowMoney = GetMoneyReal(curPlayer, type_Price)
        orderInfo = infoDict.get("orderInfo", "")
        GameWorld.Log("记录消耗代币: eventName=%s,price=%s,nowMoney=%s,orderInfo=%s" % (eventName, price, nowMoney, orderInfo), playerID)
        GameWorld.AddPlayerRec(playerID, ShareDefine.Def_PlayerRecType_PayCoin, [2, price, nowMoney], orderInfo, 1)
    #===========================================================================
    # if type_Price == IPY_GameWorld.TYPE_Price_Gold_Money:
    #    EventReport.WriteEvent_virtual_cost(curPlayer, quantity, unitPrice, reason_name)
@@ -3485,7 +3490,7 @@
    
    EventShell.EventRespons_OnMoneyChange(curPlayer, priceType)
    
    if priceType not in [IPY_GameWorld.TYPE_Price_Gold_Money, IPY_GameWorld.TYPE_Price_Gold_Paper] \
    if priceType not in [IPY_GameWorld.TYPE_Price_Gold_Money, IPY_GameWorld.TYPE_Price_Gold_Paper, ShareDefine.TYPE_Price_PayCoin] \
        and giveType == ChConfig.Def_GiveMoney_Unknown:
        #GameWorld.DebugLog("该货币没有指定来源类型不记录!priceType=%s,giveType=%s" % (priceType, giveType))
        return
@@ -3497,6 +3502,13 @@
    DataRecordPack.DR_GiveMoney(curPlayer, eventName, priceType, value, addDataDict)
    EventReport.WriteEvent_virtual_resource(curPlayer, priceType, giveType, 1, value,
                                            ShareDefine.Def_UserAction_Money_Get, addDataDict)
    if priceType == ShareDefine.TYPE_Price_PayCoin:
        playerID = curPlayer.GetPlayerID()
        nowMoney = GetMoneyReal(curPlayer, priceType)
        orderInfo = addDataDict.get("orderInfo", "")
        GameWorld.Log("记录获得代币: eventName=%s,value=%s,nowMoney=%s,orderInfo=%s" % (eventName, value, nowMoney, orderInfo), playerID)
        GameWorld.AddPlayerRec(playerID, ShareDefine.Def_PlayerRecType_PayCoin, [1, value, nowMoney], orderInfo, 1)
#===============================================================================
#    reason_name = "Unknown" if not giveType else giveType
#    eventName = reason_name
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_GMTDelPlayerMoney.py
@@ -41,7 +41,7 @@
    
    retMsg = ""
    Result = GMCommon.Def_Success
    if moneyType not in [1, 2, 3, 4] and moneyType not in ShareDefine.TYPE_Price_CurrencyDict:
    if moneyType not in [1, 2, 3, 4, ShareDefine.TYPE_Price_PayCoin] and moneyType not in ShareDefine.TYPE_Price_CurrencyDict:
        Result = GMCommon.Def_MoneyTypeErr
    elif not moneyValue:
        Result = GMCommon.Def_ParamErr
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -1310,11 +1310,8 @@
Def_PlayerRecTypeList = (
                         Def_PlayerRecType_WorshipPlayer, # 被膜拜的玩家 1
                         Def_PlayerRecType_WorshipDaily, # 玩家每日膜拜记录 2
                         ) = range(1, 1 + 2)
#玩家记录类型每人限制条数,没有配置的类型不限制,由功能自行控制
Def_PlayerRecCountDict = {
                          }
                         Def_PlayerRecType_PayCoin, # 代币记录 3
                         ) = range(1, 1 + 3)
#通用信息记录类型
Def_UniversalGameRecTypeList = (