xdh
2019-03-02 0f297a5b66b91751d8342624db871efeca7ed94e
6307 【后端】【2.0】多套装备开发单(穿脱、升星)
28个文件已修改
1 文件已重命名
2个文件已添加
1680 ■■■■ 已修改文件
PySysDB/PySysDBPY.h 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventShell.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipPlus.py 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipStar.py 163 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipStone.py 85 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetEquipPartPlusLV.py 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetEquipPartStar.py 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py 410 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/EquipZhuXian.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGodWeapon.py 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldGift.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMagicWeapon.py 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuccess.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTJG.py 103 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 51 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h
@@ -1758,4 +1758,29 @@
{
    list        LVRange;    //等级范围
    DWORD        GoodsID;    //商城表ID
};
//装备位背包索引映射表
struct tagEquipPlaceIndexMap
{
    DWORD        GridIndex;    //背包格子索引
    DWORD        _ClassLV;    //阶级(物品表LV字段)
    DWORD        _EquipPlace;    //装备位(物品表EquipPlace字段)
};
//装备升星表
struct tagEquipStarUp
{
    BYTE        _ClassLV;    //阶级
    BYTE        _EquipPlace;    //装备位
    BYTE        _Star;    //星数
    list        CostEquipPlace;    //可用装备部位
    list        CostEquipColor;    //可用装备品质
    BYTE        CostEquipCnt;    //装备数量
    BYTE        SuitTotalRate;    //全套装加成概率(非套50%)
    dict        CostItemDict;    //特殊材料
    dict        StarAttrInfo;    //星级属性
    dict        BaseAttrInfo;    //基础属性增加
};
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -9469,6 +9469,90 @@
#------------------------------------------------------
# A5 C5 装备部位升星 #tagCMEquipPartStarUp
class  tagCMEquipPartStarUp(Structure):
    Head = tagHead()
    EquipPackIndex = 0    #(WORD EquipPackIndex)// 部位格子索引
    CostEquipCnt = 0    #(BYTE CostEquipCnt)// 装备个数
    CostEquipIndex = list()    #(vector<WORD> CostEquipIndex)// 装备索引
    CostEquipID = list()    #(vector<DWORD> CostEquipID)// 装备物品ID
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA5
        self.Head.SubCmd = 0xC5
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.EquipPackIndex,_pos = CommFunc.ReadWORD(_lpData, _pos)
        self.CostEquipCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.CostEquipCnt):
            value,_pos=CommFunc.ReadWORD(_lpData,_pos)
            self.CostEquipIndex.append(value)
        for i in range(self.CostEquipCnt):
            value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
            self.CostEquipID.append(value)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA5
        self.Head.SubCmd = 0xC5
        self.EquipPackIndex = 0
        self.CostEquipCnt = 0
        self.CostEquipIndex = list()
        self.CostEquipID = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 2
        length += 1
        length += 2 * self.CostEquipCnt
        length += 4 * self.CostEquipCnt
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteWORD(data, self.EquipPackIndex)
        data = CommFunc.WriteBYTE(data, self.CostEquipCnt)
        for i in range(self.CostEquipCnt):
            data = CommFunc.WriteWORD(data, self.CostEquipIndex[i])
        for i in range(self.CostEquipCnt):
            data = CommFunc.WriteDWORD(data, self.CostEquipID[i])
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                EquipPackIndex:%d,
                                CostEquipCnt:%d,
                                CostEquipIndex:%s,
                                CostEquipID:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.EquipPackIndex,
                                self.CostEquipCnt,
                                "...",
                                "..."
                                )
        return DumpString
m_NAtagCMEquipPartStarUp=tagCMEquipPartStarUp()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMEquipPartStarUp.Head.Cmd,m_NAtagCMEquipPartStarUp.Head.SubCmd))] = m_NAtagCMEquipPartStarUp
#------------------------------------------------------
# A5 48 兑换大师等级经验 #tagCMExchangeMasterEXP
class  tagCMExchangeMasterEXP(Structure):
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -13782,6 +13782,114 @@
#------------------------------------------------------
# A3 B1 装备部位星数信息 #tagMCEquipPartStarInfo
class  tagMCEquipPartStar(Structure):
    _pack_ = 1
    _fields_ = [
                  ("EquipPackIndex", c_ushort),
                  ("Star", 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.EquipPackIndex = 0
        self.Star = 0
        return
    def GetLength(self):
        return sizeof(tagMCEquipPartStar)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A3 B1 装备部位星数信息 //tagMCEquipPartStarInfo:
                                EquipPackIndex:%d,
                                Star:%d
                                '''\
                                %(
                                self.EquipPackIndex,
                                self.Star
                                )
        return DumpString
class  tagMCEquipPartStarInfo(Structure):
    Head = tagHead()
    Count = 0    #(BYTE Count)// 信息个数
    InfoList = list()    #(vector<tagMCEquipPartStar> InfoList)// 信息列表
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0xB1
        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):
            temInfoList = tagMCEquipPartStar()
            _pos = temInfoList.ReadData(_lpData, _pos)
            self.InfoList.append(temInfoList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0xB1
        self.Count = 0
        self.InfoList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        for i in range(self.Count):
            length += self.InfoList[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.InfoList[i].GetLength(), self.InfoList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                Count:%d,
                                InfoList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.Count,
                                "..."
                                )
        return DumpString
m_NAtagMCEquipPartStarInfo=tagMCEquipPartStarInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCEquipPartStarInfo.Head.Cmd,m_NAtagMCEquipPartStarInfo.Head.SubCmd))] = m_NAtagMCEquipPartStarInfo
#------------------------------------------------------
# A3 09 通知玩家部位套装等级 #tagMCEquipPartSuiteLVInfo
class  tagMCEquipPartSuiteLV(Structure):
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -306,7 +306,7 @@
    Def_mitProduceResult,     # 生产采集结果回应
    Def_mitPetEquipMerge,     # 宠物装备合成回应
    Def_mitEquipInherit,      # 装备继承
    Def_mitEquipPlus,         # 装备加强
    Def_mitEquipStarUp,       # 装备升星
    Def_mitEquipMayaPlus,     # 装备玛雅加强
    Def_mitEquipAddAttr,      # 装备追加
    Def_mitEquipSlotting,     # 装备打孔
@@ -1732,32 +1732,34 @@
# 手游不使用C++定义 enum            RoleEquipType
# 装备位定义
RoleEquipType = (
    retWeapon,      #1 主手
    retWeapon2,     #2 副手
    retHat,         #3 帽子
    retClothes,     #4 衣服
    retBelt,        #5 腰带
    retTrousers,    #6 裤子
    retShoes,       #7 鞋子
    retNeck,        #8 项链
    retFairyCan,       #9 仙器
    retFairyCan2,       #10 仙器
    retWing,        #11 翅膀
    retGuard,    #12 守护
    retBaldric1,     #13 佩饰
    retBaldric2,     #14 佩饰
    retBaldric3,     #15 佩饰
    retBaldric4,     #16 佩饰
    retBaldric5,     #17 佩饰
    retBaldric6,     #18 佩饰
    retHorse,        #19 坐骑
    retWeaponSkin,   #20 时装武器
    retClothesSkin,  #21 时装衣服
    retWeapon2Skin,  #22 时装副手
    retWeapon,          #1 主手
    retWeapon2,         #2 副手
    retHat,             #3 帽子
    retClothes,         #4 衣服
    retBelt,            #5 腰带
    retTrousers,        #6 裤子
    retShoes,           #7 鞋子
    retGlove,           #8 手套
    retNeck,            #9 项链
    retFairyCan,        #10 仙器1
    retFairyCan2,       #11 仙器2
    retJade,            #12 玉佩
    retWing,            #13 翅膀
    retGuard1,          #14 守护1
    retGuard2,          #15 守护2
    retPeerlessWeapon,  #16 绝世武器
    retPeerlessWeapon2, #17 绝世副手
    retXXX18,           #18 暂无
    retHorse,           #19 坐骑
    retWeaponSkin,      #20 时装武器
    retClothesSkin,     #21 时装衣服
    retWeapon2Skin,     #22 时装副手
    retMax,
) = range(1, 24)
# 神兽装备位定义
DogzEquipPlace = (
    dogzetHorn,     # 神兽兽角
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -1450,4 +1450,16 @@
PacketCMD_1=0xAA
PacketSubCMD_1=0x08
PacketCallFunc_1=OnStartLuckyTreasure
PacketCallFunc_1=OnStartLuckyTreasure
;公共部位星数
[Operate_EquipStar]
ScriptName = Event\EventSrc\Operate_EquipStar.py
Writer = xdh
Releaser = xdh
RegType = 0
RegisterPackCount = 1
PacketCMD_1=0xA5
PacketSubCMD_1=0xC5
PacketCallFunc_1=OnEquipPartStarUp
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -340,17 +340,16 @@
Def_ItemType_retBelt = 105        #5 腰带
Def_ItemType_retTrousers = 106    #6 裤子
Def_ItemType_retShoes = 107       #7 鞋子
Def_ItemType_retNeck = 108        #8 项链
Def_ItemType_retFairyCan = 109       #9 仙器
Def_ItemType_retFairyCan2 = 110       #10 仙器
Def_ItemType_retWing = 111        #11 翅膀
Def_ItemType_retGuard = 112    #12 守护
Def_ItemType_retBaldric1 = 113     #13 佩饰
Def_ItemType_retBaldric2 = 114     #14 佩饰
Def_ItemType_retBaldric3 = 115     #15 佩饰
Def_ItemType_retBaldric4 = 116     #16 佩饰
Def_ItemType_retBaldric5 = 117     #17 佩饰
Def_ItemType_retBaldric6 = 118     #18 佩饰
Def_ItemType_retGlove = 108       #8 手套
Def_ItemType_retNeck = 109        #9 项链
Def_ItemType_retFairyCan = 110       #10 仙器1
Def_ItemType_retFairyCan2 = 111       #11 仙器2
Def_ItemType_retJade = 112       #12 玉佩
Def_ItemType_retWing = 113        #13 翅膀
Def_ItemType_retGuard1 = 114   #14 守护1
Def_ItemType_retGuard2 = 115    #15 守护2
Def_ItemType_retPeerlessWeapon = 116    #16 绝世武器
Def_ItemType_retPeerlessWeapon2 = 117    #17 绝世副手
Def_ItemType_DogzEquipHorn = 119    # 神兽兽角
Def_ItemType_DogzEquipEye = 120     # 神兽魔眼
@@ -405,16 +404,11 @@
                      ShareDefine.retTrousers:[Def_ItemType_retTrousers],
                      ShareDefine.retShoes:[Def_ItemType_retShoes],
                      ShareDefine.retNeck:[Def_ItemType_retNeck],
                      ShareDefine.retFairyCan:[Def_ItemType_retFairyCan, Def_ItemType_retFairyCan2],
                      ShareDefine.retFairyCan2:[Def_ItemType_retFairyCan, Def_ItemType_retFairyCan2],
                      ShareDefine.retFairyCan:[Def_ItemType_retFairyCan],
                      ShareDefine.retFairyCan2:[Def_ItemType_retFairyCan2],
                      ShareDefine.retWing:[Def_ItemType_retWing],
                      ShareDefine.retGuard:[Def_ItemType_retGuard],
                      ShareDefine.retBaldric1:[Def_ItemType_retBaldric1],
                      ShareDefine.retBaldric2:[Def_ItemType_retBaldric2],
                      ShareDefine.retBaldric3:[Def_ItemType_retBaldric3],
                      ShareDefine.retBaldric4:[Def_ItemType_retBaldric4],
                      ShareDefine.retBaldric5:[Def_ItemType_retBaldric5],
                      ShareDefine.retBaldric6:[Def_ItemType_retBaldric6],
                      ShareDefine.retGuard1:[Def_ItemType_retGuard1],
                      ShareDefine.retGuard2:[Def_ItemType_retGuard2],
                      }
#---------------------------------------------------------------------
#写死的物品效果ID都放这边------请按数值顺序存放
@@ -2408,9 +2402,11 @@
                                            ShareDefine.retBelt,        #5 腰带
                                            ShareDefine.retTrousers,    #6 裤子
                                            ShareDefine.retShoes,       #7 鞋子
                                            ShareDefine.retNeck,        #8 项链
                                            ShareDefine.retFairyCan,       #9 仙器
                                            ShareDefine.retFairyCan2,       #10 仙器
                                            ShareDefine.retGlove,       #8 手套
                                            ShareDefine.retNeck,        #9 项链
                                            ShareDefine.retFairyCan,    #10 仙器1
                                            ShareDefine.retFairyCan2,   #11 仙器2
                                            ShareDefine.retJade,        #12 玉佩
                                                      ],
                              }
@@ -2435,8 +2431,7 @@
                           ]
# 需要广播外观的装备部位
Def_SyncEquipStateByIndex = [
Def_SyncEquipStateByIndex = [
    ShareDefine.retWeapon,      #1 主手
    ShareDefine.retWeapon2,     #2 副手
    ShareDefine.retHat,         #3 帽子
@@ -2444,14 +2439,23 @@
    ShareDefine.retBelt,        #5 腰带
    ShareDefine.retTrousers,    #6 裤子
    ShareDefine.retShoes,       #7 鞋子
    ShareDefine.retNeck,        #8 项链
    ShareDefine.retFairyCan,       #9 仙器
    ShareDefine.retFairyCan2,       #10 仙器
    ShareDefine.retGlove,           #8 手套
    ShareDefine.retWing,        #11 翅膀
    ShareDefine.retGuard,    #12 守护
    ShareDefine.retGuard1,    #14 守护1
    ShareDefine.retGuard2,    #15 守护2
    ShareDefine.retHorse,        #19 坐骑
                             ]
#套装装备部位列表
Def_SuitEquipPlaceList = [
    ShareDefine.retWeapon,      #1 主手
    ShareDefine.retWeapon2,     #2 副手
    ShareDefine.retHat,         #3 帽子
    ShareDefine.retClothes,     #4 衣服
    ShareDefine.retBelt,        #5 腰带
    ShareDefine.retTrousers,    #6 裤子
    ShareDefine.retShoes,       #7 鞋子
    ShareDefine.retGlove,       #8 手套
    ]
#---------------------------------------------------------------------
#特殊物品光环,永久存在
Def_SuperBuffList = [
@@ -3612,7 +3616,7 @@
Def_PDict_RunTaskNextMissionID = "RunTaskNextMissionID_%s" # 跑环本轮结束下个任务ID 参数任务类型
# 宝石
Def_PDict_EquipPartStarLV = "EPStarLV_%s_%s" # 装备部位对应公共强化星级,参数为(packType, index)
Def_PDict_EquipPartPlusLV = "EPPlusLV_%s_%s" # 装备部位对应公共强化星级,参数为(packType, index)
Def_PDict_EquipActiveStarLV = "EquipActiveStarLV" #装备已激活总强化等级
Def_PDict_EquipPartProficiency = "EPProf_%s_%s" # 装备部位对应公共强化星级,参数为(packType, index)
Def_PDict_EquipActiveStars = "EquipActiveStars" #装备已激活总强化星级
@@ -4007,6 +4011,10 @@
#神兽
Def_PDict_DogzFightState = "DogzFightState_%s" # 神兽助战状态,参数为key编号,按神兽ID二进制位存储
Def_PDict_DogzBuyHelpbattleCount = "DogzBuyHelpbattleCount" # 额外购买的神兽助战位
#装备部位星数
Def_PDict_EquipPartStar = "EQPartStar_%s" #装备部位星数 参数 装备背包格子索引
#-------------------------------------------------------------------------------
#可以从07 41封包购买的背包类型,和对应字典{背包类型:[字典key, 默认格子数]}
@@ -4919,7 +4927,8 @@
ItemDel_GatherSoul, # 聚魂分解
ItemDel_CoatDecompose, # 时装分解
ItemDel_ZhuXianDecompose, # 诛仙装备分解
) = range(2000, 2000 + 38)
ItemDel_EquipStarUp, # 装备升星
) = range(2000, 2000 + 39)
# 物品扣除类型对应信息 {类型:eventName, ...}
ItemDelTypeDict = {
@@ -4961,6 +4970,7 @@
                   ItemDel_GatherSoul:"GatherSoul",
                   ItemDel_CoatDecompose:"CoatDecompose",
                   ItemDel_ZhuXianDecompose:"ZhuXianDecompose",
                   ItemDel_EquipStarUp:"EquipStarUp",
                   }
##==================================================================================================
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -9469,6 +9469,90 @@
#------------------------------------------------------
# A5 C5 装备部位升星 #tagCMEquipPartStarUp
class  tagCMEquipPartStarUp(Structure):
    Head = tagHead()
    EquipPackIndex = 0    #(WORD EquipPackIndex)// 部位格子索引
    CostEquipCnt = 0    #(BYTE CostEquipCnt)// 装备个数
    CostEquipIndex = list()    #(vector<WORD> CostEquipIndex)// 装备索引
    CostEquipID = list()    #(vector<DWORD> CostEquipID)// 装备物品ID
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA5
        self.Head.SubCmd = 0xC5
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.EquipPackIndex,_pos = CommFunc.ReadWORD(_lpData, _pos)
        self.CostEquipCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.CostEquipCnt):
            value,_pos=CommFunc.ReadWORD(_lpData,_pos)
            self.CostEquipIndex.append(value)
        for i in range(self.CostEquipCnt):
            value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
            self.CostEquipID.append(value)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA5
        self.Head.SubCmd = 0xC5
        self.EquipPackIndex = 0
        self.CostEquipCnt = 0
        self.CostEquipIndex = list()
        self.CostEquipID = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 2
        length += 1
        length += 2 * self.CostEquipCnt
        length += 4 * self.CostEquipCnt
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteWORD(data, self.EquipPackIndex)
        data = CommFunc.WriteBYTE(data, self.CostEquipCnt)
        for i in range(self.CostEquipCnt):
            data = CommFunc.WriteWORD(data, self.CostEquipIndex[i])
        for i in range(self.CostEquipCnt):
            data = CommFunc.WriteDWORD(data, self.CostEquipID[i])
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                EquipPackIndex:%d,
                                CostEquipCnt:%d,
                                CostEquipIndex:%s,
                                CostEquipID:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.EquipPackIndex,
                                self.CostEquipCnt,
                                "...",
                                "..."
                                )
        return DumpString
m_NAtagCMEquipPartStarUp=tagCMEquipPartStarUp()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMEquipPartStarUp.Head.Cmd,m_NAtagCMEquipPartStarUp.Head.SubCmd))] = m_NAtagCMEquipPartStarUp
#------------------------------------------------------
# A5 48 兑换大师等级经验 #tagCMExchangeMasterEXP
class  tagCMExchangeMasterEXP(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -13782,6 +13782,114 @@
#------------------------------------------------------
# A3 B1 装备部位星数信息 #tagMCEquipPartStarInfo
class  tagMCEquipPartStar(Structure):
    _pack_ = 1
    _fields_ = [
                  ("EquipPackIndex", c_ushort),
                  ("Star", 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.EquipPackIndex = 0
        self.Star = 0
        return
    def GetLength(self):
        return sizeof(tagMCEquipPartStar)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A3 B1 装备部位星数信息 //tagMCEquipPartStarInfo:
                                EquipPackIndex:%d,
                                Star:%d
                                '''\
                                %(
                                self.EquipPackIndex,
                                self.Star
                                )
        return DumpString
class  tagMCEquipPartStarInfo(Structure):
    Head = tagHead()
    Count = 0    #(BYTE Count)// 信息个数
    InfoList = list()    #(vector<tagMCEquipPartStar> InfoList)// 信息列表
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0xB1
        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):
            temInfoList = tagMCEquipPartStar()
            _pos = temInfoList.ReadData(_lpData, _pos)
            self.InfoList.append(temInfoList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0xB1
        self.Count = 0
        self.InfoList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        for i in range(self.Count):
            length += self.InfoList[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.InfoList[i].GetLength(), self.InfoList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                Count:%d,
                                InfoList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.Count,
                                "..."
                                )
        return DumpString
m_NAtagMCEquipPartStarInfo=tagMCEquipPartStarInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCEquipPartStarInfo.Head.Cmd,m_NAtagMCEquipPartStarInfo.Head.SubCmd))] = m_NAtagMCEquipPartStarInfo
#------------------------------------------------------
# A3 09 通知玩家部位套装等级 #tagMCEquipPartSuiteLVInfo
class  tagMCEquipPartSuiteLV(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventShell.py
@@ -1898,9 +1898,9 @@
    RunQuestEvent(curPlayer, "trialexange", costItemID, Def_RunQuestType_Normal)
    return
def EventRespons_EquipByPlace(curPlayer, equipplace):
def EventRespons_EquipByPlace(curPlayer, itemClassLV, equipplace):
    #穿戴某部位装备(非时效)
    RunQuestEvent(curPlayer, "equipbyplace", equipplace, Def_RunQuestType_Normal)
    RunQuestEvent(curPlayer, "equipbyplace", '%s_%s'%(itemClassLV, equipplace), Def_RunQuestType_Normal)
    return
def EventRespons_CompoundEquip(curPlayer, itemColor, itemQuality):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipPlus.py
@@ -6,12 +6,12 @@
#
##@package Event.EventSrc.Operate_EquipPlus
#
# @todo:部位星级公共模式强化
# @todo:部位强化公共模式强化
# @author hxp
# @date 2015-12-15
# @version 1.2
#
# 详细描述: 部位星级公共模式强化
# 详细描述: 部位强化公共模式强化
#
# @change: "2016-06-30 21:30" hxp 强化达人开服活动
# @change: "2016-10-08 18:00" hxp 自动购买物品价格统一取商城物品价格
@@ -74,8 +74,8 @@
        GameWorld.DebugLog("OnEquipMayaPlus() equip is empty")
        return
    
    maxStarLV = ItemCommon.GetItemMaxStarLV(curEquip)
    curPartStarLV = ChEquip.GetEquipPartStarLV(curPlayer, packType, index)
    maxStarLV = ItemCommon.GetItemMaxPlusLV(curEquip)
    curPartStarLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, index)
    if curPartStarLV >= maxStarLV:
        GameWorld.Log("OnEquipMayaPlus:curPartStarLV(%s) >= maxStarLV(%s)" % (curPartStarLV, maxStarLV), playerID)
        return
@@ -83,7 +83,7 @@
    # 强化处理
    result = DoLogic_EquipMayaPlus(curPlayer, curEquip, packType, index)
    
    updPartStarLV = ChEquip.GetEquipPartStarLV(curPlayer, packType, index)
    updPartStarLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, index)
    #GameWorld.Log("    result=%s,curStarLV=%s,updStarLV=%s" % (result, curPartStarLV, updPartStarLV), playerID)
    if result == ChConfig.Def_ComposeState_None:
        return
@@ -97,7 +97,7 @@
    #===========================================================================
    
    # 星级变更时处理
    # 强化变更时处理
    if curPartStarLV != updPartStarLV:
        DoLogic_OnEquipPartStarLVChange(curPlayer, packType)
        # 增加强化成就
@@ -117,7 +117,7 @@
    if findType == -1:
        return result
    
    curPartStarLV = ChEquip.GetEquipPartStarLV(curPlayer, packType, index)
    curPartStarLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, index)
    ipyData = IpyGameDataPY.GetIpyGameData("ItemPlus", findType, curPartStarLV)
    if not ipyData:
        return
@@ -136,7 +136,7 @@
        curExp = curExp - totalExp
        
    ChEquip.SetEquipPartProficiency(curPlayer, packType, index, curExp)
    ChEquip.NotifyEquipPartStarLV(curPlayer, packType, index)
    ChEquip.NotifyEquipPartPlusLV(curPlayer, packType, index)
    # 支付金币
    PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, costSilver, isNotify=False)
@@ -150,12 +150,12 @@
#  @param packType: 背包类型
#  @param curEquip: 当前装备
#  @param succeedRate: 成功率
#  @param failStarLV: 失败时的星级数
#  @param failStarLV: 失败时的强化数
#  @return 
def __EquipMayaPlusChange(curPlayer, packType, curEquip, index):
    curPlusLV = ChEquip.GetEquipPartStarLV(curPlayer, packType, index)
    curPlusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, index)
    updPlusLV = curPlusLV + 1
    ChEquip.SetEquipPartStarLV(curPlayer, packType, index, curEquip, updPlusLV)
    ChEquip.SetEquipPartPlusLV(curPlayer, packType, index, curEquip, updPlusLV)
    
    broadCastLVList = IpyGameDataPY.GetFuncEvalCfg("StrengthenLevelBroadCast", 1)
    #GameWorld.DebugLog("PlusLVChange index=%s,updPlusLV=%s,broadCastLVList=%s" % (index, updPlusLV, broadCastLVList))
@@ -192,7 +192,7 @@
#    minPlusLV = GetMaxEquipPartStarLV()
#    equipPartIndexList = ChConfig.Pack_EquipPart_CanPlusStar.get(packType, [])
#    for i in equipPartIndexList:
#        partStarLV = ChEquip.GetEquipPartStarLV(curPlayer, packType, i)
#        partStarLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, i)
#        if partStarLV < minPlusLV:
#            minPlusLV = partStarLV
#    return minPlusLV
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipStar.py
New file
@@ -0,0 +1,163 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
#-------------------------------------------------------------------------------
#
##@package Event.EventSrc.Operate_EquipStar
#
# @todo:公共部位星数
# @author xdh
# @date 2019-3-1
# @version 1.0
#
# 详细描述: 公共部位星数
#
#
#---------------------------------------------------------------------
#"""Version = 2019-3-1 18:00"""
#---------------------------------------------------------------------
import ItemCommon
import ShareDefine
import PlayerControl
import IPY_GameWorld
import DataRecordPack
import IpyGameDataPY
import GameWorld
import ChConfig
import ChEquip
#-------------------------------------------------------------------------------------------
#===============================================================================
#// A5 C5 装备部位升星 #tagCMEquipPartStarUp
#struct    tagCMEquipPartStarUp
#{
#    tagHead        Head;
#    WORD    EquipPackIndex;    // 部位格子索引
#    BYTE    CostEquipCnt;    // 装备个数
#    WORD    CostEquipIndex[CostEquipCnt];    // 装备索引
#    DWORD    CostEquipID[CostEquipCnt];    // 装备物品ID
#};
#===============================================================================
## 部位升星
#  @param playerIndex: 玩家
#  @param clientData: 封包
#  @param tick: 当前时间
#  @return None
def OnEquipPartStarUp(playerIndex, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)
    playerID = curPlayer.GetPlayerID()
    equipPackIndex = clientData.EquipPackIndex
    packType = IPY_GameWorld.rptEquip
    if packType not in ChConfig.Pack_EquipPart_CanPlusStar:
        return
    ipyData = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'GridIndex':equipPackIndex})
    if not ipyData:
        return
    classLV = ipyData.GetClassLV()
    equipPlace = ipyData.GetEquipPlace()
    placeList = ChConfig.Pack_EquipPart_CanPlusStar[packType]
    if equipPlace not in placeList:
        GameWorld.Log("    equipPlace %s not in ChConfig.Pack_EquipPart_CanPlusStar" % equipPlace, playerID)
        return
    # 当前装备等级是否到达最高等级
    curPack = curPlayer.GetItemManager().GetPack(packType)
    curEquip = curPack.GetAt(equipPackIndex)
    if not curEquip or curEquip.IsEmpty():
        GameWorld.DebugLog("OnEquipPartStarUp() equip is empty")
        return
    maxStar = ItemCommon.GetItemMaxStar(curEquip)
    curPartStar = ChEquip.GetEquipPartStar(curPlayer, equipPackIndex)
    if curPartStar >= maxStar:
        GameWorld.Log("OnEquipPartStarUp:curPartStar(%s) >= maxStar(%s)" % (curPartStar, maxStar), playerID)
        return
    # 升星处理
    result = DoLogic_EquipStarUp(curPlayer, classLV, equipPlace, curPartStar, equipPackIndex, clientData)
    updPartStar = ChEquip.GetEquipPartStar(curPlayer, equipPackIndex)
    GameWorld.DebugLog("   装备升星 equipPackIndex=%s result=%s,curPartStar=%s,updPartStar=%s" % (equipPackIndex, result, curPartStar, updPartStar), playerID)
    if result == ChConfig.Def_ComposeState_Sucess:
        # 星级变更时处理
        #刷新属性
        ChEquip.RefreshPlayerEquipAttribute(curPlayer, classLV)
        playControl = PlayerControl.PlayerControl(curPlayer)
        playControl.RefreshPlayerAttrState()
        if updPartStar in IpyGameDataPY.GetFuncEvalCfg('EquipPartStarNotify'):
            PlayerControl.WorldNotify(0, "StarLevelUp", [curPlayer.GetPlayerName(), curEquip.GetItemTypeID(), updPartStar])
        #EventShell.EventRespons_EquipPlus(curPlayer)
    return
## 开始装备升星
#  @param index 为装备位
#  @return
def DoLogic_EquipStarUp(curPlayer, classLV, equipPlace, curPartStar, equipPackIndex, clientData):
    result = ChConfig.Def_ComposeState_None
    nextStar = curPartStar + 1
    ipyData = IpyGameDataPY.GetIpyGameData("EquipStarUp", classLV, equipPlace, nextStar)
    if not ipyData:
        return result
    costEquipCnt = ipyData.GetCostEquipCnt()
    if clientData.CostEquipCnt < costEquipCnt:
        GameWorld.DebugLog(' 开始装备升星,装备材料不足 %s' % costEquipCnt)
        return result
    costEquipPlaceList = ipyData.GetCostEquipPlace()
    costEquipColorList = ipyData.GetCostEquipColor()
    suitTotalRate = ipyData.GetSuitTotalRate()
    singleSuitRate = float(suitTotalRate) / costEquipCnt
    curRate = 0  #成功概率
    delEquipIndexList = []
    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
    for i, index in enumerate(clientData.CostEquipIndex):
        costEquip = itemPack.GetAt(index)
        if not costEquip or costEquip.IsEmpty():
            return result
        equipID = costEquip.GetItemTypeID()
        if equipID != clientData.CostEquipID[i]:
            GameWorld.ErrLog('   装备升星 客户端发的物品索引与实际物品ID不对应  index=%s,eatItemID=%s,wantEatItemID=%s' % (index, equipID, clientData.CostEquipID[i]))
            return result
        if costEquip.GetItemColor() not in costEquipColorList:
            return result
        if costEquip.GetEquipPlace() not in costEquipPlaceList:
            return result
        delEquipIndexList.append(index)
        isSuite = costEquip.GetSuiteID()
        addRate = singleSuitRate if isSuite else singleSuitRate / 2
        curRate += addRate
    if curRate <= 0:
        GameWorld.Log('装备升星异常 概率为0!!equipPackIndex=%s'%equipPackIndex)
        return result
    #判断普通物品材料
    costItemDict = ipyData.GetCostItemDict()
    if costItemDict:
        delItemDict = {}
        for itemID, itemCnt in costItemDict.items():
            hasEnough, indexList, findItemIsBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(itemID, itemPack, itemCnt)
            if not hasEnough:
                return result
            delItemDict[tuple(indexList)] = itemCnt
        for itemIndexList, delCnt in delItemDict.items():
            ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, delCnt, True, ChConfig.ItemDel_EquipStarUp)
    #扣装备
    ItemCommon.ReduceItem(curPlayer, itemPack, delEquipIndexList, len(delEquipIndexList), True, ChConfig.ItemDel_EquipStarUp)
    isOK = GameWorld.CanHappen(curRate, 100)
    if isOK:
        ChEquip.SetEquipPartStar(curPlayer, equipPackIndex, nextStar)
        ChEquip.NotifyEquipPartStar(curPlayer, equipPackIndex)
        result = ChConfig.Def_ComposeState_Sucess
    else:
        result = ChConfig.Def_ComposeState_Fail
    curPlayer.Sync_MakeItemAnswer(ShareDefine.Def_mitEquipStarUp, result)
    drDict = {"PlayerID":curPlayer.GetPlayerID(), "AccID":curPlayer.GetAccID(), "classLV":classLV, "equipPlace":equipPlace, "IsSuccess":isOK,
              "curRate":curRate, "nextStar":nextStar}
    DataRecordPack.SendEventPack("EquipStarUp", drDict, curPlayer)
    return result
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipStone.py
@@ -32,7 +32,7 @@
import ShareDefine
import EquipZhuXian
g_stoneCanPlaceList = [] #可镶嵌的位置
def OnLogin(curPlayer):
    ###登录发包同步客户端宝石信息
@@ -41,23 +41,30 @@
def GetAllStoneEquipIndexList():
    ###得到所有可镶嵌宝石装备位列表
    global g_stoneCanPlaceList
    if g_stoneCanPlaceList:
        return g_stoneCanPlaceList
    #获得宝石类型数量
    GemTypeCount = IpyGameDataPY.GetFuncCfg("GemTypeCount")
    #获得所有可镶嵌宝石装备位
    stoneCanPlaceList = []
    g_stoneCanPlaceList = []
    for stoneTypeIndex in xrange(1, GemTypeCount + 1):
        #循环宝石类型对应的装备位
        placeList = IpyGameDataPY.GetFuncEvalCfg("GemType%s" % stoneTypeIndex, 1)
        for place in placeList:
            if place not in stoneCanPlaceList:
                stoneCanPlaceList.append(place)
    return stoneCanPlaceList
            ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'EquipPlace':place}, True)
            if not ipyDataList:
                continue
            for ipyData in ipyDataList:
                gridIndex = ipyData.GetGridIndex()
                if gridIndex not in g_stoneCanPlaceList:
                    g_stoneCanPlaceList.append(gridIndex)
    return g_stoneCanPlaceList
def GetAllEquipPlaceHoleIndex():
    ### 得到装备位所有孔位
    gemOpenClassLVList = IpyGameDataPY.GetFuncEvalCfg("GemOpen", 1)
    maxEquipHoleCnt = len(gemOpenClassLVList) # 最大装备阶级开放孔数
    gemOpenNeedStarList = IpyGameDataPY.GetFuncEvalCfg("GemOpen", 1)
    maxEquipHoleCnt = len(gemOpenNeedStarList) # 最大装备阶级开放孔数
     
    gemOpenVipList = IpyGameDataPY.GetFuncEvalCfg("GemOpenVip", 1)
    maxHoleVipCnt = len(gemOpenVipList)# 最大Vip开放孔数
@@ -94,14 +101,14 @@
def GetPackTypeByEquipPlace(equipPlace):
    ##目前支持镶嵌普通装备、诛仙装备
    if equipPlace in ShareDefine.ZhuXianEquipPlace:
        equipPackType = ShareDefine.rptZhuXianEquip
        stonePackType = ShareDefine.rptZhuXianItem
        placeIndex = EquipZhuXian.GetZhuXianEquipIndexByPlace(equipPlace)
    else:
        equipPackType = IPY_GameWorld.rptEquip
        stonePackType = IPY_GameWorld.rptItem
        placeIndex = equipPlace
#    if equipPlace in ShareDefine.ZhuXianEquipPlace:
#        equipPackType = ShareDefine.rptZhuXianEquip
#        stonePackType = ShareDefine.rptZhuXianItem
#        placeIndex = EquipZhuXian.GetZhuXianEquipIndexByPlace(equipPlace)
#    else:
    equipPackType = IPY_GameWorld.rptEquip
    stonePackType = IPY_GameWorld.rptItem
    placeIndex = equipPlace
    return equipPackType, stonePackType, placeIndex
#//A3 04 宝石镶嵌或替换 #tagCMEquipEnchase
@@ -157,8 +164,8 @@
                      % (stoneItemID, stoneEffType, stoneCanPlaceList, equipPlace), playerID)
        return
    
    equipClassLV = ItemCommon.GetItemClassLV(curEquip)
    if not __CheckStoneHoleCanUse(curPlayer, equipClassLV, holeIndex, equipPackType):
    equipStar = ChEquip.GetEquipPartStar(curEquip)
    if not __CheckStoneHoleCanUse(curPlayer, equipStar, holeIndex, equipPackType):
        return
    
    # 扣除宝石
@@ -382,7 +389,7 @@
    DoStoneSuccess(curPlayer)
    return
def __CheckStoneHoleCanUse(curPlayer, equipClassLV, holeIndex, equipPackType):
def __CheckStoneHoleCanUse(curPlayer, equipStar, holeIndex, equipPackType):
    ##验证孔合法性
    
    holeIndexList = GetAllEquipPlaceHoleIndex()
@@ -391,19 +398,17 @@
        return False
    
    openCommHoleCnt = 0 # 已经开放装备常规孔数
    if equipPackType == ShareDefine.rptZhuXianEquip:
        gemOpenClassLVList = IpyGameDataPY.GetFuncEvalCfg("GemOpen", 2)
    else:
        gemOpenClassLVList = IpyGameDataPY.GetFuncEvalCfg("GemOpen", 1)
    for holeCnt, openClassLV in enumerate(gemOpenClassLVList, 1):
        if equipClassLV >= openClassLV:
    gemOpenNeedStarList = IpyGameDataPY.GetFuncEvalCfg("GemOpen", 1)
    for holeCnt, openStar in enumerate(gemOpenNeedStarList, 1):
        if equipStar >= openStar:
            openCommHoleCnt = holeCnt
            
    # VIP孔
    if holeIndex >= ChConfig.Def_Stone_VipHole:
        
        if openCommHoleCnt <= 0:
            GameWorld.Log("装备未开启任何普通宝石孔,无法开启VIP孔位! equipClassLV=%s,openCommHoleCnt=%s" % (equipClassLV, openCommHoleCnt))
            GameWorld.Log("装备未开启任何普通宝石孔,无法开启VIP孔位! equipStar=%s,openCommHoleCnt=%s" % (equipStar, openCommHoleCnt))
            return False
        gemOpenVipList = IpyGameDataPY.GetFuncEvalCfg("GemOpenVip", 1)
        
@@ -425,8 +430,8 @@
        
    # 常规孔
    elif holeIndex >= openCommHoleCnt:
        GameWorld.Log("该装备宝石孔为开放!equipClassLV=%s,holeIndex=%s,openCommHoleCnt=%s"
                      % (equipClassLV, holeIndex, openCommHoleCnt), curPlayer.GetPlayerID())
        GameWorld.Log("该装备宝石孔为开放!equipStar=%s,holeIndex=%s,openCommHoleCnt=%s"
                      % (equipStar, holeIndex, openCommHoleCnt), curPlayer.GetPlayerID())
        return False
    
    return True
@@ -471,22 +476,22 @@
    return
def DoMoveEquipStone(curPlayer, equipPlace):
def DoMoveEquipStone(curPlayer, equipPackIndex):
    ###替换装备时宝石转移
    equipPackType, stonePackType, placeIndex = GetPackTypeByEquipPlace(equipPlace)
    equipPackType, stonePackType, placeIndex = GetPackTypeByEquipPlace(equipPackIndex)
    equipPack = curPlayer.GetItemManager().GetPack(equipPackType)
    curEquip = equipPack.GetAt(placeIndex)
    if not ItemCommon.CheckItemCanUse(curEquip):
        return
    
    #获得装备阶级孔信息
    gemOpenClassLVList = IpyGameDataPY.GetFuncEvalCfg("GemOpen", 1)
    maxEquipHoleCnt = len(gemOpenClassLVList) # 最大装备阶级开放孔数
    #获得装备星级孔信息
    gemOpenNeedStarList = IpyGameDataPY.GetFuncEvalCfg("GemOpen", 1)
    maxEquipHoleCnt = len(gemOpenNeedStarList) # 最大装备星级开放孔数
    
    openEquipHoleCnt = 0 # 已经开放孔数
    equipClassLV = ItemCommon.GetItemClassLV(curEquip)
    for holeCnt, openClassLV in enumerate(gemOpenClassLVList, 1):
        if equipClassLV >= openClassLV:
    partStar = ChEquip.GetEquipPartStarByRank(curPlayer, equipPackIndex, curEquip)
    for holeCnt, openStar in enumerate(gemOpenNeedStarList, 1):
        if partStar >= openStar:
            openEquipHoleCnt = holeCnt
            
    #需要拆卸宝石的孔列表
@@ -496,10 +501,10 @@
    for holeIndex in xrange(maxEquipHoleCnt):      
        if holeIndex < openEquipHoleCnt:
            continue
        curGemID = GetEquipIndexStoneIDAndIsBand(curPlayer, equipPlace, holeIndex)[0]
        curGemID = GetEquipIndexStoneIDAndIsBand(curPlayer, equipPackIndex, holeIndex)[0]
        if curGemID == 0:
            continue       
        pickoffHoleList.append([equipPlace, holeIndex])
        pickoffHoleList.append([equipPackIndex, holeIndex])
        
    #没有开启普通装备孔,需摘除VIP孔
    if not openEquipHoleCnt:
@@ -508,10 +513,10 @@
        maxVipHoleCnt = len(gemOpenVipList)# 最大VIP开放孔数
        #判断VIP等级孔信息
        for holeIndex in xrange(ChConfig.Def_Stone_VipHole, ChConfig.Def_Stone_VipHole + maxVipHoleCnt): 
            curGemID = GetEquipIndexStoneIDAndIsBand(curPlayer, equipPlace, holeIndex)[0]
            curGemID = GetEquipIndexStoneIDAndIsBand(curPlayer, equipPackIndex, holeIndex)[0]
            if curGemID == 0:                             
                continue
            pickoffHoleList.append([equipPlace, holeIndex])
            pickoffHoleList.append([equipPackIndex, holeIndex])
            
    # 脱装备的外层刷属性, 这里不刷
    __DoSysPickoffEquipStone(curPlayer, equipPackType, stonePackType, pickoffHoleList, "EquipChange", False)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py
@@ -2534,7 +2534,7 @@
    totalPlusLV = 0
    for packType, equipPartIndexList in ChConfig.Pack_EquipPart_CanPlusStar.items():
        for i in equipPartIndexList:
            partStarLV = ChEquip.GetEquipPartStarLV(curPlayer, packType, i)
            partStarLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, i)
            totalPlusLV += partStarLV
    
    
@@ -2545,7 +2545,7 @@
#    equipPartIndexList = ChConfig.Pack_EquipPart_CanPlusStar.get(IPY_GameWorld.rptEquip, [])
#    for i in equipPartIndexList:
#        #统计全身强化等级
#        partStarLV = ChEquip.GetEquipPartStarLV(curPlayer, IPY_GameWorld.rptEquip, i)
#        partStarLV = ChEquip.GetEquipPartPlusLV(curPlayer, IPY_GameWorld.rptEquip, i)
#        if partStarLV >= star:
#            partCnt +=1 
    #GameWorld.Log('star=%s,conditionValue=%s,partCnt=%s,%s'%(star,conditionValue,partCnt,QuestRunnerValue.GetEval(conditionType, partCnt, conditionValue)))
@@ -2900,15 +2900,15 @@
        if equipIndex == 0:
            GameWorld.ErrLog("任务赠送装备位置错误 equipIndex=-1")
            return
        if ItemCommon.CheckHasEquip(curPlayer, IPY_GameWorld.rptEquip, equipIndex):
        equipPackIndex = ItemCommon.GetEquipPackIndex(curSingleItem)
        if ItemCommon.CheckHasEquip(curPlayer, IPY_GameWorld.rptEquip, equipPackIndex):
            #物品已存在直接给背包
            if not itemControl.PutInItem(IPY_GameWorld.rptItem, curSingleItem, event=["AddEventItem", False, {'MissionID':missionID}]):
                GameWorld.Log('###任务 = %s给予物品异常, %s, %s' % (missionID, itemID, itemCount), curPlayer.GetPlayerID())
                curSingleItem.Clear()
                return
        else:
            ChEquip.DoPlayerEquipItem(curPlayer, curSingleItem, equipIndex, 0)
            ChEquip.DoPlayerEquipItem(curPlayer, curSingleItem,equipPackIndex, 0)
    
    #ObtainRes01    <n>获得</n><Info Type="Item" Name="Name" ID="{%S1%}"/><n>×</n><n>{%S2%}!</n>
    elif not itemControl.PutInItem(packIndex, curSingleItem, event=["AddEventItem", False, {'MissionID':missionID}]):
@@ -6116,11 +6116,11 @@
# @return 返回值无意义
# @remarks <Set_Equiptotalstar key="" />
def DoType_Set_Equiptotalstar(curPlayer, curMission, curActionNode):
    key = curActionNode.GetAttribute("key")
    questID = GameWorld.ToIntDef(curActionNode.GetAttribute("id"), 0)
    if questID != 0:
        curMission = curPlayer.FindMission(questID)
    curMission.SetProperty(key, ChEquip.GetTotalEquipStars(curPlayer))
#    key = curActionNode.GetAttribute("key")
#    questID = GameWorld.ToIntDef(curActionNode.GetAttribute("id"), 0)
#    if questID != 0:
#        curMission = curPlayer.FindMission(questID)
#    curMission.SetProperty(key, ChEquip.GetTotalEquipStars(curPlayer))
    return
#---------------------------------------------------------------------
##DoType_调度器
@@ -7267,7 +7267,7 @@
# @return None <Equiptotalstar value="cnt"/>
def ConditionType_Equiptotalstar(curPlayer, curMission, curActionNode):
    totalcnt = GameWorld.ToIntDef(curActionNode.GetAttribute("value"), 0)
    return ChEquip.GetTotalEquipStars(curPlayer) >= totalcnt
    return #ChEquip.GetTotalEquipStars(curPlayer) >= totalcnt
##激活法宝,确认与成就逻辑后使用
# @param None
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetEquipPartPlusLV.py
File was renamed from ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetEquipPartStarLV.py
@@ -4,14 +4,14 @@
#
#-------------------------------------------------------------------------------
#
##@package GM.Commands.SetEquipPartStarLV
##@package GM.Commands.SetEquipPartPlusLV
#
# @todo:设置装备部位公共星级
# @todo:设置装备部位公共强化等级
# @author hxp
# @date 2015-12-15
# @version 1.0
#
# 详细描述: 设置装备部位公共星级
# 详细描述: 设置装备部位公共强化等级
#
#---------------------------------------------------------------------
"""Version = 2015-12-15 17:00"""
@@ -41,11 +41,11 @@
            for i in indexList:
                curPack = curPlayer.GetItemManager().GetPack(pType)
                curEquip = curPack.GetAt(i)
                ChEquip.SetEquipPartStarLV(curPlayer, pType, i, curEquip, setStarLV)
                ChEquip.SetEquipPartPlusLV(curPlayer, pType, i, curEquip, setStarLV)
                ChEquip.SetEquipPartProficiency(curPlayer, pType, i, 0)
            Operate_EquipPlus.DoLogic_OnEquipPartStarLVChange(curPlayer, pType)
        ChEquip.NotifyEquipPartStarLV(curPlayer)
        GameWorld.DebugAnswer(curPlayer, "设置所有部位星级为: %s" % setStarLV)
        ChEquip.NotifyEquipPartPlusLV(curPlayer)
        GameWorld.DebugAnswer(curPlayer, "设置所有部位强化等级为: %s" % setStarLV)
        return
    
    if len(cmdList) != 3:
@@ -64,9 +64,9 @@
    curPack = curPlayer.GetItemManager().GetPack(packType)
    curEquip = curPack.GetAt(index)
    maxStarLV = ItemCommon.GetItemMaxStarLV(curEquip)
    maxStarLV = ItemCommon.GetItemMaxPlusLV(curEquip)
    starLV = min(starLV, maxStarLV)
    ChEquip.SetEquipPartStarLV(curPlayer, packType, index, curEquip, starLV)
    ChEquip.SetEquipPartPlusLV(curPlayer, packType, index, curEquip, starLV)
    ChEquip.SetEquipPartProficiency(curPlayer, packType, index, 0)
    Operate_EquipPlus.DoLogic_OnEquipPartStarLVChange(curPlayer, packType)
    return
@@ -100,7 +100,7 @@
#===============================================================================
    
    #===========================================================================
    # GameWorld.DebugAnswer(curPlayer, "SetEquipPartStarLV 参数[packType, index, starLV]")
    # GameWorld.DebugAnswer(curPlayer, "SetEquipPartPlusLV 参数[packType, index, starLV]")
    # for pType, indexList in ChConfig.Pack_EquipPart_CanPlusStar.items():
    #    GameWorld.DebugAnswer(curPlayer, "    packType=%s(%s)ʱ" % (pType, packTypeStrDict.get(pType, "")))
    #    indexStr = "index="
@@ -108,7 +108,7 @@
    #        indexStr += "%s(%s)," % (i, indexStrDict.get("%s_%s" % (pType, i), ""))
    #    GameWorld.DebugAnswer(curPlayer, "        %s" % indexStr)
    #    
    # GameWorld.DebugAnswer(curPlayer, "    SetEquipPartStarLV 星级 可重置所有部位为对应的星级")
    # GameWorld.DebugAnswer(curPlayer, "    SetEquipPartPlusLV 强化等级 可重置所有部位为对应的强化等级")
    # GameWorld.DebugAnswer(curPlayer, "------------------------------")
    #===========================================================================
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetEquipPartStar.py
New file
@@ -0,0 +1,57 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
#-------------------------------------------------------------------------------
#
##@package GM.Commands.SetEquipPartStar
#
# @todo:设置装备部位公共星数
# @author xdh
# @date 2019-3-2
# @version 1.0
#
# 详细描述: 设置装备部位公共星数
#
#---------------------------------------------------------------------
import IpyGameDataPY
"""Version = 2019-3-2 17:00"""
#---------------------------------------------------------------------
import PlayerControl
import ChEquip
import GameWorld
#---------------------------------------------------------------------
#逻辑实现
## GM命令执行入口
#  @param curPlayer 当前玩家
#  @param cmdList 参数列表 [classlv, equipPlace, starLV]
#  @return None
#  @remarks 函数详细说明.
def OnExec(curPlayer, cmdList):
    if not cmdList:
        __GMHelpAnswer(curPlayer)
        return
    if len(cmdList) != 3:
        return
    classlv, equipPlace, starLV = cmdList
    ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classlv, equipPlace)
    if not ipyData:
        __GMHelpAnswer(curPlayer)
        return
    equipPackIndex = ipyData.GetGridIndex()
    ChEquip.SetEquipPartStar(curPlayer, equipPackIndex, starLV)
    ChEquip.NotifyEquipPartStar(curPlayer, equipPackIndex)
    ChEquip.RefreshPlayerEquipAttribute(curPlayer, classlv)
    playControl = PlayerControl.PlayerControl(curPlayer)
    playControl.RefreshPlayerAttrState()
    return
def __GMHelpAnswer(curPlayer, errorMsg="参数列表 [classlv, equipPlace, starLV]"):
    if errorMsg:
        GameWorld.DebugAnswer(curPlayer, "%s" % errorMsg)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -1372,6 +1372,25 @@
                        ("list", "LVRange", 0),
                        ("DWORD", "GoodsID", 0),
                        ),
                "EquipPlaceIndexMap":(
                        ("DWORD", "GridIndex", 0),
                        ("DWORD", "ClassLV", 1),
                        ("DWORD", "EquipPlace", 1),
                        ),
                "EquipStarUp":(
                        ("BYTE", "ClassLV", 1),
                        ("BYTE", "EquipPlace", 1),
                        ("BYTE", "Star", 1),
                        ("list", "CostEquipPlace", 0),
                        ("list", "CostEquipColor", 0),
                        ("BYTE", "CostEquipCnt", 0),
                        ("BYTE", "SuitTotalRate", 0),
                        ("dict", "CostItemDict", 0),
                        ("dict", "StarAttrInfo", 0),
                        ("dict", "BaseAttrInfo", 0),
                        ),
                }
@@ -4190,6 +4209,46 @@
        
    def GetLVRange(self): return self.LVRange # 等级范围
    def GetGoodsID(self): return self.GoodsID # 商城表ID
# 装备位背包索引映射表
class IPY_EquipPlaceIndexMap():
    def __init__(self):
        self.GridIndex = 0
        self.ClassLV = 0
        self.EquipPlace = 0
        return
    def GetGridIndex(self): return self.GridIndex # 背包格子索引
    def GetClassLV(self): return self.ClassLV # 阶级(物品表LV字段)
    def GetEquipPlace(self): return self.EquipPlace # 装备位(物品表EquipPlace字段)
# 装备升星表
class IPY_EquipStarUp():
    def __init__(self):
        self.ClassLV = 0
        self.EquipPlace = 0
        self.Star = 0
        self.CostEquipPlace = []
        self.CostEquipColor = []
        self.CostEquipCnt = 0
        self.SuitTotalRate = 0
        self.CostItemDict = {}
        self.StarAttrInfo = {}
        self.BaseAttrInfo = {}
        return
    def GetClassLV(self): return self.ClassLV # 阶级
    def GetEquipPlace(self): return self.EquipPlace # 装备位
    def GetStar(self): return self.Star # 星数
    def GetCostEquipPlace(self): return self.CostEquipPlace # 可用装备部位
    def GetCostEquipColor(self): return self.CostEquipColor # 可用装备品质
    def GetCostEquipCnt(self): return self.CostEquipCnt # 装备数量
    def GetSuitTotalRate(self): return self.SuitTotalRate # 全套装加成概率(非套50%)
    def GetCostItemDict(self): return self.CostItemDict # 特殊材料
    def GetStarAttrInfo(self): return self.StarAttrInfo # 星级属性
    def GetBaseAttrInfo(self): return self.BaseAttrInfo # 基础属性增加
def Log(msg, playerID=0, par=0):
@@ -4483,6 +4542,10 @@
        self.ipyLuckyTreasureTemplateLen = len(self.ipyLuckyTreasureTemplateCache)
        self.ipyMysteryShopCache = self.__LoadFileData("MysteryShop", IPY_MysteryShop)
        self.ipyMysteryShopLen = len(self.ipyMysteryShopCache)
        self.ipyEquipPlaceIndexMapCache = self.__LoadFileData("EquipPlaceIndexMap", IPY_EquipPlaceIndexMap)
        self.ipyEquipPlaceIndexMapLen = len(self.ipyEquipPlaceIndexMapCache)
        self.ipyEquipStarUpCache = self.__LoadFileData("EquipStarUp", IPY_EquipStarUp)
        self.ipyEquipStarUpLen = len(self.ipyEquipStarUpCache)
        Log("IPY_FuncConfig count=%s" % len(self.ipyFuncConfigDict))
        Log("IPY_DataMgr InitOK!")
        return
@@ -4917,6 +4980,10 @@
    def GetLuckyTreasureTemplateByIndex(self, index): return self.ipyLuckyTreasureTemplateCache[index]
    def GetMysteryShopCount(self): return self.ipyMysteryShopLen
    def GetMysteryShopByIndex(self, index): return self.ipyMysteryShopCache[index]
    def GetEquipPlaceIndexMapCount(self): return self.ipyEquipPlaceIndexMapLen
    def GetEquipPlaceIndexMapByIndex(self, index): return self.ipyEquipPlaceIndexMapCache[index]
    def GetEquipStarUpCount(self): return self.ipyEquipStarUpLen
    def GetEquipStarUpByIndex(self, index): return self.ipyEquipStarUpCache[index]
IPYData = IPY_DataMgr()
def IPY_Data(): return IPYData
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py
@@ -41,6 +41,7 @@
import FormulaControl
#---------------------------------------------------------------------
##检查玩家是否可以换装
# @param curPlayer 玩家实例
# @return 返回值, 是否通过检查
@@ -54,14 +55,17 @@
    
    return True
## 执行玩家换装逻辑
#  @param curPlayer 当前玩家
#  @param curItem 物品实例
#  @param packEquipIndex 装备部位
#  @param equipPackIndex 装备背包索引
#  @param tick 当前时间
#  @return 布尔值
#  @remarks 执行玩家换装逻辑
def DoPlayerEquipItem(curPlayer, curItem, packEquipIndex, tick):
def DoPlayerEquipItem(curPlayer, curItem, equipPackIndex, tick):
    if equipPackIndex < 0:
        return False
    playerItemControl = ItemControler.PlayerItemControler(curPlayer)
    
    #---验证是否可以换这件装备---
@@ -76,11 +80,15 @@
    changeItemEquipPlace = curItem.GetEquipPlace()
    if changeItemEquipPlace not in ShareDefine.RoleEquipType:
        return False
    if ItemCommon.GetEquipPackIndex(curItem) != equipPackIndex:
        #检查装备位置和填表是否一致
        return False
    #--设置穿上物品星级--
    #===========================================================================
    # if changeItemEquipPlace in ChConfig.Type_Equip_CanTake:
    #    equipPartStar = GetEquipPartStarLV(curPlayer, IPY_GameWorld.rptEquip, changeItemEquipPlace)
    #    equipPartStar = GetEquipPartPlusLV(curPlayer, IPY_GameWorld.rptEquip, changeItemEquipPlace)
    #    if equipPartStar != curItem.GetItemStarLV():
    #        curItem.SetItemStarLV(equipPartStar)
    #===========================================================================
@@ -89,33 +97,34 @@
    #---开始换装逻辑---
    
    #记录换装物品信息
    itemClassLV = ItemCommon.GetItemClassLV(curItem)
    changeItemID = curItem.GetItemTypeID()
    changeItemStarLV = 0#curItem.GetItemStarLV()
    changeItemStoneCnt = 0#curItem.GetUseStoneCount()
    changeItemHoleCnt = 0#curItem.GetCanPlaceStoneCount()
    changeItemStarLV = 0  #curItem.GetItemStarLV()
    changeItemStoneCnt = 0  #curItem.GetUseStoneCount()
    changeItemHoleCnt = 0  #curItem.GetCanPlaceStoneCount()
    changeItemUseData = curItem.GetUserData()
    itemQuality = curItem.GetItemQuality()
    endureReduceType = curItem.GetEndureReduceType()
    #changeItemIsHorse = (curItem.GetType() == ChConfig.Def_Item_Type_Horse)
    
    #执行换装动作
    equipPlace = playerItemControl.EquipItem(curItem, packEquipIndex)
    equipPlace = playerItemControl.EquipItem(curItem, equipPackIndex)
    
    if equipPlace == -1:
        return False
    
    equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
    curEquip = equipPack.GetAt(equipPlace)
    SetEquipItemSuiteLVInfo(curPlayer, packEquipIndex, curEquip)
    curEquip = equipPack.GetAt(equipPackIndex)
    #SetEquipItemSuiteLVInfo(curPlayer, packEquipIndex, curEquip)
    if curEquip.GetUserAttr(ShareDefine.Def_IudetCreateTime) == 0:
        curEquip.SetUserAttr(ShareDefine.Def_IudetCreateTime, int(time.time()))
    #---换装成功---
    if equipPlace in ChConfig.Def_SyncEquipStateByIndex:
    if equipPackIndex in PlayerControl.GetFaceEquipIndexList(curPlayer):
        #通知客户端交换物品
        curPlayer.ChangeEquip(changeItemID, equipPlace, changeItemStarLV, changeItemHoleCnt, changeItemStoneCnt, changeItemUseData)
        curPlayer.ChangeEquip(changeItemID, equipPackIndex, changeItemStarLV, changeItemHoleCnt, changeItemStoneCnt, changeItemUseData)
        
    if not endureReduceType:
        EventShell.EventRespons_EquipByPlace(curPlayer, equipPlace)
        EventShell.EventRespons_EquipByPlace(curPlayer, itemClassLV, equipPlace)
    #记录橙装、红装
    #===========================================================================
    # if itemQuality in [ChConfig.Def_Quality_Orange, ChConfig.Def_Quality_Red]:
@@ -133,12 +142,13 @@
    if changeItemEquipPlace == ShareDefine.retWing:
        PlayerWing.CalcWingAttr(curPlayer)
    else:
        RefreshPlayerEquipAttribute(curPlayer)
        RefreshPlayerEquipAttribute(curPlayer, itemClassLV)
    
    #刷新所有属性
    playControl = PlayerControl.PlayerControl(curPlayer)
    playControl.RefreshPlayerAttrState()
    return True
def SetEquipItemSuiteLVInfo(curPlayer, equipIndex, curItem):
    # 设置部位套装信息
@@ -168,24 +178,21 @@
        for suiteLV in suiteLVList:
            curItem.AddUserAttr(ShareDefine.Def_IudetPartSuiteLV, suiteLV)
    return
    
## 刷新装备对人物属性的改变
#  @param self 类实例
#  @return 返回值无意义
#  @remarks 刷新装备对人物属性的改变
def RefreshPlayerEquipAttribute(curPlayer, isRefreshEquipBuff=True):
    GameWorld.DebugLog("Start RefreshPlayerEquipAttribute!!!")
def RefreshPlayerEquipAttribute(curPlayer, classlv=0):
    GameWorld.DebugLog("Start RefreshPlayerEquipAttribute classlv=%s!!!" % classlv)
    classlvList = range(1, IpyGameDataPY.GetFuncCfg('EquipMaxClasslv') + 1) if classlv == 0 else [classlv]
    for rclasslv in classlvList:
        __CalcEquips_Effect(curPlayer, rclasslv)
    __CalcEquips_Effect(curPlayer)
    #CalcAllEquipAllPlusLVAttr(curPlayer)
    CalcAllEquipStarsAttr(curPlayer)
    #if isRefreshEquipBuff:
    #    __RefreshPlayerAllEquipBuff(curPlayer)
    return
## 刷新所有装备对人物属性的改变
#  @param self 类实例
@@ -258,6 +265,7 @@
#    return
#===============================================================================
#===============================================================================
# #//07 03 人物装备物品#tagCEquipItem
# //角色装备类型
@@ -274,6 +282,7 @@
    GameWorld.GetPsycoFunc(__Func_PlayerEquipItem)(index, tick)
    return
## 人物装备物品
#  @param index 背包索引
#  @param tick 当前时间
@@ -285,7 +294,7 @@
    #物品在物品背包的索引
    packItemIndex = sendPack.GetItemIndex()
    #角色装备部位
    packEquipIndex = sendPack.GetRoleEquipType()
    equipPackIndex = sendPack.GetRoleEquipType()
    
    #检查玩家状态是否可以换装
    if not CheckPlayerCanEquipItem(curPlayer):
@@ -303,14 +312,14 @@
    #---获取封包需要装备的物品---
    rolePack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
    curItem = rolePack.GetAt(packItemIndex)
    #---执行玩家换装逻辑---
    if DoPlayerEquipItem(curPlayer, curItem, packEquipIndex, tick):
    if DoPlayerEquipItem(curPlayer, curItem, equipPackIndex, tick):
        return
    
    #换装失败通知客户端信息
    curPlayer.Notify_ItemPutFail(IPY_GameWorld.rptItem, packItemIndex, IPY_GameWorld.rptEquip, 0)
    return
#---------------------------------------------------------------------
## 一键换装(封包)
@@ -331,6 +340,7 @@
    GameWorld.GetPsycoFunc(__Func_PlayerUnEquip)(index, tick)
    return
#---------------------------------------------------------------------    
## 玩家卸下装备(封包参数)
#  @param index 玩家索引
@@ -344,7 +354,7 @@
    if not CheckPlayerCanEquipItem(curPlayer):
        return
    
    equipIndex = sendPack.GetEquipIndex()
    equipPackIndex = sendPack.GetEquipIndex()
    #如果卸下的是马匹,需要判定如果马匹装备背包有物品,不让放下
    #===========================================================================
@@ -357,7 +367,7 @@
    #===========================================================================
    
    playerItemControl = ItemControler.PlayerItemControler(curPlayer)
    result = playerItemControl.UnEquipItem(equipIndex, sendPack.GetPackIndex())
    result = playerItemControl.UnEquipItem(equipPackIndex, sendPack.GetPackIndex())
    
    if not result:
        #卸下装备失败
@@ -368,11 +378,11 @@
    
    ##特殊装备 , 不需要冲刷属性
    if equipPlace in ChConfig.EquipItemNoRefreshState:
        curPlayer.Sync_UnEquipItem(equipID, equipPlace)
        curPlayer.Sync_UnEquipItem(equipID, equipPackIndex)
        return
    
    #先刷装备BUFF 再计算属性
    if equipIndex == ShareDefine.retWing:
    if equipPlace == ShareDefine.retWing:
        PlayerWing.CalcWingAttr(curPlayer)
    else:
        RefreshPlayerEquipAttribute(curPlayer)
@@ -382,7 +392,7 @@
    playControl.RefreshPlayerAttrState()
    
    if equipPlace in ChConfig.Def_SyncEquipStateByIndex:
        curPlayer.Sync_UnEquipItem(equipID, equipPlace)
        curPlayer.Sync_UnEquipItem(equipID, equipPackIndex)
    return
@@ -403,7 +413,6 @@
                                        IPY_GameWorld.oalUseItem
                                        ):
        return
    
    #检查使用物品的玩家属性
    if not ChItem.CheckUseItemSelf_Player(curPlayer):
@@ -433,38 +442,38 @@
## 计算装备对基本属性的改变 
#  @param classlv
#  @return None
def __CalcEquips_Effect(curPlayer):
    baseEquipAttrDict = {}
    baseEquipAttr_Weapon = [{} for _ in range(4)] # 武器基础, 物品表装备基础效果属性
    baseEquipAttr_Armor = [{} for _ in range(4)] # 防具基础, 物品表装备基础效果属性
    baseEquipAttr_Relics = [{} for _ in range(4)] # 圣器基础, 物品表装备基础效果属性
def __CalcEquips_Effect(curPlayer, classlv):
#    baseEquipAttrDict = {}
#    baseEquipAttr_Weapon = [{} for _ in range(4)]  # 武器基础, 物品表装备基础效果属性
#    baseEquipAttr_Armor = [{} for _ in range(4)]  # 防具基础, 物品表装备基础效果属性
#    baseEquipAttr_Relics = [{} for _ in range(4)]  # 圣器基础, 物品表装备基础效果属性
    
    allAttrListEquip = [{} for _ in range(4)] # 装备其他
    allAttrListPlusBase = [{} for _ in range(4)] # 基础强化属性
    allAttrListStone = [{} for _ in range(4)] # 宝石属性
    allAttrListSuit = [{} for _ in range(4)] # 套装属性
    allAttrListWash = [{} for _ in range(4)] # 洗练属性
    allAttrListOutOfPrintEquip = [{} for _ in range(4)] # 绝版装备属性 需在等级变化独立计算
    allAttrListStar = [{} for _ in range(4)]  # 星数属性
    #allAttrListEquip = [{} for _ in range(4)]  # 装备其他
    #allAttrListPlusBase = [{} for _ in range(4)]  # 基础强化属性
    allAttrListStone = [{} for _ in range(4)]  # 宝石属性
    #allAttrListSuit = [{} for _ in range(4)]  # 套装属性
    #allAttrListWash = [{} for _ in range(4)]  # 洗练属性
    #allAttrListOutOfPrintEquip = [{} for _ in range(4)]  # 绝版装备属性 需在等级变化独立计算
    
    packType = IPY_GameWorld.rptEquip
    playerEquip = curPlayer.GetItemManager().GetPack(packType)
    equipPartStarIndexList = ChConfig.Pack_EquipPart_CanPlusStar.get(packType, [])
    maxSuiteType = IpyGameDataPY.GetFuncCfg('EquipSuitColorStar', 2) #最大套装类型
    equipPlaceList = [] # 有穿戴装备的装备位列表
    suitCntDict = {} #套装数量字典
    legendAttrDict = {} #所有传奇属性
    equipScoreTotal = 0 #为解决装备评分、战力不一致的情况,装备战力改为由评分作为参数计算战力
    #maxSuiteType = IpyGameDataPY.GetFuncCfg('EquipSuitColorStar', 2)  #最大套装类型
    #equipPlaceList = []  # 有穿戴装备的装备位列表
    #suitCntDict = {}  #套装数量字典
    #legendAttrDict = {}  #所有传奇属性
    equipScoreTotal = 0  #为解决装备评分、战力不一致的情况,装备战力改为由评分作为参数计算战力
    
    #玩家当前可装备的装备类型
    for equipIndex in xrange(playerEquip.GetCount()):
        if equipIndex not in ShareDefine.RoleEquipType :
    for equipPlace in equipPartStarIndexList:
        ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classlv, equipPlace)
        if not ipyData:
            continue
        # 翅膀属性在翅膀功能单独刷新
        if equipIndex in ChConfig.EquipItemNoRefreshState or equipIndex == ShareDefine.retWing:
            continue
        equipIndex = ipyData.GetGridIndex()
        curEquip = playerEquip.GetAt(equipIndex)
        if curEquip.IsEmpty():
            continue
@@ -473,78 +482,76 @@
            # 过期
            continue
        
        equipPlaceList.append(equipIndex)
        #equipPlaceList.append(equipIndex)
        equipScoreTotal += ItemCommon.GetEquipGearScore(curEquip)
        
        #基础属性效果
        for i in range(0, curEquip.GetEffectCount()):
        for i in xrange(curEquip.GetEffectCount()):
            curEffect = curEquip.GetEffectByIndex(i)
            if not curEffect:
                break
            effectID = curEffect.GetEffectID()
            if effectID == 0:
                #最后一个
                break
            effectValue = curEffect.GetEffectValue(0)
            if not effectValue:
                continue
#            if equipIndex in ChConfig.BaseEquipPlace_Weapon:
#                PlayerControl.CalcAttrDict_Type(effectID, effectValue, baseEquipAttr_Weapon)
#            elif equipIndex in ChConfig.BaseEquipPlace_Armor:
#                PlayerControl.CalcAttrDict_Type(effectID, effectValue, baseEquipAttr_Armor)
#            elif equipIndex in ChConfig.BaseEquipPlace_Relics:
#                PlayerControl.CalcAttrDict_Type(effectID, effectValue, baseEquipAttr_Relics)
#            #其他非基础部位的
#            else:
#                PlayerControl.CalcAttrDict_Type(effectID, effectValue, allAttrListEquip)
#            baseEquipAttrDict[effectID] = baseEquipAttrDict.get(effectID, 0) + effectValue
            
            #添加物品效果的属性值
#            if equipIndex == ShareDefine.retWing:
#                PlayerControl.CalcAttrDict_Type(effectID, effectValue, allAttrListWing)
            if equipIndex in ChConfig.BaseEquipPlace_Weapon:
                PlayerControl.CalcAttrDict_Type(effectID, effectValue, baseEquipAttr_Weapon)
            elif equipIndex in ChConfig.BaseEquipPlace_Armor:
                PlayerControl.CalcAttrDict_Type(effectID, effectValue, baseEquipAttr_Armor)
            elif equipIndex in ChConfig.BaseEquipPlace_Relics:
                PlayerControl.CalcAttrDict_Type(effectID, effectValue, baseEquipAttr_Relics)
            #其他非基础部位的
            else:
                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
#        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) #生效的星数
        CalcEquipStarAttr(curPlayer, classlv, equipPlace, equipPartStar, allAttrListStar)
        #计算装备宝石加成
        CalcEquipStone_Effect(curPlayer, equipIndex, allAttrListStone)
        
        #物品强化属性,佩饰强化不同要区分
        if equipIndex in equipPartStarIndexList:
            equipPartStarLV = GetEquipPartStarLVByRank(curPlayer, packType, equipIndex, curEquip)
            CalcAttr_ItemPlus(curPlayer, curEquip, allAttrListPlusBase, equipPartStarLV)
#        if equipIndex in equipPartStarIndexList:
#            equipPartStarLV = GetEquipPartPlusLVByRank(curPlayer, packType, equipIndex, curEquip)
#            CalcAttr_ItemPlus(curPlayer, curEquip, allAttrListPlusBase, equipPartStarLV)
        
        #传奇属性
        CalcAttr_LegendAttr(curPlayer, curEquip, allAttrListEquip, legendAttrDict)
        #CalcAttr_LegendAttr(curPlayer, curEquip, allAttrListEquip, legendAttrDict)
        #绝世属性
        CalcAttr_OutOfPrintAttr(curPlayer, curEquip, allAttrListOutOfPrintEquip)
        #CalcAttr_OutOfPrintAttr(curPlayer, curEquip, allAttrListOutOfPrintEquip)
        #洗练属性
        Operate_EquipWash.CalcAttr_EquipWash(curPlayer, equipIndex, allAttrListWash)
        #Operate_EquipWash.CalcAttr_EquipWash(curPlayer, equipIndex, allAttrListWash)
    
    #洗练套装属性
    Operate_EquipWash.CalcAttr_EquipWashSpec(curPlayer, equipPlaceList, allAttrListWash)
    #Operate_EquipWash.CalcAttr_EquipWashSpec(curPlayer, equipPlaceList, allAttrListWash)
    #套装属性
    CalcEquipSuiteAttr(curPlayer, suitCntDict, allAttrListSuit)
    #CalcEquipSuiteAttr(curPlayer, suitCntDict, allAttrListSuit)
    #GameWorld.DebugLog("所有传奇属性: %s" % legendAttrDict)
    #保存计算值
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_EquipBaseWeapon, baseEquipAttr_Weapon)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_EquipBaseArmor, baseEquipAttr_Armor)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_EquipBaseRelics, baseEquipAttr_Relics)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Equip, allAttrListEquip)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PlusBase, allAttrListPlusBase)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Stone, allAttrListStone)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Suit, allAttrListSuit)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Wash, allAttrListWash)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_EquipOutOfPrint, allAttrListOutOfPrintEquip)
    #PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Stone, allAttrListStone)
    #PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Stone, allAttrListStar)
#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_EquipBaseWeapon, baseEquipAttr_Weapon)
#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_EquipBaseArmor, baseEquipAttr_Armor)
#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_EquipBaseRelics, baseEquipAttr_Relics)
#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Equip, allAttrListEquip)
#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PlusBase, allAttrListPlusBase)
#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Suit, allAttrListSuit)
#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Wash, allAttrListWash)
#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_EquipOutOfPrint, allAttrListOutOfPrintEquip)
    
    #计算装备基础属性附加战力 (目前组成: 评分战力 + ...)
    equipFightPowerEx = eval(IpyGameDataPY.GetFuncCompileCfg("FightpowerFormula", 2))
@@ -574,6 +581,7 @@
        #legendAttrDict[attrID] = legendAttrDict.get(attrID, 0) + value
        
    return
# 装备绝版属性,随等级变化需在升级再处理
def CalcAttr_OutOfPrintAttr(curPlayer, curEquip, allAttrListOutOfPrintEquip):
@@ -605,7 +613,7 @@
## 计算装备对基本属性的改变 
#  @return None
def CalcEquips_OutOfPrint(curPlayer):
    allAttrListOutOfPrintEquip = [{} for _ in range(4)] # 绝版装备属性 需在等级变化独立计算
    allAttrListOutOfPrintEquip = [{} for _ in range(4)]  # 绝版装备属性 需在等级变化独立计算
    
    packType = IPY_GameWorld.rptEquip
    playerEquip = curPlayer.GetItemManager().GetPack(packType)
@@ -630,10 +638,10 @@
        #绝世属性
        CalcAttr_OutOfPrintAttr(curPlayer, curEquip, allAttrListOutOfPrintEquip)
    #保存计算值
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_EquipOutOfPrint, allAttrListOutOfPrintEquip)
    return
## 计算装备强化后的属性
#  @param curPlayer 当前玩家
@@ -649,7 +657,7 @@
    ipyData = IpyGameDataPY.GetIpyGameData("ItemPlus", plusType, equipPartStarLV)
    if not ipyData:
        return
    attrTypeList, attrValueList =  ipyData.GetAttrType(), ipyData.GetAttrValue()
    attrTypeList, attrValueList = ipyData.GetAttrType(), ipyData.GetAttrValue()
    for i, attrID in enumerate(attrTypeList):
        PlayerControl.CalcAttrDict_Type(attrID, attrValueList[i], allAttrList)
    return
@@ -664,7 +672,7 @@
    notifyType = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AttrActivatyNotify)
    isAll, addAttrList = ReadChConfig.GetEvalChConfig('EquipQualityAddAttr')
    for confInfo in addAttrList:
        confQuality = confInfo[1] # 配置品质标识 1-卓越,2-套装
        confQuality = confInfo[1]  # 配置品质标识 1-卓越,2-套装
        cnt = 0 
        if confQuality == 1:
            cnt = qualityEquipCnt
@@ -672,7 +680,7 @@
            cnt = suiteEquipCnt
        
        confCnt = confInfo[0]
        if cnt >= confCnt: # 如果件数满足
        if cnt >= confCnt:  # 如果件数满足
            EquipAddBuff(curPlayer, confInfo[2])
            
            if confQuality == 2 and confCnt > notifySuiteCnt and notifyType == \
@@ -687,11 +695,12 @@
            
    lastSuiteCntRecord = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AttrActivatyRecordSuiteCnt) 
    if notifySuiteCnt > 0 and notifySuiteCnt > lastSuiteCntRecord:
        PlayerControl.NotifyCode(curPlayer, "GeRen_hgg_917284", [curPlayer.GetPlayerName(),
        PlayerControl.NotifyCode(curPlayer, "GeRen_hgg_917284", [curPlayer.GetPlayerName(),
                                                                 notifySuiteCnt])
    curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrActivatyRecordSuiteCnt, suiteCntRecord)
    #GameWorld.DebugLog("套装件数  上次记录=%s,更新记录=%s" % (lastSuiteCntRecord, suiteCntRecord))
    return
## 添加装备全身强化等级对应属性
#  @param curPlayer 当前玩家
@@ -717,44 +726,27 @@
    
    return attrDict
## 添加装备全身星数对应属性
def CalcAllEquipStarsAttr(curPlayer):
    allAttrList = [{} for i in range(4)]
    totalStars = GetTotalEquipStars(curPlayer)
    activeStars = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipActiveStars)
    totalStars = min(totalStars, activeStars)
    if totalStars:
        ipyData = IpyGameDataPY.InterpolationSearch("RoleEquipStars", "StarsNeed", totalStars)
        if ipyData:
            attrTypeList = ipyData.GetAttrType()
            attrValueList = ipyData.GetAttrValue()
            for i, attrID in enumerate(attrTypeList):
                PlayerControl.CalcAttrDict_Type(attrID, attrValueList[i], allAttrList)
    #GameWorld.DebugLog("装备全身星数属性: totalStars=%s,allAttrList=%s" % (totalStars, allAttrList), curPlayer.GetPlayerID())
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_EquipAllStars, allAttrList)
    return
## 装备套装属性计算
#  @param curPlayer 当前玩家
#  @return None
def CalcEquipSuiteAttr(curPlayer, suitCntDict, allAttrListEquip):
    Def_EquipSuitMaxCount = 3 #套装最大阶段
    Def_EquipSuitMaxCount = 3  #套装最大阶段
    myjob = curPlayer.GetJob()
    name = curPlayer.GetName()
    
    for suiteKey, cnt in suitCntDict.items():
        groupType,suiteType,suiteLV = suiteKey.split('_')
        groupType, suiteType, suiteLV = suiteKey.split('_')
        suiteLV = int(suiteLV)
        job = 0 if groupType == ChConfig.EquipGroupType_Relics else myjob #仙器组合默认职业0
        job = 0 if groupType == ChConfig.EquipGroupType_Relics else myjob  #仙器组合默认职业0
        ipyData = IpyGameDataPY.GetIpyGameData('EquipSuitAttr', int(groupType), int(suiteType), int(suiteLV), job)
        if not ipyData:
            continue
        
        for i in range(1, Def_EquipSuitMaxCount+1):
            countKeyName = 'GetCount%d'%i
            attrTypeKeyName = 'GetAttrType%d'%i
            attrValueKeyName = 'GetAttrValue%d'%i
        for i in range(1, Def_EquipSuitMaxCount + 1):
            countKeyName = 'GetCount%d' % i
            attrTypeKeyName = 'GetAttrType%d' % i
            attrValueKeyName = 'GetAttrValue%d' % i
            needCnt = getattr(ipyData, countKeyName)()
            if cnt >= needCnt:
                attrTypeList = getattr(ipyData, attrTypeKeyName)()
@@ -764,11 +756,11 @@
                    PlayerControl.CalcAttrDict_Type(attrID, value, allAttrListEquip)
                    
        #套装激活提示(只提示1次)
        paramList= [name, cnt, suiteLV, groupType, suiteType]
        paramList = [name, cnt, suiteLV, groupType, suiteType]
        notifyRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartSuiteNotify % (groupType, suiteType, cnt))
        if not notifyRecord & pow(2, suiteLV):
            if groupType == ChConfig.EquipGroupType_Armor:
                if cnt >=5:
                if cnt >= 5:
                    PlayerControl.WorldNotify(0, 'EquipSuit5', paramList)
                    notifyRecord |= pow(2, suiteLV)
            else:
@@ -778,12 +770,14 @@
    
    return
##全身橙色装备数量触发相关(包含橙色品质以上的装备数量)
def OnOrangeQualityCntChange(curPlayer, orangeQualityCnt):
    notifyType = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AttrActivatyNotify)
    if notifyType == ChConfig.Def_AttrActivatyNotify_Equip:
        EventShell.EventRespons_OrangeQualityCnt(curPlayer, orangeQualityCnt)
    return
## 1算装备触发的技能 (全身) 
#  @param curPlayer 当前玩家
@@ -794,6 +788,7 @@
    SkillShell.RefreshSkillBuffByEquip(curPlayer, curEquip)
    return
## 计算装备镶嵌宝石附加效果->基本属性 (宝石) 
#  @param curPlayer 当前玩家
#  @param curEquip 当前装备
@@ -802,7 +797,7 @@
def CalcEquipStone_Effect(curPlayer, equipIndex, allAttrList):
    gameData = GameWorld.GetGameData()
    effIndexList = [1, 2, 3, 4] # 第一个效果值是类型等级效果值,非属性效果值
    effIndexList = [1, 2, 3, 4]  # 第一个效果值是类型等级效果值,非属性效果值
    gemLVList = []
    for holeIndex in Operate_EquipStone.GetAllEquipPlaceHoleIndex():
        
@@ -823,6 +818,19 @@
        gemLVList.append(gemLV)
    return gemLVList
def CalcEquipStarAttr(curPlayer, classlv, equipPlace, equipPartStar, allAttrListStar):
    ## 计算装备星数属性
    ipyData = IpyGameDataPY.GetIpyGameData('EquipStarUp', classlv, equipPlace, equipPartStar)
    if not ipyData:
        return
    starAttrDict = ipyData.GetStarAttrInfo()
    for attrID, attrValue in starAttrDict.items():
        PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListStar)
    baseAttrDict = ipyData.GetBaseAttrInfo()
    for attrID, attrValue in baseAttrDict.items():
        PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListStar)
    return
#---------------------------------------------------------------------
## 装备添加Buff 
#  @param curPlayer 当前玩家
@@ -837,19 +845,20 @@
    if value > 0:
        curBuff.SetValue(value)
    return
#---------------------------------------------------------------------
#===============================================================================
# #//03 2F 请求装备显隐#tagRequestEquipShowHide
# //装备显示开关
# int GetEquipShowSwitch();
# int GetEquipShowSwitch(); 第几套*10+是否有套装
#===============================================================================
##请求装备显隐.
##请求装备显隐. (设置显示哪套装备外观)
# @param index 玩家索引
# @param tick 时间戳
# @return 返回值无意义
# @remarks 客户端封包响应 //03 2F 请求装备显隐#tagRequestEquipShowHide
def RequestEquipShowHide(index, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    
    #---检查刷新间隔--
@@ -861,14 +870,43 @@
        return
    
    sendPack = IPY_GameWorld.IPY_CRequestEquipShowHide()
    #此功能无需验证
    curPlayer.SetEquipShowSwitch(sendPack.GetEquipShowSwitch())
    updEquipShowSwitch = sendPack.GetEquipShowSwitch()
    oldEquipShowSwitch = curPlayer.GetEquipShowSwitch()
    if updEquipShowSwitch == oldEquipShowSwitch:
        return
    #通知外观装备
    updFaceEquipIndex = 0
    equipIndexList = []
    for equipPlace in [ShareDefine.retWeapon, ShareDefine.retWeapon2, ShareDefine.retClothes]:
        ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', 1, 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):
            continue
        changeItemID = curEquip.GetItemTypeID()
        changeItemStarLV = 0  #curItem.GetItemStarLV()
        changeItemStoneCnt = 0  #curItem.GetUseStoneCount()
        changeItemHoleCnt = 0  #curItem.GetCanPlaceStoneCount()
        changeItemUseData = curEquip.GetUserData()
        curPlayer.ChangeEquip(changeItemID, equipPackIndex, changeItemStarLV, changeItemHoleCnt, changeItemStoneCnt, changeItemUseData)
    curPlayer.SetEquipShowSwitch(updEquipShowSwitch)
    curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_RequestEquipShowHide, tick)
    return
## 获取公共部位强化熟练度
def GetEquipPartProficiency(curPlayer, packType, index):
    return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartProficiency % (packType, index))
## 设置公共部位强化熟练度
def SetEquipPartProficiency(curPlayer, packType, index, value):
@@ -876,22 +914,22 @@
## 获取公共部位强化星级, 因装备的最高可强化星级影响,用于算当前装备属性使用, 不影响全身星级
def GetEquipPartStarLVByRank(curPlayer, packType, index, curEquip):
    maxStarLV = ItemCommon.GetItemMaxStarLV(curEquip)
    return min(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartStarLV % (packType, index)), maxStarLV)
def GetEquipPartPlusLVByRank(curPlayer, packType, index, curEquip):
    maxStarLV = ItemCommon.GetItemMaxPlusLV(curEquip)
    return min(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartPlusLV % (packType, index)), maxStarLV)
## 获取公共部位强化星级
def GetEquipPartStarLV(curPlayer, packType, index):
    return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartStarLV % (packType, index))
def GetEquipPartPlusLV(curPlayer, packType, index):
    return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartPlusLV % (packType, index))
## 设置公共部位强化星级
def SetEquipPartStarLV(curPlayer, packType, index, curEquip, starLV):
    if GetEquipPartStarLV(curPlayer, packType, index) == starLV:
def SetEquipPartPlusLV(curPlayer, packType, index, curEquip, starLV):
    if GetEquipPartPlusLV(curPlayer, packType, index) == starLV:
        return
    
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartStarLV % (packType, index), starLV)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartPlusLV % (packType, index), starLV)
    #===========================================================================
    # if curEquip and not curEquip.IsEmpty():
    #    curEquip.SetItemStarLV(starLV)
@@ -899,8 +937,9 @@
    return
## 通知公共部位强化星级
def NotifyEquipPartStarLV(curPlayer, packType=None, index=None):
## 通知公共部位强化等级
def NotifyEquipPartPlusLV(curPlayer, packType=None, index=None):
    ePartStarLVPack = ChPyNetSendPack.tagMCEquipPartStarLVInfo()
    ePartStarLVPack.Clear()
    ePartStarLVPack.InfoList = []
@@ -919,7 +958,7 @@
            ePartStarLV.Clear()
            ePartStarLV.PackType = pType
            ePartStarLV.EquipIndex = i
            ePartStarLV.EquipPartStarLV = GetEquipPartStarLV(curPlayer, pType, i)
            ePartStarLV.EquipPartStarLV = GetEquipPartPlusLV(curPlayer, pType, i)
            ePartStarLV.Proficiency = GetEquipPartProficiency(curPlayer, pType, i)
            ePartStarLVPack.InfoList.append(ePartStarLV)
            
@@ -939,20 +978,10 @@
            if not curEquip  or curEquip.IsEmpty():
                continue
            
        partStarLV = GetEquipPartStarLV(curPlayer, IPY_GameWorld.rptEquip, i)
        partStarLV = GetEquipPartPlusLV(curPlayer, IPY_GameWorld.rptEquip, i)
        totalPlusLV += partStarLV
    return totalPlusLV
## 全身装备星数
def GetTotalEquipStars(curPlayer):
    totalEquipStars = 0
    equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
    for i in ChConfig.BaseEquipPlaceList:
        curEquip = equipPack.GetAt(i)
        if not curEquip or curEquip.IsEmpty():
            continue
        totalEquipStars += curEquip.GetItemQuality()
    return totalEquipStars
# 获取装备的强化类型
def GetEquipPlusType(curEquip):
@@ -964,6 +993,7 @@
    
    return plusTypeDict.get(equipPlace, -1)
def SetEquipPartSuiteLV(curPlayer, index, suiteType, suiteLV):
    #设置公共部位套装等级
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartSuiteLV % (index, suiteType), suiteLV)
@@ -971,9 +1001,11 @@
    SetEquipItemSuiteLVInfo(curPlayer, index, equipPack.GetAt(index))
    return
def GetEquipPartSuiteLV(curPlayer, index, suiteType):
    #获取公共部位套装等级
    return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartSuiteLV % (index, suiteType))
def GetEquipPartSuiteGroupType(curPlayer, equipIndex):
    #获取公共部位套装组合类型
@@ -984,6 +1016,7 @@
            findGroupType = int(groupType)
            break
    return findGroupType
#  获取满套装化的最低阶数,如5件套,4件5级,1件3级,则返回3
def GetEquipSuitsLVByType(curPlayer, suitType, groupType):
@@ -1027,11 +1060,12 @@
    NetPackCommon.SendFakePack(curPlayer, ePartSuitePack)
    return
def GetSuiteInfoByPlace(curPlayer, equipPlace, curEquip=None):
    suiteInfo = {} #{套装类型:等级}
    suiteInfo = {}  #{套装类型:等级}
    groupType = GetEquipPartSuiteGroupType(curPlayer, equipPlace)
    maxSuiteType = IpyGameDataPY.GetFuncCfg('EquipSuitColorStar', 2)
    for suiteType in range(1, maxSuiteType+1):
    for suiteType in range(1, maxSuiteType + 1):
        suiteLV = GetEquipPartSuiteLV(curPlayer, equipPlace, suiteType)
        if suiteLV:
            if curEquip:
@@ -1040,13 +1074,14 @@
            suiteInfo[suiteType] = suiteLV
    return suiteInfo
def GetEquipPartSuiteLVList(curPlayer, equipPlace, curEquip=None):
    ## 部位套装等级列表
    groupType = GetEquipPartSuiteGroupType(curPlayer, equipPlace)
              
    suiteLVList = []
    maxSuiteType = IpyGameDataPY.GetFuncCfg('EquipSuitColorStar', 2)
    for suiteType in xrange(1, maxSuiteType+1):
    for suiteType in xrange(1, maxSuiteType + 1):
        suiteLV = GetEquipPartSuiteLV(curPlayer, equipPlace, suiteType)
        if curEquip and suiteLV:
            maxSuiteLV = Operate_EquipSuitCompose.GetEquipCanDoMaxSuiteLV(curPlayer, curEquip, suiteType, groupType)
@@ -1054,6 +1089,52 @@
        
        suiteLVList.append(suiteLV)
    return suiteLVList
def SetEquipPartStar(curPlayer, equipPackindex, star):
    #设置公共部位星数
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartStar % equipPackindex, star)
    return
def GetEquipPartStar(curPlayer, equipPackindex):
    #获取公共部位星数
    return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartStar % equipPackindex)
## 获取公共部位生效的星数, 因装备的最高可到星数影响,用于算当前装备属性使用, 不影响全身星级
def GetEquipPartStarByRank(curPlayer, equipPackindex, curEquip):
    maxStarLV = ItemCommon.GetItemMaxStar(curEquip)
    return min(GetEquipPartStar(curPlayer, equipPackindex), maxStarLV)
## 通知公共部位星数
def NotifyEquipPartStar(curPlayer, index=None):
    ePartStarLVPack = ChPyNetSendPack.tagMCEquipPartStarInfo()
    ePartStarLVPack.Clear()
    ePartStarLVPack.InfoList = []
    syncIndexList = []
    if index == None:
        equipMaxClasslv = IpyGameDataPY.GetFuncCfg('EquipMaxClasslv')
        for equipPlace in ChConfig.Pack_EquipPart_CanPlusStar.get(IPY_GameWorld.rptEquip, []):
            for classlv in xrange(equipMaxClasslv):
                ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classlv, equipPlace)
                if not ipyData:
                    continue
                syncIndexList.append(ipyData.GetGridIndex())
    else:
        syncIndexList = [index]
    for index in syncIndexList:
        ePartStarLV = ChPyNetSendPack.tagMCEquipPartStar()
        ePartStarLV.Clear()
        ePartStarLV.EquipPackIndex = index
        ePartStarLV.Star = GetEquipPartStar(curPlayer, index)
        ePartStarLVPack.InfoList.append(ePartStarLV)
    ePartStarLVPack.Count = len(ePartStarLVPack.InfoList)
    NetPackCommon.SendFakePack(curPlayer, ePartStarLVPack)
    return
#// A5 03 全身属性激活 #tagCMActiveAllEquipAttr
@@ -1077,7 +1158,7 @@
        return
    curCnt = curPlayer.NomalDictGetProperty(key)
    if activeCnt <= curCnt:
        GameWorld.Log('    全身属性激活 该数量已激活过! activeType=%s,activeCnt=%s,curCnt=%s'%(activeType, activeCnt, curCnt))
        GameWorld.Log('    全身属性激活 该数量已激活过! activeType=%s,activeCnt=%s,curCnt=%s' % (activeType, activeCnt, curCnt))
        return
    
    PlayerControl.NomalDictSetProperty(curPlayer, key, activeCnt)
@@ -1093,12 +1174,13 @@
    playControl.RefreshPlayerAttrState()
    return
def SyncAllEquipAttrActiveInfo(curPlayer, activeType=-1):
    ## 通知全身属性激活数量
    packData = ChPyNetSendPack.tagMCAllEquipAttrActiveInfo()
    packData.ActiveInfo = []
    for aType in [0, 1]:
        if activeType !=-1 and activeType != aType:
        if activeType != -1 and activeType != aType:
            continue
        if aType == 0:
            key = ChConfig.Def_PDict_EquipActiveStarLV
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/EquipZhuXian.py
@@ -190,6 +190,7 @@
def CalcZhuXianAttr(curPlayer):
    return
    ## 刷新诛仙属性
    playerID = curPlayer.GetPlayerID()
    PyGameData.g_zhuXianSkillAddPerDict.pop(playerID, None)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -820,14 +820,14 @@
    
    ## 交换装备
    #  @param curItem 当前物品
    #  @param equipPlace 装备位置
    #  @param equipPackIndex 装备背包格子
    #  @return True or False
    #  @remarks 函数详细说明.   
    def SwitchEquip(self, curItem, equipPlace):
    def SwitchEquip(self, curItem, equipPackIndex):
        curPlayer = self.__Player
        equipPack = self.__PlayerEquip
        
        curEquip = equipPack.GetAt(equipPlace)
        curEquip = equipPack.GetAt(equipPackIndex)
        
        #GameWorld.Log("装备位置%d"%equipPlace)
        if curEquip.IsEmpty():
@@ -866,21 +866,17 @@
    ## 装备当前物品
    #  @param curItem 当前物品
    #  @param packEquipIndex 客户端发来装备位置(IPY_GameWorld.retMax 代表服务器自动装备)
    #  @param equipPackIndex 客户端发来装备位置(IPY_GameWorld.retMax 代表服务器自动装备)
    #  @return 替换的位置 -1表示替换失败
    def EquipItem(self, curItem, packEquipIndex):
    def EquipItem(self, curItem, equipPackIndex):
        if not self.PlayerCanEquipItem(curItem, True):
            return -1
        
        equipPlace = curItem.GetEquipPlace()
        if packEquipIndex != equipPlace:
            #仙器有两个位置,其他装备检查装备位置和填表是否一致
            if equipPlace not in ChConfig.Def_FairyCanList and packEquipIndex not in ChConfig.Def_FairyCanList:
                return -1
        curPlayer = self.__Player
        equipPack = self.__PlayerEquip
        equipItem = equipPack.GetAt(packEquipIndex)
        equipItem = equipPack.GetAt(equipPackIndex)
        desItemID, desUserData = [0, ''] if equipItem.IsEmpty() else [equipItem.GetItemTypeID(), equipItem.GetUserData()]
        srcItemID, srcUserData = curItem.GetItemTypeID(), curItem.GetUserData()
        # 装备绑定处理 在 DoLogic_ItemBindType函数有处理,此处注释掉
@@ -889,20 +885,20 @@
        
        #--其他装备物品---
        #itemColor = curItem.GetItemColor()
        result = self.SwitchEquip(curItem, packEquipIndex)
        result = self.SwitchEquip(curItem, equipPackIndex)
        if result:
            #穿戴某阶某品质的装备成就
            PlayerSuccess.DoEquipSuccessLogic(curPlayer)
            #换装宝石处理
            Operate_EquipStone.DoMoveEquipStone(curPlayer, packEquipIndex)
            Operate_EquipStone.DoMoveEquipStone(curPlayer, equipPackIndex)
            #套装降级处理
            Operate_EquipSuitCompose.CheckEquipSuitReduce(curPlayer, packEquipIndex)
            #Operate_EquipSuitCompose.CheckEquipSuitReduce(curPlayer, packEquipIndex)
            EventShell.EventRespons_EquipStar(curPlayer)
            dataDict = {'dotype':'EquipItem', 'desItemID':desItemID, 'desUserData':desUserData,'srcItemID':srcItemID,'srcUserData':srcUserData}
            DataRecordPack.Cache_FightPowerChangeInfo(curPlayer, ChConfig.PowerDownType_EquipChange, dataDict)
            
        self.RefreshStartEquipCount()
        return packEquipIndex if result else -1
        return equipPlace if result else -1
    
    ## 替换可以叠加物品逻辑 
@@ -961,6 +957,7 @@
        
        equipID = curEquip.GetItemTypeID()
        userData = curEquip.GetUserData()
        equipPlace = curEquip.GetEquipPlace()
        #该物品锁定不执行==============================================
        if curEquip.GetIsLocked():
            PlayerControl.NotifyCode(curPlayer, "RescannotEquip")
@@ -996,7 +993,7 @@
            return
        self.RefreshStartEquipCount()
        #套装降级处理
        Operate_EquipSuitCompose.CheckEquipSuitReduce(curPlayer, equipIndex)
        #Operate_EquipSuitCompose.CheckEquipSuitReduce(curPlayer, equipIndex)
        EventShell.EventRespons_EquipStar(curPlayer)
        dataDict = {'dotype':'UnEquipItem', 'equipID':equipID, 'userData':userData}
        DataRecordPack.Cache_FightPowerChangeInfo(curPlayer, ChConfig.PowerDownType_EquipChange, dataDict)
@@ -1011,7 +1008,7 @@
#        
#        destItemPlace.PutIn(curEquip)
#===============================================================================
        return equipID, equipIndex
        return equipID, equipPlace
    
    #是否能放入物品(第几个物品栏, 物品序号, 放入的物品, 放入物品ID,  物品是否绑定)
#===============================================================================
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py
@@ -823,7 +823,7 @@
    notifyList[5] =  place
    suiteInfo = PlayerViewCacheTube.__GetEquipPartSuiteInfo(curPlayer)
    notifyList[6] = "" if not suiteInfo else json.dumps(suiteInfo, ensure_ascii=False)
    notifyList[7] = ChEquip.GetEquipPartStarLV(curPlayer, IPY_GameWorld.rptEquip, place)
    notifyList[7] = ChEquip.GetEquipPartPlusLV(curPlayer, IPY_GameWorld.rptEquip, place)
    
    # 单部位洗练信息
    washLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashLV % place) + 1
@@ -1919,14 +1919,14 @@
    ItemControler.Sync_VPackItem_Clear(curPlayer, packIndex, placeList)
    return
## 获取物品最高强化星级
## 获取物品最高强化等级
#  @param itemType: 物品类型
#  @return 最大星级,0为不可强化
def GetItemMaxStarLV(curItem):
def GetItemMaxPlusLV(curItem):
    equipPlace = curItem.GetEquipPlace()
    plusMaxTypeDict = IpyGameDataPY.GetFuncEvalCfg("StrengthenLevelLimit", 1)
    if not plusMaxTypeDict:
        GameWorld.ErrLog("GetItemMaxStarLV没有强化类型映射表")
        GameWorld.ErrLog("GetItemMaxPlusLV没有强化类型映射表")
        return 0
    
    if equipPlace not in plusMaxTypeDict:
@@ -1946,6 +1946,17 @@
    
    return ipyData.GetLevelMax()
## 获取物品最高星数
#  @param itemType: 物品类型
#  @return 最大星级,0为不可强化
def GetItemMaxStar(curItem):
    itemColor = curItem.GetItemColor()
    maxStarDict = IpyGameDataPY.GetFuncEvalCfg('EquipPartStar', 1)
    if str(itemColor) not in maxStarDict:
        return 0
    classLV = GetItemClassLV(curItem)
    return maxStarDict[str(itemColor)].get(str(classLV), 0)
## 获取物品阶级
def GetItemClassLV(curItem):
    return curItem.GetLV()
@@ -1962,6 +1973,13 @@
def SetEquipGearScore(curItem, value):
    return curItem.SetGearScore(value)
def GetEquipPackIndex(curItem):
    ## 根据物品获取对应的可装备背包位置
    ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', GetItemClassLV(curItem), curItem.GetEquipPlace())
    if not ipyData:
        return -1
    return ipyData.GetGridIndex()
## 每日可使用次数
def GetCanUseCountDaily(curItem): return curItem.GetMaxAddSkillCnt()
## 每周可使用次数, 预留,暂不实现
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -539,7 +539,8 @@
    SyncPKModel(curPlayer)
        
    #通用强化星级信息
    ChEquip.NotifyEquipPartStarLV(curPlayer)
    ChEquip.NotifyEquipPartPlusLV(curPlayer)
    ChEquip.NotifyEquipPartStar(curPlayer)
    Operate_EquipWash.OnEquipWashLogin(curPlayer)
    #通知套装信息
    ChEquip.NotifyEquipPartSuiteLV(curPlayer)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -5756,7 +5756,6 @@
# ֪ͨGsmeServer; 
# SendGameServerRefreshState(int inputType, int inputValue)
# SetExAttr15 ~ 18 对应神兵类型等级,场景特效用
# 禁言 通知gameServer
def SetGMForbidenTalk(curPlayer, value):
@@ -5828,6 +5827,12 @@
        GameWorld.DebugLog("更新玩家所属服务器组ID: serverGroupID=%s" % serverGroupID)
    return
##影响外观的3部位索引记录 123456789  123:武器格子索引 456:副手  789:衣服
def GetFaceEquipIndexList(curPlayer):
    attr15 = curPlayer.GetExAttr15()
    return [attr15%1000, attr15/1000%1000, attr15/1000000]
def SetFaceEquipIndex(curPlayer, value): return curPlayer.SetExAttr15(value, True, True)
##获得玩家威望值
def GetPrestige(curPlayer): return 0
def SetPrestige(curPlayer, value): return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGodWeapon.py
@@ -53,41 +53,12 @@
        return
    Sync_GodWeaponLVInfo(curPlayer)
    
    #老号相关神兵场景特效等级同步支持
    if curPlayer.GetExAttr15() == 0:
        playerID = curPlayer.GetPlayerID()
        ipyDataMgr = IpyGameDataPY.IPY_Data()
        maxType = ipyDataMgr.GetGodWeaponByIndex(ipyDataMgr.GetGodWeaponCount()-1).GetType()
        for setWeaponType in xrange(1, maxType + 1):
            setLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GodWeaponLV % setWeaponType)
            if not setLV:
                continue
            SetGodWeaponLV(curPlayer, setWeaponType, setLV)
            giveSkillList = []
            for attrLV in xrange(1, setLV + 1):
                godWeaponData = IpyGameDataPY.GetIpyGameData('GodWeapon', setWeaponType, attrLV)
                if godWeaponData:
                    giveSkillID = GodWeaponLVUP(curPlayer, godWeaponData, attrLV)
                    if giveSkillID:
                        giveSkillList.append(giveSkillID)
            GameWorld.Log("老号设置神兵场景等级: setWeaponType=%s,setLV=%s, giveSkillList=%s" % (setWeaponType, setLV, giveSkillList), playerID)
    return
def SetGodWeaponLV(curPlayer, weaponType, lv):
    ## 设置神兵等级,同步设置场景神兵等级
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GodWeaponLV % weaponType, lv)
    sceneEffectsDict = {Def_GodWeaponType_HP:[lambda curObj, value:curObj.SetExAttr15(value), ShareDefine.CDBPlayerRefresh_GodWeaponLV_1],
                        Def_GodWeaponType_Atk:[lambda curObj, value:curObj.SetExAttr16(value), ShareDefine.CDBPlayerRefresh_GodWeaponLV_2],
                        Def_GodWeaponType_SuperHit:[lambda curObj, value:curObj.SetExAttr17(value), ShareDefine.CDBPlayerRefresh_GodWeaponLV_3],
                        Def_GodWeaponType_Def:[lambda curObj, value:curObj.SetExAttr18(value), ShareDefine.CDBPlayerRefresh_GodWeaponLV_4],
                        }
    if weaponType in sceneEffectsDict:
        setFunc, notifyType = sceneEffectsDict[weaponType]
        setFunc(curPlayer, lv)
        curPlayer.SendPropertyRefresh(notifyType, lv, False)
    totalLV = GetGodWeaponTotalLV(curPlayer)
    # 开服活动数据
    OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_GodWeaponLV, totalLV)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldGift.py
@@ -520,7 +520,7 @@
                return
            
    tryItem = ItemControler.GetOutPutItemObj(tryItemID, 1, 1)
    if ChEquip.DoPlayerEquipItem(curPlayer, tryItem, equipPlace, tick):
    if ChEquip.DoPlayerEquipItem(curPlayer, tryItem, ItemCommon.GetEquipPackIndex(tryItem), tick):
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FirstGoldTry, 2)
    else:
        curItem.clear()
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
@@ -329,7 +329,7 @@
        
    #---执行玩家换装逻辑---
    tick = GameWorld.GetGameWorld().GetTick()
    if ChEquip.DoPlayerEquipItem(curPlayer, curHorse, ShareDefine.retHorse, tick):
    if ChEquip.DoPlayerEquipItem(curPlayer, curHorse, ItemCommon.GetEquipPackIndex(curHorse), tick):
        if isRideHorse:
            PlayerRideHorseUp(curPlayer, False)
            
@@ -377,7 +377,7 @@
        PlayerRideHorseDown(curPlayer, False)
    
    #---执行玩家换装逻辑---
    if ChEquip.DoPlayerEquipItem(curPlayer, curHorse, ShareDefine.retHorse, tick):
    if ChEquip.DoPlayerEquipItem(curPlayer, curHorse, ItemCommon.GetEquipPackIndex(curHorse), tick):
        if isRideHorse:
            PlayerRideHorseUp(curPlayer, False)
        return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMagicWeapon.py
@@ -468,9 +468,9 @@
                    break
            if cnt:
                break
    elif curType == 3:
        #全身装备X星
        cnt = ChEquip.GetTotalEquipStars(curPlayer)
#    elif curType == 3:
#        #全身装备X星
#        cnt = ChEquip.GetTotalEquipStars(curPlayer)
        
    elif curType == 4:
        #X阶普通、强化套装
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
@@ -1132,7 +1132,7 @@
        return True
    equipID = result[0]
    equipPlace = result[1]
    if equipPlace == ShareDefine.retGuard:
    if equipPlace in [ShareDefine.retGuard1, ShareDefine.retGuard2]:
        PlayerControl.NotifyCode(curPlayer, 'Guardian_Timeout', [equipID, spaceIndex])
    elif equipPlace == ShareDefine.retWing:
        PlayerControl.NotifyCode(curPlayer, 'WingTiyan_Timeout')
@@ -1146,8 +1146,8 @@
            PlayerGoldGift.FirstGoldTryItemOutTime(curPlayer)
            
    # 广播卸装
    if equipIndex in ChConfig.Def_SyncEquipStateByIndex:
        curPlayer.Sync_UnEquipItem(equipID, equipPlace)
    if equipPlace in ChConfig.Def_SyncEquipStateByIndex:
        curPlayer.Sync_UnEquipItem(equipID, equipIndex)
    return True
#---------------------------------------------------------------------
##全局定时器调用, 刷新玩家状态
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuccess.py
@@ -321,7 +321,7 @@
            ResetSuccessByType(curPlayer, succType)
            for pType, indexList in ChConfig.Pack_EquipPart_CanPlusStar.items():
                for i in indexList:
                    equipPartStarLV = ChEquip.GetEquipPartStarLV(curPlayer, pType, i)
                    equipPartStarLV = ChEquip.GetEquipPartPlusLV(curPlayer, pType, i)
                    for pluslv in xrange(1, equipPartStarLV+1):
                        DoAddSuccessProgress(curPlayer, succType, 1, [pluslv])
                    
@@ -563,7 +563,7 @@
        
        itemQuality = curEquip.GetItemQuality()
        classLV = ItemCommon.GetItemClassLV(curEquip)
        if equipIndex not in [ShareDefine.retWing,ShareDefine.retGuard,ShareDefine.retHorse]:
        if equipIndex not in [ShareDefine.retWing,ShareDefine.retGuard1,ShareDefine.retGuard2,ShareDefine.retHorse]:
            DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_EquipColorItem, 1, [classLV, itemColor])
        if equipIndex in ChConfig.BaseEquipPlace_Weapon:
            DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_EquipWeapon, 1, [itemColor, itemQuality, classLV])
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTJG.py
@@ -104,57 +104,58 @@
# 切换守护
def ChangeGuard(curPlayer, tick):
    # 检查过背包中无守护则不再执行
    if curPlayer.GetDictByKey("AutoCGuardID") == 1:
        return
    curGuardID = 0  # 装备的守护ID
    itemIDList = IpyGameDataPY.GetFuncEvalCfg('AutoUseGuardian', 1)
    guardItem = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip).GetAt(ShareDefine.retGuard)
    # 1。 守护存在,判断是否最优先守护
    if ItemCommon.CheckItemCanUse(guardItem) and ItemCommon.CheckItemCanUseByExpireTime(guardItem):
        curGuardID = guardItem.GetItemTypeID()
        if curGuardID == itemIDList[0]:
            # 最高优先级
            return
        if curPlayer.GetDictByKey("AutoCGuardID") == 2:
            # 当前背包最高
            return
    findItemList = []
    curPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
    # 找到背包中优先级最高的守护物品
    for i in range(0, curPack.GetCount()):
        item = curPack.GetAt(i)
        if not ItemCommon.CheckItemCanUse(item):
            continue
        if item.GetItemTypeID() not in itemIDList:
            continue
        if not ItemCommon.CheckItemCanUseByExpireTime(item):
            # 背包有不过期的物品
            continue
        findItemList.append(item)
    if not findItemList:
        curPlayer.SetDict("AutoCGuardID", 1)    # 设置无可替换的标志
        return
    findItemList.sort(cmp=SortGuard)
    if curGuardID in itemIDList and itemIDList.index(curGuardID) <= itemIDList.index(findItemList[0].GetItemTypeID()):
        # 当前装备最高,减少遍历
        curPlayer.SetDict("AutoCGuardID", 2)
        return
    #---执行玩家换装逻辑---
    ChEquip.DoPlayerEquipItem(curPlayer, findItemList[0], ShareDefine.retGuard, tick)
    curPlayer.SetDict("AutoCGuardID", 0)
    return #新版本不需要切换
#    # 检查过背包中无守护则不再执行
#    if curPlayer.GetDictByKey("AutoCGuardID") == 1:
#        return
#
#    curGuardID = 0  # 装备的守护ID
#    itemIDList = IpyGameDataPY.GetFuncEvalCfg('AutoUseGuardian', 1)
#    guardItem = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip).GetAt(ShareDefine.retGuard1)
#    # 1。 守护存在,判断是否最优先守护
#    if ItemCommon.CheckItemCanUse(guardItem) and ItemCommon.CheckItemCanUseByExpireTime(guardItem):
#        curGuardID = guardItem.GetItemTypeID()
#        if curGuardID == itemIDList[0]:
#            # 最高优先级
#            return
#        if curPlayer.GetDictByKey("AutoCGuardID") == 2:
#            # 当前背包最高
#            return
#
#
#    findItemList = []
#    curPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
#
#    # 找到背包中优先级最高的守护物品
#    for i in range(0, curPack.GetCount()):
#        item = curPack.GetAt(i)
#
#        if not ItemCommon.CheckItemCanUse(item):
#            continue
#
#        if item.GetItemTypeID() not in itemIDList:
#            continue
#
#        if not ItemCommon.CheckItemCanUseByExpireTime(item):
#            # 背包有不过期的物品
#            continue
#
#        findItemList.append(item)
#
#    if not findItemList:
#        curPlayer.SetDict("AutoCGuardID", 1)    # 设置无可替换的标志
#        return
#
#    findItemList.sort(cmp=SortGuard)
#    if curGuardID in itemIDList and itemIDList.index(curGuardID) <= itemIDList.index(findItemList[0].GetItemTypeID()):
#        # 当前装备最高,减少遍历
#        curPlayer.SetDict("AutoCGuardID", 2)
#        return
#
#
#    #---执行玩家换装逻辑---
#    ChEquip.DoPlayerEquipItem(curPlayer, findItemList[0], ItemCommon.GetEquipPackIndex(findItemList[0]), tick)
#    curPlayer.SetDict("AutoCGuardID", 0)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
@@ -142,7 +142,7 @@
    #翅膀信息在翅膀装备位对应装备信息
    
    #部位强化数据
    curPlayerPlusDict["EquipPartStarLV"] = __GetEquipPartStarLVInfo(curPlayer)
    curPlayerPlusDict["EquipPartStarLV"] = __GetEquipPartPlusLVInfo(curPlayer)
    
    #部位宝石数据
    curPlayerPlusDict["EquipPartStone"] = __GetEquipPartStoneInfo(curPlayer)
@@ -182,13 +182,13 @@
            dataDict.pop(key)
    return dataDict
## 公共部位强化星级信息{部位索引:星级, ...}
def __GetEquipPartStarLVInfo(curPlayer):
## 公共部位强化星级信息{部位索引:强化等级, ...}
def __GetEquipPartPlusLVInfo(curPlayer):
    pType = IPY_GameWorld.rptEquip # 暂时只取装备背包,之后有扩展再修改
    indexList = ChConfig.Pack_EquipPart_CanPlusStar[pType]
    starLVInfoDict = {}
    for i in indexList:
        starLV = ChEquip.GetEquipPartStarLV(curPlayer, pType, i)
        starLV = ChEquip.GetEquipPartPlusLV(curPlayer, pType, i)
        if starLV:
            starLVInfoDict[i] = starLV
    return starLVInfoDict
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -306,7 +306,7 @@
    Def_mitProduceResult,     # 生产采集结果回应
    Def_mitPetEquipMerge,     # 宠物装备合成回应
    Def_mitEquipInherit,      # 装备继承
    Def_mitEquipPlus,         # 装备加强
    Def_mitEquipStarUp,       # 装备升星
    Def_mitEquipMayaPlus,     # 装备玛雅加强
    Def_mitEquipAddAttr,      # 装备追加
    Def_mitEquipSlotting,     # 装备打孔
@@ -658,8 +658,7 @@
# 3 紫色
# 4 橙色
# 5 红色
# 6 粉色
#===============================================================================
# 6 粉色#===============================================================================
Def_Item_Color_White = 1     #白
Def_Item_Color_Blue = 2      #蓝
Def_Item_Color_Purple = 3    #紫
@@ -1732,32 +1731,34 @@
# 手游不使用C++定义 enum            RoleEquipType
# 装备位定义
RoleEquipType = (
    retWeapon,      #1 主手
    retWeapon2,     #2 副手
    retHat,         #3 帽子
    retClothes,     #4 衣服
    retBelt,        #5 腰带
    retTrousers,    #6 裤子
    retShoes,       #7 鞋子
    retNeck,        #8 项链
    retFairyCan,       #9 仙器
    retFairyCan2,       #10 仙器
    retWing,        #11 翅膀
    retGuard,    #12 守护
    retBaldric1,     #13 佩饰
    retBaldric2,     #14 佩饰
    retBaldric3,     #15 佩饰
    retBaldric4,     #16 佩饰
    retBaldric5,     #17 佩饰
    retBaldric6,     #18 佩饰
    retHorse,        #19 坐骑
    retWeaponSkin,   #20 时装武器
    retClothesSkin,  #21 时装衣服
    retWeapon2Skin,  #22 时装副手
    retWeapon,          #1 主手
    retWeapon2,         #2 副手
    retHat,             #3 帽子
    retClothes,         #4 衣服
    retBelt,            #5 腰带
    retTrousers,        #6 裤子
    retShoes,           #7 鞋子
    retGlove,           #8 手套
    retNeck,            #9 项链
    retFairyCan,        #10 仙器1
    retFairyCan2,       #11 仙器2
    retJade,            #12 玉佩
    retWing,            #13 翅膀
    retGuard1,          #14 守护1
    retGuard2,          #15 守护2
    retPeerlessWeapon,  #16 绝世武器
    retPeerlessWeapon2, #17 绝世副手
    retXXX18,           #18 暂无
    retHorse,           #19 坐骑
    retWeaponSkin,      #20 时装武器
    retClothesSkin,     #21 时装衣服
    retWeapon2Skin,     #22 时装副手
    retMax,
) = range(1, 24)
# 神兽装备位定义
DogzEquipPlace = (
    dogzetHorn,     # 神兽兽角