| #!/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 Operate_EquipSuitCompose  | 
| import PlayerMagicWeapon  | 
| import time  | 
| import json  | 
| #---------------------------------------------------------------------  | 
|   | 
| ##¼ì²éÍæ¼ÒÊÇ·ñ¿ÉÒÔ»»×°  | 
| # @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 packEquipIndex ×°±¸²¿Î»  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return ²¼¶ûÖµ  | 
| #  @remarks Ö´ÐÐÍæ¼Ò»»×°Âß¼  | 
| def DoPlayerEquipItem(curPlayer, curItem, packEquipIndex, tick):   | 
|     playerItemControl = ItemControler.PlayerItemControler(curPlayer)  | 
|       | 
|     #---ÑéÖ¤ÊÇ·ñ¿ÉÒÔ»»Õâ¼þ×°±¸---  | 
|     if not ItemCommon.CheckItemCanUse(curItem):  | 
|         return False  | 
|       | 
|     if not ItemCommon.CheckItemCanUseByExpireTime(curItem):  | 
|         # ¹ýÆÚ  | 
|         return False  | 
|       | 
|     changeItemEquipPlace = curItem.GetEquipPlace()  | 
|     if changeItemEquipPlace not in ShareDefine.RoleEquipType:  | 
|         return False  | 
|           | 
|     #--ÉèÖô©ÉÏÎïÆ·ÐǼ¶--  | 
|     #===========================================================================  | 
|     # if changeItemEquipPlace in ChConfig.Type_Equip_CanTake:  | 
|     #    equipPartStar = GetEquipPartStarLV(curPlayer, IPY_GameWorld.rptEquip, changeItemEquipPlace)  | 
|     #    if equipPartStar != curItem.GetItemStarLV():  | 
|     #        curItem.SetItemStarLV(equipPartStar)  | 
|     #===========================================================================  | 
|             #GameWorld.DebugLog("´©ÉϵÄ×°±¸ÉèÖÃÐǼ¶: index=%s,star=%s" % (changeItemEquipPlace, equipPartStar))  | 
|       | 
|     #---¿ªÊ¼»»×°Âß¼---  | 
|       | 
|     #¼Ç¼»»×°ÎïÆ·ÐÅÏ¢  | 
|     changeItemID = curItem.GetItemTypeID()  | 
|     changeItemStarLV = 0#curItem.GetItemStarLV()  | 
|     changeItemStoneCnt = 0#curItem.GetUseStoneCount()  | 
|     changeItemHoleCnt = 0#curItem.GetCanPlaceStoneCount()  | 
|     changeItemUseData = curItem.GetUserData()  | 
|     itemQuality = curItem.GetItemQuality()  | 
|     #changeItemIsHorse = (curItem.GetType() == ChConfig.Def_Item_Type_Horse)  | 
|       | 
|     #Ö´Ðл»×°¶¯×÷  | 
|     equipPlace = playerItemControl.EquipItem(curItem, packEquipIndex)  | 
|       | 
|     if equipPlace == -1:  | 
|         return False  | 
|       | 
|     equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)  | 
|     curEquip = equipPack.GetAt(equipPlace)  | 
|     SetEquipItemSuiteLVInfo(curPlayer, packEquipIndex, curEquip)  | 
|     if curEquip.GetUserAttr(ShareDefine.Def_IudetCreateTime) == 0:  | 
|         curEquip.SetUserAttr(ShareDefine.Def_IudetCreateTime, int(time.time()))  | 
|     #---»»×°³É¹¦---  | 
|     if equipPlace in ChConfig.Def_SyncEquipStateByIndex:  | 
|         #֪ͨ¿Í»§¶Ë½»»»ÎïÆ·  | 
|         curPlayer.ChangeEquip(changeItemID, equipPlace, changeItemStarLV, changeItemHoleCnt, changeItemStoneCnt, changeItemUseData)  | 
|           | 
|       | 
|     #¼Ç¼³È×°¡¢ºì×°  | 
|     #===========================================================================  | 
|     # 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)  | 
|       | 
|     #Ë¢ÐÂËùÓÐÊôÐÔ  | 
|     playControl = PlayerControl.PlayerControl(curPlayer)  | 
|     playControl.RefreshPlayerAttrState()  | 
|     return True  | 
|   | 
| def SetEquipItemSuiteLVInfo(curPlayer, equipIndex, curItem):  | 
|     # ÉèÖò¿Î»Ì××°ÐÅÏ¢  | 
|     if not curItem or curItem.IsEmpty():  | 
|         return  | 
|       | 
|     isSuitePart = False  | 
|     equipSuitTypeDict = IpyGameDataPY.GetFuncEvalCfg('EquipSuitType')  | 
|     for equipIndexList in equipSuitTypeDict.values():  | 
|         if equipIndex in equipIndexList:  | 
|             isSuitePart = True  | 
|             break  | 
|           | 
|     if not isSuitePart:  | 
|         return  | 
|             | 
|     suiteLVList = GetEquipPartSuiteLVList(curPlayer, equipIndex, curItem)  | 
|     attrCount = curItem.GetUserAttrCount(ShareDefine.Def_IudetPartSuiteLV)  | 
|       | 
|     if suiteLVList and len(suiteLVList) == attrCount:  | 
|         for i, suiteLV in enumerate(suiteLVList):  | 
|             if curItem.GetUserAttrByIndex(ShareDefine.Def_IudetPartSuiteLV, i) != suiteLV:  | 
|                 curItem.UpdataUserAttrByIndex(ShareDefine.Def_IudetPartSuiteLV, i, suiteLV)  | 
|     else:  | 
|         if attrCount:  | 
|             curItem.ClearUserAttr(ShareDefine.Def_IudetPartSuiteLV)  | 
|         for suiteLV in suiteLVList:  | 
|             curItem.AddUserAttr(ShareDefine.Def_IudetPartSuiteLV, suiteLV)  | 
|     return  | 
|       | 
| ## Ë¢ÐÂ×°±¸¶ÔÈËÎïÊôÐÔµÄ¸Ä±ä  | 
| #  @param self ÀàʵÀý  | 
| #  @return ·µ»ØÖµÎÞÒâÒå  | 
| #  @remarks Ë¢ÐÂ×°±¸¶ÔÈËÎïÊôÐÔµÄ¸Ä±ä  | 
| def RefreshPlayerEquipAttribute(curPlayer, isRefreshEquipBuff=True):  | 
|     GameWorld.DebugLog("Start RefreshPlayerEquipAttribute!!!")  | 
|   | 
|     __CalcEquips_Effect(curPlayer)  | 
|       | 
|     #CalcAllEquipAllPlusLVAttr(curPlayer)  | 
|       | 
|     CalcAllEquipStarsAttr(curPlayer)  | 
|       | 
|     #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()  | 
|     #½Çɫװ±¸²¿Î»  | 
|     packEquipIndex = 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, packEquipIndex, 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  | 
|       | 
|     equipIndex = 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(equipIndex, sendPack.GetPackIndex())  | 
|       | 
|     if not result:  | 
|         #жÏÂ×°±¸Ê§°Ü  | 
|         return  | 
|       | 
|     equipID = result[0]  | 
|     equipPlace = result[1]  | 
|       | 
|     ##ÌØÊâ×°±¸ , ²»ÐèÒª³åË¢ÊôÐÔ  | 
|     if equipPlace in ChConfig.EquipItemNoRefreshState:  | 
|         curPlayer.Sync_UnEquipItem(equipID, equipPlace)  | 
|         return  | 
|       | 
|     #ÏÈË¢×°±¸BUFF ÔÙ¼ÆËãÊôÐÔ  | 
|     if equipIndex == ShareDefine.retWing:  | 
|         PlayerWing.CalcWingAttr(curPlayer)  | 
|     else:  | 
|         RefreshPlayerEquipAttribute(curPlayer)  | 
|       | 
|     #Ë¢ÐÂËùÓÐÊôÐÔ  | 
|     playControl = PlayerControl.PlayerControl(curPlayer)  | 
|     playControl.RefreshPlayerAttrState()  | 
|       | 
|     if equipPlace in ChConfig.Def_SyncEquipStateByIndex:  | 
|         curPlayer.Sync_UnEquipItem(equipID, equipPlace)  | 
|     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  | 
|   | 
|   | 
| ## ¼ÆËã×°±¸¶Ô»ù±¾ÊôÐÔµÄ¸Ä±ä   | 
| #  @return None  | 
| def __CalcEquips_Effect(curPlayer):  | 
|     baseEquipAttr_Weapon = [{} for _ in range(4)] # ÎäÆ÷»ù´¡, ÎïÆ·±í×°±¸»ù´¡Ð§¹ûÊôÐÔ  | 
|     baseEquipAttr_Armor = [{} for _ in range(4)] # ·À¾ß»ù´¡, ÎïÆ·±í×°±¸»ù´¡Ð§¹ûÊôÐÔ  | 
|     baseEquipAttr_Relics = [{} for _ in range(4)] # Ê¥Æ÷»ù´¡, ÎïÆ·±í×°±¸»ù´¡Ð§¹ûÊôÐÔ  | 
|       | 
|     allAttrListEquip = [{} for _ in range(4)] # ×°±¸ÆäËû  | 
|     allAttrListPlusBase = [{} for _ in range(4)] # »ù´¡Ç¿»¯ÊôÐÔ  | 
|     allAttrListStone = [{} for _ in range(4)] # ±¦Ê¯ÊôÐÔ  | 
|     allAttrListSuit = [{} for _ in range(4)] # Ì××°ÊôÐÔ  | 
|     allAttrListWash = [{} for _ in range(4)] # Ï´Á·ÊôÐÔ  | 
|     allAttrListOutOfPrintEquip = [{} for _ in range(4)] # ¾ø°æ×°±¸ÊôÐÔ ÐèÔڵȼ¶±ä»¯¶ÀÁ¢¼ÆËã  | 
|       | 
|     packType = IPY_GameWorld.rptEquip  | 
|     playerEquip = curPlayer.GetItemManager().GetPack(packType)  | 
|     equipPartStarIndexList = ChConfig.Pack_EquipPart_CanPlusStar.get(packType, [])  | 
|     maxSuiteType = IpyGameDataPY.GetFuncCfg('EquipSuitColorStar', 2) #×î´óÌ××°ÀàÐÍ  | 
|     equipPlaceList = [] # Óд©´÷×°±¸µÄ×°±¸Î»ÁÐ±í  | 
|     suitCntDict = {} #Ì××°ÊýÁ¿×Öµä  | 
|     legendAttrDict = {} #ËùÓд«ÆæÊôÐÔ  | 
|       | 
|     #Íæ¼Òµ±Ç°¿É×°±¸µÄ×°±¸ÀàÐÍ  | 
|     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  | 
|           | 
|         equipPlaceList.append(equipIndex)  | 
|           | 
|         #»ù´¡ÊôÐÔЧ¹û  | 
|         for i in range(0, 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 == ShareDefine.retWing:  | 
| #                PlayerControl.CalcAttrDict_Type(effectID, effectValue, allAttrListWing)  | 
|             if equipIndex in ChConfig.BaseEquipPlace_Weapon:  | 
|                 PlayerControl.CalcAttrDict_Type(effectID, effectValue, baseEquipAttr_Weapon)  | 
|             elif equipIndex in ChConfig.BaseEquipPlace_Armor:  | 
|                 PlayerControl.CalcAttrDict_Type(effectID, effectValue, baseEquipAttr_Armor)  | 
|             elif equipIndex in ChConfig.BaseEquipPlace_Relics:  | 
|                 PlayerControl.CalcAttrDict_Type(effectID, effectValue, baseEquipAttr_Relics)  | 
|             #ÆäËû·Ç»ù´¡²¿Î»µÄ  | 
|             else:  | 
|                 PlayerControl.CalcAttrDict_Type(effectID, effectValue, allAttrListEquip)  | 
|                   | 
|         groupType = GetEquipPartSuiteGroupType(curPlayer, equipIndex)  | 
|         for suiteType in range(1, maxSuiteType+1):  | 
|             suitelv = GetEquipPartSuiteLV(curPlayer, equipIndex, suiteType)  | 
|             if suitelv:  | 
|                 maxSuiteLV = Operate_EquipSuitCompose.GetEquipCanDoMaxSuiteLV(curPlayer, curEquip, suiteType, groupType)  | 
|                 suiteLV = min(suitelv, maxSuiteLV)  | 
|                 if suiteLV:  | 
|                     suiteKey = '%s_%s_%s'%(groupType,suiteType,suitelv)  | 
|                     suitCntDict[suiteKey] = suitCntDict.get(suiteKey, 0) + 1  | 
|           | 
|         #¼ÆËã×°±¸±¦Ê¯¼Ó³É  | 
|         CalcEquipStone_Effect(curPlayer, equipIndex, allAttrListStone)  | 
|           | 
|         #ÎïÆ·Ç¿»¯ÊôÐÔ£¬ÅåÊÎÇ¿»¯²»Í¬ÒªÇø·Ö  | 
|         if equipIndex in equipPartStarIndexList:  | 
|             equipPartStarLV = GetEquipPartStarLVByRank(curPlayer, packType, equipIndex, curEquip)  | 
|             CalcAttr_ItemPlus(curPlayer, curEquip, allAttrListPlusBase, equipPartStarLV)  | 
|           | 
|         #´«ÆæÊôÐÔ  | 
|         CalcAttr_LegendAttr(curPlayer, curEquip, allAttrListEquip, legendAttrDict)              | 
|         #¾øÊÀÊôÐÔ  | 
|         CalcAttr_OutOfPrintAttr(curPlayer, curEquip, allAttrListOutOfPrintEquip)  | 
|         #Ï´Á·ÊôÐÔ  | 
|         Operate_EquipWash.CalcAttr_EquipWash(curPlayer, equipIndex, allAttrListWash)  | 
|       | 
|     #Ï´Á·Ì××°ÊôÐÔ  | 
|     Operate_EquipWash.CalcAttr_EquipWashSpec(curPlayer, equipPlaceList, allAttrListWash)  | 
|     #Ì××°ÊôÐÔ  | 
|     CalcEquipSuiteAttr(curPlayer, suitCntDict, allAttrListSuit)  | 
|     #GameWorld.DebugLog("ËùÓд«ÆæÊôÐÔ: %s" % legendAttrDict)  | 
|     #±£´æ¼ÆËãÖµ  | 
|     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_EquipBaseWeapon, baseEquipAttr_Weapon)  | 
|     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_EquipBaseArmor, baseEquipAttr_Armor)  | 
|     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_EquipBaseRelics, baseEquipAttr_Relics)  | 
|     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Equip, allAttrListEquip)  | 
|     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PlusBase, allAttrListPlusBase)  | 
|     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Stone, allAttrListStone)  | 
|     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Suit, allAttrListSuit)  | 
|     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Wash, allAttrListWash)  | 
|     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_EquipOutOfPrint, allAttrListOutOfPrintEquip)  | 
|     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()  | 
|     for i, attrID in enumerate(OutOfPrintAttrIDList):  | 
|         maxOOPValue = OutOfPrintAttrValueList[i]  | 
|         value = eval(IpyGameDataPY.GetFuncCompileCfg("OutOfPrintValue", 1))  | 
|         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=None):  | 
|     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)  | 
|     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  | 
|   | 
| ## Ìí¼Ó×°±¸È«ÉíÐÇÊý¶ÔÓ¦ÊôÐÔ  | 
| def CalcAllEquipStarsAttr(curPlayer):  | 
|     allAttrList = [{} for i in range(4)]  | 
|     totalStars = GetTotalEquipStars(curPlayer)  | 
|     activeStars = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipActiveStars)  | 
|     totalStars = min(totalStars, activeStars)  | 
|     if totalStars:  | 
|         ipyData = IpyGameDataPY.InterpolationSearch("RoleEquipStars", "StarsNeed", totalStars)  | 
|         if ipyData:  | 
|             attrTypeList = ipyData.GetAttrType()  | 
|             attrValueList = ipyData.GetAttrValue()  | 
|               | 
|             for i, attrID in enumerate(attrTypeList):  | 
|                 PlayerControl.CalcAttrDict_Type(attrID, attrValueList[i], allAttrList)  | 
|     #GameWorld.DebugLog("×°±¸È«ÉíÐÇÊýÊôÐÔ: totalStars=%s,allAttrList=%s" % (totalStars, allAttrList), curPlayer.GetPlayerID())  | 
|     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_EquipAllStars, allAttrList)  | 
|     return  | 
|   | 
| ## ×°±¸Ì××°ÊôÐÔ¼ÆËã  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @return None  | 
| def CalcEquipSuiteAttr(curPlayer, suitCntDict, allAttrListEquip):  | 
|     Def_EquipSuitMaxCount = 3 #Ì××°×î´ó½×¶Î  | 
|     myjob = curPlayer.GetJob()  | 
|     name = curPlayer.GetName()  | 
|       | 
|     for suiteKey, cnt in suitCntDict.items():  | 
|         groupType,suiteType,suiteLV = suiteKey.split('_')  | 
|         suiteLV = int(suiteLV)  | 
|         job = 0 if groupType == '2' else myjob #ÏÉÆ÷×éºÏĬÈÏÖ°Òµ0  | 
|         ipyData = IpyGameDataPY.GetIpyGameData('EquipSuitAttr', int(groupType), int(suiteType), int(suiteLV), job)  | 
|         if not ipyData:  | 
|             continue  | 
|           | 
|         for i in range(1, Def_EquipSuitMaxCount+1):  | 
|             countKeyName = 'GetCount%d'%i  | 
|             attrTypeKeyName = 'GetAttrType%d'%i  | 
|             attrValueKeyName = 'GetAttrValue%d'%i  | 
|             needCnt = getattr(ipyData, countKeyName)()  | 
|             if cnt >= needCnt:  | 
|                 attrTypeList = getattr(ipyData, attrTypeKeyName)()  | 
|                 attrValueList = getattr(ipyData, attrValueKeyName)()  | 
|                 for j, attrID in enumerate(attrTypeList):  | 
|                     value = attrValueList[j]  | 
|                     PlayerControl.CalcAttrDict_Type(attrID, value, allAttrListEquip)  | 
|                       | 
|         #Ì××°¼¤»îÌáʾ(Ö»Ìáʾ1´Î)  | 
|         paramList= [name, cnt, suiteLV, groupType, suiteType]  | 
|         notifyRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartSuiteNotify % (groupType, suiteType, cnt))  | 
|         if not notifyRecord & pow(2, suiteLV):  | 
|             if groupType == '1':  | 
|                 if cnt >=5:  | 
|                     PlayerControl.WorldNotify(0, 'EquipSuit5', paramList)  | 
|                     notifyRecord |= pow(2, suiteLV)  | 
|             else:  | 
|                 PlayerControl.WorldNotify(0, 'EquipSuit5', paramList)  | 
|                 notifyRecord |= pow(2, suiteLV)  | 
|             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartSuiteNotify % (groupType, suiteType, cnt), notifyRecord)  | 
|       | 
|     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] # µÚÒ»¸öЧ¹ûÖµÊÇÀàÐ͵ȼ¶Ð§¹ûÖµ£¬·ÇÊôÐÔЧ¹ûÖµ  | 
|     | 
|     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)  | 
|   | 
|     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();  | 
| #===============================================================================  | 
| ##ÇëÇó×°±¸ÏÔÒþ.  | 
| # @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()  | 
|     #´Ë¹¦ÄÜÎÞÐèÑéÖ¤  | 
|     curPlayer.SetEquipShowSwitch(sendPack.GetEquipShowSwitch())  | 
|     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 GetEquipPartStarLVByRank(curPlayer, packType, index, curEquip):  | 
|     maxStarLV = ItemCommon.GetItemMaxStarLV(curEquip)  | 
|     return min(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartStarLV % (packType, index)), maxStarLV)  | 
|   | 
|   | 
| ## »ñÈ¡¹«¹²²¿Î»Ç¿»¯ÐǼ¶  | 
| def GetEquipPartStarLV(curPlayer, packType, index):  | 
|     return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartStarLV % (packType, index))  | 
|   | 
|   | 
| ## ÉèÖù«¹²²¿Î»Ç¿»¯ÐǼ¶  | 
| def SetEquipPartStarLV(curPlayer, packType, index, curEquip, starLV):  | 
|     if GetEquipPartStarLV(curPlayer, packType, index) == starLV:  | 
|         return  | 
|       | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartStarLV % (packType, index), starLV)  | 
|     #===========================================================================  | 
|     # if curEquip and not curEquip.IsEmpty():  | 
|     #    curEquip.SetItemStarLV(starLV)  | 
|     #===========================================================================  | 
|   | 
|     return  | 
|   | 
| ## Í¨Öª¹«¹²²¿Î»Ç¿»¯ÐǼ¶  | 
| def NotifyEquipPartStarLV(curPlayer, packType=None, index=None):  | 
|     ePartStarLVPack = ChPyNetSendPack.tagMCEquipPartStarLVInfo()  | 
|     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.tagMCEquipPartStarLV()  | 
|             ePartStarLV.Clear()  | 
|             ePartStarLV.PackType = pType  | 
|             ePartStarLV.EquipIndex = i  | 
|             ePartStarLV.EquipPartStarLV = GetEquipPartStarLV(curPlayer, pType, i)  | 
|             ePartStarLV.Proficiency = GetEquipPartProficiency(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 = GetEquipPartStarLV(curPlayer, IPY_GameWorld.rptEquip, i)  | 
|         totalPlusLV += partStarLV  | 
|     return totalPlusLV  | 
|   | 
| ## È«Éí×°±¸ÐÇÊý  | 
| def GetTotalEquipStars(curPlayer):  | 
|     totalEquipStars = 0  | 
|     equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)  | 
|     for i in ChConfig.BaseEquipPlaceList:  | 
|         curEquip = equipPack.GetAt(i)  | 
|         if not curEquip or curEquip.IsEmpty():  | 
|             continue  | 
|         totalEquipStars += curEquip.GetItemQuality()  | 
|     return totalEquipStars  | 
|   | 
| # »ñȡװ±¸µÄÇ¿»¯ÀàÐÍ  | 
| def GetEquipPlusType(curEquip):  | 
|     equipPlace = curEquip.GetEquipPlace()  | 
|     plusTypeDict = IpyGameDataPY.GetFuncEvalCfg("StrengthenLevelLimit", 2)  | 
|     if not plusTypeDict:  | 
|         GameWorld.ErrLog("ûÓÐÇ¿»¯ÀàÐÍÓ³Éä±í")  | 
|         return -1  | 
|       | 
|     return plusTypeDict.get(equipPlace, -1)  | 
|   | 
| def SetEquipPartSuiteLV(curPlayer, index, suiteType, suiteLV):  | 
|     #ÉèÖù«¹²²¿Î»Ì××°µÈ¼¶  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartSuiteLV % (index, suiteType), suiteLV)  | 
|     equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)  | 
|     SetEquipItemSuiteLVInfo(curPlayer, index, equipPack.GetAt(index))  | 
|     return  | 
|   | 
| def GetEquipPartSuiteLV(curPlayer, index, suiteType):  | 
|     #»ñÈ¡¹«¹²²¿Î»Ì××°µÈ¼¶  | 
|     return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartSuiteLV % (index, suiteType))  | 
|   | 
| def GetEquipPartSuiteGroupType(curPlayer, equipIndex):  | 
|     #»ñÈ¡¹«¹²²¿Î»Ì××°×éºÏÀàÐÍ  | 
|     findGroupType = 0  | 
|     equipSuitTypeDict = IpyGameDataPY.GetFuncEvalCfg('EquipSuitType')  | 
|     for groupType, indexList in equipSuitTypeDict.items():  | 
|         if equipIndex in indexList:  | 
|             findGroupType = int(groupType)  | 
|             break  | 
|     return findGroupType  | 
|   | 
|   | 
| ## Í¨Öª¹«¹²²¿Î»Ì××°µÈ¼¶  | 
| def NotifyEquipPartSuiteLV(curPlayer, index=None):  | 
|     ePartSuitePack = ChPyNetSendPack.tagMCEquipPartSuiteLVInfo()  | 
|     ePartSuitePack.Clear()  | 
|     ePartSuitePack.InfoList = []  | 
|       | 
|     equipSuitTypeDict = IpyGameDataPY.GetFuncEvalCfg('EquipSuitType')  | 
|     for equipIndexList in equipSuitTypeDict.values():  | 
|         for i in equipIndexList:  | 
|             if index != None and index != i:  | 
|                 continue  | 
|             ePartSuiteInfo = ChPyNetSendPack.tagMCEquipPartSuiteLV()  | 
|             ePartSuiteInfo.Clear()  | 
|             ePartSuiteInfo.EquipIndex = i  | 
|             suiteInfo = GetSuiteInfoByPlace(curPlayer, i)  | 
|             ePartSuiteInfo.SuiteLVInfo = json.dumps(suiteInfo, ensure_ascii=False)  | 
|             ePartSuiteInfo.Len = len(ePartSuiteInfo.SuiteLVInfo)  | 
|             ePartSuitePack.InfoList.append(ePartSuiteInfo)  | 
|               | 
|     ePartSuitePack.Count = len(ePartSuitePack.InfoList)  | 
|     NetPackCommon.SendFakePack(curPlayer, ePartSuitePack)  | 
|     return  | 
|   | 
| def GetSuiteInfoByPlace(curPlayer, equipPlace, curEquip=None):  | 
|     suiteInfo = {} #{Ì××°ÀàÐÍ:µÈ¼¶}  | 
|     groupType = GetEquipPartSuiteGroupType(curPlayer, equipPlace)  | 
|     maxSuiteType = IpyGameDataPY.GetFuncCfg('EquipSuitColorStar', 2)  | 
|     for suiteType in range(1, maxSuiteType+1):  | 
|         suiteLV = GetEquipPartSuiteLV(curPlayer, equipPlace, suiteType)  | 
|         if suiteLV:  | 
|             if curEquip:  | 
|                 maxSuiteLV = Operate_EquipSuitCompose.GetEquipCanDoMaxSuiteLV(curPlayer, curEquip, suiteType, groupType)  | 
|                 suiteLV = min(suiteLV, maxSuiteLV)  | 
|             suiteInfo[suiteType] = suiteLV  | 
|     return suiteInfo  | 
|   | 
| def GetEquipPartSuiteLVList(curPlayer, equipPlace, curEquip=None):  | 
|     ## ²¿Î»Ì××°µÈ¼¶ÁÐ±í  | 
|     groupType = GetEquipPartSuiteGroupType(curPlayer, equipPlace)  | 
|                 | 
|     suiteLVList = []  | 
|     maxSuiteType = IpyGameDataPY.GetFuncCfg('EquipSuitColorStar', 2)  | 
|     for suiteType in xrange(1, maxSuiteType+1):  | 
|         suiteLV = GetEquipPartSuiteLV(curPlayer, equipPlace, suiteType)  | 
|         if curEquip and suiteLV:  | 
|             maxSuiteLV = Operate_EquipSuitCompose.GetEquipCanDoMaxSuiteLV(curPlayer, curEquip, suiteType, groupType)  | 
|             suiteLV = min(suiteLV, maxSuiteLV)  | 
|           | 
|         suiteLVList.append(suiteLV)  | 
|     return suiteLVList  | 
|   | 
| ## »ñÈ¡Íæ¼Ò×°±¸Ô¤ÀÀÐÅÏ¢  | 
| def GetPlayerEquipView(curPlayer):  | 
|     if not curPlayer:  | 
|         return []  | 
|       | 
|     playerID = curPlayer.GetPlayerID()  | 
|     playerEquipList = []  | 
|       | 
|     playerEquip = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)  | 
|     #Íæ¼Òµ±Ç°¿É×°±¸µÄ×°±¸ÀàÐÍ  | 
|     for equipIndex in xrange(0, playerEquip.GetCount()):  | 
|           | 
|         if equipIndex not in ShareDefine.RoleEquipType:  | 
|             continue  | 
|           | 
|         curEquip = playerEquip.GetAt(equipIndex)  | 
|         if curEquip.IsEmpty():  | 
|             continue  | 
|           | 
|         playerEquipList.append([curEquip.GetItemTypeID(), equipIndex, 0, 0])  | 
|                                 #curEquip.GetItemStarLV(), 0])  | 
|       | 
|     #GameWorld.DebugLog("Íæ¼Ò×°±¸ÐÅÏ¢£º%s" % str(playerEquipList), playerID)  | 
|     return playerEquipList  | 
|   | 
|   | 
| #// 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.CalcMagicWeaponAttr(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  |