From b3c6d36f5ae851f09a3c2e73494ff19956b06fb0 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期五, 11 四月 2025 16:56:14 +0800 Subject: [PATCH] 10367 【越南】【英语】【BT】【砍树】仙盟攻城战-服务端(跨服仙盟支持;后台查询区服仙盟支持;活动时间流程支持;攻城战主活动功能完整流程:公示、分组、战备、战斗、榜单、竞猜、领奖等;) --- ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py | 1824 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 1,816 insertions(+), 8 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py index 9e7d65d..58ed11c 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py @@ -17027,8 +17027,8 @@ class tagGCCrossBillboardInfo(Structure): Head = tagHead() Type = 0 #(BYTE Type)//榜单类型 - GroupValue1 = 0 #(BYTE GroupValue1)// 分组值1 - GroupValue2 = 0 #(BYTE GroupValue2)// 分组值2,与分组值1组合归为同组榜单数据 + GroupValue1 = 0 #(DWORD GroupValue1)// 分组值1 + GroupValue2 = 0 #(DWORD GroupValue2)// 分组值2,与分组值1组合归为同组榜单数据 WatchID = 0 #(DWORD WatchID)//查看指定ID名次前后,如玩家ID、家族ID等 BillboardCount = 0 #(BYTE BillboardCount) CrossBillboardDataList = list() #(vector<tagGCCrossBillboardData> CrossBillboardDataList) @@ -17044,8 +17044,8 @@ self.Clear() _pos = self.Head.ReadData(_lpData, _pos) self.Type,_pos = CommFunc.ReadBYTE(_lpData, _pos) - self.GroupValue1,_pos = CommFunc.ReadBYTE(_lpData, _pos) - self.GroupValue2,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.GroupValue1,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.GroupValue2,_pos = CommFunc.ReadDWORD(_lpData, _pos) self.WatchID,_pos = CommFunc.ReadDWORD(_lpData, _pos) self.BillboardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos) for i in range(self.BillboardCount): @@ -17071,8 +17071,8 @@ length = 0 length += self.Head.GetLength() length += 1 - length += 1 - length += 1 + length += 4 + length += 4 length += 4 length += 1 for i in range(self.BillboardCount): @@ -17084,8 +17084,8 @@ data = '' data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) data = CommFunc.WriteBYTE(data, self.Type) - data = CommFunc.WriteBYTE(data, self.GroupValue1) - data = CommFunc.WriteBYTE(data, self.GroupValue2) + data = CommFunc.WriteDWORD(data, self.GroupValue1) + data = CommFunc.WriteDWORD(data, self.GroupValue2) data = CommFunc.WriteDWORD(data, self.WatchID) data = CommFunc.WriteBYTE(data, self.BillboardCount) for i in range(self.BillboardCount): @@ -18518,6 +18518,1750 @@ m_NAtagGCCrossZoneInfo=tagGCCrossZoneInfo() ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCCrossZoneInfo.Cmd,m_NAtagGCCrossZoneInfo.SubCmd))] = m_NAtagGCCrossZoneInfo + + +#------------------------------------------------------ +# C0 24 仙盟攻城战活动信息 #tagGCFamilyGCZActInfo + +class tagGCFamilyGCZActFamily(Structure): + FamilyID = 0 #(DWORD FamilyID) + Name = "" #(char Name[33])//参与仙盟名字 + LV = 0 #(BYTE LV)//仙盟等级 + ServerID = 0 #(DWORD ServerID)//仙盟所属区服ID + EmblemID = 0 #(DWORD EmblemID)//徽章ID + FightPower = 0 #(DWORD FightPower)//仙盟总战力,求余亿部分 + FightPowerEx = 0 #(DWORD FightPowerEx)//仙盟总战力,整除亿部分 + LeaderID = 0 #(DWORD LeaderID)//盟主ID + LeaderName = "" #(char LeaderName[33])//盟主名 + LeaderFace = 0 #(DWORD LeaderFace) + LeaderFacePic = 0 #(DWORD LeaderFacePic) + data = None + + def __init__(self): + self.Clear() + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + self.FamilyID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.Name,_pos = CommFunc.ReadString(_lpData, _pos,33) + self.LV,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.EmblemID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.LeaderID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.LeaderName,_pos = CommFunc.ReadString(_lpData, _pos,33) + self.LeaderFace,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.LeaderFacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos) + return _pos + + def Clear(self): + self.FamilyID = 0 + self.Name = "" + self.LV = 0 + self.ServerID = 0 + self.EmblemID = 0 + self.FightPower = 0 + self.FightPowerEx = 0 + self.LeaderID = 0 + self.LeaderName = "" + self.LeaderFace = 0 + self.LeaderFacePic = 0 + return + + def GetLength(self): + length = 0 + length += 4 + length += 33 + length += 1 + length += 4 + length += 4 + length += 4 + length += 4 + length += 4 + length += 33 + length += 4 + length += 4 + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteDWORD(data, self.FamilyID) + data = CommFunc.WriteString(data, 33, self.Name) + data = CommFunc.WriteBYTE(data, self.LV) + data = CommFunc.WriteDWORD(data, self.ServerID) + data = CommFunc.WriteDWORD(data, self.EmblemID) + data = CommFunc.WriteDWORD(data, self.FightPower) + data = CommFunc.WriteDWORD(data, self.FightPowerEx) + data = CommFunc.WriteDWORD(data, self.LeaderID) + data = CommFunc.WriteString(data, 33, self.LeaderName) + data = CommFunc.WriteDWORD(data, self.LeaderFace) + data = CommFunc.WriteDWORD(data, self.LeaderFacePic) + return data + + def OutputString(self): + DumpString = ''' + FamilyID:%d, + Name:%s, + LV:%d, + ServerID:%d, + EmblemID:%d, + FightPower:%d, + FightPowerEx:%d, + LeaderID:%d, + LeaderName:%s, + LeaderFace:%d, + LeaderFacePic:%d + '''\ + %( + self.FamilyID, + self.Name, + self.LV, + self.ServerID, + self.EmblemID, + self.FightPower, + self.FightPowerEx, + self.LeaderID, + self.LeaderName, + self.LeaderFace, + self.LeaderFacePic + ) + return DumpString + + +class tagGCFamilyGCZActInfo(Structure): + Head = tagHead() + ServerInfoLen = 0 #(BYTE ServerInfoLen) + ServerIDRangeInfo = "" #(String ServerIDRangeInfo)//开放该活动的服务器ID范围列表,json格式 [[IDA, IDB], ...], [] 为全服 + ZoneID = 0 #(BYTE ZoneID)// 活动分区ID,公示期为0 + ActID = 0 #(DWORD ActID)// 活动ID,代表某一次活动的唯一ID,前端如果有活动相关的本地记录可以通过验证此ID变更进行重置 + StartDate = "" #(char StartDate[10])// 开始日期 y-m-d + EndtDate = "" #(char EndtDate[10])// 结束日期 y-m-d + JoinFamilyCnt = 0 #(BYTE JoinFamilyCnt)// 参与仙盟数 + ActFlowID = 0 #(WORD ActFlowID)// 活动流程ID,对应H.活动时间流程表中的编号,前端根据跨服时间自行计算当前所处流程状态 + GuessTemplateID = 0 #(WORD GuessTemplateID)// 竞猜奖励模版,对应H.活动竞猜表,前端自行读表展示 + PersonalTemplateID = 0 #(WORD PersonalTemplateID)// 个人伤害排行奖励模版,对应H.活动榜单奖励模版表,前端自行读表展示 + FamilyTemplateID = 0 #(WORD FamilyTemplateID)// 仙盟积分排行奖励模版,对应H.活动榜单奖励模版表,前端自行读表展示 + StateError = 0 #(BYTE StateError)// 活动流程状态是否异常,如果不为0代表活动已异常,前端自行决定是不显示活动还是活动页面做提示 + FamilyCount = 0 #(BYTE FamilyCount) + ActFamilyList = list() #(vector<tagGCFamilyGCZActFamily> ActFamilyList)//本分区参与的仙盟名单 + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xC0 + self.Head.SubCmd = 0x24 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.ServerInfoLen,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.ServerIDRangeInfo,_pos = CommFunc.ReadString(_lpData, _pos,self.ServerInfoLen) + self.ZoneID,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.ActID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10) + self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10) + self.JoinFamilyCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.ActFlowID,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.GuessTemplateID,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.PersonalTemplateID,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.FamilyTemplateID,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.StateError,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.FamilyCount,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.FamilyCount): + temActFamilyList = tagGCFamilyGCZActFamily() + _pos = temActFamilyList.ReadData(_lpData, _pos) + self.ActFamilyList.append(temActFamilyList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xC0 + self.Head.SubCmd = 0x24 + self.ServerInfoLen = 0 + self.ServerIDRangeInfo = "" + self.ZoneID = 0 + self.ActID = 0 + self.StartDate = "" + self.EndtDate = "" + self.JoinFamilyCnt = 0 + self.ActFlowID = 0 + self.GuessTemplateID = 0 + self.PersonalTemplateID = 0 + self.FamilyTemplateID = 0 + self.StateError = 0 + self.FamilyCount = 0 + self.ActFamilyList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + length += len(self.ServerIDRangeInfo) + length += 1 + length += 4 + length += 10 + length += 10 + length += 1 + length += 2 + length += 2 + length += 2 + length += 2 + length += 1 + length += 1 + for i in range(self.FamilyCount): + length += self.ActFamilyList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteBYTE(data, self.ServerInfoLen) + data = CommFunc.WriteString(data, self.ServerInfoLen, self.ServerIDRangeInfo) + data = CommFunc.WriteBYTE(data, self.ZoneID) + data = CommFunc.WriteDWORD(data, self.ActID) + data = CommFunc.WriteString(data, 10, self.StartDate) + data = CommFunc.WriteString(data, 10, self.EndtDate) + data = CommFunc.WriteBYTE(data, self.JoinFamilyCnt) + data = CommFunc.WriteWORD(data, self.ActFlowID) + data = CommFunc.WriteWORD(data, self.GuessTemplateID) + data = CommFunc.WriteWORD(data, self.PersonalTemplateID) + data = CommFunc.WriteWORD(data, self.FamilyTemplateID) + data = CommFunc.WriteBYTE(data, self.StateError) + data = CommFunc.WriteBYTE(data, self.FamilyCount) + for i in range(self.FamilyCount): + data = CommFunc.WriteString(data, self.ActFamilyList[i].GetLength(), self.ActFamilyList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + ServerInfoLen:%d, + ServerIDRangeInfo:%s, + ZoneID:%d, + ActID:%d, + StartDate:%s, + EndtDate:%s, + JoinFamilyCnt:%d, + ActFlowID:%d, + GuessTemplateID:%d, + PersonalTemplateID:%d, + FamilyTemplateID:%d, + StateError:%d, + FamilyCount:%d, + ActFamilyList:%s + '''\ + %( + self.Head.OutputString(), + self.ServerInfoLen, + self.ServerIDRangeInfo, + self.ZoneID, + self.ActID, + self.StartDate, + self.EndtDate, + self.JoinFamilyCnt, + self.ActFlowID, + self.GuessTemplateID, + self.PersonalTemplateID, + self.FamilyTemplateID, + self.StateError, + self.FamilyCount, + "..." + ) + return DumpString + + +m_NAtagGCFamilyGCZActInfo=tagGCFamilyGCZActInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCFamilyGCZActInfo.Head.Cmd,m_NAtagGCFamilyGCZActInfo.Head.SubCmd))] = m_NAtagGCFamilyGCZActInfo + + +#------------------------------------------------------ +# C0 29 仙盟攻城战城池战斗信息 #tagGCFamilyGCZBatCityInfo + +class tagGCFamilyGCZBatCityInfo(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("CityID", c_int), #城池ID + ("CityLV", c_ubyte), #城池等级 + ("FamilyID", c_int), #所属仙盟ID,可能为0 + ("GuardID", c_int), #当前防守成员ID,为0时表示没有防守成员了,城池已被击毁 + ("HP", c_int), #防守成员剩余生命,求余亿部分,剩余生命为0时代表该防守成员被击败 + ("HPEx", c_int), #防守成员剩余生命,整除亿部分 + ("HPMax", c_int), #防守成员最大生命,求余亿部分 + ("HPMaxEx", c_int), #防守成员最大生命,整除亿部分 + ("AtkPlayerID", c_int), #发起攻击的玩家ID,可能为0,判断是否自己的ID进行相应的攻击表现 + ("AtkRet", c_ubyte), #攻击结果,仅在攻击玩家ID不为0时有效,0--成功;1-目标已被击杀;2-城池已被摧毁;3-其他 + ("KillCnt", c_ubyte), #本次攻击击杀防守人员数 + ("HurtValue", c_int), #伤害飘血,求余亿部分 + ("HurtValueEx", c_int), #伤害飘血,整除亿部分 + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xC0 + self.SubCmd = 0x29 + 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 = 0xC0 + self.SubCmd = 0x29 + self.CityID = 0 + self.CityLV = 0 + self.FamilyID = 0 + self.GuardID = 0 + self.HP = 0 + self.HPEx = 0 + self.HPMax = 0 + self.HPMaxEx = 0 + self.AtkPlayerID = 0 + self.AtkRet = 0 + self.KillCnt = 0 + self.HurtValue = 0 + self.HurtValueEx = 0 + return + + def GetLength(self): + return sizeof(tagGCFamilyGCZBatCityInfo) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// C0 29 仙盟攻城战城池战斗信息 //tagGCFamilyGCZBatCityInfo: + Cmd:%s, + SubCmd:%s, + CityID:%d, + CityLV:%d, + FamilyID:%d, + GuardID:%d, + HP:%d, + HPEx:%d, + HPMax:%d, + HPMaxEx:%d, + AtkPlayerID:%d, + AtkRet:%d, + KillCnt:%d, + HurtValue:%d, + HurtValueEx:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.CityID, + self.CityLV, + self.FamilyID, + self.GuardID, + self.HP, + self.HPEx, + self.HPMax, + self.HPMaxEx, + self.AtkPlayerID, + self.AtkRet, + self.KillCnt, + self.HurtValue, + self.HurtValueEx + ) + return DumpString + + +m_NAtagGCFamilyGCZBatCityInfo=tagGCFamilyGCZBatCityInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCFamilyGCZBatCityInfo.Cmd,m_NAtagGCFamilyGCZBatCityInfo.SubCmd))] = m_NAtagGCFamilyGCZBatCityInfo + + +#------------------------------------------------------ +# C0 25 仙盟攻城战轮次分组信息 #tagGCFamilyGCZBatGroupInfo + +class tagGCFamilyGCZBatGroup(Structure): + GroupNum = 0 #(BYTE GroupNum)// 分组编号,从1开始,对应A + FamilyIDCnt = 0 #(BYTE FamilyIDCnt) + FamilyIDList = list() #(vector<DWORD> FamilyIDList)// 仙盟ID列表,前端可以通过判断参与的仙盟ID是否在某个分组里面验证有没有战场参赛资格 + data = None + + def __init__(self): + self.Clear() + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + self.GroupNum,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.FamilyIDCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.FamilyIDCnt): + value,_pos=CommFunc.ReadDWORD(_lpData,_pos) + self.FamilyIDList.append(value) + return _pos + + def Clear(self): + self.GroupNum = 0 + self.FamilyIDCnt = 0 + self.FamilyIDList = list() + return + + def GetLength(self): + length = 0 + length += 1 + length += 1 + length += 4 * self.FamilyIDCnt + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteBYTE(data, self.GroupNum) + data = CommFunc.WriteBYTE(data, self.FamilyIDCnt) + for i in range(self.FamilyIDCnt): + data = CommFunc.WriteDWORD(data, self.FamilyIDList[i]) + return data + + def OutputString(self): + DumpString = ''' + GroupNum:%d, + FamilyIDCnt:%d, + FamilyIDList:%s + '''\ + %( + self.GroupNum, + self.FamilyIDCnt, + "..." + ) + return DumpString + + +class tagGCFamilyGCZBat(Structure): + BatType = 0 #(BYTE BatType)// 战场类型 1-初级;2-中级;3-高级; + GroupCnt = 0 #(BYTE GroupCnt)// 分组数 + GroupList = list() #(vector<tagGCFamilyGCZBatGroup> GroupList)// 分组列表 + data = None + + def __init__(self): + self.Clear() + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + self.BatType,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.GroupCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.GroupCnt): + temGroupList = tagGCFamilyGCZBatGroup() + _pos = temGroupList.ReadData(_lpData, _pos) + self.GroupList.append(temGroupList) + return _pos + + def Clear(self): + self.BatType = 0 + self.GroupCnt = 0 + self.GroupList = list() + return + + def GetLength(self): + length = 0 + length += 1 + length += 1 + for i in range(self.GroupCnt): + length += self.GroupList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteBYTE(data, self.BatType) + data = CommFunc.WriteBYTE(data, self.GroupCnt) + for i in range(self.GroupCnt): + data = CommFunc.WriteString(data, self.GroupList[i].GetLength(), self.GroupList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + BatType:%d, + GroupCnt:%d, + GroupList:%s + '''\ + %( + self.BatType, + self.GroupCnt, + "..." + ) + return DumpString + + +class tagGCFamilyGCZBatGroupInfo(Structure): + Head = tagHead() + RoundNum = 0 #(BYTE RoundNum)// 第x轮的分组,从1开始,没有在对应轮次战场分组里的视为没有该轮次的参赛资格 + BatTypeCnt = 0 #(BYTE BatTypeCnt)// 战场类型数 + BatList = list() #(vector<tagGCFamilyGCZBat> BatList)//战场列表 + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xC0 + self.Head.SubCmd = 0x25 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.RoundNum,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.BatTypeCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.BatTypeCnt): + temBatList = tagGCFamilyGCZBat() + _pos = temBatList.ReadData(_lpData, _pos) + self.BatList.append(temBatList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xC0 + self.Head.SubCmd = 0x25 + self.RoundNum = 0 + self.BatTypeCnt = 0 + self.BatList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + length += 1 + for i in range(self.BatTypeCnt): + length += self.BatList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteBYTE(data, self.RoundNum) + data = CommFunc.WriteBYTE(data, self.BatTypeCnt) + for i in range(self.BatTypeCnt): + data = CommFunc.WriteString(data, self.BatList[i].GetLength(), self.BatList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + RoundNum:%d, + BatTypeCnt:%d, + BatList:%s + '''\ + %( + self.Head.OutputString(), + self.RoundNum, + self.BatTypeCnt, + "..." + ) + return DumpString + + +m_NAtagGCFamilyGCZBatGroupInfo=tagGCFamilyGCZBatGroupInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCFamilyGCZBatGroupInfo.Head.Cmd,m_NAtagGCFamilyGCZBatGroupInfo.Head.SubCmd))] = m_NAtagGCFamilyGCZBatGroupInfo + + +#------------------------------------------------------ +# C0 30 仙盟攻城战战斗战报 #tagGCFamilyGCZBatReport + +class tagGCFamilyGCZBatRepHurt(Structure): + _pack_ = 1 + _fields_ = [ + ("TagFamilyID", c_int), #目标仙盟ID + ("HurtValue", c_int), #输出伤害,求余亿部分 + ("HurtValueEx", c_int), #输出伤害,整除亿部分 + ] + + def __init__(self): + self.Clear() + 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.TagFamilyID = 0 + self.HurtValue = 0 + self.HurtValueEx = 0 + return + + def GetLength(self): + return sizeof(tagGCFamilyGCZBatRepHurt) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// C0 30 仙盟攻城战战斗战报 //tagGCFamilyGCZBatReport: + TagFamilyID:%d, + HurtValue:%d, + HurtValueEx:%d + '''\ + %( + self.TagFamilyID, + self.HurtValue, + self.HurtValueEx + ) + return DumpString + + +class tagGCFamilyGCZBatReport(Structure): + Head = tagHead() + FamilyID = 0 #(DWORD FamilyID)// 战报仙盟ID + DefRepCnt = 0 #(BYTE DefRepCnt) + DefRepList = list() #(vector<tagGCFamilyGCZBatRepHurt> DefRepList)// 防守战报 + AtkRepCnt = 0 #(BYTE AtkRepCnt) + AtkRepList = list() #(vector<tagGCFamilyGCZBatRepHurt> AtkRepList)// 进攻战报 + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xC0 + self.Head.SubCmd = 0x30 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.FamilyID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.DefRepCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.DefRepCnt): + temDefRepList = tagGCFamilyGCZBatRepHurt() + _pos = temDefRepList.ReadData(_lpData, _pos) + self.DefRepList.append(temDefRepList) + self.AtkRepCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.AtkRepCnt): + temAtkRepList = tagGCFamilyGCZBatRepHurt() + _pos = temAtkRepList.ReadData(_lpData, _pos) + self.AtkRepList.append(temAtkRepList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xC0 + self.Head.SubCmd = 0x30 + self.FamilyID = 0 + self.DefRepCnt = 0 + self.DefRepList = list() + self.AtkRepCnt = 0 + self.AtkRepList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 4 + length += 1 + for i in range(self.DefRepCnt): + length += self.DefRepList[i].GetLength() + length += 1 + for i in range(self.AtkRepCnt): + length += self.AtkRepList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteDWORD(data, self.FamilyID) + data = CommFunc.WriteBYTE(data, self.DefRepCnt) + for i in range(self.DefRepCnt): + data = CommFunc.WriteString(data, self.DefRepList[i].GetLength(), self.DefRepList[i].GetBuffer()) + data = CommFunc.WriteBYTE(data, self.AtkRepCnt) + for i in range(self.AtkRepCnt): + data = CommFunc.WriteString(data, self.AtkRepList[i].GetLength(), self.AtkRepList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + FamilyID:%d, + DefRepCnt:%d, + DefRepList:%s, + AtkRepCnt:%d, + AtkRepList:%s + '''\ + %( + self.Head.OutputString(), + self.FamilyID, + self.DefRepCnt, + "...", + self.AtkRepCnt, + "..." + ) + return DumpString + + +m_NAtagGCFamilyGCZBatReport=tagGCFamilyGCZBatReport() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCFamilyGCZBatReport.Head.Cmd,m_NAtagGCFamilyGCZBatReport.Head.SubCmd))] = m_NAtagGCFamilyGCZBatReport + + +#------------------------------------------------------ +# C0 28 仙盟攻城战城池场景信息 #tagGCFamilyGCZBatSceneInfo + +class tagGCFamilyGCZBatScenePlayer(Structure): + PlayerID = 0 #(DWORD PlayerID) + Name = "" #(char Name[33]) + Face = 0 #(DWORD Face) + FacePic = 0 #(DWORD FacePic) + 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.Name,_pos = CommFunc.ReadString(_lpData, _pos,33) + self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.FacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos) + return _pos + + def Clear(self): + self.PlayerID = 0 + self.Name = "" + self.Face = 0 + self.FacePic = 0 + return + + def GetLength(self): + length = 0 + length += 4 + length += 33 + length += 4 + length += 4 + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteDWORD(data, self.PlayerID) + data = CommFunc.WriteString(data, 33, self.Name) + data = CommFunc.WriteDWORD(data, self.Face) + data = CommFunc.WriteDWORD(data, self.FacePic) + return data + + def OutputString(self): + DumpString = ''' + PlayerID:%d, + Name:%s, + Face:%d, + FacePic:%d + '''\ + %( + self.PlayerID, + self.Name, + self.Face, + self.FacePic + ) + return DumpString + + +class tagGCFamilyGCZBatSceneHurt(Structure): + _pack_ = 1 + _fields_ = [ + ("CityID", c_int), #被攻击的城池ID + ("HurtValue", c_int), #伤害飘血,求余亿部分 + ("HurtValueEx", c_int), #伤害飘血,整除亿部分 + ] + + def __init__(self): + self.Clear() + 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.CityID = 0 + self.HurtValue = 0 + self.HurtValueEx = 0 + return + + def GetLength(self): + return sizeof(tagGCFamilyGCZBatSceneHurt) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// C0 28 仙盟攻城战城池场景信息 //tagGCFamilyGCZBatSceneInfo: + CityID:%d, + HurtValue:%d, + HurtValueEx:%d + '''\ + %( + self.CityID, + self.HurtValue, + self.HurtValueEx + ) + return DumpString + + +class tagGCFamilyGCZBatSceneCity(Structure): + _pack_ = 1 + _fields_ = [ + ("CityID", c_int), #城池ID + ("CityLV", c_ubyte), #城池等级 + ("FamilyID", c_int), #所属仙盟ID,可能为0 + ("Rank", c_ubyte), #当前名次,从1开始 + ("HP", c_int), #剩余生命,求余亿部分,剩余生命为0时代表被摧毁 + ("HPEx", c_int), #剩余生命,整除亿部分 + ("HPMax", c_int), #最大生命,求余亿部分 + ("HPMaxEx", c_int), #最大生命,整除亿部分 + ("LastAtkedTime", c_int), #最后一次被攻击时间戳,可能为0 + ] + + def __init__(self): + self.Clear() + 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.CityID = 0 + self.CityLV = 0 + self.FamilyID = 0 + self.Rank = 0 + self.HP = 0 + self.HPEx = 0 + self.HPMax = 0 + self.HPMaxEx = 0 + self.LastAtkedTime = 0 + return + + def GetLength(self): + return sizeof(tagGCFamilyGCZBatSceneCity) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// C0 28 仙盟攻城战城池场景信息 //tagGCFamilyGCZBatSceneInfo: + CityID:%d, + CityLV:%d, + FamilyID:%d, + Rank:%d, + HP:%d, + HPEx:%d, + HPMax:%d, + HPMaxEx:%d, + LastAtkedTime:%d + '''\ + %( + self.CityID, + self.CityLV, + self.FamilyID, + self.Rank, + self.HP, + self.HPEx, + self.HPMax, + self.HPMaxEx, + self.LastAtkedTime + ) + return DumpString + + +class tagGCFamilyGCZBatSceneInfo(Structure): + Head = tagHead() + BatType = 0 #(BYTE BatType)// 战场类型 1-初级;2-中级;3-高级; + GroupNum = 0 #(BYTE GroupNum)// 分组编号,从1开始,对应A + TopFamilyID = 0 #(DWORD TopFamilyID)// 伤害第一仙盟ID + TopLeaderID = 0 #(DWORD TopLeaderID)// 伤害第一盟主ID + TopPlayerID = 0 #(DWORD TopPlayerID)// 伤害第一玩家ID + TopPlayerFamilyID = 0 #(DWORD TopPlayerFamilyID)// 伤害第一玩家仙盟ID + AtkPlayerID = 0 #(DWORD AtkPlayerID)// 发起攻击的玩家,可能为0,仅技能攻击时通知,普攻时仅通知血量等信息 + AtkType = 0 #(BYTE AtkType)// 攻击类型,有发起攻击的玩家时有效 + KillCnt = 0 #(BYTE KillCnt)// 本次攻击累计击杀数,有发起攻击的玩家时有效 + HurtCnt = 0 #(BYTE HurtCnt) + HurtList = list() #(vector<tagGCFamilyGCZBatSceneHurt> HurtList)//本次攻击伤血信息,有发起攻击的玩家时有效 + CityCnt = 0 #(BYTE CityCnt) + CityList = list() #(vector<tagGCFamilyGCZBatSceneCity> CityList)// 城池信息,仅通知变化的城池 + PlayerCnt = 0 #(BYTE PlayerCnt) + PlayerInfoList = list() #(vector<tagGCFamilyGCZBatScenePlayer> PlayerInfoList)// 场景展示所需要用到的玩家信息,如第一玩家、使用技能玩家 + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xC0 + self.Head.SubCmd = 0x28 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.BatType,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.GroupNum,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.TopFamilyID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.TopLeaderID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.TopPlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.TopPlayerFamilyID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.AtkPlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.AtkType,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.KillCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.HurtCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.HurtCnt): + temHurtList = tagGCFamilyGCZBatSceneHurt() + _pos = temHurtList.ReadData(_lpData, _pos) + self.HurtList.append(temHurtList) + self.CityCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.CityCnt): + temCityList = tagGCFamilyGCZBatSceneCity() + _pos = temCityList.ReadData(_lpData, _pos) + self.CityList.append(temCityList) + self.PlayerCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.PlayerCnt): + temPlayerInfoList = tagGCFamilyGCZBatScenePlayer() + _pos = temPlayerInfoList.ReadData(_lpData, _pos) + self.PlayerInfoList.append(temPlayerInfoList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xC0 + self.Head.SubCmd = 0x28 + self.BatType = 0 + self.GroupNum = 0 + self.TopFamilyID = 0 + self.TopLeaderID = 0 + self.TopPlayerID = 0 + self.TopPlayerFamilyID = 0 + self.AtkPlayerID = 0 + self.AtkType = 0 + self.KillCnt = 0 + self.HurtCnt = 0 + self.HurtList = list() + self.CityCnt = 0 + self.CityList = list() + self.PlayerCnt = 0 + self.PlayerInfoList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + length += 1 + length += 4 + length += 4 + length += 4 + length += 4 + length += 4 + length += 1 + length += 1 + length += 1 + for i in range(self.HurtCnt): + length += self.HurtList[i].GetLength() + length += 1 + for i in range(self.CityCnt): + length += self.CityList[i].GetLength() + length += 1 + for i in range(self.PlayerCnt): + length += self.PlayerInfoList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteBYTE(data, self.BatType) + data = CommFunc.WriteBYTE(data, self.GroupNum) + data = CommFunc.WriteDWORD(data, self.TopFamilyID) + data = CommFunc.WriteDWORD(data, self.TopLeaderID) + data = CommFunc.WriteDWORD(data, self.TopPlayerID) + data = CommFunc.WriteDWORD(data, self.TopPlayerFamilyID) + data = CommFunc.WriteDWORD(data, self.AtkPlayerID) + data = CommFunc.WriteBYTE(data, self.AtkType) + data = CommFunc.WriteBYTE(data, self.KillCnt) + data = CommFunc.WriteBYTE(data, self.HurtCnt) + for i in range(self.HurtCnt): + data = CommFunc.WriteString(data, self.HurtList[i].GetLength(), self.HurtList[i].GetBuffer()) + data = CommFunc.WriteBYTE(data, self.CityCnt) + for i in range(self.CityCnt): + data = CommFunc.WriteString(data, self.CityList[i].GetLength(), self.CityList[i].GetBuffer()) + data = CommFunc.WriteBYTE(data, self.PlayerCnt) + for i in range(self.PlayerCnt): + data = CommFunc.WriteString(data, self.PlayerInfoList[i].GetLength(), self.PlayerInfoList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + BatType:%d, + GroupNum:%d, + TopFamilyID:%d, + TopLeaderID:%d, + TopPlayerID:%d, + TopPlayerFamilyID:%d, + AtkPlayerID:%d, + AtkType:%d, + KillCnt:%d, + HurtCnt:%d, + HurtList:%s, + CityCnt:%d, + CityList:%s, + PlayerCnt:%d, + PlayerInfoList:%s + '''\ + %( + self.Head.OutputString(), + self.BatType, + self.GroupNum, + self.TopFamilyID, + self.TopLeaderID, + self.TopPlayerID, + self.TopPlayerFamilyID, + self.AtkPlayerID, + self.AtkType, + self.KillCnt, + self.HurtCnt, + "...", + self.CityCnt, + "...", + self.PlayerCnt, + "..." + ) + return DumpString + + +m_NAtagGCFamilyGCZBatSceneInfo=tagGCFamilyGCZBatSceneInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCFamilyGCZBatSceneInfo.Head.Cmd,m_NAtagGCFamilyGCZBatSceneInfo.Head.SubCmd))] = m_NAtagGCFamilyGCZBatSceneInfo + + +#------------------------------------------------------ +# C0 26 仙盟攻城战大本营信息 #tagGCFamilyGCZCampInfo + +class tagGCFamilyGCZCampMem(Structure): + PlayerID = 0 #(DWORD PlayerID) + Name = "" #(char Name[33])//参与玩家名字 + FamilyLV = 0 #(BYTE FamilyLV)//参与时的家族职位 + Face = 0 #(DWORD Face)//基本脸型 + FacePic = 0 #(DWORD FacePic)//头像框 + FightPower = 0 #(DWORD FightPower)//战力,求余亿部分 + FightPowerEx = 0 #(DWORD FightPowerEx)//战力,整除亿部分 + HP = 0 #(DWORD HP)//剩余生命,求余亿部分 + HPEx = 0 #(DWORD HPEx)//剩余生命,整除亿部分 + HPMax = 0 #(DWORD HPMax)//最大生命,求余亿部分 + HPMaxEx = 0 #(DWORD HPMaxEx)//最大生命,整除亿部分 + TotalHurt = 0 #(DWORD TotalHurt)//活动总伤害,求余亿部分,如果不在榜上则读该值 + TotalHurtEx = 0 #(DWORD TotalHurtEx)//活动总伤害,整除亿部分 + 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.Name,_pos = CommFunc.ReadString(_lpData, _pos,33) + self.FamilyLV,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.FacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.HP,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.HPEx,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.HPMax,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.HPMaxEx,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.TotalHurt,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.TotalHurtEx,_pos = CommFunc.ReadDWORD(_lpData, _pos) + return _pos + + def Clear(self): + self.PlayerID = 0 + self.Name = "" + self.FamilyLV = 0 + self.Face = 0 + self.FacePic = 0 + self.FightPower = 0 + self.FightPowerEx = 0 + self.HP = 0 + self.HPEx = 0 + self.HPMax = 0 + self.HPMaxEx = 0 + self.TotalHurt = 0 + self.TotalHurtEx = 0 + return + + def GetLength(self): + length = 0 + length += 4 + length += 33 + length += 1 + length += 4 + length += 4 + length += 4 + length += 4 + length += 4 + length += 4 + length += 4 + length += 4 + length += 4 + length += 4 + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteDWORD(data, self.PlayerID) + data = CommFunc.WriteString(data, 33, self.Name) + data = CommFunc.WriteBYTE(data, self.FamilyLV) + data = CommFunc.WriteDWORD(data, self.Face) + data = CommFunc.WriteDWORD(data, self.FacePic) + data = CommFunc.WriteDWORD(data, self.FightPower) + data = CommFunc.WriteDWORD(data, self.FightPowerEx) + data = CommFunc.WriteDWORD(data, self.HP) + data = CommFunc.WriteDWORD(data, self.HPEx) + data = CommFunc.WriteDWORD(data, self.HPMax) + data = CommFunc.WriteDWORD(data, self.HPMaxEx) + data = CommFunc.WriteDWORD(data, self.TotalHurt) + data = CommFunc.WriteDWORD(data, self.TotalHurtEx) + return data + + def OutputString(self): + DumpString = ''' + PlayerID:%d, + Name:%s, + FamilyLV:%d, + Face:%d, + FacePic:%d, + FightPower:%d, + FightPowerEx:%d, + HP:%d, + HPEx:%d, + HPMax:%d, + HPMaxEx:%d, + TotalHurt:%d, + TotalHurtEx:%d + '''\ + %( + self.PlayerID, + self.Name, + self.FamilyLV, + self.Face, + self.FacePic, + self.FightPower, + self.FightPowerEx, + self.HP, + self.HPEx, + self.HPMax, + self.HPMaxEx, + self.TotalHurt, + self.TotalHurtEx + ) + return DumpString + + +class tagGCFamilyGCZCampInfo(Structure): + Head = tagHead() + FamilyID = 0 #(DWORD FamilyID)//所在活动仙盟ID,可能不是玩家当前的仙盟ID,活动以该ID为准 + Score = 0 #(WORD Score)//活动总积分,如果不在榜上则读该值 + CampLV = 0 #(WORD CampLV)//大本营当前等级 + CampExp = 0 #(DWORD CampExp)//大本营当前经验 + CityLV = 0 #(WORD CityLV)//城池属性等级,开战后可能与当前大本营等级不一样 + HPBase = 0 #(DWORD HPBase)//基础生命,求余亿部分 + HPBaseEx = 0 #(DWORD HPBaseEx)//基础生命,整除亿部分 + HPMax = 0 #(DWORD HPMax)//总生命,求余亿部分 + HPMaxEx = 0 #(DWORD HPMaxEx)//总大生命,整除亿部分 + HP = 0 #(DWORD HP)//剩余生命,求余亿部分 + HPEx = 0 #(DWORD HPEx)//剩余生命,整除亿部分 + DefMemCnt = 0 #(BYTE DefMemCnt) + DefMemList = list() #(vector<tagGCFamilyGCZCampMem> DefMemList)//防守成员列表,有同步则差异更新,没有在防守成员里的视为没有参与资格 + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xC0 + self.Head.SubCmd = 0x26 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.FamilyID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.Score,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.CampLV,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.CampExp,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.CityLV,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.HPBase,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.HPBaseEx,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.HPMax,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.HPMaxEx,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.HP,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.HPEx,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.DefMemCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.DefMemCnt): + temDefMemList = tagGCFamilyGCZCampMem() + _pos = temDefMemList.ReadData(_lpData, _pos) + self.DefMemList.append(temDefMemList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xC0 + self.Head.SubCmd = 0x26 + self.FamilyID = 0 + self.Score = 0 + self.CampLV = 0 + self.CampExp = 0 + self.CityLV = 0 + self.HPBase = 0 + self.HPBaseEx = 0 + self.HPMax = 0 + self.HPMaxEx = 0 + self.HP = 0 + self.HPEx = 0 + self.DefMemCnt = 0 + self.DefMemList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 4 + length += 2 + length += 2 + length += 4 + length += 2 + length += 4 + length += 4 + length += 4 + length += 4 + length += 4 + length += 4 + length += 1 + for i in range(self.DefMemCnt): + length += self.DefMemList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteDWORD(data, self.FamilyID) + data = CommFunc.WriteWORD(data, self.Score) + data = CommFunc.WriteWORD(data, self.CampLV) + data = CommFunc.WriteDWORD(data, self.CampExp) + data = CommFunc.WriteWORD(data, self.CityLV) + data = CommFunc.WriteDWORD(data, self.HPBase) + data = CommFunc.WriteDWORD(data, self.HPBaseEx) + data = CommFunc.WriteDWORD(data, self.HPMax) + data = CommFunc.WriteDWORD(data, self.HPMaxEx) + data = CommFunc.WriteDWORD(data, self.HP) + data = CommFunc.WriteDWORD(data, self.HPEx) + data = CommFunc.WriteBYTE(data, self.DefMemCnt) + for i in range(self.DefMemCnt): + data = CommFunc.WriteString(data, self.DefMemList[i].GetLength(), self.DefMemList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + FamilyID:%d, + Score:%d, + CampLV:%d, + CampExp:%d, + CityLV:%d, + HPBase:%d, + HPBaseEx:%d, + HPMax:%d, + HPMaxEx:%d, + HP:%d, + HPEx:%d, + DefMemCnt:%d, + DefMemList:%s + '''\ + %( + self.Head.OutputString(), + self.FamilyID, + self.Score, + self.CampLV, + self.CampExp, + self.CityLV, + self.HPBase, + self.HPBaseEx, + self.HPMax, + self.HPMaxEx, + self.HP, + self.HPEx, + self.DefMemCnt, + "..." + ) + return DumpString + + +m_NAtagGCFamilyGCZCampInfo=tagGCFamilyGCZCampInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCFamilyGCZCampInfo.Head.Cmd,m_NAtagGCFamilyGCZCampInfo.Head.SubCmd))] = m_NAtagGCFamilyGCZCampInfo + + +#------------------------------------------------------ +# C0 27 仙盟攻城战成员贡献值信息 #tagGCFamilyGCZContributionInfo + +class tagGCFamilyGCZContribution(Structure): + _pack_ = 1 + _fields_ = [ + ("PlayerID", c_int), + ("ContributionValue", c_int), #贡献值 + ] + + def __init__(self): + self.Clear() + 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.PlayerID = 0 + self.ContributionValue = 0 + return + + def GetLength(self): + return sizeof(tagGCFamilyGCZContribution) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// C0 27 仙盟攻城战成员贡献值信息 //tagGCFamilyGCZContributionInfo: + PlayerID:%d, + ContributionValue:%d + '''\ + %( + self.PlayerID, + self.ContributionValue + ) + return DumpString + + +class tagGCFamilyGCZContributionInfo(Structure): + Head = tagHead() + ContriCnt = 0 #(BYTE ContriCnt) + ContriList = list() #(vector<tagGCFamilyGCZContribution> ContriList)//成员贡献值列表 + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xC0 + self.Head.SubCmd = 0x27 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.ContriCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.ContriCnt): + temContriList = tagGCFamilyGCZContribution() + _pos = temContriList.ReadData(_lpData, _pos) + self.ContriList.append(temContriList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xC0 + self.Head.SubCmd = 0x27 + self.ContriCnt = 0 + self.ContriList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + for i in range(self.ContriCnt): + length += self.ContriList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteBYTE(data, self.ContriCnt) + for i in range(self.ContriCnt): + data = CommFunc.WriteString(data, self.ContriList[i].GetLength(), self.ContriList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + ContriCnt:%d, + ContriList:%s + '''\ + %( + self.Head.OutputString(), + self.ContriCnt, + "..." + ) + return DumpString + + +m_NAtagGCFamilyGCZContributionInfo=tagGCFamilyGCZContributionInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCFamilyGCZContributionInfo.Head.Cmd,m_NAtagGCFamilyGCZContributionInfo.Head.SubCmd))] = m_NAtagGCFamilyGCZContributionInfo + + +#------------------------------------------------------ +# C0 31 仙盟攻城战分组仙盟成员伤害明细 #tagGCFamilyGCZGroupFamilyMemHurtInfo + +class tagGCFamilyGCZGroupFamilyMemHurt(Structure): + PlayerID = 0 #(DWORD PlayerID) + Name = "" #(char Name[33])//参与玩家名字 + HurtValue = 0 #(DWORD HurtValue)//伤害,求余亿部分 + HurtValueEx = 0 #(DWORD HurtValueEx)//伤害,整除亿部分 + 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.Name,_pos = CommFunc.ReadString(_lpData, _pos,33) + self.HurtValue,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.HurtValueEx,_pos = CommFunc.ReadDWORD(_lpData, _pos) + return _pos + + def Clear(self): + self.PlayerID = 0 + self.Name = "" + self.HurtValue = 0 + self.HurtValueEx = 0 + return + + def GetLength(self): + length = 0 + length += 4 + length += 33 + length += 4 + length += 4 + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteDWORD(data, self.PlayerID) + data = CommFunc.WriteString(data, 33, self.Name) + data = CommFunc.WriteDWORD(data, self.HurtValue) + data = CommFunc.WriteDWORD(data, self.HurtValueEx) + return data + + def OutputString(self): + DumpString = ''' + PlayerID:%d, + Name:%s, + HurtValue:%d, + HurtValueEx:%d + '''\ + %( + self.PlayerID, + self.Name, + self.HurtValue, + self.HurtValueEx + ) + return DumpString + + +class tagGCFamilyGCZGroupFamilyMemHurtInfo(Structure): + Head = tagHead() + FamilyID = 0 #(DWORD FamilyID)//查看的目标仙盟ID + HurtMemCnt = 0 #(BYTE HurtMemCnt) + HurtMemList = list() #(vector<tagGCFamilyGCZGroupFamilyMemHurt> HurtMemList)//成员伤害明细列表,只算城池被摧毁前的伤害,未排序,前端自己排序 + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xC0 + self.Head.SubCmd = 0x31 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.FamilyID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.HurtMemCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.HurtMemCnt): + temHurtMemList = tagGCFamilyGCZGroupFamilyMemHurt() + _pos = temHurtMemList.ReadData(_lpData, _pos) + self.HurtMemList.append(temHurtMemList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xC0 + self.Head.SubCmd = 0x31 + self.FamilyID = 0 + self.HurtMemCnt = 0 + self.HurtMemList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 4 + length += 1 + for i in range(self.HurtMemCnt): + length += self.HurtMemList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteDWORD(data, self.FamilyID) + data = CommFunc.WriteBYTE(data, self.HurtMemCnt) + for i in range(self.HurtMemCnt): + data = CommFunc.WriteString(data, self.HurtMemList[i].GetLength(), self.HurtMemList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + FamilyID:%d, + HurtMemCnt:%d, + HurtMemList:%s + '''\ + %( + self.Head.OutputString(), + self.FamilyID, + self.HurtMemCnt, + "..." + ) + return DumpString + + +m_NAtagGCFamilyGCZGroupFamilyMemHurtInfo=tagGCFamilyGCZGroupFamilyMemHurtInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCFamilyGCZGroupFamilyMemHurtInfo.Head.Cmd,m_NAtagGCFamilyGCZGroupFamilyMemHurtInfo.Head.SubCmd))] = m_NAtagGCFamilyGCZGroupFamilyMemHurtInfo + + +#------------------------------------------------------ +# C0 32 仙盟攻城战竞猜名单信息 #tagGCFamilyGCZGuessInfo + +class tagGCFamilyGCZGuessFamily(Structure): + _pack_ = 1 + _fields_ = [ + ("FamilyID", c_int), #备选仙盟ID + ("GuessValue", c_ushort), #竞猜热度值,玩家每次选择则加1,重复选择也算 + ] + + def __init__(self): + self.Clear() + 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.FamilyID = 0 + self.GuessValue = 0 + return + + def GetLength(self): + return sizeof(tagGCFamilyGCZGuessFamily) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// C0 32 仙盟攻城战竞猜名单信息 //tagGCFamilyGCZGuessInfo: + FamilyID:%d, + GuessValue:%d + '''\ + %( + self.FamilyID, + self.GuessValue + ) + return DumpString + + +class tagGCFamilyGCZGuessRight(Structure): + _pack_ = 1 + _fields_ = [ + ("AwardID", c_ubyte), #奖励ID + ("RightPlayerCnt", c_ushort), #猜中玩家个数 + ] + + def __init__(self): + self.Clear() + 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.AwardID = 0 + self.RightPlayerCnt = 0 + return + + def GetLength(self): + return sizeof(tagGCFamilyGCZGuessRight) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// C0 32 仙盟攻城战竞猜名单信息 //tagGCFamilyGCZGuessInfo: + AwardID:%d, + RightPlayerCnt:%d + '''\ + %( + self.AwardID, + self.RightPlayerCnt + ) + return DumpString + + +class tagGCFamilyGCZGuessInfo(Structure): + Head = tagHead() + PlayerID = 0 #(DWORD PlayerID)//竞猜玩家ID,有玩家修改竞猜时会附带该信息,如果是自己ID,则更新自己的竞猜选项,否则无视 + SelectCnt = 0 #(BYTE SelectCnt) + SelectFamilyIDList = list() #(vector<DWORD> SelectFamilyIDList)//竞猜玩家选择的仙盟ID顺序 + FinalCnt = 0 #(BYTE FinalCnt) + FinalFamilyIDList = list() #(vector<DWORD> FinalFamilyIDList)//最终排名顺序,仅活动排名出来后才有值 + RightCnt = 0 #(BYTE RightCnt) + RightInfoList = list() #(vector<tagGCFamilyGCZGuessRight> RightInfoList)//猜中个数明细列表 + FamilyCnt = 0 #(BYTE FamilyCnt) + GuessFamilyList = list() #(vector<tagGCFamilyGCZGuessFamily> GuessFamilyList)//备选仙盟名单列表 + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xC0 + self.Head.SubCmd = 0x32 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.SelectCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.SelectCnt): + value,_pos=CommFunc.ReadDWORD(_lpData,_pos) + self.SelectFamilyIDList.append(value) + self.FinalCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.FinalCnt): + value,_pos=CommFunc.ReadDWORD(_lpData,_pos) + self.FinalFamilyIDList.append(value) + self.RightCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.RightCnt): + temRightInfoList = tagGCFamilyGCZGuessRight() + _pos = temRightInfoList.ReadData(_lpData, _pos) + self.RightInfoList.append(temRightInfoList) + self.FamilyCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.FamilyCnt): + temGuessFamilyList = tagGCFamilyGCZGuessFamily() + _pos = temGuessFamilyList.ReadData(_lpData, _pos) + self.GuessFamilyList.append(temGuessFamilyList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xC0 + self.Head.SubCmd = 0x32 + self.PlayerID = 0 + self.SelectCnt = 0 + self.SelectFamilyIDList = list() + self.FinalCnt = 0 + self.FinalFamilyIDList = list() + self.RightCnt = 0 + self.RightInfoList = list() + self.FamilyCnt = 0 + self.GuessFamilyList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 4 + length += 1 + length += 4 * self.SelectCnt + length += 1 + length += 4 * self.FinalCnt + length += 1 + for i in range(self.RightCnt): + length += self.RightInfoList[i].GetLength() + length += 1 + for i in range(self.FamilyCnt): + length += self.GuessFamilyList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteDWORD(data, self.PlayerID) + data = CommFunc.WriteBYTE(data, self.SelectCnt) + for i in range(self.SelectCnt): + data = CommFunc.WriteDWORD(data, self.SelectFamilyIDList[i]) + data = CommFunc.WriteBYTE(data, self.FinalCnt) + for i in range(self.FinalCnt): + data = CommFunc.WriteDWORD(data, self.FinalFamilyIDList[i]) + data = CommFunc.WriteBYTE(data, self.RightCnt) + for i in range(self.RightCnt): + data = CommFunc.WriteString(data, self.RightInfoList[i].GetLength(), self.RightInfoList[i].GetBuffer()) + data = CommFunc.WriteBYTE(data, self.FamilyCnt) + for i in range(self.FamilyCnt): + data = CommFunc.WriteString(data, self.GuessFamilyList[i].GetLength(), self.GuessFamilyList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + PlayerID:%d, + SelectCnt:%d, + SelectFamilyIDList:%s, + FinalCnt:%d, + FinalFamilyIDList:%s, + RightCnt:%d, + RightInfoList:%s, + FamilyCnt:%d, + GuessFamilyList:%s + '''\ + %( + self.Head.OutputString(), + self.PlayerID, + self.SelectCnt, + "...", + self.FinalCnt, + "...", + self.RightCnt, + "...", + self.FamilyCnt, + "..." + ) + return DumpString + + +m_NAtagGCFamilyGCZGuessInfo=tagGCFamilyGCZGuessInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCFamilyGCZGuessInfo.Head.Cmd,m_NAtagGCFamilyGCZGuessInfo.Head.SubCmd))] = m_NAtagGCFamilyGCZGuessInfo #------------------------------------------------------ @@ -57675,6 +59419,70 @@ #------------------------------------------------------ +# C1 10 仙盟攻城战玩家信息 #tagMCFamilyGCZPlayerInfo + +class tagMCFamilyGCZPlayerInfo(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("ContributionCnt", c_ubyte), # 轮次低级捐献已捐献次数,轮次变更时会重置 + ("Energy", c_ubyte), # 当前可用免费体力 + ("EnergyTime", c_int), # 上次恢复免费体力时间戳,为0时不再恢复 + ("AwardState", c_int), # 活动奖励领取状态,按二进制位判断是否已领取,0-竞猜奖励;1-个人排行奖励;2-仙盟排名奖励; + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xC1 + self.SubCmd = 0x10 + 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 = 0xC1 + self.SubCmd = 0x10 + self.ContributionCnt = 0 + self.Energy = 0 + self.EnergyTime = 0 + self.AwardState = 0 + return + + def GetLength(self): + return sizeof(tagMCFamilyGCZPlayerInfo) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// C1 10 仙盟攻城战玩家信息 //tagMCFamilyGCZPlayerInfo: + Cmd:%s, + SubCmd:%s, + ContributionCnt:%d, + Energy:%d, + EnergyTime:%d, + AwardState:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.ContributionCnt, + self.Energy, + self.EnergyTime, + self.AwardState + ) + return DumpString + + +m_NAtagMCFamilyGCZPlayerInfo=tagMCFamilyGCZPlayerInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFamilyGCZPlayerInfo.Cmd,m_NAtagMCFamilyGCZPlayerInfo.SubCmd))] = m_NAtagMCFamilyGCZPlayerInfo + + +#------------------------------------------------------ # C1 08 幸运云购玩家信息 #tagMCLuckyCloudBuyPlayerInfo class tagMCLuckyCloudBuyPlayerInfo(Structure): -- Gitblit v1.8.0