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