hxp
2023-01-08 9e65b1227144d715b48bdac99290a292108bec53
9765 【BT8】【后端】神通

# Conflicts:
# ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintFightPower.py
11个文件已修改
2个文件已添加
1079 ■■■■■ 已修改文件
PySysDB/PySysDBPY.h 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/生成IpyGameDataPY/config.ini 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 179 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 179 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintSkill.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Shentong.py 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerShentong.py 291 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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
PySysDB/Éú³ÉIpyGameDataPY/config.ini
@@ -1,5 +1,5 @@
[config]
; é¡¹ç›®æ ¹è·¯å¾„
CodeProjectPath = E:\SnxxServerCode\ServerPython
; é¡¹ç›®æ ¹è·¯å¾„
CodeProjectPath = E:\Git\SnxxServerCode\ServerPython
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):
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):
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
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):
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):
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():
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Shentong.py
New file
@@ -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
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
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()
    
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
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerShentong.py
New file
@@ -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