#!/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  
 | 
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 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):  
 | 
        # ¹ýÆÚ  
 | 
        GameWorld.DebugLog("×°±¸ÒѹýÆÚ!")  
 | 
        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()  
 | 
    endureReduceType = curItem.GetEndureReduceType()  
 | 
    #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 not endureReduceType:  
 | 
        EventShell.EventRespons_EquipByPlace(curPlayer, 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)  
 | 
      
 | 
    #Ë¢ÐÂËùÓÐÊôÐÔ  
 | 
    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):  
 | 
    baseEquipAttrDict = {}  
 | 
    baseEquipAttr_Weapon = [{} for _ in range(4)] # ÎäÆ÷»ù´¡, ÎïÆ·±í×°±¸»ù´¡Ð§¹ûÊôÐÔ  
 | 
    baseEquipAttr_Armor = [{} for _ in range(4)] # ·À¾ß»ù´¡, ÎïÆ·±í×°±¸»ù´¡Ð§¹ûÊôÐÔ  
 | 
    baseEquipAttr_Relics = [{} for _ in range(4)] # Ê¥Æ÷»ù´¡, ÎïÆ·±í×°±¸»ù´¡Ð§¹ûÊôÐÔ  
 | 
      
 | 
    allAttrListEquip = [{} for _ in range(4)] # ×°±¸ÆäËû  
 | 
    allAttrListPlusBase = [{} for _ in range(4)] # »ù´¡Ç¿»¯ÊôÐÔ  
 | 
    allAttrListStone = [{} for _ in range(4)] # ±¦Ê¯ÊôÐÔ  
 | 
    allAttrListSuit = [{} for _ in range(4)] # Ì××°ÊôÐÔ  
 | 
    allAttrListWash = [{} for _ in range(4)] # Ï´Á·ÊôÐÔ  
 | 
    allAttrListOutOfPrintEquip = [{} for _ in range(4)] # ¾ø°æ×°±¸ÊôÐÔ ÐèÔڵȼ¶±ä»¯¶ÀÁ¢¼ÆËã  
 | 
      
 | 
    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 equipIndex in xrange(playerEquip.GetCount()):  
 | 
        if equipIndex not in ShareDefine.RoleEquipType :  
 | 
            continue  
 | 
          
 | 
        # ³á°òÊôÐÔÔÚ³á°ò¹¦Äܵ¥¶ÀˢР 
 | 
        if equipIndex in ChConfig.EquipItemNoRefreshState or equipIndex == ShareDefine.retWing:  
 | 
            continue  
 | 
          
 | 
        curEquip = playerEquip.GetAt(equipIndex)  
 | 
        if curEquip.IsEmpty():  
 | 
            continue  
 | 
              
 | 
        if not ItemCommon.CheckItemCanUseByExpireTime(curEquip):  
 | 
            # ¹ýÆÚ  
 | 
            continue  
 | 
          
 | 
        equipPlaceList.append(equipIndex)  
 | 
        equipScoreTotal += ItemCommon.GetEquipGearScore(curEquip)  
 | 
          
 | 
        #»ù´¡ÊôÐÔЧ¹û  
 | 
        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)  
 | 
            baseEquipAttrDict[effectID] = baseEquipAttrDict.get(effectID, 0) + effectValue  
 | 
              
 | 
        groupType = GetEquipPartSuiteGroupType(curPlayer, equipIndex)  
 | 
        for suiteType in range(1, maxSuiteType+1):  
 | 
            suitelv = GetEquipPartSuiteLV(curPlayer, equipIndex, suiteType)  
 | 
            if suitelv:  
 | 
                maxSuiteLV = Operate_EquipSuitCompose.GetEquipCanDoMaxSuiteLV(curPlayer, curEquip, suiteType, groupType)  
 | 
                suiteLV = min(suitelv, maxSuiteLV)  
 | 
                if suiteLV:  
 | 
                    suiteKey = '%s_%s_%s'%(groupType,suiteType,suitelv)  
 | 
                    suitCntDict[suiteKey] = suitCntDict.get(suiteKey, 0) + 1  
 | 
          
 | 
        #¼ÆËã×°±¸±¦Ê¯¼Ó³É  
 | 
        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)  
 | 
      
 | 
    #¼ÆËã×°±¸»ù´¡ÊôÐÔ¸½¼ÓÕ½Á¦ (Ŀǰ×é³É: ÆÀ·ÖÕ½Á¦ + ...)  
 | 
    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=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 == ChConfig.EquipGroupType_Relics else myjob #ÏÉÆ÷×éºÏĬÈÏÖ°Òµ0  
 | 
        ipyData = IpyGameDataPY.GetIpyGameData('EquipSuitAttr', int(groupType), int(suiteType), int(suiteLV), job)  
 | 
        if not ipyData:  
 | 
            continue  
 | 
          
 | 
        for i in range(1, Def_EquipSuitMaxCount+1):  
 | 
            countKeyName = 'GetCount%d'%i  
 | 
            attrTypeKeyName = 'GetAttrType%d'%i  
 | 
            attrValueKeyName = 'GetAttrValue%d'%i  
 | 
            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 == ChConfig.EquipGroupType_Armor:  
 | 
                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] # µÚÒ»¸öЧ¹ûÖµÊÇÀàÐ͵ȼ¶Ð§¹ûÖµ£¬·ÇÊôÐÔЧ¹ûÖµ  
 | 
    gemLVList = []  
 | 
    for holeIndex in Operate_EquipStone.GetAllEquipPlaceHoleIndex():  
 | 
          
 | 
        curGemID = Operate_EquipStone.GetEquipIndexStoneIDAndIsBand(curPlayer, equipIndex, holeIndex)[0]  
 | 
        if curGemID == 0:  
 | 
            continue  
 | 
        curGem = gameData.GetItemByTypeID(curGemID)  
 | 
        if not curGem:  
 | 
            GameWorld.ErrLog('equip stone id:%s not in item table' % (curGemID))  
 | 
            continue      
 | 
        for effIndex in effIndexList:           
 | 
            curGemEffect = curGem.GetEffectByIndex(effIndex)  
 | 
            effectID, effectValue = curGemEffect.GetEffectID(), curGemEffect.GetEffectValue(0)  
 | 
            if effectID and effectValue:  
 | 
                PlayerControl.CalcAttrDict_Type(effectID, effectValue, allAttrList)  
 | 
        gemEffect = curGem.GetEffectByIndex(0)  
 | 
        gemLV = gemEffect.GetEffectValue(1)  
 | 
        gemLVList.append(gemLV)  
 | 
    return gemLVList  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
## ×°±¸Ìí¼ÓBuff   
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @param addSkillID ¼¼ÄÜID  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def EquipAddBuff(curPlayer, addSkillID, value=0):  
 | 
  
 | 
    curBuff = curPlayer.GetEquipBuff().AddBuff(addSkillID, 0, False)  
 | 
    curBuff.SetOwnerID(curPlayer.GetID())  
 | 
    curBuff.SetOwnerType(curPlayer.GetGameObjType())  
 | 
    if value > 0:  
 | 
        curBuff.SetValue(value)  
 | 
    return  
 | 
#---------------------------------------------------------------------  
 | 
#===============================================================================  
 | 
# #//03 2F ÇëÇó×°±¸ÏÔÒþ#tagRequestEquipShowHide  
 | 
# //×°±¸ÏÔʾ¿ª¹Ø  
 | 
# int GetEquipShowSwitch();  
 | 
#===============================================================================  
 | 
##ÇëÇó×°±¸ÏÔÒþ.  
 | 
# @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  
 | 
  
 | 
#  »ñÈ¡ÂúÌ××°»¯µÄ×îµÍ½×Êý£¬Èç5¼þÌ×£¬4¼þ5¼¶£¬1¼þ3¼¶£¬Ôò·µ»Ø3  
 | 
def GetEquipSuitsLVByType(curPlayer, suitType, groupType):  
 | 
    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 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  
 | 
  
 | 
  
 | 
#// 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  
 |