From 9ec66731c8a551035958aebe1fa974a140b99cf1 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期三, 02 七月 2025 17:34:10 +0800 Subject: [PATCH] 129 【战斗】战斗系统-服务端(初版战斗,支持基础的三维属性战斗,支持简单的普攻技能、怒气技能、回血技能;主线章节关卡过关支持;阵容保存支持多阵容;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChNetSendPack.py | 337 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 334 insertions(+), 3 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChNetSendPack.py index 2752f9e..4a062ca 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChNetSendPack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChNetSendPack.py @@ -110,6 +110,7 @@ ("ObjID", c_int), ("AttackType", c_ubyte), #爆击, miss ("HurtHP", c_int), + ("HurtHPEx", c_int), ("CurHP", c_int), ("CurHPEx", c_int), ] @@ -128,6 +129,7 @@ self.ObjID = 0 self.AttackType = 0 self.HurtHP = 0 + self.HurtHPEx = 0 self.CurHP = 0 self.CurHPEx = 0 return @@ -144,6 +146,7 @@ ObjID:%d, AttackType:%d, HurtHP:%d, + HurtHPEx:%d, CurHP:%d, CurHPEx:%d '''\ @@ -152,6 +155,7 @@ self.ObjID, self.AttackType, self.HurtHP, + self.HurtHPEx, self.CurHP, self.CurHPEx ) @@ -845,8 +849,9 @@ ("SubCmd", c_ubyte), ("ObjID", c_int), ("ObjType", c_ubyte), - ("RefreshType", c_ubyte), + ("RefreshType", c_ushort), ("Value", c_int), + ("ValueEx", c_int), ] def __init__(self): @@ -867,6 +872,7 @@ self.ObjType = 0 self.RefreshType = 0 self.Value = 0 + self.ValueEx = 0 return def GetLength(self): @@ -882,7 +888,8 @@ ObjID:%d, ObjType:%d, RefreshType:%d, - Value:%d + Value:%d, + ValueEx:%d '''\ %( self.Cmd, @@ -890,7 +897,8 @@ self.ObjID, self.ObjType, self.RefreshType, - self.Value + self.Value, + self.ValueEx ) return DumpString @@ -1105,3 +1113,326 @@ m_NAtagNPCDie=tagNPCDie() ChNetPackDict[eval("0x%02x%02x"%(m_NAtagNPCDie.Cmd,m_NAtagNPCDie.SubCmd))] = m_NAtagNPCDie + +#04 06 NPC出现#tagNPCAppear + +class tagNPCAppear(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("ObjID", c_int), + ("NPCID", c_int), + ("NPCHP", c_int), + ("NPCHPEx", c_int), #扩展超过20E血量 + ("MaxHP", c_int), #成长型NPC需要通知 + ("MaxHPEx", c_int), #超过20E血量 + ("CurLV", c_ushort), #成长型NPC + ("PosX", c_ushort), + ("PosY", c_ushort), + ("Speed", c_ushort), + ] + + def __init__(self): + self.Clear() + self.Cmd = 0x04 + self.SubCmd = 0x06 + 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 = 0x04 + self.SubCmd = 0x06 + self.ObjID = 0 + self.NPCID = 0 + self.NPCHP = 0 + self.NPCHPEx = 0 + self.MaxHP = 0 + self.MaxHPEx = 0 + self.CurLV = 0 + self.PosX = 0 + self.PosY = 0 + self.Speed = 0 + return + + def GetLength(self): + return sizeof(tagNPCAppear) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''//04 06 NPC出现//tagNPCAppear: + Cmd:%s, + SubCmd:%s, + ObjID:%d, + NPCID:%d, + NPCHP:%d, + NPCHPEx:%d, + MaxHP:%d, + MaxHPEx:%d, + CurLV:%d, + PosX:%d, + PosY:%d, + Speed:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.ObjID, + self.NPCID, + self.NPCHP, + self.NPCHPEx, + self.MaxHP, + self.MaxHPEx, + self.CurLV, + self.PosX, + self.PosY, + self.Speed + ) + return DumpString + + +m_NAtagNPCAppear=tagNPCAppear() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagNPCAppear.Cmd,m_NAtagNPCAppear.SubCmd))] = m_NAtagNPCAppear + +#04 07 NPC消失#tagNPCDisappear + +class tagNPCDisappear(Structure): + Head = tagHead() + Count = 0 #(WORD Count) + NPCID = list() #(vector<DWORD> NPCID)//size = Count + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0x04 + self.Head.SubCmd = 0x07 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.Count,_pos = CommFunc.ReadWORD(_lpData, _pos) + for i in range(self.Count): + value,_pos=CommFunc.ReadDWORD(_lpData,_pos) + self.NPCID.append(value) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0x04 + self.Head.SubCmd = 0x07 + self.Count = 0 + self.NPCID = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 2 + length += 4 * self.Count + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteWORD(data, self.Count) + for i in range(self.Count): + data = CommFunc.WriteDWORD(data, self.NPCID[i]) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + Count:%d, + NPCID:%s + '''\ + %( + self.Head.OutputString(), + self.Count, + "..." + ) + return DumpString + + +m_NAtagNPCDisappear=tagNPCDisappear() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagNPCDisappear.Head.Cmd,m_NAtagNPCDisappear.Head.SubCmd))] = m_NAtagNPCDisappear + +#04 23 对象状态刷新通知(只显示)#tagObjPropertyRefreshView + +class tagObjPropertyRefreshView(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("ObjID", c_int), #对象ID + ("ObjType", c_ubyte), #对象类型 + ("SkillID", c_int), #技能ID + ("DiffValue", c_int), #值 + ("DiffValueEx", c_int), #超亿值 + ("AttackType", c_ubyte), #攻击类型 + ("SrcObjID", c_int), #飘血来源 + ("SrcObjType", c_ubyte), + ("HP", c_int), #剩余血量 + ("HPEx", c_int), #剩余血量 亿 + ] + + def __init__(self): + self.Clear() + self.Cmd = 0x04 + self.SubCmd = 0x23 + 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 = 0x04 + self.SubCmd = 0x23 + self.ObjID = 0 + self.ObjType = 0 + self.SkillID = 0 + self.DiffValue = 0 + self.DiffValueEx = 0 + self.AttackType = 0 + self.SrcObjID = 0 + self.SrcObjType = 0 + self.HP = 0 + self.HPEx = 0 + return + + def GetLength(self): + return sizeof(tagObjPropertyRefreshView) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''//04 23 对象状态刷新通知(只显示)//tagObjPropertyRefreshView: + Cmd:%s, + SubCmd:%s, + ObjID:%d, + ObjType:%d, + SkillID:%d, + DiffValue:%d, + DiffValueEx:%d, + AttackType:%d, + SrcObjID:%d, + SrcObjType:%d, + HP:%d, + HPEx:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.ObjID, + self.ObjType, + self.SkillID, + self.DiffValue, + self.DiffValueEx, + self.AttackType, + self.SrcObjID, + self.SrcObjType, + self.HP, + self.HPEx + ) + return DumpString + + +m_NAtagObjPropertyRefreshView=tagObjPropertyRefreshView() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagObjPropertyRefreshView.Cmd,m_NAtagObjPropertyRefreshView.SubCmd))] = m_NAtagObjPropertyRefreshView + +#06 02 普通攻击#tagObjBaseAttack + +class tagObjBaseAttack(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("AttackerID", c_int), + ("AttackerObjType", c_ubyte), + ("BattleType", c_ubyte), #攻击类型 物理/魔法 + ("ObjID", c_int), #对象ID + ("ObjType", c_ubyte), #对象类型 + ("AttackType", c_ubyte), #普攻, 闪躲, 致命 类型 + ("Value", c_int), + ("ValueEx", c_int), + ("RemainHP", c_int), #对方剩余的血 + ("RemainHPEx", c_int), #对方剩余的血, 超亿支持 + ] + + def __init__(self): + self.Clear() + self.Cmd = 0x06 + self.SubCmd = 0x02 + 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 = 0x06 + self.SubCmd = 0x02 + self.AttackerID = 0 + self.AttackerObjType = 0 + self.BattleType = 0 + self.ObjID = 0 + self.ObjType = 0 + self.AttackType = 0 + self.Value = 0 + self.ValueEx = 0 + self.RemainHP = 0 + self.RemainHPEx = 0 + return + + def GetLength(self): + return sizeof(tagObjBaseAttack) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''//06 02 普通攻击//tagObjBaseAttack: + Cmd:%s, + SubCmd:%s, + AttackerID:%d, + AttackerObjType:%d, + BattleType:%d, + ObjID:%d, + ObjType:%d, + AttackType:%d, + Value:%d, + ValueEx:%d, + RemainHP:%d, + RemainHPEx:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.AttackerID, + self.AttackerObjType, + self.BattleType, + self.ObjID, + self.ObjType, + self.AttackType, + self.Value, + self.ValueEx, + self.RemainHP, + self.RemainHPEx + ) + return DumpString + + +m_NAtagObjBaseAttack=tagObjBaseAttack() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagObjBaseAttack.Cmd,m_NAtagObjBaseAttack.SubCmd))] = m_NAtagObjBaseAttack \ No newline at end of file -- Gitblit v1.8.0