#!/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  
 | 
  
 | 
  
 |