From efc4f490488935020d1b58a451a396ee420de9da Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期三, 06 八月 2025 18:21:05 +0800 Subject: [PATCH] 129 【战斗】战斗系统-服务端(NPC、技能使用新表N.NPC表卡牌、J.技能表卡牌;重构战斗系统;优化战利品掉落;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py | 477 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 475 insertions(+), 2 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py index c44e72b..8c1dd37 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py @@ -49840,6 +49840,142 @@ #------------------------------------------------------ +# B4 29 Buff消失 #tagSCBuffDel + +class tagSCBuffDel(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("ObjID", c_int), + ("BuffID", c_int), + ("RelatedSkillID", c_int), # 关联的技能ID,一般是主技能ID或由于某个技能释放引起的buff变更 + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xB4 + 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 = 0xB4 + self.SubCmd = 0x29 + self.ObjID = 0 + self.BuffID = 0 + self.RelatedSkillID = 0 + return + + def GetLength(self): + return sizeof(tagSCBuffDel) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// B4 29 Buff消失 //tagSCBuffDel: + Cmd:%s, + SubCmd:%s, + ObjID:%d, + BuffID:%d, + RelatedSkillID:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.ObjID, + self.BuffID, + self.RelatedSkillID + ) + return DumpString + + +m_NAtagSCBuffDel=tagSCBuffDel() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagSCBuffDel.Cmd,m_NAtagSCBuffDel.SubCmd))] = m_NAtagSCBuffDel + + +#------------------------------------------------------ +# B4 28 Buff刷新 #tagSCBuffRefresh + +class tagSCBuffRefresh(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("ObjID", c_int), # 谁身上的buff + ("BuffID", c_int), # buffID,某个obj上的唯一buffID,不同的buffID可能skillID相同 + ("SkillID", c_int), # 该buff对应技能表ID + ("RelatedSkillID", c_int), # 关联的技能ID,一般是主技能ID或由于某个技能释放引起的buff变更 + ("LastTime", c_int), # 剩余时长毫秒/回合数 + ("Layer", c_ushort), # 层数,不需要默认0 + ("OwnerID", c_int), # buff来源者,即施法方 + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xB4 + self.SubCmd = 0x28 + 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 = 0xB4 + self.SubCmd = 0x28 + self.ObjID = 0 + self.BuffID = 0 + self.SkillID = 0 + self.RelatedSkillID = 0 + self.LastTime = 0 + self.Layer = 0 + self.OwnerID = 0 + return + + def GetLength(self): + return sizeof(tagSCBuffRefresh) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// B4 28 Buff刷新 //tagSCBuffRefresh: + Cmd:%s, + SubCmd:%s, + ObjID:%d, + BuffID:%d, + SkillID:%d, + RelatedSkillID:%d, + LastTime:%d, + Layer:%d, + OwnerID:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.ObjID, + self.BuffID, + self.SkillID, + self.RelatedSkillID, + self.LastTime, + self.Layer, + self.OwnerID + ) + return DumpString + + +m_NAtagSCBuffRefresh=tagSCBuffRefresh() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagSCBuffRefresh.Cmd,m_NAtagSCBuffRefresh.SubCmd))] = m_NAtagSCBuffRefresh + + +#------------------------------------------------------ # B4 12 删除恶意攻击玩家 #tagMCDelMaliciousAtkPlayer class tagMCDelMaliciousAtkPlayer(Structure): @@ -50032,6 +50168,90 @@ m_NAtagMCNPCSkillWarn=tagMCNPCSkillWarn() ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCNPCSkillWarn.Head.Cmd,m_NAtagMCNPCSkillWarn.Head.SubCmd))] = m_NAtagMCNPCSkillWarn + + +#------------------------------------------------------ +# B4 18 对象属性刷新展示 #tagSCObjPropertyRefreshView + +class tagSCObjPropertyRefreshView(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("ObjID", c_int), + ("RefreshType", c_ushort), # 同0418刷新类型,如血量、怒气 + ("Value", c_int), # 更新值 + ("ValueEx", c_int), # 更新值,如果是大数值的此值为整除亿部分 + ("DiffType", c_ubyte), # 变化类型,0-减少;1-增加 + ("DiffValue", c_int), # 变化值 + ("DiffValueEx", c_int), # 变化值,如果是大数值的此值为整除亿部分 + ("SkillID", c_int), # 使用的技能表ID + ("RelatedSkillID", c_int), # 关联的技能ID,一般是主技能ID,非主技能额外触发的为0 + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xB4 + self.SubCmd = 0x18 + 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 = 0xB4 + self.SubCmd = 0x18 + self.ObjID = 0 + self.RefreshType = 0 + self.Value = 0 + self.ValueEx = 0 + self.DiffType = 0 + self.DiffValue = 0 + self.DiffValueEx = 0 + self.SkillID = 0 + self.RelatedSkillID = 0 + return + + def GetLength(self): + return sizeof(tagSCObjPropertyRefreshView) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// B4 18 对象属性刷新展示 //tagSCObjPropertyRefreshView: + Cmd:%s, + SubCmd:%s, + ObjID:%d, + RefreshType:%d, + Value:%d, + ValueEx:%d, + DiffType:%d, + DiffValue:%d, + DiffValueEx:%d, + SkillID:%d, + RelatedSkillID:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.ObjID, + self.RefreshType, + self.Value, + self.ValueEx, + self.DiffType, + self.DiffValue, + self.DiffValueEx, + self.SkillID, + self.RelatedSkillID + ) + return DumpString + + +m_NAtagSCObjPropertyRefreshView=tagSCObjPropertyRefreshView() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagSCObjPropertyRefreshView.Cmd,m_NAtagSCObjPropertyRefreshView.SubCmd))] = m_NAtagSCObjPropertyRefreshView #------------------------------------------------------ @@ -51241,6 +51461,8 @@ ("Cmd", c_ubyte), ("SubCmd", c_ubyte), ("ObjID", c_int), + ("KillerObjID", c_int), # 被谁击杀的,可能为0 + ("SkillID", c_int), # 被什么技能击杀,可能为0 ] def __init__(self): @@ -51258,6 +51480,8 @@ self.Cmd = 0xB4 self.SubCmd = 0x22 self.ObjID = 0 + self.KillerObjID = 0 + self.SkillID = 0 return def GetLength(self): @@ -51270,12 +51494,16 @@ DumpString = '''// B4 22 回合战斗对象死亡 //tagMCTurnFightObjDead: Cmd:%s, SubCmd:%s, - ObjID:%d + ObjID:%d, + KillerObjID:%d, + SkillID:%d '''\ %( self.Cmd, self.SubCmd, - self.ObjID + self.ObjID, + self.KillerObjID, + self.SkillID ) return DumpString @@ -51569,6 +51797,251 @@ #------------------------------------------------------ +# B4 26 回合战斗标签 #tagSCTurnFightTag + +class tagSCTurnFightTag(Structure): + Head = tagHead() + Len = 0 #(BYTE Len) + Tag = "" #(String Tag)// 标签,释放技能的标签格式: Skill_objID_skillID,其他标签格式可再扩展 + Sign = 0 #(BYTE Sign)// 0-标签头;1-标签尾; + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xB4 + self.Head.SubCmd = 0x26 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.Len,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.Tag,_pos = CommFunc.ReadString(_lpData, _pos,self.Len) + self.Sign,_pos = CommFunc.ReadBYTE(_lpData, _pos) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xB4 + self.Head.SubCmd = 0x26 + self.Len = 0 + self.Tag = "" + self.Sign = 0 + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + length += len(self.Tag) + length += 1 + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteBYTE(data, self.Len) + data = CommFunc.WriteString(data, self.Len, self.Tag) + data = CommFunc.WriteBYTE(data, self.Sign) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + Len:%d, + Tag:%s, + Sign:%d + '''\ + %( + self.Head.OutputString(), + self.Len, + self.Tag, + self.Sign + ) + return DumpString + + +m_NAtagSCTurnFightTag=tagSCTurnFightTag() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagSCTurnFightTag.Head.Cmd,m_NAtagSCTurnFightTag.Head.SubCmd))] = m_NAtagSCTurnFightTag + + +#------------------------------------------------------ +# B4 27 使用技能 #tagSCUseSkill + +class tagSCUseSkillHurt(Structure): + _pack_ = 1 + _fields_ = [ + ("ObjID", c_int), + ("AttackTypes", c_int), # 飘血类型汇总,支持多种类型并存,如无视防御且暴击同时被格挡,二进制或运算最终值;0-失败;1-普通;2-回血;5-格挡;6-无视防御;7-暴击;9-闪避 + ("HurtHP", c_int), # 飘血值,求余亿部分 + ("HurtHPEx", c_int), # 飘血值,整除亿部分 + ("CurHP", c_int), # 更新剩余血量,求余亿部分 + ("CurHPEx", c_int), # 更新剩余血量,整除亿部分 + ("SuckHP", c_int), # 本次伤害转化的吸血量 + ("BounceHP", 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.ObjID = 0 + self.AttackTypes = 0 + self.HurtHP = 0 + self.HurtHPEx = 0 + self.CurHP = 0 + self.CurHPEx = 0 + self.SuckHP = 0 + self.BounceHP = 0 + return + + def GetLength(self): + return sizeof(tagSCUseSkillHurt) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// B4 27 使用技能 //tagSCUseSkill: + ObjID:%d, + AttackTypes:%d, + HurtHP:%d, + HurtHPEx:%d, + CurHP:%d, + CurHPEx:%d, + SuckHP:%d, + BounceHP:%d + '''\ + %( + self.ObjID, + self.AttackTypes, + self.HurtHP, + self.HurtHPEx, + self.CurHP, + self.CurHPEx, + self.SuckHP, + self.BounceHP + ) + return DumpString + + +class tagSCUseSkill(Structure): + Head = tagHead() + ObjID = 0 #(DWORD ObjID) + PMType = 0 #(BYTE PMType)// 物法类型 0或1-物理;2-法术 + BattleType = 0 #(BYTE BattleType)// 战斗类型 0-常规;1-连击;2-反击;3-追击 + CurHP = 0 #(DWORD CurHP)// 释放技能后剩余血量,吸血、反弹可能引起变化,求余亿部分 + CurHPEx = 0 #(DWORD CurHPEx)// 释放技能后剩余血量,吸血、反弹可能引起变化,整除亿部分 + SkillID = 0 #(DWORD SkillID) + HurtCount = 0 #(BYTE HurtCount)//伤害数目 + HurtList = list() #(vector<tagSCUseSkillHurt> HurtList)//size = HurtCount + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xB4 + self.Head.SubCmd = 0x27 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.ObjID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.PMType,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.BattleType,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.CurHP,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.CurHPEx,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.SkillID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.HurtCount,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.HurtCount): + temHurtList = tagSCUseSkillHurt() + _pos = temHurtList.ReadData(_lpData, _pos) + self.HurtList.append(temHurtList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xB4 + self.Head.SubCmd = 0x27 + self.ObjID = 0 + self.PMType = 0 + self.BattleType = 0 + self.CurHP = 0 + self.CurHPEx = 0 + self.SkillID = 0 + self.HurtCount = 0 + self.HurtList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 4 + length += 1 + length += 1 + length += 4 + length += 4 + length += 4 + length += 1 + for i in range(self.HurtCount): + length += self.HurtList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteDWORD(data, self.ObjID) + data = CommFunc.WriteBYTE(data, self.PMType) + data = CommFunc.WriteBYTE(data, self.BattleType) + data = CommFunc.WriteDWORD(data, self.CurHP) + data = CommFunc.WriteDWORD(data, self.CurHPEx) + data = CommFunc.WriteDWORD(data, self.SkillID) + data = CommFunc.WriteBYTE(data, self.HurtCount) + for i in range(self.HurtCount): + data = CommFunc.WriteString(data, self.HurtList[i].GetLength(), self.HurtList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + ObjID:%d, + PMType:%d, + BattleType:%d, + CurHP:%d, + CurHPEx:%d, + SkillID:%d, + HurtCount:%d, + HurtList:%s + '''\ + %( + self.Head.OutputString(), + self.ObjID, + self.PMType, + self.BattleType, + self.CurHP, + self.CurHPEx, + self.SkillID, + self.HurtCount, + "..." + ) + return DumpString + + +m_NAtagSCUseSkill=tagSCUseSkill() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagSCUseSkill.Head.Cmd,m_NAtagSCUseSkill.Head.SubCmd))] = m_NAtagSCUseSkill + + +#------------------------------------------------------ # B5 04 拍卖行新上架拍品 #tagGCAddAuctionItemInfo class tagGCAddAuctionItem(Structure): -- Gitblit v1.8.0