xdh
2019-03-05 0cb288fc2cad76d7cd8150a3e0b15bbe0eff2c1e
6307 【后端】【2.0】多套装备开发单(强化)
12个文件已修改
504 ■■■■ 已修改文件
PySysDB/PySysDBPY.h 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipPlus.py 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetEquipPartPlusLV.py 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py 87 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h
@@ -106,8 +106,7 @@
struct tagItemPlusMax
{
    BYTE        _Type;        //按装备位对应类型查找
    BYTE        _ItemRank;    // 装备阶数
    BYTE        _ItemColor;    //装备颜色 如橙装
    BYTE        _Star;    // 装备星数
    WORD        LevelMax;    //强化等级上限
};
@@ -1776,4 +1775,15 @@
    dict        CostItemDict;    //特殊材料
    dict        StarAttrInfo;    //星级属性
    dict        BaseAttrInfo;    //基础属性增加
};
//装备强化进化表
struct tagEquipPlusEvolve
{
    BYTE        _EquipPlace;    //装备位
    BYTE        _EvolveLV;    //进化等级
    WORD        NeedPlusLV;    //需要强化等级
    dict        CostItem;    //消耗材料
    dict        Attr;    //属性
};
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -6244,6 +6244,58 @@
#------------------------------------------------------
# A3 16 装备强化进化 #tagCMEquipPlusEvolve
class  tagCMEquipPlusEvolve(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("ItemIndex", c_ushort),    #装备在背包中索引
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA3
        self.SubCmd = 0x16
        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 = 0xA3
        self.SubCmd = 0x16
        self.ItemIndex = 0
        return
    def GetLength(self):
        return sizeof(tagCMEquipPlusEvolve)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A3 16 装备强化进化 //tagCMEquipPlusEvolve:
                                Cmd:%s,
                                SubCmd:%s,
                                ItemIndex:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.ItemIndex
                                )
        return DumpString
m_NAtagCMEquipPlusEvolve=tagCMEquipPlusEvolve()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMEquipPlusEvolve.Cmd,m_NAtagCMEquipPlusEvolve.SubCmd))] = m_NAtagCMEquipPlusEvolve
#------------------------------------------------------
#A3 05 宝石摘取 #tagCMEquipStonePick
class  tagCMEquipStonePick(Structure):
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -15487,15 +15487,16 @@
#------------------------------------------------------
# A3 B3 装备部位星级信息 #tagMCEquipPartStarLVInfo
# A3 B3 装备部位强化信息 #tagMCEquipPartPlusInfo
class  tagMCEquipPartStarLV(Structure):
class  tagMCEquipPartPlusLV(Structure):
    _pack_ = 1
    _fields_ = [
                  ("PackType", c_ubyte),    
                  ("EquipIndex", c_ubyte),    
                  ("EquipPartStarLV", c_ushort),    
                  ("Proficiency", c_int),    
                  ("EvolveLV", c_ubyte),
                  ]
    def __init__(self):
@@ -15512,34 +15513,37 @@
        self.EquipIndex = 0
        self.EquipPartStarLV = 0
        self.Proficiency = 0
        self.EvolveLV = 0
        return
    def GetLength(self):
        return sizeof(tagMCEquipPartStarLV)
        return sizeof(tagMCEquipPartPlusLV)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A3 B3 装备部位星级信息 //tagMCEquipPartStarLVInfo:
        DumpString = '''// A3 B3 装备部位强化信息 //tagMCEquipPartPlusInfo:
                                PackType:%d,
                                EquipIndex:%d,
                                EquipPartStarLV:%d,
                                Proficiency:%d
                                Proficiency:%d,
                                EvolveLV:%d
                                '''\
                                %(
                                self.PackType,
                                self.EquipIndex,
                                self.EquipPartStarLV,
                                self.Proficiency
                                self.Proficiency,
                                self.EvolveLV
                                )
        return DumpString
class  tagMCEquipPartStarLVInfo(Structure):
class  tagMCEquipPartPlusInfo(Structure):
    Head = tagHead()
    Count = 0    #(BYTE Count)// 信息个数
    InfoList = list()    #(vector<tagMCEquipPartStarLV> InfoList)// 信息列表
    InfoList = list()    #(vector<tagMCEquipPartPlusLV> InfoList)// 信息列表
    data = None
    def __init__(self):
@@ -15553,7 +15557,7 @@
        _pos = self.Head.ReadData(_lpData, _pos)
        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.Count):
            temInfoList = tagMCEquipPartStarLV()
            temInfoList = tagMCEquipPartPlusLV()
            _pos = temInfoList.ReadData(_lpData, _pos)
            self.InfoList.append(temInfoList)
        return _pos
@@ -15598,8 +15602,8 @@
        return DumpString
m_NAtagMCEquipPartStarLVInfo=tagMCEquipPartStarLVInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCEquipPartStarLVInfo.Head.Cmd,m_NAtagMCEquipPartStarLVInfo.Head.SubCmd))] = m_NAtagMCEquipPartStarLVInfo
m_NAtagMCEquipPartPlusInfo=tagMCEquipPartPlusInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCEquipPartPlusInfo.Head.Cmd,m_NAtagMCEquipPartPlusInfo.Head.SubCmd))] = m_NAtagMCEquipPartPlusInfo
#------------------------------------------------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -56,12 +56,16 @@
Writer = wdb
Releaser = wdb
RegType = 0
RegisterPackCount = 1
RegisterPackCount = 2
PacketCMD_1=0xA3
PacketSubCMD_1=0x01
PacketCallFunc_1=OnEquipMayaPlus
PacketCMD_2=0xA3
PacketSubCMD_2=0x16
PacketCallFunc_2=OnEquipPlusEvolve
;npc交互
[FunctionNPCCommon]
ScriptName = Event\EventSrc\FunctionNPCCommon.py
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3605,12 +3605,13 @@
Def_PDict_RunTaskAwardState = "RunTaskAwardState_%s" # 是否已领取跑环本轮结束奖励 参数任务类型
Def_PDict_RunTaskAwardRecord = "RunTaskAwardRecord_%s" # 跑环本轮结束奖励记录 参数任务类型
Def_PDict_RunTaskNextMissionID = "RunTaskNextMissionID_%s" # 跑环本轮结束下个任务ID 参数任务类型
# 宝石
#强化
Def_PDict_EquipPartPlusLV = "EPPlusLV_%s_%s" # 装备部位对应公共强化星级,参数为(packType, index)
Def_PDict_EquipActiveStarLV = "EquipActiveStarLV" #装备已激活总强化等级
Def_PDict_EquipPartProficiency = "EPProf_%s_%s" # 装备部位对应公共强化星级,参数为(packType, index)
Def_PDict_EquipActiveStars = "EquipActiveStars" #装备已激活总强化星级
Def_PDict_EquipPartProficiency = "EPProf_%s_%s" # 装备部位对应公共强化熟练度,参数为(packType, index)
Def_PDict_EquipPartPlusEvolveLV = "EPPlusEvolveLV_%s_%s" # 装备部位对应公共强化进化等级,参数为(packType, index)
# 宝石
Def_PDict_EquipPartStoneID = "StoneID_%s_%s" # 装备位_孔位存储宝石ID*10+是(1)否(0)绑定
# 装备洗练, 暂不区分背包类型,如果有不同背包,策划设定不同的装备位
@@ -4927,7 +4928,8 @@
ItemDel_CoatDecompose, # 时装分解
ItemDel_ZhuXianDecompose, # 诛仙装备分解
ItemDel_EquipStarUp, # 装备升星
) = range(2000, 2000 + 39)
ItemDel_EquipPlusEvolve, # 装备强化进化
) = range(2000, 2000 + 40)
# 物品扣除类型对应信息 {类型:eventName, ...}
ItemDelTypeDict = {
@@ -4970,6 +4972,7 @@
                   ItemDel_CoatDecompose:"CoatDecompose",
                   ItemDel_ZhuXianDecompose:"ZhuXianDecompose",
                   ItemDel_EquipStarUp:"EquipStarUp",
                   ItemDel_EquipPlusEvolve:"EquipPlusEvolve",
                   }
##==================================================================================================
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -6244,6 +6244,58 @@
#------------------------------------------------------
# A3 16 装备强化进化 #tagCMEquipPlusEvolve
class  tagCMEquipPlusEvolve(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("ItemIndex", c_ushort),    #装备在背包中索引
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA3
        self.SubCmd = 0x16
        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 = 0xA3
        self.SubCmd = 0x16
        self.ItemIndex = 0
        return
    def GetLength(self):
        return sizeof(tagCMEquipPlusEvolve)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A3 16 装备强化进化 //tagCMEquipPlusEvolve:
                                Cmd:%s,
                                SubCmd:%s,
                                ItemIndex:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.ItemIndex
                                )
        return DumpString
m_NAtagCMEquipPlusEvolve=tagCMEquipPlusEvolve()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMEquipPlusEvolve.Cmd,m_NAtagCMEquipPlusEvolve.SubCmd))] = m_NAtagCMEquipPlusEvolve
#------------------------------------------------------
#A3 05 宝石摘取 #tagCMEquipStonePick
class  tagCMEquipStonePick(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -15487,15 +15487,16 @@
#------------------------------------------------------
# A3 B3 装备部位星级信息 #tagMCEquipPartStarLVInfo
# A3 B3 装备部位强化信息 #tagMCEquipPartPlusInfo
class  tagMCEquipPartStarLV(Structure):
class  tagMCEquipPartPlusLV(Structure):
    _pack_ = 1
    _fields_ = [
                  ("PackType", c_ubyte),    
                  ("EquipIndex", c_ubyte),    
                  ("EquipPartStarLV", c_ushort),    
                  ("Proficiency", c_int),    
                  ("EvolveLV", c_ubyte),
                  ]
    def __init__(self):
@@ -15512,34 +15513,37 @@
        self.EquipIndex = 0
        self.EquipPartStarLV = 0
        self.Proficiency = 0
        self.EvolveLV = 0
        return
    def GetLength(self):
        return sizeof(tagMCEquipPartStarLV)
        return sizeof(tagMCEquipPartPlusLV)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A3 B3 装备部位星级信息 //tagMCEquipPartStarLVInfo:
        DumpString = '''// A3 B3 装备部位强化信息 //tagMCEquipPartPlusInfo:
                                PackType:%d,
                                EquipIndex:%d,
                                EquipPartStarLV:%d,
                                Proficiency:%d
                                Proficiency:%d,
                                EvolveLV:%d
                                '''\
                                %(
                                self.PackType,
                                self.EquipIndex,
                                self.EquipPartStarLV,
                                self.Proficiency
                                self.Proficiency,
                                self.EvolveLV
                                )
        return DumpString
class  tagMCEquipPartStarLVInfo(Structure):
class  tagMCEquipPartPlusInfo(Structure):
    Head = tagHead()
    Count = 0    #(BYTE Count)// 信息个数
    InfoList = list()    #(vector<tagMCEquipPartStarLV> InfoList)// 信息列表
    InfoList = list()    #(vector<tagMCEquipPartPlusLV> InfoList)// 信息列表
    data = None
    def __init__(self):
@@ -15553,7 +15557,7 @@
        _pos = self.Head.ReadData(_lpData, _pos)
        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.Count):
            temInfoList = tagMCEquipPartStarLV()
            temInfoList = tagMCEquipPartPlusLV()
            _pos = temInfoList.ReadData(_lpData, _pos)
            self.InfoList.append(temInfoList)
        return _pos
@@ -15598,8 +15602,8 @@
        return DumpString
m_NAtagMCEquipPartStarLVInfo=tagMCEquipPartStarLVInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCEquipPartStarLVInfo.Head.Cmd,m_NAtagMCEquipPartStarLVInfo.Head.SubCmd))] = m_NAtagMCEquipPartStarLVInfo
m_NAtagMCEquipPartPlusInfo=tagMCEquipPartPlusInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCEquipPartPlusInfo.Head.Cmd,m_NAtagMCEquipPartPlusInfo.Head.SubCmd))] = m_NAtagMCEquipPartPlusInfo
#------------------------------------------------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipPlus.py
@@ -60,9 +60,12 @@
    if packType not in ChConfig.Pack_EquipPart_CanPlusStar:
        GameWorld.DebugLog("packType not in ChConfig.Pack_EquipPart_CanPlusStar", playerID)
        return
    ipyData = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'GridIndex':index})
    if not ipyData:
        return
    equipPlace = ipyData.GetEquipPlace()
    indexList = ChConfig.Pack_EquipPart_CanPlusStar[packType]
    if index not in indexList:
    if equipPlace not in indexList:
        GameWorld.Log("    index not in ChConfig.Pack_EquipPart_CanPlusStar", playerID)
        return
    
@@ -74,17 +77,17 @@
        GameWorld.DebugLog("OnEquipMayaPlus() equip is empty")
        return
    
    maxStarLV = ItemCommon.GetItemMaxPlusLV(curEquip)
    curPartStarLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, index)
    if curPartStarLV >= maxStarLV:
        GameWorld.Log("OnEquipMayaPlus:curPartStarLV(%s) >= maxStarLV(%s)" % (curPartStarLV, maxStarLV), playerID)
    maxPlusLV = ItemCommon.GetItemMaxPlusLV(curPlayer, index, curEquip)
    curPartPlusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, index)
    if curPartPlusLV >= maxPlusLV:
        GameWorld.Log("OnEquipMayaPlus:curPartPlusLV(%s) >= maxPlusLV(%s)" % (curPartPlusLV, maxPlusLV), playerID)
        return
    # 强化处理
    result = DoLogic_EquipMayaPlus(curPlayer, curEquip, packType, index)
    
    updPartStarLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, index)
    #GameWorld.Log("    result=%s,curStarLV=%s,updStarLV=%s" % (result, curPartStarLV, updPartStarLV), playerID)
    updPartPlusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, index)
    #GameWorld.Log("    result=%s,curStarLV=%s,updStarLV=%s" % (result, curPartPlusLV, updPartStarLV), playerID)
    if result == ChConfig.Def_ComposeState_None:
        return
    
@@ -98,8 +101,8 @@
    
    # 强化变更时处理
    if curPartStarLV != updPartStarLV:
        DoLogic_OnEquipPartStarLVChange(curPlayer, packType)
    if curPartPlusLV != updPartPlusLV:
        DoLogic_OnEquipPartStarLVChange(curPlayer, packType, ItemCommon.GetItemClassLV(curEquip))
        # 增加强化成就
        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_EquipPlus, 1)
        EventShell.EventRespons_EquipPlus(curPlayer)
@@ -117,8 +120,8 @@
    if findType == -1:
        return result
    
    curPartStarLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, index)
    ipyData = IpyGameDataPY.GetIpyGameData("ItemPlus", findType, curPartStarLV)
    curPartPlusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, index)
    ipyData = IpyGameDataPY.GetIpyGameData("ItemPlus", findType, curPartPlusLV)
    if not ipyData:
        return
    costSilver = ipyData.GetCostCount()
@@ -132,7 +135,7 @@
    if curExp >= totalExp:
        #升级
        curPartStarLV = __EquipMayaPlusChange(curPlayer, packType, curEquip, index)
        curPartPlusLV = __EquipMayaPlusChange(curPlayer, packType, curEquip, index)
        curExp = curExp - totalExp
        
    ChEquip.SetEquipPartProficiency(curPlayer, packType, index, curExp)
@@ -140,7 +143,7 @@
    # 支付金币
    PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, costSilver, isNotify=False)
    DataRecordPack.DR_UpStarLVSuccess(curPlayer, curExp, curPartStarLV)
    DataRecordPack.DR_UpStarLVSuccess(curPlayer, curExp, curPartPlusLV)
    return ChConfig.Def_ComposeState_Sucess
@@ -165,9 +168,7 @@
        
    # 成就
    #PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_EquipPlusLV, 1, [updPlusLV])
    #任务触发
    #EventShell.EventRespons_OnEquipPartStarUp(curPlayer, setLV)
    # 开服活动数据
@@ -175,24 +176,55 @@
    return updPlusLV
def DoLogic_OnEquipPartStarLVChange(curPlayer, packType):
def DoLogic_OnEquipPartStarLVChange(curPlayer, packType, classLV):
    #先刷装备BUFF 再计算属性
    curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrActivatyNotify, ChConfig.Def_AttrActivatyNotify_Plus)
    ChEquip.RefreshPlayerEquipAttribute(curPlayer)
    ChEquip.RefreshPlayerEquipAttribute(curPlayer, classLV)
    
    #刷新所有属性
    playControl = PlayerControl.PlayerControl(curPlayer)
    playControl.RefreshPlayerAttrState()
    return
## 全身12部位强化等级最低的一件强化等级
#def GetMinPlusLV(curPlayer):
#    packType = IPY_GameWorld.rptEquip
#    minPlusLV = GetMaxEquipPartStarLV()
#    equipPartIndexList = ChConfig.Pack_EquipPart_CanPlusStar.get(packType, [])
#    for i in equipPartIndexList:
#        partStarLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, i)
#        if partStarLV < minPlusLV:
#            minPlusLV = partStarLV
#    return minPlusLV
#// A3 16 装备强化进化 #tagCMEquipPlusEvolve
#struct    tagCMEquipPlusEvolve
#{
#    tagHead        Head;
#    WORD        ItemIndex;        //装备在背包中索引
#};
def OnEquipPlusEvolve(playerIndex, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)
    equipPackindex = clientData.ItemIndex
    packType = IPY_GameWorld.rptEquip
    curPack = curPlayer.GetItemManager().GetPack(packType)
    curEquip = curPack.GetAt(equipPackindex)
    if not ItemCommon.CheckItemCanUse(curEquip):
        return
    curEvolveLV = ChEquip.GetEquipPartPlusEvolveLV(curPlayer, packType, equipPackindex)
    maxEvolveLV = ItemCommon.GetItemMaxPlusEvolveLV(curPlayer, equipPackindex, curEquip)
    if curEvolveLV >= maxEvolveLV:
        GameWorld.DebugLog('装备强化进化, 已达最大进化等级equipPackindex=%s, maxEvolveLV=%s'%(equipPackindex, maxEvolveLV))
        return
    nextEvolveLV = curEvolveLV + 1
    equipPlace = curEquip.GetEquipPlace()
    ipyData = IpyGameDataPY.GetIpyGameData('EquipPlusEvolve', equipPlace, nextEvolveLV)
    if not ipyData:
        return
    costItemDict = ipyData.GetCostItem()
    delItemDict = {}
    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
    for itemID, itemCnt in costItemDict.items():
        hasEnough, indexList, findItemIsBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(itemID, itemPack, itemCnt)
        if not hasEnough:
            GameWorld.DebugLog('装备强化进化 材料不足itemID= %s,itemCnt=%s'%(itemID, itemCnt))
            return
        delItemDict[tuple(indexList)] = itemCnt
    for itemIndexList, delCnt in delItemDict.items():
        ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, delCnt, True, ChConfig.ItemDel_EquipPlusEvolve)
    ChEquip.SetEquipPartPlusEvolveLV(curPlayer, packType, equipPackindex, nextEvolveLV)
    DoLogic_OnEquipPartStarLVChange(curPlayer, packType, ItemCommon.GetItemClassLV(curEquip))
    ChEquip.NotifyEquipPartPlusLV(curPlayer, packType, equipPackindex)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetEquipPartPlusLV.py
@@ -22,7 +22,7 @@
import ChEquip
import GameWorld
import ItemCommon
import IpyGameDataPY
#---------------------------------------------------------------------
#逻辑实现
## GM命令执行入口
@@ -34,41 +34,49 @@
    if not cmdList:
        __GMHelpAnswer(curPlayer)
        return
    if len(cmdList) == 1:
        setStarLV = cmdList[0]
        for pType, indexList in ChConfig.Pack_EquipPart_CanPlusStar.items():
            for i in indexList:
                curPack = curPlayer.GetItemManager().GetPack(pType)
                curEquip = curPack.GetAt(i)
                ChEquip.SetEquipPartPlusLV(curPlayer, pType, i, curEquip, setStarLV)
                ChEquip.SetEquipPartProficiency(curPlayer, pType, i, 0)
            Operate_EquipPlus.DoLogic_OnEquipPartStarLVChange(curPlayer, pType)
    packType = IPY_GameWorld.rptEquip
    curPack = curPlayer.GetItemManager().GetPack(packType)
    if len(cmdList) == 2:
        setStarLV = cmdList[1]
        classLV = cmdList[0]
        for equipPlace in ChConfig.Pack_EquipPart_CanPlusStar.get(packType, []):
            ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, equipPlace)
            if not ipyData:
                continue
            gridIndex = ipyData.GetGridIndex()
            curEquip = curPack.GetAt(gridIndex)
            ChEquip.SetEquipPartPlusLV(curPlayer, packType, gridIndex, curEquip, setStarLV)
            ChEquip.SetEquipPartProficiency(curPlayer, packType, gridIndex, 0)
            ChEquip.SetEquipPartPlusEvolveLV(curPlayer, packType, gridIndex, 0)
            Operate_EquipPlus.DoLogic_OnEquipPartStarLVChange(curPlayer, packType, classLV)
        ChEquip.NotifyEquipPartPlusLV(curPlayer)
        GameWorld.DebugAnswer(curPlayer, "设置所有部位强化等级为: %s" % setStarLV)
        GameWorld.DebugAnswer(curPlayer, "设置%s阶所有部位强化等级为: %s" % (classLV, setStarLV))
        return
    
    if len(cmdList) != 3:
        __GMHelpAnswer(curPlayer, "参数错误!")
        return
    
    packType, index, starLV = cmdList
    classLV, equipPlace, starLV = cmdList
    if packType not in ChConfig.Pack_EquipPart_CanPlusStar:
        __GMHelpAnswer(curPlayer, "packType不存在!")
        return
    
    if index not in ChConfig.Pack_EquipPart_CanPlusStar[packType]:
    if equipPlace not in ChConfig.Pack_EquipPart_CanPlusStar[packType]:
        __GMHelpAnswer(curPlayer, "index索引不存在!")
        return
    curPack = curPlayer.GetItemManager().GetPack(packType)
    curEquip = curPack.GetAt(index)
    maxStarLV = ItemCommon.GetItemMaxPlusLV(curEquip)
    ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, equipPlace)
    if not ipyData:
        return
    gridIndex = ipyData.GetGridIndex()
    curEquip = curPack.GetAt(gridIndex)
    if not ItemCommon.CheckItemCanUse(curEquip):
        return
    maxStarLV = ItemCommon.GetItemMaxPlusLV(curPlayer, gridIndex, curEquip)
    starLV = min(starLV, maxStarLV)
    ChEquip.SetEquipPartPlusLV(curPlayer, packType, index, curEquip, starLV)
    ChEquip.SetEquipPartProficiency(curPlayer, packType, index, 0)
    Operate_EquipPlus.DoLogic_OnEquipPartStarLVChange(curPlayer, packType)
    ChEquip.SetEquipPartPlusLV(curPlayer, packType, gridIndex, curEquip, starLV)
    ChEquip.SetEquipPartProficiency(curPlayer, packType, gridIndex, 0)
    Operate_EquipPlus.DoLogic_OnEquipPartStarLVChange(curPlayer, packType, classLV)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -113,8 +113,7 @@
                "ItemPlusMax":(
                        ("BYTE", "Type", 1),
                        ("BYTE", "ItemRank", 1),
                        ("BYTE", "ItemColor", 1),
                        ("BYTE", "Star", 1),
                        ("WORD", "LevelMax", 0),
                        ),
@@ -1384,6 +1383,14 @@
                        ("dict", "StarAttrInfo", 0),
                        ("dict", "BaseAttrInfo", 0),
                        ),
                "EquipPlusEvolve":(
                        ("BYTE", "EquipPlace", 1),
                        ("BYTE", "EvolveLV", 1),
                        ("WORD", "NeedPlusLV", 0),
                        ("dict", "CostItem", 0),
                        ("dict", "Attr", 0),
                        ),
                }
@@ -1557,14 +1564,12 @@
    
    def __init__(self):
        self.Type = 0
        self.ItemRank = 0
        self.ItemColor = 0
        self.Star = 0
        self.LevelMax = 0
        return
        
    def GetType(self): return self.Type # 按装备位对应类型查找
    def GetItemRank(self): return self.ItemRank #  装备阶数
    def GetItemColor(self): return self.ItemColor # 装备颜色 如橙装
    def GetStar(self): return self.Star #  装备星数
    def GetLevelMax(self): return self.LevelMax # 强化等级上限
# 装备全身强化属性
@@ -4228,6 +4233,23 @@
    def GetCostItemDict(self): return self.CostItemDict # 特殊材料
    def GetStarAttrInfo(self): return self.StarAttrInfo # 星级属性
    def GetBaseAttrInfo(self): return self.BaseAttrInfo # 基础属性增加
# 装备强化进化表
class IPY_EquipPlusEvolve():
    def __init__(self):
        self.EquipPlace = 0
        self.EvolveLV = 0
        self.NeedPlusLV = 0
        self.CostItem = {}
        self.Attr = {}
        return
    def GetEquipPlace(self): return self.EquipPlace # 装备位
    def GetEvolveLV(self): return self.EvolveLV # 进化等级
    def GetNeedPlusLV(self): return self.NeedPlusLV # 需要强化等级
    def GetCostItem(self): return self.CostItem # 消耗材料
    def GetAttr(self): return self.Attr # 属性
def Log(msg, playerID=0, par=0):
@@ -4525,6 +4547,8 @@
        self.ipyEquipPlaceIndexMapLen = len(self.ipyEquipPlaceIndexMapCache)
        self.ipyEquipStarUpCache = self.__LoadFileData("EquipStarUp", IPY_EquipStarUp)
        self.ipyEquipStarUpLen = len(self.ipyEquipStarUpCache)
        self.ipyEquipPlusEvolveCache = self.__LoadFileData("EquipPlusEvolve", IPY_EquipPlusEvolve)
        self.ipyEquipPlusEvolveLen = len(self.ipyEquipPlusEvolveCache)
        Log("IPY_FuncConfig count=%s" % len(self.ipyFuncConfigDict))
        Log("IPY_DataMgr InitOK!")
        return
@@ -4963,6 +4987,8 @@
    def GetEquipPlaceIndexMapByIndex(self, index): return self.ipyEquipPlaceIndexMapCache[index]
    def GetEquipStarUpCount(self): return self.ipyEquipStarUpLen
    def GetEquipStarUpByIndex(self, index): return self.ipyEquipStarUpCache[index]
    def GetEquipPlusEvolveCount(self): return self.ipyEquipPlusEvolveLen
    def GetEquipPlusEvolveByIndex(self, index): return self.ipyEquipPlusEvolveCache[index]
IPYData = IPY_DataMgr()
def IPY_Data(): return IPYData
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py
@@ -455,7 +455,7 @@
    
    allAttrListStar = [{} for _ in range(4)]  # 星数属性
    #allAttrListEquip = [{} for _ in range(4)]  # 装备其他
    #allAttrListPlusBase = [{} for _ in range(4)]  # 基础强化属性
    allAttrListPlusBase = [{} for _ in range(4)]  # 基础强化属性
    allAttrListStone = [{} for _ in range(4)]  # 宝石属性
    allAttrListSuit = [{} for _ in range(4)]  # 套装属性
    allAttrListWash = [{} for _ in range(4)]  # 洗练属性
@@ -510,15 +510,6 @@
#                PlayerControl.CalcAttrDict_Type(effectID, effectValue, allAttrListEquip)
#            baseEquipAttrDict[effectID] = baseEquipAttrDict.get(effectID, 0) + effectValue
            
#        groupType = GetEquipPartSuiteGroupType(curPlayer, equipIndex)
#        for suiteType in range(1, maxSuiteType + 1):
#            suitelv = GetEquipPartSuiteLV(curPlayer, equipIndex, suiteType)
#            if suitelv:
#                maxSuiteLV = Operate_EquipSuitCompose.GetEquipCanDoMaxSuiteLV(curPlayer, curEquip, suiteType, groupType)
#                suiteLV = min(suitelv, maxSuiteLV)
#                if suiteLV:
#                    suiteKey = '%s_%s_%s' % (groupType, suiteType, suitelv)
#                    suitCntDict[suiteKey] = suitCntDict.get(suiteKey, 0) + 1
        
        #星数属性
        equipPartStar = GetEquipPartStarByRank(curPlayer, equipIndex, curEquip) #生效的星数
@@ -532,10 +523,10 @@
                suitCntDict[suiteID] = []
            suitCntDict[suiteID].append(equipPartStar)
        
        #物品强化属性,佩饰强化不同要区分
#        if equipIndex in equipPartStarIndexList:
#            equipPartStarLV = GetEquipPartPlusLVByRank(curPlayer, packType, equipIndex, curEquip)
#            CalcAttr_ItemPlus(curPlayer, curEquip, allAttrListPlusBase, equipPartStarLV)
        #物品强化属性
        equipPartPlusLV = GetEquipPartPlusLVByRank(curPlayer, packType, equipIndex, curEquip)
        equipPartPlusEvolveLV = GetEquipPartPlusEvolveLVByEquip(curPlayer, packType, equipIndex, curEquip)
        CalcAttr_ItemPlus(curPlayer, curEquip, allAttrListPlusBase, equipPartPlusLV, equipPartPlusEvolveLV)
        
        #传奇属性
        #CalcAttr_LegendAttr(curPlayer, curEquip, allAttrListEquip, legendAttrDict)
@@ -654,7 +645,7 @@
#  @param curPlayer 当前玩家
#  @param curPlayer allAttrList 属性缓存
#  @return None
def CalcAttr_ItemPlus(curPlayer, curEquip, allAttrList, equipPartStarLV=None):
def CalcAttr_ItemPlus(curPlayer, curEquip, allAttrList, equipPartStarLV, equipPartPlusEvolveLV):
    if not equipPartStarLV:
        return
    plusType = GetEquipPlusType(curEquip)
@@ -667,6 +658,14 @@
    attrTypeList, attrValueList = ipyData.GetAttrType(), ipyData.GetAttrValue()
    for i, attrID in enumerate(attrTypeList):
        PlayerControl.CalcAttrDict_Type(attrID, attrValueList[i], allAttrList)
    #进化属性
    equipPlace = curEquip.GetEquipPlace()
    ipyData = IpyGameDataPY.GetIpyGameData('EquipPlusEvolve', equipPlace, equipPartPlusEvolveLV)
    if not ipyData:
        return
    for attrID, attrValue in ipyData.GetAttr().items():
        PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)
    return
@@ -889,19 +888,40 @@
    oldEquipShowSwitch = curPlayer.GetEquipShowSwitch()
    if updEquipShowSwitch == oldEquipShowSwitch:
        return
    classLV, isSuite = updEquipShowSwitch/10, updEquipShowSwitch%10
    equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
    #验证套装
    realSuit=True
    for place in ChConfig.Def_SuitEquipPlaceList:
        ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, place)
        if not ipyData:
            realSuit = False
            break
        gridIndex = ipyData.GetGridIndex()
        curEquip = equipPack.GetAt(gridIndex)
        if not ItemCommon.CheckItemCanUse(curEquip):
            realSuit = False
            break
        if not curEquip.GetSuiteID():
            realSuit = False
            break
    if realSuit != isSuite:
        GameWorld.DebugLog('SetEquipShowSwitch 前端发的isSuite 和实际不一致!')
        return
    
    #通知外观装备
    updFaceEquipIndex = 0
    equipIndexList = []
    for equipPlace in [ShareDefine.retWeapon, ShareDefine.retWeapon2, ShareDefine.retClothes]:
        ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', 1, equipPlace)
        ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, equipPlace)
        if not ipyData:
            continue
        gridIndex = ipyData.GetGridIndex()
        updFaceEquipIndex = updFaceEquipIndex * 1000 + gridIndex
        equipIndexList.append(gridIndex)
    PlayerControl.SetFaceEquipIndex(curPlayer, updFaceEquipIndex)
    equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
    for equipPackIndex in equipIndexList:
        curEquip = equipPack.GetAt(equipPackIndex)
        if not ItemCommon.CheckItemCanUse(curEquip):
@@ -930,7 +950,7 @@
## 获取公共部位强化星级, 因装备的最高可强化星级影响,用于算当前装备属性使用, 不影响全身星级
def GetEquipPartPlusLVByRank(curPlayer, packType, index, curEquip):
    maxStarLV = ItemCommon.GetItemMaxPlusLV(curEquip)
    maxStarLV = ItemCommon.GetItemMaxPlusLV(curPlayer, index, curEquip)
    return min(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartPlusLV % (packType, index)), maxStarLV)
@@ -953,9 +973,27 @@
    return
## 获取公共部位强化进化等级, 用于算当前装备属性使用, 不影响全身星级
def GetEquipPartPlusEvolveLVByEquip(curPlayer, packType, index, curEquip):
    maxEvolveLV = ItemCommon.GetItemMaxPlusEvolveLV(curPlayer, index, curEquip)
    return min(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartPlusEvolveLV % (packType, index)), maxEvolveLV)
## 获取公共部位强化进化等级
def GetEquipPartPlusEvolveLV(curPlayer, packType, index):
    return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartPlusEvolveLV % (packType, index))
## 设置公共部位强化进化等级
def SetEquipPartPlusEvolveLV(curPlayer, packType, index, evolveLV):
    if GetEquipPartPlusEvolveLV(curPlayer, packType, index) == evolveLV:
        return
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartPlusEvolveLV % (packType, index), evolveLV)
    return
## 通知公共部位强化等级
def NotifyEquipPartPlusLV(curPlayer, packType=None, index=None):
    ePartStarLVPack = ChPyNetSendPack.tagMCEquipPartStarLVInfo()
    ePartStarLVPack = ChPyNetSendPack.tagMCEquipPartPlusInfo()
    ePartStarLVPack.Clear()
    ePartStarLVPack.InfoList = []
    
@@ -969,12 +1007,13 @@
                if index != None and index != i:
                    continue
            
            ePartStarLV = ChPyNetSendPack.tagMCEquipPartStarLV()
            ePartStarLV = ChPyNetSendPack.tagMCEquipPartPlusLV()
            ePartStarLV.Clear()
            ePartStarLV.PackType = pType
            ePartStarLV.EquipIndex = i
            ePartStarLV.EquipPartStarLV = GetEquipPartPlusLV(curPlayer, pType, i)
            ePartStarLV.Proficiency = GetEquipPartProficiency(curPlayer, pType, i)
            ePartStarLV.EvolveLV = GetEquipPartPlusEvolveLV(curPlayer, pType, i)
            ePartStarLVPack.InfoList.append(ePartStarLV)
            
    ePartStarLVPack.Count = len(ePartStarLVPack.InfoList)
@@ -1167,8 +1206,8 @@
    activeCnt = clientData.Cnt
    if activeType == 0:
        key = ChConfig.Def_PDict_EquipActiveStarLV
    elif activeType == 1:
        key = ChConfig.Def_PDict_EquipActiveStars
#    elif activeType == 1:
#        key = ChConfig.Def_PDict_EquipActiveStars
    else:
        return
    curCnt = curPlayer.NomalDictGetProperty(key)
@@ -1199,8 +1238,8 @@
            continue
        if aType == 0:
            key = ChConfig.Def_PDict_EquipActiveStarLV
        elif aType == 1:
            key = ChConfig.Def_PDict_EquipActiveStars
#        elif aType == 1:
#            key = ChConfig.Def_PDict_EquipActiveStars
        else:
            return
        curCnt = curPlayer.NomalDictGetProperty(key)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py
@@ -1925,7 +1925,7 @@
## 获取物品最高强化等级
#  @param itemType: 物品类型
#  @return 最大星级,0为不可强化
def GetItemMaxPlusLV(curItem):
def GetItemMaxPlusLV(curPlayer, equipPackindex, curItem):
    equipPlace = curItem.GetEquipPlace()
    plusMaxTypeDict = IpyGameDataPY.GetFuncEvalCfg("StrengthenLevelLimit", 1)
    if not plusMaxTypeDict:
@@ -1935,19 +1935,41 @@
    if equipPlace not in plusMaxTypeDict:
        return 0
    findType = plusMaxTypeDict[equipPlace]
    #仙器特殊取固定值
    if equipPlace in [ShareDefine.retFairyCan, ShareDefine.retFairyCan2]:
        rank = 0
        itemColor = 0
    else:
        rank = GetItemClassLV(curItem)
        itemColor = curItem.GetItemColor()
    ipyData = IpyGameDataPY.GetIpyGameData("ItemPlusMax", findType, rank, itemColor)
    if not ipyData:
        GameWorld.ErrLog("找不到装备强化等级上限表数据配置! rank = %s, %s" % (rank , curItem.GetItemQuality()))
        return
    equipStar = ChEquip.GetEquipPartStarByRank(curPlayer, equipPackindex, curItem)
    ipyData = IpyGameDataPY.GetIpyGameDataNotLog("ItemPlusMax", findType, equipStar)
    if ipyData:
        return ipyData.GetLevelMax()
    
    return ipyData.GetLevelMax()
    ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('ItemPlusMax', {'Type':findType}, True, False)
    if not ipyDataList:
        return 0
    maxStar = ipyDataList[-1].GetStar()
    if equipStar > maxStar:
        return ipyDataList[-1].GetLevelMax()
    findMax = 0
    for ipyData in ipyDataList:
        if equipStar >= ipyData.GetStar():
            findMax = ipyData.GetLevelMax()
    return findMax
## 获取物品最高强化进化等级
#  @param itemType: 物品类型
#  @return 最大星级,0为不可强化
def GetItemMaxPlusEvolveLV(curPlayer, equipPackindex, curItem):
    packType = IPY_GameWorld.rptEquip
    curPlusLV = ChEquip.GetEquipPartPlusLVByRank(curPlayer, packType, equipPackindex, curItem)
    equipPlace = curItem.GetEquipPlace()
    ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlusEvolve', {'EquipPlace':equipPlace}, True)
    if not ipyDataList:
        return 0
    maxEvolvelv = 0
    for ipyData in ipyDataList:
        if curPlusLV >= ipyData.GetNeedPlusLV():
            maxEvolvelv = ipyData.GetEvolveLV()
        else:
            break
    return maxEvolvelv
## 获取物品最高星数
#  @param itemType: 物品类型