| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package Event.EventSrc.Operate_EquipStar  | 
| #  | 
| # @todo:¹«¹²²¿Î»ÐÇÊý  | 
| # @author xdh  | 
| # @date 2019-3-1  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: ¹«¹²²¿Î»ÐÇÊý  | 
| #  | 
| #  | 
| #---------------------------------------------------------------------  | 
| #"""Version = 2019-3-1 18:00"""  | 
| #---------------------------------------------------------------------  | 
| import ItemCommon  | 
| import ShareDefine  | 
| import PlayerControl  | 
| import IPY_GameWorld  | 
| import DataRecordPack  | 
| import IpyGameDataPY  | 
| import GameWorld  | 
| import ChConfig  | 
| import ChEquip  | 
| #-------------------------------------------------------------------------------------------  | 
|   | 
|   | 
| #===============================================================================  | 
| #// A5 C5 ×°±¸²¿Î»ÉýÐÇ #tagCMEquipPartStarUp  | 
| #struct    tagCMEquipPartStarUp  | 
| #{  | 
| #    tagHead        Head;  | 
| #    WORD    EquipPackIndex;    // ²¿Î»¸ñ×ÓË÷Òý  | 
| #    BYTE    CostEquipCnt;    // ×°±¸¸öÊý  | 
| #    WORD    CostEquipIndex[CostEquipCnt];    // ×°±¸Ë÷Òý  | 
| #    DWORD    CostEquipID[CostEquipCnt];    // ×°±¸ÎïÆ·ID  | 
| #};  | 
| #===============================================================================  | 
| ## ²¿Î»ÉýÐÇ  | 
| #  @param playerIndex: Íæ¼Ò  | 
| #  @param clientData: ·â°ü  | 
| #  @param tick: µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| def OnEquipPartStarUp(playerIndex, clientData, tick):      | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)  | 
|     playerID = curPlayer.GetPlayerID()  | 
|       | 
|     equipPackIndex = clientData.EquipPackIndex  | 
|     packType = IPY_GameWorld.rptEquip  | 
|       | 
|     if packType not in ChConfig.Pack_EquipPart_CanPlusStar:  | 
|         return  | 
|     ipyData = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'GridIndex':equipPackIndex})  | 
|     if not ipyData:  | 
|         return  | 
|     classLV = ipyData.GetClassLV()  | 
|     equipPlace = ipyData.GetEquipPlace()  | 
|     placeList = ChConfig.Pack_EquipPart_CanPlusStar[packType]  | 
|     if equipPlace not in placeList:  | 
|         GameWorld.Log("    equipPlace %s not in ChConfig.Pack_EquipPart_CanPlusStar" % equipPlace, playerID)  | 
|         return  | 
|       | 
|     # µ±Ç°×°±¸µÈ¼¶ÊÇ·ñµ½´ï×î¸ßµÈ¼¶  | 
|     curPack = curPlayer.GetItemManager().GetPack(packType)  | 
|     curEquip = curPack.GetAt(equipPackIndex)  | 
|     if not curEquip or curEquip.IsEmpty():  | 
|         GameWorld.DebugLog("OnEquipPartStarUp() equip is empty")  | 
|         return  | 
|       | 
|     maxStar = ItemCommon.GetItemMaxStar(curEquip)  | 
|     curPartStar = ChEquip.GetEquipPartStar(curPlayer, equipPackIndex)  | 
|     if curPartStar >= maxStar:  | 
|         GameWorld.Log("OnEquipPartStarUp:curPartStar(%s) >= maxStar(%s)" % (curPartStar, maxStar), playerID)  | 
|         return  | 
|   | 
|     # ÉýÐÇ´¦Àí  | 
|     result = DoLogic_EquipStarUp(curPlayer, classLV, equipPlace, curPartStar, equipPackIndex, clientData)  | 
|     if result == ChConfig.Def_ComposeState_None:  | 
|         return  | 
|     updPartStar = ChEquip.GetEquipPartStar(curPlayer, equipPackIndex)  | 
|     GameWorld.DebugLog("   ×°±¸ÉýÐÇ equipPackIndex=%s result=%s,curPartStar=%s,updPartStar=%s" % (equipPackIndex, result, curPartStar, updPartStar), playerID)  | 
|     if result == ChConfig.Def_ComposeState_Sucess:  | 
|         # ÐǼ¶±ä¸üʱ´¦Àí  | 
|         #Ë¢ÐÂÊôÐÔ  | 
|         ChEquip.RefreshPlayerEquipAttribute(curPlayer, classLV)  | 
|         playControl = PlayerControl.PlayerControl(curPlayer)  | 
|         playControl.RefreshPlayerAttrState()  | 
|     | 
|         if updPartStar in IpyGameDataPY.GetFuncEvalCfg('EquipPartStarNotify'):  | 
|             PlayerControl.WorldNotify(0, "StarLevelUp", [curPlayer.GetPlayerName(), curEquip.GetItemTypeID(), updPartStar])  | 
|         #EventShell.EventRespons_EquipPlus(curPlayer)  | 
|     return  | 
|        | 
|   | 
| ## ¿ªÊ¼×°±¸ÉýÐÇ  | 
| #  @param index Îª×°±¸Î»  | 
| #  @return   | 
| def DoLogic_EquipStarUp(curPlayer, classLV, equipPlace, curPartStar, equipPackIndex, clientData):  | 
|     result = ChConfig.Def_ComposeState_None  | 
|     nextStar = curPartStar + 1  | 
|     ipyData = IpyGameDataPY.GetIpyGameData("EquipStarUp", classLV, equipPlace, nextStar)  | 
|     if not ipyData:  | 
|         return result  | 
|       | 
|     costEquipCnt = ipyData.GetCostEquipCnt()  | 
|     if clientData.CostEquipCnt < costEquipCnt:  | 
|         GameWorld.DebugLog(' ¿ªÊ¼×°±¸ÉýÐÇ,×°±¸²ÄÁϲ»×ã %s' % costEquipCnt)  | 
|         return result  | 
|     costEquipPlaceList = ipyData.GetCostEquipPlace()  | 
|     costEquipColorList = ipyData.GetCostEquipColor()  | 
|     suitTotalRate = ipyData.GetSuitTotalRate()  | 
|     singleSuitRate = float(suitTotalRate) / costEquipCnt  | 
|     curRate = 0  #³É¹¦¸ÅÂÊ  | 
|     delEquipIndexList = []  | 
|     itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)  | 
|     for i, index in enumerate(clientData.CostEquipIndex):  | 
|         costEquip = itemPack.GetAt(index)  | 
|         if not costEquip or costEquip.IsEmpty():  | 
|             return result  | 
|         equipID = costEquip.GetItemTypeID()  | 
|         if equipID != clientData.CostEquipID[i]:  | 
|             GameWorld.ErrLog('   ×°±¸ÉýÐÇ ¿Í»§¶Ë·¢µÄÎïÆ·Ë÷ÒýÓëʵ¼ÊÎïÆ·ID²»¶ÔÓ¦  index=%s,eatItemID=%s,wantEatItemID=%s' % (index, equipID, clientData.CostEquipID[i]))  | 
|             return result  | 
|         if costEquip.GetItemColor() not in costEquipColorList:  | 
|             return result  | 
|         if costEquip.GetEquipPlace() not in costEquipPlaceList:  | 
|             return result  | 
|         delEquipIndexList.append(index)  | 
|         isSuite = costEquip.GetSuiteID()  | 
|         addRate = singleSuitRate if isSuite else singleSuitRate / 2  | 
|         curRate += addRate  | 
|     if curRate <= 0:  | 
|         GameWorld.Log('×°±¸ÉýÐÇÒì³£ ¸ÅÂÊΪ0£¡£¡equipPackIndex=%s'%equipPackIndex)  | 
|         return result  | 
|     #ÅÐ¶ÏÆÕͨÎïÆ·²ÄÁÏ  | 
|     costItemDict = ipyData.GetCostItemDict()  | 
|     if costItemDict:  | 
|         delItemDict = {}  | 
|         for itemID, itemCnt in costItemDict.items():  | 
|             hasEnough, indexList, findItemIsBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(itemID, itemPack, itemCnt)  | 
|             if not hasEnough:  | 
|                 return result  | 
|             delItemDict[tuple(indexList)] = itemCnt  | 
|         for itemIndexList, delCnt in delItemDict.items():  | 
|             ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, delCnt, True, ChConfig.ItemDel_EquipStarUp)  | 
|     #¿Û×°±¸  | 
|     ItemCommon.ReduceItem(curPlayer, itemPack, delEquipIndexList, len(delEquipIndexList), True, ChConfig.ItemDel_EquipStarUp)  | 
|     isOK = GameWorld.CanHappen(curRate, 100)  | 
|     if isOK:  | 
|         ChEquip.SetEquipPartStar(curPlayer, equipPackIndex, nextStar)  | 
|         ChEquip.NotifyEquipPartStar(curPlayer, equipPackIndex)  | 
|         result = ChConfig.Def_ComposeState_Sucess  | 
|     else:  | 
|         result = ChConfig.Def_ComposeState_Fail  | 
|     curPlayer.Sync_MakeItemAnswer(ShareDefine.Def_mitEquipStarUp, result)  | 
|     drDict = {"PlayerID":curPlayer.GetPlayerID(), "AccID":curPlayer.GetAccID(), "classLV":classLV, "equipPlace":equipPlace, "IsSuccess":isOK,  | 
|               "curRate":curRate, "nextStar":nextStar}  | 
|     DataRecordPack.SendEventPack("EquipStarUp", drDict, curPlayer)  | 
|     return result  | 
|   |