| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package Event.EventSrc.Operate_EquipPlus  | 
| #  | 
| # @todo:²¿Î»Ç¿»¯¹«¹²Ä£Ê½Ç¿»¯  | 
| # @author hxp  | 
| # @date 2015-12-15  | 
| # @version 1.2  | 
| #  | 
| # ÏêϸÃèÊö: ²¿Î»Ç¿»¯¹«¹²Ä£Ê½Ç¿»¯  | 
| #  | 
| # @change: "2016-06-30 21:30" hxp Ç¿»¯´ïÈË¿ª·þ»î¶¯  | 
| # @change: "2016-10-08 18:00" hxp ×Ô¶¯¹ºÂòÎïÆ·¼Û¸ñͳһȡÉ̳ÇÎïÆ·¼Û¸ñ  | 
| #  | 
| #---------------------------------------------------------------------  | 
| #"""Version = 2016-10-08 18:00"""  | 
| #---------------------------------------------------------------------  | 
| import ItemCommon  | 
| import ShareDefine  | 
| import PlayerControl  | 
| import IPY_GameWorld  | 
| import OpenServerCampaign  | 
| import DataRecordPack  | 
| import PlayerActivity  | 
| import PlayerSuccess  | 
| import IpyGameDataPY  | 
| import PlayerActLogin  | 
| import GameWorld  | 
| import ChConfig  | 
| import ChEquip  | 
| import EventShell  | 
| import ChPyNetSendPack  | 
| import NetPackCommon  | 
| #-------------------------------------------------------------------------------------------  | 
|   | 
| #===============================================================================  | 
| # //A3 01 ×°±¸Ç¿»¯ #tagEquipPlus  | 
| # struct    tagEquipPlus  | 
| # {  | 
| #    tagHead        Head;  | 
| #    BYTE        PackType;        //±³°üÀàÐÍ:rptItem, rptEquip, rptPetEquip1~5  | 
| #    WORD        ItemIndex;        //ÎïÆ·ÔÚ±³°üÖÐË÷Òý  | 
| # };  | 
| #===============================================================================  | 
| ## ×°±¸Ç¿»¯  | 
| #  @param playerIndex: Íæ¼Ò  | 
| #  @param clientData: ·â°ü  | 
| #  @param tick: µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| def OnEquipMayaPlus(playerIndex, clientData, tick):      | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)  | 
|     playerID = curPlayer.GetPlayerID()  | 
|       | 
|     packType = clientData.PackType  | 
|     index = clientData.ItemIndex  | 
|       | 
|     # ÅжϠ1.×°±¸  2.×î¸ßÇ¿»¯µÈ¼¶£¬ 3.ÍÇ®Êý  | 
|     if packType not in ChConfig.Pack_EquipPart_CanPlusStar:  | 
|         #GameWorld.DebugLog("packType not in ChConfig.Pack_EquipPart_CanPlusStar", playerID)  | 
|         return  | 
|       | 
|     ipyData = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'GridIndex':index})  | 
|     if not ipyData:  | 
|         return  | 
|     equipPlace = ipyData.GetEquipPlace()  | 
|     equipPlaceList = ChConfig.Pack_EquipPart_CanPlusStar[packType]  | 
|     if equipPlace not in equipPlaceList:  | 
|         #GameWorld.Log("index=%s, equipPlace=%s not in ChConfig.Pack_EquipPart_CanPlusStar" % (index, equipPlace), playerID)  | 
|         return  | 
|       | 
|     # Ôݲ»ÅжϿªÆôµÈ¼¶Óɿͻ§¶Ë´¦Àí     | 
|     # µ±Ç°×°±¸µÈ¼¶ÊÇ·ñµ½´ï×î¸ßµÈ¼¶  | 
|     curPack = curPlayer.GetItemManager().GetPack(packType)  | 
|     curEquip = curPack.GetAt(index)  | 
|     if not curEquip or curEquip.IsEmpty():  | 
|         GameWorld.DebugLog("equip is empty")  | 
|         return  | 
|       | 
|     findType = ChEquip.GetEquipPlusType(curEquip)  | 
|     if not findType:  | 
|         return  | 
|       | 
|     curPartPlusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, index)  | 
|     classLV = ItemCommon.GetItemClassLV(curEquip)  | 
|     plusMaxIpyData = IpyGameDataPY.GetIpyGameData("ItemPlusMax", findType, classLV)  | 
|     if not plusMaxIpyData:  | 
|         return  | 
|     plusLVMax = plusMaxIpyData.GetPlusLVMax()  | 
|     if curPartPlusLV >= plusLVMax:  | 
|         #GameWorld.DebugLog("Ç¿»¯´ïµ½±¾½××î´óµÈ¼¶£¬ÎÞ·¨Ç¿»¯! classLV=%s,plusLVMax=%s,curPartPlusLV=%s" % (classLV, plusLVMax, curPartPlusLV))  | 
|         return  | 
|     plusIpyData = IpyGameDataPY.GetIpyGameData("ItemPlus", findType, curPartPlusLV)  | 
|     if not plusIpyData:  | 
|         return  | 
|     costSilver = plusIpyData.GetCostCount()  | 
|     costItemInfo = plusIpyData.GetCostItemInfo()  | 
|     if not costSilver and not costItemInfo:  | 
|         #GameWorld.DebugLog("Òѵ½Ç¿»¯×î´óµÈ¼¶! curPartPlusLV=%s" % curPartPlusLV, playerID)          | 
|         return  | 
|       | 
|     curEvolveLV = ChEquip.GetEquipPartPlusEvolveLV(curPlayer, packType, index) # ½ø»¯µÈ¼¶  | 
|     nextEvolveLV = curEvolveLV + 1  | 
|     evolveIpyData = IpyGameDataPY.GetIpyGameDataNotLog('EquipPlusEvolve', equipPlace, nextEvolveLV)  | 
|     if not evolveIpyData:  | 
|         return  | 
|     maxPlusLV = evolveIpyData.GetNeedPlusLV()  | 
|     if curPartPlusLV >= maxPlusLV:  | 
|         GameWorld.Log("Òѵ½µ±Ç°Ç¿»¯×î´óµÈ¼¶£¬½ø»¯ºóÔö¼ÓÇ¿»¯µÈ¼¶ÉÏÏÞ! curPartPlusLV(%s) >= maxPlusLV(%s), curEvolveLV=%s"   | 
|                       % (curPartPlusLV, maxPlusLV, curEvolveLV), playerID)  | 
|         return  | 
|       | 
|     if costSilver and not PlayerControl.HaveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, costSilver):  | 
|         GameWorld.DebugLog("ÍÇ®²»×㣬ÎÞ·¨Ç¿»¯! costSilver=%s" % costSilver)  | 
|         return  | 
|       | 
|     costItemID, costItemCount = 0, 0  | 
|     if costItemInfo:  | 
|         costItemID, costItemCount = costItemInfo  | 
|         itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)  | 
|         hasEnough, itemIndexList = ItemCommon.GetItem_FromPack_ByID(costItemID, itemPack, costItemCount)  | 
|         if not hasEnough:  | 
|             GameWorld.DebugLog("²ÄÁϲ»×㣬ÎÞ·¨Ç¿»¯! costItemID=%s, costItemCount=%s" % (costItemID, costItemCount))  | 
|             return  | 
|           | 
|     if costSilver:  | 
|         PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, costSilver, isNotify=False)  | 
|       | 
|     if costItemID:  | 
|         ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, costItemCount, True, ChConfig.ItemDel_EquipPlus)  | 
|           | 
|     isLVUp = False  | 
|     curExp = 0  | 
|     addExp = plusIpyData.GetAddExp()  | 
|     totalExp = plusIpyData.GetTotalExp()  | 
|     if addExp and totalExp:  | 
|         curExp = ChEquip.GetEquipPartProficiency(curPlayer, packType, index) + addExp  | 
|         if curExp >= totalExp:  | 
|             curExp = curExp - totalExp  | 
|             isLVUp = True  | 
|     else:  | 
|         isLVUp = True  | 
|           | 
|     if isLVUp:  | 
|         curPartPlusLV += 1  | 
|         __EquipMayaPlusChange(curPlayer, packType, curEquip, index, curPartPlusLV)  | 
|           | 
|     #DataRecordPack.DR_UpStarLVSuccess(curPlayer, curExp, curPartPlusLV)  | 
|     ChEquip.SetEquipPartProficiency(curPlayer, packType, index, curExp)  | 
|     ChEquip.NotifyEquipPartPlusLV(curPlayer, packType, index)  | 
|     PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_EquipPlus)  | 
|     PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_EquipPlus, 1)  | 
|     return  | 
|   | 
| def __EquipMayaPlusChange(curPlayer, packType, curEquip, index, updPlusLV):  | 
|     ## ÂêÑżÓÇ¿µÈ¼¶¸Ä±ä  | 
|       | 
|     ChEquip.SetEquipPartPlusLV(curPlayer, packType, index, curEquip, updPlusLV)  | 
|       | 
|     broadCastLVList = IpyGameDataPY.GetFuncEvalCfg("StrengthenLevelBroadCast", 1)  | 
|     if updPlusLV in broadCastLVList:  | 
|         itemID = curEquip.GetItemTypeID()  | 
|         userData = curEquip.GetUserData()  | 
|         guid = ItemCommon.CacheNotifyEquipDetailInfo(curPlayer, curEquip)  | 
|         msgParamList = [curPlayer.GetPlayerName(), itemID, userData, guid, updPlusLV]  | 
|         PlayerControl.WorldNotify(0, "StrengthenCongratulation", msgParamList)  | 
|           | 
|     classLV = ItemCommon.GetItemClassLV(curEquip)   | 
|       | 
|     DoLogic_OnEquipPartStarLVChange(curPlayer, packType, classLV)  | 
|     # Ç¿»¯³É¾Í  | 
|     __UpdateEquipPlusSuccess(curPlayer, classLV)  | 
|     EventShell.EventRespons_EquipPlus(curPlayer, classLV, updPlusLV)  | 
|       | 
|     # ¿ª·þ»î¶¯Êý¾Ý  | 
|     #OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_Plus, ChEquip.GetTotalPlusLV(curPlayer))  | 
|     return  | 
|   | 
| def __UpdateEquipPlusSuccess(curPlayer, classLV):  | 
|     ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'ClassLV':classLV}, True)  | 
|     if not ipyDataList:  | 
|         return  | 
|       | 
|     packType = IPY_GameWorld.rptEquip  | 
|     plusLVCountDict = {}  | 
|     for ipyData in ipyDataList:  | 
|         index = ipyData.GetGridIndex()  | 
|         plusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, index)  | 
|         if not plusLV:  | 
|             continue  | 
|         conditionKey = (classLV, plusLV)  | 
|         plusLVCountDict[conditionKey] = plusLVCountDict.get(conditionKey, 0) + 1  | 
|           | 
|     #GameWorld.DebugLog("Ç¿»¯³É¾ÍÊý¾Ý: classLV=%s,plusLVCountDict=%s" % (classLV, plusLVCountDict))  | 
|     PlayerSuccess.UpdateSuccessProgressByConditions(curPlayer, ShareDefine.SuccType_EquipPlus, plusLVCountDict)  | 
|     return  | 
|   | 
| def DoLogic_OnEquipPartStarLVChange(curPlayer, packType, classLV):  | 
|     #ÏÈË¢×°±¸BUFF ÔÙ¼ÆËãÊôÐÔ  | 
|     curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrActivatyNotify, ChConfig.Def_AttrActivatyNotify_Plus)  | 
|     ChEquip.RefreshPlayerEquipAttribute(curPlayer, classLV)  | 
|       | 
|     #Ë¢ÐÂËùÓÐÊôÐÔ  | 
|     playControl = PlayerControl.PlayerControl(curPlayer)  | 
|     playControl.RefreshPlayerAttrState()  | 
|     return  | 
|   | 
| #// A3 16 ×°±¸Ç¿»¯½ø»¯ #tagCMEquipPlusEvolve  | 
| #struct    tagCMEquipPlusEvolve  | 
| #{  | 
| #    tagHead        Head;  | 
| #    WORD        ItemIndex;        //×°±¸ÔÚ±³°üÖÐË÷Òý  | 
| #};  | 
| def OnEquipPlusEvolve(playerIndex, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)  | 
|       | 
|     equipPackindex = clientData.ItemIndex  | 
|       | 
|     packType = IPY_GameWorld.rptEquip  | 
|     curPack = curPlayer.GetItemManager().GetPack(packType)  | 
|     curEquip = curPack.GetAt(equipPackindex)  | 
|     if not ItemCommon.CheckItemCanUse(curEquip):  | 
|         return  | 
|     curEvolveLV = ChEquip.GetEquipPartPlusEvolveLV(curPlayer, packType, equipPackindex)  | 
|     nextEvolveLV = curEvolveLV + 1  | 
|     equipPlace = curEquip.GetEquipPlace()  | 
|     ipyData = IpyGameDataPY.GetIpyGameData('EquipPlusEvolve', equipPlace, nextEvolveLV)  | 
|     if not ipyData:  | 
|         return  | 
|     needPlusLV = ipyData.GetNeedPlusLV()  | 
|     curPartPlusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, equipPackindex)  | 
|     if curPartPlusLV < needPlusLV:  | 
|         GameWorld.DebugLog("Ç¿»¯µÈ¼¶²»×㣬ÎÞ·¨½ø»¯! curPartPlusLV=%s < needPlusLV=%s, nextEvolveLV=%s"   | 
|                            % (curPartPlusLV, needPlusLV, nextEvolveLV))  | 
|         return  | 
|       | 
|     costItemDict = ipyData.GetCostItem()  | 
|     delItemDict = {}  | 
|     itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)  | 
|     for itemID, itemCnt in costItemDict.items():  | 
|         hasEnough, indexList, findItemIsBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(itemID, itemPack, itemCnt)  | 
|         if not hasEnough:  | 
|             GameWorld.DebugLog('×°±¸Ç¿»¯½ø»¯ ²ÄÁϲ»×ãitemID= %s,itemCnt=%s' % (itemID, itemCnt))  | 
|             return  | 
|         delItemDict[tuple(indexList)] = itemCnt  | 
|     for itemIndexList, delCnt in delItemDict.items():  | 
|         ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, delCnt, True, ChConfig.ItemDel_EquipPlus)  | 
|           | 
|     ChEquip.SetEquipPartPlusEvolveLV(curPlayer, packType, equipPackindex, nextEvolveLV)  | 
|     DoLogic_OnEquipPartStarLVChange(curPlayer, packType, ItemCommon.GetItemClassLV(curEquip))  | 
|     ChEquip.NotifyEquipPartPlusLV(curPlayer, packType, equipPackindex)  | 
|     EventShell.EventRespons_EquipPlusEvolve(curPlayer, nextEvolveLV)  | 
|     return  | 
|   | 
|   | 
| #// A5 C7 ¼¤»î´óʦǿ»¯µÈ¼¶ #tagCMActivateMasterPlusLV  | 
| #  | 
| #struct    tagCMActivateMasterPlusLV  | 
| #{  | 
| #    tagHead        Head;  | 
| #    BYTE    ClassLV;    // ËùÊô×°±¸½×  | 
| #    WORD    MasterPlusLV;    // ´óʦǿ»¯µÈ¼¶  | 
| #};  | 
| def OnActivateMasterPlusLV(index, clientData, tick):  | 
|       | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     classLV = clientData.ClassLV  | 
|     actMasterPlusLV = clientData.MasterPlusLV  | 
|       | 
|     curMasterPlusLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartMasterPlusLV % classLV)  | 
|     if curMasterPlusLV >= actMasterPlusLV:  | 
|         # ÒѾ¼¤»î¹ýÁË  | 
|         GameWorld.DebugLog("ÒѾ¼¤»î¹ý¸ÃÇ¿»¯´óʦµÈ¼¶ÁË! actMasterPlusLV=%s,curMasterPlusLV=%s" % (actMasterPlusLV, curMasterPlusLV))  | 
|         return  | 
|       | 
|     ipyData = IpyGameDataPY.GetIpyGameDataByCondition("ItemPlusMaster", {"ClassLV":classLV, "MasterPlusLV":actMasterPlusLV}, False, False)  | 
|     if not ipyData:  | 
|         GameWorld.DebugLog("²»´æÔÚ¸ÃÇ¿»¯´óʦµÈ¼¶! actMasterPlusLV=%s" % actMasterPlusLV)  | 
|         return  | 
|       | 
|     packType = IPY_GameWorld.rptEquip  | 
|     # ÅжϿɷñ¼¤»î  | 
|     for equipPlace in ChConfig.EquipPlace_Base:  | 
|         ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, equipPlace)  | 
|         if not ipyData:  | 
|             return  | 
|         equipIndex = ipyData.GetGridIndex()  | 
|         plusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, equipIndex)  | 
|         if plusLV < actMasterPlusLV:  | 
|             GameWorld.DebugLog("²¿Î»Ç¿»¯µÈ¼¶²»×㣬ÎÞ·¨¼¤»îÇ¿»¯´óʦ! equipPlace=%s,equipIndex=%s,plusLV=%s < %s"   | 
|                                % (equipPlace, equipIndex, plusLV, actMasterPlusLV))  | 
|             return  | 
|           | 
|     GameWorld.DebugLog("¼¤»îÇ¿»¯´óʦµÈ¼¶! classLV=%s,actMasterPlusLV=%s" % (classLV, actMasterPlusLV))  | 
|       | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartMasterPlusLV % classLV, actMasterPlusLV)  | 
|           | 
|     SyncEquipMasterPlusLVInfo(curPlayer, classLV)  | 
|     ChEquip.ChangeEquipEffectByPlusMaster(curPlayer, classLV)  | 
|     #Ë¢ÐÂËùÓÐÊôÐÔ  | 
|     DoLogic_OnEquipPartStarLVChange(curPlayer, packType, classLV)  | 
|     return  | 
|   | 
| def SyncEquipMasterPlusLVInfo(curPlayer, classLV=0, isForce=False):  | 
|     ## Í¬²½´óʦǿ»¯µÈ¼¶ÐÅÏ¢  | 
|     if not classLV:  | 
|         needSyncClassLVList = xrange(1, IpyGameDataPY.GetFuncCfg('EquipMaxClasslv') + 1)  | 
|     else:  | 
|         needSyncClassLVList = [classLV]  | 
|           | 
|     masterPlusLVInfoList = []  | 
|     for classLV in needSyncClassLVList:  | 
|         masterPlusLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartMasterPlusLV % classLV)  | 
|         if not masterPlusLV and not isForce:  | 
|             continue  | 
|         lvInfo = ChPyNetSendPack.tagMCMasterPlusLV()  | 
|         lvInfo.ClassLV = classLV  | 
|         lvInfo.MasterPlusLV = masterPlusLV  | 
|         masterPlusLVInfoList.append(lvInfo)  | 
|           | 
|     if not masterPlusLVInfoList:  | 
|         return  | 
|       | 
|     clientPack = ChPyNetSendPack.tagMCMasterPlusLVInfo()  | 
|     clientPack.MasterPlusLVInfoList = masterPlusLVInfoList  | 
|     clientPack.Count = len(masterPlusLVInfoList)  | 
|     NetPackCommon.SendFakePack(curPlayer, clientPack)  | 
|     return  | 
|   | 
|   |