| #!/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 ReadChConfig  | 
| import OperControlManager  | 
| import Operate_EquipWash  | 
| import ShareDefine  | 
| import PyMapTable  | 
| import ChPyNetSendPack  | 
| import NetPackCommon  | 
| import EventShell  | 
| import IpyGameDataPY  | 
| import PlayerWing  | 
| import Operate_EquipStone  | 
| import PassiveBuffEffMng  | 
| import SkillCommon  | 
| import PlayerMagicWeapon  | 
| import time  | 
| import json  | 
| import FormulaControl  | 
| #---------------------------------------------------------------------  | 
|   | 
|   | 
| ##¼ì²éÍæ¼ÒÊÇ·ñ¿ÉÒÔ»»×°  | 
| # @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 ChConfig.Type_Equip_CanTake:  | 
|     #    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()  | 
|     itemQuality = curItem.GetItemQuality()  | 
|     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 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 == ShareDefine.retWing:  | 
|         PlayerWing.CalcWingAttr(curPlayer)  | 
|     else:  | 
|         RefreshPlayerEquipAttribute(curPlayer, itemClassLV)  | 
|       | 
|     #Ë¢ÐÂËùÓÐÊôÐÔ  | 
|     playControl = PlayerControl.PlayerControl(curPlayer)  | 
|     playControl.RefreshPlayerAttrState()  | 
|     return True  | 
|   | 
|   | 
|       | 
| ## Ë¢ÐÂ×°±¸¶ÔÈËÎïÊôÐÔµÄ¸Ä±ä  | 
| #  @param self ÀàʵÀý  | 
| #  @return ·µ»ØÖµÎÞÒâÒå  | 
| #  @remarks Ë¢ÐÂ×°±¸¶ÔÈËÎïÊôÐÔµÄ¸Ä±ä  | 
| 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)  | 
|   | 
|     #if isRefreshEquipBuff:  | 
|     #    __RefreshPlayerAllEquipBuff(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 ChConfig.Type_Equip_CanTake :  | 
| #                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]  | 
|       | 
|     ##ÌØÊâ×°±¸ , ²»ÐèÒª³åË¢ÊôÐÔ  | 
|     if equipPlace in ChConfig.EquipItemNoRefreshState:  | 
|         curPlayer.Sync_UnEquipItem(equipID, equipPackIndex)  | 
|         return  | 
|       | 
|     #ÏÈË¢×°±¸BUFF ÔÙ¼ÆËãÊôÐÔ  | 
|     if equipPlace == ShareDefine.retWing:  | 
|         PlayerWing.CalcWingAttr(curPlayer)  | 
|     else:  | 
|         RefreshPlayerEquipAttribute(curPlayer)  | 
|       | 
|     #Ë¢ÐÂËùÓÐÊôÐÔ  | 
|     playControl = PlayerControl.PlayerControl(curPlayer)  | 
|     playControl.RefreshPlayerAttrState()  | 
|       | 
|     if equipPackIndex in PlayerControl.GetFaceEquipIndexList(curPlayer) or equipPlace in ChConfig.Def_SyncEquipStateByIndex:  | 
|         curPlayer.Sync_UnEquipItem(equipID, equipPackIndex)  | 
|     return  | 
|   | 
|   | 
| #---------------------------------------------------------------------  | 
| ## Íæ¼ÒʹÓÃ×°±¸(ÔÚ×°±¸À¸ÉϵÄÌØÊâÎïÆ·:Èçµ°°×)(·â°ü²ÎÊý)  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def __Func_PlayerUseEquipSelf(index, tick):  | 
|     sendPack = IPY_GameWorld.IPY_CUseEquip()  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|       | 
|     #ʹÓÃÎïÆ·ÐÐΪ״̬, ÅжϿͻ§¶ËÏÞÖÆ  | 
|     if not OperControlManager.IsObjCanDoAction(  | 
|                                         curPlayer,  | 
|                                         ChConfig.Def_Obj_ActState_ClientAct,  | 
|                                         IPY_GameWorld.oalUseItem  | 
|                                         ):  | 
|         return  | 
|       | 
|     #¼ì²éʹÓÃÎïÆ·µÄÍæ¼ÒÊôÐÔ  | 
|     if not ChItem.CheckUseItemSelf_Player(curPlayer):  | 
|         return  | 
|       | 
|     roleEquipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)  | 
|     #»ñµÃËùҪʹÓõÄ×°±¸  | 
|     equipIndex = sendPack.GetEquipIndex()  | 
|     curEquip = roleEquipPack.GetAt(equipIndex)  | 
|       | 
|     if not ItemCommon.CheckItemCanUse(curEquip):  | 
|         return  | 
|       | 
|     #FB½ûֹʹÓÃÎïÆ·  | 
|     if FBLogic.DoFBForbidUseItem(curPlayer, curEquip):  | 
|         return  | 
|       | 
|     if ItemControler.IsEventItem(curEquip):  | 
|         PlayerControl.NotifyCode(curPlayer, "TaskRes")  | 
|         return  | 
|       | 
|     else:  | 
|         PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_774045")  | 
|         return  | 
|       | 
|     return  | 
|   | 
|   | 
| ## ¼ÆËã×°±¸¶Ô»ù±¾ÊôÐÔµÄ¸Ä±ä   | 
| #  @param classlv  | 
| #  @return None  | 
| def __CalcEquips_Effect(curPlayer, classlv):  | 
| #    baseEquipAttrDict = {}  | 
| #    baseEquipAttr_Weapon = [{} for _ in range(4)]  # ÎäÆ÷»ù´¡, ÎïÆ·±í×°±¸»ù´¡Ð§¹ûÊôÐÔ  | 
| #    baseEquipAttr_Armor = [{} for _ in range(4)]  # ·À¾ß»ù´¡, ÎïÆ·±í×°±¸»ù´¡Ð§¹ûÊôÐÔ  | 
| #    baseEquipAttr_Relics = [{} 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  #Ϊ½â¾ö×°±¸ÆÀ·Ö¡¢Õ½Á¦²»Ò»ÖµÄÇé¿ö£¬×°±¸Õ½Á¦¸ÄΪÓÉÆÀ·Ö×÷Ϊ²ÎÊý¼ÆËãÕ½Á¦  | 
|       | 
|     #Íæ¼Òµ±Ç°¿É×°±¸µÄ×°±¸ÀàÐÍ  | 
|     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)  | 
|           | 
|         #»ù´¡ÊôÐÔЧ¹û  | 
|         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  | 
|               | 
|           | 
|         #ÐÇÊýÊôÐÔ  | 
|         equipPartStar = GetEquipPartStarByRank(curPlayer, equipIndex, curEquip) #ÉúЧµÄÐÇÊý  | 
|         CalcEquipStarAttr(curPlayer, classlv, equipPlace, equipPartStar, allAttrListStar)  | 
|         #¼ÆËã×°±¸±¦Ê¯¼Ó³É  | 
|         CalcEquipStone_Effect(curPlayer, equipIndex, allAttrListStone)  | 
|         #Ì××°¼ÆÊý  | 
|         suiteID = curEquip.GetSuiteID()  | 
|         if suiteID:  | 
|             if suiteID not in suitCntDict:  | 
|                 suitCntDict[suiteID] = []  | 
|             suitCntDict[suiteID].append(equipPartStar)  | 
|           | 
|         #ÎïÆ·Ç¿»¯ÊôÐÔ  | 
|         equipPartPlusLV = GetEquipPartPlusLVByRank(curPlayer, packType, equipIndex, curEquip)  | 
|         equipPartPlusEvolveLV = GetEquipPartPlusEvolveLVByEquip(curPlayer, packType, equipIndex, curEquip)  | 
|         CalcAttr_ItemPlus(curPlayer, curEquip, allAttrListPlusBase, equipPartPlusLV, equipPartPlusEvolveLV)  | 
|           | 
|         #´«ÆæÊôÐÔ  | 
|         #CalcAttr_LegendAttr(curPlayer, curEquip, allAttrListEquip, legendAttrDict)  | 
|         #¾øÊÀÊôÐÔ  | 
|         #CalcAttr_OutOfPrintAttr(curPlayer, curEquip, allAttrListOutOfPrintEquip)  | 
|         #Ï´Á·ÊôÐÔ  | 
|         Operate_EquipWash.CalcAttr_EquipWash(curPlayer, equipIndex, equipPlace, allAttrListWash)  | 
|       | 
|   | 
|     #Ì××°ÊôÐÔ  | 
|     CalcEquipSuiteAttr(curPlayer, suitCntDict, allAttrListSuit)  | 
|     #GameWorld.DebugLog("ËùÓд«ÆæÊôÐÔ: %s" % legendAttrDict)  | 
|     #±£´æ¼ÆËãÖµ  | 
|     #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))  | 
|     #GameWorld.DebugLog("×°±¸ÆÀ·ÖÕ½Á¦: equipScoreTotal=%s,equipFightPowerEx=%s" % (equipScoreTotal, equipFightPowerEx))  | 
|     curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_Equip, equipFightPowerEx)  | 
|     return  | 
|   | 
|   | 
| def CalcAttr_LegendAttr(curPlayer, curEquip, allAttrListEquip, legendAttrDict={}):  | 
|     ## ¼ÆËã´«ÆæÊôÐÔ  | 
|       | 
|     # ´«ÆæÊôÐÔIDÁÐ±í  | 
|     legendAttrIDList = [curEquip.GetUserAttrByIndex(ShareDefine.Def_IudetLegendAttrID, i) \  | 
|                         for i in range(curEquip.GetUserAttrCount(ShareDefine.Def_IudetLegendAttrID))]  | 
|     # ´«ÆæÊôÐÔÖµÁÐ±í  | 
|     legendAttrValueList = [curEquip.GetUserAttrByIndex(ShareDefine.Def_IudetLegendAttrValue, i) \  | 
|                            for i in range(curEquip.GetUserAttrCount(ShareDefine.Def_IudetLegendAttrValue))]  | 
|     if not legendAttrIDList or len(legendAttrIDList) != len(legendAttrValueList):  | 
|         #GameWorld.DebugLog("ûÓд«ÆæÊôÐÔ£¡")  | 
|         return  | 
|     #GameWorld.DebugLog("´«ÆæÊôÐÔ: place=%s,IDList=%s, v=%s" % (curEquip.GetEquipPlace(), legendAttrIDList, legendAttrValueList))  | 
|       | 
|     for i, attrID in enumerate(legendAttrIDList):  | 
|         value = legendAttrValueList[i]  | 
|         #GameWorld.DebugLog("¼Ó´«ÆæÊôÐÔ: %s +%s" % (attrID, value))  | 
|         PlayerControl.CalcAttrDict_Type(attrID, value, allAttrListEquip)  | 
|         #legendAttrDict[attrID] = legendAttrDict.get(attrID, 0) + value  | 
|           | 
|     return  | 
|   | 
|   | 
| # ×°±¸¾ø°æÊôÐÔ£¬ËæµÈ¼¶±ä»¯ÐèÔÚÉý¼¶ÔÙ´¦Àí  | 
| def CalcAttr_OutOfPrintAttr(curPlayer, curEquip, allAttrListOutOfPrintEquip):  | 
|     ## ¼ÆËã¾ø°æÊôÐÔ  | 
|       | 
|     # ¾ø°æÊôÐÔIDÁÐ±í  | 
|     OutOfPrintAttrIDList = [curEquip.GetUserAttrByIndex(ShareDefine.Def_IudetOutOfPrintAttrID, i) \  | 
|                         for i in range(curEquip.GetUserAttrCount(ShareDefine.Def_IudetOutOfPrintAttrID))]  | 
|     # ¾ø°æÊôÐÔÖµÁÐ±í  | 
|     OutOfPrintAttrValueList = [curEquip.GetUserAttrByIndex(ShareDefine.Def_IudetOutOfPrintAttrValue, i) \  | 
|                            for i in range(curEquip.GetUserAttrCount(ShareDefine.Def_IudetOutOfPrintAttrValue))]  | 
|     if not OutOfPrintAttrIDList or len(OutOfPrintAttrIDList) != len(OutOfPrintAttrValueList):  | 
|         return  | 
|       | 
|     lv = curPlayer.GetLV()  | 
|     OutOfPrintAttrFormatDict = IpyGameDataPY.GetFuncEvalCfg("OutOfPrintValue", 2, {})  | 
|     for i, attrID in enumerate(OutOfPrintAttrIDList):  | 
|         if str(attrID) not in OutOfPrintAttrFormatDict:  | 
|             continue  | 
|         attrFormat = OutOfPrintAttrFormatDict[str(attrID)]  | 
|         maxOOPValue = OutOfPrintAttrValueList[i]  | 
|         value = eval(FormulaControl.GetCompileFormula("OutOfPrintAttrFormat_%s" % attrID, attrFormat))  | 
|         GameWorld.DebugLog("¼Ó¾ø°æÊôÐÔ: %s +%s" % (attrID, value))  | 
|         PlayerControl.CalcAttrDict_Type(attrID, value, allAttrListOutOfPrintEquip)  | 
|           | 
|     return  | 
|   | 
|   | 
| ## ¼ÆËã×°±¸¶Ô»ù±¾ÊôÐÔµÄ¸Ä±ä   | 
| #  @return None  | 
| def CalcEquips_OutOfPrint(curPlayer):  | 
|     allAttrListOutOfPrintEquip = [{} for _ in range(4)]  # ¾ø°æ×°±¸ÊôÐÔ ÐèÔڵȼ¶±ä»¯¶ÀÁ¢¼ÆËã  | 
|       | 
|     packType = IPY_GameWorld.rptEquip  | 
|     playerEquip = curPlayer.GetItemManager().GetPack(packType)  | 
|   | 
|     #Íæ¼Òµ±Ç°¿É×°±¸µÄ×°±¸ÀàÐÍ  | 
|     for equipIndex in xrange(playerEquip.GetCount()):  | 
|         if equipIndex not in ShareDefine.RoleEquipType :  | 
|             continue  | 
|           | 
|         # ³á°òÊôÐÔÔÚ³á°ò¹¦Äܵ¥¶ÀˢР | 
|         if equipIndex == ShareDefine.retWing:  | 
|             continue  | 
|           | 
|         curEquip = playerEquip.GetAt(equipIndex)  | 
|         if curEquip.IsEmpty():  | 
|             continue  | 
|               | 
|         if not ItemCommon.CheckItemCanUseByExpireTime(curEquip):  | 
|             # ¹ýÆÚ  | 
|             continue  | 
|             | 
|         #¾øÊÀÊôÐÔ  | 
|         CalcAttr_OutOfPrintAttr(curPlayer, curEquip, allAttrListOutOfPrintEquip)  | 
|   | 
|     #±£´æ¼ÆËãÖµ  | 
|     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_EquipOutOfPrint, allAttrListOutOfPrintEquip)  | 
|     return  | 
|   | 
|   | 
| ## ¼ÆËã×°±¸Ç¿»¯ºóµÄÊôÐÔ  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param curPlayer allAttrList ÊôÐÔ»º´æ  | 
| #  @return None  | 
| def CalcAttr_ItemPlus(curPlayer, curEquip, allAttrList, equipPartStarLV, equipPartPlusEvolveLV):  | 
|     if not equipPartStarLV:  | 
|         return  | 
|     plusType = GetEquipPlusType(curEquip)  | 
|     if plusType is None:  | 
|         return  | 
|       | 
|     ipyData = IpyGameDataPY.GetIpyGameData("ItemPlus", plusType, equipPartStarLV)  | 
|     if not ipyData:  | 
|         return  | 
|     attrTypeList, attrValueList = ipyData.GetAttrType(), ipyData.GetAttrValue()  | 
|     for i, attrID in enumerate(attrTypeList):  | 
|         PlayerControl.CalcAttrDict_Type(attrID, attrValueList[i], allAttrList)  | 
|       | 
|     #½ø»¯ÊôÐÔ  | 
|     equipPlace = curEquip.GetEquipPlace()  | 
|     ipyData = IpyGameDataPY.GetIpyGameData('EquipPlusEvolve', equipPlace, equipPartPlusEvolveLV)  | 
|     if not ipyData:  | 
|         return  | 
|     for attrID, attrValue in ipyData.GetAttr().items():  | 
|         PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)  | 
|     return  | 
|   | 
|   | 
| ## Ìí¼ÓÈ«Éí×°±¸Æ·ÖʶÔÓ¦BUFF  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @return None  | 
| def AddEquipsQualityBuff(curPlayer, qualityEquipCnt, suiteEquipCnt):  | 
|     suiteCntRecord = 0  | 
|     notifySuiteCnt = 0  | 
|     notifyType = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AttrActivatyNotify)  | 
|     isAll, addAttrList = ReadChConfig.GetEvalChConfig('EquipQualityAddAttr')  | 
|     for confInfo in addAttrList:  | 
|         confQuality = confInfo[1]  # ÅäÖÃÆ·Öʱêʶ 1-׿Խ£¬2-Ì××°  | 
|         cnt = 0   | 
|         if confQuality == 1:  | 
|             cnt = qualityEquipCnt  | 
|         elif confQuality == 2:  | 
|             cnt = suiteEquipCnt  | 
|           | 
|         confCnt = confInfo[0]  | 
|         if cnt >= confCnt:  # Èç¹û¼þÊýÂú×ã  | 
|             EquipAddBuff(curPlayer, confInfo[2])  | 
|               | 
|             if confQuality == 2 and confCnt > notifySuiteCnt and notifyType == \  | 
|                                             ChConfig.Def_AttrActivatyNotify_Equip:  | 
|                 notifySuiteCnt = confCnt  | 
|                   | 
|             if confQuality == 2 and confCnt > suiteCntRecord:  | 
|                 suiteCntRecord = confCnt  | 
|                   | 
|             if not isAll:  | 
|                 break  | 
|               | 
|     lastSuiteCntRecord = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AttrActivatyRecordSuiteCnt)   | 
|     if notifySuiteCnt > 0 and notifySuiteCnt > lastSuiteCntRecord:  | 
|         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 µ±Ç°Íæ¼Ò  | 
| #  @return None  | 
| def CalcAllEquipAllPlusLVAttr(curPlayer):  | 
|     totalLV = GetTotalPlusLV(curPlayer, False)  | 
|     activeLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipActiveStarLV)  | 
|     totalLV = min(totalLV, activeLV)  | 
|     ipyData = IpyGameDataPY.InterpolationSearch("ItemPlusSumAttr", "PlusCntNeed", totalLV)  | 
|     if not ipyData:  | 
|         return {}  | 
|       | 
|     attrTypeList = ipyData.GetAttrType()  | 
|     attrValueList = ipyData.GetAttrValue()  | 
|     #allAttrList = [{} for i in range(4)]  | 
|     attrDict = {}  | 
|     for i, attrID in enumerate(attrTypeList):  | 
|         value = attrValueList[i]  | 
|         attrDict[attrID] = attrDict.get(attrID, 0) + value  | 
|         #PlayerControl.CalcAttrDict_Type(attrID, value, allAttrList)  | 
|           | 
|     #PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PlusEx, allAttrList)  | 
|       | 
|     return attrDict  | 
|   | 
|   | 
| ## ×°±¸Ì××°ÊôÐÔ¼ÆËã  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @return None  | 
| def CalcEquipSuiteAttr(curPlayer, suitCntDict, allAttrListSuit):  | 
|     if not suitCntDict:  | 
|         return  | 
|     GameWorld.DebugLog('    suitCntDict=%s'%suitCntDict)  | 
|     learnSkillList = []  | 
|     delSkillID = []  | 
|     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()  | 
|             if [1 if star >= needStar else 0 for star in starList].count(1) >= suiteCnt:  | 
|                 for attrID, attrValue in ipyData.GetAttrInfo().items():  | 
|                     PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListSuit)  | 
|                 #¼¼ÄÜ  | 
|                 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', [playerName, suiteID, suiteCnt, needStar])  | 
|                     GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_EquipPartSuiteNotify, notifyMark, 1)  | 
|   | 
|             else:  | 
|                 if skillID and skillManager.FindSkillBySkillTypeID(skillID):  | 
|                     delSkillID.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)  | 
|     if learnSkillList or delSkillID:  | 
|         # ÖØË¢±»¶¯¼¼ÄÜ  | 
|         PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(curPlayer)      | 
|     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  | 
|   | 
| def CalcEquipStarAttr(curPlayer, classlv, equipPlace, equipPartStar, allAttrListStar):  | 
|     ## ¼ÆËã×°±¸ÐÇÊýÊôÐÔ  | 
|     if not equipPartStar:  | 
|         return  | 
|     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 µ±Ç°Íæ¼Ò  | 
| #  @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(); µÚ¼¸Ì×*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  | 
|       | 
|     sendPack = IPY_GameWorld.IPY_CRequestEquipShowHide()  | 
|     updEquipShowSwitch = sendPack.GetEquipShowSwitch()  | 
|     oldEquipShowSwitch = curPlayer.GetEquipShowSwitch()  | 
|     if updEquipShowSwitch == oldEquipShowSwitch:  | 
|         return  | 
|     classLV, isSuite = updEquipShowSwitch/10, updEquipShowSwitch%10  | 
|     equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)  | 
|     #ÑéÖ¤Ì××°  | 
|     realSuit=True  | 
|     for place in ChConfig.Def_SuitEquipPlaceList:  | 
|         ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, place)  | 
|         if not ipyData:  | 
|             realSuit = False  | 
|             break  | 
|         gridIndex = ipyData.GetGridIndex()  | 
|         curEquip = equipPack.GetAt(gridIndex)  | 
|         if not ItemCommon.CheckItemCanUse(curEquip):  | 
|             realSuit = False  | 
|             break  | 
|         if not curEquip.GetSuiteID():  | 
|             realSuit = False  | 
|             break  | 
|     if realSuit != isSuite:  | 
|         GameWorld.DebugLog('SetEquipShowSwitch Ç°¶Ë·¢µÄisSuite ºÍʵ¼Ê²»Ò»Ö£¡')  | 
|         return  | 
|       | 
|     #֪ͨÍâ¹Û×°±¸  | 
|     updFaceEquipIndex = 0  | 
|     equipIndexList = []  | 
|       | 
|     for equipPlace in [ShareDefine.retWeapon, ShareDefine.retWeapon2, ShareDefine.retClothes]:  | 
|         ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, equipPlace)  | 
|         if not ipyData:  | 
|             continue  | 
|         gridIndex = ipyData.GetGridIndex()  | 
|         updFaceEquipIndex = updFaceEquipIndex * 1000 + gridIndex  | 
|         equipIndexList.append(gridIndex)  | 
|     PlayerControl.SetFaceEquipIndex(curPlayer, updFaceEquipIndex)  | 
|       | 
|     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):  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartProficiency % (packType, index), value)  | 
|   | 
|   | 
| ## »ñÈ¡¹«¹²²¿Î»Ç¿»¯ÐǼ¶, Òò×°±¸µÄ×î¸ß¿ÉÇ¿»¯ÐǼ¶Ó°Ï죬ÓÃÓÚË㵱ǰװ±¸ÊôÐÔʹÓ㬠²»Ó°ÏìÈ«ÉíÐǼ¶  | 
| def GetEquipPartPlusLVByRank(curPlayer, packType, index, curEquip):  | 
|     maxStarLV = ItemCommon.GetItemMaxPlusLV(curPlayer, index, curEquip)  | 
|     return min(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartPlusLV % (packType, index)), maxStarLV)  | 
|   | 
|   | 
| ## »ñÈ¡¹«¹²²¿Î»Ç¿»¯ÐǼ¶  | 
| def GetEquipPartPlusLV(curPlayer, packType, index):  | 
|     return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartPlusLV % (packType, index))  | 
|   | 
|   | 
| ## ÉèÖù«¹²²¿Î»Ç¿»¯ÐǼ¶  | 
| def SetEquipPartPlusLV(curPlayer, packType, index, curEquip, starLV):  | 
|     if GetEquipPartPlusLV(curPlayer, packType, index) == starLV:  | 
|         return  | 
|       | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartPlusLV % (packType, index), starLV)  | 
|     #===========================================================================  | 
|     # if curEquip and not curEquip.IsEmpty():  | 
|     #    curEquip.SetItemStarLV(starLV)  | 
|     #===========================================================================  | 
|   | 
|     return  | 
|   | 
|   | 
| ## »ñÈ¡¹«¹²²¿Î»Ç¿»¯½ø»¯µÈ¼¶, ÓÃÓÚË㵱ǰװ±¸ÊôÐÔʹÓ㬠²»Ó°ÏìÈ«ÉíÐǼ¶  | 
| def GetEquipPartPlusEvolveLVByEquip(curPlayer, packType, index, curEquip):  | 
|     maxEvolveLV = ItemCommon.GetItemMaxPlusEvolveLV(curPlayer, index, curEquip)  | 
|     return min(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartPlusEvolveLV % (packType, index)), maxEvolveLV)  | 
|   | 
|   | 
| ## »ñÈ¡¹«¹²²¿Î»Ç¿»¯½ø»¯µÈ¼¶  | 
| def GetEquipPartPlusEvolveLV(curPlayer, packType, index):  | 
|     return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartPlusEvolveLV % (packType, index))  | 
|   | 
|   | 
| ## ÉèÖù«¹²²¿Î»Ç¿»¯½ø»¯µÈ¼¶  | 
| def SetEquipPartPlusEvolveLV(curPlayer, packType, index, evolveLV):  | 
|     if GetEquipPartPlusEvolveLV(curPlayer, packType, index) == evolveLV:  | 
|         return  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartPlusEvolveLV % (packType, index), evolveLV)  | 
|     return  | 
|   | 
| ## Í¨Öª¹«¹²²¿Î»Ç¿»¯µÈ¼¶  | 
| def NotifyEquipPartPlusLV(curPlayer, packType=None, index=None):  | 
|     ePartStarLVPack = ChPyNetSendPack.tagMCEquipPartPlusInfo()  | 
|     ePartStarLVPack.Clear()  | 
|     ePartStarLVPack.InfoList = []  | 
|       | 
|     for pType, indexList in ChConfig.Pack_EquipPart_CanPlusStar.items():  | 
|           | 
|         if packType != None and packType != pType:  | 
|             continue  | 
|           | 
|         for i in indexList:  | 
|             if packType != None:  | 
|                 if index != None and index != i:  | 
|                     continue  | 
|               | 
|             ePartStarLV = ChPyNetSendPack.tagMCEquipPartPlusLV()  | 
|             ePartStarLV.Clear()  | 
|             ePartStarLV.PackType = pType  | 
|             ePartStarLV.EquipIndex = i  | 
|             ePartStarLV.EquipPartStarLV = GetEquipPartPlusLV(curPlayer, pType, i)  | 
|             ePartStarLV.Proficiency = GetEquipPartProficiency(curPlayer, pType, i)  | 
|             ePartStarLV.EvolveLV = GetEquipPartPlusEvolveLV(curPlayer, pType, i)  | 
|             ePartStarLVPack.InfoList.append(ePartStarLV)  | 
|               | 
|     ePartStarLVPack.Count = len(ePartStarLVPack.InfoList)  | 
|     NetPackCommon.SendFakePack(curPlayer, ePartStarLVPack)  | 
|     return  | 
|   | 
|   | 
| ## È«ÉíÇ¿»¯µÈ¼¶  | 
| def GetTotalPlusLV(curPlayer, isActive=True):  | 
|     totalPlusLV = 0  | 
|     equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)  | 
|     equipPartIndexList = ChConfig.Pack_EquipPart_CanPlusStar[IPY_GameWorld.rptEquip]  | 
|     for i in equipPartIndexList:  | 
|         if isActive:  | 
|             curEquip = equipPack.GetAt(i)  | 
|             if not curEquip  or curEquip.IsEmpty():  | 
|                 continue  | 
|               | 
|         partStarLV = GetEquipPartPlusLV(curPlayer, IPY_GameWorld.rptEquip, i)  | 
|         totalPlusLV += partStarLV  | 
|     return totalPlusLV  | 
|   | 
|   | 
| # »ñȡװ±¸µÄÇ¿»¯ÀàÐÍ  | 
| def GetEquipPlusType(curEquip):  | 
|     equipPlace = curEquip.GetEquipPlace()  | 
|     plusTypeDict = IpyGameDataPY.GetFuncEvalCfg("StrengthenLevelLimit", 2)  | 
|     if not plusTypeDict:  | 
|         GameWorld.ErrLog("ûÓÐÇ¿»¯ÀàÐÍÓ³Éä±í")  | 
|         return -1  | 
|       | 
|     return plusTypeDict.get(equipPlace, -1)  | 
|   | 
|   | 
| #  »ñÈ¡ÂúÌ××°»¯µÄ×îµÍ½×Êý£¬Èç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, 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(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  | 
|   | 
|   | 
| #// A5 03 È«ÉíÊôÐÔ¼¤»î #tagCMActiveAllEquipAttr  | 
| #  | 
| #struct    tagCMActiveAllEquipAttr  | 
| #  | 
| #{  | 
| #    tagHead        Head;  | 
| #    BYTE        Type;        //0Ç¿»¯ 1ÐÇÊý  | 
| #    DWORD        Cnt;        //¼¤»îÊýÁ¿  | 
| #};  | 
| def OnActiveAllEquipAttr(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     activeType = clientData.Type  | 
|     activeCnt = clientData.Cnt  | 
|     if activeType == 0:  | 
|         key = ChConfig.Def_PDict_EquipActiveStarLV  | 
| #    elif activeType == 1:  | 
| #        key = ChConfig.Def_PDict_EquipActiveStars  | 
|     else:  | 
|         return  | 
|     curCnt = curPlayer.NomalDictGetProperty(key)  | 
|     if activeCnt <= curCnt:  | 
|         GameWorld.Log('    È«ÉíÊôÐÔ¼¤»î ¸ÃÊýÁ¿ÒѼ¤»î¹ý£¡ activeType=%s,activeCnt=%s,curCnt=%s' % (activeType, activeCnt, curCnt))  | 
|         return  | 
|       | 
|     PlayerControl.NomalDictSetProperty(curPlayer, key, activeCnt)  | 
|       | 
|     SyncAllEquipAttrActiveInfo(curPlayer, activeType)  | 
|     if activeType == 0:  | 
|         PlayerMagicWeapon.CalcMagicWeaponSoulAttr(curPlayer)  | 
|     else:  | 
|         RefreshPlayerEquipAttribute(curPlayer)  | 
|       | 
|     #Ë¢ÐÂËùÓÐÊôÐÔ  | 
|     playControl = PlayerControl.PlayerControl(curPlayer)  | 
|     playControl.RefreshPlayerAttrState()  | 
|     return  | 
|   | 
|   | 
| def SyncAllEquipAttrActiveInfo(curPlayer, activeType=-1):  | 
|     ## Í¨ÖªÈ«ÉíÊôÐÔ¼¤»îÊýÁ¿  | 
|     packData = ChPyNetSendPack.tagMCAllEquipAttrActiveInfo()  | 
|     packData.ActiveInfo = []  | 
|     for aType in [0, 1]:  | 
|         if activeType != -1 and activeType != aType:  | 
|             continue  | 
|         if aType == 0:  | 
|             key = ChConfig.Def_PDict_EquipActiveStarLV  | 
| #        elif aType == 1:  | 
| #            key = ChConfig.Def_PDict_EquipActiveStars  | 
|         else:  | 
|             return  | 
|         curCnt = curPlayer.NomalDictGetProperty(key)  | 
|         activeInfo = ChPyNetSendPack.tagMCEquipActiveInfo()  | 
|         activeInfo.Type = aType  | 
|         activeInfo.Cnt = curCnt  | 
|         packData.ActiveInfo.append(activeInfo)  | 
|       | 
|     packData.Count = len(packData.ActiveInfo)  | 
|     NetPackCommon.SendFakePack(curPlayer, packData)  | 
|     return  |