hxp
2019-11-20 f10b4418d4b543e77dadf11730ddd7636c11cf79
8341 【恺英】【后端】强化进化系统优化(强化大师)
10个文件已修改
572 ■■■■ 已修改文件
PySysDB/PySysDBPY.h 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipPlus.py 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h
@@ -124,6 +124,15 @@
    DWORD        TotalExp;    //升级所需熟练度总值
};
//装备强化大师表
struct tagItemPlusMaster
{
    BYTE        _ClassLV;    //阶
    WORD        MasterPlusLV;    //大师强化等级
    list        MasterPlusAttrIDList;    //激活属性类型列表
    list        MasterPlusAttrValueList;    //激活属性值列表
};
//装备全身星数属性
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -7728,6 +7728,62 @@
#------------------------------------------------------
# A5 C7 激活大师强化等级 #tagCMActivateMasterPlusLV
class  tagCMActivateMasterPlusLV(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("ClassLV", c_ubyte),    # 所属装备阶
                  ("MasterPlusLV", c_ushort),    # 大师强化等级
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA5
        self.SubCmd = 0xC7
        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 = 0xA5
        self.SubCmd = 0xC7
        self.ClassLV = 0
        self.MasterPlusLV = 0
        return
    def GetLength(self):
        return sizeof(tagCMActivateMasterPlusLV)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A5 C7 激活大师强化等级 //tagCMActivateMasterPlusLV:
                                Cmd:%s,
                                SubCmd:%s,
                                ClassLV:%d,
                                MasterPlusLV:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.ClassLV,
                                self.MasterPlusLV
                                )
        return DumpString
m_NAtagCMActivateMasterPlusLV=tagCMActivateMasterPlusLV()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMActivateMasterPlusLV.Cmd,m_NAtagCMActivateMasterPlusLV.SubCmd))] = m_NAtagCMActivateMasterPlusLV
#------------------------------------------------------
# A5 03 全身属性激活 #tagCMActiveAllEquipAttr
class  tagCMActiveAllEquipAttr(Structure):
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -15932,6 +15932,114 @@
#------------------------------------------------------
# A3 C2 大师强化等级激活信息 #tagMCMasterPlusLVInfo
class  tagMCMasterPlusLV(Structure):
    _pack_ = 1
    _fields_ = [
                  ("ClassLV", c_ubyte),
                  ("MasterPlusLV", c_ushort),    # 已经激活的最高大师强化等级,向下兼容
                  ]
    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.ClassLV = 0
        self.MasterPlusLV = 0
        return
    def GetLength(self):
        return sizeof(tagMCMasterPlusLV)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A3 C2 大师强化等级激活信息 //tagMCMasterPlusLVInfo:
                                ClassLV:%d,
                                MasterPlusLV:%d
                                '''\
                                %(
                                self.ClassLV,
                                self.MasterPlusLV
                                )
        return DumpString
class  tagMCMasterPlusLVInfo(Structure):
    Head = tagHead()
    Count = 0    #(BYTE Count)// 信息个数
    MasterPlusLVInfoList = list()    #(vector<tagMCMasterPlusLV> MasterPlusLVInfoList)// 信息列表
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0xC2
        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):
            temMasterPlusLVInfoList = tagMCMasterPlusLV()
            _pos = temMasterPlusLVInfoList.ReadData(_lpData, _pos)
            self.MasterPlusLVInfoList.append(temMasterPlusLVInfoList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0xC2
        self.Count = 0
        self.MasterPlusLVInfoList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        for i in range(self.Count):
            length += self.MasterPlusLVInfoList[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.MasterPlusLVInfoList[i].GetLength(), self.MasterPlusLVInfoList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                Count:%d,
                                MasterPlusLVInfoList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.Count,
                                "..."
                                )
        return DumpString
m_NAtagMCMasterPlusLVInfo=tagMCMasterPlusLVInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCMasterPlusLVInfo.Head.Cmd,m_NAtagMCMasterPlusLVInfo.Head.SubCmd))] = m_NAtagMCMasterPlusLVInfo
#------------------------------------------------------
#A3 1B 玩家自动战斗设置储存信息通知#tagMCAutoFightSetting
class  tagMCAutoFightSetting(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -68,7 +68,7 @@
Writer = wdb
Releaser = wdb
RegType = 0
RegisterPackCount = 2
RegisterPackCount = 3
PacketCMD_1=0xA3
PacketSubCMD_1=0x01
@@ -77,6 +77,10 @@
PacketCMD_2=0xA3
PacketSubCMD_2=0x16
PacketCallFunc_2=OnEquipPlusEvolve
PacketCMD_3=0xA5
PacketSubCMD_3=0xC7
PacketCallFunc_3=OnActivateMasterPlusLV
;npc交互
[FunctionNPCCommon]
@@ -1246,9 +1250,9 @@
RegType = 0
RegisterPackCount = 3
PacketCMD_1=0xA5
PacketSubCMD_1=0x03
PacketCallFunc_1=OnActiveAllEquipAttr
PacketCMD_1=
PacketSubCMD_1=
PacketCallFunc_1=
PacketCMD_2=0xA3
PacketSubCMD_2=0x18
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3595,7 +3595,7 @@
#强化
Def_PDict_TotalPlusLV = "TotalPlusLV" # 总强化等级
Def_PDict_EquipPartPlusLV = "EPPlusLV_%s_%s" # 装备部位对应公共强化星级,参数为(packType, index)
Def_PDict_EquipActiveStarLV = "EquipActiveStarLV" #装备已激活总强化等级
Def_PDict_EquipPartMasterPlusLV = "EquipPartMasterPlusLV_%s" #装备已激活大师强化等级, 参数为(classLV)
Def_PDict_EquipPartProficiency = "EPProf_%s_%s" # 装备部位对应公共强化熟练度,参数为(packType, index)
Def_PDict_EquipPartPlusEvolveLV = "EPPlusEvolveLV_%s_%s" # 装备部位对应公共强化进化等级,参数为(packType, index)
Def_PDict_TotalPlusEvolveLV = "TotalPlusEvolveLV" # 装备部位对应公共强化进化总等级
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -7728,6 +7728,62 @@
#------------------------------------------------------
# A5 C7 激活大师强化等级 #tagCMActivateMasterPlusLV
class  tagCMActivateMasterPlusLV(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("ClassLV", c_ubyte),    # 所属装备阶
                  ("MasterPlusLV", c_ushort),    # 大师强化等级
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA5
        self.SubCmd = 0xC7
        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 = 0xA5
        self.SubCmd = 0xC7
        self.ClassLV = 0
        self.MasterPlusLV = 0
        return
    def GetLength(self):
        return sizeof(tagCMActivateMasterPlusLV)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A5 C7 激活大师强化等级 //tagCMActivateMasterPlusLV:
                                Cmd:%s,
                                SubCmd:%s,
                                ClassLV:%d,
                                MasterPlusLV:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.ClassLV,
                                self.MasterPlusLV
                                )
        return DumpString
m_NAtagCMActivateMasterPlusLV=tagCMActivateMasterPlusLV()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMActivateMasterPlusLV.Cmd,m_NAtagCMActivateMasterPlusLV.SubCmd))] = m_NAtagCMActivateMasterPlusLV
#------------------------------------------------------
# A5 03 全身属性激活 #tagCMActiveAllEquipAttr
class  tagCMActiveAllEquipAttr(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -15932,6 +15932,114 @@
#------------------------------------------------------
# A3 C2 大师强化等级激活信息 #tagMCMasterPlusLVInfo
class  tagMCMasterPlusLV(Structure):
    _pack_ = 1
    _fields_ = [
                  ("ClassLV", c_ubyte),
                  ("MasterPlusLV", c_ushort),    # 已经激活的最高大师强化等级,向下兼容
                  ]
    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.ClassLV = 0
        self.MasterPlusLV = 0
        return
    def GetLength(self):
        return sizeof(tagMCMasterPlusLV)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A3 C2 大师强化等级激活信息 //tagMCMasterPlusLVInfo:
                                ClassLV:%d,
                                MasterPlusLV:%d
                                '''\
                                %(
                                self.ClassLV,
                                self.MasterPlusLV
                                )
        return DumpString
class  tagMCMasterPlusLVInfo(Structure):
    Head = tagHead()
    Count = 0    #(BYTE Count)// 信息个数
    MasterPlusLVInfoList = list()    #(vector<tagMCMasterPlusLV> MasterPlusLVInfoList)// 信息列表
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0xC2
        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):
            temMasterPlusLVInfoList = tagMCMasterPlusLV()
            _pos = temMasterPlusLVInfoList.ReadData(_lpData, _pos)
            self.MasterPlusLVInfoList.append(temMasterPlusLVInfoList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0xC2
        self.Count = 0
        self.MasterPlusLVInfoList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        for i in range(self.Count):
            length += self.MasterPlusLVInfoList[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.MasterPlusLVInfoList[i].GetLength(), self.MasterPlusLVInfoList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                Count:%d,
                                MasterPlusLVInfoList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.Count,
                                "..."
                                )
        return DumpString
m_NAtagMCMasterPlusLVInfo=tagMCMasterPlusLVInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCMasterPlusLVInfo.Head.Cmd,m_NAtagMCMasterPlusLVInfo.Head.SubCmd))] = m_NAtagMCMasterPlusLVInfo
#------------------------------------------------------
#A3 1B 玩家自动战斗设置储存信息通知#tagMCAutoFightSetting
class  tagMCAutoFightSetting(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipPlus.py
@@ -33,6 +33,8 @@
import ChConfig
import ChEquip
import EventShell
import ChPyNetSendPack
import NetPackCommon
#-------------------------------------------------------------------------------------------
#===============================================================================
@@ -147,7 +149,6 @@
    OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_PlusLV, ChEquip.GetTotalPlusLV(curPlayer))
    return
def DoLogic_OnEquipPartStarLVChange(curPlayer, packType, classLV):
    #先刷装备BUFF 再计算属性
    curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrActivatyNotify, ChConfig.Def_AttrActivatyNotify_Plus)
@@ -205,3 +206,79 @@
    EventShell.EventRespons_EquipPlusEvolve(curPlayer, nextEvolveLV)
    return
#// A5 C7 激活大师强化等级 #tagCMActivateMasterPlusLV
#
#struct    tagCMActivateMasterPlusLV
#{
#    tagHead        Head;
#    BYTE    ClassLV;    // 所属装备阶
#    WORD    MasterPlusLV;    // 大师强化等级
#};
def OnActivateMasterPlusLV(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    classLV = clientData.ClassLV
    actMasterPlusLV = clientData.MasterPlusLV
    curMasterPlusLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartMasterPlusLV % classLV)
    if curMasterPlusLV >= actMasterPlusLV:
        # 已经激活过了
        GameWorld.DebugLog("已经激活过该强化大师等级了! actMasterPlusLV=%s,curMasterPlusLV=%s" % (actMasterPlusLV, curMasterPlusLV))
        return
    ipyData = IpyGameDataPY.GetIpyGameDataByCondition("ItemPlusMaster", {"ClassLV":classLV, "MasterPlusLV":actMasterPlusLV}, False, False)
    if not ipyData:
        GameWorld.DebugLog("不存在该强化大师等级! actMasterPlusLV=%s" % actMasterPlusLV)
        return
    packType = IPY_GameWorld.rptEquip
    # 判断可否激活
    for equipPlace in ChConfig.EquipPlace_Base:
        ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, equipPlace)
        if not ipyData:
            return
        equipIndex = ipyData.GetGridIndex()
        plusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, equipIndex)
        if plusLV < actMasterPlusLV:
            GameWorld.DebugLog("部位强化等级不足,无法激活强化大师! equipPlace=%s,equipIndex=%s,plusLV=%s < %s"
                               % (equipPlace, equipIndex, plusLV, actMasterPlusLV))
            return
    GameWorld.DebugLog("激活强化大师等级! classLV=%s,actMasterPlusLV=%s" % (classLV, actMasterPlusLV))
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartMasterPlusLV % classLV, actMasterPlusLV)
    SyncEquipMasterPlusLVInfo(curPlayer, classLV)
    #刷新所有属性
    DoLogic_OnEquipPartStarLVChange(curPlayer, packType, classLV)
    return
def SyncEquipMasterPlusLVInfo(curPlayer, classLV=0, isForce=False):
    ## 同步大师强化等级信息
    if not classLV:
        needSyncClassLVList = xrange(1, IpyGameDataPY.GetFuncCfg('EquipMaxClasslv') + 1)
    else:
        needSyncClassLVList = [classLV]
    masterPlusLVInfoList = []
    for classLV in needSyncClassLVList:
        masterPlusLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartMasterPlusLV % classLV)
        if not masterPlusLV and not isForce:
            continue
        lvInfo = ChPyNetSendPack.tagMCMasterPlusLV()
        lvInfo.ClassLV = classLV
        lvInfo.MasterPlusLV = masterPlusLV
        masterPlusLVInfoList.append(lvInfo)
    if not masterPlusLVInfoList:
        return
    clientPack = ChPyNetSendPack.tagMCMasterPlusLVInfo()
    clientPack.MasterPlusLVInfoList = masterPlusLVInfoList
    clientPack.Count = len(masterPlusLVInfoList)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -129,6 +129,13 @@
                        ("DWORD", "TotalExp", 0),
                        ),
                "ItemPlusMaster":(
                        ("BYTE", "ClassLV", 1),
                        ("WORD", "MasterPlusLV", 0),
                        ("list", "MasterPlusAttrIDList", 0),
                        ("list", "MasterPlusAttrValueList", 0),
                        ),
                "RoleEquipStars":(
                        ("BYTE", "StarsNeed", 1),
                        ("list", "AttrType", 0),
@@ -1740,6 +1747,21 @@
    def GetCostCount(self): return self.CostCount # 消耗铜钱
    def GetAddExp(self): return self.AddExp # 提升熟练度值
    def GetTotalExp(self): return self.TotalExp # 升级所需熟练度总值
# 装备强化大师表
class IPY_ItemPlusMaster():
    def __init__(self):
        self.ClassLV = 0
        self.MasterPlusLV = 0
        self.MasterPlusAttrIDList = []
        self.MasterPlusAttrValueList = []
        return
    def GetClassLV(self): return self.ClassLV # 阶
    def GetMasterPlusLV(self): return self.MasterPlusLV # 大师强化等级
    def GetMasterPlusAttrIDList(self): return self.MasterPlusAttrIDList # 激活属性类型列表
    def GetMasterPlusAttrValueList(self): return self.MasterPlusAttrValueList # 激活属性值列表
# 装备全身星数属性
class IPY_RoleEquipStars():
@@ -4740,6 +4762,8 @@
        self.ipyItemCompoundLen = len(self.ipyItemCompoundCache)
        self.ipyItemPlusCache = self.__LoadFileData("ItemPlus", IPY_ItemPlus)
        self.ipyItemPlusLen = len(self.ipyItemPlusCache)
        self.ipyItemPlusMasterCache = self.__LoadFileData("ItemPlusMaster", IPY_ItemPlusMaster)
        self.ipyItemPlusMasterLen = len(self.ipyItemPlusMasterCache)
        self.ipyRoleEquipStarsCache = self.__LoadFileData("RoleEquipStars", IPY_RoleEquipStars)
        self.ipyRoleEquipStarsLen = len(self.ipyRoleEquipStarsCache)
        self.ipyEquipLegendAttrCountCache = self.__LoadFileData("EquipLegendAttrCount", IPY_EquipLegendAttrCount)
@@ -5210,6 +5234,8 @@
    def GetItemCompoundByIndex(self, index): return self.ipyItemCompoundCache[index]
    def GetItemPlusCount(self): return self.ipyItemPlusLen
    def GetItemPlusByIndex(self, index): return self.ipyItemPlusCache[index]
    def GetItemPlusMasterCount(self): return self.ipyItemPlusMasterLen
    def GetItemPlusMasterByIndex(self, index): return self.ipyItemPlusMasterCache[index]
    def GetRoleEquipStarsCount(self): return self.ipyRoleEquipStarsLen
    def GetRoleEquipStarsByIndex(self, index): return self.ipyRoleEquipStarsCache[index]
    def GetEquipLegendAttrCountCount(self): return self.ipyEquipLegendAttrCountLen
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py
@@ -25,6 +25,7 @@
import FBLogic
import OperControlManager
import Operate_EquipWash
import Operate_EquipPlus
import ShareDefine
import ChPyNetSendPack
import NetPackCommon
@@ -186,8 +187,6 @@
    #NotifyEquipPartPlusLV(curPlayer)
    #NotifyEquipPartStar(curPlayer)
    #Operate_EquipWash.OnEquipWashLogin(curPlayer)
    #通知套装信息
    #ChEquip.SyncAllEquipAttrActiveInfo(curPlayer)
    #装备位宝石镶嵌通知
    #Operate_EquipStone.OnLogin(curPlayer)
    if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_VersionFix, ChConfig.Def_VerFix_LingGenShow):
@@ -316,6 +315,8 @@
        ePartStonePack.EquipCount = len(ePartStonePack.InfoList)  
        NetPackCommon.SendFakePack(curPlayer, ePartStonePack)
        
    Operate_EquipPlus.SyncEquipMasterPlusLVInfo(curPlayer)
    # 更新统计汇总值
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PlayerKey_EquipOrangeCount, orangeEquipCount)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalEquipStar, totalStar)
@@ -729,6 +730,8 @@
    #legendAttrDict = {}  #所有传奇属性
    equipScoreTotal = 0  #为解决装备评分、战力不一致的情况,装备战力改为由评分作为参数计算战力
    
    basePlusLVMin = None # 基础装备最小强化等级,计算大师强化属性用
    # 1. 循环遍历本阶装备
    for equipPlace in equipPartStarIndexList:
        ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, equipPlace)
@@ -808,8 +811,10 @@
            __CalcFuncAddEquipAttrPer(equipPlace, legendAttrID, legendAttrValue, equip_addEquipBaseAttrPerList)
        
        #物品强化属性
        __CalcAttr_ItemPlus(curPlayer, curEquip, packType, equipIndex, allAttrListPlus, plus_addEquipBaseAttrPerList)
        plusLV = __CalcAttr_ItemPlus(curPlayer, curEquip, packType, equipIndex, allAttrListPlus, plus_addEquipBaseAttrPerList)
        if isBaseEquip:
            basePlusLVMin = plusLV if basePlusLVMin == None else min(basePlusLVMin, plusLV)
        #计算装备宝石加成
        CalcEquipStone_Effect(curPlayer, equipIndex, allAttrListStone)
        
@@ -825,6 +830,8 @@
    # 2. 计算遍历后的附加属性
    #套装属性,暂归为星级套装属性
    CalcEquipSuiteAttr(curPlayer, suitCntDict, allAttrListStar)
    #大师
    __CalcMasterPlusLVAttr(curPlayer, classLV, basePlusLVMin, allAttrListPlus, plus_addEquipBaseAttrPerList)
    
#    GameWorld.DebugLog("    升星属性套装: %s" % (allAttrListEquip))
    
@@ -914,7 +921,7 @@
        return
        
    # 基础部位
    if effPlace == -2 and equipPlace in ChConfig.EquipPlace_Base:
    if effPlace == -2:
        basePlaceAddPerDict = addPerInfoList[1]
        for calcAttrIndex in calcAttrList:
            basePlaceAddPerDict[calcAttrIndex] = basePlaceAddPerDict.get(calcAttrIndex, 0) + attrValue
@@ -993,32 +1000,60 @@
    equipPartPlusEvolveLV = GetEquipPartPlusEvolveLV(curPlayer, packType, equipIndex)
    
    if not equipPartPlusLV:
        return
        return equipPartPlusLV
    plusType = GetEquipPlusType(curEquip)
    if plusType is None:
        return
        return equipPartPlusLV
    
    #GameWorld.DebugLog("    强化属性: plusType=%s,equipPartPlusLV=%s,equipPartPlusEvolveLV=%s" % (plusType, equipPartPlusLV, equipPartPlusEvolveLV))
    ipyData = IpyGameDataPY.GetIpyGameData("ItemPlus", plusType, equipPartPlusLV)
    if not ipyData:
        return
        return equipPartPlusLV
    attrTypeList, attrValueList = ipyData.GetAttrType(), ipyData.GetAttrValue()
    for i, attrID in enumerate(attrTypeList):
        #GameWorld.DebugLog("    强化基础属性: ID=%s +%s" % (attrID, attrValueList[i]))
        PlayerControl.CalcAttrDict_Type(attrID, attrValueList[i], allAttrList)
    
    if not equipPartPlusEvolveLV:
        return
        return equipPartPlusLV
    #进化属性
    equipPlace = curEquip.GetEquipPlace()
    ipyData = IpyGameDataPY.GetIpyGameData('EquipPlusEvolve', equipPlace, equipPartPlusEvolveLV)
    if not ipyData:
        return
        return equipPartPlusLV
    for attrID, attrValue in ipyData.GetAttr().items():
        #GameWorld.DebugLog("    强化进阶属性: ID=%s +%s" % (attrID, attrValue))
        PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)
        __CalcFuncAddEquipAttrPer(equipPlace, attrID, attrValue, plus_addEquipBaseAttrPerList)
        
    return equipPartPlusLV
def __CalcMasterPlusLVAttr(curPlayer, classLV, basePlusLVMin, allAttrListPlus, plus_addEquipBaseAttrPerList):
    ## 计算装备大师强化属性
    ipyDataList = IpyGameDataPY.GetIpyGameDataList("ItemPlusMaster", classLV)
    if not ipyDataList:
        return
    actMasterPlusLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartMasterPlusLV % classLV) # 已激活的最大大师等级
    for ipyData in ipyDataList:
        needMasterPlusLV = ipyData.GetMasterPlusLV()
        if basePlusLVMin < needMasterPlusLV:
            #GameWorld.DebugLog("    未达到大师强化等级! classLV=%s,basePlusLVMin=%s < needMasterPlusLV=%s" % (classLV, basePlusLVMin, needMasterPlusLV))
            continue
        if actMasterPlusLV < needMasterPlusLV:
            #GameWorld.DebugLog("    未激活大师强化等级! classLV=%s,actMasterPlusLV=%s < needMasterPlusLV=%s" % (classLV, actMasterPlusLV, needMasterPlusLV))
            continue
        attrIDList = ipyData.GetMasterPlusAttrIDList()
        attrValueList = ipyData.GetMasterPlusAttrValueList()
        for i, attrID in enumerate(attrIDList):
            attrValue = attrValueList[i]
            PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListPlus)
            __CalcFuncAddEquipAttrPer(None, attrID, attrValue, plus_addEquipBaseAttrPerList)
            #GameWorld.DebugLog("    强化大师属性! needMasterPlusLV=%s, attrID=%s + %s" % (needMasterPlusLV, attrID, attrValue))
    return
## 装备套装属性计算
@@ -1536,64 +1571,3 @@
    NetPackCommon.SendFakePack(curPlayer, ePartStarLVPack)
    return
#// A5 03 全身属性激活 #tagCMActiveAllEquipAttr
#
#struct    tagCMActiveAllEquipAttr
#
#{
#    tagHead        Head;
#    BYTE        Type;        //0强化 1星数
#    DWORD        Cnt;        //激活数量
#};
def OnActiveAllEquipAttr(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    activeType = clientData.Type
    activeCnt = clientData.Cnt
    if activeType == 0:
        key = ChConfig.Def_PDict_EquipActiveStarLV
#    elif activeType == 1:
#        key = ChConfig.Def_PDict_EquipActiveStars
    else:
        return
    curCnt = curPlayer.NomalDictGetProperty(key)
    if activeCnt <= curCnt:
        GameWorld.Log('    全身属性激活 该数量已激活过! activeType=%s,activeCnt=%s,curCnt=%s' % (activeType, activeCnt, curCnt))
        return
    PlayerControl.NomalDictSetProperty(curPlayer, key, activeCnt)
    SyncAllEquipAttrActiveInfo(curPlayer, activeType)
    #注意: 需要传装备阶触发刷属性,暂屏蔽,功能修改时再处理
    #else:
    #    RefreshPlayerEquipAttribute(curPlayer)
    #刷新所有属性
    playControl = PlayerControl.PlayerControl(curPlayer)
    playControl.RefreshPlayerAttrState()
    return
def SyncAllEquipAttrActiveInfo(curPlayer, activeType=-1):
    ## 通知全身属性激活数量
    packData = ChPyNetSendPack.tagMCAllEquipAttrActiveInfo()
    packData.ActiveInfo = []
    for aType in [0, 1]:
        if activeType != -1 and activeType != aType:
            continue
        if aType == 0:
            key = ChConfig.Def_PDict_EquipActiveStarLV
#        elif aType == 1:
#            key = ChConfig.Def_PDict_EquipActiveStars
        else:
            return
        curCnt = curPlayer.NomalDictGetProperty(key)
        activeInfo = ChPyNetSendPack.tagMCEquipActiveInfo()
        activeInfo.Type = aType
        activeInfo.Cnt = curCnt
        packData.ActiveInfo.append(activeInfo)
    packData.Count = len(packData.ActiveInfo)
    NetPackCommon.SendFakePack(curPlayer, packData)
    return