| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| ##@package ChEquip  | 
| # ×°±¸Âß¼´¦Àí  | 
| #  | 
| # @author alee  | 
| # @date 2017-07-29 00:30  | 
| # @version 1.0  | 
| #  | 
| # ÐÞ¸Äʱ¼ä ÐÞ¸ÄÈË ÐÞ¸ÄÄÚÈÝ  | 
| #------------------------------------------------------------------------------   | 
| #"""Version = 2017-07-29 00:30"""  | 
| #------------------------------------------------------------------------------   | 
| import IPY_GameWorld  | 
| import GameWorld  | 
| import ItemControler  | 
| import SkillShell  | 
| import PlayerControl  | 
| import ChConfig  | 
| import ChItem  | 
| import ItemCommon  | 
| import FBLogic  | 
| import OperControlManager  | 
| import Operate_EquipWash  | 
| import Operate_EquipPlus  | 
| import ShareDefine  | 
| import ChPyNetSendPack  | 
| import NetPackCommon  | 
| import EventShell  | 
| import IpyGameDataPY  | 
| import PlayerWing  | 
| import Operate_EquipStone  | 
| import OpenServerCampaign  | 
| import PassiveBuffEffMng  | 
| import time  | 
| import json  | 
| import FormulaControl  | 
| import PyGameData  | 
| #---------------------------------------------------------------------  | 
|   | 
|   | 
| ##¼ì²éÍæ¼ÒÊÇ·ñ¿ÉÒÔ»»×°  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @return ·µ»ØÖµ, ÊÇ·ñͨ¹ý¼ì²é  | 
| # @remarks ¼ì²éÍæ¼ÒÊÇ·ñ¿ÉÒÔ»»×°  | 
| def CheckPlayerCanEquipItem(curPlayer):  | 
|     if curPlayer.GetPlayerAction() not in ChConfig.Def_Player_DoEquip_State:  | 
|         #InsteadEquip ¶Ô²»Æð,µ±Ç°×´Ì¬ÎÞ·¨¸ü»»×°±¸  | 
|         #InsteadEquipÌæ»»ÎªGeRen_chenxin_436832  | 
|         PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_436832")  | 
|         return False  | 
|       | 
|     return True  | 
|   | 
|   | 
| ## Ö´ÐÐÍæ¼Ò»»×°Âß¼  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param curItem ÎïÆ·ÊµÀý  | 
| #  @param equipPackIndex ×°±¸±³°üË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return ²¼¶ûÖµ  | 
| #  @remarks Ö´ÐÐÍæ¼Ò»»×°Âß¼  | 
| def DoPlayerEquipItem(curPlayer, curItem, equipPackIndex, tick):   | 
|     if equipPackIndex < 0:  | 
|         return False  | 
|     playerItemControl = ItemControler.PlayerItemControler(curPlayer)  | 
|       | 
|     #---ÑéÖ¤ÊÇ·ñ¿ÉÒÔ»»Õâ¼þ×°±¸---  | 
|     if not ItemCommon.CheckItemCanUse(curItem):  | 
|         return False  | 
|       | 
|     if not ItemCommon.CheckItemCanUseByExpireTime(curItem):  | 
|         # ¹ýÆÚ  | 
|         GameWorld.DebugLog("×°±¸ÒѹýÆÚ!")  | 
|         return False  | 
|       | 
|     changeItemEquipPlace = curItem.GetEquipPlace()  | 
|     if changeItemEquipPlace not in ShareDefine.RoleEquipType:  | 
|         return False  | 
|       | 
|     if ItemCommon.GetEquipPackIndex(curItem) != equipPackIndex:  | 
|         #¼ì²é×°±¸Î»ÖúÍÌî±íÊÇ·ñÒ»Ö  | 
|         return False  | 
|       | 
|     #--ÉèÖô©ÉÏÎïÆ·ÐǼ¶--  | 
|     #===========================================================================  | 
|     # if changeItemEquipPlace in ShareDefine.RoleEquipType:  | 
|     #    equipPartStar = GetEquipPartPlusLV(curPlayer, IPY_GameWorld.rptEquip, changeItemEquipPlace)  | 
|     #    if equipPartStar != curItem.GetItemStarLV():  | 
|     #        curItem.SetItemStarLV(equipPartStar)  | 
|     #===========================================================================  | 
|             #GameWorld.DebugLog("´©ÉϵÄ×°±¸ÉèÖÃÐǼ¶: index=%s,star=%s" % (changeItemEquipPlace, equipPartStar))  | 
|       | 
|     #---¿ªÊ¼»»×°Âß¼---  | 
|       | 
|     #¼Ç¼»»×°ÎïÆ·ÐÅÏ¢  | 
|     itemClassLV = ItemCommon.GetItemClassLV(curItem)  | 
|     changeItemID = curItem.GetItemTypeID()  | 
|     changeItemStarLV = 0  #curItem.GetItemStarLV()  | 
|     changeItemStoneCnt = 0  #curItem.GetUseStoneCount()  | 
|     changeItemHoleCnt = 0  #curItem.GetCanPlaceStoneCount()  | 
|     changeItemUseData = curItem.GetUserData()  | 
|     suiteID = curItem.GetSuiteID()  | 
|     endureReduceType = curItem.GetEndureReduceType()  | 
|     #changeItemIsHorse = (curItem.GetType() == ChConfig.Def_Item_Type_Horse)  | 
|       | 
|     #Ö´Ðл»×°¶¯×÷  | 
|     equipPlace = playerItemControl.EquipItem(curItem, equipPackIndex)  | 
|       | 
|     if equipPlace == -1:  | 
|         return False  | 
|       | 
|     equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)  | 
|     curEquip = equipPack.GetAt(equipPackIndex)  | 
|   | 
|     if curEquip.GetUserAttr(ShareDefine.Def_IudetCreateTime) == 0:  | 
|         curEquip.SetUserAttr(ShareDefine.Def_IudetCreateTime, int(time.time()))  | 
|     #---»»×°³É¹¦---  | 
|     if equipPackIndex in PlayerControl.GetFaceEquipIndexList(curPlayer) or equipPlace in ChConfig.Def_SyncEquipStateByIndex:  | 
|         #֪ͨ¿Í»§¶Ë½»»»ÎïÆ·  | 
|         curPlayer.ChangeEquip(changeItemID, equipPackIndex, changeItemStarLV, changeItemHoleCnt, changeItemStoneCnt, changeItemUseData)  | 
|     if itemClassLV == GetEquipFacadeClassLV(curPlayer):  | 
|         #´©µ±Ç°Íâ¹Û½×µÄÌ××°  | 
|         ChangeEquipfacadeByClassLV(curPlayer, itemClassLV)  | 
|       | 
|     if not endureReduceType:  | 
|         EventShell.EventRespons_EquipByPlace(curPlayer, itemClassLV, equipPlace)  | 
|     #¼Ç¼³È×°¡¢ºì×°  | 
|     #===========================================================================  | 
|     # if itemQuality in [ChConfig.Def_Quality_Orange, ChConfig.Def_Quality_Red]:  | 
|     #    classLV = ItemCommon.GetItemClassLV(curItem)  | 
|     #    EventReport.WriteEvent_orange_equip(curPlayer, changeItemEquipPlace, classLV, itemQuality)  | 
|     #===========================================================================  | 
|           | 
|     #ÌØÊâ×°±¸, ²»ÐèҪˢÊôÐÔ  | 
|     if changeItemEquipPlace in ChConfig.EquipItemNoRefreshState:  | 
|         return True  | 
|       | 
|     curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrActivatyNotify, ChConfig.Def_AttrActivatyNotify_Equip)  | 
|       | 
|     #ÏÈË¢×°±¸BUFF ÔÙ¼ÆËãÊôÐÔ  | 
|     if changeItemEquipPlace in ChConfig.EquipPlace_LingQi:  | 
|         RefreshPlayerLingQiEquipAttr(curPlayer)  | 
|     elif itemClassLV:  | 
|         RefreshPlayerEquipAttribute(curPlayer, itemClassLV)  | 
|       | 
|     #Ë¢ÐÂËùÓÐÊôÐÔ  | 
|     playControl = PlayerControl.PlayerControl(curPlayer)  | 
|     playControl.RefreshPlayerAttrState()  | 
|       | 
|     #×°±¸µÄ±»¶¯´¥·¢À༼ÄÜ  | 
|     PassiveBuffEffMng.GetPassiveEffManager().RegistSuperEquipSkillDict(curPlayer)  | 
|     return True  | 
|   | 
|   | 
| ## Ë¢ÐÂ×°±¸¶ÔÈËÎïÊôÐÔµÄ¸Ä±ä  | 
| #  @param self ÀàʵÀý  | 
| #  @return ·µ»ØÖµÎÞÒâÒå  | 
| #  @remarks Ë¢ÐÂ×°±¸¶ÔÈËÎïÊôÐÔµÄ¸Ä±ä  | 
| def RefreshPlayerEquipAttribute(curPlayer, classLV=0):  | 
|     GameWorld.DebugLog("Start RefreshPlayerEquipAttribute classLV=%s!!!" % classLV)  | 
|     classlvList = xrange(1, IpyGameDataPY.GetFuncCfg('EquipMaxClasslv') + 1) if classLV == 0 else [classLV]  | 
|     for rclasslv in classlvList:  | 
|         __CalcEquips_Effect(curPlayer, rclasslv)  | 
|   | 
|     #if isRefreshEquipBuff:  | 
|     #    __RefreshPlayerAllEquipBuff(curPlayer)  | 
|       | 
|     if classLV:  | 
|         playerID = curPlayer.GetPlayerID()  | 
|         if playerID not in PyGameData.g_equipChangeClassLVInfo:  | 
|             PyGameData.g_equipChangeClassLVInfo[playerID] = []  | 
|         classLVList = PyGameData.g_equipChangeClassLVInfo[playerID]  | 
|         if classLV not in classLVList:  | 
|             classLVList.append(classLV)  | 
|             #GameWorld.DebugLog("Ìí¼Ó×°±¸»º´æ±ä¸ü½×: classLV=%s, %s" % (classLV, classLVList), playerID)  | 
|     return  | 
|   | 
| def OnPlayerEquipLoginLogic(curPlayer):  | 
|     ''' Íæ¼ÒµÇ¼ͳһ´¦Àí×°±¸£¬Ö»±éÀúÒ»´Î×°±¸±³°ü£¬Í¨ÖªÐÅÏ¢¡¢¸üÐÂÒ»´ÎÊý¾Ý£¬·ÀÖ¹×ܵȼ¶Í³¼ÆÒì³£  | 
|                     ×°±¸Æ·ÖʳÈ×°¼°ÒÔÉÏÊýÁ¿¡¢×°±¸×ÜÐÇÊý¡¢Ç¿»¯×ܵȼ¶¡¢½ø»¯×ܵȼ¶¡¢Ï´Á·×ܵȼ¶¡¢±¦Ê¯×ܵȼ¶  | 
|     '''  | 
|       | 
|     #NotifyEquipPartPlusLV(curPlayer)  | 
|     #NotifyEquipPartStar(curPlayer)  | 
|     #Operate_EquipWash.OnEquipWashLogin(curPlayer)  | 
|     #×°±¸Î»±¦Ê¯ÏâǶ֪ͨ  | 
|     #Operate_EquipStone.OnLogin(curPlayer)  | 
| #    if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_VersionFix, ChConfig.Def_VerFix_LingGenShow):  | 
| #        GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_VersionFix, ChConfig.Def_VerFix_LingGenShow, 1)  | 
| #        ChangeEquipfacadeByLingGen(curPlayer)  | 
|       | 
|     ePartStarLVPack = ChPyNetSendPack.tagMCEquipPartStarInfo() # A3 B1 ×°±¸²¿Î»ÐÇÊýÐÅÏ¢ #tagMCEquipPartStarInfo  | 
|     ePartPlusLVPack = ChPyNetSendPack.tagMCEquipPartPlusInfo() # A3 B3 ×°±¸²¿Î»Ç¿»¯ÐÅÏ¢ #tagMCEquipPartPlusInfo  | 
|     ePartXLPack = ChPyNetSendPack.tagMCEquipPartXLAttrInfo() # A3 BB ×°±¸Î»Ï´Á·ÊôÐÔÐÅÏ¢ #tagMCEquipPartXLAttrInfo  | 
|     ePartStonePack = ChPyNetSendPack.tagMCStoneInfo() # A3 BC Í¨Öª×°±¸Î»¿×λ±¦Ê¯ID #tagMCStoneInfo  | 
|       | 
|     orangeEquipCount = 0  | 
|     totalStar = 0  | 
|     totalPlusLV = 0  | 
|     totalEvolveLV = 0  | 
|     totalWashLV = 0  | 
|     totalStoneLV = 0  | 
|     holeIndexList = Operate_EquipStone.GetAllEquipPlaceHoleIndex()  | 
|       | 
|     gameData = GameWorld.GetGameData()  | 
|     packType = IPY_GameWorld.rptEquip  | 
|     equipPack = curPlayer.GetItemManager().GetPack(packType)  | 
|     for index in xrange(equipPack.GetCount()):  | 
|         ipyData = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'GridIndex':index}, isLogNone=False)  | 
|         if not ipyData:  | 
|             continue  | 
|         # Ö»¼ÆËãÓн׵ľ³½ç×°±¸  | 
|         if not ipyData.GetClassLV():  | 
|             continue  | 
|           | 
|         curEquip = equipPack.GetAt(index)  | 
|         if not curEquip.IsEmpty():  | 
|             if curEquip.GetItemColor() >= ShareDefine.Def_Item_Color_Orange:  | 
|                 orangeEquipCount += 1  | 
|                   | 
|         # ÐǼ¶  | 
|         starLV = GetEquipPartStar(curPlayer, index)  | 
|         totalStar += starLV  | 
|           | 
|         # Ç¿»¯µÈ¼¶  | 
|         plusProficiency = GetEquipPartProficiency(curPlayer, packType, index)  | 
|         plusLV = GetEquipPartPlusLV(curPlayer, packType, index)  | 
|         totalPlusLV += plusLV  | 
|           | 
|         # ½ø»¯µÈ¼¶  | 
|         evolveLV = GetEquipPartPlusEvolveLV(curPlayer, packType, index)  | 
|         totalEvolveLV += evolveLV  | 
|           | 
|         # Ï´Á·µÈ¼¶  | 
|         washLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashLV % index)  | 
|         totalWashLV += washLV  | 
|           | 
|         # ±¦Ê¯µÈ¼¶  | 
|         stoneIDList, stoneIsBindList = [], []  | 
|         for holeIndex in holeIndexList:  | 
|             stoneID, stoneIsBind = Operate_EquipStone.GetEquipIndexStoneIDAndIsBand(curPlayer, index, holeIndex)  | 
|             stoneIDList.append(stoneID)  | 
|             stoneIsBindList.append(stoneIsBind)  | 
|             if stoneID == 0:  | 
|                 continue  | 
|             curStone = gameData.GetItemByTypeID(stoneID)  | 
|             stoneLV = 0 if not curStone else curStone.GetEffectByIndex(0).GetEffectValue(1)  | 
|             totalStoneLV += stoneLV  | 
|               | 
|         # ÐǼ¶ÐÅÏ¢°ü  | 
|         if starLV:  | 
|             ePartStarLV = ChPyNetSendPack.tagMCEquipPartStar()  | 
|             ePartStarLV.Clear()  | 
|             ePartStarLV.EquipPackIndex = index  | 
|             ePartStarLV.Star = starLV  | 
|             ePartStarLVPack.InfoList.append(ePartStarLV)  | 
|           | 
|         # Ç¿»¯¡¢½ø»¯ÐÅÏ¢°ü  | 
|         if plusLV or plusProficiency or evolveLV:  | 
|             ePartPlusLV = ChPyNetSendPack.tagMCEquipPartPlusLV()  | 
|             ePartPlusLV.Clear()  | 
|             ePartPlusLV.PackType = packType  | 
|             ePartPlusLV.EquipIndex = index  | 
|             ePartPlusLV.EquipPartStarLV = plusLV  | 
|             ePartPlusLV.Proficiency = plusProficiency  | 
|             ePartPlusLV.EvolveLV = evolveLV  | 
|             ePartPlusLVPack.InfoList.append(ePartPlusLV)  | 
|               | 
|         # Ï´Á·ÐÅÏ¢°ü  | 
|         hasXLValue = False  | 
|         xlAttrList = []  | 
|         for attrNum in xrange(1, Operate_EquipWash.Def_EquipWashMaxAttrCount + 1):  | 
|             washValue = ChPyNetSendPack.tagMCEquipPartXLAttrValue()  | 
|             washValue.XLAttrValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashValue % (index, attrNum))  | 
|             washValue.XLAttrChange = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashValueTemp % (index, attrNum))  | 
|             xlAttrList.append(washValue)  | 
|             if washValue.XLAttrValue or washValue.XLAttrChange:  | 
|                 hasXLValue = True  | 
|         if hasXLValue or washLV:  | 
|             ePartXLAttr = ChPyNetSendPack.tagMCEquipPartXLAttr()  | 
|             ePartXLAttr.EquipPlace = index  | 
|             ePartXLAttr.XLAttrLV = washLV  | 
|             ePartXLAttr.XLAttrList = xlAttrList  | 
|             ePartXLAttr.XLAttrCnt = len(ePartXLAttr.XLAttrList)  | 
|             ePartXLPack.InfoList.append(ePartXLAttr)  | 
|               | 
|         # ±¦Ê¯ÐÅÏ¢°ü  | 
|         stoneCount = len(stoneIDList)  | 
|         if stoneIDList.count(0) != stoneCount:  | 
|             stoneMsg = ChPyNetSendPack.tagMCStoneMsg()  | 
|             stoneMsg.EquipPlace = index  | 
|             stoneMsg.MaxStoneCount = stoneCount   | 
|             stoneMsg.StoneInfo = stoneIDList  | 
|             stoneMsg.StoneBind = stoneIsBindList  | 
|             ePartStonePack.InfoList.append(stoneMsg)  | 
|               | 
|     # Í¨Öª·â°ü£¬ÓÐֵʱ²Å֪ͨ  | 
|     if ePartStarLVPack.InfoList:  | 
|         ePartStarLVPack.Count = len(ePartStarLVPack.InfoList)  | 
|         NetPackCommon.SendFakePack(curPlayer, ePartStarLVPack)  | 
|       | 
|     if ePartPlusLVPack.InfoList:  | 
|         ePartPlusLVPack.Count = len(ePartPlusLVPack.InfoList)  | 
|         NetPackCommon.SendFakePack(curPlayer, ePartPlusLVPack)  | 
|       | 
|     if ePartXLPack.InfoList:  | 
|         ePartXLPack.Count = len(ePartXLPack.InfoList)  | 
|         NetPackCommon.SendFakePack(curPlayer, ePartXLPack)  | 
|           | 
|     if ePartStonePack.InfoList:  | 
|         ePartStonePack.EquipCount = len(ePartStonePack.InfoList)    | 
|         NetPackCommon.SendFakePack(curPlayer, ePartStonePack)  | 
|           | 
|     Operate_EquipPlus.SyncEquipMasterPlusLVInfo(curPlayer)  | 
|       | 
|     # ¸üÐÂͳ¼Æ»ã×ÜÖµ  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PlayerKey_EquipOrangeCount, orangeEquipCount)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalEquipStar, totalStar)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalPlusLV, totalPlusLV)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalPlusEvolveLV, totalEvolveLV)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalEquipWashLV, totalWashLV)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalStoneLV, totalStoneLV)  | 
|     GameWorld.DebugLog("µÇ¼¸üÐÂ×°±¸Ïà¹ØÖµ»ã×Ü: orangeEquipCount=%s,totalStar=%s,totalPlusLV=%s,totalEvolveLV=%s,totalWashLV=%s,totalStoneLV=%s"   | 
|                        % (orangeEquipCount, totalStar, totalPlusLV, totalEvolveLV, totalWashLV, totalStoneLV))  | 
|     Sync_EquipPartSuiteActivateInfo(curPlayer)  | 
|     return  | 
|   | 
| ## Ë¢ÐÂËùÓÐ×°±¸¶ÔÈËÎïÊôÐÔµÄ¸Ä±ä  | 
| #  @param self ÀàʵÀý  | 
| #  @return ·µ»ØÖµÎÞÒâÒå  | 
| #  @remarks Ë¢ÐÂ×°±¸¶ÔÈËÎïÊôÐÔµÄ¸Ä±ä  | 
| #===============================================================================  | 
| # def __RefreshPlayerAllEquipBuff(curPlayer):  | 
| #    #³õʼ»¯ÈËÎï×°±¸buff  | 
| #    curPlayer.GetEquipBuff().Clear()  | 
| #   | 
| #    packType = IPY_GameWorld.rptEquip  | 
| #          | 
| #    equipPackList = [IPY_GameWorld.rptEquip, IPY_GameWorld.rptHorseEquip]  | 
| #      | 
| #    #stoneLVCntList = []  | 
| #    #===========================================================================  | 
| #    orangeQualityCnt = 0 #³Èɫװ±¸ÊýÁ¿(°üº¬³ÈɫƷÖÊÒÔÉϵÄ×°±¸ÊýÁ¿)  | 
| #    for packIndex in equipPackList:  | 
| #        equipPack = curPlayer.GetItemManager().GetPack(packIndex)  | 
| #      | 
| #        for equipIndex in range(0, equipPack.GetCount()):  | 
| #              | 
| #            #±¸ÓÃ×°±¸À¸²»´¦Àí  | 
| #            if packIndex == IPY_GameWorld.rptEquip and equipIndex not in ShareDefine.RoleEquipType:  | 
| #                continue  | 
| #              | 
| #            curEquip = equipPack.GetAt(equipIndex)  | 
| #              | 
| #            if curEquip.IsEmpty():  | 
| #                continue  | 
| #   | 
| #            if not ItemCommon.CheckItemCanUseByExpireTime(curEquip):  | 
| #                # ¹ýÆÚ  | 
| #                continue  | 
| #              | 
| #            #×°±¸´¥·¢µÄ¼¼ÄÜ £¨È«Éí£©  | 
| #            CalcCurEquip_SkillBuff(curPlayer, curEquip)  | 
| #              | 
| #              | 
| #              | 
| #            # ºóÃæµÄΪ½Çɫװ±¸×¨Óô¦Àí  | 
| #            #===================================================================  | 
| #            # if packIndex != IPY_GameWorld.rptEquip:  | 
| #            #    continue  | 
| #            #   | 
| #            # if isSuite or curEquip.GetItemTypeID() in ReadChConfig.GetEvalChConfig("AddSuiteNumEquitList"):  | 
| #            #    suiteEquipCnt += 1  | 
| #            #===================================================================  | 
| #              | 
| #    #Ì××°¼Óbuff ¸ù¾Ý×°±¸ÏÖÓеÄÌ××°µÄ¸öÊý×Öµä   | 
| # #===============================================================================  | 
| # #    #È«Éí³Èɫװ±¸ÊýÁ¿´¥·¢Ïà¹Ø  | 
| # #    OnOrangeQualityCntChange(curPlayer, orangeQualityCnt)  | 
| # #      | 
| # #    # ÖØÖü¤»îÌáʾÀàÐÍΪNone  | 
| # #    curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrActivatyNotify, ChConfig.Def_AttrActivatyNotify_None)  | 
| # #===============================================================================  | 
| #      | 
| #    # ×°±¸ÄÚ²ãbuff  | 
| #    allAttrListEquip = [{} for i in range(4)] # ²»°üº¬³á°ò¼°×°±¸ÉÏÏâǶµÄ±¦Ê¯  | 
| #    SkillShell.CalcCurBuffer_Effect(curPlayer.GetEquipBuff(), curPlayer, allAttrListEquip)  | 
| #    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_EquipBuff, allAttrListEquip)  | 
| #      | 
| #    # ×°±¸Íâ²ãbuffÊôÐÔ£¬´ËbuffËãÕ½Á¦  | 
| #    allAttrListEquptBuffs = [{} for i in range(4)]  | 
| #    SkillShell.CalcCurBuffer_Effect(curPlayer.GetEquipBuff(), curPlayer,   | 
| #                                    allAttrListEquptBuffs, [], ChConfig.CalcBuffLevel_1)  | 
| #    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_EquipBuff1, allAttrListEquptBuffs)  | 
| #      | 
| #    return  | 
| #===============================================================================  | 
|   | 
|   | 
| #===============================================================================  | 
| # #//07 03 ÈËÎï×°±¸ÎïÆ·#tagCEquipItem  | 
| # //½Çɫװ±¸ÀàÐÍ  | 
| # int GetRoleEquipType();  | 
| # //ÎïÆ·ÔÚÎïÆ·±³°üµÄË÷Òý  | 
| # int GetItemIndex();  | 
| #===============================================================================  | 
| ## ÈËÎï×°±¸ÎïÆ·  | 
| #  @param index ±³°üË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks ¿Í»§¶Ë·â°üÏìÓ¦ //07 03 ÈËÎï×°±¸ÎïÆ·#tagCEquipItem  | 
| def PlayerEquipItem(index, tick):  | 
|     GameWorld.GetPsycoFunc(__Func_PlayerEquipItem)(index, tick)  | 
|     return  | 
|   | 
|   | 
| ## ÈËÎï×°±¸ÎïÆ·  | 
| #  @param index ±³°üË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks ¿Í»§¶Ë·â°üÏìÓ¦ //07 03 ÈËÎï×°±¸ÎïÆ·#tagCEquipItem  | 
| def __Func_PlayerEquipItem(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     sendPack = IPY_GameWorld.IPY_CEquipItem()  | 
|     #ÎïÆ·ÔÚÎïÆ·±³°üµÄË÷Òý  | 
|     packItemIndex = sendPack.GetItemIndex()  | 
|     #½Çɫװ±¸²¿Î»  | 
|     equipPackIndex = sendPack.GetRoleEquipType()  | 
|       | 
|     #¼ì²éÍæ¼Ò״̬ÊÇ·ñ¿ÉÒÔ»»×°  | 
|     if not CheckPlayerCanEquipItem(curPlayer):  | 
|         return  | 
|       | 
|     #¼ì²é»»×°¼ä¸ô  | 
|     #===========================================================================  | 
|     # if tick - curPlayer.GetLastChangeEquipTick() <= ChConfig.Def_MinChangeEquipTime:  | 
|     #    #GameWorld.Log("¸ü»»×°±¸Ê±¼ä¹ý¶Ì! %d"%(tick - curPlayer.GetLastChangeEquipTick()))         | 
|     #    return  | 
|     #   | 
|     # curPlayer.SetLastChangeEquipTick(tick)  | 
|     #===========================================================================  | 
|       | 
|     #---»ñÈ¡·â°üÐèҪװ±¸µÄÎïÆ·---  | 
|     rolePack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)  | 
|     curItem = rolePack.GetAt(packItemIndex)  | 
|     #---Ö´ÐÐÍæ¼Ò»»×°Âß¼---  | 
|     if DoPlayerEquipItem(curPlayer, curItem, equipPackIndex, tick):  | 
|         return  | 
|       | 
|     #»»×°Ê§°Ü֪ͨ¿Í»§¶ËÐÅÏ¢  | 
|     curPlayer.Notify_ItemPutFail(IPY_GameWorld.rptItem, packItemIndex, IPY_GameWorld.rptEquip, 0)  | 
|     return  | 
|   | 
|   | 
| #---------------------------------------------------------------------  | 
| ## Ò»¼ü»»×°£¨·â°ü£©  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def OneKeyChangeEquip(index, tick):  | 
|     return  | 
|   | 
|   | 
| ## Íæ¼ÒжÏÂ×°±¸(·â°ü²ÎÊý)  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def PlayerUnEquip(index, tick):  | 
|     GameWorld.GetPsycoFunc(__Func_PlayerUnEquip)(index, tick)  | 
|     return  | 
|   | 
|   | 
| #---------------------------------------------------------------------      | 
| ## Íæ¼ÒжÏÂ×°±¸(·â°ü²ÎÊý)  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def __Func_PlayerUnEquip(index, tick):  | 
|     sendPack = IPY_GameWorld.IPY_CUnEquipItem()  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|       | 
|     if not CheckPlayerCanEquipItem(curPlayer):  | 
|         return  | 
|       | 
|     equipPackIndex = sendPack.GetEquipIndex()  | 
|   | 
|     #Èç¹ûжϵÄÊÇÂíÆ¥£¬ÐèÒªÅж¨Èç¹ûÂíÆ¥×°±¸±³°üÓÐÎïÆ·£¬²»È÷ÅÏ  | 
|     #===========================================================================  | 
|     # if equipIndex == IPY_GameWorld.rptHorse :  | 
|     #    itemEquipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptHorseEquip)  | 
|     #      | 
|     #    if not ItemControler.GetPackIsEmpty(itemEquipPack):  | 
|     #        PlayerControl.NotifyCode(curPlayer, "7E355D97-520A-4A8C-8BC993AAEAF6071F")  | 
|     #        return  | 
|     #===========================================================================  | 
|       | 
|     playerItemControl = ItemControler.PlayerItemControler(curPlayer)  | 
|     result = playerItemControl.UnEquipItem(equipPackIndex, sendPack.GetPackIndex())  | 
|       | 
|     if not result:  | 
|         #жÏÂ×°±¸Ê§°Ü  | 
|         return  | 
|       | 
|     equipID = result[0]  | 
|     equipPlace = result[1]  | 
|     itemClassLV = result[2]  | 
|       | 
|     ##ÌØÊâ×°±¸ , ²»ÐèÒª³åË¢ÊôÐÔ  | 
|     if equipPlace in ChConfig.EquipItemNoRefreshState:  | 
|         return  | 
|       | 
|     #ÏÈË¢×°±¸BUFF ÔÙ¼ÆËãÊôÐÔ  | 
|     if equipPlace in ChConfig.EquipPlace_LingQi:  | 
|         RefreshPlayerLingQiEquipAttr(curPlayer)  | 
|     elif itemClassLV:  | 
|         RefreshPlayerEquipAttribute(curPlayer, itemClassLV)  | 
|       | 
|     #Ë¢ÐÂËùÓÐÊôÐÔ  | 
|     playControl = PlayerControl.PlayerControl(curPlayer)  | 
|     playControl.RefreshPlayerAttrState()  | 
|       | 
|     #×°±¸µÄ±»¶¯´¥·¢À༼ÄÜ  | 
|     PassiveBuffEffMng.GetPassiveEffManager().RegistSuperEquipSkillDict(curPlayer)  | 
|     return  | 
|   | 
| #// A3 18 ÁéÆ÷Í»ÆÆ #tagCMLingQiEquipBreak  | 
| #  | 
| #struct    tagCMLingQiEquipBreak  | 
| #{  | 
| #    tagHead        Head;  | 
| #    DWORD        ItemID;  //Í»ÆÆµÄÎïÆ·ID  | 
| #};   | 
| def OnLingQiEquipBreak(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     breakItemID = clientData.ItemID  | 
|     ipyData = IpyGameDataPY.GetIpyGameData('LingQiAttr', breakItemID)  | 
|     if not ipyData:  | 
|         return  | 
|     nextItemID = ipyData.GetNextItemID() #Í»ÆÆºóµÄÎïÆ·ID  | 
|     if not IpyGameDataPY.GetIpyGameData('LingQiAttr', nextItemID):  | 
|         return  | 
|     breakItemData = GameWorld.GetGameData().GetItemByTypeID(breakItemID)  | 
|     nextItemData = GameWorld.GetGameData().GetItemByTypeID(nextItemID)  | 
|     if not breakItemData or not nextItemData:  | 
|         return  | 
|     equipIndex = ItemCommon.GetEquipPackIndex(breakItemData)  | 
|     if equipIndex != ItemCommon.GetEquipPackIndex(nextItemData):  | 
|         GameWorld.DebugLog("Í»ÆÆµÄÎïÆ·ºÍÍ»ÆÆºóµÄÎïÆ·²»ÊÇͬ¸ö×°±¸Î»£¡breakItemID=%s,nextItemID=%s"   | 
|                            % (breakItemID, nextItemID))  | 
|         return  | 
|     equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)  | 
|     curEquip = equipPack.GetAt(equipIndex)  | 
|     if not curEquip or curEquip.IsEmpty():  | 
|         GameWorld.DebugLog("Í»ÆÆµÄÎïÆ·Î´´©´÷£¡breakItemID=%s"   | 
|                            % (breakItemID))  | 
|         return  | 
|     if curEquip.GetEndureReduceType():  | 
|         GameWorld.DebugLog("Í»ÆÆµÄÎïÆ·ÊÇʱЧÎïÆ·£¡breakItemID=%s"   | 
|                            % (breakItemID))  | 
|         return  | 
|     if curEquip.GetItemTypeID() != breakItemID:  | 
|         GameWorld.DebugLog("Í»ÆÆµÄÎïÆ·Î´´©´÷£¡breakItemID=%s"   | 
|                            % (breakItemID))  | 
|         return  | 
|           | 
|           | 
|     costItemDict = ipyData.GetUpCostItem()  | 
|     itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)  | 
|     lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(costItemDict, itemPack)  | 
|     if lackItemDict:  | 
|         GameWorld.DebugLog("Í»ÆÆÏûºÄÎïÆ·²»×㣡breakItemID=%s,costItemDict=%s,lackItemDict=%s"   | 
|                            % (breakItemID, costItemDict, lackItemDict))  | 
|         return  | 
|       | 
|     #¿ÛÏûºÄ  | 
|     ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, 'LingQiEquipBreak')  | 
|     ItemCommon.DelItem(curPlayer, curEquip, 1, False, ChConfig.ItemDel_LingQiEquipBreak, {}, True)  | 
|     #¸øÍ»ÆÆºóÁéÆ÷  | 
|     if not ItemControler.PutItemInTempSwap(curPlayer, nextItemID):  | 
|         GameWorld.Log("ÁéÆ÷Í»ÆÆºóID(%s)·ÅÈëÁÙʱ½»»»±³°üʧ°Ü!" % (nextItemID), curPlayer.GetID())  | 
|         return  | 
|     ItemCommon.DoLogicSwitchItemEx(curPlayer, ShareDefine.rptTempSwap, IPY_GameWorld.rptEquip, 0, equipIndex)  | 
|   | 
|     changeItemStarLV = 0  #curItem.GetItemStarLV()  | 
|     changeItemStoneCnt = 0  #curItem.GetUseStoneCount()  | 
|     changeItemHoleCnt = 0  #curItem.GetCanPlaceStoneCount()  | 
|     changeItemUseData = ''  | 
|     curPlayer.ChangeEquip(nextItemID, equipIndex, changeItemStarLV, changeItemHoleCnt, changeItemStoneCnt, changeItemUseData)  | 
|     #Ë¢ÊôÐÔ  | 
|     RefreshPlayerLingQiEquipAttr(curPlayer)  | 
|     playControl = PlayerControl.PlayerControl(curPlayer)  | 
|     playControl.RefreshPlayerAttrState()  | 
|     #֪ͨ½á¹û  | 
|     resultPack = ChPyNetSendPack.tagMCLingQiEquipBreakResult()  | 
|     resultPack.Clear()  | 
|     resultPack.MakeItemID = nextItemID  | 
|     NetPackCommon.SendFakePack(curPlayer, resultPack)  | 
|     PlayerControl.WorldNotify(0, 'SpiritOrgan', [curPlayer.GetName(), breakItemID, nextItemID])  | 
|     return  | 
|   | 
| def RefreshPlayerLingQiEquipAttr(curPlayer):  | 
|     ''' Ë¢ÐÂÍæ¼ÒÁéÆ÷×°±¸ÊôÐÔ  | 
|     '''  | 
|       | 
|     classLV = 0 # ÁéÆ÷½×ĬÈÏΪ0  | 
|     allAttrList = [{} for _ in range(4)]  | 
|     lingQiAttrList = [{} for _ in range(4)]  | 
|     equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)  | 
|     equipScoreTotal = 0  | 
|     lv = curPlayer.GetLV()  | 
|     lqAttrFormatDict = IpyGameDataPY.GetFuncEvalCfg("OutOfPrintValue", 2, {})  | 
|       | 
|     for equipPlace in ChConfig.EquipPlace_LingQi:  | 
|           | 
|         ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, equipPlace)  | 
|         if not ipyData:  | 
|             continue  | 
|           | 
|         equipIndex = ipyData.GetGridIndex()  | 
|         curEquip = equipPack.GetAt(equipIndex)  | 
|         if not curEquip or curEquip.IsEmpty():  | 
|             continue  | 
|           | 
|         if not ItemCommon.CheckItemCanUseByExpireTime(curEquip):  | 
|             # ¹ýÆÚ  | 
|             continue  | 
|           | 
|         equipScoreTotal += ItemCommon.GetEquipGearScore(curEquip)  | 
|           | 
|         itemID = curEquip.GetItemTypeID()  | 
|         #»ù´¡ÊôÐÔЧ¹û  | 
|         for effIndex in xrange(curEquip.GetEffectCount()):  | 
|             curEff = curEquip.GetEffectByIndex(effIndex)  | 
|             effID = curEff.GetEffectID()  | 
|             if effID == 0:  | 
|                 break  | 
|             PlayerControl.CalcAttrDict_Type(effID, curEff.GetEffectValue(0), lingQiAttrList)  | 
|               | 
|         #ÁéÆ÷ÊôÐÔ  | 
|         lingQiIpyData = IpyGameDataPY.GetIpyGameDataNotLog("LingQiAttr", itemID)  | 
|         if lingQiIpyData:  | 
|             lingQiAttrIDList = lingQiIpyData.GetLingQiAttrID()  | 
|             lingQiAttrValueList = lingQiIpyData.GetLingQiAttrValue()  | 
|             for lqIndex, lqAttrID in enumerate(lingQiAttrIDList):  | 
|                 if str(lqAttrID) in lqAttrFormatDict:  | 
|                     attrFormat = lqAttrFormatDict[str(lqAttrID)]  | 
|                     maxOOPValue = lingQiAttrValueList[lqIndex]  | 
|                     lqAttrValue = eval(FormulaControl.GetCompileFormula("LingQiAttrFormat_%s" % lqAttrID, attrFormat))  | 
|                 else:  | 
|                     lqAttrValue = lingQiAttrValueList[lqIndex]  | 
|                       | 
|                 PlayerControl.CalcAttrDict_Type(lqAttrID, lqAttrValue, lingQiAttrList)  | 
|                   | 
|         #ÁéÆ÷¸÷²¿Î»ÆäËûÊôÐÔ  | 
|         if equipPlace == ShareDefine.retWing:  | 
|             PlayerWing.CalcWingAttrEx(curPlayer, curEquip, allAttrList)  | 
|           | 
|     lqFightPowerEx = eval(IpyGameDataPY.GetFuncCompileCfg("FightpowerFormula", 2))  | 
|     curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_LingQi, lqFightPowerEx)  | 
|       | 
|     #GameWorld.DebugLog("ÁéÆ÷ÊôÐÔ1: %s" % allAttrList)  | 
|     #GameWorld.DebugLog("ÁéÆ÷ÊôÐÔ2: %s" % lingQiAttrList)  | 
|     #GameWorld.DebugLog("ÁéÆ÷ÆÀ·ÖÕ½Á¦: equipScoreTotal=%s, %s" % (equipScoreTotal, lqFightPowerEx))  | 
|     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_LingQi, allAttrList)  | 
|     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_LingQiAttr, lingQiAttrList)  | 
|     return  | 
|   | 
| def __CalcEquips_Effect(curPlayer, classLV):  | 
|     ''' ¾³½ç×°±¸ÏµÍ³ÊôÐÔ  | 
|     1. ×°±¸Ä£¿é£¬Ã¿¸ö¾³½ç½×¶ÀÁ¢£¬Ã¿¸ö¾³½çÕ½Á¦¶ÀÁ¢Ä£¿é¼ÆËã  | 
|         1.1 ×°±¸±¾ÉíÊôÐÔ: ²»ÄÜÓÐÓ°ÏìÆäËû¾³½ç×°±¸µÄÊôÐÔ  | 
|                                 »ù´¡ÊôÐÔ: ÎïÆ·±íÖеÄÅäÖà  | 
|                                 ´«ÆæÊôÐÔ:   | 
|                                   | 
|     2.×°±¸Î»ÐǼ¶Ä£¿é      | 
|         2.1 ×°±¸Î»ÉýÐÇÊôÐÔ£º²»ÄÜÓÐÓ°ÏìÆäËû¾³½ç×°±¸µÄÊôÐÔ  | 
|                                 ÉýÐÇ»ù´¡ÊôÐÔ£¬ÊôÐÔÊôÓÚ×°±¸»ù´¡  | 
|                                 ÉýÐǵȼ¶ÊôÐÔ£¬»áÓ°Ïì±¾½××°±¸»ù´¡  | 
|                                 ÐǼ¶Ì××°ÊôÐÔ£¬Ïê¼ûÌ××°ÊôÐÔ  | 
|                       | 
|         2.2 ×°±¸Î»Ì××°ÊôÐÔ£º²»ÄÜÓÐÓ°ÏìÆäËû¾³½ç×°±¸µÄÊôÐÔ  | 
|                                 ÓÉ×°±¸Î»ÊÇ·ñÌ××°¼°ÐǼ¶Êý¾ö¶¨Ì××°ÊôÐÔ  | 
|               | 
|     3.×°±¸Î»Ç¿»¯Ä£¿é£ºÕ½Á¦ÎªËùÓо³½ç×°±¸Î»Ç¿»¯ÊôÐÔ×ܺÍÕ½Á¦  | 
|                     Ç¿»¯µÈ¼¶ÊôÐÔ      | 
|                     ½ø»¯µÈ¼¶ÊôÐÔ£¬Ó°Ïì±¾²¿Î»±¾¾³½ç×°±¸»ù´¡  | 
|                       | 
|     4.×°±¸Î»±¦Ê¯ÊôÐÔ£ºÕ½Á¦ÎªËùÓо³½ç×°±¸Î»±¦Ê¯ÊôÐÔ×ܺÍÕ½Á¦  | 
|                     ±¦Ê¯µÈ¼¶ÊôÐÔ  | 
|                     ±¦Ê¯¾õÐÑÊôÐÔ£¬»áÓ°Ïì±¾½××°±¸»ù´¡  | 
|                       | 
|     5.×°±¸Î»Ï´Á·ÊôÐÔ£ºÕ½Á¦ÎªËùÓо³½ç×°±¸Î»Ï´Á·ÊôÐÔ×ܺÍÕ½Á¦  | 
|                     Ï´Á·µÈ¼¶ÊôÐÔ  | 
|                     Ï´Á·Ì××°ÊôÐÔ£¬»áÓ°Ïì±¾½××°±¸»ù´¡  | 
|     '''  | 
|       | 
|     if classLV < 1:  | 
|         GameWorld.ErrLog("Ë¢¾³½ç×°±¸ÊôÐÔ½×´íÎó!µ±Ç°²»Ö§³Ö¸Ã½×Ä£¿é: classLV=%s" % classLV)  | 
|         return  | 
|     #GameWorld.DebugLog("----- Ë¢¾³½ç×°±¸Õ½Á¦: classLV=%s" % (classLV))  | 
|       | 
|     allEquipBaseAttrDict = {} # ËùÓÐ×°±¸»ù´¡ÊôÐÔ {attrID:value, ...}  | 
|     baseEquipBaseAttrDict = {} # »ù´¡×°±¸»ù´¡ÊôÐÔ{attrID:value, ...}  | 
|     equipBaseAttrDict = {} # ×°±¸»ù´¡ÊôÐÔ {×°±¸Î»:{attrID:value, ...}, ...}  | 
|       | 
|     allAttrListEquip = [{} for _ in range(4)]  # ×°±¸ÊôÐÔ  | 
|     equip_addEquipBaseAttrPerList = [{}, {}, {}] # ×°±¸¹¦Äܵã¶Ô×°±¸»ù´¡µÄ¼Ó³ÉÐÅÏ¢ [ËùÓв¿Î», »ù´¡²¿Î», Ö¸¶¨²¿Î»]  | 
|     allAttrListStar = [{} for _ in range(4)]  # ÉýÐÇÊôÐÔ  | 
|     star_addEquipBaseAttrPerList = [{}, {}, {}] # ÉýÐǹ¦Äܵã¶Ô×°±¸»ù´¡µÄ¼Ó³ÉÐÅÏ¢ [ËùÓв¿Î», »ù´¡²¿Î», Ö¸¶¨²¿Î»]  | 
|     allAttrListPlus = [{} for _ in range(4)]  # Ç¿»¯ÊôÐÔ  | 
|     plus_addEquipBaseAttrPerList = [{}, {}, {}] # Ç¿»¯¹¦Äܵã¶Ô×°±¸»ù´¡µÄ¼Ó³ÉÐÅÏ¢ [ËùÓв¿Î», »ù´¡²¿Î», Ö¸¶¨²¿Î»]  | 
|     allAttrListStone = [{} for _ in range(4)]  # ±¦Ê¯ÊôÐÔ  | 
|     #stone_addEquipBaseAttrPerList = [{}, {}, {}] # ±¦Ê¯¹¦Äܵã¶Ô×°±¸»ù´¡µÄ¼Ó³ÉÐÅÏ¢ [ËùÓв¿Î», »ù´¡²¿Î», Ö¸¶¨²¿Î»]  | 
|     allAttrListWash = [{} for _ in range(4)]  # Ï´Á·ÊôÐÔ  | 
|     #wash_addEquipBaseAttrPerList = [{}, {}, {}] # Ï´Á·¹¦Äܵã¶Ô×°±¸»ù´¡µÄ¼Ó³ÉÐÅÏ¢ [ËùÓв¿Î», »ù´¡²¿Î», Ö¸¶¨²¿Î»]  | 
|       | 
|     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  #Ϊ½â¾ö×°±¸ÆÀ·Ö¡¢Õ½Á¦²»Ò»ÖµÄÇé¿ö£¬×°±¸Õ½Á¦¸ÄΪÓÉÆÀ·Ö×÷Ϊ²ÎÊý¼ÆËãÕ½Á¦  | 
|       | 
|     basePlusLVMin = None # »ù´¡×°±¸×îСǿ»¯µÈ¼¶£¬¼ÆËã´óʦǿ»¯ÊôÐÔÓà  | 
|       | 
|     # 1. Ñ»·±éÀú±¾½××°±¸  | 
|     for equipPlace in equipPartStarIndexList:  | 
|         ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, equipPlace)  | 
|         if not ipyData:  | 
|             continue  | 
|         equipIndex = ipyData.GetGridIndex()  | 
|         curEquip = playerEquip.GetAt(equipIndex)  | 
|         if not curEquip or curEquip.IsEmpty():  | 
|             continue  | 
|           | 
|         #if not ItemCommon.CheckItemCanUseByExpireTime(curEquip):  | 
|         #    # ¹ýÆÚ£¬Ôݲ»Åжϣ¬ÒÔºó¾³½ç×°±¸ÓÐʱЧװ±¸ÔÙ¿ªÆô  | 
|         #    continue  | 
|           | 
|         #equipPlaceList.append(equipIndex)  | 
|         equipScoreTotal += ItemCommon.GetEquipGearScore(curEquip)  | 
|           | 
|         baseAttrDict = {} # ×°±¸Î»»ù´¡ÊôÐÔ: ÎïÆ·±í + ÐǼ¶»ù´¡  | 
|         isBaseEquip = equipPlace in ChConfig.EquipPlace_Base  | 
|           | 
|         #GameWorld.DebugLog("×°±¸Î» %s: itemID=%s,isBaseEquip=%s,equipScoreTotal=%s" % (equipPlace, curEquip.GetItemTypeID(), isBaseEquip, equipScoreTotal))  | 
|           | 
|         #»ù´¡ÊôÐÔЧ¹û  | 
|         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  | 
|             PlayerControl.CalcAttrDict_Type(effectID, effectValue, allAttrListEquip)  | 
|             baseAttrDict[effectID] = baseAttrDict.get(effectID, 0) + effectValue  | 
|             allEquipBaseAttrDict[effectID] = allEquipBaseAttrDict.get(effectID, 0) + effectValue  | 
|             if isBaseEquip:  | 
|                 baseEquipBaseAttrDict[effectID] = baseEquipBaseAttrDict.get(effectID, 0) + effectValue  | 
|             #GameWorld.DebugLog("    ÎïÆ·±íÊôÐÔ: ID=%s +%s" % (effectID, effectValue))  | 
|                   | 
|         #ÐÇÊýÊôÐÔ  | 
|         equipPartStar = GetEquipPartStarByRank(curPlayer, equipIndex, curEquip) # ÉúЧµÄÐÇÊý  | 
|         if equipPartStar:  | 
|             #GameWorld.DebugLog("    ÐǼ¶ÊôÐÔ: classLV=%s, equipPlace=%s, equipPartStar=%s" % (classLV, equipPlace, equipPartStar))  | 
|             ipyData = IpyGameDataPY.GetIpyGameData('EquipStarUp', classLV, equipPlace, equipPartStar)  | 
|             starBaseAttrDict = {} if not ipyData else ipyData.GetBaseAttrInfo() # ÐǼ¶»ù´¡  | 
|             for starBaseAttrID, starBaseAttrValue in starBaseAttrDict.items():  | 
|                 PlayerControl.CalcAttrDict_Type(starBaseAttrID, starBaseAttrValue, allAttrListStar)  | 
|                 baseAttrDict[starBaseAttrID] = baseAttrDict.get(starBaseAttrID, 0) + starBaseAttrValue  | 
|                 allEquipBaseAttrDict[starBaseAttrID] = allEquipBaseAttrDict.get(starBaseAttrID, 0) + starBaseAttrValue  | 
|                 if isBaseEquip:  | 
|                     baseEquipBaseAttrDict[starBaseAttrID] = baseEquipBaseAttrDict.get(starBaseAttrID, 0) + starBaseAttrValue  | 
|                 #GameWorld.DebugLog("    ÐǼ¶»ù´¡ÊôÐÔ: ID=%s +%s" % (starBaseAttrID, starBaseAttrValue))  | 
|                       | 
|             starAttrDict = {} if not ipyData else ipyData.GetStarAttrInfo() # ÐǼ¶¸½¼Ó  | 
|             for starAttrID, starAttrValue in starAttrDict.items():  | 
|                 PlayerControl.CalcAttrDict_Type(starAttrID, starAttrValue, allAttrListStar)  | 
|                 #GameWorld.DebugLog("    ÐǼ¶¸½¼ÓÊôÐÔ: ID=%s +%s" % (starAttrID, starAttrValue))  | 
|                 __CalcFuncAddEquipAttrPer(equipPlace, starAttrID, starAttrValue, star_addEquipBaseAttrPerList)  | 
|                   | 
|         equipBaseAttrDict[equipPlace] = baseAttrDict  | 
|           | 
|         #Ì××°¼ÆÊý  | 
|         suiteID = curEquip.GetSuiteID()  | 
|         if suiteID:  | 
|             if suiteID not in suitCntDict:  | 
|                 suitCntDict[suiteID] = []  | 
|             suitCntDict[suiteID].append(equipPartStar)  | 
|               | 
|         #´«ÆæÊôÐÔ  | 
|         legAttrIDList, legAttrValueList = ItemControler.GetEquipLegendAttrAll(curEquip)  | 
|         for i, legendAttrID in enumerate(legAttrIDList):  | 
|             legendAttrValue = legAttrValueList[i]  | 
|             PlayerControl.CalcAttrDict_Type(legendAttrID, legendAttrValue, allAttrListEquip)  | 
|             #GameWorld.DebugLog("    ´«ÆæÊôÐÔ: ID=%s +%s" % (legendAttrID, legendAttrValue))  | 
|             __CalcFuncAddEquipAttrPer(equipPlace, legendAttrID, legendAttrValue, equip_addEquipBaseAttrPerList)  | 
|           | 
|         #ÎïÆ·Ç¿»¯ÊôÐÔ  | 
|         plusLV = __CalcAttr_ItemPlus(curPlayer, curEquip, packType, equipIndex, allAttrListPlus, plus_addEquipBaseAttrPerList)  | 
|         if isBaseEquip:  | 
|             basePlusLVMin = plusLV if basePlusLVMin == None else min(basePlusLVMin, plusLV)  | 
|               | 
|         #¼ÆËã×°±¸±¦Ê¯¼Ó³É  | 
|         CalcEquipStone_Effect(curPlayer, equipIndex, allAttrListStone)  | 
|           | 
|         #Ï´Á·ÊôÐÔ  | 
|         Operate_EquipWash.CalcAttr_EquipWash(curPlayer, equipIndex, equipPlace, allAttrListWash)  | 
|       | 
| #    GameWorld.DebugLog("    ×°±¸Ñ»·ÊôÐÔ: %s" % (allAttrListEquip))  | 
| #    GameWorld.DebugLog("    ÉýÐÇÑ»·ÊôÐÔ: %s" % (allAttrListStar))  | 
| #    GameWorld.DebugLog("    Ç¿»¯Ñ»·ÊôÐÔ: %s" % (allAttrListPlus))  | 
| #    GameWorld.DebugLog("    ±¦Ê¯Ñ»·ÊôÐÔ: %s" % (allAttrListStone))  | 
| #    GameWorld.DebugLog("    Ï´Á·Ñ»·ÊôÐÔ: %s" % (allAttrListWash))  | 
| #    GameWorld.DebugLog("    -----" )  | 
|     # 2. ¼ÆËã±éÀúºóµÄ¸½¼ÓÊôÐÔ  | 
|     #Ì××°ÊôÐÔ£¬ÔݹéΪÐǼ¶Ì××°ÊôÐÔ  | 
|     CalcEquipSuiteAttr(curPlayer, suitCntDict, allAttrListStar)  | 
|     #´óʦ  | 
|     __CalcMasterPlusLVAttr(curPlayer, classLV, basePlusLVMin, allAttrListPlus, plus_addEquipBaseAttrPerList)  | 
|       | 
| #    GameWorld.DebugLog("    ÉýÐÇÊôÐÔÌ××°: %s" % (allAttrListEquip))  | 
|       | 
|     # 3. ¼ÆËã¶Ô×°±¸»ù´¡µÄ¸½¼Ó¼Ó³É  | 
| #    GameWorld.DebugLog("    -----" )  | 
| #    GameWorld.DebugLog("    ËùÓÐ×°±¸»ù´¡ÊôÐÔ: %s" % (allEquipBaseAttrDict))  | 
| #    GameWorld.DebugLog("    »ù´¡×°±¸»ù´¡ÊôÐÔ: %s" % (baseEquipBaseAttrDict))  | 
| #    GameWorld.DebugLog("    µ¥¼þ×°±¸»ù´¡ÊôÐÔ: %s" % (equipBaseAttrDict))  | 
| #    GameWorld.DebugLog("    -----" )  | 
|     #¼ÆË㹦Äܵã¶Ô×°±¸»ù´¡µÄ¼Ó³É  | 
|     insideAttrDictEquip, insideAttrDictStar, insideAttrDictPlus, insideAttrDictStone, insideAttrDictWash = {}, {}, {}, {}, {}  | 
|     __CalcFuncAddEquipAttrValue(allEquipBaseAttrDict, baseEquipBaseAttrDict, equipBaseAttrDict, equip_addEquipBaseAttrPerList, insideAttrDictEquip, "Equip")  | 
|     __CalcFuncAddEquipAttrValue(allEquipBaseAttrDict, baseEquipBaseAttrDict, equipBaseAttrDict, star_addEquipBaseAttrPerList, insideAttrDictStar, "Star")  | 
|     __CalcFuncAddEquipAttrValue(allEquipBaseAttrDict, baseEquipBaseAttrDict, equipBaseAttrDict, plus_addEquipBaseAttrPerList, insideAttrDictPlus, "Plus")  | 
|     #__CalcFuncAddEquipAttrValue(allEquipBaseAttrDict, baseEquipBaseAttrDict, equipBaseAttrDict, stone_addEquipBaseAttrPerList, insideAttrDictStone, "Stone")  | 
|     #__CalcFuncAddEquipAttrValue(allEquipBaseAttrDict, baseEquipBaseAttrDict, equipBaseAttrDict, wash_addEquipBaseAttrPerList, insideAttrDictWash, "Wash")  | 
|       | 
|     #¼ÆËã×°±¸»ù´¡ÊôÐÔ¸½¼ÓÕ½Á¦ (Ŀǰ×é³É: ÆÀ·ÖÕ½Á¦ + ...)  | 
|     equipFightPowerEx = eval(IpyGameDataPY.GetFuncCompileCfg("FightpowerFormula", 2))  | 
|       | 
|     # 4. ÀÛ¼ÓËùÓн××°±¸Î»ÊôÐÔ  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     if playerID not in PyGameData.g_playerEquipPartAttrDict:  | 
|         PyGameData.g_playerEquipPartAttrDict[playerID] = {}  | 
|     equipPartAttrDict = PyGameData.g_playerEquipPartAttrDict[playerID]  | 
|     equipPartAttrDict[classLV] = [equipFightPowerEx, allAttrListEquip, insideAttrDictEquip, allAttrListStar, insideAttrDictStar,  | 
|                                   allAttrListPlus, insideAttrDictPlus, allAttrListStone, insideAttrDictStone, allAttrListWash, insideAttrDictWash]  | 
|       | 
| #    GameWorld.DebugLog("    ----- ÀÛ¼ÓËùÓн××°±¸Î»Ñø³ÉÊôÐÔ")  | 
| #    GameWorld.DebugLog("    ±¾½××°±¸Õ½Á¦: equipScoreTotal=%s,equipFightPowerEx=%s" % (equipScoreTotal, equipFightPowerEx))  | 
| #    GameWorld.DebugLog("    ±¾½××°±¸ÊôÐÔ: %s, ÄÚ²¿¼Ó³É=%s" % (allAttrListEquip, insideAttrDictEquip))  | 
| #    GameWorld.DebugLog("    ±¾½×ÉýÐÇÊôÐÔ: %s, ÄÚ²¿¼Ó³É=%s" % (allAttrListStar, insideAttrDictStar))  | 
| #    GameWorld.DebugLog("    ±¾½×Ç¿»¯ÊôÐÔ: %s, ÄÚ²¿¼Ó³É=%s" % (allAttrListPlus, insideAttrDictPlus))  | 
| #    GameWorld.DebugLog("    ±¾½×±¦Ê¯ÊôÐÔ: %s, ÄÚ²¿¼Ó³É=%s" % (allAttrListStone, insideAttrDictStone))  | 
| #    GameWorld.DebugLog("    ±¾½×Ï´Á·ÊôÐÔ: %s, ÄÚ²¿¼Ó³É=%s" % (allAttrListWash, insideAttrDictWash))  | 
|       | 
|     allClassEquipFightPowerEx = 0  | 
|     allClassAttrListEquip, allClassInsideAttrDictEquip = [{} for _ in range(4)], {}  | 
|     allClassAttrListStar, allClassInsideAttrDictStar = [{} for _ in range(4)], {}  | 
|     allClassAttrListPlus, allClassInsideAttrDictPlus = [{} for _ in range(4)], {}  | 
|     allClassAttrListStone, allClassInsideAttrDictStone = [{} for _ in range(4)], {}  | 
|     allClassAttrListWash, allClassInsideAttrDictWash = [{} for _ in range(4)], {}  | 
|     for classLV, attrList in equipPartAttrDict.items():  | 
|         equipFightPowerEx, allAttrListEquip, insideAttrDictEquip, allAttrListStar, insideAttrDictStar, \  | 
|             allAttrListPlus, insideAttrDictPlus, allAttrListStone, insideAttrDictStone, allAttrListWash, insideAttrDictWash = attrList  | 
|         #GameWorld.DebugLog("    classLV=%s, %s" % (classLV, attrList))  | 
|         allClassEquipFightPowerEx += equipFightPowerEx  | 
|         for i in xrange(4):  | 
|             PlayerControl.AddAttrDictValue(allClassAttrListEquip[i], allAttrListEquip[i])  | 
|             PlayerControl.AddAttrDictValue(allClassAttrListStar[i], allAttrListStar[i])  | 
|             PlayerControl.AddAttrDictValue(allClassAttrListPlus[i], allAttrListPlus[i])  | 
|             PlayerControl.AddAttrDictValue(allClassAttrListStone[i], allAttrListStone[i])  | 
|             PlayerControl.AddAttrDictValue(allClassAttrListWash[i], allAttrListWash[i])  | 
|         PlayerControl.AddAttrDictValue(allClassInsideAttrDictEquip, insideAttrDictEquip)  | 
|         PlayerControl.AddAttrDictValue(allClassInsideAttrDictStar, insideAttrDictStar)  | 
|         PlayerControl.AddAttrDictValue(allClassInsideAttrDictPlus, insideAttrDictPlus)  | 
|         PlayerControl.AddAttrDictValue(allClassInsideAttrDictStone, insideAttrDictStone)  | 
|         PlayerControl.AddAttrDictValue(allClassInsideAttrDictWash, insideAttrDictWash)  | 
|           | 
| #    GameWorld.DebugLog("    ËùÓн××°±¸Õ½Á¦: %s" % (allClassEquipFightPowerEx))  | 
| #    GameWorld.DebugLog("    ËùÓн××°±¸ÊôÐÔ: %s, ÄÚ²¿¼Ó³É=%s" % (allClassAttrListEquip, allClassInsideAttrDictEquip))  | 
| #    GameWorld.DebugLog("    ËùÓн×ÉýÐÇÊôÐÔ: %s, ÄÚ²¿¼Ó³É=%s" % (allClassAttrListStar, allClassInsideAttrDictStar))  | 
| #    GameWorld.DebugLog("    ËùÓн×Ç¿»¯ÊôÐÔ: %s, ÄÚ²¿¼Ó³É=%s" % (allClassAttrListPlus, allClassInsideAttrDictPlus))  | 
| #    GameWorld.DebugLog("    ËùÓнױ¦Ê¯ÊôÐÔ: %s, ÄÚ²¿¼Ó³É=%s" % (allClassAttrListStone, allClassInsideAttrDictStone))  | 
| #    GameWorld.DebugLog("    ËùÓн×Ï´Á·ÊôÐÔ: %s, ÄÚ²¿¼Ó³É=%s" % (allClassAttrListWash, allClassInsideAttrDictWash))  | 
|     curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_Equip, allClassEquipFightPowerEx)  | 
|     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Equip, allClassAttrListEquip, allClassInsideAttrDictEquip)  | 
|     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Star, allClassAttrListStar, allClassInsideAttrDictStar)  | 
|     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Plus, allClassAttrListPlus, allClassInsideAttrDictPlus)  | 
|     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Stone, allClassAttrListStone, allClassInsideAttrDictStone)  | 
|     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Wash, allClassAttrListWash, allClassInsideAttrDictWash)  | 
|     return  | 
|   | 
| def __CalcFuncAddEquipAttrPer(equipPlace, attrID, attrValue, addPerInfoList):  | 
|     ## ¼ÆËãÆäËû¹¦ÄÜÊôÐÔ¶Ô×°±¸»ù´¡ÊôÐÔµÄ¼Ó³É  | 
|           | 
|     if attrID not in ChConfig.EquipBassAttrAddInfoSet:  | 
|         return  | 
|     effPlace, calcAttrList = ChConfig.EquipBassAttrAddInfoSet[attrID]  | 
|     #GameWorld.DebugLog("        ×°±¸»ù´¡¼Ó³ÉÐÅÏ¢: ID=%s,effPlace=%s,calcAttrList=%s" % (attrID, effPlace, calcAttrList))  | 
|     # ËùÓв¿Î»  | 
|     if effPlace == -1:  | 
|         allPlaceAddPerDict = addPerInfoList[0]  | 
|         for calcAttrIndex in calcAttrList:  | 
|             allPlaceAddPerDict[calcAttrIndex] = allPlaceAddPerDict.get(calcAttrIndex, 0) + attrValue  | 
|         #GameWorld.DebugLog("            µ±Ç°¼Ó³ÉÐÅÏ¢=%s" % (addPerInfoList))  | 
|         return  | 
|           | 
|     # »ù´¡²¿Î»  | 
|     if effPlace == -2:  | 
|         basePlaceAddPerDict = addPerInfoList[1]  | 
|         for calcAttrIndex in calcAttrList:  | 
|             basePlaceAddPerDict[calcAttrIndex] = basePlaceAddPerDict.get(calcAttrIndex, 0) + attrValue  | 
|         #GameWorld.DebugLog("            µ±Ç°¼Ó³ÉÐÅÏ¢=%s" % (addPerInfoList))  | 
|         return  | 
|       | 
|     # Ö¸¶¨²¿Î»  | 
|     elif effPlace > 0 and equipPlace == effPlace:  | 
|         assignPlaceAddPerDict = addPerInfoList[2]  | 
|         if equipPlace not in assignPlaceAddPerDict:  | 
|             assignPlaceAddPerDict[equipPlace] = {}  | 
|         curPlaceAddPerDict = assignPlaceAddPerDict[equipPlace]  | 
|         for calcAttrIndex in calcAttrList:  | 
|             curPlaceAddPerDict[calcAttrIndex] = curPlaceAddPerDict.get(calcAttrIndex, 0) + attrValue  | 
|         #GameWorld.DebugLog("            µ±Ç°¼Ó³ÉÐÅÏ¢=%s" % (addPerInfoList))  | 
|         return  | 
|       | 
|     return  | 
|   | 
| def __CalcFuncAddEquipAttrValue(allEquipBaseAttrDict, baseEquipBaseAttrDict, equipBaseAttrDict, addEquipBaseAttrPerList, allAttrDict, sign=""):  | 
|     ## ¼ÆËãÆäËû¹¦ÄÜÊôÐÔ¶Ô×°±¸»ù´¡ÊôÐԼӳɵÄÊôÐÔ¾ßÌåÖµ  | 
|     allPlaceAddPerDict, basePlaceAddPerDict, assignPlaceAddPerDict = addEquipBaseAttrPerList  | 
|     #GameWorld.DebugLog("    ¼ÆË㹦Äܵã¶Ô×°±¸»ù´¡ÊôÐÔ¼Ó³É: %s" % sign)  | 
|     #GameWorld.DebugLog("        È«²¿×°±¸ÊôÐÔ: %s, ¼Ó³É%s" % (allEquipBaseAttrDict, allPlaceAddPerDict))  | 
|     for attrID, addPer in allPlaceAddPerDict.items():  | 
|         if attrID not in allEquipBaseAttrDict:  | 
|             continue  | 
|         baseValue = allEquipBaseAttrDict[attrID]  | 
|         addValue = int(baseValue * addPer / 10000.0)  | 
|         PlayerControl.CalcAttrDict_TypeEx(attrID, addValue, allAttrDict)  | 
|         #GameWorld.DebugLog("            ¼Ó³É: ID=%s +%s %s" % (attrID, addValue, addPer))  | 
|       | 
|     #GameWorld.DebugLog("        »ù´¡×°±¸ÊôÐÔ: %s, ¼Ó³É%s" % (baseEquipBaseAttrDict, basePlaceAddPerDict))  | 
|     for attrID, addPer in basePlaceAddPerDict.items():  | 
|         if attrID not in baseEquipBaseAttrDict:  | 
|             continue  | 
|         baseValue = baseEquipBaseAttrDict[attrID]  | 
|         addValue = int(baseValue * addPer / 10000.0)  | 
|         PlayerControl.CalcAttrDict_TypeEx(attrID, addValue, allAttrDict)  | 
|         #GameWorld.DebugLog("            ¼Ó³É: ID=%s +%s %s" % (attrID, addValue, addPer))  | 
|           | 
|     #GameWorld.DebugLog("        Ö¸¶¨×°±¸ÊôÐÔ: %s, ¼Ó³É%s" % (equipBaseAttrDict, assignPlaceAddPerDict))  | 
|     for equipPlace, addPerDict in assignPlaceAddPerDict.items():  | 
|         if equipPlace not in equipBaseAttrDict:  | 
|             continue  | 
|         baseAttrDict = equipBaseAttrDict[equipPlace]  | 
|         for attrID, addPer in addPerDict.items():  | 
|             if attrID not in baseAttrDict:  | 
|                 continue  | 
|             baseValue = baseAttrDict[attrID]  | 
|             addValue = int(baseValue * addPer / 10000.0)  | 
|             PlayerControl.CalcAttrDict_TypeEx(attrID, addValue, allAttrDict)  | 
|             #GameWorld.DebugLog("            ¼Ó³É: ID=%s +%s %s" % (attrID, addValue, addPer))  | 
|     return  | 
|   | 
| def CalcAttr_LegendAttr(curPlayer, curEquip, allAttrListEquip, legendAttrDict={}):  | 
|     ## ¼ÆËã´«ÆæÊôÐÔ  | 
|       | 
|     legAttrIDList, legAttrValueList = ItemControler.GetEquipLegendAttrAll(curEquip)  | 
|     if not legAttrIDList:  | 
|         #GameWorld.DebugLog("ûÓд«ÆæÊôÐÔ£¡")  | 
|         return  | 
|     #GameWorld.DebugLog("´«ÆæÊôÐÔ: place=%s,IDList=%s, v=%s" % (curEquip.GetEquipPlace(), legAttrIDList, legAttrValueList))  | 
|       | 
|     for i, legendAttrID in enumerate(legAttrIDList):  | 
|         legendAttrValue = legAttrValueList[i]  | 
|         #GameWorld.DebugLog("¼Ó´«ÆæÊôÐÔ: %s +%s" % (legendAttrID, legendAttrValue))  | 
|         PlayerControl.CalcAttrDict_Type(legendAttrID, legendAttrValue, allAttrListEquip)  | 
|         #legendAttrDict[attrID] = legendAttrDict.get(attrID, 0) + value  | 
|           | 
|     return  | 
|   | 
| def __CalcAttr_ItemPlus(curPlayer, curEquip, packType, equipIndex, allAttrList, plus_addEquipBaseAttrPerList):  | 
|     ## ¼ÆËã×°±¸Ç¿»¯ºóµÄÊôÐÔ  | 
|     equipPartPlusLV = GetEquipPartPlusLV(curPlayer, packType, equipIndex)  | 
|     equipPartPlusEvolveLV = GetEquipPartPlusEvolveLV(curPlayer, packType, equipIndex)  | 
|       | 
|     if not equipPartPlusLV:  | 
|         return equipPartPlusLV  | 
|     plusType = GetEquipPlusType(curEquip)  | 
|     if plusType is None:  | 
|         return equipPartPlusLV  | 
|       | 
|     #GameWorld.DebugLog("    Ç¿»¯ÊôÐÔ: plusType=%s,equipPartPlusLV=%s,equipPartPlusEvolveLV=%s" % (plusType, equipPartPlusLV, equipPartPlusEvolveLV))  | 
|     ipyData = IpyGameDataPY.GetIpyGameData("ItemPlus", plusType, equipPartPlusLV)  | 
|     if not ipyData:  | 
|         return equipPartPlusLV  | 
|     attrTypeList, attrValueList = ipyData.GetAttrType(), ipyData.GetAttrValue()  | 
|     for i, attrID in enumerate(attrTypeList):  | 
|         #GameWorld.DebugLog("    Ç¿»¯»ù´¡ÊôÐÔ: ID=%s +%s" % (attrID, attrValueList[i]))  | 
|         PlayerControl.CalcAttrDict_Type(attrID, attrValueList[i], allAttrList)  | 
|       | 
|     if not equipPartPlusEvolveLV:  | 
|         return equipPartPlusLV  | 
|     #½ø»¯ÊôÐÔ  | 
|     equipPlace = curEquip.GetEquipPlace()  | 
|     ipyData = IpyGameDataPY.GetIpyGameData('EquipPlusEvolve', equipPlace, equipPartPlusEvolveLV)  | 
|     if not ipyData:  | 
|         return equipPartPlusLV  | 
|     for attrID, attrValue in ipyData.GetAttr().items():  | 
|         #GameWorld.DebugLog("    Ç¿»¯½ø½×ÊôÐÔ: ID=%s +%s" % (attrID, attrValue))  | 
|         PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)  | 
|         __CalcFuncAddEquipAttrPer(equipPlace, attrID, attrValue, plus_addEquipBaseAttrPerList)  | 
|           | 
|     return equipPartPlusLV  | 
|   | 
| def __CalcMasterPlusLVAttr(curPlayer, classLV, basePlusLVMin, allAttrListPlus, plus_addEquipBaseAttrPerList):  | 
|     ## ¼ÆËã×°±¸´óʦǿ»¯ÊôÐÔ  | 
|       | 
|     ipyDataList = IpyGameDataPY.GetIpyGameDataList("ItemPlusMaster", classLV)  | 
|     if not ipyDataList:  | 
|         return  | 
|       | 
|     actMasterPlusLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartMasterPlusLV % classLV) # ÒѼ¤»îµÄ×î´ó´óʦµÈ¼¶  | 
|       | 
|     for ipyData in ipyDataList:  | 
|         needMasterPlusLV = ipyData.GetMasterPlusLV()  | 
|         if basePlusLVMin < needMasterPlusLV:  | 
|             #GameWorld.DebugLog("    Î´´ïµ½´óʦǿ»¯µÈ¼¶! classLV=%s,basePlusLVMin=%s < needMasterPlusLV=%s" % (classLV, basePlusLVMin, needMasterPlusLV))  | 
|             continue  | 
|         if actMasterPlusLV < needMasterPlusLV:  | 
|             #GameWorld.DebugLog("    Î´¼¤»î´óʦǿ»¯µÈ¼¶! classLV=%s,actMasterPlusLV=%s < needMasterPlusLV=%s" % (classLV, actMasterPlusLV, needMasterPlusLV))  | 
|             continue  | 
|           | 
|         attrIDList = ipyData.GetMasterPlusAttrIDList()  | 
|         attrValueList = ipyData.GetMasterPlusAttrValueList()  | 
|         for i, attrID in enumerate(attrIDList):  | 
|             attrValue = attrValueList[i]  | 
|             PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListPlus)  | 
|             __CalcFuncAddEquipAttrPer(None, attrID, attrValue, plus_addEquipBaseAttrPerList)  | 
|             #GameWorld.DebugLog("    Ç¿»¯´óʦÊôÐÔ! needMasterPlusLV=%s, attrID=%s + %s" % (needMasterPlusLV, attrID, attrValue))  | 
|               | 
|     return  | 
|   | 
| ## ×°±¸Ì××°ÊôÐÔ¼ÆËã  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @return None  | 
| def CalcEquipSuiteAttr(curPlayer, suitCntDict, allAttrListSuit):  | 
|     if not suitCntDict:  | 
|         return  | 
|     #GameWorld.DebugLog('    suitCntDict=%s'%suitCntDict)  | 
|     learnSkillList = []  | 
|     delSkillIDList = []  | 
|     skillManager = curPlayer.GetSkillManager()  | 
|     playerName = curPlayer.GetName()  | 
|     for suiteID, starList in suitCntDict.items():  | 
|         ipyDataList = IpyGameDataPY.GetIpyGameDataList('EquipSuitAttr', suiteID)  | 
|         if not ipyDataList:  | 
|             continue  | 
|         for ipyData in ipyDataList:  | 
|             suiteCnt = ipyData.GetSuiteCnt()  | 
|             needStar = ipyData.GetStar()  | 
|             skillID = ipyData.GetSkillID()  | 
|             activateIndex = ipyData.GetActivateIndex()  | 
|             isActivate = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_EquipPartSuiteActivate, activateIndex)  | 
|             #GameWorld.DebugLog("suiteID=%s,suiteCnt=%s,needStar=%s,isActivate=%s" % (suiteID, suiteCnt, needStar, isActivate))  | 
|             if isActivate and [1 if star >= needStar else 0 for star in starList].count(1) >= suiteCnt:  | 
|                 #GameWorld.DebugLog("    Ì××°: suiteID=%s,suiteCnt=%s,needStar=%s" % (suiteID, suiteCnt, needStar))  | 
|                 for attrID, attrValue in ipyData.GetAttrInfo().items():  | 
|                     PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListSuit)  | 
|                     #GameWorld.DebugLog("        ÊôÐÔ: ID=%s +%s" % (attrID, attrValue))  | 
|                 #¼¼ÄÜ  | 
|                 if skillID and not skillManager.FindSkillBySkillTypeID(skillID):  | 
|                     learnSkillList.append(skillID)  | 
| #                #¹ã²¥£¬¸ÄΪ¼¤»îʱ¹ã²¥¼´¿É  | 
| #                notifyMark = ipyData.GetIsNotify()  | 
| #                if notifyMark and not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_EquipPartSuiteNotify, notifyMark):  | 
| #                    PlayerControl.WorldNotify(0, 'AllStarLevelUp' if needStar else 'AllStarLevelUp2', [playerName, suiteID, suiteCnt, needStar])  | 
| #                    GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_EquipPartSuiteNotify, notifyMark, 1)  | 
|   | 
|             else:  | 
|                 if skillID and skillManager.FindSkillBySkillTypeID(skillID):  | 
|                     delSkillIDList.append(skillID)  | 
|                     skillManager.DeleteSkillBySkillTypeID(skillID)  | 
|                               | 
|               | 
|     for skillID in learnSkillList:  | 
|         GameWorld.DebugLog('    ¼¤»îÌ××°¼¼ÄÜ skillResID=%s' % (skillID))  | 
|         skillData = GameWorld.GetGameData().FindSkillByType(skillID, 1)  | 
|         if not skillData:  | 
|             continue  | 
|         skillManager.LVUpSkillBySkillTypeID(skillID)     | 
|         PlayerControl.PlayerControl(curPlayer).RefreshSkillFightPowerEx(skillID, 0)  | 
|           | 
|     for delSkillID in delSkillIDList:  | 
|         PlayerControl.PlayerControl(curPlayer).RefreshSkillFightPowerByDel(delSkillID)  | 
|           | 
|     if learnSkillList or delSkillIDList:  | 
|         # ÖØË¢±»¶¯¼¼ÄÜ  | 
|         PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(curPlayer)      | 
|     return  | 
|   | 
| #// A5 C6 ×°±¸²¿Î»ÐǼ¶Ì××°¼¤»î #tagCMEquipPartSuiteActivate  | 
| #  | 
| #struct    tagCMEquipPartSuiteActivate  | 
| #{  | 
| #    tagHead        Head;  | 
| #    BYTE    ClassLV;    // ËùÊô×°±¸½×  | 
| #    WORD    SuiteID;    // Ì××°ID  | 
| #    BYTE    SuiteCount;    // ¼þÊý  | 
| #    BYTE    Star;    // ÐÇÊý  | 
| #};  | 
| def OnEquipPartSuiteActivate(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     classLV = clientData.ClassLV  | 
|     suiteID = clientData.SuiteID  | 
|     suiteCount = clientData.SuiteCount  | 
|     star = clientData.Star  | 
|     ipyDataList = IpyGameDataPY.GetIpyGameDataList('EquipSuitAttr', suiteID)  | 
|     if not ipyDataList:  | 
|         return  | 
|       | 
|     actIpyData = None  | 
|     for ipyData in ipyDataList:  | 
|         needCount = ipyData.GetSuiteCnt()  | 
|         needStar = ipyData.GetStar()  | 
|         if suiteCount == needCount and star == needStar:  | 
|             actIpyData = ipyData  | 
|             break  | 
|           | 
|     if not actIpyData:  | 
|         return  | 
|     activateIndex = actIpyData.GetActivateIndex()  | 
|     # ÕâÀï¾Í²»ÅжÏÊÇ·ñÂú×ã¼þÊý¡¢ÐÇÊýÌõ¼þÁË£¬ËãÊôÐÔµÄʱºò±¾ÉíÒ²ÊÇÌõ¼þÖ®Ò»£¬ÊÇ·ñ¼¤»îÖ»ÊǸ½¼ÓÌõ¼þ£¬ÕâÀïÖ»´¦Àí¼¤»î״̬±ä¸ü£¬ÄÜ·ñ¼¤»îǰ¶ËÅжϼ´¿É  | 
|     isActivate = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_EquipPartSuiteActivate, activateIndex)  | 
|     if isActivate:  | 
|         return  | 
|     GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_EquipPartSuiteActivate, activateIndex, 1)  | 
|     Sync_EquipPartSuiteActivateInfo(curPlayer)  | 
|       | 
|     #¹ã²¥  | 
|     notifyMark = actIpyData.GetIsNotify()  | 
|     if notifyMark:  | 
|         PlayerControl.WorldNotify(0, 'AllStarLevelUp' if needStar else 'AllStarLevelUp2', [curPlayer.GetPlayerName(), suiteID, suiteCount, star])  | 
|           | 
|     RefreshPlayerEquipAttribute(curPlayer, classLV)  | 
|     #Ë¢ÐÂËùÓÐÊôÐÔ  | 
|     playControl = PlayerControl.PlayerControl(curPlayer)  | 
|     playControl.RefreshPlayerAttrState()  | 
|     return  | 
|   | 
| def Sync_EquipPartSuiteActivateInfo(curPlayer):  | 
|     ## Í¬²½×°±¸Î»ÐǼ¶Ì××°¼¤»î״̬ÐÅÏ¢  | 
|     keyCount = 10  | 
|     activateStateList = []  | 
|     for i in xrange(keyCount):  | 
|         activateStateList.append(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartSuiteActivate % i))  | 
|     if activateStateList.count(0) == keyCount:  | 
|         return  | 
|     activateInfo = ChPyNetSendPack.tagMCEquipPartSuiteActivateInfo()  | 
|     activateInfo.SuiteActivateStateInfo = activateStateList  | 
|     activateInfo.Count = len(activateInfo.SuiteActivateStateInfo)  | 
|     NetPackCommon.SendFakePack(curPlayer, activateInfo)  | 
|     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 µ±Ç°Íæ¼Ò  | 
| #  @param curEquip µ±Ç°×°±¸  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def CalcCurEquip_SkillBuff(curPlayer, curEquip):  | 
|     SkillShell.RefreshSkillBuffByEquip(curPlayer, curEquip)  | 
|     return  | 
|   | 
|   | 
| ## ¼ÆËã×°±¸ÏâǶ±¦Ê¯¸½¼ÓЧ¹û->»ù±¾ÊôÐÔ (±¦Ê¯)   | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param curEquip µ±Ç°×°±¸  | 
| #  @param allAttrList ÊôÐÔÐÅÏ¢   | 
| #  @return ÎÞ·µ»ØÖµ  | 
| def CalcEquipStone_Effect(curPlayer, equipIndex, allAttrList):  | 
|     gameData = GameWorld.GetGameData()  | 
|   | 
|     effIndexList = [1, 2, 3, 4]  # µÚÒ»¸öЧ¹ûÖµÊÇÀàÐ͵ȼ¶Ð§¹ûÖµ£¬·ÇÊôÐÔЧ¹ûÖµ  | 
|     gemLVList = []  | 
|     for holeIndex in Operate_EquipStone.GetAllEquipPlaceHoleIndex():  | 
|           | 
|         curGemID = Operate_EquipStone.GetEquipIndexStoneIDAndIsBand(curPlayer, equipIndex, holeIndex)[0]  | 
|         if curGemID == 0:  | 
|             continue  | 
|         curGem = gameData.GetItemByTypeID(curGemID)  | 
|         if not curGem:  | 
|             GameWorld.ErrLog('equip stone id:%s not in item table' % (curGemID))  | 
|             continue      | 
|         for effIndex in effIndexList:           | 
|             curGemEffect = curGem.GetEffectByIndex(effIndex)  | 
|             effectID, effectValue = curGemEffect.GetEffectID(), curGemEffect.GetEffectValue(0)  | 
|             if effectID and effectValue:  | 
|                 PlayerControl.CalcAttrDict_Type(effectID, effectValue, allAttrList)  | 
|         gemEffect = curGem.GetEffectByIndex(0)  | 
|         gemLV = gemEffect.GetEffectValue(1)  | 
|         gemLVList.append(gemLV)  | 
|     return gemLVList  | 
|   | 
| #---------------------------------------------------------------------  | 
| ## ×°±¸Ìí¼ÓBuff   | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param addSkillID ¼¼ÄÜID  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def EquipAddBuff(curPlayer, addSkillID, value=0):  | 
|   | 
|     curBuff = curPlayer.GetEquipBuff().AddBuff(addSkillID, 0, False)  | 
|     curBuff.SetOwnerID(curPlayer.GetID())  | 
|     curBuff.SetOwnerType(curPlayer.GetGameObjType())  | 
|     if value > 0:  | 
|         curBuff.SetValue(value)  | 
|     return  | 
|   | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # #//03 2F ÇëÇó×°±¸ÏÔÒþ#tagRequestEquipShowHide  | 
| # //×°±¸ÏÔʾ¿ª¹Ø  | 
| # int GetEquipShowSwitch(); Áé³èÍâ¹ÛË÷Òý*10000000+×øÆïÍâ¹ÛË÷Òý*1000000+Áé¸ùÌØÐ§±íkey * 1000+µÚ¼¸Ì×*10+ÊÇ·ñÓÐÌ××°  | 
| #===============================================================================  | 
| ##ÇëÇó×°±¸ÏÔÒþ. £¨ÉèÖÃÏÔʾÄÄÌ××°±¸Íâ¹Û£©  | 
| # @param index Íæ¼ÒË÷Òý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| # @remarks ¿Í»§¶Ë·â°üÏìÓ¦ //03 2F ÇëÇó×°±¸ÏÔÒþ#tagRequestEquipShowHide  | 
| def RequestEquipShowHide(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|       | 
|     #---¼ì²éˢмä¸ô--  | 
|     interval = ChConfig.TYPE_Player_Tick_Time[ChConfig.TYPE_Player_Tick_RequestEquipShowHide]  | 
|       | 
|     if tick - curPlayer.GetTickByType(ChConfig.TYPE_Player_Tick_RequestEquipShowHide) < interval:  | 
|         #ûÓе½Ë¢Ð¼ä¸ô£¬54Íâ¹Ò£¬²»¸øÌáʾ  | 
| #        GameWorld.ErrLog('ÇëÇó×°±¸ÏÔÒþ, Ã»Óе½Ë¢Ð¼ä¸ô')  | 
|         return  | 
|     curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_RequestEquipShowHide, tick)  | 
|     sendPack = IPY_GameWorld.IPY_CRequestEquipShowHide()  | 
|     classLV = sendPack.GetEquipShowSwitch()  | 
|     oldClassLV = GetEquipFacadeClassLV(curPlayer)  | 
|     if oldClassLV == classLV:  | 
|         return  | 
|     if not ChangeEquipfacadeByClassLV(curPlayer, classLV):  | 
|         return  | 
|       | 
|     #֪ͨÍâ¹Û×°±¸  | 
|     updFaceEquipIndex = 0  | 
|     equipIndexList = []  | 
|       | 
|     for equipPlace in [ShareDefine.retWeapon, ShareDefine.retWeapon2, ShareDefine.retClothes]:  | 
|         ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, equipPlace)  | 
|         if not ipyData:  | 
|             continue  | 
|         gridIndex = ipyData.GetGridIndex()  | 
|         updFaceEquipIndex = updFaceEquipIndex * 1000 + gridIndex  | 
|         equipIndexList.append(gridIndex)  | 
|   | 
|     PlayerControl.SetFaceEquipIndex(curPlayer, updFaceEquipIndex)  | 
|     equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)  | 
|     for equipPackIndex in equipIndexList:  | 
|         curEquip = equipPack.GetAt(equipPackIndex)  | 
|         if not ItemCommon.CheckItemCanUse(curEquip):  | 
|             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)  | 
|       | 
|     return  | 
|   | 
| def ChangeEquipfacadeByClassLV(curPlayer, classLV):  | 
|     ##±ä¸üµÚXÌ××°±¸Íâ¹Û Áé¸ùÌØÐ§±íkey * 1000+µÚ¼¸Ì×*10+ÊÇ·ñÓÐÌ××°  | 
|     oldEquipShowSwitch = curPlayer.GetEquipShowSwitch()  | 
|     realSuit=1  | 
|     equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)  | 
|     for place in ChConfig.EquipPlace_Base:  | 
|         ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, place)  | 
|         if not ipyData:  | 
|             realSuit = 0  | 
|             break  | 
|         gridIndex = ipyData.GetGridIndex()  | 
|         curEquip = equipPack.GetAt(gridIndex)  | 
|         if not ItemCommon.CheckItemCanUse(curEquip):  | 
|             realSuit = 0  | 
|             break  | 
|         if not curEquip.GetSuiteID():  | 
|             realSuit = 0  | 
|             break  | 
|     updEquipShowSwitch = oldEquipShowSwitch /1000*1000+ classLV*10+realSuit  | 
|     if oldEquipShowSwitch == updEquipShowSwitch:  | 
|         return  | 
|     curPlayer.SetEquipShowSwitch(updEquipShowSwitch)  | 
|     ChangeEquipEffectByPlusMaster(curPlayer, classLV)  | 
|     return True  | 
|   | 
| #!!! ÌØÐ§¸ù¾ÝÁé¸ùÆ·¼¶±ä»¯¸Ä³É¸ù¾ÝÇ¿»¯´óʦ±ä»¯  | 
| def ChangeEquipfacadeByLingGen(curPlayer):  | 
| #    ## Áé¸ùÆ·¼¶±ä»¯Ó°Ïì½ÇÉ«Íâ¹ÛÏÔʾ Áé¸ùÌØÐ§±íkey * 1000+µÚ¼¸Ì×*10+ÊÇ·ñÓÐÌ××°  | 
| #    pointValueInfo = [[ShareDefine.Def_Effect_Metal,PlayerControl.GetMetalQualityLV(curPlayer)],  | 
| #                          [ShareDefine.Def_Effect_Wood,PlayerControl.GetWoodQualityLV(curPlayer)],  | 
| #                          [ShareDefine.Def_Effect_Water,PlayerControl.GetWaterQualityLV(curPlayer)],  | 
| #                          [ShareDefine.Def_Effect_Fire,PlayerControl.GetFireQualityLV(curPlayer)],  | 
| #                          [ShareDefine.Def_Effect_Earth,PlayerControl.GetEarthQualityLV(curPlayer)],  | 
| #                          ]  | 
| #    g_skillElementCntDict = {} #Áé¸ù¶ÔӦʹÓÃר¾«¼¼ÄÜÊýÁ¿  | 
| #    skillManager = curPlayer.GetSkillManager()  | 
| #    gameData = GameWorld.GetGameData()  | 
| #    for i in xrange(skillManager.GetSkillCount()):  | 
| #        curSkill = skillManager.GetSkillByIndex(i)  | 
| #        skillID = curSkill.GetSkillTypeID()  | 
| #        curSelectSkillID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementID % skillID)  | 
| #        if not curSelectSkillID:  | 
| #            continue  | 
| #        elementSkillData = gameData.GetSkillBySkillID(curSelectSkillID)  | 
| #        if not elementSkillData:  | 
| #            continue  | 
| #        skillElementType = SkillShell.GetSkillElementType(elementSkillData)  | 
| #        g_skillElementCntDict[skillElementType] = g_skillElementCntDict.get(skillElementType, 0) + 1  | 
| #      | 
| #    showPointID, showQualityLV = 0, 0  | 
| #    for pointID, qualityLV in pointValueInfo:  | 
| #        if qualityLV > showQualityLV:  | 
| #            showQualityLV = qualityLV  | 
| #            showPointID = pointID  | 
| #        elif showQualityLV and qualityLV == showQualityLV:  | 
| #            #±È˵Äר¾«¼¼ÄÜÊýÁ¿¶à  | 
| #            if g_skillElementCntDict.get(pointID, 0) > g_skillElementCntDict.get(showPointID, 0):  | 
| #                showQualityLV = qualityLV  | 
| #                showPointID = pointID  | 
| #    effectID = 0  | 
| #    if showPointID:  | 
| #        ipyData = IpyGameDataPY.GetIpyGameData('LingGenEffect', showPointID, showQualityLV)  | 
| #        if not ipyData:  | 
| #            return  | 
| #        effectID = ipyData.GetID()  | 
| #    oldEquipShowSwitch = curPlayer.GetEquipShowSwitch()  | 
| #    updEquipShowSwitch = oldEquipShowSwitch % 1000 + oldEquipShowSwitch / 1000000 * 1000000+ 1000 * effectID  | 
| #    GameWorld.DebugLog('Áé¸ùÆ·¼¶±ä»¯Ó°Ïì½ÇÉ«Íâ¹ÛÏÔʾg_skillElementCntDict=%s,oldEquipShowSwitch=%s,updEquipShowSwitch=%s'%  | 
| #                       (g_skillElementCntDict, oldEquipShowSwitch, updEquipShowSwitch))  | 
| #    if oldEquipShowSwitch != updEquipShowSwitch:  | 
| #        curPlayer.SetEquipShowSwitch(updEquipShowSwitch)  | 
|     return  | 
| def ChangeEquipEffectByPlusMaster(curPlayer, classLV):  | 
|     # Ç¿»¯´óÊ¦ÌØÐ§  | 
|     if (classLV != GetEquipFacadeClassLV(curPlayer)):  | 
|         return  | 
|       | 
|     masterPlusLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartMasterPlusLV % classLV)  | 
|     ## Ç¿»¯´óʦӰÏì½ÇÉ«Íâ¹ÛÏÔʾ Ç¿»¯´óʦµÈ¼¶ * 1000+µÚ¼¸Ì×*10+ÊÇ·ñÓÐÌ××°  | 
|     oldEquipShowSwitch = curPlayer.GetEquipShowSwitch()  | 
|     updEquipShowSwitch = oldEquipShowSwitch % 1000 + oldEquipShowSwitch / 1000000 * 1000000+ 1000 * masterPlusLV  | 
|     GameWorld.DebugLog('Ç¿»¯´óʦӰ±ä»¯Ó°Ïì½ÇÉ«Íâ¹ÛÏÔʾ,oldEquipShowSwitch=%s,updEquipShowSwitch=%s'%  | 
|                        (oldEquipShowSwitch, updEquipShowSwitch))  | 
|     if oldEquipShowSwitch != updEquipShowSwitch:  | 
|         curPlayer.SetEquipShowSwitch(updEquipShowSwitch)  | 
|     return  | 
|   | 
|   | 
| def ChangeEquipfacadeByHorsePetSkin(curPlayer, skinType, skinIndex):  | 
|     ##Æï³è¾õÐÑÍâ¹Û±ä¸ü  Áé³èÍâ¹ÛË÷Òý*10000000+×øÆïÍâ¹ÛË÷Òý*1000000+Áé¸ùÌØÐ§±íkey * 1000+µÚ¼¸Ì×*10+ÊÇ·ñÓÐÌ××°  | 
|     oldEquipShowSwitch = curPlayer.GetEquipShowSwitch()  | 
|     if skinType == 1:  | 
|         updEquipShowSwitch = GameWorld.ChangeDataByDigitPlace(oldEquipShowSwitch, 7, skinIndex)  | 
|     else:  | 
|         updEquipShowSwitch = GameWorld.ChangeDataByDigitPlace(oldEquipShowSwitch, 8, skinIndex)  | 
|           | 
|     if oldEquipShowSwitch == updEquipShowSwitch:  | 
|         return  | 
|     curPlayer.SetEquipShowSwitch(updEquipShowSwitch)  | 
|     return  | 
|   | 
| def GetPlayerMaxEquipClassLV(curPlayer):  | 
|     ## »ñÈ¡Íæ¼Òµ±Ç°½âËøµÄ×°±¸½×  | 
|     key = "RealmEquipClassLVMap"  | 
|     RealmEquipClassLVMap = IpyGameDataPY.GetConfigEx(key)  | 
|     if not RealmEquipClassLVMap:  | 
|         RealmEquipClassLVMap = {}  | 
|         infoDict = {}  | 
|         ipyDataMgr = IpyGameDataPY.IPY_Data()  | 
|         for index in xrange(ipyDataMgr.GetEquipControlCount()):  | 
|             ipyData = ipyDataMgr.GetEquipControlByIndex(index)  | 
|             infoDict[ipyData.GetNeedRealmLV()] = ipyData.GetClassLV()  | 
|         needReamlLVList = infoDict.keys()  | 
|         needReamlLVList.sort() # ÉýÐòÅÅ  | 
|         for i, realmLV in enumerate(needReamlLVList):  | 
|             classLV = infoDict[realmLV]  | 
|             if i == len(needReamlLVList) - 1:  | 
|                 RealmEquipClassLVMap[realmLV] = classLV  | 
|             if i == 0:  | 
|                 continue  | 
|             else:  | 
|                 preRealmLV = needReamlLVList[i - 1]  | 
|                 preClassLV = infoDict[preRealmLV]  | 
|                 for pRealmLV in range(preRealmLV, realmLV):  | 
|                     RealmEquipClassLVMap[pRealmLV] = preClassLV  | 
|         GameWorld.DebugLog("¼ÓÔØ¾³½ç¶ÔÓ¦¿ª·Å×î´ó×°±¸½×ÉèÖÃ: %s" % RealmEquipClassLVMap)  | 
|         IpyGameDataPY.SetConfigEx(key, RealmEquipClassLVMap)  | 
|           | 
|     playerRealmLV = curPlayer.GetOfficialRank()  | 
|     if playerRealmLV in RealmEquipClassLVMap:  | 
|         return RealmEquipClassLVMap[playerRealmLV]  | 
|       | 
|     maxRealmLV = max(RealmEquipClassLVMap)  | 
|     if playerRealmLV >= maxRealmLV:  | 
|         return RealmEquipClassLVMap[maxRealmLV]  | 
|       | 
|     return 0  | 
|   | 
| #»ñÈ¡µ±Ç°Êǵڼ¸Ì××°±¸Íâ¹Û  | 
| def GetEquipFacadeClassLV(curPlayer):return curPlayer.GetEquipShowSwitch()%1000/10  | 
|   | 
| ## »ñÈ¡¹«¹²²¿Î»Ç¿»¯ÊìÁ·¶È  | 
| def GetEquipPartProficiency(curPlayer, packType, index):  | 
|     return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartProficiency % (packType, index))  | 
|   | 
| ## ÉèÖù«¹²²¿Î»Ç¿»¯ÊìÁ·¶È  | 
| def SetEquipPartProficiency(curPlayer, packType, index, value):  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartProficiency % (packType, index), value)  | 
|     return  | 
|   | 
| ## »ñÈ¡¹«¹²²¿Î»Ç¿»¯µÈ¼¶  | 
| def GetEquipPartPlusLV(curPlayer, packType, index):  | 
|     return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartPlusLV % (packType, index))  | 
|   | 
| ## ÉèÖù«¹²²¿Î»Ç¿»¯µÈ¼¶  | 
| def SetEquipPartPlusLV(curPlayer, packType, index, curEquip, setPlusLV):  | 
|     befPlusLV = GetEquipPartPlusLV(curPlayer, packType, index)  | 
|     if befPlusLV == setPlusLV:  | 
|         return  | 
|       | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartPlusLV % (packType, index), setPlusLV)  | 
|     #===========================================================================  | 
|     # if curEquip and not curEquip.IsEmpty():  | 
|     #    curEquip.SetItemStarLV(starLV)  | 
|     #===========================================================================  | 
|       | 
|     # Í¬²½¸üÐÂÇ¿»¯×ܵȼ¶  | 
|     befTotalPlusLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalPlusLV)  | 
|     updTotalPlusLV = max(0, befTotalPlusLV + setPlusLV - befPlusLV)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalPlusLV, updTotalPlusLV)  | 
|     GameWorld.DebugLog("ÉèÖÃÇ¿»¯µÈ¼¶: index=%s,befPlusLV=%s,setPlusLV=%s,befTotalPlusLV=%s,updTotalPlusLV=%s"   | 
|                        % (index, befPlusLV, setPlusLV, befTotalPlusLV, updTotalPlusLV))  | 
|     return  | 
|   | 
| ## »ñÈ¡¹«¹²²¿Î»Ç¿»¯½ø»¯µÈ¼¶  | 
| def GetEquipPartPlusEvolveLV(curPlayer, packType, index):  | 
|     return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartPlusEvolveLV % (packType, index))  | 
|   | 
|   | 
| ## ÉèÖù«¹²²¿Î»Ç¿»¯½ø»¯µÈ¼¶  | 
| def SetEquipPartPlusEvolveLV(curPlayer, packType, index, setEvolveLV):  | 
|     befEvolveLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartPlusEvolveLV % (packType, index))  | 
|     if befEvolveLV == setEvolveLV:  | 
|         return  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartPlusEvolveLV % (packType, index), setEvolveLV)  | 
|       | 
|     # Í¬²½¸üнø»¯×ܵȼ¶  | 
|     befTotalPlusEvolveLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalPlusEvolveLV)  | 
|     updTotalPlusEvolveLV = max(0, befTotalPlusEvolveLV + setEvolveLV - befEvolveLV)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalPlusEvolveLV, updTotalPlusEvolveLV)  | 
|     GameWorld.DebugLog("ÉèÖýø»¯µÈ¼¶: index=%s,befEvolveLV=%s,setEvolveLV=%s,befTotalPlusEvolveLV=%s,updTotalPlusEvolveLV=%s"   | 
|                        % (index, befEvolveLV, setEvolveLV, befTotalPlusEvolveLV, updTotalPlusEvolveLV))  | 
|     return  | 
|   | 
| ## Í¨Öª¹«¹²²¿Î»Ç¿»¯µÈ¼¶  | 
| def NotifyEquipPartPlusLV(curPlayer, packType=IPY_GameWorld.rptEquip, index=None):  | 
|     ePartStarLVPack = ChPyNetSendPack.tagMCEquipPartPlusInfo()  | 
|     ePartStarLVPack.Clear()  | 
|     ePartStarLVPack.InfoList = []  | 
|       | 
|     syncIndexList = []  | 
|     if index == None:  | 
|         equipMaxClasslv = IpyGameDataPY.GetFuncCfg('EquipMaxClasslv')  | 
|         for equipPlace in ChConfig.Pack_EquipPart_CanPlusStar.get(packType, []):  | 
|             for classlv in xrange(1, equipMaxClasslv+1):  | 
|                 ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classlv, equipPlace)  | 
|                 if not ipyData:  | 
|                     continue   | 
|                 syncIndexList.append(ipyData.GetGridIndex())  | 
|     else:  | 
|         syncIndexList = [index]  | 
|           | 
|     for i in syncIndexList:  | 
|         ePartStarLV = ChPyNetSendPack.tagMCEquipPartPlusLV()  | 
|         ePartStarLV.Clear()  | 
|         ePartStarLV.PackType = packType  | 
|         ePartStarLV.EquipIndex = i  | 
|         ePartStarLV.EquipPartStarLV = GetEquipPartPlusLV(curPlayer, packType, i)  | 
|         ePartStarLV.Proficiency = GetEquipPartProficiency(curPlayer, packType, i)  | 
|         ePartStarLV.EvolveLV = GetEquipPartPlusEvolveLV(curPlayer, packType, i)  | 
|         ePartStarLVPack.InfoList.append(ePartStarLV)  | 
|               | 
|     ePartStarLVPack.Count = len(ePartStarLVPack.InfoList)  | 
|     NetPackCommon.SendFakePack(curPlayer, ePartStarLVPack)  | 
|     return  | 
|   | 
|   | 
| ## È«ÉíÇ¿»¯µÈ¼¶  | 
| def GetTotalPlusLV(curPlayer, isActive=True):  | 
|     return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalPlusLV)  | 
|   | 
| ## È«Éí½ø»¯µÈ¼¶  | 
| def GetTotalPlusEvolveLV(curPlayer):  | 
|     return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalPlusEvolveLV)  | 
|   | 
| ## È«Éí³È×°¼°ÒÔÉÏ×°±¸Êý  | 
| def GetEquipOrangeCount(curPlayer):  | 
|     return curPlayer.NomalDictGetProperty(ChConfig.Def_PlayerKey_EquipOrangeCount)  | 
|   | 
|   | 
| # »ñȡװ±¸µÄÇ¿»¯ÀàÐÍ  | 
| def GetEquipPlusType(curEquip):  | 
|     equipPlace = curEquip.GetEquipPlace()  | 
|     plusTypeDict = IpyGameDataPY.GetFuncEvalCfg("StrengthenLevelLimit", 1)  | 
|     if not plusTypeDict:  | 
|         GameWorld.ErrLog("ûÓÐÇ¿»¯ÀàÐÍÓ³Éä±í")  | 
|         return  | 
|       | 
|     return plusTypeDict.get(equipPlace)  | 
|   | 
|   | 
| #  »ñÈ¡ÂúÌ××°»¯µÄ×îµÍ½×Êý£¬Èç5¼þÌ×£¬4¼þ5¼¶£¬1¼þ3¼¶£¬Ôò·µ»Ø3  | 
| def GetEquipSuitsLVByType(curPlayer, suitType, groupType):  | 
|     return 0  | 
| #    suiteLV = 999  | 
| #    equipSuitTypeDict = IpyGameDataPY.GetFuncEvalCfg('EquipSuitType')  | 
| #    if groupType not in equipSuitTypeDict:  | 
| #        return 0  | 
| #    maxCnt = len(equipSuitTypeDict[groupType])  | 
| #    cnt = 0  | 
| #    for equipPlace in equipSuitTypeDict[groupType]:  | 
| #        curSuiteLV = GetEquipPartSuiteLV(curPlayer, equipPlace, suitType)  | 
| #        if curSuiteLV > 0:  | 
| #            cnt += 1  | 
| #        suiteLV = min(curSuiteLV, suiteLV)  | 
| #          | 
| #    if cnt != maxCnt:  | 
| #        return 0  | 
| #    return 0 if suiteLV == 999 else suiteLV  | 
|   | 
|   | 
|   | 
| def SetEquipPartStar(curPlayer, index, setStarLV):  | 
|     #ÉèÖù«¹²²¿Î»ÐÇÊý  | 
|       | 
|     befStarLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartStar % index)  | 
|     if befStarLV == setStarLV:  | 
|         return      | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartStar % index, setStarLV)  | 
|       | 
|     # Í¬²½¸üÐÂÐǼ¶×ܵȼ¶  | 
|     befTotalStarLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalEquipStar)  | 
|     updTotalStarLV = max(0, befTotalStarLV + setStarLV - befStarLV)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalEquipStar, updTotalStarLV)  | 
|     # ¿ª·þ»î¶¯Êý¾Ý  | 
|     OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_StarLV, updTotalStarLV)  | 
|     GameWorld.DebugLog("ÉèÖò¿Î»ÐǼ¶: index=%s,befStarLV=%s,setStarLV=%s,befTotalStarLV=%s,updTotalStarLV=%s"   | 
|                        % (index, befStarLV, setStarLV, befTotalStarLV, updTotalStarLV))  | 
|     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 GetTotalEquipStars(curPlayer):  | 
|     ##»ñÈ¡²¿Î»×ÜÐÇÊý  | 
|     return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalEquipStar)  | 
|   | 
| ## Í¨Öª¹«¹²²¿Î»ÐÇÊý  | 
| 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(1, equipMaxClasslv+1):  | 
|                 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  | 
|   |