From 9e65b1227144d715b48bdac99290a292108bec53 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期四, 12 一月 2023 17:09:19 +0800 Subject: [PATCH] 9765 【BT8】【后端】神通 --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py | 119 ++++++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py | 179 +++++++++ PySysDB/生成IpyGameDataPY/config.ini | 4 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py | 119 ++++++ ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py | 179 +++++++++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini | 16 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintSkill.py | 2 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py | 58 +++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py | 2 PySysDB/PySysDBPY.h | 22 + ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py | 2 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerShentong.py | 291 ++++++++++++++++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Shentong.py | 86 ++++ 13 files changed, 1,077 insertions(+), 2 deletions(-) diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h index d78b15c..bb6085d 100644 --- a/PySysDB/PySysDBPY.h +++ b/PySysDB/PySysDBPY.h @@ -461,6 +461,28 @@ list LVAttrValueList; //等级属性值列表 }; +//神通表 + +struct tagShentong +{ + BYTE _ShentongID; //神通ID + WORD NeedGubaoID; //解锁所需古宝ID +}; + +//神通升级表 + +struct tagShentongLV +{ + BYTE _ShentongID; //神通ID + BYTE _ShentongClassLV; //神通阶级 + BYTE _ShentongLV; //神通等级 + list LVLightNeedItem; //点亮该级所需物品 [[物品ID,个数], ...] + list LVAttrTypeList; //该级属性类型列表 + list LVAttrValueList; //该级属性值列表 + DWORD LVSkillID; //该级职业通用技能ID + DWORD FightPowerEx; //附加战力 +}; + //玩家等级表 struct tagPlayerLV diff --git "a/PySysDB/\347\224\237\346\210\220IpyGameDataPY/config.ini" "b/PySysDB/\347\224\237\346\210\220IpyGameDataPY/config.ini" index bfc85cd..b28f90d 100644 --- "a/PySysDB/\347\224\237\346\210\220IpyGameDataPY/config.ini" +++ "b/PySysDB/\347\224\237\346\210\220IpyGameDataPY/config.ini" @@ -1,5 +1,5 @@ [config] -; 椤圭洰鏍硅矾寰� -CodeProjectPath = E:\SnxxServerCode\ServerPython +; 项目根路径 +CodeProjectPath = E:\Git\SnxxServerCode\ServerPython diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py index 4a1280f..a5935be 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py @@ -18158,6 +18158,125 @@ #------------------------------------------------------ +# B2 19 神通升级 #tagCMShentongLVUp + +class tagCMShentongLVUp(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("ShentongID", c_ubyte), + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xB2 + self.SubCmd = 0x19 + 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 = 0xB2 + self.SubCmd = 0x19 + self.ShentongID = 0 + return + + def GetLength(self): + return sizeof(tagCMShentongLVUp) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// B2 19 神通升级 //tagCMShentongLVUp: + Cmd:%s, + SubCmd:%s, + ShentongID:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.ShentongID + ) + return DumpString + + +m_NAtagCMShentongLVUp=tagCMShentongLVUp() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMShentongLVUp.Cmd,m_NAtagCMShentongLVUp.SubCmd))] = m_NAtagCMShentongLVUp + + +#------------------------------------------------------ +# B2 20 神通技能设置 #tagCMShentongSkillSet + +class tagCMShentongSkillSet(Structure): + Head = tagHead() + Count = 0 #(BYTE Count) + SkillIDList = list() #(vector<DWORD> SkillIDList) + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xB2 + self.Head.SubCmd = 0x20 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.Count): + value,_pos=CommFunc.ReadDWORD(_lpData,_pos) + self.SkillIDList.append(value) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xB2 + self.Head.SubCmd = 0x20 + self.Count = 0 + self.SkillIDList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + length += 4 * self.Count + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteBYTE(data, self.Count) + for i in range(self.Count): + data = CommFunc.WriteDWORD(data, self.SkillIDList[i]) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + Count:%d, + SkillIDList:%s + '''\ + %( + self.Head.OutputString(), + self.Count, + "..." + ) + return DumpString + + +m_NAtagCMShentongSkillSet=tagCMShentongSkillSet() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMShentongSkillSet.Head.Cmd,m_NAtagCMShentongSkillSet.Head.SubCmd))] = m_NAtagCMShentongSkillSet + + +#------------------------------------------------------ #B2 01 脱机挂状态 # tagCMLoginState class tagCMLoginState(Structure): diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py index c0c0ffb..8a3f6ea 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py @@ -23138,6 +23138,185 @@ #------------------------------------------------------ +# A3 C8 神通等级信息 #tagMCShentongLVInfo + +class tagMCShentongLV(Structure): + _pack_ = 1 + _fields_ = [ + ("ShentongID", c_ubyte), + ("ClassLV", c_ubyte), + ("LV", c_ubyte), + ] + + 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.ShentongID = 0 + self.ClassLV = 0 + self.LV = 0 + return + + def GetLength(self): + return sizeof(tagMCShentongLV) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// A3 C8 神通等级信息 //tagMCShentongLVInfo: + ShentongID:%d, + ClassLV:%d, + LV:%d + '''\ + %( + self.ShentongID, + self.ClassLV, + self.LV + ) + return DumpString + + +class tagMCShentongLVInfo(Structure): + Head = tagHead() + Count = 0 #(BYTE Count) + ShentongLVList = list() #(vector<tagMCShentongLV> ShentongLVList) + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xA3 + self.Head.SubCmd = 0xC8 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.Count): + temShentongLVList = tagMCShentongLV() + _pos = temShentongLVList.ReadData(_lpData, _pos) + self.ShentongLVList.append(temShentongLVList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xA3 + self.Head.SubCmd = 0xC8 + self.Count = 0 + self.ShentongLVList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + for i in range(self.Count): + length += self.ShentongLVList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteBYTE(data, self.Count) + for i in range(self.Count): + data = CommFunc.WriteString(data, self.ShentongLVList[i].GetLength(), self.ShentongLVList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + Count:%d, + ShentongLVList:%s + '''\ + %( + self.Head.OutputString(), + self.Count, + "..." + ) + return DumpString + + +m_NAtagMCShentongLVInfo=tagMCShentongLVInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCShentongLVInfo.Head.Cmd,m_NAtagMCShentongLVInfo.Head.SubCmd))] = m_NAtagMCShentongLVInfo + + +#------------------------------------------------------ +# A3 C9 神通技能设置信息 #tagMCShentongSkillInfo + +class tagMCShentongSkillInfo(Structure): + Head = tagHead() + Count = 0 #(BYTE Count) + SkillIDList = list() #(vector<DWORD> SkillIDList) + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xA3 + self.Head.SubCmd = 0xC9 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.Count): + value,_pos=CommFunc.ReadDWORD(_lpData,_pos) + self.SkillIDList.append(value) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xA3 + self.Head.SubCmd = 0xC9 + self.Count = 0 + self.SkillIDList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + length += 4 * self.Count + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteBYTE(data, self.Count) + for i in range(self.Count): + data = CommFunc.WriteDWORD(data, self.SkillIDList[i]) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + Count:%d, + SkillIDList:%s + '''\ + %( + self.Head.OutputString(), + self.Count, + "..." + ) + return DumpString + + +m_NAtagMCShentongSkillInfo=tagMCShentongSkillInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCShentongSkillInfo.Head.Cmd,m_NAtagMCShentongSkillInfo.Head.SubCmd))] = m_NAtagMCShentongSkillInfo + + +#------------------------------------------------------ # A3 44 当日累计充值多选一礼包信息 #tagMCSingleGoldGift class tagMCSingleGoldGift(Structure): diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini index 6a46b12..35f59c9 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini @@ -1777,6 +1777,22 @@ PacketSubCMD_3=0x18 PacketCallFunc_3=OnGubaoLVUp +;神通 +[PlayerShentong] +ScriptName = Player\PlayerShentong.py +Writer = hxp +Releaser = hxp +RegType = 0 +RegisterPackCount = 2 + +PacketCMD_1=0xB2 +PacketSubCMD_1=0x19 +PacketCallFunc_1=OnShentongLVUp + +PacketCMD_2=0xB2 +PacketSubCMD_2=0x20 +PacketCallFunc_2=OnShentongSkillSet + ;缥缈仙域 [PlayerFairyDomain] ScriptName = Player\PlayerFairyDomain.py diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py index 4a1280f..a5935be 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py @@ -18158,6 +18158,125 @@ #------------------------------------------------------ +# B2 19 神通升级 #tagCMShentongLVUp + +class tagCMShentongLVUp(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("ShentongID", c_ubyte), + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xB2 + self.SubCmd = 0x19 + 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 = 0xB2 + self.SubCmd = 0x19 + self.ShentongID = 0 + return + + def GetLength(self): + return sizeof(tagCMShentongLVUp) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// B2 19 神通升级 //tagCMShentongLVUp: + Cmd:%s, + SubCmd:%s, + ShentongID:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.ShentongID + ) + return DumpString + + +m_NAtagCMShentongLVUp=tagCMShentongLVUp() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMShentongLVUp.Cmd,m_NAtagCMShentongLVUp.SubCmd))] = m_NAtagCMShentongLVUp + + +#------------------------------------------------------ +# B2 20 神通技能设置 #tagCMShentongSkillSet + +class tagCMShentongSkillSet(Structure): + Head = tagHead() + Count = 0 #(BYTE Count) + SkillIDList = list() #(vector<DWORD> SkillIDList) + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xB2 + self.Head.SubCmd = 0x20 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.Count): + value,_pos=CommFunc.ReadDWORD(_lpData,_pos) + self.SkillIDList.append(value) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xB2 + self.Head.SubCmd = 0x20 + self.Count = 0 + self.SkillIDList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + length += 4 * self.Count + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteBYTE(data, self.Count) + for i in range(self.Count): + data = CommFunc.WriteDWORD(data, self.SkillIDList[i]) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + Count:%d, + SkillIDList:%s + '''\ + %( + self.Head.OutputString(), + self.Count, + "..." + ) + return DumpString + + +m_NAtagCMShentongSkillSet=tagCMShentongSkillSet() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMShentongSkillSet.Head.Cmd,m_NAtagCMShentongSkillSet.Head.SubCmd))] = m_NAtagCMShentongSkillSet + + +#------------------------------------------------------ #B2 01 脱机挂状态 # tagCMLoginState class tagCMLoginState(Structure): diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py index c0c0ffb..8a3f6ea 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py @@ -23138,6 +23138,185 @@ #------------------------------------------------------ +# A3 C8 神通等级信息 #tagMCShentongLVInfo + +class tagMCShentongLV(Structure): + _pack_ = 1 + _fields_ = [ + ("ShentongID", c_ubyte), + ("ClassLV", c_ubyte), + ("LV", c_ubyte), + ] + + 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.ShentongID = 0 + self.ClassLV = 0 + self.LV = 0 + return + + def GetLength(self): + return sizeof(tagMCShentongLV) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// A3 C8 神通等级信息 //tagMCShentongLVInfo: + ShentongID:%d, + ClassLV:%d, + LV:%d + '''\ + %( + self.ShentongID, + self.ClassLV, + self.LV + ) + return DumpString + + +class tagMCShentongLVInfo(Structure): + Head = tagHead() + Count = 0 #(BYTE Count) + ShentongLVList = list() #(vector<tagMCShentongLV> ShentongLVList) + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xA3 + self.Head.SubCmd = 0xC8 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.Count): + temShentongLVList = tagMCShentongLV() + _pos = temShentongLVList.ReadData(_lpData, _pos) + self.ShentongLVList.append(temShentongLVList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xA3 + self.Head.SubCmd = 0xC8 + self.Count = 0 + self.ShentongLVList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + for i in range(self.Count): + length += self.ShentongLVList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteBYTE(data, self.Count) + for i in range(self.Count): + data = CommFunc.WriteString(data, self.ShentongLVList[i].GetLength(), self.ShentongLVList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + Count:%d, + ShentongLVList:%s + '''\ + %( + self.Head.OutputString(), + self.Count, + "..." + ) + return DumpString + + +m_NAtagMCShentongLVInfo=tagMCShentongLVInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCShentongLVInfo.Head.Cmd,m_NAtagMCShentongLVInfo.Head.SubCmd))] = m_NAtagMCShentongLVInfo + + +#------------------------------------------------------ +# A3 C9 神通技能设置信息 #tagMCShentongSkillInfo + +class tagMCShentongSkillInfo(Structure): + Head = tagHead() + Count = 0 #(BYTE Count) + SkillIDList = list() #(vector<DWORD> SkillIDList) + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xA3 + self.Head.SubCmd = 0xC9 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.Count): + value,_pos=CommFunc.ReadDWORD(_lpData,_pos) + self.SkillIDList.append(value) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xA3 + self.Head.SubCmd = 0xC9 + self.Count = 0 + self.SkillIDList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + length += 4 * self.Count + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteBYTE(data, self.Count) + for i in range(self.Count): + data = CommFunc.WriteDWORD(data, self.SkillIDList[i]) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + Count:%d, + SkillIDList:%s + '''\ + %( + self.Head.OutputString(), + self.Count, + "..." + ) + return DumpString + + +m_NAtagMCShentongSkillInfo=tagMCShentongSkillInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCShentongSkillInfo.Head.Cmd,m_NAtagMCShentongSkillInfo.Head.SubCmd))] = m_NAtagMCShentongSkillInfo + + +#------------------------------------------------------ # A3 44 当日累计充值多选一礼包信息 #tagMCSingleGoldGift class tagMCSingleGoldGift(Structure): diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintSkill.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintSkill.py index aa124dc..c79346d 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintSkill.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintSkill.py @@ -61,6 +61,8 @@ 16 : "灵宠主人技能", 17 : "称号技能", 18 : "装备被动技能", + 19 : "炼体技能", + 20 : "神通技能", } for funcType, skillInfo in skillDict.items(): diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Shentong.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Shentong.py new file mode 100644 index 0000000..31078f6 --- /dev/null +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Shentong.py @@ -0,0 +1,86 @@ +#!/usr/bin/python +# -*- coding: GBK -*- +#------------------------------------------------------------------------------- +# +##@package GM.Commands.Shentong +# +# @todo:神通 +# @author hxp +# @date 2023-01-08 +# @version 1.0 +# +# 详细描述: 神通 +# +#------------------------------------------------------------------------------- +#"""Version = 2023-01-08 18:00""" +#------------------------------------------------------------------------------- + +import GameWorld +import IpyGameDataPY +import PlayerShentong +import PlayerControl +import ChConfig + +#--------------------------------------------------------------------- +#逻辑实现 + +## GM命令执行入口 +# @param curPlayer 当前玩家 +# @param msgList 参数列表 +# @return None +# @remarks 函数详细说明. +def OnExec(curPlayer, msgList): + + if not msgList: + GameWorld.DebugAnswer(curPlayer, "重置神通: Shentong 0") + GameWorld.DebugAnswer(curPlayer, "设置神通: Shentong 神通ID 阶 等级") + return + + syncIDList = [] + + if len(msgList) == 1: + if msgList[0] == 0: + ipyDataMgr = IpyGameDataPY.IPY_Data() + for index in range(ipyDataMgr.GetShentongCount()): + ipyData = ipyDataMgr.GetShentongByIndex(index) + shentongID = ipyData.GetShentongID() + classLV, lv = PlayerShentong.GetShentongLVInfo(curPlayer, shentongID) + if not classLV and not lv: + continue + syncIDList.append(shentongID) + PlayerShentong.SetShentongLVInfo(curPlayer, shentongID, 0, 0) + + ShentongSkillCountMax = IpyGameDataPY.GetFuncCfg("Shentong", 1) + skillManager = curPlayer.GetSkillManager() + playerCtl = PlayerControl.PlayerControl(curPlayer) + for num in range(ShentongSkillCountMax): + skillID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShentongSkillID % num) + if skillID and skillManager.FindSkillBySkillID(skillID): + skillManager.DeleteSkillBySkillID(skillID, True) + playerCtl.RefreshSkillFightPowerByDel(skillID) + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ShentongSkillID % num, 0) + PlayerShentong.Sync_ShentongSkillInfo(curPlayer) + + GameWorld.DebugAnswer(curPlayer, "重置神通OK") + + elif len(msgList) == 3: + shentongID, classLV, lv = msgList + ipyData = IpyGameDataPY.GetIpyGameData("Shentong", shentongID) + if not ipyData: + GameWorld.DebugAnswer(curPlayer, "不存在该神通!shentongID=%s" % shentongID) + return + lvIpyData = IpyGameDataPY.GetIpyGameData("ShentongLV", shentongID, classLV, lv) + if not lvIpyData: + GameWorld.DebugAnswer(curPlayer, "不存在该神通等级!shentongID=%s,classLV=%s,lv=%s" % (shentongID, classLV, lv)) + return + GameWorld.DebugAnswer(curPlayer, "设置神通:%s,阶(%s),等级(%s)" % (shentongID, classLV, lv)) + PlayerShentong.SetShentongLVInfo(curPlayer, shentongID, classLV, lv) + syncIDList.append(shentongID) + else: + return + + PlayerShentong.RefreshShentongAttr(curPlayer) + PlayerShentong.Sync_ShentongLVInfo(curPlayer, syncIDList) + return + + diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py index fdc2ceb..81a1658 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py @@ -380,6 +380,22 @@ ("list", "LVAttrValueList", 0), ), + "Shentong":( + ("BYTE", "ShentongID", 1), + ("WORD", "NeedGubaoID", 0), + ), + + "ShentongLV":( + ("BYTE", "ShentongID", 1), + ("BYTE", "ShentongClassLV", 1), + ("BYTE", "ShentongLV", 1), + ("list", "LVLightNeedItem", 0), + ("list", "LVAttrTypeList", 0), + ("list", "LVAttrValueList", 0), + ("DWORD", "LVSkillID", 0), + ("DWORD", "FightPowerEx", 0), + ), + "PlayerLV":( ("WORD", "LV", 1), ("DWORD", "ExpPoint", 0), @@ -2791,6 +2807,40 @@ def GetLVUPNeedItemInfo(self): return self.LVUPNeedItemInfo # 升级所需物品 [[物品ID,个数], ...] def GetLVAttrTypeList(self): return self.LVAttrTypeList # 等级属性类型列表 def GetLVAttrValueList(self): return self.LVAttrValueList # 等级属性值列表 + +# 神通表 +class IPY_Shentong(): + + def __init__(self): + self.ShentongID = 0 + self.NeedGubaoID = 0 + return + + def GetShentongID(self): return self.ShentongID # 神通ID + def GetNeedGubaoID(self): return self.NeedGubaoID # 解锁所需古宝ID + +# 神通升级表 +class IPY_ShentongLV(): + + def __init__(self): + self.ShentongID = 0 + self.ShentongClassLV = 0 + self.ShentongLV = 0 + self.LVLightNeedItem = [] + self.LVAttrTypeList = [] + self.LVAttrValueList = [] + self.LVSkillID = 0 + self.FightPowerEx = 0 + return + + def GetShentongID(self): return self.ShentongID # 神通ID + def GetShentongClassLV(self): return self.ShentongClassLV # 神通阶级 + def GetShentongLV(self): return self.ShentongLV # 神通等级 + def GetLVLightNeedItem(self): return self.LVLightNeedItem # 点亮该级所需物品 [[物品ID,个数], ...] + def GetLVAttrTypeList(self): return self.LVAttrTypeList # 该级属性类型列表 + def GetLVAttrValueList(self): return self.LVAttrValueList # 该级属性值列表 + def GetLVSkillID(self): return self.LVSkillID # 该级职业通用技能ID + def GetFightPowerEx(self): return self.FightPowerEx # 附加战力 # 玩家等级表 class IPY_PlayerLV(): @@ -6417,6 +6467,10 @@ self.ipyGubaoStarLen = len(self.ipyGubaoStarCache) self.ipyGubaoLVCache = self.__LoadFileData("GubaoLV", IPY_GubaoLV) self.ipyGubaoLVLen = len(self.ipyGubaoLVCache) + self.ipyShentongCache = self.__LoadFileData("Shentong", IPY_Shentong) + self.ipyShentongLen = len(self.ipyShentongCache) + self.ipyShentongLVCache = self.__LoadFileData("ShentongLV", IPY_ShentongLV) + self.ipyShentongLVLen = len(self.ipyShentongLVCache) self.ipyPlayerLVCache = self.__LoadFileData("PlayerLV", IPY_PlayerLV) self.ipyPlayerLVLen = len(self.ipyPlayerLVCache) self.ipySpecMapPlayerAttrFormatCache = self.__LoadFileData("SpecMapPlayerAttrFormat", IPY_SpecMapPlayerAttrFormat) @@ -7001,6 +7055,10 @@ def GetGubaoStarByIndex(self, index): return self.ipyGubaoStarCache[index] def GetGubaoLVCount(self): return self.ipyGubaoLVLen def GetGubaoLVByIndex(self, index): return self.ipyGubaoLVCache[index] + def GetShentongCount(self): return self.ipyShentongLen + def GetShentongByIndex(self, index): return self.ipyShentongCache[index] + def GetShentongLVCount(self): return self.ipyShentongLVLen + def GetShentongLVByIndex(self, index): return self.ipyShentongLVCache[index] def GetPlayerLVCount(self): return self.ipyPlayerLVLen def GetPlayerLVByIndex(self, index): return self.ipyPlayerLVCache[index] def GetSpecMapPlayerAttrFormatCount(self): return self.ipySpecMapPlayerAttrFormatLen diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py index 711c996..338add5 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py @@ -145,6 +145,7 @@ import PlayerFaQi import SkillShell import PlayerGubao +import PlayerShentong import PlayerLianTi import PlayerYinji import PlayerLove @@ -912,6 +913,7 @@ GameWorld.Log("MapServer->DoPlayerRealLoginOK", curPlayer.GetPlayerID()) PlayerGubao.OnPlayerLogin(curPlayer) + PlayerShentong.OnPlayerLogin(curPlayer) # 上线查询一次充值订单 curPlayer.SendDBQueryRecharge() diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py index ce8cef7..2456e9f 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py @@ -99,6 +99,7 @@ import PlayerFaQi import PlayerLove import PlayerGubao +import PlayerShentong import PlayerCharm import ChPlayer import GMShell @@ -4531,6 +4532,7 @@ PlayerCharm.CalcCharmAttr(curPlayer) PlayerLianTi.CalcLianTiAttr(curPlayer) PlayerGubao.CalcGubaoAttr(curPlayer) + PlayerShentong.CalcShentongAttr(curPlayer) self.RefreshAllState(isForce=True) GameWorld.DebugLog("End ReCalcAllState!!!") return diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerShentong.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerShentong.py new file mode 100644 index 0000000..b16e2ff --- /dev/null +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerShentong.py @@ -0,0 +1,291 @@ +#!/usr/bin/python +# -*- coding: GBK -*- +#------------------------------------------------------------------------------- +# +##@package Player.PlayerShentong +# +# @todo:神通 +# @author hxp +# @date 2023-01-08 +# @version 1.0 +# +# 详细描述: 神通 +# +#------------------------------------------------------------------------------- +#"""Version = 2023-01-08 18:00""" +#------------------------------------------------------------------------------- + +import GameWorld +import ShareDefine +import PlayerControl +import IpyGameDataPY +import ChPyNetSendPack +import IPY_GameWorld +import NetPackCommon +import PlayerGubao +import ItemCommon +import ChConfig + +def GetShentongLVInfo(curPlayer, shentongID): + lvInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShentongLVInfo % shentongID) + classLV = lvInfo / 100 + lv = lvInfo % 100 + return classLV, lv +def SetShentongLVInfo(curPlayer, shentongID, classLV, lv): + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ShentongLVInfo % shentongID, classLV * 100 + lv) + return + +def OnPlayerLogin(curPlayer): + Sync_ShentongLVInfo(curPlayer) + Sync_ShentongSkillInfo(curPlayer, True) + return + +#// B2 19 神通升级 #tagCMShentongLVUp +# +#struct tagCMShentongLVUp +#{ +# tagHead Head; +# BYTE ShentongID; +#}; +def OnShentongLVUp(index, curPackData, tick): + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + playerID = curPlayer.GetPlayerID() + shentongID = curPackData.ShentongID + ipyData = IpyGameDataPY.GetIpyGameData("Shentong", shentongID) + if not ipyData: + return + needGubaoID = ipyData.GetNeedGubaoID() + if needGubaoID and not PlayerGubao.GetGubaoLVInfo(curPlayer, needGubaoID)[1]: + GameWorld.DebugLog("古宝未激活,无法升级神通! shentongID=%s,needGubaoID=%s" % (shentongID, needGubaoID), playerID) + return + + classLV, lv = GetShentongLVInfo(curPlayer, shentongID) + nextClassLV = classLV + nextLV = lv + 1 + lvIpyData = IpyGameDataPY.GetIpyGameDataNotLog("ShentongLV", shentongID, nextClassLV, nextLV) + if not lvIpyData: + nextClassLV = classLV + 1 + nextLV = 1 + lvIpyData = IpyGameDataPY.GetIpyGameDataNotLog("ShentongLV", shentongID, nextClassLV, nextLV) + if not lvIpyData: + GameWorld.ErrLog("没有下一级神通数据,无法升级! shentongID=%s,classLV=%s,lv=%s" % (shentongID, classLV, lv), playerID) + return + + needItemList = lvIpyData.GetLVLightNeedItem() + if not needItemList: + return + + itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) + lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needItemList, itemPack) + if lackItemDict: + GameWorld.DebugLog("神通升级所需物品不足! shentongID=%s,classLV(%s-%s),nextClassLV=(%s-%s),needItemList=%s,lackItemDict=%s" + % (shentongID, classLV, lv, nextClassLV, nextLV, needItemList, lackItemDict), playerID) + return + #扣消耗 + ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "Shentong") + + SetShentongLVInfo(curPlayer, shentongID, nextClassLV, nextLV) + Sync_ShentongLVInfo(curPlayer, [shentongID]) + + LVSkillID = lvIpyData.GetLVSkillID() + GameWorld.Log("神通升级成功! shentongID=%s,classLV(%s-%s),nextClassLV=(%s-%s),LVSkillID=%s" + % (shentongID, classLV, lv, nextClassLV, nextLV, LVSkillID), playerID) + if LVSkillID: + lvSkillData = GameWorld.GetGameData().GetSkillBySkillID(LVSkillID) + lvSkillTypeID = lvSkillData.GetSkillTypeID() if lvSkillData else 0 + lvSkillLV = lvSkillData.GetSkillLV() if lvSkillData else 0 + + ShentongSkillCount = IpyGameDataPY.GetFuncCfg("Shentong", 1) + skillIDList = [] + for num in range(ShentongSkillCount): + skillID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShentongSkillID % num) + if not skillID: + skillIDList.append(0) + continue + skillData = GameWorld.GetGameData().GetSkillBySkillID(skillID) + if not skillData: + continue + skillTypeID = skillData.GetSkillTypeID() + skillLV = skillData.GetSkillLV() + if lvSkillTypeID == skillTypeID: + if lvSkillLV > skillLV: # 升级 + skillIDList.append(LVSkillID) + else: + skillIDList.append(0) # 一般不可能,出现该情况的话置0重新添加 + else: + skillIDList.append(skillID) + + # 有空位默认添加到该空位 + if LVSkillID not in skillIDList and 0 in skillIDList: + skillIDList[skillIDList.index(0)] = LVSkillID + + if LVSkillID in skillIDList: + GameWorld.DebugLog("自动出战/替换神通技能: skillIDList=%s" % skillIDList, playerID) + SetShentongSkill(curPlayer, skillIDList) + + RefreshShentongAttr(curPlayer) + return + +#// B2 20 神通技能设置 #tagCMShentongSkillSet +# +#struct tagCMShentongSkillSet +#{ +# tagHead Head; +# BYTE Count; +# DWORD SkillIDList[Count]; +#}; +def OnShentongSkillSet(index, curPackData, tick): + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + skillIDList = curPackData.SkillIDList + SetShentongSkill(curPlayer, skillIDList) + return + +def SetShentongSkill(curPlayer, setSkillIDList): + if not setSkillIDList: + return + ShentongSkillCountMax = IpyGameDataPY.GetFuncCfg("Shentong", 1) + if len(setSkillIDList) > ShentongSkillCountMax: + return + + if len(setSkillIDList) < ShentongSkillCountMax: + setSkillIDList += [0] * (ShentongSkillCountMax - len(setSkillIDList)) + + forbidSkillIDList = [] + for skillID in setSkillIDList: + if not skillID: + continue + if not GameWorld.GetGameData().GetSkillBySkillID(skillID): + GameWorld.ErrLog("找不到该神通技能数据! skillID=%s" % skillID) + return + forbidSkillIDList.append(skillID) + + ipyDataMgr = IpyGameDataPY.IPY_Data() + for index in xrange(ipyDataMgr.GetShentongLVCount()): + ipyData = ipyDataMgr.GetShentongLVByIndex(index) + LVSkillID = ipyData.GetLVSkillID() + if not LVSkillID: + continue + if LVSkillID not in forbidSkillIDList: + continue + shentongID = ipyData.GetShentongID() + shentongClassLV = ipyData.GetShentongClassLV() + shentongLV = ipyData.GetShentongLV() + classLV, lv = GetShentongLVInfo(curPlayer, shentongID) + if classLV < shentongClassLV or (classLV == shentongClassLV and lv < shentongLV): + GameWorld.ErrLog("神通等级不足,无法使用该技能! LVSkillID=%s,shentongID=%s,needClassLV=(%s-%s),curClassLV=(%s-%s)" + % (LVSkillID, shentongID, shentongClassLV, shentongLV, classLV, lv), curPlayer.GetPlayerID()) + return + forbidSkillIDList.remove(LVSkillID) + + if forbidSkillIDList: + GameWorld.ErrLog("存在无法使用的神通技能,无法设置! setSkillIDList=%s,forbidSkillIDList=%s" + % (setSkillIDList, forbidSkillIDList), curPlayer.GetPlayerID()) + return + + # 因为可能调整顺序,必须先统一删除再统一添加,不然可能导致技能顺序调整后先被添加后又被删除 + skillManager = curPlayer.GetSkillManager() + playerCtl = PlayerControl.PlayerControl(curPlayer) + for num in range(ShentongSkillCountMax): + skillID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShentongSkillID % num) + if skillID and skillManager.FindSkillBySkillID(skillID): + skillManager.DeleteSkillBySkillID(skillID, True) + playerCtl.RefreshSkillFightPowerByDel(skillID) + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ShentongSkillID % num, 0) + + for num in range(ShentongSkillCountMax): + setSkillID = setSkillIDList[num] + if setSkillID: + skillManager.LearnSkillByID(setSkillID, True) + playerCtl.RefreshSkillFightPowerEx(setSkillID, 0) + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ShentongSkillID % num, setSkillID) + + Sync_ShentongSkillInfo(curPlayer) + return + +def RefreshShentongAttr(curPlayer): + CalcShentongAttr(curPlayer) + PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState() + return + +def CalcShentongAttr(curPlayer): + + fightPowerEx = 0 + allAttrList = [{} for _ in range(4)] + + ipyDataMgr = IpyGameDataPY.IPY_Data() + for index in xrange(ipyDataMgr.GetShentongCount()): + ipyData = ipyDataMgr.GetShentongByIndex(index) + shentongID = ipyData.GetShentongID() + classLV, lv = GetShentongLVInfo(curPlayer, shentongID) + if not classLV and not lv: + continue + lvIpyDataList = IpyGameDataPY.GetIpyGameDataByCondition("ShentongLV", {"ShentongID":shentongID}, True) + if not lvIpyDataList: + continue + for lvIpyData in lvIpyDataList: + shentongClassLV = lvIpyData.GetShentongClassLV() + shentongLV = lvIpyData.GetShentongLV() + if classLV < shentongClassLV or (classLV == shentongClassLV and lv < shentongLV): + break + + LVAttrTypeList = lvIpyData.GetLVAttrTypeList() + LVAttrValueList = lvIpyData.GetLVAttrValueList() + for i, attrID in enumerate(LVAttrTypeList): + attrValue = LVAttrValueList[i] + PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList) + + if lvIpyData.GetFightPowerEx(): + fightPowerEx += lvIpyData.GetFightPowerEx() + + # 附加战力 + curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_Shentong, fightPowerEx) + # 保存计算值 + PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Shentong, allAttrList) + return + +def Sync_ShentongLVInfo(curPlayer, shentongIDList=None): + if shentongIDList == None: + syncIDList = [] + ipyDataMgr = IpyGameDataPY.IPY_Data() + for index in range(ipyDataMgr.GetShentongCount()): + ipyData = ipyDataMgr.GetShentongByIndex(index) + syncIDList.append(ipyData.GetShentongID()) + else: + syncIDList = shentongIDList + + shentongInfoList = [] + for shentongID in syncIDList: + classLV, lv = GetShentongLVInfo(curPlayer, shentongID) + if not classLV and not lv and shentongIDList == None: + # 没有指定时只同步激活的 + continue + shentong = ChPyNetSendPack.tagMCShentongLV() + shentong.ShentongID = shentongID + shentong.ClassLV = classLV + shentong.LV = lv + shentongInfoList.append(shentong) + + if not shentongInfoList: + return + + clientPack = ChPyNetSendPack.tagMCShentongLVInfo() + clientPack.ShentongLVList = shentongInfoList + clientPack.Count = len(clientPack.ShentongLVList) + NetPackCommon.SendFakePack(curPlayer, clientPack) + return + +def Sync_ShentongSkillInfo(curPlayer, isLogin=False): + skillIDList = [] + ShentongSkillCountMax = IpyGameDataPY.GetFuncCfg("Shentong", 1) + for num in range(ShentongSkillCountMax): + skillIDList.append(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShentongSkillID % num)) + + if skillIDList.count(0) == ShentongSkillCountMax and isLogin: + return + + clientPack = ChPyNetSendPack.tagMCShentongSkillInfo() + clientPack.SkillIDList = skillIDList + clientPack.Count = len(clientPack.SkillIDList) + NetPackCommon.SendFakePack(curPlayer, clientPack) + return + -- Gitblit v1.8.0