860312 优化开关服时间,memmove在大数据情况下耗时会几何数增加;并且优化个人邮件30天后清理,避免流失玩家合服后积累
3个文件已修改
229 ■■■■■ 已修改文件
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerCompensation.py 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/PyGameDataStruct.py 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tool/数据库/ChangeAccount/Collections/DataServerPlayerData.py 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerCompensation.py
@@ -853,11 +853,33 @@
    return
##清理超时30天的个人邮件, å¦åˆ™æµå¤±çŽ©å®¶åœ¨ä¸æ–­åˆæœæƒ…å†µä¸‹æ•°æ®ä¼šç´¯ç§¯
# ä¸ªäººé‚®ä»¶æš‚无过期时间设定,只有30天清理逻辑,以创建时间为准
#  @param None
#  @return None
def ClearUpPersonalCompensation():
    #校验过期补偿
    curTime = datetime.datetime.today()
    needClearGUIDList = []
    allCnt = GameWorld.GetCompensationMgr().GetAllPersonalCompensationCount()
    for i in xrange(allCnt):
        curMail = GameWorld.GetCompensationMgr().AtAllPersonalCompensation(i)
        # è¶…过接收邮件30天则完全删除此邮件
        limitTime = datetime.datetime.strptime(curMail.CreateTime, ChConfig.TYPE_Time_Format) + datetime.timedelta(days = 30)
        if limitTime < curTime:
            needClearGUIDList.append([curMail.PlayerID, curMail.GUID])
    #删除过期补偿信息, æ²¡æœ‰ä¸»åŠ¨é€šçŸ¥åœ¨çº¿çŽ©å®¶
    for playerID, GUID in needClearGUIDList:
        ClearPersonalCompensation(playerID, GUID)
    return
## æ¸…理超时补偿, ä¸ªäººé‚®ä»¶åœ¨è¶…过上限后才会自动删除
#  @param None
#  @return None
def ClearUpTimeOutCompensation():
    
    ClearUpPersonalCompensation()
    ClearUpEntireCompensation()
    return
ServerPython/CoreServerGroup/GameServer/Script/PyGameDataStruct.py
@@ -605,14 +605,22 @@
    def clear(self):
        memset(addressof(self), 0, self.getLength())
    def readData(self, buf, pos = 0, length = 0):
        if not pos <= length:
            return -1
        if len(buf) < pos + self.getLength():
            return -1
        self.clear()
        memmove(addressof(self), buf[pos:], self.getLength())
        self.ZoneID, pos = CommFunc.ReadBYTE(buf, pos)
        self.SeasonID, pos = CommFunc.ReadBYTE(buf, pos)
        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
        self.PlayerName, pos = CommFunc.ReadString(buf, pos, 33)
        self.Job, pos = CommFunc.ReadBYTE(buf, pos)
        self.FightPower, pos = CommFunc.ReadDWORD(buf, pos)
        self.RealmLV, pos = CommFunc.ReadWORD(buf, pos)
        self.PKScore, pos = CommFunc.ReadDWORD(buf, pos)
        self.DanLV, pos = CommFunc.ReadBYTE(buf, pos)
        self.Time, pos = CommFunc.ReadDWORD(buf, pos)
        return self.getLength()
@@ -658,7 +666,7 @@
            self.PlayerName = Str
        else:
            self.PlayerName = Str[:33]
#仙魔之争记录表#tagDBPyXMZZ
class tagDBPyXMZZ(Structure):
@@ -795,14 +803,15 @@
    def clear(self):
        memset(addressof(self), 0, self.getLength())
    def readData(self, buf, pos = 0, length = 0):
        if not pos <= length:
            return -1
        if len(buf) < pos + self.getLength():
            return -1
        self.clear()
        memmove(addressof(self), buf[pos:], self.getLength())
        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
        self.LineID, pos = CommFunc.ReadBYTE(buf, pos)
        self.Rank, pos = CommFunc.ReadWORD(buf, pos)
        return self.getLength()
@@ -827,7 +836,6 @@
                self.ADOResult,
            )
        return output
#Boss关注记录表#tagDBPyBossAttention
@@ -890,7 +898,6 @@
        return output
#交易所物品最近成交单价表#tagDBPyBourseItemLastPrice
class tagDBPyBourseItemLastPrice(Structure):
    _pack_ = 1
@@ -908,14 +915,14 @@
    def clear(self):
        memset(addressof(self), 0, self.getLength())
    def readData(self, buf, pos = 0, length = 0):
        if not pos <= length:
            return -1
        if len(buf) < pos + self.getLength():
            return -1
        self.clear()
        memmove(addressof(self), buf[pos:], self.getLength())
        self.ItemID, pos = CommFunc.ReadDWORD(buf, pos)
        self.LastPrice, pos = CommFunc.ReadDWORD(buf, pos)
        return self.getLength()
@@ -1101,7 +1108,6 @@
            )
        return output
#玩家黑名单 #tagDBPyPlayerBlack
class tagDBPyPlayerBlack(Structure):
    _pack_ = 1
@@ -1119,14 +1125,14 @@
    def clear(self):
        memset(addressof(self), 0, self.getLength())
    def readData(self, buf, pos = 0, length = 0):
        if not pos <= length:
            return -1
        if len(buf) < pos + self.getLength():
            return -1
        self.clear()
        memmove(addressof(self), buf[pos:], self.getLength())
        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
        self.TagID, pos = CommFunc.ReadDWORD(buf, pos)
        return self.getLength()
@@ -1168,14 +1174,15 @@
    def clear(self):
        memset(addressof(self), 0, self.getLength())
    def readData(self, buf, pos = 0, length = 0):
        if not pos <= length:
            return -1
        if len(buf) < pos + self.getLength():
            return -1
        self.clear()
        memmove(addressof(self), buf[pos:], self.getLength())
        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
        self.TagID, pos = CommFunc.ReadDWORD(buf, pos)
        self.Timestamp, pos = CommFunc.ReadDWORD(buf, pos)
        return self.getLength()
@@ -1218,14 +1225,14 @@
    def clear(self):
        memset(addressof(self), 0, self.getLength())
    def readData(self, buf, pos = 0, length = 0):
        if not pos <= length:
            return -1
        if len(buf) < pos + self.getLength():
            return -1
        self.clear()
        memmove(addressof(self), buf[pos:], self.getLength())
        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
        self.TagID, pos = CommFunc.ReadDWORD(buf, pos)
        return self.getLength()
@@ -1249,6 +1256,7 @@
            )
        return output
#玩家仇人表#tagPlayerEnemy
class tagPlayerEnemy(Structure):
    _pack_ = 1
@@ -1267,14 +1275,15 @@
    def clear(self):
        memset(addressof(self), 0, self.getLength())
    def readData(self, buf, pos = 0, length = 0):
        if not pos <= length:
            return -1
        if len(buf) < pos + self.getLength():
            return -1
        self.clear()
        memmove(addressof(self), buf[pos:], self.getLength())
        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
        self.TagID, pos = CommFunc.ReadDWORD(buf, pos)
        self.Timestamp, pos = CommFunc.ReadDWORD(buf, pos)
        return self.getLength()
@@ -1301,7 +1310,6 @@
        return output
#个人社交总表 #tagPersonalSocial
class tagPersonalSocial(Structure):
    _pack_ = 1
@@ -1324,14 +1332,19 @@
    def clear(self):
        memset(addressof(self), 0, self.getLength())
    def readData(self, buf, pos = 0, length = 0):
        if not pos <= length:
            return -1
        if len(buf) < pos + self.getLength():
            return -1
        self.clear()
        memmove(addressof(self), buf[pos:], self.getLength())
        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
        self.PlayerName, pos = CommFunc.ReadString(buf, pos, 33)
        self.Job, pos = CommFunc.ReadBYTE(buf, pos)
        self.LV, pos = CommFunc.ReadWORD(buf, pos)
        self.RealmLV, pos = CommFunc.ReadWORD(buf, pos)
        self.OnlineType, pos = CommFunc.ReadBYTE(buf, pos)
        self.RefCount, pos = CommFunc.ReadDWORD(buf, pos)
        return self.getLength()
@@ -1372,5 +1385,4 @@
        else:
            self.PlayerName = Str[:33]
            
Tool/Êý¾Ý¿â/ChangeAccount/Collections/DataServerPlayerData.py
@@ -13714,18 +13714,32 @@
    def clear(self):
        memset(addressof(self), 0, self.getLength())
    def readData(self, buf, pos = 0, length = 0):
        if not pos <= length:
            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
            mylog.error(msg)
            return -1
        if len(buf) < pos + self.getLength():
            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
            mylog.error(msg)
            return -1
        self.clear()
        memmove(addressof(self), buf[pos:], self.getLength())
        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
        self.FamilyID, pos = CommFunc.ReadDWORD(buf, pos)
        self.Name, pos = CommFunc.ReadString(buf, pos, 33)
        self.Sex, pos = CommFunc.ReadBYTE(buf, pos)
        self.LV, pos = CommFunc.ReadWORD(buf, pos)
        self.Job, pos = CommFunc.ReadBYTE(buf, pos)
        self.FamilyLV, pos = CommFunc.ReadBYTE(buf, pos)
        self.FamilyName, pos = CommFunc.ReadString(buf, pos, 33)
        self.FamilyActiveValue, pos = CommFunc.ReadDWORD(buf, pos)
        self.OfficialRank, pos = CommFunc.ReadBYTE(buf, pos)
        self.Exattr1, pos = CommFunc.ReadDWORD(buf, pos)
        self.Exattr2, pos = CommFunc.ReadDWORD(buf, pos)
        self.Exattr3, pos = CommFunc.ReadDWORD(buf, pos)
        self.Exattr4, pos = CommFunc.ReadDWORD(buf, pos)
        self.Exattr5, pos = CommFunc.ReadDWORD(buf, pos)
        self.ReincarnationLv, pos = CommFunc.ReadWORD(buf, pos)
        self.OperateInfo, pos = CommFunc.ReadDWORD(buf, pos)
        return self.getLength()
@@ -14004,8 +14018,6 @@
        else:
            self.FamilyName = Str[:33]
            
            
#------------------------------------------------------
#玩家骠车马匹表#tagPlayerHorseTable
@@ -16436,7 +16448,6 @@
            
#通用记录表#tagUniversalGameRec
class tagUniversalGameRec(Structure):
    _pack_ = 1
@@ -16462,18 +16473,25 @@
    def clear(self):
        memset(addressof(self), 0, self.getLength())
    def readData(self, buf, pos = 0, length = 0):
        if not pos <= length:
            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
            mylog.error(msg)
            return -1
        if len(buf) < pos + self.getLength():
            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
            mylog.error(msg)
            return -1
        self.clear()
        memmove(addressof(self), buf[pos:], self.getLength())
        self.Type, pos = CommFunc.ReadBYTE(buf, pos)
        self.Time, pos = CommFunc.ReadDouble(buf, pos)
        self.StrValue1, pos = CommFunc.ReadString(buf, pos, 33)
        self.StrValue2, pos = CommFunc.ReadString(buf, pos, 33)
        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.StrValue3, pos = CommFunc.ReadString(buf, pos, 256)
        return self.getLength()
@@ -16674,7 +16692,7 @@
            self.StrValue3 = Str
        else:
            self.StrValue3 = Str[:256]
#阵法#tagBattleFormation
class tagBattleFormation(Structure):
@@ -18764,18 +18782,18 @@
    def clear(self):
        memset(addressof(self), 0, self.getLength())
    def readData(self, buf, pos = 0, length = 0):
        if not pos <= length:
            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
            mylog.error(msg)
            return -1
        if len(buf) < pos + self.getLength():
            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
            mylog.error(msg)
            return -1
        self.clear()
        memmove(addressof(self), buf[pos:], self.getLength())
        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
        self.GUID, pos = CommFunc.ReadString(buf, pos, 40)
        self.RecState, pos = CommFunc.ReadBYTE(buf, pos)
        return self.getLength()
@@ -18861,6 +18879,8 @@
            self.GUID = Str
        else:
            self.GUID = Str[:40]
            
            
#玩家数据查看缓存表#tagPlayerViewCache
@@ -19132,7 +19152,6 @@
#玩家好友表#tagDBPyPlayerFriend
class tagDBPyPlayerFriend(Structure):
    _pack_ = 1
@@ -19150,18 +19169,17 @@
    def clear(self):
        memset(addressof(self), 0, self.getLength())
    def readData(self, buf, pos = 0, length = 0):
        if not pos <= length:
            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
            mylog.error(msg)
            return -1
        if len(buf) < pos + self.getLength():
            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
            mylog.error(msg)
            return -1
        self.clear()
        memmove(addressof(self), buf[pos:], self.getLength())
        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
        self.TagID, pos = CommFunc.ReadDWORD(buf, pos)
        return self.getLength()
@@ -19304,6 +19322,7 @@
            )
        return output
#个人社交总表 #tagPersonalSocial
class tagPersonalSocial(Structure):
    _pack_ = 1
@@ -19326,18 +19345,22 @@
    def clear(self):
        memset(addressof(self), 0, self.getLength())
    def readData(self, buf, pos = 0, length = 0):
        if not pos <= length:
            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
            mylog.error(msg)
            return -1
        if len(buf) < pos + self.getLength():
            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
            mylog.error(msg)
            return -1
        self.clear()
        memmove(addressof(self), buf[pos:], self.getLength())
        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
        self.PlayerName, pos = CommFunc.ReadString(buf, pos, 33)
        self.Job, pos = CommFunc.ReadBYTE(buf, pos)
        self.LV, pos = CommFunc.ReadWORD(buf, pos)
        self.RealmLV, pos = CommFunc.ReadWORD(buf, pos)
        self.OnlineType, pos = CommFunc.ReadBYTE(buf, pos)
        self.RefCount, pos = CommFunc.ReadDWORD(buf, pos)
        return self.getLength()
@@ -19561,9 +19584,7 @@
            self.PlayerName = Str[:33]
            
            
#玩家黑名单 #tagDBPyPlayerBlack
class tagDBPyPlayerBlack(Structure):
    _pack_ = 1
@@ -19581,18 +19602,17 @@
    def clear(self):
        memset(addressof(self), 0, self.getLength())
    def readData(self, buf, pos = 0, length = 0):
        if not pos <= length:
            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
            mylog.error(msg)
            return -1
        if len(buf) < pos + self.getLength():
            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
            mylog.error(msg)
            return -1
        self.clear()
        memmove(addressof(self), buf[pos:], self.getLength())
        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
        self.TagID, pos = CommFunc.ReadDWORD(buf, pos)
        return self.getLength()
@@ -19754,18 +19774,18 @@
    def clear(self):
        memset(addressof(self), 0, self.getLength())
    def readData(self, buf, pos = 0, length = 0):
        if not pos <= length:
            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
            mylog.error(msg)
            return -1
        if len(buf) < pos + self.getLength():
            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
            mylog.error(msg)
            return -1
        self.clear()
        memmove(addressof(self), buf[pos:], self.getLength())
        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
        self.TagID, pos = CommFunc.ReadDWORD(buf, pos)
        self.Timestamp, pos = CommFunc.ReadDWORD(buf, pos)
        return self.getLength()
@@ -19932,18 +19952,18 @@
    def clear(self):
        memset(addressof(self), 0, self.getLength())
    def readData(self, buf, pos = 0, length = 0):
        if not pos <= length:
            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
            mylog.error(msg)
            return -1
        if len(buf) < pos + self.getLength():
            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
            mylog.error(msg)
            return -1
        self.clear()
        memmove(addressof(self), buf[pos:], self.getLength())
        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
        self.TagID, pos = CommFunc.ReadDWORD(buf, pos)
        self.Timestamp, pos = CommFunc.ReadDWORD(buf, pos)
        return self.getLength()
@@ -20090,6 +20110,7 @@
                self.Timestamp,
            )
        return output
# å®¶æ—ä»“库物品表#tagDBPyFamilyStoreItem
@@ -20539,18 +20560,17 @@
    def clear(self):
        memset(addressof(self), 0, self.getLength())
    def readData(self, buf, pos = 0, length = 0):
        if not pos <= length:
            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
            mylog.error(msg)
            return -1
        if len(buf) < pos + self.getLength():
            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
            mylog.error(msg)
            return -1
        self.clear()
        memmove(addressof(self), buf[pos:], self.getLength())
        self.ItemID, pos = CommFunc.ReadDWORD(buf, pos)
        self.LastPrice, pos = CommFunc.ReadDWORD(buf, pos)
        return self.getLength()
@@ -20897,18 +20917,18 @@
    def clear(self):
        memset(addressof(self), 0, self.getLength())
    def readData(self, buf, pos = 0, length = 0):
        if not pos <= length:
            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
            mylog.error(msg)
            return -1
        if len(buf) < pos + self.getLength():
            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
            mylog.error(msg)
            return -1
        self.clear()
        memmove(addressof(self), buf[pos:], self.getLength())
        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
        self.LineID, pos = CommFunc.ReadBYTE(buf, pos)
        self.Rank, pos = CommFunc.ReadWORD(buf, pos)
        return self.getLength()
@@ -21344,18 +21364,25 @@
    def clear(self):
        memset(addressof(self), 0, self.getLength())
    def readData(self, buf, pos = 0, length = 0):
        if not pos <= length:
            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
            mylog.error(msg)
            return -1
        if len(buf) < pos + self.getLength():
            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
            mylog.error(msg)
            return -1
        self.clear()
        memmove(addressof(self), buf[pos:], self.getLength())
        self.ZoneID, pos = CommFunc.ReadBYTE(buf, pos)
        self.SeasonID, pos = CommFunc.ReadBYTE(buf, pos)
        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
        self.PlayerName, pos = CommFunc.ReadString(buf, pos, 33)
        self.Job, pos = CommFunc.ReadBYTE(buf, pos)
        self.FightPower, pos = CommFunc.ReadDWORD(buf, pos)
        self.RealmLV, pos = CommFunc.ReadWORD(buf, pos)
        self.PKScore, pos = CommFunc.ReadDWORD(buf, pos)
        self.DanLV, pos = CommFunc.ReadBYTE(buf, pos)
        self.Time, pos = CommFunc.ReadDWORD(buf, pos)
        return self.getLength()