#!/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  
 | 
#-------------------------------------------------------------------------------------------  
 | 
  
 | 
#===============================================================================  
 | 
# //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()  
 | 
    indexList = ChConfig.Pack_EquipPart_CanPlusStar[packType]  
 | 
    if equipPlace not in indexList:  
 | 
        GameWorld.Log("    index not in ChConfig.Pack_EquipPart_CanPlusStar", playerID)  
 | 
        return  
 | 
      
 | 
    # Ôݲ»ÅжϿªÆôµÈ¼¶Óɿͻ§¶Ë´¦Àí     
 | 
    # µ±Ç°×°±¸µÈ¼¶ÊÇ·ñµ½´ï×î¸ßµÈ¼¶  
 | 
    curPack = curPlayer.GetItemManager().GetPack(packType)  
 | 
    curEquip = curPack.GetAt(index)  
 | 
    if not curEquip or curEquip.IsEmpty():  
 | 
        GameWorld.DebugLog("OnEquipMayaPlus() equip is empty")  
 | 
        return  
 | 
      
 | 
    maxPlusLV = ItemCommon.GetItemMaxPlusLV(curPlayer, index, curEquip)  
 | 
    curPartPlusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, index)  
 | 
    if curPartPlusLV >= maxPlusLV:  
 | 
        GameWorld.Log("OnEquipMayaPlus:curPartPlusLV(%s) >= maxPlusLV(%s)" % (curPartPlusLV, maxPlusLV), playerID)  
 | 
        return  
 | 
  
 | 
    # Ç¿»¯´¦Àí  
 | 
    result = DoLogic_EquipMayaPlus(curPlayer, curEquip, packType, index)  
 | 
      
 | 
    updPartPlusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, index)  
 | 
    #GameWorld.Log("    result=%s,curStarLV=%s,updStarLV=%s" % (result, curPartPlusLV, updPartStarLV), playerID)  
 | 
    if result == ChConfig.Def_ComposeState_None:  
 | 
        return  
 | 
      
 | 
    #===========================================================================  
 | 
    # curPlayer.Sync_MakeItemAnswer(ShareDefine.Def_mitEquipMayaPlus, result)  
 | 
      
 | 
    # Ã¿Èջ  
 | 
    PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_EquipPlus)  
 | 
    PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_EquipPlus, 1)  
 | 
    #===========================================================================  
 | 
      
 | 
  
 | 
    # Ç¿»¯±ä¸üʱ´¦Àí  
 | 
    if curPartPlusLV != updPartPlusLV:  
 | 
        DoLogic_OnEquipPartStarLVChange(curPlayer, packType, ItemCommon.GetItemClassLV(curEquip))  
 | 
        # Ôö¼ÓÇ¿»¯³É¾Í  
 | 
        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_EquipPlus, 1)  
 | 
        EventShell.EventRespons_EquipPlus(curPlayer, ipyData.GetClassLV(), updPartPlusLV)  
 | 
    return  
 | 
  
 | 
       
 | 
  
 | 
## ¿ªÊ¼×°±¸Ç¿»¯  
 | 
#  @param index Îª×°±¸Î»  
 | 
#  @return   
 | 
def DoLogic_EquipMayaPlus(curPlayer, curEquip, packType, index):  
 | 
    result = ChConfig.Def_ComposeState_None  
 | 
  
 | 
    findType = ChEquip.GetEquipPlusType(curEquip)  
 | 
    if findType == -1:  
 | 
        return result  
 | 
      
 | 
    curPartPlusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, index)  
 | 
    ipyData = IpyGameDataPY.GetIpyGameData("ItemPlus", findType, curPartPlusLV)  
 | 
    if not ipyData:  
 | 
        return  
 | 
    costSilver = ipyData.GetCostCount()  
 | 
  
 | 
    if not PlayerControl.HaveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, costSilver):  
 | 
        # ½ð±Ò²»×㣬·µ»Ø  
 | 
        return result  
 | 
  
 | 
    totalExp = ipyData.GetTotalExp()  
 | 
    curExp = ChEquip.GetEquipPartProficiency(curPlayer, packType, index) + ipyData.GetAddExp()  
 | 
  
 | 
    if curExp >= totalExp:  
 | 
        #Éý¼¶  
 | 
        curPartPlusLV = __EquipMayaPlusChange(curPlayer, packType, curEquip, index)  
 | 
        curExp = curExp - totalExp  
 | 
          
 | 
    ChEquip.SetEquipPartProficiency(curPlayer, packType, index, curExp)  
 | 
    ChEquip.NotifyEquipPartPlusLV(curPlayer, packType, index)  
 | 
    # Ö§¸¶½ð±Ò  
 | 
    PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, costSilver, isNotify=False)  
 | 
  
 | 
    DataRecordPack.DR_UpStarLVSuccess(curPlayer, curExp, curPartPlusLV)  
 | 
    return ChConfig.Def_ComposeState_Sucess  
 | 
  
 | 
  
 | 
  
 | 
## ÂêÑżÓÇ¿µÈ¼¶¸Ä±ä  
 | 
#  @param curPlayer: Íæ¼Ò  
 | 
#  @param packType: ±³°üÀàÐÍ  
 | 
#  @param curEquip: µ±Ç°×°±¸  
 | 
#  @param succeedRate: ³É¹¦ÂÊ  
 | 
#  @param failStarLV: Ê§°ÜʱµÄÇ¿»¯Êý  
 | 
#  @return   
 | 
def __EquipMayaPlusChange(curPlayer, packType, curEquip, index):  
 | 
    curPlusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, index)  
 | 
    updPlusLV = curPlusLV + 1  
 | 
    ChEquip.SetEquipPartPlusLV(curPlayer, packType, index, curEquip, updPlusLV)  
 | 
      
 | 
    broadCastLVList = IpyGameDataPY.GetFuncEvalCfg("StrengthenLevelBroadCast", 1)  
 | 
    #GameWorld.DebugLog("PlusLVChange index=%s,updPlusLV=%s,broadCastLVList=%s" % (index, updPlusLV, broadCastLVList))  
 | 
    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)  
 | 
          
 | 
    # ³É¾Í  
 | 
    #PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_EquipPlusLV, 1, [updPlusLV])  
 | 
  
 | 
    # ¿ª·þ»î¶¯Êý¾Ý  
 | 
    #OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_PlusLV, ChEquip.GetTotalPlusLV(curPlayer))  
 | 
    return updPlusLV  
 | 
  
 | 
  
 | 
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)  
 | 
    maxEvolveLV = ItemCommon.GetItemMaxPlusEvolveLV(curPlayer, equipPackindex, curEquip)  
 | 
    if curEvolveLV >= maxEvolveLV:  
 | 
        GameWorld.DebugLog('×°±¸Ç¿»¯½ø»¯, ÒÑ´ï×î´ó½ø»¯µÈ¼¶equipPackindex=%s, maxEvolveLV=%s'%(equipPackindex, maxEvolveLV))  
 | 
        return  
 | 
    nextEvolveLV = curEvolveLV + 1  
 | 
    equipPlace = curEquip.GetEquipPlace()  
 | 
    ipyData = IpyGameDataPY.GetIpyGameData('EquipPlusEvolve', equipPlace, nextEvolveLV)  
 | 
    if not ipyData:  
 | 
        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_EquipPlusEvolve)  
 | 
      
 | 
    ChEquip.SetEquipPartPlusEvolveLV(curPlayer, packType, equipPackindex, nextEvolveLV)  
 | 
    DoLogic_OnEquipPartStarLVChange(curPlayer, packType, ItemCommon.GetItemClassLV(curEquip))  
 | 
    ChEquip.NotifyEquipPartPlusLV(curPlayer, packType, equipPackindex)  
 | 
    EventShell.EventRespons_EquipPlusEvolve(curPlayer, nextEvolveLV)  
 | 
    return  
 |