#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
##@package Player.PlayerCoat  
 | 
#  
 | 
# @todo:Íæ¼ÒʱװÍâÌ×  
 | 
# @author xdh  
 | 
# @date 2019-01-07  
 | 
# @version 1.0  
 | 
#  
 | 
# ÏêϸÃèÊö: Íæ¼ÒʱװÍâÌ×  
 | 
#  
 | 
#---------------------------------------------------------------------  
 | 
"""Version = 2019-01-07 10:00"""  
 | 
#---------------------------------------------------------------------  
 | 
  
 | 
import NetPackCommon  
 | 
import IPY_GameWorld  
 | 
import PlayerControl  
 | 
import ItemControler  
 | 
import ChPyNetSendPack  
 | 
import ShareDefine  
 | 
import ItemCommon  
 | 
import DataRecordPack  
 | 
import IpyGameDataPY  
 | 
import GameWorld  
 | 
import ChConfig  
 | 
  
 | 
import math  
 | 
  
 | 
## µÇ¼  
 | 
#  @param curPlayer  
 | 
#  @return None  
 | 
def OnLogin_Coat(curPlayer):  
 | 
    Sync_ClothesCoatSkinInfo(curPlayer)  
 | 
    return  
 | 
  
 | 
#// A5 0B Íæ¼ÒʱװÉý¼¶ #tagCMCoatUp  
 | 
#  
 | 
#struct    tagCMCoatUp  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#    BYTE        CoatIndex; // Ê±×°Ë÷Òý  
 | 
#};  
 | 
def OnPlayerCoatUp(index, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    coatIndex = clientData.CoatIndex  
 | 
    ipyData = IpyGameDataPY.GetIpyGameData('Coat', coatIndex)  
 | 
    if not ipyData:  
 | 
        return  
 | 
      
 | 
    curSkinLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ClothesSkinLV % coatIndex)  
 | 
    if curSkinLV >= ipyData.GetMaxLV():  
 | 
        GameWorld.DebugLog("¸ÃʱװÒÑÂú¼¶£¬ÎÞ·¨Éý¼¶!coatIndex=%s,curSkinLV=%s" % (coatIndex, curSkinLV), playerID)  
 | 
        return  
 | 
    needCntList = ipyData.GetCostItemCnt()  
 | 
    if curSkinLV >= len(needCntList):  
 | 
        return  
 | 
    plusCost = needCntList[curSkinLV]  
 | 
    costItemID = ipyData.GetUnlockItemID()  
 | 
    curPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)  
 | 
    hasEnough, itemIndexList = ItemCommon.GetItem_FromPack_ByID(costItemID, curPack, plusCost)  
 | 
    if not hasEnough:  
 | 
        GameWorld.DebugLog("OnPlayerCoatUp() Ê±×°Éý¼¶²ÄÁϲ»×ã, coatIndex=%s, costItemID=%s, needCnt=%s" % (coatIndex, costItemID, plusCost))  
 | 
        return  
 | 
  
 | 
    reduceCnt = plusCost  
 | 
    aftlv = curSkinLV + 1  
 | 
        
 | 
    #¿Û³ýÎïÆ·  
 | 
    ItemCommon.ReduceItem(curPlayer, curPack, itemIndexList, reduceCnt, True, 'CoatUp')  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ClothesSkinLV % coatIndex, aftlv)  
 | 
         
 | 
    Sync_ClothesCoatSkinInfo(curPlayer, coatIndex)  
 | 
    # Ë¢ÊôÐÔ  
 | 
    CalcClothesCoatSkinAttr(curPlayer)  
 | 
    PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()  
 | 
      
 | 
    extraInfoDict = {"coatID":coatIndex}  
 | 
    DataRecordPack.DR_ClassUpSystem(curPlayer, "CoatUp", aftlv, extraInfoDict)  
 | 
      
 | 
    GameWorld.DebugLog("ʱװÉý¼¶!coatIndex=%s,curSkinLV=%s,reduceCnt=%s,aftlv=%s"   
 | 
                       % (coatIndex, curSkinLV, reduceCnt, aftlv), playerID)  
 | 
    return  
 | 
  
 | 
#// A5 20 Ê±×°·Ö½â #tagCMCoatDecompose  
 | 
#  
 | 
#struct    tagCMCoatDecompose  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#    BYTE        Count;        //²ÄÁÏËùÔÚ±³°üË÷ÒýµÄÊýÁ¿  
 | 
#    WORD        IndexList[Count];    //²ÄÁÏËùÔÚ±³°üË÷ÒýÁÐ±í  
 | 
#    DWORD        ItemIDList[Count];    //²ÄÁÏËùÔÚ±³°üÎïÆ·IDÁÐ±í  
 | 
#};  
 | 
def OnCoatDecompose(index, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    indexList = clientData.IndexList  
 | 
    ItemIDList = clientData.ItemIDList  
 | 
  
 | 
    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)  
 | 
    addExp = 0  
 | 
    for i, index in enumerate(indexList):  
 | 
        eatItem = itemPack.GetAt(index)  
 | 
        if not eatItem or eatItem.IsEmpty():  
 | 
            continue  
 | 
        eatItemID = eatItem.GetItemTypeID()  
 | 
        if eatItemID != ItemIDList[i]:  
 | 
            GameWorld.Log('ʱװ·Ö½â ·¢µÄÎïÆ·ID²»¶ÔÓ¦index=%s eatItemID=%s,ItemIDList[i]=%s'%(index, eatItemID, ItemIDList[i]))  
 | 
            continue  
 | 
        itemData = GameWorld.GetGameData().GetItemByTypeID(eatItemID)  
 | 
        if not itemData:  
 | 
            continue  
 | 
        curEff = itemData.GetEffectByIndex(0)  
 | 
        coatID = curEff.GetEffectValue(0)  
 | 
        ipyData = IpyGameDataPY.GetIpyGameData('Coat', coatID)  
 | 
        if not ipyData:  
 | 
            continue  
 | 
        curSkinLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ClothesSkinLV % coatID)  
 | 
        if curSkinLV < ipyData.GetMaxLV():  
 | 
            continue  
 | 
        itemCnt = eatItem.GetCount()  
 | 
        addExp += itemCnt * curEff.GetEffectValue(1)  
 | 
        ItemCommon.DelItem(curPlayer, eatItem, itemCnt, True, ChConfig.ItemDel_CoatDecompose)  
 | 
    if not addExp:  
 | 
        GameWorld.Log(' Ê±×°·Ö½â, Ã»ÓпɷֽâµÄItemIDList=%s'%ItemIDList)  
 | 
        return  
 | 
    totalExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ClothesChestEXP) + addExp  
 | 
    curChestLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ClothesChestLV)  
 | 
    updChestLV = curChestLV  
 | 
    maxChestLV = IpyGameDataPY.IPY_Data().GetCoatChestUpByIndex(IpyGameDataPY.IPY_Data().GetCoatChestUpCount() - 1).GetLV()  
 | 
    for chestLV in xrange(curChestLV + 1, maxChestLV + 1):  
 | 
        ipyData = IpyGameDataPY.GetIpyGameData('CoatChestUp', chestLV)  
 | 
        if not ipyData:  
 | 
            break  
 | 
        needExp = ipyData.GetNeedExp()  
 | 
        if totalExp < needExp:  
 | 
            break  
 | 
        updChestLV = chestLV  
 | 
        totalExp -= needExp  
 | 
    if updChestLV != curChestLV:  
 | 
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ClothesChestLV, updChestLV)  
 | 
        # Ë¢ÊôÐÔ  
 | 
        CalcClothesCoatSkinAttr(curPlayer)  
 | 
        PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ClothesChestEXP, min(totalExp, ChConfig.Def_UpperLimit_DWord))  
 | 
          
 | 
    Sync_ClothesCoatSkinInfo(curPlayer, coatID)  
 | 
    return  
 | 
  
 | 
## ¼ÆËãʱװÊôÐÔ  
 | 
#  @param curPlayer Íæ¼Ò  
 | 
#  @param allAttrList ÊôÐÔÁÐ±í  
 | 
#  @return None  
 | 
def CalcClothesCoatSkinAttr(curPlayer):  
 | 
    allAttrList = [{} for _ in range(4)]  
 | 
    ipyMgr = IpyGameDataPY.IPY_Data()  
 | 
    for i in xrange(ipyMgr.GetCoatCount()):  
 | 
        ipyData = ipyMgr.GetCoatByIndex(i)  
 | 
        coatID = ipyData.GetCoatID()  
 | 
        skinLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ClothesSkinLV % coatID)  
 | 
        if not skinLV:  
 | 
            continue  
 | 
        starAttrDict = ipyData.GetStarAttr()  
 | 
        if str(skinLV) not in starAttrDict:  
 | 
            continue  
 | 
        for attrID, attrValue in starAttrDict[str(skinLV)].items():  
 | 
            PlayerControl.CalcAttrDict_Type(int(attrID), attrValue, allAttrList)  
 | 
    # ±£´æ¼ÆËãÖµ  
 | 
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Coat, allAttrList)  
 | 
    return  
 | 
  
 | 
  
 | 
##´©ÉÏ/ÍÑÏÂʱװ  
 | 
# @param curPlayer Íæ¼ÒʵÀý  
 | 
# @param srcBackpack Æðµã±³°ü  
 | 
# @param desBackPack Ä¿±ê±³°ü  
 | 
# @param srcIndex ÆðµãË÷Òý  
 | 
# @param destIndex Ä¿±êË÷Òý  
 | 
# @return   
 | 
def SwitchCoat(curPlayer, srcBackpack, desBackPack, srcIndex, destIndex):  
 | 
    clothesPlaceList = [ShareDefine.retWeaponSkin, ShareDefine.retClothesSkin, ShareDefine.retWeapon2Skin]  
 | 
    if not ((desBackPack == IPY_GameWorld.rptEquip and srcBackpack == ShareDefine.rptTempSwap and destIndex in clothesPlaceList) \  
 | 
    or (srcBackpack == IPY_GameWorld.rptEquip and desBackPack == ShareDefine.rptTempSwap and srcIndex in clothesPlaceList)):  
 | 
        return False  
 | 
      
 | 
    #===============================================================================================  
 | 
    # # ²»¿ÉÒÔ½»»»Ê±×°  
 | 
    # if curPlayer.GetMapID() in [ChConfig.Def_FBMapID_RedFort]:  
 | 
    #    PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_422737")  
 | 
    #    return True  
 | 
    #===============================================================================================  
 | 
      
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
      
 | 
    # ´©Ê±×°  
 | 
    if desBackPack == IPY_GameWorld.rptEquip:  
 | 
        # ´©µÄʱºòsrcIndex´ú±íʱװµÄË÷Òý  
 | 
        skinLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ClothesSkinLV%srcIndex)  
 | 
        if skinLV <= 0:  
 | 
            GameWorld.Log("ʱװδ¼¤»î£¬²»ÄÜ´©£¡srcIndex=%s" % (srcIndex), playerID)  
 | 
            return True  
 | 
        ipyData = IpyGameDataPY.GetIpyGameData('Coat', srcIndex)  
 | 
        if not ipyData:  
 | 
            return True  
 | 
        EquipItemIDList = ipyData.GetEquipItemID()  
 | 
        job = curPlayer.GetJob()  
 | 
        if job > len(EquipItemIDList):  
 | 
            GameWorld.Log("ÕÒ²»µ½¸ÃְҵʱװÅäÖ㬲»ÄÜ´©£¡srcIndex=%s,job=%s" % (srcIndex, job), playerID)  
 | 
            return True  
 | 
        equipItemID = EquipItemIDList[job-1]  
 | 
        # ÕÒµ½Ê±×°IDºó£¬srcIndexת»¯Îª½»»»ÎïÆ·µÄ¸ñ×ÓË÷Òý£¬Ä¬ÈÏ0  
 | 
        srcIndex= 0  
 | 
          
 | 
        # ¸øÁÙʱ½»»»ÎïÆ·  
 | 
        if not ItemControler.PutItemInTempSwap(curPlayer, equipItemID):  
 | 
            GameWorld.Log("ʱװID(%s)·ÅÈëÁÙʱ½»»»±³°üʧ°Ü!" % (equipItemID), playerID)  
 | 
            return True  
 | 
          
 | 
    # ÍÑʱװ  
 | 
    else:  
 | 
        ItemControler.ClearPack(curPlayer, ShareDefine.rptTempSwap)  
 | 
        destIndex = 0  
 | 
      
 | 
    isOK = ItemCommon.DoLogicSwitchItemEx(curPlayer, srcBackpack, desBackPack, srcIndex, destIndex)  
 | 
    # Ï·¢ÖÜÎ§Íæ¼Òʱװ´©´÷״̬  
 | 
    if isOK:  
 | 
        if desBackPack == IPY_GameWorld.rptEquip:  
 | 
            packIndex = IPY_GameWorld.rptEquip  
 | 
            itemPlace = destIndex  
 | 
            itemPack = curPlayer.GetItemManager().GetPack(packIndex)  
 | 
            curItem = itemPack.GetAt(itemPlace)  
 | 
            itemId = curItem.GetItemTypeID()  
 | 
            itemStarLV = 0#curItem.GetItemStarLV()  
 | 
            itemHoleCnt = 0#curItem.GetCanPlaceStoneCount()  
 | 
            itemStoneCnt = 0#curItem.GetUseStoneCount()  
 | 
            itemUseData = curItem.GetUserData()  
 | 
            curPlayer.ChangeEquip(itemId, itemPlace, itemStarLV, itemHoleCnt, itemStoneCnt, itemUseData)  
 | 
        else:  
 | 
            packIndex = ShareDefine.rptTempSwap  
 | 
            itemPack = curPlayer.GetItemManager().GetPack(packIndex)  
 | 
            curItem = itemPack.GetAt(0)  
 | 
            if curItem:  
 | 
                curPlayer.Sync_UnEquipItem(curItem.GetItemTypeID(), srcIndex)  
 | 
    GameWorld.DebugLog("SwitchCoat isOK=%s" % isOK)  
 | 
    return True  
 | 
  
 | 
  
 | 
## Í¨Öª¿Í»§¶Ëʱװ¿ªÆô״̬  
 | 
#  @param curPlayer  
 | 
#  @return None  
 | 
def Sync_ClothesCoatSkinInfo(curPlayer, coatIndex= -1):  
 | 
    stateData = ChPyNetSendPack.tagMCClothesCoatSkinState()  
 | 
    stateData.Clear()  
 | 
    stateData.CoatChestExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ClothesChestEXP)  
 | 
    stateData.CoatChestLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ClothesChestLV)  
 | 
    stateData.CoatInfoList = []  
 | 
    if coatIndex == -1:  
 | 
        coatIDList =[]  
 | 
        ipyMgr = IpyGameDataPY.IPY_Data()  
 | 
        for i in xrange(ipyMgr.GetCoatCount()):  
 | 
            ipyData = ipyMgr.GetCoatByIndex(i)  
 | 
            coatID = ipyData.GetCoatID()  
 | 
            coatIDList.append(coatID)  
 | 
    else:  
 | 
        coatIDList = [coatIndex]  
 | 
          
 | 
    for coatID in coatIDList:  
 | 
        coatInfo = ChPyNetSendPack.tagMCClothesCoatLVInfo()  
 | 
        coatInfo.Clear()  
 | 
        coatInfo.CoatIndex = coatID  
 | 
        coatInfo.CoatLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ClothesSkinLV % coatID)  
 | 
        stateData.CoatInfoList.append(coatInfo)  
 | 
    stateData.CoatNum = len(stateData.CoatInfoList)  
 | 
    NetPackCommon.SendFakePack(curPlayer, stateData)  
 | 
    return  
 | 
  
 |